lib/weary/resource.rb in weary-1.0.1 vs lib/weary/resource.rb in weary-1.1.0
- old
+ new
@@ -5,10 +5,12 @@
# A description of a resource made available by an HTTP request. That
# description is composed primarily of a url template, the HTTP method to
# retrieve the resource and some constraints on the parameters necessary
# to complete the request.
class Resource
+ include Weary::Requestable
+
UnmetRequirementsError = Class.new(StandardError)
attr_reader :method
def initialize(method, uri)
@@ -47,28 +49,10 @@
def defaults(hash=nil)
@defaults = hash unless hash.nil?
@defaults ||= {}
end
- # An accessor to set HTTP request headers.
- def headers(hash=nil)
- @headers = hash unless hash.nil?
- @headers ||= {}
- end
-
- # Set up a Rack::Middleware to be used by the Request (which is
- # Rack-friendly).
- def use(middleware, *args, &block)
- @middlewares ||= []
- @middlewares << [middleware, args.compact, block]
- end
-
- # Convenience method to set a User Agent Header
- def user_agent(agent)
- headers.update 'User-Agent' => agent
- end
-
# Tell the Resource to anticipate Basic Authentication. Optionally,
# tell the Resource what parameters to use as credentials.
#
# user - The parameter in which to expect the username (defaults to :username)
# pass - The parameter in which to expect the password (defaults to :password)
@@ -94,11 +78,11 @@
!!@authenticates
end
# The keys expected as parameters to the Request.
def expected_params
- defaults.keys.map(&:to_s) | optional.map(&:to_s) | required.map(&:to_s)
+ (defaults.keys | optional | required).map(&:to_s).uniq
end
# Does the Resource expect this parameter to be used to make the Request?
def expects?(param)
expected_params.include? param.to_s
@@ -120,32 +104,51 @@
#
# Returns the Request.
# Raises a Weary::Resource::UnmetRequirementsError if the requirements
# are not met.
def request(params={})
- params.delete_if {|k,v| v.nil? || v.to_s.empty? }
- params.update(defaults)
+ normalize_parameters params
raise UnmetRequirementsError, "Required parameters: #{requirements}" \
unless meets_requirements? params
- credentials = pull_credentials params if authenticates?
- mapping = url.keys.map {|k| [k, params.delete(k) || params.delete(k.to_sym)] }
- request = Weary::Request.new url.expand(Hash[mapping]), @method do |r|
- r.headers headers
- if !@middlewares.nil? && !@middlewares.empty?
- @middlewares.each {|middleware| r.use *middleware }
- end
+ credentials = pull_credentials params
+ pairs = pull_url_pairs params
+ request = construct_request expand_url(pairs), params, credentials
+ yield request if block_given?
+ request
+ end
+ alias build request
+
+ private
+
+ # Private: Build the Request object with the given Resource parameters.
+ def construct_request(uri, params, credentials=[])
+ Weary::Request.new uri, @method do |r|
+ pass_values_onto_requestable(r)
if !expected_params.empty?
r.params params.reject {|k,v| !expects? k }
end
r.send @authenticates, *credentials if authenticates?
end
- yield request if block_given?
- request
end
- alias build request
+ # Private: For a set of parameters passed in to build a Request, delete
+ # those with no values, and merge them with the defaults.
+ def normalize_parameters(params)
+ params.delete_if {|k,v| v.nil? || v.to_s.empty? }
+ params.update(defaults)
+ params
+ end
- private
+ # Private: Expand the url template with the passed pairs to get the
+ # final url.
+ def expand_url(pairs)
+ url.expand Hash[pairs]
+ end
+
+ # Private: Separate the parameters needed to construct a url.
+ def pull_url_pairs(params)
+ url.keys.map {|k| [k, params.delete(k) || params.delete(k.to_sym)] }
+ end
# Private: Separate the credentials for authentication from the other
# request parameters.
def pull_credentials(params)
(@credentials || []).map do |credential|