lib/wordnik/request.rb in wordnik-0.0.1 vs lib/wordnik/request.rb in wordnik-0.0.2

- old
+ new

@@ -1,159 +1,163 @@ -class Request - require 'uri' - require 'addressable/uri' - require 'typhoeus' - include ActiveModel::Validations - include ActiveModel::Conversion - extend ActiveModel::Naming +module Wordnik + + class Request + require 'uri' + require 'addressable/uri' + require 'typhoeus' + require 'active_model' + include ActiveModel::Validations + include ActiveModel::Conversion + extend ActiveModel::Naming - attr_accessor :host, :port, :path, :format, :params, :body, :http_method, :headers + attr_accessor :host, :port, :path, :format, :params, :body, :http_method, :headers - validates_presence_of :host, :path, :format, :http_method + validates_presence_of :host, :path, :format, :http_method - def initialize(http_method, path, attributes={}) - attributes[:format] ||= "json" - attributes[:host] ||= Wordnik.configuration.base_uri - attributes[:params] ||= {} + def initialize(http_method, path, attributes={}) + attributes[:format] ||= "json" + attributes[:host] ||= Wordnik.configuration.base_uri + attributes[:params] ||= {} - # Set default headers, but allow them to be overridden - default_headers = { - 'Content-Type' => "application/#{attributes[:format].downcase}", - } - attributes[:headers] = default_headers.merge(attributes[:headers] || {}) + # Set default headers, but allow them to be overridden + default_headers = { + 'Content-Type' => "application/#{attributes[:format].downcase}", + } + attributes[:headers] = default_headers.merge(attributes[:headers] || {}) - self.http_method = http_method.to_sym - self.path = path - attributes.each do |name, value| - send("#{name.to_s.underscore.to_sym}=", value) + self.http_method = http_method.to_sym + self.path = path + attributes.each do |name, value| + send("#{name.to_s.underscore.to_sym}=", value) + end end - end - # Construct a base URL - def url - u = Addressable::URI.new - u.host = self.host.sub(/\/$/, '') - u.port = self.port if self.port.present? - u.path = self.interpreted_path - u.scheme = "http" # For some reason this must be set _after_ host, otherwise Addressable gets upset - u.to_s - end - - # Iterate over the params hash, injecting any path values into the path string - # e.g. /word.{format}/{word}/entries => /word.json/cat/entries - def interpreted_path - p = self.path - self.params.each_pair do |key, value| - p = p.gsub("{#{key}}", value.to_s) + # Construct a base URL + def url + u = Addressable::URI.new + u.host = self.host.sub(/\/$/, '') + u.port = self.port if self.port.present? + u.path = self.interpreted_path + u.scheme = "http" # For some reason this must be set _after_ host, otherwise Addressable gets upset + u.to_s end + + # Iterate over the params hash, injecting any path values into the path string + # e.g. /word.{format}/{word}/entries => /word.json/cat/entries + def interpreted_path + p = self.path + self.params.each_pair do |key, value| + p = p.gsub("{#{key}}", value.to_s) + end - # Stick a .{format} placeholder into the path if there isn't - # one already or an actual format like json or xml - # e.g. /words/blah => /words.{format}/blah - unless ['.json', '.xml', '{format}'].any? {|s| p.downcase.include? s } - p = p.sub(/^(\/?\w+)/, "\\1.#{format}") - end + # Stick a .{format} placeholder into the path if there isn't + # one already or an actual format like json or xml + # e.g. /words/blah => /words.{format}/blah + unless ['.json', '.xml', '{format}'].any? {|s| p.downcase.include? s } + p = p.sub(/^(\/?\w+)/, "\\1.#{format}") + end - p = p.sub("{format}", self.format) - URI.encode(p) - end + p = p.sub("{format}", self.format) + URI.encode(p) + end - def interpreted_body - return unless self.body.present? - return self.body.to_json if self.body.is_a?(Hash) - self.body - end + def interpreted_body + return unless self.body.present? + return self.body.to_json if self.body.is_a?(Hash) + self.body + end - # Iterate over all params, - # .. removing the ones that are part of the path itself. - # .. stringifying values so Addressable doesn't blow up. - # .. obfuscating the API key if needed. - def query_string_params(obfuscated=false) - qsp = {} - self.params.each_pair do |key, value| - next if self.path.include? "{#{key}}" - next if value.blank? - value = "YOUR_API_KEY" if key.to_sym == :api_key && obfuscated - qsp[key] = value.to_s + # Iterate over all params, + # .. removing the ones that are part of the path itself. + # .. stringifying values so Addressable doesn't blow up. + # .. obfuscating the API key if needed. + def query_string_params(obfuscated=false) + qsp = {} + self.params.each_pair do |key, value| + next if self.path.include? "{#{key}}" + next if value.blank? + value = "YOUR_API_KEY" if key.to_sym == :api_key && obfuscated + qsp[key] = value.to_s + end + qsp end - qsp - end - # Construct a query string from the query-string-type params - def query_string(options={}) + # Construct a query string from the query-string-type params + def query_string(options={}) - # We don't want to end up with '?' as our query string - # if there aren't really any params - return "" if query_string_params.blank? + # We don't want to end up with '?' as our query string + # if there aren't really any params + return "" if query_string_params.blank? - default_options = {:obfuscated => false} - options = default_options.merge(options) + default_options = {:obfuscated => false} + options = default_options.merge(options) - qs = Addressable::URI.new - qs.query_values = self.query_string_params(options[:obfuscated]) - qs.to_s - end + qs = Addressable::URI.new + qs.query_values = self.query_string_params(options[:obfuscated]) + qs.to_s + end - # Returns full request URL with query string included - def url_with_query_string(options={}) - default_options = {:obfuscated => false} - options = default_options.merge(options) + # Returns full request URL with query string included + def url_with_query_string(options={}) + default_options = {:obfuscated => false} + options = default_options.merge(options) - [url, query_string(options)].join('') - end + [url, query_string(options)].join('') + end - def make - response = case self.http_method.to_sym - when :get - Typhoeus::Request.get( - self.url_with_query_string, - :headers => self.headers.stringify_keys - ) + def make + response = case self.http_method.to_sym + when :get + Typhoeus::Request.get( + self.url_with_query_string, + :headers => self.headers.stringify_keys + ) - when :post - Typhoeus::Request.post( - self.url_with_query_string, - :body => self.interpreted_body, - :headers => self.headers.stringify_keys - ) + when :post + Typhoeus::Request.post( + self.url_with_query_string, + :body => self.interpreted_body, + :headers => self.headers.stringify_keys + ) - when :put - Typhoeus::Request.put( - self.url_with_query_string, - :body => self.interpreted_body, - :headers => self.headers.stringify_keys - ) + when :put + Typhoeus::Request.put( + self.url_with_query_string, + :body => self.interpreted_body, + :headers => self.headers.stringify_keys + ) - when :delete - Typhoeus::Request.delete( - self.url_with_query_string, - :body => self.interpreted_body, - :headers => self.headers.stringify_keys - ) - end + when :delete + Typhoeus::Request.delete( + self.url_with_query_string, + :body => self.interpreted_body, + :headers => self.headers.stringify_keys + ) + end - @response_obj = Response.new(response) - end + @response_obj = Response.new(response) + end - # If the request has been made, return the existing response - # If not, make the request and return the response - def response - @response_obj || self.make - end + # If the request has been made, return the existing response + # If not, make the request and return the response + def response + @response_obj || self.make + end - def response_code_pretty - return unless @response.present? - @response.code.to_s - end + def response_code_pretty + return unless @response.present? + @response.code.to_s + end - def response_headers_pretty - return unless @response.present? - # JSON.pretty_generate(@response.headers).gsub(/\n/, '<br/>').html_safe # <- This was for RestClient - @response.headers.gsub(/\n/, '<br/>').html_safe # <- This is for Typhoeus - end + def response_headers_pretty + return unless @response.present? + # JSON.pretty_generate(@response.headers).gsub(/\n/, '<br/>').html_safe # <- This was for RestClient + @response.headers.gsub(/\n/, '<br/>').html_safe # <- This is for Typhoeus + end - # It's an ActiveModel thing.. - def persisted? - false - end + # It's an ActiveModel thing.. + def persisted? + false + end + end end \ No newline at end of file