summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.rdoc7
-rw-r--r--lib/psych/scalar_scanner.rb8
-rw-r--r--test/psych/test_scalar_scanner.rb22
3 files changed, 35 insertions, 2 deletions
diff --git a/CHANGELOG.rdoc b/CHANGELOG.rdoc
index 6ea5d6f..14ef3b5 100644
--- a/CHANGELOG.rdoc
+++ b/CHANGELOG.rdoc
@@ -1,3 +1,10 @@
+Sun Dec 18 12:03:13 2011 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/lib/psych/scalar_scanner.rb: Strings that look like dates
+ should be treated as strings and not dates.
+
+ * test/psych/test_scalar_scanner.rb: corresponding tests.
+
Wed Dec 7 08:04:31 2011 Aaron Patterson <aaron@tenderlovemaking.com>
* ext/psych/lib/psych.rb (module Psych): parse and load methods take
diff --git a/lib/psych/scalar_scanner.rb b/lib/psych/scalar_scanner.rb
index a265a2b..fa2d385 100644
--- a/lib/psych/scalar_scanner.rb
+++ b/lib/psych/scalar_scanner.rb
@@ -46,9 +46,13 @@ module Psych
end
when TIME
parse_time string
- when /^\d{4}-\d{1,2}-\d{1,2}$/
+ when /^\d{4}-(?:1[012]|0\d|\d)-(?:[12]\d|3[01]|0\d|\d)$/
require 'date'
- Date.strptime(string, '%Y-%m-%d')
+ begin
+ Date.strptime(string, '%Y-%m-%d')
+ rescue ArgumentError
+ string
+ end
when /^\.inf$/i
1 / 0.0
when /^-\.inf$/i
diff --git a/test/psych/test_scalar_scanner.rb b/test/psych/test_scalar_scanner.rb
index 6599099..cf0dfff 100644
--- a/test/psych/test_scalar_scanner.rb
+++ b/test/psych/test_scalar_scanner.rb
@@ -1,4 +1,5 @@
require 'psych/helper'
+require 'date'
module Psych
class TestScalarScanner < TestCase
@@ -20,6 +21,27 @@ module Psych
end
end
+ def test_scan_bad_dates
+ x = '2000-15-01'
+ assert_equal x, @ss.tokenize(x)
+
+ x = '2000-10-51'
+ assert_equal x, @ss.tokenize(x)
+
+ x = '2000-10-32'
+ assert_equal x, @ss.tokenize(x)
+ end
+
+ def test_scan_good_edge_date
+ x = '2000-1-31'
+ assert_equal Date.strptime(x, '%Y-%m-%d'), @ss.tokenize(x)
+ end
+
+ def test_scan_bad_edge_date
+ x = '2000-11-31'
+ assert_equal x, @ss.tokenize(x)
+ end
+
def test_scan_date
date = '1980-12-16'
token = @ss.tokenize date