snapshot 0.8.0 → 0.9.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/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
|