fastlane 2.5.0 → 2.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
  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