happo 1.0.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/happo +0 -9
- data/lib/happo/public/happo-styles.css +0 -4
- data/lib/happo/runner.rb +34 -21
- data/lib/happo/server.rb +0 -10
- data/lib/happo/uploader.rb +10 -5
- data/lib/happo/utils.rb +2 -2
- data/lib/happo/version.rb +1 -1
- data/lib/happo/views/review.erb +4 -14
- data/lib/happo.rb +0 -1
- metadata +2 -3
- data/lib/happo/action.rb +0 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5bc8376eac8e1bfacd86ac884e2123f2e5c26241
|
4
|
+
data.tar.gz: 1f4bdd2c779cd2568dcec63659c73068a37386e2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 13fad1aaf10906ad8c6583927d272d01ef2ab23fb75f74220b252cf53f496b37fb86149684014739ed9ed0779ab764dafb02a6f3a41d2d5049dfdb5f7609a38e
|
7
|
+
data.tar.gz: 2212b4bc094addb155238555da89797d4e89d4b48eccf3399a92a84d77d4af69f5b3555a3799dbab8c29d64a0bbde90df2d912bdee3fa2f08119b7af2c09ec17
|
data/bin/happo
CHANGED
@@ -9,8 +9,6 @@ Commands:
|
|
9
9
|
debug
|
10
10
|
review
|
11
11
|
clean
|
12
|
-
approve
|
13
|
-
reject
|
14
12
|
upload_diffs
|
15
13
|
--help
|
16
14
|
--version
|
@@ -39,13 +37,6 @@ when 'clean'
|
|
39
37
|
FileUtils.remove_entry_secure Happo::Utils.config['snapshots_folder']
|
40
38
|
end
|
41
39
|
|
42
|
-
when 'approve', 'reject'
|
43
|
-
example_description = ARGV[1]
|
44
|
-
abort 'Missing example description' unless example_description
|
45
|
-
viewport_name = ARGV[2]
|
46
|
-
abort 'Missing viewport name' unless viewport_name
|
47
|
-
Happo::Action.new(example_description, viewport_name).send(action)
|
48
|
-
|
49
40
|
when 'upload_diffs'
|
50
41
|
# `upload_diffs` returns a URL to a static html file
|
51
42
|
puts Happo::Uploader.new.upload_diffs
|
data/lib/happo/runner.rb
CHANGED
@@ -144,35 +144,49 @@ begin
|
|
144
144
|
log.log '.', false
|
145
145
|
end
|
146
146
|
|
147
|
-
#
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
147
|
+
# This is potentially expensive code that is run in a tight loop for every
|
148
|
+
# snapshot that we will be taking. With that in mind, we want to do as
|
149
|
+
# little work here as possible to keep runs fast. Therefore, we have
|
150
|
+
# landed on the following algorithm:
|
151
|
+
#
|
152
|
+
# 1. Delete previous.png if it exists.
|
153
|
+
# 2. Compare the current snapshot in memory against current.png if it
|
154
|
+
# exists.
|
155
|
+
# 3. If there is a diff, move current.png to previous.png and write out
|
156
|
+
# diff.png to disk and the current snapshot to current.png.
|
157
|
+
# 4. If there is no diff, return, leaving the old current.png in place.
|
158
|
+
previous_image_path = Happo::Utils.path_to(
|
159
|
+
description, viewport['name'], 'previous.png')
|
160
|
+
current_image_path = Happo::Utils.path_to(
|
161
|
+
description, viewport['name'], 'current.png')
|
162
|
+
diff_image_path = Happo::Utils.path_to(
|
163
|
+
description, viewport['name'], 'diff.png')
|
164
|
+
|
165
|
+
# We no longer need the old previous.png and diff.png, so lets remove them
|
166
|
+
# to keep things clean.
|
167
|
+
File.delete previous_image_path if File.exist? previous_image_path
|
168
|
+
File.delete diff_image_path if File.exist? diff_image_path
|
169
|
+
|
170
|
+
if File.exist? current_image_path
|
154
171
|
comparison = Happo::SnapshotComparer.new(
|
155
|
-
ChunkyPNG::Image.from_file(
|
172
|
+
ChunkyPNG::Image.from_file(current_image_path),
|
156
173
|
screenshot
|
157
174
|
).compare!
|
158
175
|
log.log '.', false
|
159
176
|
|
160
177
|
if comparison[:diff_image]
|
161
178
|
# There was a visual difference between the new snapshot and the
|
162
|
-
#
|
179
|
+
# previous, so we want to write the diff image and the new snapshot
|
163
180
|
# image to disk. This will allow it to be reviewed by someone.
|
164
|
-
|
165
|
-
description, viewport['name'], 'diff.png')
|
166
|
-
comparison[:diff_image].save(diff_path, :fast_rgba)
|
181
|
+
comparison[:diff_image].save(diff_image_path, :fast_rgba)
|
167
182
|
log.log '.', false
|
168
183
|
|
169
|
-
|
170
|
-
|
171
|
-
screenshot.save(candidate_path, :fast_rgba)
|
184
|
+
File.rename(current_image_path, previous_image_path)
|
185
|
+
screenshot.save(current_image_path, :fast_rgba)
|
172
186
|
log.log '.', false
|
173
187
|
|
174
188
|
percent = comparison[:diff_in_percent].round(1)
|
175
|
-
log.log log.cyan(" #{percent}% (#{
|
189
|
+
log.log log.cyan(" #{percent}% (#{current_image_path})")
|
176
190
|
result_summary[:diff_examples] << {
|
177
191
|
description: description,
|
178
192
|
viewport: viewport['name']
|
@@ -187,16 +201,15 @@ begin
|
|
187
201
|
}
|
188
202
|
end
|
189
203
|
else
|
190
|
-
# There was no
|
191
|
-
# baseline image.
|
204
|
+
# There was no snapshot yet, so we want to start by saving a new one.
|
192
205
|
|
193
206
|
# Create the folder structure if it doesn't already exist
|
194
|
-
unless File.directory?(dirname = File.dirname(
|
207
|
+
unless File.directory?(dirname = File.dirname(current_image_path))
|
195
208
|
FileUtils.mkdir_p(dirname)
|
196
209
|
end
|
197
|
-
screenshot.save(
|
210
|
+
screenshot.save(current_image_path, :fast_rgba)
|
198
211
|
log.log '.', false
|
199
|
-
log.log " First snapshot created (#{
|
212
|
+
log.log " First snapshot created (#{current_image_path})"
|
200
213
|
result_summary[:new_examples] << {
|
201
214
|
description: description,
|
202
215
|
viewport: viewport['name']
|
data/lib/happo/server.rb
CHANGED
@@ -53,16 +53,6 @@ module Happo
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
-
post '/reject' do
|
57
|
-
Happo::Action.new(params[:description], params[:viewport]).reject
|
58
|
-
redirect back
|
59
|
-
end
|
60
|
-
|
61
|
-
post '/approve' do
|
62
|
-
Happo::Action.new(params[:description], params[:viewport]).approve
|
63
|
-
redirect back
|
64
|
-
end
|
65
|
-
|
66
56
|
run!
|
67
57
|
end
|
68
58
|
end
|
data/lib/happo/uploader.rb
CHANGED
@@ -4,9 +4,10 @@ require 'securerandom'
|
|
4
4
|
module Happo
|
5
5
|
class Uploader
|
6
6
|
def initialize
|
7
|
-
@s3_access_key_id =
|
8
|
-
@s3_secret_access_key =
|
9
|
-
@s3_bucket_name =
|
7
|
+
@s3_access_key_id = ENV['S3_ACCESS_KEY_ID']
|
8
|
+
@s3_secret_access_key = ENV['S3_SECRET_ACCESS_KEY']
|
9
|
+
@s3_bucket_name = ENV['S3_BUCKET_NAME']
|
10
|
+
@s3_bucket_path = ENV['S3_BUCKET_PATH']
|
10
11
|
end
|
11
12
|
|
12
13
|
def upload_diffs
|
@@ -17,7 +18,11 @@ module Happo
|
|
17
18
|
result_summary[:new_examples].empty?
|
18
19
|
|
19
20
|
bucket = find_or_build_bucket
|
20
|
-
dir =
|
21
|
+
dir = if @s3_bucket_path.nil? || @s3_bucket_path.empty?
|
22
|
+
SecureRandom.uuid
|
23
|
+
else
|
24
|
+
File.join(@s3_bucket_path, SecureRandom.uuid)
|
25
|
+
end
|
21
26
|
|
22
27
|
diff_images = result_summary[:diff_examples].map do |diff|
|
23
28
|
image = bucket.objects.build(
|
@@ -36,7 +41,7 @@ module Happo
|
|
36
41
|
"#{dir}/#{example[:description]}_#{example[:viewport]}.png")
|
37
42
|
image.content = open(Happo::Utils.path_to(example[:description],
|
38
43
|
example[:viewport],
|
39
|
-
'
|
44
|
+
'previous.png'))
|
40
45
|
image.content_type = 'image/png'
|
41
46
|
image.save
|
42
47
|
example[:url] = image.url
|
data/lib/happo/utils.rb
CHANGED
@@ -70,11 +70,11 @@ module Happo
|
|
70
70
|
|
71
71
|
snapshots_folder = Happo::Utils.config['snapshots_folder']
|
72
72
|
diff_files = Dir.glob("#{snapshots_folder}/**/diff.png")
|
73
|
-
|
73
|
+
previous_images = Dir.glob("#{snapshots_folder}/**/previous.png")
|
74
74
|
|
75
75
|
{
|
76
76
|
diffs: diff_files.map(&prepare_file),
|
77
|
-
|
77
|
+
previous_images: previous_images.map(&prepare_file)
|
78
78
|
}
|
79
79
|
end
|
80
80
|
end
|
data/lib/happo/version.rb
CHANGED
data/lib/happo/views/review.erb
CHANGED
@@ -12,26 +12,16 @@
|
|
12
12
|
<%= h diff[:description] %> @ <%= diff[:viewport] %>
|
13
13
|
</h3>
|
14
14
|
<p><img src="/resource?file=<%= ERB::Util.url_encode(diff[:file]) %>"></p>
|
15
|
-
<form style="display: inline-block"
|
16
|
-
action="/approve?description=<%= diff[:description] %>&viewport=<%= diff[:viewport] %>"
|
17
|
-
method="POST">
|
18
|
-
<button type="submit">Approve</button>
|
19
|
-
</form>
|
20
|
-
<form style="display: inline-block"
|
21
|
-
action="/reject?description=<%= diff[:description] %>&viewport=<%= diff[:viewport] %>"
|
22
|
-
method="POST">
|
23
|
-
<button type="submit">Reject</button>
|
24
|
-
</form>
|
25
15
|
<% end %>
|
26
16
|
|
27
17
|
<hr>
|
28
18
|
|
29
|
-
<h2>
|
30
|
-
<% @snapshots[:
|
19
|
+
<h2>PREVIOUS</h2>
|
20
|
+
<% @snapshots[:previous_images].each do |previous_image| %>
|
31
21
|
<h3>
|
32
|
-
<%= h
|
22
|
+
<%= h previous_image[:description] %> @ <%= previous_image[:viewport] %>
|
33
23
|
</h3>
|
34
|
-
<p><img src="/resource?file=<%= ERB::Util.url_encode(
|
24
|
+
<p><img src="/resource?file=<%= ERB::Util.url_encode(previous_image[:file]) %>"></p>
|
35
25
|
<% end %>
|
36
26
|
</body>
|
37
27
|
</html>
|
data/lib/happo.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: happo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Henric Trotzig
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-07-
|
12
|
+
date: 2016-07-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: chunky_png
|
@@ -144,7 +144,6 @@ extra_rdoc_files: []
|
|
144
144
|
files:
|
145
145
|
- bin/happo
|
146
146
|
- lib/happo.rb
|
147
|
-
- lib/happo/action.rb
|
148
147
|
- lib/happo/diffs.html.erb
|
149
148
|
- lib/happo/logger.rb
|
150
149
|
- lib/happo/public/happo-runner.js
|
data/lib/happo/action.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
require 'happo/utils'
|
2
|
-
require 'fileutils'
|
3
|
-
|
4
|
-
module Happo
|
5
|
-
class Action
|
6
|
-
def initialize(example_description, viewport_name)
|
7
|
-
@example_description = example_description
|
8
|
-
@viewport_name = viewport_name
|
9
|
-
end
|
10
|
-
|
11
|
-
def approve
|
12
|
-
diff_path = Happo::Utils.path_to(
|
13
|
-
@example_description, @viewport_name, 'diff.png')
|
14
|
-
baseline_path = Happo::Utils.path_to(
|
15
|
-
@example_description, @viewport_name, 'baseline.png')
|
16
|
-
candidate_path = Happo::Utils.path_to(
|
17
|
-
@example_description, @viewport_name, 'candidate.png')
|
18
|
-
|
19
|
-
FileUtils.rm(diff_path, force: true)
|
20
|
-
FileUtils.mv(candidate_path, baseline_path) if File.exist? candidate_path
|
21
|
-
end
|
22
|
-
|
23
|
-
def reject
|
24
|
-
diff_path = Happo::Utils.path_to(
|
25
|
-
@example_description, @viewport_name, 'diff.png')
|
26
|
-
candidate_path = Happo::Utils.path_to(
|
27
|
-
@example_description, @viewport_name, 'candidate.png')
|
28
|
-
|
29
|
-
FileUtils.rm(diff_path, force: true)
|
30
|
-
FileUtils.rm(candidate_path, force: true)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|