diff --git a/Source/SwiftLintFramework/Rules/RuleConfigurations/NumberSeparatorConfiguration.swift b/Source/SwiftLintFramework/Rules/RuleConfigurations/NumberSeparatorConfiguration.swift index 2dee7e3ef..a097b2b07 100644 --- a/Source/SwiftLintFramework/Rules/RuleConfigurations/NumberSeparatorConfiguration.swift +++ b/Source/SwiftLintFramework/Rules/RuleConfigurations/NumberSeparatorConfiguration.swift @@ -2,7 +2,7 @@ public struct NumberSeparatorConfiguration: RuleConfiguration, Equatable { private(set) var severityConfiguration = SeverityConfiguration(.warning) private(set) var minimumLength: Int private(set) var minimumFractionLength: Int? - private(set) var validRanges: [Range] + private(set) var excludeRanges: [Range] public var consoleDescription: String { let minimumFractionLengthDescription: String @@ -16,10 +16,10 @@ public struct NumberSeparatorConfiguration: RuleConfiguration, Equatable { + minimumFractionLengthDescription } - public init(minimumLength: Int, minimumFractionLength: Int?, validRanges: [Range]) { + public init(minimumLength: Int, minimumFractionLength: Int?, excludeRanges: [Range]) { self.minimumLength = minimumLength self.minimumFractionLength = minimumFractionLength - self.validRanges = validRanges + self.excludeRanges = excludeRanges } public mutating func apply(configuration: Any) throws { @@ -35,8 +35,8 @@ public struct NumberSeparatorConfiguration: RuleConfiguration, Equatable { self.minimumFractionLength = minimumFractionLength } - if let validRanges = configuration["valid_ranges"] as? [[String: Any]] { - self.validRanges = validRanges.compactMap { dict in + if let excludeRanges = configuration["exclude_ranges"] as? [[String: Any]] { + self.excludeRanges = excludeRanges.compactMap { dict in guard let min = dict["min"] as? Double, let max = dict["max"] as? Double else { return nil } return min ..< max } diff --git a/Source/SwiftLintFramework/Rules/Style/NumberSeparatorRule.swift b/Source/SwiftLintFramework/Rules/Style/NumberSeparatorRule.swift index edbaef359..58148416b 100644 --- a/Source/SwiftLintFramework/Rules/Style/NumberSeparatorRule.swift +++ b/Source/SwiftLintFramework/Rules/Style/NumberSeparatorRule.swift @@ -5,7 +5,7 @@ public struct NumberSeparatorRule: OptInRule, CorrectableRule, ConfigurationProv public var configuration = NumberSeparatorConfiguration( minimumLength: 0, minimumFractionLength: nil, - validRanges: [] + excludeRanges: [] ) public init() {} @@ -116,7 +116,8 @@ public struct NumberSeparatorRule: OptInRule, CorrectableRule, ConfigurationProv } private func isInValidRanges(number: String) -> Bool { - if let double = Double(number), configuration.validRanges.contains(where: { $0.contains(double) }) { + let doubleValue = Double(number.replacingOccurrences(of: "_", with: "")) + if let doubleValue = doubleValue, configuration.excludeRanges.contains(where: { $0.contains(doubleValue) }) { return true } diff --git a/Tests/SwiftLintFrameworkTests/NumberSeparatorRuleTests.swift b/Tests/SwiftLintFrameworkTests/NumberSeparatorRuleTests.swift index b7b442406..c49001c05 100644 --- a/Tests/SwiftLintFrameworkTests/NumberSeparatorRuleTests.swift +++ b/Tests/SwiftLintFrameworkTests/NumberSeparatorRuleTests.swift @@ -59,13 +59,18 @@ class NumberSeparatorRuleTests: XCTestCase { verifyRule(description, ruleConfiguration: ["minimum_fraction_length": 5]) } - func testNumberSeparatorWithValidRanges() { + func testNumberSeparatorWithExcludeRanges() { let nonTriggeringExamples = [ "let foo = 1950", + "let foo = 1_950", "let foo = 1985", + "let foo = 1_985", "let foo = 2020", + "let foo = 2_020", "let foo = 2.10042", - "let foo = 2.833333" + "let foo = 2.100_42", + "let foo = 2.833333", + "let foo = 2.833_333" ] let triggeringExamples = [ "let foo = ↓1000", @@ -88,7 +93,7 @@ class NumberSeparatorRuleTests: XCTestCase { verifyRule( description, ruleConfiguration: [ - "valid_ranges": [ + "exclude_ranges": [ ["min": 1900, "max": 2030], ["min": 2.0, "max": 3.0] ]