snapshot 0.8.0 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +33 -4
- data/bin/snapshot +2 -2
- data/lib/assets/SnapshotHelper.js +6 -1
- data/lib/snapshot/dependency_checker.rb +1 -1
- data/lib/snapshot/page.html.erb +3 -7
- data/lib/snapshot/reports_generator.rb +6 -2
- data/lib/snapshot/runner.rb +19 -9
- data/lib/snapshot/screenshot_flatten.rb +1 -1
- data/lib/snapshot/screenshot_rotate.rb +1 -1
- data/lib/snapshot/snapshot_config.rb +11 -3
- data/lib/snapshot/snapshot_file.rb +3 -0
- data/lib/snapshot/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e7362693e9f1c922a699d79e0d24fc6f5ec122ff
|
4
|
+
data.tar.gz: ac6413d4502074b7ddd4fb140228cb97dc2cb7b3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c0e83d4693307a5f46e9b7f120cc76c42ad7ee6aa7a3642db09b178c8bc756889b17565c93c2ce549311cd3a38b47ece61623bd9e17f9dea554d65c39190a6ff
|
7
|
+
data.tar.gz: 811d67b6f62e29423c84222269805b7e3e2effa328711933ab9447818aaa966fdd928be623199cf70542b966d132eda40e6d5ced86cdc439fbe38328aea3fb92
|
data/README.md
CHANGED
@@ -225,6 +225,8 @@ js_file './path/file.js'
|
|
225
225
|
|
226
226
|
You can add a custom script for iPads: `./path/file-iPad.js` and it will automatically be used if found. Just append the `-iPad` to your existing file.
|
227
227
|
|
228
|
+
If you want to overwrite the JS path using environment variables, use `SNAPSHOT_JS_FILE`.
|
229
|
+
|
228
230
|
### Scheme
|
229
231
|
To not be asked which scheme to use, just set it like this:
|
230
232
|
```ruby
|
@@ -252,15 +254,31 @@ I'll try to keep the script up to date. If you need to change the iOS version, y
|
|
252
254
|
ios_version "9.0"
|
253
255
|
```
|
254
256
|
|
257
|
+
### HTML Title
|
258
|
+
|
259
|
+
If you want to change the title of the generated HTML page, you can use:
|
260
|
+
|
261
|
+
```ruby
|
262
|
+
html_title 'Example'
|
263
|
+
```
|
264
|
+
|
255
265
|
### Custom Args for the build command
|
256
266
|
Use the ```custom_args``` directive to prepend custom statements to the build command.
|
257
267
|
|
258
268
|
Add a ```custom_build_args``` line to your ```Snapfile``` to add custom arguments to the build command.
|
259
269
|
|
260
|
-
Here is an example for adding a preprocessor macro `SNAPSHOT
|
270
|
+
Here is an example for adding a preprocessor macro `SNAPSHOT`:
|
261
271
|
|
262
272
|
```ruby
|
263
|
-
custom_build_args "GCC_PREPROCESSOR_DEFINITIONS='$(inherited) SNAPSHOT=1'
|
273
|
+
custom_build_args "GCC_PREPROCESSOR_DEFINITIONS='$(inherited) SNAPSHOT=1'"
|
274
|
+
```
|
275
|
+
|
276
|
+
In your Objective-C code, use the following code to detect the `snapshot` mode:
|
277
|
+
|
278
|
+
```objective-c
|
279
|
+
#ifdef SNAPSHOT
|
280
|
+
// Your Code here
|
281
|
+
#endif
|
264
282
|
```
|
265
283
|
|
266
284
|
### Custom Args for the run command
|
@@ -286,6 +304,8 @@ This can be used to
|
|
286
304
|
- Reset all user defaults
|
287
305
|
- Pre-fill the database
|
288
306
|
|
307
|
+
The `setup_for_device_change` will be called **before** the app is installed on the simulator.
|
308
|
+
|
289
309
|
To run a shell script, just use ```system('./script.sh')```.
|
290
310
|
```ruby
|
291
311
|
setup_for_device_change do |device, udid, language|
|
@@ -299,8 +319,6 @@ teardown_device do |language, device|
|
|
299
319
|
end
|
300
320
|
```
|
301
321
|
|
302
|
-
If you want to run a script before each run of the app, it's enough to only implement the `setup_for_language_change` callback.
|
303
|
-
|
304
322
|
### Skip alpha removal from screenshots
|
305
323
|
In case you want to skip this process, just add ```skip_alpha_removal``` to your ```Snapfile```.
|
306
324
|
|
@@ -345,6 +363,10 @@ You can use the environment variable `SNAPSHOT_FORCE_DELETE` to stop asking for
|
|
345
363
|
|
346
364
|
##### [Like this tool? Be the first to know about updates and new fastlane tools](https://tinyletter.com/krausefx)
|
347
365
|
|
366
|
+
## Frame the screenshots
|
367
|
+
|
368
|
+
If you want to add frames around the screenshots and even put a title on top, check out [frameit](https://github.com/fastlane/frameit).
|
369
|
+
|
348
370
|
## Run in Continuous Integration
|
349
371
|
If you want to run `snapshot` on your `Jenkins` machine (or any other CI-system), you might run into an `authorization` popup coming up.
|
350
372
|
|
@@ -405,6 +427,13 @@ Unfortunately, Xamarin command line tool is only available for Business Edition
|
|
405
427
|
|
406
428
|
If building via command-line doesn't work for your project or you don't want to build every time, you can run the tool with ```snapshot --nobuild``` to skip the build process and use a pre-built ```.app``` under your ```build_dir```.
|
407
429
|
|
430
|
+
### Simulator doesn't launch the application
|
431
|
+
|
432
|
+
When the app dies directly after the application is launched there might be 2 problems
|
433
|
+
|
434
|
+
- The simulator is somehow in a broken state and you need to re-create it. You can use `snapshot reset_simulators` to reset all simulators (this will remove all installed apps)
|
435
|
+
- You haven't enabled the correct architectures. Make sure you have the same architectures as in the example project of this repository.
|
436
|
+
|
408
437
|
## Determine language in UI Automation script
|
409
438
|
|
410
439
|
To detect the currently used localization in your Javascript file, use the following code:
|
data/bin/snapshot
CHANGED
@@ -19,12 +19,12 @@ class SnapshotApplication
|
|
19
19
|
program :help, 'Author', 'Felix Krause <snapshot@krausefx.com>'
|
20
20
|
program :help, 'Website', 'https://fastlane.tools'
|
21
21
|
program :help, 'GitHub', 'https://github.com/krausefx/snapshot'
|
22
|
-
|
22
|
+
program :help_formatter, :compact
|
23
23
|
|
24
24
|
global_option '--snapfile PATH', String, 'Custom path for your Snapfile.'
|
25
25
|
global_option '--nobuild', 'Skips the build process when running snapshot.'
|
26
26
|
global_option '--noclean', 'Skips the clean process of the build command when running snapshot.'
|
27
|
-
global_option('--verbose', 'Shows all output printed by Instruments.') { $verbose = true }
|
27
|
+
global_option('--verbose', 'Shows more output including all output printed by Instruments.') { $verbose = true }
|
28
28
|
|
29
29
|
always_trace!
|
30
30
|
|
@@ -14,6 +14,11 @@ function wait_for_loading_indicator_to_be_finished()
|
|
14
14
|
} catch (e) {}
|
15
15
|
}
|
16
16
|
|
17
|
+
function isTablet()
|
18
|
+
{
|
19
|
+
return !(UIATarget.localTarget().model().match(/iPhone/))
|
20
|
+
}
|
21
|
+
|
17
22
|
function captureLocalizedScreenshot(name) {
|
18
23
|
wait_for_loading_indicator_to_be_finished();
|
19
24
|
|
@@ -38,7 +43,7 @@ function captureLocalizedScreenshot(name) {
|
|
38
43
|
}
|
39
44
|
else
|
40
45
|
{
|
41
|
-
model = "
|
46
|
+
model = "iPad";
|
42
47
|
}
|
43
48
|
|
44
49
|
var orientation = "portrait";
|
@@ -19,7 +19,7 @@ module Snapshot
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def self.check_simulators
|
22
|
-
Helper.log.debug "Found #{Simulators.available_devices.count} simulators."
|
22
|
+
Helper.log.debug "Found #{Simulators.available_devices.count} simulators." if $verbose
|
23
23
|
if Simulators.available_devices.count < 1
|
24
24
|
Helper.log.fatal '#############################################################'
|
25
25
|
Helper.log.fatal "# You have to add new simulators using Xcode"
|
data/lib/snapshot/page.html.erb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
<!DOCTYPE html>
|
2
2
|
<html>
|
3
3
|
<head>
|
4
|
-
<title
|
4
|
+
<title><%= @title %></title>
|
5
5
|
<meta charset="UTF-8">
|
6
6
|
<style type="text/css">
|
7
7
|
* {
|
@@ -83,10 +83,7 @@
|
|
83
83
|
<% screens.each do |screen_path| %>
|
84
84
|
<% next if screen_path.include?"_framed.png" %>
|
85
85
|
<td>
|
86
|
-
<%
|
87
|
-
<% width = ((screen_size[0] / divide_size_by).round rescue 0) %>
|
88
|
-
<% width = [width, max_width].min %>
|
89
|
-
<% style = (width > 0 ? "width: #{width}px;" : '') %>
|
86
|
+
<% style = "width: 100%;" %>
|
90
87
|
<% image_counter += 1 %>
|
91
88
|
<a href="<%= screen_path %>" target="_blank" class="screenshotLink">
|
92
89
|
<img class="screenshot"
|
@@ -136,7 +133,7 @@
|
|
136
133
|
tmpImg.src = img.src;
|
137
134
|
imageDisplay.style.height = 'auto';
|
138
135
|
imageDisplay.style.width = 'auto';
|
139
|
-
imageDisplay.style.paddingTop = '
|
136
|
+
imageDisplay.style.paddingTop = '20px';
|
140
137
|
if (window.innerHeight < tmpImg.height) {
|
141
138
|
imageDisplay.style.height = document.documentElement.clientHeight+'px';
|
142
139
|
} else if (window.innerWidth < tmpImg.width) {
|
@@ -182,7 +179,6 @@
|
|
182
179
|
document.onkeypress = function(e) {
|
183
180
|
e = e || window.event;
|
184
181
|
var charCode = e.keyCode || e.which;
|
185
|
-
|
186
182
|
switch(charCode) {
|
187
183
|
case 27: // Esc
|
188
184
|
overlay.style.display = "none";
|
@@ -4,8 +4,11 @@ require 'fastimage'
|
|
4
4
|
module Snapshot
|
5
5
|
class ReportsGenerator
|
6
6
|
def generate
|
7
|
-
screens_path = SnapshotConfig.shared_instance.screenshots_path
|
8
7
|
|
8
|
+
config = SnapshotConfig.shared_instance
|
9
|
+
screens_path = config.screenshots_path
|
10
|
+
|
11
|
+
@title = config.html_title
|
9
12
|
@data = {}
|
10
13
|
|
11
14
|
Dir["#{screens_path}/*"].sort.each do |language_path|
|
@@ -57,7 +60,8 @@ module Snapshot
|
|
57
60
|
'iPhone6' => "iPhone 6",
|
58
61
|
'iPhone5' => "iPhone 5",
|
59
62
|
'iPhone4' => "iPhone 4",
|
60
|
-
'
|
63
|
+
'iPad' => "iPad",
|
64
|
+
'Mac' => "Mac"
|
61
65
|
}
|
62
66
|
end
|
63
67
|
end
|
data/lib/snapshot/runner.rb
CHANGED
@@ -14,7 +14,10 @@ module Snapshot
|
|
14
14
|
counter = 0
|
15
15
|
errors = []
|
16
16
|
|
17
|
-
|
17
|
+
if (SnapshotConfig.shared_instance.clear_previous_screenshots and take_snapshots)
|
18
|
+
path_to_clear = (SnapshotConfig.shared_instance.screenshots_path + "/*-*/*.png") # languages always contain a `-`
|
19
|
+
Dir[path_to_clear].each { |a| File.delete(a) } # no idea why rm_rf doesn't work
|
20
|
+
end
|
18
21
|
|
19
22
|
SnapshotConfig.shared_instance.devices.each do |device|
|
20
23
|
SnapshotConfig.shared_instance.languages.each do |language_item|
|
@@ -26,17 +29,20 @@ module Snapshot
|
|
26
29
|
(language, locale) = language_item
|
27
30
|
end
|
28
31
|
|
29
|
-
reinstall_app(device, language, locale) unless ENV["SNAPSHOT_SKIP_UNINSTALL"]
|
30
32
|
|
31
33
|
prepare_simulator(device, language)
|
34
|
+
|
35
|
+
reinstall_app(device, language, locale) unless ENV["SNAPSHOT_SKIP_UNINSTALL"]
|
32
36
|
|
33
37
|
begin
|
34
38
|
errors.concat(run_tests(device, language, locale))
|
35
|
-
counter += copy_screenshots(language) if take_snapshots
|
36
39
|
rescue => ex
|
37
40
|
Helper.log.error(ex)
|
38
41
|
end
|
39
42
|
|
43
|
+
# we also want to see the screenshots when something went wrong
|
44
|
+
counter += copy_screenshots(language) if take_snapshots
|
45
|
+
|
40
46
|
teardown_simulator(device, language)
|
41
47
|
|
42
48
|
break if errors.any? && ENV["SNAPSHOT_BREAK_ON_FIRST_ERROR"]
|
@@ -87,14 +93,15 @@ module Snapshot
|
|
87
93
|
end
|
88
94
|
|
89
95
|
def reinstall_app(device, language, locale)
|
96
|
+
Helper.log.info "Reinstalling app...".yellow unless $verbose
|
90
97
|
|
91
98
|
app_identifier = ENV["SNAPSHOT_APP_IDENTIFIER"]
|
92
99
|
app_identifier ||= @app_identifier
|
93
100
|
|
94
101
|
def com(cmd)
|
95
|
-
puts cmd.magenta
|
96
|
-
result = `#{cmd}`
|
97
|
-
puts result if result.to_s.length > 0
|
102
|
+
puts cmd.magenta if $verbose
|
103
|
+
result = `#{cmd} 2>&1` # to now show errors
|
104
|
+
puts result if (result.to_s.length > 0 and $verbose)
|
98
105
|
end
|
99
106
|
|
100
107
|
udid = udid_for_simulator(device)
|
@@ -161,7 +168,7 @@ module Snapshot
|
|
161
168
|
end
|
162
169
|
|
163
170
|
if retry_run
|
164
|
-
Helper.log.error "Instruments tool failed again. Re-trying..."
|
171
|
+
Helper.log.error "Instruments tool failed again. Re-trying..." if $verbose
|
165
172
|
sleep 2 # We need enough sleep... that's an instruments bug
|
166
173
|
errors = run_tests(device, language, locale)
|
167
174
|
end
|
@@ -173,16 +180,19 @@ module Snapshot
|
|
173
180
|
# Determine the path to the actual app and not the WatchKit app
|
174
181
|
build_dir = SnapshotConfig.shared_instance.build_dir || '/tmp/snapshot'
|
175
182
|
Dir.glob("#{build_dir}/**/*.app/*.plist").each do |path|
|
176
|
-
|
183
|
+
# `2>&1` to hide the error if it's not there: http://stackoverflow.com/a/4783536/445598
|
184
|
+
watchkit_enabled = `/usr/libexec/PlistBuddy -c 'Print WKWatchKitApp' '#{path}' 2>&1`.strip
|
177
185
|
next if watchkit_enabled == 'true' # we don't care about WatchKit Apps
|
178
186
|
|
179
|
-
app_identifier = `/usr/libexec/PlistBuddy -c 'Print CFBundleIdentifier' '#{path}'`.strip
|
187
|
+
app_identifier = `/usr/libexec/PlistBuddy -c 'Print CFBundleIdentifier' '#{path}' 2>&1`.strip
|
180
188
|
if app_identifier and app_identifier.length > 0
|
181
189
|
# This seems to be the valid Info.plist
|
182
190
|
@app_identifier = app_identifier
|
183
191
|
return File.expand_path("..", path) # the app
|
184
192
|
end
|
185
193
|
end
|
194
|
+
|
195
|
+
raise "Could not find app in '#{build_dir}'. Make sure you're following the README and set the build directory to the correct path.".red
|
186
196
|
end
|
187
197
|
|
188
198
|
def parse_test_line(line)
|
@@ -9,7 +9,7 @@ module Snapshot
|
|
9
9
|
|
10
10
|
def flatten(path)
|
11
11
|
Dir.glob([path, '/**/*.png'].join('/')).each do |file|
|
12
|
-
Helper.log.info "Removing alpha channel from '#{file}'"
|
12
|
+
Helper.log.info "Removing alpha channel from '#{file}'" if $verbose
|
13
13
|
`sips -s format bmp '#{file}' &> /dev/null ` # &> /dev/null because there is warning because of the extension
|
14
14
|
`sips -s format png '#{file}'`
|
15
15
|
end
|
@@ -49,6 +49,8 @@ module Snapshot
|
|
49
49
|
# @return (Hash) All the blocks, which are called on specific actions
|
50
50
|
attr_accessor :blocks
|
51
51
|
|
52
|
+
attr_accessor :html_title
|
53
|
+
|
52
54
|
|
53
55
|
# A shared singleton
|
54
56
|
def self.shared_instance(path = nil)
|
@@ -62,7 +64,7 @@ module Snapshot
|
|
62
64
|
set_defaults
|
63
65
|
|
64
66
|
if File.exists?path
|
65
|
-
Helper.log.info "Using '#{path}'".green
|
67
|
+
Helper.log.info "Using '#{path}'".green if $verbose
|
66
68
|
self.snapshot_file = SnapshotFile.new(path, self)
|
67
69
|
|
68
70
|
self.verify_devices
|
@@ -105,6 +107,9 @@ module Snapshot
|
|
105
107
|
setup_for_language_change: empty,
|
106
108
|
teardown_language: empty
|
107
109
|
}
|
110
|
+
|
111
|
+
self.html_title = self.project_name || 'KrauseFx/snapshot'
|
112
|
+
|
108
113
|
end
|
109
114
|
|
110
115
|
# This has to be done after parsing the Snapfile (iOS version)
|
@@ -149,6 +154,8 @@ module Snapshot
|
|
149
154
|
|
150
155
|
# The JavaScript UIAutomation file
|
151
156
|
def js_file(ipad = false)
|
157
|
+
return ENV["SNAPSHOT_JS_FILE"] if ENV["SNAPSHOT_JS_FILE"]
|
158
|
+
|
152
159
|
result = manual_js_file
|
153
160
|
|
154
161
|
unless result
|
@@ -178,10 +185,11 @@ module Snapshot
|
|
178
185
|
project_key = 'project'
|
179
186
|
project_key = 'workspace' if project_path.end_with?'.xcworkspace'
|
180
187
|
command = "xcodebuild -#{project_key} '#{project_path}' -list"
|
181
|
-
Helper.log.debug command
|
188
|
+
Helper.log.debug command if $verbose
|
182
189
|
|
183
190
|
schemes = `#{command}`.split("Schemes:").last.split("\n").each { |a| a.strip! }.delete_if { |a| a == '' }
|
184
|
-
|
191
|
+
|
192
|
+
Helper.log.debug "Found available schemes: #{schemes}" if $verbose
|
185
193
|
|
186
194
|
self.manual_scheme = schemes.first if schemes.count == 1
|
187
195
|
|
@@ -76,6 +76,9 @@ module Snapshot
|
|
76
76
|
raise "#{method_sym} needs to have a block provided." unless block_given?
|
77
77
|
Helper.log.warn("'setup_for_language_change' and 'teardown_language' are deprecated.".yellow) if [:setup_for_language_change, :teardown_language].include?method_sym
|
78
78
|
@config.blocks[method_sym] = block
|
79
|
+
when :html_title
|
80
|
+
raise "html_title has to be an String".red unless value.kind_of?String
|
81
|
+
@config.html_title = value
|
79
82
|
else
|
80
83
|
Helper.log.error "Unknown method #{method_sym}"
|
81
84
|
end
|
data/lib/snapshot/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: snapshot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Felix Krause
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-05-
|
11
|
+
date: 2015-05-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fastimage
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - '>='
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.
|
33
|
+
version: 0.7.2
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.
|
40
|
+
version: 0.7.2
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|