fastlane 2.5.0 → 2.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
  SHA1:
3
- metadata.gz: acbb31b6b342da9f2a15a22936808c0c93d68762
4
- data.tar.gz: 21bd81ba701a4b11a2bf71d8cc8b41a20f4be78c
3
+ metadata.gz: 077c46f59f353134e4211ee252c92882a510b55c
4
+ data.tar.gz: 5cb94ef40a8470ae61fa22e069ea06242e8047af
5
5
  SHA512:
6
- metadata.gz: 43b2ba4ba3613e9324522c76a6a081639d4ddb46d1a00d95c01c2a809e2d84c43525d09533102e7197fd4a4dedb288f40c1a90dcc5393def55ab3a15619d1317
7
- data.tar.gz: e372a9675ae45e33aa649f620116ee257313679d692673ecc073f88fa134fdb382a787a4e430065a3a2d05847851532e2602b22d3db587c34795703ffb62e901
6
+ metadata.gz: 6f8bc8bb4fef49caa02096fabb87146c606296cd6b5f58019a0431a3529eb1539640be800c399dcaa231565ccaf9bb988161c2e23f84dff10f6f00816d9aee19
7
+ data.tar.gz: c605fb60e551e0840e83a084a25790cb38eb6916cb902d7fbfbf917e810d3258c9dac2555d25047d5a833782b1d2985d8a7c259a454e0d9a8a8205f432216a86
@@ -122,6 +122,10 @@ module CredentialsManager
122
122
  setter(:json_key_file, *args, &block)
123
123
  end
124
124
 
125
+ def json_key_data_raw(*args, &block)
126
+ setter(:json_key_data_raw, *args, &block)
127
+ end
128
+
125
129
  def issuer(*args, &block)
126
130
  puts "Appfile: DEPRECATED issuer: use json_key_file instead".red
127
131
  setter(:issuer, *args, &block)
@@ -16,7 +16,7 @@ module Deliver
16
16
  UI.crash!("Could not render HTML page")
17
17
  end
18
18
  UI.important("Verifying the upload via the HTML file can be disabled by either adding")
19
- UI.important("`force true` to your Deliverfile or using `deliver --force`")
19
+ UI.important("`force true` to your Deliverfile or using `fastlane deliver --force`")
20
20
 
21
21
  system("open '#{html_path}'")
22
22
  okay = UI.confirm("Does the Preview on path '#{html_path}' look okay for you?")
@@ -68,7 +68,7 @@ module Fastlane
68
68
  if Gem::Version.new(installed_version) == Gem::Version.new(latest_version)
69
69
  update_status = "✅ Up-To-Date"
70
70
  else
71
- update_status = "🚫 Update availaible"
71
+ update_status = "🚫 Update available"
72
72
  end
73
73
  rescue
74
74
  update_status = "💥 Check failed"
@@ -112,7 +112,7 @@ module Fastlane
112
112
  if Gem::Version.new(current_gem.version) == Gem::Version.new(latest_version)
113
113
  update_status = "✅ Up-To-Date"
114
114
  else
115
- update_status = "🚫 Update availaible"
115
+ update_status = "🚫 Update available"
116
116
  end
117
117
  rescue
118
118
  update_status = "💥 Check failed"
@@ -45,7 +45,7 @@ module Fastlane
45
45
  # See https://github.com/fastlane/fastlane/issues/6951
46
46
  fork do
47
47
  begin
48
- exit(1) unless require name
48
+ require name
49
49
  rescue LoadError
50
50
  exit(1)
51
51
  end
@@ -1,4 +1,4 @@
1
1
  module Fastlane
2
- VERSION = '2.5.0'.freeze
2
+ VERSION = '2.6.0'.freeze
3
3
  DESCRIPTION = "The easiest way to automate beta deployments and releases for your iOS and Android apps".freeze
4
4
  end
@@ -155,7 +155,7 @@ module FastlaneCore
155
155
  # (optional) Returns the app identifier for the current tool
156
156
  # supply and screengrab use different param names and env variable patterns so we have to special case here
157
157
  # example:
158
- # supply --skip_upload_screenshots -a beta -p com.test.app should return com.test.app
158
+ # fastlane supply --skip_upload_screenshots -a beta -p com.test.app should return com.test.app
159
159
  # screengrab -a com.test.app should return com.test.app
160
160
  def self.android_app_identifier(args, gem_name)
161
161
  app_identifier = nil
@@ -27,7 +27,7 @@ module Frameit
27
27
  default_command :run
28
28
 
29
29
  command :run do |c|
30
- c.syntax = 'frameit black'
30
+ c.syntax = 'fastlane frameit black'
31
31
  c.description = "Adds a black frame around all screenshots"
32
32
 
33
33
  c.action do |args, options|
@@ -37,7 +37,7 @@ module Frameit
37
37
  end
38
38
 
39
39
  command :silver do |c|
40
- c.syntax = 'frameit silver'
40
+ c.syntax = 'fastlane frameit silver'
41
41
  c.description = "Adds a silver frame around all screenshots"
42
42
 
43
43
  c.action do |args, options|
@@ -47,7 +47,7 @@ module Frameit
47
47
  end
48
48
 
49
49
  command :gold do |c|
50
- c.syntax = 'frameit gold'
50
+ c.syntax = 'fastlane frameit gold'
51
51
  c.description = "Adds a gold frame around all screenshots"
52
52
 
53
53
  c.action do |args, options|
@@ -57,7 +57,7 @@ module Frameit
57
57
  end
58
58
 
59
59
  command :rose_gold do |c|
60
- c.syntax = 'frameit rose_gold'
60
+ c.syntax = 'fastlane frameit rose_gold'
61
61
  c.description = "Adds a rose gold frame around all screenshots"
62
62
 
63
63
  c.action do |args, options|
@@ -67,7 +67,7 @@ module Frameit
67
67
  end
68
68
 
69
69
  command :setup do |c|
70
- c.syntax = 'frameit setup'
70
+ c.syntax = 'fastlane frameit setup'
71
71
  c.description = "Downloads and sets up the latest device frames"
72
72
 
73
73
  c.action do |args, options|
@@ -76,7 +76,7 @@ module Frameit
76
76
  end
77
77
 
78
78
  command :download_frames do |c|
79
- c.syntax = 'frameit download_frames'
79
+ c.syntax = 'fastlane frameit download_frames'
80
80
  c.description = "Downloads and sets up the latest device frames"
81
81
 
82
82
  c.action do |args, options|
@@ -22,8 +22,6 @@ module Frameit
22
22
  @image = complex_framing
23
23
  else
24
24
  # easy mode from 1.0 - no title or background
25
- width = offset['width']
26
- image.resize width # resize the image to fit the frame
27
25
  put_into_frame # put it in the frame
28
26
  end
29
27
 
@@ -1,6 +1,5 @@
1
1
  module Frameit
2
2
  class FrameDownloader
3
- FRAME_PATH = '.frameit/devices_frames_2'
4
3
  HOST_URL = "https://fastlane.github.io/frameit-frames"
5
4
 
6
5
  def download_frames
@@ -9,11 +8,10 @@ module Frameit
9
8
  require 'json'
10
9
  require 'fileutils'
11
10
 
12
- UI.message("Downloading device frames...")
11
+ UI.message("Downloading device frames to '#{templates_path}'")
13
12
  FileUtils.mkdir_p(templates_path)
14
13
 
15
14
  frames_version = download_file("version.txt")
16
- File.write(File.join(templates_path, "version.txt"), frames_version)
17
15
  UI.important("Using frame version '#{frames_version}', you can optionally lock that version in your Framefile.json using `device_frame_version`")
18
16
 
19
17
  files = JSON.parse(download_file("files.json"))
@@ -23,15 +21,26 @@ module Frameit
23
21
  end
24
22
  File.write(File.join(templates_path, "offsets.json"), download_file("offsets.json"))
25
23
 
24
+ # Write the version.txt at the very end to properly resume downloads
25
+ # if it's interrupted
26
+ File.write(File.join(templates_path, "version.txt"), frames_version)
27
+
26
28
  UI.success("Successfully downloaded all required image assets")
27
29
  end
28
30
 
29
31
  def frames_exist?(version: "latest")
30
- Dir["#{templates_path}/*.png"].count > 0 && File.read(File.join(templates_path, "version.txt")).to_i > 0
32
+ version_path = File.join(templates_path, "version.txt")
33
+ version = File.read(version_path) if File.exist?(version_path)
34
+ Dir["#{templates_path}/*.png"].count > 0 && version.to_i > 0
31
35
  end
32
36
 
33
37
  def self.templates_path
34
- File.join(ENV['HOME'], FRAME_PATH, Frameit.frames_version)
38
+ # Previously ~/.frameit/device_frames_2/x
39
+ legacy_path = File.join(ENV['HOME'], ".frameit/devices_frames_2", Frameit.frames_version)
40
+ return legacy_path if File.directory?(legacy_path)
41
+
42
+ # New path, being ~/.fastlane/frameit/x
43
+ return File.join(FastlaneCore.fastlane_user_dir, "frameit", Frameit.frames_version)
35
44
  end
36
45
 
37
46
  def templates_path
@@ -19,12 +19,12 @@ module Frameit
19
19
  # Unfortunately not every device type is available in rose gold or gold
20
20
  # This is why we can't have nice things #yatusabes
21
21
  # fallback to a white iPhone, which looks similar
22
- UI.important("Unfortunatey device type '#{screenshot.device_name}' is not available in #{screenshot.color}, falling back to silver...")
22
+ UI.important("Unfortunately device type '#{screenshot.device_name}' is not available in #{screenshot.color}, falling back to silver...")
23
23
  screenshot.color = Frameit::Color::SILVER
24
24
  return self.get_template(screenshot)
25
25
  else
26
26
  UI.error("Couldn't find template for screenshot type '#{filename}'")
27
- UI.error("Please run `frameit download_frames` to download the latest frames")
27
+ UI.error("Please run `fastlane frameit download_frames` to download the latest frames")
28
28
  end
29
29
  return filename if Helper.test?
30
30
  return nil
@@ -2,7 +2,7 @@
2
2
  # https://github.com/fastlane/fastlane/tree/master/gym#gymfile
3
3
 
4
4
  # In general, you can use the options available
5
- # gym --help
5
+ # fastlane gym --help
6
6
 
7
7
  # Remove the # in front of the line to enable the option
8
8
 
@@ -45,7 +45,7 @@ module Gym
45
45
  UI.important("try adding the following parameter to your gym call:")
46
46
  UI.success("gym(toolchain: :swift_2_3)")
47
47
  UI.message("or")
48
- UI.success("gym --toolchain swift_2_3")
48
+ UI.success("fastlane gym --toolchain swift_2_3")
49
49
  end
50
50
 
51
51
  UI.user_error!(ex)
@@ -5,5 +5,5 @@ type "development" # The default type, can be: appstore, adhoc or development
5
5
  # app_identifier ["tools.fastlane.app", "tools.fastlane.app2"]
6
6
  # username "user@fastlane.tools" # Your Apple Developer Portal username
7
7
 
8
- # For all available options run `match --help`
8
+ # For all available options run `fastlane match --help`
9
9
  # Remove the # in the beginning of the line to enable the other options
@@ -11,7 +11,7 @@ module Match
11
11
  if keychain_entry.password(ask_if_missing: false).to_s.length == 0
12
12
  UI.important("You can also run `match` in readonly mode to not require any access to the")
13
13
  UI.important("Developer Portal. This way you only share the keys and credentials")
14
- UI.command("match --readonly")
14
+ UI.command("fastlane match --readonly")
15
15
  UI.important("More information https://github.com/fastlane/fastlane/tree/master/match#access-control")
16
16
  end
17
17
 
data/pem/README.md CHANGED
@@ -41,9 +41,7 @@ Tired of manually creating and maintaining your push notification profiles for y
41
41
 
42
42
  `pem` creates new .pem, .cer, and .p12 files to be uploaded to your push server if a valid push notification profile is needed. `pem` does not cover uploading the file to your server.
43
43
 
44
- To automate iOS Provisioning profiles you can use [sigh](https://github.com/fastlane/fastlane/tree/master/sigh).
45
-
46
- Get in contact with the developer on Twitter: [@FastlaneTools](https://twitter.com/FastlaneTools)
44
+ To automate iOS Provisioning profiles you can use [match](https://github.com/fastlane/fastlane/tree/master/match).
47
45
 
48
46
  -------
49
47
  <p align="center">
@@ -62,7 +60,6 @@ Get in contact with the developer on Twitter: [@FastlaneTools](https://twitter.c
62
60
  # Features
63
61
  Well, it's actually just one: Generate the ```pem``` file for your server.
64
62
 
65
-
66
63
  Check out this gif:
67
64
 
68
65
  ![assets/PEMRecording.gif](assets/PEMRecording.gif)
@@ -87,7 +84,7 @@ This does the following:
87
84
  - Downloads the certificate
88
85
  - Generates a new ```.pem``` file in the current working directory, which you can upload to your server
89
86
 
90
- ```pem``` will never revoke your existing certificates.
87
+ Note that ```pem``` will never revoke your existing certificates. `pem` can't download any of your existing push certificates, as the private key is only available on the machine it was created on.
91
88
 
92
89
  If you already have a push certificate enabled, which is active for at least 30 more days, `pem` will not create a new certificate. If you still want to create one, use the `force`:
93
90
 
data/pilot/README.md CHANGED
@@ -248,7 +248,7 @@ fastlane pilot import -c ~/Desktop/testers.csv
248
248
 
249
249
  If you run into any issues you can use the `verbose` mode to get a more detailed output:
250
250
 
251
- fastlane pilot --verbose
251
+ fastlane pilot upload --verbose
252
252
 
253
253
  ## Firewall Issues
254
254
 
@@ -2,7 +2,7 @@
2
2
  # https://github.com/fastlane/fastlane/tree/master/scan#scanfile
3
3
 
4
4
  # In general, you can use the options available
5
- # scan --help
5
+ # fastlane scan --help
6
6
 
7
7
  # Remove the # in front of the line to enable the option
8
8
 
@@ -167,7 +167,7 @@ module Scan
167
167
  def self.detect_destination
168
168
  if Scan.config[:destination]
169
169
  UI.important("It's not recommended to set the `destination` value directly")
170
- UI.important("Instead use the other options available in `scan --help`")
170
+ UI.important("Instead use the other options available in `fastlane scan --help`")
171
171
  UI.important("Using your value '#{Scan.config[:destination]}' for now")
172
172
  UI.important("because I trust you know what you're doing...")
173
173
  return
@@ -12,4 +12,4 @@ locales ['en-US', 'fr-FR', 'it-IT']
12
12
  clear_previous_screenshots true
13
13
 
14
14
  # For more information about all available options run
15
- # screengrab --help
15
+ # fastlane screengrab --help
@@ -174,7 +174,7 @@ module Sigh
174
174
  end
175
175
 
176
176
  if certificates.count > 1 and !Sigh.config[:development]
177
- UI.important "Found more than one code signing identity. Choosing the first one. Check out `sigh --help` to see all available options."
177
+ UI.important "Found more than one code signing identity. Choosing the first one. Check out `fastlane sigh --help` to see all available options."
178
178
  UI.important "Available Code Signing Identities for current filters:"
179
179
  certificates.each do |c|
180
180
  str = ["\t- Name:", c.owner_name, "- ID:", c.id + " - Expires", c.expires.strftime("%d/%m/%Y")].join(" ")
@@ -33,4 +33,4 @@ languages([
33
33
  # launch_arguments(["-favColor red"])
34
34
 
35
35
  # For more information about all available options run
36
- # snapshot --help
36
+ # fastlane snapshot --help
data/spaceship/README.md CHANGED
@@ -110,7 +110,7 @@ This requires you to install `pry` using `sudo gem install pry`. `pry` is not in
110
110
 
111
111
  ## 2 Step Verification
112
112
 
113
- When your Apple account has 2 factor verification enabled, you'll automatically be asked to verify your identity using your phone. The resulting session will be stored in `~/.spaceship/[email]/cookie`. The session should be valid for about one month, however there is no way to test this without actually waiting for over a month.
113
+ When your Apple account has 2 factor verification enabled, you'll automatically be asked to verify your identity using your phone. The resulting session will be stored in `~/.fastlane/spaceship/[email]/cookie`. The session should be valid for about one month, however there is no way to test this without actually waiting for over a month.
114
114
 
115
115
  ### Support for CI machines
116
116
 
@@ -172,9 +172,9 @@ module Spaceship
172
172
  if ENV["SPACESHIP_COOKIE_PATH"]
173
173
  path = File.expand_path(File.join(ENV["SPACESHIP_COOKIE_PATH"], "spaceship", self.user, "cookie"))
174
174
  else
175
- ["~/.spaceship", "/var/tmp/spaceship", "#{Dir.tmpdir}/spaceship"].each do |dir|
175
+ [File.join(FastlaneCore.fastlane_user_dir, "spaceship"), "~/.spaceship", "/var/tmp/spaceship", "#{Dir.tmpdir}/spaceship"].each do |dir|
176
176
  dir_parts = File.split(dir)
177
- if directory_accessible?(dir_parts.first)
177
+ if directory_accessible?(File.expand_path(dir_parts.first))
178
178
  path = File.expand_path(File.join(dir, self.user, "cookie"))
179
179
  break
180
180
  end
@@ -362,8 +362,9 @@ module Spaceship
362
362
  def with_retry(tries = 5, &_block)
363
363
  return yield
364
364
  rescue Faraday::Error::ConnectionFailed, Faraday::Error::TimeoutError, AppleTimeoutError, Errno::EPIPE => ex # New Faraday version: Faraday::TimeoutError => ex
365
- unless (tries -= 1).zero?
366
- logger.warn("Timeout received: '#{ex.message}'. Retrying after 3 seconds (remaining: #{tries})...")
365
+ tries -= 1
366
+ unless tries.zero?
367
+ logger.warn("Timeout received: '#{ex.message}'. Retrying after 3 seconds (remaining: #{tries})...")
367
368
  sleep 3 unless defined? SpecHelper
368
369
  retry
369
370
  end
@@ -373,6 +374,11 @@ module Spaceship
373
374
  msg = "Auth error received: '#{ex.message}'. Login in again then retrying after 3 seconds (remaining: #{tries})..."
374
375
  puts msg if $verbose
375
376
  logger.warn msg
377
+
378
+ if self.class.spaceship_session_env.to_s.length > 0
379
+ raise UnauthorizedAccessError.new, "Authentication error, you passed an invalid session using the environment variable FASTLANE_SESSION or SPACESHIP_SESSION"
380
+ end
381
+
376
382
  do_login(self.user, @password)
377
383
  sleep 3 unless defined? SpecHelper
378
384
  retry
@@ -574,14 +574,30 @@ module Spaceship
574
574
  # @!group Build Trains
575
575
  #####################################################
576
576
 
577
+ # rubocop:disable Metrics/BlockNesting
577
578
  # @param (testing_type) internal or external
578
- def build_trains(app_id, testing_type, platform: nil)
579
+ def build_trains(app_id, testing_type, tries = 5, platform: nil)
579
580
  raise "app_id is required" unless app_id
580
581
  url = "ra/apps/#{app_id}/trains/?testingType=#{testing_type}"
581
582
  url += "&platform=#{platform}" unless platform.nil?
582
583
  r = request(:get, url)
583
- parse_response(r, 'data')
584
+ return parse_response(r, 'data')
585
+ rescue Spaceship::Client::UnexpectedResponse => ex
586
+ # Build trains fail randomly very often
587
+ # we need to catch those errors and retry
588
+ # https://github.com/fastlane/fastlane/issues/6419
589
+ if ex.to_s.include?("ITC.response.error.OPERATION_FAILED")
590
+ tries -= 1
591
+ if tries > 0
592
+ logger.warn("Received temporary server error from iTunes Connect. Retrying the request...")
593
+ sleep 3 unless defined? SpecHelper
594
+ retry
595
+ end
596
+ end
597
+
598
+ raise Spaceship::Client::UnexpectedResponse, "Temporary iTunes Connect error: #{ex}"
584
599
  end
600
+ # rubocop:enable Metrics/BlockNesting
585
601
 
586
602
  def update_build_trains!(app_id, testing_type, data)
587
603
  raise "app_id is required" unless app_id
@@ -1003,7 +1019,7 @@ module Spaceship
1003
1019
  return yield
1004
1020
  rescue Spaceship::TunesClient::ITunesConnectTemporaryError => ex
1005
1021
  unless (tries -= 1).zero?
1006
- msg = "ITC temporary save error received: '#{ex.message}'. Retrying after 60 seconds (remaining: #{tries})..."
1022
+ msg = "iTunes Connect temporary error received: '#{ex.message}'. Retrying after 60 seconds (remaining: #{tries})..."
1007
1023
  puts msg
1008
1024
  logger.warn msg
1009
1025
  sleep 60 unless defined? SpecHelper # unless FastlaneCore::Helper.is_test?
@@ -87,12 +87,11 @@ module Spaceship
87
87
  end
88
88
 
89
89
  def load_session_from_env
90
- yaml_text = ENV["FASTLANE_SESSION"] || ENV["SPACESHIP_SESSION"]
91
- return if yaml_text.to_s.length == 0
90
+ return if self.class.spaceship_session_env.to_s.length == 0
92
91
  puts "Loading session from environment variable" if $verbose
93
92
 
94
93
  file = Tempfile.new('cookie.yml')
95
- file.write(yaml_text.gsub("\\n", "\n"))
94
+ file.write(self.class.spaceship_session_env.gsub("\\n", "\n"))
96
95
  file.close
97
96
 
98
97
  begin
@@ -106,6 +105,12 @@ module Spaceship
106
105
  end
107
106
  end
108
107
 
108
+ # Fetch the session cookie from the environment
109
+ # (if exists)
110
+ def self.spaceship_session_env
111
+ ENV["FASTLANE_SESSION"] || ENV["SPACESHIP_SESSION"]
112
+ end
113
+
109
114
  def select_device(r, device_id)
110
115
  # Request Token
111
116
  r = request(:put) do |req|
@@ -22,25 +22,30 @@ module Supply
22
22
 
23
23
  # instantiate a client given the supplied configuration
24
24
  def self.make_from_config
25
- unless Supply.config[:json_key] || (Supply.config[:key] && Supply.config[:issuer])
25
+ unless Supply.config[:json_key] || Supply.config[:json_key_data] || (Supply.config[:key] && Supply.config[:issuer])
26
26
  UI.important("To not be asked about this value, you can specify it using 'json_key'")
27
27
  Supply.config[:json_key] = UI.input("The service account json file used to authenticate with Google: ")
28
28
  end
29
29
 
30
+ if Supply.config[:json_key]
31
+ service_account_json = File.open(File.expand_path(Supply.config[:json_key]))
32
+ elsif Supply.config[:json_key_data]
33
+ service_account_json = StringIO.new(Supply.config[:json_key_data])
34
+ end
35
+
30
36
  return Client.new(path_to_key: Supply.config[:key],
31
- issuer: Supply.config[:issuer],
32
- path_to_service_account_json: Supply.config[:json_key])
37
+ issuer: Supply.config[:issuer], service_account_json: service_account_json)
33
38
  end
34
39
 
35
40
  # Initializes the android_publisher and its auth_client using the specified information
36
- # @param path_to_service_account_json: The path to your service account Json file
41
+ # @param service_account_json: The raw service account Json data
37
42
  # @param path_to_key: The path to your p12 file (@deprecated)
38
43
  # @param issuer: Email addresss for oauth (@deprecated)
39
- def initialize(path_to_key: nil, issuer: nil, path_to_service_account_json: nil)
44
+ def initialize(path_to_key: nil, issuer: nil, service_account_json: nil)
40
45
  scope = Androidpublisher::AUTH_ANDROIDPUBLISHER
41
46
 
42
- if path_to_service_account_json
43
- key_io = File.open(File.expand_path(path_to_service_account_json))
47
+ if service_account_json
48
+ key_io = service_account_json
44
49
  else
45
50
  require 'google/api_client/auth/key_utils'
46
51
  key = Google::APIClient::KeyUtils.load_from_pkcs12(File.expand_path(path_to_key), 'notasecret')
@@ -58,13 +58,27 @@ module Supply
58
58
  FastlaneCore::ConfigItem.new(key: :json_key,
59
59
  env_name: "SUPPLY_JSON_KEY",
60
60
  short_option: "-j",
61
- conflicting_options: [:issuer, :key],
61
+ conflicting_options: [:issuer, :key, :json_key_data],
62
62
  optional: true, # this is shouldn't be optional but is until --key and --issuer are completely removed
63
63
  description: "The service account json file used to authenticate with Google",
64
64
  default_value: CredentialsManager::AppfileConfig.try_fetch_value(:json_key_file),
65
65
  verify_block: proc do |value|
66
66
  UI.user_error! "Could not find service account json file at path '#{File.expand_path(value)}'" unless File.exist?(File.expand_path(value))
67
67
  end),
68
+ FastlaneCore::ConfigItem.new(key: :json_key_data,
69
+ env_name: "SUPPLY_JSON_KEY_DATA",
70
+ short_option: "-c",
71
+ conflicting_options: [:issuer, :key, :json_key],
72
+ optional: true,
73
+ description: "The service account json used to authenticate with Google",
74
+ default_value: CredentialsManager::AppfileConfig.try_fetch_value(:json_key_data_raw),
75
+ verify_block: proc do |value|
76
+ begin
77
+ JSON.parse(value)
78
+ rescue JSON::ParserError
79
+ UI.user_error! "Could not parse service account json JSON::ParseError"
80
+ end
81
+ end),
68
82
  FastlaneCore::ConfigItem.new(key: :apk,
69
83
  env_name: "SUPPLY_APK",
70
84
  description: "Path to the APK file to upload",
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.5.0
4
+ version: 2.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Felix Krause
@@ -14,7 +14,7 @@ authors:
14
14
  autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
- date: 2017-01-04 00:00:00.000000000 Z
17
+ date: 2017-01-08 00:00:00.000000000 Z
18
18
  dependencies:
19
19
  - !ruby/object:Gem::Dependency
20
20
  name: slack-notifier
@@ -312,14 +312,14 @@ dependencies:
312
312
  requirements:
313
313
  - - "~>"
314
314
  - !ruby/object:Gem::Version
315
- version: 0.9.1
315
+ version: 0.9.2
316
316
  type: :runtime
317
317
  prerelease: false
318
318
  version_requirements: !ruby/object:Gem::Requirement
319
319
  requirements:
320
320
  - - "~>"
321
321
  - !ruby/object:Gem::Version
322
- version: 0.9.1
322
+ version: 0.9.2
323
323
  - !ruby/object:Gem::Dependency
324
324
  name: highline
325
325
  requirement: !ruby/object:Gem::Requirement