From 3c9df13beb85d176f766a8d7e3d0e18aa873660b Mon Sep 17 00:00:00 2001 From: Vitalii Elenhaupt Date: Fri, 17 Nov 2017 19:07:39 +0200 Subject: [PATCH] New option: LargeNumbers#int_min_digits (default: 5) --- config/ameba.yml | 1 + spec/ameba/rule/large_numbers_spec.cr | 18 ++++++++++-------- src/ameba/rule/large_numbers.cr | 19 +++++++++++++++---- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/config/ameba.yml b/config/ameba.yml index f2dab120..66043bf8 100644 --- a/config/ameba.yml +++ b/config/ameba.yml @@ -21,6 +21,7 @@ EmptyExpression: LargeNumbers: # A rule that disallows usage of large numbers without underscore. Enabled: true + IntMinDigits: 5 # i.e. integers higher than 9999 LineLength: # Disallows lines longer that MaxLength number of symbols. diff --git a/spec/ameba/rule/large_numbers_spec.cr b/spec/ameba/rule/large_numbers_spec.cr index 39302d30..6af4643d 100644 --- a/spec/ameba/rule/large_numbers_spec.cr +++ b/spec/ameba/rule/large_numbers_spec.cr @@ -17,7 +17,11 @@ module Ameba 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 30 40 50 60 70 80 90 100 + 999 + 1000 1_000 + 9999 + 9_999 10_000 100_000 200_000 @@ -79,15 +83,13 @@ module Ameba it_transforms "1_00000", "100_000" - it_transforms "1_23_i8", "123_i8" - it_transforms "1000_i16", "1_000_i16" - it_transforms "1000_i32", "1_000_i32" - it_transforms "1000_i64", "1_000_i64" + it_transforms "10000_i16", "10_000_i16" + it_transforms "10000_i32", "10_000_i32" + it_transforms "10000_i64", "10_000_i64" - it_transforms "1_23_u8", "123_u8" - it_transforms "1000_u16", "1_000_u16" - it_transforms "1000_u32", "1_000_u32" - it_transforms "1000_u64", "1_000_u64" + it_transforms "10000_u16", "10_000_u16" + it_transforms "10000_u32", "10_000_u32" + it_transforms "10000_u64", "10_000_u64" it_transforms "123456_f32", "123_456_f32" it_transforms "123456_f64", "123_456_f64" diff --git a/src/ameba/rule/large_numbers.cr b/src/ameba/rule/large_numbers.cr index 2d1a611f..b0144c1c 100644 --- a/src/ameba/rule/large_numbers.cr +++ b/src/ameba/rule/large_numbers.cr @@ -24,14 +24,19 @@ module Ameba::Rule # ``` # LargeNumbers: # Enabled: true + # IntMinDigits: 5 # i.e. integers higher than 9999 # ``` # struct LargeNumbers < Base + prop int_min_digits = 5 + def test(source) Tokenizer.new(source).run do |token| next unless token.type == :NUMBER && decimal?(token.raw) - if (expected = underscored token.raw) != token.raw + parsed = parse_number token.raw + + if allowed?(*parsed) && (expected = underscored *parsed) != token.raw source.error self, token.location, "Large numbers should be written with underscores: #{expected}" end @@ -42,8 +47,14 @@ module Ameba::Rule value !~ /^0(x|b|o)/ end - private def underscored(raw_number) - sign, value, fraction, suffix = parse_number raw_number + private def allowed?(_sign, value, fraction, _suffix) + return true unless fraction.nil? + + digits = value.chars.select &.to_s.=~ /[0-9]/ + digits.size >= int_min_digits + end + + private def underscored(sign, value, fraction, suffix) value = slice_digits(value.reverse) { |slice| slice }.reverse fraction = "." + slice_digits(fraction) { |slice| slice } if fraction @@ -75,7 +86,7 @@ module Ameba::Rule end private def parse_suffix(value) - if pos = (value =~ /e/ || value =~ /_(i|u|f)/) + if pos = (value =~ /e/ || value =~ /_?(i|u|f)/) suffix = value[pos..-1] value = value[0..pos - 1] end