module Percy
Constants
- CLIENT_INFO
- ENV_INFO
- LABEL
- PERCY_DEBUG
- PERCY_SERVER_ADDRESS
- VERSION
Public Class Methods
_clear_cache!()
click to toggle source
# File lib/percy.rb, line 105 def self._clear_cache! @percy_dom = nil @percy_enabled = nil end
fetch(url, data = nil)
click to toggle source
Make an HTTP request (GET,POST) using Ruby's Net::HTTP. If `data` is present, `fetch` will POST as JSON.
# File lib/percy.rb, line 89 def self.fetch(url, data = nil) uri = URI("#{PERCY_SERVER_ADDRESS}/#{url}") response = if data Net::HTTP.post(uri, data.to_json) else Net::HTTP.get_response(uri) end unless response.is_a? Net::HTTPSuccess raise StandardError, "Failed with HTTP error code: #{response.code}" end response end
fetch_percy_dom()
click to toggle source
Fetch the @percy/dom script, caching the result so it is only fetched once
# File lib/percy.rb, line 76 def self.fetch_percy_dom return @percy_dom unless @percy_dom.nil? response = fetch('percy/dom.js') @percy_dom = response.body end
log(msg)
click to toggle source
# File lib/percy.rb, line 83 def self.log(msg) puts "#{LABEL} #{msg}" end
percy_enabled?()
click to toggle source
Determine if the Percy
server is running, caching the result so it is only checked once
# File lib/percy.rb, line 42 def self.percy_enabled? return @percy_enabled unless @percy_enabled.nil? begin response = fetch('percy/healthcheck') version = response['x-percy-core-version'] if version.nil? log('You may be using @percy/agent ' \ 'which is no longer supported by this SDK. ' \ 'Please uninstall @percy/agent and install @percy/cli instead. ' \ 'https://docs.percy.io/docs/migrating-to-percy-cli') @percy_enabled = false return false end if version.split('.')[0] != '1' log("Unsupported Percy CLI version, #{version}") @percy_enabled = false return false end @percy_enabled = true true rescue StandardError => e log('Percy is not running, disabling snapshots') if PERCY_DEBUG then log(e) end @percy_enabled = false false end end
snapshot(driver, name, options = {})
click to toggle source
Take a DOM snapshot and post it to the snapshot endpoint
# File lib/percy.rb, line 16 def self.snapshot(driver, name, options = {}) return unless percy_enabled? begin driver.execute_script(fetch_percy_dom) dom_snapshot = driver.execute_script("return PercyDOM.serialize(#{options.to_json})") response = fetch('percy/snapshot', name: name, url: driver.current_url, dom_snapshot: dom_snapshot, client_info: CLIENT_INFO, environment_info: ENV_INFO, **options,) unless response.body.to_json['success'] raise StandardError, data['error'] end rescue StandardError => e log("Could not take DOM snapshot '#{name}'") if PERCY_DEBUG then log(e) end end end