classproxy 0.7.1 → 0.7.4

Sign up to get free protection for your applications and to get access to all the features.
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 { |obj| UserDb.new(username: obj.login) }
49
+ after_fallback_fetch { |model, obj| model.username = obj.login }
50
50
 
51
51
  key :name, String
52
52
  key :reverse_name, String
data/Rakefile CHANGED
@@ -26,8 +26,8 @@ task release: :build do
26
26
  version = ClassProxy::VERSION
27
27
  system "git tag -a v#{version} -m 'Tagging #{version}'"
28
28
  system "git push --tags"
29
- system "gem push classproxy-#{version}"
30
- system "rm classproxy-#{version}"
29
+ system "gem push classproxy-#{version}.gem"
30
+ system "rm classproxy-#{version}.gem"
31
31
  end
32
32
 
33
33
  task default: :spec
@@ -32,9 +32,10 @@ module ClassProxy
32
32
  # include ClassProxy
33
33
  #
34
34
  # fallback_fetch { |args| Octokit.user(args[:login]) }
35
- # after_fallback_fetch do |obj|
35
+ # after_fallback_fetch do |model, obj|
36
36
  # # obj is what `fallback_fetch` returns
37
- # GithubUser.new(name: obj.name, login: obj.login)
37
+ # model.name = obj.name
38
+ # model.login = obj.login
38
39
  # end
39
40
  #
40
41
  # attr_accessor :name, :login
@@ -49,11 +50,11 @@ module ClassProxy
49
50
  # include ClassProxy
50
51
  #
51
52
  # fallback_fetch { |args| Octokit.user(args[:login]) }
52
- # after_fallback_fetch { |obj| GithubUser.new(name: obj.name, login: obj.login) }
53
+ # after_fallback_fetch { |model, obj| model.name = obj.name; model.login = obj.login }
53
54
  #
54
- # attr_accessor :name, :login
55
+ # attr_accessor :name, :followers :login
55
56
  #
56
- # proxy_methods uppercase_login: lambda { login.upcase }
57
+ # proxy_methods :name, :followers, uppercase_login: lambda { login.upcase }
57
58
  # end
58
59
  #
59
60
  # user = GithubUser.find(login: 'heelhook')
@@ -65,10 +66,9 @@ module ClassProxy
65
66
  methods.each do |method|
66
67
  if method.is_a? Symbol
67
68
  # If given a symbol, store as a method to overwrite and use the default loader
68
- proxy_method method, @default_proc
69
+ proxy_method method
69
70
  elsif method.is_a? Hash
70
- # If its a hash it will include methods to overwrite along with
71
- # custom loaders
71
+ # If its a hash it will include methods to overwrite along with custom loaders
72
72
  method.each { |method_name, proc| proxy_method method_name, proc }
73
73
  end
74
74
  end
@@ -91,19 +91,26 @@ module ClassProxy
91
91
  # @param [ Hash ] args The criteria to use
92
92
  # @options options [ true, false] :skip_fallback Don't use fallback methods
93
93
  def fetch(args, options={})
94
- @primary_fetch.is_a?(Proc) ? @primary_fetch.call(args) : (raise NotFound)
94
+ @primary_fetch.is_a?(Proc) ? @primary_fetch[args] : (raise NotFound)
95
95
  rescue NotFound
96
96
  return nil if options[:skip_fallback]
97
97
 
98
- fallback_obj = @fallback_fetch.call(args)
98
+ run_fallback(args)
99
+ end
100
+
101
+ private
102
+
103
+ def run_fallback(args, _self=nil)
104
+ fallback_obj = @fallback_fetch[args]
99
105
 
100
106
  # Use the after_fallback_method
101
- obj = @after_fallback_method.is_a?(Proc) ? @after_fallback_method[fallback_obj] : self.new
107
+ obj = _self || self.new
108
+ @after_fallback_method[obj, fallback_obj] if @after_fallback_method.is_a?(Proc)
102
109
 
103
110
  # Go through the keys of the return object and try to use setters
104
111
  if fallback_obj and obj and fallback_obj.respond_to? :keys and fallback_obj.keys.respond_to? :each
105
112
  fallback_obj.keys.each do |key|
106
- next unless obj.respond_to? "#{key}="
113
+ next unless obj.respond_to? "#{key}=" and obj.send(key) == nil
107
114
  obj.send("#{key}=", fallback_obj.send(key))
108
115
  end
109
116
  end
@@ -111,9 +118,7 @@ module ClassProxy
111
118
  return obj
112
119
  end
113
120
 
114
- private
115
-
116
- def proxy_method(method_name, proc)
121
+ def proxy_method(method_name, proc=nil)
117
122
  self.class_eval do
118
123
  alias_method "no_proxy_#{method_name}".to_sym, method_name
119
124
 
@@ -131,13 +136,31 @@ module ClassProxy
131
136
  if v == nil and @mutex_in_call_for != method_name
132
137
  @mutex_in_call_for = method_name
133
138
  method = "_run_fallback_#{method_name}".to_sym
134
- v = if self.method(method).arity == 1
135
- fallback_fetch_method = self.class.instance_variable_get(:@fallback_fetch)
136
- fallback_obj = fallback_fetch_method.call(self)
137
- self.send(method, fallback_obj)
139
+ if self.respond_to?(method)
140
+ v = if self.method(method).arity == 1
141
+ # Callback method is expecting to receive the fallback object
142
+ fallback_fetch_method = self.class.instance_variable_get(:@fallback_fetch)
143
+ fallback_obj = fallback_fetch_method[self]
144
+ self.send(method, fallback_obj)
145
+ else
146
+ # Callback method doesn't need the fallback object
147
+ self.send(method)
148
+ end
138
149
  else
139
- self.send(method)
150
+ # This method has no callback, so just run the fallback
151
+ args = {}
152
+ (self.methods - self.class.methods).each do |key|
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
158
+
159
+ # The value might have changed, so check here
160
+ v = self.send("no_proxy_#{method_name}".to_sym)
140
161
  end
162
+
163
+ # Set the defaults when this class responds to the same method
141
164
  self.send("#{method_name}=".to_sym, v) if v and self.respond_to?("#{method_name}=")
142
165
  @mutex_in_call_for = nil
143
166
  end
@@ -147,14 +170,11 @@ module ClassProxy
147
170
  end
148
171
 
149
172
  # Now define the fallback that is going to be used
150
- self.send(:define_method, "_run_fallback_#{method_name}", &proc)
173
+ self.send(:define_method, "_run_fallback_#{method_name}", &proc) if proc.is_a? Proc
151
174
  end
152
175
  end
153
176
 
154
- @default_proc = Proc.new { "hi" }
155
-
156
177
  def self.included(receiver)
157
178
  receiver.extend ClassMethods
158
-
159
179
  end
160
180
  end
@@ -1,3 +1,3 @@
1
1
  module ClassProxy
2
- VERSION = '0.7.1'
2
+ VERSION = '0.7.4'
3
3
  end
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.1
4
+ version: 0.7.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -55,7 +55,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
55
55
  version: '0'
56
56
  segments:
57
57
  - 0
58
- hash: 1986855267871768364
58
+ hash: -1419408935821382140
59
59
  required_rubygems_version: !ruby/object:Gem::Requirement
60
60
  none: false
61
61
  requirements: