wraith 2.7.0 → 2.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Dockerfile +6 -0
- data/README.md +0 -1
- data/lib/wraith/cli.rb +25 -6
- data/lib/wraith/compare_images.rb +1 -0
- data/lib/wraith/folder.rb +10 -4
- data/lib/wraith/gallery.rb +31 -8
- data/lib/wraith/gallery_template/basic_template.erb +79 -0
- data/lib/wraith/gallery_template/slideshow_template.erb +225 -0
- data/lib/wraith/save_images.rb +13 -2
- data/lib/wraith/thumbnails.rb +1 -1
- data/lib/wraith/version.rb +1 -1
- data/lib/wraith/wraith.rb +27 -0
- data/templates/configs/component.yaml +5 -0
- data/templates/configs/multiple_domains.yaml +5 -0
- data/templates/configs/spider.yaml +1 -0
- metadata +4 -3
- data/lib/wraith/gallery_template/gallery_template.erb +0 -79
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bf63697eac76217c8011ef49428c9699433a6e89
|
4
|
+
data.tar.gz: 28179715439e86a3102ec17113e9d2e9ae878997
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8ab5d69ea95075c115620d955f807e507f5f20d481278a3c30b30281d61cf6458bf690958376d08e7d5f9cdf77729425e21838d2b2fd85225c8bb90509d49f2f
|
7
|
+
data.tar.gz: 88c70548dace9ca18d2210cca2bd3438e18fa2b507383228f1135bb031b739cc4409e93cefe51c87c59da4faa4c569e7b5458226b53b848548f74c0200cace09
|
data/Dockerfile
CHANGED
@@ -11,4 +11,10 @@ RUN apt-get install -y libfreetype6 libfontconfig1
|
|
11
11
|
RUN gem install wraith --no-rdoc --no-ri
|
12
12
|
RUN gem install aws-sdk --no-rdoc --no-ri
|
13
13
|
|
14
|
+
# Make sure decent fonts are installed. Thanks to http://www.dailylinuxnews.com/blog/2014/09/things-to-do-after-installing-debian-jessie/
|
15
|
+
RUN echo "deb http://ftp.us.debian.org/debian jessie main contrib non-free" | tee -a /etc/apt/sources.list
|
16
|
+
RUN echo "deb http://security.debian.org/ jessie/updates contrib non-free" | tee -a /etc/apt/sources.list
|
17
|
+
RUN apt-get update
|
18
|
+
RUN apt-get install -y ttf-freefont ttf-mscorefonts-installer ttf-bitstream-vera ttf-dejavu ttf-liberation
|
19
|
+
|
14
20
|
ENTRYPOINT [ "wraith" ]
|
data/README.md
CHANGED
@@ -77,7 +77,6 @@ There are other commands also available, these all expect a config_name to be pa
|
|
77
77
|
wraith reset_shots [config_name] # removes all the files in the shots folder
|
78
78
|
wraith save_images [config_name] # captures screenshots
|
79
79
|
wraith setup # creates config folder and default config
|
80
|
-
wraith setup_casper # creates config folder and default config for casper
|
81
80
|
wraith setup_folders [config_name] # create folders for images
|
82
81
|
```
|
83
82
|
|
data/lib/wraith/cli.rb
CHANGED
@@ -35,6 +35,25 @@ class Wraith::CLI < Thor
|
|
35
35
|
create.create_folders
|
36
36
|
end
|
37
37
|
|
38
|
+
desc "copy_base_images [config_name]", "copies the required base images over for comparison with latest images"
|
39
|
+
def copy_base_images(config_name)
|
40
|
+
copy = Wraith::FolderManager.new(config_name)
|
41
|
+
copy.copy_base_images
|
42
|
+
end
|
43
|
+
|
44
|
+
desc "make_sure_base_shots_exists [config_name]", "warns user if config is missing base shots"
|
45
|
+
def make_sure_base_shots_exists(config_name)
|
46
|
+
wraith = Wraith::Wraith.new(config_name)
|
47
|
+
if wraith.history_dir.nil?
|
48
|
+
puts "You need to specify a `history_dir` property at #{config_name} before you can run `wraith latest`!"
|
49
|
+
exit 1
|
50
|
+
end
|
51
|
+
if !File.directory?(wraith.history_dir)
|
52
|
+
puts "You need to run `wraith history` at least once before you can run `wraith latest`!"
|
53
|
+
exit 1
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
38
57
|
no_commands do
|
39
58
|
def check_for_paths(config_name)
|
40
59
|
spider = Wraith::Spidering.new(config_name)
|
@@ -45,15 +64,11 @@ class Wraith::CLI < Thor
|
|
45
64
|
create = Wraith::FolderManager.new(config_name)
|
46
65
|
create.copy_old_shots
|
47
66
|
end
|
48
|
-
|
49
|
-
def restore_shots(config_name)
|
50
|
-
create = Wraith::FolderManager.new(config_name)
|
51
|
-
create.restore_shots
|
52
|
-
end
|
53
67
|
end
|
54
68
|
|
55
69
|
desc "save_images [config_name]", "captures screenshots"
|
56
70
|
def save_images(config_name, history = false)
|
71
|
+
puts "SAVING IMAGES"
|
57
72
|
save_images = Wraith::SaveImages.new(config_name, history)
|
58
73
|
save_images.save_images
|
59
74
|
end
|
@@ -66,18 +81,21 @@ class Wraith::CLI < Thor
|
|
66
81
|
|
67
82
|
desc "compare_images [config_name]", "compares images to generate diffs"
|
68
83
|
def compare_images(config_name)
|
84
|
+
puts "COMPARING IMAGES"
|
69
85
|
compare = Wraith::CompareImages.new(config_name)
|
70
86
|
compare.compare_images
|
71
87
|
end
|
72
88
|
|
73
89
|
desc "generate_thumbnails [config_name]", "create thumbnails for gallery"
|
74
90
|
def generate_thumbnails(config_name)
|
91
|
+
puts "GENERATING THUMBNAILS"
|
75
92
|
thumbs = Wraith::Thumbnails.new(config_name)
|
76
93
|
thumbs.generate_thumbnails
|
77
94
|
end
|
78
95
|
|
79
96
|
desc "generate_gallery [config_name]", "create page for viewing images"
|
80
97
|
def generate_gallery(config_name, multi = false)
|
98
|
+
puts "GENERATING GALLERY"
|
81
99
|
gallery = Wraith::GalleryGenerator.new(config_name, multi)
|
82
100
|
gallery.generate_gallery
|
83
101
|
end
|
@@ -113,9 +131,10 @@ class Wraith::CLI < Thor
|
|
113
131
|
|
114
132
|
desc "latest [config_name]", "Capture new shots to compare with baseline"
|
115
133
|
def latest(config)
|
134
|
+
make_sure_base_shots_exists(config)
|
116
135
|
reset_shots(config)
|
117
|
-
restore_shots(config)
|
118
136
|
save_images(config, true)
|
137
|
+
copy_base_images(config)
|
119
138
|
crop_images(config)
|
120
139
|
compare_images(config)
|
121
140
|
generate_thumbnails(config)
|
@@ -16,6 +16,7 @@ class Wraith::CompareImages
|
|
16
16
|
Parallel.each(files.each_slice(2), :in_processes => Parallel.processor_count) do |base, compare|
|
17
17
|
diff = base.gsub(/([a-zA-Z0-9]+).png$/, "diff.png")
|
18
18
|
info = base.gsub(/([a-zA-Z0-9]+).png$/, "data.txt")
|
19
|
+
puts "Comparing #{base} and #{compare}"
|
19
20
|
compare_task(base, compare, diff, info)
|
20
21
|
puts "Saved diff"
|
21
22
|
end
|
data/lib/wraith/folder.rb
CHANGED
@@ -41,9 +41,13 @@ class Wraith::FolderManager
|
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
-
def
|
45
|
-
puts "
|
46
|
-
|
44
|
+
def copy_base_images
|
45
|
+
puts "COPYING BASE IMAGES"
|
46
|
+
wraith.paths.each do |path|
|
47
|
+
path = path[0]
|
48
|
+
puts "Copying #{history_dir}/#{path} to #{dir}"
|
49
|
+
FileUtils.cp_r(Dir.glob("#{history_dir}/#{path}"), dir)
|
50
|
+
end
|
47
51
|
end
|
48
52
|
|
49
53
|
def create_folders
|
@@ -74,7 +78,9 @@ class Wraith::FolderManager
|
|
74
78
|
dirs.each do |_folder_name, shot_info|
|
75
79
|
shot_info.each do |_k, v|
|
76
80
|
begin
|
77
|
-
if v
|
81
|
+
if !v.include?(:diff)
|
82
|
+
return false
|
83
|
+
elsif v[:data] > wraith.threshold
|
78
84
|
return false
|
79
85
|
end
|
80
86
|
rescue
|
data/lib/wraith/gallery.rb
CHANGED
@@ -8,13 +8,10 @@ class Wraith::GalleryGenerator
|
|
8
8
|
|
9
9
|
MATCH_FILENAME = /(\S+)_(\S+)\.\S+/
|
10
10
|
|
11
|
-
TEMPLATE_LOCATION = File.expand_path("gallery_template/gallery_template.erb", File.dirname(__FILE__))
|
12
|
-
TEMPLATE_BY_DOMAIN_LOCATION = File.expand_path("gallery_template/gallery_template.erb", File.dirname(__FILE__))
|
13
|
-
|
14
11
|
def initialize(config, multi)
|
15
12
|
@wraith = Wraith::Wraith.new(config)
|
16
13
|
@location = wraith.directory
|
17
|
-
@
|
14
|
+
@multi = multi
|
18
15
|
@folder_manager = Wraith::FolderManager.new(config)
|
19
16
|
end
|
20
17
|
|
@@ -53,6 +50,7 @@ class Wraith::GalleryGenerator
|
|
53
50
|
@group = get_group_from_match match
|
54
51
|
@filepath = category + "/" + filename
|
55
52
|
@thumbnail = "thumbnails/#{category}/#{filename}"
|
53
|
+
@url = figure_out_url @group, category
|
56
54
|
|
57
55
|
if @dirs[category][@size].nil?
|
58
56
|
@dirs[category][@size] = { :variants => [] }
|
@@ -63,6 +61,14 @@ class Wraith::GalleryGenerator
|
|
63
61
|
data_group(@group, size_dict, dirname, @filepath)
|
64
62
|
end
|
65
63
|
|
64
|
+
def figure_out_url(group, category)
|
65
|
+
root = wraith.domains["#{group}"]
|
66
|
+
return '' if root.nil?
|
67
|
+
path = wraith.paths["#{category}"]['path']
|
68
|
+
url = root + path
|
69
|
+
url
|
70
|
+
end
|
71
|
+
|
66
72
|
def get_group_from_match(match)
|
67
73
|
group = match[2]
|
68
74
|
dash = match[2].rindex('-')
|
@@ -88,7 +94,8 @@ class Wraith::GalleryGenerator
|
|
88
94
|
size_dict[:variants] << {
|
89
95
|
:name => group,
|
90
96
|
:filename => @filepath,
|
91
|
-
:thumb => @thumbnail
|
97
|
+
:thumb => @thumbnail,
|
98
|
+
:url => @url
|
92
99
|
}
|
93
100
|
size_dict[:variants].sort! { |a, b| a[:name] <=> b[:name] }
|
94
101
|
end
|
@@ -130,16 +137,32 @@ class Wraith::GalleryGenerator
|
|
130
137
|
def generate_gallery(with_path = "")
|
131
138
|
dest = "#{@location}/gallery.html"
|
132
139
|
directories = parse_directories(@location)
|
133
|
-
|
140
|
+
|
141
|
+
slideshow_template = File.expand_path("gallery_template/#{wraith.gallery_template}.erb", File.dirname(__FILE__))
|
142
|
+
|
143
|
+
generate_html(@location, directories, slideshow_template, dest, with_path)
|
144
|
+
|
134
145
|
puts "Gallery generated"
|
135
146
|
check_failed_shots
|
136
147
|
end
|
137
148
|
|
138
149
|
def check_failed_shots
|
139
|
-
if @
|
150
|
+
if @multi
|
140
151
|
return true
|
141
152
|
elsif @failed_shots == false
|
142
|
-
puts "Failures detected"
|
153
|
+
puts "Failures detected:"
|
154
|
+
|
155
|
+
@dirs.each do |dir, sizes|
|
156
|
+
sizes.to_a.sort.each do |size, files|
|
157
|
+
file = dir.gsub('__', '/')
|
158
|
+
if !files.include?(:diff)
|
159
|
+
puts "\t Unable to create a diff image for #{file}"
|
160
|
+
elsif files[:data] > wraith.threshold
|
161
|
+
puts "\t #{file} failed at a resolution of #{size} (#{files[:data]}% diff)"
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
143
166
|
exit 1
|
144
167
|
else
|
145
168
|
true
|
@@ -0,0 +1,79 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
|
5
|
+
<style type="text/css">
|
6
|
+
.short-screenshot {
|
7
|
+
max-width: 200px;
|
8
|
+
}
|
9
|
+
.panel li{
|
10
|
+
word-wrap: break-word;
|
11
|
+
}
|
12
|
+
</style>
|
13
|
+
</head>
|
14
|
+
<body>
|
15
|
+
<div class="container">
|
16
|
+
<div class="row page-header">
|
17
|
+
<h1>List of screenshots for <%= location %> <small>taken <%= Time.now.strftime('%Y/%m/%d %H:%M:%S') %></small></h1>
|
18
|
+
</div>
|
19
|
+
<div class="row">
|
20
|
+
<div class="col-lg-2">
|
21
|
+
<div class="panel">
|
22
|
+
<div class="panel-heading">Screenshots:</div>
|
23
|
+
<ul class="list-group list-group-flush">
|
24
|
+
<% directories.keys.each do |dir| %>
|
25
|
+
<li class="list-group-item"><a href="#<%=path%><%=dir%>"><%=dir.gsub('__', '/')%></a></li>
|
26
|
+
<% end %>
|
27
|
+
</ul>
|
28
|
+
</div>
|
29
|
+
</div>
|
30
|
+
<div class="col-lg-10">
|
31
|
+
<% directories.each do |dir, sizes| %>
|
32
|
+
<% sizes.to_a.sort.each do |size, files| %>
|
33
|
+
<div class="row">
|
34
|
+
<a name="<%= dir %>"></a>
|
35
|
+
<% if threshold.nil? %>
|
36
|
+
<h2><%= dir.gsub('__', '/') %></h2>
|
37
|
+
<% else %>
|
38
|
+
<% if files[:data] > threshold %>
|
39
|
+
<h2 style="color:#CC0101"><%= dir.gsub('__', '/') %> <span class="glyphicon glyphicon-remove"></span></h2>
|
40
|
+
<% else %>
|
41
|
+
<h2><%= dir.gsub('__', '/') %></h2>
|
42
|
+
<% end %>
|
43
|
+
<% end %>
|
44
|
+
</div>
|
45
|
+
<div class="row">
|
46
|
+
<h3 class="col-lg-1 text-muted"><%=size%>px</h3>
|
47
|
+
<% files[:variants].each do |file| %>
|
48
|
+
<div class="col-lg-3">
|
49
|
+
<a href="<%=file[:filename]%>">
|
50
|
+
<img class="short-screenshot img-thumbnail" src="<%=path%><%=file[:thumb]%>">
|
51
|
+
</a>
|
52
|
+
<p class="text-center"><%=file[:name]%></p>
|
53
|
+
</div>
|
54
|
+
<% end %>
|
55
|
+
<div class="col-lg-3">
|
56
|
+
<% if files[:diff] %>
|
57
|
+
<a href="<%=files[:diff][:filename]%>">
|
58
|
+
<img class="short-screenshot img-thumbnail" src="<%=path%><%=files[:diff][:thumb]%>">
|
59
|
+
</a>
|
60
|
+
<% end %>
|
61
|
+
<p class="text-center">diff</p>
|
62
|
+
<% if threshold.nil? %>
|
63
|
+
<p class="text-center text-muted"><%=files[:data]%> % different</p>
|
64
|
+
<% else %>
|
65
|
+
<% if files[:data] > threshold %>
|
66
|
+
<p style="color:#CC0101" class="text-center text-muted"><%=files[:data]%> % different</p>
|
67
|
+
<% else %>
|
68
|
+
<p class="text-center text-muted"><%=files[:data]%> % different</p>
|
69
|
+
<% end %>
|
70
|
+
<% end %>
|
71
|
+
</div>
|
72
|
+
</div>
|
73
|
+
<% end %>
|
74
|
+
<% end %>
|
75
|
+
</div>
|
76
|
+
</div>
|
77
|
+
</div>
|
78
|
+
</body>
|
79
|
+
</html>
|
@@ -0,0 +1,225 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
|
5
|
+
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css">
|
6
|
+
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0-alpha1/jquery.min.js"></script>
|
7
|
+
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery.cycle/3.03/jquery.cycle.all.min.js"></script>
|
8
|
+
<style type="text/css">
|
9
|
+
body {
|
10
|
+
position: relative;
|
11
|
+
float: left;
|
12
|
+
width: 100%;
|
13
|
+
}
|
14
|
+
.slideshow {
|
15
|
+
height: 510px;
|
16
|
+
margin: 20px 0;
|
17
|
+
}
|
18
|
+
.slide {
|
19
|
+
background-color: #FFF !important;
|
20
|
+
width: 100% !important;
|
21
|
+
height: 510px !important;
|
22
|
+
}
|
23
|
+
.prev {
|
24
|
+
margin-left: -10px;
|
25
|
+
margin-right: 10px;
|
26
|
+
}
|
27
|
+
.next,
|
28
|
+
.prev {
|
29
|
+
cursor: pointer;
|
30
|
+
background-color: #e7e7e7;
|
31
|
+
border: 2px solid #eee;
|
32
|
+
height: 400px;
|
33
|
+
margin-top: 60px;
|
34
|
+
}
|
35
|
+
|
36
|
+
.prev span:before,
|
37
|
+
.next span:before {
|
38
|
+
font-size: 35px;
|
39
|
+
padding: 10px;
|
40
|
+
display: block;
|
41
|
+
font-family: "FontAwesome";
|
42
|
+
margin-top: 165px;
|
43
|
+
display: block;
|
44
|
+
}
|
45
|
+
|
46
|
+
.prev span:before {
|
47
|
+
content:"\f0d9";
|
48
|
+
}
|
49
|
+
.next span:before {
|
50
|
+
content:"\f0da";
|
51
|
+
}
|
52
|
+
.list-group-item.checked a:after {
|
53
|
+
color: #23e343;
|
54
|
+
}
|
55
|
+
.list-group-item a span {
|
56
|
+
word-wrap: break-word;
|
57
|
+
width: 95%;
|
58
|
+
display: block;
|
59
|
+
}
|
60
|
+
.list-group-item a:after {
|
61
|
+
content:"\f00c";
|
62
|
+
font-family: "FontAwesome";
|
63
|
+
color: #eae6e6;
|
64
|
+
position: absolute;
|
65
|
+
right: 10px;
|
66
|
+
top: 10px;
|
67
|
+
}
|
68
|
+
.checked a {
|
69
|
+
color: #000;
|
70
|
+
}
|
71
|
+
.current {
|
72
|
+
background-color: #e7e7e7;
|
73
|
+
}
|
74
|
+
.threshold {
|
75
|
+
color: red;
|
76
|
+
}
|
77
|
+
.compare {
|
78
|
+
cursor: pointer;
|
79
|
+
margin-left: 20px;
|
80
|
+
}
|
81
|
+
|
82
|
+
.compare:before {
|
83
|
+
font-family: "FontAwesome";
|
84
|
+
content:"\f0c5";
|
85
|
+
font-size: 30px;
|
86
|
+
}
|
87
|
+
.compare-modal {
|
88
|
+
position:fixed;
|
89
|
+
margin:0;
|
90
|
+
top:0;
|
91
|
+
left:0;
|
92
|
+
width: 100%;
|
93
|
+
height: 100%;
|
94
|
+
background:rgba(0,0,0,0.7);
|
95
|
+
overflow: scroll;
|
96
|
+
z-index: 1000;
|
97
|
+
}
|
98
|
+
.compare-container {
|
99
|
+
padding-bottom: 300px;
|
100
|
+
z-index: 1000;
|
101
|
+
margin-top: 20px;
|
102
|
+
text-align: center;
|
103
|
+
}
|
104
|
+
.compare-container img{
|
105
|
+
margin-right: 20px;
|
106
|
+
max-width: 30%;
|
107
|
+
}
|
108
|
+
</style>
|
109
|
+
<script type="text/javascript">
|
110
|
+
$(function() {
|
111
|
+
$('.slideshow').cycle({
|
112
|
+
fx: 'cover',
|
113
|
+
prev: '.prev',
|
114
|
+
next: '.next',
|
115
|
+
before: function (curr, next, opts) {
|
116
|
+
$('.current').removeClass('current');
|
117
|
+
var path = $(next).find('.path').attr('name');
|
118
|
+
$.each($('.list-group .list-group-item a'), function() {
|
119
|
+
if ($(this).attr('href').substring(1) == path) {
|
120
|
+
$(this).parent().addClass('checked');
|
121
|
+
$(this).parent().addClass('current');
|
122
|
+
}
|
123
|
+
})
|
124
|
+
},
|
125
|
+
timeout: 0
|
126
|
+
});
|
127
|
+
|
128
|
+
$('.list-group .list-group-item a').unbind().on('click', function(){
|
129
|
+
var href = $(this).attr('href').substring(1);
|
130
|
+
|
131
|
+
$('.slideshow').cycle($('.slide.'+href+':first').index());
|
132
|
+
})
|
133
|
+
|
134
|
+
$('.shot').unbind().on('click', function(e){
|
135
|
+
e.preventDefault();
|
136
|
+
var url = $(this).attr('href');
|
137
|
+
window.open(url,'_blank');
|
138
|
+
})
|
139
|
+
|
140
|
+
$('.compare').unbind().on('click', function(){
|
141
|
+
var slide = $(this).closest(".slide"),
|
142
|
+
newImage = slide.find('a.shot:eq(0)').attr('href'),
|
143
|
+
oldImage = slide.find('a.shot:eq(1)').attr('href'),
|
144
|
+
diffImage = slide.find('a.shot:eq(2)').attr('href');
|
145
|
+
$('.container').append('<div class="compare-modal"><div class="compare-container"><img src="'+newImage+'"/><img src="'+oldImage+'"/><img src="'+diffImage+'"/></div></div>');
|
146
|
+
$('.compare-modal').unbind().on('click', function(){
|
147
|
+
$(this).remove();
|
148
|
+
})
|
149
|
+
})
|
150
|
+
})
|
151
|
+
</script>
|
152
|
+
</head>
|
153
|
+
<body>
|
154
|
+
<div class="container">
|
155
|
+
<div class="row">
|
156
|
+
<div class="col-sm-12 col-md-3">
|
157
|
+
<div class="panel">
|
158
|
+
<div class="page-header">
|
159
|
+
<h4>List of screenshots for <%= location %> <small>taken <%= Time.now.strftime('%Y/%m/%d %H:%M:%S') %></small></h4>
|
160
|
+
</div>
|
161
|
+
<div class="panel-heading">Pages:</div>
|
162
|
+
<ul class="list-group list-group-flush">
|
163
|
+
<% directories.keys.each do |dir| %>
|
164
|
+
<li class="list-group-item"><a href="#<%=path%><%=dir%>"><span>/<%=dir.gsub('__', '/')%></span></a></li>
|
165
|
+
<% end %>
|
166
|
+
</ul>
|
167
|
+
</div>
|
168
|
+
</div>
|
169
|
+
<div class="col-sm-12 col-md-9">
|
170
|
+
<div class="slideshow-container">
|
171
|
+
<div class="prev col-sm-1"><span></span></div>
|
172
|
+
<div class="slideshow pull-left col-sm-10">
|
173
|
+
<% directories.each do |dir, sizes| %>
|
174
|
+
<% sizes.to_a.sort.each do |size, files| %>
|
175
|
+
<div class="row slide <%= dir %>">
|
176
|
+
<a class="path" name="<%= dir %>"></a>
|
177
|
+
<div class="col-sm-12 text-center">
|
178
|
+
<% if threshold.nil? %>
|
179
|
+
<h4><%=size%>px - /<%= dir.gsub('__', '/') %></h4>
|
180
|
+
<% else %>
|
181
|
+
<% if files[:data] > threshold %>
|
182
|
+
<h4><%=size%>px - /<%= dir.gsub('__', '/') %></h4>
|
183
|
+
<% else %>
|
184
|
+
<h4><%=size%>px - /<%= dir.gsub('__', '/') %></h4>
|
185
|
+
<% end %>
|
186
|
+
<% end %>
|
187
|
+
</div>
|
188
|
+
<% files[:variants].each do |file| %>
|
189
|
+
<div class="col-sm-4">
|
190
|
+
<a class="shot" href="<%=file[:filename]%>">
|
191
|
+
<img class="short-screenshot img-thumbnail" src="<%=path%><%=file[:thumb]%>">
|
192
|
+
</a>
|
193
|
+
<p class="text-center"><a target="_blank" href="<%=file[:url]%>"><%=file[:name]%></a></p>
|
194
|
+
</div>
|
195
|
+
<% end %>
|
196
|
+
<div class="col-sm-4">
|
197
|
+
<% if files[:diff] %>
|
198
|
+
<a class="shot" href="<%=files[:diff][:filename]%>">
|
199
|
+
<img class="short-screenshot img-thumbnail" src="<%=path%><%=files[:diff][:thumb]%>">
|
200
|
+
</a>
|
201
|
+
<% end %>
|
202
|
+
<p class="text-center">diff</p>
|
203
|
+
</div>
|
204
|
+
<div class="difference col-sm-12">
|
205
|
+
<% if threshold.nil? %>
|
206
|
+
<h4 class="text-center text-muted"><%=files[:data]%> % different<span class="compare"></span></h4>
|
207
|
+
<% else %>
|
208
|
+
<% if files[:data] > threshold %>
|
209
|
+
<h4 class="text-center threshold"><%=files[:data]%> % different<span class="compare"></span></h4>
|
210
|
+
<% else %>
|
211
|
+
<h4 class="text-center text-muted"><%=files[:data]%> % different<span class="compare"></span></h4>
|
212
|
+
<% end %>
|
213
|
+
<% end %>
|
214
|
+
</div>
|
215
|
+
</div>
|
216
|
+
<% end %>
|
217
|
+
<% end %>
|
218
|
+
</div>
|
219
|
+
<div class="next col-sm-1"><span></span></div>
|
220
|
+
</div>
|
221
|
+
</div>
|
222
|
+
</div>
|
223
|
+
</div>
|
224
|
+
</body>
|
225
|
+
</html>
|
data/lib/wraith/save_images.rb
CHANGED
@@ -37,10 +37,21 @@ class Wraith::SaveImages
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def capture_page_image(browser, url, width, file_name, selector, global_before_capture, path_before_capture)
|
40
|
-
|
40
|
+
command = "#{browser} #{wraith.phantomjs_options} '#{wraith.snap_file}' '#{url}' '#{width}' '#{file_name}' '#{selector}' '#{global_before_capture}' '#{path_before_capture}'"
|
41
|
+
|
42
|
+
# @TODO - uncomment the following line when we add a verbose mode
|
43
|
+
# puts command
|
44
|
+
run_command command
|
41
45
|
end
|
42
46
|
|
43
|
-
|
47
|
+
def run_command(command)
|
48
|
+
output = []
|
49
|
+
IO.popen(command).each do |line|
|
50
|
+
puts line
|
51
|
+
output << line.chomp!
|
52
|
+
end.close
|
53
|
+
output
|
54
|
+
end
|
44
55
|
|
45
56
|
def parallel_task(jobs)
|
46
57
|
Parallel.each(jobs, :in_threads => 8) do |_label, _path, width, url, filename, selector, global_before_capture, path_before_capture|
|
data/lib/wraith/thumbnails.rb
CHANGED
@@ -26,6 +26,6 @@ class Wraith::Thumbnails
|
|
26
26
|
FileUtils.mkdir_p(File.dirname(output_path))
|
27
27
|
end
|
28
28
|
|
29
|
-
`convert #{png_path.shellescape} -thumbnail 200 -crop
|
29
|
+
`convert #{png_path.shellescape} -thumbnail 200 -crop #{wraith.thumb_width.to_s}x#{wraith.thumb_height.to_s}+0+0 #{output_path.shellescape}`
|
30
30
|
end
|
31
31
|
end
|
data/lib/wraith/version.rb
CHANGED
data/lib/wraith/wraith.rb
CHANGED
@@ -99,6 +99,33 @@ class Wraith::Wraith
|
|
99
99
|
@config["threshold"] ? @config["threshold"] : 0
|
100
100
|
end
|
101
101
|
|
102
|
+
def gallery_template
|
103
|
+
default = 'basic_template'
|
104
|
+
if @config["gallery"].nil?
|
105
|
+
default
|
106
|
+
else
|
107
|
+
@config["gallery"]["template"] || default
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def thumb_height
|
112
|
+
default = 200
|
113
|
+
if @config["gallery"].nil?
|
114
|
+
default
|
115
|
+
else
|
116
|
+
@config["gallery"]["thumb_height"] || default
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def thumb_width
|
121
|
+
default = 200
|
122
|
+
if @config["gallery"].nil?
|
123
|
+
default
|
124
|
+
else
|
125
|
+
@config["gallery"]["thumb_width"] || default
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
102
129
|
def phantomjs_options
|
103
130
|
@config["phantomjs_options"]
|
104
131
|
end
|
@@ -49,6 +49,11 @@ history_dir: 'shots_base'
|
|
49
49
|
# the directory that your latest screenshots will be stored in
|
50
50
|
directory: 'shots'
|
51
51
|
|
52
|
+
gallery:
|
53
|
+
template: 'slideshow_template' # 'basic_template' (default)
|
54
|
+
thumb_width: 200
|
55
|
+
thumb_height: 200
|
56
|
+
|
52
57
|
# choose how results are displayed in the gallery (default is `alphanumeric` if omitted)
|
53
58
|
# Different screen widths are always grouped together.
|
54
59
|
# Options:
|
@@ -45,6 +45,11 @@ history_dir: 'shots_base'
|
|
45
45
|
# the directory that your latest screenshots will be stored in
|
46
46
|
directory: 'shots'
|
47
47
|
|
48
|
+
gallery:
|
49
|
+
template: 'slideshow_template' # 'basic_template' (default)
|
50
|
+
thumb_width: 200
|
51
|
+
thumb_height: 200
|
52
|
+
|
48
53
|
# choose how results are displayed in the gallery (default is `alphanumeric` if omitted)
|
49
54
|
# Different screen widths are always grouped together.
|
50
55
|
# Options:
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# Add as many domains as necessary. Key will act as a label
|
2
2
|
domains:
|
3
3
|
my_site: "http://www.example.com"
|
4
|
+
my_other_site: "http://www.test.example.com"
|
4
5
|
|
5
6
|
# Notice the absence of a `paths` property. When no paths are provided, Wraith defaults to
|
6
7
|
# spidering mode to check your entire website.
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wraith
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dave Blooman
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2015-
|
13
|
+
date: 2015-11-05 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: pry
|
@@ -196,7 +196,8 @@ files:
|
|
196
196
|
- lib/wraith/crop.rb
|
197
197
|
- lib/wraith/folder.rb
|
198
198
|
- lib/wraith/gallery.rb
|
199
|
-
- lib/wraith/gallery_template/
|
199
|
+
- lib/wraith/gallery_template/basic_template.erb
|
200
|
+
- lib/wraith/gallery_template/slideshow_template.erb
|
200
201
|
- lib/wraith/save_images.rb
|
201
202
|
- lib/wraith/spider.rb
|
202
203
|
- lib/wraith/thumbnails.rb
|
@@ -1,79 +0,0 @@
|
|
1
|
-
<!DOCTYPE html>
|
2
|
-
<html lang="en">
|
3
|
-
<head>
|
4
|
-
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
|
5
|
-
<style type="text/css">
|
6
|
-
.short-screenshot {
|
7
|
-
max-width: 200px;
|
8
|
-
}
|
9
|
-
.panel li{
|
10
|
-
word-wrap: break-word;
|
11
|
-
}
|
12
|
-
</style>
|
13
|
-
</head>
|
14
|
-
<body>
|
15
|
-
<div class="container">
|
16
|
-
<div class="row page-header">
|
17
|
-
<h1>List of screenshots for <%= location %> <small>taken <%= Time.now.strftime('%Y/%m/%d %H:%M:%S') %></small></h1>
|
18
|
-
</div>
|
19
|
-
<div class="row">
|
20
|
-
<div class="col-lg-2">
|
21
|
-
<div class="panel">
|
22
|
-
<div class="panel-heading">Screenshots:</div>
|
23
|
-
<ul class="list-group list-group-flush">
|
24
|
-
<% directories.keys.each do |dir| %>
|
25
|
-
<li class="list-group-item"><a href="#<%=path%><%=dir%>"><%=dir.gsub('__', '/')%></a></li>
|
26
|
-
<% end %>
|
27
|
-
</ul>
|
28
|
-
</div>
|
29
|
-
</div>
|
30
|
-
<div class="col-lg-10">
|
31
|
-
<% directories.each do |dir, sizes| %>
|
32
|
-
<% sizes.to_a.sort.each do |size, files| %>
|
33
|
-
<div class="row">
|
34
|
-
<a name="<%= dir %>"></a>
|
35
|
-
<% if threshold.nil? %>
|
36
|
-
<h2><%= dir.gsub('__', '/') %></h2>
|
37
|
-
<% else %>
|
38
|
-
<% if files[:data] > threshold %>
|
39
|
-
<h2 style="color:#CC0101"><%= dir.gsub('__', '/') %> <span class="glyphicon glyphicon-remove"></span></h2>
|
40
|
-
<% else %>
|
41
|
-
<h2><%= dir.gsub('__', '/') %></h2>
|
42
|
-
<% end %>
|
43
|
-
<% end %>
|
44
|
-
</div>
|
45
|
-
<div class="row">
|
46
|
-
<h3 class="col-lg-1 text-muted"><%=size%>px</h3>
|
47
|
-
<% files[:variants].each do |file| %>
|
48
|
-
<div class="col-lg-3">
|
49
|
-
<a href="<%=file[:filename]%>">
|
50
|
-
<img class="short-screenshot img-thumbnail" src="<%=path%><%=file[:thumb]%>">
|
51
|
-
</a>
|
52
|
-
<p class="text-center"><%=file[:name]%></p>
|
53
|
-
</div>
|
54
|
-
<% end %>
|
55
|
-
<div class="col-lg-3">
|
56
|
-
<% if files[:diff] %>
|
57
|
-
<a href="<%=files[:diff][:filename]%>">
|
58
|
-
<img class="short-screenshot img-thumbnail" src="<%=path%><%=files[:diff][:thumb]%>">
|
59
|
-
</a>
|
60
|
-
<% end %>
|
61
|
-
<p class="text-center">diff</p>
|
62
|
-
<% if threshold.nil? %>
|
63
|
-
<p class="text-center text-muted"><%=files[:data]%> % different</p>
|
64
|
-
<% else %>
|
65
|
-
<% if files[:data] > threshold %>
|
66
|
-
<p style="color:#CC0101" class="text-center text-muted"><%=files[:data]%> % different</p>
|
67
|
-
<% else %>
|
68
|
-
<p class="text-center text-muted"><%=files[:data]%> % different</p>
|
69
|
-
<% end %>
|
70
|
-
<% end %>
|
71
|
-
</div>
|
72
|
-
</div>
|
73
|
-
<% end %>
|
74
|
-
<% end %>
|
75
|
-
</div>
|
76
|
-
</div>
|
77
|
-
</div>
|
78
|
-
</body>
|
79
|
-
</html>
|