From d0c697e9b17a9f22d645503a39f6d6d167d99b94 Mon Sep 17 00:00:00 2001 From: bogdanvlviv Date: Wed, 28 Feb 2018 00:05:46 +0200 Subject: Add separate test to ensure that `delegate` with `:private` option returns correct value Remove extra comments `# Asking for private method` in activesupport/test/core_ext/module_test.rb Improve docs of using `delegate` with `:private` Update changelog of #31944 --- activesupport/CHANGELOG.md | 7 ++----- .../active_support/core_ext/module/delegation.rb | 10 +++++----- activesupport/test/core_ext/module_test.rb | 22 ++++++++++++++++------ 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/activesupport/CHANGELOG.md b/activesupport/CHANGELOG.md index be1862279c..a7af51f83e 100644 --- a/activesupport/CHANGELOG.md +++ b/activesupport/CHANGELOG.md @@ -1,8 +1,7 @@ ## Rails 6.0.0.alpha (Unreleased) ## -* Add `private: true` option to ActiveSupport's `delegate`. - - In order to delegate methods as private methods: +* Add `:private` option to ActiveSupport's `Module#delegate` + in order to delegate methods as private: class User < ActiveRecord::Base has_one :profile @@ -17,8 +16,6 @@ # User.new.date_of_birth # => NoMethodError: private method `date_of_birth' called for # - More information in #31944. - *Tomas Valent* * `String#truncate_bytes` to truncate a string to a maximum bytesize without diff --git a/activesupport/lib/active_support/core_ext/module/delegation.rb b/activesupport/lib/active_support/core_ext/module/delegation.rb index 426e34128f..45d16515d2 100644 --- a/activesupport/lib/active_support/core_ext/module/delegation.rb +++ b/activesupport/lib/active_support/core_ext/module/delegation.rb @@ -114,7 +114,7 @@ class Module # invoice.customer_name # => 'John Doe' # invoice.customer_address # => 'Vimmersvej 13' # - # If you want the delegated method to be a private method, + # If you want the delegate methods to be a private, # use the :private option. # # class User < ActiveRecord::Base @@ -127,10 +127,10 @@ class Module # end # end # - # User.new.age # 2 - # User.new.first_name # Tomas - # User.new.date_of_birth # NoMethodError: private method `date_of_birth' called for # - # User.new.religion # NoMethodError: private method `religion' called for # + # User.new.age # => 2 + # User.new.first_name # => "Tomas" + # User.new.date_of_birth # => NoMethodError: private method `date_of_birth' called for # + # User.new.religion # => NoMethodError: private method `religion' called for # # # If the target is +nil+ and does not respond to the delegated method a # +Module::DelegationError+ is raised. If you wish to instead return +nil+, diff --git a/activesupport/test/core_ext/module_test.rb b/activesupport/test/core_ext/module_test.rb index 36cfd885d7..04692f1484 100644 --- a/activesupport/test/core_ext/module_test.rb +++ b/activesupport/test/core_ext/module_test.rb @@ -482,19 +482,29 @@ class ModuleTest < ActiveSupport::TestCase def initialize(place) @place = place end - end - assert_equal %i(the_street the_city), - location.delegate(:street, :city, to: :@place, prefix: :the, private: true) + delegate(:street, :city, to: :@place, prefix: :the, private: true) + end place = location.new(Somewhere.new("Such street", "Sad city")) - assert_not_respond_to place, :street - assert_not_respond_to place, :city - assert_not_respond_to place, :the_street assert place.respond_to?(:the_street, true) assert_not_respond_to place, :the_city assert place.respond_to?(:the_city, true) end + + def test_delegate_with_private_option_returns_names_of_delegate_methods + location = Class.new do + def initialize(place) + @place = place + end + end + + assert_equal [:street, :city], + location.delegate(:street, :city, to: :@place, private: true) + + assert_equal [:the_street, :the_city], + location.delegate(:street, :city, to: :@place, prefix: :the, private: true) + end end -- cgit v1.2.3