Ruby 3.0.2에서 OptimizedImage 스펙이 실패합니다

Ruby 3 지원을 작업하던 중 다음과 같은 스펙 실패가 발생했습니다.

재현 방법

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

예상 결과

다음과 같이 성공적으로 완료되어야 합니다.

1 example, 0 failures

실제 결과

항상 다음과 같이 실패합니다.

$ bundle exec rspec spec/models/optimized_image_spec.rb:10
Run options: include {:locations=>{"./spec/models/optimized_image_spec.rb"=>[10]}}

Randomized with seed 44957
F

Failures:

  1) OptimizedImage.crop should produce cropped images (requires ImageMagick 7)
     Failure/Error: expect(cropped_size).to be < 120

       expected: < 120
            got:   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)>'

Finished in 0.22966 seconds (files took 2.89 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./spec/models/optimized_image_spec.rb:10 # OptimizedImage.crop should produce cropped images (requires ImageMagick 7)

Randomized with seed 44957

$

진단 정보

이 실패는 다음 줄과 관련이 있습니다.

Ruby 2.7.4에서는 작동하지만 Ruby 3.0.2에서는 "can’t convert ImageOptim::Timer into Float (TypeError)"가 발생합니다. 재현을 위한 최소한의 단계는 다음과 같습니다.

$ 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)
  • Ruby 3.0.2에서는 "can’t convert ImageOptim::Timer into Float (TypeError)"가 표시됩니다.
$ ruby -v
ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x86_64-linux]
$ ruby foo.rb
foo.rb:14:in `join': can't convert ImageOptim::Timer into Float (TypeError)
	from foo.rb:14:in `<main>'
Fri Oct  1 12:42:51 PM JST 2021
$
  • Ruby 2.7.4에서는 예외 없이 정상적으로 작동합니다.
$ ruby -v
ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x86_64-linux]
$ ruby foo.rb
Fri Oct  1 12:44:00 PM JST 2021
$

간단한 수정 사항이 있는 것 같습니다 … .to_f만 추가하면 됩니다.

if waiter.join(timeout.to_f)

PR을 보내 주시겠어요?

제안해 주셔서 감사합니다. 물론이죠. GitHub - toy/image_optim: Optimize images using multiple utilities · GitHub 에 pull request를 올리겠습니다.

Fix: TypeError: can't convert ImageOptim::Timer into Float - Pull Request #194 - toy/image_optim - GitHub 열림