ruby-core@ruby-lang.org archive (unofficial mirror)
 help / color / mirror / Atom feed
* [ruby-core:84539] [Ruby trunk Bug#14252] Refined Method Visibility Lost with Dynamic Dispatch and Reflection
       [not found] <redmine.issue-14252.20171228013205@ruby-lang.org>
@ 2017-12-28  1:32 ` michaud.sonny
  2017-12-28  2:28 ` [ruby-core:84540] " shugo
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 5+ messages in thread
From: michaud.sonny @ 2017-12-28  1:32 UTC (permalink / raw
  To: ruby-core

Issue #14252 has been reported by sonnym (Sonny Michaud).

----------------------------------------
Bug #14252: Refined Method Visibility Lost with Dynamic Dispatch and Reflection
https://bugs.ruby-lang.org/issues/14252

* Author: sonnym (Sonny Michaud)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
* ruby -v: ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux]
* Backport: 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN
----------------------------------------
Consider the following simple objects, one with a protected class method and another with a public class method calling on the protected method.  This is accomplished using a refinement that marks the method as public on the singleton class of the original object.

~~~ ruby
class Protected
  class << self
    protected

    def print
      :protected
    end
  end
end

module Publicize
  refine Protected.singleton_class do
    public :print
  end
end

class Public
  using Publicize

  def self.print
    Protected.public_methods.include?(:print) # false
    Protected.protected_methods.include?(:print) # true

    Protected.print # works
    Protected.public_send(:print) # fails
  end
end

Public.print
~~~

This works perfectly well for the static `Protected.print` call, but has a number of surprises when trying to do anything more advanced.  Namely:

* Attempting to call the method with refined visibility raises a `NoMethodError`
* The method appears in the `protected_methods` list of the original object
* The method does not appear in the `public_methods` list of the original object

As a user, I would expect all those things to be not the case, since, if I opened the class directly and changed the visibility of the method, those three items would no longer be true.



-- 
https://bugs.ruby-lang.org/

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [ruby-core:84540] [Ruby trunk Bug#14252] Refined Method Visibility Lost with Dynamic Dispatch and Reflection
       [not found] <redmine.issue-14252.20171228013205@ruby-lang.org>
  2017-12-28  1:32 ` [ruby-core:84539] [Ruby trunk Bug#14252] Refined Method Visibility Lost with Dynamic Dispatch and Reflection michaud.sonny
@ 2017-12-28  2:28 ` shugo
  2017-12-28  3:05 ` [ruby-core:84544] " michaud.sonny
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 5+ messages in thread
From: shugo @ 2017-12-28  2:28 UTC (permalink / raw
  To: ruby-core

Issue #14252 has been updated by shugo (Shugo Maeda).


sonnym (Sonny Michaud) wrote:
> This works perfectly well for the static `Protected.print` call, but has a number of surprises when trying to do anything more advanced.  Namely:
> 
> * Attempting to call the method with refined visibility raises a `NoMethodError`
> * The method appears in the `protected_methods` list of the original object
> * The method does not appear in the `public_methods` list of the original object

Reflection APIs do not honor refinements.
If you believe they should, please create a feature ticket for each API family.

Refinements were enabled in Kernel#send by #11476, so it may be reasonable to
enable refinements in Kernel#public_send.



----------------------------------------
Bug #14252: Refined Method Visibility Lost with Dynamic Dispatch and Reflection
https://bugs.ruby-lang.org/issues/14252#change-69068

* Author: sonnym (Sonny Michaud)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
* ruby -v: ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux]
* Backport: 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN
----------------------------------------
Consider the following simple objects, one with a protected class method and another with a public class method calling on the protected method.  This is accomplished using a refinement that marks the method as public on the singleton class of the original object.

~~~ ruby
class Protected
  class << self
    protected

    def print
      :protected
    end
  end
end

module Publicize
  refine Protected.singleton_class do
    public :print
  end
end

class Public
  using Publicize

  def self.print
    Protected.public_methods.include?(:print) # false
    Protected.protected_methods.include?(:print) # true

    Protected.print # works
    Protected.public_send(:print) # fails
  end
end

Public.print
~~~

This works perfectly well for the static `Protected.print` call, but has a number of surprises when trying to do anything more advanced.  Namely:

* Attempting to call the method with refined visibility raises a `NoMethodError`
* The method appears in the `protected_methods` list of the original object
* The method does not appear in the `public_methods` list of the original object

As a user, I would expect all those things to be not the case, since, if I opened the class directly and changed the visibility of the method, those three items would no longer be true.



-- 
https://bugs.ruby-lang.org/

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [ruby-core:84544] [Ruby trunk Bug#14252] Refined Method Visibility Lost with Dynamic Dispatch and Reflection
       [not found] <redmine.issue-14252.20171228013205@ruby-lang.org>
  2017-12-28  1:32 ` [ruby-core:84539] [Ruby trunk Bug#14252] Refined Method Visibility Lost with Dynamic Dispatch and Reflection michaud.sonny
  2017-12-28  2:28 ` [ruby-core:84540] " shugo
@ 2017-12-28  3:05 ` michaud.sonny
  2018-01-04  3:25 ` [ruby-core:84624] " michaud.sonny
  2019-06-21 16:37 ` [ruby-core:93302] " merch-redmine
  4 siblings, 0 replies; 5+ messages in thread
From: michaud.sonny @ 2017-12-28  3:05 UTC (permalink / raw
  To: ruby-core

Issue #14252 has been updated by sonnym (Sonny Michaud).


I, personally, do not care so much about the reflection APIs, as I was just using them to confirm what I thought was happening, but I would like to at least see `Kernel#public_send` act similarly to `Kernel#send`, so I think it makes sense to scope this issue to that change.

----------------------------------------
Bug #14252: Refined Method Visibility Lost with Dynamic Dispatch and Reflection
https://bugs.ruby-lang.org/issues/14252#change-69071

* Author: sonnym (Sonny Michaud)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
* ruby -v: ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux]
* Backport: 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN
----------------------------------------
Consider the following simple objects, one with a protected class method and another with a public class method calling on the protected method.  This is accomplished using a refinement that marks the method as public on the singleton class of the original object.

~~~ ruby
class Protected
  class << self
    protected

    def print
      :protected
    end
  end
end

module Publicize
  refine Protected.singleton_class do
    public :print
  end
end

class Public
  using Publicize

  def self.print
    Protected.public_methods.include?(:print) # false
    Protected.protected_methods.include?(:print) # true

    Protected.print # works
    Protected.public_send(:print) # fails
  end
end

Public.print
~~~

This works perfectly well for the static `Protected.print` call, but has a number of surprises when trying to do anything more advanced.  Namely:

* Attempting to call the method with refined visibility raises a `NoMethodError`
* The method appears in the `protected_methods` list of the original object
* The method does not appear in the `public_methods` list of the original object

As a user, I would expect all those things to be not the case, since, if I opened the class directly and changed the visibility of the method, those three items would no longer be true.



-- 
https://bugs.ruby-lang.org/

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [ruby-core:84624] [Ruby trunk Bug#14252] Refined Method Visibility Lost with Dynamic Dispatch and Reflection
       [not found] <redmine.issue-14252.20171228013205@ruby-lang.org>
                   ` (2 preceding siblings ...)
  2017-12-28  3:05 ` [ruby-core:84544] " michaud.sonny
@ 2018-01-04  3:25 ` michaud.sonny
  2019-06-21 16:37 ` [ruby-core:93302] " merch-redmine
  4 siblings, 0 replies; 5+ messages in thread
From: michaud.sonny @ 2018-01-04  3:25 UTC (permalink / raw
  To: ruby-core

Issue #14252 has been updated by sonnym (Sonny Michaud).


I wrote an article explaining what I was trying to accomplish when I encountered this behavior, in case that helps elucidate my motivations:  https://sonnym.github.io/2018/01/03/privacy-and-exposure-gatekeeprs-and-privileged-consumers/

----------------------------------------
Bug #14252: Refined Method Visibility Lost with Dynamic Dispatch and Reflection
https://bugs.ruby-lang.org/issues/14252#change-69168

* Author: sonnym (Sonny Michaud)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
* ruby -v: ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux]
* Backport: 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN
----------------------------------------
Consider the following simple objects, one with a protected class method and another with a public class method calling on the protected method.  This is accomplished using a refinement that marks the method as public on the singleton class of the original object.

~~~ ruby
class Protected
  class << self
    protected

    def print
      :protected
    end
  end
end

module Publicize
  refine Protected.singleton_class do
    public :print
  end
end

class Public
  using Publicize

  def self.print
    Protected.public_methods.include?(:print) # false
    Protected.protected_methods.include?(:print) # true

    Protected.print # works
    Protected.public_send(:print) # fails
  end
end

Public.print
~~~

This works perfectly well for the static `Protected.print` call, but has a number of surprises when trying to do anything more advanced.  Namely:

* Attempting to call the method with refined visibility raises a `NoMethodError`
* The method appears in the `protected_methods` list of the original object
* The method does not appear in the `public_methods` list of the original object

As a user, I would expect all those things to be not the case, since, if I opened the class directly and changed the visibility of the method, those three items would no longer be true.



-- 
https://bugs.ruby-lang.org/

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [ruby-core:93302] [Ruby trunk Bug#14252] Refined Method Visibility Lost with Dynamic Dispatch and Reflection
       [not found] <redmine.issue-14252.20171228013205@ruby-lang.org>
                   ` (3 preceding siblings ...)
  2018-01-04  3:25 ` [ruby-core:84624] " michaud.sonny
@ 2019-06-21 16:37 ` merch-redmine
  4 siblings, 0 replies; 5+ messages in thread
From: merch-redmine @ 2019-06-21 16:37 UTC (permalink / raw
  To: ruby-core

Issue #14252 has been updated by jeremyevans0 (Jeremy Evans).

Status changed from Open to Closed

Ruby 2.6.0 started honoring refinements in `Kernel#public_send`.

----------------------------------------
Bug #14252: Refined Method Visibility Lost with Dynamic Dispatch and Reflection
https://bugs.ruby-lang.org/issues/14252#change-78774

* Author: sonnym (Sonny Michaud)
* Status: Closed
* Priority: Normal
* Assignee: 
* Target version: 
* ruby -v: ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux]
* Backport: 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN
----------------------------------------
Consider the following simple objects, one with a protected class method and another with a public class method calling on the protected method.  This is accomplished using a refinement that marks the method as public on the singleton class of the original object.

~~~ ruby
class Protected
  class << self
    protected

    def print
      :protected
    end
  end
end

module Publicize
  refine Protected.singleton_class do
    public :print
  end
end

class Public
  using Publicize

  def self.print
    Protected.public_methods.include?(:print) # false
    Protected.protected_methods.include?(:print) # true

    Protected.print # works
    Protected.public_send(:print) # fails
  end
end

Public.print
~~~

This works perfectly well for the static `Protected.print` call, but has a number of surprises when trying to do anything more advanced.  Namely:

* Attempting to call the method with refined visibility raises a `NoMethodError`
* The method appears in the `protected_methods` list of the original object
* The method does not appear in the `public_methods` list of the original object

As a user, I would expect all those things to be not the case, since, if I opened the class directly and changed the visibility of the method, those three items would no longer be true.



-- 
https://bugs.ruby-lang.org/

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2019-06-21 16:38 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <redmine.issue-14252.20171228013205@ruby-lang.org>
2017-12-28  1:32 ` [ruby-core:84539] [Ruby trunk Bug#14252] Refined Method Visibility Lost with Dynamic Dispatch and Reflection michaud.sonny
2017-12-28  2:28 ` [ruby-core:84540] " shugo
2017-12-28  3:05 ` [ruby-core:84544] " michaud.sonny
2018-01-04  3:25 ` [ruby-core:84624] " michaud.sonny
2019-06-21 16:37 ` [ruby-core:93302] " merch-redmine

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).