activeresource 5.0.0 → 5.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,27 +1,28 @@
1
- require 'active_support/core_ext/benchmark'
2
- require 'active_support/core_ext/uri'
3
- require 'active_support/core_ext/object/inclusion'
4
- require 'net/https'
5
- require 'date'
6
- require 'time'
7
- require 'uri'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/core_ext/benchmark"
4
+ require "active_support/core_ext/uri"
5
+ require "active_support/core_ext/object/inclusion"
6
+ require "net/https"
7
+ require "date"
8
+ require "time"
9
+ require "uri"
8
10
 
9
11
  module ActiveResource
10
12
  # Class to handle connections to remote web services.
11
13
  # This class is used by ActiveResource::Base to interface with REST
12
14
  # services.
13
15
  class Connection
14
-
15
- HTTP_FORMAT_HEADER_NAMES = { :get => 'Accept',
16
- :put => 'Content-Type',
17
- :post => 'Content-Type',
18
- :patch => 'Content-Type',
19
- :delete => 'Accept',
20
- :head => 'Accept'
16
+ HTTP_FORMAT_HEADER_NAMES = { get: "Accept",
17
+ put: "Content-Type",
18
+ post: "Content-Type",
19
+ patch: "Content-Type",
20
+ delete: "Accept",
21
+ head: "Accept"
21
22
  }
22
23
 
23
- attr_reader :site, :user, :password, :auth_type, :timeout, :open_timeout, :read_timeout, :proxy, :ssl_options
24
- attr_accessor :format
24
+ attr_reader :site, :user, :password, :bearer_token, :auth_type, :timeout, :open_timeout, :read_timeout, :proxy, :ssl_options
25
+ attr_accessor :format, :logger
25
26
 
26
27
  class << self
27
28
  def requests
@@ -31,11 +32,12 @@ module ActiveResource
31
32
 
32
33
  # The +site+ parameter is required and will set the +site+
33
34
  # attribute to the URI for the remote resource service.
34
- def initialize(site, format = ActiveResource::Formats::JsonFormat)
35
- raise ArgumentError, 'Missing site URI' unless site
36
- @proxy = @user = @password = nil
35
+ def initialize(site, format = ActiveResource::Formats::JsonFormat, logger: nil)
36
+ raise ArgumentError, "Missing site URI" unless site
37
+ @proxy = @user = @password = @bearer_token = nil
37
38
  self.site = site
38
39
  self.format = format
40
+ self.logger = logger
39
41
  end
40
42
 
41
43
  # Set URI for remote service.
@@ -52,14 +54,13 @@ module ActiveResource
52
54
  end
53
55
 
54
56
  # Sets the user for remote service.
55
- def user=(user)
56
- @user = user
57
- end
57
+ attr_writer :user
58
58
 
59
59
  # Sets the password for remote service.
60
- def password=(password)
61
- @password = password
62
- end
60
+ attr_writer :password
61
+
62
+ # Sets the bearer token for remote service.
63
+ attr_writer :bearer_token
63
64
 
64
65
  # Sets the auth type for remote service.
65
66
  def auth_type=(auth_type)
@@ -67,24 +68,16 @@ module ActiveResource
67
68
  end
68
69
 
69
70
  # Sets the number of seconds after which HTTP requests to the remote service should time out.
70
- def timeout=(timeout)
71
- @timeout = timeout
72
- end
71
+ attr_writer :timeout
73
72
 
74
73
  # Sets the number of seconds after which HTTP connects to the remote service should time out.
75
- def open_timeout=(timeout)
76
- @open_timeout = timeout
77
- end
74
+ attr_writer :open_timeout
78
75
 
79
76
  # Sets the number of seconds after which HTTP read requests to the remote service should time out.
80
- def read_timeout=(timeout)
81
- @read_timeout = timeout
82
- end
77
+ attr_writer :read_timeout
83
78
 
84
79
  # Hash of options applied to Net::HTTP instance when +site+ protocol is 'https'.
85
- def ssl_options=(options)
86
- @ssl_options = options
87
- end
80
+ attr_writer :ssl_options
88
81
 
89
82
  # Executes a GET request.
90
83
  # Used to get (find) resources.
@@ -100,19 +93,19 @@ module ActiveResource
100
93
 
101
94
  # Executes a PATCH request (see HTTP protocol documentation if unfamiliar).
102
95
  # Used to update resources.
103
- def patch(path, body = '', headers = {})
96
+ def patch(path, body = "", headers = {})
104
97
  with_auth { request(:patch, path, body.to_s, build_request_headers(headers, :patch, self.site.merge(path))) }
105
98
  end
106
99
 
107
100
  # Executes a PUT request (see HTTP protocol documentation if unfamiliar).
108
101
  # Used to update resources.
109
- def put(path, body = '', headers = {})
102
+ def put(path, body = "", headers = {})
110
103
  with_auth { request(:put, path, body.to_s, build_request_headers(headers, :put, self.site.merge(path))) }
111
104
  end
112
105
 
113
106
  # Executes a POST request.
114
107
  # Used to create new resources.
115
- def post(path, body = '', headers = {})
108
+ def post(path, body = "", headers = {})
116
109
  with_auth { request(:post, path, body.to_s, build_request_headers(headers, :post, self.site.merge(path))) }
117
110
  end
118
111
 
@@ -140,32 +133,32 @@ module ActiveResource
140
133
  # Handles response and error codes from the remote service.
141
134
  def handle_response(response)
142
135
  case response.code.to_i
143
- when 301, 302, 303, 307
144
- raise(Redirection.new(response))
145
- when 200...400
146
- response
147
- when 400
148
- raise(BadRequest.new(response))
149
- when 401
150
- raise(UnauthorizedAccess.new(response))
151
- when 403
152
- raise(ForbiddenAccess.new(response))
153
- when 404
154
- raise(ResourceNotFound.new(response))
155
- when 405
156
- raise(MethodNotAllowed.new(response))
157
- when 409
158
- raise(ResourceConflict.new(response))
159
- when 410
160
- raise(ResourceGone.new(response))
161
- when 422
162
- raise(ResourceInvalid.new(response))
163
- when 401...500
164
- raise(ClientError.new(response))
165
- when 500...600
166
- raise(ServerError.new(response))
167
- else
168
- raise(ConnectionError.new(response, "Unknown response code: #{response.code}"))
136
+ when 301, 302, 303, 307
137
+ raise(Redirection.new(response))
138
+ when 200...400
139
+ response
140
+ when 400
141
+ raise(BadRequest.new(response))
142
+ when 401
143
+ raise(UnauthorizedAccess.new(response))
144
+ when 403
145
+ raise(ForbiddenAccess.new(response))
146
+ when 404
147
+ raise(ResourceNotFound.new(response))
148
+ when 405
149
+ raise(MethodNotAllowed.new(response))
150
+ when 409
151
+ raise(ResourceConflict.new(response))
152
+ when 410
153
+ raise(ResourceGone.new(response))
154
+ when 422
155
+ raise(ResourceInvalid.new(response))
156
+ when 401...500
157
+ raise(ClientError.new(response))
158
+ when 500...600
159
+ raise(ServerError.new(response))
160
+ else
161
+ raise(ConnectionError.new(response, "Unknown response code: #{response.code}"))
169
162
  end
170
163
  end
171
164
 
@@ -227,7 +220,7 @@ module ActiveResource
227
220
  yield
228
221
  rescue UnauthorizedAccess => e
229
222
  raise if retried || auth_type != :digest
230
- @response_auth_header = e.response['WWW-Authenticate']
223
+ @response_auth_header = e.response["WWW-Authenticate"]
231
224
  retried = true
232
225
  retry
233
226
  end
@@ -235,10 +228,12 @@ module ActiveResource
235
228
  def authorization_header(http_method, uri)
236
229
  if @user || @password
237
230
  if auth_type == :digest
238
- { 'Authorization' => digest_auth_header(http_method, uri) }
231
+ { "Authorization" => digest_auth_header(http_method, uri) }
239
232
  else
240
- { 'Authorization' => 'Basic ' + ["#{@user}:#{@password}"].pack('m').delete("\r\n") }
233
+ { "Authorization" => "Basic " + ["#{@user}:#{@password}"].pack("m").delete("\r\n") }
241
234
  end
235
+ elsif @bearer_token
236
+ { "Authorization" => "Bearer #{@bearer_token}" }
242
237
  else
243
238
  {}
244
239
  end
@@ -253,8 +248,8 @@ module ActiveResource
253
248
  ha1 = Digest::MD5.hexdigest("#{@user}:#{params['realm']}:#{@password}")
254
249
  ha2 = Digest::MD5.hexdigest("#{http_method.to_s.upcase}:#{request_uri}")
255
250
 
256
- params.merge!('cnonce' => client_nonce)
257
- request_digest = Digest::MD5.hexdigest([ha1, params['nonce'], "0", params['cnonce'], params['qop'], ha2].join(":"))
251
+ params["cnonce"] = client_nonce
252
+ request_digest = Digest::MD5.hexdigest([ha1, params["nonce"], "0", params["cnonce"], params["qop"], ha2].join(":"))
258
253
  "Digest #{auth_attributes_for(uri, request_digest, params)}"
259
254
  end
260
255
 
@@ -278,22 +273,22 @@ module ActiveResource
278
273
  %Q(qop="#{params['qop']}"),
279
274
  %Q(uri="#{uri.path}"),
280
275
  %Q(nonce="#{params['nonce']}"),
281
- %Q(nc="0"),
276
+ 'nc="0"',
282
277
  %Q(cnonce="#{params['cnonce']}"),
283
278
  %Q(response="#{request_digest}")]
284
279
 
285
- auth_attrs << %Q(opaque="#{params['opaque']}") unless params['opaque'].blank?
280
+ auth_attrs << %Q(opaque="#{params['opaque']}") unless params["opaque"].blank?
286
281
  auth_attrs.join(", ")
287
282
  end
288
283
 
289
284
  def http_format_header(http_method)
290
- {HTTP_FORMAT_HEADER_NAMES[http_method] => format.mime_type}
285
+ { HTTP_FORMAT_HEADER_NAMES[http_method] => format.mime_type }
291
286
  end
292
287
 
293
288
  def legitimize_auth_type(auth_type)
294
289
  return :basic if auth_type.nil?
295
290
  auth_type = auth_type.to_sym
296
- auth_type.in?([:basic, :digest]) ? auth_type : :basic
291
+ auth_type.in?([:basic, :digest, :bearer]) ? auth_type : :basic
297
292
  end
298
293
  end
299
294
  end
@@ -1,4 +1,6 @@
1
- require 'active_support/core_ext/object/blank'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/core_ext/object/blank"
2
4
 
3
5
  module ActiveResource
4
6
  # A module to support custom REST methods and sub-resources, allowing you to break out
@@ -59,15 +61,15 @@ module ActiveResource
59
61
  derooted.is_a?(Array) ? derooted.map { |e| Formats.remove_root(e) } : derooted
60
62
  end
61
63
 
62
- def post(custom_method_name, options = {}, body = '')
64
+ def post(custom_method_name, options = {}, body = "")
63
65
  connection.post(custom_method_collection_url(custom_method_name, options), body, headers)
64
66
  end
65
67
 
66
- def patch(custom_method_name, options = {}, body = '')
68
+ def patch(custom_method_name, options = {}, body = "")
67
69
  connection.patch(custom_method_collection_url(custom_method_name, options), body, headers)
68
70
  end
69
71
 
70
- def put(custom_method_name, options = {}, body = '')
72
+ def put(custom_method_name, options = {}, body = "")
71
73
  connection.put(custom_method_collection_url(custom_method_name, options), body, headers)
72
74
  end
73
75
 
@@ -102,11 +104,11 @@ module ActiveResource
102
104
  end
103
105
  end
104
106
 
105
- def patch(method_name, options = {}, body = '')
107
+ def patch(method_name, options = {}, body = "")
106
108
  connection.patch(custom_method_element_url(method_name, options), body, self.class.headers)
107
109
  end
108
110
 
109
- def put(method_name, options = {}, body = '')
111
+ def put(method_name, options = {}, body = "")
110
112
  connection.put(custom_method_element_url(method_name, options), body, self.class.headers)
111
113
  end
112
114
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveResource
2
4
  class ConnectionError < StandardError # :nodoc:
3
5
  attr_reader :response
@@ -8,7 +10,7 @@ module ActiveResource
8
10
  end
9
11
 
10
12
  def to_s
11
- message = "Failed."
13
+ message = "Failed.".dup
12
14
  message << " Response code = #{response.code}." if response.respond_to?(:code)
13
15
  message << " Response message = #{response.message}." if response.respond_to?(:message)
14
16
  message
@@ -34,7 +36,7 @@ module ActiveResource
34
36
  # 3xx Redirection
35
37
  class Redirection < ConnectionError # :nodoc:
36
38
  def to_s
37
- response['Location'] ? "#{super} => #{response['Location']}" : super
39
+ response["Location"] ? "#{super} => #{response['Location']}" : super
38
40
  end
39
41
  end
40
42
 
@@ -76,7 +78,7 @@ module ActiveResource
76
78
  # 405 Method Not Allowed
77
79
  class MethodNotAllowed < ClientError # :nodoc:
78
80
  def allowed_methods
79
- @response['Allow'].split(',').map { |verb| verb.strip.downcase.to_sym }
81
+ @response["Allow"].split(",").map { |verb| verb.strip.downcase.to_sym }
80
82
  end
81
83
  end
82
84
  end
@@ -1,4 +1,6 @@
1
- require 'active_support/json'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/json"
2
4
 
3
5
  module ActiveResource
4
6
  module Formats
@@ -18,6 +20,7 @@ module ActiveResource
18
20
  end
19
21
 
20
22
  def decode(json)
23
+ return nil if json.nil?
21
24
  Formats.remove_root(ActiveSupport::JSON.decode(json))
22
25
  end
23
26
  end
@@ -1,4 +1,6 @@
1
- require 'active_support/core_ext/hash/conversions'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/core_ext/hash/conversions"
2
4
 
3
5
  module ActiveResource
4
6
  module Formats
@@ -13,7 +15,7 @@ module ActiveResource
13
15
  "application/xml"
14
16
  end
15
17
 
16
- def encode(hash, options={})
18
+ def encode(hash, options = {})
17
19
  hash.to_xml(options)
18
20
  end
19
21
 
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveResource
2
4
  module Formats
3
- autoload :XmlFormat, 'active_resource/formats/xml_format'
4
- autoload :JsonFormat, 'active_resource/formats/json_format'
5
+ autoload :XmlFormat, "active_resource/formats/xml_format"
6
+ autoload :JsonFormat, "active_resource/formats/json_format"
5
7
 
6
8
  # Lookup the format class from a mime type reference symbol. Example:
7
9
  #
@@ -1,5 +1,7 @@
1
- require 'active_support/core_ext/kernel/reporting'
2
- require 'active_support/core_ext/object/inclusion'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/core_ext/kernel/reporting"
4
+ require "active_support/core_ext/object/inclusion"
3
5
 
4
6
  module ActiveResource
5
7
  class InvalidRequestError < StandardError; end #:nodoc:
@@ -74,12 +76,11 @@ module ActiveResource
74
76
  private
75
77
 
76
78
  def delete_duplicate_responses(request)
77
- @responses.delete_if {|r| r[0] == request }
79
+ @responses.delete_if { |r| r[0] == request }
78
80
  end
79
81
  end
80
82
 
81
83
  class << self
82
-
83
84
  # Returns an array of all request objects that have been sent to the mock. You can use this to check
84
85
  # if your model actually sent an HTTP request.
85
86
  #
@@ -203,9 +204,9 @@ module ActiveResource
203
204
  end
204
205
 
205
206
  def delete_responses_to_replace(new_responses)
206
- new_responses.each{|nr|
207
+ new_responses.each { |nr|
207
208
  request_to_remove = nr[0]
208
- @@responses = responses.delete_if{|r| r[0] == request_to_remove}
209
+ @@responses = responses.delete_if { |r| r[0] == request_to_remove }
209
210
  }
210
211
  end
211
212
 
@@ -238,7 +239,6 @@ module ActiveResource
238
239
  def net_connection_disabled?
239
240
  !net_connection_enabled?
240
241
  end
241
-
242
242
  end
243
243
 
244
244
  # body? methods
@@ -294,15 +294,15 @@ module ActiveResource
294
294
 
295
295
  private
296
296
 
297
- def headers_match?(req)
298
- # Ignore format header on equality if it's not defined
299
- format_header = ActiveResource::Connection::HTTP_FORMAT_HEADER_NAMES[method]
300
- if headers[format_header].present? || req.headers[format_header].blank?
301
- headers == req.headers
302
- else
303
- headers.dup.merge(format_header => req.headers[format_header]) == req.headers
297
+ def headers_match?(req)
298
+ # Ignore format header on equality if it's not defined
299
+ format_header = ActiveResource::Connection::HTTP_FORMAT_HEADER_NAMES[method]
300
+ if headers[format_header].present? || req.headers[format_header].blank?
301
+ headers == req.headers
302
+ else
303
+ headers.dup.merge(format_header => req.headers[format_header]) == req.headers
304
+ end
304
305
  end
305
- end
306
306
  end
307
307
 
308
308
  class Response
@@ -310,15 +310,14 @@ module ActiveResource
310
310
 
311
311
  def initialize(body, message = 200, headers = {})
312
312
  @body, @message, @headers = body, message.to_s, headers
313
- @code = @message[0,3].to_i
313
+ @code = @message[0, 3].to_i
314
314
 
315
315
  resp_cls = Net::HTTPResponse::CODE_TO_OBJ[@code.to_s]
316
316
  if resp_cls && !resp_cls.body_permitted?
317
317
  @body = nil
318
318
  end
319
319
 
320
- self['Content-Length'] = @body.nil? ? "0" : body.size.to_s
321
-
320
+ self["Content-Length"] = @body.nil? ? "0" : body.size.to_s
322
321
  end
323
322
 
324
323
  # Returns true if code is 2xx,
@@ -338,7 +337,7 @@ module ActiveResource
338
337
  # Returns true if the other is a Response with an equal body, equal message
339
338
  # and equal headers. Otherwise it returns false.
340
339
  def ==(other)
341
- if (other.is_a?(Response))
340
+ if other.is_a?(Response)
342
341
  other.body == body && other.message == message && other.headers == headers
343
342
  else
344
343
  false
@@ -369,7 +368,6 @@ module ActiveResource
369
368
  def stub_http?
370
369
  HttpMock.net_connection_disabled? && defined?(@http) && @http.kind_of?(Net::HTTP)
371
370
  end
372
-
373
371
  end
374
372
  end
375
373
  end
@@ -1,9 +1,20 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveResource
2
4
  class LogSubscriber < ActiveSupport::LogSubscriber
3
5
  def request(event)
4
6
  result = event.payload[:result]
5
- info "#{event.payload[:method].to_s.upcase} #{event.payload[:request_uri]}"
6
- info "--> %d %s %d (%.1fms)" % [result.code, result.message, result.body.to_s.length, event.duration]
7
+
8
+ # When result is nil, the connection could not even be initiated
9
+ # with the server, so we log an internal synthetic error response (523).
10
+ code = result.try(:code) || 523 # matches CloudFlare's convention
11
+ message = result.try(:message) || "ActiveResource connection error"
12
+ body = result.try(:body) || ""
13
+
14
+ log_level_method = code.to_i < 400 ? :info : :error
15
+
16
+ send log_level_method, "#{event.payload[:method].to_s.upcase} #{event.payload[:request_uri]}"
17
+ send log_level_method, "--> %d %s %d (%.1fms)" % [code, message, body.to_s.length, event.duration]
7
18
  end
8
19
 
9
20
  def logger
@@ -12,4 +23,4 @@ module ActiveResource
12
23
  end
13
24
  end
14
25
 
15
- ActiveResource::LogSubscriber.attach_to :active_resource
26
+ ActiveResource::LogSubscriber.attach_to :active_resource
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "active_resource"
2
4
  require "rails"
3
5
 
@@ -6,10 +8,18 @@ module ActiveResource
6
8
  config.active_resource = ActiveSupport::OrderedOptions.new
7
9
 
8
10
  initializer "active_resource.set_configs" do |app|
9
- app.config.active_resource.each do |k,v|
10
- ActiveResource::Base.send "#{k}=", v
11
+ ActiveSupport.on_load(:active_resource) do
12
+ app.config.active_resource.each do |k, v|
13
+ send "#{k}=", v
14
+ end
15
+ end
16
+ end
17
+
18
+ initializer "active_resource.add_active_job_serializer" do |app|
19
+ if defined? app.config.active_job.custom_serializers
20
+ require "active_resource/active_job_serializer"
21
+ app.config.active_job.custom_serializers << ActiveResource::ActiveJobSerializer
11
22
  end
12
23
  end
13
24
  end
14
25
  end
15
-
@@ -1,5 +1,7 @@
1
- require 'active_support/core_ext/class/attribute'
2
- require 'active_support/core_ext/module/deprecation'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/core_ext/class/attribute"
4
+ require "active_support/core_ext/module/deprecation"
3
5
 
4
6
  module ActiveResource
5
7
  # = Active Resource reflection
@@ -25,7 +27,6 @@ module ActiveResource
25
27
 
26
28
 
27
29
  class AssociationReflection
28
-
29
30
  def initialize(macro, name, options)
30
31
  @macro, @name, @options = macro, name, options
31
32
  end
@@ -65,13 +66,13 @@ module ActiveResource
65
66
  end
66
67
 
67
68
  private
68
- def derive_class_name
69
- return (options[:class_name] ? options[:class_name].to_s.camelize : name.to_s.classify)
70
- end
69
+ def derive_class_name
70
+ (options[:class_name] ? options[:class_name].to_s.camelize : name.to_s.classify)
71
+ end
71
72
 
72
- def derive_foreign_key
73
- return options[:foreign_key] ? options[:foreign_key].to_s : "#{name.to_s.downcase}_id"
74
- end
73
+ def derive_foreign_key
74
+ options[:foreign_key] ? options[:foreign_key].to_s : "#{name.to_s.downcase}_id"
75
+ end
75
76
  end
76
77
  end
77
78
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveResource # :nodoc:
2
4
  class Schema # :nodoc:
3
5
  # attributes can be known to be one of these types. They are easy to
@@ -29,8 +31,8 @@ module ActiveResource # :nodoc:
29
31
 
30
32
  the_type = type.to_s
31
33
  # TODO: add defaults
32
- #the_attr = [type.to_s]
33
- #the_attr << options[:default] if options.has_key? :default
34
+ # the_attr = [type.to_s]
35
+ # the_attr << options[:default] if options.has_key? :default
34
36
  @attrs[name.to_s] = the_type
35
37
  self
36
38
  end
@@ -45,7 +47,7 @@ module ActiveResource # :nodoc:
45
47
  # attr_names.each { |name| attribute(name, 'string', options) }
46
48
  # end
47
49
  class_eval <<-EOV, __FILE__, __LINE__ + 1
48
- def #{attr_type.to_s}(*args)
50
+ def #{attr_type}(*args)
49
51
  options = args.extract_options!
50
52
  attr_names = args
51
53
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveResource
2
4
  module Singleton
3
5
  extend ActiveSupport::Concern
@@ -60,20 +62,19 @@ module ActiveResource
60
62
  #
61
63
  # Inventory.find
62
64
  # # => raises ResourceNotFound
63
- def find(options={})
65
+ def find(options = {})
64
66
  find_singleton(options)
65
67
  end
66
68
 
67
69
  private
68
- # Find singleton resource
69
- def find_singleton(options)
70
- prefix_options, query_options = split_options(options[:params])
71
-
72
- path = singleton_path(prefix_options, query_options)
73
- resp = self.format.decode(self.connection.get(path, self.headers).body)
74
- instantiate_record(resp, prefix_options)
75
- end
76
-
70
+ # Find singleton resource
71
+ def find_singleton(options)
72
+ prefix_options, query_options = split_options(options[:params])
73
+
74
+ path = singleton_path(prefix_options, query_options)
75
+ resp = self.format.decode(self.connection.get(path, self.headers).body)
76
+ instantiate_record(resp, prefix_options)
77
+ end
77
78
  end
78
79
  # Deletes the resource from the remote service.
79
80
  #
@@ -88,27 +89,25 @@ module ActiveResource
88
89
 
89
90
  protected
90
91
 
91
- # Update the resource on the remote service
92
- def update
93
- connection.put(singleton_path(prefix_options), encode, self.class.headers).tap do |response|
94
- load_attributes_from_response(response)
92
+ # Update the resource on the remote service
93
+ def update
94
+ connection.put(singleton_path(prefix_options), encode, self.class.headers).tap do |response|
95
+ load_attributes_from_response(response)
96
+ end
95
97
  end
96
- end
97
98
 
98
- # Create (i.e. \save to the remote service) the \new resource.
99
- def create
100
- connection.post(singleton_path, encode, self.class.headers).tap do |response|
101
- self.id = id_from_response(response)
102
- load_attributes_from_response(response)
99
+ # Create (i.e. \save to the remote service) the \new resource.
100
+ def create
101
+ connection.post(singleton_path, encode, self.class.headers).tap do |response|
102
+ self.id = id_from_response(response)
103
+ load_attributes_from_response(response)
104
+ end
103
105
  end
104
- end
105
106
 
106
107
  private
107
108
 
108
- def singleton_path(options = nil)
109
- self.class.singleton_path(options || prefix_options)
110
- end
111
-
109
+ def singleton_path(options = nil)
110
+ self.class.singleton_path(options || prefix_options)
111
+ end
112
112
  end
113
-
114
113
  end