fastlane 2.146.1 → 2.149.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (113) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +82 -82
  3. data/cert/lib/cert/commands_generator.rb +1 -0
  4. data/credentials_manager/lib/credentials_manager/cli.rb +2 -0
  5. data/deliver/lib/deliver/app_screenshot.rb +3 -3
  6. data/deliver/lib/deliver/commands_generator.rb +1 -0
  7. data/deliver/lib/deliver/html_generator.rb +2 -2
  8. data/deliver/lib/deliver/submit_for_review.rb +5 -1
  9. data/fastlane/lib/assets/custom_action_template.rb +6 -6
  10. data/fastlane/lib/assets/s3_html_template.erb +1 -1
  11. data/fastlane/lib/fastlane/actions/cocoapods.rb +1 -1
  12. data/fastlane/lib/fastlane/actions/crashlytics.rb +0 -4
  13. data/fastlane/lib/fastlane/actions/docs/build_app.md +1 -1
  14. data/fastlane/lib/fastlane/actions/docs/capture_android_screenshots.md +42 -2
  15. data/fastlane/lib/fastlane/actions/docs/capture_ios_screenshots.md +3 -1
  16. data/fastlane/lib/fastlane/actions/docs/frame_screenshots.md +1 -1
  17. data/fastlane/lib/fastlane/actions/docs/sync_code_signing.md +2 -2
  18. data/fastlane/lib/fastlane/actions/docs/upload_to_play_store.md +12 -0
  19. data/fastlane/lib/fastlane/actions/get_managed_play_store_publishing_rights.rb +1 -1
  20. data/fastlane/lib/fastlane/actions/git_branch.rb +1 -1
  21. data/fastlane/lib/fastlane/actions/hipchat.rb +1 -1
  22. data/fastlane/lib/fastlane/actions/push_to_git_remote.rb +1 -1
  23. data/fastlane/lib/fastlane/actions/set_pod_key.rb +3 -3
  24. data/fastlane/lib/fastlane/actions/slack.rb +1 -1
  25. data/fastlane/lib/fastlane/actions/slather.rb +8 -1
  26. data/fastlane/lib/fastlane/actions/swiftlint.rb +14 -0
  27. data/fastlane/lib/fastlane/actions/sync_code_signing.rb +1 -1
  28. data/fastlane/lib/fastlane/actions/testfairy.rb +18 -3
  29. data/fastlane/lib/fastlane/actions/upload_symbols_to_crashlytics.rb +2 -2
  30. data/fastlane/lib/fastlane/actions/verify_xcode.rb +7 -0
  31. data/fastlane/lib/fastlane/actions/xcodebuild.rb +4 -4
  32. data/fastlane/lib/fastlane/cli_tools_distributor.rb +28 -6
  33. data/fastlane/lib/fastlane/commands_generator.rb +5 -2
  34. data/fastlane/lib/fastlane/documentation/actions_list.rb +1 -1
  35. data/fastlane/lib/fastlane/helper/lane_helper.rb +13 -0
  36. data/fastlane/lib/fastlane/lane_manager.rb +0 -10
  37. data/fastlane/lib/fastlane/plugins/plugin_manager.rb +3 -3
  38. data/fastlane/lib/fastlane/plugins/template/.github/workflows/test.yml +29 -0
  39. data/fastlane/lib/fastlane/swift_fastlane_function.rb +15 -2
  40. data/fastlane/lib/fastlane/swift_lane_manager.rb +0 -8
  41. data/fastlane/lib/fastlane/version.rb +1 -1
  42. data/fastlane/swift/Deliverfile.swift +1 -1
  43. data/fastlane/swift/Fastlane.swift +130 -26
  44. data/fastlane/swift/Gymfile.swift +1 -1
  45. data/fastlane/swift/GymfileProtocol.swift +1 -1
  46. data/fastlane/swift/LaneFileProtocol.swift +5 -2
  47. data/fastlane/swift/Matchfile.swift +1 -1
  48. data/fastlane/swift/MatchfileProtocol.swift +9 -1
  49. data/fastlane/swift/Precheckfile.swift +1 -1
  50. data/fastlane/swift/Scanfile.swift +1 -1
  51. data/fastlane/swift/ScanfileProtocol.swift +15 -3
  52. data/fastlane/swift/Screengrabfile.swift +1 -1
  53. data/fastlane/swift/Snapshotfile.swift +1 -1
  54. data/fastlane/swift/SnapshotfileProtocol.swift +25 -1
  55. data/fastlane_core/lib/fastlane_core/helper.rb +17 -0
  56. data/fastlane_core/lib/fastlane_core/keychain_importer.rb +46 -2
  57. data/frameit/lib/frameit/commands_generator.rb +1 -0
  58. data/frameit/lib/frameit/device_types.rb +10 -0
  59. data/frameit/lib/frameit/options.rb +5 -2
  60. data/frameit/lib/frameit/runner.rb +5 -0
  61. data/frameit/lib/frameit/screenshot.rb +1 -0
  62. data/gym/lib/gym/generators/package_command_generator.rb +4 -0
  63. data/gym/lib/gym/generators/package_command_generator_xcode7.rb +4 -0
  64. data/gym/lib/gym/options.rb +1 -1
  65. data/gym/lib/gym/runner.rb +14 -0
  66. data/match/lib/match/change_password.rb +1 -18
  67. data/match/lib/match/commands_generator.rb +1 -0
  68. data/match/lib/match/encryption/openssl.rb +1 -1
  69. data/match/lib/match/generator.rb +7 -2
  70. data/match/lib/match/nuke.rb +21 -16
  71. data/match/lib/match/options.rb +23 -1
  72. data/match/lib/match/storage/git_storage.rb +4 -0
  73. data/match/lib/match/storage/google_cloud_storage.rb +4 -0
  74. data/match/lib/match/storage/interface.rb +4 -0
  75. data/match/lib/match/storage/s3_storage.rb +4 -0
  76. data/match/lib/match/utils.rb +1 -1
  77. data/pem/lib/pem/commands_generator.rb +1 -0
  78. data/pilot/lib/pilot/build_manager.rb +23 -7
  79. data/pilot/lib/pilot/options.rb +5 -0
  80. data/produce/lib/produce/commands_generator.rb +1 -0
  81. data/scan/lib/scan/.test_command_generator.rb.swp +0 -0
  82. data/scan/lib/scan/detect_values.rb +3 -0
  83. data/scan/lib/scan/options.rb +26 -3
  84. data/scan/lib/scan/runner.rb +2 -0
  85. data/scan/lib/scan/test_command_generator.rb +7 -2
  86. data/scan/lib/scan/test_result_parser.rb +9 -2
  87. data/screengrab/lib/screengrab/runner.rb +10 -9
  88. data/sigh/lib/sigh/commands_generator.rb +1 -0
  89. data/sigh/lib/sigh/options.rb +7 -1
  90. data/sigh/lib/sigh/runner.rb +2 -1
  91. data/snapshot/lib/assets/SnapfileTemplate +3 -0
  92. data/snapshot/lib/assets/SnapshotHelper.swift +12 -33
  93. data/snapshot/lib/snapshot/.test_command_generator_base.rb.swp +0 -0
  94. data/snapshot/lib/snapshot/detect_values.rb +15 -0
  95. data/snapshot/lib/snapshot/options.rb +42 -0
  96. data/snapshot/lib/snapshot/reports_generator.rb +1 -1
  97. data/snapshot/lib/snapshot/simulator_launchers/launcher_configuration.rb +2 -0
  98. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher.rb +4 -0
  99. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +24 -1
  100. data/snapshot/lib/snapshot/test_command_generator.rb +8 -3
  101. data/snapshot/lib/snapshot/test_command_generator_base.rb +10 -1
  102. data/spaceship/lib/spaceship/base.rb +1 -1
  103. data/spaceship/lib/spaceship/client.rb +9 -1
  104. data/spaceship/lib/spaceship/commands_generator.rb +1 -0
  105. data/spaceship/lib/spaceship/connect_api/model.rb +6 -0
  106. data/spaceship/lib/spaceship/connect_api/models/build.rb +4 -0
  107. data/spaceship/lib/spaceship/errors.rb +3 -0
  108. data/spaceship/lib/spaceship/tunes/iap.rb +15 -0
  109. data/spaceship/lib/spaceship/tunes/tunes_client.rb +14 -0
  110. data/supply/lib/supply/commands_generator.rb +1 -0
  111. data/supply/lib/supply/options.rb +9 -0
  112. data/supply/lib/supply/uploader.rb +4 -0
  113. metadata +46 -30
@@ -26,7 +26,15 @@ module Snapshot
26
26
  options << "-sdk '#{config[:sdk]}'" if config[:sdk]
27
27
  options << "-derivedDataPath '#{derived_data_path}'"
28
28
  options << "-resultBundlePath '#{result_bundle_path}'" if result_bundle_path
29
+ if FastlaneCore::Helper.xcode_at_least?(11)
30
+ options << "-testPlan '#{config[:testplan]}'" if config[:testplan]
31
+ end
29
32
  options << config[:xcargs] if config[:xcargs]
33
+
34
+ # detect_values will ensure that these values are present as Arrays if
35
+ # they are present at all
36
+ options += config[:only_testing].map { |test_id| "-only-testing:#{test_id.shellescape}" } if config[:only_testing]
37
+ options += config[:skip_testing].map { |test_id| "-skip-testing:#{test_id.shellescape}" } if config[:skip_testing]
30
38
  return options
31
39
  end
32
40
 
@@ -88,7 +96,8 @@ module Snapshot
88
96
  language_key = locale || language
89
97
 
90
98
  unless Snapshot.cache[:result_bundle_path][language_key]
91
- path = File.join(Snapshot.config[:output_directory], "test_output", language_key, Snapshot.config[:scheme]) + ".test_result"
99
+ ext = FastlaneCore::Helper.xcode_at_least?(11) ? '.xcresult' : '.test_result'
100
+ path = File.join(Snapshot.config[:output_directory], "test_output", language_key, Snapshot.config[:scheme]) + ext
92
101
  if File.directory?(path)
93
102
  FileUtils.remove_dir(path)
94
103
  end
@@ -295,7 +295,7 @@ module Spaceship
295
295
  def inspect_value
296
296
  self.attributes.map do |k|
297
297
  v = self.send(k).inspect
298
- v.gsub!("\n", "\n\t") # to align nested elements
298
+ v = v.gsub("\n", "\n\t") # to align nested elements
299
299
 
300
300
  "\t#{k}=#{v}"
301
301
  end.join(", \n")
@@ -54,6 +54,7 @@ module Spaceship
54
54
  GatewayTimeoutError = Spaceship::GatewayTimeoutError
55
55
  InternalServerError = Spaceship::InternalServerError
56
56
  BadGatewayError = Spaceship::BadGatewayError
57
+ AccessForbiddenError = Spaceship::AccessForbiddenError
57
58
 
58
59
  def self.hostname
59
60
  raise "You must implement self.hostname"
@@ -628,7 +629,8 @@ module Spaceship
628
629
  Faraday::TimeoutError,
629
630
  BadGatewayError,
630
631
  AppleTimeoutError,
631
- GatewayTimeoutError => ex
632
+ GatewayTimeoutError,
633
+ AccessForbiddenError => ex
632
634
  tries -= 1
633
635
  unless tries.zero?
634
636
  msg = "Timeout received: '#{ex.class}', '#{ex.message}'. Retrying after 3 seconds (remaining: #{tries})..."
@@ -865,6 +867,12 @@ module Spaceship
865
867
  raise BadGatewayError.new, "Apple 502 detected - this might be temporary server error, try again later"
866
868
  end
867
869
 
870
+ if resp_hash[:status] == 403
871
+ msg = "Access forbidden"
872
+ logger.warn(msg)
873
+ raise AccessForbiddenError.new, msg
874
+ end
875
+
868
876
  return response
869
877
  end
870
878
  end
@@ -25,6 +25,7 @@ module Spaceship
25
25
 
26
26
  global_option('-u', '--user USERNAME', 'Specify the Apple ID you want to log in with')
27
27
  global_option('--verbose') { FastlaneCore::Globals.verbose = true }
28
+ global_option('--env STRING[,STRING2]', String, 'Add environment(s) to use with `dotenv`')
28
29
 
29
30
  command :playground do |c|
30
31
  c.syntax = 'fastlane spaceship playground'
@@ -49,6 +49,12 @@ module Spaceship
49
49
  alias_method(key_writer, writer)
50
50
  end
51
51
  end
52
+
53
+ def to_json(*options)
54
+ instance_variables.map do |var|
55
+ [var.to_s[1..-1], instance_variable_get(var)]
56
+ end.to_h.to_json(*options)
57
+ end
52
58
  end
53
59
 
54
60
  module Models
@@ -158,6 +158,10 @@ module Spaceship
158
158
  def post_beta_app_review_submission
159
159
  return Spaceship::ConnectAPI.post_beta_app_review_submissions(build_id: id)
160
160
  end
161
+
162
+ def expire!
163
+ return Spaceship::ConnectAPI.patch_builds(build_id: id, attributes: { expired: true })
164
+ end
161
165
  end
162
166
  end
163
167
  end
@@ -76,4 +76,7 @@ module Spaceship
76
76
 
77
77
  # Raised when 504 is received from App Store Connect
78
78
  class GatewayTimeoutError < BasicPreferredInfoError; end
79
+
80
+ # Raised when 403 is received from portal request
81
+ class AccessForbiddenError < BasicPreferredInfoError; end
79
82
  end
@@ -132,6 +132,21 @@ module Spaceship
132
132
  return nil
133
133
  end
134
134
 
135
+ # generate app-specific shared secret (or regenerate if exists)
136
+ def generate_shared_secret
137
+ client.generate_shared_secret(app_id: self.application.apple_id)
138
+ end
139
+
140
+ # retrieve app-specific shared secret
141
+ # @param create (Boolean) Create new shared secret if does not exist
142
+ def get_shared_secret(create: false)
143
+ secret = client.get_shared_secret(app_id: self.application.apple_id)
144
+ if create && secret.nil?
145
+ secret = generate_shared_secret
146
+ end
147
+ secret
148
+ end
149
+
135
150
  private
136
151
 
137
152
  def find_product_with_retries(product_id, max_tries)
@@ -1422,6 +1422,20 @@ module Spaceship
1422
1422
  handle_itc_response(r.body)
1423
1423
  end
1424
1424
 
1425
+ # Retrieves app-specific shared secret key
1426
+ def get_shared_secret(app_id: nil)
1427
+ r = request(:get, "ra/apps/#{app_id}/iaps/appSharedSecret")
1428
+ data = parse_response(r, 'data')
1429
+ data['sharedSecret']
1430
+ end
1431
+
1432
+ # Generates app-specific shared secret key
1433
+ def generate_shared_secret(app_id: nil)
1434
+ r = request(:post, "ra/apps/#{app_id}/iaps/appSharedSecret")
1435
+ data = parse_response(r, 'data')
1436
+ data['sharedSecret']
1437
+ end
1438
+
1425
1439
  #####################################################
1426
1440
  # @!group Sandbox Testers
1427
1441
  #####################################################
@@ -24,6 +24,7 @@ module Supply
24
24
  always_trace!
25
25
 
26
26
  global_option('--verbose') { FastlaneCore::Globals.verbose = true }
27
+ global_option('--env STRING[,STRING2]', String, 'Add environment(s) to use with `dotenv`')
27
28
 
28
29
  command :run do |c|
29
30
  c.syntax = 'fastlane supply'
@@ -281,6 +281,15 @@ module Supply
281
281
  UI.user_error!("Version code '#{version_code}' is not an integer") if version_code == 0
282
282
  end
283
283
  end),
284
+ FastlaneCore::ConfigItem.new(key: :in_app_update_priority,
285
+ env_name: "SUPPLY_IN_APP_UPDATE_PRIORITY",
286
+ optional: true,
287
+ type: Integer,
288
+ description: "In-app update priority for all the newly added apks in the release. Can take values between [0,5]",
289
+ verify_block: proc do |in_app_update_priority|
290
+ in_app_update_priority = in_app_update_priority.to_i
291
+ UI.user_error!("Invalid in_app_update_priority value '#{in_app_update_priority}'. Values must be between [0,5]") unless (0..5).member?(in_app_update_priority)
292
+ end),
284
293
  FastlaneCore::ConfigItem.new(key: :obb_main_references_version,
285
294
  env_name: "SUPPLY_OBB_MAIN_REFERENCES_VERSION",
286
295
  description: "References version of 'main' expansion file",
@@ -391,6 +391,10 @@ module Supply
391
391
  end
392
392
  end
393
393
 
394
+ if Supply.config[:in_app_update_priority]
395
+ track_release.in_app_update_priority = Supply.config[:in_app_update_priority].to_i
396
+ end
397
+
394
398
  tracks = client.tracks(Supply.config[:track])
395
399
  track = tracks.first
396
400
  if track
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.146.1
4
+ version: 2.149.1
5
5
  platform: ruby
6
6
  authors:
7
+ - Manu Wallner
8
+ - Danielle Tomlinson
9
+ - Matthew Ellis
10
+ - Stefan Natchev
11
+ - Jimmy Dee
12
+ - Kohki Miki
13
+ - Jorge Revuelta H
14
+ - Daniel Jankowski
7
15
  - Jérôme Lacoste
16
+ - Andrew McBurney
17
+ - Max Ott
8
18
  - Iulian Onofrei
9
- - Luka Mirosevic
10
- - Matthew Ellis
11
19
  - Helmut Januschka
12
- - Manu Wallner
13
- - Olivier Halligon
14
- - Aaron Brager
15
20
  - Jan Piotrowski
16
- - Kohki Miki
17
- - Maksym Grebenets
21
+ - Luka Mirosevic
18
22
  - Felix Krause
19
- - Josh Holtz
20
- - Max Ott
21
- - Danielle Tomlinson
22
- - Daniel Jankowski
23
- - Jimmy Dee
24
23
  - Fumiya Nakamura
25
- - Andrew McBurney
26
- - Stefan Natchev
24
+ - Olivier Halligon
25
+ - Maksym Grebenets
26
+ - Aaron Brager
27
+ - Josh Holtz
27
28
  - Joshua Liebowitz
28
- - Jorge Revuelta H
29
29
  autorequire:
30
30
  bindir: bin
31
31
  cert_chain: []
32
- date: 2020-04-22 00:00:00.000000000 Z
32
+ date: 2020-06-04 00:00:00.000000000 Z
33
33
  dependencies:
34
34
  - !ruby/object:Gem::Dependency
35
35
  name: slack-notifier
@@ -359,30 +359,42 @@ dependencies:
359
359
  name: faraday
360
360
  requirement: !ruby/object:Gem::Requirement
361
361
  requirements:
362
- - - "~>"
362
+ - - ">="
363
363
  - !ruby/object:Gem::Version
364
364
  version: '0.17'
365
+ - - "<"
366
+ - !ruby/object:Gem::Version
367
+ version: '2.0'
365
368
  type: :runtime
366
369
  prerelease: false
367
370
  version_requirements: !ruby/object:Gem::Requirement
368
371
  requirements:
369
- - - "~>"
372
+ - - ">="
370
373
  - !ruby/object:Gem::Version
371
374
  version: '0.17'
375
+ - - "<"
376
+ - !ruby/object:Gem::Version
377
+ version: '2.0'
372
378
  - !ruby/object:Gem::Dependency
373
379
  name: faraday_middleware
374
380
  requirement: !ruby/object:Gem::Requirement
375
381
  requirements:
376
- - - "~>"
382
+ - - ">="
377
383
  - !ruby/object:Gem::Version
378
384
  version: 0.13.1
385
+ - - "<"
386
+ - !ruby/object:Gem::Version
387
+ version: '2.0'
379
388
  type: :runtime
380
389
  prerelease: false
381
390
  version_requirements: !ruby/object:Gem::Requirement
382
391
  requirements:
383
- - - "~>"
392
+ - - ">="
384
393
  - !ruby/object:Gem::Version
385
394
  version: 0.13.1
395
+ - - "<"
396
+ - !ruby/object:Gem::Version
397
+ version: '2.0'
386
398
  - !ruby/object:Gem::Dependency
387
399
  name: fastimage
388
400
  requirement: !ruby/object:Gem::Requirement
@@ -613,20 +625,20 @@ dependencies:
613
625
  requirements:
614
626
  - - ">="
615
627
  - !ruby/object:Gem::Version
616
- version: 0.29.2
628
+ version: 0.37.0
617
629
  - - "<"
618
630
  - !ruby/object:Gem::Version
619
- version: 0.37.0
631
+ version: 0.39.0
620
632
  type: :runtime
621
633
  prerelease: false
622
634
  version_requirements: !ruby/object:Gem::Requirement
623
635
  requirements:
624
636
  - - ">="
625
637
  - !ruby/object:Gem::Version
626
- version: 0.29.2
638
+ version: 0.37.0
627
639
  - - "<"
628
640
  - !ruby/object:Gem::Version
629
- version: 0.37.0
641
+ version: 0.39.0
630
642
  - !ruby/object:Gem::Dependency
631
643
  name: google-cloud-storage
632
644
  requirement: !ruby/object:Gem::Requirement
@@ -685,16 +697,16 @@ dependencies:
685
697
  name: rake
686
698
  requirement: !ruby/object:Gem::Requirement
687
699
  requirements:
688
- - - "<"
700
+ - - ">="
689
701
  - !ruby/object:Gem::Version
690
- version: '12'
702
+ version: '0'
691
703
  type: :development
692
704
  prerelease: false
693
705
  version_requirements: !ruby/object:Gem::Requirement
694
706
  requirements:
695
- - - "<"
707
+ - - ">="
696
708
  - !ruby/object:Gem::Version
697
- version: '12'
709
+ version: '0'
698
710
  - !ruby/object:Gem::Dependency
699
711
  name: rspec
700
712
  requirement: !ruby/object:Gem::Requirement
@@ -1277,6 +1289,7 @@ files:
1277
1289
  - fastlane/lib/fastlane/helper/gem_helper.rb
1278
1290
  - fastlane/lib/fastlane/helper/git_helper.rb
1279
1291
  - fastlane/lib/fastlane/helper/gradle_helper.rb
1292
+ - fastlane/lib/fastlane/helper/lane_helper.rb
1280
1293
  - fastlane/lib/fastlane/helper/podspec_helper.rb
1281
1294
  - fastlane/lib/fastlane/helper/s3_client_helper.rb
1282
1295
  - fastlane/lib/fastlane/helper/sh_helper.rb
@@ -1302,6 +1315,7 @@ files:
1302
1315
  - fastlane/lib/fastlane/plugins/plugins.rb
1303
1316
  - fastlane/lib/fastlane/plugins/template/%gem_name%.gemspec.erb
1304
1317
  - fastlane/lib/fastlane/plugins/template/.circleci/config.yml
1318
+ - fastlane/lib/fastlane/plugins/template/.github/workflows/test.yml
1305
1319
  - fastlane/lib/fastlane/plugins/template/.gitignore
1306
1320
  - fastlane/lib/fastlane/plugins/template/.rspec
1307
1321
  - fastlane/lib/fastlane/plugins/template/.rubocop.yml
@@ -1557,6 +1571,7 @@ files:
1557
1571
  - scan/lib/assets/ScanfileTemplate
1558
1572
  - scan/lib/assets/ScanfileTemplate.swift
1559
1573
  - scan/lib/scan.rb
1574
+ - scan/lib/scan/.test_command_generator.rb.swp
1560
1575
  - scan/lib/scan/commands_generator.rb
1561
1576
  - scan/lib/scan/detect_values.rb
1562
1577
  - scan/lib/scan/error_handler.rb
@@ -1600,6 +1615,7 @@ files:
1600
1615
  - snapshot/lib/assets/SnapshotHelper.swift
1601
1616
  - snapshot/lib/assets/SnapshotHelperXcode8.swift
1602
1617
  - snapshot/lib/snapshot.rb
1618
+ - snapshot/lib/snapshot/.test_command_generator_base.rb.swp
1603
1619
  - snapshot/lib/snapshot/collector.rb
1604
1620
  - snapshot/lib/snapshot/commands_generator.rb
1605
1621
  - snapshot/lib/snapshot/dependency_checker.rb
@@ -1811,7 +1827,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
1811
1827
  requirements:
1812
1828
  - - ">="
1813
1829
  - !ruby/object:Gem::Version
1814
- version: 2.0.0
1830
+ version: '2.4'
1815
1831
  required_rubygems_version: !ruby/object:Gem::Requirement
1816
1832
  requirements:
1817
1833
  - - ">="