itunes_transporter_generator 0.4.4 → 0.4.5
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +31 -26
- data/example/config.yaml +12 -12
- data/example/metadata.xml +18 -17
- data/example/sample sku.itmsp/test.jpg b/data/example/sample → sku.itmsp/1_iOS-3.5-in_test.jpg +0 -0
- data/example/sample sku.itmsp/1_iOS-4-in_test.jpg +0 -0
- data/example/sample sku.itmsp/1_iOS-iPad_test.jpg +0 -0
- data/example/sample sku.itmsp/achievement_first_achievement_test.jpg +0 -0
- data/example/sample sku.itmsp/iap_Sample_Product_Group_test.jpg +0 -0
- data/example/sample sku.itmsp/iap_another_level_test.jpg +0 -0
- data/example/sample sku.itmsp/iap_new_level_test.jpg +0 -0
- data/example/sample sku.itmsp/iap_one_hundred_dollars_test.jpg +0 -0
- data/example/sample sku.itmsp/leaderboard_top_scores_en_test.jpg +0 -0
- data/example/sample sku.itmsp/metadata.xml +18 -17
- data/itunes_transporter_generator.sublime-project +1 -1
- data/lib/itunes.rb +1 -1
- data/lib/itunes/transporter.rb +66 -0
- data/lib/itunes/transporter/generator.rb +53 -32
- data/lib/itunes/transporter/helpers.rb +11 -17
- metadata +11 -3
data/README.md
CHANGED
@@ -29,7 +29,7 @@ You can now upload your .itmsp package to iTunes Connect using the Transporter t
|
|
29
29
|
## Sample Config file
|
30
30
|
Below is a sample configuration file describing an achievement, leaderboard, and in-app purchase. The specific metadata required for each item type is fully described in the [App Metadata Specification guide](http://bit.ly/TtHMF6)
|
31
31
|
|
32
|
-
IMPORTANT: please note the syntax for multiline descriptions. This is the literal syntax for YAML used for multiline strings
|
32
|
+
IMPORTANT: please note the syntax for multiline descriptions with extra line breaks. This is the literal syntax for [YAML used for multiline strings](http://www.yaml.org/YAML_for_ruby.html#extra_trailing_newlines_with_spaces). Also note the indentation.
|
33
33
|
|
34
34
|
```yaml
|
35
35
|
provider: SampleCompany # optional if team_id is supplied
|
@@ -41,21 +41,28 @@ versions:
|
|
41
41
|
locales:
|
42
42
|
- name: en-US
|
43
43
|
title: sampleApp
|
44
|
-
description:
|
44
|
+
description: |+
|
45
45
|
Description of sampleApp. This description
|
46
46
|
spans multiple lines using the pipe
|
47
47
|
characters. All newlines are preserved.
|
48
48
|
keywords:
|
49
49
|
- Sample
|
50
50
|
- App
|
51
|
-
version_whats_new:
|
51
|
+
version_whats_new: |+
|
52
|
+
Version Whats New. extra
|
53
|
+
line
|
54
|
+
breaks
|
55
|
+
|
52
56
|
software_url: 'http://example.com'
|
53
57
|
privacy_url: 'http://example.com'
|
54
58
|
support_url: 'http://example.com'
|
55
59
|
screenshots:
|
56
|
-
|
57
|
-
|
58
|
-
|
60
|
+
iphone_4in:
|
61
|
+
- 'test.jpg'
|
62
|
+
iphone_3.5in:
|
63
|
+
- 'test.jpg'
|
64
|
+
ipad:
|
65
|
+
- 'test.jpg'
|
59
66
|
achievements: # the order in which achievements are defined will be the order in which they appear in Game Center
|
60
67
|
- id: first_achievement
|
61
68
|
name: First Achievement
|
@@ -144,7 +151,6 @@ purchases:
|
|
144
151
|
- name: en
|
145
152
|
title: Unlocks a new level
|
146
153
|
description: Try your luck at this new level
|
147
|
-
|
148
154
|
```
|
149
155
|
|
150
156
|
This configuration will generate the following metadata.xml:
|
@@ -171,28 +177,29 @@ characters. All newlines are preserved.
|
|
171
177
|
<keyword>Sample</keyword>
|
172
178
|
<keyword>App</keyword>
|
173
179
|
</keywords>
|
174
|
-
<version_whats_new>
|
180
|
+
<version_whats_new>
|
181
|
+
<![CDATA[Version Whats New. extra
|
182
|
+
line
|
183
|
+
breaks
|
184
|
+
|
185
|
+
]]>
|
186
|
+
</version_whats_new>
|
175
187
|
<software_url>http://example.com</software_url>
|
176
188
|
<privacy_url>http://example.com</privacy_url>
|
177
189
|
<support_url>http://example.com</support_url>
|
178
190
|
<software_screenshots>
|
179
|
-
<software_screenshot display_target="iOS-
|
180
|
-
<file_name>
|
191
|
+
<software_screenshot display_target="iOS-4-in" position="1">
|
192
|
+
<file_name>1_iOS-4-in_test.jpg</file_name>
|
181
193
|
<size>20092</size>
|
182
194
|
<checksum type="md5">ff5bd97a5f40bb75a84884589ecbfc42</checksum>
|
183
195
|
</software_screenshot>
|
184
|
-
<software_screenshot display_target="iOS-3.5-in" position="
|
185
|
-
<file_name>
|
196
|
+
<software_screenshot display_target="iOS-3.5-in" position="1">
|
197
|
+
<file_name>1_iOS-3.5-in_test.jpg</file_name>
|
186
198
|
<size>20092</size>
|
187
199
|
<checksum type="md5">ff5bd97a5f40bb75a84884589ecbfc42</checksum>
|
188
200
|
</software_screenshot>
|
189
201
|
<software_screenshot display_target="iOS-iPad" position="1">
|
190
|
-
<file_name>
|
191
|
-
<size>20092</size>
|
192
|
-
<checksum type="md5">ff5bd97a5f40bb75a84884589ecbfc42</checksum>
|
193
|
-
</software_screenshot>
|
194
|
-
<software_screenshot display_target="iOS-iPad" position="2">
|
195
|
-
<file_name>test.jpg</file_name>
|
202
|
+
<file_name>1_iOS-iPad_test.jpg</file_name>
|
196
203
|
<size>20092</size>
|
197
204
|
<checksum type="md5">ff5bd97a5f40bb75a84884589ecbfc42</checksum>
|
198
205
|
</software_screenshot>
|
@@ -215,7 +222,7 @@ characters. All newlines are preserved.
|
|
215
222
|
<before_earned_description>Complete a task</before_earned_description>
|
216
223
|
<after_earned_description>Completed a task</after_earned_description>
|
217
224
|
<achievement_after_earned_image>
|
218
|
-
<file_name>
|
225
|
+
<file_name>achievement_first_achievement_test.jpg</file_name>
|
219
226
|
<size>20092</size>
|
220
227
|
<checksum type="md5">ff5bd97a5f40bb75a84884589ecbfc42</checksum>
|
221
228
|
</achievement_after_earned_image>
|
@@ -235,7 +242,7 @@ characters. All newlines are preserved.
|
|
235
242
|
<formatter_suffix_singular> Point</formatter_suffix_singular>
|
236
243
|
<formatter_type>INTEGER_COMMA_SEPARATOR</formatter_type>
|
237
244
|
<leaderboard_image>
|
238
|
-
<file_name>
|
245
|
+
<file_name>leaderboard_top_scores_en_test.jpg</file_name>
|
239
246
|
<size>20092</size>
|
240
247
|
<checksum type="md5">ff5bd97a5f40bb75a84884589ecbfc42</checksum>
|
241
248
|
</leaderboard_image>
|
@@ -254,7 +261,7 @@ characters. All newlines are preserved.
|
|
254
261
|
</locale>
|
255
262
|
</locales>
|
256
263
|
<review_screenshot>
|
257
|
-
<file_name>
|
264
|
+
<file_name>iap_Sample_Product_Group_test.jpg</file_name>
|
258
265
|
<size>20092</size>
|
259
266
|
<checksum type="md5">ff5bd97a5f40bb75a84884589ecbfc42</checksum>
|
260
267
|
</review_screenshot>
|
@@ -302,7 +309,7 @@ characters. All newlines are preserved.
|
|
302
309
|
</locale>
|
303
310
|
</locales>
|
304
311
|
<review_screenshot>
|
305
|
-
<file_name>
|
312
|
+
<file_name>iap_one_hundred_dollars_test.jpg</file_name>
|
306
313
|
<size>20092</size>
|
307
314
|
<checksum type="md5">ff5bd97a5f40bb75a84884589ecbfc42</checksum>
|
308
315
|
</review_screenshot>
|
@@ -335,7 +342,7 @@ characters. All newlines are preserved.
|
|
335
342
|
</locale>
|
336
343
|
</locales>
|
337
344
|
<review_screenshot>
|
338
|
-
<file_name>
|
345
|
+
<file_name>iap_new_level_test.jpg</file_name>
|
339
346
|
<size>20092</size>
|
340
347
|
<checksum type="md5">ff5bd97a5f40bb75a84884589ecbfc42</checksum>
|
341
348
|
</review_screenshot>
|
@@ -366,7 +373,7 @@ characters. All newlines are preserved.
|
|
366
373
|
</locale>
|
367
374
|
</locales>
|
368
375
|
<review_screenshot>
|
369
|
-
<file_name>
|
376
|
+
<file_name>iap_another_level_test.jpg</file_name>
|
370
377
|
<size>20092</size>
|
371
378
|
<checksum type="md5">ff5bd97a5f40bb75a84884589ecbfc42</checksum>
|
372
379
|
</review_screenshot>
|
@@ -375,8 +382,6 @@ characters. All newlines are preserved.
|
|
375
382
|
</software_metadata>
|
376
383
|
</software>
|
377
384
|
</package>
|
378
|
-
|
379
|
-
|
380
385
|
```
|
381
386
|
|
382
387
|
## Todo
|
data/example/config.yaml
CHANGED
@@ -7,28 +7,28 @@ versions:
|
|
7
7
|
locales:
|
8
8
|
- name: en-US
|
9
9
|
title: sampleApp
|
10
|
-
description:
|
10
|
+
description: |+
|
11
11
|
Description of sampleApp. This description
|
12
12
|
spans multiple lines using the pipe
|
13
13
|
characters. All newlines are preserved.
|
14
14
|
keywords:
|
15
15
|
- Sample
|
16
16
|
- App
|
17
|
-
version_whats_new:
|
17
|
+
version_whats_new: |+
|
18
|
+
Version Whats New. extra
|
19
|
+
line
|
20
|
+
breaks
|
21
|
+
|
18
22
|
software_url: 'http://example.com'
|
19
23
|
privacy_url: 'http://example.com'
|
20
24
|
support_url: 'http://example.com'
|
21
25
|
screenshots:
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
- display_target: 'iOS-iPad'
|
29
|
-
file_name: 'test.jpg'
|
30
|
-
|
31
|
-
|
26
|
+
iphone_4in:
|
27
|
+
- 'test.jpg'
|
28
|
+
iphone_3.5in:
|
29
|
+
- 'test.jpg'
|
30
|
+
ipad:
|
31
|
+
- 'test.jpg'
|
32
32
|
achievements: # the order in which achievements are defined will be the order in which they appear in Game Center
|
33
33
|
- id: first_achievement
|
34
34
|
name: First Achievement
|
data/example/metadata.xml
CHANGED
@@ -20,28 +20,29 @@ characters. All newlines are preserved.
|
|
20
20
|
<keyword>Sample</keyword>
|
21
21
|
<keyword>App</keyword>
|
22
22
|
</keywords>
|
23
|
-
<version_whats_new>
|
23
|
+
<version_whats_new>
|
24
|
+
<![CDATA[Version Whats New. extra
|
25
|
+
line
|
26
|
+
breaks
|
27
|
+
|
28
|
+
]]>
|
29
|
+
</version_whats_new>
|
24
30
|
<software_url>http://example.com</software_url>
|
25
31
|
<privacy_url>http://example.com</privacy_url>
|
26
32
|
<support_url>http://example.com</support_url>
|
27
33
|
<software_screenshots>
|
28
|
-
<software_screenshot display_target="iOS-
|
29
|
-
<file_name>
|
34
|
+
<software_screenshot display_target="iOS-4-in" position="1">
|
35
|
+
<file_name>1_iOS-4-in_test.jpg</file_name>
|
30
36
|
<size>20092</size>
|
31
37
|
<checksum type="md5">ff5bd97a5f40bb75a84884589ecbfc42</checksum>
|
32
38
|
</software_screenshot>
|
33
|
-
<software_screenshot display_target="iOS-3.5-in" position="
|
34
|
-
<file_name>
|
39
|
+
<software_screenshot display_target="iOS-3.5-in" position="1">
|
40
|
+
<file_name>1_iOS-3.5-in_test.jpg</file_name>
|
35
41
|
<size>20092</size>
|
36
42
|
<checksum type="md5">ff5bd97a5f40bb75a84884589ecbfc42</checksum>
|
37
43
|
</software_screenshot>
|
38
44
|
<software_screenshot display_target="iOS-iPad" position="1">
|
39
|
-
<file_name>
|
40
|
-
<size>20092</size>
|
41
|
-
<checksum type="md5">ff5bd97a5f40bb75a84884589ecbfc42</checksum>
|
42
|
-
</software_screenshot>
|
43
|
-
<software_screenshot display_target="iOS-iPad" position="2">
|
44
|
-
<file_name>test.jpg</file_name>
|
45
|
+
<file_name>1_iOS-iPad_test.jpg</file_name>
|
45
46
|
<size>20092</size>
|
46
47
|
<checksum type="md5">ff5bd97a5f40bb75a84884589ecbfc42</checksum>
|
47
48
|
</software_screenshot>
|
@@ -64,7 +65,7 @@ characters. All newlines are preserved.
|
|
64
65
|
<before_earned_description>Complete a task</before_earned_description>
|
65
66
|
<after_earned_description>Completed a task</after_earned_description>
|
66
67
|
<achievement_after_earned_image>
|
67
|
-
<file_name>
|
68
|
+
<file_name>achievement_first_achievement_test.jpg</file_name>
|
68
69
|
<size>20092</size>
|
69
70
|
<checksum type="md5">ff5bd97a5f40bb75a84884589ecbfc42</checksum>
|
70
71
|
</achievement_after_earned_image>
|
@@ -84,7 +85,7 @@ characters. All newlines are preserved.
|
|
84
85
|
<formatter_suffix_singular> Point</formatter_suffix_singular>
|
85
86
|
<formatter_type>INTEGER_COMMA_SEPARATOR</formatter_type>
|
86
87
|
<leaderboard_image>
|
87
|
-
<file_name>
|
88
|
+
<file_name>leaderboard_top_scores_en_test.jpg</file_name>
|
88
89
|
<size>20092</size>
|
89
90
|
<checksum type="md5">ff5bd97a5f40bb75a84884589ecbfc42</checksum>
|
90
91
|
</leaderboard_image>
|
@@ -103,7 +104,7 @@ characters. All newlines are preserved.
|
|
103
104
|
</locale>
|
104
105
|
</locales>
|
105
106
|
<review_screenshot>
|
106
|
-
<file_name>
|
107
|
+
<file_name>iap_Sample_Product_Group_test.jpg</file_name>
|
107
108
|
<size>20092</size>
|
108
109
|
<checksum type="md5">ff5bd97a5f40bb75a84884589ecbfc42</checksum>
|
109
110
|
</review_screenshot>
|
@@ -151,7 +152,7 @@ characters. All newlines are preserved.
|
|
151
152
|
</locale>
|
152
153
|
</locales>
|
153
154
|
<review_screenshot>
|
154
|
-
<file_name>
|
155
|
+
<file_name>iap_one_hundred_dollars_test.jpg</file_name>
|
155
156
|
<size>20092</size>
|
156
157
|
<checksum type="md5">ff5bd97a5f40bb75a84884589ecbfc42</checksum>
|
157
158
|
</review_screenshot>
|
@@ -184,7 +185,7 @@ characters. All newlines are preserved.
|
|
184
185
|
</locale>
|
185
186
|
</locales>
|
186
187
|
<review_screenshot>
|
187
|
-
<file_name>
|
188
|
+
<file_name>iap_new_level_test.jpg</file_name>
|
188
189
|
<size>20092</size>
|
189
190
|
<checksum type="md5">ff5bd97a5f40bb75a84884589ecbfc42</checksum>
|
190
191
|
</review_screenshot>
|
@@ -215,7 +216,7 @@ characters. All newlines are preserved.
|
|
215
216
|
</locale>
|
216
217
|
</locales>
|
217
218
|
<review_screenshot>
|
218
|
-
<file_name>
|
219
|
+
<file_name>iap_another_level_test.jpg</file_name>
|
219
220
|
<size>20092</size>
|
220
221
|
<checksum type="md5">ff5bd97a5f40bb75a84884589ecbfc42</checksum>
|
221
222
|
</review_screenshot>
|
data/example/sample sku.itmsp/test.jpg b/data/example/sample → sku.itmsp/1_iOS-3.5-in_test.jpg
RENAMED
File without changes
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -20,28 +20,29 @@ characters. All newlines are preserved.
|
|
20
20
|
<keyword>Sample</keyword>
|
21
21
|
<keyword>App</keyword>
|
22
22
|
</keywords>
|
23
|
-
<version_whats_new>
|
23
|
+
<version_whats_new>
|
24
|
+
<![CDATA[Version Whats New. extra
|
25
|
+
line
|
26
|
+
breaks
|
27
|
+
|
28
|
+
]]>
|
29
|
+
</version_whats_new>
|
24
30
|
<software_url>http://example.com</software_url>
|
25
31
|
<privacy_url>http://example.com</privacy_url>
|
26
32
|
<support_url>http://example.com</support_url>
|
27
33
|
<software_screenshots>
|
28
|
-
<software_screenshot display_target="iOS-
|
29
|
-
<file_name>
|
34
|
+
<software_screenshot display_target="iOS-4-in" position="1">
|
35
|
+
<file_name>1_iOS-4-in_test.jpg</file_name>
|
30
36
|
<size>20092</size>
|
31
37
|
<checksum type="md5">ff5bd97a5f40bb75a84884589ecbfc42</checksum>
|
32
38
|
</software_screenshot>
|
33
|
-
<software_screenshot display_target="iOS-3.5-in" position="
|
34
|
-
<file_name>
|
39
|
+
<software_screenshot display_target="iOS-3.5-in" position="1">
|
40
|
+
<file_name>1_iOS-3.5-in_test.jpg</file_name>
|
35
41
|
<size>20092</size>
|
36
42
|
<checksum type="md5">ff5bd97a5f40bb75a84884589ecbfc42</checksum>
|
37
43
|
</software_screenshot>
|
38
44
|
<software_screenshot display_target="iOS-iPad" position="1">
|
39
|
-
<file_name>
|
40
|
-
<size>20092</size>
|
41
|
-
<checksum type="md5">ff5bd97a5f40bb75a84884589ecbfc42</checksum>
|
42
|
-
</software_screenshot>
|
43
|
-
<software_screenshot display_target="iOS-iPad" position="2">
|
44
|
-
<file_name>test.jpg</file_name>
|
45
|
+
<file_name>1_iOS-iPad_test.jpg</file_name>
|
45
46
|
<size>20092</size>
|
46
47
|
<checksum type="md5">ff5bd97a5f40bb75a84884589ecbfc42</checksum>
|
47
48
|
</software_screenshot>
|
@@ -64,7 +65,7 @@ characters. All newlines are preserved.
|
|
64
65
|
<before_earned_description>Complete a task</before_earned_description>
|
65
66
|
<after_earned_description>Completed a task</after_earned_description>
|
66
67
|
<achievement_after_earned_image>
|
67
|
-
<file_name>
|
68
|
+
<file_name>achievement_first_achievement_test.jpg</file_name>
|
68
69
|
<size>20092</size>
|
69
70
|
<checksum type="md5">ff5bd97a5f40bb75a84884589ecbfc42</checksum>
|
70
71
|
</achievement_after_earned_image>
|
@@ -84,7 +85,7 @@ characters. All newlines are preserved.
|
|
84
85
|
<formatter_suffix_singular> Point</formatter_suffix_singular>
|
85
86
|
<formatter_type>INTEGER_COMMA_SEPARATOR</formatter_type>
|
86
87
|
<leaderboard_image>
|
87
|
-
<file_name>
|
88
|
+
<file_name>leaderboard_top_scores_en_test.jpg</file_name>
|
88
89
|
<size>20092</size>
|
89
90
|
<checksum type="md5">ff5bd97a5f40bb75a84884589ecbfc42</checksum>
|
90
91
|
</leaderboard_image>
|
@@ -103,7 +104,7 @@ characters. All newlines are preserved.
|
|
103
104
|
</locale>
|
104
105
|
</locales>
|
105
106
|
<review_screenshot>
|
106
|
-
<file_name>
|
107
|
+
<file_name>iap_Sample_Product_Group_test.jpg</file_name>
|
107
108
|
<size>20092</size>
|
108
109
|
<checksum type="md5">ff5bd97a5f40bb75a84884589ecbfc42</checksum>
|
109
110
|
</review_screenshot>
|
@@ -151,7 +152,7 @@ characters. All newlines are preserved.
|
|
151
152
|
</locale>
|
152
153
|
</locales>
|
153
154
|
<review_screenshot>
|
154
|
-
<file_name>
|
155
|
+
<file_name>iap_one_hundred_dollars_test.jpg</file_name>
|
155
156
|
<size>20092</size>
|
156
157
|
<checksum type="md5">ff5bd97a5f40bb75a84884589ecbfc42</checksum>
|
157
158
|
</review_screenshot>
|
@@ -184,7 +185,7 @@ characters. All newlines are preserved.
|
|
184
185
|
</locale>
|
185
186
|
</locales>
|
186
187
|
<review_screenshot>
|
187
|
-
<file_name>
|
188
|
+
<file_name>iap_new_level_test.jpg</file_name>
|
188
189
|
<size>20092</size>
|
189
190
|
<checksum type="md5">ff5bd97a5f40bb75a84884589ecbfc42</checksum>
|
190
191
|
</review_screenshot>
|
@@ -215,7 +216,7 @@ characters. All newlines are preserved.
|
|
215
216
|
</locale>
|
216
217
|
</locales>
|
217
218
|
<review_screenshot>
|
218
|
-
<file_name>
|
219
|
+
<file_name>iap_another_level_test.jpg</file_name>
|
219
220
|
<size>20092</size>
|
220
221
|
<checksum type="md5">ff5bd97a5f40bb75a84884589ecbfc42</checksum>
|
221
222
|
</review_screenshot>
|
data/lib/itunes.rb
CHANGED
data/lib/itunes/transporter.rb
CHANGED
@@ -66,10 +66,76 @@ module Itunes
|
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
69
|
+
module MetadataImage
|
70
|
+
def normalized_source_filename
|
71
|
+
File.basename(self.file_name).tr('/: ','_')
|
72
|
+
end
|
73
|
+
|
74
|
+
def friendly_filename(filename)
|
75
|
+
filename.gsub(/[^\w\s_-]+/, '')
|
76
|
+
.gsub(/(^|\b\s)\s+($|\s?\b)/, '\\1\\2')
|
77
|
+
.gsub(/\s+/, '_')
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
69
81
|
class VersionScreenshot < Struct.new(:display_target, :file_name, :position)
|
82
|
+
include MetadataImage
|
83
|
+
|
70
84
|
def to_s
|
71
85
|
"(#{self.position}) #{self.display_target} - #{self.file_name}"
|
72
86
|
end
|
87
|
+
|
88
|
+
def normalized_filename
|
89
|
+
"#{self.position}_#{self.display_target}_#{normalized_source_filename}"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
class AchievementImage < Struct.new(:id, :file_name)
|
94
|
+
include MetadataImage
|
95
|
+
|
96
|
+
def to_s
|
97
|
+
"achievement #{self.id} - #{self.file_name}"
|
98
|
+
end
|
99
|
+
|
100
|
+
def normalized_filename
|
101
|
+
"achievement_#{friendly_filename(id)}_#{normalized_source_filename}"
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
class LeaderboardImage < Struct.new(:id, :file_name)
|
106
|
+
include MetadataImage
|
107
|
+
|
108
|
+
def to_s
|
109
|
+
"leaderboard #{self.id} - #{self.file_name}"
|
110
|
+
end
|
111
|
+
|
112
|
+
def normalized_filename
|
113
|
+
"leaderboard_#{friendly_filename(id)}_#{normalized_source_filename}"
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
class IAPReviewImage < Struct.new(:id, :file_name)
|
118
|
+
include MetadataImage
|
119
|
+
|
120
|
+
def to_s
|
121
|
+
"iap #{self.id} - #{self.file_name}"
|
122
|
+
end
|
123
|
+
|
124
|
+
def normalized_filename
|
125
|
+
"iap_#{friendly_filename(id)}_#{normalized_source_filename}"
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
class IAPFamilyReviewImage < Struct.new(:name, :file_name)
|
130
|
+
include MetadataImage
|
131
|
+
|
132
|
+
def to_s
|
133
|
+
"iap #{self.name} - #{self.file_name}"
|
134
|
+
end
|
135
|
+
|
136
|
+
def normalized_filename
|
137
|
+
"iap_#{friendly_filename(name)}_#{normalized_source_filename}"
|
138
|
+
end
|
73
139
|
end
|
74
140
|
end
|
75
141
|
end
|
@@ -9,6 +9,7 @@ module Itunes
|
|
9
9
|
include Itunes::Transporter::Helpers
|
10
10
|
|
11
11
|
attr_reader :files_to_process
|
12
|
+
attr_reader :images_to_process
|
12
13
|
attr_accessor :id_prefix
|
13
14
|
attr_accessor :provider
|
14
15
|
attr_accessor :team_id
|
@@ -21,6 +22,7 @@ module Itunes
|
|
21
22
|
|
22
23
|
def initialize(options)
|
23
24
|
@files_to_process = ['metadata.xml']
|
25
|
+
@images_to_process = []
|
24
26
|
|
25
27
|
config_file = options.i || options.input
|
26
28
|
|
@@ -45,25 +47,35 @@ module Itunes
|
|
45
47
|
version.locales.each do |locale|
|
46
48
|
doc.locale('name' => locale.name) do
|
47
49
|
doc.title(locale.title)
|
48
|
-
|
49
|
-
|
50
|
+
|
51
|
+
if locale.description
|
52
|
+
doc.description() do
|
53
|
+
doc.cdata!(locale.description)
|
54
|
+
end
|
50
55
|
end
|
51
56
|
|
52
|
-
|
53
|
-
|
54
|
-
|
57
|
+
if locale.keywords
|
58
|
+
doc.keywords() do
|
59
|
+
locale.keywords.each do |keyword|
|
60
|
+
doc.keyword(keyword)
|
61
|
+
end
|
55
62
|
end
|
56
63
|
end
|
57
64
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
65
|
+
if locale.version_whats_new
|
66
|
+
doc.version_whats_new() do
|
67
|
+
doc.cdata!(locale.version_whats_new)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
# doc.version_whats_new(locale.version_whats_new) if locale.version_whats_new
|
71
|
+
doc.software_url(locale.software_url) if locale.software_url
|
72
|
+
doc.privacy_url(locale.privacy_url) if locale.privacy_url
|
73
|
+
doc.support_url(locale.support_url) if locale.support_url
|
62
74
|
|
63
75
|
doc.software_screenshots() do
|
64
76
|
locale.screenshots.each do |screenshot|
|
65
77
|
doc.software_screenshot('display_target' => screenshot.display_target, 'position' => screenshot.position) do
|
66
|
-
|
78
|
+
create_image_xml(doc, screenshot)
|
67
79
|
end
|
68
80
|
end
|
69
81
|
end
|
@@ -87,7 +99,8 @@ module Itunes
|
|
87
99
|
doc.before_earned_description(locale.before_earned_description)
|
88
100
|
doc.after_earned_description(locale.after_earned_description)
|
89
101
|
doc.achievement_after_earned_image() do
|
90
|
-
|
102
|
+
image = AchievementImage.new(achievement.id,locale.achievement_after_earned_image || @default_achievement_image)
|
103
|
+
create_image_xml(doc, image)
|
91
104
|
end
|
92
105
|
end
|
93
106
|
end
|
@@ -119,7 +132,8 @@ module Itunes
|
|
119
132
|
|
120
133
|
doc.formatter_type(locale.formatter_type)
|
121
134
|
doc.leaderboard_image() do
|
122
|
-
|
135
|
+
image = LeaderboardImage.new("#{leaderboard.id}_#{locale.name}", locale.leaderboard_image)
|
136
|
+
create_image_xml(doc, image)
|
123
137
|
end
|
124
138
|
end
|
125
139
|
end
|
@@ -169,7 +183,8 @@ module Itunes
|
|
169
183
|
end if purchase.locales.count > 0
|
170
184
|
|
171
185
|
doc.review_screenshot() do
|
172
|
-
|
186
|
+
screenshot = IAPReviewImage.new(purchase.product_id, purchase.review_screenshot_image)
|
187
|
+
create_image_xml(doc, screenshot)
|
173
188
|
end if purchase.review_screenshot_image
|
174
189
|
end
|
175
190
|
end
|
@@ -191,7 +206,8 @@ module Itunes
|
|
191
206
|
end
|
192
207
|
|
193
208
|
doc.review_screenshot() do
|
194
|
-
|
209
|
+
screenshot = IAPFamilyReviewImage.new(family.name, family.review_screenshot_image)
|
210
|
+
create_image_xml(doc, screenshot)
|
195
211
|
end
|
196
212
|
|
197
213
|
doc.review_notes(family.review_notes)
|
@@ -202,12 +218,12 @@ module Itunes
|
|
202
218
|
end
|
203
219
|
end
|
204
220
|
|
205
|
-
def
|
206
|
-
image_path = Dir.pwd
|
207
|
-
@
|
221
|
+
def create_image_xml(doc, image)
|
222
|
+
image_path = File.join(Dir.pwd,image.file_name)
|
223
|
+
@images_to_process << image
|
208
224
|
|
209
|
-
doc.file_name(
|
210
|
-
doc.size(File.size?(
|
225
|
+
doc.file_name(image.normalized_filename)
|
226
|
+
doc.size(File.size?(image.file_name))
|
211
227
|
doc.checksum(Digest::MD5.file(image_path).hexdigest, 'type' => 'md5')
|
212
228
|
end
|
213
229
|
|
@@ -236,26 +252,27 @@ module Itunes
|
|
236
252
|
end
|
237
253
|
end
|
238
254
|
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
255
|
+
if @achievements.count > 0 || @leaderboards.count > 0
|
256
|
+
doc.game_center() do
|
257
|
+
# generate XML for all achievements
|
258
|
+
if @achievements.count > 0
|
259
|
+
doc.achievements() do
|
260
|
+
@achievements.each_with_index do |val, index|
|
261
|
+
create_achievement_xml(doc, val, index + 1)
|
262
|
+
end
|
245
263
|
end
|
246
264
|
end
|
247
|
-
end
|
248
265
|
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
266
|
+
# generate XML for all leaderboards
|
267
|
+
if @leaderboards.count > 0
|
268
|
+
doc.leaderboards() do
|
269
|
+
@leaderboards.each_with_index do |val, index|
|
270
|
+
create_leaderboard_xml(doc, val, index + 1)
|
271
|
+
end
|
254
272
|
end
|
255
273
|
end
|
256
274
|
end
|
257
275
|
end
|
258
|
-
|
259
276
|
# generate XML for all auto-renewable subscriptions and other IAPs (consumable, non-consumable, subscription, free-subscription)
|
260
277
|
if @purchases.count > 0
|
261
278
|
auto_renewable_purchase_family = @purchases[:auto_renewable_purchase_family]
|
@@ -288,6 +305,10 @@ module Itunes
|
|
288
305
|
FileUtils.cp(file, itmsp_dir)
|
289
306
|
end
|
290
307
|
|
308
|
+
@images_to_process.each do |image|
|
309
|
+
FileUtils.cp(image.file_name, File.join(itmsp_dir,image.normalized_filename))
|
310
|
+
end
|
311
|
+
|
291
312
|
output[:messages] << "Successfully created iTunes metadata package: #{itmsp_dir}"
|
292
313
|
rescue Exception => e
|
293
314
|
output[:errors] << e.message
|
@@ -4,6 +4,9 @@ require 'itunes/transporter'
|
|
4
4
|
module Itunes
|
5
5
|
module Transporter
|
6
6
|
module Helpers
|
7
|
+
|
8
|
+
KNOWN_DISPLAY_TARGETS = {'ipad' => 'iOS-iPad', 'iphone_3.5in' => 'iOS-3.5-in', 'iphone_4in' =>'iOS-4-in'}
|
9
|
+
|
7
10
|
def metadata_from_yaml(yaml_file)
|
8
11
|
objs = YAML.load_file(Dir.pwd + "/#{yaml_file}")
|
9
12
|
|
@@ -42,24 +45,15 @@ module Itunes
|
|
42
45
|
locale.support_url = loc['support_url']
|
43
46
|
locale.screenshots = []
|
44
47
|
|
45
|
-
loc['screenshots'].
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
current_display_target = scrshot['display_target']
|
48
|
+
loc['screenshots'].each do |target, target_screenshots|
|
49
|
+
raise "Unknown display target for screenshot" unless KNOWN_DISPLAY_TARGETS.keys.include?(target)
|
50
|
+
target_screenshots.each_with_index do |scrshot, index|
|
51
|
+
screenshot = VersionScreenshot.new
|
52
|
+
screenshot.display_target = KNOWN_DISPLAY_TARGETS[target]
|
53
|
+
screenshot.file_name = scrshot
|
54
|
+
screenshot.position = index+1
|
55
|
+
locale.screenshots << screenshot
|
54
56
|
end
|
55
|
-
|
56
|
-
screenshot = VersionScreenshot.new
|
57
|
-
screenshot.display_target = current_display_target
|
58
|
-
screenshot.file_name = scrshot['file_name']
|
59
|
-
screenshot.position = current_position
|
60
|
-
|
61
|
-
locale.screenshots << screenshot
|
62
|
-
current_position = current_position + 1
|
63
57
|
end
|
64
58
|
|
65
59
|
version.locales << locale
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: itunes_transporter_generator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-10-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: builder
|
@@ -110,8 +110,16 @@ files:
|
|
110
110
|
- ./example/config copy.yaml
|
111
111
|
- ./example/config.yaml
|
112
112
|
- ./example/metadata.xml
|
113
|
+
- ./example/sample sku.itmsp/1_iOS-3.5-in_test.jpg
|
114
|
+
- ./example/sample sku.itmsp/1_iOS-4-in_test.jpg
|
115
|
+
- ./example/sample sku.itmsp/1_iOS-iPad_test.jpg
|
116
|
+
- ./example/sample sku.itmsp/achievement_first_achievement_test.jpg
|
117
|
+
- ./example/sample sku.itmsp/iap_another_level_test.jpg
|
118
|
+
- ./example/sample sku.itmsp/iap_new_level_test.jpg
|
119
|
+
- ./example/sample sku.itmsp/iap_one_hundred_dollars_test.jpg
|
120
|
+
- ./example/sample sku.itmsp/iap_Sample_Product_Group_test.jpg
|
121
|
+
- ./example/sample sku.itmsp/leaderboard_top_scores_en_test.jpg
|
113
122
|
- ./example/sample sku.itmsp/metadata.xml
|
114
|
-
- ./example/sample sku.itmsp/test.jpg
|
115
123
|
- ./example/test.jpg
|
116
124
|
- ./Gemfile
|
117
125
|
- ./itmsp.gemspec
|