fastlane 2.188.0 → 2.189.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 23a8e6b064fc103d7a8d701428ac360a7cb03ef0761d6dc067ae392dacd02bbf
4
- data.tar.gz: 11a4781c02ca5777fceac1364311be8726f6a4fc6f8943f5215a9c753c66c127
3
+ metadata.gz: 3e220b24ad58be1b3108fa1a5c3c76326da0036e3823d39757ad46c038375c72
4
+ data.tar.gz: 164b1297dccb44d1c43138c3eb8ff654c33ec6860392f284ca9a294c5f4e0091
5
5
  SHA512:
6
- metadata.gz: f4ebfae993bfb3db9bc6dcf91c4d526b98b9202c6813f894579979ad52a9bffe74522eaa8b2a2a36b7a0d87be275cac4ce677a9d9864746bc92d5c7d64737e12
7
- data.tar.gz: b1aacae9f83f897fd56bc9792d3a7c9842f0ffcf7caf64963b80dd7283f304116232d46608512af53804fdbb6075b1dffab7339776c0a1cff85b75992f5bf53e
6
+ metadata.gz: e1658928b8523a0b15400cbf2bbe8f66492f1abaf33aa5dedc56e0ebfe9ff38c8b7f546748a0048a38d81856806d1588b81d136b51c80927bdced727f483fae0
7
+ data.tar.gz: cd2c243360d99b90fba4dbcae7d31062bdd74a562a61f2092c8ef0604d5fb207f3d62c905f5f38c65add6df6f980801cacf316878009c8b68ddc59f6d3ec2fbb
data/README.md CHANGED
@@ -35,49 +35,23 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
35
35
  <!-- This table is regenerated and resorted on each release -->
36
36
  <table id='team'>
37
37
  <tr>
38
- <td id='matthew-ellis'>
39
- <a href='https://github.com/matthewellis'>
40
- <img src='https://github.com/matthewellis.png' width='140px;'>
41
- </a>
42
- <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
43
- </td>
44
- <td id='josh-holtz'>
45
- <a href='https://github.com/joshdholtz'>
46
- <img src='https://github.com/joshdholtz.png' width='140px;'>
47
- </a>
48
- <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
49
- </td>
50
- <td id='maksym-grebenets'>
51
- <a href='https://github.com/mgrebenets'>
52
- <img src='https://github.com/mgrebenets.png' width='140px;'>
53
- </a>
54
- <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
55
- </td>
56
- <td id='stefan-natchev'>
57
- <a href='https://github.com/snatchev'>
58
- <img src='https://github.com/snatchev.png' width='140px;'>
59
- </a>
60
- <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
61
- </td>
62
- <td id='roger-oba'>
63
- <a href='https://github.com/rogerluan'>
64
- <img src='https://github.com/rogerluan.png' width='140px;'>
38
+ <td id='jérôme-lacoste'>
39
+ <a href='https://github.com/lacostej'>
40
+ <img src='https://github.com/lacostej.png' width='140px;'>
65
41
  </a>
66
- <h4 align='center'><a href='https://twitter.com/rogerluan_'>Roger Oba</a></h4>
42
+ <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
67
43
  </td>
68
- </tr>
69
- <tr>
70
- <td id='manish-rathi'>
71
- <a href='https://github.com/crazymanish'>
72
- <img src='https://github.com/crazymanish.png' width='140px;'>
44
+ <td id='satoshi-namai'>
45
+ <a href='https://github.com/ainame'>
46
+ <img src='https://github.com/ainame.png' width='140px;'>
73
47
  </a>
74
- <h4 align='center'><a href='https://twitter.com/iammanishrathi'>Manish Rathi</a></h4>
48
+ <h4 align='center'><a href='https://twitter.com/ainame'>Satoshi Namai</a></h4>
75
49
  </td>
76
- <td id='danielle-tomlinson'>
77
- <a href='https://github.com/endocrimes'>
78
- <img src='https://github.com/endocrimes.png' width='140px;'>
50
+ <td id='andrew-mcburney'>
51
+ <a href='https://github.com/armcburney'>
52
+ <img src='https://github.com/armcburney.png' width='140px;'>
79
53
  </a>
80
- <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
54
+ <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
81
55
  </td>
82
56
  <td id='jorge-revuelta-h'>
83
57
  <a href='https://github.com/minuscorp'>
@@ -85,11 +59,19 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
85
59
  </a>
86
60
  <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
87
61
  </td>
88
- <td id='jimmy-dee'>
89
- <a href='https://github.com/jdee'>
90
- <img src='https://github.com/jdee.png' width='140px;'>
62
+ <td id='olivier-halligon'>
63
+ <a href='https://github.com/AliSoftware'>
64
+ <img src='https://github.com/AliSoftware.png' width='140px;'>
91
65
  </a>
92
- <h4 align='center'>Jimmy Dee</h4>
66
+ <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
67
+ </td>
68
+ </tr>
69
+ <tr>
70
+ <td id='luka-mirosevic'>
71
+ <a href='https://github.com/lmirosevic'>
72
+ <img src='https://github.com/lmirosevic.png' width='140px;'>
73
+ </a>
74
+ <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
93
75
  </td>
94
76
  <td id='iulian-onofrei'>
95
77
  <a href='https://github.com/revolter'>
@@ -97,45 +79,63 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
97
79
  </a>
98
80
  <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
99
81
  </td>
100
- </tr>
101
- <tr>
82
+ <td id='fumiya-nakamura'>
83
+ <a href='https://github.com/nafu'>
84
+ <img src='https://github.com/nafu.png' width='140px;'>
85
+ </a>
86
+ <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
87
+ </td>
88
+ <td id='stefan-natchev'>
89
+ <a href='https://github.com/snatchev'>
90
+ <img src='https://github.com/snatchev.png' width='140px;'>
91
+ </a>
92
+ <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
93
+ </td>
102
94
  <td id='helmut-januschka'>
103
95
  <a href='https://github.com/hjanuschka'>
104
96
  <img src='https://github.com/hjanuschka.png' width='140px;'>
105
97
  </a>
106
98
  <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
107
99
  </td>
108
- <td id='satoshi-namai'>
109
- <a href='https://github.com/ainame'>
110
- <img src='https://github.com/ainame.png' width='140px;'>
100
+ </tr>
101
+ <tr>
102
+ <td id='maksym-grebenets'>
103
+ <a href='https://github.com/mgrebenets'>
104
+ <img src='https://github.com/mgrebenets.png' width='140px;'>
111
105
  </a>
112
- <h4 align='center'><a href='https://twitter.com/ainame'>Satoshi Namai</a></h4>
106
+ <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
113
107
  </td>
114
- <td id='luka-mirosevic'>
115
- <a href='https://github.com/lmirosevic'>
116
- <img src='https://github.com/lmirosevic.png' width='140px;'>
108
+ <td id='max-ott'>
109
+ <a href='https://github.com/max-ott'>
110
+ <img src='https://github.com/max-ott.png' width='140px;'>
117
111
  </a>
118
- <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
112
+ <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
119
113
  </td>
120
- <td id='joshua-liebowitz'>
121
- <a href='https://github.com/taquitos'>
122
- <img src='https://github.com/taquitos.png' width='140px;'>
114
+ <td id='josh-holtz'>
115
+ <a href='https://github.com/joshdholtz'>
116
+ <img src='https://github.com/joshdholtz.png' width='140px;'>
123
117
  </a>
124
- <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
118
+ <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
125
119
  </td>
126
- <td id='andrew-mcburney'>
127
- <a href='https://github.com/armcburney'>
128
- <img src='https://github.com/armcburney.png' width='140px;'>
120
+ <td id='jan-piotrowski'>
121
+ <a href='https://github.com/janpio'>
122
+ <img src='https://github.com/janpio.png' width='140px;'>
129
123
  </a>
130
- <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
124
+ <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
125
+ </td>
126
+ <td id='manish-rathi'>
127
+ <a href='https://github.com/crazymanish'>
128
+ <img src='https://github.com/crazymanish.png' width='140px;'>
129
+ </a>
130
+ <h4 align='center'><a href='https://twitter.com/iammanishrathi'>Manish Rathi</a></h4>
131
131
  </td>
132
132
  </tr>
133
133
  <tr>
134
- <td id='olivier-halligon'>
135
- <a href='https://github.com/AliSoftware'>
136
- <img src='https://github.com/AliSoftware.png' width='140px;'>
134
+ <td id='kohki-miki'>
135
+ <a href='https://github.com/giginet'>
136
+ <img src='https://github.com/giginet.png' width='140px;'>
137
137
  </a>
138
- <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
138
+ <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
139
139
  </td>
140
140
  <td id='daniel-jankowski'>
141
141
  <a href='https://github.com/mollyIV'>
@@ -143,37 +143,43 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
143
143
  </a>
144
144
  <h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
145
145
  </td>
146
- <td id='jérôme-lacoste'>
147
- <a href='https://github.com/lacostej'>
148
- <img src='https://github.com/lacostej.png' width='140px;'>
146
+ <td id='aaron-brager'>
147
+ <a href='https://github.com/getaaron'>
148
+ <img src='https://github.com/getaaron.png' width='140px;'>
149
149
  </a>
150
- <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
150
+ <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
151
151
  </td>
152
- <td id='jan-piotrowski'>
153
- <a href='https://github.com/janpio'>
154
- <img src='https://github.com/janpio.png' width='140px;'>
152
+ <td id='roger-oba'>
153
+ <a href='https://github.com/rogerluan'>
154
+ <img src='https://github.com/rogerluan.png' width='140px;'>
155
155
  </a>
156
- <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
156
+ <h4 align='center'><a href='https://twitter.com/rogerluan_'>Roger Oba</a></h4>
157
+ </td>
158
+ <td id='matthew-ellis'>
159
+ <a href='https://github.com/matthewellis'>
160
+ <img src='https://github.com/matthewellis.png' width='140px;'>
161
+ </a>
162
+ <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
157
163
  </td>
164
+ </tr>
165
+ <tr>
158
166
  <td id='manu-wallner'>
159
167
  <a href='https://github.com/milch'>
160
168
  <img src='https://github.com/milch.png' width='140px;'>
161
169
  </a>
162
170
  <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
163
171
  </td>
164
- </tr>
165
- <tr>
166
- <td id='max-ott'>
167
- <a href='https://github.com/max-ott'>
168
- <img src='https://github.com/max-ott.png' width='140px;'>
172
+ <td id='danielle-tomlinson'>
173
+ <a href='https://github.com/endocrimes'>
174
+ <img src='https://github.com/endocrimes.png' width='140px;'>
169
175
  </a>
170
- <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
176
+ <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
171
177
  </td>
172
- <td id='aaron-brager'>
173
- <a href='https://github.com/getaaron'>
174
- <img src='https://github.com/getaaron.png' width='140px;'>
178
+ <td id='joshua-liebowitz'>
179
+ <a href='https://github.com/taquitos'>
180
+ <img src='https://github.com/taquitos.png' width='140px;'>
175
181
  </a>
176
- <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
182
+ <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
177
183
  </td>
178
184
  <td id='felix-krause'>
179
185
  <a href='https://github.com/KrauseFx'>
@@ -181,17 +187,11 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
181
187
  </a>
182
188
  <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
183
189
  </td>
184
- <td id='kohki-miki'>
185
- <a href='https://github.com/giginet'>
186
- <img src='https://github.com/giginet.png' width='140px;'>
187
- </a>
188
- <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
189
- </td>
190
- <td id='fumiya-nakamura'>
191
- <a href='https://github.com/nafu'>
192
- <img src='https://github.com/nafu.png' width='140px;'>
190
+ <td id='jimmy-dee'>
191
+ <a href='https://github.com/jdee'>
192
+ <img src='https://github.com/jdee.png' width='140px;'>
193
193
  </a>
194
- <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
194
+ <h4 align='center'>Jimmy Dee</h4>
195
195
  </td>
196
196
  </tr>
197
197
  </table>
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
- VERSION = '2.188.0'.freeze
2
+ VERSION = '2.189.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 = '1.12.1'.freeze
@@ -17,4 +17,4 @@ public class Deliverfile: DeliverfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.188.0
20
+ // Generated with fastlane 2.189.0
@@ -256,4 +256,4 @@ public extension DeliverfileProtocol {
256
256
 
257
257
  // Please don't remove the lines below
258
258
  // They are used to detect outdated files
259
- // FastlaneRunnerAPIVersion [0.9.76]
259
+ // FastlaneRunnerAPIVersion [0.9.77]
@@ -2771,7 +2771,7 @@ public func chatwork(apiToken: String,
2771
2771
  teamId: OptionalConfigValue<String?> = .fastlaneDefault(nil),
2772
2772
  teamName: OptionalConfigValue<String?> = .fastlaneDefault(nil),
2773
2773
  platform: String = "ios",
2774
- defaultRuleLevel: Any = "error",
2774
+ defaultRuleLevel: String = "error",
2775
2775
  includeInAppPurchases: OptionalConfigValue<Bool> = .fastlaneDefault(true),
2776
2776
  useLive: OptionalConfigValue<Bool> = .fastlaneDefault(false),
2777
2777
  negativeAppleSentiment: Any? = nil,
@@ -8467,6 +8467,7 @@ public func rubyVersion() {
8467
8467
  - parameters:
8468
8468
  - workspace: Path to the workspace file
8469
8469
  - project: Path to the project file
8470
+ - packagePath: Path to the Swift Package
8470
8471
  - scheme: The project's scheme. Make sure it's marked as `Shared`
8471
8472
  - device: The name of the simulator type you want to run tests on (e.g. 'iPhone 6')
8472
8473
  - devices: Array of devices to run the tests on (e.g. ['iPhone 6', 'iPad Air'])
@@ -8541,6 +8542,7 @@ public func rubyVersion() {
8541
8542
  */
8542
8543
  public func runTests(workspace: OptionalConfigValue<String?> = .fastlaneDefault(nil),
8543
8544
  project: OptionalConfigValue<String?> = .fastlaneDefault(nil),
8545
+ packagePath: OptionalConfigValue<String?> = .fastlaneDefault(nil),
8544
8546
  scheme: OptionalConfigValue<String?> = .fastlaneDefault(nil),
8545
8547
  device: OptionalConfigValue<String?> = .fastlaneDefault(nil),
8546
8548
  devices: OptionalConfigValue<[String]?> = .fastlaneDefault(nil),
@@ -8613,6 +8615,7 @@ public func runTests(workspace: OptionalConfigValue<String?> = .fastlaneDefault(
8613
8615
  {
8614
8616
  let workspaceArg = workspace.asRubyArgument(name: "workspace", type: nil)
8615
8617
  let projectArg = project.asRubyArgument(name: "project", type: nil)
8618
+ let packagePathArg = packagePath.asRubyArgument(name: "package_path", type: nil)
8616
8619
  let schemeArg = scheme.asRubyArgument(name: "scheme", type: nil)
8617
8620
  let deviceArg = device.asRubyArgument(name: "device", type: nil)
8618
8621
  let devicesArg = devices.asRubyArgument(name: "devices", type: nil)
@@ -8684,6 +8687,7 @@ public func runTests(workspace: OptionalConfigValue<String?> = .fastlaneDefault(
8684
8687
  let failBuildArg = failBuild.asRubyArgument(name: "fail_build", type: nil)
8685
8688
  let array: [RubyCommand.Argument?] = [workspaceArg,
8686
8689
  projectArg,
8690
+ packagePathArg,
8687
8691
  schemeArg,
8688
8692
  deviceArg,
8689
8693
  devicesArg,
@@ -8868,6 +8872,7 @@ public func say(text: [String],
8868
8872
  - parameters:
8869
8873
  - workspace: Path to the workspace file
8870
8874
  - project: Path to the project file
8875
+ - packagePath: Path to the Swift Package
8871
8876
  - scheme: The project's scheme. Make sure it's marked as `Shared`
8872
8877
  - device: The name of the simulator type you want to run tests on (e.g. 'iPhone 6')
8873
8878
  - devices: Array of devices to run the tests on (e.g. ['iPhone 6', 'iPad Air'])
@@ -8942,6 +8947,7 @@ public func say(text: [String],
8942
8947
  */
8943
8948
  public func scan(workspace: OptionalConfigValue<String?> = .fastlaneDefault(scanfile.workspace),
8944
8949
  project: OptionalConfigValue<String?> = .fastlaneDefault(scanfile.project),
8950
+ packagePath: OptionalConfigValue<String?> = .fastlaneDefault(scanfile.packagePath),
8945
8951
  scheme: OptionalConfigValue<String?> = .fastlaneDefault(scanfile.scheme),
8946
8952
  device: OptionalConfigValue<String?> = .fastlaneDefault(scanfile.device),
8947
8953
  devices: OptionalConfigValue<[String]?> = .fastlaneDefault(scanfile.devices),
@@ -9014,6 +9020,7 @@ public func scan(workspace: OptionalConfigValue<String?> = .fastlaneDefault(scan
9014
9020
  {
9015
9021
  let workspaceArg = workspace.asRubyArgument(name: "workspace", type: nil)
9016
9022
  let projectArg = project.asRubyArgument(name: "project", type: nil)
9023
+ let packagePathArg = packagePath.asRubyArgument(name: "package_path", type: nil)
9017
9024
  let schemeArg = scheme.asRubyArgument(name: "scheme", type: nil)
9018
9025
  let deviceArg = device.asRubyArgument(name: "device", type: nil)
9019
9026
  let devicesArg = devices.asRubyArgument(name: "devices", type: nil)
@@ -9085,6 +9092,7 @@ public func scan(workspace: OptionalConfigValue<String?> = .fastlaneDefault(scan
9085
9092
  let failBuildArg = failBuild.asRubyArgument(name: "fail_build", type: nil)
9086
9093
  let array: [RubyCommand.Argument?] = [workspaceArg,
9087
9094
  projectArg,
9095
+ packagePathArg,
9088
9096
  schemeArg,
9089
9097
  deviceArg,
9090
9098
  devicesArg,
@@ -10629,6 +10637,7 @@ public func ssh(username: String,
10629
10637
  - timeout: Timeout for read, open, and send (in seconds)
10630
10638
  - deactivateOnPromote: **DEPRECATED!** Google Play does this automatically now - When promoting to a new track, deactivate the binary in the origin track
10631
10639
  - versionCodesToRetain: An array of version codes to retain when publishing a new APK
10640
+ - changesNotSentForReview: Indicates that the changes in this edit will not be reviewed until they are explicitly sent for review from the Google Play Console UI
10632
10641
  - inAppUpdatePriority: In-app update priority for all the newly added apks in the release. Can take values between [0,5]
10633
10642
  - obbMainReferencesVersion: References version of 'main' expansion file
10634
10643
  - obbMainFileSize: Size of 'main' expansion file in bytes
@@ -10668,6 +10677,7 @@ public func supply(packageName: String,
10668
10677
  timeout: Int = 300,
10669
10678
  deactivateOnPromote: OptionalConfigValue<Bool> = .fastlaneDefault(true),
10670
10679
  versionCodesToRetain: OptionalConfigValue<[String]?> = .fastlaneDefault(nil),
10680
+ changesNotSentForReview: OptionalConfigValue<Bool> = .fastlaneDefault(false),
10671
10681
  inAppUpdatePriority: OptionalConfigValue<Int?> = .fastlaneDefault(nil),
10672
10682
  obbMainReferencesVersion: OptionalConfigValue<String?> = .fastlaneDefault(nil),
10673
10683
  obbMainFileSize: OptionalConfigValue<String?> = .fastlaneDefault(nil),
@@ -10705,6 +10715,7 @@ public func supply(packageName: String,
10705
10715
  let timeoutArg = RubyCommand.Argument(name: "timeout", value: timeout, type: nil)
10706
10716
  let deactivateOnPromoteArg = deactivateOnPromote.asRubyArgument(name: "deactivate_on_promote", type: nil)
10707
10717
  let versionCodesToRetainArg = versionCodesToRetain.asRubyArgument(name: "version_codes_to_retain", type: nil)
10718
+ let changesNotSentForReviewArg = changesNotSentForReview.asRubyArgument(name: "changes_not_sent_for_review", type: nil)
10708
10719
  let inAppUpdatePriorityArg = inAppUpdatePriority.asRubyArgument(name: "in_app_update_priority", type: nil)
10709
10720
  let obbMainReferencesVersionArg = obbMainReferencesVersion.asRubyArgument(name: "obb_main_references_version", type: nil)
10710
10721
  let obbMainFileSizeArg = obbMainFileSize.asRubyArgument(name: "obb_main_file_size", type: nil)
@@ -10741,6 +10752,7 @@ public func supply(packageName: String,
10741
10752
  timeoutArg,
10742
10753
  deactivateOnPromoteArg,
10743
10754
  versionCodesToRetainArg,
10755
+ changesNotSentForReviewArg,
10744
10756
  inAppUpdatePriorityArg,
10745
10757
  obbMainReferencesVersionArg,
10746
10758
  obbMainFileSizeArg,
@@ -12245,6 +12257,7 @@ public func uploadToAppStore(apiKeyPath: OptionalConfigValue<String?> = .fastlan
12245
12257
  - timeout: Timeout for read, open, and send (in seconds)
12246
12258
  - deactivateOnPromote: **DEPRECATED!** Google Play does this automatically now - When promoting to a new track, deactivate the binary in the origin track
12247
12259
  - versionCodesToRetain: An array of version codes to retain when publishing a new APK
12260
+ - changesNotSentForReview: Indicates that the changes in this edit will not be reviewed until they are explicitly sent for review from the Google Play Console UI
12248
12261
  - inAppUpdatePriority: In-app update priority for all the newly added apks in the release. Can take values between [0,5]
12249
12262
  - obbMainReferencesVersion: References version of 'main' expansion file
12250
12263
  - obbMainFileSize: Size of 'main' expansion file in bytes
@@ -12284,6 +12297,7 @@ public func uploadToPlayStore(packageName: String,
12284
12297
  timeout: Int = 300,
12285
12298
  deactivateOnPromote: OptionalConfigValue<Bool> = .fastlaneDefault(true),
12286
12299
  versionCodesToRetain: OptionalConfigValue<[String]?> = .fastlaneDefault(nil),
12300
+ changesNotSentForReview: OptionalConfigValue<Bool> = .fastlaneDefault(false),
12287
12301
  inAppUpdatePriority: OptionalConfigValue<Int?> = .fastlaneDefault(nil),
12288
12302
  obbMainReferencesVersion: OptionalConfigValue<String?> = .fastlaneDefault(nil),
12289
12303
  obbMainFileSize: OptionalConfigValue<String?> = .fastlaneDefault(nil),
@@ -12321,6 +12335,7 @@ public func uploadToPlayStore(packageName: String,
12321
12335
  let timeoutArg = RubyCommand.Argument(name: "timeout", value: timeout, type: nil)
12322
12336
  let deactivateOnPromoteArg = deactivateOnPromote.asRubyArgument(name: "deactivate_on_promote", type: nil)
12323
12337
  let versionCodesToRetainArg = versionCodesToRetain.asRubyArgument(name: "version_codes_to_retain", type: nil)
12338
+ let changesNotSentForReviewArg = changesNotSentForReview.asRubyArgument(name: "changes_not_sent_for_review", type: nil)
12324
12339
  let inAppUpdatePriorityArg = inAppUpdatePriority.asRubyArgument(name: "in_app_update_priority", type: nil)
12325
12340
  let obbMainReferencesVersionArg = obbMainReferencesVersion.asRubyArgument(name: "obb_main_references_version", type: nil)
12326
12341
  let obbMainFileSizeArg = obbMainFileSize.asRubyArgument(name: "obb_main_file_size", type: nil)
@@ -12357,6 +12372,7 @@ public func uploadToPlayStore(packageName: String,
12357
12372
  timeoutArg,
12358
12373
  deactivateOnPromoteArg,
12359
12374
  versionCodesToRetainArg,
12375
+ changesNotSentForReviewArg,
12360
12376
  inAppUpdatePriorityArg,
12361
12377
  obbMainReferencesVersionArg,
12362
12378
  obbMainFileSizeArg,
@@ -13151,4 +13167,4 @@ public let snapshotfile = Snapshotfile()
13151
13167
 
13152
13168
  // Please don't remove the lines below
13153
13169
  // They are used to detect outdated files
13154
- // FastlaneRunnerAPIVersion [0.9.129]
13170
+ // FastlaneRunnerAPIVersion [0.9.130]
@@ -17,4 +17,4 @@ public class Gymfile: GymfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.188.0
20
+ // Generated with fastlane 2.189.0
@@ -196,4 +196,4 @@ public extension GymfileProtocol {
196
196
 
197
197
  // Please don't remove the lines below
198
198
  // They are used to detect outdated files
199
- // FastlaneRunnerAPIVersion [0.9.79]
199
+ // FastlaneRunnerAPIVersion [0.9.80]
@@ -17,4 +17,4 @@ public class Matchfile: MatchfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.188.0
20
+ // Generated with fastlane 2.189.0
@@ -184,4 +184,4 @@ public extension MatchfileProtocol {
184
184
 
185
185
  // Please don't remove the lines below
186
186
  // They are used to detect outdated files
187
- // FastlaneRunnerAPIVersion [0.9.73]
187
+ // FastlaneRunnerAPIVersion [0.9.74]
@@ -17,4 +17,4 @@ public class Precheckfile: PrecheckfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.188.0
20
+ // Generated with fastlane 2.189.0
@@ -52,4 +52,4 @@ public extension PrecheckfileProtocol {
52
52
 
53
53
  // Please don't remove the lines below
54
54
  // They are used to detect outdated files
55
- // FastlaneRunnerAPIVersion [0.9.72]
55
+ // FastlaneRunnerAPIVersion [0.9.73]
@@ -17,4 +17,4 @@ public class Scanfile: ScanfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.188.0
20
+ // Generated with fastlane 2.189.0
@@ -8,6 +8,9 @@ public protocol ScanfileProtocol: class {
8
8
  /// Path to the project file
9
9
  var project: String? { get }
10
10
 
11
+ /// Path to the Swift Package
12
+ var packagePath: String? { get }
13
+
11
14
  /// The project's scheme. Make sure it's marked as `Shared`
12
15
  var scheme: String? { get }
13
16
 
@@ -219,6 +222,7 @@ public protocol ScanfileProtocol: class {
219
222
  public extension ScanfileProtocol {
220
223
  var workspace: String? { return nil }
221
224
  var project: String? { return nil }
225
+ var packagePath: String? { return nil }
222
226
  var scheme: String? { return nil }
223
227
  var device: String? { return nil }
224
228
  var devices: [String]? { return nil }
@@ -292,4 +296,4 @@ public extension ScanfileProtocol {
292
296
 
293
297
  // Please don't remove the lines below
294
298
  // They are used to detect outdated files
295
- // FastlaneRunnerAPIVersion [0.9.84]
299
+ // FastlaneRunnerAPIVersion [0.9.85]
@@ -17,4 +17,4 @@ public class Screengrabfile: ScreengrabfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.188.0
20
+ // Generated with fastlane 2.189.0
@@ -96,4 +96,4 @@ public extension ScreengrabfileProtocol {
96
96
 
97
97
  // Please don't remove the lines below
98
98
  // They are used to detect outdated files
99
- // FastlaneRunnerAPIVersion [0.9.74]
99
+ // FastlaneRunnerAPIVersion [0.9.75]
@@ -17,4 +17,4 @@ public class Snapshotfile: SnapshotfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.188.0
20
+ // Generated with fastlane 2.189.0
@@ -200,4 +200,4 @@ public extension SnapshotfileProtocol {
200
200
 
201
201
  // Please don't remove the lines below
202
202
  // They are used to detect outdated files
203
- // FastlaneRunnerAPIVersion [0.9.68]
203
+ // FastlaneRunnerAPIVersion [0.9.69]
@@ -51,9 +51,9 @@
51
51
  "macOS": "11.0"
52
52
  },
53
53
  "monterey": {
54
- "HOMEBREW_VERSION": "3.2.3",
54
+ "HOMEBREW_VERSION": "3.2.5-13-g89b8619",
55
55
  "HOMEBREW_PREFIX": "/usr/local",
56
- "Homebrew/homebrew-core": "40a6089f1a49f1ab703a04889184e3fd051ffc8b",
56
+ "Homebrew/homebrew-core": "61ecc3e550752e9348480ec3c221e7f2c6abcac0",
57
57
  "CLT": "13.0.0.0.1.1626155413",
58
58
  "Xcode": "12.5.1",
59
59
  "macOS": "12.0"
@@ -1,5 +1,6 @@
1
1
  require 'fastlane_core/helper'
2
2
  require 'fastlane_core/ui/ui'
3
+ require 'fastlane/boolean'
3
4
 
4
5
  module Precheck
5
6
  # Use this to just setup the configuration attribute and set it later somewhere else
@@ -13,6 +14,7 @@ module Precheck
13
14
 
14
15
  Helper = FastlaneCore::Helper # you gotta love Ruby: Helper.* should use the Helper class contained in FastlaneCore
15
16
  UI = FastlaneCore::UI
17
+ Boolean = Fastlane::Boolean
16
18
  ROOT = Pathname.new(File.expand_path('../../..', __FILE__))
17
19
 
18
20
  ENV['APP_IDENTIFIER'] ||= ENV["PRECHECK_APP_IDENTIFIER"]
@@ -90,19 +90,19 @@ module Precheck
90
90
  short_option: "-r",
91
91
  env_name: "PRECHECK_DEFAULT_RULE_LEVEL",
92
92
  description: "The default rule level unless otherwise configured",
93
- is_string: false,
93
+ type: Symbol,
94
94
  default_value: RULE_LEVELS[:error]),
95
95
  FastlaneCore::ConfigItem.new(key: :include_in_app_purchases,
96
96
  short_option: "-i",
97
97
  env_name: "PRECHECK_INCLUDE_IN_APP_PURCHASES",
98
98
  description: "Should check in-app purchases?",
99
- is_string: false,
99
+ type: Boolean,
100
100
  optional: true,
101
101
  default_value: true),
102
102
  FastlaneCore::ConfigItem.new(key: :use_live,
103
103
  env_name: "PRECHECK_USE_LIVE",
104
104
  description: "Should force check live app?",
105
- is_string: false,
105
+ type: Boolean,
106
106
  default_value: false)
107
107
  ] + rules
108
108
  end
@@ -15,22 +15,24 @@ module Scan
15
15
 
16
16
  prevalidate
17
17
 
18
- # Detect the project
19
- FastlaneCore::Project.detect_projects(config)
20
- Scan.project = FastlaneCore::Project.new(config)
21
-
22
- # Go into the project's folder, as there might be a Snapfile there
23
- imported_path = File.expand_path(Scan.scanfile_name)
24
- Dir.chdir(File.expand_path("..", Scan.project.path)) do
25
- config.load_configuration_file(Scan.scanfile_name) unless File.expand_path(Scan.scanfile_name) == imported_path
26
- end
18
+ # Detect the project if not SPM package
19
+ if Scan.config[:package_path].nil?
20
+ FastlaneCore::Project.detect_projects(config)
21
+ Scan.project = FastlaneCore::Project.new(config)
22
+
23
+ # Go into the project's folder, as there might be a Snapfile there
24
+ imported_path = File.expand_path(Scan.scanfile_name)
25
+ Dir.chdir(File.expand_path("..", Scan.project.path)) do
26
+ config.load_configuration_file(Scan.scanfile_name) unless File.expand_path(Scan.scanfile_name) == imported_path
27
+ end
27
28
 
28
- Scan.project.select_scheme
29
+ Scan.project.select_scheme
30
+ end
29
31
 
30
32
  devices = Scan.config[:devices] || Array(Scan.config[:device]) # important to use Array(nil) for when the value is nil
31
33
  if devices.count > 0
32
34
  detect_simulator(devices, '', '', '', nil)
33
- else
35
+ elsif Scan.project
34
36
  if Scan.project.ios?
35
37
  # An iPhone 5s is a reasonably small and useful default for tests
36
38
  detect_simulator(devices, 'iOS', 'IPHONEOS_DEPLOYMENT_TARGET', 'iPhone 5s', nil)
@@ -38,6 +40,7 @@ module Scan
38
40
  detect_simulator(devices, 'tvOS', 'TVOS_DEPLOYMENT_TARGET', 'Apple TV 1080p', 'TV')
39
41
  end
40
42
  end
43
+
41
44
  detect_destination
42
45
 
43
46
  default_derived_data
@@ -72,6 +75,8 @@ module Scan
72
75
  end
73
76
 
74
77
  def self.default_derived_data
78
+ return unless Scan.project
79
+
75
80
  return unless Scan.config[:derived_data_path].to_s.empty?
76
81
  default_path = Scan.project.build_settings(key: "BUILT_PRODUCTS_DIR")
77
82
  # => /Users/.../Library/Developer/Xcode/DerivedData/app-bqrfaojicpsqnoglloisfftjhksc/Build/Products/Release-iphoneos
@@ -216,14 +221,18 @@ module Scan
216
221
  Scan.config[:destination] = ["platform=macOS,variant=Mac Catalyst"]
217
222
  elsif Scan.devices && Scan.devices.count > 0
218
223
  Scan.config[:destination] = Scan.devices.map { |d| "platform=#{d.os_type} Simulator,id=#{d.udid}" }
219
- elsif Scan.project.mac_app?
224
+ elsif Scan.project && Scan.project.mac_app?
220
225
  Scan.config[:destination] = min_xcode8? ? ["platform=macOS"] : ["platform=OS X"]
221
226
  end
222
227
  end
223
228
 
224
229
  # get deployment target version
225
230
  def self.get_deployment_target_version(deployment_target_key)
226
- Scan.config[:deployment_target_version] || Scan.project.build_settings(key: deployment_target_key) || '0'
231
+ version = Scan.config[:deployment_target_version]
232
+ version ||= Scan.project.build_settings(key: deployment_target_key) if Scan.project
233
+ version ||= 0
234
+
235
+ return version
227
236
  end
228
237
  end
229
238
  end
@@ -23,6 +23,7 @@ module Scan
23
23
  end
24
24
 
25
25
  def building_mac_catalyst_for_mac?
26
+ return false unless Scan.project
26
27
  Scan.project.supports_mac_catalyst? && Scan.config[:catalyst_platform] == "macos"
27
28
  end
28
29
  end
@@ -24,19 +24,30 @@ module Scan
24
24
  v = File.expand_path(value.to_s)
25
25
  UI.user_error!("Workspace file not found at path '#{v}'") unless File.exist?(v)
26
26
  UI.user_error!("Workspace file invalid") unless File.directory?(v)
27
- UI.user_error!("Workspace file is not a workspace, must end with .xcworkspace") unless v.include?(".xcworkspace")
28
27
  end),
29
28
  FastlaneCore::ConfigItem.new(key: :project,
30
29
  short_option: "-p",
31
30
  optional: true,
32
31
  env_name: "SCAN_PROJECT",
33
32
  description: "Path to the project file",
33
+ conflicting_options: [:package_path],
34
34
  verify_block: proc do |value|
35
35
  v = File.expand_path(value.to_s)
36
36
  UI.user_error!("Project file not found at path '#{v}'") unless File.exist?(v)
37
37
  UI.user_error!("Project file invalid") unless File.directory?(v)
38
38
  UI.user_error!("Project file is not a project file, must end with .xcodeproj") unless v.include?(".xcodeproj")
39
39
  end),
40
+ FastlaneCore::ConfigItem.new(key: :package_path,
41
+ short_option: "-P",
42
+ optional: true,
43
+ env_name: "SCAN_PACKAGE_PATH",
44
+ description: "Path to the Swift Package",
45
+ conflicting_options: [:project],
46
+ verify_block: proc do |value|
47
+ v = File.expand_path(value.to_s)
48
+ UI.user_error!("Package path not found at path '#{v}'") unless File.exist?(v)
49
+ UI.user_error!("Package path invalid") unless File.directory?(v)
50
+ end),
40
51
  FastlaneCore::ConfigItem.new(key: :scheme,
41
52
  short_option: "-s",
42
53
  optional: true,
@@ -15,13 +15,25 @@ module Scan
15
15
  end
16
16
 
17
17
  def prefix
18
- ["set -o pipefail &&"]
18
+ prefixes = ["set -o pipefail &&"]
19
+
20
+ package_path = Scan.config[:package_path]
21
+ prefixes << "cd #{package_path} &&" if package_path.to_s != ""
22
+
23
+ prefixes
19
24
  end
20
25
 
21
26
  # Path to the project or workspace as parameter
22
27
  # This will also include the scheme (if given)
23
28
  # @return [Array] The array with all the components to join
24
29
  def project_path_array
30
+ unless Scan.config[:package_path].nil?
31
+ params = []
32
+ params << "-scheme #{Scan.config[:scheme].shellescape}" if Scan.config[:scheme]
33
+ params << "-workspace #{Scan.config[:workspace].shellescape}" if Scan.config[:workspace]
34
+ return params
35
+ end
36
+
25
37
  proj = Scan.project.xcodebuild_parameters
26
38
  return proj if proj.count > 0
27
39
  UI.user_error!("No project/workspace found")
@@ -33,7 +45,7 @@ module Scan
33
45
  options = []
34
46
  options += project_path_array unless config[:xctestrun]
35
47
  options << "-sdk '#{config[:sdk]}'" if config[:sdk]
36
- options << destination # generated in `detect_values`
48
+ options << destination if destination # generated in `detect_values`
37
49
  options << "-toolchain '#{config[:toolchain]}'" if config[:toolchain]
38
50
  if config[:derived_data_path] && !options.include?("-derivedDataPath #{config[:derived_data_path].shellescape}")
39
51
  options << "-derivedDataPath #{config[:derived_data_path].shellescape}"
@@ -136,7 +148,15 @@ module Scan
136
148
 
137
149
  # Store the raw file
138
150
  def xcodebuild_log_path
139
- file_name = "#{Scan.config[:app_name] || Scan.project.app_name}-#{Scan.config[:scheme]}.log"
151
+ parts = []
152
+ if Scan.config[:app_name]
153
+ parts << Scan.config[:app_name]
154
+ elsif Scan.project
155
+ parts << Scan.project.app_name
156
+ end
157
+ parts << Scan.config[:scheme] if Scan.config[:scheme]
158
+
159
+ file_name = "#{parts.join('-')}.log"
140
160
  containing = File.expand_path(Scan.config[:buildlog_path])
141
161
  FileUtils.mkdir_p(containing)
142
162
 
@@ -168,11 +188,14 @@ module Scan
168
188
  attempt = retry_count > 0 ? "-#{retry_count}" : ""
169
189
  ext = FastlaneCore::Helper.xcode_version.to_i >= 11 ? '.xcresult' : '.test_result'
170
190
  path = File.join(Scan.config[:output_directory], Scan.config[:scheme]) + attempt + ext
171
- if File.directory?(path)
172
- FileUtils.remove_dir(path)
173
- end
191
+
174
192
  Scan.cache[:result_bundle_path] = path
175
193
 
194
+ # The result bundle path will be in the package path directory if specified
195
+ delete_path = path
196
+ delete_path = File.join(Scan.config[:package_path], path) if Scan.config[:package_path].to_s != ""
197
+ FileUtils.remove_dir(delete_path) if File.directory?(delete_path)
198
+
176
199
  return path
177
200
  end
178
201
  end
@@ -162,7 +162,13 @@ module Supply
162
162
  def commit_current_edit!
163
163
  ensure_active_edit!
164
164
 
165
- call_google_api { client.commit_edit(current_package_name, current_edit.id) }
165
+ call_google_api do
166
+ client.commit_edit(
167
+ current_package_name,
168
+ current_edit.id,
169
+ changes_not_sent_for_review: Supply.config[:changes_not_sent_for_review]
170
+ )
171
+ end
166
172
 
167
173
  self.current_edit = nil
168
174
  self.current_package_name = nil
@@ -281,6 +281,11 @@ module Supply
281
281
  UI.user_error!("Version code '#{version_code}' is not an integer") if version_code == 0
282
282
  end
283
283
  end),
284
+ FastlaneCore::ConfigItem.new(key: :changes_not_sent_for_review,
285
+ env_name: "SUPPLY_CHANGES_NOT_SENT_FOR_REVIEW",
286
+ description: "Indicates that the changes in this edit will not be reviewed until they are explicitly sent for review from the Google Play Console UI",
287
+ type: Boolean,
288
+ default_value: false),
284
289
  FastlaneCore::ConfigItem.new(key: :in_app_update_priority,
285
290
  env_name: "SUPPLY_IN_APP_UPDATE_PRIORITY",
286
291
  optional: true,
metadata CHANGED
@@ -1,38 +1,38 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.188.0
4
+ version: 2.189.0
5
5
  platform: ruby
6
6
  authors:
7
- - Roger Oba
8
- - Joshua Liebowitz
9
- - Jorge Revuelta H
10
- - Felix Krause
11
- - Josh Holtz
7
+ - Jan Piotrowski
8
+ - Aaron Brager
9
+ - Iulian Onofrei
10
+ - Satoshi Namai
12
11
  - Andrew McBurney
13
- - Maksym Grebenets
14
- - Matthew Ellis
15
12
  - Max Ott
16
- - Manish Rathi
13
+ - Jimmy Dee
14
+ - Josh Holtz
15
+ - Daniel Jankowski
16
+ - Danielle Tomlinson
17
+ - Joshua Liebowitz
18
+ - Matthew Ellis
19
+ - Manu Wallner
17
20
  - Kohki Miki
21
+ - Jorge Revuelta H
18
22
  - Olivier Halligon
19
- - Stefan Natchev
20
- - Satoshi Namai
21
- - Fumiya Nakamura
23
+ - Manish Rathi
22
24
  - Luka Mirosevic
23
- - Aaron Brager
24
- - Jimmy Dee
25
- - Manu Wallner
26
- - Danielle Tomlinson
27
- - Daniel Jankowski
25
+ - Felix Krause
26
+ - Maksym Grebenets
28
27
  - Helmut Januschka
29
- - Jan Piotrowski
30
- - Iulian Onofrei
31
28
  - Jérôme Lacoste
29
+ - Stefan Natchev
30
+ - Roger Oba
31
+ - Fumiya Nakamura
32
32
  autorequire:
33
33
  bindir: bin
34
34
  cert_chain: []
35
- date: 2021-07-22 00:00:00.000000000 Z
35
+ date: 2021-07-28 00:00:00.000000000 Z
36
36
  dependencies:
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: xcodeproj
@@ -604,14 +604,14 @@ dependencies:
604
604
  requirements:
605
605
  - - "~>"
606
606
  - !ruby/object:Gem::Version
607
- version: '0.1'
607
+ version: '0.3'
608
608
  type: :runtime
609
609
  prerelease: false
610
610
  version_requirements: !ruby/object:Gem::Requirement
611
611
  requirements:
612
612
  - - "~>"
613
613
  - !ruby/object:Gem::Version
614
- version: '0.1'
614
+ version: '0.3'
615
615
  - !ruby/object:Gem::Dependency
616
616
  name: google-cloud-storage
617
617
  requirement: !ruby/object:Gem::Requirement
@@ -1640,7 +1640,6 @@ files:
1640
1640
  - spaceship/lib/spaceship/connect_api/client.rb
1641
1641
  - spaceship/lib/spaceship/connect_api/file_uploader.rb
1642
1642
  - spaceship/lib/spaceship/connect_api/model.rb
1643
- - spaceship/lib/spaceship/connect_api/models/.bundle_id.rb.swp
1644
1643
  - spaceship/lib/spaceship/connect_api/models/age_rating_declaration.rb
1645
1644
  - spaceship/lib/spaceship/connect_api/models/app.rb
1646
1645
  - spaceship/lib/spaceship/connect_api/models/app_category.rb
@@ -1716,7 +1715,6 @@ files:
1716
1715
  - spaceship/lib/spaceship/launcher.rb
1717
1716
  - spaceship/lib/spaceship/module.rb
1718
1717
  - spaceship/lib/spaceship/playground.rb
1719
- - spaceship/lib/spaceship/portal/.app.rb.swp
1720
1718
  - spaceship/lib/spaceship/portal/app.rb
1721
1719
  - spaceship/lib/spaceship/portal/app_group.rb
1722
1720
  - spaceship/lib/spaceship/portal/app_service.rb