Class: Itunes::Transporter::Generator

Inherits:
Object
  • Object
show all
Includes:
Helpers
Defined in:
lib/itunes/transporter/generator.rb

Constant Summary

Constants included from Helpers

Helpers::KNOWN_DISPLAY_TARGETS

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Helpers

#metadata_from_yaml, #parse_achievements, #parse_auto_renewables, #parse_leaderboards, #parse_other_purchases, #parse_purchases, #parse_versions

Constructor Details

#initialize(options) ⇒ Generator

Returns a new instance of Generator.



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/itunes/transporter/generator.rb', line 24

def initialize(options)
  @files_to_process = ['metadata.xml']
  @images_to_process = []

  config_file = options.i || options.input

   = (config_file)

  @should_prefix_images = options.prefix_images || false
  @id_prefix = [:id_prefix]
  @provider = [:provider]
  @team_id = [:team_id]
  @vendor_id = [:vendor_id].to_s
  @achievements = [:achievements]
  @leaderboards = [:leaderboards]
  @purchases = [:purchases]
  @default_achievement_image = [:default_achievement_image]
  @versions = [:versions]
  @output = { :messages => [], :errors => [] }
end

Instance Attribute Details

#achievementsObject

Returns the value of attribute achievements.



17
18
19
# File 'lib/itunes/transporter/generator.rb', line 17

def achievements
  @achievements
end

#files_to_processObject (readonly)

Returns the value of attribute files_to_process.



11
12
13
# File 'lib/itunes/transporter/generator.rb', line 11

def files_to_process
  @files_to_process
end

#id_prefixObject

Returns the value of attribute id_prefix.



13
14
15
# File 'lib/itunes/transporter/generator.rb', line 13

def id_prefix
  @id_prefix
end

#images_to_processObject (readonly)

Returns the value of attribute images_to_process.



12
13
14
# File 'lib/itunes/transporter/generator.rb', line 12

def images_to_process
  @images_to_process
end

#leaderboardsObject

Returns the value of attribute leaderboards.



18
19
20
# File 'lib/itunes/transporter/generator.rb', line 18

def leaderboards
  @leaderboards
end

#outputObject

Returns the value of attribute output.



20
21
22
# File 'lib/itunes/transporter/generator.rb', line 20

def output
  @output
end

#providerObject

Returns the value of attribute provider.



14
15
16
# File 'lib/itunes/transporter/generator.rb', line 14

def provider
  @provider
end

#purchasesObject

Returns the value of attribute purchases.



19
20
21
# File 'lib/itunes/transporter/generator.rb', line 19

def purchases
  @purchases
end

#should_prefix_imagesObject

Returns the value of attribute should_prefix_images.



22
23
24
# File 'lib/itunes/transporter/generator.rb', line 22

def should_prefix_images
  @should_prefix_images
end

#team_idObject

Returns the value of attribute team_id.



15
16
17
# File 'lib/itunes/transporter/generator.rb', line 15

def team_id
  @team_id
end

#vendor_idObject

Returns the value of attribute vendor_id.



16
17
18
# File 'lib/itunes/transporter/generator.rb', line 16

def vendor_id
  @vendor_id
end

#versionsObject

Returns the value of attribute versions.



21
22
23
# File 'lib/itunes/transporter/generator.rb', line 21

def versions
  @versions
end

Instance Method Details

#create_achievement_xml(doc, achievement, position) ⇒ Object



90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/itunes/transporter/generator.rb', line 90

def create_achievement_xml(doc, achievement, position)
  doc.achievement('position' => position) do
    doc.achievement_id(@id_prefix + achievement.id)
    doc.reference_name(achievement.name)
    doc.points(achievement.points)
    doc.hidden(achievement.hidden)
    doc.reusable(achievement.reusable)
    doc.locales() do
      achievement.locales.each do |locale|
        doc.locale('name' => locale.name) do
          doc.title(locale.title)
        doc.before_earned_description(locale.before_earned_description)
          doc.after_earned_description(locale.after_earned_description)
          doc.achievement_after_earned_image() do
            image = AchievementImage.new(achievement.id,locale.achievement_after_earned_image || @default_achievement_image)
            create_image_xml(doc, image)
          end
        end
      end
    end
  end
end

#create_image_xml(doc, image) ⇒ Object



223
224
225
226
227
228
229
230
# File 'lib/itunes/transporter/generator.rb', line 223

def create_image_xml(doc, image)
  image_path = File.join(Dir.pwd,image.file_name)
  @images_to_process << image

  doc.file_name(image.normalized_filename(@should_prefix_images))
  doc.size(File.size?(image.file_name))
  doc.checksum(Digest::MD5.file(image_path).hexdigest, 'type' => 'md5')
end

#create_in_app_purchase_xml(doc, purchase) ⇒ Object



146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
# File 'lib/itunes/transporter/generator.rb', line 146

def create_in_app_purchase_xml(doc, purchase)
  doc.in_app_purchase() do
    doc.product_id(@id_prefix + purchase.product_id)
    doc.reference_name(purchase.reference_name) if purchase.reference_name
    doc.duration(purchase.duration) if purchase.duration
    doc.free_trial_duration(purchase.free_trial_duration) if purchase.free_trial_duration
    doc.bonus_duration(purchase.bonus_duration) if purchase.bonus_duration

    doc.type(purchase.type)

    doc.products() do
      purchase.products.each do |product|
        doc.product() do
          doc.cleared_for_sale(product.cleared_for_sale)
          doc.wholesale_price_tier(product.wholesale_price_tier) if product.wholesale_price_tier

          doc.intervals() do
            product.intervals.each do |interval|
              doc.interval() do
                if (interval.start_date)
                  doc.start_date(interval.start_date) if interval.start_date
                end

                if (interval.end_date)
                  doc.end_date(interval.end_date) if interval.end_date
                end

                doc.wholesale_price_tier(interval.wholesale_price_tier)
              end
            end
          end if product.intervals.count > 0
        end
      end
    end

    doc.locales() do
      purchase.locales.each do |locale|
        create_purchase_locale_xml(doc, locale)
      end
    end if purchase.locales.count > 0

    doc.review_screenshot() do
      screenshot = IAPReviewImage.new(purchase.product_id, purchase.review_screenshot_image)
      create_image_xml(doc, screenshot)
    end if purchase.review_screenshot_image
  end
end

#create_leaderboard_xml(doc, leaderboard, position) ⇒ Object



113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'lib/itunes/transporter/generator.rb', line 113

def create_leaderboard_xml(doc, leaderboard, position)
  doc.leaderboard('default' => leaderboard.default, 'position' => position) do
    doc.leaderboard_id(@id_prefix + leaderboard.id)
    doc.reference_name(leaderboard.name)

    if leaderboard.aggregate_parent_leaderboard
      doc.aggregate_parent_leaderboard(leaderboard.aggregate_parent_leaderboard)
    end

    doc.sort_ascending(leaderboard.sort_ascending)

    doc.score_range_min(leaderboard.score_range_min) if leaderboard.score_range_min
    doc.score_range_max(leaderboard.score_range_max) if leaderboard.score_range_max

    doc.locales() do
      leaderboard.locales.each do |locale|
        doc.locale('name' => locale.name) do
          doc.title(locale.title)

          doc.formatter_suffix(locale.formatter_suffix) if locale.formatter_suffix
          doc.formatter_suffix_singular(locale.formatter_suffix_singular) if locale.formatter_suffix_singular

          doc.formatter_type(locale.formatter_type)
          doc.leaderboard_image() do
            image = LeaderboardImage.new("#{leaderboard.id}_#{locale.name}", locale.leaderboard_image)
            create_image_xml(doc, image)
          end
        end
      end
    end
  end
end

#create_other_purchases_xml(doc, purchases) ⇒ Object



232
233
234
235
236
# File 'lib/itunes/transporter/generator.rb', line 232

def create_other_purchases_xml(doc, purchases)
  purchases.each do |purchase|
    create_in_app_purchase_xml(doc, purchase)
  end
end

#create_purchase_family_xml(doc, family) ⇒ Object



202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
# File 'lib/itunes/transporter/generator.rb', line 202

def create_purchase_family_xml(doc, family)
  doc.family('name' => family.name) do
    doc.locales() do
      family.locales.each do |locale|
        create_purchase_locale_xml(doc, locale)
      end
    end

    doc.review_screenshot() do
      screenshot = IAPFamilyReviewImage.new(family.name, family.review_screenshot_image)
      create_image_xml(doc, screenshot)
    end

    doc.review_notes(family.review_notes) if family.review_notes

    family.purchases.each do |purchase|
      create_in_app_purchase_xml(doc, purchase)
    end
  end
end

#create_purchase_locale_xml(doc, locale) ⇒ Object



194
195
196
197
198
199
200
# File 'lib/itunes/transporter/generator.rb', line 194

def create_purchase_locale_xml(doc, locale)
  doc.locale('name' => locale.name) do
    doc.title(locale.title)
    doc.description(locale.description)
    doc.publication_name(locale.publication_name) if locale.publication_name
  end
end

#create_version_xml(doc, version) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/itunes/transporter/generator.rb', line 45

def create_version_xml(doc, version)
  doc.version('string' => version.name) do
    doc.locales() do

      version.locales.each do |locale|
        doc.locale('name' => locale.name) do
          doc.title(locale.title)

          if locale.description
            doc.description() do
              doc.cdata!(locale.description)
            end
          end

          if locale.keywords
            doc.keywords() do
              locale.keywords.each do |keyword|
                doc.keyword(keyword)
              end
            end
          end

          if locale.version_whats_new
            doc.version_whats_new() do
              doc.cdata!(locale.version_whats_new)
            end
          end
          # doc.version_whats_new(locale.version_whats_new) if locale.version_whats_new
          doc.software_url(locale.software_url)  if locale.software_url
          doc.privacy_url(locale.privacy_url) if locale.privacy_url
          doc.support_url(locale.support_url) if locale.support_url

          doc.software_screenshots() do
            locale.screenshots.each do |screenshot|
              doc.software_screenshot('display_target' => screenshot.display_target, 'position' => screenshot.position) do
                create_image_xml(doc, screenshot)
              end
            end
          end
        end
      end
    end
  end
end

#generate_itmspObject



299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
# File 'lib/itunes/transporter/generator.rb', line 299

def generate_itmsp
    itmsp_dir = @vendor_id + '.itmsp'

  begin
    FileUtils.rm_rf(itmsp_dir) if Dir.exists?(itmsp_dir)
    Dir.mkdir(itmsp_dir)

    @files_to_process.each do |file|
      FileUtils.cp(file, itmsp_dir)
    end

    @images_to_process.each do |image|
      FileUtils.cp(image.file_name, File.join(itmsp_dir, image.normalized_filename(@should_prefix_images)))
    end

    output[:messages] << "Successfully created iTunes metadata package: #{itmsp_dir}"
  rescue Exception => e
    output[:errors] << e.message
  end
end

#generate_metadataObject



238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
# File 'lib/itunes/transporter/generator.rb', line 238

def 
   = File.new(Dir.pwd + '/metadata.xml', 'w')

  doc = Builder::XmlMarkup.new(:target => , :indent => 2)
  doc.instruct!(:xml, :version => '1.0', :encoding => 'UTF-8')
  doc.package('xmlns' => 'http://apple.com/itunes/importer', 'version' => 'software5.1') do
    doc.provider(@provider) if @provider
    doc.team_id(@team_id) if @team_id
    doc.software() do
      doc.vendor_id(@vendor_id)
      doc.() do
        if @versions.count > 0
          doc.versions() do
            @versions.each do |version|
              create_version_xml(doc, version)
            end
          end
        end

        if @achievements.count > 0 || @leaderboards.count > 0
          doc.game_center() do
            # generate XML for all achievements
            if @achievements.count > 0
              doc.achievements() do
                @achievements.each_with_index do |val, index|
                  create_achievement_xml(doc, val, index + 1)
                end
              end
            end

            # generate XML for all leaderboards
            if @leaderboards.count > 0
              doc.leaderboards() do
                @leaderboards.each_with_index do |val, index|
                  create_leaderboard_xml(doc, val, index + 1)
                end
              end
            end
          end
        end
        # generate XML for all auto-renewable subscriptions and other IAPs (consumable, non-consumable, subscription, free-subscription)
        if @purchases.count > 0
          auto_renewable_purchase_family = @purchases[:auto_renewable_purchase_family]
          other_purchases = @purchases[:other_purchases]

          doc.in_app_purchases() do
            create_purchase_family_xml(doc, auto_renewable_purchase_family) if auto_renewable_purchase_family
            create_other_purchases_xml(doc, other_purchases) if other_purchases
          end
        end
      end
    end
  end

  .close()

  generate_itmsp

  output
end