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 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
- STDIN.gets.chomp.downcase.start_with? 'y'
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
@@ -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
+ }
@@ -13,68 +13,8 @@
13
13
  %button#animationButton Animation
14
14
  %button#oldImageButton Old Image
15
15
  %button#newImageButton New Image
16
- :javascript
17
- var compaa = {
18
- differenceGifPath: '#{filepath}',
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
- init: function() {
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'}
@@ -1,3 +1,3 @@
1
1
  module Compaa
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -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.3
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-08 00:00:00.000000000Z
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: &22122940 !ruby/object:Gem::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: *22122940
24
+ version_requirements: *15554740
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: aruba
27
- requirement: &22122100 !ruby/object:Gem::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: *22122100
35
+ version_requirements: *15553920
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: simplecov
38
- requirement: &22121020 !ruby/object:Gem::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: *22121020
46
+ version_requirements: *15553300
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: wrong
49
- requirement: &22106200 !ruby/object:Gem::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: *22106200
57
+ version_requirements: *15552520
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: minitest
60
- requirement: &22105280 !ruby/object:Gem::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: *22105280
68
+ version_requirements: *15551680
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: guard-minitest
71
- requirement: &22104480 !ruby/object:Gem::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: *22104480
79
+ version_requirements: *15550780
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: guard-cucumber
82
- requirement: &22103520 !ruby/object:Gem::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: *22103520
90
+ version_requirements: *15549840
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: rack-test
93
- requirement: &22102680 !ruby/object:Gem::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: *22102680
101
+ version_requirements: *15549360
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: rb-inotify
104
- requirement: &22101640 !ruby/object:Gem::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: *22101640
112
+ version_requirements: *15548540
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: methadone
115
- requirement: &22100160 !ruby/object:Gem::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: *22100160
123
+ version_requirements: *15547720
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: haml
126
- requirement: &22099620 !ruby/object:Gem::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: *22099620
134
+ version_requirements: *15546920
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: watir-webdriver
137
- requirement: &22098520 !ruby/object:Gem::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: *22098520
145
+ version_requirements: *15546400
146
146
  - !ruby/object:Gem::Dependency
147
147
  name: rack
148
- requirement: &22097640 !ruby/object:Gem::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: *22097640
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