fastlane 2.139.0 → 2.140.0

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