Граф коммитов

112 Коммитов

Автор SHA1 Сообщение Дата
Jonathan Hefner 6061003100 [ruby/delegate] Fix DelegateClass block "method redefined" warning
This commit prevents "method redefined" warnings when overriding methods
within a `DelegateClass` block, such as in the following example:

  ```ruby
  Base = Class.new do
    def foo
      "foo"
    end
  end

  Overridden = DelegateClass(Base) do
    def foo
      super + "!"
    end
  end
  ```

Fixes https://bugs.ruby-lang.org/issues/19047.

https://github.com/ruby/delegate/commit/214fae86de
2022-10-15 00:08:44 +09:00
卜部昌平 980bf94f02
Kernel#=~: delete
Has been deprecated since ebff9dc10e.
2022-01-03 22:33:38 +09:00
Hiroshi SHIBATA 9b9cbbbc17
Update library versions of the default gems.
They are followed up with
  8fb02b7a97
2020-12-22 21:45:28 +09:00
Nobuyoshi Nakada b2d96abb42 Extract version number from the source
"requiring version.rb" strategy has some issues.

- cannot work when cross-compiling
- often introduces wrong namespace
- must know the superclasses
- costs at each runtime than at build-time

etc.
2020-07-30 19:03:18 +09:00
Masataka Pocke Kuwabara ba81bc24e6
Add instance_methods to class generated by DelegateClass
Also, make DelegateClass.instance_method fallback to superclass.

Fixes [Bug #16982]
2020-07-09 15:01:10 -07:00
Richard Schneeman 2d89af45ea Add require to Delegator examples
In Ruby 2.7.1 SimpeDelegator cannot be used without requiring `delegate` this PR adds the require to the first example for each class so that devs don't have to hunt for what require to use.
2020-06-25 11:21:13 -04:00
Jeremy Evans 4f7b435c95 Support obj.clone(freeze: true) for freezing clone
This freezes the clone even if the receiver is not frozen.  It
is only for consistency with freeze: false not freezing the clone
even if the receiver is frozen.

Because Object#clone is now partially implemented in Ruby and
not fully implemented in C, freeze: nil must be supported to
provide the default behavior of only freezing the clone if the
receiver is frozen.

This requires modifying delegate and set, to set freeze: nil
instead of freeze: true as the keyword parameter for
initialize_clone.  Those are the two libraries in stdlib that
override initialize_clone.

Implements [Feature #16175]
2020-03-22 09:30:07 -07:00
Jean Boussier f2552216d4 Fix SimpleDelegator respond_to? regression
In 2.6, SimpleDelegator would always use the target `respond_to?`

In 2.7.0 it doesn't if the target does not inherit from Object.

This breaks compatibility for delegated objects that inherit
from BasicObject and redefine `respond_to?`.
2020-02-03 08:16:22 -08:00
Nobuyoshi Nakada 9bcf4f3db2
delegate.rb: fixed keyword arguments in DelegateClass
`Delegator.delegating_block` should delegate keyword arguments
separately.  [ruby-core:96949]
2020-01-30 22:13:29 +09:00
Jeremy Evans 04eb7c7e46 Call initialize_clone with freeze: false if clone called with freeze: false
This makes it possible to initialize_clone to correctly not freeze
internal state if the freeze: false keyword is passed to clone.

If clone is called with freeze: true or no keyword, do not pass
a second argument to initialize_clone to keep backwards
compatibility.

This makes it so that external libraries that override
initialize_clone but do not support the freeze keyword will fail
with ArgumentError if passing freeze: false to clone.  I think that
is better than the current behavior, which succeeds but results in
an unfrozen object with frozen internals.

Fix related issues in set and delegate in stdlib.

Fixes [Bug #14266]
2020-01-03 20:13:09 -08:00
Jeremy Evans ffd0820ab3 Deprecate taint/trust and related methods, and make the methods no-ops
This removes the related tests, and puts the related specs behind
version guards.  This affects all code in lib, including some
libraries that may want to support older versions of Ruby.
2019-11-18 01:00:25 +02:00
Jeremy Evans 2322c94dd6 Support delegates for BasicObject
For BasicObject, bind the Kernel respond_to? instance method to the
object and call it instead of calling the method directly.

Also, use bind_call(recv, ...) for better performance.

Fixes [Bug #16127]
2019-10-10 13:15:00 -07:00
Jeremy Evans 3b302ea8c9 Add Module#ruby2_keywords for passing keywords through regular argument splats
This approach uses a flag bit on the final hash object in the regular splat,
as opposed to a previous approach that used a VM frame flag.  The hash flag
approach is less invasive, and handles some cases that the VM frame flag
approach does not, such as saving the argument splat array and splatting it
later:

  ruby2_keywords def foo(*args)
    @args = args
    bar
  end
  def bar
    baz(*@args)
  end
  def baz(*args, **kw)
    [args, kw]
  end
  foo(a:1)    #=> [[], {a: 1}]
  foo({a: 1}, **{}) #=> [[{a: 1}], {}]

  foo({a: 1}) #=> 2.7: [[], {a: 1}] # and warning
  foo({a: 1}) #=> 3.0: [[{a: 1}], {}]

It doesn't handle some cases that the VM frame flag handles, such as when
the final hash object is replaced using Hash#merge, but those cases are
probably less common and are unlikely to properly support keyword
argument separation.

Use ruby2_keywords to handle argument delegation in the delegate library.
2019-09-25 12:33:52 -07:00
Nobuyoshi Nakada 8a041c1b92
delegate.rb: markup method names 2019-06-02 00:34:02 +09:00
Jeremy Evans e8c710b11a Fix visibility of some methods when using DelegateClass
Public instance methods added to a delegated class after the
creation of the delegate class were not returned by the
public_instance_methods class method of the delegate class.

Protected instance methods in the delegated class when the
delegate class is created were returned by the public_methods
instance method of the delegate class.

Patch mostly from Kenichi Kamiya <kachick1@gmail.com> in
GitHub pull request 926.  Minor changes to get it to apply,
and to fix tests after applying by me.

Fixes [Bug #11512]
2019-05-30 18:34:45 -07:00
Jeremy Evans 1cd93f1cdf Allow DelegateClass() to module_eval given block
Methods that return classes often module_eval the given block
(e.g. Class.new and Struct.new).  This allows DelegateClass to
work similarly.  This makes it easier to use DelegateClass
directly without subclassing, so as not to create an unnecessary
subclass.

Implements [Feature #15842]
2019-05-30 18:34:45 -07:00
Étienne Barrié 2dc613815d
delegate.rb: don't look for methods on Kernel
Instead, look for instance methods of Kernel.
Otherwise, instance methods of Module (which are methods of Kernel
itself) are mistakenly believed to exist, and it fails when calling
Kernel.instance_method().

Closes: https://github.com/ruby/ruby/pull/1422
2019-05-13 11:29:42 +09:00
Kazuhiro NISHIYAMA c8a891d1aa
Fix missing `\A` 2019-05-10 12:21:43 +09:00
shyouhei f2a91397fd Add uplevel keyword to Kernel#warn and use it
If uplevel keyword is given, the warning message is prepended
with caller file and line information and the string "warning: ".
The use of the uplevel keyword makes Kernel#warn format output
similar to how rb_warn formats output.

This patch modifies net/ftp and net/imap to use Kernel#warn
instead of $stderr.puts or $stderr.printf, since they are used
for printing warnings.

This makes lib/cgi/core and tempfile use $stderr.puts instead of
warn for debug logging, since they are used for debug printing
and not for warning.

This does not modify bundler, rubygems, or rdoc, as those are
maintained outside of ruby and probably wish to remain backwards
compatible with older ruby versions.

rb_warn_m code is originally from nobu, but I've changed it
so that it only includes the path and lineno from uplevel
(not the method), and also prepends the string "warning: ",
to make it more similar to rb_warn.

From: Jeremy Evans code@jeremyevans.net
Signed-off-by: Urabe Shyouhei shyouhei@ruby-lang.org


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@61155 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2017-12-12 11:56:25 +00:00
kazu dabdec31e4 Use caller with length to reduce unused strings
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60288 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2017-10-21 14:40:03 +00:00
nobu 3c45a7899e Delegate to `eql?` [Fix GH-1564]
* lib/delegate.rb (eql?): Delegate to `eql?` of the inner object.
  based on the patch by giginet <giginet.net@gmail.com>.
  [ruby-core:76950] [Bug #12684]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59167 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2017-06-24 03:35:29 +00:00
kazu 761dd9a778 lib/delegate.rb: Specify frozen_string_literal: true.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@57271 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2017-01-06 02:05:35 +00:00
hsbt 22de22b292 * lib/delegate.rb: Added missing spaces and Removed needless spaces.
[fix GH-1454][ci skip] Patch by @bogdanvlviv

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56343 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2016-10-05 02:36:28 +00:00
naruse 3e92b635fb Add frozen_string_literal: false for all files
When you change this to true, you may need to add more tests.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@53141 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2015-12-16 05:07:31 +00:00
zzak 0a4129cb7a * lib/delegate.rb: Remove backtrace cleaning for delegated methods
This patch was provided by Rafael França and greatly improves
  performance when an exception is raised. [Bug #11461]

  Before:
    Calculating -------------------------------------
             default    86.209k i/100ms
     default raising     2.209k i/100ms
    -------------------------------------------------
             default      1.953M (±11.0%) i/s -      9.655M
     default raising     21.826k (±13.5%) i/s -    108.241k

  After:
    Calculating -------------------------------------
             default    72.211k i/100ms
     default raising    34.288k i/100ms
    -------------------------------------------------
             default      2.013M (±18.7%) i/s -      9.460M
     default raising    623.950k (± 9.7%) i/s -      3.120M

  Benchmark:
    require 'delegate'
    require 'benchmark/ips'

    class Foo
      def name
        'foo'
      end

      def bla
        raise
      end
    end

    class Bar < DelegateClass(Foo)
    end

    bar = Bar.new(Foo.new)

    Benchmark.ips do |b|
      b.report('default') { bar.name }
      b.report('default raising') { bar.bla rescue nil }
    end


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51806 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2015-09-09 02:12:52 +00:00
eregon 3f2d575f8c * lib/delegate.rb: [DOC] Update SimpleDelegator example. [ci skip]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50878 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2015-06-13 19:17:19 +00:00
hsbt bd29cec6bb * lib/delegate.rb: fix a typo.
[fix GH-881][ci skip] Patch by @Zorbash

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50370 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2015-04-23 01:01:44 +00:00
hsbt 6d6bd26270 * lib/delegate.rb: split executable code into sample directory.
* sample/delegate.rb: ditto.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@46966 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2014-07-26 17:11:56 +00:00
zzak cfe2cbda54 * lib/delegate.rb: [DOC] Document raise in Delegator class
Patch by @lucasmazza. [Fixes GH-621]
  https://github.com/ruby/ruby/pull/621


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@46264 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2014-05-30 18:52:30 +00:00
ayumin 2ff10784e4 * lib/delegate.rb: Fix example of using delegator.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45882 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2014-05-08 19:02:36 +00:00
nobu bcaec55695 delegate.rb: keep special methods
* lib/delegate.rb (Delegator): keep source information methods
  which start and end with '__'.  [ruby-core:58572] [Bug #9155]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@44630 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2014-01-17 11:05:03 +00:00
nobu fc4de12302 delegate.rb: ignore unset target
* lib/delegate.rb (Delegator#method_missing): ignore the target if not
  set, and delegate to global methods.  [ruby-core:58572] [Bug #9155]
* lib/delegate.rb (Delegator#respond_to_missing): ditto.
* lib/delegate.rb (SimpleDelegator#__getobj__): yield and return if
  not delegated but a block is given, like as Hash#fetch.
* lib/delegate.rb (DelegateClass#__getobj__): ditto.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43984 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-12-04 03:47:57 +00:00
nobu bb6607404a delegate.rb: check if target is set
* lib/delegate.rb (SimpleDelegator#__getobj__): target object must be set.
* lib/delegate.rb (DelegateClass#__getobj__): ditto.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43759 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-11-21 09:47:31 +00:00
nobu 594eec5b7d delegate.rb: try private methods after the target
* lib/delegate.rb (Delegator#method_missing): try private methods defined in
  Kernel after the target.  [Fixes GH-449]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43752 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-11-21 07:33:01 +00:00
nobu a9a6c103e5 delegate.rb: refix r43682
* lib/delegate.rb (Delegator#send): separate from method_missing so
  that super calls proper method.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43727 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-11-19 16:27:40 +00:00
nobu ca5739979d delegate.rb: get rid of global function interference
* lib/delegate.rb (Delegator#send): override to get rid of global function interference.
  [Fixes GH-449]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43682 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-11-15 08:07:39 +00:00
zzak 0357488b43 * lib/delegate.rb: Add example for __setobj__ and __getobj__
[Bug #8615] Patch by Caleb Thompson


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41905 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-07-10 15:50:23 +00:00
drbrain 1d7798dc75 * lib/delegate.rb: Added documentation for Delegator#!. Patch by
Zachary Scott.  [ruby-trunk - Feature #6534]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35973 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-06-08 22:46:49 +00:00
naruse 6e56d645f0 * lib/delegate.rb (Delegator#methods): Kernel#methods receives
zero or one argument. [ruby-core:37118] [Bug #4882]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@33939 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2011-12-04 03:05:03 +00:00
drbrain cfb37052cb * lib/delegate.rb: Move file-level documentation to the appropriate
classes.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@32713 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2011-07-27 19:53:44 +00:00
nobu d371e3583e * lib: revert r31635-r31638 and untabify with expand(1).
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@31641 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2011-05-19 00:07:25 +00:00
drbrain 7bbf2f3085 * lib: Convert tabs to spaces for ruby files per
http://redmine.ruby-lang.org/projects/ruby/wiki/DeveloperHowto#coding-style
	  Patch by Steve Klabnik [Ruby 1.9 - Bug #4730]
	  Patch by Jason Dew [Ruby 1.9 - Feature #4718]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@31635 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2011-05-18 21:19:18 +00:00
marcandre 6233ed4dcd * lib/delegate.rb: Forward #trust, #untrust, #taint and #untaint
to both the delegator and __getobj__ [ruby-core:26138]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@28376 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2010-06-22 04:23:59 +00:00
marcandre 0486db01fd * lib/delegate.rb: Delegate !=, eql? and hash [ruby-core:26139]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@28309 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2010-06-12 19:25:03 +00:00
marcandre 89efbfe0fa * lib/delegate: Delegator: combine (public|protected) methods with
those of the delegated object. [ruby-core:27224]
  DelegateClass: combine (public|protected) instance methods
  with those of the delegated superclass.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@28099 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2010-05-30 16:43:52 +00:00
naruse e707e05fe8 Fix :nodoc: definition. [ruby-dev:40949]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@27287 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2010-04-10 22:09:09 +00:00
matz a7926befe0 * object.c (rb_obj_clone): call initialize_clone hook method to
call initialize_copy.

* object.c (rb_obj_dup): call initialize_dup hook.

* lib/delegate.rb (Delegator#initialize_clone): use new hook to
  implement deep copy.  [ruby-dev:40242]

* lib/delegate.rb (Delegator#initialize_dup): ditto.

* test/test_delegate.rb (TestDelegateClass#test_copy_frozen): add
  a test to ensure #clone copies frozen status.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26620 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2010-02-08 07:43:54 +00:00
nobu a6569ad637 * lib/delegate.rb (Delegator#method_missing),
(Delegator.delegating_block): don't hide backtrace from
  __getobj__ and reduced exception messages when $DEBUG.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26592 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2010-02-06 03:02:40 +00:00
nobu 7873c05684 * lib/delegate.rb (Delegator): include copy of Kernel.
[ruby-dev:40314]

* lib/delegate.rb (Delegator#{dup,clone}): class of copy should be
  Delegator.  [ruby-dev:40313]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26580 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2010-02-05 07:38:10 +00:00
nobu 10e8419da6 * lib/delegate.rb (Delegator): now inherits BasicObject.
[ruby-dev:39154], [Bug #2679], [ruby-dev:40242]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26566 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2010-02-03 23:15:55 +00:00