fastlane-plugin-firebase_app_distribution 0.9.1 → 0.10.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: b432a12336537ce51caa06e26321f2047cc7d7c8ebe1c4abfe94a105b201e4ba
4
- data.tar.gz: 1c50c9c30886b1d8f5435a7d85d081a0f2e6e0ecd837ca877ed2d51511eabecf
3
+ metadata.gz: 2b85c6c60b76c751c0f4f5ca2611bd6735b5540b1525e600dad266b354bcc2e7
4
+ data.tar.gz: dbee1fc079ed0d7c8f1b50aec4cc22339e7046cf97b100576564797afa440e48
5
5
  SHA512:
6
- metadata.gz: d296fa3989b9d3788b8322d21fed387e908c02c27157f3affe1dab72c0a19035ed871ea63be642c312cb7f0f636130406f161d629e2abd23da99aa98eab11f4a
7
- data.tar.gz: 07b723bf3cf631e1dfc8402c890be0a78753d6d57e178c68f8c66b950727e0157d9573151ee08badf851f6a55c7f9a7b1965846bed4f5589969247614dc75cbd
6
+ metadata.gz: 5fd6c96184db82f9d38dc5495b2c8adcd9b42326f45420afcf50b9db66064dd7c07228d694d349b0c1ee3e82782cc8fe76ec5e0889841574f3c12ecaeff89362
7
+ data.tar.gz: 3f5e0aafc6c0b09ae3722f7fd65522009470c70cad2bd115fd061f2c38a63522eec6b77aa036df9e21cc30b6704134fe593ec132dee5026e65a50d29366f4d91
@@ -1,8 +1,9 @@
1
1
  require 'fastlane/action'
2
+ require 'fastlane_core'
2
3
  require 'open3'
3
4
  require 'shellwords'
4
5
  require 'googleauth'
5
- require 'google/apis/firebaseappdistribution_v1'
6
+ require_relative '../helper/firebase_app_distribution_apis'
6
7
  require_relative '../helper/firebase_app_distribution_helper'
7
8
  require_relative '../helper/firebase_app_distribution_error_message'
8
9
  require_relative '../helper/firebase_app_distribution_auth_client'
@@ -34,8 +35,8 @@ module Fastlane
34
35
  timeout = get_upload_timeout(params)
35
36
 
36
37
  binary_path = get_binary_path(platform, params)
37
- UI.user_error!("Couldn't find binary.") if binary_path.nil?
38
- UI.user_error!("Couldn't find binary at path #{binary_path}.") unless File.exist?(binary_path)
38
+ UI.user_error!("Couldn't determine path for #{platform} binary.") if binary_path.nil?
39
+ UI.user_error!("Couldn't find #{platform} binary at path #{binary_path}.") unless File.exist?(binary_path)
39
40
  binary_type = binary_type_from_path(binary_path)
40
41
 
41
42
  # TODO(lkellogg): This sets the send timeout for all POST requests made by the client, but
@@ -56,7 +57,7 @@ module Fastlane
56
57
 
57
58
  binary_type = binary_type_from_path(binary_path)
58
59
  UI.message("📡 Uploading the #{binary_type}.")
59
- operation = upload_binary(app_name, binary_path, client, timeout)
60
+ operation = upload_binary(client, app_name, binary_path, binary_type, timeout)
60
61
  UI.message("🕵️ Validating upload…")
61
62
  release = poll_upload_release_operation(client, operation, binary_type)
62
63
 
@@ -87,11 +88,12 @@ module Fastlane
87
88
  test_devices =
88
89
  get_value_from_value_or_file(params[:test_devices], params[:test_devices_file])
89
90
  if present?(test_devices)
90
- UI.message("🤖 Starting automated tests. Note: This feature is in beta.")
91
+ test_cases =
92
+ string_to_array(get_value_from_value_or_file(params[:test_case_ids], params[:test_case_ids_file]))&.map { |id| "#{app_name}/testCases/#{id}" }
91
93
  test_password = test_password_from_params(params)
92
- release_test = test_release(alpha_client, release, test_devices, params[:test_username], test_password, params[:test_username_resource], params[:test_password_resource])
94
+ release_tests = test_release(alpha_client, release, test_devices, test_cases, params[:test_username], test_password, params[:test_username_resource], params[:test_password_resource])
93
95
  unless params[:test_non_blocking]
94
- poll_test_finished(alpha_client, release_test.name)
96
+ poll_test_finished(alpha_client, release_tests)
95
97
  end
96
98
  end
97
99
 
@@ -158,11 +160,14 @@ module Fastlane
158
160
  # the same lane
159
161
  return nil if lane_platform == :android
160
162
 
163
+ # rubocop:disable Require/MissingRequireStatement
161
164
  Actions.lane_context[SharedValues::XCODEBUILD_ARCHIVE]
165
+ # rubocop:enable Require/MissingRequireStatement
162
166
  end
163
167
 
164
168
  def self.lane_platform
165
- Actions.lane_context[Actions::SharedValues::PLATFORM_NAME]
169
+ # to_sym shouldn't be necessary, but possibly fixes #376
170
+ Actions.lane_context[Actions::SharedValues::PLATFORM_NAME]&.to_sym
166
171
  end
167
172
 
168
173
  def self.platform_from_app_id(app_id)
@@ -173,6 +178,7 @@ module Fastlane
173
178
  end
174
179
  end
175
180
 
181
+ # rubocop:disable Require/MissingRequireStatement
176
182
  def self.get_binary_path(platform, params)
177
183
  if platform == :ios
178
184
  return params[:ipa_path] ||
@@ -193,7 +199,11 @@ module Fastlane
193
199
  Dir["*.apk"].last ||
194
200
  Dir[File.join("app", "build", "outputs", "apk", "release", "app-release.apk")].last
195
201
  end
202
+
203
+ UI.error("Unable to determine binary path for unsupported platform #{platform}.")
204
+ nil
196
205
  end
206
+ # rubocop:enable Require/MissingRequireStatement
197
207
 
198
208
  def self.get_upload_timeout(params)
199
209
  if params[:upload_timeout]
@@ -232,7 +242,9 @@ module Fastlane
232
242
  def self.release_notes(params)
233
243
  release_notes_param =
234
244
  get_value_from_value_or_file(params[:release_notes], params[:release_notes_file])
245
+ # rubocop:disable Require/MissingRequireStatement
235
246
  release_notes_param || Actions.lane_context[SharedValues::FL_CHANGELOG]
247
+ # rubocop:enable Require/MissingRequireStatement
236
248
  end
237
249
 
238
250
  def self.poll_upload_release_operation(client, operation, binary_type)
@@ -268,7 +280,7 @@ module Fastlane
268
280
  extract_release(operation)
269
281
  end
270
282
 
271
- def self.upload_binary(app_name, binary_path, client, timeout)
283
+ def self.upload_binary(client, app_name, binary_path, binary_type, timeout)
272
284
  options = Google::Apis::RequestOptions.new
273
285
  options.max_elapsed_time = timeout # includes retries (default = no retries)
274
286
  options.header = {
@@ -282,12 +294,21 @@ module Fastlane
282
294
  # standard http call instead and convert it to a long running object
283
295
  # https://github.com/googleapis/google-api-ruby-client/blob/main/generated/google-apis-firebaseappdistribution_v1/lib/google/apis/firebaseappdistribution_v1/service.rb#L79
284
296
  # TODO(kbolay): Prefer client.upload_medium
285
- response = client.http(
286
- :post,
287
- "https://firebaseappdistribution.googleapis.com/upload/v1/#{app_name}/releases:upload",
288
- body: File.open(binary_path, 'rb'),
289
- options: options
290
- )
297
+ response = begin
298
+ client.http(
299
+ :post,
300
+ "https://firebaseappdistribution.googleapis.com/upload/v1/#{app_name}/releases:upload",
301
+ body: File.open(binary_path, 'rb'),
302
+ options: options
303
+ )
304
+ rescue Google::Apis::Error => err
305
+ case err.status_code.to_i
306
+ when 403
307
+ UI.crash!(ErrorMessage::PERMISSION_DENIED_ERROR)
308
+ else
309
+ UI.crash!("#{ErrorMessage.upload_binary_error(binary_type)} (#{err}, status_code: #{err.status_code})")
310
+ end
311
+ end
291
312
 
292
313
  Google::Apis::FirebaseappdistributionV1::GoogleLongrunningOperation.from_json(response)
293
314
  end
@@ -339,7 +360,10 @@ module Fastlane
339
360
  end
340
361
  end
341
362
 
342
- def self.test_release(alpha_client, release, test_devices, username = nil, password = nil, username_resource = nil, password_resource = nil)
363
+ def self.test_release(alpha_client, release, test_devices, test_cases, username = nil, password = nil, username_resource = nil, password_resource = nil)
364
+ if present?(test_cases) && (!username_resource.nil? || !password_resource.nil?)
365
+ UI.user_error!("Password and username resource names are not supported for the testing agent.")
366
+ end
343
367
  if username_resource.nil? ^ password_resource.nil?
344
368
  UI.user_error!("Username and password resource names for automated tests need to be specified together.")
345
369
  end
@@ -369,7 +393,7 @@ module Fastlane
369
393
  end
370
394
  end
371
395
 
372
- device_executions = string_to_array(test_devices, ';').map do |td_string|
396
+ device_executions = string_to_array(test_devices, /[;\n]/).map do |td_string|
373
397
  td_hash = parse_test_device_string(td_string)
374
398
  Google::Apis::FirebaseappdistributionV1alpha::GoogleFirebaseAppdistroV1alphaDeviceExecution.new(
375
399
  device: Google::Apis::FirebaseappdistributionV1alpha::GoogleFirebaseAppdistroV1alphaTestDevice.new(
@@ -381,37 +405,64 @@ module Fastlane
381
405
  )
382
406
  end
383
407
 
408
+ UI.message("🤖 Starting automated tests. Note: This feature is in beta.")
409
+ release_tests = []
410
+ if present?(test_cases)
411
+ test_cases.each do |tc|
412
+ release_tests.push(create_release_test(alpha_client, release.name, device_executions, login_credential, tc))
413
+ end
414
+ else
415
+ release_tests.push(create_release_test(alpha_client, release.name, device_executions, login_credential))
416
+ end
417
+ release_tests
418
+ end
419
+
420
+ def self.create_release_test(alpha_client, release_name, device_executions, login_credential, test_case_name = nil)
384
421
  release_test =
385
422
  Google::Apis::FirebaseappdistributionV1alpha::GoogleFirebaseAppdistroV1alphaReleaseTest.new(
423
+ device_executions: device_executions,
386
424
  login_credential: login_credential,
387
- device_executions: device_executions
425
+ test_case: test_case_name
388
426
  )
389
- alpha_client.create_project_app_release_test(release.name, release_test)
427
+ alpha_client.create_project_app_release_test(release_name, release_test)
390
428
  rescue Google::Apis::Error => err
391
- UI.crash!(err)
429
+ case err.status_code.to_i
430
+ when 404
431
+ UI.user_error!("Test Case #{test_case_name} not found")
432
+ else
433
+ UI.crash!(err)
434
+ end
392
435
  end
393
436
 
394
- def self.poll_test_finished(alpha_client, release_test_name)
437
+ def self.poll_test_finished(alpha_client, release_tests)
438
+ release_test_names = release_tests.map(&:name)
395
439
  TEST_MAX_POLLING_RETRIES.times do
396
- UI.message("⏳ The automated test results are pending.")
440
+ UI.message("⏳ #{release_test_names.size} automated test results are pending.")
397
441
  sleep(TEST_POLLING_INTERVAL_SECONDS)
398
- release_test = alpha_client.get_project_app_release_test(release_test_name)
399
- if release_test.device_executions.all? { |e| e.state == 'PASSED' }
400
- UI.success("✅ Passed automated test(s).")
401
- return
402
- end
403
- release_test.device_executions.each do |de|
404
- case de.state
405
- when 'PASSED', 'IN_PROGRESS'
406
- next
407
- when 'FAILED'
408
- UI.test_failure!("Automated test failed for #{device_to_s(de.device)}: #{de.failed_reason}.")
409
- when 'INCONCLUSIVE'
410
- UI.test_failure!("Automated test inconclusive for #{device_to_s(de.device)}: #{de.inconclusive_reason}.")
442
+ release_test_names.delete_if do |release_test_name|
443
+ release_test = alpha_client.get_project_app_release_test(release_test_name)
444
+ if release_test.device_executions.all? { |e| e.state == 'PASSED' }
445
+ true
411
446
  else
412
- UI.test_failure!("Unsupported automated test state for #{device_to_s(de.device)}: #{de.state}.")
447
+ release_test.device_executions.each do |de|
448
+ case de.state
449
+ when 'PASSED', 'IN_PROGRESS'
450
+ next
451
+ when 'FAILED'
452
+ UI.test_failure!("Automated test failed for #{device_to_s(de.device)}: #{de.failed_reason}.")
453
+ when 'INCONCLUSIVE'
454
+ UI.test_failure!("Automated test inconclusive for #{device_to_s(de.device)}: #{de.inconclusive_reason}.")
455
+ else
456
+ UI.test_failure!("Unsupported automated test state for #{device_to_s(de.device)}: #{de.state}.")
457
+ end
458
+ end
459
+ false
413
460
  end
414
461
  end
462
+ if release_test_names.empty?
463
+ UI.success("✅ Passed automated test(s).")
464
+ return
465
+ end
415
466
  end
416
467
  UI.test_failure!("It took longer than expected to process your test, please try again.")
417
468
  end
@@ -493,7 +544,7 @@ module Fastlane
493
544
  type: String),
494
545
  FastlaneCore::ConfigItem.new(key: :groups_file,
495
546
  env_name: "FIREBASEAPPDISTRO_GROUPS_FILE",
496
- description: "Path to file containing group aliases used for distribution, separated by commas",
547
+ description: "Path to file containing group aliases used for distribution, separated by commas or newlines",
497
548
  optional: true,
498
549
  type: String),
499
550
  FastlaneCore::ConfigItem.new(key: :testers,
@@ -503,7 +554,7 @@ module Fastlane
503
554
  type: String),
504
555
  FastlaneCore::ConfigItem.new(key: :testers_file,
505
556
  env_name: "FIREBASEAPPDISTRO_TESTERS_FILE",
506
- description: "Path to file containing email addresses of testers, separated by commas",
557
+ description: "Path to file containing email addresses of testers, separated by commas or newlines",
507
558
  optional: true,
508
559
  type: String),
509
560
  FastlaneCore::ConfigItem.new(key: :release_notes,
@@ -520,12 +571,13 @@ module Fastlane
520
571
  # Release Testing
521
572
  FastlaneCore::ConfigItem.new(key: :test_devices,
522
573
  env_name: "FIREBASEAPPDISTRO_TEST_DEVICES",
523
- description: "List of devices to run automated tests on, in the format 'model=<model-id>,version=<os-version-id>,locale=<locale>,orientation=<orientation>;model=<model-id>,...'. Run 'gcloud firebase test android|ios models list' to see available devices. Note: This feature is in beta",
574
+ description: "List of devices (separated by semicolons) to run automated tests on, in the format 'model=<model-id>,version=<os-version-id>,locale=<locale>,orientation=<orientation>;model=<model-id>,...'. Run 'gcloud firebase test android|ios models list' to see available devices. Note: This feature is in beta",
524
575
  optional: true,
525
576
  type: String),
526
577
  FastlaneCore::ConfigItem.new(key: :test_devices_file,
527
578
  env_name: "FIREBASEAPPDISTRO_TEST_DEVICES_FILE",
528
- description: "Path to file containing a list of devices to run automated tests on, in the format 'model=<model-id>,version=<os-version-id>,locale=<locale>,orientation=<orientation>;model=<model-id>,...'. Run 'gcloud firebase test android|ios models list' to see available devices. Note: This feature is in beta",
579
+ description: "Path to file containing a list of devices (sepatated by semicolons or newlines) to run automated tests on, in the format 'model=<model-id>,version=<os-version-id>,locale=<locale>,orientation=<orientation>;model=<model-id>,...'. " \
580
+ "Run 'gcloud firebase test android|ios models list' to see available devices. Note: This feature is in beta",
529
581
  optional: true,
530
582
  type: String),
531
583
  FastlaneCore::ConfigItem.new(key: :test_username,
@@ -559,6 +611,16 @@ module Fastlane
559
611
  optional: false,
560
612
  default_value: false,
561
613
  type: Boolean),
614
+ FastlaneCore::ConfigItem.new(key: :test_case_ids,
615
+ env_name: "FIREBASEAPPDISTRO_TEST_CASE_IDS",
616
+ description: "Test Case IDs, separated by commas. Note: This feature is in beta",
617
+ optional: true,
618
+ type: String),
619
+ FastlaneCore::ConfigItem.new(key: :test_case_ids_file,
620
+ env_name: "FIREBASEAPPDISTRO_TEST_CASE_IDS_FILE",
621
+ description: "Path to file with containing Test Case IDs, separated by commas or newlines. Note: This feature is in beta",
622
+ optional: true,
623
+ type: String),
562
624
 
563
625
  # Auth
564
626
  FastlaneCore::ConfigItem.new(key: :firebase_cli_token,
@@ -577,11 +639,7 @@ module Fastlane
577
639
  end
578
640
 
579
641
  def self.is_supported?(platform)
580
- # Adjust this if your plugin only works for a particular platform (iOS vs. Android, for example)
581
- # See: https://docs.fastlane.tools/advanced/#control-configuration-by-lane-and-by-platform
582
- #
583
- # [:ios, :mac, :android].include?(platform)
584
- true
642
+ [:ios, :android].include?(platform)
585
643
  end
586
644
 
587
645
  def self.example_code
@@ -1,7 +1,9 @@
1
1
  require 'fastlane/action'
2
+ require 'fastlane_core'
2
3
  require 'fastlane_core/ui/ui'
3
- require 'google/apis/firebaseappdistribution_v1'
4
+ require_relative '../helper/firebase_app_distribution_apis'
4
5
  require_relative '../helper/firebase_app_distribution_helper'
6
+ require_relative '../helper/firebase_app_distribution_error_message'
5
7
  require_relative '../helper/firebase_app_distribution_auth_client'
6
8
 
7
9
  module Fastlane
@@ -1,7 +1,9 @@
1
1
  require 'fastlane/action'
2
+ require 'fastlane_core'
2
3
  require 'fastlane_core/ui/ui'
3
- require 'google/apis/firebaseappdistribution_v1'
4
+ require_relative '../helper/firebase_app_distribution_apis'
4
5
  require_relative '../helper/firebase_app_distribution_helper'
6
+ require_relative '../helper/firebase_app_distribution_error_message'
5
7
  require_relative '../helper/firebase_app_distribution_auth_client'
6
8
 
7
9
  module Fastlane
@@ -1,7 +1,9 @@
1
1
  require 'fastlane/action'
2
+ require 'fastlane_core'
2
3
  require 'fastlane_core/ui/ui'
3
- require 'google/apis/firebaseappdistribution_v1'
4
+ require_relative '../helper/firebase_app_distribution_apis'
4
5
  require_relative '../helper/firebase_app_distribution_helper'
6
+ require_relative '../helper/firebase_app_distribution_error_message'
5
7
  require_relative '../helper/firebase_app_distribution_auth_client'
6
8
 
7
9
  module Fastlane
@@ -1,6 +1,8 @@
1
1
  require 'fastlane/action'
2
- require 'google/apis/firebaseappdistribution_v1'
2
+ require 'fastlane_core'
3
+ require_relative '../helper/firebase_app_distribution_apis'
3
4
  require_relative '../helper/firebase_app_distribution_auth_client'
5
+ require_relative '../helper/firebase_app_distribution_error_message'
4
6
  require_relative '../helper/firebase_app_distribution_helper'
5
7
 
6
8
  module Fastlane
@@ -1,8 +1,9 @@
1
1
  require 'fastlane/action'
2
+ require 'fastlane_core'
2
3
  require 'open3'
3
4
  require 'shellwords'
4
5
  require 'googleauth'
5
- require 'google/apis/firebaseappdistribution_v1alpha'
6
+ require_relative '../helper/firebase_app_distribution_apis'
6
7
  require_relative '../helper/firebase_app_distribution_helper'
7
8
  require_relative '../helper/firebase_app_distribution_error_message'
8
9
  require_relative '../helper/firebase_app_distribution_auth_client'
@@ -1,7 +1,9 @@
1
1
  require 'fastlane/action'
2
+ require 'fastlane_core'
2
3
  require 'fastlane_core/ui/ui'
3
- require 'google/apis/firebaseappdistribution_v1'
4
+ require_relative '../helper/firebase_app_distribution_apis'
4
5
  require_relative '../helper/firebase_app_distribution_helper'
6
+ require_relative '../helper/firebase_app_distribution_error_message'
5
7
  require_relative '../helper/firebase_app_distribution_auth_client'
6
8
 
7
9
  module Fastlane
@@ -0,0 +1,48 @@
1
+ require 'google/apis/firebaseappdistribution_v1'
2
+ require 'google/apis/firebaseappdistribution_v1alpha'
3
+
4
+ # This is partially copied from google/apis/firebaseappdistribution_v1alpha v0.9.0 (2024-12-08) based discovery document revision 20241204.
5
+ # We can't depend on that version directly as long as fastlane locks google-cloud-env < 2.0.0 (to support Ruby 2.6).
6
+ # Newer versions of the API clients depend on google-apis-core >= 0.15.0 which depends on googleauth ~> 1.9 which depends on google-cloud-env ~> 2.1.
7
+ # See also https://github.com/fastlane/fastlane/pull/21685#pullrequestreview-2490037163
8
+ module Google
9
+ module Apis
10
+ module FirebaseappdistributionV1alpha
11
+ class GoogleFirebaseAppdistroV1alphaReleaseTest
12
+ include Google::Apis::Core::Hashable
13
+
14
+ attr_accessor :create_time
15
+ attr_accessor :device_executions
16
+ attr_accessor :display_name
17
+ attr_accessor :login_credential
18
+ attr_accessor :name
19
+ attr_accessor :test_case
20
+ attr_accessor :test_state
21
+
22
+ def initialize(**args)
23
+ update!(**args)
24
+ end
25
+
26
+ def update!(**args)
27
+ @create_time = args[:create_time] if args.key?(:create_time)
28
+ @device_executions = args[:device_executions] if args.key?(:device_executions)
29
+ @display_name = args[:display_name] if args.key?(:display_name)
30
+ @login_credential = args[:login_credential] if args.key?(:login_credential)
31
+ @name = args[:name] if args.key?(:name)
32
+ @test_case = args[:test_case] if args.key?(:test_case)
33
+ @test_state = args[:test_state] if args.key?(:test_state)
34
+ end
35
+
36
+ class Representation < Google::Apis::Core::JsonRepresentation
37
+ property :create_time, as: 'createTime'
38
+ collection :device_executions, as: 'deviceExecutions', class: Google::Apis::FirebaseappdistributionV1alpha::GoogleFirebaseAppdistroV1alphaDeviceExecution, decorator: Google::Apis::FirebaseappdistributionV1alpha::GoogleFirebaseAppdistroV1alphaDeviceExecution::Representation
39
+ property :display_name, as: 'displayName'
40
+ property :login_credential, as: 'loginCredential', class: Google::Apis::FirebaseappdistributionV1alpha::GoogleFirebaseAppdistroV1alphaLoginCredential, decorator: Google::Apis::FirebaseappdistributionV1alpha::GoogleFirebaseAppdistroV1alphaLoginCredential::Representation
41
+ property :name, as: 'name'
42
+ property :test_case, as: 'testCase'
43
+ property :test_state, as: 'testState'
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -1,5 +1,6 @@
1
1
  require 'googleauth'
2
2
  require 'fastlane_core/ui/ui'
3
+ require_relative './firebase_app_distribution_error_message'
3
4
 
4
5
  module Fastlane
5
6
  UI = FastlaneCore::UI unless Fastlane.const_defined?("UI")
@@ -4,6 +4,8 @@ module ErrorMessage
4
4
  SERVICE_CREDENTIALS_NOT_FOUND = "Service credentials file does not exist. Please check the service credentials path and try again."
5
5
  PARSE_SERVICE_CREDENTIALS_ERROR = "Failed to extract service account information from the service credentials file."
6
6
  PARSE_FIREBASE_TOOLS_JSON_ERROR = "Encountered error parsing json file. Ensure the firebase-tools.json file is formatted correctly."
7
+ PERMISSION_DENIED_ERROR = "The authenticated user does not have the required permissions on the Firebase project"
8
+ UPLOAD_BINARY_ERROR = "App Distribution halted because it had a problem uploading the app binary."
7
9
  UPLOAD_RELEASE_NOTES_ERROR = "App Distribution halted because it had a problem uploading release notes."
8
10
  UPLOAD_TESTERS_ERROR = "App Distribution halted because it had a problem adding testers/groups."
9
11
  GET_RELEASE_TIMEOUT = "App Distribution failed to fetch release information."
@@ -1,5 +1,8 @@
1
1
  require 'fastlane_core/ui/ui'
2
2
  require 'cfpropertylist'
3
+ require 'google/apis/core'
4
+ require 'google/apis/options'
5
+ require_relative './firebase_app_distribution_error_message'
3
6
 
4
7
  module Fastlane
5
8
  UI = FastlaneCore::UI unless Fastlane.const_defined?("UI")
@@ -27,7 +30,7 @@ module Fastlane
27
30
 
28
31
  # Returns the array representation of a string with trimmed comma
29
32
  # seperated values.
30
- def string_to_array(string, delimiter = ",")
33
+ def string_to_array(string, delimiter = /[,\n]/)
31
34
  return [] if string.nil?
32
35
  # Strip string and then strip individual values
33
36
  string.strip.split(delimiter).map(&:strip)
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
2
  module FirebaseAppDistribution
3
- VERSION = "0.9.1"
3
+ VERSION = "0.10.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,16 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane-plugin-firebase_app_distribution
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stefan Natchev
8
8
  - Manny Jimenez
9
9
  - Alonso Salas Infante
10
- autorequire:
11
10
  bindir: bin
12
11
  cert_chain: []
13
- date: 2024-04-30 00:00:00.000000000 Z
12
+ date: 2025-01-07 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: google-apis-firebaseappdistribution_v1
@@ -166,7 +165,6 @@ dependencies:
166
165
  - - ">="
167
166
  - !ruby/object:Gem::Version
168
167
  version: 2.127.1
169
- description:
170
168
  email:
171
169
  - snatchev@google.com
172
170
  - mannyjimenez@google.com
@@ -186,6 +184,7 @@ files:
186
184
  - lib/fastlane/plugin/firebase_app_distribution/actions/firebase_app_distribution_get_latest_release.rb
187
185
  - lib/fastlane/plugin/firebase_app_distribution/actions/firebase_app_distribution_get_udids.rb
188
186
  - lib/fastlane/plugin/firebase_app_distribution/actions/firebase_app_distribution_remove_testers_action.rb
187
+ - lib/fastlane/plugin/firebase_app_distribution/helper/firebase_app_distribution_apis.rb
189
188
  - lib/fastlane/plugin/firebase_app_distribution/helper/firebase_app_distribution_auth_client.rb
190
189
  - lib/fastlane/plugin/firebase_app_distribution/helper/firebase_app_distribution_error_message.rb
191
190
  - lib/fastlane/plugin/firebase_app_distribution/helper/firebase_app_distribution_helper.rb
@@ -194,7 +193,6 @@ homepage: https://github.com/fastlane/fastlane-plugin-firebase_app_distribution
194
193
  licenses:
195
194
  - MIT
196
195
  metadata: {}
197
- post_install_message:
198
196
  rdoc_options: []
199
197
  require_paths:
200
198
  - lib
@@ -209,8 +207,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
209
207
  - !ruby/object:Gem::Version
210
208
  version: '0'
211
209
  requirements: []
212
- rubygems_version: 3.5.9
213
- signing_key:
210
+ rubygems_version: 3.6.2
214
211
  specification_version: 4
215
212
  summary: Release your beta builds to Firebase App Distribution. https://firebase.google.com/docs/app-distribution
216
213
  test_files: []