simulacrum 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE +0 -0
- data/lib/simulacrum/browser.rb +38 -1
- data/lib/simulacrum/browser_options.rb +5 -0
- data/lib/simulacrum/comparator.rb +5 -5
- data/lib/simulacrum/component.rb +41 -9
- data/lib/simulacrum/configuration.rb +7 -3
- data/lib/simulacrum/diff/pdiff.rb +13 -13
- data/lib/simulacrum/diff/rmagick.rb +16 -5
- data/lib/simulacrum/diff.rb +0 -4
- data/lib/simulacrum/matchers.rb +21 -8
- data/lib/simulacrum/methods.rb +22 -10
- data/lib/simulacrum/version.rb +1 -1
- data/lib/simulacrum.rb +22 -3
- metadata +18 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7687eec5b004b38792cf95b1c4dc725c060f9a00
|
4
|
+
data.tar.gz: 794e8cd0f33574cc2290cfcdb407b21a99c5d27e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7e570746996c898fdaba924b2f885637640dae8c1734b433942ba1da5fcec94b1860daaa54b2df3aec0138c34be784fae34635d54d44b13994333460415a1a62
|
7
|
+
data.tar.gz: 1e356ca93bd87a2483f7e13855ac7eb561520d7e927f06619229fa4e1da97d70b29a37964d7c79d42b2509c05ff81f5d523c5b93eaf5dc94ee6898da6fab1605
|
data/LICENSE
ADDED
File without changes
|
data/lib/simulacrum/browser.rb
CHANGED
@@ -1,7 +1,44 @@
|
|
1
1
|
require 'capybara'
|
2
|
-
require 'capybara/dsl'
|
3
2
|
|
4
3
|
module Simulacrum
|
5
4
|
class Browser
|
5
|
+
attr_reader :name, :options
|
6
|
+
|
7
|
+
def initialize(name, options)
|
8
|
+
@name = name
|
9
|
+
@options = options
|
10
|
+
end
|
11
|
+
|
12
|
+
def use
|
13
|
+
register_driver
|
14
|
+
Capybara.default_driver = name.to_sym
|
15
|
+
end
|
16
|
+
|
17
|
+
def configure(config)
|
18
|
+
puts config.inspect
|
19
|
+
end
|
20
|
+
|
21
|
+
def capture_delay
|
22
|
+
@options.capture_delay || Simulacrum.configuration.capture_delay
|
23
|
+
end
|
24
|
+
|
25
|
+
def remote?
|
26
|
+
@options.remote.nil? ? false : @options.remote
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def driver_options
|
32
|
+
options = { desired_capabilities: @options.caps }
|
33
|
+
options[:browser] = :remote if remote?
|
34
|
+
options[:url] = Simulacrum.configuration.remote_url if remote?
|
35
|
+
options
|
36
|
+
end
|
37
|
+
|
38
|
+
def register_driver
|
39
|
+
Capybara.register_driver name.to_sym do |app|
|
40
|
+
Capybara::Selenium::Driver.new(app, driver_options)
|
41
|
+
end
|
42
|
+
end
|
6
43
|
end
|
7
44
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require_relative 'diff/rmagick'
|
1
|
+
require_relative './diff/rmagick'
|
2
2
|
|
3
3
|
module Simulacrum
|
4
4
|
# The Comparator class is responsible for comparing and handling
|
@@ -10,11 +10,10 @@ module Simulacrum
|
|
10
10
|
|
11
11
|
def initialize(component)
|
12
12
|
@component = component
|
13
|
+
@component.render
|
13
14
|
end
|
14
15
|
|
15
16
|
def test
|
16
|
-
@candidate = @component.capture_candidate
|
17
|
-
|
18
17
|
# If the component has a reference then we should diff the candidate
|
19
18
|
# image against the reference
|
20
19
|
if @component.reference?
|
@@ -34,6 +33,7 @@ module Simulacrum
|
|
34
33
|
|
35
34
|
def pass
|
36
35
|
@component.remove_candidate
|
36
|
+
@component.remove_diff
|
37
37
|
true
|
38
38
|
end
|
39
39
|
|
@@ -48,12 +48,12 @@ module Simulacrum
|
|
48
48
|
|
49
49
|
def perform_diff()
|
50
50
|
@diff = Simulacrum::RmagicDiff.new(@component.reference_path,
|
51
|
-
|
51
|
+
@component.candidate_path)
|
52
52
|
diff_delta_percent_is_acceptable
|
53
53
|
end
|
54
54
|
|
55
55
|
def diff_delta_percent_is_acceptable
|
56
|
-
|
56
|
+
@diff.delta_percent < @component.acceptable_delta
|
57
57
|
end
|
58
58
|
end
|
59
59
|
end
|
data/lib/simulacrum/component.rb
CHANGED
@@ -1,32 +1,41 @@
|
|
1
|
-
require 'capybara'
|
1
|
+
require 'capybara/dsl'
|
2
2
|
|
3
3
|
module Simulacrum
|
4
4
|
class Component
|
5
5
|
include Capybara::DSL
|
6
|
-
Capybara.default_driver = :selenium
|
7
6
|
|
8
|
-
attr_reader :name
|
7
|
+
attr_reader :name, :browser
|
8
|
+
attr_accessor :options
|
9
9
|
|
10
|
-
def initialize(name, options)
|
10
|
+
def initialize(name, browser = nil, options = {})
|
11
11
|
@name = name
|
12
12
|
@options = options
|
13
|
+
@browser = browser
|
13
14
|
end
|
14
15
|
|
15
16
|
# Load up the component url and capture an image, returns a File object
|
16
|
-
def
|
17
|
+
def render
|
18
|
+
use_browser
|
17
19
|
ensure_example_path
|
18
20
|
visit(@options.url)
|
19
|
-
|
20
|
-
|
21
|
-
|
21
|
+
page.driver.save_screenshot(candidate_path, options)
|
22
|
+
kill_driver
|
23
|
+
end
|
24
|
+
|
25
|
+
def render_with(browser)
|
26
|
+
self.class.new(name, browser, @options)
|
22
27
|
end
|
23
28
|
|
24
29
|
def remove_candidate
|
25
30
|
FileUtils.rm(candidate_path) if candidate?
|
26
31
|
end
|
27
32
|
|
33
|
+
def remove_diff
|
34
|
+
FileUtils.rm(diff_path) if diff?
|
35
|
+
end
|
36
|
+
|
28
37
|
def root_path
|
29
|
-
File.join(Simulacrum.configuration.images_path,
|
38
|
+
File.join(Simulacrum.configuration.images_path, render_path)
|
30
39
|
end
|
31
40
|
|
32
41
|
def reference_path
|
@@ -49,12 +58,35 @@ module Simulacrum
|
|
49
58
|
File.exists?(candidate_path)
|
50
59
|
end
|
51
60
|
|
61
|
+
def diff?
|
62
|
+
File.exists?(diff_path)
|
63
|
+
end
|
64
|
+
|
52
65
|
def acceptable_delta
|
53
66
|
@options.acceptable_delta || Simulacrum.configuration.acceptable_delta
|
54
67
|
end
|
55
68
|
|
56
69
|
private
|
57
70
|
|
71
|
+
def kill_driver
|
72
|
+
if not @browser.nil? and @browser.remote?
|
73
|
+
page.driver.quit
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def render_path
|
78
|
+
path = [name.to_s]
|
79
|
+
path << @browser.name unless @browser.nil?
|
80
|
+
File.join(path.map(&:to_s))
|
81
|
+
end
|
82
|
+
|
83
|
+
def use_browser
|
84
|
+
unless @browser.nil?
|
85
|
+
@browser.use
|
86
|
+
sleep @browser.capture_delay.to_i
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
58
90
|
def ensure_example_path
|
59
91
|
FileUtils.mkdir_p(root_path)
|
60
92
|
end
|
@@ -3,7 +3,7 @@ require 'ostruct'
|
|
3
3
|
module Simulacrum
|
4
4
|
class Configuration
|
5
5
|
attr_reader :images_path, :reference_filename, :candidate_filename,
|
6
|
-
:diff_filename, :capture_selector, :acceptable_delta
|
6
|
+
:diff_filename, :capture_selector, :acceptable_delta, :capture_delay
|
7
7
|
|
8
8
|
def initialize
|
9
9
|
@config = OpenStruct.new
|
@@ -29,12 +29,16 @@ module Simulacrum
|
|
29
29
|
@config.diff_filename || 'diff.png'
|
30
30
|
end
|
31
31
|
|
32
|
-
def
|
33
|
-
@config.
|
32
|
+
def capture_delay
|
33
|
+
@config.capture_delay || 0
|
34
34
|
end
|
35
35
|
|
36
36
|
def acceptable_delta
|
37
37
|
@config.acceptable_delta || 0.0
|
38
38
|
end
|
39
|
+
|
40
|
+
def remote_url
|
41
|
+
@config.remote_url
|
42
|
+
end
|
39
43
|
end
|
40
44
|
end
|
@@ -1,16 +1,16 @@
|
|
1
|
-
require 'chunky_png'
|
2
|
-
require_relative '../diff'
|
3
|
-
|
4
|
-
module Simulacrum
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
end
|
1
|
+
# require 'chunky_png'
|
2
|
+
# require_relative '../diff'
|
3
|
+
|
4
|
+
# module Simulacrum
|
5
|
+
# class Pdiff < Simulacrum::Diff
|
6
|
+
# include ChunkyPNG::Color
|
7
|
+
|
8
|
+
# def compare
|
9
|
+
# a_image = ChunkyPNG::Image.from_file(@a_path)
|
10
|
+
# b_image = ChunkyPNG::Image.from_file(@b_path)
|
11
|
+
# end
|
12
|
+
# end
|
13
|
+
# end
|
14
14
|
|
15
15
|
# require 'chunky_png'
|
16
16
|
# include ChunkyPNG::Color
|
@@ -3,16 +3,27 @@ require_relative '../diff'
|
|
3
3
|
|
4
4
|
module Simulacrum
|
5
5
|
class RmagicDiff < Simulacrum::Diff
|
6
|
+
def delta_percent
|
7
|
+
@delta * 100
|
8
|
+
end
|
9
|
+
|
6
10
|
private
|
7
11
|
|
8
12
|
def compare
|
9
|
-
|
10
|
-
|
11
|
-
@image, @delta = compare_images(
|
13
|
+
a = Magick::Image.read(@a_path)
|
14
|
+
b = Magick::Image.read(@b_path)
|
15
|
+
@image, @delta = compare_images(a, b)
|
12
16
|
end
|
13
17
|
|
14
|
-
def compare_images(
|
15
|
-
|
18
|
+
def compare_images(a, b)
|
19
|
+
# Calculate the Square Root Mean Squared Error for the comparison of the
|
20
|
+
# two images.
|
21
|
+
#
|
22
|
+
# Gets the color difference for each pixel, and square it, average all the
|
23
|
+
# squared differences, then return the square root.
|
24
|
+
#
|
25
|
+
# http://www.imagemagick.org/discourse-server/viewtopic.php?f=1&t=17284
|
26
|
+
a[0].compare_channel(b[0], Magick::MeanSquaredErrorMetric)
|
16
27
|
end
|
17
28
|
end
|
18
29
|
end
|
data/lib/simulacrum/diff.rb
CHANGED
data/lib/simulacrum/matchers.rb
CHANGED
@@ -1,17 +1,30 @@
|
|
1
|
-
require_relative 'comparator'
|
1
|
+
require_relative './comparator'
|
2
2
|
|
3
3
|
module Simulacrum
|
4
4
|
module Matchers
|
5
5
|
extend RSpec::Matchers::DSL
|
6
6
|
|
7
7
|
matcher :look_the_same do
|
8
|
+
# browser = options[:in_browser]
|
9
|
+
# browser.use unless browser.nil?
|
10
|
+
|
8
11
|
match do |component|
|
12
|
+
component = component
|
9
13
|
comparator = Simulacrum::Comparator.new(component)
|
14
|
+
|
10
15
|
case comparator.test
|
11
16
|
when true
|
12
17
|
true
|
13
18
|
when false
|
14
|
-
fail
|
19
|
+
fail Simulacrum::Matchers.fail_message(component, comparator)
|
20
|
+
when nil
|
21
|
+
pending Simulacrum::Matchers.pending_message(component)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.fail_message(component, comparator)
|
27
|
+
<<-eos
|
15
28
|
The pixel change percentage exceeded the maximum threshold of #{component.acceptable_delta}%.
|
16
29
|
|
17
30
|
There was a #{comparator.diff.percent_change}% pixel difference found between \
|
@@ -22,9 +35,11 @@ Candidate: #{component.candidate_path}
|
|
22
35
|
Diff: #{component.diff_path}
|
23
36
|
|
24
37
|
Please review the diff and resolve manually.
|
25
|
-
|
26
|
-
|
27
|
-
|
38
|
+
eos
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.pending_message(component)
|
42
|
+
<<-eos
|
28
43
|
No reference image found! New candidate created:
|
29
44
|
|
30
45
|
#{component.candidate_path}
|
@@ -34,9 +49,7 @@ No reference image found! New candidate created:
|
|
34
49
|
- mark it as a reference image by renaming it to 'reference.png'
|
35
50
|
- commit 'reference.png' file to your SCM of choice
|
36
51
|
- rerun this spec making sure it passes using the new reference image
|
37
|
-
|
38
|
-
end
|
39
|
-
end
|
52
|
+
eos
|
40
53
|
end
|
41
54
|
end
|
42
55
|
end
|
data/lib/simulacrum/methods.rb
CHANGED
@@ -1,25 +1,37 @@
|
|
1
1
|
require 'ostruct'
|
2
|
-
require_relative 'browser'
|
3
|
-
require_relative 'component'
|
2
|
+
require_relative './browser'
|
3
|
+
require_relative './component'
|
4
4
|
|
5
5
|
module Simulacrum
|
6
|
-
# Rspec utility methods for defining components, browser environments
|
6
|
+
# Rspec utility methods for defining components, browser environments
|
7
7
|
module Methods
|
8
8
|
def component(name, &block)
|
9
9
|
options = OpenStruct.new
|
10
10
|
yield options
|
11
|
-
component = Simulacrum::Component.new(name, options)
|
11
|
+
component = Simulacrum::Component.new(name, nil, options)
|
12
12
|
Simulacrum.components[name] = component
|
13
|
-
|
14
|
-
|
15
|
-
component
|
16
|
-
end
|
13
|
+
subject { component }
|
14
|
+
let(:component) { component }
|
17
15
|
end
|
18
16
|
|
19
|
-
def
|
17
|
+
def browser(name, &block)
|
20
18
|
options = OpenStruct.new
|
19
|
+
options.caps = {}
|
21
20
|
yield options
|
22
|
-
|
21
|
+
Simulacrum.browsers[name] = Simulacrum::Browser.new(name, options)
|
22
|
+
let(name.to_sym) { browser }
|
23
|
+
end
|
24
|
+
|
25
|
+
def use_browser(name, extra_config = {})
|
26
|
+
previous_browser = Simulacrum.current_browser
|
27
|
+
current_browser = Simulacrum.browsers[name]
|
28
|
+
current_browser.configure(extra_config)
|
29
|
+
Simulacrum.current_browser = current_browser
|
30
|
+
subject { component.render_with(current_browser) }
|
31
|
+
after(:each) {
|
32
|
+
Simulacrum.current_browser = previous_browser
|
33
|
+
component.render_with(previous_browser)
|
34
|
+
}
|
23
35
|
end
|
24
36
|
end
|
25
37
|
end
|
data/lib/simulacrum/version.rb
CHANGED
data/lib/simulacrum.rb
CHANGED
@@ -1,17 +1,36 @@
|
|
1
1
|
require 'ostruct'
|
2
|
-
|
3
|
-
require_relative '
|
4
|
-
require_relative '
|
2
|
+
require 'capybara'
|
3
|
+
require_relative './simulacrum/methods'
|
4
|
+
require_relative './simulacrum/matchers'
|
5
|
+
require_relative './simulacrum/configuration'
|
5
6
|
|
6
7
|
# Gem module
|
7
8
|
module Simulacrum
|
9
|
+
@current_browser = nil
|
10
|
+
@browsers = {}
|
8
11
|
@components = {}
|
9
12
|
@configuration = Simulacrum::Configuration.new
|
10
13
|
|
14
|
+
Capybara.configure do |config|
|
15
|
+
config.default_driver = :selenium
|
16
|
+
end
|
17
|
+
|
11
18
|
def self.components
|
12
19
|
@components
|
13
20
|
end
|
14
21
|
|
22
|
+
def self.browsers
|
23
|
+
@browsers
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.current_browser
|
27
|
+
@current_browser
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.current_browser=(browser)
|
31
|
+
@current_browser = browser
|
32
|
+
end
|
33
|
+
|
15
34
|
def self.configuration
|
16
35
|
@configuration
|
17
36
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simulacrum
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin Morris
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-03-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: capybara
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: selenium-webdriver
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: coveralls
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -173,6 +187,7 @@ extensions: []
|
|
173
187
|
extra_rdoc_files: []
|
174
188
|
files:
|
175
189
|
- lib/simulacrum/browser.rb
|
190
|
+
- lib/simulacrum/browser_options.rb
|
176
191
|
- lib/simulacrum/comparator.rb
|
177
192
|
- lib/simulacrum/component.rb
|
178
193
|
- lib/simulacrum/configuration.rb
|
@@ -184,6 +199,7 @@ files:
|
|
184
199
|
- lib/simulacrum/version.rb
|
185
200
|
- lib/simulacrum.rb
|
186
201
|
- README.md
|
202
|
+
- LICENSE
|
187
203
|
- spec/fixtures/a.png
|
188
204
|
- spec/fixtures/a2.png
|
189
205
|
- spec/spec_helper.rb
|