goggles 0.9.0 → 0.9.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- metadata +17 -31
- data/.gitignore +0 -20
- data/CHANGELOG.md +0 -40
- data/Gemfile +0 -4
- data/LICENSE.txt +0 -22
- data/README.md +0 -145
- data/Rakefile +0 -1
- data/features/goggles.feature +0 -23
- data/features/step_definitions/goggles_steps.rb +0 -27
- data/features/support/env.rb +0 -5
- data/goggles.gemspec +0 -27
- data/lib/goggles.rb +0 -30
- data/lib/goggles/comparison.rb +0 -84
- data/lib/goggles/configuration.rb +0 -20
- data/lib/goggles/iteration.rb +0 -38
- data/lib/goggles/version.rb +0 -3
- data/spec/goggles/comparison_spec.rb +0 -99
- data/spec/goggles/configuration_spec.rb +0 -47
- data/spec/goggles/iteration_spec.rb +0 -32
- data/spec/goggles_spec.rb +0 -115
- data/spec/spec_helper.rb +0 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b7191925cf0b72ef1e287a2f9f5d3206c7206763
|
4
|
+
data.tar.gz: af89e5f439fa552780efd31f1aea1a8f19286707
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c4be6b93b9fac5088771f6329143d4b282e5252690929664639f44d6db4938e1204552aaaea93f80ee832abf03ff9e153ca4b043d5e1fd030be00c8cc83a6621
|
7
|
+
data.tar.gz: 17fa964ae31c6a90fed3fcdf6f4bfadf46fe6f6233bf90b59429a9f06695223888f9d0470d121164c88fddd157f3debaa56a2d5bf712f8ecd5607d92e099b0af
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: goggles
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Johnson Denen
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - '>='
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: yard
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: watir-webdriver
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -100,27 +114,7 @@ email:
|
|
100
114
|
executables: []
|
101
115
|
extensions: []
|
102
116
|
extra_rdoc_files: []
|
103
|
-
files:
|
104
|
-
- .gitignore
|
105
|
-
- CHANGELOG.md
|
106
|
-
- Gemfile
|
107
|
-
- LICENSE.txt
|
108
|
-
- README.md
|
109
|
-
- Rakefile
|
110
|
-
- features/goggles.feature
|
111
|
-
- features/step_definitions/goggles_steps.rb
|
112
|
-
- features/support/env.rb
|
113
|
-
- goggles.gemspec
|
114
|
-
- lib/goggles.rb
|
115
|
-
- lib/goggles/comparison.rb
|
116
|
-
- lib/goggles/configuration.rb
|
117
|
-
- lib/goggles/iteration.rb
|
118
|
-
- lib/goggles/version.rb
|
119
|
-
- spec/goggles/comparison_spec.rb
|
120
|
-
- spec/goggles/configuration_spec.rb
|
121
|
-
- spec/goggles/iteration_spec.rb
|
122
|
-
- spec/goggles_spec.rb
|
123
|
-
- spec/spec_helper.rb
|
117
|
+
files: []
|
124
118
|
homepage: http://github.com/jdenen/goggles
|
125
119
|
licenses:
|
126
120
|
- MIT
|
@@ -145,13 +139,5 @@ rubygems_version: 2.0.14
|
|
145
139
|
signing_key:
|
146
140
|
specification_version: 4
|
147
141
|
summary: Compare screenshots in different browsers at different sizes
|
148
|
-
test_files:
|
149
|
-
- features/goggles.feature
|
150
|
-
- features/step_definitions/goggles_steps.rb
|
151
|
-
- features/support/env.rb
|
152
|
-
- spec/goggles/comparison_spec.rb
|
153
|
-
- spec/goggles/configuration_spec.rb
|
154
|
-
- spec/goggles/iteration_spec.rb
|
155
|
-
- spec/goggles_spec.rb
|
156
|
-
- spec/spec_helper.rb
|
142
|
+
test_files: []
|
157
143
|
has_rdoc:
|
data/.gitignore
DELETED
data/CHANGELOG.md
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
# CHANGELOG
|
2
|
-
|
3
|
-
## v0.9.0 (Apr 14, 2015)
|
4
|
-
* `Goggles.each` accepts Array, Integer, String, and Symbol arguments.
|
5
|
-
* Arguments passed to `Goggles.each` extend configured settings instead of replacing them.
|
6
|
-
* Add Cucumber tests.
|
7
|
-
|
8
|
-
## v0.8.2 (Apr 10, 2015)
|
9
|
-
* Fix another typo in the gem description.
|
10
|
-
|
11
|
-
## v0.8.1 (Apr 10, 2015)
|
12
|
-
* Fix typo in gem description.
|
13
|
-
|
14
|
-
## v0.8.0 (Apr 10, 2015)
|
15
|
-
* Remove `swim` executable.
|
16
|
-
* Remove YAML configuration.
|
17
|
-
* Add `Goggles.configure` for configuration through a block (like RSpec).
|
18
|
-
* Remove reserved instance variables like `@gg_url`.
|
19
|
-
* Scripts are executed via blocks passed to `Goggles.each`.
|
20
|
-
* `Goggles.each` yields a browser instance with the `#grab_screenshot` method.
|
21
|
-
* README updates.
|
22
|
-
* Add this CHANGELOG.
|
23
|
-
|
24
|
-
## v0.1.4 (Jan 28, 2014)
|
25
|
-
* Small code enhancements with no user impact.
|
26
|
-
|
27
|
-
## v0.1.3 (Jan 23, 2014)
|
28
|
-
* Do not delete cookies before each script.
|
29
|
-
* Make `@gg_url` variable available to scripts.
|
30
|
-
|
31
|
-
## v0.1.2 (Jan 21, 2014)
|
32
|
-
* Add diff color configuration setting.
|
33
|
-
* Default color setting to blue.
|
34
|
-
* Prepend all instance variables with `gg_`.
|
35
|
-
|
36
|
-
## v0.1.1 (Jan 20, 2014)
|
37
|
-
* Add command line option for generating default project
|
38
|
-
|
39
|
-
## v0.1.0 (Jan 20, 2014)
|
40
|
-
* Initial release
|
data/Gemfile
DELETED
data/LICENSE.txt
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
Copyright (c) 2014 Johnson Denen
|
2
|
-
|
3
|
-
MIT License
|
4
|
-
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
-
a copy of this software and associated documentation files (the
|
7
|
-
"Software"), to deal in the Software without restriction, including
|
8
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
-
permit persons to whom the Software is furnished to do so, subject to
|
11
|
-
the following conditions:
|
12
|
-
|
13
|
-
The above copyright notice and this permission notice shall be
|
14
|
-
included in all copies or substantial portions of the Software.
|
15
|
-
|
16
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
-
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
-
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
-
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
DELETED
@@ -1,145 +0,0 @@
|
|
1
|
-
# goggles
|
2
|
-
[![Gem Version](https://badge.fury.io/rb/goggles.png)](http://badge.fury.io/rb/goggles)
|
3
|
-
|
4
|
-
Goggles is a visual testing tool inspired by [wraith](http://github.com/bbc-news/wraith) and powered by [watir-webdriver](http://github.com/watir/watir-webdriver). It compares screenshots of your web applications in different browsers at differents sizes.
|
5
|
-
|
6
|
-
## Usage
|
7
|
-
|
8
|
-
### Configuration
|
9
|
-
|
10
|
-
Configure Goggles with a block passed to the `Goggles.configure` method, which will yield a config object to your block for manipulation. The `directory` setting must be configured for Goggles to work. You'll also need to provide `browsers` and `sizes` that you'd like to compare, but those can be configured with the script.
|
11
|
-
|
12
|
-
The `fuzzing` and `color` attributes default to "blue" and "20%" respectively.
|
13
|
-
|
14
|
-
```ruby
|
15
|
-
Goggles.configure do |config|
|
16
|
-
config.directory = "/path/to/my/results"
|
17
|
-
config.browsers = [:chrome, :firefox, :phantomjs]
|
18
|
-
config.sizes = [1080, 600]
|
19
|
-
config.color = "red"
|
20
|
-
end
|
21
|
-
```
|
22
|
-
|
23
|
-
### Scripting
|
24
|
-
|
25
|
-
Your Scripts are passed to `Goggles.each` as blocks. Goggles will iterate over the block with each combination of browser/browser size configured, and the method will yield a browser object to your script block.
|
26
|
-
|
27
|
-
```ruby
|
28
|
-
Goggles.each do |browser|
|
29
|
-
browser.goto "http://www.google.com"
|
30
|
-
browser.text_field(id: "lst-ib").value = "Google"
|
31
|
-
end
|
32
|
-
```
|
33
|
-
|
34
|
-
#### Browsers and sizes
|
35
|
-
|
36
|
-
You can pass additional browsers or browser sizes to `Goggles.each` as arrays. With version 0.8.0, these arguments will overwrite what you've configured through `Goggles.configure`.
|
37
|
-
|
38
|
-
```ruby
|
39
|
-
Goggles.each([:chrome, :firefox], [1080]) do |browser|
|
40
|
-
# ...
|
41
|
-
end
|
42
|
-
```
|
43
|
-
|
44
|
-
#### Screenshots
|
45
|
-
|
46
|
-
Your script blocks should include the `Watir::Browser#grab_screenshot` method, which has been patched onto the browser objects yielded to your blocks. Simply give the method a description argument and the screenshot will be saved to your configured directory.
|
47
|
-
|
48
|
-
```ruby
|
49
|
-
Goggles.each do |browser|
|
50
|
-
browser.goto "http://www.google.com"
|
51
|
-
browser.grab_screenshot "homepage"
|
52
|
-
end
|
53
|
-
```
|
54
|
-
|
55
|
-
#### Closing the browser
|
56
|
-
|
57
|
-
There's no need to explicitly close the browser objects in your script blocks. Goggles will handle that.
|
58
|
-
|
59
|
-
#### Results
|
60
|
-
|
61
|
-
Screenshots are saved to your configured directory. Screenshot comparison results are saved to a sub-folder based on the screenshot description and browser size. Results include a diff image and data file.
|
62
|
-
|
63
|
-
```ruby
|
64
|
-
Goggles.configure do |c|
|
65
|
-
c.directory = "/goggles/results"
|
66
|
-
c.browsers = [:chrome, :firefox, :phantomjs]
|
67
|
-
c.sizes = [1080, 600]
|
68
|
-
end
|
69
|
-
|
70
|
-
Goggles.each do |browser|
|
71
|
-
browser.goto "http://www.google.com"
|
72
|
-
browser.grab_screenshot "google"
|
73
|
-
end
|
74
|
-
```
|
75
|
-
|
76
|
-
|
77
|
-
```
|
78
|
-
/goggles/results
|
79
|
-
|- google_1080_chrome.png
|
80
|
-
|- google_1080_firefox.png
|
81
|
-
|- google_1080_phantomjs.png
|
82
|
-
|- google_600_chrome.png
|
83
|
-
|- google_600_firefox.png
|
84
|
-
|- google_600_phantomjs.png
|
85
|
-
|- /google_1080
|
86
|
-
|- chrome_firefox_data.txt
|
87
|
-
|- chrome_firefox_diff.png
|
88
|
-
|- chrome_phantomjs_data.txt
|
89
|
-
|- chrome_phantomjs_diff.png
|
90
|
-
|- firefox_phantomjs_data.txt
|
91
|
-
|- firefox_phantomjs_diff.png
|
92
|
-
|- /google_600
|
93
|
-
|- chrome_firefox_data.txt
|
94
|
-
|- chrome_firefox_diff.png
|
95
|
-
|- chrome_phantomjs_data.txt
|
96
|
-
|- chrome_phantomjs_diff.png
|
97
|
-
|- firefox_phantomjs_data.txt
|
98
|
-
|- firefox_phantomjs_diff.png
|
99
|
-
```
|
100
|
-
|
101
|
-
## Road to 1.0.0
|
102
|
-
|
103
|
-
I've made a lot of changes recently and bumped the version up to 0.8.0. Check the [CHANGELOG](CHANGELOG.md) for more information about those changes.
|
104
|
-
|
105
|
-
### v0.9.0
|
106
|
-
|
107
|
-
* Browser/size arguments against `Goggles.each` extend configuration instead of overwriting it.
|
108
|
-
* End-to-end Cucumber tests
|
109
|
-
|
110
|
-
### v1.0.0
|
111
|
-
|
112
|
-
* Documentation
|
113
|
-
* Examples
|
114
|
-
* TravisCI integration for specs (but not features)
|
115
|
-
|
116
|
-
## Installation
|
117
|
-
|
118
|
-
Install ImageMagick:
|
119
|
-
|
120
|
-
* OSX: `$ brew install imagemagick`
|
121
|
-
* Ubuntu: `$ sudo apt-get install imagemagick`
|
122
|
-
* Windows: [Download](http://www.imagemagick.org/script/binary-releases.php#windows) installer and add to your PATH.
|
123
|
-
|
124
|
-
Add this line to your application's Gemfile:
|
125
|
-
|
126
|
-
gem 'goggles'
|
127
|
-
|
128
|
-
And then execute:
|
129
|
-
|
130
|
-
$ bundle
|
131
|
-
|
132
|
-
Or install it yourself with:
|
133
|
-
|
134
|
-
$ gem install goggles
|
135
|
-
|
136
|
-
## Contributing
|
137
|
-
|
138
|
-
1. Fork it ( http://github.com/jdenen/goggles/fork )
|
139
|
-
2. Create your feature branch (`git checkout -b my-new-feature`)
|
140
|
-
3. Commit your changes (`git commit -am 'Add some feature'`)
|
141
|
-
4. Push to the branch (`git push origin my-new-feature`)
|
142
|
-
5. Create new Pull Request
|
143
|
-
|
144
|
-
## Questions, Comments, Concerns
|
145
|
-
Find me on Twitter ([@jpdenen](http://twitter.com/jpdenen)) or write up an issue.
|
data/Rakefile
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
require "bundler/gem_tasks"
|
data/features/goggles.feature
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
Feature: Screenshot comparison
|
2
|
-
As a software professional
|
3
|
-
I want to automate the collection and comparison of screenshots on my application
|
4
|
-
So I can efficiently assess visual regression
|
5
|
-
|
6
|
-
Background:
|
7
|
-
Given I have configured Goggles with a valid directory
|
8
|
-
Given I have configured Goggles for browsers at 1080 width
|
9
|
-
|
10
|
-
Scenario: Compare screenshots in two browsers at one size
|
11
|
-
When I use the description "search-home" in my script
|
12
|
-
Then I have a file called "search-home_1080/chrome_firefox_diff.png"
|
13
|
-
And I have a file called "search-home_1080/chrome_firefox_data.txt"
|
14
|
-
|
15
|
-
Scenario: Extending a script with more browsers and sizes
|
16
|
-
When I extend configuration with arguments "phantomjs, 500"
|
17
|
-
And I use the description "homepage" in my script
|
18
|
-
Then I have a file called "homepage_1080/chrome_firefox_diff.png"
|
19
|
-
And I have a file called "homepage_1080/chrome_firefox_data.txt"
|
20
|
-
And I have a file called "homepage_1080/chrome_phantomjs_diff.png"
|
21
|
-
And I have a file called "homepage_1080/chrome_phantomjs_data.txt"
|
22
|
-
And I have a file called "homepage_1080/firefox_phantomjs_diff.png"
|
23
|
-
And I have a file called "homepage_1080/firefox_phantomjs_data.txt"
|
@@ -1,27 +0,0 @@
|
|
1
|
-
Given /^I have configured Goggles with a valid directory$/ do
|
2
|
-
@results = Pathname.new("./results").realdirpath.to_s
|
3
|
-
Goggles.configure { |c| c.directory = @results }
|
4
|
-
end
|
5
|
-
|
6
|
-
Given /^I have configured Goggles for browsers at (\d+) width$/ do |width|
|
7
|
-
Goggles.configure do |c|
|
8
|
-
c.browsers = [:chrome, :firefox]
|
9
|
-
c.sizes = [width]
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
When /^I extend configuration with arguments "(.*)"$/ do |args|
|
14
|
-
@args = args.split(/,/).map(&:strip)
|
15
|
-
end
|
16
|
-
|
17
|
-
When /^I use the description "(.*)" in my script$/ do |desc|
|
18
|
-
Goggles.each(@args) do |browser|
|
19
|
-
browser.goto "http://google.com"
|
20
|
-
browser.grab_screenshot desc
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
Then /^I have a file called "(.*)"$/ do |file|
|
25
|
-
filepath = "#{@results}/#{file}"
|
26
|
-
File.exists? filepath
|
27
|
-
end
|
data/features/support/env.rb
DELETED
data/goggles.gemspec
DELETED
@@ -1,27 +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 'goggles/version'
|
5
|
-
|
6
|
-
Gem::Specification.new do |spec|
|
7
|
-
spec.name = "goggles"
|
8
|
-
spec.version = Goggles::VERSION
|
9
|
-
spec.authors = ["Johnson Denen"]
|
10
|
-
spec.email = ["johnson.denen@gmail.com"]
|
11
|
-
spec.summary = %q{Compare screenshots in different browsers at different sizes}
|
12
|
-
spec.description = %q{Compare screenshots in different browsers at different sizes}
|
13
|
-
spec.homepage = "http://github.com/jdenen/goggles"
|
14
|
-
spec.license = "MIT"
|
15
|
-
|
16
|
-
spec.files = `git ls-files -z`.split("\x0")
|
17
|
-
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
-
spec.require_paths = ["lib"]
|
19
|
-
|
20
|
-
spec.add_development_dependency "bundler", "~> 1.5"
|
21
|
-
spec.add_development_dependency "rake"
|
22
|
-
spec.add_development_dependency "rspec"
|
23
|
-
spec.add_development_dependency "cucumber"
|
24
|
-
|
25
|
-
spec.add_runtime_dependency "watir-webdriver"
|
26
|
-
spec.add_runtime_dependency "image_size"
|
27
|
-
end
|
data/lib/goggles.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
require "goggles/configuration"
|
2
|
-
require "goggles/comparison"
|
3
|
-
require "goggles/iteration"
|
4
|
-
|
5
|
-
module Goggles
|
6
|
-
extend self
|
7
|
-
|
8
|
-
def configure &block
|
9
|
-
configuration.tap { |conf| yield conf }
|
10
|
-
end
|
11
|
-
|
12
|
-
def each *instance, &block
|
13
|
-
args = instance.flatten.map(&:to_s)
|
14
|
-
|
15
|
-
sizes = configuration.sizes + args.grep(/\d+/).map(&:to_i)
|
16
|
-
browsers = configuration.browsers + args.grep(/[^\d+]/).map(&:to_sym)
|
17
|
-
|
18
|
-
browsers.product(sizes).each do |browser, size|
|
19
|
-
Iteration.new browser, size, configuration, &block
|
20
|
-
end
|
21
|
-
|
22
|
-
Comparison.new(configuration).tap { |comparison| comparison.make! }
|
23
|
-
end
|
24
|
-
|
25
|
-
private
|
26
|
-
|
27
|
-
def configuration
|
28
|
-
@configuration ||= Configuration.new
|
29
|
-
end
|
30
|
-
end
|
data/lib/goggles/comparison.rb
DELETED
@@ -1,84 +0,0 @@
|
|
1
|
-
require "image_size"
|
2
|
-
|
3
|
-
module Goggles
|
4
|
-
class Comparison
|
5
|
-
attr_reader :directory, :fuzzing, :color, :groups, :results_dir
|
6
|
-
|
7
|
-
def initialize config
|
8
|
-
@directory = config.directory
|
9
|
-
@fuzzing = config.fuzzing
|
10
|
-
@color = config.color
|
11
|
-
@groups = config.groups
|
12
|
-
end
|
13
|
-
|
14
|
-
def make!
|
15
|
-
cut_to_common_size
|
16
|
-
highlight_differences
|
17
|
-
end
|
18
|
-
|
19
|
-
def cut_to_common_size
|
20
|
-
groups.each_with_object([]) do |group, sizes|
|
21
|
-
collection = find_comparable group
|
22
|
-
|
23
|
-
collection.each do |img|
|
24
|
-
File.open(img, 'rb'){ |file| sizes << read_size(file) }
|
25
|
-
end
|
26
|
-
|
27
|
-
cut! collection, sizes
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def highlight_differences
|
32
|
-
groups.each do |desc|
|
33
|
-
ensure_result_directory desc
|
34
|
-
find_comparable(desc).combination(2).to_a.each { |imgs| diff imgs[0], imgs[1] }
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def find_comparable description
|
39
|
-
Dir.glob("#{directory}/*.png").grep(/#{description}_/).sort
|
40
|
-
end
|
41
|
-
|
42
|
-
def find_common_width array
|
43
|
-
array.collect(&:first).sort.first
|
44
|
-
end
|
45
|
-
|
46
|
-
def find_common_height array
|
47
|
-
array.collect(&:last).sort.first
|
48
|
-
end
|
49
|
-
|
50
|
-
private
|
51
|
-
|
52
|
-
attr_writer :results_dir
|
53
|
-
|
54
|
-
def cut! images, sizes
|
55
|
-
w = find_common_width sizes
|
56
|
-
h = find_common_height sizes
|
57
|
-
images.each { |img| `convert #{img} -background none -extent #{w}x#{h} #{img}` }
|
58
|
-
end
|
59
|
-
|
60
|
-
def diff img_one, img_two
|
61
|
-
b1 = diffed img_one
|
62
|
-
b2 = diffed img_two
|
63
|
-
|
64
|
-
fuzz = "#{results_dir}/#{b1}_#{b2}_diff.png"
|
65
|
-
data = "#{results_dir}/#{b1}_#{b2}_data.txt"
|
66
|
-
|
67
|
-
`compare -fuzz #{fuzzing} -metric AE -highlight-color #{color} #{img_one} #{img_two} #{fuzz} 2>#{data}`
|
68
|
-
end
|
69
|
-
|
70
|
-
def diffed img
|
71
|
-
File.basename(img).match(/\d+_(.*)\.png/)[1]
|
72
|
-
end
|
73
|
-
|
74
|
-
def read_size file
|
75
|
-
ImageSize.new(file.read).size
|
76
|
-
end
|
77
|
-
|
78
|
-
def ensure_result_directory description
|
79
|
-
self.results_dir = "#{directory}/#{description}"
|
80
|
-
FileUtils.rm_rf results_dir
|
81
|
-
FileUtils.mkdir_p results_dir
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
module Goggles
|
2
|
-
class Configuration
|
3
|
-
attr_accessor :browsers, :sizes, :fuzzing, :color, :groups
|
4
|
-
attr_reader :directory
|
5
|
-
|
6
|
-
def initialize
|
7
|
-
@browsers = []
|
8
|
-
@sizes = []
|
9
|
-
@groups = []
|
10
|
-
@directory = ""
|
11
|
-
@color = "blue"
|
12
|
-
@fuzzing = "20%"
|
13
|
-
end
|
14
|
-
|
15
|
-
def directory=(path)
|
16
|
-
@directory = path
|
17
|
-
FileUtils.mkdir_p path unless path.empty?
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
data/lib/goggles/iteration.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
require "watir-webdriver"
|
2
|
-
|
3
|
-
module Watir
|
4
|
-
class Browser
|
5
|
-
attr_accessor :goggles, :iteration
|
6
|
-
|
7
|
-
def grab_screenshot name
|
8
|
-
description = "#{name}_#{iteration.size}"
|
9
|
-
goggles.groups << description unless goggles.groups.include? description
|
10
|
-
screenshot.save "#{goggles.directory}/#{description}_#{iteration.browser_name}.png"
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
module Goggles
|
16
|
-
class Iteration
|
17
|
-
attr_reader :browser, :browser_name, :size, :config
|
18
|
-
|
19
|
-
def initialize driver, width, config, &block
|
20
|
-
@browser_name = driver
|
21
|
-
@config = config
|
22
|
-
@size = width
|
23
|
-
build_browser
|
24
|
-
yield browser
|
25
|
-
browser.close
|
26
|
-
end
|
27
|
-
|
28
|
-
private
|
29
|
-
|
30
|
-
def build_browser
|
31
|
-
@browser = Watir::Browser.new(browser_name).tap do |engine|
|
32
|
-
engine.goggles = config
|
33
|
-
engine.iteration = self
|
34
|
-
engine.driver.manage.window.resize_to size, 768
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
data/lib/goggles/version.rb
DELETED
@@ -1,99 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe Goggles::Comparison do
|
4
|
-
let(:config){ instance_double "configuration" }
|
5
|
-
let(:comparison){ Goggles::Comparison.new config }
|
6
|
-
|
7
|
-
before do
|
8
|
-
allow(config).to receive_messages(
|
9
|
-
directory: "dir",
|
10
|
-
fuzzing: "20%",
|
11
|
-
color: "blue",
|
12
|
-
groups: [1])
|
13
|
-
end
|
14
|
-
|
15
|
-
it "reads attributes from a given configuration object" do
|
16
|
-
expect(config).to receive(:directory)
|
17
|
-
expect(config).to receive(:fuzzing)
|
18
|
-
expect(config).to receive(:color)
|
19
|
-
Goggles::Comparison.new config
|
20
|
-
end
|
21
|
-
|
22
|
-
describe "#make!" do
|
23
|
-
it "cuts images and highlights their differences" do
|
24
|
-
expect(comparison).to receive(:cut_to_common_size)
|
25
|
-
expect(comparison).to receive(:highlight_differences)
|
26
|
-
comparison.make!
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
describe "#cut_to_common_size" do
|
31
|
-
it "iterates over screenshot descriptions" do
|
32
|
-
groups = instance_double "[groups]"
|
33
|
-
expect(comparison).to receive(:groups).and_return groups
|
34
|
-
expect(groups).to receive(:each_with_object).with([])
|
35
|
-
comparison.cut_to_common_size
|
36
|
-
end
|
37
|
-
|
38
|
-
it "collects comparable screenshots" do
|
39
|
-
expect(comparison).to receive(:groups).and_return [1, 2]
|
40
|
-
expect(comparison).to receive(:find_comparable).with(1).and_return([])
|
41
|
-
expect(comparison).to receive(:find_comparable).with(2).and_return([])
|
42
|
-
comparison.cut_to_common_size
|
43
|
-
end
|
44
|
-
|
45
|
-
context "with collection of comparable screenshots" do
|
46
|
-
it "iterates over the collection" do
|
47
|
-
screens = instance_double "[screenshots]"
|
48
|
-
expect(comparison).to receive(:groups).and_return ["foo"]
|
49
|
-
expect(comparison).to receive(:find_comparable).and_return screens
|
50
|
-
expect(screens).to receive(:each)
|
51
|
-
expect(comparison).to receive(:cut!).with(screens, [])
|
52
|
-
comparison.cut_to_common_size
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
context "while iterating over collected comparable images" do
|
57
|
-
it "opens each image in binary mode" do
|
58
|
-
expect(comparison).to receive(:find_comparable).and_return [:foo]
|
59
|
-
expect(File).to receive(:open).with(:foo, 'rb')
|
60
|
-
expect(comparison).to receive(:cut!)
|
61
|
-
comparison.cut_to_common_size
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
describe "#highlight_differences" do
|
67
|
-
it "diffs every combination of comparable screenshots" do
|
68
|
-
images = ["foo_1.png", "foo_2.png", "foo_3.png"]
|
69
|
-
expect(comparison).to receive(:groups).and_return ["foo"]
|
70
|
-
expect(comparison).to receive(:find_comparable).with("foo").and_return images
|
71
|
-
images.combination(2).to_a.each do |i|
|
72
|
-
expect(comparison).to receive(:diff).with i[0], i[1]
|
73
|
-
end
|
74
|
-
comparison.highlight_differences
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
describe "#find_comparable" do
|
79
|
-
it "returns an array of file paths" do
|
80
|
-
array = ["/foo_chrome.png", "/bar_chrome.png", "/foo_ff.png", "/bar_ff.png"]
|
81
|
-
expect(Dir).to receive(:glob).and_return array
|
82
|
-
expect(comparison.find_comparable "foo").to eq ["/foo_chrome.png", "/foo_ff.png"]
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
describe "#find_common_width" do
|
87
|
-
it "returns the smallest number from first items in an array of arrays" do
|
88
|
-
arrays = [[100,40], [68,300], [104,98]]
|
89
|
-
expect(comparison.find_common_width arrays).to eq 68
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
describe "#find_common_height" do
|
94
|
-
it "returns the smallest number from second items in an array of arrays" do
|
95
|
-
arrays = [[100,40], [68,300], [104,98]]
|
96
|
-
expect(comparison.find_common_height arrays).to eq 40
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe Goggles::Configuration do
|
4
|
-
let(:config) { Goggles::Configuration.new }
|
5
|
-
|
6
|
-
it "has attributes by default" do
|
7
|
-
expect(config).to have_attributes(
|
8
|
-
:browsers => [],
|
9
|
-
:sizes => [],
|
10
|
-
:groups => [],
|
11
|
-
:directory => "",
|
12
|
-
:color => "blue",
|
13
|
-
:fuzzing => "20%"
|
14
|
-
)
|
15
|
-
end
|
16
|
-
|
17
|
-
it "has attributes that can be set" do
|
18
|
-
config.browsers << "chrome"
|
19
|
-
config.sizes << 100
|
20
|
-
config.groups << "foo"
|
21
|
-
config.color = "red"
|
22
|
-
config.fuzzing = "10%"
|
23
|
-
|
24
|
-
expect(config).to have_attributes(
|
25
|
-
:browsers => ["chrome"],
|
26
|
-
:sizes => [100],
|
27
|
-
:groups => ["foo"],
|
28
|
-
:color => "red",
|
29
|
-
:fuzzing => "10%"
|
30
|
-
)
|
31
|
-
end
|
32
|
-
|
33
|
-
describe "#directory=" do
|
34
|
-
it "ensures the directory exists" do
|
35
|
-
expect(FileUtils).to receive(:mkdir_p).with "/foo/bar"
|
36
|
-
config.directory = "/foo/bar"
|
37
|
-
expect(config.directory).to eq "/foo/bar"
|
38
|
-
end
|
39
|
-
|
40
|
-
context "when attribute is empty" do
|
41
|
-
it "does not create the directory" do
|
42
|
-
expect(FileUtils).to_not receive(:mkdir_p)
|
43
|
-
config.directory = ""
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe Goggles::Iteration do
|
4
|
-
let(:watir) { instance_double("browser") }
|
5
|
-
|
6
|
-
before do
|
7
|
-
allow(watir).to receive_messages(
|
8
|
-
:driver => watir,
|
9
|
-
:manage => watir,
|
10
|
-
:window => watir,
|
11
|
-
:goggles= => nil,
|
12
|
-
:iteration= => nil,
|
13
|
-
:resize_to => nil,
|
14
|
-
:close => nil)
|
15
|
-
end
|
16
|
-
|
17
|
-
it "yields an instantiated browser" do
|
18
|
-
expect(Watir::Browser).to receive(:new).and_return watir
|
19
|
-
expect { |b| Goggles::Iteration.new "", "", "", &b }.to yield_with_args watir
|
20
|
-
end
|
21
|
-
|
22
|
-
it "yields the browser based on the browser_name attribute" do
|
23
|
-
expect(Watir::Browser).to receive(:new).with(:foo).and_return watir
|
24
|
-
Goggles::Iteration.new(:foo, "", ""){ "bar" }
|
25
|
-
end
|
26
|
-
|
27
|
-
it "resizes the browser based on the size attribute" do
|
28
|
-
expect(Watir::Browser).to receive(:new).with(:foo).and_return watir
|
29
|
-
expect(watir).to receive(:resize_to).with(500, 768)
|
30
|
-
Goggles::Iteration.new(:foo, 500, ""){ "bar" }
|
31
|
-
end
|
32
|
-
end
|
data/spec/goggles_spec.rb
DELETED
@@ -1,115 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe Goggles do
|
4
|
-
before { allow(FileUtils).to receive(:mkdir_p) }
|
5
|
-
|
6
|
-
describe ".configure" do
|
7
|
-
it "yields a configuration object" do
|
8
|
-
expect { |b| Goggles.configure &b }.to yield_with_args Goggles::Configuration
|
9
|
-
end
|
10
|
-
|
11
|
-
it "returns a configuration object" do
|
12
|
-
expect(Goggles.configure { "foo" }).to be_a Goggles::Configuration
|
13
|
-
end
|
14
|
-
|
15
|
-
it "memoizes the configuration object" do
|
16
|
-
expect(Goggles.configure { "foo" }).to equal Goggles.configure { "bar" }
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
describe ".each" do
|
21
|
-
let(:config) do
|
22
|
-
Goggles.configure do |conf|
|
23
|
-
conf.browsers = [:foo]
|
24
|
-
conf.sizes = [500]
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
before do
|
29
|
-
allow(config).to receive_messages(directory: "/dir", fuzzing: "20%", color: "blue", groups: [])
|
30
|
-
end
|
31
|
-
|
32
|
-
it "passes browser, width, and configuration to an iteration object" do
|
33
|
-
expect(Goggles::Iteration).to receive(:new).with(:foo, 500, config)
|
34
|
-
Goggles.each { "foo" }
|
35
|
-
end
|
36
|
-
|
37
|
-
context "when given a browser argument" do
|
38
|
-
it "extends the configured browser list with the given browser" do
|
39
|
-
expect(Goggles::Iteration).to receive(:new).with(:foo, 500, config)
|
40
|
-
expect(Goggles::Iteration).to receive(:new).with(:bar, 500, config)
|
41
|
-
Goggles.each(:bar) { "foo" }
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
context "when given a size argument" do
|
46
|
-
it "extends the configured size list with the given size" do
|
47
|
-
expect(Goggles::Iteration).to receive(:new).with(:foo, 500, config)
|
48
|
-
expect(Goggles::Iteration).to receive(:new).with(:foo, 250, config)
|
49
|
-
Goggles.each(250) { "foo" }
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
context "when given multiple browser and size arguments" do
|
54
|
-
it "extends the configuration with correctly" do
|
55
|
-
[:foo, :bar, :baz].product([500, 1000, 250]).each do |b, s|
|
56
|
-
expect(Goggles::Iteration).to receive(:new).with(b, s, config)
|
57
|
-
end
|
58
|
-
Goggles.each(:bar, :baz, 1000, 250) { "foo" }
|
59
|
-
end
|
60
|
-
|
61
|
-
context "in no particular order" do
|
62
|
-
it "extends the configuration with the correct arguments" do
|
63
|
-
[:foo, :bar, :baz].product([500, 1000, 250]).each do |b, s|
|
64
|
-
expect(Goggles::Iteration).to receive(:new).with(b, s, config)
|
65
|
-
end
|
66
|
-
Goggles.each(1000, :bar, :baz, 250) { "foo" }
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
context "when given arguments in arrays" do
|
72
|
-
it "extends the configuration correctly" do
|
73
|
-
[:foo, :bar, :baz].product([500, 1000, 250]).each do |b, s|
|
74
|
-
expect(Goggles::Iteration).to receive(:new).with(b, s, config)
|
75
|
-
end
|
76
|
-
Goggles.each([:bar, :baz], [250, 1000]) { "foo" }
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
context "when given arguments of various classes" do
|
81
|
-
it "extends the configuration correctly" do
|
82
|
-
[:foo, :bar, :baz].product([500, 1000, 250]).each do |b, s|
|
83
|
-
expect(Goggles::Iteration).to receive(:new).with(b, s, config)
|
84
|
-
end
|
85
|
-
Goggles.each([:bar, "baz"], 250, "1000") { "foo" }
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
it "returns a comparison object" do
|
90
|
-
expect(Goggles::Iteration).to receive(:new).with(:foo, 500, config)
|
91
|
-
expect(Goggles.each { "foo" }).to be_a Goggles::Comparison
|
92
|
-
end
|
93
|
-
|
94
|
-
context "when configured for browsers at one size" do
|
95
|
-
it "creates an iteration for each browser with the width" do
|
96
|
-
config.browsers << :bar
|
97
|
-
[:foo, :bar].each { |browser| expect(Goggles::Iteration).to receive(:new).with browser, 500, config }
|
98
|
-
Goggles.each { "foo" }
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
context "when configured for browsers at different sizes" do
|
103
|
-
it "creates an iteration for every browser and width combination" do
|
104
|
-
config.browsers << :bar
|
105
|
-
config.sizes << 1000
|
106
|
-
|
107
|
-
[:foo, :bar].product([500, 1000]).each do |browser, width|
|
108
|
-
expect(Goggles::Iteration).to receive(:new).with browser, width, Object
|
109
|
-
end
|
110
|
-
|
111
|
-
Goggles.each { "foo" }
|
112
|
-
end
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
data/spec/spec_helper.rb
DELETED