Skip to content
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
### Next Release

* [#406](https://github.com/ruby-grape/grape-entity/pull/406): Handle symbol-to-proc wrappers (`&:method_name`) where the method uses `delegate` or `method_missing` - [@marcrohloff](https://github.com/marcrohloff).
Comment thread
numbata marked this conversation as resolved.
Outdated

#### Features

* Your contribution here.
Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ Implement your feature or bug fix.

Ruby style is enforced with [Rubocop](https://github.com/bbatsov/rubocop), run `bundle exec rubocop` and fix any style issues highlighted.

Make sure that `bundle exec rake` completes without errors.
Make sure that `bundle exec rake` and `rubocop` completes without errors.
Comment thread
numbata marked this conversation as resolved.
Outdated

#### Write Documentation

Expand Down
3 changes: 2 additions & 1 deletion lib/grape_entity/entity.rb
Original file line number Diff line number Diff line change
Expand Up @@ -548,7 +548,8 @@ def ensure_block_arity!(block)
end

arity = object.method(origin_method_name).arity
return if arity.zero?
# functions defined using `delegate` or `method_missing` have an arity of -1
return if arity <= 0
Comment thread
numbata marked this conversation as resolved.
Outdated

raise ArgumentError, <<~MSG
Cannot use `&:#{origin_method_name}` because that method expects #{arity} argument#{'s' if arity != 1}.
Expand Down
47 changes: 47 additions & 0 deletions spec/grape_entity/entity_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -400,6 +400,14 @@ class BogusEntity < Grape::Entity

describe 'blocks' do
class SomeObject
class SomeObjectDelegate
def method_using_delegation
'delegated-result'
end
end

delegate :method_using_delegation, to: :delegate_object

def method_without_args
'result'
end
Expand All @@ -415,6 +423,23 @@ def method_with_multiple_args(_object, _options)
def raises_argument_error
raise ArgumentError, 'something different'
end

def method_missing(method, ...)
Comment thread
numbata marked this conversation as resolved.
return 'missing-result' if method.to_sym == :method_using_missing

super
end

def delegate_object
@delegate_object ||= SomeObjectDelegate.new
end

private

def respond_to_missing?(method, include_private = false) # rubocop:disable Style/OptionalBooleanParameter
method.to_sym == :method_using_missing ||
super
end
end

describe 'with block passed in' do
Expand Down Expand Up @@ -459,6 +484,28 @@ def raises_argument_error
end
end

context 'with block passed in via & that uses `missing_method`' do
specify do
subject.expose :using_missing, &:method_using_missing

object = SomeObject.new
expect(object.method(:method_using_missing).arity).to eq(-1)
Comment thread
numbata marked this conversation as resolved.
Outdated
value = subject.represent(object).value_for(:using_missing)
expect(value).to eq('missing-result')
end
end

context 'with block passed in via & that uses `delegate`' do
specify do
subject.expose :using_delegation, &:method_using_delegation

object = SomeObject.new
expect(object.method(:method_using_delegation).arity).to eq(-1)
value = subject.represent(object).value_for(:using_delegation)
expect(value).to eq('delegated-result')
end
end

context 'with block passed in via &' do
specify do
subject.expose :that_method_with_one_arg, &:method_with_one_arg
Expand Down
Loading