snapshot 1.6.0 → 1.7.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 +6 -0
- data/lib/assets/SnapshotHelper.swift +2 -1
- data/lib/snapshot/collector.rb +19 -11
- data/lib/snapshot/dependency_checker.rb +22 -22
- data/lib/snapshot/error_handler.rb +3 -14
- data/lib/snapshot/fixes/simulator_zoom_fix.rb +1 -1
- data/lib/snapshot/options.rb +12 -6
- data/lib/snapshot/reports_generator.rb +2 -2
- data/lib/snapshot/runner.rb +47 -32
- data/lib/snapshot/screenshot_flatten.rb +2 -2
- data/lib/snapshot/screenshot_rotate.rb +2 -2
- data/lib/snapshot/update.rb +9 -11
- 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: 2bfb5b368926119bc4632fb4621c5c0cec9ff2c4
|
4
|
+
data.tar.gz: 8045f7a9167e3cef5b8fa19231c3dd16dfd31b31
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 60fce8fd07f9784372473296ab2106f83a4db5855acd1a887869b751fd504d39c4e512dfc96e0535182a9267e7cd1e133b22af43227d9363e309205265709f65
|
7
|
+
data.tar.gz: 683460e6eba4fe459133f0ed94c563b7c6b86be798566541e30cf1b6622bf26479633c24b12588ee73305e094aa4a4437580a9dc44b5c731712f8e0e423357fc
|
data/README.md
CHANGED
@@ -201,6 +201,12 @@ Reinstall the app before running `snapshot`
|
|
201
201
|
snapshot --reinstall_app --app_identifier "tools.fastlane.app"
|
202
202
|
```
|
203
203
|
|
204
|
+
By default `snapshot` automatically retries running UI Tests if they fail. This is due to randomly failing UI Tests (e.g. [#372](https://github.com/fastlane/snapshot/issues/372)). You can adapt this number using
|
205
|
+
|
206
|
+
```sh
|
207
|
+
snapshot --number_of_retries 3
|
208
|
+
```
|
209
|
+
|
204
210
|
For a list for all available options run
|
205
211
|
|
206
212
|
```sh
|
@@ -10,6 +10,7 @@ import Foundation
|
|
10
10
|
import XCTest
|
11
11
|
|
12
12
|
var deviceLanguage = ""
|
13
|
+
var locale = ""
|
13
14
|
|
14
15
|
@available(*, deprecated, message="use setupSnapshot: instead")
|
15
16
|
func setLanguage(app: XCUIApplication) {
|
@@ -35,7 +36,7 @@ class Snapshot: NSObject {
|
|
35
36
|
let path = "/tmp/language.txt"
|
36
37
|
|
37
38
|
do {
|
38
|
-
|
39
|
+
locale = try NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding) as String
|
39
40
|
deviceLanguage = locale.substringToIndex(locale.startIndex.advancedBy(2, limit:locale.endIndex))
|
40
41
|
app.launchArguments += ["-AppleLanguages", "(\(deviceLanguage))", "-AppleLocale", "\"\(locale)\"", "-ui_testing"]
|
41
42
|
} catch {
|
data/lib/snapshot/collector.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module Snapshot
|
2
2
|
# Responsible for collecting the generated screenshots and copying them over to the output directory
|
3
3
|
class Collector
|
4
|
+
# Returns true if it succeeds
|
4
5
|
def self.fetch_screenshots(output, language, device_type, launch_arguments_index)
|
5
6
|
# Documentation about how this works in the project README
|
6
7
|
containing = File.join(TestCommandGenerator.derived_data_path, "Logs", "Test")
|
@@ -14,7 +15,7 @@ module Snapshot
|
|
14
15
|
end
|
15
16
|
|
16
17
|
if matches.count != to_store.count
|
17
|
-
|
18
|
+
UI.error "Looks like the number of screenshots (#{to_store.count}) doesn't match the number of names (#{matches.count})"
|
18
19
|
end
|
19
20
|
|
20
21
|
matches.each_with_index do |current, index|
|
@@ -30,9 +31,9 @@ module Snapshot
|
|
30
31
|
output_path = File.join(language_folder, components.join("-") + ".png")
|
31
32
|
from_path = File.join(attachments_path, filename)
|
32
33
|
if $verbose
|
33
|
-
|
34
|
+
UI.success "Copying file '#{from_path}' to '#{output_path}'..."
|
34
35
|
else
|
35
|
-
|
36
|
+
UI.success "Copying '#{output_path}'..."
|
36
37
|
end
|
37
38
|
FileUtils.cp(from_path, output_path)
|
38
39
|
end
|
@@ -41,10 +42,10 @@ module Snapshot
|
|
41
42
|
end
|
42
43
|
|
43
44
|
def self.attachments(containing)
|
44
|
-
|
45
|
+
UI.message "Collecting screenshots..."
|
45
46
|
|
46
47
|
plist_path = Dir[File.join(containing, "*.plist")].last # we clean the folder before each run
|
47
|
-
|
48
|
+
UI.verbose "Loading up '#{plist_path}'..."
|
48
49
|
report = Plist.parse_xml(plist_path)
|
49
50
|
|
50
51
|
to_store = [] # contains the names of all the attachments we want to use
|
@@ -54,10 +55,7 @@ module Snapshot
|
|
54
55
|
(subtest["Subtests"] || []).each do |subtest2|
|
55
56
|
(subtest2["Subtests"] || []).each do |subtest3|
|
56
57
|
(subtest3["ActivitySummaries"] || []).each do |activity|
|
57
|
-
|
58
|
-
if activity["Title"] == "Set device orientation to Unknown"
|
59
|
-
to_store << activity["Attachments"].last["FileName"]
|
60
|
-
end
|
58
|
+
check_activity(activity, to_store)
|
61
59
|
end
|
62
60
|
end
|
63
61
|
end
|
@@ -65,9 +63,19 @@ module Snapshot
|
|
65
63
|
end
|
66
64
|
end
|
67
65
|
|
68
|
-
|
69
|
-
|
66
|
+
UI.message "Found #{to_store.count} screenshots..."
|
67
|
+
UI.verbose "Found #{to_store.join(', ')}"
|
70
68
|
return to_store
|
71
69
|
end
|
70
|
+
|
71
|
+
def self.check_activity(activity, to_store)
|
72
|
+
# We now check if it's the rotation gesture, because that's the only thing we care about
|
73
|
+
if activity["Title"] == "Set device orientation to Unknown"
|
74
|
+
to_store << activity["Attachments"].last["FileName"]
|
75
|
+
end
|
76
|
+
(activity["SubActivities"] || []).each do |subactivity|
|
77
|
+
check_activity(subactivity, to_store)
|
78
|
+
end
|
79
|
+
end
|
72
80
|
end
|
73
81
|
end
|
@@ -9,41 +9,41 @@ module Snapshot
|
|
9
9
|
|
10
10
|
def self.check_xcode_select
|
11
11
|
unless `xcode-select -v`.include? "xcode-select version"
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
12
|
+
UI.error '#############################################################'
|
13
|
+
UI.error "# You have to install the Xcode commdand line tools to use snapshot"
|
14
|
+
UI.error "# Install the latest version of Xcode from the AppStore"
|
15
|
+
UI.error "# Run xcode-select --install to install the developer tools"
|
16
|
+
UI.error '#############################################################'
|
17
|
+
UI.user_error!("Run 'xcode-select --install' and start snapshot again")
|
18
18
|
end
|
19
19
|
|
20
20
|
if Snapshot::LatestIosVersion.version.to_f < 9 # to_f is bad, but should be good enough
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
21
|
+
UI.error '#############################################################'
|
22
|
+
UI.error "# Your xcode-select Xcode version is below 7.0"
|
23
|
+
UI.error "# To use snapshot 1.0 and above you need at least iOS 9"
|
24
|
+
UI.error "# Set the path to the Xcode version that supports UI Tests"
|
25
|
+
UI.error "# or downgrade to versions older than snapshot 1.0"
|
26
|
+
UI.error '#############################################################'
|
27
|
+
UI.user_error!("Run 'sudo xcode-select -s /Applications/Xcode-beta.app'")
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
31
|
def self.check_simulators
|
32
|
-
|
32
|
+
UI.verbose("Found #{FastlaneCore::Simulator.all.count} simulators.")
|
33
33
|
if FastlaneCore::Simulator.all.count == 0
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
34
|
+
UI.error '#############################################################'
|
35
|
+
UI.error "# You have to add new simulators using Xcode"
|
36
|
+
UI.error "# You can let snapshot create new simulators: 'snapshot reset_simulators'"
|
37
|
+
UI.error "# Manually: Xcode => Window => Devices"
|
38
|
+
UI.error "# Please run `instruments -s` to verify your xcode path"
|
39
|
+
UI.error '#############################################################'
|
40
|
+
UI.user_error!("Create the new simulators and run this script again")
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
44
|
def self.check_simctl
|
45
45
|
unless `xcrun simctl`.include? "openurl"
|
46
|
-
|
46
|
+
UI.user_error!("Could not find `xcrun simctl`. Make sure you have the latest version of Xcode and Mac OS installed.")
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
@@ -1,9 +1,5 @@
|
|
1
1
|
module Snapshot
|
2
|
-
# This classes methods are called when something goes wrong in the building process
|
3
2
|
class ErrorHandler
|
4
|
-
class TestsFailedException < StandardError
|
5
|
-
end
|
6
|
-
|
7
3
|
class << self
|
8
4
|
# @param [Array] The output of the errored build (line by line)
|
9
5
|
# This method should raise an exception in any case, as the return code indicated a failed build
|
@@ -11,23 +7,16 @@ module Snapshot
|
|
11
7
|
# The order of the handling below is import
|
12
8
|
|
13
9
|
if return_code == 65
|
14
|
-
|
10
|
+
UI.user_error!("Tests failed - check out the log above")
|
15
11
|
end
|
16
12
|
|
17
13
|
case output
|
18
14
|
when /com\.apple\.CoreSimulator\.SimError/
|
19
|
-
|
15
|
+
UI.important "The simulator failed to launch - retrying..."
|
20
16
|
when /is not configured for Running/
|
21
|
-
|
17
|
+
UI.user_error!("Scheme is not properly configured, make sure to check out the snapshot README")
|
22
18
|
end
|
23
19
|
end
|
24
|
-
|
25
|
-
private
|
26
|
-
|
27
|
-
# Just to make things easier
|
28
|
-
def print(text)
|
29
|
-
Helper.log.error text.red
|
30
|
-
end
|
31
20
|
end
|
32
21
|
end
|
33
22
|
end
|
@@ -10,7 +10,7 @@ module Snapshot
|
|
10
10
|
# First we need to kill the simulator
|
11
11
|
Snapshot.kill_simulator
|
12
12
|
|
13
|
-
|
13
|
+
UI.message "Patching '#{config_path}' to scale simulator to 100%"
|
14
14
|
|
15
15
|
FastlaneCore::Simulator.all.each do |simulator|
|
16
16
|
simulator_name = simulator.name.tr("\s", "-")
|
data/lib/snapshot/options.rb
CHANGED
@@ -62,11 +62,6 @@ module Snapshot
|
|
62
62
|
description: "By default, the latest version should be used automatically. If you want to change it, do it here",
|
63
63
|
short_option: "-i",
|
64
64
|
default_value: Snapshot::LatestIosVersion.version),
|
65
|
-
FastlaneCore::ConfigItem.new(key: :stop_after_first_error,
|
66
|
-
env_name: 'SNAPSHOT_BREAK_ON_FIRST_ERROR',
|
67
|
-
description: "Should snapshot stop immediately after one of the tests failed on one device?",
|
68
|
-
default_value: false,
|
69
|
-
is_string: false),
|
70
65
|
FastlaneCore::ConfigItem.new(key: :skip_open_summary,
|
71
66
|
env_name: 'SNAPSHOT_SKIP_OPEN_SUMMARY',
|
72
67
|
description: "Don't open the HTML summary after running `snapshot`",
|
@@ -121,7 +116,18 @@ module Snapshot
|
|
121
116
|
short_option: "-s",
|
122
117
|
env_name: 'SNAPSHOT_SCHEME',
|
123
118
|
description: "The scheme you want to use, this must be the scheme for the UI Tests",
|
124
|
-
optional: true) # optional true because we offer a picker to the user
|
119
|
+
optional: true), # optional true because we offer a picker to the user
|
120
|
+
FastlaneCore::ConfigItem.new(key: :number_of_retries,
|
121
|
+
short_option: "-n",
|
122
|
+
env_name: 'SNAPSHOT_NUMBER_OF_RETRIES',
|
123
|
+
description: "The number of times a test can fail before snapshot should stop retrying",
|
124
|
+
type: Integer,
|
125
|
+
default_value: 1),
|
126
|
+
FastlaneCore::ConfigItem.new(key: :stop_after_first_error,
|
127
|
+
env_name: 'SNAPSHOT_BREAK_ON_FIRST_ERROR',
|
128
|
+
description: "Should snapshot stop immediately after the tests completely failed on one device?",
|
129
|
+
default_value: false,
|
130
|
+
is_string: false)
|
125
131
|
]
|
126
132
|
end
|
127
133
|
end
|
@@ -4,7 +4,7 @@ require 'fastimage'
|
|
4
4
|
module Snapshot
|
5
5
|
class ReportsGenerator
|
6
6
|
def generate
|
7
|
-
|
7
|
+
UI.message "Generating HTML Report"
|
8
8
|
|
9
9
|
screens_path = Snapshot.config[:output_directory]
|
10
10
|
|
@@ -34,7 +34,7 @@ module Snapshot
|
|
34
34
|
File.write(export_path, html)
|
35
35
|
|
36
36
|
export_path = File.expand_path(export_path)
|
37
|
-
|
37
|
+
UI.success "Successfully created HTML file with an overview of all the screenshots: '#{export_path}'"
|
38
38
|
system("open '#{export_path}'") unless Snapshot.config[:skip_open_summary]
|
39
39
|
end
|
40
40
|
|
data/lib/snapshot/runner.rb
CHANGED
@@ -3,14 +3,18 @@ require 'plist'
|
|
3
3
|
|
4
4
|
module Snapshot
|
5
5
|
class Runner
|
6
|
-
|
6
|
+
# The number of times we failed on launching the simulator... sigh
|
7
|
+
attr_accessor :number_of_retries_due_to_failing_simulator
|
8
|
+
|
9
|
+
# All the errors we experience while running snapshot
|
10
|
+
attr_accessor :collected_errors
|
7
11
|
|
8
12
|
def work
|
9
13
|
if File.exist?("./fastlane/snapshot.js") or File.exist?("./snapshot.js")
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
+
UI.error "Found old snapshot configuration file 'snapshot.js'"
|
15
|
+
UI.error "You updated to snapshot 1.0 which now uses UI Automation"
|
16
|
+
UI.error "Please follow the migration guide: https://github.com/fastlane/snapshot/blob/master/MigrationGuide.md"
|
17
|
+
UI.error "And read the updated documentation: https://github.com/fastlane/snapshot"
|
14
18
|
sleep 3 # to be sure the user sees this, as compiling clears the screen
|
15
19
|
end
|
16
20
|
|
@@ -20,10 +24,10 @@ module Snapshot
|
|
20
24
|
|
21
25
|
clear_previous_screenshots if Snapshot.config[:clear_previous_screenshots]
|
22
26
|
|
23
|
-
|
27
|
+
UI.success "Building and running project - this might take some time..."
|
24
28
|
|
25
|
-
self.
|
26
|
-
|
29
|
+
self.number_of_retries_due_to_failing_simulator = 0
|
30
|
+
self.collected_errors = []
|
27
31
|
results = {} # collect all the results for a nice table
|
28
32
|
launch_arguments_set = config_launch_arguments
|
29
33
|
Snapshot.config[:devices].each do |device|
|
@@ -31,22 +35,14 @@ module Snapshot
|
|
31
35
|
Snapshot.config[:languages].each do |language|
|
32
36
|
results[device] ||= {}
|
33
37
|
|
34
|
-
|
35
|
-
results[device][language] = launch(language, device, launch_arguments)
|
36
|
-
rescue => ex
|
37
|
-
Helper.log.error ex # we should to show right here as well
|
38
|
-
Helper.log.error "Backtrace:\n\t#{ex.backtrace.join("\n\t")}"
|
39
|
-
errors << ex
|
40
|
-
results[device][language] = false
|
41
|
-
raise ex if Snapshot.config[:stop_after_first_error]
|
42
|
-
end
|
38
|
+
results[device][language] = run_for_device_and_language(language, device, launch_arguments)
|
43
39
|
end
|
44
40
|
end
|
45
41
|
end
|
46
42
|
|
47
43
|
print_results(results)
|
48
44
|
|
49
|
-
raise
|
45
|
+
raise self.collected_errors.join('; ') if self.collected_errors.count > 0
|
50
46
|
|
51
47
|
# Generate HTML report
|
52
48
|
ReportsGenerator.new.generate
|
@@ -55,6 +51,24 @@ module Snapshot
|
|
55
51
|
FileUtils.rm_rf(TestCommandGenerator.derived_data_path)
|
56
52
|
end
|
57
53
|
|
54
|
+
# This is its own method so that it can re-try if the tests fail randomly
|
55
|
+
# @return true/false depending on if the tests succeded
|
56
|
+
def run_for_device_and_language(language, device, launch_arguments, retries = 0)
|
57
|
+
return launch(language, device, launch_arguments)
|
58
|
+
rescue => ex
|
59
|
+
UI.error ex.to_s # show the reason for failure to the user, but still maybe retry
|
60
|
+
|
61
|
+
if retries < Snapshot.config[:number_of_retries]
|
62
|
+
UI.important "Tests failed, re-trying #{retries + 1} out of #{Snapshot.config[:number_of_retries] + 1} times"
|
63
|
+
run_for_device_and_language(language, device, launch_arguments, retries + 1)
|
64
|
+
else
|
65
|
+
UI.error "Backtrace:\n\t#{ex.backtrace.join("\n\t")}" if $verbose
|
66
|
+
self.collected_errors << ex
|
67
|
+
raise ex if Snapshot.config[:stop_after_first_error]
|
68
|
+
return false # for the results
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
58
72
|
def config_launch_arguments
|
59
73
|
launch_arguments = Array(Snapshot.config[:launch_arguments])
|
60
74
|
# if more than 1 set of arguments, use a tuple with an index
|
@@ -87,6 +101,7 @@ module Snapshot
|
|
87
101
|
puts ""
|
88
102
|
end
|
89
103
|
|
104
|
+
# Returns true if it succeded
|
90
105
|
def launch(language, device_type, launch_arguments)
|
91
106
|
screenshots_path = TestCommandGenerator.derived_data_path
|
92
107
|
FileUtils.rm_rf(File.join(screenshots_path, "Logs"))
|
@@ -105,7 +120,7 @@ module Snapshot
|
|
105
120
|
|
106
121
|
command = TestCommandGenerator.generate(device_type: device_type)
|
107
122
|
|
108
|
-
|
123
|
+
UI.header("#{device_type} - #{language}")
|
109
124
|
|
110
125
|
prefix_hash = [
|
111
126
|
{
|
@@ -125,14 +140,14 @@ module Snapshot
|
|
125
140
|
ErrorHandler.handle_test_error(output, return_code)
|
126
141
|
|
127
142
|
# no exception raised... that means we need to retry
|
128
|
-
|
143
|
+
UI.error "Caught error... #{return_code}"
|
129
144
|
|
130
|
-
self.
|
131
|
-
if self.
|
145
|
+
self.number_of_retries_due_to_failing_simulator += 1
|
146
|
+
if self.number_of_retries_due_to_failing_simulator < 20
|
132
147
|
launch(language, device_type, launch_arguments)
|
133
148
|
else
|
134
149
|
# It's important to raise an error, as we don't want to collect the screenshots
|
135
|
-
|
150
|
+
UI.crash!("Too many errors... no more retries...")
|
136
151
|
end
|
137
152
|
end)
|
138
153
|
|
@@ -141,19 +156,19 @@ module Snapshot
|
|
141
156
|
end
|
142
157
|
|
143
158
|
def uninstall_app(device_type)
|
144
|
-
|
159
|
+
UI.verbose "Uninstalling app '#{Snapshot.config[:app_identifier]}' from #{device_type}..."
|
145
160
|
Snapshot.config[:app_identifier] ||= ask("App Identifier: ")
|
146
161
|
device_udid = TestCommandGenerator.device_udid(device_type)
|
147
162
|
|
148
|
-
|
149
|
-
|
163
|
+
UI.message "Launch Simulator #{device_type}"
|
164
|
+
Helper.backticks("xcrun instruments -w #{device_udid} &> /dev/null")
|
150
165
|
|
151
|
-
|
152
|
-
|
166
|
+
UI.message "Uninstall application #{Snapshot.config[:app_identifier]}"
|
167
|
+
Helper.backticks("xcrun simctl uninstall #{device_udid} #{Snapshot.config[:app_identifier]} &> /dev/null")
|
153
168
|
end
|
154
169
|
|
155
170
|
def clear_previous_screenshots
|
156
|
-
|
171
|
+
UI.important "Clearing previously generated screenshots"
|
157
172
|
path = File.join(".", Snapshot.config[:output_directory], "*", "*.png")
|
158
173
|
Dir[path].each do |current|
|
159
174
|
File.delete(current)
|
@@ -167,9 +182,9 @@ module Snapshot
|
|
167
182
|
content = File.read(path)
|
168
183
|
|
169
184
|
if content.include?("start.pressForDuration(0, thenDragToCoordinate: finish)")
|
170
|
-
|
171
|
-
|
172
|
-
|
185
|
+
UI.error "Your '#{path}' is outdated, please run `snapshot update`"
|
186
|
+
UI.error "to update your Helper file"
|
187
|
+
UI.user_error!("Please update your Snapshot Helper file")
|
173
188
|
end
|
174
189
|
end
|
175
190
|
end
|
@@ -3,13 +3,13 @@ module Snapshot
|
|
3
3
|
class ScreenshotFlatten
|
4
4
|
# @param (String) The path in which the screenshots are located in
|
5
5
|
def run(path)
|
6
|
-
|
6
|
+
UI.message "Removing the alpha channel from generated png files"
|
7
7
|
flatten(path)
|
8
8
|
end
|
9
9
|
|
10
10
|
def flatten(path)
|
11
11
|
Dir.glob([path, '/**/*.png'].join('/')).each do |file|
|
12
|
-
|
12
|
+
UI.verbose("Removing alpha channel from '#{file}'")
|
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
|
@@ -5,13 +5,13 @@ module Snapshot
|
|
5
5
|
class ScreenshotRotate
|
6
6
|
# @param (String) The path in which the screenshots are located in
|
7
7
|
def run(path)
|
8
|
-
|
8
|
+
UI.verbose "Rotating the screenshots (if necessary)"
|
9
9
|
rotate(path)
|
10
10
|
end
|
11
11
|
|
12
12
|
def rotate(path)
|
13
13
|
Dir.glob([path, '/**/*.png'].join('/')).each do |file|
|
14
|
-
|
14
|
+
UI.verbose "Rotating '#{file}'"
|
15
15
|
|
16
16
|
command = nil
|
17
17
|
if file.end_with? "landscapeleft.png"
|
data/lib/snapshot/update.rb
CHANGED
@@ -10,23 +10,21 @@ module Snapshot
|
|
10
10
|
gem_path = Helper.gem_path("snapshot")
|
11
11
|
paths = self.class.find_helper
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
Helper.log.info "The underlying API will not change. You can always migrate manually by looking at"
|
20
|
-
Helper.log.info "https://github.com/fastlane/snapshot/blob/master/lib/assets/SnapshotHelper.swift"
|
13
|
+
UI.message "Found the following SnapshotHelper:"
|
14
|
+
paths.each { |p| UI.message "\t#{p}" }
|
15
|
+
UI.important "Are you sure you want to automatically update the helpers listed above?"
|
16
|
+
UI.message "This will overwrite all its content with the latest code."
|
17
|
+
UI.message "The underlying API will not change. You can always migrate manually by looking at"
|
18
|
+
UI.message "https://github.com/fastlane/snapshot/blob/master/lib/assets/SnapshotHelper.swift"
|
21
19
|
|
22
|
-
return 1 unless
|
20
|
+
return 1 unless UI.confirm("Overwrite configuration files?")
|
23
21
|
|
24
22
|
paths.each do |path|
|
25
|
-
|
23
|
+
UI.message "Updating '#{path}'..."
|
26
24
|
File.write(path, File.read("#{gem_path}/lib/assets/SnapshotHelper.swift"))
|
27
25
|
end
|
28
26
|
|
29
|
-
|
27
|
+
UI.success "Successfully updated helper files"
|
30
28
|
end
|
31
29
|
end
|
32
30
|
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: 1.
|
4
|
+
version: 1.7.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: 2016-02-
|
11
|
+
date: 2016-02-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fastimage
|
@@ -30,7 +30,7 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.
|
33
|
+
version: 0.36.1
|
34
34
|
- - "<"
|
35
35
|
- !ruby/object:Gem::Version
|
36
36
|
version: 1.0.0
|
@@ -40,7 +40,7 @@ dependencies:
|
|
40
40
|
requirements:
|
41
41
|
- - ">="
|
42
42
|
- !ruby/object:Gem::Version
|
43
|
-
version: 0.
|
43
|
+
version: 0.36.1
|
44
44
|
- - "<"
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: 1.0.0
|