fastlane-plugin-appcenter 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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