api_resource 0.2.2 → 0.2.3

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/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
+