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 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