heimdallr-viz 0.0.1.b1
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 +7 -0
- data/.gitignore +1 -0
- data/.rspec +2 -0
- data/.rubocop.yml +19 -0
- data/.travis.yml +6 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +103 -0
- data/Guardfile +25 -0
- data/LICENSE +21 -0
- data/README.md +51 -0
- data/Rakefile +6 -0
- data/changelog.txt +5 -0
- data/heimdallr-viz.gemspec +44 -0
- data/lib/heimdallr-viz.rb +89 -0
- data/lib/heimdallr-viz/comparitor.rb +61 -0
- data/lib/heimdallr-viz/version.rb +3 -0
- metadata +245 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 17dda904ced17916217050c50dbd54808d270234
|
4
|
+
data.tar.gz: 6bf55f94803f473d609bf4796f5641b0f3f3d48e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c2e7d711ca954d142d1b9e351749f9605ec0f362ce95b273379c53bf904d13e81a6b0b84436c9c6fb37589ce2de3b5fdd3a07d68ad16e06061e288a069d3f9a1
|
7
|
+
data.tar.gz: eebf1d230e48e90fce259d0db5166c58dfaa7509aa323e546c51c2659d04adc21540109cc565eefa1cca85ee032c4ad94eed37993c419de23c5b0106231df187
|
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
.DS_Store
|
data/.rspec
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
AllCops:
|
2
|
+
Exclude:
|
3
|
+
- 'Rakefile'
|
4
|
+
- 'Guardfile'
|
5
|
+
- '*.gemspec'
|
6
|
+
- '**/*.rake'
|
7
|
+
|
8
|
+
Naming/UncommunicativeMethodParamName:
|
9
|
+
Enabled: false
|
10
|
+
|
11
|
+
Style/Documentation:
|
12
|
+
Enabled: false
|
13
|
+
|
14
|
+
Style/NumericLiterals:
|
15
|
+
Enabled: false
|
16
|
+
|
17
|
+
Metrics/BlockLength:
|
18
|
+
Exclude:
|
19
|
+
- 'spec/**/*_spec.rb'
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
heimdallr-viz (0.0.1.b1)
|
5
|
+
rmagick (~> 2.16.0)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
ast (2.4.0)
|
11
|
+
bundler-audit (0.6.0)
|
12
|
+
bundler (~> 1.2)
|
13
|
+
thor (~> 0.18)
|
14
|
+
coderay (1.1.2)
|
15
|
+
diff-lcs (1.3)
|
16
|
+
ffi (1.9.25)
|
17
|
+
formatador (0.2.5)
|
18
|
+
guard (2.14.2)
|
19
|
+
formatador (>= 0.2.4)
|
20
|
+
listen (>= 2.7, < 4.0)
|
21
|
+
lumberjack (>= 1.0.12, < 2.0)
|
22
|
+
nenv (~> 0.1)
|
23
|
+
notiffany (~> 0.0)
|
24
|
+
pry (>= 0.9.12)
|
25
|
+
shellany (~> 0.0)
|
26
|
+
thor (>= 0.18.1)
|
27
|
+
guard-compat (1.2.1)
|
28
|
+
guard-rspec (4.7.3)
|
29
|
+
guard (~> 2.1)
|
30
|
+
guard-compat (~> 1.1)
|
31
|
+
rspec (>= 2.99.0, < 4.0)
|
32
|
+
jaro_winkler (1.5.1)
|
33
|
+
listen (3.1.5)
|
34
|
+
rb-fsevent (~> 0.9, >= 0.9.4)
|
35
|
+
rb-inotify (~> 0.9, >= 0.9.7)
|
36
|
+
ruby_dep (~> 1.2)
|
37
|
+
lumberjack (1.0.13)
|
38
|
+
method_source (0.9.0)
|
39
|
+
nenv (0.3.0)
|
40
|
+
notiffany (0.1.1)
|
41
|
+
nenv (~> 0.1)
|
42
|
+
shellany (~> 0.0)
|
43
|
+
parallel (1.12.1)
|
44
|
+
parser (2.5.1.2)
|
45
|
+
ast (~> 2.4.0)
|
46
|
+
powerpack (0.1.2)
|
47
|
+
pry (0.11.3)
|
48
|
+
coderay (~> 1.1.0)
|
49
|
+
method_source (~> 0.9.0)
|
50
|
+
rainbow (3.0.0)
|
51
|
+
rake (10.5.0)
|
52
|
+
rb-fsevent (0.10.3)
|
53
|
+
rb-inotify (0.9.10)
|
54
|
+
ffi (>= 0.5.0, < 2)
|
55
|
+
require_all (2.0.0)
|
56
|
+
rmagick (2.16.0)
|
57
|
+
rspec (3.8.0)
|
58
|
+
rspec-core (~> 3.8.0)
|
59
|
+
rspec-expectations (~> 3.8.0)
|
60
|
+
rspec-mocks (~> 3.8.0)
|
61
|
+
rspec-core (3.8.0)
|
62
|
+
rspec-support (~> 3.8.0)
|
63
|
+
rspec-expectations (3.8.1)
|
64
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
65
|
+
rspec-support (~> 3.8.0)
|
66
|
+
rspec-mocks (3.8.0)
|
67
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
68
|
+
rspec-support (~> 3.8.0)
|
69
|
+
rspec-support (3.8.0)
|
70
|
+
rubocop (0.58.2)
|
71
|
+
jaro_winkler (~> 1.5.1)
|
72
|
+
parallel (~> 1.10)
|
73
|
+
parser (>= 2.5, != 2.5.1.1)
|
74
|
+
powerpack (~> 0.1)
|
75
|
+
rainbow (>= 2.2.2, < 4.0)
|
76
|
+
ruby-progressbar (~> 1.7)
|
77
|
+
unicode-display_width (~> 1.0, >= 1.0.1)
|
78
|
+
ruby-progressbar (1.10.0)
|
79
|
+
ruby_dep (1.5.0)
|
80
|
+
shellany (0.0.1)
|
81
|
+
terminal-notifier (2.0.0)
|
82
|
+
terminal-notifier-guard (1.7.0)
|
83
|
+
thor (0.20.0)
|
84
|
+
unicode-display_width (1.4.0)
|
85
|
+
|
86
|
+
PLATFORMS
|
87
|
+
ruby
|
88
|
+
|
89
|
+
DEPENDENCIES
|
90
|
+
bundler (~> 1.13)
|
91
|
+
bundler-audit (~> 0.6.0)
|
92
|
+
guard-rspec (~> 4.7, >= 4.7.3)
|
93
|
+
heimdallr-viz!
|
94
|
+
pry (~> 0.11)
|
95
|
+
rake (~> 10.0)
|
96
|
+
require_all (~> 2.0, >= 2.0.0)
|
97
|
+
rspec (~> 3.0)
|
98
|
+
rubocop (~> 0.58.2)
|
99
|
+
terminal-notifier (~> 2.0, >= 2.0.0)
|
100
|
+
terminal-notifier-guard (~> 1.6, >= 1.6.0)
|
101
|
+
|
102
|
+
BUNDLED WITH
|
103
|
+
1.16.1
|
data/Guardfile
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# Note: The cmd option is now required due to the increasing number of ways
|
2
|
+
# rspec may be run, below are examples of the most common uses.
|
3
|
+
# * bundler: 'bundle exec rspec'
|
4
|
+
# * bundler binstubs: 'bin/rspec'
|
5
|
+
# * spring: 'bin/rspec' (This will use spring if running and you have
|
6
|
+
# installed the spring binstubs per the docs)
|
7
|
+
# * zeus: 'zeus rspec' (requires the server to be started separately)
|
8
|
+
# * 'just' rspec: 'rspec'
|
9
|
+
|
10
|
+
guard :rspec, cmd: 'bundle exec rspec' do
|
11
|
+
require 'guard/rspec/dsl'
|
12
|
+
dsl = Guard::RSpec::Dsl.new(self)
|
13
|
+
|
14
|
+
# Feel free to open issues for suggestions and improvements
|
15
|
+
|
16
|
+
# RSpec files
|
17
|
+
rspec = dsl.rspec
|
18
|
+
watch(rspec.spec_helper) { rspec.spec_dir }
|
19
|
+
watch(rspec.spec_support) { rspec.spec_dir }
|
20
|
+
watch(rspec.spec_files)
|
21
|
+
|
22
|
+
# Ruby files
|
23
|
+
ruby = dsl.ruby
|
24
|
+
dsl.watch_spec_files_for(ruby.lib_files)
|
25
|
+
end
|
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2018 Sarah
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
# heimdallr-viz
|
2
|
+
|
3
|
+
[](https://travis-ci.org/araneforseti/heimdallr-viz)
|
4
|
+
|
5
|
+
Ruby gem for aiding visual regression by taking partial screenshots of components using selenium selectors and comparing them to images of the expected look
|
6
|
+
|
7
|
+
## Requirements
|
8
|
+
|
9
|
+
* ImageMagick v6
|
10
|
+
|
11
|
+
## Usage
|
12
|
+
|
13
|
+
Create heimdallr with the selenium driver so it can "see" the page you navigate to, then pass it the information for the elements it is checking on the page.
|
14
|
+
|
15
|
+
Example:
|
16
|
+
|
17
|
+
```ruby
|
18
|
+
@heimdallr = HeimdallrViz::Viz.new driver: @browser
|
19
|
+
page_elements = [
|
20
|
+
{
|
21
|
+
element_name: 'chart',
|
22
|
+
element_selector: { id: '#chart' },
|
23
|
+
prior_image: 'images/chart.png'
|
24
|
+
},
|
25
|
+
{
|
26
|
+
element_name: 'tab',
|
27
|
+
element_selector: { xpath: '//*[@id="tab"]' },
|
28
|
+
prior_image: 'images/ship.png'
|
29
|
+
},
|
30
|
+
{
|
31
|
+
element_name: 'logo',
|
32
|
+
element_selector: { class: '#logo' },
|
33
|
+
prior_image: 'images/logo.png'
|
34
|
+
}
|
35
|
+
]
|
36
|
+
result = @heimdallr.check_visuals(page_elements)
|
37
|
+
```
|
38
|
+
|
39
|
+
Heimdallr will output images used for comparison to `heimdallr-report`, which can be changed:
|
40
|
+
|
41
|
+
```ruby
|
42
|
+
@heimdallr.output_dir = 'new directory'
|
43
|
+
```
|
44
|
+
|
45
|
+
## Contributing
|
46
|
+
|
47
|
+
Contributions welcome; simply open a PR with the improvement you want to make!
|
48
|
+
|
49
|
+
Find an issue not yet logged? Raise something on the github repo!
|
50
|
+
|
51
|
+
Curious about where this project is going? Check out the [backlog](https://trello.com/b/g5AbHzjh/heimdallr-viz)!
|
data/Rakefile
ADDED
data/changelog.txt
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
lib = File.expand_path('lib', __dir__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require 'heimdallr-viz/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = 'heimdallr-viz'
|
7
|
+
spec.version = HeimdallrViz::VERSION
|
8
|
+
spec.authors = ['arane']
|
9
|
+
spec.email = ['arane9@gmail.com']
|
10
|
+
|
11
|
+
spec.summary = 'Tool to help visual regression'
|
12
|
+
spec.description = 'Visual regression framework enabling ruby-selenium based projects to use their page objects to capture visual regression'
|
13
|
+
spec.homepage = 'https://github.com/araneforseti/heimdallr-viz'
|
14
|
+
spec.license = 'MIT'
|
15
|
+
|
16
|
+
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
17
|
+
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
18
|
+
if spec.respond_to?(:metadata)
|
19
|
+
spec.metadata['allowed_push_host'] = 'https://rubygems.org/'
|
20
|
+
else
|
21
|
+
raise 'RubyGems 2.0 or newer is required to protect against ' \
|
22
|
+
'public gem pushes.'
|
23
|
+
end
|
24
|
+
|
25
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
26
|
+
f.match(%r{^(test|spec|features)/})
|
27
|
+
end
|
28
|
+
spec.bindir = 'exe'
|
29
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
30
|
+
spec.require_paths = ['lib']
|
31
|
+
|
32
|
+
spec.add_development_dependency 'bundler', '~> 1.13'
|
33
|
+
spec.add_development_dependency 'bundler-audit', '~>0.6.0'
|
34
|
+
spec.add_development_dependency 'guard-rspec', '~> 4.7', '>= 4.7.3'
|
35
|
+
spec.add_development_dependency 'pry', '~> 0.11'
|
36
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
37
|
+
spec.add_development_dependency 'require_all', '~> 2.0', '>= 2.0.0'
|
38
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
39
|
+
spec.add_development_dependency 'rubocop', '~> 0.58.2'
|
40
|
+
spec.add_development_dependency 'terminal-notifier', '~> 2.0', '>= 2.0.0'
|
41
|
+
spec.add_development_dependency 'terminal-notifier-guard', '~> 1.6', '>= 1.6.0'
|
42
|
+
|
43
|
+
spec.add_runtime_dependency 'rmagick', '~> 2.16.0', '>= 2.16.0'
|
44
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'pry'
|
2
|
+
require 'rmagick'
|
3
|
+
# Framework for visual regression
|
4
|
+
module HeimdallrViz
|
5
|
+
# Class for creating the visual shots
|
6
|
+
class Viz
|
7
|
+
attr_accessor :driver
|
8
|
+
attr_accessor :output_dir
|
9
|
+
attr_accessor :working_dir
|
10
|
+
|
11
|
+
def initialize(driver:)
|
12
|
+
self.driver = driver
|
13
|
+
self.output_dir = 'heimdallr-report'
|
14
|
+
Dir.mkdir output_dir unless File.exist? output_dir
|
15
|
+
end
|
16
|
+
|
17
|
+
def check_visuals(elements)
|
18
|
+
all_same = true
|
19
|
+
elements.each do |element|
|
20
|
+
all_same = false unless check_visual(element)
|
21
|
+
end
|
22
|
+
all_same
|
23
|
+
end
|
24
|
+
|
25
|
+
def check_visual(element_name:, element_selector:, prior_image:)
|
26
|
+
self.working_dir = "#{output_dir}/#{element_name}"
|
27
|
+
Dir.mkdir working_dir unless File.exist? working_dir
|
28
|
+
element = driver.find_element(element_selector)
|
29
|
+
screenshot = take_screenshot
|
30
|
+
new_image = component_image(element, screenshot)
|
31
|
+
unless same_image(new_image, prior_image).zero?
|
32
|
+
create_comparison_map(new_image, prior_image)
|
33
|
+
return false
|
34
|
+
end
|
35
|
+
true
|
36
|
+
end
|
37
|
+
|
38
|
+
def take_screenshot
|
39
|
+
screenshot_file = "#{working_dir}/screen.png"
|
40
|
+
driver.save_screenshot(screenshot_file)
|
41
|
+
Magick::Image.read(screenshot_file)[0]
|
42
|
+
end
|
43
|
+
|
44
|
+
def component_image(element, image)
|
45
|
+
width = element.size.width * 2
|
46
|
+
height = element.size.height * 2
|
47
|
+
location = element.location
|
48
|
+
x = location.x * 2
|
49
|
+
y = location.y * 2
|
50
|
+
|
51
|
+
highlight(image: image, x: x, y: y, width: width, height: height)
|
52
|
+
crop_image(image: image, x: x, y: y, width: width, height: height)
|
53
|
+
end
|
54
|
+
|
55
|
+
def crop_image(image:, x:, y:, width:, height:)
|
56
|
+
cropped = image.crop(x, y, width, height)
|
57
|
+
cropped.write("#{working_dir}/actual.png")
|
58
|
+
"#{working_dir}/actual.png"
|
59
|
+
end
|
60
|
+
|
61
|
+
def highlight(image:, x:, y:, width:, height:)
|
62
|
+
area = Magick::Image.new(width, height) do
|
63
|
+
self.background_color = 'yellow'
|
64
|
+
end
|
65
|
+
# area.alpha(Magick::ActivateAlphaChannel)
|
66
|
+
area.opacity = 0.7 * Magick::QuantumRange
|
67
|
+
# highlighted = image.composite(area, x, y, Magick::SoftLightCompositeOp)
|
68
|
+
highlighted = image.dissolve(area, 0.9, 1.0, x, y)
|
69
|
+
highlighted.write("#{working_dir}/areas_of_interest.png")
|
70
|
+
end
|
71
|
+
|
72
|
+
def same_image(new_image_file, prior_image_file)
|
73
|
+
new_image = Magick::Image.read(new_image_file)
|
74
|
+
prior_image = Magick::Image.read(prior_image_file)
|
75
|
+
prior_image[0].write("#{working_dir}/expected.png")
|
76
|
+
new_image <=> prior_image
|
77
|
+
end
|
78
|
+
|
79
|
+
def create_comparison_map(new_image_file, prior_image_file)
|
80
|
+
new_image = Magick::Image.read(new_image_file)[0]
|
81
|
+
prior_image = Magick::Image.read(prior_image_file)[0]
|
82
|
+
difference = prior_image.composite(new_image,
|
83
|
+
0,
|
84
|
+
0,
|
85
|
+
Magick::DifferenceCompositeOp)
|
86
|
+
difference.write("#{working_dir}/difference.png")
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'rmagick'
|
2
|
+
|
3
|
+
module HeimdallrViz
|
4
|
+
class Comparitor
|
5
|
+
def compare(expected:, actual:)
|
6
|
+
expected_image = read_image expected
|
7
|
+
actual_image = read_image actual
|
8
|
+
(expected_image <=> actual_image).zero?
|
9
|
+
end
|
10
|
+
|
11
|
+
def compare_with_pixel_threshold(expected:,
|
12
|
+
actual:,
|
13
|
+
threshold:)
|
14
|
+
result = difference(expected, actual)
|
15
|
+
result < threshold
|
16
|
+
end
|
17
|
+
|
18
|
+
def compare_with_percent_threshold(expected:,
|
19
|
+
actual:,
|
20
|
+
threshold:)
|
21
|
+
result = percent_diff(expected, actual)
|
22
|
+
result < threshold
|
23
|
+
end
|
24
|
+
|
25
|
+
def difference(expected, actual)
|
26
|
+
expected_image = read_image expected
|
27
|
+
actual_image = read_image actual
|
28
|
+
expected_pixels = compute_pixels expected_image
|
29
|
+
actual_pixels = compute_pixels actual_image
|
30
|
+
result = calculate_difference(expected_pixels, actual_pixels)
|
31
|
+
result.size
|
32
|
+
end
|
33
|
+
|
34
|
+
def percent_diff(expected_file, actual_file)
|
35
|
+
diff = difference(expected_file, actual_file)
|
36
|
+
expected_pixels = (read_image expected_file).export_pixels.size
|
37
|
+
((100.0 * diff) / expected_pixels).round
|
38
|
+
end
|
39
|
+
|
40
|
+
def read_image(file)
|
41
|
+
Magick::Image.read(file)[0]
|
42
|
+
end
|
43
|
+
|
44
|
+
def compute_pixels(image)
|
45
|
+
result = {}
|
46
|
+
pixels = image.export_pixels
|
47
|
+
pixels.each_with_index do |p, index|
|
48
|
+
result[index] = p
|
49
|
+
end
|
50
|
+
result
|
51
|
+
end
|
52
|
+
|
53
|
+
def calculate_difference(expected, actual)
|
54
|
+
diff = {}
|
55
|
+
expected.each do |index, pixel|
|
56
|
+
diff[index] = pixel unless actual[index] == pixel
|
57
|
+
end
|
58
|
+
diff
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
metadata
ADDED
@@ -0,0 +1,245 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: heimdallr-viz
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1.b1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- arane
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-08-19 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.13'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.13'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler-audit
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.6.0
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.6.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: guard-rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '4.7'
|
48
|
+
- - ">="
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: 4.7.3
|
51
|
+
type: :development
|
52
|
+
prerelease: false
|
53
|
+
version_requirements: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - "~>"
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '4.7'
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 4.7.3
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: pry
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0.11'
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0.11'
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: rake
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '10.0'
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - "~>"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '10.0'
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: require_all
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - "~>"
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '2.0'
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: 2.0.0
|
99
|
+
type: :development
|
100
|
+
prerelease: false
|
101
|
+
version_requirements: !ruby/object:Gem::Requirement
|
102
|
+
requirements:
|
103
|
+
- - "~>"
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: '2.0'
|
106
|
+
- - ">="
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: 2.0.0
|
109
|
+
- !ruby/object:Gem::Dependency
|
110
|
+
name: rspec
|
111
|
+
requirement: !ruby/object:Gem::Requirement
|
112
|
+
requirements:
|
113
|
+
- - "~>"
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: '3.0'
|
116
|
+
type: :development
|
117
|
+
prerelease: false
|
118
|
+
version_requirements: !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - "~>"
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: '3.0'
|
123
|
+
- !ruby/object:Gem::Dependency
|
124
|
+
name: rubocop
|
125
|
+
requirement: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - "~>"
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: 0.58.2
|
130
|
+
type: :development
|
131
|
+
prerelease: false
|
132
|
+
version_requirements: !ruby/object:Gem::Requirement
|
133
|
+
requirements:
|
134
|
+
- - "~>"
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
version: 0.58.2
|
137
|
+
- !ruby/object:Gem::Dependency
|
138
|
+
name: terminal-notifier
|
139
|
+
requirement: !ruby/object:Gem::Requirement
|
140
|
+
requirements:
|
141
|
+
- - "~>"
|
142
|
+
- !ruby/object:Gem::Version
|
143
|
+
version: '2.0'
|
144
|
+
- - ">="
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
version: 2.0.0
|
147
|
+
type: :development
|
148
|
+
prerelease: false
|
149
|
+
version_requirements: !ruby/object:Gem::Requirement
|
150
|
+
requirements:
|
151
|
+
- - "~>"
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: '2.0'
|
154
|
+
- - ">="
|
155
|
+
- !ruby/object:Gem::Version
|
156
|
+
version: 2.0.0
|
157
|
+
- !ruby/object:Gem::Dependency
|
158
|
+
name: terminal-notifier-guard
|
159
|
+
requirement: !ruby/object:Gem::Requirement
|
160
|
+
requirements:
|
161
|
+
- - "~>"
|
162
|
+
- !ruby/object:Gem::Version
|
163
|
+
version: '1.6'
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: 1.6.0
|
167
|
+
type: :development
|
168
|
+
prerelease: false
|
169
|
+
version_requirements: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - "~>"
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '1.6'
|
174
|
+
- - ">="
|
175
|
+
- !ruby/object:Gem::Version
|
176
|
+
version: 1.6.0
|
177
|
+
- !ruby/object:Gem::Dependency
|
178
|
+
name: rmagick
|
179
|
+
requirement: !ruby/object:Gem::Requirement
|
180
|
+
requirements:
|
181
|
+
- - "~>"
|
182
|
+
- !ruby/object:Gem::Version
|
183
|
+
version: 2.16.0
|
184
|
+
- - ">="
|
185
|
+
- !ruby/object:Gem::Version
|
186
|
+
version: 2.16.0
|
187
|
+
type: :runtime
|
188
|
+
prerelease: false
|
189
|
+
version_requirements: !ruby/object:Gem::Requirement
|
190
|
+
requirements:
|
191
|
+
- - "~>"
|
192
|
+
- !ruby/object:Gem::Version
|
193
|
+
version: 2.16.0
|
194
|
+
- - ">="
|
195
|
+
- !ruby/object:Gem::Version
|
196
|
+
version: 2.16.0
|
197
|
+
description: Visual regression framework enabling ruby-selenium based projects to
|
198
|
+
use their page objects to capture visual regression
|
199
|
+
email:
|
200
|
+
- arane9@gmail.com
|
201
|
+
executables: []
|
202
|
+
extensions: []
|
203
|
+
extra_rdoc_files: []
|
204
|
+
files:
|
205
|
+
- ".gitignore"
|
206
|
+
- ".rspec"
|
207
|
+
- ".rubocop.yml"
|
208
|
+
- ".travis.yml"
|
209
|
+
- Gemfile
|
210
|
+
- Gemfile.lock
|
211
|
+
- Guardfile
|
212
|
+
- LICENSE
|
213
|
+
- README.md
|
214
|
+
- Rakefile
|
215
|
+
- changelog.txt
|
216
|
+
- heimdallr-viz.gemspec
|
217
|
+
- lib/heimdallr-viz.rb
|
218
|
+
- lib/heimdallr-viz/comparitor.rb
|
219
|
+
- lib/heimdallr-viz/version.rb
|
220
|
+
homepage: https://github.com/araneforseti/heimdallr-viz
|
221
|
+
licenses:
|
222
|
+
- MIT
|
223
|
+
metadata:
|
224
|
+
allowed_push_host: https://rubygems.org/
|
225
|
+
post_install_message:
|
226
|
+
rdoc_options: []
|
227
|
+
require_paths:
|
228
|
+
- lib
|
229
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
230
|
+
requirements:
|
231
|
+
- - ">="
|
232
|
+
- !ruby/object:Gem::Version
|
233
|
+
version: '0'
|
234
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
235
|
+
requirements:
|
236
|
+
- - ">"
|
237
|
+
- !ruby/object:Gem::Version
|
238
|
+
version: 1.3.1
|
239
|
+
requirements: []
|
240
|
+
rubyforge_project:
|
241
|
+
rubygems_version: 2.6.12
|
242
|
+
signing_key:
|
243
|
+
specification_version: 4
|
244
|
+
summary: Tool to help visual regression
|
245
|
+
test_files: []
|