Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Address Ruby 2.7 kwargs edge case #1425

Merged
merged 1 commit into from
Jul 16, 2020
Merged

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