Switched Configurable rule to a failable initializer that takes AnyObject.

This commit is contained in:
Scott Hoyt
2016-01-02 14:57:49 -08:00
parent 1448576039
commit fa7d4024e3
3 changed files with 27 additions and 30 deletions
@@ -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())
@@ -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<Int>.ruleParametersFromArray(array))
} else {
self.init()
return nil
}
}
+16 -23
View File
@@ -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<Int>.ruleParametersFromArray([1, 2]))
XCTAssertEqual(rule!.parameters, RuleParameter<Int>.ruleParametersFromArray([1, 2]))
}
func testParameterizedConfigurableRuleDoesntInit() {
let config = [RuleMock1.description.identifier: ["a", "b"]]
let rule = ConfigurableRuleMock1.init(config: config)
XCTAssertNotEqual(rule.parameters, RuleParameter<Int>.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)!))
}
}