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

Add last to lists #97

Merged
merged 3 commits into from
Jun 18, 2023
Merged

Add last to lists #97

merged 3 commits into from
Jun 18, 2023

Conversation

etiennebarrie
Copy link
Contributor

This adds support for last for lists. Both last and last(n) are supported.

Because Ruby doesn't provide a great way to replicate the implicit conversions (Integer.try_convert exists in Ruby 3.1, but we'd still need to generate the error message manually because it returns nil instead of raising the TypeError), some edge cases of the implementation of Array#last are not replicated:

  • [].last(nil) raises a TypeError, whereas we just fail with undefined method `to_int' for nil:NilClass (NoMethodError)
  • [].last(object) where object.to_int doesn't return an Integer raises a TypeError, whereas we will call == and < on object, and the results may be unexpected (though that is a really edgy case).

The first commit is really the most straightforward implementation, and we may not need the second one if we don't care about the edge case of nil or false being passed and expecting an exception. I think in most cases last(n) is called with a literal value, so it's fine.

@rafaelfranca
Copy link
Member

I find this implementation already too complex. This should not be receiving user input, so I don't think we should be even calling to_int. Just assume arguments are going to be integers already and let's handle nil. All rest should just assume we are getting input from developers and if they want to pass something that isn't an integer it should just not work.

For simplicity, this does not strictly respect Array#last when nil or
false is passed, returning the last element instead of raising a
TypeError.

It also doesn't coerce the parameter into an int with to_int like
Array#last does.
@etiennebarrie
Copy link
Contributor Author

I removed the to_int and assumed nil is equivalent to no argument being passed.

dhh added 2 commits June 18, 2023 17:30
Drop defensive programming
Drop defensive tests
@dhh dhh merged commit c1ce182 into rails:main Jun 18, 2023
lewispb added a commit to lewispb/kredis that referenced this pull request Jun 19, 2023
* main: (21 commits)
  Bump version for 1.4.0
  Update nokogiri for compatibility
  Revert "Improved version of UniqueList: OrderedSet (rails#76)" (rails#111)
  Add `last` to lists (rails#97)
  Improved version of UniqueList: OrderedSet (rails#76)
  Return Time objects instead of deprecated DateTime (rails#106)
  Fix possible deserialization of untrusted data
  Typecast return of Set#take (rails#105)
  Declare Active Model dependency (rails#107)
  Address LogSubscriber deprecation (rails#98)
  Account for time zones in DateTime serializations (rails#102)
  Add sample to set (rails#100)
  Bump version for 1.3.0
  Allow Redis 5.x
  Add ltrim to lists
  Coalesce "current pipeline or redis" into the redis method itself
  Pefer a thread_mattr_accessor over a thread local variable
  Delete list of keys in batch (rails#90)
  Use a thread-local variable for pipeline
  Revert "Use block parameter to pipeline in Redis#multi (rails#68)"
  ...
lewispb added a commit to basecamp/kredis that referenced this pull request Jul 8, 2023
…tialize

* origin/main: (22 commits)
  Add kredis_ordered_set for OrderedSet usage in models
  Add a development console
  Bump version for 1.5.0
  Fix ordered set prepend bug (rails#115)
  Unique list with sorted set (rails#114)
  Eliminating Ruby Warnings (rails#112)
  CI against Redis 7, Ruby 3.1, and Ruby 3.2 (rails#113)
  Bump version for 1.4.0
  Update nokogiri for compatibility
  Revert "Improved version of UniqueList: OrderedSet (rails#76)" (rails#111)
  Add `last` to lists (rails#97)
  Improved version of UniqueList: OrderedSet (rails#76)
  Return Time objects instead of deprecated DateTime (rails#106)
  Fix possible deserialization of untrusted data
  Typecast return of Set#take (rails#105)
  Declare Active Model dependency (rails#107)
  Address LogSubscriber deprecation (rails#98)
  Account for time zones in DateTime serializations (rails#102)
  Add sample to set (rails#100)
  Bump version for 1.3.0
  ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging this pull request may close these issues.

3 participants