151 Commits
Author SHA1 Message Date
youdie006 a9d3eadfc8 [ruby/date] Deprecate lenient RFC 3339 date time separators
RFC 3339 allows only "T", and by convention a space, between the date
and the time, but Date._rfc3339 also accepts \t, \n, \v, \f and \r.
Warn on those under Warning[:deprecated] before they become an error.

The separator is now captured so rfc3339_cb can inspect it, which
shifts the remaining group indices.

https://github.com/ruby/date/commit/ffb9d45105
2026-10-09 22:45:03 +00:00
sjh9714 8971984922 [ruby/date] Assert warnings for invalid offsets
https://github.com/ruby/date/commit/569565d8c0
2026-08-28 16:00:02 +00:00
sjh9714 c84cb4d4f3 [ruby/date] Range-check the integral Rational offset
Every branch of offset_to_sec range-checks the resulting number of
seconds except one path through the Rational branch: when the day
fraction is an integral Rational, n is assigned inside the if arm and
reaches *rof without passing the guard that sits in the else arm.

DateTime.new(2024, 1, 1, 0, 0, 0, Rational(2, 1)) therefore produced a
48-hour offset, while the equivalent Integer 2 is rejected and falls
back to +00:00. Rational(49710, 1) is 4_294_944_000 seconds, over
INT_MAX, so the (int) narrowing turned a large positive offset into a
negative one.

Move the check below the if/else so it covers both arms. That also
bounds n before the narrowing. Rational(1, 1) is exactly
DAY_IN_SECONDS and the guard is inclusive, so in-range values are
unaffected.

https://github.com/ruby/date/commit/7524d7c41f
2026-08-28 16:00:02 +00:00
Nobuyoshi Nakada 2084db2eab [ruby/date] Validate the commercial week range before conversion
Reject week numbers outside -53..-1 and 1..53 before conversion so
integer overflow cannot make invalid input appear valid.

Fixes https://github.com/ruby/date/pull/180.

https://github.com/ruby/date/commit/e9c07010c7
2026-08-28 15:58:42 +00:00
Nobuyoshi Nakada b95de2b9a4 [ruby/date] Preserve input encoding when parsing time zones
Pass the input encoding through `date__strptime` so non-ASCII trailing
data is treated as a parse failure instead of raising an encoding error.

Fixes https://github.com/ruby/date/pull/179.

https://github.com/ruby/date/commit/edf7cf016c
2026-08-28 15:58:33 +00:00
Nobuyoshi Nakada 5d72b7cb46 [ruby/date] Verify all argument classes first
https://github.com/ruby/date/commit/c98d85dfd3
2026-05-29 04:21:36 +00:00
Benoit Daloze 9eea01fccb [ruby/date] Exclude test causing transient timeouts on TruffleRuby
https://github.com/ruby/date/commit/840494d1ae
2026-04-15 21:44:56 +00:00
Nobuyoshi Nakada e49e0bb6c9 [ruby/date] Remove archaic conditions
`Time#nsec` and `Time#subsec` were both introduced in Ruby 1.9.

https://github.com/ruby/date/commit/2c310d9f5c
2025-10-29 10:03:50 +00:00
Nobuyoshi Nakada 0f62908372 [ruby/date] Prefer method_defined? over allocate.respond_to?
https://github.com/ruby/date/commit/fd8e3725f8
2025-10-29 10:03:50 +00:00
Nobuyoshi Nakada e6188c45e1 [ruby/date] Date._parse does not accept nil
https://github.com/ruby/date/commit/545066ca28
2025-10-06 14:22:03 +09:00
Nobuyoshi Nakada f13e68e252 [ruby/date] Do not repeat conversions to string
https://github.com/ruby/date/commit/159e1ebb7f
https://github.com/ruby/date/commit/4f7b6c9b42
2025-10-06 13:16:56 +09:00
Dmitry Dygalo 022c18b60d [ruby/date] [Bug #21436] check for fixnum lower bound in m_ajd
Issue - https://bugs.ruby-lang.org/issues/21436

Apparently, the lower bound check is missing, which results in overflow & wrapping later on in RB_INT2FIX

Signed-off-by: Dmitry Dygalo <dmitry.dygalo@workato.com>

https://github.com/ruby/date/commit/67d75e8423
2025-06-15 16:12:45 +00:00
Dmitry Dygalo c1877d431e [ruby/date] [Bug #21437] Date#hash for large years
Addresses https://bugs.ruby-lang.org/issues/21437

Signed-off-by: Dmitry Dygalo <dmitry.dygalo@workato.com>

https://github.com/ruby/date/commit/31f07bc576
2025-06-15 16:11:06 +00:00
Hiroshi SHIBATA ac1dfee44a [ruby/date] Removed workaround for assert_ractor
https://github.com/ruby/date/commit/700e44ef54
2025-06-04 05:28:25 +00:00
Hiroshi SHIBATA 52d85c0efb [ruby/date] Alias value to take in old Ruby
https://github.com/ruby/date/commit/1ce29a26dd
2025-06-03 06:46:56 +00:00
Koichi Sasada ef2bb61018 Ractor::Port
* Added `Ractor::Port`
  * `Ractor::Port#receive` (support multi-threads)
  * `Rcator::Port#close`
  * `Ractor::Port#closed?`
* Added some methods
  * `Ractor#join`
  * `Ractor#value`
  * `Ractor#monitor`
  * `Ractor#unmonitor`
* Removed some methods
  * `Ractor#take`
  * `Ractor.yield`
* Change the spec
  * `Racotr.select`

You can wait for multiple sequences of messages with `Ractor::Port`.

```ruby
ports = 3.times.map{ Ractor::Port.new }
ports.map.with_index do |port, ri|
  Ractor.new port,ri do |port, ri|
    3.times{|i| port << "r#{ri}-#{i}"}
  end
end

p ports.each{|port| pp 3.times.map{port.receive}}

```

In this example, we use 3 ports, and 3 Ractors send messages to them respectively.
We can receive a series of messages from each port.

You can use `Ractor#value` to get the last value of a Ractor's block:

```ruby
result = Ractor.new do
  heavy_task()
end.value
```

You can wait for the termination of a Ractor with `Ractor#join` like this:

```ruby
Ractor.new do
  some_task()
end.join
```

`#value` and `#join` are similar to `Thread#value` and `Thread#join`.

To implement `#join`, `Ractor#monitor` (and `Ractor#unmonitor`) is introduced.

This commit changes `Ractor.select()` method.
It now only accepts ports or Ractors, and returns when a port receives a message or a Ractor terminates.

We removes `Ractor.yield` and `Ractor#take` because:
* `Ractor::Port` supports most of similar use cases in a simpler manner.
* Removing them significantly simplifies the code.

We also change the internal thread scheduler code (thread_pthread.c):
* During barrier synchronization, we keep the `ractor_sched` lock to avoid deadlocks.
  This lock is released by `rb_ractor_sched_barrier_end()`
  which is called at the end of operations that require the barrier.
* fix potential deadlock issues by checking interrupts just before setting UBF.

https://bugs.ruby-lang.org/issues/21262
2025-05-31 04:01:33 +09:00
Andrew Konchin 8adc96b5ca [ruby/date] Skip tests failing on TruffleRuby
https://github.com/ruby/date/commit/d019ac8186
2025-01-10 15:59:25 +00:00
Nobuyoshi Nakada e4f5fd8e5f [ruby/date] Refine assertions
https://github.com/ruby/date/commit/1970b740d0
2024-11-05 04:19:39 +00:00
Dmitrii Zudin ee4599dbe7 [ruby/date] Fix incorrect argc2 decrement in datetime_s_iso8601 function
Replace the decrement (argc2--) with an increment (argc2++) for
the correct number of arguments when opt is provided.

https://github.com/ruby/date/commit/b6974b00d8
2024-11-05 03:38:13 +00:00
Nobuyoshi Nakada 2e6f8554f8 [ruby/date] Remove the unintentional ability to parse Symbol
It's been 2 years since ruby/date#49, so it's okay.

https://github.com/ruby/date/commit/435dfec6c8
2024-02-21 16:04:52 +00:00
zverok 1859784422 [ruby/date] Implement Date#deconstruct_keys and DateTime#deconstruct_keys
https://github.com/ruby/date/commit/6bb6d3a810
2022-12-13 19:52:06 +00:00
Nobuyoshi Nakada 1b7c5c394f [ruby/date] Fix misplaced time zone offset checks
https://github.com/ruby/date/commit/d21c69450a
2022-10-07 14:41:31 +09:00
Nobuyoshi Nakada cb16dcb184 [ruby/date] The shrunk words to be copied is limited
Th buffer size is small enough and no need to allocate dynamically.

https://github.com/ruby/date/commit/f62bf0a01d
2022-09-29 14:56:39 +09:00
Nobuyoshi Nakada 5a8aaedaff [ruby/date] Narrow ALLOCV region for shrunk words
https://github.com/ruby/date/commit/f51b038074
2022-09-29 14:06:36 +09:00
Nobuyoshi Nakada d12fce7af3 [ruby/date] Check time zone offset elements
Too big parts of fractional hour time zone offset can cause assertion
failures.

https://github.com/ruby/date/commit/06bcfb2729
2022-09-28 21:07:00 +09:00
Nobuyoshi Nakada e07d450dea [ruby/date] Fix Time#to_datetime before calendar reform
Time is always in the proleptic Gregorian calendar.
Also DateTime#to_time should convert to the Gregorian calendar first,
before extracting its components.

https://bugs.ruby-lang.org/issues/18946#change-98527

https://github.com/ruby/date/commit/b2aee75248
2022-08-08 23:50:17 +09:00
Jeremy Evans ab3cb29bd9 Avoid defining the same test class in multiple files
Should fix issues with parallel testing sometimes not running all
tests.

This should be viewed skipping whitespace changes.

Fixes [Bug #18731]
2022-04-22 15:00:16 -07:00
Yusuke Endoh ddd83e8462 test/date/test_date_parse.rb: relax the time limit
The timeout was very strict for weak CI machines like qemu-riscv.
Due to the additional overhead for Regexp.timeout=, it started failing
on such machines.

http://rubyci.s3.amazonaws.com/debian-riscv64/ruby-master/log/20220330T200018Z.fail.html.gz
```
  1) Error:
TestDateParse#test__parse_too_long_year:
Timeout::Error: execution expired
```
2022-03-31 12:52:16 +09:00
Nobuyoshi Nakada 8780f15fd7 [ruby/date] Use assert_deprecated_warn
https://github.com/ruby/date/commit/c55004715a
2022-02-25 20:39:47 +09:00
Nobuyoshi Nakada bb22bc76b0 [ruby/date] Deprecate the unintentional ability to parse Symbol
https://github.com/ruby/date/commit/d57818f3b3
2022-02-25 19:57:50 +09:00
Nobuyoshi Nakada d4f32b6b7b [ruby/date] Scale timeouts
https://github.com/ruby/date/commit/2889698e2f
2022-02-25 19:52:33 +09:00
Nobuyoshi Nakada 4933d7fe56 [ruby/date] Update tests
https://github.com/ruby/date/commit/5a138afce9
2022-02-25 19:52:32 +09:00
Nobuyoshi Nakada b5c2a0840f [ruby/date] Anchor at beginning of numbers
https://hackerone.com/reports/1254844

https://github.com/ruby/date/commit/2f7814cc22
2022-02-25 19:52:31 +09:00
Nobuyoshi Nakada 1758eade57 [ruby/date] Anchor at beginning of numbers
https://hackerone.com/reports/1254844

https://github.com/ruby/date/commit/7ffe25e458
2022-02-25 19:52:31 +09:00
Hiroshi SHIBATA 7f5e06601b [ruby/date] Use omit instead of skip for test-unit
https://github.com/ruby/date/commit/537f3f681e
2022-01-12 10:53:34 +09:00
Jean Boussier a87c56f820 [ruby/date] check_limit: also handle symbols
https://github.com/ruby/date/commit/376c65942b
2021-11-16 22:51:41 +09:00
Jean Boussier fa674cf723 [ruby/date] Date._<format>(nil) should return an empty Hash
Fix: https://github.com/ruby/date/issues/39

This is how versions previous to 3.2.1 behaved and Active Support
currently rely on this behavior.

https://github.com/rails/rails/blob/90357af08048ef5076730505f6e7b14a81f33d0c/activesupport/lib/active_support/values/time_zone.rb#L383-L384

Any Rails application upgrading to date `3.2.1` might run into unexpected errors.

https://github.com/ruby/date/commit/8f2d7a0c7e
2021-11-16 22:51:40 +09:00
Yusuke Endoh 489c8cebf5 [ruby/date] Add length limit option for methods that parses date strings
`Date.parse` now raises an ArgumentError when a given date string is
longer than 128. You can configure the limit by giving `limit` keyword
arguments like `Date.parse(str, limit: 1000)`. If you pass `limit: nil`,
the limit is disabled.

Not only `Date.parse` but also the following methods are changed.

* Date._parse
* Date.parse
* DateTime.parse
* Date._iso8601
* Date.iso8601
* DateTime.iso8601
* Date._rfc3339
* Date.rfc3339
* DateTime.rfc3339
* Date._xmlschema
* Date.xmlschema
* DateTime.xmlschema
* Date._rfc2822
* Date.rfc2822
* DateTime.rfc2822
* Date._rfc822
* Date.rfc822
* DateTime.rfc822
* Date._jisx0301
* Date.jisx0301
* DateTime.jisx0301

https://github.com/ruby/date/commit/3959accef8
2021-11-16 20:56:56 +09:00
Jeremy Evans f9f7f3a75e [ruby/date] Make %v strftime flag use uppercase month
%v is supposed to be the VMS date, and VMS date format uses an
uppercase month.

Ruby 1.8 used an uppercase month for %v, but the behavior was
changed without explanation in r31672.

Time#strftime still uses an uppercase month for %v, so this change
makes Date#strftime consistent with Time#strftime.

Fixes [Bug #13810]

https://github.com/ruby/date/commit/56c489fd7e
2021-09-28 17:34:26 +09:00
Jeremy Evans 8065670cfb [ruby/date] Fix comparison with Float::INFINITY
Fixes [Bug #17945]

https://github.com/ruby/date/commit/953d907238
2021-07-11 20:28:21 +09:00
Marc-Andre Lafortune f2f00e24fa [ruby/date] Make Ractor-compatible 2020-12-22 03:12:51 -05:00
Jeremy Evans ad156f7e2c [ruby/date] Fix cannot load complex into simple error when loading marshal dump (Fixes #20)
This problem exists because Marshal.load calls Date.allocate, which
uses a SimpleDateData.  There doesn't seem to be any support for
taking an existing Date instance and converting it from SimpleDateData
to ComplexDateData.  Work around this issue by making Date.allocate
use a ComplexDateData.  This causes problems in Date#initialize,
so remove the Date#initialize method (keeping the date_initialize
function, used internally for Date.civil). Alias Date.new to
Date.civil, since they do the same thing.

https://github.com/ruby/date/commit/6bb8d8fa0f
2020-06-20 18:35:03 +09:00
Nobuyoshi Nakada e68999c82c Fixed misspellings
Fixed misspellings reported at [Bug #16437], for default gems.
2019-12-20 12:19:45 +09:00
Jeremy Evans 469545307f [ruby/date] Add more timezone abbreviations
This gets the time zone abbreviations from
https://www.timeanddate.com/time/zones/, and adds unambiguous time
zones not already present in zonetab.list.  See bin/update-abbr
for the program used.

This regenerates zonetab.h using prereq.mk (requires gperf).

Only one test line is added, just to make sure a new time zone
abbreviation is picked up.

Fixes Ruby Bug 16286

https://github.com/ruby/date/commit/702e8b3033
2019-11-01 17:30:14 +09:00
Jeremy Evans 3895e548bd [ruby/date] Revert "Simplify #inspect"
This reverts commit af01edd7d8575f544f647dbe8cde5b6ae535d459.

Revert requested by Yui Naruse.

https://github.com/ruby/date/commit/875d563557
2019-10-31 15:51:30 +09:00
glaszig fce940aac7 [ruby/date] introduce Date::Error, raise Date::Error for every
"invalid <anything>" type of exception

https://github.com/ruby/date/commit/3e55c09ba4
2019-10-31 15:51:25 +09:00
Jeremy Evans 5fe8943fda Fix typo causing Date.new(year, month) to fail
Add a test for this case.
2019-10-24 12:34:51 -07:00
zverok 913807bd6c [ruby/date] Simplify #inspect
https://github.com/ruby/date/commit/af01edd7d8
2019-10-24 18:39:04 +09:00
Jeremy Evans 2e37c1960a [ruby/date] Remove taint support
Ruby 2.7 deprecates taint and it no longer has an effect.
The lack of taint support should not cause a problem in
previous versions.

https://github.com/ruby/date/commit/519470dc3b
2019-10-24 18:39:04 +09:00
Jeremy Evans fc0e8d00bc [ruby/date] Support -Float::INFINITY...date ranges
Fixes Ruby Bug 12961

https://github.com/ruby/date/commit/7f533c2552
2019-10-24 18:39:04 +09:00