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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d83ba3a1a5cbf46c20a7345ee9338d7edf820eb0
4
- data.tar.gz: 06bf105a4da2b924ad8984bc23185d12241ec37a
3
+ metadata.gz: 29a3514e4db5119fe553985626131a7f6a12e171
4
+ data.tar.gz: 2df13870e6ee1050f49376bc6150cf27b4fb2945
5
5
  SHA512:
6
- metadata.gz: 484b90412dd54a95dc2c9c177bec13c1e04a57fa42d8b66717d8f264a161a6b7a448413a8c8191386274258b2508c85d2dfc893ee07f31eba0cbb39b6fd586f6
7
- data.tar.gz: 6dd3407bf129dc2269848af33f1f67b3a380c5dc3b486840085a4c825990a3672bfba37e78868ef748dd76d88630b2f1bf33382a71087f01d339a2c3bdbf9c0c
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, macOS, and Android apps
51
+ :computer: | Support for iOS and Android apps
52
52
  :octocat: | Full Git and Mercurial support
53
53
 
54
54
  <hr />
@@ -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, macOS and Android apps
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, please follow the [fastlane guide](https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Guide.md) or [documentation](https://github.com/fastlane/fastlane/tree/master/fastlane/docs).
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
 
@@ -166,7 +166,7 @@ module Fastlane
166
166
  end
167
167
 
168
168
  def self.is_supported?(platform)
169
- platform == :ios
169
+ [:ios, :appletvos].include?(platform)
170
170
  end
171
171
 
172
172
  def self.example_code
@@ -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, tvos, mac)",
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', 'tvos', 'mac']
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
- platform == :ios
153
+ [:ios, :appletvos].include?(platform)
154
154
  end
155
155
 
156
156
  def self.example_code
@@ -1,4 +1,4 @@
1
1
  module Fastlane
2
- VERSION = '2.28.7'.freeze
2
+ VERSION = '2.28.8'.freeze
3
3
  DESCRIPTION = "The easiest way to automate beta deployments and releases for your iOS and Android apps".freeze
4
4
  end
@@ -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
- # xcode might hang here and retrying fixes the problem, see fastlane#4059
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] = schemes.first if is_workspace
342
+ options[:scheme] ||= schemes.first if is_workspace
336
343
  build_settings(key: key, optional: optional)
337
344
  end
338
345
 
@@ -20,6 +20,8 @@ module FastlaneCore
20
20
  "#{format_string(datetime, severity)}#{msg}\n"
21
21
  end
22
22
 
23
+ require 'fastlane_core/ui/disable_colors' if FastlaneCore::Helper.colors_disabled?
24
+
23
25
  @log
24
26
  end
25
27
 
@@ -22,5 +22,3 @@ require 'fastlane_core/ui/interface'
22
22
  Dir[File.expand_path('implementations/*.rb', File.dirname(__FILE__))].each do |file|
23
23
  require file
24
24
  end
25
-
26
- require 'fastlane_core/ui/disable_colors' if FastlaneCore::Helper.colors_disabled?
@@ -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"
@@ -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
- build.update_build_information!(whats_new: options[:changelog], description: options[:beta_app_description], feedback_email: options[:beta_app_feedback_email])
56
- UI.success "Successfully set the changelog and/or description for build"
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 > 0 or options[:beta_app_description].to_s.length > 0 or options[:beta_app_feedback_email].to_s.length > 0
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)
@@ -1,6 +1,7 @@
1
1
 
2
2
  require 'spaceship/test_flight/client'
3
3
  require 'spaceship/test_flight/base'
4
+ require 'spaceship/test_flight/app_test_info'
4
5
  require 'spaceship/test_flight/build'
5
6
  require 'spaceship/test_flight/build_trains'
6
7
  require 'spaceship/test_flight/beta_review_info'
@@ -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 TestInfo
159
+ # @!group AppTestInfo
160
160
  ##
161
161
 
162
- def put_testinfo(app_id: nil, testinfo: nil)
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 = testinfo.to_json
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 raw hashes representing user reviews for the given store front (and optional versionId)
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
- # REMOVED_FROM_SALE = "Removed From Sale"
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: { value: value[:description] },
115
- name: { value: value[:name] },
116
- localeCode: language.to_s
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, details: { value: versions_array } }])
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: interval[:tier],
129
- priceTierEffectiveDate: interval[:begin_date],
130
- priceTierEndDate: interval[:end_date],
131
- country: interval[:country] || "WW",
132
- grandfathered: interval[: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: { value: value[:subscription_name] },
47
- name: { value: value[:name] },
48
- localeCode: { value: language_code.to_s }
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: versions_array })
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
- r = request(:get, "ra/apps/#{app_id}/reviews?platform=#{platform}&storefront=#{storefront}&versionId=#{versionId}")
328
- parse_response(r, 'data')['reviews']
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.7
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-04-29 00:00:00.000000000 Z
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