Skip to content

Address Ruby 2.7 kwargs edge case#1425

Merged
composerinteralia merged 1 commit intomasterfrom
ruby-2.7-warning
Jul 16, 2020
Merged

Address Ruby 2.7 kwargs edge case#1425
composerinteralia merged 1 commit intomasterfrom
ruby-2.7-warning

Conversation

@composerinteralia
Copy link
Collaborator

Closes #1423

5c071d4 fixed most kwarg deprecation warnings coming from within
factory_bot, but using the Ruby 3-style argument forwarding does not
handle every case.

To handle the case of initialize_with being used with a method that
takes a final hash argument, this commit adds an additional branch to
this code to use ruby2_keywords for Ruby >= 2.7 and < 3.0. On 3.0 we
use the 3.0-style forwarding.

I added a tests that was outputting a deprecation warning on Ruby 2.7
before this change, but that no longer outputs the warning after this
change.

Yes, this is a bit of a mess, but I don't see a better way. I got
inspiration here from this fantastic blog post on argument delegating
with Ruby 2.7 and 3
.

Closes #1423

5c071d4 fixed most kwarg deprecation warnings coming from within
factory_bot, but using the Ruby 3-style argument forwarding does not
handle every case.

To handle the case of `initialize_with` being used with a method that
takes a final hash argument, this commit adds an additional branch to
this code to use `ruby2_keywords` for Ruby >= 2.7 and < 3.0. On 3.0 we
use the 3.0-style forwarding.

I added a tests that was outputting a deprecation warning on Ruby 2.7
before this change, but that no longer outputs the warning after this
change.

Yes, this is a bit of a mess, but I don't see a better way. I got
inspiration here from this [fantastic blog post on argument delegating
with Ruby 2.7 and 3][delegating].

[delegating]: https://eregon.me/blog/2019/11/10/the-delegation-challenge-of-ruby27.html#the-delegation-challenge.
Copy link

@emilford emilford left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me. Thanks for linking to the blog post.

@composerinteralia composerinteralia merged commit 793a651 into master Jul 16, 2020
@composerinteralia composerinteralia deleted the ruby-2.7-warning branch July 16, 2020 13:10
machupicchubeta added a commit to machupicchubeta/kirico that referenced this pull request Mar 6, 2021
…guments, using the latest version of it

`bundle update factory_bot`

It seems that `initialize_with` of `factory_bot` raised `ArgumentError` related to keyword arguments of Ruby `3.0.0`.
It seems that the latest version `factory_bot` `6.1.0` revised the error.

CHANGELOG:
- https://github.com/thoughtbot/factory_bot/blob/v6.1.0/NEWS.md

Error was (Some excerpts):
```
Failures:

  1) Kirico::Form when the form is for general use validations
     Failure/Error:
       def initialize(fd:, company_count: Kirico::CompanyCount.new, company:, records: [])
         @fd = fd
         @company_count = company_count
         @Company = company
         @records = records
       end

     ArgumentError:
       wrong number of arguments (given 1, expected 0; required keywords: fd, company)
     # ./lib/kirico/models/form.rb:21:in `initialize'
     # ./spec/factories/form.rb:6:in `block (3 levels) in <top (required)>'
     # ./spec/kirico/models/form_spec.rb:7:in `block (3 levels) in <top (required)>'
     # ./spec/kirico/models/form_spec.rb:14:in `block (4 levels) in <top (required)>'
     # ./spec/kirico/models/form_spec.rb:15:in `block (4 levels) in <top (required)>'
```

Refs.
- thoughtbot/factory_bot@2eacfe8
- thoughtbot/factory_bot#1425
- thoughtbot/factory_bot#1423
- thoughtbot/factory_bot@5c071d4
- thoughtbot/factory_bot#1415
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Keyword parameter deprecation warning when initialize_with is used with empty hash

2 participants