From fa7d4024e378f28fdf96d0c51da031c22dc2ff48 Mon Sep 17 00:00:00 2001 From: Scott Hoyt Date: Sat, 2 Jan 2016 14:57:49 -0800 Subject: [PATCH] Switched Configurable rule to a failable initializer that takes AnyObject. --- .../Models/Configuration.swift | 9 ++++- .../SwiftLintFramework/Protocols/Rule.swift | 9 ++--- .../SwiftLintFrameworkTests/RuleTests.swift | 39 ++++++++----------- 3 files changed, 27 insertions(+), 30 deletions(-) diff --git a/Source/SwiftLintFramework/Models/Configuration.swift b/Source/SwiftLintFramework/Models/Configuration.swift index 9c40e4097..f8516d3de 100644 --- a/Source/SwiftLintFramework/Models/Configuration.swift +++ b/Source/SwiftLintFramework/Models/Configuration.swift @@ -122,10 +122,15 @@ public struct Configuration: Equatable { static func rulesFromDict(dict: [String: AnyObject]? = nil, ruleList: RuleList = masterRuleList) -> [Rule] { var rules = [Rule]() for rule in ruleList.list.values { + let identifier = rule.description.identifier if rule is ConfigurableRule.Type, - let ruleConfig = dict?[rule.description.identifier] { + let ruleConfig = dict?[identifier] { // swiftlint:disable force_cast - rules.append((rule as! ConfigurableRule.Type).init(config: [rule.description.identifier: ruleConfig])) + if let configuredRule = (rule as! ConfigurableRule.Type).init(config: ruleConfig) { + rules.append(configuredRule) + } else { + queuedPrintError("Invalid config for \(identifier). Falling back to default") + } // swiftlint:enabld force_cast } else { rules.append(rule.init()) diff --git a/Source/SwiftLintFramework/Protocols/Rule.swift b/Source/SwiftLintFramework/Protocols/Rule.swift index 7043133d0..1ed02c58c 100644 --- a/Source/SwiftLintFramework/Protocols/Rule.swift +++ b/Source/SwiftLintFramework/Protocols/Rule.swift @@ -28,8 +28,7 @@ public protocol ParameterizedRule: Rule { } public protocol ConfigurableRule: Rule { - // TODO: Should switch this to AnyObject and failable - init(config: [String: AnyObject]) + init?(config: AnyObject) func isEqualTo(rule: ConfigurableRule) -> Bool } @@ -42,11 +41,11 @@ extension ParameterizedRule { extension ParameterizedRule where Self: ConfigurableRule, ParameterType == Int { - public init(config: [String: AnyObject]) { - if let array = Self.arrayOfInts(config[Self.description.identifier]) { + public init?(config: AnyObject) { + if let array = Self.arrayOfInts(config) { self.init(parameters: RuleParameter.ruleParametersFromArray(array)) } else { - self.init() + return nil } } diff --git a/Source/SwiftLintFrameworkTests/RuleTests.swift b/Source/SwiftLintFrameworkTests/RuleTests.swift index 76e6ea5bd..89e6f7c89 100644 --- a/Source/SwiftLintFrameworkTests/RuleTests.swift +++ b/Source/SwiftLintFrameworkTests/RuleTests.swift @@ -113,42 +113,35 @@ class RuleTests: XCTestCase { } func testParameterizedConfigurableRuleInits() { - let config = [RuleMock1.description.identifier: [1, 2]] + let config = [1, 2] let rule = ConfigurableRuleMock1.init(config: config) - XCTAssertEqual(rule.parameters, RuleParameter.ruleParametersFromArray([1, 2])) + XCTAssertEqual(rule!.parameters, RuleParameter.ruleParametersFromArray([1, 2])) } func testParameterizedConfigurableRuleDoesntInit() { - let config = [RuleMock1.description.identifier: ["a", "b"]] - let rule = ConfigurableRuleMock1.init(config: config) - XCTAssertNotEqual(rule.parameters, RuleParameter.ruleParametersFromArray([1, 2])) - } - - func testParameterizedConfigurableFallbackInit() { - let config = [RuleMock1.description.identifier: ["a", "b"]] - let rule = ConfigurableRuleMock1.init(config: config) - XCTAssertEqual(rule.parameters, ConfigurableRuleMock1().parameters) + let config = ["a", "b"] + XCTAssertNil(ConfigurableRuleMock1.init(config: config)) } func testParameterizedConfigurableRuleEqual() { - let config1 = [RuleMock1.description.identifier: [1, 2]] - let config2 = [RuleMock1.description.identifier: [1, 2]] - XCTAssertTrue(ConfigurableRuleMock1.init(config: config1) - .isEqualTo(ConfigurableRuleMock1.init(config: config2))) + let config1 = [1, 2] + let config2 = [1, 2] + XCTAssertTrue(ConfigurableRuleMock1.init(config: config1)! + .isEqualTo(ConfigurableRuleMock1.init(config: config2)!)) } func testParameterizedConfigurableRuleNotEqual() { - let config1 = [RuleMock1.description.identifier: [1, 2]] - let config2 = [RuleMock1.description.identifier: [3, 4]] - XCTAssertFalse(ConfigurableRuleMock1.init(config: config1) - .isEqualTo(ConfigurableRuleMock1.init(config: config2))) + let config1 = [1, 2] + let config2 = [3, 4] + XCTAssertFalse(ConfigurableRuleMock1.init(config: config1)! + .isEqualTo(ConfigurableRuleMock1.init(config: config2)!)) } func testDifferentParameterizedConfigurableRulesNotEqual() { - let config1 = [RuleMock1.description.identifier: [1, 2]] - let config2 = [RuleMock2.description.identifier: [1, 2]] - XCTAssertFalse(ConfigurableRuleMock1.init(config: config1) - .isEqualTo(ConfigurableRuleMock2.init(config: config2))) + let config1 = [1, 2] + let config2 = [1, 2] + XCTAssertFalse(ConfigurableRuleMock1.init(config: config1)! + .isEqualTo(ConfigurableRuleMock2.init(config: config2)!)) } }