itunes_transporter_generator 0.4.4 → 0.4.5
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.
- 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
|