compaa 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/compaa +21 -1
- data/lib/compaa/generated_image.rb +6 -0
- data/lib/compaa/rack_app.rb +10 -0
- data/lib/compaa/script.js +77 -0
- data/lib/compaa/template.haml +4 -64
- data/lib/compaa/version.rb +1 -1
- data/spec/generated_image_spec.rb +12 -0
- data/spec/rack_app_spec.rb +72 -0
- metadata +31 -28
data/bin/compaa
CHANGED
@@ -10,6 +10,7 @@ else
|
|
10
10
|
require 'watir-webdriver'
|
11
11
|
end
|
12
12
|
require 'cgi'
|
13
|
+
require 'fileutils'
|
13
14
|
|
14
15
|
class App
|
15
16
|
include Methadone::Main
|
@@ -60,7 +61,26 @@ class App
|
|
60
61
|
end
|
61
62
|
|
62
63
|
def self.screenshot_approved?
|
63
|
-
|
64
|
+
while input = get_input
|
65
|
+
break if yes_or_no?
|
66
|
+
|
67
|
+
puts "It's a simple yes/no question, idiot!"
|
68
|
+
end
|
69
|
+
|
70
|
+
input == 'y'
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.yes_or_no? input
|
74
|
+
input[0] == 'y' || input[0] == 'n'
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.get_input
|
78
|
+
input = STDIN.gets
|
79
|
+
|
80
|
+
input.encode!('UTF-16', 'UTF-8', :invalid => :replace, :replace => '')
|
81
|
+
input.encode!('UTF-8', 'UTF-16')
|
82
|
+
|
83
|
+
input.downcase.chomp
|
64
84
|
end
|
65
85
|
|
66
86
|
version Compaa::VERSION
|
@@ -22,6 +22,12 @@ module Compaa
|
|
22
22
|
path.gsub 'screenshots_generated_this_run', 'reference_screenshots'
|
23
23
|
end
|
24
24
|
|
25
|
+
def delete_difference_image
|
26
|
+
difference_image_path = path.gsub 'screenshots_generated_this_run', 'differences_in_screenshots_this_run'
|
27
|
+
difference_image_path << '_difference.gif'
|
28
|
+
file_manager.rm difference_image_path
|
29
|
+
end
|
30
|
+
|
25
31
|
private
|
26
32
|
|
27
33
|
def copy_and_create_directory dest
|
data/lib/compaa/rack_app.rb
CHANGED
@@ -22,6 +22,16 @@ module Compaa
|
|
22
22
|
body = Haml::Engine.new(template).render Object.new, locals
|
23
23
|
|
24
24
|
[ 200, { 'Content-Type' => 'text/html' }, [body] ]
|
25
|
+
elsif request.path == '/script.js'
|
26
|
+
js = File.read File.expand_path('script.js', File.dirname(__FILE__))
|
27
|
+
|
28
|
+
[ 200, { 'Content-Type' => 'application/javascript' }, [js] ]
|
29
|
+
elsif request.path == '/screenshots' and request.request_method == 'POST' and request.params.has_key? 'filepath'
|
30
|
+
generated_image = GeneratedImage.new File.join(root, request.params['filepath'])
|
31
|
+
generated_image.create_reference_image
|
32
|
+
generated_image.delete_difference_image
|
33
|
+
|
34
|
+
[ 200, { 'Content-Type' => 'text/plain' }, ['Success'] ]
|
25
35
|
else
|
26
36
|
[ 404, {}, ['Not found'] ]
|
27
37
|
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
var Compaa = {
|
2
|
+
filepath: function() {
|
3
|
+
queryString = window.location.search.replace('?', '');
|
4
|
+
return queryString.split('=')[1];
|
5
|
+
},
|
6
|
+
|
7
|
+
differenceGifPath: function() {
|
8
|
+
return this.filepath();
|
9
|
+
},
|
10
|
+
|
11
|
+
oldImagePath: function() {
|
12
|
+
return this.filepath().replace('gif', 'png').replace('_difference.png', '').replace('differences_in_screenshots_this_run','reference_screenshots');
|
13
|
+
},
|
14
|
+
|
15
|
+
newImagePath: function() {
|
16
|
+
return this.filepath().replace('gif', 'png').replace('_difference.png', '').replace('differences_in_screenshots_this_run', 'screenshots_generated_this_run');
|
17
|
+
},
|
18
|
+
|
19
|
+
initClickHandlers: function() {
|
20
|
+
document.getElementById('differenceButton').onclick = function() { Compaa.show('difference') };
|
21
|
+
document.getElementById('animationButton').onclick = function() { Compaa.show('animation') };
|
22
|
+
document.getElementById('oldImageButton').onclick = function() { Compaa.show('oldImage') };
|
23
|
+
document.getElementById('newImageButton').onclick = function() { Compaa.show('newImage') };
|
24
|
+
},
|
25
|
+
|
26
|
+
hideAllImages: function() {
|
27
|
+
for (var i=0; i < this.imageTypes.length, i++) {
|
28
|
+
document.getElementById(this.imageTypes[i]).style.display = 'none';
|
29
|
+
}
|
30
|
+
},
|
31
|
+
|
32
|
+
show: function(mode) {
|
33
|
+
this.hideAllImages();
|
34
|
+
document.getElementById(mode).style.display = 'block';
|
35
|
+
},
|
36
|
+
|
37
|
+
setFormFilePath: function() {
|
38
|
+
document.getElementById('filepath').value = this.newImagePath;
|
39
|
+
},
|
40
|
+
|
41
|
+
imageTypes: ['difference', 'animation', 'oldImage', 'newImage'],
|
42
|
+
|
43
|
+
init: function() {
|
44
|
+
this.setFormFilePath();
|
45
|
+
|
46
|
+
var oldImg = document.createElement('img');
|
47
|
+
oldImg.src = this.oldImagePath();
|
48
|
+
|
49
|
+
var newImg = document.createElement('img');
|
50
|
+
newImg.src = this.newImagePath();
|
51
|
+
|
52
|
+
document.getElementById('difference').width = oldImg.width;
|
53
|
+
document.getElementById('difference').height = oldImg.height;
|
54
|
+
|
55
|
+
document.getElementById('offScreenCanvas').width = newImg.width;
|
56
|
+
document.getElementById('offScreenCanvas').height = newImg.height;
|
57
|
+
|
58
|
+
var over = document.getElementById('offScreenCanvas').getContext('2d');
|
59
|
+
over.drawImage(oldImg, 0, 0);
|
60
|
+
|
61
|
+
var under = document.getElementById('difference').getContext('2d');
|
62
|
+
under.drawImage(newImg, 0, 0);
|
63
|
+
|
64
|
+
over.blendOnto(under,'difference');
|
65
|
+
|
66
|
+
document.getElementById('oldImage').src = this.oldImagePath();
|
67
|
+
document.getElementById('newImage').src = this.newImagePath();
|
68
|
+
|
69
|
+
this.initClickHandlers();
|
70
|
+
}
|
71
|
+
}
|
72
|
+
|
73
|
+
document.onreadystatechange = function() {
|
74
|
+
if (document.readyState == "complete" || document.readyState == "interactive") {
|
75
|
+
Compaa.init();
|
76
|
+
}
|
77
|
+
}
|
data/lib/compaa/template.haml
CHANGED
@@ -13,68 +13,8 @@
|
|
13
13
|
%button#animationButton Animation
|
14
14
|
%button#oldImageButton Old Image
|
15
15
|
%button#newImageButton New Image
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
oldImagePath: '#{filepath.gsub('gif', 'png').gsub('_difference.png', '').gsub('differences_in_screenshots_this_run','reference_screenshots')}',
|
20
|
-
newImagePath: '#{filepath.gsub('gif', 'png').gsub('_difference.png', '').gsub('differences_in_screenshots_this_run','screenshots_generated_this_run')}',
|
16
|
+
%form{:class => 'artifacts', :method => 'POST', :action => '/screenshots'}
|
17
|
+
%input#filepath{:name => 'filepath', :type => 'hidden', :value => ''}
|
18
|
+
%input{:type => 'submit', :value => 'Accept'}
|
21
19
|
|
22
|
-
|
23
|
-
var oldImg=document.createElement('img');
|
24
|
-
oldImg.src = compaa.oldImagePath
|
25
|
-
|
26
|
-
var newImg=document.createElement('img');
|
27
|
-
newImg.src = compaa.newImagePath
|
28
|
-
|
29
|
-
document.getElementById('difference').width = oldImg.width;
|
30
|
-
document.getElementById('difference').height = oldImg.height;
|
31
|
-
|
32
|
-
document.getElementById('offScreenCanvas').width = newImg.width;
|
33
|
-
document.getElementById('offScreenCanvas').height = newImg.height;
|
34
|
-
|
35
|
-
var over = document.getElementById('offScreenCanvas').getContext('2d');
|
36
|
-
over.drawImage(oldImg, 0, 0);
|
37
|
-
|
38
|
-
var under = document.getElementById('difference').getContext('2d');
|
39
|
-
under.drawImage(newImg, 0, 0);
|
40
|
-
|
41
|
-
over.blendOnto(under,'difference');
|
42
|
-
|
43
|
-
document.getElementById('oldImage').src = compaa.oldImagePath;
|
44
|
-
document.getElementById('newImage').src = compaa.newImagePath;
|
45
|
-
|
46
|
-
compaa.show('difference');
|
47
|
-
|
48
|
-
document.getElementById('differenceButton').onclick = function(){compaa.show('difference')};
|
49
|
-
document.getElementById('animationButton').onclick = function(){compaa.show('animation')};
|
50
|
-
document.getElementById('oldImageButton').onclick = function(){compaa.show('oldImage')};
|
51
|
-
document.getElementById('newImageButton').onclick = function(){compaa.show('newImage')};
|
52
|
-
},
|
53
|
-
show: function(mode) {
|
54
|
-
document.getElementById('difference').style.display = 'none';
|
55
|
-
document.getElementById('animation').style.display = 'none';
|
56
|
-
document.getElementById('oldImage').style.display = 'none';
|
57
|
-
document.getElementById('newImage').style.display = 'none';
|
58
|
-
|
59
|
-
switch(mode){
|
60
|
-
case 'difference':
|
61
|
-
document.getElementById('difference').style.display = 'block';
|
62
|
-
break;
|
63
|
-
case 'animation':
|
64
|
-
document.getElementById('animation').style.display = 'block';
|
65
|
-
break;
|
66
|
-
case 'oldImage':
|
67
|
-
document.getElementById('oldImage').style.display = 'block';
|
68
|
-
break;
|
69
|
-
case 'newImage':
|
70
|
-
document.getElementById('newImage').style.display = 'block';
|
71
|
-
break;
|
72
|
-
}
|
73
|
-
}
|
74
|
-
}
|
75
|
-
|
76
|
-
document.onreadystatechange = function() {
|
77
|
-
if (document.readyState == "complete" || document.readyState == "interactive") {
|
78
|
-
compaa.init();
|
79
|
-
}
|
80
|
-
}
|
20
|
+
%script{:src => '/script.js'}
|
data/lib/compaa/version.rb
CHANGED
@@ -65,4 +65,16 @@ describe Compaa::GeneratedImage do
|
|
65
65
|
|
66
66
|
subject.reference_path.must_equal reference_path
|
67
67
|
end
|
68
|
+
|
69
|
+
it "deletes its corresponding difference image" do
|
70
|
+
subject.file_manager = mock_file_manager
|
71
|
+
difference_path =
|
72
|
+
File.join %w[artifacts differences_in_screenshots_this_run dir file.png_difference.gif]
|
73
|
+
|
74
|
+
mock_file_manager.expect :rm, true, [difference_path]
|
75
|
+
|
76
|
+
subject.delete_difference_image
|
77
|
+
|
78
|
+
mock_file_manager.verify
|
79
|
+
end
|
68
80
|
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'rack/test'
|
3
|
+
require 'pry'
|
4
|
+
|
5
|
+
module Compaa
|
6
|
+
describe RackApp do
|
7
|
+
include Rack::Test::Methods
|
8
|
+
|
9
|
+
before do
|
10
|
+
@tmp_dir = File.expand_path('tmp', File.dirname(__FILE__))
|
11
|
+
FileUtils.mkdir_p @tmp_dir
|
12
|
+
end
|
13
|
+
|
14
|
+
after do
|
15
|
+
FileUtils.rm_rf @tmp_dir
|
16
|
+
end
|
17
|
+
|
18
|
+
def app
|
19
|
+
RackApp.new.tap { |a| a.root_directory = @tmp_dir }.app
|
20
|
+
end
|
21
|
+
|
22
|
+
def touch_file path
|
23
|
+
FileUtils.mkdir_p File.dirname(File.join(@tmp_dir, path))
|
24
|
+
FileUtils.touch File.join(@tmp_dir, path)
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "GET '/'" do
|
28
|
+
it "requires the filepath param" do
|
29
|
+
get '/'
|
30
|
+
assert_equal 404, last_response.status
|
31
|
+
|
32
|
+
get '/', :filepath => 'some/path'
|
33
|
+
assert last_response.ok?
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "GET '/script.js'" do
|
38
|
+
it "returns our javascript" do
|
39
|
+
get '/script.js'
|
40
|
+
assert last_response.ok?
|
41
|
+
assert_equal 'application/javascript', last_response.headers['Content-Type']
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "GET '/artifacts'" do
|
46
|
+
it "serves static files" do
|
47
|
+
touch_file 'artifacts/file.png'
|
48
|
+
|
49
|
+
get '/artifacts/file.png'
|
50
|
+
|
51
|
+
assert last_response.ok?
|
52
|
+
assert_equal 'image/png', last_response.headers['Content-Type']
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "POST '/screenshots'" do
|
57
|
+
it "expects a filepath query" do
|
58
|
+
post '/screenshots'
|
59
|
+
assert_equal 404, last_response.status
|
60
|
+
end
|
61
|
+
|
62
|
+
it "copies the supplied image path to its reference image" do
|
63
|
+
touch_file 'artifacts/screenshots_generated_this_run/file.png'
|
64
|
+
touch_file 'artifacts/differences_in_screenshots_this_run/file.png_difference.gif'
|
65
|
+
|
66
|
+
refute File.exists? "#{@tmp_dir}/artifacts/reference_screenshots/file.png"
|
67
|
+
post '/screenshots', :filepath => 'artifacts/screenshots_generated_this_run/file.png'
|
68
|
+
assert File.exists? "#{@tmp_dir}/artifacts/reference_screenshots/file.png"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: compaa
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-01-
|
12
|
+
date: 2013-01-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
16
|
-
requirement: &
|
16
|
+
requirement: &15554740 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *15554740
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: aruba
|
27
|
-
requirement: &
|
27
|
+
requirement: &15553920 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *15553920
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: simplecov
|
38
|
-
requirement: &
|
38
|
+
requirement: &15553300 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *15553300
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: wrong
|
49
|
-
requirement: &
|
49
|
+
requirement: &15552520 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *15552520
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: minitest
|
60
|
-
requirement: &
|
60
|
+
requirement: &15551680 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *15551680
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: guard-minitest
|
71
|
-
requirement: &
|
71
|
+
requirement: &15550780 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *15550780
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: guard-cucumber
|
82
|
-
requirement: &
|
82
|
+
requirement: &15549840 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *15549840
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: rack-test
|
93
|
-
requirement: &
|
93
|
+
requirement: &15549360 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ! '>='
|
@@ -98,10 +98,10 @@ dependencies:
|
|
98
98
|
version: '0'
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *15549360
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: rb-inotify
|
104
|
-
requirement: &
|
104
|
+
requirement: &15548540 !ruby/object:Gem::Requirement
|
105
105
|
none: false
|
106
106
|
requirements:
|
107
107
|
- - ! '>='
|
@@ -109,10 +109,10 @@ dependencies:
|
|
109
109
|
version: '0'
|
110
110
|
type: :development
|
111
111
|
prerelease: false
|
112
|
-
version_requirements: *
|
112
|
+
version_requirements: *15548540
|
113
113
|
- !ruby/object:Gem::Dependency
|
114
114
|
name: methadone
|
115
|
-
requirement: &
|
115
|
+
requirement: &15547720 !ruby/object:Gem::Requirement
|
116
116
|
none: false
|
117
117
|
requirements:
|
118
118
|
- - ~>
|
@@ -120,10 +120,10 @@ dependencies:
|
|
120
120
|
version: 1.2.2
|
121
121
|
type: :runtime
|
122
122
|
prerelease: false
|
123
|
-
version_requirements: *
|
123
|
+
version_requirements: *15547720
|
124
124
|
- !ruby/object:Gem::Dependency
|
125
125
|
name: haml
|
126
|
-
requirement: &
|
126
|
+
requirement: &15546920 !ruby/object:Gem::Requirement
|
127
127
|
none: false
|
128
128
|
requirements:
|
129
129
|
- - ! '>='
|
@@ -131,10 +131,10 @@ dependencies:
|
|
131
131
|
version: '0'
|
132
132
|
type: :runtime
|
133
133
|
prerelease: false
|
134
|
-
version_requirements: *
|
134
|
+
version_requirements: *15546920
|
135
135
|
- !ruby/object:Gem::Dependency
|
136
136
|
name: watir-webdriver
|
137
|
-
requirement: &
|
137
|
+
requirement: &15546400 !ruby/object:Gem::Requirement
|
138
138
|
none: false
|
139
139
|
requirements:
|
140
140
|
- - ! '>='
|
@@ -142,10 +142,10 @@ dependencies:
|
|
142
142
|
version: '0'
|
143
143
|
type: :runtime
|
144
144
|
prerelease: false
|
145
|
-
version_requirements: *
|
145
|
+
version_requirements: *15546400
|
146
146
|
- !ruby/object:Gem::Dependency
|
147
147
|
name: rack
|
148
|
-
requirement: &
|
148
|
+
requirement: &15545840 !ruby/object:Gem::Requirement
|
149
149
|
none: false
|
150
150
|
requirements:
|
151
151
|
- - ! '>='
|
@@ -153,7 +153,7 @@ dependencies:
|
|
153
153
|
version: '0'
|
154
154
|
type: :runtime
|
155
155
|
prerelease: false
|
156
|
-
version_requirements: *
|
156
|
+
version_requirements: *15545840
|
157
157
|
description:
|
158
158
|
email:
|
159
159
|
- skyhelpcentre@gmail.com
|
@@ -184,12 +184,14 @@ files:
|
|
184
184
|
- lib/compaa/generated_image.rb
|
185
185
|
- lib/compaa/null_object.rb
|
186
186
|
- lib/compaa/rack_app.rb
|
187
|
+
- lib/compaa/script.js
|
187
188
|
- lib/compaa/template.haml
|
188
189
|
- lib/compaa/version.rb
|
189
190
|
- lib/watir-webdriver-fake.rb
|
190
191
|
- log/newrelic_agent.log
|
191
192
|
- spec/difference_image_spec.rb
|
192
193
|
- spec/generated_image_spec.rb
|
194
|
+
- spec/rack_app_spec.rb
|
193
195
|
- spec/spec_helper.rb
|
194
196
|
homepage: https://github.com/bskyb-commerce-helpcentre/compaa
|
195
197
|
licenses: []
|
@@ -224,4 +226,5 @@ test_files:
|
|
224
226
|
- features/support/matchers.rb
|
225
227
|
- spec/difference_image_spec.rb
|
226
228
|
- spec/generated_image_spec.rb
|
229
|
+
- spec/rack_app_spec.rb
|
227
230
|
- spec/spec_helper.rb
|