supply 0.2.2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +34 -12
- data/lib/supply.rb +4 -0
- data/lib/supply/apk_listing.rb +14 -0
- data/lib/supply/client.rb +69 -6
- data/lib/supply/options.rb +25 -1
- data/lib/supply/setup.rb +17 -0
- data/lib/supply/uploader.rb +24 -7
- data/lib/supply/version.rb +1 -1
- metadata +6 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4f83fc4e36d718344106107075628c0ec7d2132e
|
4
|
+
data.tar.gz: 2c2be0e69074bf70feabbef9088e19cbdb0bbd13
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 00b5fb9d566f858423e3a82e2f257f85a1cb3bb1436f8f4f6e94a1c9dd54315f15d658ed8e3358e24684756c826d968bee7668e1c61b4ac995c9170b5f797cc7
|
7
|
+
data.tar.gz: 88439d20a9115470efac14d99bb5da5cbcfadc7a2cebc66f20f847972cc290c9c71156752f8467fecc9e6a7dfc0abf4113f4ae3b9b4afe31adc1c5cd56fe6c9b
|
data/README.md
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
<a href="https://github.com/fastlane/deliver">deliver</a> •
|
10
10
|
<a href="https://github.com/fastlane/snapshot">snapshot</a> •
|
11
11
|
<a href="https://github.com/fastlane/frameit">frameit</a> •
|
12
|
-
<a href="https://github.com/fastlane/
|
12
|
+
<a href="https://github.com/fastlane/pem">pem</a> •
|
13
13
|
<a href="https://github.com/fastlane/sigh">sigh</a> •
|
14
14
|
<a href="https://github.com/fastlane/produce">produce</a> •
|
15
15
|
<a href="https://github.com/fastlane/cert">cert</a> •
|
@@ -17,7 +17,8 @@
|
|
17
17
|
<a href="https://github.com/fastlane/pilot">pilot</a> •
|
18
18
|
<a href="https://github.com/fastlane/boarding">boarding</a> •
|
19
19
|
<a href="https://github.com/fastlane/gym">gym</a> •
|
20
|
-
<a href="https://github.com/fastlane/scan">scan</a>
|
20
|
+
<a href="https://github.com/fastlane/scan">scan</a> •
|
21
|
+
<a href="https://github.com/fastlane/match">match</a>
|
21
22
|
</p>
|
22
23
|
-------
|
23
24
|
|
@@ -68,17 +69,19 @@ Install the gem
|
|
68
69
|
|
69
70
|
sudo gem install supply
|
70
71
|
|
71
|
-
## Setup
|
72
|
+
## Setup a Google Developers Service Account
|
72
73
|
|
73
74
|
- Open the [Google Play Console](https://play.google.com/apps/publish/)
|
74
|
-
-
|
75
|
-
-
|
76
|
-
-
|
77
|
-
- Select
|
78
|
-
-
|
79
|
-
- Make a note of the
|
80
|
-
- Back on the Google Play developer console, click
|
81
|
-
-
|
75
|
+
- Select **Settings** tab, followed by the **API access** tab
|
76
|
+
- Click the **Create Service Account** button and follow the **Google Developers Console** link in the dialog
|
77
|
+
- 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
|
81
|
+
- Back on the Google Play developer console, click **Done** to close the dialog
|
82
|
+
- Click on **Grant Access** for the newly added service account
|
83
|
+
- In the **Invite a New User** dialog, paste the service account email address you noted earlier into the **Email address** field
|
84
|
+
- Choose **Release Manager** from the **Role** dropdown and click **Send Invitation** to close the dialog
|
82
85
|
|
83
86
|
## Quick Start
|
84
87
|
|
@@ -128,9 +131,27 @@ And you can supply screenshots by creating directories with the following names,
|
|
128
131
|
- `sevenInchScreenshots/` (7-inch tablets)
|
129
132
|
- `tenInchScreenshots/` (10-inch tablets)
|
130
133
|
- `tvScreenshots/`
|
134
|
+
- `wearScreenshots/`
|
131
135
|
|
132
136
|
Note that these will replace the current images and screenshots on the play store listing, not add to them.
|
133
137
|
|
138
|
+
## Changelogs (What's new)
|
139
|
+
|
140
|
+
You can add changelog files under the `changelogs/` directory for each locale. The filename should exactly match the version code of the APK that it represents. `supply init` will populate changelog files from existing data on Google Play if no `metadata/` directory exists when it is run.
|
141
|
+
|
142
|
+
```
|
143
|
+
└── fastlane
|
144
|
+
└── metadata
|
145
|
+
└── android
|
146
|
+
├── en-US
|
147
|
+
│ └── changelogs
|
148
|
+
│ ├── 100000.txt
|
149
|
+
│ └── 100100.txt
|
150
|
+
└── fr-FR
|
151
|
+
└── changelogs
|
152
|
+
└── 100100.txt
|
153
|
+
```
|
154
|
+
|
134
155
|
## Tips
|
135
156
|
|
136
157
|
### [`fastlane`](https://fastlane.tools) Toolchain
|
@@ -139,7 +160,7 @@ Note that these will replace the current images and screenshots on the play stor
|
|
139
160
|
- [`deliver`](https://github.com/fastlane/deliver): Upload screenshots, metadata and your app to the App Store
|
140
161
|
- [`snapshot`](https://github.com/fastlane/snapshot): Automate taking localized screenshots of your iOS app on every device
|
141
162
|
- [`frameit`](https://github.com/fastlane/frameit): Quickly put your screenshots into the right device frames
|
142
|
-
- [`
|
163
|
+
- [`pem`](https://github.com/fastlane/pem): Automatically generate and renew your push notification profiles
|
143
164
|
- [`sigh`](https://github.com/fastlane/sigh): Because you would rather spend your time building stuff than fighting provisioning
|
144
165
|
- [`produce`](https://github.com/fastlane/produce): Create new iOS apps on iTunes Connect and Dev Portal using the command line
|
145
166
|
- [`cert`](https://github.com/fastlane/cert): Automatically create and maintain iOS code signing certificates
|
@@ -148,6 +169,7 @@ Note that these will replace the current images and screenshots on the play stor
|
|
148
169
|
- [`pilot`](https://github.com/fastlane/pilot): The best way to manage your TestFlight testers and builds from your terminal
|
149
170
|
- [`boarding`](https://github.com/fastlane/boarding): The easiest way to invite your TestFlight beta testers
|
150
171
|
- [`gym`](https://github.com/fastlane/gym): Building your iOS apps has never been easier
|
172
|
+
- [`match`](https://github.com/fastlane/match): Easily sync your certificates and profiles across your team using git
|
151
173
|
|
152
174
|
##### [Like this tool? Be the first to know about updates and new fastlane tools](https://tinyletter.com/krausefx)
|
153
175
|
|
data/lib/supply.rb
CHANGED
@@ -3,6 +3,7 @@ require 'supply/version'
|
|
3
3
|
require 'supply/options'
|
4
4
|
require 'supply/client'
|
5
5
|
require 'supply/listing'
|
6
|
+
require 'supply/apk_listing'
|
6
7
|
require 'supply/uploader'
|
7
8
|
|
8
9
|
require 'fastlane_core'
|
@@ -20,5 +21,8 @@ module Supply
|
|
20
21
|
IMAGES_FOLDER_NAME = "images"
|
21
22
|
IMAGE_FILE_EXTENSIONS = "{png,jpg,jpeg}"
|
22
23
|
|
24
|
+
CHANGELOGS_FOLDER_NAME = "changelogs"
|
25
|
+
|
23
26
|
Helper = FastlaneCore::Helper # you gotta love Ruby: Helper.* should use the Helper class contained in FastlaneCore
|
27
|
+
UI = FastlaneCore::UI
|
24
28
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Supply
|
2
|
+
class ApkListing
|
3
|
+
attr_accessor :recent_changes
|
4
|
+
attr_accessor :language
|
5
|
+
attr_accessor :apk_version_code
|
6
|
+
|
7
|
+
# Initializes the apk listing with the current listing if available
|
8
|
+
def initialize(recent_changes, language, apk_version_code)
|
9
|
+
self.recent_changes = recent_changes
|
10
|
+
self.language = language
|
11
|
+
self.apk_version_code = apk_version_code
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/supply/client.rb
CHANGED
@@ -161,6 +161,45 @@ module Supply
|
|
161
161
|
end
|
162
162
|
end
|
163
163
|
|
164
|
+
# Get a list of all apks verion codes - returns the list of version codes
|
165
|
+
def apks_version_codes
|
166
|
+
ensure_active_edit!
|
167
|
+
|
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
|
+
)
|
176
|
+
|
177
|
+
raise result.error_message.red if result.error? && result.status != 404
|
178
|
+
|
179
|
+
return result.data.apks.collect(&:versionCode)
|
180
|
+
end
|
181
|
+
|
182
|
+
# Get a list of all apk listings (changelogs) - returns the list
|
183
|
+
def apk_listings(apk_version_code)
|
184
|
+
ensure_active_edit!
|
185
|
+
|
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
|
197
|
+
|
198
|
+
return result.data.listings.collect do |row|
|
199
|
+
ApkListing.new(row.recentChanges, row.language, apk_version_code)
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
164
203
|
#####################################################
|
165
204
|
# @!group Modifying data
|
166
205
|
#####################################################
|
@@ -190,11 +229,7 @@ module Supply
|
|
190
229
|
raise result.error_message.red if result.error?
|
191
230
|
end
|
192
231
|
|
193
|
-
def
|
194
|
-
upload_apk_to_track_with_rollout(path_to_apk, track, 1.0)
|
195
|
-
end
|
196
|
-
|
197
|
-
def upload_apk_to_track_with_rollout(path_to_apk, track, rollout)
|
232
|
+
def upload_apk(path_to_apk)
|
198
233
|
ensure_active_edit!
|
199
234
|
|
200
235
|
apk = Google::APIClient::UploadIO.new(File.expand_path(path_to_apk), 'application/vnd.android.package-archive')
|
@@ -211,10 +246,16 @@ module Supply
|
|
211
246
|
|
212
247
|
raise result_upload.error_message.red if result_upload.error?
|
213
248
|
|
249
|
+
return result_upload.data.versionCode
|
250
|
+
end
|
251
|
+
|
252
|
+
def update_track(track, rollout, apk_version_code)
|
253
|
+
ensure_active_edit!
|
254
|
+
|
214
255
|
track_body = {
|
215
256
|
'track' => track,
|
216
257
|
'userFraction' => rollout,
|
217
|
-
'versionCodes' => [
|
258
|
+
'versionCodes' => [apk_version_code]
|
218
259
|
}
|
219
260
|
|
220
261
|
result_update = api_client.execute(
|
@@ -231,6 +272,28 @@ module Supply
|
|
231
272
|
raise result_update.error_message.red if result_update.error?
|
232
273
|
end
|
233
274
|
|
275
|
+
def update_apk_listing_for_language(apk_listing)
|
276
|
+
ensure_active_edit!
|
277
|
+
|
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?
|
295
|
+
end
|
296
|
+
|
234
297
|
#####################################################
|
235
298
|
# @!group Screenshots
|
236
299
|
#####################################################
|
data/lib/supply/options.rb
CHANGED
@@ -58,7 +58,31 @@ module Supply
|
|
58
58
|
verify_block: proc do |value|
|
59
59
|
raise "Could not find apk file at path '#{value}'".red unless File.exist?(value)
|
60
60
|
raise "apk file is not an apk".red unless value.end_with?(value)
|
61
|
-
end)
|
61
|
+
end),
|
62
|
+
FastlaneCore::ConfigItem.new(key: :skip_upload_apk,
|
63
|
+
env_name: "SUPPLY_SKIP_UPLOAD_APK",
|
64
|
+
optional: true,
|
65
|
+
description: "Whether to skip uploading APK",
|
66
|
+
is_string: false,
|
67
|
+
default_value: false),
|
68
|
+
FastlaneCore::ConfigItem.new(key: :skip_upload_metadata,
|
69
|
+
env_name: "SUPPLY_SKIP_UPLOAD_METADATA",
|
70
|
+
optional: true,
|
71
|
+
description: "Whether to skip uploading metadata",
|
72
|
+
is_string: false,
|
73
|
+
default_value: false),
|
74
|
+
FastlaneCore::ConfigItem.new(key: :skip_upload_images,
|
75
|
+
env_name: "SUPPLY_SKIP_UPLOAD_IMAGES",
|
76
|
+
optional: true,
|
77
|
+
description: "Whether to skip uploading images, screenshots not included",
|
78
|
+
is_string: false,
|
79
|
+
default_value: false),
|
80
|
+
FastlaneCore::ConfigItem.new(key: :skip_upload_screenshots,
|
81
|
+
env_name: "SUPPLY_SKIP_UPLOAD_SCREENSHOTS",
|
82
|
+
optional: true,
|
83
|
+
description: "Whether to skip uploading SCREENSHOTS",
|
84
|
+
is_string: false,
|
85
|
+
default_value: false)
|
62
86
|
]
|
63
87
|
end
|
64
88
|
end
|
data/lib/supply/setup.rb
CHANGED
@@ -14,6 +14,12 @@ module Supply
|
|
14
14
|
download_images(listing)
|
15
15
|
end
|
16
16
|
|
17
|
+
client.apks_version_codes.each do |apk_version_code|
|
18
|
+
client.apk_listings(apk_version_code).each do |apk_listing|
|
19
|
+
store_apk_listing(apk_listing)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
17
23
|
client.abort_current_edit
|
18
24
|
|
19
25
|
Helper.log.info "Successfully stored metadata in '#{metadata_path}'".green
|
@@ -64,6 +70,17 @@ module Supply
|
|
64
70
|
Helper.log.info "Due to the limit of the Google Play API `supply` can't download your existing screenshots..."
|
65
71
|
end
|
66
72
|
|
73
|
+
def store_apk_listing(apk_listing)
|
74
|
+
containing = File.join(metadata_path, apk_listing.language, CHANGELOGS_FOLDER_NAME)
|
75
|
+
unless File.exist?(containing)
|
76
|
+
FileUtils.mkdir_p(containing)
|
77
|
+
end
|
78
|
+
|
79
|
+
path = File.join(containing, "#{apk_listing.apk_version_code}.txt")
|
80
|
+
Helper.log.info "Writing to #{path}..."
|
81
|
+
File.write(path, apk_listing.recent_changes)
|
82
|
+
end
|
83
|
+
|
67
84
|
private
|
68
85
|
|
69
86
|
def metadata_path
|
data/lib/supply/uploader.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Supply
|
2
2
|
class Uploader
|
3
3
|
def perform_upload
|
4
|
-
FastlaneCore::PrintTable.print_values(config: Supply.config, hide_keys: [:issuer], title: "Summary for
|
4
|
+
FastlaneCore::PrintTable.print_values(config: Supply.config, hide_keys: [:issuer], title: "Summary for supply #{Supply::VERSION}")
|
5
5
|
|
6
6
|
client.begin_edit(package_name: Supply.config[:package_name])
|
7
7
|
|
@@ -13,13 +13,13 @@ module Supply
|
|
13
13
|
|
14
14
|
listing = client.listing_for_language(language)
|
15
15
|
|
16
|
-
upload_metadata(language, listing)
|
17
|
-
upload_images(language)
|
18
|
-
upload_screenshots(language)
|
16
|
+
upload_metadata(language, listing) unless Supply.config[:skip_upload_metadata]
|
17
|
+
upload_images(language) unless Supply.config[:skip_upload_images]
|
18
|
+
upload_screenshots(language) unless Supply.config[:skip_upload_screenshots]
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
-
upload_binary
|
22
|
+
upload_binary unless Supply.config[:skip_upload_apk]
|
23
23
|
|
24
24
|
Helper.log.info "Uploading all changes to Google Play..."
|
25
25
|
client.commit_current_edit!
|
@@ -69,11 +69,28 @@ module Supply
|
|
69
69
|
def upload_binary
|
70
70
|
if Supply.config[:apk]
|
71
71
|
Helper.log.info "Preparing apk at path '#{Supply.config[:apk]}' for upload..."
|
72
|
+
apk_version_code = client.upload_apk(Supply.config[:apk])
|
73
|
+
|
74
|
+
Helper.log.info "Updating track '#{Supply.config[:track]}'..."
|
72
75
|
if Supply.config[:track].eql? "rollout"
|
73
|
-
client.
|
76
|
+
client.update_track(Supply.config[:track], Supply.config[:rollout], apk_version_code)
|
74
77
|
else
|
75
|
-
client.
|
78
|
+
client.update_track(Supply.config[:track], 1.0, apk_version_code)
|
79
|
+
end
|
80
|
+
|
81
|
+
if metadata_path
|
82
|
+
Dir.foreach(metadata_path) do |language|
|
83
|
+
next if language.start_with?('.') # e.g. . or .. or hidden folders
|
84
|
+
|
85
|
+
path = File.join(metadata_path, language, Supply::CHANGELOGS_FOLDER_NAME, "#{apk_version_code}.txt")
|
86
|
+
if File.exist?(path)
|
87
|
+
Helper.log.info "Updating changelog for code version '#{apk_version_code}' and language '#{language}'..."
|
88
|
+
apk_listing = ApkListing.new(File.read(path), language, apk_version_code)
|
89
|
+
client.update_apk_listing_for_language(apk_listing)
|
90
|
+
end
|
91
|
+
end
|
76
92
|
end
|
93
|
+
|
77
94
|
else
|
78
95
|
Helper.log.info "No apk file found, you can pass the path to your apk using the `apk` option"
|
79
96
|
end
|
data/lib/supply/version.rb
CHANGED
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.
|
4
|
+
version: 0.3.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:
|
11
|
+
date: 2016-01-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: google-api-client
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.
|
33
|
+
version: 0.30.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.
|
40
|
+
version: 0.30.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: credentials_manager
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -191,6 +191,7 @@ files:
|
|
191
191
|
- README.md
|
192
192
|
- bin/supply
|
193
193
|
- lib/supply.rb
|
194
|
+
- lib/supply/apk_listing.rb
|
194
195
|
- lib/supply/client.rb
|
195
196
|
- lib/supply/commands_generator.rb
|
196
197
|
- lib/supply/listing.rb
|
@@ -218,7 +219,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
218
219
|
version: '0'
|
219
220
|
requirements: []
|
220
221
|
rubyforge_project:
|
221
|
-
rubygems_version: 2.
|
222
|
+
rubygems_version: 2.2.2
|
222
223
|
signing_key:
|
223
224
|
specification_version: 4
|
224
225
|
summary: Command line tool for updating Android apps and their metadata on the Google
|