Skip to content

Using timecop with psych 4.0.5, behavior differs between the test environment and other environments #390

@sanfrecce-osaka

Description

@sanfrecce-osaka

Steps to reproduce

Under the following conditions,

  • psych version: 4.0.5
  • timecop version: 0.9.5
  • ruby version: 3.1.2
  • rails version: 6.1.6.1

run the following.

$ bin/rails c
irb(main):001:0> YAML.unsafe_load('foo: 2020-12-30')
=> {"foo"=>Wed, 30 Dec 2020}

This is the expected result.

Next, run the following.

$ bin/rails c -e test
irb(main):001:0> YAML.unsafe_load('foo: 2020-12-30')
=> {"foo"=>"2020-12-30"}

I was expecting that value is Date as well, but it turned out to be String.

Expected behavior

Value is Date.

Actual behavior

Value is String.

Reason

Since psych 4.0.5, Psych::ScalarScanner#tokenize passes Date::GREGORIAN as the third argument of Date.strptime.

cf. ruby/psych#573

However, when using timecop, Date.strptime_with_mock_date(This is an alias of Date.strptime) only allows Date::ITALY as the third argument.

cf. https://github.com/travisjeffery/timecop/blob/v0.9.5/lib/timecop/time_extensions.rb#L47-L51

So ArgumentError is raised and Psych::ScalarScanner#tokenize returns String.

cf. https://github.com/ruby/psych/blob/v4.0.5/lib/psych/scalar_scanner.rb#L63-L69

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions