fastlane 2.139.0 → 2.140.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +60 -60
  3. data/fastlane/lib/fastlane/action.rb +1 -1
  4. data/fastlane/lib/fastlane/actions/.hockey.rb.swp +0 -0
  5. data/fastlane/lib/fastlane/actions/.slack.rb.swp +0 -0
  6. data/fastlane/lib/fastlane/actions/.update_project_provisioning.rb.swp +0 -0
  7. data/fastlane/lib/fastlane/actions/gradle.rb +43 -2
  8. data/fastlane/lib/fastlane/actions/run_tests.rb +5 -22
  9. data/fastlane/lib/fastlane/runner.rb +23 -18
  10. data/fastlane/lib/fastlane/version.rb +1 -1
  11. data/fastlane/swift/Deliverfile.swift +1 -1
  12. data/fastlane/swift/Fastlane.swift +25 -7
  13. data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/xcuserdata/josh.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  14. data/fastlane/swift/Gymfile.swift +1 -1
  15. data/fastlane/swift/Matchfile.swift +1 -1
  16. data/fastlane/swift/Precheckfile.swift +1 -1
  17. data/fastlane/swift/Scanfile.swift +1 -1
  18. data/fastlane/swift/ScanfileProtocol.swift +9 -1
  19. data/fastlane/swift/Screengrabfile.swift +1 -1
  20. data/fastlane/swift/Snapshotfile.swift +1 -1
  21. data/{gym/lib/gym/.runner.rb.swp → fastlane_core/lib/fastlane_core/.build_watcher.rb.swp} +0 -0
  22. data/gym/lib/gym/runner.rb +30 -16
  23. data/pilot/lib/pilot/.manager.rb.swp +0 -0
  24. data/pilot/lib/pilot/build_manager.rb +15 -6
  25. data/scan/lib/scan/detect_values.rb +6 -1
  26. data/scan/lib/scan/manager.rb +18 -1
  27. data/scan/lib/scan/options.rb +12 -0
  28. data/scan/lib/scan/slack_poster.rb +1 -1
  29. data/scan/lib/scan/test_command_generator.rb +1 -1
  30. data/spaceship/lib/spaceship/connect_api/.DS_Store +0 -0
  31. data/spaceship/lib/spaceship/portal/.certificate.rb.swp +0 -0
  32. data/spaceship/lib/spaceship/tunes/iap.rb +11 -11
  33. data/spaceship/lib/spaceship/tunes/iap_detail.rb +7 -3
  34. data/spaceship/lib/spaceship/tunes/iap_families.rb +12 -1
  35. data/spaceship/lib/spaceship/tunes/iap_family_details.rb +26 -17
  36. data/spaceship/lib/spaceship/tunes/tunes_client.rb +2 -2
  37. metadata +37 -16
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6343d2b679ea90f71fecb7ec7370099d26928e9faad24ada6f90e26981355917
4
- data.tar.gz: 5b639baeaefd235be5b426d846686d75642a2976d06b82079b430c6e797f6d09
3
+ metadata.gz: 8475d80e9f0452ef7ac3c90a50b82dc52b110235819d0d422783984a5a2e3241
4
+ data.tar.gz: ccfd6ed3734d272250f69816ca5fa408af1102e83336f5e50d8a818ee81e569f
5
5
  SHA512:
6
- metadata.gz: 3eb845566c5e3be2587016bf243de91fd0df7b6dca844146c75b593b4cfec3d15dd852c5308ace7077d27cb43319e5392f9341b6fc8f76d008954b3f74dcc04c
7
- data.tar.gz: 7d90e46a1c4b96851c53a496e1aeabf08235d24b031d8bc9d7cb14c187680e088a1bd93f6b096025123797ca3843b02a55f56ae560d5f17ce460fb3b8ad588f3
6
+ metadata.gz: 723bba1783d4fcc2f466010f29d2becae0384549ba9593113cf543bc4642e485c25fa7be07a825d75102d14d0e058819ddb2af52ed026bc425f693310ca9d7e3
7
+ data.tar.gz: 6ffd0b1013c0b31e2ce53789bc855f2a09809bdb8bbb1294f05be06bd356ce390e7b51a77fc61c1cd123b921a3af0ea65d8d36df471a0a72306e454eeb2e041b
data/README.md CHANGED
@@ -40,23 +40,11 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
40
40
  </a>
41
41
  <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
42
42
  </td>
43
- <td id='manu-wallner'>
44
- <a href='https://github.com/milch'>
45
- <img src='https://github.com/milch.png?size=140'>
46
- </a>
47
- <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
48
- </td>
49
- <td id='josh-holtz'>
50
- <a href='https://github.com/joshdholtz'>
51
- <img src='https://github.com/joshdholtz.png?size=140'>
52
- </a>
53
- <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
54
- </td>
55
- <td id='helmut-januschka'>
56
- <a href='https://github.com/hjanuschka'>
57
- <img src='https://github.com/hjanuschka.png?size=140'>
43
+ <td id='stefan-natchev'>
44
+ <a href='https://github.com/snatchev'>
45
+ <img src='https://github.com/snatchev.png?size=140'>
58
46
  </a>
59
- <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
47
+ <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
60
48
  </td>
61
49
  <td id='jorge-revuelta-h'>
62
50
  <a href='https://github.com/minuscorp'>
@@ -64,19 +52,11 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
64
52
  </a>
65
53
  <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
66
54
  </td>
67
- </tr>
68
- <tr>
69
- <td id='iulian-onofrei'>
70
- <a href='https://github.com/revolter'>
71
- <img src='https://github.com/revolter.png?size=140'>
72
- </a>
73
- <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
74
- </td>
75
- <td id='jimmy-dee'>
76
- <a href='https://github.com/jdee'>
77
- <img src='https://github.com/jdee.png?size=140'>
55
+ <td id='maksym-grebenets'>
56
+ <a href='https://github.com/mgrebenets'>
57
+ <img src='https://github.com/mgrebenets.png?size=140'>
78
58
  </a>
79
- <h4 align='center'>Jimmy Dee</h4>
59
+ <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
80
60
  </td>
81
61
  <td id='jérôme-lacoste'>
82
62
  <a href='https://github.com/lacostej'>
@@ -84,25 +64,13 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
84
64
  </a>
85
65
  <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
86
66
  </td>
87
- <td id='matthew-ellis'>
88
- <a href='https://github.com/matthewellis'>
89
- <img src='https://github.com/matthewellis.png?size=140'>
90
- </a>
91
- <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
92
- </td>
93
- <td id='joshua-liebowitz'>
94
- <a href='https://github.com/taquitos'>
95
- <img src='https://github.com/taquitos.png?size=140'>
96
- </a>
97
- <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
98
- </td>
99
67
  </tr>
100
68
  <tr>
101
- <td id='maksym-grebenets'>
102
- <a href='https://github.com/mgrebenets'>
103
- <img src='https://github.com/mgrebenets.png?size=140'>
69
+ <td id='josh-holtz'>
70
+ <a href='https://github.com/joshdholtz'>
71
+ <img src='https://github.com/joshdholtz.png?size=140'>
104
72
  </a>
105
- <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
73
+ <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
106
74
  </td>
107
75
  <td id='felix-krause'>
108
76
  <a href='https://github.com/KrauseFx'>
@@ -116,37 +84,75 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
116
84
  </a>
117
85
  <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
118
86
  </td>
87
+ <td id='helmut-januschka'>
88
+ <a href='https://github.com/hjanuschka'>
89
+ <img src='https://github.com/hjanuschka.png?size=140'>
90
+ </a>
91
+ <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
92
+ </td>
93
+ <td id='matthew-ellis'>
94
+ <a href='https://github.com/matthewellis'>
95
+ <img src='https://github.com/matthewellis.png?size=140'>
96
+ </a>
97
+ <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
98
+ </td>
99
+ </tr>
100
+ <tr>
101
+ <td id='andrew-mcburney'>
102
+ <a href='https://github.com/armcburney'>
103
+ <img src='https://github.com/armcburney.png?size=140'>
104
+ </a>
105
+ <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
106
+ </td>
119
107
  <td id='kohki-miki'>
120
108
  <a href='https://github.com/giginet'>
121
109
  <img src='https://github.com/giginet.png?size=140'>
122
110
  </a>
123
111
  <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
124
112
  </td>
125
- <td id='stefan-natchev'>
126
- <a href='https://github.com/snatchev'>
127
- <img src='https://github.com/snatchev.png?size=140'>
113
+ <td id='jimmy-dee'>
114
+ <a href='https://github.com/jdee'>
115
+ <img src='https://github.com/jdee.png?size=140'>
128
116
  </a>
129
- <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
117
+ <h4 align='center'>Jimmy Dee</h4>
118
+ </td>
119
+ <td id='aaron-brager'>
120
+ <a href='https://github.com/getaaron'>
121
+ <img src='https://github.com/getaaron.png?size=140'>
122
+ </a>
123
+ <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
130
124
  </td>
131
- </tr>
132
- <tr>
133
125
  <td id='fumiya-nakamura'>
134
126
  <a href='https://github.com/nafu'>
135
127
  <img src='https://github.com/nafu.png?size=140'>
136
128
  </a>
137
129
  <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
138
130
  </td>
131
+ </tr>
132
+ <tr>
133
+ <td id='joshua-liebowitz'>
134
+ <a href='https://github.com/taquitos'>
135
+ <img src='https://github.com/taquitos.png?size=140'>
136
+ </a>
137
+ <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
138
+ </td>
139
+ <td id='iulian-onofrei'>
140
+ <a href='https://github.com/revolter'>
141
+ <img src='https://github.com/revolter.png?size=140'>
142
+ </a>
143
+ <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
144
+ </td>
139
145
  <td id='danielle-tomlinson'>
140
146
  <a href='https://github.com/endocrimes'>
141
147
  <img src='https://github.com/endocrimes.png?size=140'>
142
148
  </a>
143
149
  <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
144
150
  </td>
145
- <td id='aaron-brager'>
146
- <a href='https://github.com/getaaron'>
147
- <img src='https://github.com/getaaron.png?size=140'>
151
+ <td id='manu-wallner'>
152
+ <a href='https://github.com/milch'>
153
+ <img src='https://github.com/milch.png?size=140'>
148
154
  </a>
149
- <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
155
+ <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
150
156
  </td>
151
157
  <td id='luka-mirosevic'>
152
158
  <a href='https://github.com/lmirosevic'>
@@ -154,12 +160,6 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
154
160
  </a>
155
161
  <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
156
162
  </td>
157
- <td id='andrew-mcburney'>
158
- <a href='https://github.com/armcburney'>
159
- <img src='https://github.com/armcburney.png?size=140'>
160
- </a>
161
- <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
162
- </td>
163
163
  </tr>
164
164
  </table>
165
165
 
@@ -110,7 +110,7 @@ module Fastlane
110
110
 
111
111
  # Is printed out in the Steps: output in the terminal
112
112
  # Return nil if you don't want any logging in the terminal/JUnit Report
113
- def self.step_text
113
+ def self.step_text(params)
114
114
  self.action_name
115
115
  end
116
116
 
@@ -17,12 +17,16 @@ module Fastlane
17
17
  end
18
18
 
19
19
  class GradleAction < Action
20
+ # rubocop:disable Metrics/PerceivedComplexity
20
21
  def self.run(params)
21
22
  task = params[:task]
22
23
  flavor = params[:flavor]
23
24
  build_type = params[:build_type]
25
+ tasks = params[:tasks]
24
26
 
25
- gradle_task = [task, flavor, build_type].join
27
+ gradle_task = gradle_task(task, flavor, build_type, tasks)
28
+
29
+ UI.user_error!('Please pass a gradle task or tasks') if gradle_task.empty?
26
30
 
27
31
  project_dir = params[:project_dir]
28
32
 
@@ -101,6 +105,28 @@ module Fastlane
101
105
 
102
106
  return result
103
107
  end
108
+ # rubocop:enable Metrics/PerceivedComplexity
109
+
110
+ def self.gradle_task(task, flavor, build_type, tasks)
111
+ gradle_task = [task, flavor, build_type].join
112
+
113
+ if gradle_task.empty? && !tasks.nil?
114
+ gradle_task = tasks.join(' ')
115
+ end
116
+
117
+ gradle_task
118
+ end
119
+
120
+ def self.step_text(params)
121
+ task = params[:task]
122
+ flavor = params[:flavor]
123
+ build_type = params[:build_type]
124
+ tasks = params[:tasks]
125
+
126
+ gradle_task = gradle_task(task, flavor, build_type, tasks)
127
+
128
+ return gradle_task
129
+ end
104
130
 
105
131
  #####################################################
106
132
  # @!group Documentation
@@ -119,7 +145,8 @@ module Fastlane
119
145
  FastlaneCore::ConfigItem.new(key: :task,
120
146
  env_name: 'FL_GRADLE_TASK',
121
147
  description: 'The gradle task you want to execute, e.g. `assemble`, `bundle` or `test`. For tasks such as `assembleMyFlavorRelease` you should use gradle(task: \'assemble\', flavor: \'Myflavor\', build_type: \'Release\')',
122
- optional: false,
148
+ conflicting_options: [:tasks],
149
+ optional: true,
123
150
  is_string: true),
124
151
  FastlaneCore::ConfigItem.new(key: :flavor,
125
152
  env_name: 'FL_GRADLE_FLAVOR',
@@ -131,6 +158,13 @@ module Fastlane
131
158
  description: 'The build type that you want the task for, e.g. `Release`. Useful for some tasks such as `assemble`',
132
159
  optional: true,
133
160
  is_string: true),
161
+ FastlaneCore::ConfigItem.new(key: :tasks,
162
+ type: Array,
163
+ env_name: 'FL_GRADLE_TASKS',
164
+ description: 'The multiple gradle tasks that you want to execute, e.g. `[assembleDebug, bundleDebug]`',
165
+ conflicting_options: [:task],
166
+ optional: true,
167
+ is_string: false),
134
168
  FastlaneCore::ConfigItem.new(key: :flags,
135
169
  env_name: 'FL_GRADLE_FLAGS',
136
170
  description: 'All parameter flags you want to pass to the gradle command, e.g. `--exitcode --xml file.xml`',
@@ -219,6 +253,13 @@ module Fastlane
219
253
  )
220
254
  ```
221
255
 
256
+ You can pass multiple gradle tasks:
257
+ ```ruby
258
+ gradle(
259
+ tasks: ["assembleDebug", "bundleDebug"]
260
+ )
261
+ ```
262
+
222
263
  You can pass properties to gradle:
223
264
  ```ruby
224
265
  gradle(
@@ -10,17 +10,10 @@ module Fastlane
10
10
  class RunTestsAction < Action
11
11
  def self.run(values)
12
12
  require 'scan'
13
- plist_files_before = []
13
+ manager = Scan::Manager.new
14
14
 
15
15
  begin
16
- destination = values[:destination] # save destination value which can be later overridden
17
- Scan.config = values # we set this here to auto-detect missing values, which we need later on
18
- unless values[:derived_data_path].to_s.empty?
19
- plist_files_before = test_summary_filenames(values[:derived_data_path])
20
- end
21
-
22
- values[:destination] = destination # restore destination value
23
- Scan::Manager.new.work(values)
16
+ manager.work(values)
24
17
 
25
18
  zip_build_products_path = Scan.cache[:zip_build_products_path]
26
19
  Actions.lane_context[SharedValues::SCAN_ZIP_BUILD_PRODUCTS_PATH] = zip_build_products_path if zip_build_products_path
@@ -37,8 +30,10 @@ module Fastlane
37
30
  end
38
31
  ensure
39
32
  unless values[:derived_data_path].to_s.empty?
33
+ plist_files_before = manager.plist_files_before || []
34
+
40
35
  Actions.lane_context[SharedValues::SCAN_DERIVED_DATA_PATH] = values[:derived_data_path]
41
- plist_files_after = test_summary_filenames(values[:derived_data_path])
36
+ plist_files_after = manager.test_summary_filenames(values[:derived_data_path])
42
37
  all_test_summaries = (plist_files_after - plist_files_before)
43
38
  Actions.lane_context[SharedValues::SCAN_GENERATED_PLIST_FILES] = all_test_summaries
44
39
  Actions.lane_context[SharedValues::SCAN_GENERATED_PLIST_FILE] = all_test_summaries.last
@@ -85,18 +80,6 @@ module Fastlane
85
80
 
86
81
  private_class_method
87
82
 
88
- def self.test_summary_filenames(derived_data_path)
89
- files = []
90
-
91
- # Xcode < 10
92
- files += Dir["#{derived_data_path}/**/Logs/Test/*TestSummaries.plist"]
93
-
94
- # Xcode 10
95
- files += Dir["#{derived_data_path}/**/Logs/Test/*.xcresult/TestSummaries.plist"]
96
-
97
- return files
98
- end
99
-
100
83
  def self.example_code
101
84
  [
102
85
  'run_tests',
@@ -225,27 +225,32 @@ module Fastlane
225
225
 
226
226
  begin
227
227
  Dir.chdir(custom_dir) do # go up from the fastlane folder, to the project folder
228
- # If another action is calling this action, we shouldn't show it in the summary
228
+ # Removing step_name before its parsed into configurations
229
+ args = arguments.kind_of?(Array) && arguments.first.kind_of?(Hash) ? arguments.first : {}
230
+ step_name = args.delete(:step_name)
231
+
232
+ # arguments is an array by default, containing an hash with the actual parameters
233
+ # Since we usually just need the passed hash, we'll just use the first object if there is only one
234
+ if arguments.count == 0
235
+ configurations = ConfigurationHelper.parse(class_ref, {}) # no parameters => empty hash
236
+ elsif arguments.count == 1 && arguments.first.kind_of?(Hash)
237
+ configurations = ConfigurationHelper.parse(class_ref, arguments.first) # Correct configuration passed
238
+ elsif !class_ref.available_options
239
+ # This action does not use the new action format
240
+ # Just passing the arguments to this method
241
+ configurations = arguments
242
+ else
243
+ UI.user_error!("You have to call the integration like `#{method_sym}(key: \"value\")`. Run `fastlane action #{method_sym}` for all available keys. Please check out the current documentation on GitHub.")
244
+ end
229
245
 
246
+ # If another action is calling this action, we shouldn't show it in the summary
247
+ # A nil value for action_name will hide it from the summary
230
248
  unless from_action
231
- args = arguments.kind_of?(Array) && arguments.first.kind_of?(Hash) ? arguments.first : {}
232
- action_name = args[:step_name] || class_ref.step_text
233
- args.delete(:step_name)
249
+ action_name = step_name
250
+ action_name ||= class_ref.method(:step_text).arity == 1 ? class_ref.step_text(configurations) : class_ref.step_text
234
251
  end
235
- Actions.execute_action(action_name) do
236
- # arguments is an array by default, containing an hash with the actual parameters
237
- # Since we usually just need the passed hash, we'll just use the first object if there is only one
238
- if arguments.count == 0
239
- arguments = ConfigurationHelper.parse(class_ref, {}) # no parameters => empty hash
240
- elsif arguments.count == 1 && arguments.first.kind_of?(Hash)
241
- arguments = ConfigurationHelper.parse(class_ref, arguments.first) # Correct configuration passed
242
- elsif !class_ref.available_options
243
- # This action does not use the new action format
244
- # Just passing the arguments to this method
245
- else
246
- UI.user_error!("You have to call the integration like `#{method_sym}(key: \"value\")`. Run `fastlane action #{method_sym}` for all available keys. Please check out the current documentation on GitHub.")
247
- end
248
252
 
253
+ Actions.execute_action(action_name) do
249
254
  if Fastlane::Actions.is_deprecated?(class_ref)
250
255
  puts("==========================================".deprecated)
251
256
  puts("This action (#{method_sym}) is deprecated".deprecated)
@@ -253,7 +258,7 @@ module Fastlane
253
258
  puts("==========================================\n".deprecated)
254
259
  end
255
260
  class_ref.runner = self # needed to call another action from an action
256
- return class_ref.run(arguments)
261
+ return class_ref.run(configurations)
257
262
  end
258
263
  end
259
264
  rescue Interrupt => e
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
- VERSION = '2.139.0'.freeze
2
+ VERSION = '2.140.0'.freeze
3
3
  DESCRIPTION = "The easiest way to automate beta deployments and releases for your iOS and Android apps".freeze
4
4
  MINIMUM_XCODE_RELEASE = "7.0".freeze
5
5
  RUBOCOP_REQUIREMENT = '0.49.1'.freeze
@@ -18,4 +18,4 @@ class Deliverfile: DeliverfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.139.0
21
+ // Generated with fastlane 2.140.0
@@ -829,6 +829,7 @@ func buildAndUploadToAppetize(xcodebuild: [String : Any] = [:],
829
829
  - task: The gradle task you want to execute, e.g. `assemble`, `bundle` or `test`. For tasks such as `assembleMyFlavorRelease` you should use gradle(task: 'assemble', flavor: 'Myflavor', build_type: 'Release')
830
830
  - flavor: The flavor that you want the task for, e.g. `MyFlavor`. If you are running the `assemble` task in a multi-flavor project, and you rely on Actions.lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH] then you must specify a flavor here or else this value will be undefined
831
831
  - buildType: The build type that you want the task for, e.g. `Release`. Useful for some tasks such as `assemble`
832
+ - tasks: The multiple gradle tasks that you want to execute, e.g. `[assembleDebug, bundleDebug]`
832
833
  - flags: All parameter flags you want to pass to the gradle command, e.g. `--exitcode --xml file.xml`
833
834
  - projectDir: The root directory of the gradle project
834
835
  - gradlePath: The path to your `gradlew`. If you specify a relative path, it is assumed to be relative to the `project_dir`
@@ -842,9 +843,10 @@ func buildAndUploadToAppetize(xcodebuild: [String : Any] = [:],
842
843
 
843
844
  Run `./gradlew tasks` to get a list of all available gradle tasks for your project
844
845
  */
845
- func buildAndroidApp(task: String,
846
+ func buildAndroidApp(task: String? = nil,
846
847
  flavor: String? = nil,
847
848
  buildType: String? = nil,
849
+ tasks: [String]? = nil,
848
850
  flags: String? = nil,
849
851
  projectDir: String = ".",
850
852
  gradlePath: String? = nil,
@@ -856,6 +858,7 @@ func buildAndroidApp(task: String,
856
858
  let command = RubyCommand(commandID: "", methodName: "build_android_app", className: nil, args: [RubyCommand.Argument(name: "task", value: task),
857
859
  RubyCommand.Argument(name: "flavor", value: flavor),
858
860
  RubyCommand.Argument(name: "build_type", value: buildType),
861
+ RubyCommand.Argument(name: "tasks", value: tasks),
859
862
  RubyCommand.Argument(name: "flags", value: flags),
860
863
  RubyCommand.Argument(name: "project_dir", value: projectDir),
861
864
  RubyCommand.Argument(name: "gradle_path", value: gradlePath),
@@ -2583,7 +2586,7 @@ func downloadDsyms(username: String,
2583
2586
  func downloadFromPlayStore(packageName: String,
2584
2587
  versionName: String? = nil,
2585
2588
  track: String = "production",
2586
- metadataPath: String? = nil,
2589
+ metadataPath: String = "./metadata",
2587
2590
  key: String? = nil,
2588
2591
  issuer: String? = nil,
2589
2592
  jsonKey: String? = nil,
@@ -3425,6 +3428,7 @@ func googlePlayTrackVersionCodes(packageName: String,
3425
3428
  - task: The gradle task you want to execute, e.g. `assemble`, `bundle` or `test`. For tasks such as `assembleMyFlavorRelease` you should use gradle(task: 'assemble', flavor: 'Myflavor', build_type: 'Release')
3426
3429
  - flavor: The flavor that you want the task for, e.g. `MyFlavor`. If you are running the `assemble` task in a multi-flavor project, and you rely on Actions.lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH] then you must specify a flavor here or else this value will be undefined
3427
3430
  - buildType: The build type that you want the task for, e.g. `Release`. Useful for some tasks such as `assemble`
3431
+ - tasks: The multiple gradle tasks that you want to execute, e.g. `[assembleDebug, bundleDebug]`
3428
3432
  - flags: All parameter flags you want to pass to the gradle command, e.g. `--exitcode --xml file.xml`
3429
3433
  - projectDir: The root directory of the gradle project
3430
3434
  - gradlePath: The path to your `gradlew`. If you specify a relative path, it is assumed to be relative to the `project_dir`
@@ -3438,9 +3442,10 @@ func googlePlayTrackVersionCodes(packageName: String,
3438
3442
 
3439
3443
  Run `./gradlew tasks` to get a list of all available gradle tasks for your project
3440
3444
  */
3441
- func gradle(task: String,
3445
+ func gradle(task: String? = nil,
3442
3446
  flavor: String? = nil,
3443
3447
  buildType: String? = nil,
3448
+ tasks: [String]? = nil,
3444
3449
  flags: String? = nil,
3445
3450
  projectDir: String = ".",
3446
3451
  gradlePath: String? = nil,
@@ -3452,6 +3457,7 @@ func gradle(task: String,
3452
3457
  let command = RubyCommand(commandID: "", methodName: "gradle", className: nil, args: [RubyCommand.Argument(name: "task", value: task),
3453
3458
  RubyCommand.Argument(name: "flavor", value: flavor),
3454
3459
  RubyCommand.Argument(name: "build_type", value: buildType),
3460
+ RubyCommand.Argument(name: "tasks", value: tasks),
3455
3461
  RubyCommand.Argument(name: "flags", value: flags),
3456
3462
  RubyCommand.Argument(name: "project_dir", value: projectDir),
3457
3463
  RubyCommand.Argument(name: "gradle_path", value: gradlePath),
@@ -5398,6 +5404,8 @@ func rubyVersion() {
5398
5404
  - configuration: The configuration to use when building the app. Defaults to 'Release'
5399
5405
  - xcargs: Pass additional arguments to xcodebuild. Be sure to quote the setting names and values e.g. OTHER_LDFLAGS="-ObjC -lstdc++"
5400
5406
  - xcconfig: Use an extra XCCONFIG file to build your app
5407
+ - appName: App name to use in slack message and logfile name
5408
+ - deploymentTargetVersion: Target version of the app being build or tested. Used to filter out simulator version
5401
5409
  - slackUrl: Create an Incoming WebHook for your Slack group to post results there
5402
5410
  - slackChannel: #channel or @username
5403
5411
  - slackMessage: The message included with each message posted to slack
@@ -5456,6 +5464,8 @@ func runTests(workspace: String? = nil,
5456
5464
  configuration: String? = nil,
5457
5465
  xcargs: String? = nil,
5458
5466
  xcconfig: String? = nil,
5467
+ appName: String? = nil,
5468
+ deploymentTargetVersion: String? = nil,
5459
5469
  slackUrl: String? = nil,
5460
5470
  slackChannel: String? = nil,
5461
5471
  slackMessage: String? = nil,
@@ -5511,6 +5521,8 @@ func runTests(workspace: String? = nil,
5511
5521
  RubyCommand.Argument(name: "configuration", value: configuration),
5512
5522
  RubyCommand.Argument(name: "xcargs", value: xcargs),
5513
5523
  RubyCommand.Argument(name: "xcconfig", value: xcconfig),
5524
+ RubyCommand.Argument(name: "app_name", value: appName),
5525
+ RubyCommand.Argument(name: "deployment_target_version", value: deploymentTargetVersion),
5514
5526
  RubyCommand.Argument(name: "slack_url", value: slackUrl),
5515
5527
  RubyCommand.Argument(name: "slack_channel", value: slackChannel),
5516
5528
  RubyCommand.Argument(name: "slack_message", value: slackMessage),
@@ -5647,6 +5659,8 @@ func say(text: Any,
5647
5659
  - configuration: The configuration to use when building the app. Defaults to 'Release'
5648
5660
  - xcargs: Pass additional arguments to xcodebuild. Be sure to quote the setting names and values e.g. OTHER_LDFLAGS="-ObjC -lstdc++"
5649
5661
  - xcconfig: Use an extra XCCONFIG file to build your app
5662
+ - appName: App name to use in slack message and logfile name
5663
+ - deploymentTargetVersion: Target version of the app being build or tested. Used to filter out simulator version
5650
5664
  - slackUrl: Create an Incoming WebHook for your Slack group to post results there
5651
5665
  - slackChannel: #channel or @username
5652
5666
  - slackMessage: The message included with each message posted to slack
@@ -5705,6 +5719,8 @@ func scan(workspace: Any? = scanfile.workspace,
5705
5719
  configuration: Any? = scanfile.configuration,
5706
5720
  xcargs: Any? = scanfile.xcargs,
5707
5721
  xcconfig: Any? = scanfile.xcconfig,
5722
+ appName: Any? = scanfile.appName,
5723
+ deploymentTargetVersion: Any? = scanfile.deploymentTargetVersion,
5708
5724
  slackUrl: Any? = scanfile.slackUrl,
5709
5725
  slackChannel: Any? = scanfile.slackChannel,
5710
5726
  slackMessage: Any? = scanfile.slackMessage,
@@ -5760,6 +5776,8 @@ func scan(workspace: Any? = scanfile.workspace,
5760
5776
  RubyCommand.Argument(name: "configuration", value: configuration),
5761
5777
  RubyCommand.Argument(name: "xcargs", value: xcargs),
5762
5778
  RubyCommand.Argument(name: "xcconfig", value: xcconfig),
5779
+ RubyCommand.Argument(name: "app_name", value: appName),
5780
+ RubyCommand.Argument(name: "deployment_target_version", value: deploymentTargetVersion),
5763
5781
  RubyCommand.Argument(name: "slack_url", value: slackUrl),
5764
5782
  RubyCommand.Argument(name: "slack_channel", value: slackChannel),
5765
5783
  RubyCommand.Argument(name: "slack_message", value: slackMessage),
@@ -6738,7 +6756,7 @@ func supply(packageName: String,
6738
6756
  releaseStatus: String = "completed",
6739
6757
  track: String = "production",
6740
6758
  rollout: String? = nil,
6741
- metadataPath: String? = nil,
6759
+ metadataPath: String = "./metadata",
6742
6760
  key: String? = nil,
6743
6761
  issuer: String? = nil,
6744
6762
  jsonKey: String? = nil,
@@ -7766,7 +7784,7 @@ func uploadToPlayStore(packageName: String,
7766
7784
  releaseStatus: String = "completed",
7767
7785
  track: String = "production",
7768
7786
  rollout: String? = nil,
7769
- metadataPath: String? = nil,
7787
+ metadataPath: String = "./metadata",
7770
7788
  key: String? = nil,
7771
7789
  issuer: String? = nil,
7772
7790
  jsonKey: String? = nil,
@@ -8265,7 +8283,7 @@ func xcov(workspace: String? = nil,
8265
8283
  coverallsServiceJobId: String? = nil,
8266
8284
  coverallsRepoToken: String? = nil,
8267
8285
  xcconfig: String? = nil,
8268
- ideFoundationPath: String = "/Applications/Xcode-11.3.app/Contents/Developer/../Frameworks/IDEFoundation.framework/Versions/A/IDEFoundation",
8286
+ ideFoundationPath: String = "/Applications/Xcode-11.2.1.app/Contents/Developer/../Frameworks/IDEFoundation.framework/Versions/A/IDEFoundation",
8269
8287
  legacySupport: Bool = false) {
8270
8288
  let command = RubyCommand(commandID: "", methodName: "xcov", className: nil, args: [RubyCommand.Argument(name: "workspace", value: workspace),
8271
8289
  RubyCommand.Argument(name: "project", value: project),
@@ -8410,4 +8428,4 @@ let snapshotfile: Snapshotfile = Snapshotfile()
8410
8428
 
8411
8429
  // Please don't remove the lines below
8412
8430
  // They are used to detect outdated files
8413
- // FastlaneRunnerAPIVersion [0.9.67]
8431
+ // FastlaneRunnerAPIVersion [0.9.68]
@@ -18,4 +18,4 @@ class Gymfile: GymfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.139.0
21
+ // Generated with fastlane 2.140.0
@@ -18,4 +18,4 @@ class Matchfile: MatchfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.139.0
21
+ // Generated with fastlane 2.140.0
@@ -18,4 +18,4 @@ class Precheckfile: PrecheckfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.139.0
21
+ // Generated with fastlane 2.140.0
@@ -18,4 +18,4 @@ class Scanfile: ScanfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.139.0
21
+ // Generated with fastlane 2.140.0
@@ -129,6 +129,12 @@ protocol ScanfileProtocol: class {
129
129
  /// Use an extra XCCONFIG file to build your app
130
130
  var xcconfig: String? { get }
131
131
 
132
+ /// App name to use in slack message and logfile name
133
+ var appName: String? { get }
134
+
135
+ /// Target version of the app being build or tested. Used to filter out simulator version
136
+ var deploymentTargetVersion: String? { get }
137
+
132
138
  /// Create an Incoming WebHook for your Slack group to post results there
133
139
  var slackUrl: String? { get }
134
140
 
@@ -210,6 +216,8 @@ extension ScanfileProtocol {
210
216
  var configuration: String? { return nil }
211
217
  var xcargs: String? { return nil }
212
218
  var xcconfig: String? { return nil }
219
+ var appName: String? { return nil }
220
+ var deploymentTargetVersion: String? { return nil }
213
221
  var slackUrl: String? { return nil }
214
222
  var slackChannel: String? { return nil }
215
223
  var slackMessage: String? { return nil }
@@ -226,4 +234,4 @@ extension ScanfileProtocol {
226
234
 
227
235
  // Please don't remove the lines below
228
236
  // They are used to detect outdated files
229
- // FastlaneRunnerAPIVersion [0.9.23]
237
+ // FastlaneRunnerAPIVersion [0.9.24]
@@ -18,4 +18,4 @@ class Screengrabfile: ScreengrabfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.139.0
21
+ // Generated with fastlane 2.140.0
@@ -18,4 +18,4 @@ class Snapshotfile: SnapshotfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.139.0
21
+ // Generated with fastlane 2.140.0
@@ -160,31 +160,45 @@ module Gym
160
160
  dwarfdump_command << "dwarfdump"
161
161
  dwarfdump_command << "--uuid #{dsym.shellescape}"
162
162
 
163
+ # Extract uuids
163
164
  dwarfdump_result = Helper.backticks(dwarfdump_command.join(" "), print: false)
164
165
  architecture_infos = dwarfdump_result.split("\n")
165
- architecture_uuids = architecture_infos.map do |info|
166
- info_array = info.split(" ")
166
+ architecture_infos.each do |info|
167
+ info_array = info.split(" ", 4)
167
168
  uuid = info_array[1]
169
+ dwarf_file_path = info_array[3]
168
170
 
169
171
  if uuid.nil? || !uuid.match(uuid_regex)
170
- nil
171
- else
172
- uuid
172
+ next
173
173
  end
174
- end
175
-
176
- architecture_uuids = architecture_uuids.reject(&:nil?)
177
-
178
- symbol_map_paths = architecture_uuids.map do |uuid|
179
- "#{bcsymbolmaps_directory.shellescape}/#{uuid}.bcsymbolmap"
180
- end
181
174
 
182
- symbol_map_paths << bcsymbolmaps_directory.shellescape if symbol_map_paths.empty?
183
-
184
- symbol_map_paths.each do |path|
175
+ # Find bcsymbolmap file to be used:
176
+ # - if a <uuid>.plist file exists, we will extract uuid of bcsymbolmap and use it
177
+ # - if a <uuid>.bcsymbolmap file exists, we will use it
178
+ # - otherwise let dsymutil figure it out
179
+ symbol_map_path = nil
180
+ split_dwarf_file_path = File.split(dwarf_file_path)
181
+ dsym_plist_file_path = File.join(split_dwarf_file_path[0], "..", "#{uuid}.plist")
182
+ if File.exist?(dsym_plist_file_path)
183
+ dsym_plist = Plist.parse_xml(dsym_plist_file_path)
184
+ original_uuid = dsym_plist['DBGOriginalUUID']
185
+ possible_symbol_map_path = "#{bcsymbolmaps_directory}/#{original_uuid}.bcsymbolmap"
186
+ if File.exist?(possible_symbol_map_path)
187
+ symbol_map_path = possible_symbol_map_path.shellescape
188
+ end
189
+ end
190
+ if symbol_map_path.nil?
191
+ possible_symbol_map_path = File.join(bcsymbolmaps_directory, "#{uuid}.bcsymbolmap")
192
+ if File.exist?(possible_symbol_map_path)
193
+ symbol_map_path = possible_symbol_map_path.shellescape
194
+ end
195
+ end
196
+ if symbol_map_path.nil?
197
+ symbol_map_path = bcsymbolmaps_directory.shellescape
198
+ end
185
199
  command = []
186
200
  command << "dsymutil"
187
- command << "--symbol-map #{path}"
201
+ command << "--symbol-map #{symbol_map_path}"
188
202
  command << dsym.shellescape
189
203
  Helper.backticks(command.join(" "), print: !Gym.config[:silent])
190
204
  end
@@ -245,12 +245,21 @@ module Pilot
245
245
  end
246
246
 
247
247
  def self.truncate_changelog(changelog)
248
- max_changelog_length = 4000
249
- if changelog && changelog.length > max_changelog_length
250
- original_length = changelog.length
251
- bottom_message = "..."
252
- changelog = "#{changelog[0...max_changelog_length - bottom_message.length]}#{bottom_message}"
253
- UI.important("Changelog has been truncated since it exceeds Apple's #{max_changelog_length} character limit. It currently contains #{original_length} characters.")
248
+ max_changelog_bytes = 4000
249
+ if changelog
250
+ changelog_bytes = changelog.unpack('C*').length
251
+ if changelog_bytes > max_changelog_bytes
252
+ UI.important("Changelog will be truncated since it exceeds Apple's #{max_changelog_bytes}-byte limit. It currently contains #{changelog_bytes} bytes.")
253
+ new_changelog = ''
254
+ new_changelog_bytes = 0
255
+ max_changelog_bytes -= 3 # Will append '...' later.
256
+ changelog.chars.each do |char|
257
+ new_changelog_bytes += char.unpack('C*').length
258
+ break if new_changelog_bytes >= max_changelog_bytes
259
+ new_changelog += char
260
+ end
261
+ changelog = new_changelog + '...'
262
+ end
254
263
  end
255
264
  changelog
256
265
  end
@@ -108,7 +108,7 @@ module Scan
108
108
  def self.detect_simulator(devices, requested_os_type, deployment_target_key, default_device_name, simulator_type_descriptor)
109
109
  require 'set'
110
110
 
111
- deployment_target_version = Scan.project.build_settings(key: deployment_target_key) || '0'
111
+ deployment_target_version = get_deployment_target_version(deployment_target_key)
112
112
 
113
113
  simulators = filter_simulators(
114
114
  FastlaneCore::DeviceManager.simulators(requested_os_type).tap do |array|
@@ -215,5 +215,10 @@ module Scan
215
215
  Scan.config[:destination] = min_xcode8? ? ["platform=macOS"] : ["platform=OS X"]
216
216
  end
217
217
  end
218
+
219
+ # get deployment target version
220
+ def self.get_deployment_target_version(deployment_target_key)
221
+ Scan.config[:deployment_target_version] || Scan.project.build_settings(key: deployment_target_key) || '0'
222
+ end
218
223
  end
219
224
  end
@@ -4,8 +4,13 @@ require_relative 'runner'
4
4
 
5
5
  module Scan
6
6
  class Manager
7
+ attr_accessor :plist_files_before
8
+
7
9
  def work(options)
8
- Scan.config = options
10
+ Scan.config = options # we set this here to auto-detect missing values, which we need later on
11
+ unless options[:derived_data_path].to_s.empty?
12
+ self.plist_files_before = test_summary_filenames(Scan.config[:derived_data_path])
13
+ end
9
14
 
10
15
  # Also print out the path to the used Xcode installation
11
16
  # We go 2 folders up, to not show "Contents/Developer/"
@@ -17,5 +22,17 @@ module Scan
17
22
 
18
23
  return Runner.new.run
19
24
  end
25
+
26
+ def test_summary_filenames(derived_data_path)
27
+ files = []
28
+
29
+ # Xcode < 10
30
+ files += Dir["#{derived_data_path}/**/Logs/Test/*TestSummaries.plist"]
31
+
32
+ # Xcode 10
33
+ files += Dir["#{derived_data_path}/**/Logs/Test/*.xcresult/TestSummaries.plist"]
34
+
35
+ return files
36
+ end
20
37
  end
21
38
  end
@@ -316,6 +316,18 @@ module Scan
316
316
  UI.user_error!("File not found at path '#{File.expand_path(value)}'") unless File.exist?(value)
317
317
  end),
318
318
 
319
+ # build settings
320
+ FastlaneCore::ConfigItem.new(key: :app_name,
321
+ env_name: "SCAN_APP_NAME",
322
+ optional: true,
323
+ description: "App name to use in slack message and logfile name",
324
+ is_string: true),
325
+ FastlaneCore::ConfigItem.new(key: :deployment_target_version,
326
+ env_name: "SCAN_DEPLOYMENT_TARGET_VERSION",
327
+ optional: true,
328
+ description: "Target version of the app being build or tested. Used to filter out simulator version",
329
+ is_string: true),
330
+
319
331
  # slack
320
332
  FastlaneCore::ConfigItem.new(key: :slack_url,
321
333
  short_option: "-i",
@@ -44,7 +44,7 @@ module Scan
44
44
  end
45
45
 
46
46
  Fastlane::Actions::SlackAction.run({
47
- message: "#{Scan.project.app_name} Tests:\n#{Scan.config[:slack_message]}",
47
+ message: "#{Scan.config[:app_name] || Scan.project.app_name} Tests:\n#{Scan.config[:slack_message]}",
48
48
  channel: channel,
49
49
  slack_url: Scan.config[:slack_url].to_s,
50
50
  success: results[:build_errors].to_i == 0 && results[:failures].to_i == 0,
@@ -120,7 +120,7 @@ module Scan
120
120
 
121
121
  # Store the raw file
122
122
  def xcodebuild_log_path
123
- file_name = "#{Scan.project.app_name}-#{Scan.config[:scheme]}.log"
123
+ file_name = "#{Scan.config[:app_name] || Scan.project.app_name}-#{Scan.config[:scheme]}.log"
124
124
  containing = File.expand_path(Scan.config[:buildlog_path])
125
125
  FileUtils.mkdir_p(containing)
126
126
 
@@ -105,17 +105,6 @@ module Spaceship
105
105
  end
106
106
  end
107
107
 
108
- # find a specific product
109
- # @param product_id (String) Product Id
110
- def find(product_id)
111
- all.each do |product|
112
- if product.product_id == product_id
113
- return product
114
- end
115
- end
116
- return nil
117
- end
118
-
119
108
  # return all available In-App-Purchase's of current app
120
109
  # this is not paged inside iTC-API so if you have a lot if IAP's (2k+)
121
110
  # it might take some time to load, same as it takes when you load the list via App Store Connect
@@ -132,6 +121,17 @@ module Spaceship
132
121
  return_iaps
133
122
  end
134
123
 
124
+ # find a specific product
125
+ # @param product_id (String) Product Id
126
+ def find(product_id)
127
+ all.each do |product|
128
+ if product.product_id == product_id
129
+ return product
130
+ end
131
+ end
132
+ return nil
133
+ end
134
+
135
135
  private
136
136
 
137
137
  def find_product_with_retries(product_id, max_tries)
@@ -80,7 +80,9 @@ module Spaceship
80
80
  language = localized_version["value"]["localeCode"]
81
81
  parsed_versions[language.to_sym] = {
82
82
  name: localized_version["value"]["name"]["value"],
83
- description: localized_version["value"]["description"]["value"]
83
+ description: localized_version["value"]["description"]["value"],
84
+ id: localized_version["value"]["id"],
85
+ status: localized_version["value"]["status"]
84
86
  }
85
87
  end
86
88
  return parsed_versions
@@ -98,7 +100,8 @@ module Spaceship
98
100
  "value" => {
99
101
  "name" => { "value" => current_version[:name] },
100
102
  "description" => { "value" => current_version[:description] },
101
- "localeCode" => language.to_s
103
+ "localeCode" => language.to_s,
104
+ "id" => current_version[:id]
102
105
  }
103
106
  }
104
107
  end
@@ -167,7 +170,8 @@ module Spaceship
167
170
  "value" => {
168
171
  "description" => { "value" => value[:description] },
169
172
  "name" => { "value" => value[:name] },
170
- "localeCode" => language.to_s
173
+ "localeCode" => language.to_s,
174
+ "id" => value[:id]
171
175
  }
172
176
  }
173
177
  end
@@ -40,7 +40,7 @@ module Spaceship
40
40
  client.create_iap_family(app_id: self.application.apple_id, name: name, product_id: product_id, reference_name: reference_name, versions: versions_array)
41
41
  end
42
42
 
43
- # returns a list of all families
43
+ # returns a list of all available subscription groups/families of the current In-App-Purchase
44
44
  def all
45
45
  r = client.iap_families(app_id: self.application.apple_id)
46
46
  return_families = []
@@ -52,6 +52,17 @@ module Spaceship
52
52
  end
53
53
  return_families
54
54
  end
55
+
56
+ # find a specific family
57
+ # @param family_id (String) Family Id
58
+ def find(family_id)
59
+ all.each do |family|
60
+ if family.family_id == family_id
61
+ return family
62
+ end
63
+ end
64
+ return nil
65
+ end
55
66
  end
56
67
  end
57
68
  end
@@ -18,13 +18,34 @@ module Spaceship
18
18
  # @return (Intger) amount of linked in-app purchases of this family (read-only)
19
19
  attr_accessor :iap_count
20
20
 
21
+ # @return (Array) of all in-app purchase family details
22
+ attr_accessor :family_details
23
+
21
24
  attr_mapping({
22
25
  'id' => :family_id,
23
26
  'name.value' => :name,
24
27
  'activeAddOns' => :linked_iaps,
25
- 'totalActiveAddOns' => :iap_count
28
+ 'totalActiveAddOns' => :iap_count,
29
+ 'details.value' => :family_details
26
30
  })
27
31
 
32
+ # @return (Hash) localized names
33
+ def versions
34
+ parsed_versions = {}
35
+ raw_versions = raw_data["details"]["value"]
36
+ raw_versions.each do |version|
37
+ language = version["value"]["localeCode"]["value"]
38
+ parsed_versions[language.to_sym] = {
39
+ subscription_name: version["value"]["subscriptionName"]["value"],
40
+ name: version["value"]["name"]["value"],
41
+ id: version["value"]["id"],
42
+ status: version["value"]["status"]
43
+ }
44
+ end
45
+ return parsed_versions
46
+ end
47
+
48
+ # transforms user-set versions to iTC ones
28
49
  def versions=(value = {})
29
50
  if value.kind_of?(Array)
30
51
  # input that comes from iTC api
@@ -36,7 +57,8 @@ module Spaceship
36
57
  "value" => {
37
58
  "subscriptionName" => { "value" => current_version[:subscription_name] },
38
59
  "name" => { "value" => current_version[:name] },
39
- "localeCode" => { "value" => language }
60
+ "localeCode" => { "value" => language },
61
+ "id" => current_version[:id]
40
62
  }
41
63
  }
42
64
  end
@@ -44,20 +66,6 @@ module Spaceship
44
66
  raw_data.set(["details"], { "value" => new_versions })
45
67
  end
46
68
 
47
- # @return (Hash) localized names
48
- def versions
49
- parsed_versions = {}
50
- raw_versions = raw_data["details"]["value"]
51
- raw_versions.each do |version|
52
- language = version["value"]["localeCode"]["value"]
53
- parsed_versions[language.to_sym] = {
54
- subscription_name: version["value"]["subscriptionName"]["value"],
55
- name: version["value"]["name"]["value"]
56
- }
57
- end
58
- return parsed_versions
59
- end
60
-
61
69
  # modify existing family
62
70
  def save!
63
71
  # Transform localization versions back to original format.
@@ -67,7 +75,8 @@ module Spaceship
67
75
  "value" => {
68
76
  "subscriptionName" => { "value" => value[:subscription_name] },
69
77
  "name" => { "value" => value[:name] },
70
- "localeCode" => { "value" => language_code.to_s }
78
+ "localeCode" => { "value" => language_code.to_s },
79
+ "id" => value[:id]
71
80
  }
72
81
  }
73
82
  end
@@ -400,7 +400,7 @@ module Spaceship
400
400
  rating_url << "sort=REVIEW_SORT_ORDER_MOST_RECENT"
401
401
  rating_url << "&index=#{index}"
402
402
  rating_url << "&storefront=#{storefront}" unless storefront.empty?
403
- rating_url << "&version_id=#{version_id}" unless version_id.empty?
403
+ rating_url << "&versionId=#{version_id}" unless version_id.empty?
404
404
 
405
405
  r = request(:get, rating_url)
406
406
  all_reviews.concat(parse_response(r, 'data')['reviews'])
@@ -627,7 +627,7 @@ module Spaceship
627
627
  handle_itc_response(r.body)
628
628
  end
629
629
 
630
- def transform_to_raw_pricing_intervals(app_id = nil, purchase_id = nil, pricing_intervals = nil, subscription_price_target = nil)
630
+ def transform_to_raw_pricing_intervals(app_id = nil, purchase_id = nil, pricing_intervals = 5, subscription_price_target = nil)
631
631
  intervals_array = []
632
632
  if pricing_intervals
633
633
  intervals_array = pricing_intervals.map do |interval|
metadata CHANGED
@@ -1,33 +1,33 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.139.0
4
+ version: 2.140.0
5
5
  platform: ruby
6
6
  authors:
7
+ - Olivier Halligon
8
+ - Jan Piotrowski
9
+ - Manu Wallner
7
10
  - Kohki Miki
11
+ - Stefan Natchev
8
12
  - Josh Holtz
9
- - Helmut Januschka
10
- - Jorge Revuelta H
11
- - Jimmy Dee
12
13
  - Jérôme Lacoste
13
- - Iulian Onofrei
14
- - Manu Wallner
15
- - Stefan Natchev
14
+ - Maksym Grebenets
16
15
  - Andrew McBurney
17
- - Jan Piotrowski
16
+ - Joshua Liebowitz
17
+ - Matthew Ellis
18
+ - Jimmy Dee
19
+ - Fumiya Nakamura
18
20
  - Felix Krause
19
21
  - Danielle Tomlinson
22
+ - Helmut Januschka
20
23
  - Aaron Brager
21
- - Joshua Liebowitz
22
- - Matthew Ellis
23
- - Maksym Grebenets
24
+ - Iulian Onofrei
24
25
  - Luka Mirosevic
25
- - Olivier Halligon
26
- - Fumiya Nakamura
26
+ - Jorge Revuelta H
27
27
  autorequire:
28
28
  bindir: bin
29
29
  cert_chain: []
30
- date: 2019-12-30 00:00:00.000000000 Z
30
+ date: 2020-01-08 00:00:00.000000000 Z
31
31
  dependencies:
32
32
  - !ruby/object:Gem::Dependency
33
33
  name: slack-notifier
@@ -791,6 +791,20 @@ dependencies:
791
791
  - - "~>"
792
792
  - !ruby/object:Gem::Version
793
793
  version: 2.3.2
794
+ - !ruby/object:Gem::Dependency
795
+ name: hashdiff
796
+ requirement: !ruby/object:Gem::Requirement
797
+ requirements:
798
+ - - "<"
799
+ - !ruby/object:Gem::Version
800
+ version: 0.4.0
801
+ type: :development
802
+ prerelease: false
803
+ version_requirements: !ruby/object:Gem::Requirement
804
+ requirements:
805
+ - - "<"
806
+ - !ruby/object:Gem::Version
807
+ version: 0.4.0
794
808
  - !ruby/object:Gem::Dependency
795
809
  name: coveralls
796
810
  requirement: !ruby/object:Gem::Requirement
@@ -986,6 +1000,9 @@ files:
986
1000
  - fastlane/lib/fastlane.rb
987
1001
  - fastlane/lib/fastlane/action.rb
988
1002
  - fastlane/lib/fastlane/action_collector.rb
1003
+ - fastlane/lib/fastlane/actions/.hockey.rb.swp
1004
+ - fastlane/lib/fastlane/actions/.slack.rb.swp
1005
+ - fastlane/lib/fastlane/actions/.update_project_provisioning.rb.swp
989
1006
  - fastlane/lib/fastlane/actions/README.md
990
1007
  - fastlane/lib/fastlane/actions/actions_helper.rb
991
1008
  - fastlane/lib/fastlane/actions/adb.rb
@@ -1315,6 +1332,7 @@ files:
1315
1332
  - fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.pbxproj
1316
1333
  - fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
1317
1334
  - fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
1335
+ - fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/xcuserdata/josh.xcuserdatad/UserInterfaceState.xcuserstate
1318
1336
  - fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/xcshareddata/xcschemes/FastlaneRunner.xcscheme
1319
1337
  - fastlane/swift/FastlaneSwiftRunner/README.txt
1320
1338
  - fastlane/swift/Gymfile.swift
@@ -1343,6 +1361,7 @@ files:
1343
1361
  - fastlane_core/README.md
1344
1362
  - fastlane_core/lib/assets/XMLTemplate.xml.erb
1345
1363
  - fastlane_core/lib/fastlane_core.rb
1364
+ - fastlane_core/lib/fastlane_core/.build_watcher.rb.swp
1346
1365
  - fastlane_core/lib/fastlane_core/analytics/action_completion_context.rb
1347
1366
  - fastlane_core/lib/fastlane_core/analytics/action_launch_context.rb
1348
1367
  - fastlane_core/lib/fastlane_core/analytics/analytics_event_builder.rb
@@ -1421,7 +1440,6 @@ files:
1421
1440
  - gym/lib/assets/GymfileTemplate.swift
1422
1441
  - gym/lib/assets/wrap_xcodebuild/xcbuild-safe.sh
1423
1442
  - gym/lib/gym.rb
1424
- - gym/lib/gym/.runner.rb.swp
1425
1443
  - gym/lib/gym/code_signing_mapping.rb
1426
1444
  - gym/lib/gym/commands_generator.rb
1427
1445
  - gym/lib/gym/detect_values.rb
@@ -1470,6 +1488,7 @@ files:
1470
1488
  - pem/lib/pem/options.rb
1471
1489
  - pilot/README.md
1472
1490
  - pilot/lib/pilot.rb
1491
+ - pilot/lib/pilot/.manager.rb.swp
1473
1492
  - pilot/lib/pilot/build_manager.rb
1474
1493
  - pilot/lib/pilot/commands_generator.rb
1475
1494
  - pilot/lib/pilot/features.rb
@@ -1601,6 +1620,7 @@ files:
1601
1620
  - spaceship/lib/spaceship/client.rb
1602
1621
  - spaceship/lib/spaceship/commands_generator.rb
1603
1622
  - spaceship/lib/spaceship/connect_api.rb
1623
+ - spaceship/lib/spaceship/connect_api/.DS_Store
1604
1624
  - spaceship/lib/spaceship/connect_api/client.rb
1605
1625
  - spaceship/lib/spaceship/connect_api/model.rb
1606
1626
  - spaceship/lib/spaceship/connect_api/models/app.rb
@@ -1643,6 +1663,7 @@ files:
1643
1663
  - spaceship/lib/spaceship/launcher.rb
1644
1664
  - spaceship/lib/spaceship/module.rb
1645
1665
  - spaceship/lib/spaceship/playground.rb
1666
+ - spaceship/lib/spaceship/portal/.certificate.rb.swp
1646
1667
  - spaceship/lib/spaceship/portal/app.rb
1647
1668
  - spaceship/lib/spaceship/portal/app_group.rb
1648
1669
  - spaceship/lib/spaceship/portal/app_service.rb
@@ -1782,7 +1803,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1782
1803
  - !ruby/object:Gem::Version
1783
1804
  version: '0'
1784
1805
  requirements: []
1785
- rubygems_version: 3.0.6
1806
+ rubygems_version: 3.0.3
1786
1807
  signing_key:
1787
1808
  specification_version: 4
1788
1809
  summary: The easiest way to automate beta deployments and releases for your iOS and