Especificações do OptimizedImage falhando com Ruby 3.0.2

Estou trabalhando no suporte ao Ruby 3 e obtive essa falha em um teste.

Passos para reproduzir

  1. Execute o Ruby 3.0.2
$ cd discourse
$ bundle exec rspec spec/models/optimized_image_spec.rb:10

Resultado esperado

Deve finalizar com sucesso da seguinte forma:

1 exemplo, 0 falhas

Resultado real

Sempre ocorre uma falha da seguinte forma.

$ bundle exec rspec spec/models/optimized_image_spec.rb:10
Opções de execução: incluir {:locations=>{"./spec/models/optimized_image_spec.rb"=>[10]}}

Randomizado com seed 44957
F

Falhas:

  1) OptimizedImage.crop deve produzir imagens recortadas (requer ImageMagick 7)
     Erro de execução: expect(cropped_size).to be < 120

       esperado: < 120
            obtido:   9476
     # ./spec/models/optimized_image_spec.rb:27:in `block (3 levels) in <top (required)>'
     # ./spec/rails_helper.rb:279:in `block (2 levels) in <top (required)>'

Finalizado em 0,22966 segundos (os arquivos levaram 2,89 segundos para carregar)
1 exemplo, 1 falha

Exemplos com falha:

rspec ./spec/models/optimized_image_spec.rb:10 # OptimizedImage.crop deve produzir imagens recortadas (requer ImageMagick 7)

Randomizado com seed 44957

$

Informações de diagnóstico

Essa falha está relacionada a esta linha.

Quando executado com o Ruby 2.7.4 funciona, mas com o Ruby 3.0.2 gera o erro “não é possível converter ImageOptim::Timer em Float (TypeError)”. Aqui estão os passos mínimos para reproduzir.

$ more foo.rb
gem 'image_optim'
require 'image_optim'

timeout = ImageOptim::Timer.new(15.0)

args = [{"PATH"=>
   "/usr/bin"},
   "date"
]

pid = Process.spawn(*args)
waiter = Process.detach(pid)

waiter.join(timeout)
  • Com o Ruby 3.0.2, mostra “não é possível converter ImageOptim::Timer em Float (TypeError)”
$ ruby -v
ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x86_64-linux]
$ ruby foo.rb
foo.rb:14:in `join': não é possível converter ImageOptim::Timer em Float (TypeError)
	from foo.rb:14:in `<main>'
Sex Out  1 12:42:51 PM JST 2021
$
  • Com o Ruby 2.7.4 funciona sem exceções.
$ ruby -v
ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x86_64-linux]
$ ruby foo.rb
Sex Out  1 12:44:00 PM JST 2021
$

Parece que há uma correção simples ali… basta adicionar um .to_f.

if waiter.join(timeout.to_f)

Você pode enviar um PR?

Obrigado pela sugestão. Claro. Vou abrir um pull request em GitHub - toy/image_optim: Optimize images using multiple utilities · GitHub.

Abriu Fix: TypeError: can't convert ImageOptim::Timer into Float by yahonda · Pull Request #194 · toy/image_optim · GitHub