fastlane 2.141.0 → 2.142.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/README.md +84 -84
  4. data/fastlane/lib/fastlane/actions/README.md +2 -0
  5. data/fastlane/lib/fastlane/actions/app_store_build_number.rb +13 -5
  6. data/fastlane/lib/fastlane/actions/cocoapods.rb +2 -2
  7. data/fastlane/lib/fastlane/actions/ensure_git_branch.rb +1 -1
  8. data/fastlane/lib/fastlane/actions/ensure_xcode_version.rb +35 -7
  9. data/fastlane/lib/fastlane/actions/get_github_release.rb +3 -0
  10. data/fastlane/lib/fastlane/actions/latest_testflight_build_number.rb +9 -3
  11. data/fastlane/lib/fastlane/actions/notarize.rb +183 -0
  12. data/fastlane/lib/fastlane/actions/s3.rb +2 -2
  13. data/fastlane/lib/fastlane/actions/spm.rb +8 -0
  14. data/fastlane/lib/fastlane/actions/swiftlint.rb +17 -2
  15. data/fastlane/lib/fastlane/actions/upload_symbols_to_crashlytics.rb +13 -3
  16. data/fastlane/lib/fastlane/helper/adb_helper.rb +1 -1
  17. data/fastlane/lib/fastlane/plugins/plugin_manager.rb +1 -1
  18. data/fastlane/lib/fastlane/server/socket_server_action_command_executor.rb +1 -1
  19. data/fastlane/lib/fastlane/version.rb +1 -1
  20. data/fastlane/swift/Deliverfile.swift +1 -1
  21. data/fastlane/swift/Fastlane.swift +55 -6
  22. data/fastlane/swift/Gymfile.swift +1 -1
  23. data/fastlane/swift/Matchfile.swift +1 -1
  24. data/fastlane/swift/Precheckfile.swift +1 -1
  25. data/fastlane/swift/RubyCommand.swift +1 -1
  26. data/fastlane/swift/Scanfile.swift +1 -1
  27. data/fastlane/swift/ScanfileProtocol.swift +5 -1
  28. data/fastlane/swift/Screengrabfile.swift +1 -1
  29. data/fastlane/swift/Snapshotfile.swift +1 -1
  30. data/fastlane_core/lib/fastlane_core/keychain_importer.rb +2 -0
  31. data/fastlane_core/lib/fastlane_core/project.rb +4 -0
  32. data/gym/lib/gym/.code_signing_mapping.rb.swp +0 -0
  33. data/gym/lib/gym/runner.rb +2 -2
  34. data/match/lib/match/storage/google_cloud_storage.rb +2 -2
  35. data/pilot/lib/pilot/build_manager.rb +9 -3
  36. data/scan/lib/scan/options.rb +5 -0
  37. data/scan/lib/scan/runner.rb +9 -7
  38. data/scan/lib/scan/test_command_generator.rb +6 -3
  39. data/screengrab/lib/screengrab/runner.rb +20 -15
  40. data/snapshot/lib/snapshot/fixes/simulator_shared_pasteboard.rb +16 -0
  41. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +2 -0
  42. metadata +19 -16
@@ -18,4 +18,4 @@ class Gymfile: GymfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.141.0
21
+ // Generated with fastlane 2.142.0
@@ -18,4 +18,4 @@ class Matchfile: MatchfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.141.0
21
+ // Generated with fastlane 2.142.0
@@ -18,4 +18,4 @@ class Precheckfile: PrecheckfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.141.0
21
+ // Generated with fastlane 2.142.0
@@ -49,7 +49,7 @@ struct RubyCommand: RubyCommandable {
49
49
  let typeJson: String
50
50
  if let type = type {
51
51
  typeJson = ", \"value_type\" : \"\(type.typeString)\""
52
- }else {
52
+ } else {
53
53
  typeJson = ""
54
54
  }
55
55
 
@@ -18,4 +18,4 @@ class Scanfile: ScanfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.141.0
21
+ // Generated with fastlane 2.142.0
@@ -102,6 +102,9 @@ protocol ScanfileProtocol: class {
102
102
  /// Generate the json compilation database with clang naming convention (compile_commands.json)
103
103
  var useClangReportName: Bool { get }
104
104
 
105
+ /// Specify the exact number of test runners that will be spawned during parallel testing. Equivalent to -parallel-testing-worker-count
106
+ var concurrentWorkers: Int? { get }
107
+
105
108
  /// Constrain the number of simulator devices on which to test concurrently. Equivalent to -maximum-concurrent-test-simulator-destinations
106
109
  var maxConcurrentSimulators: Int? { get }
107
110
 
@@ -210,6 +213,7 @@ extension ScanfileProtocol {
210
213
  var shouldZipBuildProducts: Bool { return false }
211
214
  var resultBundle: Bool { return false }
212
215
  var useClangReportName: Bool { return false }
216
+ var concurrentWorkers: Int? { return nil }
213
217
  var maxConcurrentSimulators: Int? { return nil }
214
218
  var disableConcurrentTesting: Bool { return false }
215
219
  var skipBuild: Bool { return false }
@@ -238,4 +242,4 @@ extension ScanfileProtocol {
238
242
 
239
243
  // Please don't remove the lines below
240
244
  // They are used to detect outdated files
241
- // FastlaneRunnerAPIVersion [0.9.25]
245
+ // FastlaneRunnerAPIVersion [0.9.26]
@@ -18,4 +18,4 @@ class Screengrabfile: ScreengrabfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.141.0
21
+ // Generated with fastlane 2.142.0
@@ -18,4 +18,4 @@ class Snapshotfile: SnapshotfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.141.0
21
+ // Generated with fastlane 2.142.0
@@ -10,6 +10,7 @@ module FastlaneCore
10
10
  command << " -P #{certificate_password.shellescape}"
11
11
  command << " -T /usr/bin/codesign" # to not be asked for permission when running a tool like `gym` (before Sierra)
12
12
  command << " -T /usr/bin/security"
13
+ command << " -T /usr/bin/productbuild" # to not be asked for permission when using an installer cert for macOS
13
14
  command << " 1> /dev/null" unless output
14
15
 
15
16
  UI.command(command) if output
@@ -37,6 +38,7 @@ module FastlaneCore
37
38
  if Helper.backticks('security -h | grep set-key-partition-list', print: false).length > 0
38
39
  command = "security set-key-partition-list"
39
40
  command << " -S apple-tool:,apple:"
41
+ command << " -s" # This is a needed in Catalina to prevent "security: SecKeychainItemCopyAccess: A missing value was detected."
40
42
  command << " -k #{keychain_password.to_s.shellescape}"
41
43
  command << " #{keychain_path.shellescape}"
42
44
  command << " 1> /dev/null" # always disable stdout. This can be very verbose, and leak potentially sensitive info
@@ -294,6 +294,10 @@ module FastlaneCore
294
294
  supported_platforms.include?(:iOS)
295
295
  end
296
296
 
297
+ def watchos?
298
+ supported_platforms.include?(:watchOS)
299
+ end
300
+
297
301
  def supported_platforms
298
302
  supported_platforms = build_settings(key: "SUPPORTED_PLATFORMS")
299
303
  if supported_platforms.nil?
@@ -25,11 +25,11 @@ module Gym
25
25
 
26
26
  # Determine platform to archive
27
27
  is_mac = Gym.project.mac? || Gym.building_mac_catalyst_for_mac?
28
- is_ios = !is_mac && (Gym.project.ios? || Gym.project.tvos?)
28
+ is_ios = !is_mac && (Gym.project.ios? || Gym.project.tvos? || Gym.project.watchos?)
29
29
 
30
30
  # Archive
31
31
  if is_ios
32
- fix_generic_archive # See https://github.com/fastlane/fastlane/pull/4325
32
+ fix_generic_archive unless Gym.project.watchos? # See https://github.com/fastlane/fastlane/pull/4325
33
33
  return BuildCommandGenerator.archive_path if Gym.config[:skip_package_ipa]
34
34
 
35
35
  package_app
@@ -181,7 +181,7 @@ module Match
181
181
  end
182
182
 
183
183
  def generate_matchfile_content
184
- return "bucket_name(\"#{self.bucket_name}\")"
184
+ return "google_cloud_bucket_name(\"#{self.bucket_name}\")"
185
185
  end
186
186
 
187
187
  private
@@ -349,7 +349,7 @@ module Match
349
349
  UI.message("\t\t 1. Click on your bucket to open it".cyan)
350
350
  UI.message("\t\t 2. Click 'Permissions'".cyan)
351
351
  UI.message("\t\t 3. Click 'Add members'".cyan)
352
- UI.message("\t\t 4. Enter the email of your service account".cyan)
352
+ UI.message("\t\t 4. Enter the service account email address".cyan)
353
353
  UI.message("\t\t 5. Set the role to 'Storage Admin'".cyan)
354
354
  UI.message("\t\t 6. Click 'Save'".cyan)
355
355
  UI.message("")
@@ -481,12 +481,18 @@ module Pilot
481
481
  end
482
482
 
483
483
  def update_build_beta_details(build, info)
484
- build_beta_detail = build.build_beta_detail
485
-
486
484
  attributes = {}
487
485
  attributes[:autoNotifyEnabled] = info[:auto_notify_enabled] if info.key?(:auto_notify_enabled)
486
+ build_beta_detail = build.build_beta_detail
488
487
 
489
- Spaceship::ConnectAPI.patch_build_beta_details(build_beta_details_id: build_beta_detail.id, attributes: attributes)
488
+ # https://github.com/fastlane/fastlane/pull/16006
489
+ if build_beta_detail
490
+ Spaceship::ConnectAPI.patch_build_beta_details(build_beta_details_id: build_beta_detail.id, attributes: attributes)
491
+ else
492
+ if attributes[:autoNotifyEnabled]
493
+ UI.important("Unable to auto notify testers as the build did not include beta detail information - this is likely a temporary issue on TestFlight.")
494
+ end
495
+ end
490
496
  end
491
497
  end
492
498
  # rubocop:enable Metrics/ClassLength
@@ -254,6 +254,11 @@ module Scan
254
254
  default_value: false),
255
255
 
256
256
  # concurrency
257
+ FastlaneCore::ConfigItem.new(key: :concurrent_workers,
258
+ type: Integer,
259
+ env_name: "SCAN_CONCURRENT_WORKERS",
260
+ description: "Specify the exact number of test runners that will be spawned during parallel testing. Equivalent to -parallel-testing-worker-count",
261
+ optional: true),
257
262
  FastlaneCore::ConfigItem.new(key: :max_concurrent_simulators,
258
263
  type: Integer,
259
264
  env_name: "SCAN_MAX_CONCURRENT_SIMULATORS",
@@ -25,15 +25,17 @@ module Scan
25
25
  def test_app
26
26
  force_quit_simulator_processes if Scan.config[:force_quit_simulator]
27
27
 
28
- if Scan.config[:reset_simulator]
29
- Scan.devices.each do |device|
30
- FastlaneCore::Simulator.reset(udid: device.udid)
28
+ if Scan.devices
29
+ if Scan.config[:reset_simulator]
30
+ Scan.devices.each do |device|
31
+ FastlaneCore::Simulator.reset(udid: device.udid)
32
+ end
31
33
  end
32
- end
33
34
 
34
- if Scan.config[:disable_slide_to_type]
35
- Scan.devices.each do |device|
36
- FastlaneCore::Simulator.disable_slide_to_type(udid: device.udid)
35
+ if Scan.config[:disable_slide_to_type]
36
+ Scan.devices.each do |device|
37
+ FastlaneCore::Simulator.disable_slide_to_type(udid: device.udid)
38
+ end
37
39
  end
38
40
  end
39
41
 
@@ -27,7 +27,7 @@ module Scan
27
27
  UI.user_error!("No project/workspace found")
28
28
  end
29
29
 
30
- def options
30
+ def options # rubocop:disable Metrics/PerceivedComplexity
31
31
  config = Scan.config
32
32
 
33
33
  options = []
@@ -37,8 +37,11 @@ module Scan
37
37
  options << "-toolchain '#{config[:toolchain]}'" if config[:toolchain]
38
38
  options << "-derivedDataPath '#{config[:derived_data_path]}'" if config[:derived_data_path]
39
39
  options << "-resultBundlePath '#{result_bundle_path}'" if config[:result_bundle]
40
- options << "-maximum-concurrent-test-simulator-destinations #{config[:max_concurrent_simulators]}" if config[:max_concurrent_simulators]
41
- options << "-disable-concurrent-testing" if config[:disable_concurrent_testing]
40
+ options << "-parallel-testing-worker-count #{config[:concurrent_workers]}" if config[:concurrent_workers]
41
+ if FastlaneCore::Helper.xcode_at_least?(10)
42
+ options << "-maximum-concurrent-test-simulator-destinations #{config[:max_concurrent_simulators]}" if config[:max_concurrent_simulators]
43
+ options << "-disable-concurrent-testing" if config[:disable_concurrent_testing]
44
+ end
42
45
  options << "-enableCodeCoverage #{config[:code_coverage] ? 'YES' : 'NO'}" unless config[:code_coverage].nil?
43
46
  options << "-enableAddressSanitizer #{config[:address_sanitizer] ? 'YES' : 'NO'}" unless config[:address_sanitizer].nil?
44
47
  options << "-enableThreadSanitizer #{config[:thread_sanitizer] ? 'YES' : 'NO'}" unless config[:thread_sanitizer].nil?
@@ -73,15 +73,11 @@ module Screengrab
73
73
 
74
74
  validate_apk(app_apk_path)
75
75
 
76
- enable_clean_status_bar(device_serial, app_apk_path)
77
-
78
- run_tests(device_serial, app_apk_path, tests_apk_path, test_classes_to_use, test_packages_to_use, @config[:launch_arguments])
79
-
80
- number_of_screenshots = pull_screenshots_from_device(device_serial, device_screenshots_paths, device_type_dir_name)
76
+ number_of_screenshots = run_tests(device_type_dir_name, device_screenshots_paths, device_serial, app_apk_path, tests_apk_path, test_classes_to_use, test_packages_to_use, @config[:launch_arguments])
81
77
 
82
78
  ReportsGenerator.new.generate
83
79
 
84
- UI.success("Captured #{number_of_screenshots} screenshots! 📷✨")
80
+ UI.success("Captured #{number_of_screenshots} new screenshots! 📷✨")
85
81
  end
86
82
 
87
83
  def select_device
@@ -232,23 +228,29 @@ module Screengrab
232
228
  end
233
229
  end
234
230
 
235
- def run_tests(device_serial, app_apk_path, tests_apk_path, test_classes_to_use, test_packages_to_use, launch_arguments)
231
+ def run_tests(device_type_dir_name, device_screenshots_paths, device_serial, app_apk_path, tests_apk_path, test_classes_to_use, test_packages_to_use, launch_arguments)
236
232
  unless @config[:reinstall_app]
237
233
  install_apks(device_serial, app_apk_path, tests_apk_path)
238
234
  grant_permissions(device_serial)
235
+ enable_clean_status_bar(device_serial, app_apk_path)
239
236
  end
240
237
 
238
+ number_of_screenshots = 0
239
+
241
240
  @config[:locales].each do |locale|
242
241
  if @config[:reinstall_app]
243
242
  uninstall_apks(device_serial, @config[:app_package_name], @config[:tests_package_name])
244
243
  install_apks(device_serial, app_apk_path, tests_apk_path)
245
244
  grant_permissions(device_serial)
245
+ enable_clean_status_bar(device_serial, app_apk_path)
246
246
  end
247
- run_tests_for_locale(locale, device_serial, test_classes_to_use, test_packages_to_use, launch_arguments)
247
+ number_of_screenshots += run_tests_for_locale(device_type_dir_name, device_screenshots_paths, locale, device_serial, test_classes_to_use, test_packages_to_use, launch_arguments)
248
248
  end
249
+
250
+ number_of_screenshots
249
251
  end
250
252
 
251
- def run_tests_for_locale(locale, device_serial, test_classes_to_use, test_packages_to_use, launch_arguments)
253
+ def run_tests_for_locale(device_type_dir_name, device_screenshots_paths, locale, device_serial, test_classes_to_use, test_packages_to_use, launch_arguments)
252
254
  UI.message("Running tests for locale: #{locale}")
253
255
 
254
256
  instrument_command = ["-s #{device_serial} shell am instrument --no-window-animation -w",
@@ -271,10 +273,12 @@ module Screengrab
271
273
  UI.error("Tests failed")
272
274
  end
273
275
  end
276
+
277
+ pull_screenshots_from_device(locale, device_serial, device_screenshots_paths, device_type_dir_name)
274
278
  end
275
279
 
276
- def pull_screenshots_from_device(device_serial, device_screenshots_paths, device_type_dir_name)
277
- UI.message("Pulling captured screenshots from the device")
280
+ def pull_screenshots_from_device(locale, device_serial, device_screenshots_paths, device_type_dir_name)
281
+ UI.message("Pulling captured screenshots for locale #{locale} from the device")
278
282
  starting_screenshot_count = screenshot_file_names_in(@config[:output_directory], device_type_dir_name).length
279
283
 
280
284
  UI.verbose("Starting screenshot count is: #{starting_screenshot_count}")
@@ -296,7 +300,7 @@ module Screengrab
296
300
  #
297
301
  # Therefore, we'll move the pulled screenshots from their genericly named folder to one named by the
298
302
  # user provided device_type option value to match the directory structure that supply expects
299
- move_pulled_screenshots(tempdir, device_type_dir_name)
303
+ move_pulled_screenshots(locale, tempdir, device_type_dir_name)
300
304
  end
301
305
 
302
306
  ending_screenshot_count = screenshot_file_names_in(@config[:output_directory], device_type_dir_name).length
@@ -305,7 +309,8 @@ module Screengrab
305
309
 
306
310
  # Because we can't guarantee the screenshot output directory will be empty when we pull, we determine
307
311
  # success based on whether there are more screenshots there than when we started.
308
- if starting_screenshot_count == ending_screenshot_count
312
+ # This is only applicable though when `clear_previous_screenshots` is set to `true`.
313
+ if starting_screenshot_count == ending_screenshot_count && @config[:clear_previous_screenshots]
309
314
  UI.error("Make sure you've used Screengrab.screenshot() in your tests and that your expected tests are being run.")
310
315
  UI.abort_with_message!("No screenshots were detected 📷❌")
311
316
  end
@@ -313,7 +318,7 @@ module Screengrab
313
318
  ending_screenshot_count - starting_screenshot_count
314
319
  end
315
320
 
316
- def move_pulled_screenshots(pull_dir, device_type_dir_name)
321
+ def move_pulled_screenshots(locale, pull_dir, device_type_dir_name)
317
322
  # Glob pattern that finds the pulled screenshots directory for each locale
318
323
  # Possible matches:
319
324
  # [pull_dir]/en-US/images/screenshots
@@ -337,7 +342,7 @@ module Screengrab
337
342
  # specific name, as expected by supply
338
343
  #
339
344
  # (Moved to: fastlane/metadata/android/en-US/images/phoneScreenshots)
340
- dest_dir = File.join(File.dirname(dest_dir), device_type_dir_name)
345
+ dest_dir = File.join(File.dirname(dest_dir), locale, 'images', device_type_dir_name)
341
346
 
342
347
  FileUtils.mkdir_p(dest_dir)
343
348
  FileUtils.cp_r(src_screenshots, dest_dir)
@@ -0,0 +1,16 @@
1
+ require_relative '../module'
2
+
3
+ module Snapshot
4
+ module Fixes
5
+ # Becoming first responder can trigger Pasteboard sync, which can stall and crash the simulator
6
+ # See https://twitter.com/steipete/status/1227551552317140992
7
+
8
+ class SharedPasteboardFix
9
+ def self.patch
10
+ UI.verbose("Patching simulator to disable Pasteboard automatic sync")
11
+
12
+ Helper.backticks("defaults write com.apple.iphonesimulator PasteboardAutomaticSync -bool false", print: FastlaneCore::Globals.verbose?)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -5,6 +5,7 @@ require_relative '../test_command_generator'
5
5
  require_relative '../collector'
6
6
  require_relative '../fixes/hardware_keyboard_fix'
7
7
  require_relative '../fixes/simulator_zoom_fix'
8
+ require_relative '../fixes/simulator_shared_pasteboard'
8
9
 
9
10
  module Snapshot
10
11
  class SimulatorLauncherBase
@@ -53,6 +54,7 @@ module Snapshot
53
54
 
54
55
  Fixes::SimulatorZoomFix.patch
55
56
  Fixes::HardwareKeyboardFix.patch
57
+ Fixes::SharedPasteboardFix.patch
56
58
 
57
59
  device_types.each do |type|
58
60
  if launcher_config.erase_simulator || launcher_config.localize_simulator || !launcher_config.dark_mode.nil?
metadata CHANGED
@@ -1,35 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.141.0
4
+ version: 2.142.0
5
5
  platform: ruby
6
6
  authors:
7
- - Jorge Revuelta H
8
- - Maksym Grebenets
9
- - Olivier Halligon
10
- - Daniel Jankowski
11
- - Fumiya Nakamura
7
+ - Manu Wallner
12
8
  - Josh Holtz
13
- - Andrew McBurney
14
9
  - Iulian Onofrei
15
- - Kohki Miki
10
+ - Luka Mirosevic
11
+ - Danielle Tomlinson
16
12
  - Joshua Liebowitz
17
- - Max Ott
18
- - Stefan Natchev
19
13
  - Jérôme Lacoste
14
+ - Fumiya Nakamura
20
15
  - Aaron Brager
21
- - Jan Piotrowski
22
- - Danielle Tomlinson
23
- - Jimmy Dee
24
- - Manu Wallner
25
- - Luka Mirosevic
26
16
  - Felix Krause
17
+ - Olivier Halligon
27
18
  - Matthew Ellis
19
+ - Daniel Jankowski
20
+ - Maksym Grebenets
21
+ - Max Ott
22
+ - Kohki Miki
23
+ - Jimmy Dee
24
+ - Stefan Natchev
28
25
  - Helmut Januschka
26
+ - Andrew McBurney
27
+ - Jan Piotrowski
28
+ - Jorge Revuelta H
29
29
  autorequire:
30
30
  bindir: bin
31
31
  cert_chain: []
32
- date: 2020-01-29 00:00:00.000000000 Z
32
+ date: 2020-02-18 00:00:00.000000000 Z
33
33
  dependencies:
34
34
  - !ruby/object:Gem::Dependency
35
35
  name: slack-notifier
@@ -1140,6 +1140,7 @@ files:
1140
1140
  - fastlane/lib/fastlane/actions/min_fastlane_version.rb
1141
1141
  - fastlane/lib/fastlane/actions/modify_services.rb
1142
1142
  - fastlane/lib/fastlane/actions/nexus_upload.rb
1143
+ - fastlane/lib/fastlane/actions/notarize.rb
1143
1144
  - fastlane/lib/fastlane/actions/notification.rb
1144
1145
  - fastlane/lib/fastlane/actions/notify.rb
1145
1146
  - fastlane/lib/fastlane/actions/number_of_commits.rb
@@ -1438,6 +1439,7 @@ files:
1438
1439
  - gym/lib/assets/GymfileTemplate.swift
1439
1440
  - gym/lib/assets/wrap_xcodebuild/xcbuild-safe.sh
1440
1441
  - gym/lib/gym.rb
1442
+ - gym/lib/gym/.code_signing_mapping.rb.swp
1441
1443
  - gym/lib/gym/code_signing_mapping.rb
1442
1444
  - gym/lib/gym/commands_generator.rb
1443
1445
  - gym/lib/gym/detect_values.rb
@@ -1588,6 +1590,7 @@ files:
1588
1590
  - snapshot/lib/snapshot/error_handler.rb
1589
1591
  - snapshot/lib/snapshot/fixes/README.md
1590
1592
  - snapshot/lib/snapshot/fixes/hardware_keyboard_fix.rb
1593
+ - snapshot/lib/snapshot/fixes/simulator_shared_pasteboard.rb
1591
1594
  - snapshot/lib/snapshot/fixes/simulator_zoom_fix.rb
1592
1595
  - snapshot/lib/snapshot/latest_os_version.rb
1593
1596
  - snapshot/lib/snapshot/module.rb