зеркало из https://github.com/github/ruby.git
* ext/psych/lib/psych/scalar_scanner.rb: avoid raising exceptions when
parsing Floats and Integers. Thanks riffraff [ruby-core:44426] * test/psych/test_numeric.rb: associated test git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37697 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
262cb379d6
Коммит
24c6a7c368
|
@ -1,3 +1,9 @@
|
|||
Sat Nov 17 12:03:41 2012 Aaron Patterson <aaron@tenderlovemaking.com>
|
||||
|
||||
* ext/psych/lib/psych/scalar_scanner.rb: avoid raising exceptions when
|
||||
parsing Floats and Integers. Thanks riffraff [ruby-core:44426]
|
||||
* test/psych/test_numeric.rb: associated test
|
||||
|
||||
Sat Nov 17 11:34:31 2012 Hiroshi Shirosaki <h.shirosaki@gmail.com>
|
||||
|
||||
* st.c (st_update): pass the key in st_table so that we can free
|
||||
|
|
|
@ -8,11 +8,17 @@ module Psych
|
|||
TIME = /^\d{4}-\d{1,2}-\d{1,2}([Tt]|\s+)\d{1,2}:\d\d:\d\d(\.\d*)?(\s*Z|[-+]\d{1,2}(:\d\d)?)?/
|
||||
|
||||
# Taken from http://yaml.org/type/float.html
|
||||
FLOAT = /^(?:[-+]?([0-9][0-9_,]*)?\.[0-9.]*([eE][-+][0-9]+)?(?# base 10)
|
||||
FLOAT = /^(?:[-+]?([0-9][0-9_,]*)?\.[0-9]*([eE][-+][0-9]+)?(?# base 10)
|
||||
|[-+]?[0-9][0-9_,]*(:[0-5]?[0-9])+\.[0-9_]*(?# base 60)
|
||||
|[-+]?\.(inf|Inf|INF)(?# infinity)
|
||||
|\.(nan|NaN|NAN)(?# not a number))$/x
|
||||
|
||||
# Taken from http://yaml.org/type/int.html
|
||||
INTEGER = /^(?:[-+]?0b[0-1_]+ (?# base 2)
|
||||
|[-+]?0[0-7_]+ (?# base 8)
|
||||
|[-+]?(?:0|[1-9][0-9_]*) (?# base 10)
|
||||
|[-+]?0x[0-9a-fA-F_]+ (?# base 16))$/x
|
||||
|
||||
# Create a new scanner
|
||||
def initialize
|
||||
@string_cache = {}
|
||||
|
@ -86,26 +92,28 @@ module Psych
|
|||
end
|
||||
i
|
||||
when FLOAT
|
||||
begin
|
||||
return Float(string.gsub(/[,_]/, ''))
|
||||
rescue ArgumentError
|
||||
end
|
||||
|
||||
if string == '.'
|
||||
@string_cache[string] = true
|
||||
string
|
||||
else
|
||||
if string.count('.') < 2
|
||||
begin
|
||||
return Integer(string.gsub(/[,_]/, ''))
|
||||
rescue ArgumentError
|
||||
end
|
||||
Float(string.gsub(/[,_]/, ''))
|
||||
end
|
||||
else
|
||||
int = parse_int string.gsub(/[,_]/, '')
|
||||
return int if int
|
||||
|
||||
@string_cache[string] = true
|
||||
string
|
||||
end
|
||||
end
|
||||
|
||||
###
|
||||
# Parse and return an int from +string+
|
||||
def parse_int string
|
||||
return unless INTEGER === string
|
||||
Integer(string)
|
||||
end
|
||||
|
||||
###
|
||||
# Parse and return a Time from +string+
|
||||
def parse_time string
|
||||
|
|
|
@ -7,6 +7,15 @@ module Psych
|
|||
# http://yaml.org/type/float.html
|
||||
# http://yaml.org/type/int.html
|
||||
class TestNumeric < TestCase
|
||||
def setup
|
||||
@old_debug = $DEBUG
|
||||
$DEBUG = true
|
||||
end
|
||||
|
||||
def teardown
|
||||
$DEBUG = @old_debug
|
||||
end
|
||||
|
||||
def test_non_float_with_0
|
||||
str = Psych.load('--- 090')
|
||||
assert_equal '090', str
|
||||
|
@ -21,5 +30,12 @@ module Psych
|
|||
decimal = BigDecimal("12.34")
|
||||
assert_cycle decimal
|
||||
end
|
||||
|
||||
def test_does_not_attempt_numeric
|
||||
str = Psych.load('--- 4 roses')
|
||||
assert_equal '4 roses', str
|
||||
str = Psych.load('--- 1.1.1')
|
||||
assert_equal '1.1.1', str
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Загрузка…
Ссылка в новой задаче