api_resource 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.2
1
+ 0.2.3
data/api_resource.gemspec CHANGED
@@ -4,14 +4,14 @@
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
- s.name = %q{api_resource}
8
- s.version = "0.2.2"
7
+ s.name = "api_resource"
8
+ s.version = "0.2.3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Ethan Langevin"]
12
- s.date = %q{2012-01-07}
13
- s.description = %q{A replacement for ActiveResource for RESTful APIs that handles associated object and multiple data sources}
14
- s.email = %q{ejl6266@gmail.com}
12
+ s.date = "2012-01-08"
13
+ s.description = "A replacement for ActiveResource for RESTful APIs that handles associated object and multiple data sources"
14
+ s.email = "ejl6266@gmail.com"
15
15
  s.extra_rdoc_files = [
16
16
  "LICENSE.txt",
17
17
  "README.rdoc"
@@ -76,11 +76,11 @@ Gem::Specification.new do |s|
76
76
  "spec/support/requests/test_resource_requests.rb",
77
77
  "spec/support/test_resource.rb"
78
78
  ]
79
- s.homepage = %q{http://github.com/ejlangev/resource}
79
+ s.homepage = "http://github.com/ejlangev/resource"
80
80
  s.licenses = ["MIT"]
81
81
  s.require_paths = ["lib"]
82
- s.rubygems_version = %q{1.6.2}
83
- s.summary = %q{A replacement for ActiveResource for RESTful APIs that handles associated object and multiple data sources}
82
+ s.rubygems_version = "1.8.11"
83
+ s.summary = "A replacement for ActiveResource for RESTful APIs that handles associated object and multiple data sources"
84
84
 
85
85
  if s.respond_to? :specification_version then
86
86
  s.specification_version = 3
@@ -3,7 +3,8 @@ module ApiResource
3
3
  module Associations
4
4
 
5
5
  class AssociationProxy
6
-
6
+
7
+
7
8
  cattr_accessor :remote_path_element; self.remote_path_element = :service_uri
8
9
  cattr_accessor :include_class_scopes; self.include_class_scopes = true
9
10
 
@@ -23,9 +24,10 @@ module ApiResource
23
24
  end
24
25
  # Now that we have set up all the scopes with the load method we need to create methods
25
26
  self.scopes.each do |key, _|
27
+ next if self.respond_to?(key)
26
28
  self.instance_eval <<-EOE, __FILE__, __LINE__ + 1
27
29
  def #{key}(opts = {})
28
- ApiResource::Associations::RelationScope.new(self, :#{key}, opts)
30
+ @#{key} ||= ApiResource::Associations::RelationScope.new(self, :#{key}, opts)
29
31
  end
30
32
  EOE
31
33
  end
@@ -56,16 +58,8 @@ module ApiResource
56
58
  self.internal_object.send(method, *args, &block)
57
59
  end
58
60
 
59
- def reload(scope = nil, opts = {})
60
- if scope.nil?
61
- self.loaded.clear
62
- self.times_loaded = 0
63
- # Remove the loaded object to force it to reload
64
- remove_instance_variable(:@internal_object) if instance_variable_defined?(:@internal_object)
65
- else
66
- # Delete this key from the loaded hash which will cause it to be reloaded
67
- self.loaded.delete(self.loaded_hash_key(scope, opts))
68
- end
61
+ def reload
62
+ remove_instance_variable(:@internal_object) if instance_variable_defined?(:@internal_object)
69
63
  self
70
64
  end
71
65
 
@@ -34,11 +34,12 @@ module ApiResource
34
34
  def load_scope_with_options(scope, options)
35
35
  scope = self.loaded_hash_key(scope.to_s, options)
36
36
  return [] if self.remote_path.blank?
37
- unless self.loaded[scope]
37
+
38
+ self.loaded[scope] ||= begin
38
39
  self.times_loaded += 1
39
- self.loaded[scope] = self.load_from_remote(options)
40
+ self.load_from_remote(options).collect{|item| self.klass.new(item)}
40
41
  end
41
- self.loaded[scope].collect{|item| self.klass.new(item)}
42
+
42
43
  end
43
44
 
44
45
  def load(contents)
@@ -57,7 +58,7 @@ module ApiResource
57
58
  raise "Expected the scope #{key} to point to a hash, to #{value}" unless value.is_a?(Hash)
58
59
  self.instance_eval <<-EOE, __FILE__, __LINE__ + 1
59
60
  def #{key}(opts = {})
60
- ApiResource::Associations::RelationScope.new(self, :#{key}, opts)
61
+ @#{key} ||= ApiResource::Associations::RelationScope.new(self, :#{key}, opts)
61
62
  end
62
63
  EOE
63
64
  self.scopes[key.to_s] = value
@@ -6,17 +6,10 @@ module ApiResource
6
6
 
7
7
  class RelationScope < Scope
8
8
 
9
- def reload
10
- remove_instance_variable(:@internal_object) if instance_variable_defined?(:@internal_object)
11
- self.klass.reload(self.current_scope, self.scopes[self.current_scope])
12
- self
13
- end
14
-
15
9
  # Use this method to access the internal data, this guarantees that loading only occurs once per object
16
10
  def internal_object
17
11
  @internal_object ||= self.klass.send(:load_scope_with_options, self.current_scope, self.to_hash)
18
12
  end
19
-
20
13
  #
21
14
  # class factory
22
15
  def self.class_factory(hsh)
@@ -93,8 +93,10 @@ module ApiResource
93
93
  end
94
94
  def enhance_current_scope(scp, *args)
95
95
  opts = args.extract_options!
96
- check_scope(scp)
97
- self.class.class_factory(self.scopes[scp]).new(self.klass, scp, *args, opts.merge(:parent => self))
96
+ check_scope(scp)
97
+ cache_key = "a#{Digest::MD5.hexdigest((args.sort + [scp]).to_s)}"
98
+ return instance_variable_get("@#{cache_key}") if instance_variable_defined?("@#{cache_key}")
99
+ return instance_variable_set("@#{cache_key}", self.class.class_factory(self.scopes[scp]).new(self.klass, scp, *args, opts.merge(:parent => self)))
98
100
  end
99
101
  # make sure we have a valid scope
100
102
  def check_scope(scp)
@@ -30,11 +30,10 @@ module ApiResource
30
30
  scope = self.loaded_hash_key(scope.to_s, options)
31
31
  # If the service uri is blank you can't load
32
32
  return nil if self.remote_path.blank?
33
- unless self.loaded[scope]
33
+ self.loaded[scope] ||= begin
34
34
  self.times_loaded += 1
35
- self.loaded[scope] = self.load_from_remote(options)
35
+ self.klass.new(self.load_from_remote(options))
36
36
  end
37
- self.klass.new(self.loaded[scope])
38
37
  end
39
38
 
40
39
  def load(contents)
@@ -65,7 +64,7 @@ module ApiResource
65
64
  raise "Expected the scope #{key} to have a hash for a value, got #{val}" unless val.is_a?(Hash)
66
65
  self.instance_eval <<-EOE, __FILE__, __LINE__ + 1
67
66
  def #{key}(opts = {})
68
- ApiResource::Associations::RelationScope.new(self, :#{key}, opts)
67
+ @#{key} ||= ApiResource::Associations::RelationScope.new(self, :#{key}, opts)
69
68
  end
70
69
  EOE
71
70
  self.scopes[key.to_s] = val
@@ -374,18 +374,6 @@ describe "Associations" do
374
374
  ap.active.with_birthday.birthday.should_not be_blank
375
375
  end
376
376
 
377
- it "should be able to load a chain of scopes with substitution" do
378
- ap = Associations::SingleObjectProxy.new("TestResource",{:service_uri => '/single_object_association', :active => {:active => false}, :with_birthday => {:birthday => true}, :scopes_only => true})
379
- item = ap.active(:active => true).internal_object
380
- item.active.should be_true
381
- ap.times_loaded.should eql(1)
382
- # This error and incrementing times_loaded means it tried to load again
383
- lambda {
384
- ap.active.internal_object
385
- }.should raise_error
386
- ap.times_loaded.should eql(2)
387
- end
388
-
389
377
  it "should proxy unknown methods to the object loading if it hasn't already" do
390
378
  ap = Associations::SingleObjectProxy.new("TestResource",{:service_uri => '/single_object_association', :active => {:active => false}, :with_birthday => {:birthday => true}, :scopes_only => true})
391
379
  ap.times_loaded.should eql(0)
metadata CHANGED
@@ -1,246 +1,247 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: api_resource
3
- version: !ruby/object:Gem::Version
4
- version: 0.2.2
3
+ version: !ruby/object:Gem::Version
5
4
  prerelease:
5
+ version: 0.2.3
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Ethan Langevin
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-07 00:00:00.000000000 -05:00
13
- default_executable:
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
12
+
13
+ date: 2012-01-08 00:00:00 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
16
  name: rails
17
- requirement: &70184031659720 !ruby/object:Gem::Requirement
17
+ requirement: &id001 !ruby/object:Gem::Requirement
18
18
  none: false
19
- requirements:
20
- - - =
21
- - !ruby/object:Gem::Version
19
+ requirements:
20
+ - - "="
21
+ - !ruby/object:Gem::Version
22
22
  version: 3.0.9
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *70184031659720
26
- - !ruby/object:Gem::Dependency
25
+ version_requirements: *id001
26
+ - !ruby/object:Gem::Dependency
27
27
  name: hash_dealer
28
- requirement: &70184031659140 !ruby/object:Gem::Requirement
28
+ requirement: &id002 !ruby/object:Gem::Requirement
29
29
  none: false
30
- requirements:
31
- - - ! '>='
32
- - !ruby/object:Gem::Version
33
- version: '0'
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
34
  type: :runtime
35
35
  prerelease: false
36
- version_requirements: *70184031659140
37
- - !ruby/object:Gem::Dependency
36
+ version_requirements: *id002
37
+ - !ruby/object:Gem::Dependency
38
38
  name: rest-client
39
- requirement: &70184031658500 !ruby/object:Gem::Requirement
39
+ requirement: &id003 !ruby/object:Gem::Requirement
40
40
  none: false
41
- requirements:
42
- - - ! '>='
43
- - !ruby/object:Gem::Version
44
- version: '0'
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: "0"
45
45
  type: :runtime
46
46
  prerelease: false
47
- version_requirements: *70184031658500
48
- - !ruby/object:Gem::Dependency
47
+ version_requirements: *id003
48
+ - !ruby/object:Gem::Dependency
49
49
  name: log4r
50
- requirement: &70184031656140 !ruby/object:Gem::Requirement
50
+ requirement: &id004 !ruby/object:Gem::Requirement
51
51
  none: false
52
- requirements:
53
- - - ! '>='
54
- - !ruby/object:Gem::Version
55
- version: '0'
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: "0"
56
56
  type: :runtime
57
57
  prerelease: false
58
- version_requirements: *70184031656140
59
- - !ruby/object:Gem::Dependency
58
+ version_requirements: *id004
59
+ - !ruby/object:Gem::Dependency
60
60
  name: differ
61
- requirement: &70184031655400 !ruby/object:Gem::Requirement
61
+ requirement: &id005 !ruby/object:Gem::Requirement
62
62
  none: false
63
- requirements:
64
- - - ! '>='
65
- - !ruby/object:Gem::Version
66
- version: '0'
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: "0"
67
67
  type: :runtime
68
68
  prerelease: false
69
- version_requirements: *70184031655400
70
- - !ruby/object:Gem::Dependency
69
+ version_requirements: *id005
70
+ - !ruby/object:Gem::Dependency
71
71
  name: colorize
72
- requirement: &70184031654560 !ruby/object:Gem::Requirement
72
+ requirement: &id006 !ruby/object:Gem::Requirement
73
73
  none: false
74
- requirements:
75
- - - ! '>='
76
- - !ruby/object:Gem::Version
77
- version: '0'
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: "0"
78
78
  type: :runtime
79
79
  prerelease: false
80
- version_requirements: *70184031654560
81
- - !ruby/object:Gem::Dependency
80
+ version_requirements: *id006
81
+ - !ruby/object:Gem::Dependency
82
82
  name: rspec
83
- requirement: &70184031653900 !ruby/object:Gem::Requirement
83
+ requirement: &id007 !ruby/object:Gem::Requirement
84
84
  none: false
85
- requirements:
86
- - - ! '>='
87
- - !ruby/object:Gem::Version
88
- version: '0'
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: "0"
89
89
  type: :development
90
90
  prerelease: false
91
- version_requirements: *70184031653900
92
- - !ruby/object:Gem::Dependency
91
+ version_requirements: *id007
92
+ - !ruby/object:Gem::Dependency
93
93
  name: ruby-debug19
94
- requirement: &70184031653380 !ruby/object:Gem::Requirement
94
+ requirement: &id008 !ruby/object:Gem::Requirement
95
95
  none: false
96
- requirements:
97
- - - ! '>='
98
- - !ruby/object:Gem::Version
99
- version: '0'
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: "0"
100
100
  type: :development
101
101
  prerelease: false
102
- version_requirements: *70184031653380
103
- - !ruby/object:Gem::Dependency
102
+ version_requirements: *id008
103
+ - !ruby/object:Gem::Dependency
104
104
  name: growl
105
- requirement: &70184031652400 !ruby/object:Gem::Requirement
105
+ requirement: &id009 !ruby/object:Gem::Requirement
106
106
  none: false
107
- requirements:
108
- - - ! '>='
109
- - !ruby/object:Gem::Version
110
- version: '0'
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: "0"
111
111
  type: :development
112
112
  prerelease: false
113
- version_requirements: *70184031652400
114
- - !ruby/object:Gem::Dependency
113
+ version_requirements: *id009
114
+ - !ruby/object:Gem::Dependency
115
115
  name: rspec-rails
116
- requirement: &70184031651600 !ruby/object:Gem::Requirement
116
+ requirement: &id010 !ruby/object:Gem::Requirement
117
117
  none: false
118
- requirements:
119
- - - ! '>='
120
- - !ruby/object:Gem::Version
121
- version: '0'
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: "0"
122
122
  type: :development
123
123
  prerelease: false
124
- version_requirements: *70184031651600
125
- - !ruby/object:Gem::Dependency
124
+ version_requirements: *id010
125
+ - !ruby/object:Gem::Dependency
126
126
  name: factory_girl
127
- requirement: &70184031650840 !ruby/object:Gem::Requirement
127
+ requirement: &id011 !ruby/object:Gem::Requirement
128
128
  none: false
129
- requirements:
130
- - - ! '>='
131
- - !ruby/object:Gem::Version
132
- version: '0'
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: "0"
133
133
  type: :development
134
134
  prerelease: false
135
- version_requirements: *70184031650840
136
- - !ruby/object:Gem::Dependency
135
+ version_requirements: *id011
136
+ - !ruby/object:Gem::Dependency
137
137
  name: simplecov
138
- requirement: &70184031650220 !ruby/object:Gem::Requirement
138
+ requirement: &id012 !ruby/object:Gem::Requirement
139
139
  none: false
140
- requirements:
141
- - - ! '>='
142
- - !ruby/object:Gem::Version
143
- version: '0'
140
+ requirements:
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ version: "0"
144
144
  type: :development
145
145
  prerelease: false
146
- version_requirements: *70184031650220
147
- - !ruby/object:Gem::Dependency
146
+ version_requirements: *id012
147
+ - !ruby/object:Gem::Dependency
148
148
  name: faker
149
- requirement: &70184031649420 !ruby/object:Gem::Requirement
149
+ requirement: &id013 !ruby/object:Gem::Requirement
150
150
  none: false
151
- requirements:
152
- - - ! '>='
153
- - !ruby/object:Gem::Version
154
- version: '0'
151
+ requirements:
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ version: "0"
155
155
  type: :development
156
156
  prerelease: false
157
- version_requirements: *70184031649420
158
- - !ruby/object:Gem::Dependency
157
+ version_requirements: *id013
158
+ - !ruby/object:Gem::Dependency
159
159
  name: guard
160
- requirement: &70184031648740 !ruby/object:Gem::Requirement
160
+ requirement: &id014 !ruby/object:Gem::Requirement
161
161
  none: false
162
- requirements:
163
- - - ! '>='
164
- - !ruby/object:Gem::Version
165
- version: '0'
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: "0"
166
166
  type: :development
167
167
  prerelease: false
168
- version_requirements: *70184031648740
169
- - !ruby/object:Gem::Dependency
168
+ version_requirements: *id014
169
+ - !ruby/object:Gem::Dependency
170
170
  name: guard-rspec
171
- requirement: &70184031648080 !ruby/object:Gem::Requirement
171
+ requirement: &id015 !ruby/object:Gem::Requirement
172
172
  none: false
173
- requirements:
174
- - - ! '>='
175
- - !ruby/object:Gem::Version
176
- version: '0'
173
+ requirements:
174
+ - - ">="
175
+ - !ruby/object:Gem::Version
176
+ version: "0"
177
177
  type: :development
178
178
  prerelease: false
179
- version_requirements: *70184031648080
180
- - !ruby/object:Gem::Dependency
179
+ version_requirements: *id015
180
+ - !ruby/object:Gem::Dependency
181
181
  name: mocha
182
- requirement: &70184031638420 !ruby/object:Gem::Requirement
182
+ requirement: &id016 !ruby/object:Gem::Requirement
183
183
  none: false
184
- requirements:
185
- - - ! '>='
186
- - !ruby/object:Gem::Version
187
- version: '0'
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: "0"
188
188
  type: :development
189
189
  prerelease: false
190
- version_requirements: *70184031638420
191
- - !ruby/object:Gem::Dependency
190
+ version_requirements: *id016
191
+ - !ruby/object:Gem::Dependency
192
192
  name: bundler
193
- requirement: &70184031637880 !ruby/object:Gem::Requirement
193
+ requirement: &id017 !ruby/object:Gem::Requirement
194
194
  none: false
195
- requirements:
195
+ requirements:
196
196
  - - ~>
197
- - !ruby/object:Gem::Version
197
+ - !ruby/object:Gem::Version
198
198
  version: 1.0.0
199
199
  type: :development
200
200
  prerelease: false
201
- version_requirements: *70184031637880
202
- - !ruby/object:Gem::Dependency
201
+ version_requirements: *id017
202
+ - !ruby/object:Gem::Dependency
203
203
  name: jeweler
204
- requirement: &70184031637120 !ruby/object:Gem::Requirement
204
+ requirement: &id018 !ruby/object:Gem::Requirement
205
205
  none: false
206
- requirements:
206
+ requirements:
207
207
  - - ~>
208
- - !ruby/object:Gem::Version
208
+ - !ruby/object:Gem::Version
209
209
  version: 1.6.4
210
210
  type: :development
211
211
  prerelease: false
212
- version_requirements: *70184031637120
213
- - !ruby/object:Gem::Dependency
212
+ version_requirements: *id018
213
+ - !ruby/object:Gem::Dependency
214
214
  name: activerecord
215
- requirement: &70184031636400 !ruby/object:Gem::Requirement
215
+ requirement: &id019 !ruby/object:Gem::Requirement
216
216
  none: false
217
- requirements:
218
- - - =
219
- - !ruby/object:Gem::Version
217
+ requirements:
218
+ - - "="
219
+ - !ruby/object:Gem::Version
220
220
  version: 3.0.9
221
221
  type: :development
222
222
  prerelease: false
223
- version_requirements: *70184031636400
224
- - !ruby/object:Gem::Dependency
223
+ version_requirements: *id019
224
+ - !ruby/object:Gem::Dependency
225
225
  name: sqlite3
226
- requirement: &70184031635200 !ruby/object:Gem::Requirement
226
+ requirement: &id020 !ruby/object:Gem::Requirement
227
227
  none: false
228
- requirements:
229
- - - ! '>='
230
- - !ruby/object:Gem::Version
231
- version: '0'
228
+ requirements:
229
+ - - ">="
230
+ - !ruby/object:Gem::Version
231
+ version: "0"
232
232
  type: :development
233
233
  prerelease: false
234
- version_requirements: *70184031635200
235
- description: A replacement for ActiveResource for RESTful APIs that handles associated
236
- object and multiple data sources
234
+ version_requirements: *id020
235
+ description: A replacement for ActiveResource for RESTful APIs that handles associated object and multiple data sources
237
236
  email: ejl6266@gmail.com
238
237
  executables: []
238
+
239
239
  extensions: []
240
- extra_rdoc_files:
240
+
241
+ extra_rdoc_files:
241
242
  - LICENSE.txt
242
243
  - README.rdoc
243
- files:
244
+ files:
244
245
  - .document
245
246
  - .rspec
246
247
  - Gemfile
@@ -299,34 +300,35 @@ files:
299
300
  - spec/support/requests/error_resource_requests.rb
300
301
  - spec/support/requests/test_resource_requests.rb
301
302
  - spec/support/test_resource.rb
302
- has_rdoc: true
303
303
  homepage: http://github.com/ejlangev/resource
304
- licenses:
304
+ licenses:
305
305
  - MIT
306
306
  post_install_message:
307
307
  rdoc_options: []
308
- require_paths:
308
+
309
+ require_paths:
309
310
  - lib
310
- required_ruby_version: !ruby/object:Gem::Requirement
311
+ required_ruby_version: !ruby/object:Gem::Requirement
311
312
  none: false
312
- requirements:
313
- - - ! '>='
314
- - !ruby/object:Gem::Version
315
- version: '0'
316
- segments:
313
+ requirements:
314
+ - - ">="
315
+ - !ruby/object:Gem::Version
316
+ hash: 4425739189866565812
317
+ segments:
317
318
  - 0
318
- hash: -4465182740306650
319
- required_rubygems_version: !ruby/object:Gem::Requirement
319
+ version: "0"
320
+ required_rubygems_version: !ruby/object:Gem::Requirement
320
321
  none: false
321
- requirements:
322
- - - ! '>='
323
- - !ruby/object:Gem::Version
324
- version: '0'
322
+ requirements:
323
+ - - ">="
324
+ - !ruby/object:Gem::Version
325
+ version: "0"
325
326
  requirements: []
327
+
326
328
  rubyforge_project:
327
- rubygems_version: 1.6.2
329
+ rubygems_version: 1.8.11
328
330
  signing_key:
329
331
  specification_version: 3
330
- summary: A replacement for ActiveResource for RESTful APIs that handles associated
331
- object and multiple data sources
332
+ summary: A replacement for ActiveResource for RESTful APIs that handles associated object and multiple data sources
332
333
  test_files: []
334
+