diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-07-19 02:56:39 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-07-19 02:56:39 +0000 |
commit | f75b676cc4f5411c4c1aa8cc9cb48d5dd665af6f (patch) | |
tree | 019d7adb954e3e2ae194070ab0046637280db877 | |
parent | 595d057e60a9fe6550500dd17535e22134f0d63f (diff) |
Fix `Time.parse` for out of range arguments with an offset
* lib/time.rb (Time#apply_offset): Guards against a `nil` return
value from `Time.month_days` when offsetting date. Out of range
values are then caught when `Time.utc` is called (as usual).
Previously a `nil` return value from `Time.month_days` would
have the `<` operator called on it, and raise `NoMethodError`.
[fix GH-667]
* lib/rdoc/parser/changelog.rb (RDoc#parse_entries): fix dirty hack.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@46872 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 12 | ||||
-rw-r--r-- | lib/rdoc/parser/changelog.rb | 8 | ||||
-rw-r--r-- | lib/time.rb | 3 | ||||
-rw-r--r-- | test/test_time.rb | 3 |
4 files changed, 23 insertions, 3 deletions
@@ -1,3 +1,15 @@ +Sat Jul 19 11:56:36 2014 Grey Baker <[email protected]> + + * lib/time.rb (Time#apply_offset): Guards against a `nil` return + value from `Time.month_days` when offsetting date. Out of range + values are then caught when `Time.utc` is called (as usual). + + Previously a `nil` return value from `Time.month_days` would + have the `<` operator called on it, and raise `NoMethodError`. + [fix GH-667] + + * lib/rdoc/parser/changelog.rb (RDoc#parse_entries): fix dirty hack. + Sat Jul 19 06:19:01 2014 Masaki Suketa <[email protected]> * ext/win32ole/win32ole.c: refactoring. diff --git a/lib/rdoc/parser/changelog.rb b/lib/rdoc/parser/changelog.rb index 782d8f09bf..75fcaaad85 100644 --- a/lib/rdoc/parser/changelog.rb +++ b/lib/rdoc/parser/changelog.rb @@ -145,10 +145,14 @@ class RDoc::Parser::ChangeLog < RDoc::Parser # HACK Ruby 1.8 does not raise ArgumentError for Time.parse "Other" entry_name = nil unless entry_name =~ /#{time.year}/ rescue NoMethodError + # HACK Ruby 2.1.2 and earlier raises NoMethodError if time part is absent time, = entry_name.split ' ', 2 - time = Time.parse time rescue ArgumentError - entry_name = nil + if /out of range/ =~ $!.message + time = Time.parse(entry_name.split(' ', 2)[0]) rescue entry_name = nil + else + entry_name = nil + end end entry_body = [] diff --git a/lib/time.rb b/lib/time.rb index 3728fef59c..2225f68abb 100644 --- a/lib/time.rb +++ b/lib/time.rb @@ -214,7 +214,8 @@ class Time if o != 0 then hour += o; o, hour = hour.divmod(24); off += o end if off != 0 day += off - if month_days(year, mon) < day + days = month_days(year, mon) + if days and days < day mon += 1 if 12 < mon mon = 1 diff --git a/test/test_time.rb b/test/test_time.rb index c516d29227..ecf07b21e9 100644 --- a/test/test_time.rb +++ b/test/test_time.rb @@ -307,6 +307,9 @@ class TestTimeExtension < Test::Unit::TestCase # :nodoc: assert_raise(ArgumentError) { Time.rfc2822("=?iso-8859-1?Q?(=C5=DA),?= 10 2 2001 23:32:26 +0900 (JST)") } assert_raise(ArgumentError) { Time.rfc2822("\307\341\314\343\332\311, 30 \344\346\335\343\310\321 2001 10:01:06") } assert_raise(ArgumentError) { Time.rfc2822("=?iso-8859-1?Q?(=BF=E5),?= 12 =?iso-8859-1?Q?9=B7=EE?= 2001 14:52:41\n+0900 (JST)") } + + # Out of range arguments + assert_raise(ArgumentError) { Time.parse("2014-13-13T18:00:00-0900") } end def test_zone_0000 |