classproxy 0.7.4 → 0.7.9
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.
- data/README.md +1 -1
- data/lib/classproxy/classproxy.rb +47 -21
- data/lib/classproxy/version.rb +1 -1
- data/lib/classproxy.rb +1 -0
- metadata +3 -3
data/README.md
CHANGED
@@ -46,7 +46,7 @@ class UserDb
|
|
46
46
|
|
47
47
|
primary_fetch { |args| where(args).first or (raise NotFound) }
|
48
48
|
fallback_fetch { |args| Octokit.user(args[:username]) }
|
49
|
-
after_fallback_fetch { |
|
49
|
+
after_fallback_fetch { |obj| self.username = obj.login }
|
50
50
|
|
51
51
|
key :name, String
|
52
52
|
key :reverse_name, String
|
@@ -32,10 +32,10 @@ module ClassProxy
|
|
32
32
|
# include ClassProxy
|
33
33
|
#
|
34
34
|
# fallback_fetch { |args| Octokit.user(args[:login]) }
|
35
|
-
# after_fallback_fetch do |
|
35
|
+
# after_fallback_fetch do |obj|
|
36
36
|
# # obj is what `fallback_fetch` returns
|
37
|
-
#
|
38
|
-
#
|
37
|
+
# self.name = obj.name
|
38
|
+
# self.login = obj.login
|
39
39
|
# end
|
40
40
|
#
|
41
41
|
# attr_accessor :name, :login
|
@@ -50,7 +50,7 @@ module ClassProxy
|
|
50
50
|
# include ClassProxy
|
51
51
|
#
|
52
52
|
# fallback_fetch { |args| Octokit.user(args[:login]) }
|
53
|
-
# after_fallback_fetch { |
|
53
|
+
# after_fallback_fetch { |obj| self.name = obj.name; self.login = obj.login }
|
54
54
|
#
|
55
55
|
# attr_accessor :name, :followers :login
|
56
56
|
#
|
@@ -101,17 +101,23 @@ module ClassProxy
|
|
101
101
|
private
|
102
102
|
|
103
103
|
def run_fallback(args, _self=nil)
|
104
|
-
|
104
|
+
obj = _self || self.new
|
105
|
+
|
106
|
+
fallback_obj = obj.instance_exec args, &@fallback_fetch
|
105
107
|
|
106
108
|
# Use the after_fallback_method
|
107
|
-
obj
|
108
|
-
@after_fallback_method[obj, fallback_obj] if @after_fallback_method.is_a?(Proc)
|
109
|
+
obj.instance_exec fallback_obj, &@after_fallback_method if @after_fallback_method.is_a? Proc
|
109
110
|
|
110
111
|
# Go through the keys of the return object and try to use setters
|
111
112
|
if fallback_obj and obj and fallback_obj.respond_to? :keys and fallback_obj.keys.respond_to? :each
|
112
113
|
fallback_obj.keys.each do |key|
|
113
|
-
next unless obj.respond_to? "#{key}="
|
114
|
-
|
114
|
+
next unless obj.respond_to? "#{key}="
|
115
|
+
|
116
|
+
# check if its set to something else
|
117
|
+
get_method = obj.respond_to?("no_proxy_#{key}") ? "no_proxy_#{key}" : key
|
118
|
+
if obj.respond_to? get_method and obj.send(get_method) == nil
|
119
|
+
obj.send("#{key}=", fallback_obj.send(key))
|
120
|
+
end
|
115
121
|
end
|
116
122
|
end
|
117
123
|
|
@@ -120,7 +126,9 @@ module ClassProxy
|
|
120
126
|
|
121
127
|
def proxy_method(method_name, proc=nil)
|
122
128
|
self.class_eval do
|
123
|
-
|
129
|
+
unless self.instance_methods.include? "no_proxy_#{method_name}".to_sym
|
130
|
+
alias_method "no_proxy_#{method_name}".to_sym, method_name
|
131
|
+
end
|
124
132
|
|
125
133
|
define_method(method_name) do |*args|
|
126
134
|
# Use the no_proxy one first
|
@@ -133,9 +141,11 @@ module ClassProxy
|
|
133
141
|
# to establish the dirty attribute, since the getter is being replaced
|
134
142
|
# here and the setter is being used when appropriate, the @mutex_in_call_for
|
135
143
|
# prevents endless recursion.
|
136
|
-
|
137
|
-
|
144
|
+
@mutex_in_call_for ||= []
|
145
|
+
if v == nil and not @mutex_in_call_for.include? method_name
|
146
|
+
@mutex_in_call_for << method_name
|
138
147
|
method = "_run_fallback_#{method_name}".to_sym
|
148
|
+
|
139
149
|
if self.respond_to?(method)
|
140
150
|
v = if self.method(method).arity == 1
|
141
151
|
# Callback method is expecting to receive the fallback object
|
@@ -148,13 +158,8 @@ module ClassProxy
|
|
148
158
|
end
|
149
159
|
else
|
150
160
|
# This method has no callback, so just run the fallback
|
151
|
-
|
152
|
-
|
153
|
-
next if key[-1] == '=' # don't run for set
|
154
|
-
hkey = key.to_s.gsub(/^no_proxy_/, '')
|
155
|
-
args[hkey.to_sym] = self.send(key)
|
156
|
-
end
|
157
|
-
self.class.send :run_fallback, args, self
|
161
|
+
args_class = ArgsClass.new(self)
|
162
|
+
self.class.send :run_fallback, args_class, self
|
158
163
|
|
159
164
|
# The value might have changed, so check here
|
160
165
|
v = self.send("no_proxy_#{method_name}".to_sym)
|
@@ -162,7 +167,7 @@ module ClassProxy
|
|
162
167
|
|
163
168
|
# Set the defaults when this class responds to the same method
|
164
169
|
self.send("#{method_name}=".to_sym, v) if v and self.respond_to?("#{method_name}=")
|
165
|
-
@mutex_in_call_for
|
170
|
+
@mutex_in_call_for.delete method_name
|
166
171
|
end
|
167
172
|
|
168
173
|
return v
|
@@ -177,4 +182,25 @@ module ClassProxy
|
|
177
182
|
def self.included(receiver)
|
178
183
|
receiver.extend ClassMethods
|
179
184
|
end
|
180
|
-
|
185
|
+
|
186
|
+
# This class makes methods accessible as a hash key, useful to pass
|
187
|
+
# as a fallback_fetch argument
|
188
|
+
class ArgsClass < BasicObject
|
189
|
+
def initialize(object)
|
190
|
+
@target = object
|
191
|
+
end
|
192
|
+
|
193
|
+
def [](key)
|
194
|
+
@target.respond_to?(key) ? @target.send(key) : @target[key]
|
195
|
+
end
|
196
|
+
|
197
|
+
def inspect
|
198
|
+
"ArgsClass [#{@target.inspect}] " +
|
199
|
+
(@target.methods - @target.class.methods).join(', ')
|
200
|
+
end
|
201
|
+
|
202
|
+
def target
|
203
|
+
@target
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
data/lib/classproxy/version.rb
CHANGED
data/lib/classproxy.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: classproxy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.9
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-12-
|
12
|
+
date: 2012-12-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -55,7 +55,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
55
55
|
version: '0'
|
56
56
|
segments:
|
57
57
|
- 0
|
58
|
-
hash:
|
58
|
+
hash: 3154749862381023825
|
59
59
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
60
|
none: false
|
61
61
|
requirements:
|