Skip to content

Commit b513698

Browse files
committed
fix: 追加レビューの境界入力を処理 / Handle review edge cases
1 parent a6ed557 commit b513698

5 files changed

Lines changed: 35 additions & 2 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
### Fixed
66
- Parameterless commands now reject unexpected arguments without invoking the target method or attempting implicit return-value traversal.
77
- Required options now report a missing value instead of consuming the following option token, while explicit values such as `true` remain valid.
8-
- Required options accept negative exponent and radix notation such as `-1e3` and `-0x10` without mistaking them for another option.
8+
- Required options accept negative exponent, digit-separated decimal, and radix notation such as `-1e3`, `-1_000`, and `-0x10` without mistaking them for another option.
99
- Constant discovery now includes classes and modules assigned with `Class.new` / `Module.new` during the target file load.
1010
- Repeated loads retain assigned constant aliases when the source file is unchanged.
1111
- Repeated loads retain aliases from completed direct, multiple, and `const_set` assignments or matching fully qualified existence guards, without reviving failed assignments or aliases behind disabled conditions.

lib/rubycli/argument_parser.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -785,7 +785,10 @@ def looks_like_option?(token)
785785
return false unless token
786786
return false if token == '--' || token == '-'
787787

788-
negative_decimal = token.match?(/\A-(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?\z/)
788+
decimal_digits = '\d(?:_?\d)*'
789+
negative_decimal = token.match?(
790+
/\A-(?:#{decimal_digits}(?:\.(?:#{decimal_digits})?)?|\.#{decimal_digits})(?:[eE][+-]?#{decimal_digits})?\z/
791+
)
789792
negative_radix = token.match?(
790793
/\A-0(?:[xX][0-9a-fA-F_]+|[bB][01_]+|[oO][0-7_]+|[dD][0-9_]+)\z/
791794
)

lib/rubycli/constant_capture.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,13 +466,28 @@ def unwrap_guard_condition(condition, expected)
466466

467467
condition = condition[2]
468468
expected = !expected
469+
when :call
470+
break unless condition.dig(3, 1) == 'nil?'
471+
472+
condition = condition[1]
473+
expected = !expected
474+
when :binary
475+
left, operator, right = condition.drop(1)
476+
break unless operator == :== && nil_literal?(right)
477+
478+
condition = left
479+
expected = !expected
469480
else
470481
break
471482
end
472483
end
473484
[condition, expected]
474485
end
475486

487+
def nil_literal?(node)
488+
node&.first == :var_ref && node.dig(1, 0) == :@kw && node.dig(1, 1) == 'nil'
489+
end
490+
476491
def guarded_constant_name(condition, namespace)
477492
if condition&.first == :defined
478493
return constant_name_from_node(condition[1], namespace)

test/argument_parser_test.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,15 @@ def test_required_integer_option_accepts_negative_radix_values
454454
end
455455
end
456456

457+
def test_required_integer_option_accepts_negative_decimal_with_separator
458+
method = IntegerOptionSamples.method(:count)
459+
460+
pos_args, kw_args = @parser.parse(['--count', '-1_000'], method)
461+
462+
assert_empty pos_args
463+
assert_equal({ count: -1000 }, kw_args)
464+
end
465+
457466
def test_json_type_accepts_an_array_literal
458467
method = JsonTypeSamples.method(:accept)
459468

test/constant_capture_test.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -652,6 +652,8 @@ module CaptureEquivalentGuardOwner; end
652652
CaptureEquivalentGuardOwner.const_defined?(:Runner, false) || (CaptureEquivalentGuardOwner::Runner = CaptureEquivalentGuardSource)
653653
CaptureNegatedGuardAlias = CaptureEquivalentGuardSource if !(defined?(CaptureNegatedGuardAlias))
654654
defined?(CaptureTernaryGuardAlias) ? nil : (CaptureTernaryGuardAlias = CaptureEquivalentGuardSource)
655+
CaptureNilPredicateGuardAlias = CaptureEquivalentGuardSource if defined?(CaptureNilPredicateGuardAlias).nil?
656+
CaptureNilEqualityGuardAlias = CaptureEquivalentGuardSource if defined?(CaptureNilEqualityGuardAlias) == nil
655657
install = -> { CaptureLambdaGuardAlias = CaptureEquivalentGuardSource unless defined?(CaptureLambdaGuardAlias) }
656658
install.call
657659
RUBY
@@ -661,6 +663,8 @@ module CaptureEquivalentGuardOwner; end
661663
CaptureEquivalentGuardOwner::Runner
662664
CaptureNegatedGuardAlias
663665
CaptureTernaryGuardAlias
666+
CaptureNilPredicateGuardAlias
667+
CaptureNilEqualityGuardAlias
664668
CaptureLambdaGuardAlias
665669
]
666670
2.times do
@@ -678,6 +682,8 @@ module CaptureEquivalentGuardOwner; end
678682
cleanup_constant(:CaptureEquivalentGuardSource)
679683
cleanup_constant(:CaptureNegatedGuardAlias)
680684
cleanup_constant(:CaptureTernaryGuardAlias)
685+
cleanup_constant(:CaptureNilPredicateGuardAlias)
686+
cleanup_constant(:CaptureNilEqualityGuardAlias)
681687
cleanup_constant(:CaptureLambdaGuardAlias)
682688
end
683689
end

0 commit comments

Comments
 (0)