forwardable-extended 2.3.0 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
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: