fastlane 2.13.0 → 2.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/credentials_manager/lib/credentials_manager.rb +1 -1
- data/fastlane/lib/fastlane/actions/ipa.rb +2 -1
- data/fastlane/lib/fastlane/actions/mailgun.rb +15 -2
- data/fastlane/lib/fastlane/actions/scan.rb +14 -0
- data/fastlane/lib/fastlane/documentation/docs_generator.rb +24 -1
- data/fastlane/lib/fastlane/environment_printer.rb +2 -1
- data/fastlane/lib/fastlane/fast_file.rb +4 -4
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/fastlane_core/lib/fastlane_core.rb +1 -1
- data/fastlane_core/lib/fastlane_core/configuration/config_item.rb +44 -2
- data/fastlane_core/lib/fastlane_core/device_manager.rb +15 -0
- data/fastlane_core/lib/fastlane_core/helper.rb +1 -1
- data/fastlane_core/lib/fastlane_core/ui/disable_colors.rb +4 -4
- data/frameit/lib/frameit/config_parser.rb +8 -13
- data/frameit/lib/frameit/editor.rb +3 -2
- data/gym/lib/gym/options.rb +4 -2
- data/match/README.md +2 -2
- data/match/lib/match.rb +5 -19
- data/match/lib/match/generator.rb +8 -1
- data/match/lib/match/git_helper.rb +3 -1
- data/match/lib/match/nuke.rb +18 -14
- data/match/lib/match/options.rb +13 -2
- data/match/lib/match/runner.rb +20 -8
- data/match/lib/match/table_printer.rb +5 -4
- data/match/lib/match/utils.rb +12 -8
- data/scan/lib/scan/options.rb +24 -1
- data/scan/lib/scan/runner.rb +12 -11
- data/scan/lib/scan/test_command_generator.rb +10 -2
- data/sigh/lib/sigh/download_all.rb +1 -1
- data/sigh/lib/sigh/runner.rb +2 -2
- data/snapshot/lib/snapshot/options.rb +2 -1
- data/snapshot/lib/snapshot/runner.rb +12 -12
- data/spaceship/lib/spaceship.rb +1 -0
- data/spaceship/lib/spaceship/base.rb +27 -4
- data/spaceship/lib/spaceship/client.rb +3 -2
- data/spaceship/lib/spaceship/du/du_client.rb +26 -16
- data/spaceship/lib/spaceship/portal/app.rb +1 -1
- data/spaceship/lib/spaceship/portal/person.rb +53 -0
- data/spaceship/lib/spaceship/portal/persons.rb +49 -0
- data/spaceship/lib/spaceship/portal/portal.rb +2 -0
- data/spaceship/lib/spaceship/portal/portal_client.rb +69 -10
- data/spaceship/lib/spaceship/portal/provisioning_profile.rb +29 -1
- data/spaceship/lib/spaceship/tunes/application.rb +11 -1
- data/spaceship/lib/spaceship/tunes/iap.rb +113 -0
- data/spaceship/lib/spaceship/tunes/iap_detail.rb +185 -0
- data/spaceship/lib/spaceship/tunes/iap_families.rb +62 -0
- data/spaceship/lib/spaceship/tunes/iap_family_details.rb +59 -0
- data/spaceship/lib/spaceship/tunes/iap_family_list.rb +33 -0
- data/spaceship/lib/spaceship/tunes/iap_list.rb +72 -0
- data/spaceship/lib/spaceship/tunes/iap_status.rb +48 -0
- data/spaceship/lib/spaceship/tunes/iap_type.rb +45 -0
- data/spaceship/lib/spaceship/tunes/tunes.rb +1 -0
- data/spaceship/lib/spaceship/tunes/tunes_client.rb +163 -1
- metadata +21 -5
@@ -0,0 +1,45 @@
|
|
1
|
+
module Spaceship
|
2
|
+
module Tunes
|
3
|
+
# Defines the different in-app purchase product types
|
4
|
+
#
|
5
|
+
# As specified by Apple: https://developer.apple.com/library/content/documentation/LanguagesUtilities/Conceptual/iTunesConnectInAppPurchase_Guide/Chapters/CreatingInAppPurchaseProducts.html
|
6
|
+
module IAPType
|
7
|
+
CONSUMABLE = "consumable"
|
8
|
+
NON_CONSUMABLE = "nonConsumable"
|
9
|
+
RECURRING = "recurring"
|
10
|
+
NON_RENEW_SUBSCRIPTION = "subscription"
|
11
|
+
|
12
|
+
# A product that is used once
|
13
|
+
READABLE_CONSUMABLE = "Consumable"
|
14
|
+
|
15
|
+
# A product that is purchased once and does not expire or decrease with use.
|
16
|
+
READABLE_NON_CONSUMABLE = "Non-Consumable"
|
17
|
+
|
18
|
+
# A product that allows users to purchase dynamic content for a set period (auto-rene).
|
19
|
+
READABLE_AUTO_RENEWABLE_SUBSCRIPTION = "Auto-Renewable Subscription"
|
20
|
+
|
21
|
+
# A product that allows users to purchase a service with a limited duration.
|
22
|
+
READABLE_NON_RENEWING_SUBSCRIPTION = "Non-Renewing Subscription"
|
23
|
+
|
24
|
+
# Get the iap type matching based on a string (given by iTunes Connect)
|
25
|
+
def self.get_from_string(text)
|
26
|
+
mapping = {
|
27
|
+
'ITC.addons.type.consumable' => READABLE_CONSUMABLE,
|
28
|
+
'ITC.addons.type.nonConsumable' => READABLE_NON_CONSUMABLE,
|
29
|
+
'ITC.addons.type.recurring' => READABLE_AUTO_RENEWABLE_SUBSCRIPTION,
|
30
|
+
'ITC.addons.type.subscription' => READABLE_NON_RENEWING_SUBSCRIPTION,
|
31
|
+
'consumable' => READABLE_CONSUMABLE,
|
32
|
+
'nonConsumable' => READABLE_NON_CONSUMABLE,
|
33
|
+
'recurring' => READABLE_AUTO_RENEWABLE_SUBSCRIPTION,
|
34
|
+
'subscription' => READABLE_NON_RENEWING_SUBSCRIPTION
|
35
|
+
}
|
36
|
+
|
37
|
+
mapping.each do |itc_type, readable_type|
|
38
|
+
return readable_type if itc_type == text
|
39
|
+
end
|
40
|
+
|
41
|
+
return nil
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require "securerandom"
|
2
|
-
|
3
2
|
module Spaceship
|
4
3
|
# rubocop:disable Metrics/ClassLength
|
5
4
|
class TunesClient < Spaceship::Client
|
@@ -590,6 +589,14 @@ module Spaceship
|
|
590
589
|
du_client.upload_watch_icon(app_version, upload_image, content_provider_id, sso_token_for_image)
|
591
590
|
end
|
592
591
|
|
592
|
+
# Uploads an In-App-Purchase Review screenshot
|
593
|
+
# @param app_id (AppId): The id of the app
|
594
|
+
# @param upload_image (UploadFile): The icon to upload
|
595
|
+
# @return [JSON] the response
|
596
|
+
def upload_purchase_review_screenshot(app_id, upload_image)
|
597
|
+
du_client.upload_purchase_review_screenshot(app_id, upload_image, content_provider_id, sso_token_for_image)
|
598
|
+
end
|
599
|
+
|
593
600
|
# Uploads a screenshot
|
594
601
|
# @param app_version (AppVersion): The version of your app
|
595
602
|
# @param upload_image (UploadFile): The image to upload
|
@@ -970,6 +977,161 @@ module Spaceship
|
|
970
977
|
parse_response(r, 'data')
|
971
978
|
end
|
972
979
|
|
980
|
+
#####################################################
|
981
|
+
# @!group in-app-purchases
|
982
|
+
#####################################################
|
983
|
+
|
984
|
+
# Returns list of all available In-App-Purchases
|
985
|
+
def iaps(app_id: nil)
|
986
|
+
r = request(:get, "ra/apps/#{app_id}/iaps")
|
987
|
+
return r.body["data"]
|
988
|
+
end
|
989
|
+
|
990
|
+
# Returns list of all available Families
|
991
|
+
def iap_families(app_id: nil)
|
992
|
+
r = request(:get, "ra/apps/#{app_id}/iaps/families")
|
993
|
+
return r.body["data"]
|
994
|
+
end
|
995
|
+
|
996
|
+
# Deletes a In-App-Purchases
|
997
|
+
def delete_iap!(app_id: nil, purchase_id: nil)
|
998
|
+
r = request(:delete, "ra/apps/#{app_id}/iaps/#{purchase_id}")
|
999
|
+
handle_itc_response(r)
|
1000
|
+
end
|
1001
|
+
|
1002
|
+
# loads the full In-App-Purchases
|
1003
|
+
def load_iap(app_id: nil, purchase_id: nil)
|
1004
|
+
r = request(:get, "ra/apps/#{app_id}/iaps/#{purchase_id}")
|
1005
|
+
parse_response(r, 'data')
|
1006
|
+
end
|
1007
|
+
|
1008
|
+
# loads the full In-App-Purchases-Family
|
1009
|
+
def load_iap_family(app_id: nil, family_id: nil)
|
1010
|
+
r = request(:get, "ra/apps/#{app_id}/iaps/family/#{family_id}")
|
1011
|
+
parse_response(r, 'data')
|
1012
|
+
end
|
1013
|
+
|
1014
|
+
# updates an In-App-Purchases-Family
|
1015
|
+
def update_iap_family!(app_id: nil, family_id: nil, data: nil)
|
1016
|
+
with_tunes_retry do
|
1017
|
+
r = request(:put) do |req|
|
1018
|
+
req.url "ra/apps/#{app_id}/iaps/family/#{family_id}/"
|
1019
|
+
req.body = data.to_json
|
1020
|
+
req.headers['Content-Type'] = 'application/json'
|
1021
|
+
end
|
1022
|
+
handle_itc_response(r.body)
|
1023
|
+
end
|
1024
|
+
end
|
1025
|
+
|
1026
|
+
# updates an In-App-Purchases
|
1027
|
+
def update_iap!(app_id: nil, purchase_id: nil, data: nil)
|
1028
|
+
with_tunes_retry do
|
1029
|
+
r = request(:put) do |req|
|
1030
|
+
req.url "ra/apps/#{app_id}/iaps/#{purchase_id}"
|
1031
|
+
req.body = data.to_json
|
1032
|
+
req.headers['Content-Type'] = 'application/json'
|
1033
|
+
end
|
1034
|
+
handle_itc_response(r.body)
|
1035
|
+
end
|
1036
|
+
end
|
1037
|
+
|
1038
|
+
def create_iap_family(app_id: nil, name: nil, product_id: nil, reference_name: nil, versions: [])
|
1039
|
+
r = request(:get, "ra/apps/#{app_id}/iaps/family/template")
|
1040
|
+
data = parse_response(r, 'data')
|
1041
|
+
|
1042
|
+
data['activeAddOns'][0]['productId'] = { value: product_id }
|
1043
|
+
data['activeAddOns'][0]['referenceName'] = { value: reference_name }
|
1044
|
+
data['name'] = { value: name }
|
1045
|
+
data["details"]["value"] = versions
|
1046
|
+
|
1047
|
+
r = request(:post) do |req|
|
1048
|
+
req.url "ra/apps/#{app_id}/iaps/family/"
|
1049
|
+
req.body = data.to_json
|
1050
|
+
req.headers['Content-Type'] = 'application/json'
|
1051
|
+
end
|
1052
|
+
handle_itc_response(r.body)
|
1053
|
+
end
|
1054
|
+
|
1055
|
+
# returns pricing goal array
|
1056
|
+
def iap_subscription_pricing_target(app_id: nil, purchase_id: nil, currency:, tier:)
|
1057
|
+
r = request(:get, "ra/apps/#{app_id}/iaps/#{purchase_id}/pricing/equalize/#{currency}/#{tier}")
|
1058
|
+
parse_response(r, 'data')
|
1059
|
+
end
|
1060
|
+
|
1061
|
+
# Creates an In-App-Purchases
|
1062
|
+
def create_iap!(app_id: nil, type: nil, versions: nil, reference_name: nil, product_id: nil, cleared_for_sale: true, review_notes: nil, review_screenshot: nil, pricing_intervals: nil, family_id: nil, subscription_duration: nil, subscription_free_trial: nil)
|
1063
|
+
# Load IAP Template based on Type
|
1064
|
+
type ||= "consumable"
|
1065
|
+
r = request(:get, "ra/apps/#{app_id}/iaps/#{type}/template")
|
1066
|
+
data = parse_response(r, 'data')
|
1067
|
+
|
1068
|
+
# Now fill in the values we have
|
1069
|
+
# some values are nil, that's why there is a hash
|
1070
|
+
data['familyId'] = family_id.to_s if family_id
|
1071
|
+
data['productId'] = { value: product_id }
|
1072
|
+
data['referenceName'] = { value: reference_name }
|
1073
|
+
data['clearedForSale'] = { value: cleared_for_sale }
|
1074
|
+
|
1075
|
+
data['pricingDurationType'] = { value: subscription_duration } if subscription_duration
|
1076
|
+
data['freeTrialDurationType'] = { value: subscription_free_trial } if subscription_free_trial
|
1077
|
+
|
1078
|
+
# pricing tier
|
1079
|
+
if pricing_intervals
|
1080
|
+
data['pricingIntervals'] = []
|
1081
|
+
pricing_intervals.each do |interval|
|
1082
|
+
data['pricingIntervals'] << {
|
1083
|
+
value: {
|
1084
|
+
country: interval[:country] || "WW",
|
1085
|
+
tierStem: interval[:tier].to_s,
|
1086
|
+
priceTierEndDate: interval[:end_date],
|
1087
|
+
priceTierEffectiveDate: interval[:begin_date]
|
1088
|
+
}
|
1089
|
+
}
|
1090
|
+
end
|
1091
|
+
end
|
1092
|
+
|
1093
|
+
versions_array = []
|
1094
|
+
versions.each do |k, v|
|
1095
|
+
versions_array << {
|
1096
|
+
value: {
|
1097
|
+
description: { value: v[:description] },
|
1098
|
+
name: { value: v[:name] },
|
1099
|
+
localeCode: k.to_s
|
1100
|
+
}
|
1101
|
+
}
|
1102
|
+
end
|
1103
|
+
data["versions"][0]["details"]["value"] = versions_array
|
1104
|
+
data['versions'][0]["reviewNotes"] = { value: review_notes }
|
1105
|
+
|
1106
|
+
if review_screenshot
|
1107
|
+
# Upload Screenshot:
|
1108
|
+
upload_file = UploadFile.from_path review_screenshot
|
1109
|
+
screenshot_data = upload_purchase_review_screenshot(app_id, upload_file)
|
1110
|
+
new_screenshot = {
|
1111
|
+
"value" => {
|
1112
|
+
"assetToken" => screenshot_data["token"],
|
1113
|
+
"sortOrder" => 0,
|
1114
|
+
"type" => "SortedScreenShot",
|
1115
|
+
"originalFileName" => upload_file.file_name,
|
1116
|
+
"size" => screenshot_data["length"],
|
1117
|
+
"height" => screenshot_data["height"],
|
1118
|
+
"width" => screenshot_data["width"],
|
1119
|
+
"checksum" => screenshot_data["md5"]
|
1120
|
+
}
|
1121
|
+
}
|
1122
|
+
|
1123
|
+
data["versions"][0]["reviewScreenshot"] = new_screenshot
|
1124
|
+
end
|
1125
|
+
|
1126
|
+
# Now send back the modified hash
|
1127
|
+
r = request(:post) do |req|
|
1128
|
+
req.url "ra/apps/#{app_id}/iaps"
|
1129
|
+
req.body = data.to_json
|
1130
|
+
req.headers['Content-Type'] = 'application/json'
|
1131
|
+
end
|
1132
|
+
handle_itc_response(r.body)
|
1133
|
+
end
|
1134
|
+
|
973
1135
|
#####################################################
|
974
1136
|
# @!group Testers
|
975
1137
|
#####################################################
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.14.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Felix Krause
|
@@ -14,7 +14,7 @@ authors:
|
|
14
14
|
autorequire:
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
|
-
date: 2017-
|
17
|
+
date: 2017-02-02 00:00:00.000000000 Z
|
18
18
|
dependencies:
|
19
19
|
- !ruby/object:Gem::Dependency
|
20
20
|
name: slack-notifier
|
@@ -205,19 +205,25 @@ dependencies:
|
|
205
205
|
- !ruby/object:Gem::Version
|
206
206
|
version: 2.0.0
|
207
207
|
- !ruby/object:Gem::Dependency
|
208
|
-
name:
|
208
|
+
name: colored2
|
209
209
|
requirement: !ruby/object:Gem::Requirement
|
210
210
|
requirements:
|
211
211
|
- - ">="
|
212
212
|
- !ruby/object:Gem::Version
|
213
|
-
version:
|
213
|
+
version: 3.1.1
|
214
|
+
- - "<"
|
215
|
+
- !ruby/object:Gem::Version
|
216
|
+
version: 4.0.0
|
214
217
|
type: :runtime
|
215
218
|
prerelease: false
|
216
219
|
version_requirements: !ruby/object:Gem::Requirement
|
217
220
|
requirements:
|
218
221
|
- - ">="
|
219
222
|
- !ruby/object:Gem::Version
|
220
|
-
version:
|
223
|
+
version: 3.1.1
|
224
|
+
- - "<"
|
225
|
+
- !ruby/object:Gem::Version
|
226
|
+
version: 4.0.0
|
221
227
|
- !ruby/object:Gem::Dependency
|
222
228
|
name: commander
|
223
229
|
requirement: !ruby/object:Gem::Requirement
|
@@ -1207,6 +1213,8 @@ files:
|
|
1207
1213
|
- spaceship/lib/spaceship/portal/app_service.rb
|
1208
1214
|
- spaceship/lib/spaceship/portal/certificate.rb
|
1209
1215
|
- spaceship/lib/spaceship/portal/device.rb
|
1216
|
+
- spaceship/lib/spaceship/portal/person.rb
|
1217
|
+
- spaceship/lib/spaceship/portal/persons.rb
|
1210
1218
|
- spaceship/lib/spaceship/portal/portal.rb
|
1211
1219
|
- spaceship/lib/spaceship/portal/portal_base.rb
|
1212
1220
|
- spaceship/lib/spaceship/portal/portal_client.rb
|
@@ -1234,6 +1242,14 @@ files:
|
|
1234
1242
|
- spaceship/lib/spaceship/tunes/build_details.rb
|
1235
1243
|
- spaceship/lib/spaceship/tunes/build_train.rb
|
1236
1244
|
- spaceship/lib/spaceship/tunes/device_type.rb
|
1245
|
+
- spaceship/lib/spaceship/tunes/iap.rb
|
1246
|
+
- spaceship/lib/spaceship/tunes/iap_detail.rb
|
1247
|
+
- spaceship/lib/spaceship/tunes/iap_families.rb
|
1248
|
+
- spaceship/lib/spaceship/tunes/iap_family_details.rb
|
1249
|
+
- spaceship/lib/spaceship/tunes/iap_family_list.rb
|
1250
|
+
- spaceship/lib/spaceship/tunes/iap_list.rb
|
1251
|
+
- spaceship/lib/spaceship/tunes/iap_status.rb
|
1252
|
+
- spaceship/lib/spaceship/tunes/iap_type.rb
|
1237
1253
|
- spaceship/lib/spaceship/tunes/language_converter.rb
|
1238
1254
|
- spaceship/lib/spaceship/tunes/language_item.rb
|
1239
1255
|
- spaceship/lib/spaceship/tunes/member.rb
|