hyperresource 0.1.9.2 → 0.1.9.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 294b14e1ecc640c411926b683c3b47755e00701f
4
- data.tar.gz: 3a7ed8ec37100074abba126ec84509b61134d862
3
+ metadata.gz: a9eb3362f2f929049439543e8aa9cd140f808b9b
4
+ data.tar.gz: 6ae500a90b57bb69715db82268d8c8e56d5af4cd
5
5
  SHA512:
6
- metadata.gz: 792029a5bc68c4a83d6699b6142318dd96ede36749ae080e4c5ec797aa4a1543565cf910eca7fd623489897b54a109d479112227395c8b8b778d568944525f3d
7
- data.tar.gz: 46d604b2574111678c0a58f937c765e452e99d2d35b0ec07ae62ac184ffd6246dc381ebac2a4f24cd94e8bd7172fdacb14d7678f3bd9f37992dbee03307dff93
6
+ metadata.gz: b0b44a45fba55b7bf5b7e4522a46fb04705a3d3d9aa877a516e1582819513b9f622428a847d153f9f920a37644404929ecd7dc3ce4772711bc7298916e1cf313
7
+ data.tar.gz: c6143d7034ea27cc735706edf8b4aead7bb5717f745f866721a2c8e340cd88cc5bbfb2d2d0ef3e24fc0f65353d620bfeda177d18940b2de2d3abfccfff0fe6ce
@@ -1,23 +1,8 @@
1
- require 'hyper_resource/version'
2
- require 'hyper_resource/attributes'
3
- require 'hyper_resource/links'
4
- require 'hyper_resource/link'
5
- require 'hyper_resource/objects'
6
- require 'hyper_resource/response'
7
- require 'hyper_resource/exceptions'
8
-
9
- require 'hyper_resource/modules/utils'
10
- require 'hyper_resource/modules/http'
11
-
12
- require 'hyper_resource/adapter'
13
- require 'hyper_resource/adapter/hal_json'
1
+ this_dir = File.dirname(File.absolute_path(__FILE__))
2
+ Dir.glob(this_dir + '/hyper_resource/**/*.rb') {|f| require f}
14
3
 
15
4
  require 'pp'
16
5
 
17
- ## TODO:
18
- ## as_json, to_json (in adapter?)
19
- ## save, update, create, delete
20
-
21
6
  class HyperResource
22
7
  include HyperResource::Modules::Utils
23
8
  include HyperResource::Modules::HTTP
@@ -117,37 +102,15 @@ public
117
102
  HyperResource::Adapter::HAL_JSON
118
103
  end
119
104
 
120
- private
121
-
122
- def init_from_resource(resource)
123
- (self.class._hr_attributes - [:attributes, :links, :objects]).each do |attr|
124
- self.send("#{attr}=".to_sym, resource.send(attr))
125
- end
126
- self.adapter.apply(self.response_object, self)
127
- end
128
105
 
129
106
  public
130
107
 
108
+ ## Returns true if one or more of this object's attributes has been
109
+ ## reassigned.
131
110
  def changed?(*args)
132
111
  attributes.changed?(*args)
133
112
  end
134
113
 
135
- ## Returns a new HyperResource based on the given link href.
136
- def _new_from_link(href)
137
- self.class.new(:root => self.root,
138
- :auth => self.auth,
139
- :headers => self.headers,
140
- :namespace => self.namespace,
141
- :href => href)
142
- end
143
-
144
- def to_response_class
145
- response_class = self.get_response_class
146
- return self if self.class == response_class
147
- response_class.new(self)
148
- end
149
-
150
-
151
114
  ## +incoming_body_filter+ filters a hash of attribute keys and values
152
115
  ## on their way from a response body to a HyperResource. Override this
153
116
  ## in a subclass of HyperResource to implement filters on incoming data.
@@ -171,30 +134,83 @@ public
171
134
  end
172
135
 
173
136
 
174
- def get_response_class # :nodoc:
175
- self.namespace ||= self.class.to_s unless self.class.to_s=='HyperResource'
176
- self.class.get_response_class(self.response, self.namespace)
137
+ ## Returns the first object in the first collection of objects embedded
138
+ ## in this resource. Equivalent to +self.objects.first+.
139
+ def first; self.objects.first end
140
+
141
+ ## Returns the *i*th object in the first collection of objects embedded
142
+ ## in this resource. Equivalent to +self.objects[i]+.
143
+ def [](i); self.objects.ith(i) end
144
+
145
+ ## method_missing will load this resource if not yet loaded, then
146
+ ## attempt to delegate to +attributes+, then +objects+, then +links+.
147
+ ## Override with care.
148
+ def method_missing(method, *args)
149
+ self.get unless self.loaded
150
+
151
+ method = method.to_s
152
+ if method[-1] == '='
153
+ return attributes[method[0..-2]] = args.first if attributes[method[0..-2]]
154
+ else
155
+ return attributes[method] if attributes && attributes[method]
156
+ return objects[method] if objects && objects[method]
157
+ if links && links[method]
158
+ if args.count > 0
159
+ return links[method].where(*args)
160
+ else
161
+ return links[method]
162
+ end
163
+ end
164
+ end
165
+
166
+ raise NoMethodError, "undefined method `#{method}' for #{self.inspect}"
167
+ end
168
+
169
+
170
+ def inspect # :nodoc:
171
+ "#<#{self.class}:0x#{"%x" % self.object_id} @root=#{self.root.inspect} "+
172
+ "@href=#{self.href.inspect} @loaded=#{self.loaded} "+
173
+ "@namespace=#{self.namespace.inspect} ...>"
177
174
  end
178
175
 
176
+ ## +response_body+ is deprecated in favor of +response_object+.
177
+ def response_body; response_object end # :nodoc:
178
+
179
+
180
+ #######################################################################
181
+ #### Underscored functions are not meant to be used outside of ####
182
+ #### HyperResource machinery. You have been warned. ####
183
+
184
+
185
+ ## Return a new HyperResource based on this object and a given href.
186
+ def _new_from_link(href) # :nodoc:
187
+ self.class.new(:root => self.root,
188
+ :auth => self.auth,
189
+ :headers => self.headers,
190
+ :namespace => self.namespace,
191
+ :href => href)
192
+ end
193
+
194
+
179
195
  ## Returns the class into which the given response should be cast.
180
196
  ## If the object is not loaded yet, or if +opts[:namespace]+ is
181
197
  ## not set, returns +self+.
182
198
  ##
183
- ## Otherwise, +get_response_class+ uses +get_response_data_type+ to
199
+ ## Otherwise, +_get_response_class+ uses +_get_response_data_type+ to
184
200
  ## determine subclass name, glues it to the given namespace, and
185
201
  ## creates the class if it's not there yet. E.g., given a namespace of
186
202
  ## +FooAPI+ and a response content-type of
187
203
  ## "application/vnd.foocorp.fooapi.v1+json;type=User", this should
188
204
  ## return +FooAPI::User+ (even if +FooAPI::User+ hadn't existed yet).
189
205
 
190
- def self.get_response_class(response, namespace)
206
+ def self._get_response_class(response, namespace) # :nodoc:
191
207
  if self.to_s == 'HyperResource'
192
208
  return self unless namespace
193
209
  end
194
210
 
195
211
  namespace ||= self.to_s
196
212
 
197
- type_name = self.get_response_data_type(response)
213
+ type_name = self._get_response_data_type(response)
198
214
  return self unless type_name
199
215
 
200
216
  class_name = "#{namespace}::#{type_name}"
@@ -216,11 +232,12 @@ public
216
232
  eval(class_name)
217
233
  end
218
234
 
219
-
220
- def get_response_data_type
221
- self.class.get_response_data_type(self.response)
235
+ def _get_response_class # :nodoc:
236
+ self.namespace ||= self.class.to_s unless self.class.to_s=='HyperResource'
237
+ self.class._get_response_class(self.response, self.namespace)
222
238
  end
223
239
 
240
+
224
241
  ## Inspects the given response, and returns a string describing this
225
242
  ## resource's data type.
226
243
  ##
@@ -229,48 +246,31 @@ public
229
246
  ##
230
247
  ## Override this method in a subclass to alter HyperResource's behavior.
231
248
 
232
- def self.get_response_data_type(response)
249
+ def self._get_response_data_type(response) # :nodoc:
233
250
  return nil unless response
234
251
  return nil unless content_type = response['content-type']
235
252
  return nil unless m=content_type.match(/;\s* type=(?<type> [0-9A-Za-z:]+)/x)
236
253
  m[:type][0].upcase + m[:type][1..-1]
237
254
  end
238
255
 
239
-
240
-
241
- ## Returns the first object in the first collection of objects embedded
242
- ## in this resource. Equivalent to +self.objects.first+.
243
- def first; self.objects.first end
244
-
245
- ## Returns the *i*th object in the first collection of objects embedded
246
- ## in this resource. Equivalent to +self.objects[i]+.
247
- def [](i); self.objects.ith(i) end
248
-
249
- ## method_missing will load this resource if not yet loaded, then
250
- ## attempt to delegate to +attributes+, then +objects+, then +links+.
251
- def method_missing(method, *args)
252
- self.get unless self.loaded
253
-
254
- method = method.to_s
255
- if method[-1] == '='
256
- return attributes[method[0..-2]] = args.first if attributes[method[0..-2]]
257
- else
258
- return attributes[method] if attributes && attributes[method]
259
- return objects[method] if objects && objects[method]
260
- return links[method] if links && links[method]
261
- end
262
-
263
- raise NoMethodError, "undefined method `#{method}' for #{self.inspect}"
256
+ def _get_response_data_type # :nodoc:
257
+ self.class._get_response_data_type(self.response)
264
258
  end
265
259
 
260
+ private
266
261
 
267
- def inspect # :nodoc:
268
- "#<#{self.class}:0x#{"%x" % self.object_id} @root=#{self.root.inspect} "+
269
- "@href=#{self.href.inspect} @loaded=#{self.loaded} "+
270
- "@namespace=#{self.namespace.inspect} ...>"
262
+ ## Return this object, "cast" into its proper response class.
263
+ def to_response_class # :nodoc:
264
+ response_class = self._get_response_class
265
+ return self if self.class == response_class
266
+ response_class.new(self)
271
267
  end
272
268
 
273
- ## +response_body+ is deprecated in favor of +response_object+.
274
- def response_body; response_object end
269
+ def init_from_resource(resource)
270
+ (self.class._hr_attributes - [:attributes, :links, :objects]).each do |attr|
271
+ self.send("#{attr}=".to_sym, resource.send(attr))
272
+ end
273
+ self.adapter.apply(self.response_object, self)
274
+ end
275
275
 
276
276
  end
@@ -58,7 +58,7 @@ class HyperResource
58
58
 
59
59
  def apply_links(resp, rsrc)
60
60
  return unless resp['_links']
61
- rsrc.links = rsrc.get_response_class::Links.new(rsrc)
61
+ rsrc.links = rsrc._get_response_class::Links.new(rsrc)
62
62
  links = rsrc.links
63
63
 
64
64
  resp['_links'].each do |rel, link_spec|
@@ -80,7 +80,7 @@ class HyperResource
80
80
 
81
81
 
82
82
  def apply_attributes(resp, rsrc)
83
- rsrc.attributes = rsrc.get_response_class::Attributes.new(rsrc)
83
+ rsrc.attributes = rsrc._get_response_class::Attributes.new(rsrc)
84
84
 
85
85
  given_attrs = resp.reject{|k,v| %w(_links _embedded).include?(k)}
86
86
  filtered_attrs = rsrc.incoming_body_filter(given_attrs)
@@ -2,62 +2,65 @@ require 'faraday'
2
2
  require 'uri'
3
3
  require 'json'
4
4
 
5
- module HyperResource::Modules::HTTP
6
-
7
- ## Loads and returns the resource pointed to by +href+. The returned
8
- ## resource will be blessed into its "proper" class, if
9
- ## +self.class.namespace != nil+.
10
- def get
11
- self.response = faraday_connection.get(self.href || '')
12
- finish_up
13
- end
5
+ module HyperResource::Modules
6
+ module HTTP
14
7
 
15
- ## Returns a per-thread Faraday connection for this object.
16
- def faraday_connection(url=nil)
17
- url ||= self.root
18
- key = "faraday_connection_#{url}"
19
- return Thread.current[key] if Thread.current[key]
20
-
21
- fc = Faraday.new(:url => url)
22
- fc.headers.merge!('User-Agent' => "HyperResource #{HyperResource::VERSION}")
23
- fc.headers.merge!(self.headers || {})
24
- if ba=self.auth[:basic]
25
- fc.basic_auth(*ba)
8
+ ## Loads and returns the resource pointed to by +href+. The returned
9
+ ## resource will be blessed into its "proper" class, if
10
+ ## +self.class.namespace != nil+.
11
+ def get
12
+ self.response = faraday_connection.get(self.href || '')
13
+ finish_up
26
14
  end
27
- Thread.current[key] = fc
28
- end
29
15
 
30
- private
31
-
32
- def finish_up
33
- begin
34
- self.response_object = self.adapter.deserialize(self.response.body)
35
- rescue Exception => e
36
- raise HyperResource::ResponseError.new(
37
- "Error when deserializing response body",
38
- :response => self.response,
39
- :cause => e
40
- )
16
+ ## Returns a per-thread Faraday connection for this object.
17
+ def faraday_connection(url=nil)
18
+ url ||= self.root
19
+ key = "faraday_connection_#{url}"
20
+ return Thread.current[key] if Thread.current[key]
21
+
22
+ fc = Faraday.new(:url => url)
23
+ fc.headers.merge!('User-Agent' => "HyperResource #{HyperResource::VERSION}")
24
+ fc.headers.merge!(self.headers || {})
25
+ if ba=self.auth[:basic]
26
+ fc.basic_auth(*ba)
27
+ end
28
+ Thread.current[key] = fc
41
29
  end
42
30
 
43
- self.adapter.apply(self.response_object, self)
44
- self.loaded = true
45
-
46
- status = self.response.status
47
- if status / 100 == 2
48
- return self.to_response_class
49
- elsif status / 100 == 3
50
- ## TODO redirect logic?
51
- elsif status / 100 == 4
52
- raise HyperResource::ClientError.new(status.to_s,
53
- :response => self.response)
54
- elsif status / 100 == 5
55
- raise HyperResource::ServerError.new(status.to_s,
56
- :response => self.response)
57
- else ## 1xx? really?
58
- raise HyperResource::ResponseError.new("Got status #{status}, wtf?",
31
+ private
32
+
33
+ def finish_up
34
+ begin
35
+ self.response_object = self.adapter.deserialize(self.response.body)
36
+ rescue Exception => e
37
+ raise HyperResource::ResponseError.new(
38
+ "Error when deserializing response body",
39
+ :response => self.response,
40
+ :cause => e
41
+ )
42
+ end
43
+
44
+ self.adapter.apply(self.response_object, self)
45
+ self.loaded = true
46
+
47
+ status = self.response.status
48
+ if status / 100 == 2
49
+ return to_response_class
50
+ elsif status / 100 == 3
51
+ ## TODO redirect logic?
52
+ elsif status / 100 == 4
53
+ raise HyperResource::ClientError.new(status.to_s,
54
+ :response => self.response)
55
+ elsif status / 100 == 5
56
+ raise HyperResource::ServerError.new(status.to_s,
59
57
  :response => self.response)
58
+ else ## 1xx? really?
59
+ raise HyperResource::ResponseError.new("Got status #{status}, wtf?",
60
+ :response => self.response)
61
+ end
60
62
  end
61
- end
62
63
 
64
+ end
63
65
  end
66
+
@@ -1,4 +1,4 @@
1
1
  class HyperResource
2
- VERSION = '0.1.9.2'
3
- VERSION_DATE = '2013-09-27'
2
+ VERSION = '0.1.9.3'
3
+ VERSION_DATE = '2013-10-02'
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hyperresource
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.9.2
4
+ version: 0.1.9.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pete Gamache
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-27 00:00:00.000000000 Z
11
+ date: 2013-10-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: uri_template
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - '>='
81
81
  - !ruby/object:Gem::Version
82
82
  version: 0.13.3
83
+ - !ruby/object:Gem::Dependency
84
+ name: sinatra
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: 1.4.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: 1.4.0
83
97
  description: |2
84
98
  HyperResource is a hypermedia client library for Ruby. Its goals are to
85
99
  interface directly with well-behaved hypermedia APIs, to allow the data