thoughtbot / appraisal

A Ruby library for testing your library against different versions of dependencies.
https://thoughtbot.com
MIT License
1.25k stars 107 forks source link

`customize_gemfiles` not working correctly with Ruby 3.1 due to hash used for keyword arguments #213

Closed gstokkink closed 5 months ago

gstokkink commented 11 months ago

Hi!

When trying to use the new customize_gemfiles functionality, I run into the following error when using Ruby 3.1:

bundle exec appraisal install                                                                                                                                                                                               15:05:24
bundler: failed to load command: appraisal (/Users/work/.rbenv/versions/3.1.4/bin/appraisal)
/Users/work/.rbenv/versions/3.1.4/lib/ruby/gems/3.1.0/gems/appraisal-2.5.0/lib/appraisal/customize.rb:3:in `initialize': wrong number of arguments (given 1, expected 0) (ArgumentError)
        from /Users/work/.rbenv/versions/3.1.4/lib/ruby/gems/3.1.0/gems/appraisal-2.5.0/lib/appraisal/appraisal_file.rb:38:in `new'
        from /Users/work/.rbenv/versions/3.1.4/lib/ruby/gems/3.1.0/gems/appraisal-2.5.0/lib/appraisal/appraisal_file.rb:38:in `customize_gemfiles'
        from /Users/work/.rbenv/versions/3.1.4/lib/ruby/gems/3.1.0/gems/appraisal-2.5.0/lib/appraisal/appraisal_file.rb:46:in `run'
        from /Users/work/.rbenv/versions/3.1.4/lib/ruby/gems/3.1.0/gems/appraisal-2.5.0/lib/appraisal/appraisal_file.rb:44:in `instance_eval'
        from /Users/work/.rbenv/versions/3.1.4/lib/ruby/gems/3.1.0/gems/appraisal-2.5.0/lib/appraisal/appraisal_file.rb:44:in `run'
        from /Users/work/.rbenv/versions/3.1.4/lib/ruby/gems/3.1.0/gems/appraisal-2.5.0/lib/appraisal/appraisal_file.rb:21:in `initialize'
        from /Users/work/.rbenv/versions/3.1.4/lib/ruby/gems/3.1.0/gems/appraisal-2.5.0/lib/appraisal/appraisal_file.rb:12:in `new'
        from /Users/work/.rbenv/versions/3.1.4/lib/ruby/gems/3.1.0/gems/appraisal-2.5.0/lib/appraisal/appraisal_file.rb:12:in `each'
        from /Users/work/.rbenv/versions/3.1.4/lib/ruby/gems/3.1.0/gems/appraisal-2.5.0/lib/appraisal/task.rb:32:in `block in initialize'
        from /Users/work/.rbenv/versions/3.1.4/lib/ruby/gems/3.1.0/gems/rake-13.0.6/lib/rake/task_manager.rb:232:in `in_namespace'
        from /Users/work/.rbenv/versions/3.1.4/lib/ruby/gems/3.1.0/gems/rake-13.0.6/lib/rake/dsl_definition.rb:141:in `namespace'
        from /Users/work/.rbenv/versions/3.1.4/lib/ruby/gems/3.1.0/gems/appraisal-2.5.0/lib/appraisal/task.rb:9:in `initialize'
        from /Users/work/.rbenv/versions/3.1.4/lib/ruby/gems/3.1.0/gems/appraisal-2.5.0/lib/appraisal.rb:4:in `new'
        from /Users/work/.rbenv/versions/3.1.4/lib/ruby/gems/3.1.0/gems/appraisal-2.5.0/lib/appraisal.rb:4:in `<top (required)>'
        from /Users/work/.rbenv/versions/3.1.4/lib/ruby/gems/3.1.0/gems/appraisal-2.5.0/bin/appraisal:4:in `require'
        from /Users/work/.rbenv/versions/3.1.4/lib/ruby/gems/3.1.0/gems/appraisal-2.5.0/bin/appraisal:4:in `<top (required)>'
        from /Users/work/.rbenv/versions/3.1.4/bin/appraisal:25:in `load'
        from /Users/work/.rbenv/versions/3.1.4/bin/appraisal:25:in `<top (required)>'
        from /Users/work/.rbenv/versions/3.1.4/lib/ruby/gems/3.1.0/gems/bundler-2.4.13/lib/bundler/cli/exec.rb:58:in `load'
        from /Users/work/.rbenv/versions/3.1.4/lib/ruby/gems/3.1.0/gems/bundler-2.4.13/lib/bundler/cli/exec.rb:58:in `kernel_load'
        from /Users/work/.rbenv/versions/3.1.4/lib/ruby/gems/3.1.0/gems/bundler-2.4.13/lib/bundler/cli/exec.rb:23:in `run'
        from /Users/work/.rbenv/versions/3.1.4/lib/ruby/gems/3.1.0/gems/bundler-2.4.13/lib/bundler/cli.rb:492:in `exec'
        from /Users/work/.rbenv/versions/3.1.4/lib/ruby/gems/3.1.0/gems/bundler-2.4.13/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
        from /Users/work/.rbenv/versions/3.1.4/lib/ruby/gems/3.1.0/gems/bundler-2.4.13/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
        from /Users/work/.rbenv/versions/3.1.4/lib/ruby/gems/3.1.0/gems/bundler-2.4.13/lib/bundler/vendor/thor/lib/thor.rb:392:in `dispatch'
        from /Users/work/.rbenv/versions/3.1.4/lib/ruby/gems/3.1.0/gems/bundler-2.4.13/lib/bundler/cli.rb:34:in `dispatch'
        from /Users/work/.rbenv/versions/3.1.4/lib/ruby/gems/3.1.0/gems/bundler-2.4.13/lib/bundler/vendor/thor/lib/thor/base.rb:485:in `start'
        from /Users/work/.rbenv/versions/3.1.4/lib/ruby/gems/3.1.0/gems/bundler-2.4.13/lib/bundler/cli.rb:28:in `start'
        from /Users/work/.rbenv/versions/3.1.4/lib/ruby/gems/3.1.0/gems/bundler-2.4.13/exe/bundle:45:in `block in <top (required)>'
        from /Users/work/.rbenv/versions/3.1.4/lib/ruby/gems/3.1.0/gems/bundler-2.4.13/lib/bundler/friendly_errors.rb:117:in `with_friendly_errors'
        from /Users/work/.rbenv/versions/3.1.4/lib/ruby/gems/3.1.0/gems/bundler-2.4.13/exe/bundle:33:in `<top (required)>'
        from /Users/work/.rbenv/versions/3.1.4/bin/bundle:25:in `load'
        from /Users/work/.rbenv/versions/3.1.4/bin/bundle:25:in `<main>'

This is caused by Ruby 3.1 deprecating the hash => keyword arguments compatibility stuff. The solution is simple, simply replace yield by **yield here:

https://github.com/thoughtbot/appraisal/blob/main/lib/appraisal/appraisal_file.rb#L38

So the end result should be:

    def customize_gemfiles(&_block)
      Customize.new(**yield)
    end

I think this should work for all supported Ruby versions.

nickcharlton commented 5 months ago

Thanks for opening this! I merged in #214 earlier and so hopefully this is now resolved.