From 1970b740d06bfbc9833f62f9cb9a491e8ff38fb7 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Tue, 5 Nov 2024 12:41:45 +0900 Subject: [PATCH 1/3] Refine assertions --- test/date/test_date_strftime.rb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/test/date/test_date_strftime.rb b/test/date/test_date_strftime.rb index 976e48f..6ad69c0 100644 --- a/test/date/test_date_strftime.rb +++ b/test/date/test_date_strftime.rb @@ -416,9 +416,10 @@ def test__different_format assert_equal(d2, DateTime.rfc3339('2001-02-03T04:05:06.123456+00:00', limit: 64)) assert_equal(d2, DateTime.jisx0301('H13.02.03T04:05:06.123456+00:00', limit: 64)) - assert_raise(ArgumentError) { DateTime.iso8601('2001-02-03T04:05:06.123456+00:00', limit: 1) } - assert_raise(ArgumentError) { DateTime.rfc3339('2001-02-03T04:05:06.123456+00:00', limit: 1) } - assert_raise(ArgumentError) { DateTime.jisx0301('H13.02.03T04:05:06.123456+00:00', limit: 1) } + exceeds = /string length \(\d+\) exceeds/ + assert_raise_with_message(ArgumentError, exceeds) {DateTime.iso8601('2001-02-03T04:05:06.123456+00:00', limit: 1)} + assert_raise_with_message(ArgumentError, exceeds) {DateTime.rfc3339('2001-02-03T04:05:06.123456+00:00', limit: 1)} + assert_raise_with_message(ArgumentError, exceeds) {DateTime.jisx0301('H13.02.03T04:05:06.123456+00:00', limit: 1)} %w(M06.01.01 M45.07.29 From f2774634397031633b9a6074a93d31990ca13bb8 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Tue, 5 Nov 2024 12:44:22 +0900 Subject: [PATCH 2/3] Update `argc` by `rb_scan_args` not to contain keywords --- ext/date/date_core.c | 43 +++++++++++++++---------------------------- 1 file changed, 15 insertions(+), 28 deletions(-) diff --git a/ext/date/date_core.c b/ext/date/date_core.c index d1605bb..af8d2b5 100644 --- a/ext/date/date_core.c +++ b/ext/date/date_core.c @@ -4478,8 +4478,7 @@ date_s__parse_internal(int argc, VALUE *argv, VALUE klass) { VALUE vstr, vcomp, hash, opt; - rb_scan_args(argc, argv, "11:", &vstr, &vcomp, &opt); - if (!NIL_P(opt)) argc--; + argc = rb_scan_args(argc, argv, "11:", &vstr, &vcomp, &opt); check_limit(vstr, opt); StringValue(vstr); if (!rb_enc_str_asciicompat_p(vstr)) @@ -4566,8 +4565,7 @@ date_s_parse(int argc, VALUE *argv, VALUE klass) { VALUE str, comp, sg, opt; - rb_scan_args(argc, argv, "03:", &str, &comp, &sg, &opt); - if (!NIL_P(opt)) argc--; + argc = rb_scan_args(argc, argv, "03:", &str, &comp, &sg, &opt); switch (argc) { case 0: @@ -4646,8 +4644,7 @@ date_s_iso8601(int argc, VALUE *argv, VALUE klass) { VALUE str, sg, opt; - rb_scan_args(argc, argv, "02:", &str, &sg, &opt); - if (!NIL_P(opt)) argc--; + argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); switch (argc) { case 0: @@ -4717,8 +4714,7 @@ date_s_rfc3339(int argc, VALUE *argv, VALUE klass) { VALUE str, sg, opt; - rb_scan_args(argc, argv, "02:", &str, &sg, &opt); - if (!NIL_P(opt)) argc--; + argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); switch (argc) { case 0: @@ -4786,8 +4782,7 @@ date_s_xmlschema(int argc, VALUE *argv, VALUE klass) { VALUE str, sg, opt; - rb_scan_args(argc, argv, "02:", &str, &sg, &opt); - if (!NIL_P(opt)) argc--; + argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); switch (argc) { case 0: @@ -4857,7 +4852,7 @@ date_s_rfc2822(int argc, VALUE *argv, VALUE klass) { VALUE str, sg, opt; - rb_scan_args(argc, argv, "02:", &str, &sg, &opt); + argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); switch (argc) { case 0: @@ -4925,7 +4920,7 @@ date_s_httpdate(int argc, VALUE *argv, VALUE klass) { VALUE str, sg, opt; - rb_scan_args(argc, argv, "02:", &str, &sg, &opt); + argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); switch (argc) { case 0: @@ -4997,8 +4992,7 @@ date_s_jisx0301(int argc, VALUE *argv, VALUE klass) { VALUE str, sg, opt; - rb_scan_args(argc, argv, "02:", &str, &sg, &opt); - if (!NIL_P(opt)) argc--; + argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); switch (argc) { case 0: @@ -8423,8 +8417,7 @@ datetime_s_parse(int argc, VALUE *argv, VALUE klass) { VALUE str, comp, sg, opt; - rb_scan_args(argc, argv, "03:", &str, &comp, &sg, &opt); - if (!NIL_P(opt)) argc--; + argc = rb_scan_args(argc, argv, "03:", &str, &comp, &sg, &opt); switch (argc) { case 0: @@ -8470,8 +8463,7 @@ datetime_s_iso8601(int argc, VALUE *argv, VALUE klass) { VALUE str, sg, opt; - rb_scan_args(argc, argv, "02:", &str, &sg, &opt); - if (!NIL_P(opt)) argc--; + argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); switch (argc) { case 0: @@ -8510,8 +8502,7 @@ datetime_s_rfc3339(int argc, VALUE *argv, VALUE klass) { VALUE str, sg, opt; - rb_scan_args(argc, argv, "02:", &str, &sg, &opt); - if (!NIL_P(opt)) argc--; + argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); switch (argc) { case 0: @@ -8550,8 +8541,7 @@ datetime_s_xmlschema(int argc, VALUE *argv, VALUE klass) { VALUE str, sg, opt; - rb_scan_args(argc, argv, "02:", &str, &sg, &opt); - if (!NIL_P(opt)) argc--; + argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); switch (argc) { case 0: @@ -8591,8 +8581,7 @@ datetime_s_rfc2822(int argc, VALUE *argv, VALUE klass) { VALUE str, sg, opt; - rb_scan_args(argc, argv, "02:", &str, &sg, &opt); - if (!NIL_P(opt)) argc--; + argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); switch (argc) { case 0: @@ -8631,8 +8620,7 @@ datetime_s_httpdate(int argc, VALUE *argv, VALUE klass) { VALUE str, sg, opt; - rb_scan_args(argc, argv, "02:", &str, &sg, &opt); - if (!NIL_P(opt)) argc--; + argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); switch (argc) { case 0: @@ -8676,8 +8664,7 @@ datetime_s_jisx0301(int argc, VALUE *argv, VALUE klass) { VALUE str, sg, opt; - rb_scan_args(argc, argv, "02:", &str, &sg, &opt); - if (!NIL_P(opt)) argc--; + argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); switch (argc) { case 0: From e677e99a86f16bfeee8f4f950ae0698e774c655d Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Tue, 5 Nov 2024 13:16:09 +0900 Subject: [PATCH 3/3] Extract Julian calendar epoch literals --- ext/date/date_core.c | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/ext/date/date_core.c b/ext/date/date_core.c index af8d2b5..09bf0c7 100644 --- a/ext/date/date_core.c +++ b/ext/date/date_core.c @@ -248,6 +248,11 @@ f_negative_p(VALUE x) #define date_sg_t double #endif +#define JULIAN_EPOCH_DATE "-4712-01-01" +#define JULIAN_EPOCH_DATETIME JULIAN_EPOCH_DATE "T00:00:00+00:00" +#define JULIAN_EPOCH_DATETIME_RFC3339 "Mon, 1 Jan -4712 00:00:00 +0000" +#define JULIAN_EPOCH_DATETIME_HTTPDATE "Mon, 01 Jan -4712 00:00:00 GMT" + /* A set of nth, jd, df and sf denote ajd + 1/2. Each ajd begin at * noon of GMT (assume equal to UTC). However, this begins at * midnight. @@ -4425,7 +4430,7 @@ date_s_strptime(int argc, VALUE *argv, VALUE klass) switch (argc) { case 0: - str = rb_str_new2("-4712-01-01"); + str = rb_str_new2(JULIAN_EPOCH_DATE); case 1: fmt = rb_str_new2("%F"); case 2: @@ -4569,7 +4574,7 @@ date_s_parse(int argc, VALUE *argv, VALUE klass) switch (argc) { case 0: - str = rb_str_new2("-4712-01-01"); + str = rb_str_new2(JULIAN_EPOCH_DATE); case 1: comp = Qtrue; case 2: @@ -4648,7 +4653,7 @@ date_s_iso8601(int argc, VALUE *argv, VALUE klass) switch (argc) { case 0: - str = rb_str_new2("-4712-01-01"); + str = rb_str_new2(JULIAN_EPOCH_DATE); case 1: sg = INT2FIX(DEFAULT_SG); } @@ -4718,7 +4723,7 @@ date_s_rfc3339(int argc, VALUE *argv, VALUE klass) switch (argc) { case 0: - str = rb_str_new2("-4712-01-01T00:00:00+00:00"); + str = rb_str_new2(JULIAN_EPOCH_DATETIME); case 1: sg = INT2FIX(DEFAULT_SG); } @@ -4786,7 +4791,7 @@ date_s_xmlschema(int argc, VALUE *argv, VALUE klass) switch (argc) { case 0: - str = rb_str_new2("-4712-01-01"); + str = rb_str_new2(JULIAN_EPOCH_DATE); case 1: sg = INT2FIX(DEFAULT_SG); } @@ -4856,7 +4861,7 @@ date_s_rfc2822(int argc, VALUE *argv, VALUE klass) switch (argc) { case 0: - str = rb_str_new2("Mon, 1 Jan -4712 00:00:00 +0000"); + str = rb_str_new2(JULIAN_EPOCH_DATETIME_RFC3339); case 1: sg = INT2FIX(DEFAULT_SG); } @@ -4924,7 +4929,7 @@ date_s_httpdate(int argc, VALUE *argv, VALUE klass) switch (argc) { case 0: - str = rb_str_new2("Mon, 01 Jan -4712 00:00:00 GMT"); + str = rb_str_new2(JULIAN_EPOCH_DATETIME_HTTPDATE); case 1: sg = INT2FIX(DEFAULT_SG); } @@ -4996,7 +5001,7 @@ date_s_jisx0301(int argc, VALUE *argv, VALUE klass) switch (argc) { case 0: - str = rb_str_new2("-4712-01-01"); + str = rb_str_new2(JULIAN_EPOCH_DATE); case 1: sg = INT2FIX(DEFAULT_SG); } @@ -8369,7 +8374,7 @@ datetime_s_strptime(int argc, VALUE *argv, VALUE klass) switch (argc) { case 0: - str = rb_str_new2("-4712-01-01T00:00:00+00:00"); + str = rb_str_new2(JULIAN_EPOCH_DATETIME); case 1: fmt = rb_str_new2("%FT%T%z"); case 2: @@ -8421,7 +8426,7 @@ datetime_s_parse(int argc, VALUE *argv, VALUE klass) switch (argc) { case 0: - str = rb_str_new2("-4712-01-01T00:00:00+00:00"); + str = rb_str_new2(JULIAN_EPOCH_DATETIME); case 1: comp = Qtrue; case 2: @@ -8467,7 +8472,7 @@ datetime_s_iso8601(int argc, VALUE *argv, VALUE klass) switch (argc) { case 0: - str = rb_str_new2("-4712-01-01T00:00:00+00:00"); + str = rb_str_new2(JULIAN_EPOCH_DATETIME); case 1: sg = INT2FIX(DEFAULT_SG); } @@ -8506,7 +8511,7 @@ datetime_s_rfc3339(int argc, VALUE *argv, VALUE klass) switch (argc) { case 0: - str = rb_str_new2("-4712-01-01T00:00:00+00:00"); + str = rb_str_new2(JULIAN_EPOCH_DATETIME); case 1: sg = INT2FIX(DEFAULT_SG); } @@ -8545,7 +8550,7 @@ datetime_s_xmlschema(int argc, VALUE *argv, VALUE klass) switch (argc) { case 0: - str = rb_str_new2("-4712-01-01T00:00:00+00:00"); + str = rb_str_new2(JULIAN_EPOCH_DATETIME); case 1: sg = INT2FIX(DEFAULT_SG); } @@ -8585,7 +8590,7 @@ datetime_s_rfc2822(int argc, VALUE *argv, VALUE klass) switch (argc) { case 0: - str = rb_str_new2("Mon, 1 Jan -4712 00:00:00 +0000"); + str = rb_str_new2(JULIAN_EPOCH_DATETIME_RFC3339); case 1: sg = INT2FIX(DEFAULT_SG); } @@ -8624,7 +8629,7 @@ datetime_s_httpdate(int argc, VALUE *argv, VALUE klass) switch (argc) { case 0: - str = rb_str_new2("Mon, 01 Jan -4712 00:00:00 GMT"); + str = rb_str_new2(JULIAN_EPOCH_DATETIME_HTTPDATE); case 1: sg = INT2FIX(DEFAULT_SG); } @@ -8668,7 +8673,7 @@ datetime_s_jisx0301(int argc, VALUE *argv, VALUE klass) switch (argc) { case 0: - str = rb_str_new2("-4712-01-01T00:00:00+00:00"); + str = rb_str_new2(JULIAN_EPOCH_DATETIME); case 1: sg = INT2FIX(DEFAULT_SG); }