supply 0.2.2 → 0.3.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 +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
|