fastlane 2.149.0 → 2.150.0.rc4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +82 -82
  3. data/deliver/lib/deliver.rb +0 -1
  4. data/deliver/lib/deliver/app_screenshot.rb +26 -25
  5. data/deliver/lib/deliver/options.rb +6 -11
  6. data/deliver/lib/deliver/runner.rb +7 -21
  7. data/deliver/lib/deliver/setup.rb +5 -30
  8. data/deliver/lib/deliver/submit_for_review.rb +155 -90
  9. data/deliver/lib/deliver/upload_metadata.rb +355 -143
  10. data/deliver/lib/deliver/upload_price_tier.rb +22 -8
  11. data/deliver/lib/deliver/upload_screenshots.rb +134 -39
  12. data/fastlane/lib/fastlane/actions/docs/capture_ios_screenshots.md +1 -1
  13. data/fastlane/lib/fastlane/actions/docs/upload_to_app_store.md.erb +77 -96
  14. data/fastlane/lib/fastlane/actions/docs/upload_to_play_store.md +3 -2
  15. data/fastlane/lib/fastlane/actions/download_dsyms.rb +7 -1
  16. data/fastlane/lib/fastlane/actions/google_play_track_release_names.rb +74 -0
  17. data/fastlane/lib/fastlane/actions/set_changelog.rb +23 -20
  18. data/fastlane/lib/fastlane/actions/slack.rb +1 -1
  19. data/fastlane/lib/fastlane/actions/spm.rb +7 -0
  20. data/fastlane/lib/fastlane/actions/upload_symbols_to_crashlytics.rb +1 -32
  21. data/fastlane/lib/fastlane/lane.rb +3 -3
  22. data/fastlane/lib/fastlane/swift_fastlane_function.rb +8 -4
  23. data/fastlane/lib/fastlane/version.rb +1 -1
  24. data/fastlane/swift/ControlCommand.swift +1 -0
  25. data/fastlane/swift/Deliverfile.swift +1 -1
  26. data/fastlane/swift/Fastlane.swift +48 -12
  27. data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/xcshareddata/xcschemes/FastlaneRunner.xcscheme +3 -9
  28. data/fastlane/swift/Gymfile.swift +1 -1
  29. data/fastlane/swift/LaneFileProtocol.swift +2 -5
  30. data/fastlane/swift/Matchfile.swift +1 -1
  31. data/fastlane/swift/MatchfileProtocol.swift +1 -1
  32. data/fastlane/swift/Precheckfile.swift +1 -1
  33. data/fastlane/swift/RubyCommand.swift +29 -6
  34. data/fastlane/swift/RubyCommandable.swift +1 -0
  35. data/fastlane/swift/Runner.swift +85 -13
  36. data/fastlane/swift/Scanfile.swift +1 -1
  37. data/fastlane/swift/ScanfileProtocol.swift +1 -1
  38. data/fastlane/swift/Screengrabfile.swift +1 -1
  39. data/fastlane/swift/Snapshotfile.swift +1 -1
  40. data/fastlane/swift/SnapshotfileProtocol.swift +3 -3
  41. data/fastlane/swift/SocketClient.swift +76 -45
  42. data/fastlane/swift/SocketClientDelegateProtocol.swift +1 -1
  43. data/fastlane/swift/SocketResponse.swift +1 -0
  44. data/fastlane_core/lib/fastlane_core/configuration/config_item.rb +1 -3
  45. data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +89 -52
  46. data/fastlane_core/lib/fastlane_core/pkg_file_analyser.rb +7 -0
  47. data/fastlane_core/lib/fastlane_core/project.rb +0 -1
  48. data/frameit/lib/frameit/device_types.rb +100 -100
  49. data/produce/lib/produce/itunes_connect.rb +32 -21
  50. data/produce/lib/produce/options.rb +3 -3
  51. data/sigh/lib/assets/resign.sh +7 -7
  52. data/snapshot/lib/assets/SnapshotHelper.swift +5 -5
  53. data/snapshot/lib/assets/SnapshotHelperXcode8.swift +3 -3
  54. data/snapshot/lib/snapshot/options.rb +0 -1
  55. data/snapshot/lib/snapshot/reports_generator.rb +8 -1
  56. data/spaceship/lib/spaceship/.DS_Store +0 -0
  57. data/spaceship/lib/spaceship/client.rb +4 -3
  58. data/spaceship/lib/spaceship/connect_api.rb +25 -2
  59. data/spaceship/lib/spaceship/connect_api/client.rb +97 -31
  60. data/spaceship/lib/spaceship/connect_api/file_uploader.rb +98 -0
  61. data/spaceship/lib/spaceship/connect_api/model.rb +1 -1
  62. data/spaceship/lib/spaceship/connect_api/models/age_rating_declaration.rb +113 -0
  63. data/spaceship/lib/spaceship/connect_api/models/app.rb +120 -3
  64. data/spaceship/lib/spaceship/connect_api/models/app_category.rb +94 -0
  65. data/spaceship/lib/spaceship/connect_api/models/app_info.rb +67 -0
  66. data/spaceship/lib/spaceship/connect_api/models/app_info_localization.rb +38 -0
  67. data/spaceship/lib/spaceship/connect_api/models/app_preview.rb +129 -0
  68. data/spaceship/lib/spaceship/connect_api/models/app_preview_set.rb +71 -0
  69. data/spaceship/lib/spaceship/connect_api/models/app_price.rb +22 -0
  70. data/spaceship/lib/spaceship/connect_api/models/app_price_tier.rb +12 -0
  71. data/spaceship/lib/spaceship/connect_api/models/app_review_attachment.rb +71 -0
  72. data/spaceship/lib/spaceship/connect_api/models/app_screenshot.rb +93 -0
  73. data/spaceship/lib/spaceship/connect_api/models/app_screenshot_set.rb +101 -0
  74. data/spaceship/lib/spaceship/connect_api/models/app_store_review_detail.rb +51 -0
  75. data/spaceship/lib/spaceship/connect_api/models/app_store_version.rb +183 -0
  76. data/spaceship/lib/spaceship/connect_api/models/app_store_version_localization.rb +86 -0
  77. data/spaceship/lib/spaceship/connect_api/models/app_store_version_phased_release.rb +36 -0
  78. data/spaceship/lib/spaceship/connect_api/models/app_store_version_submission.rb +26 -0
  79. data/spaceship/lib/spaceship/connect_api/models/build.rb +4 -0
  80. data/spaceship/lib/spaceship/connect_api/models/idfa_declaration.rb +40 -0
  81. data/spaceship/lib/spaceship/connect_api/models/reset_ratings_request.rb +26 -0
  82. data/spaceship/lib/spaceship/connect_api/models/territory.rb +27 -0
  83. data/spaceship/lib/spaceship/connect_api/testflight/testflight.rb +10 -3
  84. data/spaceship/lib/spaceship/connect_api/tunes/client.rb +33 -0
  85. data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +841 -0
  86. data/spaceship/lib/spaceship/spaceauth_runner.rb +2 -2
  87. data/supply/lib/supply/client.rb +19 -0
  88. data/supply/lib/supply/reader.rb +16 -0
  89. metadata +44 -39
  90. data/deliver/lib/deliver/upload_assets.rb +0 -27
  91. data/fastlane/lib/assets/.s3_html_template.erb.swp +0 -0
  92. data/fastlane/lib/fastlane/actions/.hipchat.rb.swp +0 -0
  93. data/fastlane/lib/fastlane/actions/.slack.rb.swp +0 -0
  94. data/scan/lib/scan/.options.rb.swp +0 -0
@@ -1,23 +1,37 @@
1
1
  require_relative 'module'
2
+ require 'spaceship'
2
3
 
3
4
  module Deliver
4
5
  # Set the app's pricing
5
6
  class UploadPriceTier
6
7
  def upload(options)
7
8
  return unless options[:price_tier]
8
- app = options[:app]
9
9
 
10
- # just to be sure, the user might have passed an int (which is fine with us)
11
- options[:price_tier] = options[:price_tier].to_s
10
+ price_tier = options[:price_tier].to_s
12
11
 
13
- old_price = app.price_tier
14
- if options[:price_tier] == old_price
15
- UI.success("Price Tier unchanged (tier #{options[:price_tier]})")
12
+ legacy_app = options[:app]
13
+ app_id = legacy_app.apple_id
14
+ app = Spaceship::ConnectAPI::App.get(app_id: app_id)
15
+
16
+ attributes = {}
17
+ territory_ids = []
18
+
19
+ app_prices = app.fetch_app_prices
20
+ if app_prices.first
21
+ old_price = app_prices.first.price_tier.id
22
+ else
23
+ UI.message("App has no prices yet... Enabling all countries in App Store Connect")
24
+ territory_ids = Spaceship::ConnectAPI::Territory.all.map(&:id)
25
+ attributes[:availableInNewTerritories] = true
26
+ end
27
+
28
+ if price_tier == old_price
29
+ UI.success("Price Tier unchanged (tier #{old_price})")
16
30
  return
17
31
  end
18
32
 
19
- app.update_price_tier!(options[:price_tier])
20
- UI.success("Successfully updated the pricing from #{old_price} to #{options[:price_tier]}")
33
+ app.update(attributes: attributes, app_price_tier_id: price_tier, territory_ids: territory_ids)
34
+ UI.success("Successfully updated the pricing from #{old_price} to #{price_tier}")
21
35
  end
22
36
  end
23
37
  end
@@ -1,4 +1,5 @@
1
1
  require 'spaceship/tunes/tunes'
2
+ require 'digest/md5'
2
3
 
3
4
  require_relative 'app_screenshot'
4
5
  require_relative 'module'
@@ -11,69 +12,163 @@ module Deliver
11
12
  return if options[:skip_screenshots]
12
13
  return if options[:edit_live]
13
14
 
14
- app = options[:app]
15
+ legacy_app = options[:app]
16
+ app_id = legacy_app.apple_id
17
+ app = Spaceship::ConnectAPI::App.get(app_id: app_id)
15
18
 
16
- v = app.edit_version(platform: options[:platform])
17
- UI.user_error!("Could not find a version to edit for app '#{app.name}'") unless v
19
+ platform = Spaceship::ConnectAPI::Platform.map(options[:platform])
20
+ version = app.get_edit_app_store_version(platform: platform)
21
+ UI.user_error!("Could not find a version to edit for app '#{app.name}' for '#{platform}'") unless version
22
+
23
+ UI.important("Will begin uploading snapshots for '#{version.version_string}' on App Store Connect")
18
24
 
19
25
  UI.message("Starting with the upload of screenshots...")
20
26
  screenshots_per_language = screenshots.group_by(&:language)
21
27
 
28
+ localizations = version.get_app_store_version_localizations
29
+
22
30
  if options[:overwrite_screenshots]
23
- UI.message("Removing all previously uploaded screenshots...")
24
- # First, clear all previously uploaded screenshots
25
- screenshots_per_language.keys.each do |language|
26
- # We have to nil check for languages not activated
27
- next if v.screenshots[language].nil?
28
- v.screenshots[language].each_with_index do |t, index|
29
- v.upload_screenshot!(nil, t.sort_order, t.language, t.device_type, t.is_imessage)
31
+ # Get localizations on version
32
+ localizations.each do |localization|
33
+ # Only delete screenshots if trying to upload
34
+ next unless screenshots_per_language.keys.include?(localization.locale)
35
+
36
+ # Iterate over all screenshots for each set and delete
37
+ screenshot_sets = localization.get_app_screenshot_sets
38
+
39
+ # Multi threading delete on single localization
40
+ threads = []
41
+ errors = []
42
+
43
+ screenshot_sets.each do |screenshot_set|
44
+ UI.message("Removing all previously uploaded screenshots for '#{localization.locale}' '#{screenshot_set.screenshot_display_type}'...")
45
+ screenshot_set.app_screenshots.each do |screenshot|
46
+ UI.verbose("Deleting screenshot - #{localization.locale} #{screenshot_set.screenshot_display_type} #{screenshot.id}")
47
+ threads << Thread.new do
48
+ begin
49
+ screenshot.delete!
50
+ UI.verbose("Deleted screenshot - #{localization.locale} #{screenshot_set.screenshot_display_type} #{screenshot.id}")
51
+ rescue => error
52
+ UI.verbose("Failed to delete screenshot - #{localization.locale} #{screenshot_set.screenshot_display_type} #{screenshot.id}")
53
+ errors << error
54
+ end
55
+ end
56
+ end
57
+ end
58
+
59
+ sleep(1) # Feels bad but sleeping a bit to let the threads catchup
60
+
61
+ unless threads.empty?
62
+ Helper.show_loading_indicator("Waiting for screenshots to be deleted for '#{localization.locale}'... (might be slow)") unless FastlaneCore::Globals.verbose?
63
+ threads.each(&:join)
64
+ Helper.hide_loading_indicator unless FastlaneCore::Globals.verbose?
65
+ end
66
+
67
+ # Crash if any errors happen while deleting
68
+ unless errors.empty?
69
+ UI.crash!(errors.map(&:message).join("\n"))
30
70
  end
31
71
  end
32
72
  end
33
73
 
34
- # Now, fill in the new ones
35
- indized = {} # per language and device type
74
+ # Finding languages to enable
75
+ languages = screenshots_per_language.keys
76
+ locales_to_enable = languages - localizations.map(&:locale)
36
77
 
37
- enabled_languages = screenshots_per_language.keys
38
- if enabled_languages.count > 0
39
- v.create_languages(enabled_languages)
78
+ if locales_to_enable.count > 0
40
79
  lng_text = "language"
41
- lng_text += "s" if enabled_languages.count != 1
42
- Helper.show_loading_indicator("Activating #{lng_text} #{enabled_languages.join(', ')}...")
43
- v.save!
44
- # This refreshes the app version from iTC after enabling a localization
45
- v = app.edit_version(platform: options[:platform])
80
+ lng_text += "s" if locales_to_enable.count != 1
81
+ Helper.show_loading_indicator("Activating #{lng_text} #{locales_to_enable.join(', ')}...")
82
+
83
+ locales_to_enable.each do |locale|
84
+ version.create_app_store_version_localization(attributes: {
85
+ locale: locale
86
+ })
87
+ end
88
+
46
89
  Helper.hide_loading_indicator
90
+
91
+ # Refresh version localizations
92
+ localizations = version.get_app_store_version_localizations
47
93
  end
48
94
 
95
+ upload_screenshots(screenshots_per_language, localizations)
96
+ end
97
+
98
+ def upload_screenshots(screenshots_per_language, localizations)
99
+ # Upload screenshots
100
+ indized = {} # per language and device type
101
+
49
102
  screenshots_per_language.each do |language, screenshots_for_language|
103
+ # Find localization to upload screenshots to
104
+ localization = localizations.find do |l|
105
+ l.locale == language
106
+ end
107
+
108
+ unless localization
109
+ UI.error("Couldn't find localization on version for #{language}")
110
+ next
111
+ end
112
+
113
+ indized[localization.locale] ||= {}
114
+
115
+ # Create map to find screenshot set to add screenshot to
116
+ app_screenshot_sets_map = {}
117
+ app_screenshot_sets = localization.get_app_screenshot_sets
118
+ app_screenshot_sets.each do |app_screenshot_set|
119
+ app_screenshot_sets_map[app_screenshot_set.screenshot_display_type] = app_screenshot_set
120
+
121
+ # Set initial screnshot count
122
+ indized[localization.locale][app_screenshot_set.screenshot_display_type] ||= {
123
+ count: app_screenshot_set.app_screenshots.size,
124
+ checksums: []
125
+ }
126
+
127
+ checksums = app_screenshot_set.app_screenshots.map(&:source_file_checksum).uniq
128
+ indized[localization.locale][app_screenshot_set.screenshot_display_type][:checksums] = checksums
129
+ end
130
+
50
131
  UI.message("Uploading #{screenshots_for_language.length} screenshots for language #{language}")
51
132
  screenshots_for_language.each do |screenshot|
52
- indized[screenshot.language] ||= {}
53
- indized[screenshot.language][screenshot.formatted_name] ||= 0
54
- indized[screenshot.language][screenshot.formatted_name] += 1 # we actually start with 1... wtf iTC
133
+ display_type = screenshot.device_type
134
+ set = app_screenshot_sets_map[display_type]
55
135
 
56
- index = indized[screenshot.language][screenshot.formatted_name]
136
+ if display_type.nil?
137
+ UI.error("Error... Screenshot size #{screenshot.screen_size} not valid for App Store Connect")
138
+ next
139
+ end
140
+
141
+ unless set
142
+ set = localization.create_app_screenshot_set(attributes: {
143
+ screenshotDisplayType: display_type
144
+ })
145
+ app_screenshot_sets_map[display_type] = set
146
+
147
+ indized[localization.locale][set.screenshot_display_type] = {
148
+ count: 0,
149
+ checksums: []
150
+ }
151
+ end
57
152
 
58
- if index > 10
59
- UI.error("Too many screenshots found for device '#{screenshot.formatted_name}' in '#{screenshot.language}', skipping this one (#{screenshot.path})")
153
+ index = indized[localization.locale][set.screenshot_display_type][:count]
154
+
155
+ if index >= 10
156
+ UI.error("Too many screenshots found for device '#{screenshot.device_type}' in '#{screenshot.language}', skipping this one (#{screenshot.path})")
60
157
  next
61
158
  end
62
159
 
63
- UI.message("Uploading '#{screenshot.path}'...")
64
- v.upload_screenshot!(screenshot.path,
65
- index,
66
- screenshot.language,
67
- screenshot.device_type,
68
- screenshot.is_messages?)
160
+ bytes = File.binread(screenshot.path)
161
+ checksum = Digest::MD5.hexdigest(bytes)
162
+ duplicate = indized[localization.locale][set.screenshot_display_type][:checksums].include?(checksum)
163
+
164
+ if duplicate
165
+ UI.message("Previous uploaded. Skipping '#{screenshot.path}'...")
166
+ else
167
+ indized[localization.locale][set.screenshot_display_type][:count] += 1
168
+ UI.message("Uploading '#{screenshot.path}'...")
169
+ set.upload_screenshot(path: screenshot.path)
170
+ end
69
171
  end
70
- # ideally we should only save once, but itunes server can't cope it seems
71
- # so we save per language. See issue #349
72
- Helper.show_loading_indicator("Saving changes")
73
- v.save!
74
- # Refresh app version to start clean again. See issue #9859
75
- v = app.edit_version
76
- Helper.hide_loading_indicator
77
172
  end
78
173
  UI.success("Successfully uploaded screenshots to App Store Connect")
79
174
  end
@@ -364,7 +364,7 @@ snapshot(launch_arguments: ["SKIP_ANIMATIONS"])
364
364
  ```
365
365
 
366
366
  By default, _snapshot_ will wait for a short time for the animations to finish.
367
- If you're skipping the animations, this is wait time is unnecessary and can be skipped:
367
+ If you're skipping the animations, this wait time is unnecessary and can be skipped:
368
368
 
369
369
  ```swift
370
370
  setupSnapshot(app, waitForAnimations: false)
@@ -467,7 +467,7 @@ _deliver_ allows for metadata to be set through `.txt` files in the metadata fol
467
467
 
468
468
  Key | Editable While Live | Directory | Filename
469
469
  ----|--------|--------|--------
470
- <%- (Deliver::UploadMetadata::NON_LOCALISED_VERSION_VALUES + Deliver::UploadMetadata::NON_LOCALISED_APP_VALUES).each do |value| -%>
470
+ <%- (Deliver::UploadMetadata::NON_LOCALISED_VERSION_VALUES.keys + Deliver::UploadMetadata::NON_LOCALISED_APP_VALUES).each do |value| -%>
471
471
  `<%= value %>` | <%= Deliver::UploadMetadata::NON_LOCALISED_LIVE_VALUES.include?(value) ? 'Yes' : 'No' %> | `<metadata_path>` | `<%= value %>.txt`
472
472
  <%- end %>
473
473
 
@@ -475,23 +475,15 @@ Key | Editable While Live | Directory | Filename
475
475
 
476
476
  Key | Editable While Live | Directory | Filename
477
477
  ----|--------|--------|--------
478
- <%- (Deliver::UploadMetadata::LOCALISED_APP_VALUES + Deliver::UploadMetadata::LOCALISED_VERSION_VALUES).each do |value| -%>
478
+ <%- (Deliver::UploadMetadata::LOCALISED_APP_VALUES.keys + Deliver::UploadMetadata::LOCALISED_VERSION_VALUES.keys).each do |value| -%>
479
479
  `<%= value %>` | <%= Deliver::UploadMetadata::LOCALISED_LIVE_VALUES.include?(value) ? 'Yes' : 'No' %> | `<metadata_path>/<lang>/` | `<%= value %>.txt`
480
480
  <%- end %>
481
481
 
482
- ### Trade Representative Contact Information Metadata
483
-
484
- Key | Editable While Live | Directory | Filename
485
- ----|--------|--------|--------
486
- <%- Deliver::UploadMetadata::TRADE_REPRESENTATIVE_CONTACT_INFORMATION_VALUES.each do |key, value| -%>
487
- `<%= value %>` | Yes | `<metadata_path>/<%= Deliver::UploadMetadata::TRADE_REPRESENTATIVE_CONTACT_INFORMATION_DIR %>` | `<%= value %>.txt`
488
- <%- end %>
489
-
490
482
  ### Review Information Metadata
491
483
 
492
484
  Key | Editable While Live | Directory | Filename
493
485
  ----|--------|--------|--------
494
- <%- Deliver::UploadMetadata::REVIEW_INFORMATION_VALUES.each do |key, value| -%>
486
+ <%- Deliver::UploadMetadata::REVIEW_INFORMATION_VALUES_LEGACY.each do |key, value| -%>
495
487
  `<%= value %>` | Yes | `<metadata_path>/<%= Deliver::UploadMetadata::REVIEW_INFORMATION_DIR %>` | `<%= value %>.txt`
496
488
  <%- end %>
497
489
 
@@ -502,33 +494,32 @@ Key | Editable While Live | Directory | Filename
502
494
 
503
495
  ### Available Categories
504
496
 
505
- You can always prefix the category using `MZGenre.` (e.g. `MZGenre.Book`). _deliver_ supports both notations.
506
-
507
- - `Book`
508
- - `Business`
509
- - `Apps.Catalogs`
510
- - `Education`
511
- - `Entertainment`
512
- - `Finance`
513
- - `Apps.Food_Drink`
514
- - `Games`
515
- - `Healthcare_Fitness`
516
- - `Lifestyle`
517
- - `Medical`
518
- - `Music`
519
- - `Navigation`
520
- - `News`
521
- - `Apps.Newsstand`
522
- - `Photography`
523
- - `Productivity`
524
- - `Reference`
525
- - `Apps.Shopping`
526
- - `SocialNetworking`
527
- - `Sports`
528
- - `Stickers`
529
- - `Travel`
530
- - `Utilities`
531
- - `Weather`
497
+ - `FOOD_AND_DRINK`
498
+ - `BUSINESS`
499
+ - `EDUCATION`
500
+ - `SOCIAL_NETWORKING`
501
+ - `BOOKS`
502
+ - `SPORTS`
503
+ - `FINANCE`
504
+ - `REFERENCE`
505
+ - `GRAPHICS_AND_DESIGN`
506
+ - `DEVELOPER_TOOLS`
507
+ - `HEALTH_AND_FITNESS`
508
+ - `MUSIC`
509
+ - `WEATHER`
510
+ - `TRAVEL`
511
+ - `ENTERTAINMENT`
512
+ - `STICKERS`
513
+ - `GAMES`
514
+ - `LIFESTYLE`
515
+ - `MEDICAL`
516
+ - `MAGAZINES_AND_NEWSPAPERS`
517
+ - `UTILITIES`
518
+ - `SHOPPING`
519
+ - `PRODUCTIVITY`
520
+ - `NEWS`
521
+ - `PHOTO_AND_VIDEO`
522
+ - `NAVIGATION`
532
523
 
533
524
  ### Available Game Subcategories
534
525
 
@@ -551,54 +542,40 @@ You can always prefix the category using `MZGenre.` (e.g. `MZGenre.Book`). _deli
551
542
  - `MZGenre.Trivia`
552
543
  - `MZGenre.Word`
553
544
 
554
- ### Available Magazines & Newspapers Subcategories
555
-
556
- - `MZGenre.Apps.Arts_Photography`
557
- - `MZGenre.Apps.Automotive`
558
- - `MZGenre.Apps.Brides_Weddings`
559
- - `MZGenre.Apps.Business_Investing`
560
- - `MZGenre.Apps.Childrens_Magazines`
561
- - `MZGenre.Apps.Computers_Internet`
562
- - `MZGenre.Apps.Cooking_Food_Drink`
563
- - `MZGenre.Apps.Crafts_Hobbies`
564
- - `MZGenre.Apps.Electronics_Audio`
565
- - `MZGenre.Apps.Entertainment`
566
- - `MZGenre.Apps.Fashion_Style`
567
- - `MZGenre.Apps.Health_Mind_Body`
568
- - `MZGenre.Apps.History`
569
- - `MZGenre.Apps.Home_Garden`
570
- - `MZGenre.Apps.Literary_Magazines_Journals`
571
- - `MZGenre.Apps.Mens_Interest`
572
- - `MZGenre.Apps.Movies_Music`
573
- - `MZGenre.Apps.News_Politics`
574
- - `MZGenre.Apps.Outdoors_Nature`
575
- - `MZGenre.Apps.Parenting_Family`
576
- - `MZGenre.Apps.Pets`
577
- - `MZGenre.Apps.Professional_Trade`
578
- - `MZGenre.Apps.Regional_News`
579
- - `MZGenre.Apps.Science`
580
- - `MZGenre.Apps.Sports_Leisure`
581
- - `MZGenre.Apps.Teens`
582
- - `MZGenre.Apps.Travel_Regional`
583
- - `MZGenre.Apps.Womens_Interest`
545
+ - `GAMES_SPORTS`
546
+ - `GAMES_WORD`
547
+ - `GAMES_MUSIC`
548
+ - `GAMES_ADVENTURE`
549
+ - `GAMES_ACTION`
550
+ - `GAMES_ROLE_PLAYING`
551
+ - `GAMES_CASUAL`
552
+ - `GAMES_BOARD`
553
+ - `GAMES_TRIVIA`
554
+ - `GAMES_CARD`
555
+ - `GAMES_PUZZLE`
556
+ - `GAMES_CASINO`
557
+ - `GAMES_STRATEGY`
558
+ - `GAMES_SIMULATION`
559
+ - `GAMES_RACING`
560
+ - `GAMES_FAMILY`
584
561
 
585
562
  ### Available Stickers Subcategories
586
563
 
587
- - `MZGenre.Apps.Stickers.Animals`
588
- - `MZGenre.Apps.Stickers.Art`
589
- - `MZGenre.Apps.Stickers.BirthdaysAndCelebrations`
590
- - `MZGenre.Apps.Stickers.Celebrities`
591
- - `MZGenre.Apps.Stickers.Characters`
592
- - `MZGenre.Apps.Stickers.FoodAndDrink`
593
- - `MZGenre.Apps.Stickers.Emotions`
594
- - `MZGenre.Apps.Stickers.Fashion`
595
- - `MZGenre.Apps.Stickers.Games`
596
- - `MZGenre.Apps.Stickers.KidsAndFamily`
597
- - `MZGenre.Apps.Stickers.MoviesAndTV`
598
- - `MZGenre.Apps.Stickers.Music`
599
- - `MZGenre.Apps.Stickers.People`
600
- - `MZGenre.Apps.Stickers.Places`
601
- - `MZGenre.Apps.Stickers.Sports`
564
+ - `STICKERS_PLACES_AND_OBJECTS`
565
+ - `STICKERS_EMOJI_AND_EXPRESSIONS`
566
+ - `STICKERS_CELEBRATIONS`
567
+ - `STICKERS_CELEBRITIES`
568
+ - `STICKERS_MOVIES_AND_TV`
569
+ - `STICKERS_SPORTS_AND_ACTIVITIES`
570
+ - `STICKERS_EATING_AND_DRINKING`
571
+ - `STICKERS_CHARACTERS`
572
+ - `STICKERS_ANIMALS`
573
+ - `STICKERS_FASHION`
574
+ - `STICKERS_ART`
575
+ - `STICKERS_GAMING`
576
+ - `STICKERS_KIDS_AND_FAMILY`
577
+ - `STICKERS_PEOPLE`
578
+ - `STICKERS_MUSIC`
602
579
 
603
580
  ### Available age rating groups
604
581
 
@@ -610,26 +587,30 @@ You can always prefix the category using `MZGenre.` (e.g. `MZGenre.Book`). _deli
610
587
  - 1: Infrequent/Mild
611
588
  - 2: Frequent/Intense
612
589
 
590
+ - `NONE`
591
+ - `INFREQUENT_OR_MILD`
592
+ - `FREQUENT_OR_INTENSE`
593
+
613
594
  **Keys**
614
595
 
615
- - `CARTOON_FANTASY_VIOLENCE`
616
- - `REALISTIC_VIOLENCE`
617
- - `PROLONGED_GRAPHIC_SADISTIC_REALISTIC_VIOLENCE`
618
- - `PROFANITY_CRUDE_HUMOR`
619
- - `MATURE_SUGGESTIVE`
620
- - `HORROR`
621
- - `MEDICAL_TREATMENT_INFO`
622
- - `ALCOHOL_TOBACCO_DRUGS`
623
- - `GAMBLING`
624
- - `SEXUAL_CONTENT_NUDITY`
625
- - `GRAPHIC_SEXUAL_CONTENT_NUDITY`
596
+ - `violenceCartoonOrFantasy`
597
+ - `violenceRealistic`
598
+ - `violenceRealisticProlongedGraphicOrSadistic`
599
+ - `profanityOrCrudeHumor`
600
+ - `matureOrSuggestiveThemes`
601
+ - `horrorOrFearThemes`
602
+ - `medicalOrTreatmentInformation`
603
+ - `alcoholTobaccoOrDrugUseOrReferences`
604
+ - `gamblingSimulated`
605
+ - `sexualContentOrNudity`
606
+ - `sexualContentGraphicAndNudity`
626
607
 
627
608
  #### Boolean
628
609
 
629
610
  **Keys**
630
611
 
631
- - `UNRESTRICTED_WEB_ACCESS`
632
- - `GAMBLING_CONTESTS`
612
+ - `unrestrictedWebAccess`
613
+ - `gamblingAndContests`
633
614
  </details>
634
615
 
635
616
  <br />