fastlane 2.139.0 → 2.140.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +60 -60
- data/fastlane/lib/fastlane/action.rb +1 -1
- data/fastlane/lib/fastlane/actions/.hockey.rb.swp +0 -0
- data/fastlane/lib/fastlane/actions/.slack.rb.swp +0 -0
- data/fastlane/lib/fastlane/actions/.update_project_provisioning.rb.swp +0 -0
- data/fastlane/lib/fastlane/actions/gradle.rb +43 -2
- data/fastlane/lib/fastlane/actions/run_tests.rb +5 -22
- data/fastlane/lib/fastlane/runner.rb +23 -18
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/fastlane/swift/Deliverfile.swift +1 -1
- data/fastlane/swift/Fastlane.swift +25 -7
- data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/xcuserdata/josh.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- data/fastlane/swift/Gymfile.swift +1 -1
- data/fastlane/swift/Matchfile.swift +1 -1
- data/fastlane/swift/Precheckfile.swift +1 -1
- data/fastlane/swift/Scanfile.swift +1 -1
- data/fastlane/swift/ScanfileProtocol.swift +9 -1
- data/fastlane/swift/Screengrabfile.swift +1 -1
- data/fastlane/swift/Snapshotfile.swift +1 -1
- data/{gym/lib/gym/.runner.rb.swp → fastlane_core/lib/fastlane_core/.build_watcher.rb.swp} +0 -0
- data/gym/lib/gym/runner.rb +30 -16
- data/pilot/lib/pilot/.manager.rb.swp +0 -0
- data/pilot/lib/pilot/build_manager.rb +15 -6
- data/scan/lib/scan/detect_values.rb +6 -1
- data/scan/lib/scan/manager.rb +18 -1
- data/scan/lib/scan/options.rb +12 -0
- data/scan/lib/scan/slack_poster.rb +1 -1
- data/scan/lib/scan/test_command_generator.rb +1 -1
- data/spaceship/lib/spaceship/connect_api/.DS_Store +0 -0
- data/spaceship/lib/spaceship/portal/.certificate.rb.swp +0 -0
- data/spaceship/lib/spaceship/tunes/iap.rb +11 -11
- data/spaceship/lib/spaceship/tunes/iap_detail.rb +7 -3
- data/spaceship/lib/spaceship/tunes/iap_families.rb +12 -1
- data/spaceship/lib/spaceship/tunes/iap_family_details.rb +26 -17
- data/spaceship/lib/spaceship/tunes/tunes_client.rb +2 -2
- metadata +37 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8475d80e9f0452ef7ac3c90a50b82dc52b110235819d0d422783984a5a2e3241
|
4
|
+
data.tar.gz: ccfd6ed3734d272250f69816ca5fa408af1102e83336f5e50d8a818ee81e569f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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='
|
44
|
-
<a href='https://github.com/
|
45
|
-
<img src='https://github.com/
|
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/
|
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
|
-
|
68
|
-
<
|
69
|
-
<
|
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'>
|
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='
|
102
|
-
<a href='https://github.com/
|
103
|
-
<img src='https://github.com/
|
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/
|
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='
|
126
|
-
<a href='https://github.com/
|
127
|
-
<img src='https://github.com/
|
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'
|
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='
|
146
|
-
<a href='https://github.com/
|
147
|
-
<img src='https://github.com/
|
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/
|
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
|
|
Binary file
|
Binary file
|
Binary file
|
@@ -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 =
|
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
|
-
|
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
|
-
|
13
|
+
manager = Scan::Manager.new
|
14
14
|
|
15
15
|
begin
|
16
|
-
|
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
|
-
#
|
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
|
-
|
232
|
-
action_name
|
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(
|
261
|
+
return class_ref.run(configurations)
|
257
262
|
end
|
258
263
|
end
|
259
264
|
rescue Interrupt => e
|
@@ -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
|
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
|
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
|
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.
|
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.
|
8431
|
+
// FastlaneRunnerAPIVersion [0.9.68]
|
Binary file
|
@@ -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.
|
237
|
+
// FastlaneRunnerAPIVersion [0.9.24]
|
Binary file
|
data/gym/lib/gym/runner.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
|
183
|
-
|
184
|
-
|
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 #{
|
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
|
Binary file
|
@@ -245,12 +245,21 @@ module Pilot
|
|
245
245
|
end
|
246
246
|
|
247
247
|
def self.truncate_changelog(changelog)
|
248
|
-
|
249
|
-
if changelog
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
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 =
|
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
|
data/scan/lib/scan/manager.rb
CHANGED
@@ -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
|
data/scan/lib/scan/options.rb
CHANGED
@@ -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
|
|
Binary file
|
Binary file
|
@@ -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" =>
|
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 << "&
|
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 =
|
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.
|
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
|
-
-
|
14
|
-
- Manu Wallner
|
15
|
-
- Stefan Natchev
|
14
|
+
- Maksym Grebenets
|
16
15
|
- Andrew McBurney
|
17
|
-
-
|
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
|
-
-
|
22
|
-
- Matthew Ellis
|
23
|
-
- Maksym Grebenets
|
24
|
+
- Iulian Onofrei
|
24
25
|
- Luka Mirosevic
|
25
|
-
-
|
26
|
-
- Fumiya Nakamura
|
26
|
+
- Jorge Revuelta H
|
27
27
|
autorequire:
|
28
28
|
bindir: bin
|
29
29
|
cert_chain: []
|
30
|
-
date:
|
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.
|
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
|