fastlane 2.115.0.beta.20190126200102 → 2.115.0.beta.20190127200030

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: fe399ab7696b77ad5a78e90c0e7497ebeb09c020
4
- data.tar.gz: 07b38da9f234328d1ca3fda27b2ca685ac46982d
3
+ metadata.gz: a2f690dd41314c5c114efcfe3d8bcef7645e54a8
4
+ data.tar.gz: 5835afcaad7a7aee734131ada28166971d6da86b
5
5
  SHA512:
6
- metadata.gz: 03ee001ffd244fd4a6a37b37abc1d266e951d97cc36ed3a25242dcf5b700c22cd19713f2613c6fa86ba1995a2d00b07ab67fbdec2387a831edb407e5cd20a2cd
7
- data.tar.gz: 73cf0d2a9c66e36ac023b2c13fd83412077623348670caec6bff3ecec39d017dc7ed16f2d7a5aaa1587bf69630b6de62725f6b82a29d10be0679bdce11da02f2
6
+ metadata.gz: aec640eec8630de7a4755af11b2afbd16763b6c6d8c79246965da54c3a3a5f3d175f4352b6eafa6820bf8a3578eea1782b999819d361b7c50c8d033ac8820d93
7
+ data.tar.gz: b2390dea0e1655717f6ec83972f86e0824495c9123966c024cbe12b7300a1aa0cf43b3309eca3b9109430f6d637c8b4e2088d49d9b172f2a6a87fd8be57577db
@@ -257,6 +257,13 @@ module Deliver
257
257
  default_value: :warn),
258
258
 
259
259
  # App Metadata
260
+ FastlaneCore::ConfigItem.new(key: :individual_metadata_items,
261
+ env_name: "DELIVER_INDIVUDAL_METADATA_ITEMS",
262
+ description: "An array of localized metadata items to upload individually by language so that errors can be identified. E.g. ['name', 'keywords', 'description']. Note: slow",
263
+ is_string: false,
264
+ type: Array,
265
+ default_value: []),
266
+
260
267
  # Non Localised
261
268
  FastlaneCore::ConfigItem.new(key: :app_icon,
262
269
  description: "Metadata: The path to the app icon",
@@ -94,6 +94,7 @@ module Deliver
94
94
  non_localised_options = (NON_LOCALISED_VERSION_VALUES + NON_LOCALISED_APP_VALUES)
95
95
  end
96
96
 
97
+ individual = options[:individual_metadata_items] || []
97
98
  localised_options.each do |key|
98
99
  current = options[key]
99
100
  next unless current
@@ -106,8 +107,12 @@ module Deliver
106
107
  current.each do |language, value|
107
108
  next unless value.to_s.length > 0
108
109
  strip_value = value.to_s.strip
109
- v.send(key)[language] = strip_value if LOCALISED_VERSION_VALUES.include?(key)
110
- details.send(key)[language] = strip_value if LOCALISED_APP_VALUES.include?(key)
110
+ if individual.include?(key.to_s)
111
+ upload_individual_item(app, v, language, key, strip_value)
112
+ else
113
+ v.send(key)[language] = strip_value if LOCALISED_VERSION_VALUES.include?(key)
114
+ details.send(key)[language] = strip_value if LOCALISED_APP_VALUES.include?(key)
115
+ end
111
116
  end
112
117
  end
113
118
 
@@ -137,6 +142,7 @@ module Deliver
137
142
  # If another string needs to be checked here we should
138
143
  # figure out a more generic way to handle these cases.
139
144
  if e.message.include?('App Name cannot be longer than 50 characters') || e.message.include?('The app name you entered is already being used')
145
+ UI.error("Error in app name. Try using 'individual_metadata_items' to identify the problem language.")
140
146
  UI.user_error!(e.message)
141
147
  else
142
148
  raise e
@@ -144,6 +150,23 @@ module Deliver
144
150
  end
145
151
  end
146
152
 
153
+ # Uploads metadata individually by language to help identify exactly which items have issues
154
+ def upload_individual_item(app, version, language, key, value)
155
+ details = app.details
156
+ version.send(key)[language] = value if LOCALISED_VERSION_VALUES.include?(key)
157
+ details.send(key)[language] = value if LOCALISED_APP_VALUES.include?(key)
158
+ Helper.show_loading_indicator("Uploading #{language} #{key} to App Store Connect")
159
+ version.save!
160
+ Helper.hide_loading_indicator
161
+ begin
162
+ details.save!
163
+ UI.success("Successfully uploaded #{language} #{key} to App Store Connect")
164
+ rescue Spaceship::TunesClient::ITunesConnectError => e
165
+ UI.error("Error in #{language} #{key}: \n#{value}")
166
+ UI.error(e.message) # Don't use user_error to allow all values to get checked
167
+ end
168
+ end
169
+
147
170
  # rubocop:enable Metrics/PerceivedComplexity
148
171
 
149
172
  # If the user is using the 'default' language, then assign values where they are needed
@@ -22,7 +22,15 @@ module Fastlane
22
22
  end
23
23
 
24
24
  commands = []
25
- commands << Fastlane::Actions.sh("security create-keychain -p #{escaped_password} #{keychain_path}", log: false)
25
+
26
+ if !exists?(keychain_path)
27
+ commands << Fastlane::Actions.sh("security create-keychain -p #{escaped_password} #{keychain_path}", log: false)
28
+ elsif params[:require_create]
29
+ UI.abort_with_message!("`require_create` option passed, but found keychain '#{keychain_path}', failing create_keychain action")
30
+ else
31
+ UI.important("Found keychain '#{keychain_path}', creation skipped")
32
+ UI.important("If creating a new Keychain DB is required please set the `require_create` option true to cause the action to fail")
33
+ end
26
34
 
27
35
  if params[:default_keychain]
28
36
  # if there is no default keychain - setting the original will fail - silent this error
@@ -52,6 +60,14 @@ module Fastlane
52
60
  commands
53
61
  end
54
62
 
63
+ def self.exists?(keychain_path)
64
+ keychain_path = File.expand_path(keychain_path)
65
+
66
+ # Creating Keychains using the security
67
+ # CLI appends `-db` to the file name.
68
+ File.exist?("#{keychain_path}-db") || File.exist?(keychain_path)
69
+ end
70
+
55
71
  def self.description
56
72
  "Create a new Keychain"
57
73
  end
@@ -98,7 +114,11 @@ module Fastlane
98
114
  FastlaneCore::ConfigItem.new(key: :add_to_search_list,
99
115
  description: 'Add keychain to search list',
100
116
  is_string: false,
101
- default_value: true)
117
+ default_value: true),
118
+ FastlaneCore::ConfigItem.new(key: :require_create,
119
+ description: 'Fail the action if the Keychain already exists',
120
+ is_string: false,
121
+ default_value: false)
102
122
  ]
103
123
  end
104
124
 
@@ -201,13 +201,36 @@ fastlane match migrate
201
201
 
202
202
  After a successful migration you can safely delete your git repo.
203
203
 
204
- #### Google Cloud `gc_keys.json`
204
+ #### Google Cloud access control
205
205
 
206
206
  *Google Cloud Storage only*
207
207
 
208
- When running `fastlane match init` the first time, the setup process will help you create your `gc_keys.json` file. This file contains the auth credentials needed to access your Google Cloud storage bucket. Make sure to keep that file secret and never add it to version control.
208
+ There are two cases for reading and writing certificates stored in a Google Cloud storage bucket:
209
209
 
210
- We recommend adding `gc_keys.json` to your `.gitignore` and manually add the file to all your work machines. Every developer should create their own `gc_keys.json` file, which will give the admin full control over who has read/write access to the given Storage bucket. At the same time it allows your team to revoke a single key if a file gets compromised.
210
+ 1. Continuous integration jobs. These will authenticate to your Google Cloud project via a service account, and use a `gc_keys.json` file as credentials.
211
+ 1. Developers on a local workstation. In this case, you should choose whether everyone on your team will create their own `gc_keys.json` file, or whether you want to manage access to the bucket directly using your developers' Google accounts.
212
+
213
+ When running `fastlane match init` the first time, the setup process will give you the option to create your `gc_keys.json` file. This file contains the auth credentials needed to access your Google Cloud storage bucket. Make sure to keep that file secret and never add it to version control. We recommend adding `gc_keys.json` to your `.gitignore`
214
+
215
+ ##### Managing developer access via keys
216
+ If you want to manage developer access to your certificates via authentication keys, every developer should create their own `gc_keys.json` and add the file to all their work machines. This will give the admin full control over who has read/write access to the given Storage bucket. At the same time it allows your team to revoke a single key if a file gets compromised.
217
+
218
+ ##### Managing developer acess via Google accounts
219
+ If your developers already have Google accounts and access to your Google Cloud project, you can also manage access to the storage bucket via [Cloud Identity and Access Management (IAM)](https://cloud.google.com/storage/docs/access-control/iam). Just [set up](https://cloud.google.com/storage/docs/access-control/lists) individual developer accounts or an entire Google Group containing your team as readers and writers on your storage bucket.
220
+
221
+ You can then specify the Google Cloud project id containing your storage bucket in your `Matchfile`:
222
+
223
+ ```ruby-skip-tests
224
+ storage_mode("google_cloud")
225
+ google_cloud_bucket_name("my-app-certificates")
226
+ google_cloud_project_id("my-app-project")
227
+ ```
228
+
229
+ This lets developers on your team use [Application Default Credentials](https://cloud.google.com/docs/authentication/production) when accessing your storage bucket. After installing the [Google Cloud SDK](https://cloud.google.com/sdk/), they only need to run the following command once:
230
+ ```no-highlight
231
+ gcloud auth application-default login
232
+ ```
233
+ ... and log in with their Google account. Then, when they run `fastlane match`, _match_ will use these credentials to read from and write to the storage bucket.
211
234
 
212
235
  #### New machine
213
236
 
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
- VERSION = '2.115.0.beta.20190126200102'.freeze
2
+ VERSION = '2.115.0.beta.20190127200030'.freeze
3
3
  DESCRIPTION = "The easiest way to automate beta deployments and releases for your iOS and Android apps".freeze
4
4
  MINIMUM_XCODE_RELEASE = "7.0".freeze
5
5
  RUBOCOP_REQUIREMENT = '0.49.1'.freeze
@@ -2146,6 +2146,7 @@ func match(type: String = matchfile.type,
2146
2146
  cloneBranchDirectly: Bool = matchfile.cloneBranchDirectly,
2147
2147
  googleCloudBucketName: String? = matchfile.googleCloudBucketName,
2148
2148
  googleCloudKeysFile: String? = matchfile.googleCloudKeysFile,
2149
+ googleCloudProjectId: String? = matchfile.googleCloudProjectId,
2149
2150
  keychainName: String = matchfile.keychainName,
2150
2151
  keychainPassword: String? = matchfile.keychainPassword,
2151
2152
  force: Bool = matchfile.force,
@@ -2170,6 +2171,7 @@ func match(type: String = matchfile.type,
2170
2171
  RubyCommand.Argument(name: "clone_branch_directly", value: cloneBranchDirectly),
2171
2172
  RubyCommand.Argument(name: "google_cloud_bucket_name", value: googleCloudBucketName),
2172
2173
  RubyCommand.Argument(name: "google_cloud_keys_file", value: googleCloudKeysFile),
2174
+ RubyCommand.Argument(name: "google_cloud_project_id", value: googleCloudProjectId),
2173
2175
  RubyCommand.Argument(name: "keychain_name", value: keychainName),
2174
2176
  RubyCommand.Argument(name: "keychain_password", value: keychainPassword),
2175
2177
  RubyCommand.Argument(name: "force", value: force),
@@ -12,20 +12,23 @@ module Frameit
12
12
  # Currently the class is 2 lines too long. Reevaluate refactoring when it's length changes significantly
13
13
  class Editor # rubocop:disable Metrics/ClassLength
14
14
  attr_accessor :screenshot # reference to the screenshot object to fetch the path, title, etc.
15
+ attr_accessor :debug_mode
16
+ attr_accessor :frame_path
15
17
  attr_accessor :frame # the frame of the device
16
18
  attr_accessor :image # the current image used for editing
17
19
  attr_accessor :space_to_device
18
20
 
19
- def initialize(screenshot)
21
+ def initialize(screenshot, debug_mode = false)
20
22
  @screenshot = screenshot
23
+ self.debug_mode = debug_mode
21
24
  end
22
25
 
23
26
  def frame!
24
27
  prepare_image
25
28
 
26
- frame = load_frame
27
- if frame # Mac doesn't need a frame
28
- self.frame = MiniMagick::Image.open(frame)
29
+ @frame_path = load_frame
30
+ if @frame_path # Mac doesn't need a frame
31
+ self.frame = MiniMagick::Image.open(@frame_path)
29
32
  # Rotate the frame according to the device orientation
30
33
  self.frame.rotate(self.rotation_for_device_orientation)
31
34
  elsif self.class == Editor
@@ -85,6 +88,26 @@ module Frameit
85
88
  frame.rotate(-rotation)
86
89
  @image.rotate(-rotation)
87
90
 
91
+ # Debug Mode: Add filename to frame
92
+ if self.debug_mode
93
+ filename = File.basename(@frame_path, ".*")
94
+ filename.sub!('Apple', '') # remove 'Apple'
95
+
96
+ width = screenshot.size[0]
97
+ font_size = width / 20 # magic number that works well
98
+
99
+ offset_top = offset['offset'].split("+")[2].to_f
100
+ annotate_offset = "+0+#{offset_top}" # magic number that works semi well
101
+
102
+ frame.combine_options do |c|
103
+ c.gravity('North')
104
+ c.undercolor('#00000080')
105
+ c.fill('white')
106
+ c.pointsize(font_size)
107
+ c.annotate(annotate_offset.to_s, filename.to_s)
108
+ end
109
+ end
110
+
88
111
  @image = frame.composite(image, "png") do |c|
89
112
  c.compose("DstOver")
90
113
  c.geometry(offset['offset'])
@@ -65,7 +65,12 @@ module Frameit
65
65
  :landscape_right
66
66
  end
67
67
  end,
68
- default_value_dynamic: true)
68
+ default_value_dynamic: true),
69
+ FastlaneCore::ConfigItem.new(key: :debug_mode,
70
+ env_name: "FRAMEIT_DEBUG_MODE",
71
+ description: "Output debug information in framed screenshots",
72
+ default_value: false,
73
+ type: Boolean)
69
74
  ]
70
75
  end
71
76
  end
@@ -40,7 +40,7 @@ module Frameit
40
40
  if screenshot.mac?
41
41
  editor = MacEditor.new(screenshot)
42
42
  else
43
- editor = Editor.new(screenshot)
43
+ editor = Editor.new(screenshot, Frameit.config[:debug_mode])
44
44
  end
45
45
  if editor.should_skip?
46
46
  UI.message("Skipping framing of screenshot #{screenshot.path}. No title provided in your Framefile.json or title.strings.")
@@ -17,7 +17,8 @@ module Match
17
17
  # to ask for all the missing inputs *before* cloning the git repo
18
18
  google_cloud_storage = Storage.for_mode("google_cloud", {
19
19
  google_cloud_bucket_name: params[:google_cloud_bucket_name],
20
- google_cloud_keys_file: params[:google_cloud_keys_file]
20
+ google_cloud_keys_file: params[:google_cloud_keys_file],
21
+ google_cloud_project_id: params[:google_cloud_project_id]
21
22
  })
22
23
 
23
24
  git_storage = Storage.for_mode("git", {
@@ -36,7 +36,8 @@ module Match
36
36
  git_user_email: params[:git_user_email],
37
37
  clone_branch_directly: params[:clone_branch_directly],
38
38
  google_cloud_bucket_name: params[:google_cloud_bucket_name].to_s,
39
- google_cloud_keys_file: params[:google_cloud_keys_file].to_s
39
+ google_cloud_keys_file: params[:google_cloud_keys_file].to_s,
40
+ google_cloud_project_id: params[:google_cloud_project_id].to_s
40
41
  })
41
42
  self.storage.download
42
43
 
@@ -123,6 +123,10 @@ module Match
123
123
  verify_block: proc do |value|
124
124
  UI.user_error!("Could not find keys file at path '#{File.expand_path(value)}'") unless File.exist?(value)
125
125
  end),
126
+ FastlaneCore::ConfigItem.new(key: :google_cloud_project_id,
127
+ env_name: "MATCH_GOOGLE_CLOUD_PROJECT_ID",
128
+ description: "ID of the Google Cloud project to use for authentication",
129
+ optional: true),
126
130
 
127
131
  # Keychain
128
132
  FastlaneCore::ConfigItem.new(key: :keychain_name,
@@ -46,7 +46,8 @@ module Match
46
46
  type: params[:type].to_s,
47
47
  platform: params[:platform].to_s,
48
48
  google_cloud_bucket_name: params[:google_cloud_bucket_name].to_s,
49
- google_cloud_keys_file: params[:google_cloud_keys_file].to_s
49
+ google_cloud_keys_file: params[:google_cloud_keys_file].to_s,
50
+ google_cloud_project_id: params[:google_cloud_project_id].to_s
50
51
  })
51
52
  storage.download
52
53
 
@@ -17,7 +17,7 @@ module Match
17
17
  attr_reader :platform
18
18
  attr_reader :bucket_name
19
19
  attr_reader :google_cloud_keys_file
20
- attr_reader :project_id
20
+ attr_reader :google_cloud_project_id
21
21
 
22
22
  # Managed values
23
23
  attr_accessor :gc_storage
@@ -34,26 +34,34 @@ module Match
34
34
  type: params[:type].to_s,
35
35
  platform: params[:platform].to_s,
36
36
  google_cloud_bucket_name: params[:google_cloud_bucket_name],
37
- google_cloud_keys_file: params[:google_cloud_keys_file]
37
+ google_cloud_keys_file: params[:google_cloud_keys_file],
38
+ google_cloud_project_id: params[:google_cloud_project_id]
38
39
  )
39
40
  end
40
41
 
41
42
  def initialize(type: nil,
42
43
  platform: nil,
43
44
  google_cloud_bucket_name: nil,
44
- google_cloud_keys_file: nil)
45
+ google_cloud_keys_file: nil,
46
+ google_cloud_project_id: nil)
45
47
  @type = type if type
46
48
  @platform = platform if platform
49
+ @google_cloud_project_id = google_cloud_project_id if google_cloud_project_id
47
50
  @bucket_name = google_cloud_bucket_name
48
51
 
49
- @google_cloud_keys_file = ensure_keys_file_exists(google_cloud_keys_file)
52
+ @google_cloud_keys_file = ensure_keys_file_exists(google_cloud_keys_file, google_cloud_project_id)
50
53
 
51
- # Extract the Project ID from the `JSON` file
52
- # so the user doesn't have to provide it manually
53
- keys_file_content = JSON.parse(File.read(self.google_cloud_keys_file))
54
- @project_id = keys_file_content["project_id"]
55
- if self.project_id.to_s.length == 0
56
- UI.user_error!("Provided keys file on path #{File.expand_path(self.google_cloud_keys_file)} doesn't include required value for `project_id`")
54
+ if self.google_cloud_keys_file.to_s.length > 0
55
+ # Extract the Project ID from the `JSON` file
56
+ # so the user doesn't have to provide it manually
57
+ keys_file_content = JSON.parse(File.read(self.google_cloud_keys_file))
58
+ if google_cloud_project_id.to_s.length > 0 && google_cloud_project_id != keys_file_content["project_id"]
59
+ UI.important("The google_cloud_keys_file's project ID ('#{keys_file_content['project_id']}') doesn't match the google_cloud_project_id ('#{google_cloud_project_id}'). This may be the wrong keys file.")
60
+ end
61
+ @google_cloud_project_id = keys_file_content["project_id"]
62
+ if self.google_cloud_project_id.to_s.length == 0
63
+ UI.user_error!("Provided keys file on path #{File.expand_path(self.google_cloud_keys_file)} doesn't include required value for `project_id`")
64
+ end
57
65
  end
58
66
 
59
67
  # Create the Google Cloud Storage client
@@ -62,7 +70,7 @@ module Match
62
70
  begin
63
71
  self.gc_storage = Google::Cloud::Storage.new(
64
72
  credentials: self.google_cloud_keys_file,
65
- project_id: self.project_id
73
+ project_id: self.google_cloud_project_id
66
74
  )
67
75
  rescue => ex
68
76
  UI.error(ex)
@@ -101,7 +109,7 @@ module Match
101
109
  end
102
110
 
103
111
  def human_readable_description
104
- "Google Cloud Bucket [#{self.project_id}/#{self.bucket_name}]"
112
+ "Google Cloud Bucket [#{self.google_cloud_project_id}/#{self.bucket_name}]"
105
113
  end
106
114
 
107
115
  def upload_files(files_to_upload: [], custom_message: nil)
@@ -149,7 +157,7 @@ module Match
149
157
 
150
158
  # This method will make sure the keys file exists
151
159
  # If it's missing, it will help the user set things up
152
- def ensure_keys_file_exists(google_cloud_keys_file)
160
+ def ensure_keys_file_exists(google_cloud_keys_file, google_cloud_project_id)
153
161
  if google_cloud_keys_file && File.exist?(google_cloud_keys_file)
154
162
  return google_cloud_keys_file
155
163
  end
@@ -159,8 +167,31 @@ module Match
159
167
  fastlane_folder_gc_keys_path = File.join(FastlaneCore::FastlaneFolder.path, DEFAULT_KEYS_FILE_NAME)
160
168
  return fastlane_folder_gc_keys_path if File.exist?(fastlane_folder_gc_keys_path)
161
169
 
162
- # User doesn't seem to have provided a keys file
163
- UI.message("Looks like you don't have a Google Cloud #{DEFAULT_KEYS_FILE_NAME.cyan} file yet")
170
+ if google_cloud_project_id.to_s.length > 0
171
+ # Check to see if this system has application default keys installed.
172
+ # These are the default keys that the Google Cloud APIs use when no other keys are specified.
173
+ # Users with the Google Cloud SDK installed can generate them by running...
174
+ # `gcloud auth application-default login`
175
+ # ...and then they'll be automatically available.
176
+ # The nice thing about these keys is they can be associated with the user's login in GCP
177
+ # (e.g. my_account@gmail.com), so teams can control access to the certificate bucket
178
+ # using a mailing list of developer logins instead of generating service accounts
179
+ # and keys.
180
+ application_default_keys = nil
181
+ begin
182
+ application_default_keys = Google::Auth.get_application_default
183
+ rescue
184
+ # This means no application default keys have been installed. That's perfectly OK,
185
+ # we can continue and ask the user if they want to use a keys file.
186
+ end
187
+
188
+ if application_default_keys && UI.confirm("Do you want to use this system's Google Cloud application default keys?")
189
+ return nil
190
+ end
191
+ end
192
+
193
+ # User doesn't seem to have provided a keys file.
194
+ UI.message("Looks like you don't have a Google Cloud #{DEFAULT_KEYS_FILE_NAME.cyan} file")
164
195
  UI.message("If you have one, make sure to put it into the '#{Dir.pwd}' directory and call it '#{DEFAULT_KEYS_FILE_NAME.cyan}'")
165
196
  unless UI.confirm("Do you want fastlane to help you to create a #{DEFAULT_KEYS_FILE_NAME} file?")
166
197
  UI.user_error!("Process stopped, run fastlane again to start things up again")
@@ -217,7 +248,7 @@ module Match
217
248
  if available_bucket_identifiers.count > 0
218
249
  @bucket_name = UI.select("What Google Cloud Storage bucket do you want to use? (you can define it using the `google_cloud_bucket_name` key)", available_bucket_identifiers)
219
250
  else
220
- UI.error("Looks like your Google Cloud account for the project ID '#{self.project_id}' doesn't")
251
+ UI.error("Looks like your Google Cloud account for the project ID '#{self.google_cloud_project_id}' doesn't")
221
252
  UI.error("have any available storage buckets yet. Please visit the following URL")
222
253
  UI.message("")
223
254
  UI.message("\t\thttps://console.cloud.google.com/storage/browser".cyan)
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.115.0.beta.20190126200102
4
+ version: 2.115.0.beta.20190127200030
5
5
  platform: ruby
6
6
  authors:
7
7
  - Danielle Tomlinson
@@ -27,7 +27,7 @@ authors:
27
27
  autorequire:
28
28
  bindir: bin
29
29
  cert_chain: []
30
- date: 2019-01-26 00:00:00.000000000 Z
30
+ date: 2019-01-27 00:00:00.000000000 Z
31
31
  dependencies:
32
32
  - !ruby/object:Gem::Dependency
33
33
  name: slack-notifier
@@ -1687,24 +1687,24 @@ metadata:
1687
1687
  post_install_message:
1688
1688
  rdoc_options: []
1689
1689
  require_paths:
1690
+ - fastlane/lib
1691
+ - snapshot/lib
1690
1692
  - cert/lib
1691
- - supply/lib
1692
- - precheck/lib
1693
- - credentials_manager/lib
1693
+ - gym/lib
1694
1694
  - sigh/lib
1695
- - pilot/lib
1695
+ - credentials_manager/lib
1696
1696
  - scan/lib
1697
- - snapshot/lib
1698
- - produce/lib
1697
+ - precheck/lib
1698
+ - supply/lib
1699
+ - screengrab/lib
1699
1700
  - deliver/lib
1700
- - gym/lib
1701
- - frameit/lib
1702
- - fastlane_core/lib
1703
- - pem/lib
1704
1701
  - spaceship/lib
1705
- - fastlane/lib
1702
+ - pilot/lib
1706
1703
  - match/lib
1707
- - screengrab/lib
1704
+ - produce/lib
1705
+ - pem/lib
1706
+ - frameit/lib
1707
+ - fastlane_core/lib
1708
1708
  required_ruby_version: !ruby/object:Gem::Requirement
1709
1709
  requirements:
1710
1710
  - - ">="