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