supply 0.3.1 → 0.4.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: cf1ce6eea2f83d47a47cc8b7e4f8a93ad41f81ba
4
- data.tar.gz: 0a8474cc4ac5867ce6175c63d2bbe174239e5d47
3
+ metadata.gz: 9697a1089d5497d72524a149bed1fef5891cea92
4
+ data.tar.gz: 21e4ebade53c3955817f1bc7c96181d3a68aa7c9
5
5
  SHA512:
6
- metadata.gz: bf60276da8a2e62f38bc30c035d340b48d612d6a661f5d4fa8c4403d37cf88d439e86c394947ffd01e1c4a0540f4abaae5383b515fe421bc3b6e4d6eca3fb246
7
- data.tar.gz: 02da6a2b8811fa77cab2a735c16ecc82ce4f4c70d4500ead0dfb8af971a35dfca12554c5b34dd60c8392601108af2cc77d067a70ab2c970d2d7938091a0dbd16
6
+ metadata.gz: 885050ae365c1dba5af3570cbeb641cf4836a8faa2404453be88b6c5cbdb5058a4181b9a5262c689ce1d6b8fd28c22f7618bba833b84fa8f371372813dfbd2b2
7
+ data.tar.gz: 558ce0fbcf00b10e29fbfa210ac8ce0e61b563931f234109b03deb913a2f5aa23f18dc941a5b668898d22799f255f4bd2a9d85e4aa04bc7de2af9865ce613e05
data/README.md CHANGED
@@ -69,20 +69,34 @@ Install the gem
69
69
 
70
70
  sudo gem install supply
71
71
 
72
- ## Setup a Google Developers Service Account
72
+ ## Setup
73
+
74
+ Setup consists of setting up your Google Developers Service Account
73
75
 
74
76
  - Open the [Google Play Console](https://play.google.com/apps/publish/)
75
77
  - Select **Settings** tab, followed by the **API access** tab
76
78
  - Click the **Create Service Account** button and follow the **Google Developers Console** link in the dialog
77
79
  - Click **Add credentials** and select **Service account**
78
- - Select **P12** as the Key type and click **Create**
79
- - Make a note of the file name of the P12 file downloaded to your computer, and close the dialog
80
- - Make a note of the **Email address** under **Service accounts** - this is the issuer which you will need later
80
+ - Select **JSON** as the Key type and click **Create**
81
+ - Make a note of the file name of the JSON file downloaded to your computer, and close the dialog
82
+ - Make a note of the **Email address** under **Service accounts** - this is the user which you will need later
81
83
  - Back on the Google Play developer console, click **Done** to close the dialog
82
84
  - Click on **Grant Access** for the newly added service account
83
85
  - In the **Invite a New User** dialog, paste the service account email address you noted earlier into the **Email address** field
84
86
  - Choose **Release Manager** from the **Role** dropdown and click **Send Invitation** to close the dialog
85
87
 
88
+ ### Migrating Google credential format (from .p12 key file to .json)
89
+
90
+ In previous versions of supply, credentials to your Play Console were stored as `.p12` files. Since version 0.4.0, supply now supports the recommended `.json` key Service Account credential files. If you wish to upgrade:
91
+
92
+ - follow the <a href="#setup">Setup</a> procedure once again to make sure you create the appropriate JSON file
93
+ - update your fastlane configuration or your command line invocation to use the appropriate argument if necessary.
94
+ Note that you don't need to take note nor pass the `issuer` argument anymore.
95
+
96
+
97
+ The previous p12 configuration is still currently supported.
98
+
99
+
86
100
  ## Quick Start
87
101
 
88
102
  - `cd [your_project_folder]`
data/lib/supply/client.rb CHANGED
@@ -1,11 +1,13 @@
1
- require 'google/api_client'
1
+ require 'googleauth'
2
+ require 'google/apis/androidpublisher_v2'
3
+ Androidpublisher = Google::Apis::AndroidpublisherV2
4
+ CredentialsLoader = Google::Auth::CredentialsLoader
5
+
2
6
  require 'net/http'
3
7
 
4
8
  module Supply
5
9
  class Client
6
10
  # Connecting with Google
7
- attr_accessor :auth_client
8
- attr_accessor :api_client
9
11
  attr_accessor :android_publisher
10
12
 
11
13
  # Editing something
@@ -18,38 +20,43 @@ module Supply
18
20
  # @!group Login
19
21
  #####################################################
20
22
 
21
- # Initializes the auth_client and api_client using the specified information
22
- # @param path_to_key: The path to your p12 file
23
- # @param issuer: Email addresss for oauth
24
- # @param passphrase: Passphrase for the p12 file
25
- def initialize(path_to_key: nil, issuer: nil, passphrase: nil)
26
- passphrase ||= "notasecret"
23
+ # instanciate a client given the supplied configuration
24
+ def self.make_from_config
25
+ return Client.new(path_to_key: Supply.config[:key],
26
+ issuer: Supply.config[:issuer],
27
+ path_to_service_account_json: Supply.config[:json_key])
28
+ end
27
29
 
28
- key = Google::APIClient::KeyUtils.load_from_pkcs12(File.expand_path(path_to_key), passphrase)
30
+ # Initializes the android_publisher and its auth_client using the specified information
31
+ # @param path_to_service_account_json: The path to your service account Json file
32
+ # @param path_to_key: The path to your p12 file (@deprecated)
33
+ # @param issuer: Email addresss for oauth (@deprecated)
34
+ def initialize(path_to_key: nil, issuer: nil, path_to_service_account_json: nil)
35
+ scope = Androidpublisher::AUTH_ANDROIDPUBLISHER
29
36
 
30
- begin
31
- self.auth_client = Signet::OAuth2::Client.new(
32
- token_credential_uri: 'https://accounts.google.com/o/oauth2/token',
33
- audience: 'https://accounts.google.com/o/oauth2/token',
34
- scope: 'https://www.googleapis.com/auth/androidpublisher',
35
- issuer: issuer,
36
- signing_key: key
37
- )
38
- rescue => ex
39
- Helper.log.fatal ex
40
- raise "Authentification unsuccessful, make sure to pass a valid key file".red
37
+ if path_to_service_account_json
38
+ key_io = File.open(File.expand_path(path_to_service_account_json))
39
+ else
40
+ require 'google/api_client/auth/key_utils'
41
+ key = Google::APIClient::KeyUtils.load_from_pkcs12(File.expand_path(path_to_key), 'notasecret')
42
+ cred_json = {
43
+ private_key: key.to_s,
44
+ client_email: issuer
45
+ }
46
+ key_io = StringIO.new(MultiJson.dump(cred_json))
41
47
  end
42
48
 
49
+ auth_client = Google::Auth::ServiceAccountCredentials.make_creds(json_key_io: key_io, scope: scope)
50
+
43
51
  Helper.log.debug "Fetching a new access token from Google..."
44
52
 
45
- self.auth_client.fetch_access_token!
53
+ auth_client.fetch_access_token!
46
54
 
47
- self.api_client = Google::APIClient.new(
48
- application_name: "fastlane - supply",
49
- application_version: Supply::VERSION
50
- )
55
+ Google::Apis::ClientOptions.default.application_name = "fastlane - supply"
56
+ Google::Apis::ClientOptions.default.application_version = Supply::VERSION
51
57
 
52
- self.android_publisher = api_client.discovered_api('androidpublisher', 'v2')
58
+ self.android_publisher = Androidpublisher::AndroidPublisherService.new
59
+ self.android_publisher.authorization = auth_client
53
60
  end
54
61
 
55
62
  #####################################################
@@ -60,17 +67,7 @@ module Supply
60
67
  def begin_edit(package_name: nil)
61
68
  raise "You currently have an active edit" if @current_edit
62
69
 
63
- self.current_edit = api_client.execute(
64
- api_method: android_publisher.edits.insert,
65
- parameters: { 'packageName' => package_name },
66
- authorization: auth_client
67
- )
68
-
69
- if current_edit.error?
70
- error_message = current_edit.error_message
71
- self.current_edit = nil
72
- raise error_message
73
- end
70
+ self.current_edit = android_publisher.insert_edit(package_name)
74
71
 
75
72
  self.current_package_name = package_name
76
73
  end
@@ -79,16 +76,7 @@ module Supply
79
76
  def abort_current_edit
80
77
  ensure_active_edit!
81
78
 
82
- result = api_client.execute(
83
- api_method: android_publisher.edits.delete,
84
- parameters: {
85
- 'editId' => current_edit.data.id,
86
- 'packageName' => current_package_name
87
- },
88
- authorization: auth_client
89
- )
90
-
91
- raise result.error_message.red if result.error?
79
+ android_publisher.delete_edit(current_package_name, current_edit.id)
92
80
 
93
81
  self.current_edit = nil
94
82
  self.current_package_name = nil
@@ -98,16 +86,7 @@ module Supply
98
86
  def commit_current_edit!
99
87
  ensure_active_edit!
100
88
 
101
- result = api_client.execute(
102
- api_method: android_publisher.edits.commit,
103
- parameters: {
104
- 'editId' => current_edit.data.id,
105
- 'packageName' => current_package_name
106
- },
107
- authorization: auth_client
108
- )
109
-
110
- raise result.error_message.red if result.error?
89
+ android_publisher.commit_edit(current_package_name, current_edit.id)
111
90
 
112
91
  self.current_edit = nil
113
92
  self.current_package_name = nil
@@ -122,18 +101,9 @@ module Supply
122
101
  def listings
123
102
  ensure_active_edit!
124
103
 
125
- result = api_client.execute(
126
- api_method: android_publisher.edits.listings.list,
127
- parameters: {
128
- 'editId' => current_edit.data.id,
129
- 'packageName' => current_package_name
130
- },
131
- authorization: auth_client
132
- )
104
+ result = android_publisher.list_listings(current_package_name, current_edit.id)
133
105
 
134
- raise result.error_message.red if result.error? && result.status != 404
135
-
136
- return result.data.listings.collect do |row|
106
+ return result.listings.map do |row|
137
107
  Listing.new(self, row.language, row)
138
108
  end
139
109
  end
@@ -142,22 +112,16 @@ module Supply
142
112
  def listing_for_language(language)
143
113
  ensure_active_edit!
144
114
 
145
- result = api_client.execute(
146
- api_method: android_publisher.edits.listings.get,
147
- parameters: {
148
- 'editId' => current_edit.data.id,
149
- 'packageName' => current_package_name,
150
- 'language' => language
151
- },
152
- authorization: auth_client
153
- )
154
-
155
- raise result.error_message.red if result.error? && result.status != 404
156
-
157
- if result.status == 404
158
- return Listing.new(self, language) # create a new empty listing
159
- else
160
- return Listing.new(self, language, result.data)
115
+ begin
116
+ result = android_publisher.get_listing(
117
+ current_package_name,
118
+ current_edit.id,
119
+ language)
120
+
121
+ return Listing.new(self, language, result)
122
+ rescue Google::Apis::ClientError => e
123
+ return Listing.new(self, language) if e.status_code == 404 # create a new empty listing
124
+ raise
161
125
  end
162
126
  end
163
127
 
@@ -165,38 +129,22 @@ module Supply
165
129
  def apks_version_codes
166
130
  ensure_active_edit!
167
131
 
168
- result = api_client.execute(
169
- api_method: android_publisher.edits.apks.list,
170
- parameters: {
171
- 'editId' => current_edit.data.id,
172
- 'packageName' => current_package_name
173
- },
174
- authorization: auth_client
175
- )
132
+ result = android_publisher.list_apks(current_package_name, current_edit.id)
176
133
 
177
- raise result.error_message.red if result.error? && result.status != 404
178
-
179
- return result.data.apks.collect(&:versionCode)
134
+ return result.apks.map(&:version_code)
180
135
  end
181
136
 
182
137
  # Get a list of all apk listings (changelogs) - returns the list
183
138
  def apk_listings(apk_version_code)
184
139
  ensure_active_edit!
185
140
 
186
- result = api_client.execute(
187
- api_method: android_publisher.edits.apklistings.list,
188
- parameters: {
189
- 'apkVersionCode' => apk_version_code,
190
- 'editId' => current_edit.data.id,
191
- 'packageName' => current_package_name
192
- },
193
- authorization: auth_client
194
- )
195
-
196
- raise result.error_message.red if result.error? && result.status != 404
141
+ result = android_publisher.list_apk_listings(
142
+ current_package_name,
143
+ current_edit.id,
144
+ apk_version_code)
197
145
 
198
- return result.data.listings.collect do |row|
199
- ApkListing.new(row.recentChanges, row.language, apk_version_code)
146
+ return (result.listings || []).map do |row|
147
+ ApkListing.new(row.recent_changes, row.language, apk_version_code)
200
148
  end
201
149
  end
202
150
 
@@ -208,90 +156,62 @@ module Supply
208
156
  def update_listing_for_language(language: nil, title: nil, short_description: nil, full_description: nil, video: nil)
209
157
  ensure_active_edit!
210
158
 
211
- listing = {
212
- 'language' => language,
213
- 'title' => title,
214
- 'fullDescription' => full_description,
215
- 'shortDescription' => short_description,
216
- 'video' => video
217
- }
218
-
219
- result = api_client.execute(
220
- api_method: android_publisher.edits.listings.update,
221
- parameters: {
222
- 'editId' => current_edit.data.id,
223
- 'packageName' => current_package_name,
224
- 'language' => language
225
- },
226
- body_object: listing,
227
- authorization: auth_client
228
- )
229
- raise result.error_message.red if result.error?
159
+ listing = Androidpublisher::Listing.new({
160
+ language: language,
161
+ title: title,
162
+ full_description: full_description,
163
+ short_description: short_description,
164
+ video: video
165
+ })
166
+
167
+ android_publisher.update_listing(
168
+ current_package_name,
169
+ current_edit.id,
170
+ language,
171
+ listing)
230
172
  end
231
173
 
232
174
  def upload_apk(path_to_apk)
233
175
  ensure_active_edit!
234
176
 
235
- apk = Google::APIClient::UploadIO.new(File.expand_path(path_to_apk), 'application/vnd.android.package-archive')
236
- result_upload = api_client.execute(
237
- api_method: android_publisher.edits.apks.upload,
238
- parameters: {
239
- 'editId' => current_edit.data.id,
240
- 'packageName' => current_package_name,
241
- 'uploadType' => 'media'
242
- },
243
- media: apk,
244
- authorization: auth_client
245
- )
246
-
247
- raise result_upload.error_message.red if result_upload.error?
248
-
249
- return result_upload.data.versionCode
177
+ result_upload = android_publisher.upload_apk(
178
+ current_package_name,
179
+ current_edit.id,
180
+ upload_source: path_to_apk)
181
+
182
+ return result_upload.version_code
250
183
  end
251
184
 
252
185
  def update_track(track, rollout, apk_version_code)
253
186
  ensure_active_edit!
254
187
 
255
- track_body = {
256
- 'track' => track,
257
- 'userFraction' => rollout,
258
- 'versionCodes' => [apk_version_code]
259
- }
260
-
261
- result_update = api_client.execute(
262
- api_method: android_publisher.edits.tracks.update,
263
- parameters:
264
- {
265
- 'editId' => current_edit.data.id,
266
- 'packageName' => current_package_name,
267
- 'track' => track
268
- },
269
- body_object: track_body,
270
- authorization: auth_client)
271
-
272
- raise result_update.error_message.red if result_update.error?
188
+ track_body = Androidpublisher::Track.new({
189
+ track: track,
190
+ user_fraction: rollout,
191
+ version_codes: [apk_version_code]
192
+ })
193
+
194
+ android_publisher.update_track(
195
+ current_package_name,
196
+ current_edit.id,
197
+ track,
198
+ track_body)
273
199
  end
274
200
 
275
201
  def update_apk_listing_for_language(apk_listing)
276
202
  ensure_active_edit!
277
203
 
278
- body_object = {
279
- 'language' => apk_listing.language,
280
- 'recentChanges' => apk_listing.recent_changes
281
- }
282
-
283
- result = api_client.execute(
284
- api_method: android_publisher.edits.apklistings.update,
285
- parameters: {
286
- 'apkVersionCode' => apk_listing.apk_version_code,
287
- 'editId' => current_edit.data.id,
288
- 'packageName' => current_package_name,
289
- 'language' => apk_listing.language
290
- },
291
- body_object: body_object,
292
- authorization: auth_client
293
- )
294
- raise result.error_message.red if result.error?
204
+ apk_listing_object = Androidpublisher::ApkListing.new({
205
+ language: apk_listing.language,
206
+ recent_changes: apk_listing.recent_changes
207
+ })
208
+
209
+ android_publisher.update_apk_listing(
210
+ current_package_name,
211
+ current_edit.id,
212
+ apk_listing.apk_version_code,
213
+ apk_listing.language,
214
+ apk_listing_object)
295
215
  end
296
216
 
297
217
  #####################################################
@@ -301,58 +221,36 @@ module Supply
301
221
  def fetch_images(image_type: nil, language: nil)
302
222
  ensure_active_edit!
303
223
 
304
- result = api_client.execute(
305
- api_method: android_publisher.edits.images.list,
306
- parameters: {
307
- 'editId' => current_edit.data.id,
308
- 'packageName' => current_package_name,
309
- 'language' => language,
310
- 'imageType' => image_type
311
- },
312
- authorization: auth_client
313
- )
314
-
315
- raise result.error_message.red if result.error?
224
+ result = android_publisher.list_images(
225
+ current_package_name,
226
+ current_edit.id,
227
+ language,
228
+ image_type)
316
229
 
317
- result.data.images.collect(&:url)
230
+ (result.images || []).map(&:url)
318
231
  end
319
232
 
320
233
  # @param image_type (e.g. phoneScreenshots, sevenInchScreenshots, ...)
321
234
  def upload_image(image_path: nil, image_type: nil, language: nil)
322
235
  ensure_active_edit!
323
236
 
324
- image = Google::APIClient::UploadIO.new(image_path, 'image/*')
325
- result = api_client.execute(
326
- api_method: android_publisher.edits.images.upload,
327
- parameters: {
328
- 'editId' => current_edit.data.id,
329
- 'packageName' => current_package_name,
330
- 'language' => language,
331
- 'imageType' => image_type,
332
- 'uploadType' => 'media'
333
- },
334
- media: image,
335
- authorization: auth_client
336
- )
337
-
338
- raise result.error_message.red if result.error?
237
+ android_publisher.upload_image(
238
+ current_package_name,
239
+ current_edit.id,
240
+ language,
241
+ image_type,
242
+ upload_source: image_path,
243
+ content_type: 'image/*')
339
244
  end
340
245
 
341
246
  def clear_screenshots(image_type: nil, language: nil)
342
247
  ensure_active_edit!
343
248
 
344
- result = @api_client.execute(
345
- api_method: @android_publisher.edits.images.deleteall,
346
- parameters: {
347
- 'editId' => current_edit.data.id,
348
- 'packageName' => current_package_name,
349
- 'language' => language,
350
- 'imageType' => image_type
351
- },
352
- authorization: auth_client
353
- )
354
-
355
- raise result.error_message if result.error?
249
+ android_publisher.delete_all_images(
250
+ current_package_name,
251
+ current_edit.id,
252
+ language,
253
+ image_type)
356
254
  end
357
255
 
358
256
  private
@@ -17,7 +17,7 @@ module Supply
17
17
  default_value: 'production',
18
18
  verify_block: proc do |value|
19
19
  available = %w(production beta alpha rollout)
20
- raise "Invalid value '#{value}', must be #{available.join(', ')}".red unless available.include? value
20
+ UI.user_error! "Invalid value '#{value}', must be #{available.join(', ')}" unless available.include? value
21
21
  end),
22
22
  FastlaneCore::ConfigItem.new(key: :rollout,
23
23
  short_option: "-r",
@@ -25,7 +25,7 @@ module Supply
25
25
  default_value: '1.0',
26
26
  verify_block: proc do |value|
27
27
  available = %w(0.005 0.01 0.05 0.1 0.2 0.5 1.0)
28
- raise "Invalid value '#{value}', must be #{available.join(', ')}".red unless available.include? value
28
+ UI.user_error! "Invalid value '#{value}', must be #{available.join(', ')}" unless available.include? value
29
29
  end),
30
30
  FastlaneCore::ConfigItem.new(key: :metadata_path,
31
31
  env_name: "SUPPLY_METADATA_PATH",
@@ -36,16 +36,34 @@ module Supply
36
36
  FastlaneCore::ConfigItem.new(key: :key,
37
37
  env_name: "SUPPLY_KEY",
38
38
  short_option: "-k",
39
+ conflicting_options: [:json_key],
40
+ optional: true, # deprecated
39
41
  description: "The p12 File used to authenticate with Google",
40
42
  default_value: Dir["*.p12"].first || CredentialsManager::AppfileConfig.try_fetch_value(:keyfile),
41
43
  verify_block: proc do |value|
42
- raise "Could not find p12 file at path '#{File.expand_path(value)}'".red unless File.exist?(File.expand_path(value))
44
+ UI.important("DEPRECATED --key OPTION. Use --json_key instead")
45
+ UI.user_error! "Could not find p12 file at path '#{File.expand_path(value)}'" unless File.exist?(File.expand_path(value))
43
46
  end),
44
47
  FastlaneCore::ConfigItem.new(key: :issuer,
45
- short_option: "-i",
46
48
  env_name: "SUPPLY_ISSUER",
49
+ short_option: "-i",
50
+ conflicting_options: [:json_key],
51
+ optional: true, # deprecated
47
52
  description: "The issuer of the p12 file (email address of the service account)",
48
- default_value: CredentialsManager::AppfileConfig.try_fetch_value(:issuer)),
53
+ default_value: CredentialsManager::AppfileConfig.try_fetch_value(:issuer),
54
+ verify_block: proc do |value|
55
+ UI.important("DEPRECATED --issuer OPTION. Use --json_key instead")
56
+ end),
57
+ FastlaneCore::ConfigItem.new(key: :json_key,
58
+ env_name: "SUPPLY_JSON_KEY",
59
+ short_option: "-j",
60
+ conflicting_options: [:issuer, :key],
61
+ optional: true, # this is shouldn't be optional but is until --key and --issuer are completely removed
62
+ description: "The service account json file used to authenticate with Google",
63
+ default_value: CredentialsManager::AppfileConfig.try_fetch_value(:json_key_file),
64
+ verify_block: proc do |value|
65
+ UI.user_error! "Could not find service account json file at path '#{File.expand_path(value)}'" unless File.exist?(File.expand_path(value))
66
+ end),
49
67
  FastlaneCore::ConfigItem.new(key: :apk,
50
68
  env_name: "SUPPLY_APK",
51
69
  description: "Path to the APK file to upload",
@@ -53,8 +71,8 @@ module Supply
53
71
  default_value: Dir["*.apk"].last || Dir[File.join("app", "build", "outputs", "apk", "app-Release.apk")].last,
54
72
  optional: true,
55
73
  verify_block: proc do |value|
56
- raise "Could not find apk file at path '#{value}'".red unless File.exist?(value)
57
- raise "apk file is not an apk".red unless value.end_with?(value)
74
+ UI.user_error! "Could not find apk file at path '#{value}'" unless File.exist?(value)
75
+ UI.user_error! "apk file is not an apk" unless value.end_with?(value)
58
76
  end),
59
77
  FastlaneCore::ConfigItem.new(key: :skip_upload_apk,
60
78
  env_name: "SUPPLY_SKIP_UPLOAD_APK",
data/lib/supply/setup.rb CHANGED
@@ -96,8 +96,7 @@ module Supply
96
96
  end
97
97
 
98
98
  def client
99
- @client ||= Client.new(path_to_key: Supply.config[:key],
100
- issuer: Supply.config[:issuer])
99
+ @client ||= Client.make_from_config
101
100
  end
102
101
  end
103
102
  end
@@ -8,7 +8,7 @@ module Supply
8
8
  raise "No local metadata found, make sure to run `supply init` to setup supply".red unless metadata_path || Supply.config[:apk]
9
9
 
10
10
  if metadata_path
11
- raise "Could not find folder".red unless File.directory? metadata_path
11
+ UI.user_error!("Could not find folder #{metadata_path}") unless File.directory? metadata_path
12
12
 
13
13
  Dir.foreach(metadata_path) do |language|
14
14
  next if language.start_with?('.') # e.g. . or .. or hidden folders
@@ -111,8 +111,7 @@ module Supply
111
111
  private
112
112
 
113
113
  def client
114
- @client ||= Client.new(path_to_key: Supply.config[:key],
115
- issuer: Supply.config[:issuer])
114
+ @client ||= Client.make_from_config
116
115
  end
117
116
 
118
117
  def metadata_path
@@ -1,4 +1,4 @@
1
1
  module Supply
2
- VERSION = "0.3.1".freeze
2
+ VERSION = "0.4.0".freeze
3
3
  DESCRIPTION = "Command line tool for updating Android apps and their metadata on the Google Play Store"
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: supply
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Felix Krause
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-09 00:00:00.000000000 Z
11
+ date: 2016-02-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: google-api-client
@@ -16,42 +16,42 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.8.6
19
+ version: 0.9.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.8.6
26
+ version: 0.9.1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: fastlane_core
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 0.30.0
33
+ version: 0.35.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 0.30.0
40
+ version: 0.35.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: credentials_manager
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: 0.10.0
47
+ version: 0.15.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: 0.10.0
54
+ version: 0.15.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: bundler
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -219,7 +219,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
219
219
  version: '0'
220
220
  requirements: []
221
221
  rubyforge_project:
222
- rubygems_version: 2.4.5.1
222
+ rubygems_version: 2.2.2
223
223
  signing_key:
224
224
  specification_version: 4
225
225
  summary: Command line tool for updating Android apps and their metadata on the Google