fastlane-plugin-appcenter 1.5.0 → 1.6.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
  SHA256:
3
- metadata.gz: 39cd3b20f7c98ea0ac0068fdcdb5e8528b763e747efba88d4c6f8da48f902d6d
4
- data.tar.gz: ca7d95d7ed15b4b5aef398dbfc7d83ef318cf7bb976d8551733950b25bf80fec
3
+ metadata.gz: 172c940fc1d03ac4d3951cffc2c0f1c1d1b78ee25967f464d0a1058f12d7c7b9
4
+ data.tar.gz: f6835efe4d035061a6c8834e27c355817061835c9be067fe2090b2ae9dd3b65a
5
5
  SHA512:
6
- metadata.gz: c4f6ae8f7f2b77e0546aa65897362f64959be25b3475c364a85cd3371da31ea3b8b9a8dbc7d77232bdc69172ba34faf61354b5e9b6ea24838e8cab6d14ee418c
7
- data.tar.gz: de52913eb094b8592428f60835691873e5ad306b5885de6a1bf7b048cdbfcddc69067cc60806bf1306bee40ed5b9aba5e1d5911fca3315859a024c5a57d924c8
6
+ metadata.gz: 9060632241323fe3a7cbc412b77cbbe457819277176e06a00fdbf155ef72c01aa19453a626214003b211bee5a9388fd4ce509b97a823489e0d9022674b14e908
7
+ data.tar.gz: 68fce7a6a0755c2fe71363e7f85d1f88d44f3303d7a94876c15d57d810033021ad410461fb399b91fee82aae4710fe1740a033967c2576245495f12360dd2a48
data/README.md CHANGED
@@ -12,6 +12,8 @@ This project is a [_fastlane_](https://github.com/fastlane/fastlane) plugin. To
12
12
  fastlane add_plugin appcenter
13
13
  ```
14
14
 
15
+ fastlane v2.96.0 or higher is required for all plugin-actions to function properly.
16
+
15
17
  ## About App Center
16
18
  With [App Center](https://appcenter.ms) you can continuously build, test, release, and monitor your apps. This plugin provides a set of actions to interact with App Center.
17
19
 
@@ -27,6 +29,7 @@ To get started, first, [obtain an API token](https://appcenter.ms/settings/apito
27
29
  appcenter_fetch_devices(
28
30
  api_token: "<appcenter token>",
29
31
  owner_name: "<appcenter account name of the owner of the app (username or organization URL name)>",
32
+ owner_type: "user", # Default is user - set to organization for appcenter organizations
30
33
  app_name: "<appcenter app name>",
31
34
  destinations: "*", # Default is 'Collaborators', use '*' for all distribution groups
32
35
  devices_file: "devices.txt" # Default. If you customize, the extension must be .txt
@@ -36,7 +39,8 @@ appcenter_fetch_devices(
36
39
  ```ruby
37
40
  appcenter_upload(
38
41
  api_token: "<appcenter token>",
39
- owner_name: "<appcenter owner name of the app (as seen in app URL)>",
42
+ owner_name: "<appcenter account name of the owner of the app (username or organization URL name)>",
43
+ owner_type: "user", # Default is user - set to organization for appcenter organizations
40
44
  app_name: "<appcenter app name (as seen in app URL)>",
41
45
  file: "<path to android build binary>",
42
46
  notify_testers: true # Set to false if you don't want to notify testers of your new release (default: `false`)
@@ -81,15 +85,12 @@ Here is the list of all existing parameters:
81
85
  |-----------------|--------------------|
82
86
  | `api_token` <br/> `APPCENTER_API_TOKEN` | API Token for App Center |
83
87
  | `owner_type` <br/> `APPCENTER_OWNER_TYPE` | Owner type, either 'user' or 'organization' (default: `user`) |
84
- | `owner_name` <br/> `APPCENTER_OWNER_NAME` | Owner name, as found in the App's URL in App Center |
85
- | `app_name` <br/> `APPCENTER_APP_NAME` | App name as found in the App's URL in App Center, if there is no app with such name, you will be prompted to create one |
88
+ | `owner_name` <br/> `APPCENTER_OWNER_NAME` | Owner name as found in the App's URL in App Center |
89
+ | `app_name` <br/> `APPCENTER_APP_NAME` | App name as found in the App's URL in App Center. If there is no app with such name, you will be prompted to create one |
86
90
  | `app_display_name` <br/> `APPCENTER_APP_DISPLAY_NAME` | App display name to use when creating a new app |
87
91
  | `app_os` <br/> `APPCENTER_APP_OS` | App OS. Used for new app creation, if app 'app_name' was not found |
88
92
  | `app_platform` <br/> `APPCENTER_APP_PLATFORM` | App Platform. Used for new app creation, if app 'app_name' was not found |
89
- | `apk` <br/> `APPCENTER_DISTRIBUTE_APK` | Build release path for android build |
90
- | `aab` <br/> `APPCENTER_DISTRIBUTE_AAB` | Build release path for android app bundle build |
91
- | `ipa` <br/> `APPCENTER_DISTRIBUTE_IPA` | Build release path for iOS builds |
92
- | `file` <br/> `APPCENTER_DISTRIBUTE_FILE` | Build release path for generic builds (.aab, .app, .app.zip, .apk, .dmg, .ipa, .pkg) |
93
+ | `file` <br/> `APPCENTER_DISTRIBUTE_FILE` | File path to the release build to publish |
93
94
  | `dsym` <br/> `APPCENTER_DISTRIBUTE_DSYM` | Path to your symbols file. For iOS provide path to app.dSYM.zip |
94
95
  | `upload_dsym_only` <br/> `APPCENTER_DISTRIBUTE_UPLOAD_DSYM_ONLY` | Flag to upload only the dSYM file to App Center (default: `false`) |
95
96
  | `mapping` <br/> `APPCENTER_DISTRIBUTE_ANDROID_MAPPING` | Path to your Android mapping.txt |
@@ -101,10 +102,11 @@ Here is the list of all existing parameters:
101
102
  | `release_notes` <br/> `APPCENTER_DISTRIBUTE_RELEASE_NOTES` | Release notes (default: `No changelog given`) |
102
103
  | `should_clip` <br/> `APPCENTER_DISTRIBUTE_RELEASE_NOTES_CLIPPING` | Clip release notes if its length is more then 5000, true by default (default: `true`) |
103
104
  | `release_notes_link` <br/> `APPCENTER_DISTRIBUTE_RELEASE_NOTES_LINK` | Additional release notes link |
104
- | `build_number` <br/> `APPCENTER_DISTRIBUTE_BUILD_NUMBER` | The build number, required for Android ProGuard mapping files, as well as macOS .pkg and .dmg builds |
105
- | `version` <br/> `APPCENTER_DISTRIBUTE_VERSION` | The build version, required for Android ProGuard mapping files, as well as macOS .pkg and .dmg builds |
105
+ | `build_number` <br/> `APPCENTER_DISTRIBUTE_BUILD_NUMBER` | The build number, required for macOS .pkg and .dmg builds, as well as Android ProGuard `mapping.txt` when using `upload_mapping_only` |
106
+ | `version` <br/> `APPCENTER_DISTRIBUTE_VERSION` | The build version, required for .pkg, .dmg, .zip and .msi builds, as well as Android ProGuard `mapping.txt` when using `upload_mapping_only` |
106
107
  | `timeout` <br/> `APPCENTER_DISTRIBUTE_TIMEOUT` | Request timeout in seconds |
107
- | `dsa_signature` <br/> `APPCENTER_DISTRIBUTE_DSA_SIGNATURE` | DSA signature of the macOS or Windows releases for Sparkle update feed |
108
+ | `dsa_signature` <br/> `APPCENTER_DISTRIBUTE_DSA_SIGNATURE` | DSA signature of the macOS or Windows release for Sparkle update feed |
109
+ | `strict` <br/> `APPCENTER_STRICT_MODE` | Strict mode, set to 'true' to fail early in case a potential error was detected |
108
110
 
109
111
 
110
112
  ## Example
@@ -2,6 +2,18 @@ module Fastlane
2
2
  module Actions
3
3
  module Constants
4
4
  MAX_RELEASE_NOTES_LENGTH = 5000
5
+ SUPPORTED_EXTENSIONS = {
6
+ android: %w(.aab .apk),
7
+ ios: %w(.ipa),
8
+ mac: %w(.app .app.zip .dmg .pkg),
9
+ windows: %w(.appx .appxbundle .appxupload .msix .msixbundle .msixupload .zip .msi),
10
+ custom: %w(.zip)
11
+ }
12
+ ALL_SUPPORTED_EXTENSIONS = SUPPORTED_EXTENSIONS.values.flatten.sort!.uniq!
13
+ STORE_ONLY_EXTENSIONS = %w(.aab)
14
+ STORE_SUPPORTED_EXTENSIONS = %w(.aab .apk .ipa)
15
+ VERSION_REQUIRED_EXTENSIONS = %w(.msi .zip)
16
+ FULL_VERSION_REQUIRED_EXTENSIONS = %w(.dmg .pkg)
5
17
  end
6
18
 
7
19
  module SharedValues
@@ -64,7 +76,6 @@ module Fastlane
64
76
  end
65
77
 
66
78
  def self.run_mapping_upload(params)
67
- values = params.values
68
79
  api_token = params[:api_token]
69
80
  owner_name = params[:owner_name]
70
81
  app_name = params[:app_name]
@@ -131,29 +142,35 @@ module Fastlane
131
142
 
132
143
  file_ext = Helper::AppcenterHelper.file_extname_full(file)
133
144
  if destination_type == "group"
134
- UI.user_error!("Can't distribute #{file_ext} to groups, please use `destination_type: 'store'`") if %w(.aab).include? file_ext
145
+ self.optional_error("Can't distribute #{file_ext} to groups, please use `destination_type: 'store'`") if Constants::STORE_ONLY_EXTENSIONS.include? file_ext
135
146
  else
136
- UI.user_error!("Can't distribute #{file_ext} to stores, please use `destination_type: 'group'`") if %w(.app .app.zip .dmg .pkg).include? file_ext
147
+ self.optional_error("Can't distribute #{file_ext} to stores, please use `destination_type: 'group'`") unless Constants::STORE_SUPPORTED_EXTENSIONS.include? file_ext
137
148
  end
138
149
 
150
+ release_upload_body = nil
139
151
  unless params[:file].to_s.empty?
140
- if %w[.dmg .pkg].include? file_ext
141
- UI.user_error!("Fields `version` and `build_number` must be specified to upload a #{file_ext} file") if build_number.to_s.empty? || version.to_s.empty?
142
- release_upload_body = { build_version: version, build_number: build_number }
152
+ if Constants::FULL_VERSION_REQUIRED_EXTENSIONS.include? file_ext
153
+ self.optional_error("Fields `version` and `build_number` must be specified to upload a #{file_ext} file") if build_number.to_s.empty? || version.to_s.empty?
154
+ elsif Constants::VERSION_REQUIRED_EXTENSIONS.include? file_ext
155
+ self.optional_error("Field `version` must be specified to upload a #{file_ext} file") if version.to_s.empty?
143
156
  else
144
- UI.message("Fields `version` and `build_number` are not required for files of type #{file_ext}, ignored") unless build_number.to_s.empty? && version.to_s.empty?
157
+ self.optional_error("Fields `version` and `build_number` are not supported for files of type #{file_ext}") unless build_number.to_s.empty? && version.to_s.empty?
145
158
  end
159
+
160
+ release_upload_body = { build_version: version } unless version.nil?
161
+ release_upload_body = { build_version: version, build_number: build_number } if !version.nil? && !build_number.nil?
146
162
  end
147
163
 
148
164
  if file_ext == ".app" && File.directory?(file)
149
165
  UI.message("App path is a directory, zipping it before upload")
150
166
  zip_file = file + ".zip"
151
- if File.exists? zip_file
167
+ if File.exist? zip_file
152
168
  override = UI.interactive? ? UI.confirm("File '#{zip_file}' already exists, do you want to override it?") : true
153
169
  UI.abort_with_message!("Not overriding, aborting publishing operation") unless override
154
- UI.message("Deleting zip file: #{zip_file}")
170
+ UI.message("Deleting zip archive: #{zip_file}")
155
171
  File.delete zip_file
156
172
  end
173
+ UI.message("Creating zip archive: #{zip_file}")
157
174
  file = Actions::ZipAction.run(path: file, output_path: zip_file)
158
175
  end
159
176
 
@@ -171,7 +188,7 @@ module Fastlane
171
188
  release_url = Helper::AppcenterHelper.get_release_url(owner_type, owner_name, app_name, release_id)
172
189
  UI.message("Release '#{release_id}' committed: #{release_url}")
173
190
 
174
- Helper::AppcenterHelper.update_release(api_token, owner_name, app_name, release_id, release_notes)
191
+ release = Helper::AppcenterHelper.update_release(api_token, owner_name, app_name, release_id, release_notes)
175
192
  Helper::AppcenterHelper.update_release_metadata(api_token, owner_name, app_name, release_id, dsa_signature)
176
193
 
177
194
  destinations_array = destinations.split(',')
@@ -196,6 +213,8 @@ module Fastlane
196
213
  UI.user_error!("Failed to upload release")
197
214
  end
198
215
  end
216
+
217
+ release
199
218
  end
200
219
 
201
220
  # checks app existance, if ther is no such - creates it
@@ -240,9 +259,14 @@ module Fastlane
240
259
  upload_dsym_only = params[:upload_dsym_only]
241
260
  upload_mapping_only = params[:upload_mapping_only]
242
261
 
262
+ Options.strict_mode(params[:strict])
263
+
243
264
  # if app found or successfully created
244
265
  if self.get_or_create_app(params)
245
- self.run_release_upload(params) unless upload_dsym_only || upload_mapping_only
266
+ release = self.run_release_upload(params) unless upload_dsym_only || upload_mapping_only
267
+ params[:version] = release['short_version'] if release
268
+ params[:build_number] = release['version'] if release
269
+
246
270
  self.run_dsym_upload(params) unless upload_mapping_only
247
271
  self.run_mapping_upload(params) unless upload_dsym_only
248
272
  end
@@ -282,7 +306,7 @@ module Fastlane
282
306
  type: String,
283
307
  verify_block: proc do |value|
284
308
  accepted_formats = ["user", "organization"]
285
- UI.user_error!("Only \"user\" and \"organization\" types are allowed, you provided \"#{File.extname(value)}\"") unless accepted_formats.include? value
309
+ UI.user_error!("Only \"user\" and \"organization\" types are allowed, you provided \"#{value}\"") unless accepted_formats.include? value
286
310
  end),
287
311
 
288
312
  FastlaneCore::ConfigItem.new(key: :owner_name,
@@ -328,6 +352,7 @@ module Fastlane
328
352
  description: "Build release path for android build",
329
353
  default_value: Actions.lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH],
330
354
  optional: true,
355
+ deprecated: true,
331
356
  type: String,
332
357
  conflicting_options: [:ipa, :aab, :file],
333
358
  conflict_block: proc do |value|
@@ -336,7 +361,7 @@ module Fastlane
336
361
  verify_block: proc do |value|
337
362
  accepted_formats = [".apk"]
338
363
  file_extname_full = Helper::AppcenterHelper.file_extname_full(value)
339
- UI.user_error!("Only \".apk\" formats are allowed, you provided \"#{file_extname_full}\"") unless accepted_formats.include? file_extname_full
364
+ self.optional_error("Only \".apk\" formats are allowed, you provided \"#{file_extname_full}\"") unless accepted_formats.include? file_extname_full
340
365
  end),
341
366
 
342
367
  FastlaneCore::ConfigItem.new(key: :aab,
@@ -344,6 +369,7 @@ module Fastlane
344
369
  description: "Build release path for android app bundle build",
345
370
  default_value: Actions.lane_context[SharedValues::GRADLE_AAB_OUTPUT_PATH],
346
371
  optional: true,
372
+ deprecated: true,
347
373
  type: String,
348
374
  conflicting_options: [:ipa, :apk, :file],
349
375
  conflict_block: proc do |value|
@@ -351,7 +377,7 @@ module Fastlane
351
377
  end,
352
378
  verify_block: proc do |value|
353
379
  accepted_formats = [".aab"]
354
- UI.user_error!("Only \".aab\" formats are allowed, you provided \"#{File.extname(value)}\"") unless accepted_formats.include? File.extname(value)
380
+ self.optional_error("Only \".aab\" formats are allowed, you provided \"#{File.extname(value)}\"") unless accepted_formats.include? File.extname(value)
355
381
  end),
356
382
 
357
383
  FastlaneCore::ConfigItem.new(key: :ipa,
@@ -359,6 +385,7 @@ module Fastlane
359
385
  description: "Build release path for iOS builds",
360
386
  default_value: Actions.lane_context[SharedValues::IPA_OUTPUT_PATH],
361
387
  optional: true,
388
+ deprecated: true,
362
389
  type: String,
363
390
  conflicting_options: [:apk, :aab, :file],
364
391
  conflict_block: proc do |value|
@@ -366,12 +393,12 @@ module Fastlane
366
393
  end,
367
394
  verify_block: proc do |value|
368
395
  accepted_formats = [".ipa"]
369
- UI.user_error!("Only \".ipa\" formats are allowed, you provided \"#{File.extname(value)}\"") unless accepted_formats.include? File.extname(value)
396
+ self.optional_error("Only \".ipa\" formats are allowed, you provided \"#{File.extname(value)}\"") unless accepted_formats.include? File.extname(value)
370
397
  end),
371
398
 
372
399
  FastlaneCore::ConfigItem.new(key: :file,
373
400
  env_name: "APPCENTER_DISTRIBUTE_FILE",
374
- description: "Build release path for generic builds (.aab, .app, .app.zip, .apk, .dmg, .ipa, .pkg)",
401
+ description: "File path to the release build to publish",
375
402
  optional: true,
376
403
  type: String,
377
404
  conflicting_options: [:apk, :aab, :ipa],
@@ -379,9 +406,14 @@ module Fastlane
379
406
  UI.user_error!("You can't use 'file' and '#{value.key}' options in one run")
380
407
  end,
381
408
  verify_block: proc do |value|
382
- accepted_formats = %w(.aab .app .app.zip .apk .dmg .ipa .pkg)
409
+ platform = Actions.lane_context[SharedValues::PLATFORM_NAME]
410
+ accepted_formats = Constants::SUPPORTED_EXTENSIONS[platform.to_sym] if platform
411
+ unless accepted_formats
412
+ UI.important("Unknown platform '#{platform}', consider using one of: #{Constants::SUPPORTED_EXTENSIONS.keys}")
413
+ accepted_formats = Constants::ALL_SUPPORTED_EXTENSIONS
414
+ end
383
415
  file_ext = Helper::AppcenterHelper.file_extname_full(value)
384
- UI.user_error!("Only #{accepted_formats.to_s} formats are allowed, you provided \"#{file_ext}\"") unless accepted_formats.include? file_ext
416
+ self.optional_error("Extension not supported: '#{file_ext}'. Supported formats for platform '#{platform}': #{accepted_formats.join ' '}") unless accepted_formats.include? file_ext
385
417
  end),
386
418
 
387
419
  FastlaneCore::ConfigItem.new(key: :dsym,
@@ -489,13 +521,13 @@ module Fastlane
489
521
 
490
522
  FastlaneCore::ConfigItem.new(key: :build_number,
491
523
  env_name: "APPCENTER_DISTRIBUTE_BUILD_NUMBER",
492
- description: "The build number, required for Android ProGuard mapping files, as well as macOS .pkg and .dmg builds",
524
+ description: "The build number, required for macOS .pkg and .dmg builds, as well as Android ProGuard `mapping.txt` when using `upload_mapping_only`",
493
525
  optional: true,
494
526
  type: String),
495
527
 
496
528
  FastlaneCore::ConfigItem.new(key: :version,
497
529
  env_name: "APPCENTER_DISTRIBUTE_VERSION",
498
- description: "The build version, required for Android ProGuard mapping files, as well as macOS .pkg and .dmg builds",
530
+ description: "The build version, required for .pkg, .dmg, .zip and .msi builds, as well as Android ProGuard `mapping.txt` when using `upload_mapping_only`",
499
531
  optional: true,
500
532
  type: String),
501
533
 
@@ -507,7 +539,13 @@ module Fastlane
507
539
 
508
540
  FastlaneCore::ConfigItem.new(key: :dsa_signature,
509
541
  env_name: "APPCENTER_DISTRIBUTE_DSA_SIGNATURE",
510
- description: "DSA signature of the macOS or Windows releases for Sparkle update feed",
542
+ description: "DSA signature of the macOS or Windows release for Sparkle update feed",
543
+ optional: true,
544
+ type: String),
545
+
546
+ FastlaneCore::ConfigItem.new(key: :strict,
547
+ env_name: "APPCENTER_STRICT_MODE",
548
+ description: "Strict mode, set to 'true' to fail early in case a potential error was detected",
511
549
  optional: true,
512
550
  type: String)
513
551
  ]
@@ -521,6 +559,8 @@ module Fastlane
521
559
  end
522
560
 
523
561
  def self.is_supported?(platform)
562
+ return Constants::SUPPORTED_EXTENSIONS.keys.include?(platform) if Options.strict
563
+
524
564
  true
525
565
  end
526
566
 
@@ -529,12 +569,10 @@ module Fastlane
529
569
  'appcenter_upload(
530
570
  api_token: "...",
531
571
  owner_name: "appcenter_owner",
532
- app_name: "testing_app",
533
- apk: "./app-release.apk",
572
+ app_name: "testing_android_app",
573
+ file: "./app-release.apk",
534
574
  destinations: "Testers",
535
575
  destination_type: "group",
536
- build_number: "3",
537
- version: "1.0.0",
538
576
  mapping: "./mapping.txt",
539
577
  release_notes: "release notes",
540
578
  notify_testers: false
@@ -542,9 +580,9 @@ module Fastlane
542
580
  'appcenter_upload(
543
581
  api_token: "...",
544
582
  owner_name: "appcenter_owner",
545
- app_name: "testing_app",
546
- apk: "./app-release.ipa",
547
- destinations: "Testers,Alpha",
583
+ app_name: "testing_ios_app",
584
+ file: "./app-release.ipa",
585
+ destinations: "Testers,Public",
548
586
  destination_type: "group",
549
587
  dsym: "./app.dSYM.zip",
550
588
  release_notes: "release notes",
@@ -553,18 +591,36 @@ module Fastlane
553
591
  'appcenter_upload(
554
592
  api_token: "...",
555
593
  owner_name: "appcenter_owner",
556
- app_name: "testing_app",
557
- aab: "./app.aab",
594
+ app_name: "testing_google_play_app",
595
+ file: "./app.aab",
558
596
  destinations: "Alpha",
559
597
  destination_type: "store",
560
- build_number: "3",
561
- version: "1.0.0",
562
- mapping: "./mapping.txt",
563
- release_notes: "release notes",
564
- notify_testers: false
598
+ release_notes: "this is a store release"
565
599
  )'
566
600
  ]
567
601
  end
602
+
603
+ class Options
604
+ include Singleton
605
+
606
+ def self.strict_mode(mode)
607
+ @strict = mode.to_s == "true"
608
+ UI.message("Enabled strict mode") if @strict
609
+ end
610
+
611
+ def self.strict
612
+ @strict
613
+ end
614
+ end
615
+
616
+ def self.optional_error(message)
617
+ if Options.strict
618
+ UI.user_error!(message)
619
+ else
620
+ UI.important(message)
621
+ UI.important("The current operation might fail, trying anyway...")
622
+ end
623
+ end
568
624
  end
569
625
  end
570
626
  end
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
2
  module Appcenter
3
- VERSION = "1.5.0"
3
+ VERSION = "1.6.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane-plugin-appcenter
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Microsoft Corporation
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-10-14 00:00:00.000000000 Z
11
+ date: 2019-11-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 2.29.0
33
+ version: 2.96.0
34
34
  type: :development
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: 2.29.0
40
+ version: 2.96.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: pry
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec_junit_formatter
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: rubocop
85
99
  requirement: !ruby/object:Gem::Requirement