date 3.3.2 → 3.3.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 75e3a4cb744689e80e55cc75831e2b6f13961ed10b2b0867a8a01d2ce33c28fc
4
- data.tar.gz: 2391f862cb91c7aed10383225fd6b6c0d8fe37cbd82cac038420ff2e6a6292c1
3
+ metadata.gz: c21f55b2cc18baf941cd4774c226c424d7f987bee9239e0b732a0d9fb4f0e6fd
4
+ data.tar.gz: 2acbe62f992812810d0efd5f09801fcec3669d1ba4df7afc20b95a10a13093a9
5
5
  SHA512:
6
- metadata.gz: e1e7086f78e0951e84ba1a7dc349868d32a74dee4afc8bf5202e5d9d48f275feaa986b7968684b9bfafa027f25b6bee2e3b9fc68f6c6eaf261eeaac5565961fd
7
- data.tar.gz: 7e027f42df681fccf94500a543f19ca23a332f322db4d7ee10f533e1ff47d27ff28fb024131e93039d61eaca91f5386f3fc63edd6d2e00d3a25a10ca935dab98
6
+ metadata.gz: 13082c47b2973af41fc9064501b16db82f900a3e8c8f4d470370f8f424cf89752e49193595329e37029007a5086d83725321f836efe949012f7df43cff26d401
7
+ data.tar.gz: 1500c8d72b88fabb2645cbd67da24447f9a11be934a20cad3557b8b261bfa788e9a7d9f699891c1c93a39fd92c3427c9672d0d84815390b57337727d77665153
data/ext/date/date_core.c CHANGED
@@ -64,7 +64,8 @@ static VALUE datetime_initialize(int argc, VALUE *argv, VALUE self);
64
64
 
65
65
  #define RETURN_FALSE_UNLESS_NUMERIC(obj) if(!RTEST(rb_obj_is_kind_of((obj), rb_cNumeric))) return Qfalse
66
66
  inline static void
67
- check_numeric(VALUE obj, const char* field) {
67
+ check_numeric(VALUE obj, const char* field)
68
+ {
68
69
  if(!RTEST(rb_obj_is_kind_of(obj, rb_cNumeric))) {
69
70
  rb_raise(rb_eTypeError, "invalid %s (not numeric)", field);
70
71
  }
@@ -2588,8 +2589,6 @@ date_s__valid_civil_p(int argc, VALUE *argv, VALUE klass)
2588
2589
  *
2589
2590
  * See argument {start}[rdoc-ref:calendars.rdoc@Argument+start].
2590
2591
  *
2591
- * Date.valid_date? is an alias for Date.valid_civil?.
2592
- *
2593
2592
  * Related: Date.jd, Date.new.
2594
2593
  */
2595
2594
  static VALUE
@@ -2985,8 +2984,6 @@ date_s_julian_leap_p(VALUE klass, VALUE y)
2985
2984
  * Date.gregorian_leap?(2000) # => true
2986
2985
  * Date.gregorian_leap?(2001) # => false
2987
2986
  *
2988
- * Date.leap? is an alias for Date.gregorian_leap?.
2989
- *
2990
2987
  * Related: Date.julian_leap?.
2991
2988
  */
2992
2989
  static VALUE
@@ -3492,8 +3489,6 @@ date_s_civil(int argc, VALUE *argv, VALUE klass)
3492
3489
  *
3493
3490
  * See argument {start}[rdoc-ref:calendars.rdoc@Argument+start].
3494
3491
  *
3495
- * Date.civil is an alias for Date.new.
3496
- *
3497
3492
  * Related: Date.jd.
3498
3493
  */
3499
3494
  static VALUE
@@ -4831,8 +4826,6 @@ date_s_xmlschema(int argc, VALUE *argv, VALUE klass)
4831
4826
  *
4832
4827
  * See argument {limit}[rdoc-ref:Date@Argument+limit].
4833
4828
  *
4834
- * Date._rfc822 is an alias for Date._rfc2822.
4835
- *
4836
4829
  * Related: Date.rfc2822 (returns a \Date object).
4837
4830
  */
4838
4831
  static VALUE
@@ -4863,8 +4856,6 @@ date_s__rfc2822(int argc, VALUE *argv, VALUE klass)
4863
4856
  * - Argument {start}[rdoc-ref:calendars.rdoc@Argument+start].
4864
4857
  * - Argument {limit}[rdoc-ref:Date@Argument+limit].
4865
4858
  *
4866
- * Date.rfc822 is an alias for Date.rfc2822.
4867
- *
4868
4859
  * Related: Date._rfc2822 (returns a hash).
4869
4860
  */
4870
4861
  static VALUE
@@ -5345,7 +5336,6 @@ d_lite_yday(VALUE self)
5345
5336
  *
5346
5337
  * Date.new(2001, 2, 3).mon # => 2
5347
5338
  *
5348
- * Date#month is an alias for Date#mon.
5349
5339
  */
5350
5340
  static VALUE
5351
5341
  d_lite_mon(VALUE self)
@@ -5362,7 +5352,6 @@ d_lite_mon(VALUE self)
5362
5352
  *
5363
5353
  * Date.new(2001, 2, 3).mday # => 3
5364
5354
  *
5365
- * Date#day is an alias for Date#mday.
5366
5355
  */
5367
5356
  static VALUE
5368
5357
  d_lite_mday(VALUE self)
@@ -5612,7 +5601,6 @@ d_lite_hour(VALUE self)
5612
5601
  *
5613
5602
  * DateTime.new(2001, 2, 3, 4, 5, 6).min # => 5
5614
5603
  *
5615
- * Date#minute is an alias for Date#min.
5616
5604
  */
5617
5605
  static VALUE
5618
5606
  d_lite_min(VALUE self)
@@ -5629,7 +5617,6 @@ d_lite_min(VALUE self)
5629
5617
  *
5630
5618
  * DateTime.new(2001, 2, 3, 4, 5, 6).sec # => 6
5631
5619
  *
5632
- * Date#second is an alias for Date#sec.
5633
5620
  */
5634
5621
  static VALUE
5635
5622
  d_lite_sec(VALUE self)
@@ -5647,7 +5634,6 @@ d_lite_sec(VALUE self)
5647
5634
  *
5648
5635
  * DateTime.new(2001, 2, 3, 4, 5, 6.5).sec_fraction # => (1/2)
5649
5636
  *
5650
- * Date#second_fraction is an alias for Date#sec_fraction.
5651
5637
  */
5652
5638
  static VALUE
5653
5639
  d_lite_sec_fraction(VALUE self)
@@ -6423,7 +6409,6 @@ d_lite_prev_day(int argc, VALUE *argv, VALUE self)
6423
6409
  * d.to_s # => "2001-02-03"
6424
6410
  * d.next.to_s # => "2001-02-04"
6425
6411
  *
6426
- * Date#succ is an alias for Date#next.
6427
6412
  */
6428
6413
  static VALUE
6429
6414
  d_lite_next(VALUE self)
@@ -7297,7 +7282,6 @@ strftimev(const char *fmt, VALUE self,
7297
7282
  *
7298
7283
  * See {asctime}[https://linux.die.net/man/3/asctime].
7299
7284
  *
7300
- * Date#ctime is an alias for Date#asctime.
7301
7285
  */
7302
7286
  static VALUE
7303
7287
  d_lite_asctime(VALUE self)
@@ -7315,7 +7299,6 @@ d_lite_asctime(VALUE self)
7315
7299
  *
7316
7300
  * Date.new(2001, 2, 3).iso8601 # => "2001-02-03"
7317
7301
  *
7318
- * Date#xmlschema is an alias for Date#iso8601.
7319
7302
  */
7320
7303
  static VALUE
7321
7304
  d_lite_iso8601(VALUE self)
@@ -7348,7 +7331,6 @@ d_lite_rfc3339(VALUE self)
7348
7331
  *
7349
7332
  * Date.new(2001, 2, 3).rfc2822 # => "Sat, 3 Feb 2001 00:00:00 +0000"
7350
7333
  *
7351
- * Date#rfc822 is an alias for Date#rfc2822.
7352
7334
  */
7353
7335
  static VALUE
7354
7336
  d_lite_rfc2822(VALUE self)
@@ -7437,7 +7419,8 @@ d_lite_jisx0301(VALUE self)
7437
7419
  }
7438
7420
 
7439
7421
  static VALUE
7440
- deconstruct_keys(VALUE self, VALUE keys, int is_datetime) {
7422
+ deconstruct_keys(VALUE self, VALUE keys, int is_datetime)
7423
+ {
7441
7424
  VALUE h = rb_hash_new();
7442
7425
  long i;
7443
7426
 
@@ -7520,7 +7503,8 @@ deconstruct_keys(VALUE self, VALUE keys, int is_datetime) {
7520
7503
  *
7521
7504
  */
7522
7505
  static VALUE
7523
- d_lite_deconstruct_keys(VALUE self, VALUE keys) {
7506
+ d_lite_deconstruct_keys(VALUE self, VALUE keys)
7507
+ {
7524
7508
  return deconstruct_keys(self, keys, /* is_datetime=false */ 0);
7525
7509
  }
7526
7510
 
@@ -8742,8 +8726,8 @@ dt_lite_to_s(VALUE self)
8742
8726
  *
8743
8727
  * DateTime.now.strftime # => "2022-07-01T11:03:19-05:00"
8744
8728
  *
8745
- * For other formats, see
8746
- * {Formats for Dates and Times}[doc/strftime_formatting.rdoc].
8729
+ * For other formats,
8730
+ * see {Formats for Dates and Times}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html]:
8747
8731
  *
8748
8732
  */
8749
8733
  static VALUE
@@ -8868,7 +8852,8 @@ dt_lite_jisx0301(int argc, VALUE *argv, VALUE self)
8868
8852
  *
8869
8853
  */
8870
8854
  static VALUE
8871
- dt_lite_deconstruct_keys(VALUE self, VALUE keys) {
8855
+ dt_lite_deconstruct_keys(VALUE self, VALUE keys)
8856
+ {
8872
8857
  return deconstruct_keys(self, keys, /* is_datetime=true */ 1);
8873
8858
  }
8874
8859
 
@@ -10,28 +10,15 @@
10
10
  static const char *day_names[] = {
11
11
  "Sunday", "Monday", "Tuesday", "Wednesday",
12
12
  "Thursday", "Friday", "Saturday",
13
- "Sun", "Mon", "Tue", "Wed",
14
- "Thu", "Fri", "Sat"
15
13
  };
14
+ static const int ABBREVIATED_DAY_NAME_LENGTH = 3;
16
15
 
17
16
  static const char *month_names[] = {
18
17
  "January", "February", "March", "April",
19
18
  "May", "June", "July", "August", "September",
20
19
  "October", "November", "December",
21
- "Jan", "Feb", "Mar", "Apr", "May", "Jun",
22
- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
23
- };
24
-
25
- static const char *merid_names[] = {
26
- "am", "pm",
27
- "a.m.", "p.m."
28
- };
29
-
30
- static const char *extz_pats[] = {
31
- ":z",
32
- "::z",
33
- ":::z"
34
20
  };
21
+ static const int ABBREVIATED_MONTH_NAME_LENGTH = 3;
35
22
 
36
23
  #define sizeof_array(o) (sizeof o / sizeof o[0])
37
24
 
@@ -75,7 +62,7 @@ num_pattern_p(const char *s)
75
62
  #define NUM_PATTERN_P() num_pattern_p(&fmt[fi + 1])
76
63
 
77
64
  static long
78
- read_digits(const char *s, VALUE *n, size_t width)
65
+ read_digits(const char *s, size_t slen, VALUE *n, size_t width)
79
66
  {
80
67
  size_t l;
81
68
 
@@ -83,7 +70,7 @@ read_digits(const char *s, VALUE *n, size_t width)
83
70
  return 0;
84
71
 
85
72
  l = 0;
86
- while (ISDIGIT(s[l])) {
73
+ while (l < slen && ISDIGIT(s[l])) {
87
74
  if (++l == width) break;
88
75
  }
89
76
 
@@ -131,7 +118,7 @@ do { \
131
118
  #define READ_DIGITS(n,w) \
132
119
  do { \
133
120
  size_t l; \
134
- l = read_digits(&str[si], &n, w); \
121
+ l = read_digits(&str[si], slen - si, &n, w); \
135
122
  if (l == 0) \
136
123
  fail(); \
137
124
  si += l; \
@@ -161,6 +148,12 @@ do { \
161
148
 
162
149
  VALUE date_zone_to_diff(VALUE);
163
150
 
151
+ static inline int
152
+ head_match_p(size_t len, const char *name, const char *str, size_t slen, size_t si)
153
+ {
154
+ return slen - si >= len && strncasecmp(name, &str[si], len) == 0;
155
+ }
156
+
164
157
  static size_t
165
158
  date__strptime_internal(const char *str, size_t slen,
166
159
  const char *fmt, size_t flen, VALUE hash)
@@ -168,9 +161,18 @@ date__strptime_internal(const char *str, size_t slen,
168
161
  size_t si, fi;
169
162
  int c;
170
163
 
164
+ #define HEAD_MATCH_P(len, name) head_match_p(len, name, str, slen, si)
171
165
  si = fi = 0;
172
166
 
173
167
  while (fi < flen) {
168
+ if (isspace((unsigned char)fmt[fi])) {
169
+ while (si < slen && isspace((unsigned char)str[si]))
170
+ si++;
171
+ while (++fi < flen && isspace((unsigned char)fmt[fi]));
172
+ continue;
173
+ }
174
+
175
+ if (si >= slen) fail();
174
176
 
175
177
  switch (fmt[fi]) {
176
178
  case '%':
@@ -194,12 +196,11 @@ date__strptime_internal(const char *str, size_t slen,
194
196
  {
195
197
  int i;
196
198
 
197
- for (i = 0; i < (int)sizeof_array(extz_pats); i++)
198
- if (strncmp(extz_pats[i], &fmt[fi],
199
- strlen(extz_pats[i])) == 0) {
200
- fi += i;
201
- goto again;
202
- }
199
+ for (i = 1; i < 3 && fi + i < flen && fmt[fi+i] == ':'; ++i);
200
+ if (fmt[fi+i] == 'z') {
201
+ fi += i - 1;
202
+ goto again;
203
+ }
203
204
  fail();
204
205
  }
205
206
 
@@ -209,10 +210,12 @@ date__strptime_internal(const char *str, size_t slen,
209
210
  int i;
210
211
 
211
212
  for (i = 0; i < (int)sizeof_array(day_names); i++) {
212
- size_t l = strlen(day_names[i]);
213
- if (strncasecmp(day_names[i], &str[si], l) == 0) {
213
+ const char *day_name = day_names[i];
214
+ size_t l = strlen(day_name);
215
+ if (HEAD_MATCH_P(l, day_name) ||
216
+ HEAD_MATCH_P(l = ABBREVIATED_DAY_NAME_LENGTH, day_name)) {
214
217
  si += l;
215
- set_hash("wday", INT2FIX(i % 7));
218
+ set_hash("wday", INT2FIX(i));
216
219
  goto matched;
217
220
  }
218
221
  }
@@ -225,10 +228,12 @@ date__strptime_internal(const char *str, size_t slen,
225
228
  int i;
226
229
 
227
230
  for (i = 0; i < (int)sizeof_array(month_names); i++) {
228
- size_t l = strlen(month_names[i]);
229
- if (strncasecmp(month_names[i], &str[si], l) == 0) {
231
+ const char *month_name = month_names[i];
232
+ size_t l = strlen(month_name);
233
+ if (HEAD_MATCH_P(l, month_name) ||
234
+ HEAD_MATCH_P(l = ABBREVIATED_MONTH_NAME_LENGTH, month_name)) {
230
235
  si += l;
231
- set_hash("mon", INT2FIX((i % 12) + 1));
236
+ set_hash("mon", INT2FIX(i + 1));
232
237
  goto matched;
233
238
  }
234
239
  }
@@ -402,18 +407,19 @@ date__strptime_internal(const char *str, size_t slen,
402
407
 
403
408
  case 'P':
404
409
  case 'p':
410
+ if (slen - si < 2) fail();
405
411
  {
406
- int i;
407
-
408
- for (i = 0; i < 4; i++) {
409
- size_t l = strlen(merid_names[i]);
410
- if (strncasecmp(merid_names[i], &str[si], l) == 0) {
411
- si += l;
412
- set_hash("_merid", INT2FIX((i % 2) == 0 ? 0 : 12));
413
- goto matched;
414
- }
412
+ char c = str[si];
413
+ const int hour = (c == 'P' || c == 'p') ? 12 : 0;
414
+ if (!hour && !(c == 'A' || c == 'a')) fail();
415
+ if ((c = str[si+1]) == '.') {
416
+ if (slen - si < 4 || str[si+3] != '.') fail();
417
+ c = str[si += 2];
415
418
  }
416
- fail();
419
+ if (!(c == 'M' || c == 'm')) fail();
420
+ si += 2;
421
+ set_hash("_merid", INT2FIX(hour));
422
+ goto matched;
417
423
  }
418
424
 
419
425
  case 'Q':
@@ -587,7 +593,7 @@ date__strptime_internal(const char *str, size_t slen,
587
593
 
588
594
  b = rb_backref_get();
589
595
  rb_match_busy(b);
590
- m = f_match(pat, rb_usascii_str_new2(&str[si]));
596
+ m = f_match(pat, rb_usascii_str_new(&str[si], slen - si));
591
597
 
592
598
  if (!NIL_P(m)) {
593
599
  VALUE s, l, o;
@@ -619,22 +625,13 @@ date__strptime_internal(const char *str, size_t slen,
619
625
  if (str[si] != '%')
620
626
  fail();
621
627
  si++;
622
- if (fi < flen)
623
- if (str[si] != fmt[fi])
628
+ if (fi < flen) {
629
+ if (si >= slen || str[si] != fmt[fi])
624
630
  fail();
625
- si++;
631
+ si++;
632
+ }
626
633
  goto matched;
627
634
  }
628
- case ' ':
629
- case '\t':
630
- case '\n':
631
- case '\v':
632
- case '\f':
633
- case '\r':
634
- while (isspace((unsigned char)str[si]))
635
- si++;
636
- fi++;
637
- break;
638
635
  default:
639
636
  ordinal:
640
637
  if (str[si] != fmt[fi])
data/lib/date.rb CHANGED
@@ -4,7 +4,7 @@
4
4
  require 'date_core'
5
5
 
6
6
  class Date
7
- VERSION = "3.3.2" # :nodoc:
7
+ VERSION = "3.3.4" # :nodoc:
8
8
 
9
9
  # call-seq:
10
10
  # infinite? -> false
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: date
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.2
4
+ version: 3.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tadayoshi Funaba
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-12-16 00:00:00.000000000 Z
11
+ date: 2023-11-07 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A subclass of Object includes Comparable module for handling dates.
14
14
  email:
@@ -49,7 +49,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
49
49
  - !ruby/object:Gem::Version
50
50
  version: '0'
51
51
  requirements: []
52
- rubygems_version: 3.3.26
52
+ rubygems_version: 3.5.0.dev
53
53
  signing_key:
54
54
  specification_version: 4
55
55
  summary: A subclass of Object includes Comparable module for handling dates.