supply 0.3.1 → 0.4.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: 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