fastlane 2.69.3 → 2.70.0.beta.20171213010003
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/fastlane/lib/assets/DefaultFastfileTemplate +2 -2
- data/fastlane/lib/assets/DefaultFastfileTemplate.swift +10 -9
- data/fastlane/lib/fastlane/actions/sync_code_signing.rb +1 -1
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/fastlane_core/lib/fastlane_core/core_ext/cfpropertylist.rb +1 -1
- data/gym/lib/gym/generators/package_command_generator_xcode7.rb +3 -2
- data/match/lib/match/encrypt.rb +0 -12
- data/match/lib/match/options.rb +1 -2
- metadata +17 -50
- data/fastlane/lib/fastlane/.DS_Store +0 -0
- data/fastlane/swift/Appfile.swift +0 -17
- data/fastlane/swift/ArgumentProcessor.swift +0 -72
- data/fastlane/swift/Deliverfile.swift +0 -14
- data/fastlane/swift/DeliverfileProtocol.swift +0 -118
- data/fastlane/swift/Fastfile.swift +0 -12
- data/fastlane/swift/Fastlane.swift +0 -3739
- data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.pbxproj +0 -409
- data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
- data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/xcuserdata/liebowitz.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/xcshareddata/xcschemes/FastlaneRunner.xcscheme +0 -103
- data/fastlane/swift/Gymfile.swift +0 -14
- data/fastlane/swift/GymfileProtocol.swift +0 -86
- data/fastlane/swift/LaneFileProtocol.swift +0 -103
- data/fastlane/swift/Matchfile.swift +0 -14
- data/fastlane/swift/MatchfileProtocol.swift +0 -54
- data/fastlane/swift/Precheckfile.swift +0 -14
- data/fastlane/swift/PrecheckfileProtocol.swift +0 -24
- data/fastlane/swift/RubyCommand.swift +0 -138
- data/fastlane/swift/Runner.swift +0 -190
- data/fastlane/swift/RunnerArgument.swift +0 -18
- data/fastlane/swift/Scanfile.swift +0 -14
- data/fastlane/swift/ScanfileProtocol.swift +0 -88
- data/fastlane/swift/Screengrabfile.swift +0 -14
- data/fastlane/swift/ScreengrabfileProtocol.swift +0 -48
- data/fastlane/swift/Snapshotfile.swift +0 -14
- data/fastlane/swift/SnapshotfileProtocol.swift +0 -70
- data/fastlane/swift/SocketClient.swift +0 -283
- data/fastlane/swift/SocketClientDelegateProtocol.swift +0 -19
- data/fastlane/swift/SocketResponse.swift +0 -74
- data/fastlane/swift/main.swift +0 -43
- data/precheck/lib/.DS_Store +0 -0
@@ -1,14 +0,0 @@
|
|
1
|
-
// This class is automatically included in FastlaneRunner during build
|
2
|
-
|
3
|
-
// This autogenerated file will be overwritten or replaced during build time, or when you initialize `gym`
|
4
|
-
class Gymfile: GymfileProtocol {
|
5
|
-
// If you want to enable `gym`, run `fastlane gym init`
|
6
|
-
// After, this file will be replaced with a custom implementation that contains values you supplied
|
7
|
-
// during the `init` process, and you won't see this message
|
8
|
-
}
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
// Generated with fastlane 2.69.2
|
@@ -1,86 +0,0 @@
|
|
1
|
-
protocol GymfileProtocol: class {
|
2
|
-
var workspace: String? { get }
|
3
|
-
var project: String? { get }
|
4
|
-
var scheme: String? { get }
|
5
|
-
var clean: Bool { get }
|
6
|
-
var outputDirectory: String { get }
|
7
|
-
var outputName: String? { get }
|
8
|
-
var configuration: String? { get }
|
9
|
-
var silent: Bool { get }
|
10
|
-
var codesigningIdentity: String? { get }
|
11
|
-
var skipPackageIpa: Bool { get }
|
12
|
-
var includeSymbols: Bool? { get }
|
13
|
-
var includeBitcode: Bool? { get }
|
14
|
-
var exportMethod: String? { get }
|
15
|
-
var exportOptions: [String : Any]? { get }
|
16
|
-
var exportXcargs: String? { get }
|
17
|
-
var skipBuildArchive: Bool? { get }
|
18
|
-
var skipArchive: Bool? { get }
|
19
|
-
var buildPath: String? { get }
|
20
|
-
var archivePath: String? { get }
|
21
|
-
var derivedDataPath: String? { get }
|
22
|
-
var resultBundle: String? { get }
|
23
|
-
var buildlogPath: String { get }
|
24
|
-
var sdk: String? { get }
|
25
|
-
var toolchain: String? { get }
|
26
|
-
var destination: String? { get }
|
27
|
-
var exportTeamId: String? { get }
|
28
|
-
var xcargs: String? { get }
|
29
|
-
var xcconfig: String? { get }
|
30
|
-
var suppressXcodeOutput: String? { get }
|
31
|
-
var disableXcpretty: String? { get }
|
32
|
-
var xcprettyTestFormat: String? { get }
|
33
|
-
var xcprettyFormatter: String? { get }
|
34
|
-
var xcprettyReportJunit: String? { get }
|
35
|
-
var xcprettyReportHtml: String? { get }
|
36
|
-
var xcprettyReportJson: String? { get }
|
37
|
-
var analyzeBuildTime: String? { get }
|
38
|
-
var xcprettyUtf: String? { get }
|
39
|
-
var skipProfileDetection: Bool { get }
|
40
|
-
}
|
41
|
-
|
42
|
-
extension GymfileProtocol {
|
43
|
-
var workspace: String? { return nil }
|
44
|
-
var project: String? { return nil }
|
45
|
-
var scheme: String? { return nil }
|
46
|
-
var clean: Bool { return false }
|
47
|
-
var outputDirectory: String { return "." }
|
48
|
-
var outputName: String? { return nil }
|
49
|
-
var configuration: String? { return nil }
|
50
|
-
var silent: Bool { return false }
|
51
|
-
var codesigningIdentity: String? { return nil }
|
52
|
-
var skipPackageIpa: Bool { return false }
|
53
|
-
var includeSymbols: Bool? { return nil }
|
54
|
-
var includeBitcode: Bool? { return nil }
|
55
|
-
var exportMethod: String? { return nil }
|
56
|
-
var exportOptions: [String : Any]? { return nil }
|
57
|
-
var exportXcargs: String? { return nil }
|
58
|
-
var skipBuildArchive: Bool? { return nil }
|
59
|
-
var skipArchive: Bool? { return nil }
|
60
|
-
var buildPath: String? { return nil }
|
61
|
-
var archivePath: String? { return nil }
|
62
|
-
var derivedDataPath: String? { return nil }
|
63
|
-
var resultBundle: String? { return nil }
|
64
|
-
var buildlogPath: String { return "~/Library/Logs/gym" }
|
65
|
-
var sdk: String? { return nil }
|
66
|
-
var toolchain: String? { return nil }
|
67
|
-
var destination: String? { return nil }
|
68
|
-
var exportTeamId: String? { return nil }
|
69
|
-
var xcargs: String? { return nil }
|
70
|
-
var xcconfig: String? { return nil }
|
71
|
-
var suppressXcodeOutput: String? { return nil }
|
72
|
-
var disableXcpretty: String? { return nil }
|
73
|
-
var xcprettyTestFormat: String? { return nil }
|
74
|
-
var xcprettyFormatter: String? { return nil }
|
75
|
-
var xcprettyReportJunit: String? { return nil }
|
76
|
-
var xcprettyReportHtml: String? { return nil }
|
77
|
-
var xcprettyReportJson: String? { return nil }
|
78
|
-
var analyzeBuildTime: String? { return nil }
|
79
|
-
var xcprettyUtf: String? { return nil }
|
80
|
-
var skipProfileDetection: Bool { return false }
|
81
|
-
}
|
82
|
-
|
83
|
-
|
84
|
-
// Please don't remove the lines below
|
85
|
-
// They are used to detect outdated files
|
86
|
-
// FastlaneRunnerAPIVersion [0.9.1]
|
@@ -1,103 +0,0 @@
|
|
1
|
-
//
|
2
|
-
// LaneFileProtocol.swift
|
3
|
-
// FastlaneSwiftRunner
|
4
|
-
//
|
5
|
-
// Created by Joshua Liebowitz on 8/4/17.
|
6
|
-
// Copyright © 2017 Joshua Liebowitz. All rights reserved.
|
7
|
-
//
|
8
|
-
|
9
|
-
import Foundation
|
10
|
-
|
11
|
-
public protocol LaneFileProtocol: class {
|
12
|
-
var fastlaneVersion: String { get }
|
13
|
-
static func runLane(named: String)
|
14
|
-
|
15
|
-
func recordLaneDescriptions()
|
16
|
-
func beforeAll()
|
17
|
-
func afterAll(currentLane: String)
|
18
|
-
func onError(currentLane: String, errorInfo: String)
|
19
|
-
}
|
20
|
-
|
21
|
-
public extension LaneFileProtocol {
|
22
|
-
var fastlaneVersion: String { return "" } // default "" because that means any is fine
|
23
|
-
func beforeAll() { } // no op by default
|
24
|
-
func afterAll(currentLane: String) { } // no op by default
|
25
|
-
func onError(currentLane: String, errorInfo: String) {} // no op by default
|
26
|
-
func recordLaneDescriptions() { } // no op by default
|
27
|
-
}
|
28
|
-
|
29
|
-
@objcMembers
|
30
|
-
public class LaneFile: NSObject, LaneFileProtocol {
|
31
|
-
private(set) static var fastfileInstance: Fastfile?
|
32
|
-
|
33
|
-
// Called before any lane is executed.
|
34
|
-
private func setupAllTheThings() {
|
35
|
-
// Step 1, add lange descriptions
|
36
|
-
(self as! Fastfile).recordLaneDescriptions()
|
37
|
-
|
38
|
-
// Step 2, run beforeAll() function
|
39
|
-
LaneFile.fastfileInstance!.beforeAll()
|
40
|
-
}
|
41
|
-
|
42
|
-
public static var lanes: [String : String] {
|
43
|
-
var laneToMethodName: [String : String] = [:]
|
44
|
-
var methodCount: UInt32 = 0
|
45
|
-
let methodList = class_copyMethodList(self, &methodCount)
|
46
|
-
for i in 0..<Int(methodCount) {
|
47
|
-
let selName = sel_getName(method_getName(methodList![i]))
|
48
|
-
let name = String(cString: selName)
|
49
|
-
let lowercasedName = name.lowercased()
|
50
|
-
guard lowercasedName.hasSuffix("lane") else {
|
51
|
-
continue
|
52
|
-
}
|
53
|
-
|
54
|
-
laneToMethodName[lowercasedName] = name
|
55
|
-
let lowercasedNameNoLane = String(lowercasedName.prefix(lowercasedName.count - 4))
|
56
|
-
laneToMethodName[lowercasedNameNoLane] = name
|
57
|
-
}
|
58
|
-
return laneToMethodName
|
59
|
-
}
|
60
|
-
|
61
|
-
public static func loadFastfile() {
|
62
|
-
if self.fastfileInstance == nil {
|
63
|
-
let fastfileType: AnyObject.Type = NSClassFromString(self.className())!
|
64
|
-
let fastfileAsNSObjectType: NSObject.Type = fastfileType as! NSObject.Type
|
65
|
-
let currentFastfileInstance: Fastfile? = fastfileAsNSObjectType.init() as? Fastfile
|
66
|
-
self.fastfileInstance = currentFastfileInstance
|
67
|
-
}
|
68
|
-
}
|
69
|
-
|
70
|
-
public static func runLane(named: String) {
|
71
|
-
log(message: "Running lane: \(named)")
|
72
|
-
self.loadFastfile()
|
73
|
-
|
74
|
-
guard let fastfileInstance: Fastfile = self.fastfileInstance else {
|
75
|
-
let message = "Unable to instantiate class named: \(self.className())"
|
76
|
-
log(message: message)
|
77
|
-
fatalError(message)
|
78
|
-
}
|
79
|
-
|
80
|
-
// call all methods that need to be called before we start calling lanes
|
81
|
-
fastfileInstance.setupAllTheThings()
|
82
|
-
|
83
|
-
let currentLanes = self.lanes
|
84
|
-
let lowerCasedLaneRequested = named.lowercased()
|
85
|
-
|
86
|
-
guard let laneMethod = currentLanes[lowerCasedLaneRequested] else {
|
87
|
-
let message = "unable to find lane named: \(named)"
|
88
|
-
log(message: message)
|
89
|
-
fatalError(message)
|
90
|
-
}
|
91
|
-
|
92
|
-
// We need to catch all possible errors here and display a nice message
|
93
|
-
_ = fastfileInstance.perform(NSSelectorFromString(laneMethod))
|
94
|
-
|
95
|
-
// only call on success
|
96
|
-
fastfileInstance.afterAll(currentLane: named)
|
97
|
-
log(message: "Done running lane: \(named) 🚀")
|
98
|
-
}
|
99
|
-
}
|
100
|
-
|
101
|
-
// Please don't remove the lines below
|
102
|
-
// They are used to detect outdated files
|
103
|
-
// FastlaneRunnerAPIVersion [0.9.1]
|
@@ -1,14 +0,0 @@
|
|
1
|
-
// This class is automatically included in FastlaneRunner during build
|
2
|
-
|
3
|
-
// This autogenerated file will be overwritten or replaced during build time, or when you initialize `match`
|
4
|
-
class Matchfile: MatchfileProtocol {
|
5
|
-
// If you want to enable `match`, run `fastlane match init`
|
6
|
-
// After, this file will be replaced with a custom implementation that contains values you supplied
|
7
|
-
// during the `init` process, and you won't see this message
|
8
|
-
}
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
// Generated with fastlane 2.69.2
|
@@ -1,54 +0,0 @@
|
|
1
|
-
protocol MatchfileProtocol: class {
|
2
|
-
var gitUrl: String { get }
|
3
|
-
var gitBranch: String { get }
|
4
|
-
var type: String { get }
|
5
|
-
var appIdentifier: [String] { get }
|
6
|
-
var username: String { get }
|
7
|
-
var keychainName: String { get }
|
8
|
-
var keychainPassword: String? { get }
|
9
|
-
var readonly: Bool { get }
|
10
|
-
var teamId: String? { get }
|
11
|
-
var gitFullName: String? { get }
|
12
|
-
var gitUserEmail: String? { get }
|
13
|
-
var teamName: String? { get }
|
14
|
-
var verbose: Bool { get }
|
15
|
-
var force: Bool { get }
|
16
|
-
var skipConfirmation: Bool { get }
|
17
|
-
var shallowClone: Bool { get }
|
18
|
-
var cloneBranchDirectly: Bool { get }
|
19
|
-
var workspace: String? { get }
|
20
|
-
var forceForNewDevices: Bool { get }
|
21
|
-
var skipDocs: Bool { get }
|
22
|
-
var platform: String { get }
|
23
|
-
var templateName: String? { get }
|
24
|
-
}
|
25
|
-
|
26
|
-
extension MatchfileProtocol {
|
27
|
-
var gitUrl: String { return "" }
|
28
|
-
var gitBranch: String { return "master" }
|
29
|
-
var type: String { return "development" }
|
30
|
-
var appIdentifier: [String] { return [] }
|
31
|
-
var username: String { return "" }
|
32
|
-
var keychainName: String { return "login.keychain" }
|
33
|
-
var keychainPassword: String? { return nil }
|
34
|
-
var readonly: Bool { return false }
|
35
|
-
var teamId: String? { return nil }
|
36
|
-
var gitFullName: String? { return nil }
|
37
|
-
var gitUserEmail: String? { return nil }
|
38
|
-
var teamName: String? { return nil }
|
39
|
-
var verbose: Bool { return false }
|
40
|
-
var force: Bool { return false }
|
41
|
-
var skipConfirmation: Bool { return false }
|
42
|
-
var shallowClone: Bool { return false }
|
43
|
-
var cloneBranchDirectly: Bool { return false }
|
44
|
-
var workspace: String? { return nil }
|
45
|
-
var forceForNewDevices: Bool { return false }
|
46
|
-
var skipDocs: Bool { return false }
|
47
|
-
var platform: String { return "ios" }
|
48
|
-
var templateName: String? { return nil }
|
49
|
-
}
|
50
|
-
|
51
|
-
|
52
|
-
// Please don't remove the lines below
|
53
|
-
// They are used to detect outdated files
|
54
|
-
// FastlaneRunnerAPIVersion [0.9.1]
|
@@ -1,14 +0,0 @@
|
|
1
|
-
// This class is automatically included in FastlaneRunner during build
|
2
|
-
|
3
|
-
// This autogenerated file will be overwritten or replaced during build time, or when you initialize `precheck`
|
4
|
-
class Precheckfile: PrecheckfileProtocol {
|
5
|
-
// If you want to enable `precheck`, run `fastlane precheck init`
|
6
|
-
// After, this file will be replaced with a custom implementation that contains values you supplied
|
7
|
-
// during the `init` process, and you won't see this message
|
8
|
-
}
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
// Generated with fastlane 2.69.2
|
@@ -1,24 +0,0 @@
|
|
1
|
-
protocol PrecheckfileProtocol: class {
|
2
|
-
var appIdentifier: String { get }
|
3
|
-
var username: String { get }
|
4
|
-
var teamId: String? { get }
|
5
|
-
var teamName: String? { get }
|
6
|
-
var defaultRuleLevel: String { get }
|
7
|
-
var includeInAppPurchases: Bool { get }
|
8
|
-
var freeStuffInIap: String? { get }
|
9
|
-
}
|
10
|
-
|
11
|
-
extension PrecheckfileProtocol {
|
12
|
-
var appIdentifier: String { return "" }
|
13
|
-
var username: String { return "" }
|
14
|
-
var teamId: String? { return nil }
|
15
|
-
var teamName: String? { return nil }
|
16
|
-
var defaultRuleLevel: String { return "error" }
|
17
|
-
var includeInAppPurchases: Bool { return true }
|
18
|
-
var freeStuffInIap: String? { return nil }
|
19
|
-
}
|
20
|
-
|
21
|
-
|
22
|
-
// Please don't remove the lines below
|
23
|
-
// They are used to detect outdated files
|
24
|
-
// FastlaneRunnerAPIVersion [0.9.1]
|
@@ -1,138 +0,0 @@
|
|
1
|
-
//
|
2
|
-
// RubyCommand.swift
|
3
|
-
// FastlaneSwiftRunner
|
4
|
-
//
|
5
|
-
// Created by Joshua Liebowitz on 8/4/17.
|
6
|
-
// Copyright © 2017 Joshua Liebowitz. All rights reserved.
|
7
|
-
//
|
8
|
-
|
9
|
-
import Foundation
|
10
|
-
|
11
|
-
protocol RubyCommandable {
|
12
|
-
var json: String { get }
|
13
|
-
}
|
14
|
-
|
15
|
-
struct RubyCommand: RubyCommandable {
|
16
|
-
struct Argument {
|
17
|
-
enum ArgType {
|
18
|
-
case stringClosure
|
19
|
-
|
20
|
-
var typeString: String {
|
21
|
-
switch self {
|
22
|
-
case .stringClosure:
|
23
|
-
return "string_closure" // this should match when is in ruby's SocketServerActionCommandExecutor
|
24
|
-
}
|
25
|
-
}
|
26
|
-
}
|
27
|
-
|
28
|
-
let name: String
|
29
|
-
let value: Any?
|
30
|
-
let type: ArgType?
|
31
|
-
|
32
|
-
init(name: String, value: Any?, type: ArgType? = nil) {
|
33
|
-
self.name = name
|
34
|
-
self.value = value
|
35
|
-
self.type = type
|
36
|
-
}
|
37
|
-
|
38
|
-
var hasValue: Bool {
|
39
|
-
return nil != self.value
|
40
|
-
}
|
41
|
-
|
42
|
-
var json: String {
|
43
|
-
get {
|
44
|
-
|
45
|
-
if let someValue = value {
|
46
|
-
let typeJson: String
|
47
|
-
if let type = type {
|
48
|
-
typeJson = ", \"value_type\" : \"\(type.typeString)\""
|
49
|
-
}else {
|
50
|
-
typeJson = ""
|
51
|
-
}
|
52
|
-
|
53
|
-
if type == .stringClosure {
|
54
|
-
return "{\"name\" : \"\(name)\", \"value\" : \"ignored_for_closure\"\(typeJson)}"
|
55
|
-
} else if let array = someValue as? [String] {
|
56
|
-
return "{\"name\" : \"\(name)\", \"value\" : \"\(array.joined(separator: ","))\"\(typeJson)}"
|
57
|
-
} else if let hash = someValue as? [String : Any] {
|
58
|
-
let jsonData = try! JSONSerialization.data(withJSONObject: hash, options: [])
|
59
|
-
let jsonString = String(data: jsonData, encoding: .utf8)!
|
60
|
-
return "{\"name\" : \"\(name)\", \"value\" : \(jsonString)\(typeJson)}"
|
61
|
-
} else {
|
62
|
-
let dictionary = [
|
63
|
-
"name": name,
|
64
|
-
"value": someValue
|
65
|
-
]
|
66
|
-
let jsonData = try! JSONSerialization.data(withJSONObject: dictionary, options: [])
|
67
|
-
let jsonString = String(data: jsonData, encoding: .utf8)!
|
68
|
-
return jsonString
|
69
|
-
}
|
70
|
-
} else {
|
71
|
-
// Just exclude this arg if it doesn't have a value
|
72
|
-
return ""
|
73
|
-
}
|
74
|
-
}
|
75
|
-
}
|
76
|
-
}
|
77
|
-
|
78
|
-
let commandID: String
|
79
|
-
let methodName: String
|
80
|
-
let className: String?
|
81
|
-
let args: [Argument]
|
82
|
-
|
83
|
-
func performCallback(callbackArg: String) {
|
84
|
-
// WARNING: This will perform the first callback it receives
|
85
|
-
let callbacks = self.args.filter { ($0.type != nil) && $0.type == .stringClosure }
|
86
|
-
guard let callback = callbacks.first else {
|
87
|
-
verbose(message: "received call to performCallback with \(callbackArg), but no callback available to perform")
|
88
|
-
return
|
89
|
-
}
|
90
|
-
|
91
|
-
guard let callbackArgValue = callback.value else {
|
92
|
-
verbose(message: "received call to performCallback with \(callbackArg), but callback is nil")
|
93
|
-
return
|
94
|
-
}
|
95
|
-
|
96
|
-
guard let callbackClosure = callbackArgValue as? ((String) -> Void) else {
|
97
|
-
verbose(message: "received call to performCallback with \(callbackArg), but callback type is unknown \(callbackArgValue.self)")
|
98
|
-
return
|
99
|
-
}
|
100
|
-
|
101
|
-
print("Performing callback with: \(callbackArg)")
|
102
|
-
callbackClosure(callbackArg)
|
103
|
-
}
|
104
|
-
|
105
|
-
var json: String {
|
106
|
-
let argsArrayJson = self.args
|
107
|
-
.map { $0.json }
|
108
|
-
.filter { $0 != "" }
|
109
|
-
|
110
|
-
let argsJson: String?
|
111
|
-
if argsArrayJson.count > 0 {
|
112
|
-
argsJson = "\"args\" : [\(argsArrayJson.joined(separator: ","))]"
|
113
|
-
} else {
|
114
|
-
argsJson = nil
|
115
|
-
}
|
116
|
-
|
117
|
-
let commandIDJson = "\"commandID\" : \"\(commandID)\""
|
118
|
-
let methodNameJson = "\"methodName\" : \"\(methodName)\""
|
119
|
-
|
120
|
-
var jsonParts = [commandIDJson, methodNameJson]
|
121
|
-
if let argsJson = argsJson {
|
122
|
-
jsonParts.append(argsJson)
|
123
|
-
}
|
124
|
-
|
125
|
-
if let className = className {
|
126
|
-
let classNameJson = "\"className\" : \"\(className)\""
|
127
|
-
jsonParts.append(classNameJson)
|
128
|
-
}
|
129
|
-
|
130
|
-
let commandJsonString = "{\(jsonParts.joined(separator: ","))}"
|
131
|
-
|
132
|
-
return commandJsonString
|
133
|
-
}
|
134
|
-
}
|
135
|
-
|
136
|
-
// Please don't remove the lines below
|
137
|
-
// They are used to detect outdated files
|
138
|
-
// FastlaneRunnerAPIVersion [0.9.1]
|