percy-capybara 4.3.3 → 5.0.0.pre.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE +1 -1
- data/README.md +117 -4
- data/lib/percy/capybara.rb +113 -0
- data/lib/percy/version.rb +3 -0
- metadata +38 -45
- data/.circleci/config.yml +0 -38
- data/.gitignore +0 -17
- data/.rspec +0 -4
- data/.rubocop.yml +0 -14
- data/.yardopts +0 -2
- data/CHANGELOG.md +0 -1
- data/DEVELOPING.md +0 -26
- data/Gemfile +0 -13
- data/Guardfile +0 -14
- data/RELEASING.md +0 -23
- data/Rakefile +0 -1
- data/lib/environment.rb +0 -38
- data/lib/percy.rb +0 -142
- data/lib/version.rb +0 -3
- data/package.json +0 -6
- data/percy-capybara.gemspec +0 -32
- data/spec/lib/percy/environment_spec.rb +0 -26
- data/spec/lib/percy/percy_spec.rb +0 -72
- data/spec/spec_helper.rb +0 -33
- data/yarn.lock +0 -2128
data/.rubocop.yml
DELETED
data/.yardopts
DELETED
data/CHANGELOG.md
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
See [releases](https://github.com/percy/percy-capybara/releases).
|
data/DEVELOPING.md
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
# Developing percy-capybara
|
2
|
-
|
3
|
-
You'll need:
|
4
|
-
* [Ruby](https://www.ruby-lang.org)
|
5
|
-
* [Bundler](https://bundler.io/)
|
6
|
-
* [npm](https://www.npmjs.com/), to manage our dependency on [`@percy/agent`](https://www.npmjs.com/package/@percy/agent)
|
7
|
-
|
8
|
-
To install dependencies:
|
9
|
-
```bash
|
10
|
-
$ bundle install
|
11
|
-
$ npm install
|
12
|
-
```
|
13
|
-
|
14
|
-
To run our test suite and create snapshots:
|
15
|
-
```bash
|
16
|
-
$ bundle exec rake snapshots
|
17
|
-
```
|
18
|
-
(You'll need a `PERCY_TOKEN` in your environment for snapshots to be uploaded to Percy for diffing.)
|
19
|
-
|
20
|
-
If you want to run the test suite without uploading snapshots, you can run:
|
21
|
-
```bash
|
22
|
-
$ bundle exec rspec
|
23
|
-
```
|
24
|
-
|
25
|
-
For instructions on releasing, and on updating the vendored version of `percy-agent.js` in this repository, please refer to the [RELEASING](RELEASING.md) doc.
|
26
|
-
|
data/Gemfile
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
source 'https://rubygems.org'
|
2
|
-
|
3
|
-
# Specify your gem's dependencies in percy-capybara.gemspec
|
4
|
-
gemspec
|
5
|
-
|
6
|
-
gem 'guard-rspec', require: false
|
7
|
-
|
8
|
-
# (for development)
|
9
|
-
# gem 'percy-client', path: '~/src/percy-client'
|
10
|
-
|
11
|
-
group :test, :development do
|
12
|
-
gem 'pry'
|
13
|
-
end
|
data/Guardfile
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
guard :rspec, cmd: 'bundle exec rspec' do
|
2
|
-
require 'guard/rspec/dsl'
|
3
|
-
dsl = Guard::RSpec::Dsl.new(self)
|
4
|
-
|
5
|
-
# RSpec files
|
6
|
-
rspec = dsl.rspec
|
7
|
-
watch(rspec.spec_helper) { rspec.spec_dir }
|
8
|
-
watch(rspec.spec_support) { rspec.spec_dir }
|
9
|
-
watch(rspec.spec_files)
|
10
|
-
|
11
|
-
# Ruby files
|
12
|
-
ruby = dsl.ruby
|
13
|
-
dsl.watch_spec_files_for(ruby.lib_files)
|
14
|
-
end
|
data/RELEASING.md
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
# Releasing
|
2
|
-
|
3
|
-
1. `git checkout master`
|
4
|
-
1. `git pull origin master`
|
5
|
-
1. `git checkout -b X.X.X`
|
6
|
-
1. Update version.rb file accordingly.
|
7
|
-
1. Commit and push the version update
|
8
|
-
1. Tag the release: `git tag vX.X.X`
|
9
|
-
1. Push changes: `git push --tags`
|
10
|
-
1. Ensure tests have passed on that tag
|
11
|
-
1. Open up a pull request titled with the new version number
|
12
|
-
1. Merge approved pull request
|
13
|
-
1. Draft and publish a [new release on github](https://github.com/percy/percy-capybara/releases)
|
14
|
-
1. Build and publish:
|
15
|
-
|
16
|
-
```bash
|
17
|
-
bundle exec rake build
|
18
|
-
gem push pkg/percy-capybara-X.XX.XX.gem
|
19
|
-
```
|
20
|
-
|
21
|
-
* Announce the new release,
|
22
|
-
making sure to say "thank you" to the contributors
|
23
|
-
who helped shape this version!
|
data/Rakefile
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
require 'bundler/gem_tasks'
|
data/lib/environment.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
require_relative './version'
|
2
|
-
|
3
|
-
module Percy
|
4
|
-
def self.client_info
|
5
|
-
"percy-capybara/#{VERSION}"
|
6
|
-
end
|
7
|
-
|
8
|
-
def self.environment_info
|
9
|
-
env_strings = [
|
10
|
-
"rails/#{self._rails_version}",
|
11
|
-
"sinatra/#{self._sinatra_version}",
|
12
|
-
"capybara/#{self.capybara_version}",
|
13
|
-
"ember-cli-rails/#{self._ember_cli_rails_version}",
|
14
|
-
].reject do |info|
|
15
|
-
info =~ /\/$/ # reject if version is empty
|
16
|
-
end
|
17
|
-
env_strings.empty? ? 'unknown' : env_strings.join('; ')
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.capybara_version
|
21
|
-
Capybara::VERSION if defined? Capybara
|
22
|
-
end
|
23
|
-
|
24
|
-
def self._ember_cli_rails_version
|
25
|
-
return unless defined? EmberCli
|
26
|
-
|
27
|
-
require 'ember_cli/version'
|
28
|
-
EmberCli::VERSION
|
29
|
-
end
|
30
|
-
|
31
|
-
def self._rails_version
|
32
|
-
Rails.version if defined? Rails
|
33
|
-
end
|
34
|
-
|
35
|
-
def self._sinatra_version
|
36
|
-
Sinatra::VERSION if defined? Sinatra
|
37
|
-
end
|
38
|
-
end
|
data/lib/percy.rb
DELETED
@@ -1,142 +0,0 @@
|
|
1
|
-
require 'logger'
|
2
|
-
require 'net/http'
|
3
|
-
require 'uri'
|
4
|
-
require 'json'
|
5
|
-
require 'environment'
|
6
|
-
|
7
|
-
module Percy
|
8
|
-
# Takes a snapshot of the given page HTML and its assets.
|
9
|
-
#
|
10
|
-
# See https://docs.percy.io/v1/docs/configuration for detailed documentation on
|
11
|
-
# snapshot options.
|
12
|
-
#
|
13
|
-
# @param [Capybara::Session] page The Capybara page to snapshot.
|
14
|
-
# @param [Hash] options
|
15
|
-
# @option options [String] :name A unique name for the current page that identifies
|
16
|
-
# it across builds. By default this is the URL of the page, but can be customized if the
|
17
|
-
# URL does not entirely identify the current state.
|
18
|
-
# @option options [Array(Number)] :widths Widths, in pixels, that you'd like to capture for
|
19
|
-
# this snapshot.
|
20
|
-
def self.snapshot(page, options = {})
|
21
|
-
return unless self._is_agent_running?
|
22
|
-
|
23
|
-
if !options.has_key?(:name)
|
24
|
-
options[:name] = page.current_url
|
25
|
-
end
|
26
|
-
|
27
|
-
domSnapshot = self._make_dom_snapshot(page, self._keys_to_json(options))
|
28
|
-
return unless domSnapshot
|
29
|
-
|
30
|
-
body = {
|
31
|
-
url: page.current_url,
|
32
|
-
domSnapshot: domSnapshot,
|
33
|
-
clientInfo: Percy.client_info,
|
34
|
-
environmentInfo: Percy.environment_info,
|
35
|
-
}
|
36
|
-
|
37
|
-
body = body.merge(self._keys_to_json(options))
|
38
|
-
|
39
|
-
if self._is_debug?
|
40
|
-
self._logger.info { "passed snapshot options: #{options}" }
|
41
|
-
self._logger.info { "snapshot object to POST: #{body}" }
|
42
|
-
end
|
43
|
-
|
44
|
-
self._post_snapshot_to_agent(body)
|
45
|
-
end
|
46
|
-
|
47
|
-
private
|
48
|
-
|
49
|
-
AGENT_HOST = 'localhost'
|
50
|
-
# Technically, the port is configurable when you run the agent. One day we might want
|
51
|
-
# to make the port configurable in this SDK as well.
|
52
|
-
AGENT_PORT = 5338
|
53
|
-
AGENT_JS_PATH= '/percy-agent.js'
|
54
|
-
|
55
|
-
def self._logger
|
56
|
-
unless defined?(@logger)
|
57
|
-
@logger = Logger.new(STDOUT)
|
58
|
-
@logger.formatter = proc do |_severity, _datetime, _progname, msg|
|
59
|
-
"[percy] #{msg} \n"
|
60
|
-
end
|
61
|
-
end
|
62
|
-
return @logger
|
63
|
-
end
|
64
|
-
|
65
|
-
def self._get_agent_js
|
66
|
-
begin
|
67
|
-
return Net::HTTP.get(AGENT_HOST, AGENT_JS_PATH, AGENT_PORT)
|
68
|
-
rescue => e
|
69
|
-
self._logger.error { "Could not load #{AGENT_JS_PATH}. Error: #{e}" }
|
70
|
-
return nil
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
def self._make_dom_snapshot(page, options)
|
75
|
-
agent_js = self._get_agent_js
|
76
|
-
return unless agent_js
|
77
|
-
|
78
|
-
begin
|
79
|
-
page.execute_script(agent_js)
|
80
|
-
domsnapshot_js = "return new window.PercyAgent({ handleAgentCommunication: false }).domSnapshot(document, #{options.to_json})"
|
81
|
-
|
82
|
-
# If we can use evalaute, use it (generally for capybara drivers)
|
83
|
-
# `execute_script` should work, but some Capybara drivers specifically return nil from this method
|
84
|
-
if page.respond_to?('evaluate_script')
|
85
|
-
dom_snapshot = page.evaluate_script("(function() { #{domsnapshot_js} })()")
|
86
|
-
else
|
87
|
-
# if the driver doesn't have evaluate, it's probably a selenium driver
|
88
|
-
dom_snapshot = page.execute_script(domsnapshot_js)
|
89
|
-
end
|
90
|
-
|
91
|
-
return dom_snapshot
|
92
|
-
rescue => e
|
93
|
-
self._logger.error { "DOM snapshotting failed. Error: #{e}" }
|
94
|
-
return nil
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
def self._post_snapshot_to_agent(body)
|
99
|
-
http = Net::HTTP.new(AGENT_HOST, AGENT_PORT)
|
100
|
-
request = Net::HTTP::Post.new('/percy/snapshot', { 'Content-Type': 'application/json' })
|
101
|
-
request.body = body.to_json
|
102
|
-
|
103
|
-
begin
|
104
|
-
response = http.request(request)
|
105
|
-
rescue => e
|
106
|
-
self._logger.error { "Percy rejected snapshot request. Error: #{e}" }
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
def self._is_agent_running?
|
111
|
-
begin
|
112
|
-
Net::HTTP.get(AGENT_HOST, '/percy/healthcheck', AGENT_PORT)
|
113
|
-
return true
|
114
|
-
rescue => e
|
115
|
-
if self._is_debug?
|
116
|
-
self._logger.error { "Healthcheck failed, Percy is not running: #{e}" }
|
117
|
-
end
|
118
|
-
|
119
|
-
return false
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
# For Ruby style, require snake_case args but transform them into camelCase for percy-agent.
|
124
|
-
def self._keys_to_json(options)
|
125
|
-
{
|
126
|
-
enable_javascript: :enableJavaScript,
|
127
|
-
min_height: :minHeight,
|
128
|
-
percy_css: :percyCSS,
|
129
|
-
request_headers: :requestHeaders,
|
130
|
-
}.each do |ruby_key, json_key|
|
131
|
-
if options.has_key? ruby_key
|
132
|
-
options[json_key] = options[ruby_key]
|
133
|
-
options.delete(ruby_key)
|
134
|
-
end
|
135
|
-
end
|
136
|
-
return options
|
137
|
-
end
|
138
|
-
|
139
|
-
def self._is_debug?
|
140
|
-
ENV['LOG_LEVEL'] == 'debug'
|
141
|
-
end
|
142
|
-
end
|
data/lib/version.rb
DELETED
data/package.json
DELETED
data/percy-capybara.gemspec
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
lib = File.expand_path('../lib', __FILE__)
|
3
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require 'version'
|
5
|
-
|
6
|
-
Gem::Specification.new do |spec|
|
7
|
-
spec.name = 'percy-capybara'
|
8
|
-
spec.version = Percy::VERSION
|
9
|
-
spec.authors = ['Perceptual Inc.']
|
10
|
-
spec.email = ['team@percy.io']
|
11
|
-
spec.summary = %q{Percy}
|
12
|
-
spec.description = %q{}
|
13
|
-
spec.homepage = ''
|
14
|
-
spec.license = 'MIT'
|
15
|
-
|
16
|
-
spec.metadata = {
|
17
|
-
'bug_tracker_uri' => 'https://github.com/percy/percy-capybara/issues',
|
18
|
-
'source_code_uri' => 'https://github.com/percy/percy-capybara',
|
19
|
-
}
|
20
|
-
|
21
|
-
spec.files = `git ls-files -z`.split("\x0")
|
22
|
-
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
23
|
-
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
24
|
-
spec.require_paths = ['lib']
|
25
|
-
|
26
|
-
spec.add_development_dependency 'bundler', '>= 2.0'
|
27
|
-
spec.add_development_dependency 'rake', '~> 13.0'
|
28
|
-
spec.add_development_dependency 'rspec', '~> 3.5'
|
29
|
-
spec.add_development_dependency 'capybara', '~> 3.31'
|
30
|
-
spec.add_development_dependency 'selenium-webdriver'
|
31
|
-
spec.add_development_dependency 'percy-style', '~> 0.7.0'
|
32
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
RSpec.describe Percy do
|
2
|
-
subject(:our_module) { Percy }
|
3
|
-
|
4
|
-
describe '#environment_info' do
|
5
|
-
subject(:environment_info) { Percy.environment_info }
|
6
|
-
|
7
|
-
context 'an app with Rails, Sinatra and Ember Cli Rails' do
|
8
|
-
it 'returns full environment information' do
|
9
|
-
expect(our_module).to receive(:_rails_version).at_least(:once).times.and_return('4.2')
|
10
|
-
expect(our_module).to receive(:_sinatra_version).at_least(:once).and_return('2.0.0')
|
11
|
-
expect(our_module).to receive(:capybara_version).at_least(:once).and_return(Capybara::VERSION)
|
12
|
-
expect(our_module).to receive(:_ember_cli_rails_version).at_least(:once).and_return('0.9')
|
13
|
-
|
14
|
-
expect(environment_info).to eq("rails/4.2; sinatra/2.0.0; capybara/#{Capybara::VERSION}; ember-cli-rails/0.9")
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
describe '#client_info' do
|
20
|
-
subject(:client_info) { Percy.client_info }
|
21
|
-
|
22
|
-
it 'includes client information' do
|
23
|
-
expect(client_info).to eq("percy-capybara/#{Percy::VERSION}")
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
@@ -1,72 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
RSpec.describe Percy, type: :feature do
|
3
|
-
TEST_CASE_GLOB = File.join(File.dirname(__FILE__), "./capybara/client/test_data/test-*.html")
|
4
|
-
|
5
|
-
describe '#snapshot', type: :feature, js: true do
|
6
|
-
context 'with live sites' do
|
7
|
-
it 'snapshots simple HTTPS site' do
|
8
|
-
visit 'https://example.com'
|
9
|
-
Percy.snapshot(page)
|
10
|
-
end
|
11
|
-
it 'snapshots complex HTTPS site' do
|
12
|
-
visit 'https://polaris.shopify.com/'
|
13
|
-
Percy.snapshot(page)
|
14
|
-
end
|
15
|
-
it 'snapshots site with strict CSP' do
|
16
|
-
visit 'https://buildkite.com/'
|
17
|
-
Percy.snapshot(page)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
context 'with different options' do
|
21
|
-
it 'can get a default name' do
|
22
|
-
visit 'http://example.com'
|
23
|
-
Percy.snapshot(page)
|
24
|
-
end
|
25
|
-
it 'uses query params and fragment for default name' do
|
26
|
-
visit 'http://example.com/?with_query'
|
27
|
-
Percy.snapshot(page)
|
28
|
-
visit 'http://example.com/?with_query_params#and-fragment'
|
29
|
-
Percy.snapshot(page)
|
30
|
-
end
|
31
|
-
it 'uses provided name' do
|
32
|
-
visit 'http://example.com'
|
33
|
-
Percy.snapshot(page, name: 'My very special snapshot 🌟')
|
34
|
-
end
|
35
|
-
it 'recognizes requested widths' do
|
36
|
-
visit 'http://example.com'
|
37
|
-
Percy.snapshot(page, { name: 'widths', widths: [768, 992, 1200] })
|
38
|
-
end
|
39
|
-
it 'recognizes minHeight' do
|
40
|
-
visit 'http://example.com'
|
41
|
-
Percy.snapshot(page, { name: 'minHeight', minHeight: 2000 })
|
42
|
-
end
|
43
|
-
it 'recognizes enable_javascript' do
|
44
|
-
visit 'http://example.com'
|
45
|
-
Percy.snapshot(page, { name: 'enableJavaScript', enable_javascript: true })
|
46
|
-
end
|
47
|
-
it 'recognizes percy_css' do
|
48
|
-
visit 'http://example.com'
|
49
|
-
Percy.snapshot(page, { name: 'percyCSS', percy_css: "body {background-color: purple }" })
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
describe '_keys_to_json' do
|
55
|
-
it 'transforms keys from snake_case to JSON-style' do
|
56
|
-
original = {
|
57
|
-
enable_javascript: true,
|
58
|
-
min_height: 2000,
|
59
|
-
percy_css: "iframe { display: none; }",
|
60
|
-
request_headers: { Authorization: "Basic abc123=" },
|
61
|
-
}
|
62
|
-
transformed = Percy._keys_to_json(original)
|
63
|
-
expect(transformed.has_key? 'enableJavaScript')
|
64
|
-
expect(transformed.has_key? 'percyCSS')
|
65
|
-
expect(transformed.has_key? 'minHeight')
|
66
|
-
expect(transformed['enableJavaScript']).to eq(original[:enable_javascript])
|
67
|
-
expect(transformed['minHeight']).to eq(original[:min_height])
|
68
|
-
expect(transformed['percyCSS']).to eq(original[:percy_css])
|
69
|
-
expect(transformed['requestHeaders']).to eq(original[:request_headers])
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
data/spec/spec_helper.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
require 'capybara/rspec'
|
2
|
-
require 'selenium-webdriver'
|
3
|
-
require 'percy'
|
4
|
-
|
5
|
-
RSpec.configure do |config|
|
6
|
-
config.expect_with :rspec do |expectations|
|
7
|
-
# This option will default to `true` in RSpec 4.
|
8
|
-
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
9
|
-
end
|
10
|
-
|
11
|
-
config.mock_with :rspec do |mocks|
|
12
|
-
mocks.verify_partial_doubles = true
|
13
|
-
end
|
14
|
-
|
15
|
-
config.disable_monkey_patching!
|
16
|
-
# config.warnings = true
|
17
|
-
|
18
|
-
# Run specs in random order to surface order dependencies. If you find an
|
19
|
-
# order dependency and want to debug it, you can fix the order by providing
|
20
|
-
# the seed, which is printed after each run.
|
21
|
-
# --seed 1234
|
22
|
-
config.order = :random
|
23
|
-
|
24
|
-
# Seed global randomization in this process using the `--seed` CLI option.
|
25
|
-
# Setting this allows you to use `--seed` to deterministically reproduce
|
26
|
-
# test failures related to randomization by passing the same `--seed` value
|
27
|
-
# as the one that triggered the failure.
|
28
|
-
Kernel.srand config.seed
|
29
|
-
|
30
|
-
# See https://github.com/teamcapybara/capybara#selecting-the-driver for other options
|
31
|
-
Capybara.default_driver = :selenium_headless
|
32
|
-
Capybara.javascript_driver = :selenium_headless
|
33
|
-
end
|