heimdallr-viz 0.0.1.b1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -0,0 +1 @@
1
+ .DS_Store
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
@@ -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'
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+
3
+ rvm:
4
+ - 2.2
5
+
6
+ before_install: gem install bundler -v 1.13.6
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
@@ -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
@@ -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.
@@ -0,0 +1,51 @@
1
+ # heimdallr-viz
2
+
3
+ [![Build Status](https://travis-ci.org/araneforseti/heimdallr-viz.svg?branch=master)](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)!
@@ -0,0 +1,6 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task default: :spec
@@ -0,0 +1,5 @@
1
+ 0.0.1.b1
2
+
3
+ Creating features:
4
+ - Comparing specified image to a component based on selenium selector
5
+ - Outputs images used for comparison in directory to enable debugging
@@ -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
@@ -0,0 +1,3 @@
1
+ module HeimdallrViz
2
+ VERSION = '0.0.1.b1'.freeze
3
+ 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: []