delegate 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6cd16ea3c730a702d06a1721e2213829db7c2ccc0109aa267fa62201f9f5b910
4
- data.tar.gz: 7e46d4c7174ff100079239050e33e41589c9d1a553d8497ab0fb763b22939835
3
+ metadata.gz: dc397384e2431f310f68623dc90452d5d30422a6420cd2375a989c0ab76f2c3d
4
+ data.tar.gz: b6b2e957f8b6edc91dc328c19f8d94f10021bc902adc839baf7412c831faa386
5
5
  SHA512:
6
- metadata.gz: 9779b0aa3f86278c7ddef289936be20530e6056c22cfca97039740495a80e9cd9f77d22cb51ff6bc02e9b43e7dfdb3917dd22bd0fb93bf6e38c8858d6080e174
7
- data.tar.gz: 7d1ce7b641a66022ac9ef56f46dbcfd0999fdd4f6834fbdfb4142d0fbb39fa689a4007395657704f174181709ca251e5f78965e9cbead70b8a8f9cb0f0d8bc3a
6
+ metadata.gz: 957fccf5fbbc8648671b38c1bf487c7b1ce7fcad2b8f7d634e5e30959698bc93259d637cb468ece1d630661c2adc2bc7b5d228cea5a31dab30e4fdf10e011511
7
+ data.tar.gz: fc3a860ae2ffdb5873d810d80420f46565fd1692f0e573879318ca13c597e6aa4b0c090c172d60c24b11515a608fcda1684639c50af0cc47ada125f6f866a0e0
@@ -0,0 +1,24 @@
1
+ name: test
2
+
3
+ on: [push, pull_request]
4
+
5
+ jobs:
6
+ build:
7
+ name: build (${{ matrix.ruby }} / ${{ matrix.os }})
8
+ strategy:
9
+ matrix:
10
+ ruby: [ head ]
11
+ os: [ ubuntu-latest, macos-latest ]
12
+ runs-on: ${{ matrix.os }}
13
+ steps:
14
+ - uses: actions/checkout@master
15
+ - name: Set up Ruby
16
+ uses: ruby/setup-ruby@v1
17
+ with:
18
+ ruby-version: ${{ matrix.ruby }}
19
+ - name: Install dependencies
20
+ run: |
21
+ gem install bundler --no-document
22
+ bundle install
23
+ - name: Run test
24
+ run: rake test
data/.gitignore CHANGED
@@ -6,3 +6,4 @@
6
6
  /pkg/
7
7
  /spec/reports/
8
8
  /tmp/
9
+ /Gemfile.lock
data/README.md CHANGED
@@ -56,4 +56,4 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
56
56
 
57
57
  ## Contributing
58
58
 
59
- Bug reports and pull requests are welcome on GitHub at https://github.com/hsbt/delegate.
59
+ Bug reports and pull requests are welcome on GitHub at https://github.com/ruby/delegate.
data/Rakefile CHANGED
@@ -7,4 +7,11 @@ Rake::TestTask.new(:test) do |t|
7
7
  t.test_files = FileList["test/**/test_*.rb"]
8
8
  end
9
9
 
10
+ task :sync_tool do
11
+ require 'fileutils'
12
+ FileUtils.cp "../ruby/tool/lib/test/unit/core_assertions.rb", "./test/lib"
13
+ FileUtils.cp "../ruby/tool/lib/envutil.rb", "./test/lib"
14
+ FileUtils.cp "../ruby/tool/lib/find_executable.rb", "./test/lib"
15
+ end
16
+
10
17
  task :default => :test
@@ -1,25 +1,31 @@
1
- lib = File.expand_path("lib", __dir__)
2
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
- require "delegate/version"
1
+ # frozen_string_literal: true
2
+
3
+ name = File.basename(__FILE__, ".gemspec")
4
+ version = ["lib", Array.new(name.count("-")+1, "..").join("/")].find do |dir|
5
+ break File.foreach(File.join(__dir__, dir, "#{name.tr('-', '/')}.rb")) do |line|
6
+ /^\s*VERSION\s*=\s*"(.*)"/ =~ line and break $1
7
+ end rescue nil
8
+ end
4
9
 
5
10
  Gem::Specification.new do |spec|
6
- spec.name = "delegate"
7
- spec.version = Delegator::VERSION
8
- spec.authors = ["Hiroshi SHIBATA"]
9
- spec.email = ["hsbt@ruby-lang.org"]
11
+ spec.name = name
12
+ spec.version = version
13
+ spec.authors = ["Yukihiro Matsumoto"]
14
+ spec.email = ["matz@ruby-lang.org"]
10
15
 
11
16
  spec.summary = %q{Provides three abilities to delegate method calls to an object.}
12
17
  spec.description = %q{Provides three abilities to delegate method calls to an object.}
13
18
  spec.homepage = "https://github.com/ruby/delegate"
14
- spec.license = "BSD-2-Clause"
19
+ spec.licenses = ["Ruby", "BSD-2-Clause"]
15
20
 
16
21
  spec.metadata["homepage_uri"] = spec.homepage
17
22
  spec.metadata["source_code_uri"] = spec.homepage
18
23
 
19
24
  spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
20
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
+ `git ls-files -z 2>/dev/null`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
21
26
  end
22
27
  spec.bindir = "exe"
23
28
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
29
  spec.require_paths = ["lib"]
30
+ spec.required_ruby_version = '>= 2.7'
25
31
  end
@@ -21,6 +21,8 @@
21
21
  # SimpleDelegator's implementation serves as a nice example of the use of
22
22
  # Delegator:
23
23
  #
24
+ # require 'delegate'
25
+ #
24
26
  # class SimpleDelegator < Delegator
25
27
  # def __getobj__
26
28
  # @delegate_sd_obj # return object we are delegating to, required
@@ -37,6 +39,8 @@
37
39
  # Be advised, RDoc will not detect delegated methods.
38
40
  #
39
41
  class Delegator < BasicObject
42
+ VERSION = "0.2.0"
43
+
40
44
  kernel = ::Kernel.dup
41
45
  kernel.class_eval do
42
46
  alias __raise__ raise
@@ -75,14 +79,14 @@ class Delegator < BasicObject
75
79
  #
76
80
  # Handles the magic of delegation through \_\_getobj\_\_.
77
81
  #
78
- def method_missing(m, *args, &block)
82
+ ruby2_keywords def method_missing(m, *args, &block)
79
83
  r = true
80
84
  target = self.__getobj__ {r = false}
81
85
 
82
- if r && target.respond_to?(m)
86
+ if r && target_respond_to?(target, m, false)
83
87
  target.__send__(m, *args, &block)
84
88
  elsif ::Kernel.method_defined?(m) || ::Kernel.private_method_defined?(m)
85
- ::Kernel.instance_method(m).bind(self).(*args, &block)
89
+ ::Kernel.instance_method(m).bind_call(self, *args, &block)
86
90
  else
87
91
  super(m, *args, &block)
88
92
  end
@@ -95,14 +99,31 @@ class Delegator < BasicObject
95
99
  def respond_to_missing?(m, include_private)
96
100
  r = true
97
101
  target = self.__getobj__ {r = false}
98
- r &&= target.respond_to?(m, include_private)
99
- if r && include_private && !target.respond_to?(m, false)
102
+ r &&= target_respond_to?(target, m, include_private)
103
+ if r && include_private && !target_respond_to?(target, m, false)
100
104
  warn "delegator does not forward private method \##{m}", uplevel: 3
101
105
  return false
102
106
  end
103
107
  r
104
108
  end
105
109
 
110
+ KERNEL_RESPOND_TO = ::Kernel.instance_method(:respond_to?)
111
+ private_constant :KERNEL_RESPOND_TO
112
+
113
+ # Handle BasicObject instances
114
+ private def target_respond_to?(target, m, include_private)
115
+ case target
116
+ when Object
117
+ target.respond_to?(m, include_private)
118
+ else
119
+ if KERNEL_RESPOND_TO.bind_call(target, :respond_to?)
120
+ target.respond_to?(m, include_private)
121
+ else
122
+ KERNEL_RESPOND_TO.bind_call(target, m, include_private)
123
+ end
124
+ end
125
+ end
126
+
106
127
  #
107
128
  # Returns the methods available to this delegate object as the union
108
129
  # of this object's and \_\_getobj\_\_ methods.
@@ -201,44 +222,21 @@ class Delegator < BasicObject
201
222
  end
202
223
  end
203
224
 
204
- def initialize_clone(obj) # :nodoc:
205
- self.__setobj__(obj.__getobj__.clone)
225
+ def initialize_clone(obj, freeze: nil) # :nodoc:
226
+ self.__setobj__(obj.__getobj__.clone(freeze: freeze))
206
227
  end
207
228
  def initialize_dup(obj) # :nodoc:
208
229
  self.__setobj__(obj.__getobj__.dup)
209
230
  end
210
231
  private :initialize_clone, :initialize_dup
211
232
 
212
- ##
213
- # :method: trust
214
- # Trust both the object returned by \_\_getobj\_\_ and self.
215
- #
216
-
217
- ##
218
- # :method: untrust
219
- # Untrust both the object returned by \_\_getobj\_\_ and self.
220
- #
221
-
222
- ##
223
- # :method: taint
224
- # Taint both the object returned by \_\_getobj\_\_ and self.
225
- #
226
-
227
- ##
228
- # :method: untaint
229
- # Untaint both the object returned by \_\_getobj\_\_ and self.
230
- #
231
-
232
233
  ##
233
234
  # :method: freeze
234
235
  # Freeze both the object returned by \_\_getobj\_\_ and self.
235
236
  #
236
-
237
- [:trust, :untrust, :taint, :untaint, :freeze].each do |method|
238
- define_method method do
239
- __getobj__.send(method)
240
- super()
241
- end
237
+ def freeze
238
+ __getobj__.freeze
239
+ super()
242
240
  end
243
241
 
244
242
  @delegator_api = self.public_instance_methods
@@ -259,6 +257,8 @@ end
259
257
  # end
260
258
  # end
261
259
  #
260
+ # require 'delegate'
261
+ #
262
262
  # class UserDecorator < SimpleDelegator
263
263
  # def birth_year
264
264
  # born_on.year
@@ -347,7 +347,7 @@ def Delegator.delegating_block(mid) # :nodoc:
347
347
  lambda do |*args, &block|
348
348
  target = self.__getobj__
349
349
  target.__send__(mid, *args, &block)
350
- end
350
+ end.ruby2_keywords
351
351
  end
352
352
 
353
353
  #
@@ -424,6 +424,21 @@ def DelegateClass(superclass, &block)
424
424
  klass.define_singleton_method :protected_instance_methods do |all=true|
425
425
  super(all) | superclass.protected_instance_methods
426
426
  end
427
+ klass.define_singleton_method :instance_methods do |all=true|
428
+ super(all) | superclass.instance_methods
429
+ end
430
+ klass.define_singleton_method :public_instance_method do |name|
431
+ super(name)
432
+ rescue NameError
433
+ raise unless self.public_instance_methods.include?(name)
434
+ superclass.public_instance_method(name)
435
+ end
436
+ klass.define_singleton_method :instance_method do |name|
437
+ super(name)
438
+ rescue NameError
439
+ raise unless self.instance_methods.include?(name)
440
+ superclass.instance_method(name)
441
+ end
427
442
  klass.module_eval(&block) if block
428
443
  return klass
429
444
  end
metadata CHANGED
@@ -1,24 +1,24 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: delegate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
- - Hiroshi SHIBATA
8
- autorequire:
7
+ - Yukihiro Matsumoto
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-11-06 00:00:00.000000000 Z
11
+ date: 2020-12-22 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Provides three abilities to delegate method calls to an object.
14
14
  email:
15
- - hsbt@ruby-lang.org
15
+ - matz@ruby-lang.org
16
16
  executables: []
17
17
  extensions: []
18
18
  extra_rdoc_files: []
19
19
  files:
20
+ - ".github/workflows/test.yml"
20
21
  - ".gitignore"
21
- - ".travis.yml"
22
22
  - Gemfile
23
23
  - LICENSE.txt
24
24
  - README.md
@@ -27,14 +27,14 @@ files:
27
27
  - bin/setup
28
28
  - delegate.gemspec
29
29
  - lib/delegate.rb
30
- - lib/delegate/version.rb
31
30
  homepage: https://github.com/ruby/delegate
32
31
  licenses:
32
+ - Ruby
33
33
  - BSD-2-Clause
34
34
  metadata:
35
35
  homepage_uri: https://github.com/ruby/delegate
36
36
  source_code_uri: https://github.com/ruby/delegate
37
- post_install_message:
37
+ post_install_message:
38
38
  rdoc_options: []
39
39
  require_paths:
40
40
  - lib
@@ -42,15 +42,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
42
42
  requirements:
43
43
  - - ">="
44
44
  - !ruby/object:Gem::Version
45
- version: '0'
45
+ version: '2.7'
46
46
  required_rubygems_version: !ruby/object:Gem::Requirement
47
47
  requirements:
48
48
  - - ">="
49
49
  - !ruby/object:Gem::Version
50
50
  version: '0'
51
51
  requirements: []
52
- rubygems_version: 3.0.3
53
- signing_key:
52
+ rubygems_version: 3.2.2
53
+ signing_key:
54
54
  specification_version: 4
55
55
  summary: Provides three abilities to delegate method calls to an object.
56
56
  test_files: []
@@ -1,7 +0,0 @@
1
- ---
2
- sudo: false
3
- language: ruby
4
- cache: bundler
5
- rvm:
6
- - 2.6.3
7
- before_install: gem install bundler -v 2.0.2
@@ -1,3 +0,0 @@
1
- class Delegator
2
- VERSION = "0.1.0"
3
- end