fastlane 2.28.7 → 2.28.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/fastlane/README.md +6 -2
- data/fastlane/lib/fastlane/actions/download_dsyms.rb +1 -1
- data/fastlane/lib/fastlane/actions/hockey.rb +1 -1
- data/fastlane/lib/fastlane/actions/upload_symbols_to_crashlytics.rb +3 -3
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/fastlane_core/lib/fastlane_core/project.rb +9 -2
- data/fastlane_core/lib/fastlane_core/ui/implementations/shell.rb +2 -0
- data/fastlane_core/lib/fastlane_core/ui/ui.rb +0 -2
- data/gym/lib/gym/generators/build_command_generator.rb +2 -0
- data/gym/lib/gym/options.rb +5 -0
- data/pilot/lib/pilot/build_manager.rb +23 -3
- data/spaceship/lib/spaceship/test_flight.rb +1 -0
- data/spaceship/lib/spaceship/test_flight/app_test_info.rb +27 -0
- data/spaceship/lib/spaceship/test_flight/client.rb +24 -17
- data/spaceship/lib/spaceship/tunes/app_ratings.rb +74 -2
- data/spaceship/lib/spaceship/tunes/app_status.rb +3 -2
- data/spaceship/lib/spaceship/tunes/iap_detail.rb +48 -11
- data/spaceship/lib/spaceship/tunes/iap_family_details.rb +24 -5
- data/spaceship/lib/spaceship/tunes/tunes_client.rb +13 -2
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 29a3514e4db5119fe553985626131a7f6a12e171
|
4
|
+
data.tar.gz: 2df13870e6ee1050f49376bc6150cf27b4fb2945
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ca79028fae92c0f929acf8434d8eff2cd738c537ffd04cf9b9c2b440f2a2894992acb2c95370ae7ca068cd3151657f6410c34558e4a26bd8a92bb27ba2593c3d
|
7
|
+
data.tar.gz: 9bcb75145d22202c195ec3bb945faee587ddee389e28693985cf82c0fc9449e9c2e34d0c4da0119b80e7073e7241b8ea013cd31c51c78a74bf2d4de79233d63c
|
data/README.md
CHANGED
@@ -48,7 +48,7 @@ Then to deploy a new 'beta' version of your app just run
|
|
48
48
|
:ghost: | [Jenkins Integration](https://docs.fastlane.tools/best-practices/continuous-integration/#jenkins-integration): Show output directly in test results
|
49
49
|
:book: | Automatically generate Markdown documentation of your lane configurations
|
50
50
|
:hatching_chick: | Over 170 built-in integrations available
|
51
|
-
:computer: | Support for iOS
|
51
|
+
:computer: | Support for iOS and Android apps
|
52
52
|
:octocat: | Full Git and Mercurial support
|
53
53
|
|
54
54
|
<hr />
|
data/fastlane/README.md
CHANGED
@@ -91,7 +91,7 @@ fastlane release
|
|
91
91
|
:ghost: | [Jenkins Integration](https://docs.fastlane.tools/best-practices/continuous-integration/#jenkins-integration): Show the output directly in the Jenkins test results
|
92
92
|
:book: | Automatically generate a markdown documentation of your lane config
|
93
93
|
:hatching_chick: | Over 170 built-in integrations available
|
94
|
-
:computer: | Support for iOS
|
94
|
+
:computer: | Support for iOS and Android apps
|
95
95
|
:octocat: | Full git and mercurial support
|
96
96
|
|
97
97
|
|
@@ -138,7 +138,11 @@ The setup assistant will create all the necessary files for you, using the exist
|
|
138
138
|
- Follow the setup assistant, which will set up ```fastlane``` for you
|
139
139
|
- Further customise the ```Fastfile``` with [actions](https://docs.fastlane.tools/actions).
|
140
140
|
|
141
|
-
For more details,
|
141
|
+
For more details, follow our new Getting Started guides:
|
142
|
+
|
143
|
+
- [Getting Started fastlane guide for iOS](https://docs.fastlane.tools/getting-started/ios/setup/)
|
144
|
+
- [Getting Started fastlane guide for Android](https://docs.fastlane.tools/getting-started/android/setup/)
|
145
|
+
|
142
146
|
|
143
147
|
There are also 2 Japanese fastlane guides available: [qiita](http://qiita.com/gin0606/items/a8573b582752de0c15e1) and [mercari](http://tech.mercari.com/entry/2015/07/13/143000)
|
144
148
|
|
@@ -250,7 +250,7 @@ module Fastlane
|
|
250
250
|
default_value: "1"),
|
251
251
|
FastlaneCore::ConfigItem.new(key: :status,
|
252
252
|
env_name: "FL_HOCKEY_STATUS",
|
253
|
-
description: "Download status: \"1\" = No user can download; \"2\" = Available for download",
|
253
|
+
description: "Download status: \"1\" = No user can download; \"2\" = Available for download (only possible with full-access token)",
|
254
254
|
default_value: "2"),
|
255
255
|
FastlaneCore::ConfigItem.new(key: :notes_type,
|
256
256
|
env_name: "FL_HOCKEY_NOTES_TYPE",
|
@@ -128,10 +128,10 @@ module Fastlane
|
|
128
128
|
end),
|
129
129
|
FastlaneCore::ConfigItem.new(key: :platform,
|
130
130
|
env_name: "FL_UPLOAD_SYMBOLS_TO_CRASHLYTICS_PLATFORM",
|
131
|
-
description: "The platform of the app (ios,
|
131
|
+
description: "The platform of the app (ios, appletvos, mac)",
|
132
132
|
default_value: "ios",
|
133
133
|
verify_block: proc do |value|
|
134
|
-
available = ['ios', '
|
134
|
+
available = ['ios', 'appletvos', 'mac']
|
135
135
|
UI.user_error!("Invalid platform '#{value}', must be #{available.join(', ')}") unless available.include?(value)
|
136
136
|
end)
|
137
137
|
]
|
@@ -150,7 +150,7 @@ module Fastlane
|
|
150
150
|
end
|
151
151
|
|
152
152
|
def self.is_supported?(platform)
|
153
|
-
|
153
|
+
[:ios, :appletvos].include?(platform)
|
154
154
|
end
|
155
155
|
|
156
156
|
def self.example_code
|
@@ -296,9 +296,16 @@ module FastlaneCore
|
|
296
296
|
# @param [String] The key of which we want the value for (e.g. "PRODUCT_NAME")
|
297
297
|
def build_settings(key: nil, optional: true)
|
298
298
|
unless @build_settings
|
299
|
+
if is_workspace
|
300
|
+
if schemes.count == 0
|
301
|
+
UI.user_error!("Could not find any schemes for Xcode workspace at path '#{self.path}'. Please make sure that the schemes you want to use are marked as `Shared` from Xcode.")
|
302
|
+
end
|
303
|
+
options[:scheme] ||= schemes.first
|
304
|
+
end
|
305
|
+
|
299
306
|
command = build_xcodebuild_showbuildsettings_command
|
300
307
|
|
301
|
-
#
|
308
|
+
# Xcode might hang here and retrying fixes the problem, see fastlane#4059
|
302
309
|
begin
|
303
310
|
timeout = FastlaneCore::Project.xcode_build_settings_timeout
|
304
311
|
retries = FastlaneCore::Project.xcode_build_settings_retries
|
@@ -332,7 +339,7 @@ module FastlaneCore
|
|
332
339
|
|
333
340
|
# Returns the build settings and sets the default scheme to the options hash
|
334
341
|
def default_build_settings(key: nil, optional: true)
|
335
|
-
options[:scheme]
|
342
|
+
options[:scheme] ||= schemes.first if is_workspace
|
336
343
|
build_settings(key: key, optional: optional)
|
337
344
|
end
|
338
345
|
|
@@ -41,6 +41,7 @@ module Gym
|
|
41
41
|
options << "-derivedDataPath '#{config[:derived_data_path]}'" if config[:derived_data_path]
|
42
42
|
options << "-resultBundlePath '#{result_bundle_path}'" if config[:result_bundle]
|
43
43
|
options << config[:xcargs] if config[:xcargs]
|
44
|
+
options << "OTHER_SWIFT_FLAGS=\"\$(inherited) -Xfrontend -debug-time-function-bodies\"" if config[:analyze_build_time]
|
44
45
|
|
45
46
|
options
|
46
47
|
end
|
@@ -64,6 +65,7 @@ module Gym
|
|
64
65
|
def pipe
|
65
66
|
pipe = []
|
66
67
|
pipe << "| tee #{xcodebuild_log_path.shellescape}"
|
68
|
+
pipe << "| grep .[0-9]ms | grep -v ^0.[0-9]ms | sort -nr > culprits.txt" if Gym.config[:analyze_build_time]
|
67
69
|
unless Gym.config[:disable_xcpretty]
|
68
70
|
formatter = Gym.config[:xcpretty_formatter]
|
69
71
|
pipe << "| xcpretty"
|
data/gym/lib/gym/options.rb
CHANGED
@@ -277,6 +277,11 @@ module Gym
|
|
277
277
|
verify_block: proc do |value|
|
278
278
|
UI.user_error!("Report output location not found at path '#{File.expand_path(value)}'") unless File.exist?(value)
|
279
279
|
end),
|
280
|
+
FastlaneCore::ConfigItem.new(key: :analyze_build_time,
|
281
|
+
env_name: "GYM_ANALYZE_BUILD_TIME",
|
282
|
+
description: "Analyze the project build time and store the output in culprits.txt file",
|
283
|
+
optional: true,
|
284
|
+
is_string: false),
|
280
285
|
FastlaneCore::ConfigItem.new(key: :xcpretty_utf,
|
281
286
|
env_name: "XCPRETTY_UTF",
|
282
287
|
description: "Have xcpretty use unicode encoding when reporting builds",
|
@@ -51,9 +51,25 @@ module Pilot
|
|
51
51
|
UI.user_error!("No build to distribute!")
|
52
52
|
end
|
53
53
|
|
54
|
+
if should_update_app_test_information(options)
|
55
|
+
app_test_info = Spaceship::TestFlight::AppTestInfo.find(app_id: build.app_id)
|
56
|
+
app_test_info.test_info.feedback_email = options[:beta_app_feedback_email] if options[:beta_app_feedback_email]
|
57
|
+
app_test_info.test_info.description = options[:beta_app_description] if options[:beta_app_description]
|
58
|
+
begin
|
59
|
+
app_test_info.save_for_app!(app_id: build.app_id)
|
60
|
+
UI.success "Successfully set the beta_app_feedback_email and/or beta_app_description"
|
61
|
+
rescue => ex
|
62
|
+
UI.user_error!("Could not set beta_app_feedback_email and/or beta_app_description: #{ex}")
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
54
66
|
if should_update_build_information(options)
|
55
|
-
|
56
|
-
|
67
|
+
begin
|
68
|
+
build.update_build_information!(whats_new: options[:changelog])
|
69
|
+
UI.success "Successfully set the changelog for build"
|
70
|
+
rescue => ex
|
71
|
+
UI.user_error!("Could not set changelog: #{ex}")
|
72
|
+
end
|
57
73
|
end
|
58
74
|
|
59
75
|
return if config[:skip_submission]
|
@@ -105,7 +121,11 @@ module Pilot
|
|
105
121
|
end
|
106
122
|
|
107
123
|
def should_update_build_information(options)
|
108
|
-
options[:changelog].to_s.length
|
124
|
+
options[:changelog].to_s.length
|
125
|
+
end
|
126
|
+
|
127
|
+
def should_update_app_test_information(options)
|
128
|
+
options[:beta_app_description].to_s.length > 0 || options[:beta_app_feedback_email].to_s.length > 0
|
109
129
|
end
|
110
130
|
|
111
131
|
def distribute_build(uploaded_build, options)
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Spaceship::TestFlight
|
2
|
+
class AppTestInfo < Base
|
3
|
+
# AppTestInfo wraps a test_info and beta_review_info in the format required to manage test_info
|
4
|
+
# for an application. Note that this structure, although looking similar to build test_info
|
5
|
+
# is test information about the application
|
6
|
+
|
7
|
+
attr_accessor :test_info
|
8
|
+
|
9
|
+
def self.find(app_id: nil)
|
10
|
+
raw_app_test_info = client.get_app_test_info(app_id: app_id)
|
11
|
+
self.new(raw_app_test_info)
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_info
|
15
|
+
Spaceship::TestFlight::TestInfo.new(raw_data['details'])
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_info=(value)
|
19
|
+
raw_data.set(['details'], value.raw_data)
|
20
|
+
end
|
21
|
+
|
22
|
+
# saves the changes to the App Test Info object to TestFlight
|
23
|
+
def save_for_app!(app_id: nil)
|
24
|
+
client.put_app_test_info(app_id: app_id, app_test_info: self)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -34,20 +34,6 @@ module Spaceship::TestFlight
|
|
34
34
|
handle_response(response)
|
35
35
|
end
|
36
36
|
|
37
|
-
def testers_for_app(app_id: nil)
|
38
|
-
assert_required_params(__method__, binding)
|
39
|
-
url = "providers/#{team_id}/apps/#{app_id}/testers"
|
40
|
-
response = request(:get, url)
|
41
|
-
handle_response(response)
|
42
|
-
end
|
43
|
-
|
44
|
-
def delete_tester_from_app(app_id: nil, tester_id: nil)
|
45
|
-
assert_required_params(__method__, binding)
|
46
|
-
url = "providers/#{team_id}/apps/#{app_id}/testers/#{tester_id}"
|
47
|
-
response = request(:delete, url)
|
48
|
-
handle_response(response)
|
49
|
-
end
|
50
|
-
|
51
37
|
##
|
52
38
|
# @!group Builds API
|
53
39
|
##
|
@@ -111,6 +97,20 @@ module Spaceship::TestFlight
|
|
111
97
|
# @!group Testers API
|
112
98
|
##
|
113
99
|
|
100
|
+
def testers_for_app(app_id: nil)
|
101
|
+
assert_required_params(__method__, binding)
|
102
|
+
url = "providers/#{team_id}/apps/#{app_id}/testers?limit=10000"
|
103
|
+
response = request(:get, url)
|
104
|
+
handle_response(response)
|
105
|
+
end
|
106
|
+
|
107
|
+
def delete_tester_from_app(app_id: nil, tester_id: nil)
|
108
|
+
assert_required_params(__method__, binding)
|
109
|
+
url = "providers/#{team_id}/apps/#{app_id}/testers/#{tester_id}"
|
110
|
+
response = request(:delete, url)
|
111
|
+
handle_response(response)
|
112
|
+
end
|
113
|
+
|
114
114
|
def post_tester(app_id: nil, tester: nil)
|
115
115
|
assert_required_params(__method__, binding)
|
116
116
|
|
@@ -156,15 +156,22 @@ module Spaceship::TestFlight
|
|
156
156
|
end
|
157
157
|
|
158
158
|
##
|
159
|
-
# @!group
|
159
|
+
# @!group AppTestInfo
|
160
160
|
##
|
161
161
|
|
162
|
-
def
|
162
|
+
def get_app_test_info(app_id: nil)
|
163
|
+
assert_required_params(__method__, binding)
|
164
|
+
|
165
|
+
response = request(:get, "providers/#{team_id}/apps/#{app_id}/testInfo")
|
166
|
+
handle_response(response)
|
167
|
+
end
|
168
|
+
|
169
|
+
def put_app_test_info(app_id: nil, app_test_info: nil)
|
163
170
|
assert_required_params(__method__, binding)
|
164
171
|
|
165
172
|
response = request(:put) do |req|
|
166
173
|
req.url "providers/#{team_id}/apps/#{app_id}/testInfo"
|
167
|
-
req.body =
|
174
|
+
req.body = app_test_info.to_json
|
168
175
|
req.headers['Content-Type'] = 'application/json'
|
169
176
|
end
|
170
177
|
handle_response(response)
|
@@ -47,9 +47,81 @@ module Spaceship
|
|
47
47
|
instance_variable_set(:@store_fronts, unfolded_store_fronts)
|
48
48
|
end
|
49
49
|
|
50
|
-
# @return (Array) of
|
50
|
+
# @return (Array) of Review Objects
|
51
51
|
def reviews(store_front, versionId = '')
|
52
|
-
client.get_reviews(application.apple_id, application.platform, store_front, versionId)
|
52
|
+
raw_reviews = client.get_reviews(application.apple_id, application.platform, store_front, versionId)
|
53
|
+
raw_reviews.map do |review|
|
54
|
+
review["value"]["application"] = self.application
|
55
|
+
AppReview.factory(review["value"])
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
class DeveloperResponse < TunesBase
|
61
|
+
attr_reader :id
|
62
|
+
attr_reader :response
|
63
|
+
attr_reader :last_modified
|
64
|
+
attr_reader :hidden
|
65
|
+
attr_reader :state
|
66
|
+
attr_accessor :application
|
67
|
+
attr_accessor :review_id
|
68
|
+
|
69
|
+
attr_mapping({
|
70
|
+
'responseId' => :id,
|
71
|
+
'response' => :response,
|
72
|
+
'lastModified' => :last_modified,
|
73
|
+
'isHidden' => :hidden,
|
74
|
+
'pendingState' => :state
|
75
|
+
})
|
76
|
+
end
|
77
|
+
|
78
|
+
class AppReview < TunesBase
|
79
|
+
attr_accessor :application
|
80
|
+
attr_reader :rating
|
81
|
+
attr_reader :id
|
82
|
+
attr_reader :title
|
83
|
+
attr_reader :review
|
84
|
+
attr_reader :nickname
|
85
|
+
attr_reader :store_front
|
86
|
+
attr_reader :app_version
|
87
|
+
attr_reader :last_modified
|
88
|
+
attr_reader :helpful_views
|
89
|
+
attr_reader :total_views
|
90
|
+
attr_reader :edited
|
91
|
+
attr_reader :raw_developer_response
|
92
|
+
attr_accessor :developer_response
|
93
|
+
|
94
|
+
attr_mapping({
|
95
|
+
'id' => :id,
|
96
|
+
'rating' => :rating,
|
97
|
+
'title' => :title,
|
98
|
+
'review' => :review,
|
99
|
+
'nickname' => :nickname,
|
100
|
+
'storeFront' => :store_front,
|
101
|
+
'appVersionString' => :app_version,
|
102
|
+
'lastModified' => :last_modified,
|
103
|
+
'helpfulViews' => :helpful_views,
|
104
|
+
'totalViews' => :total_views,
|
105
|
+
'developerResponse' => :raw_developer_response,
|
106
|
+
'edited' => :edited
|
107
|
+
})
|
108
|
+
class << self
|
109
|
+
# Create a new object based on a hash.
|
110
|
+
# This is used to create a new object based on the server response.
|
111
|
+
def factory(attrs)
|
112
|
+
obj = self.new(attrs)
|
113
|
+
response_attrs = {}
|
114
|
+
response_attrs = obj.raw_developer_response if obj.raw_developer_response
|
115
|
+
response_attrs[:application] = obj.application
|
116
|
+
response_attrs[:review_id] = obj.id
|
117
|
+
obj.developer_response = DeveloperResponse.factory(response_attrs)
|
118
|
+
return obj
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def responded?
|
123
|
+
return true if raw_developer_response
|
124
|
+
false
|
53
125
|
end
|
54
126
|
end
|
55
127
|
|
@@ -33,7 +33,7 @@ module Spaceship
|
|
33
33
|
PROCESSING_FOR_APP_STORE = "Processing for App Store"
|
34
34
|
# WAITING_FOR_EXPORT_COMPLIANCE = "Waiting For Export Compliance"
|
35
35
|
METADATA_REJECTED = "Metadata Rejected"
|
36
|
-
|
36
|
+
REMOVED_FROM_SALE = "Removed From Sale"
|
37
37
|
# INVALID_BINARY = "Invalid Binary"
|
38
38
|
|
39
39
|
# Get the app status matching based on a string (given by iTunes Connect)
|
@@ -48,7 +48,8 @@ module Spaceship
|
|
48
48
|
'inReview' => IN_REVIEW,
|
49
49
|
'rejected' => REJECTED,
|
50
50
|
'pendingDeveloperRelease' => PENDING_DEVELOPER_RELEASE,
|
51
|
-
'metadataRejected' => METADATA_REJECTED
|
51
|
+
'metadataRejected' => METADATA_REJECTED,
|
52
|
+
'removedFromSale' => REMOVED_FROM_SALE
|
52
53
|
}
|
53
54
|
|
54
55
|
mapping.each do |k, v|
|
@@ -70,6 +70,43 @@ module Spaceship
|
|
70
70
|
return parsed_versions
|
71
71
|
end
|
72
72
|
|
73
|
+
# transforms user-set versions to iTC ones
|
74
|
+
def versions=(value = {})
|
75
|
+
if value.kind_of?(Array)
|
76
|
+
# input that comes from iTC api
|
77
|
+
return
|
78
|
+
end
|
79
|
+
new_versions = []
|
80
|
+
value.each do |language, current_version|
|
81
|
+
new_versions << {
|
82
|
+
"value" => {
|
83
|
+
"name" => { "value" => current_version[:name] },
|
84
|
+
"description" => { "value" => current_version[:description] },
|
85
|
+
"localeCode" => language.to_s
|
86
|
+
}
|
87
|
+
}
|
88
|
+
end
|
89
|
+
|
90
|
+
raw_data.set(["versions"], [{ reviewNotes: { value: @review_notes }, contentHosting: raw_data['versions'].first['contentHosting'], "details" => { "value" => new_versions }, "id" => raw_data["versions"].first["id"] }])
|
91
|
+
end
|
92
|
+
|
93
|
+
# transforms user-set intervals to iTC ones
|
94
|
+
def pricing_intervals=(value = [])
|
95
|
+
new_intervals = []
|
96
|
+
value.each do |current_interval|
|
97
|
+
new_intervals << {
|
98
|
+
"value" => {
|
99
|
+
"tierStem" => current_interval[:tier],
|
100
|
+
"priceTierEndDate" => current_interval[:end_date],
|
101
|
+
"priceTierEffectiveDate" => current_interval[:begin_date],
|
102
|
+
"grandfathered" => current_interval[:grandfathered],
|
103
|
+
"country" => current_interval[:country]
|
104
|
+
}
|
105
|
+
}
|
106
|
+
end
|
107
|
+
raw_data.set(["pricingIntervals"], new_intervals)
|
108
|
+
end
|
109
|
+
|
73
110
|
# @return (Array) pricing intervals
|
74
111
|
# @example:
|
75
112
|
# [
|
@@ -110,26 +147,26 @@ module Spaceship
|
|
110
147
|
versions_array = []
|
111
148
|
versions.each do |language, value|
|
112
149
|
versions_array << {
|
113
|
-
value
|
114
|
-
description
|
115
|
-
name
|
116
|
-
localeCode
|
150
|
+
"value" => {
|
151
|
+
"description" => { "value" => value[:description] },
|
152
|
+
"name" => { "value" => value[:name] },
|
153
|
+
"localeCode" => language.to_s
|
117
154
|
}
|
118
155
|
}
|
119
156
|
end
|
120
157
|
|
121
|
-
raw_data.set(["versions"], [{ reviewNotes: @review_notes,
|
158
|
+
raw_data.set(["versions"], [{ reviewNotes: { value: @review_notes }, contentHosting: raw_data['versions'].first[:contentHosting], "details" => { "value" => versions_array }, id: raw_data["versions"].first["id"] }])
|
122
159
|
|
123
160
|
# transform pricingDetails
|
124
161
|
intervals_array = []
|
125
162
|
pricing_intervals.each do |interval|
|
126
163
|
intervals_array << {
|
127
|
-
value
|
128
|
-
tierStem
|
129
|
-
priceTierEffectiveDate
|
130
|
-
priceTierEndDate
|
131
|
-
country
|
132
|
-
grandfathered
|
164
|
+
"value" => {
|
165
|
+
"tierStem" => interval[:tier],
|
166
|
+
"priceTierEffectiveDate" => interval[:begin_date],
|
167
|
+
"priceTierEndDate" => interval[:end_date],
|
168
|
+
"country" => interval[:country] || "WW",
|
169
|
+
"grandfathered" => interval[:grandfathered]
|
133
170
|
}
|
134
171
|
}
|
135
172
|
end
|
@@ -22,6 +22,25 @@ module Spaceship
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
+
def versions=(value = {})
|
26
|
+
if value.kind_of?(Array)
|
27
|
+
# input that comes from iTC api
|
28
|
+
return
|
29
|
+
end
|
30
|
+
new_versions = []
|
31
|
+
value.each do |language, current_version|
|
32
|
+
new_versions << {
|
33
|
+
"value" => {
|
34
|
+
"subscriptionName" => { "value" => current_version[:subscription_name] },
|
35
|
+
"name" => { "value" => current_version[:name] },
|
36
|
+
"localeCode" => { "value" => language }
|
37
|
+
}
|
38
|
+
}
|
39
|
+
end
|
40
|
+
|
41
|
+
raw_data.set(["details"], { "value" => new_versions })
|
42
|
+
end
|
43
|
+
|
25
44
|
# @return (Hash) localized names
|
26
45
|
def versions
|
27
46
|
parsed_versions = {}
|
@@ -42,15 +61,15 @@ module Spaceship
|
|
42
61
|
versions_array = []
|
43
62
|
versions.each do |language_code, value|
|
44
63
|
versions_array << {
|
45
|
-
value
|
46
|
-
subscriptionName
|
47
|
-
name
|
48
|
-
localeCode
|
64
|
+
"value" => {
|
65
|
+
"subscriptionName" => { "value" => value[:subscription_name] },
|
66
|
+
"name" => { "value" => value[:name] },
|
67
|
+
"localeCode" => { "value" => language_code.to_s }
|
49
68
|
}
|
50
69
|
}
|
51
70
|
end
|
52
71
|
|
53
|
-
raw_data.set(["details"], { value
|
72
|
+
raw_data.set(["details"], { "value" => versions_array })
|
54
73
|
|
55
74
|
client.update_iap_family!(app_id: application.apple_id, family_id: self.family_id, data: raw_data)
|
56
75
|
end
|
@@ -324,8 +324,19 @@ module Spaceship
|
|
324
324
|
end
|
325
325
|
|
326
326
|
def get_reviews(app_id, platform, storefront, versionId = '')
|
327
|
-
|
328
|
-
|
327
|
+
index = 0
|
328
|
+
per_page = 100 # apple default
|
329
|
+
all_reviews = []
|
330
|
+
loop do
|
331
|
+
r = request(:get, "ra/apps/#{app_id}/platforms/#{platform}/reviews?storefront=#{storefront}&versionId=#{versionId}&index=#{index}")
|
332
|
+
all_reviews.concat(parse_response(r, 'data')['reviews'])
|
333
|
+
if all_reviews.count < parse_response(r, 'data')['reviewCount']
|
334
|
+
index += per_page
|
335
|
+
else
|
336
|
+
break
|
337
|
+
end
|
338
|
+
end
|
339
|
+
all_reviews
|
329
340
|
end
|
330
341
|
|
331
342
|
#####################################################
|
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.28.
|
4
|
+
version: 2.28.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Felix Krause
|
@@ -15,7 +15,7 @@ authors:
|
|
15
15
|
autorequire:
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
|
-
date: 2017-
|
18
|
+
date: 2017-05-03 00:00:00.000000000 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: slack-notifier
|
@@ -1285,6 +1285,7 @@ files:
|
|
1285
1285
|
- spaceship/lib/spaceship/portal/website_push.rb
|
1286
1286
|
- spaceship/lib/spaceship/spaceauth_runner.rb
|
1287
1287
|
- spaceship/lib/spaceship/test_flight.rb
|
1288
|
+
- spaceship/lib/spaceship/test_flight/app_test_info.rb
|
1288
1289
|
- spaceship/lib/spaceship/test_flight/base.rb
|
1289
1290
|
- spaceship/lib/spaceship/test_flight/beta_review_info.rb
|
1290
1291
|
- spaceship/lib/spaceship/test_flight/build.rb
|