Las especificaciones de OptimizedImage fallan con Ruby 3.0.2

Estoy trabajando en el soporte de Ruby 3 y he obtenido este fallo en la especificación.

Pasos para reproducir

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

Resultado esperado

Debería finalizar correctamente de la siguiente manera:

1 ejemplo, 0 fallos

Resultado real

Siempre falla de la siguiente manera.

$ bundle exec rspec spec/models/optimized_image_spec.rb:10
Opciones de ejecución: incluir {:locations=>{"./spec/models/optimized_image_spec.rb"=>[10]}}

Aleatorizado con semilla 44957
F

Fallos:

  1) OptimizedImage.crop debería producir imágenes recortadas (requiere ImageMagick 7)
     Error en la expectativa: expect(cropped_size).to be < 120

       esperado: < 120
            obtenido:   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 en 0.22966 segundos (los archivos tardaron 2.89 segundos en cargar)
1 ejemplo, 1 fallo

Ejemplos fallidos:

rspec ./spec/models/optimized_image_spec.rb:10 # OptimizedImage.crop debería producir imágenes recortadas (requiere ImageMagick 7)

Aleatorizado con semilla 44957

$

Información de diagnóstico

Este fallo está relacionado con esta línea.

Cuando se ejecuta con Ruby 2.7.4 funciona, pero con Ruby 3.0.2 lanza “no se puede convertir ImageOptim::Timer a Float (TypeError)”. Estos son los pasos mínimos para reproducirlo.

$ 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)
  • Con Ruby 3.0.2, muestra “no se puede convertir ImageOptim::Timer a Float (TypeError)”
$ ruby -v
ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x86_64-linux]
$ ruby foo.rb
foo.rb:14:in `join': no se puede convertir ImageOptim::Timer a Float (TypeError)
	from foo.rb:14:in `<main>'
Vie Oct  1 12:42:51 PM JST 2021
$
  • Con Ruby 2.7.4 funciona sin excepciones.
$ ruby -v
ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x86_64-linux]
$ ruby foo.rb
Vie Oct  1 12:44:00 PM JST 2021
$

Parece que hay una solución sencilla allí… solo añade un .to_f

if waiter.join(timeout.to_f)

¿Puedes enviar un PR?

Gracias por la sugerencia. Claro. Abriré una solicitud de extracción en GitHub - toy/image_optim: Optimize images using multiple utilities · GitHub.

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