snapshot 1.1.1 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: abe2a2114b41b71a5a3b0bf789737b74ed8eb269
4
- data.tar.gz: 96a63f2703288bfb6026fd9ec337fe1fb2219159
3
+ metadata.gz: 054323cf6415d800521313446b8bea54920c4f2d
4
+ data.tar.gz: f763b832b5ae52d1f0f26def4447aafb28789b3e
5
5
  SHA512:
6
- metadata.gz: 90bc75c631543a8d4506a9ab88de3c72c7399a0869b023212811f02b301949640ab4705377eaad0c70281984cdc8f520d4d940daa883eabfd5e3dff8ed6c9cb0
7
- data.tar.gz: 4d20b097682c395cca61c67f69fbd8d4d5ef1cd38c43c01a4f616bf5356eb7cc9d61bb0559a53b5bd7e476d877a4ddd76854c26f308b4467517a636f202cac31
6
+ metadata.gz: af528678ff568a255bd2d53a898fbf8ce3a14758d602dcc096567605990b0e836e1356669699c731de45148e50446e95509c4cdc93c3717295c674a49ab9e18a
7
+ data.tar.gz: 7bac6cf670f207698a4f4f9a2772d4b6c22087007a46e0530d14853eb243d494db8f078939f4c91f75549d5a88ad93ffc1c3b8aff1ceca6d277bff8f3d7e20ed
data/README.md CHANGED
@@ -131,6 +131,7 @@ Here a few links to get started:
131
131
  - [A first look into UI Tests](http://www.mokacoding.com/blog/xcode-7-ui-testing/)
132
132
  - [UI Testing in Xcode 7](http://masilotti.com/ui-testing-xcode-7/)
133
133
  - [HSTestingBackchannel : ‘Cheat’ by communicating directly with your app](https://github.com/ConfusedVorlon/HSTestingBackchannel)
134
+ - [Automating App Store screenshots using fastlane snapshot and frameit](https://tisunov.github.io/2015/11/06/automating-app-store-screenshots-generation-with-fastlane-snapshot-and-sketch.html)
134
135
 
135
136
  **Note**: Since there is no official way to trigger a screenshot from UI Tests, `snapshot` uses a workaround (described in [How Does It Work?](#how-does-it-work)) to trigger a screenshot. If you feel like this should be done right, please duplicate radar [23062925](https://openradar.appspot.com/radar?id=5056366381105152).
136
137
 
@@ -242,15 +243,27 @@ snapshot reset_simulators
242
243
 
243
244
  You can use the environment variable `SNAPSHOT_FORCE_DELETE` to stop asking for confirmation before deleting.
244
245
 
246
+ ## Update snapshot helpers
247
+
248
+ Some updates require the helper files to be updated. `snapshot` will automatically warn you and tell you how to update.
249
+
250
+ Basically you can run
251
+
252
+ ```
253
+ snapshot update
254
+ ```
255
+
256
+ to update your `SnapshotHelper.swift` files. In case you modified your `SnapshotHelper.swift` and want to manually update the file, check out [SnapshotHelper.swift](https://github.com/fastlane/snapshot/blob/master/lib/assets/SnapshotHelper.swift).
257
+
245
258
  # How does it work?
246
259
 
247
260
  The easiest solution would be to just render the UIWindow into a file. That's not possible because UI Tests don't run on a main thread. So `snapshot` uses a different approach:
248
261
 
249
- When you run unit tests in Xcode, the reporter generates a plist file, documenting all events that occured during the tests ([More Information](http://michele.io/test-logs-in-xcode)). Additionally, Xcode generates screenshots before, during and after each of these events. There seems to be no way to manually trigger a screenshot event. The screenshots and the plist files are stored in the DerivedData directory, which `snapshot` stores in a temporary folder.
262
+ When you run unit tests in Xcode, the reporter generates a plist file, documenting all events that occured during the tests ([More Information](http://michele.io/test-logs-in-xcode)). Additionally, Xcode generates screenshots before, during and after each of these events. There is no way to manually trigger a screenshot event. The screenshots and the plist files are stored in the DerivedData directory, which `snapshot` stores in a temporary folder.
250
263
 
251
- When the user calls `snapshot(...)` in the UI Tests (Swift or Objective C) the script actually just does a swipe gesture outside of the screen bounds which doesn't make any sense. It has no effect to the application and is not something you would do in your tests. The goal was to find *some* event that a user would never trigger, so that we know it's from `snapshot`.
264
+ When the user calls `snapshot(...)` in the UI Tests (Swift or Objective C) the script actually does a rotation to `.Invalid` which doesn't have any effect on the actual app, but is enough to trigger a screenshot. It has no effect to the application and is not something you would do in your tests. The goal was to find *some* event that a user would never trigger, so that we know it's from `snapshot`.
252
265
 
253
- `snapshot` then iterates through all test events and check where we did this weird gesture. Once `snapshot` has all events triggered by `snapshot` it collects a ordered list of all the file names of the actual screenshots of the application.
266
+ `snapshot` then iterates through all test events and check where we did this weird rotation. Once `snapshot` has all events triggered by `snapshot` it collects a ordered list of all the file names of the actual screenshots of the application.
254
267
 
255
268
  In the test output, the Swift `snapshot` function will print out something like this
256
269
 
data/bin/snapshot CHANGED
@@ -49,6 +49,16 @@ class SnapshotApplication
49
49
  end
50
50
  end
51
51
 
52
+ command :update do |c|
53
+ c.syntax = 'snapshot update'
54
+ c.description = "Updates your SnapshotHelper.swift to the latest version"
55
+
56
+ c.action do |args, options|
57
+ require 'snapshot/update'
58
+ Snapshot::Update.new.update
59
+ end
60
+ end
61
+
52
62
  command :reset_simulators do |c|
53
63
  c.syntax = 'snapshot reset_simulators'
54
64
  c.description = "This will remove all your existing simulators and re-create new ones"
@@ -7,6 +7,7 @@
7
7
  # "iPhone 5",
8
8
  # "iPhone 4s",
9
9
  # "iPad Retina"
10
+ # "iPad Pro"
10
11
  # ])
11
12
 
12
13
  languages([
@@ -16,7 +16,7 @@ func setLanguage(app: XCUIApplication)
16
16
  Snapshot.setLanguage(app)
17
17
  }
18
18
 
19
- func snapshot(name: String, waitForLoadingIndicator: Bool = true)
19
+ func snapshot(name: String, waitForLoadingIndicator: Bool = false)
20
20
  {
21
21
  Snapshot.snapshot(name, waitForLoadingIndicator: waitForLoadingIndicator)
22
22
  }
@@ -28,7 +28,7 @@ func snapshot(name: String, waitForLoadingIndicator: Bool = true)
28
28
  class func setLanguage(app: XCUIApplication)
29
29
  {
30
30
  let path = "/tmp/language.txt"
31
-
31
+
32
32
  do {
33
33
  let locale = try NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding) as String
34
34
  deviceLanguage = locale.substringToIndex(locale.startIndex.advancedBy(2, limit:locale.endIndex))
@@ -46,11 +46,8 @@ func snapshot(name: String, waitForLoadingIndicator: Bool = true)
46
46
  }
47
47
  print("snapshot: \(name)") // more information about this, check out https://github.com/krausefx/snapshot
48
48
 
49
- let view = XCUIApplication()
50
- let start = view.coordinateWithNormalizedOffset(CGVectorMake(32.10, 30000))
51
- let finish = view.coordinateWithNormalizedOffset(CGVectorMake(31, 30000))
52
- start.pressForDuration(0, thenDragToCoordinate: finish)
53
- sleep(1)
49
+ sleep(1) // Waiting for the animation to be finished (kind of)
50
+ XCUIDevice.sharedDevice().orientation = .Unknown
54
51
  }
55
52
 
56
53
  class func waitForLoadingIndicatorToDisappear()
@@ -63,3 +60,7 @@ func snapshot(name: String, waitForLoadingIndicator: Bool = true)
63
60
  }
64
61
  }
65
62
  }
63
+
64
+ // Please don't remove the lines below
65
+ // They are used to detect outdated configuration files
66
+ // SnapshotHelperVersion [[1.0]]
data/lib/snapshot.rb CHANGED
@@ -10,6 +10,8 @@ require 'snapshot/test_command_generator'
10
10
  require 'snapshot/error_handler'
11
11
  require 'snapshot/collector'
12
12
  require 'snapshot/options'
13
+ require 'snapshot/update'
14
+ require 'snapshot/fixes/simulator_zoom_fix'
13
15
 
14
16
  require 'fastlane_core'
15
17
 
@@ -46,8 +46,8 @@ module Snapshot
46
46
  (subtest["Subtests"] || []).each do |subtest2|
47
47
  (subtest2["Subtests"] || []).each do |subtest3|
48
48
  (subtest3["ActivitySummaries"] || []).each do |activity|
49
- # We now check if it's the drag gesture with a negative value
50
- was_snapshot = activity["Title"].match(/Press and drag from Target Application.*\[32.10.*\].*/)
49
+ # We now check if it's the rotation gesture, because that's the only thing we care about
50
+ was_snapshot = activity["Title"] == "Set device orientation to Unknown"
51
51
  activities << activity if was_snapshot
52
52
  end
53
53
  end
@@ -61,7 +61,7 @@ module Snapshot
61
61
  to_store = [] # contains the names of all the attachments we want to use
62
62
  activities.each do |activity|
63
63
  # We do care about this, all "Long press Target" events mean screenshots
64
- attachment_entry = activity["SubActivities"].last # the latest event is fine
64
+ attachment_entry = activity
65
65
  to_store << attachment_entry["Attachments"].last["FileName"]
66
66
  end
67
67
 
@@ -0,0 +1,5 @@
1
+ ### Fixes
2
+
3
+ This directory contains all the files we don't actually want to have, but are necessary due to open radars, e.g.
4
+ - [#5056366381105152](https://openradar.appspot.com/radar?id=5056366381105152): Trigger screenshots from UI Tests
5
+ - [#6127019184095232](https://openradar.appspot.com/radar?id=6127019184095232): Screenshots are broken when simulator is not scaled at 100%
@@ -0,0 +1,30 @@
1
+ module Snapshot
2
+ module Fixes
3
+ # This fix is needed due to a bug in UI Tests that creates invalid screenshots when the
4
+ # simulator is not scaled to a 100%
5
+ # Issue: https://github.com/fastlane/snapshot/issues/249
6
+ # Radar: https://openradar.appspot.com/radar?id=6127019184095232
7
+
8
+ class SimulatorZoomFix
9
+ def self.patch
10
+ # First we need to kill the simulator
11
+ `killall iOS Simulator &> /dev/null`
12
+
13
+ Helper.log.debug "Patching '#{config_path}' to scale simulator to 100%"
14
+
15
+ FastlaneCore::Simulator.all.each do |simulator|
16
+ simulator_name = simulator.name.tr(" ", "-")
17
+ key = "SimulatorWindowLastScale-com.apple.CoreSimulator.SimDeviceType.#{simulator_name}"
18
+
19
+ command = "defaults write '#{config_path}' '#{key}' '1.0'"
20
+ puts command.yellow if $debug
21
+ `#{command}`
22
+ end
23
+ end
24
+
25
+ def self.config_path
26
+ File.join(File.expand_path("~"), "Library", "Preferences", "com.apple.iphonesimulator.plist")
27
+ end
28
+ end
29
+ end
30
+ end
@@ -56,6 +56,7 @@ module Snapshot
56
56
  'iPhone6' => "iPhone 6",
57
57
  'iPhone5' => "iPhone 5",
58
58
  'iPhone4' => "iPhone 4",
59
+ 'iPadPro' => "iPad Pro",
59
60
  'iPad' => "iPad",
60
61
  'Mac' => "Mac"
61
62
  }
@@ -14,6 +14,8 @@ module Snapshot
14
14
  sleep 3 # to be sure the user sees this, as compiling clears the screen
15
15
  end
16
16
 
17
+ verify_helper_is_current
18
+
17
19
  FastlaneCore::PrintTable.print_values(config: Snapshot.config, hide_keys: [], title: "Summary for snapshot #{Snapshot::VERSION}")
18
20
 
19
21
  clear_previous_screenshots if Snapshot.config[:clear_previous_screenshots]
@@ -48,6 +50,8 @@ module Snapshot
48
50
 
49
51
  File.write("/tmp/language.txt", language)
50
52
 
53
+ Fixes::SimulatorZoomFix.patch
54
+
51
55
  command = TestCommandGenerator.generate(device_type: device_type)
52
56
 
53
57
  Helper.log_alert("#{device_type} - #{language}")
@@ -70,7 +74,7 @@ module Snapshot
70
74
  ErrorHandler.handle_test_error(output, return_code)
71
75
 
72
76
  # no exception raised... that means we need to retry
73
- Helper.log.info "Cought error... #{return_code}".red
77
+ Helper.log.info "Caught error... #{return_code}".red
74
78
 
75
79
  self.number_of_retries += 1
76
80
  if self.number_of_retries < 20
@@ -92,5 +96,20 @@ module Snapshot
92
96
  File.delete(current)
93
97
  end
94
98
  end
99
+
100
+ # rubocop:disable Style/Next
101
+ def verify_helper_is_current
102
+ helper_files = Update.find_helper
103
+ helper_files.each do |path|
104
+ content = File.read(path)
105
+
106
+ if content.include?("start.pressForDuration(0, thenDragToCoordinate: finish)")
107
+ Helper.log.error "Your '#{path}' is outdated, please run `snapshot update`".red
108
+ Helper.log.error "to update your Helper file".red
109
+ raise "Please update your Snapshot Helper file".red
110
+ end
111
+ end
112
+ end
113
+ # rubocop:enable Style/Next
95
114
  end
96
115
  end
@@ -12,7 +12,7 @@ module Snapshot
12
12
  File.write(snapfile_path, File.read("#{gem_path}/lib/assets/SnapfileTemplate"))
13
13
  File.write(File.join(path, 'SnapshotHelper.swift'), File.read("#{gem_path}/lib/assets/SnapshotHelper.swift"))
14
14
 
15
- puts "Successfully created SnapshotHelper.js '#{File.join(path, 'SnapshotHelper.swift')}'".green
15
+ puts "Successfully created SnapshotHelper.swift '#{File.join(path, 'SnapshotHelper.swift')}'".green
16
16
  puts "Successfully created new Snapfile at '#{snapfile_path}'".green
17
17
 
18
18
  puts "-------------------------------------------------------".yellow
@@ -0,0 +1,32 @@
1
+ module Snapshot
2
+ # Migrate helper files
3
+ class Update
4
+ # @return [Array] A list of helper files (usually just one)
5
+ def self.find_helper
6
+ Dir["./**/SnapshotHelper.swift"]
7
+ end
8
+
9
+ def update
10
+ gem_path = Helper.gem_path("snapshot")
11
+ paths = self.class.find_helper
12
+
13
+ Helper.log.info "Found the following SnapshotHelper:"
14
+ puts ''
15
+ paths.each { |p| Helper.log.info "\t#{p}" }
16
+ puts ''
17
+ Helper.log.info "Are you sure you want to automatically update the helpers listed above?"
18
+ Helper.log.info "This will overwrite all its content with the latest code."
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"
21
+
22
+ return 1 unless agree("Overwrite configuration files? (y/n)".red, true)
23
+
24
+ paths.each do |path|
25
+ Helper.log.info "Updating '#{path}'..."
26
+ File.write(path, File.read("#{gem_path}/lib/assets/SnapshotHelper.swift"))
27
+ end
28
+
29
+ Helper.log.info "Successfully updated helper files".green
30
+ end
31
+ end
32
+ end
@@ -1,4 +1,4 @@
1
1
  module Snapshot
2
- VERSION = "1.1.1"
2
+ VERSION = "1.2.0"
3
3
  DESCRIPTION = "Automate taking localized screenshots of your iOS app on every device"
4
4
  end
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.1.1
4
+ version: 1.2.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-11-04 00:00:00.000000000 Z
11
+ date: 2015-11-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fastimage
@@ -216,6 +216,8 @@ files:
216
216
  - lib/snapshot/dependency_checker.rb
217
217
  - lib/snapshot/detect_values.rb
218
218
  - lib/snapshot/error_handler.rb
219
+ - lib/snapshot/fixes/README.md
220
+ - lib/snapshot/fixes/simulator_zoom_fix.rb
219
221
  - lib/snapshot/latest_ios_version.rb
220
222
  - lib/snapshot/options.rb
221
223
  - lib/snapshot/page.html.erb
@@ -226,6 +228,7 @@ files:
226
228
  - lib/snapshot/screenshot_rotate.rb
227
229
  - lib/snapshot/setup.rb
228
230
  - lib/snapshot/test_command_generator.rb
231
+ - lib/snapshot/update.rb
229
232
  - lib/snapshot/version.rb
230
233
  homepage: https://fastlane.tools
231
234
  licenses:
@@ -247,7 +250,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
247
250
  version: '0'
248
251
  requirements: []
249
252
  rubyforge_project:
250
- rubygems_version: 2.5.0
253
+ rubygems_version: 2.4.0
251
254
  signing_key:
252
255
  specification_version: 4
253
256
  summary: Automate taking localized screenshots of your iOS app on every device