fastlane 2.28.7 → 2.28.8
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/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
|