forwardable-extended 2.3.0 → 2.4.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
  SHA1:
3
- metadata.gz: 44928a73258dd5fea629b2a83f2c33606ca922c1
4
- data.tar.gz: 6848d6b288a73cbbbdabfcc3941e2a5bc1ab4f71
3
+ metadata.gz: 6f03c74bee501582d5fe8c93eab591e72cf285c9
4
+ data.tar.gz: 7d83bd3e70ab74b9ac87879fe8912b29ebbf58c0
5
5
  SHA512:
6
- metadata.gz: 0761c6e6e3ce5346eac28ab13f56c8fb64a7f185b9beb8051611feaeb417f0ea63cc48d4a2ee01b36af38e83378553eca0fb65a4bc85ca7c29275cf0716a743e
7
- data.tar.gz: 62c8057174d3a5fe87163a6cc99a3408a2ccebfdccd69acb0f0a89a276393745dbe3e2eba9b5f6c9e4a715451adf5dff500cefa9118a31e980b1dca93e997486
6
+ metadata.gz: d26c1a7fda68197b490555a293d9eccd0ec61c67b145aac2b37fa4faa011bff377497f9f6e0eac28184ed88be746e142c2d2276598768ac8f9dd2bc6215c9d98
7
+ data.tar.gz: 0d8f3c7826b12edd53cde5864e2d7350741b361286d4ca91d75058fa8692b9442ca0d4b96c66f69912f04d12bffe9ed02928b1618bd409f8e7963723208a2a5b
@@ -1,77 +1,144 @@
1
+ # ----------------------------------------------------------------------------
1
2
  # Frozen-string-literal: true
2
3
  # Copyright: 2015-2016 Jordon Bedwell - MIT License
3
4
  # Encoding: utf-8
5
+ # ----------------------------------------------------------------------------
4
6
 
5
7
  require "forwardable/extended/version"
6
8
  require "forwardable"
7
9
 
8
10
  module Forwardable
9
11
  module Extended
10
- DEF_DELEGATOR = Object::Forwardable.instance_method(:def_delegator)
11
12
 
13
+ # ------------------------------------------------------------------------
14
+ # A simpler delegator that wraps around `def_delegator` and makes it easy.
15
+ # ------------------------------------------------------------------------
16
+
17
+ def rb_delegate(method, to: nil, alias_of: method, **kwd)
18
+ raise ArgumentError, "to must be provided" unless to
19
+ def_delegator(
20
+ to, alias_of, method, **kwd
21
+ )
22
+ end
23
+
24
+ # ------------------------------------------------------------------------
12
25
  # Delegates a method to a `hash[key]`.
13
26
  # @param [Symbol] key used if method is an alias; disignates the hash key.
14
27
  # @param [Hash] hash the hash object you wish to delegate to.
28
+ # ------------------------------------------------------------------------
15
29
 
16
30
  def def_hash_delegator(hash, method, key: method, **kwd)
17
31
  prefix, suffix, wrap = __prepare(**kwd)
32
+ method = method.to_s.gsub(/\?$/, "")
18
33
 
19
- class_eval <<-STR, __FILE__, __LINE__
34
+ class_eval <<-STR, __FILE__, __LINE__ - 3
20
35
  def #{method}#{suffix}(*args)
21
- #{wrap} #{prefix} #{hash}[#{key.inspect}]
36
+ #{wrap}(
37
+ #{prefix}#{hash}[#{key.inspect}]
38
+ )
39
+
40
+ rescue Exception
41
+ unless Forwardable.debug
42
+ $@.delete_if do |source|
43
+ source =~ %r"#{Regexp.escape(__FILE__)}"o
44
+ end
45
+ end
46
+
47
+ raise
22
48
  end
23
49
  STR
24
50
  end
25
51
 
52
+ # ------------------------------------------------------------------------
26
53
  # Delegates a method to an instance variable.
27
54
  # @note if you are not using an alias or booleans use `attr_reader`.
28
55
  # @param [String, Symbol] ivar the instance variable.
29
56
  # @param [String, Symbol] alias_ the alias.
57
+ # ------------------------------------------------------------------------
30
58
 
31
59
  def def_ivar_delegator(ivar, alias_ = ivar, **kwd)
32
60
  prefix, suffix, wrap = __prepare(**kwd)
61
+ alias_ = alias_.to_s.gsub(/\?$/, "")
33
62
 
34
- class_eval <<-STR, __FILE__, __LINE__
63
+ class_eval <<-STR, __FILE__, __LINE__ - 3
35
64
  def #{alias_.to_s.gsub(/\A@/, "")}#{suffix}
36
- #{wrap} #{prefix} #{ivar}
65
+ #{wrap}(
66
+ #{prefix}#{ivar}
67
+ )
68
+
69
+ rescue Exception
70
+ unless Forwardable.debug
71
+ $@.delete_if do |source|
72
+ source =~ %r"#{Regexp.escape(__FILE__)}"o
73
+ end
74
+ end
75
+
76
+ raise
37
77
  end
38
78
  STR
39
79
  end
40
80
 
81
+ # ------------------------------------------------------------------------
41
82
  # A more beefed up version of Ruby's `def_delegator` that
42
83
  # offers a tiny bit more than the default version in `Forwardable`
43
84
  # @param [Object<>] accessor the object to ship your method to.
44
85
  # @param [String, Symbol] method the method being messaged.
45
86
  # @param [Array<>] args the arguments to place in front.
87
+ # ------------------------------------------------------------------------
46
88
 
47
89
  def def_modern_delegator(accessor, method, alias_ = method, args: [], **kwd)
48
90
  args = [args].flatten.compact.map(&:to_s).unshift("").join(", ")
49
91
  prefix, suffix, wrap = __prepare(**kwd)
92
+ alias_ = alias_.to_s.gsub(/\?$/, "")
50
93
 
51
- class_eval <<-STR, __FILE__, __LINE__
94
+ class_eval <<-STR, __FILE__, __LINE__ - 4
52
95
  def #{alias_}#{suffix}(*args, &block)
53
- #{wrap} #{prefix} #{accessor}.send(#{method.inspect}#{args}, *args, &block)
96
+ #{wrap}(#{prefix}#{accessor}.send(
97
+ #{method.inspect}#{args}, *args, &block
98
+ ))
99
+
100
+ rescue Exception
101
+ unless Forwardable.debug
102
+ $@.delete_if do |source|
103
+ source =~ %r"#{Regexp.escape(__FILE__)}"o
104
+ end
105
+ end
106
+
107
+ raise
54
108
  end
55
109
  STR
56
110
  end
57
111
 
112
+ # ------------------------------------------------------------------------
58
113
  # Wraps around traditional def_delegator to offer forwarding to modern,
59
114
  # ivar and hash delegators. With a bit of data checking between.
60
115
  # @see `Object::Forwardable#def_delegator`
116
+ # ------------------------------------------------------------------------
61
117
 
62
118
  def def_delegator(accessor, method, alias_ = method, **kwd)
63
119
  kwd, alias_ = alias_, method if alias_.is_a?(Hash) && !kwd.any?
64
- return DEF_DELEGATOR.bind(self).call(accessor, method, alias_) if alias_.is_a?(Hash) || !kwd.any?
65
- return def_modern_delegator(accessor, method, alias_, **kwd) unless kwd[:type]
66
120
 
67
- raise ArgumentError, "Alias not supported with type" if alias_ != method
68
- send("def_#{kwd[:type]}_delegator", accessor, method, **kwd.tap { |obj|
69
- obj.delete(:type)
70
- })
121
+ if alias_.is_a?(Hash) || !kwd.any?
122
+ Forwardable.instance_method(:def_delegator).bind(self) \
123
+ .call(accessor, method, alias_)
124
+
125
+ elsif !kwd[:type]
126
+ def_modern_delegator(
127
+ accessor, method, alias_, **kwd
128
+ )
129
+
130
+ else
131
+ raise ArgumentError, "Alias not supported with type" if alias_ != method
132
+ send("def_#{kwd[:type]}_delegator", accessor, method, **kwd.tap { |obj|
133
+ obj.delete(:type)
134
+ })
135
+ end
71
136
  end
72
137
 
138
+ # ------------------------------------------------------------------------
73
139
  # Wraps around traditional `def_delegators` to detect hash arguments.
74
140
  # @see `Object::Forwardable#def_delegators`
141
+ # ------------------------------------------------------------------------
75
142
 
76
143
  def def_delegators(accessor, *methods)
77
144
  kwd = methods.shift if methods.first.is_a?(Hash)
@@ -83,9 +150,11 @@ module Forwardable
83
150
  end
84
151
  end
85
152
 
153
+ # ------------------------------------------------------------------------
86
154
  # Prepares the suffix, prefix and wrap method if available.
87
155
  # @param [true, false, :reverse] bool whether or not this is a boolean.
88
156
  # @param [true, Symbol, String] wrap wrap result into the wrap.
157
+ # ------------------------------------------------------------------------
89
158
 
90
159
  private
91
160
  def __prepare(wrap: nil, bool: false)
@@ -4,6 +4,6 @@
4
4
 
5
5
  module Forwardable
6
6
  module Extended
7
- VERSION = "2.3.0"
7
+ VERSION = "2.4.0"
8
8
  end
9
9
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: forwardable-extended
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 2.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jordon Bedwell
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-15 00:00:00.000000000 Z
11
+ date: 2016-01-18 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Forwardable with hash, and instance variable extensions.
14
14
  email: