1
0
Fork 0
mirror of https://github.com/pry/pry.git synced 2022-11-09 12:35:05 -05:00

method: delegate internally-used methods

Improves on #2086 (Directly delegate internally-used Method methods)
(we add tests here)

Description by @michaelherold

> Relying on `method_missing` for all delegation to `Method` methods means
> that it's easier for the wrong method to be called when gems mess with
> `Object` or other such core areas.

> See https://github.com/ankane/ownership/pull/3 for an example of this.

> By defining explicit delegators, at least for the methods that we use
> internally withing Pry, we can eliminate this issue and be more
> communicative around the methods on the `Pry::Method` class.

I omitted the `source_location` changes because they need some clarification.
This commit is contained in:
Kyrylo Silin 2020-03-21 16:16:38 +08:00
parent 36c7fdbc48
commit ff6567d3f4
3 changed files with 70 additions and 0 deletions

View file

@ -99,6 +99,8 @@
* Fixed bug when `whereami -c` cannot show beginning of the class, which is on
the same line as another expression
([#2098](https://github.com/pry/pry/pull/2098))
* Fixed bug when `Object#owner` is defined, which results into somewhat broken
method introspection ([#2113](https://github.com/pry/pry/pull/2113))
### [v0.12.2][v0.12.2] (November 12, 2018)

View file

@ -19,6 +19,8 @@ class Pry
# to provide extra functionality useful to Pry.
class Method # rubocop:disable Metrics/ClassLength
extend Helpers::BaseHelpers
extend Forwardable
include Helpers::BaseHelpers
include Helpers::DocumentationHelpers
include CodeObject::Helpers
@ -249,6 +251,9 @@ class Pry
end
end
# Workaround for https://github.com/pry/pry/pull/2086
def_delegators :@method, :owner, :parameters, :receiver
# A new instance of `Pry::Method` wrapping the given `::Method`,
# `UnboundMethod`, or `Proc`.
#

View file

@ -658,4 +658,67 @@ describe Pry::Method do
end
end
end
describe "#owner" do
context "when it is overriden in Object" do
before do
module OwnerMod
def owner
:fail
end
end
Object.__send__(:include, OwnerMod)
end
after { Object.remove_const(:OwnerMod) }
it "correctly reports the owner" do
method = described_class.new(method(:puts))
expect(method.owner).not_to eq(:fail)
end
end
end
describe "#parameters" do
context "when it is overriden in Object" do
before do
module ParametersMod
def parameters
:fail
end
end
Object.__send__(:include, ParametersMod)
end
after { Object.remove_const(:ParametersMod) }
it "correctly reports the parameters" do
method = described_class.new(method(:puts))
expect(method.parameters).not_to eq(:fail)
end
end
end
describe "#receiver" do
context "when it is overriden in Object" do
before do
module ReceiverMod
def receiver
:fail
end
end
Object.__send__(:include, ReceiverMod)
end
after { Object.remove_const(:ReceiverMod) }
it "correctly reports the receiver" do
method = described_class.new(method(:puts))
expect(method.receiver).not_to eq(:fail)
end
end
end
end