Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions Sources/VariantsCore/Schemas/Android/AndroidConfiguration.swift
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,47 @@ public struct AndroidConfiguration: Codable {
case signing = "signing"
case custom = "custom"
}

public init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
let variants = try container.decode([String: UnnamedAndroidVariant].self, forKey: .variants)

var definiteVariants: [AndroidVariant] = []
variants.forEach({ (name, variant) in
definiteVariants.append(
AndroidVariant(name: name,
versionName: variant.versionName,
versionCode: variant.versionCode,
idSuffix: variant.idSuffix,
taskBuild: variant.taskBuild,
taskUnitTest: variant.taskUnitTest,
taskUitest: variant.taskUitest,
custom: variant.custom,
store_destination: variant.store_destination)
)
})

self.path = try container.decode(String.self, forKey: .path)
self.appName = try container.decode(String.self, forKey: .appName)
self.appIdentifier = try container.decode(String.self, forKey: .appIdentifier)
self.variants = definiteVariants
self.signing = try container.decode(AndroidSigning.self, forKey: .signing)
self.custom = try? container.decode([CustomProperty].self, forKey: .custom)
}

public init(
path: String,
appName: String,
appIdentifier: String,
variants: [AndroidVariant],
signing: AndroidSigning?,
custom: [CustomProperty]?
) {
self.path = path
self.appName = appName
self.appIdentifier = appIdentifier
self.variants = variants
self.signing = signing
self.custom = custom
}
}
26 changes: 26 additions & 0 deletions Sources/VariantsCore/Schemas/Android/AndroidVariant.swift
Original file line number Diff line number Diff line change
Expand Up @@ -69,3 +69,29 @@ extension AndroidVariant {
case playStore = "playstore"
}
}

/*
* Used by `AndroidConfiguration` decode variant from YAML spec
* as dictionary `[String: UnnamedAndroidVariant]` and expose array `[AndroidVariant]`.
*/
struct UnnamedAndroidVariant: Codable {
let versionName: String
let versionCode: String
let idSuffix: String?
let taskBuild: String
let taskUnitTest: String
let taskUitest: String
let custom: [CustomProperty]?
internal let store_destination: String?

enum CodingKeys: String, CodingKey {
case versionName = "version_name"
case versionCode = "version_code"
case idSuffix = "id_suffix"
case taskBuild = "task_build"
case taskUnitTest = "task_unittest"
case taskUitest = "task_uitest"
case custom = "custom"
case store_destination
}
}
11 changes: 6 additions & 5 deletions Sources/VariantsCore/Schemas/iOS/iOSConfiguration.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,10 @@ public struct iOSConfiguration: Codable {

public init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
let variants = try container.decode([iOSVariant].self, forKey: .variants)
let variants = try container.decode([String: UnnamediOSVariant].self, forKey: .variants)
let globalSigning = try? container.decode(iOSSigning.self, forKey: .signing)

guard globalSigning != nil || variants.filter({ $0.signing == nil }).isEmpty else {
guard globalSigning != nil || variants.map(\.value).filter({ $0.signing == nil }).isEmpty else {
throw RuntimeError(
"""
At least one variant doesn't contain a 'signing' configuration.
Expand All @@ -34,7 +34,8 @@ public struct iOSConfiguration: Codable {
}

var definiteVariants: [iOSVariant] = []
try variants.forEach { variant in

try variants.forEach({ (name, variant) in
var signing = globalSigning

if let variantSigning = variant.signing {
Expand All @@ -44,7 +45,7 @@ public struct iOSConfiguration: Codable {
}

definiteVariants.append(
iOSVariant(name: variant.name,
iOSVariant(name: name,
app_icon: variant.app_icon,
id_suffix: variant.id_suffix,
version_name: variant.version_name,
Expand All @@ -53,7 +54,7 @@ public struct iOSConfiguration: Codable {
custom: variant.custom,
store_destination: variant.store_destination)
)
}
})

self.xcodeproj = try container.decode(String.self, forKey: .xcodeproj)
self.targets = try container.decode([String: iOSTarget].self, forKey: .targets)
Expand Down
14 changes: 14 additions & 0 deletions Sources/VariantsCore/Schemas/iOS/iOSVariant.swift
Original file line number Diff line number Diff line change
Expand Up @@ -77,3 +77,17 @@ extension iOSVariant {
case testFlight = "testflight"
}
}

/*
* Used by `iOSConfiguration` decode variant from YAML spec
* as dictionary `[String: UnnamediOSVariant]` and expose array `[iOSVariant]`.
*/
struct UnnamediOSVariant: Codable {
let app_icon: String?
let id_suffix: String?
let version_name: String
let version_number: Int
let signing: iOSSigning?
let custom: [CustomProperty]?
internal let store_destination: String?
}
10 changes: 6 additions & 4 deletions Templates/android/variants-template.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ android:
app_name: {{ APP_NAME }}
app_identifier: {{ APP_IDENTIFIER }}
variants:
# Default variant is mandatory, do not remove
# Usually regarded as `production` variant.
- name: default
# Default variant is mandatory, do not remove
# Usually regarded as `production` variant.
default:
version_name: 0.0.1
version_code: 1
task_build: bundleProdRelease
Expand All @@ -31,7 +31,9 @@ android:
- name: SAMPLE_PROPERTY
value: "{{ envVars.SAMPLE_ENVIRONMENT_VARIABLE }}"
destination: fastlane
- name: BETA

# Sample variant "BETA"
BETA:
id_suffix: beta
version_name: 0.0.1
version_code: 1
Expand Down
22 changes: 11 additions & 11 deletions Templates/ios/variants-template.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ ios:
info: {{ INFO_PLIST }}
config: {{ SOURCE }}
variants:
# Default variant is mandatory, do not remove
- name: default
# Default variant is mandatory, do not remove
default:
version_name: 0.0.1
version_number: 1
#
Expand Down Expand Up @@ -48,11 +48,11 @@ ios:
- name: SAMPLE_FASTLANE_PROPERTY
value: This will be available to fastlane
destination: fastlane
#
# Sample variant, "beta".
# Only `name` and `id_suffix` are mandatory fields
#
- name: BETA
#
# Sample variant, "beta".
# Only `name` and `id_suffix` are mandatory fields
#
BETA:
id_suffix: beta
# If app_icon isn't specified, the value fallbacks to target.app_icon
app_icon: AppIcon.beta
Expand Down Expand Up @@ -96,7 +96,7 @@ ios:
# Comment or delete section below if necessary.
# ----------------------------------------------------------------------

custom:
- name: SAMPLE_PROPERTY
value: Sample value
destination: project
#custom:
# - name: SAMPLE_PROPERTY
# value: Sample value
# destination: project
2 changes: 1 addition & 1 deletion Tests/VariantsCoreTests/GradleScriptFactoryTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ class GradleScriptFactoryTests: XCTestCase {
}
}
"""

let androidConfiguration = AndroidConfiguration(
path: "projectPath",
appName: "TestApp",
Expand Down
8 changes: 4 additions & 4 deletions Tests/VariantsCoreTests/Resources/invalid_variants.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ android:
app_name: FrankBank
app_identifier: com.backbase.frank
variants:
- name: default
default:
version_name: 0.0.1
version_code: 1
task_build: bundleProdRelease
Expand All @@ -17,7 +17,7 @@ android:
- name: SAMPLE_PROJECT
value: Sample Project Default Config
destination: project
- name: test
test:
id_suffix: dev
task_build: assembleDevelop
task_unittest: testDevDebugUnitTest
Expand Down Expand Up @@ -77,13 +77,13 @@ ios:
info: Sources/Info.plist
config: Sources
variants:
- name: default
default:
version_name: 0.0.1
version_number: 1
custom:
- key: SAMPLE_CONFIG
value: Production Value
- name: BETA
BETA:
id_suffix: beta
app_icon: AppIcon.beta
version_name: 0.0.1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ ios:
info: Sources/Info.plist
config: Sources
variants:
- name: default
default:
version_name: 0.0.1
version_number: 1
signing:
Expand All @@ -26,7 +26,7 @@ ios:
- name: SAMPLE_CONFIG
value: Production Value
destination: project
- name: BETA
BETA:
id_suffix: beta
app_icon: AppIcon.beta
version_name: 0.0.1
Expand All @@ -36,7 +36,7 @@ ios:
- name: SAMPLE_CONFIG
value: BETA Value
destination: fastlane
- name: STG
STG:
id_suffix: staging
version_name: 0.0.1
version_number: 1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ ios:
info: Sources/Info.plist
config: Sources
variants:
- name: default
default:
version_name: 0.0.1
version_number: 1
signing:
Expand All @@ -26,7 +26,7 @@ ios:
- name: SAMPLE_CONFIG
value: Production Value
destination: project
- name: BETA
BETA:
id_suffix: beta
app_icon: AppIcon.beta
version_name: 0.0.1
Expand All @@ -36,7 +36,7 @@ ios:
- name: SAMPLE_CONFIG
value: BETA Value
destination: fastlane
- name: STG
STG:
id_suffix: staging
version_name: 0.0.1
version_number: 1
Expand Down
10 changes: 5 additions & 5 deletions Tests/VariantsCoreTests/Resources/valid_variants.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ android:
app_name: FrankBank
app_identifier: com.backbase.frank
variants:
- name: default
default:
version_name: 0.0.1
version_code: 1
task_build: bundleProdRelease
Expand All @@ -18,7 +18,7 @@ android:
- name: SAMPLE_PROJECT
value: Sample Project Default Config
destination: project
- name: test
test:
id_suffix: dev
version_name: 0.0.1
version_code: 1
Expand Down Expand Up @@ -76,7 +76,7 @@ ios:
info: Sources/Info.plist
config: Sources
variants:
- name: default
default:
version_name: 0.0.1
version_number: 1
signing:
Expand All @@ -88,7 +88,7 @@ ios:
- name: SAMPLE_CONFIG
value: Production Value
destination: project
- name: BETA
BETA:
id_suffix: beta
app_icon: AppIcon.beta
version_name: 0.0.1
Expand All @@ -98,7 +98,7 @@ ios:
- name: SAMPLE_CONFIG
value: BETA Value
destination: fastlane
- name: STG
STG:
id_suffix: staging
version_name: 0.0.1
version_number: 1
Expand Down
14 changes: 7 additions & 7 deletions Tests/VariantsCoreTests/Resources/variants-template.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ ios:
info: {{ INFO_PLIST }}
config: {{ SOURCE }}
variants:
# Default variant is mandatory, do not remove
- name: default
# Default variant is mandatory, do not remove
default:
version_name: 0.0.1
version_number: 1
#
Expand All @@ -31,11 +31,11 @@ ios:
- name: SAMPLE_FASTLANE_PROPERTY
value: This will be available to fastlane
destination: fastlane
#
# Sample variant, "beta".
# Only `name` and `id_suffix` are mandatory fields
#
- name: BETA
#
# Sample variant, "beta".
# Only `name` and `id_suffix` are mandatory fields
#
BETA:
id_suffix: beta
# If app_icon isn't specified, the value fallbacks to target.app_icon
app_icon: AppIcon.beta
Expand Down
4 changes: 2 additions & 2 deletions Tests/VariantsCoreTests/YamlParserTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -170,8 +170,8 @@ class YamlParserTests: XCTestCase {
XCTAssertEqual(configuration.android?.appIdentifier, "com.backbase.frank")
XCTAssertEqual(configuration.android?.path, ".")
XCTAssertEqual(configuration.android?.variants.count, 2)
XCTAssertEqual(configuration.android?.variants.first?.name, "default")
XCTAssertEqual(configuration.android?.variants.last?.name, "test")
XCTAssertTrue(((configuration.android?.variants.map(\.name).contains("default")) != nil))
XCTAssertTrue(((configuration.android?.variants.map(\.name).contains("test")) != nil))

let customConfigDefault = configuration.android?
.variants.first(where: { $0.name == "default" })?
Expand Down
Loading