From efc1cbb034e3b0cf7e71305de3559aebb673e22a Mon Sep 17 00:00:00 2001 From: Thierry Date: Wed, 15 Jun 2022 20:58:16 +0200 Subject: [PATCH 1/4] simplify DateTimeMatcher regexp, matching patterns recognized by DateTime.parse --- lib/csv.rb | 5 ++--- test/csv/test_data_converters.rb | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/lib/csv.rb b/lib/csv.rb index 31e46d91..f1a07abe 100644 --- a/lib/csv.rb +++ b/lib/csv.rb @@ -875,10 +875,9 @@ def initialize(message, line_number) # A Regexp used to find and convert some common DateTime formats. DateTimeMatcher = / \A(?: (\w+,?\s+)?\w+\s+\d{1,2}\s+\d{1,2}:\d{1,2}:\d{1,2},?\s+\d{2,4} | - \d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2} | - # ISO-8601 + # ISO-8601 and near-ISO (space instead of T) recognized by DateTime.parse \d{4}-\d{2}-\d{2} - (?:T\d{2}:\d{2}(?::\d{2}(?:\.\d+)?(?:[+-]\d{2}(?::\d{2})|Z)?)?)? + (?:[T ]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?(?:[+-]\d{2}(?::\d{2})|Z)?)?)? )\z /x # The encoding used by all converters. diff --git a/test/csv/test_data_converters.rb b/test/csv/test_data_converters.rb index 1620e077..4f39fc8f 100644 --- a/test/csv/test_data_converters.rb +++ b/test/csv/test_data_converters.rb @@ -103,4 +103,19 @@ def test_builtin_date_time_converter_iso8601_utc assert_equal(datetime, CSV::Converters[:date_time][iso8601_string]) end + + def test_builtin_date_time_converter_near_iso + [ "2018-01-14 22:25", + "2018-01-14 22:25:19", + "2018-01-14 22:25:19.1", + "2018-01-14 22:25:19.1+09:00", + "2018-01-14 22:25:19+09:00", + "2018-01-14 22:25:19Z", + ].each do |string| + datetime = DateTime.parse(string) + assert_equal(datetime, + CSV::Converters[:date_time][string]) + end + end + end From a3864f8330a94d41486a9a60b27fd4010ee852f3 Mon Sep 17 00:00:00 2001 From: Thierry Date: Tue, 28 Jun 2022 10:54:58 +0200 Subject: [PATCH 2/4] * refer to RFC-3339 * support any whitespace instead of T * split tests for space, add tests for tab --- lib/csv.rb | 4 +- test/csv/test_data_converters.rb | 94 ++++++++++++++++++++++++++++---- 2 files changed, 84 insertions(+), 14 deletions(-) diff --git a/lib/csv.rb b/lib/csv.rb index f1a07abe..17b9836d 100644 --- a/lib/csv.rb +++ b/lib/csv.rb @@ -875,9 +875,9 @@ def initialize(message, line_number) # A Regexp used to find and convert some common DateTime formats. DateTimeMatcher = / \A(?: (\w+,?\s+)?\w+\s+\d{1,2}\s+\d{1,2}:\d{1,2}:\d{1,2},?\s+\d{2,4} | - # ISO-8601 and near-ISO (space instead of T) recognized by DateTime.parse + # ISO-8601 and RFC-3339 (space instead of T) recognized by DateTime.parse \d{4}-\d{2}-\d{2} - (?:[T ]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?(?:[+-]\d{2}(?::\d{2})|Z)?)?)? + (?:[T\s]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?(?:[+-]\d{2}(?::\d{2})|Z)?)?)? )\z /x # The encoding used by all converters. diff --git a/test/csv/test_data_converters.rb b/test/csv/test_data_converters.rb index 4f39fc8f..073b2634 100644 --- a/test/csv/test_data_converters.rb +++ b/test/csv/test_data_converters.rb @@ -104,18 +104,88 @@ def test_builtin_date_time_converter_iso8601_utc CSV::Converters[:date_time][iso8601_string]) end - def test_builtin_date_time_converter_near_iso - [ "2018-01-14 22:25", - "2018-01-14 22:25:19", - "2018-01-14 22:25:19.1", - "2018-01-14 22:25:19.1+09:00", - "2018-01-14 22:25:19+09:00", - "2018-01-14 22:25:19Z", - ].each do |string| - datetime = DateTime.parse(string) - assert_equal(datetime, - CSV::Converters[:date_time][string]) - end + def test_builtin_date_time_converter_rfc3339_minute + iso8601_string = "2018-01-14 22:25" + datetime = DateTime.new(2018, 1, 14, 22, 25) + assert_equal(datetime, + CSV::Converters[:date_time][iso8601_string]) + end + + def test_builtin_date_time_converter_rfc3339_second + iso8601_string = "2018-01-14 22:25:19" + datetime = DateTime.new(2018, 1, 14, 22, 25, 19) + assert_equal(datetime, + CSV::Converters[:date_time][iso8601_string]) + end + + def test_builtin_date_time_converter_rfc3339_under_second + iso8601_string = "2018-01-14 22:25:19.1" + datetime = DateTime.new(2018, 1, 14, 22, 25, 19.1) + assert_equal(datetime, + CSV::Converters[:date_time][iso8601_string]) + end + + def test_builtin_date_time_converter_rfc3339_under_second_offset + iso8601_string = "2018-01-14 22:25:19.1+09:00" + datetime = DateTime.new(2018, 1, 14, 22, 25, 19.1, "+9") + assert_equal(datetime, + CSV::Converters[:date_time][iso8601_string]) + end + + def test_builtin_date_time_converter_rfc3339_offset + iso8601_string = "2018-01-14 22:25:19+09:00" + datetime = DateTime.new(2018, 1, 14, 22, 25, 19, "+9") + assert_equal(datetime, + CSV::Converters[:date_time][iso8601_string]) + end + + def test_builtin_date_time_converter_rfc3339_utc + iso8601_string = "2018-01-14 22:25:19Z" + datetime = DateTime.new(2018, 1, 14, 22, 25, 19) + assert_equal(datetime, + CSV::Converters[:date_time][iso8601_string]) + end + + def test_builtin_date_time_converter_rfc3339_tab_minute + iso8601_string = "2018-01-14\t22:25" + datetime = DateTime.new(2018, 1, 14, 22, 25) + assert_equal(datetime, + CSV::Converters[:date_time][iso8601_string]) + end + + def test_builtin_date_time_converter_rfc3339_tab_second + iso8601_string = "2018-01-14\t22:25:19" + datetime = DateTime.new(2018, 1, 14, 22, 25, 19) + assert_equal(datetime, + CSV::Converters[:date_time][iso8601_string]) + end + + def test_builtin_date_time_converter_rfc3339_tab_under_second + iso8601_string = "2018-01-14\t22:25:19.1" + datetime = DateTime.new(2018, 1, 14, 22, 25, 19.1) + assert_equal(datetime, + CSV::Converters[:date_time][iso8601_string]) + end + + def test_builtin_date_time_converter_rfc3339_tab_under_second_offset + iso8601_string = "2018-01-14\t22:25:19.1+09:00" + datetime = DateTime.new(2018, 1, 14, 22, 25, 19.1, "+9") + assert_equal(datetime, + CSV::Converters[:date_time][iso8601_string]) + end + + def test_builtin_date_time_converter_rfc3339_tab_offset + iso8601_string = "2018-01-14\t22:25:19+09:00" + datetime = DateTime.new(2018, 1, 14, 22, 25, 19, "+9") + assert_equal(datetime, + CSV::Converters[:date_time][iso8601_string]) + end + + def test_builtin_date_time_converter_rfc3339_tab_utc + iso8601_string = "2018-01-14\t22:25:19Z" + datetime = DateTime.new(2018, 1, 14, 22, 25, 19) + assert_equal(datetime, + CSV::Converters[:date_time][iso8601_string]) end end From 7b029e4f42c80de70f663d7f628c1bd871f142ac Mon Sep 17 00:00:00 2001 From: Thierry Date: Wed, 29 Jun 2022 17:39:35 +0200 Subject: [PATCH 3/4] change variable name in RFC3339 tests --- test/csv/test_data_converters.rb | 48 ++++++++++++++++---------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/test/csv/test_data_converters.rb b/test/csv/test_data_converters.rb index 073b2634..399a5cec 100644 --- a/test/csv/test_data_converters.rb +++ b/test/csv/test_data_converters.rb @@ -105,87 +105,87 @@ def test_builtin_date_time_converter_iso8601_utc end def test_builtin_date_time_converter_rfc3339_minute - iso8601_string = "2018-01-14 22:25" + rfc3339_string = "2018-01-14 22:25" datetime = DateTime.new(2018, 1, 14, 22, 25) assert_equal(datetime, - CSV::Converters[:date_time][iso8601_string]) + CSV::Converters[:date_time][rfc3339_string]) end def test_builtin_date_time_converter_rfc3339_second - iso8601_string = "2018-01-14 22:25:19" + rfc3339_string = "2018-01-14 22:25:19" datetime = DateTime.new(2018, 1, 14, 22, 25, 19) assert_equal(datetime, - CSV::Converters[:date_time][iso8601_string]) + CSV::Converters[:date_time][rfc3339_string]) end def test_builtin_date_time_converter_rfc3339_under_second - iso8601_string = "2018-01-14 22:25:19.1" + rfc3339_string = "2018-01-14 22:25:19.1" datetime = DateTime.new(2018, 1, 14, 22, 25, 19.1) assert_equal(datetime, - CSV::Converters[:date_time][iso8601_string]) + CSV::Converters[:date_time][rfc3339_string]) end def test_builtin_date_time_converter_rfc3339_under_second_offset - iso8601_string = "2018-01-14 22:25:19.1+09:00" + rfc3339_string = "2018-01-14 22:25:19.1+09:00" datetime = DateTime.new(2018, 1, 14, 22, 25, 19.1, "+9") assert_equal(datetime, - CSV::Converters[:date_time][iso8601_string]) + CSV::Converters[:date_time][rfc3339_string]) end def test_builtin_date_time_converter_rfc3339_offset - iso8601_string = "2018-01-14 22:25:19+09:00" + rfc3339_string = "2018-01-14 22:25:19+09:00" datetime = DateTime.new(2018, 1, 14, 22, 25, 19, "+9") assert_equal(datetime, - CSV::Converters[:date_time][iso8601_string]) + CSV::Converters[:date_time][rfc3339_string]) end def test_builtin_date_time_converter_rfc3339_utc - iso8601_string = "2018-01-14 22:25:19Z" + rfc3339_string = "2018-01-14 22:25:19Z" datetime = DateTime.new(2018, 1, 14, 22, 25, 19) assert_equal(datetime, - CSV::Converters[:date_time][iso8601_string]) + CSV::Converters[:date_time][rfc3339_string]) end def test_builtin_date_time_converter_rfc3339_tab_minute - iso8601_string = "2018-01-14\t22:25" + rfc3339_string = "2018-01-14\t22:25" datetime = DateTime.new(2018, 1, 14, 22, 25) assert_equal(datetime, - CSV::Converters[:date_time][iso8601_string]) + CSV::Converters[:date_time][rfc3339_string]) end def test_builtin_date_time_converter_rfc3339_tab_second - iso8601_string = "2018-01-14\t22:25:19" + rfc3339_string = "2018-01-14\t22:25:19" datetime = DateTime.new(2018, 1, 14, 22, 25, 19) assert_equal(datetime, - CSV::Converters[:date_time][iso8601_string]) + CSV::Converters[:date_time][rfc3339_string]) end def test_builtin_date_time_converter_rfc3339_tab_under_second - iso8601_string = "2018-01-14\t22:25:19.1" + rfc3339_string = "2018-01-14\t22:25:19.1" datetime = DateTime.new(2018, 1, 14, 22, 25, 19.1) assert_equal(datetime, - CSV::Converters[:date_time][iso8601_string]) + CSV::Converters[:date_time][rfc3339_string]) end def test_builtin_date_time_converter_rfc3339_tab_under_second_offset - iso8601_string = "2018-01-14\t22:25:19.1+09:00" + rfc3339_string = "2018-01-14\t22:25:19.1+09:00" datetime = DateTime.new(2018, 1, 14, 22, 25, 19.1, "+9") assert_equal(datetime, - CSV::Converters[:date_time][iso8601_string]) + CSV::Converters[:date_time][rfc3339_string]) end def test_builtin_date_time_converter_rfc3339_tab_offset - iso8601_string = "2018-01-14\t22:25:19+09:00" + rfc3339_string = "2018-01-14\t22:25:19+09:00" datetime = DateTime.new(2018, 1, 14, 22, 25, 19, "+9") assert_equal(datetime, - CSV::Converters[:date_time][iso8601_string]) + CSV::Converters[:date_time][rfc3339_string]) end def test_builtin_date_time_converter_rfc3339_tab_utc - iso8601_string = "2018-01-14\t22:25:19Z" + rfc3339_string = "2018-01-14\t22:25:19Z" datetime = DateTime.new(2018, 1, 14, 22, 25, 19) assert_equal(datetime, - CSV::Converters[:date_time][iso8601_string]) + CSV::Converters[:date_time][rfc3339_string]) end end From 5b16eaac3e542f88a6c3344246f0f0755a6c9492 Mon Sep 17 00:00:00 2001 From: Sutou Kouhei Date: Thu, 30 Jun 2022 08:57:17 +0900 Subject: [PATCH 4/4] Remove a needless empty line --- test/csv/test_data_converters.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/test/csv/test_data_converters.rb b/test/csv/test_data_converters.rb index 399a5cec..c20a5d1f 100644 --- a/test/csv/test_data_converters.rb +++ b/test/csv/test_data_converters.rb @@ -187,5 +187,4 @@ def test_builtin_date_time_converter_rfc3339_tab_utc assert_equal(datetime, CSV::Converters[:date_time][rfc3339_string]) end - end