Time objects fail to round-trip with equality

Aberta
#402 0 comentários 0 reações 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
3/5
Tempo estimado
1-2 dias
Facilidade para iniciantes
45/100
Tipo de issue
Bug
Clareza
Razoavelmente clara
Status de atividade
Estagnada
Stack de tecnologia
ruby
Domínio
backend

Direção de pesquisa

Execute o script Ruby fornecido e inspecione o round trip de YAML.dump/YAML.load para objetos Time, comparando Time#==, Time#to_f e Time#nsec conforme mostrado. Considera-se concluído quando as instâncias Time original e carregada forem iguais, incluindo o caso de fração de segundo relatado.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

I ran the following script:

require 'yaml'

puts Psych::VERSION

def compare(time)
  dumped = YAML.dump(time)
  loaded = YAML.load(YAML.dump(time))
  equal = loaded == time

  pp(
    original: time,
    loaded: loaded,
    equal: equal,
#    nsec: { original: time.nsec, loaded: loaded.nsec, equal: time.nsec == loaded.nsec }
    float: { original: time.to_f, loaded: loaded.to_f, equal: time.to_f == loaded.to_f }
  )
end

compare(Time.new(2002, 4, 5, 6, 7, 8.9992321))
compare(YAML.load YAML.dump Time.new(2002, 4, 5, 6, 7, 8.9992321))

And got the following output:

3.0.2
{:original=>2002-04-05 06:07:08 -0800,
 :loaded=>2002-04-05 06:07:08 -0800,
 :equal=>false,
 :float=>
  {:original=>1018015628.999232, :loaded=>1018015628.9992322, :equal=>false}}
{:original=>2002-04-05 06:07:08 -0800,
 :loaded=>2002-04-05 06:07:08 -0800,
 :equal=>true,
 :float=>
  {:original=>1018015628.9992322, :loaded=>1018015628.9992322, :equal=>true}}

I would expect both Time instances to compare equal to their dumped & loaded counterpart, but the first does not. By inspection, we can see that the Time#to_f of the original & loaded instances are different, which I'd guess is what's breaking Time#==. Curiously, the Time#nsec property is preserved properly.

Linguagem predominante
Ruby
Estrelas
596
Forks
223
Merge médio
8h 38min
PRs com merge (30d)
2

Preparar o ambiente

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de ruby/psych

Todas as issues de ruby/psych

Issues semelhantes

Mais issues de Ruby

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.