jnunemaker-httparty 0.1.1 → 0.1.4
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/History.txt +17 -0
- data/Manifest.txt +1 -2
- data/README.txt +21 -6
- data/Rakefile +8 -1
- data/examples/aaws.rb +0 -1
- data/examples/delicious.rb +0 -1
- data/examples/google.rb +15 -0
- data/examples/whoismyrep.rb +0 -1
- data/httparty.gemspec +7 -4
- data/lib/httparty/version.rb +1 -1
- data/lib/httparty.rb +62 -41
- data/spec/httparty_spec.rb +99 -23
- data/tasks/deployment.rake +9 -0
- data/tasks/website.rake +1 -1
- data/website/index.html +15 -9
- metadata +12 -4
- data/lib/httparty/core_ext/hash.rb +0 -21
- data/lib/httparty/core_ext.rb +0 -2
- data/spec/hash_spec.rb +0 -11
    
        data/History.txt
    CHANGED
    
    | @@ -1,3 +1,20 @@ | |
| 1 | 
            +
            == 0.1.4 2008-11-08
         | 
| 2 | 
            +
            * 2 major enhancements:
         | 
| 3 | 
            +
              * Removed some cruft
         | 
| 4 | 
            +
              * Added ability to follow redirects automatically and turn that off (Alex Vollmer)
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            == 0.1.3 2008-08-22
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            * 3 major enhancements:
         | 
| 9 | 
            +
            	* Added http_proxy key for setting proxy server and port (francxk@gmail.com)
         | 
| 10 | 
            +
            	* Now raises exception when http error occurs (francxk@gmail.com)
         | 
| 11 | 
            +
            	* Changed auto format detection from file extension to response content type (Jay Pignata)
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            == 0.1.2 2008-08-09
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            * 1 major enhancement:
         | 
| 16 | 
            +
            	* default_params were not being appended to query string if option[:query] was blank
         | 
| 17 | 
            +
             | 
| 1 18 | 
             
            == 0.1.1 2008-07-30
         | 
| 2 19 |  | 
| 3 20 | 
             
            * 2 major enhancement:
         | 
    
        data/Manifest.txt
    CHANGED
    
    | @@ -8,12 +8,11 @@ config/hoe.rb | |
| 8 8 | 
             
            config/requirements.rb
         | 
| 9 9 | 
             
            examples/aaws.rb
         | 
| 10 10 | 
             
            examples/delicious.rb
         | 
| 11 | 
            +
            examples/google.rb
         | 
| 11 12 | 
             
            examples/twitter.rb
         | 
| 12 13 | 
             
            examples/whoismyrep.rb
         | 
| 13 14 | 
             
            httparty.gemspec
         | 
| 14 15 | 
             
            lib/httparty.rb
         | 
| 15 | 
            -
            lib/httparty/core_ext.rb
         | 
| 16 | 
            -
            lib/httparty/core_ext/hash.rb
         | 
| 17 16 | 
             
            lib/httparty/version.rb
         | 
| 18 17 | 
             
            script/console
         | 
| 19 18 | 
             
            script/destroy
         | 
    
        data/README.txt
    CHANGED
    
    | @@ -9,7 +9,7 @@ Makes http fun again! | |
| 9 9 | 
             
            * Easy get, post, put, delete requests
         | 
| 10 10 | 
             
            * Basic http authentication
         | 
| 11 11 | 
             
            * Default request query string parameters (ie: for api keys that are needed on each request)
         | 
| 12 | 
            -
            * Automatic parsing of JSON and XML into ruby hashes
         | 
| 12 | 
            +
            * Automatic parsing of JSON and XML into ruby hashes based on response content-type
         | 
| 13 13 |  | 
| 14 14 | 
             
            == SYNOPSIS:
         | 
| 15 15 |  | 
| @@ -30,18 +30,33 @@ That works and all but what if you don't want to embed your username and passwor | |
| 30 30 | 
             
            	class Twitter
         | 
| 31 31 | 
             
            	  include HTTParty
         | 
| 32 32 | 
             
            	  base_uri 'twitter.com'
         | 
| 33 | 
            -
             | 
| 34 | 
            -
            	  def initialize( | 
| 35 | 
            -
            	     | 
| 33 | 
            +
             | 
| 34 | 
            +
            	  def initialize(u, p)
         | 
| 35 | 
            +
            	    @auth = {:username => u, :password => p}
         | 
| 36 36 | 
             
            	  end
         | 
| 37 | 
            -
             | 
| 37 | 
            +
             | 
| 38 38 | 
             
            	  def post(text)
         | 
| 39 | 
            -
            	     | 
| 39 | 
            +
            	    options = { :query => {:status => text}, :basic_auth => @auth }
         | 
| 40 | 
            +
            	    self.class.post('/statuses/update.json', options)
         | 
| 40 41 | 
             
            	  end
         | 
| 41 42 | 
             
            	end
         | 
| 42 43 |  | 
| 43 44 | 
             
            	Twitter.new('username', 'password').post("It's an HTTParty and everyone is invited!")
         | 
| 44 45 |  | 
| 46 | 
            +
            === REQUEST OPTIONS
         | 
| 47 | 
            +
             | 
| 48 | 
            +
            Each of the HTTP method (get, post, put and delete) each take a hash of options.
         | 
| 49 | 
            +
            The following keys can be specified in the options:
         | 
| 50 | 
            +
             | 
| 51 | 
            +
            headers::       A <tt>Hash</tt> of header key/value pairs
         | 
| 52 | 
            +
            query::         A <tt>Hash</tt> of query key/value pairs
         | 
| 53 | 
            +
            body::          The body of the request. If it's a <tt>Hash</tt>, it is
         | 
| 54 | 
            +
                            converted into query-string format, otherwise it is sent
         | 
| 55 | 
            +
                            as-is.
         | 
| 56 | 
            +
            basic_auth::    A <tt>Hash</tt> containing keys for <tt>:username</tt> and
         | 
| 57 | 
            +
                            <tt>:password</tt>.
         | 
| 58 | 
            +
            no_follow::     Turns off automatic redirect following
         | 
| 59 | 
            +
             | 
| 45 60 | 
             
            == REQUIREMENTS:
         | 
| 46 61 |  | 
| 47 62 | 
             
            * Active Support >= 2.1
         | 
    
        data/Rakefile
    CHANGED
    
    | @@ -1,4 +1,11 @@ | |
| 1 1 | 
             
            require 'config/requirements'
         | 
| 2 2 | 
             
            require 'config/hoe' # setup Hoe + all gem configuration
         | 
| 3 | 
            +
            require "spec/rake/spectask"
         | 
| 3 4 |  | 
| 4 | 
            -
            Dir['tasks/**/*.rake'].each { |rake| load rake }
         | 
| 5 | 
            +
            Dir['tasks/**/*.rake'].each { |rake| load rake }
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            task :default => :spec
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            Spec::Rake::SpecTask.new do |t|
         | 
| 10 | 
            +
              t.spec_files = FileList["spec/**/*_spec.rb"]
         | 
| 11 | 
            +
            end
         | 
    
        data/examples/aaws.rb
    CHANGED
    
    | @@ -8,7 +8,6 @@ module AAWS | |
| 8 8 | 
             
                include HTTParty
         | 
| 9 9 | 
             
                base_uri 'http://ecs.amazonaws.com'
         | 
| 10 10 | 
             
                default_params :Service => 'AWSECommerceService', :Operation => 'ItemSearch', :SearchIndex => 'Books'
         | 
| 11 | 
            -
                format :xml
         | 
| 12 11 |  | 
| 13 12 | 
             
                def initialize(key)
         | 
| 14 13 | 
             
                  self.class.default_params :AWSAccessKeyId => key
         | 
    
        data/examples/delicious.rb
    CHANGED
    
    
    
        data/examples/google.rb
    ADDED
    
    | @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            dir = File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
         | 
| 2 | 
            +
            require File.join(dir, 'httparty')
         | 
| 3 | 
            +
            require 'pp'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            class Google
         | 
| 6 | 
            +
              include HTTParty
         | 
| 7 | 
            +
            end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            # google.com redirects to www.google.com so this is live test for redirection
         | 
| 10 | 
            +
            pp Google.get('http://google.com')
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            puts '', '*'*70, ''
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            # check that ssl is requesting right
         | 
| 15 | 
            +
            pp Google.get('https://www.google.com')
         | 
    
        data/examples/whoismyrep.rb
    CHANGED
    
    
    
        data/httparty.gemspec
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            Gem::Specification.new do |s|
         | 
| 2 2 | 
             
              s.name = %q{httparty}
         | 
| 3 | 
            -
              s.version = "0.1. | 
| 3 | 
            +
              s.version = "0.1.4"
         | 
| 4 4 |  | 
| 5 5 | 
             
              s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
         | 
| 6 6 | 
             
              s.authors = ["John Nunemaker"]
         | 
| 7 | 
            -
              s.date = %q{2008- | 
| 7 | 
            +
              s.date = %q{2008-11-08}
         | 
| 8 8 | 
             
              s.description = %q{Makes http fun! Also, makes consuming restful web services dead easy.}
         | 
| 9 9 | 
             
              s.email = ["nunemaker@gmail.com"]
         | 
| 10 10 | 
             
              s.extra_rdoc_files = ["History.txt", "License.txt", "Manifest.txt", "PostInstall.txt", "README.txt"]
         | 
| 11 | 
            -
              s.files = ["History.txt", "License.txt", "Manifest.txt", "PostInstall.txt", "README.txt", "Rakefile", "config/hoe.rb", "config/requirements.rb", "examples/aaws.rb", "examples/delicious.rb", "examples/ | 
| 11 | 
            +
              s.files = ["History.txt", "License.txt", "Manifest.txt", "PostInstall.txt", "README.txt", "Rakefile", "config/hoe.rb", "config/requirements.rb", "examples/aaws.rb", "examples/delicious.rb", "examples/google.rb", "examples/twitter.rb", "examples/whoismyrep.rb", "httparty.gemspec", "lib/httparty.rb", "lib/httparty/version.rb", "script/console", "script/destroy", "script/generate", "script/txt2html", "setup.rb", "spec/hash_spec.rb", "spec/httparty_spec.rb", "spec/spec.opts", "spec/spec_helper.rb", "tasks/deployment.rake", "tasks/environment.rake", "tasks/website.rake", "website/css/common.css", "website/index.html"]
         | 
| 12 12 | 
             
              s.has_rdoc = true
         | 
| 13 13 | 
             
              s.homepage = %q{http://httparty.rubyforge.org}
         | 
| 14 14 | 
             
              s.post_install_message = %q{When you HTTParty, you must party hard!}
         | 
| @@ -24,10 +24,13 @@ Gem::Specification.new do |s| | |
| 24 24 |  | 
| 25 25 | 
             
                if current_version >= 3 then
         | 
| 26 26 | 
             
                  s.add_runtime_dependency(%q<activesupport>, [">= 2.1"])
         | 
| 27 | 
            +
                  s.add_development_dependency(%q<hoe>, [">= 1.8.0"])
         | 
| 27 28 | 
             
                else
         | 
| 28 29 | 
             
                  s.add_dependency(%q<activesupport>, [">= 2.1"])
         | 
| 30 | 
            +
                  s.add_dependency(%q<hoe>, [">= 1.8.0"])
         | 
| 29 31 | 
             
                end
         | 
| 30 32 | 
             
              else
         | 
| 31 33 | 
             
                s.add_dependency(%q<activesupport>, [">= 2.1"])
         | 
| 34 | 
            +
                s.add_dependency(%q<hoe>, [">= 1.8.0"])
         | 
| 32 35 | 
             
              end
         | 
| 33 | 
            -
            end
         | 
| 36 | 
            +
            end
         | 
    
        data/lib/httparty/version.rb
    CHANGED
    
    
    
        data/lib/httparty.rb
    CHANGED
    
    | @@ -5,26 +5,34 @@ require 'ostruct' | |
| 5 5 | 
             
            require 'rubygems'
         | 
| 6 6 | 
             
            require 'active_support'
         | 
| 7 7 |  | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 8 | 
            +
            directory = File.dirname(__FILE__)
         | 
| 9 | 
            +
            $:.unshift(directory) unless $:.include?(directory) || $:.include?(File.expand_path(directory))
         | 
| 10 10 |  | 
| 11 | 
            -
            dir = File.expand_path(File.join(File.dirname(__FILE__), 'httparty'))
         | 
| 12 | 
            -
            require dir + '/core_ext'
         | 
| 13 | 
            -
              
         | 
| 14 11 | 
             
            module HTTParty
         | 
| 12 | 
            +
              class UnsupportedFormat < StandardError; end
         | 
| 13 | 
            +
              class RedirectionTooDeep < StandardError; end
         | 
| 14 | 
            +
              
         | 
| 15 15 | 
             
              def self.included(base)
         | 
| 16 16 | 
             
                base.extend ClassMethods
         | 
| 17 17 | 
             
              end
         | 
| 18 18 |  | 
| 19 | 
            -
               | 
| 20 | 
            -
              
         | 
| 21 | 
            -
              AllowedFormats = %w[xml json]
         | 
| 19 | 
            +
              AllowedFormats = {:xml => 'text/xml', :json => 'application/json'}
         | 
| 22 20 |  | 
| 23 21 | 
             
              module ClassMethods    
         | 
| 22 | 
            +
                #
         | 
| 23 | 
            +
                # Set an http proxy
         | 
| 24 | 
            +
                #
         | 
| 25 | 
            +
                #	class Twitter
         | 
| 26 | 
            +
                #	  include HTTParty
         | 
| 27 | 
            +
                #	  http_proxy http://myProxy, 1080
         | 
| 28 | 
            +
                # ....
         | 
| 29 | 
            +
                def http_proxy(addr=nil, port = nil)
         | 
| 30 | 
            +
            	   @http_proxyaddr = addr
         | 
| 31 | 
            +
            	   @http_proxyport = port
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
             | 
| 24 34 | 
             
                def base_uri(base_uri=nil)
         | 
| 25 35 | 
             
                  return @base_uri unless base_uri
         | 
| 26 | 
            -
                  # don't want this to ever end with /
         | 
| 27 | 
            -
                  base_uri = base_uri.ends_with?('/') ? base_uri.chop : base_uri
         | 
| 28 36 | 
             
                  @base_uri = normalize_base_uri(base_uri)
         | 
| 29 37 | 
             
                end
         | 
| 30 38 |  | 
| @@ -52,8 +60,7 @@ module HTTParty | |
| 52 60 | 
             
                end
         | 
| 53 61 |  | 
| 54 62 | 
             
                def format(f)
         | 
| 55 | 
            -
                   | 
| 56 | 
            -
                  raise UnsupportedFormat, "Must be one of: #{AllowedFormats.join(', ')}" unless AllowedFormats.include?(f)
         | 
| 63 | 
            +
                  raise UnsupportedFormat, "Must be one of: #{AllowedFormats.keys.join(', ')}" unless AllowedFormats.key?(f)
         | 
| 57 64 | 
             
                  @format = f
         | 
| 58 65 | 
             
                end
         | 
| 59 66 |  | 
| @@ -78,14 +85,11 @@ module HTTParty | |
| 78 85 | 
             
                end
         | 
| 79 86 |  | 
| 80 87 | 
             
                private
         | 
| 81 | 
            -
                  def http(uri)
         | 
| 82 | 
            -
                     | 
| 83 | 
            -
             | 
| 84 | 
            -
             | 
| 85 | 
            -
             | 
| 86 | 
            -
                      @http.verify_mode = OpenSSL::SSL::VERIFY_NONE
         | 
| 87 | 
            -
                    end
         | 
| 88 | 
            -
                    @http
         | 
| 88 | 
            +
                  def http(uri) #:nodoc:
         | 
| 89 | 
            +
                    http = Net::HTTP.new(uri.host, uri.port, @http_proxyaddr, @http_proxyport)
         | 
| 90 | 
            +
                    http.use_ssl = (uri.port == 443)
         | 
| 91 | 
            +
                    http.verify_mode = OpenSSL::SSL::VERIFY_NONE
         | 
| 92 | 
            +
                    http
         | 
| 89 93 | 
             
                  end
         | 
| 90 94 |  | 
| 91 95 | 
             
                  # FIXME: this method is doing way to much and needs to be split up
         | 
| @@ -94,55 +98,72 @@ module HTTParty | |
| 94 98 | 
             
                  #   body        => hash of keys/values or a query string (foo=bar&baz=poo)
         | 
| 95 99 | 
             
                  #   headers     => hash of headers to send request with
         | 
| 96 100 | 
             
                  #   basic_auth  => :username and :password to use as basic http authentication (overrides @auth class instance variable)
         | 
| 97 | 
            -
                   | 
| 101 | 
            +
                  # Raises exception Net::XXX (http error code) if an http error occured
         | 
| 102 | 
            +
                  def send_request(method, path, options={}) #:nodoc:
         | 
| 103 | 
            +
                    options = {:limit => 5}.merge(options)
         | 
| 104 | 
            +
                    options[:limit] = 0 if options.delete(:no_follow)
         | 
| 105 | 
            +
                    
         | 
| 106 | 
            +
                    raise HTTParty::RedirectionTooDeep, 'HTTP redirects too deep' if options[:limit].to_i <= 0
         | 
| 98 107 | 
             
                    raise ArgumentError, 'only get, post, put and delete methods are supported' unless %w[get post put delete].include?(method.to_s)
         | 
| 99 108 | 
             
                    raise ArgumentError, ':headers must be a hash' if options[:headers] && !options[:headers].is_a?(Hash)
         | 
| 100 109 | 
             
                    raise ArgumentError, ':basic_auth must be a hash' if options[:basic_auth] && !options[:basic_auth].is_a?(Hash)
         | 
| 101 | 
            -
                     | 
| 102 | 
            -
                    path           = path | 
| 103 | 
            -
                     | 
| 104 | 
            -
                    uri            = URI.parse("#{base_uri}#{path}")
         | 
| 110 | 
            +
                    
         | 
| 111 | 
            +
                    path           = URI.parse(path)
         | 
| 112 | 
            +
                    uri            = path.relative? ? URI.parse("#{base_uri}#{path}") : path
         | 
| 105 113 | 
             
                    existing_query = uri.query ? "#{uri.query}&" : ''
         | 
| 106 114 | 
             
                    uri.query      = if options[:query].blank?
         | 
| 107 | 
            -
                      existing_query
         | 
| 115 | 
            +
                      existing_query + default_params.to_query
         | 
| 108 116 | 
             
                    else
         | 
| 109 117 | 
             
                      existing_query + (options[:query].is_a?(Hash) ? default_params.merge(options[:query]).to_query : options[:query])
         | 
| 110 118 | 
             
                    end
         | 
| 119 | 
            +
                    
         | 
| 111 120 | 
             
                    klass          = Net::HTTP.const_get method.to_s.downcase.capitalize
         | 
| 112 121 | 
             
                    request        = klass.new(uri.request_uri)
         | 
| 113 122 | 
             
                    request.body   = options[:body].is_a?(Hash) ? options[:body].to_query : options[:body] unless options[:body].blank?
         | 
| 114 123 | 
             
                    basic_auth     = options.delete(:basic_auth) || @auth
         | 
| 115 124 | 
             
                    request.initialize_http_header headers.merge(options[:headers] || {})
         | 
| 116 | 
            -
                    # note to self: self, do not put basic auth above headers because it removes basic auth
         | 
| 117 125 | 
             
                    request.basic_auth(basic_auth[:username], basic_auth[:password]) if basic_auth
         | 
| 118 126 | 
             
                    response       = http(uri).request(request)
         | 
| 119 | 
            -
                     | 
| 127 | 
            +
                    @format      ||= format_from_mimetype(response['content-type'])
         | 
| 128 | 
            +
                    
         | 
| 129 | 
            +
                    case response
         | 
| 130 | 
            +
                    when Net::HTTPSuccess
         | 
| 131 | 
            +
                      parse_response(response.body)
         | 
| 132 | 
            +
                    when Net::HTTPRedirection
         | 
| 133 | 
            +
                      options[:limit] -= 1
         | 
| 134 | 
            +
                      send_request(method, response['location'], options)
         | 
| 135 | 
            +
                    else
         | 
| 136 | 
            +
                      response.instance_eval { class << self; attr_accessor :body_parsed; end }
         | 
| 137 | 
            +
                      begin; response.body_parsed = parse_response(response.body); rescue; end
         | 
| 138 | 
            +
                      response.error! # raises  exception corresponding to http error Net::XXX
         | 
| 139 | 
            +
                    end
         | 
| 140 | 
            +
             | 
| 120 141 | 
             
                  end
         | 
| 121 142 |  | 
| 122 | 
            -
                  def parse_response(body)
         | 
| 143 | 
            +
                  def parse_response(body) #:nodoc:
         | 
| 144 | 
            +
                    return nil if body.nil? or body.empty?
         | 
| 123 145 | 
             
                    case @format
         | 
| 124 | 
            -
                    when  | 
| 146 | 
            +
                    when :xml
         | 
| 125 147 | 
             
                      Hash.from_xml(body)
         | 
| 126 | 
            -
                    when  | 
| 148 | 
            +
                    when :json
         | 
| 127 149 | 
             
                      ActiveSupport::JSON.decode(body)
         | 
| 128 150 | 
             
                    else
         | 
| 129 | 
            -
                      # just return the response if no format 
         | 
| 130 151 | 
             
                      body
         | 
| 131 152 | 
             
                    end
         | 
| 132 153 | 
             
                  end
         | 
| 133 154 |  | 
| 134 155 | 
             
                  # Makes it so uri is sure to parse stuff like google.com with the http
         | 
| 135 | 
            -
                  def normalize_base_uri( | 
| 136 | 
            -
                     | 
| 156 | 
            +
                  def normalize_base_uri(url) #:nodoc:
         | 
| 157 | 
            +
                    use_ssl = (url =~ /^https/) || url.include?(':443')
         | 
| 158 | 
            +
                    url.chop! if url.ends_with?('/')
         | 
| 159 | 
            +
                    url.gsub!(/^https?:\/\//i, '')
         | 
| 160 | 
            +
                    "http#{'s' if use_ssl}://#{url}"
         | 
| 137 161 | 
             
                  end
         | 
| 138 162 |  | 
| 139 | 
            -
                  #  | 
| 140 | 
            -
                  #  | 
| 141 | 
            -
                   | 
| 142 | 
            -
             | 
| 143 | 
            -
                  def format_from_path(path)
         | 
| 144 | 
            -
                    ext = File.extname(path)[1..-1]
         | 
| 145 | 
            -
                    !ext.blank? && AllowedFormats.include?(ext) ? ext : nil
         | 
| 163 | 
            +
                  # Uses the HTTP Content-Type header to determine the format of the response
         | 
| 164 | 
            +
                  # It compares the MIME type returned to the types stored in the AllowedFormats hash
         | 
| 165 | 
            +
                  def format_from_mimetype(mimetype) #:nodoc:
         | 
| 166 | 
            +
                    AllowedFormats.each { |k, v| return k if mimetype.include?(v) }
         | 
| 146 167 | 
             
                  end
         | 
| 147 168 | 
             
              end
         | 
| 148 169 | 
             
            end
         | 
    
        data/spec/httparty_spec.rb
    CHANGED
    
    | @@ -13,11 +13,11 @@ end | |
| 13 13 | 
             
            describe HTTParty do
         | 
| 14 14 |  | 
| 15 15 | 
             
              describe "base uri" do
         | 
| 16 | 
            -
                it "should  | 
| 16 | 
            +
                it "should have reader" do
         | 
| 17 17 | 
             
                  Foo.base_uri.should == 'http://api.foo.com/v1'
         | 
| 18 18 | 
             
                end
         | 
| 19 19 |  | 
| 20 | 
            -
                it 'should  | 
| 20 | 
            +
                it 'should have writer' do
         | 
| 21 21 | 
             
                  Foo.base_uri('http://api.foobar.com')
         | 
| 22 22 | 
             
                  Foo.base_uri.should == 'http://api.foobar.com'
         | 
| 23 23 | 
             
                end
         | 
| @@ -28,7 +28,13 @@ describe HTTParty do | |
| 28 28 | 
             
                end
         | 
| 29 29 |  | 
| 30 30 | 
             
                it "should add https if not present for ssl requests" do
         | 
| 31 | 
            -
                   | 
| 31 | 
            +
                  Foo.base_uri('api.foo.com/v1:443')
         | 
| 32 | 
            +
                  Foo.base_uri.should == 'https://api.foo.com/v1:443'
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
                
         | 
| 35 | 
            +
                it "should not remove https for ssl requests" do
         | 
| 36 | 
            +
                  Foo.base_uri('https://api.foo.com/v1:443')
         | 
| 37 | 
            +
                  Foo.base_uri.should == 'https://api.foo.com/v1:443'
         | 
| 32 38 | 
             
                end
         | 
| 33 39 | 
             
              end
         | 
| 34 40 |  | 
| @@ -66,12 +72,12 @@ describe HTTParty do | |
| 66 72 | 
             
              describe "format" do
         | 
| 67 73 | 
             
                it "should allow xml" do
         | 
| 68 74 | 
             
                  Foo.format :xml
         | 
| 69 | 
            -
                  Foo.instance_variable_get("@format").should ==  | 
| 75 | 
            +
                  Foo.instance_variable_get("@format").should == :xml
         | 
| 70 76 | 
             
                end
         | 
| 71 77 |  | 
| 72 78 | 
             
                it "should allow json" do
         | 
| 73 79 | 
             
                  Foo.format :json
         | 
| 74 | 
            -
                  Foo.instance_variable_get("@format").should ==  | 
| 80 | 
            +
                  Foo.instance_variable_get("@format").should == :json
         | 
| 75 81 | 
             
                end
         | 
| 76 82 |  | 
| 77 83 | 
             
                it 'should not allow funky format' do
         | 
| @@ -91,24 +97,6 @@ describe HTTParty do | |
| 91 97 | 
             
                end
         | 
| 92 98 | 
             
              end
         | 
| 93 99 |  | 
| 94 | 
            -
              describe "deriving format from path" do
         | 
| 95 | 
            -
                it "should work if there is extension and extension is an allowed format" do
         | 
| 96 | 
            -
                  %w[xml json].each do |ext|
         | 
| 97 | 
            -
                    Foo.send(:format_from_path, "/foo/bar.#{ext}").should == ext
         | 
| 98 | 
            -
                  end
         | 
| 99 | 
            -
                end
         | 
| 100 | 
            -
                
         | 
| 101 | 
            -
                it "should NOT work if there is extension but extention is not allow format" do
         | 
| 102 | 
            -
                  Foo.send(:format_from_path, '/foo/bar.php').should == nil
         | 
| 103 | 
            -
                end
         | 
| 104 | 
            -
                
         | 
| 105 | 
            -
                it 'should NOT work if there is no extension' do
         | 
| 106 | 
            -
                  ['', '.'].each do |ext|
         | 
| 107 | 
            -
                    Foo.send(:format_from_path, "/foo/bar#{ext}").should == nil
         | 
| 108 | 
            -
                  end
         | 
| 109 | 
            -
                end
         | 
| 110 | 
            -
              end
         | 
| 111 | 
            -
              
         | 
| 112 100 | 
             
              describe 'parsing responses' do
         | 
| 113 101 | 
             
                it 'should handle xml automatically' do
         | 
| 114 102 | 
             
                  xml = %q[<books><book><id>1234</id><name>Foo Bar!</name></book></books>]
         | 
| @@ -141,5 +129,93 @@ describe HTTParty do | |
| 141 129 | 
             
                    Foo.send(:send_request, 'get', '/foo', :basic_auth => 'string')
         | 
| 142 130 | 
             
                  end.should raise_error(ArgumentError)
         | 
| 143 131 | 
             
                end
         | 
| 132 | 
            +
             | 
| 133 | 
            +
                it "should not attempt to parse empty responses" do
         | 
| 134 | 
            +
                  http = Net::HTTP.new('localhost', 80)
         | 
| 135 | 
            +
                  Foo.stub!(:http).and_return(http)
         | 
| 136 | 
            +
                  response = Net::HTTPNoContent.new("1.1", 204, "No content for you")
         | 
| 137 | 
            +
                  response.stub!(:body).and_return(nil)
         | 
| 138 | 
            +
                  http.stub!(:request).and_return(response)
         | 
| 139 | 
            +
             | 
| 140 | 
            +
                  Foo.headers.clear # clear out bogus settings from other specs
         | 
| 141 | 
            +
                  Foo.format :xml
         | 
| 142 | 
            +
                  Foo.send(:send_request, 'get', '/bar').should be_nil
         | 
| 143 | 
            +
             | 
| 144 | 
            +
                  response.stub!(:body).and_return("")
         | 
| 145 | 
            +
                  Foo.send(:send_request, 'get', 'bar').should be_nil
         | 
| 146 | 
            +
                end
         | 
| 147 | 
            +
             | 
| 148 | 
            +
                describe "that respond with redirects" do
         | 
| 149 | 
            +
                  def setup_http
         | 
| 150 | 
            +
                    @http = Net::HTTP.new('localhost', 80)
         | 
| 151 | 
            +
                    Foo.stub!(:http).and_return(@http)
         | 
| 152 | 
            +
                    @redirect = Net::HTTPFound.new("1.1", 302, "")
         | 
| 153 | 
            +
                    @redirect.stub!(:[]).with('location').and_return('/foo')
         | 
| 154 | 
            +
                    @ok = Net::HTTPOK.new("1.1", 200, "Content for you")
         | 
| 155 | 
            +
                    @ok.stub!(:body).and_return({"foo" => "bar"}.to_xml)
         | 
| 156 | 
            +
                    @http.should_receive(:request).and_return(@redirect, @ok)
         | 
| 157 | 
            +
                    Foo.headers.clear
         | 
| 158 | 
            +
                    Foo.format :xml
         | 
| 159 | 
            +
                  end
         | 
| 160 | 
            +
             | 
| 161 | 
            +
                  it "should handle redirects for GET transparently" do
         | 
| 162 | 
            +
                    setup_http
         | 
| 163 | 
            +
                    Foo.get('/foo/').should == {"hash" => {"foo" => "bar"}}
         | 
| 164 | 
            +
                  end
         | 
| 165 | 
            +
             | 
| 166 | 
            +
                  it "should handle redirects for POST transparently" do
         | 
| 167 | 
            +
                    setup_http
         | 
| 168 | 
            +
                    Foo.post('/foo/', {:foo => :bar}).should == {"hash" => {"foo" => "bar"}}
         | 
| 169 | 
            +
                  end
         | 
| 170 | 
            +
             | 
| 171 | 
            +
                  it "should handle redirects for DELETE transparently" do
         | 
| 172 | 
            +
                    setup_http
         | 
| 173 | 
            +
                    Foo.delete('/foo/').should == {"hash" => {"foo" => "bar"}}
         | 
| 174 | 
            +
                  end
         | 
| 175 | 
            +
             | 
| 176 | 
            +
                  it "should handle redirects for PUT transparently" do
         | 
| 177 | 
            +
                    setup_http
         | 
| 178 | 
            +
                    Foo.put('/foo/').should == {"hash" => {"foo" => "bar"}}
         | 
| 179 | 
            +
                  end
         | 
| 180 | 
            +
             | 
| 181 | 
            +
                  it "should prevent infinite loops" do
         | 
| 182 | 
            +
                    http = Net::HTTP.new('localhost', 80)
         | 
| 183 | 
            +
                    Foo.stub!(:http).and_return(http)
         | 
| 184 | 
            +
                    redirect = Net::HTTPFound.new("1.1", "302", "Look, over there!")
         | 
| 185 | 
            +
                    redirect.stub!(:[]).with('location').and_return('/foo')
         | 
| 186 | 
            +
                    http.stub!(:request).and_return(redirect)
         | 
| 187 | 
            +
             | 
| 188 | 
            +
                    lambda do
         | 
| 189 | 
            +
                      Foo.send(:send_request, 'get', '/foo')
         | 
| 190 | 
            +
                    end.should raise_error(HTTParty::RedirectionTooDeep)
         | 
| 191 | 
            +
                  end
         | 
| 192 | 
            +
             | 
| 193 | 
            +
                  describe "with explicit override of automatic redirect handling" do
         | 
| 194 | 
            +
             | 
| 195 | 
            +
                    it "should fail with redirected GET" do
         | 
| 196 | 
            +
                      lambda do
         | 
| 197 | 
            +
                        Foo.get('/foo', :no_follow => true)
         | 
| 198 | 
            +
                      end.should raise_error(HTTParty::RedirectionTooDeep)
         | 
| 199 | 
            +
                    end
         | 
| 200 | 
            +
             | 
| 201 | 
            +
                    it "should fail with redirected POST" do
         | 
| 202 | 
            +
                      lambda do
         | 
| 203 | 
            +
                        Foo.post('/foo', :no_follow => true)
         | 
| 204 | 
            +
                      end.should raise_error(HTTParty::RedirectionTooDeep)
         | 
| 205 | 
            +
                    end
         | 
| 206 | 
            +
             | 
| 207 | 
            +
                    it "should fail with redirected DELETE" do
         | 
| 208 | 
            +
                      lambda do
         | 
| 209 | 
            +
                        Foo.delete('/foo', :no_follow => true)
         | 
| 210 | 
            +
                      end
         | 
| 211 | 
            +
                    end
         | 
| 212 | 
            +
             | 
| 213 | 
            +
                    it "should fail with redirected PUT" do
         | 
| 214 | 
            +
                      lambda do
         | 
| 215 | 
            +
                        Foo.put('/foo', :no_follow => true)
         | 
| 216 | 
            +
                      end
         | 
| 217 | 
            +
                    end
         | 
| 218 | 
            +
                  end
         | 
| 219 | 
            +
                end
         | 
| 144 220 | 
             
              end
         | 
| 145 221 | 
             
            end
         | 
    
        data/tasks/deployment.rake
    CHANGED
    
    | @@ -1,3 +1,12 @@ | |
| 1 | 
            +
            desc 'Preps the gem for a new release'
         | 
| 2 | 
            +
            task :prep_for_release do
         | 
| 3 | 
            +
              require 'rio'
         | 
| 4 | 
            +
              Rake::Task['manifest:refresh'].invoke
         | 
| 5 | 
            +
              gemspec = %x[rake debug_gem]
         | 
| 6 | 
            +
              lines = gemspec.split("\n")
         | 
| 7 | 
            +
              rio('httparty.gemspec') < lines[1, lines.length-1].join("\n")
         | 
| 8 | 
            +
            end
         | 
| 9 | 
            +
             | 
| 1 10 | 
             
            desc 'Release the website and new gem version'
         | 
| 2 11 | 
             
            task :deploy => [:check_version, :website, :release] do
         | 
| 3 12 | 
             
              puts "Remember to create SVN tag:"
         | 
    
        data/tasks/website.rake
    CHANGED
    
    
    
        data/website/index.html
    CHANGED
    
    | @@ -15,6 +15,7 @@ | |
| 15 15 | 
             
            		<ul id="nav">
         | 
| 16 16 | 
             
            			<li><a href="rdoc/">Docs</a></li> 
         | 
| 17 17 | 
             
            			<li><a href="http://github.com/jnunemaker/httparty">Github</a></li>
         | 
| 18 | 
            +
            			<li><a href="http://jnunemaker.lighthouseapp.com/projects/14842-httparty/tickets">Lighthouse</a></li>
         | 
| 18 19 | 
             
            			<li><a href="http://rubyforge.org/projects/httparty/">Rubyforge</a></li> 
         | 
| 19 20 | 
             
            		</ul> 
         | 
| 20 21 | 
             
            	</div> 
         | 
| @@ -43,12 +44,13 @@ Twitter.post('/statuses/update.json', :query => {:status => "It's an HTTParty an | |
| 43 44 | 
             
              include HTTParty
         | 
| 44 45 | 
             
              base_uri 'twitter.com'
         | 
| 45 46 |  | 
| 46 | 
            -
              def initialize( | 
| 47 | 
            -
                 | 
| 47 | 
            +
              def initialize(u, p)
         | 
| 48 | 
            +
                @auth = {:username => u, :password => p}
         | 
| 48 49 | 
             
              end
         | 
| 49 50 |  | 
| 50 51 | 
             
              def post(text)
         | 
| 51 | 
            -
                 | 
| 52 | 
            +
                options = { :query => {:status => text}, :basic_auth => @auth }
         | 
| 53 | 
            +
                self.class.post('/statuses/update.json', options)
         | 
| 52 54 | 
             
              end
         | 
| 53 55 | 
             
            end
         | 
| 54 56 |  | 
| @@ -66,12 +68,16 @@ Twitter.new('username', 'password').post("It's an HTTParty and everyone is invit | |
| 66 68 | 
             
            		<p>Created by <a href="http://addictedtonew.com/about/">John Nunemaker</a></p> 
         | 
| 67 69 | 
             
            	</div> 
         | 
| 68 70 | 
             
            </div> 
         | 
| 71 | 
            +
             | 
| 72 | 
            +
            <script type="text/javascript">
         | 
| 73 | 
            +
            var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
         | 
| 74 | 
            +
            document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
         | 
| 75 | 
            +
            </script>
         | 
| 76 | 
            +
            <script type="text/javascript">
         | 
| 77 | 
            +
            var pageTracker = _gat._getTracker("UA-85301-19");
         | 
| 78 | 
            +
            pageTracker._initData();
         | 
| 79 | 
            +
            pageTracker._trackPageview();
         | 
| 80 | 
            +
            </script>
         | 
| 69 81 |  | 
| 70 | 
            -
            <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> 
         | 
| 71 | 
            -
            <script type="text/javascript">_uacct = "UA-85301-9"; urchinTracker();</script> 
         | 
| 72 | 
            -
             
         | 
| 73 | 
            -
            <!-- 103bees.com 'bee' code v1.11 - please do not make any changes! --> 
         | 
| 74 | 
            -
            <script type="text/javascript" src="http://103bees.com/bees/?bee=3672&fid=5643"></script> 
         | 
| 75 | 
            -
            <!-- 103bees.com 'bee' code --> 
         | 
| 76 82 | 
             
            </body> 
         | 
| 77 83 | 
             
            </html>
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification 
         | 
| 2 2 | 
             
            name: jnunemaker-httparty
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 4 | 
            -
              version: 0.1. | 
| 4 | 
            +
              version: 0.1.4
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors: 
         | 
| 7 7 | 
             
            - John Nunemaker
         | 
| @@ -9,7 +9,7 @@ autorequire: | |
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 11 |  | 
| 12 | 
            -
            date: 2008- | 
| 12 | 
            +
            date: 2008-11-08 00:00:00 -08:00
         | 
| 13 13 | 
             
            default_executable: 
         | 
| 14 14 | 
             
            dependencies: 
         | 
| 15 15 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| @@ -21,6 +21,15 @@ dependencies: | |
| 21 21 | 
             
                  - !ruby/object:Gem::Version 
         | 
| 22 22 | 
             
                    version: "2.1"
         | 
| 23 23 | 
             
                version: 
         | 
| 24 | 
            +
            - !ruby/object:Gem::Dependency 
         | 
| 25 | 
            +
              name: hoe
         | 
| 26 | 
            +
              version_requirement: 
         | 
| 27 | 
            +
              version_requirements: !ruby/object:Gem::Requirement 
         | 
| 28 | 
            +
                requirements: 
         | 
| 29 | 
            +
                - - ">="
         | 
| 30 | 
            +
                  - !ruby/object:Gem::Version 
         | 
| 31 | 
            +
                    version: 1.8.0
         | 
| 32 | 
            +
                version: 
         | 
| 24 33 | 
             
            description: Makes http fun! Also, makes consuming restful web services dead easy.
         | 
| 25 34 | 
             
            email: 
         | 
| 26 35 | 
             
            - nunemaker@gmail.com
         | 
| @@ -45,12 +54,11 @@ files: | |
| 45 54 | 
             
            - config/requirements.rb
         | 
| 46 55 | 
             
            - examples/aaws.rb
         | 
| 47 56 | 
             
            - examples/delicious.rb
         | 
| 57 | 
            +
            - examples/google.rb
         | 
| 48 58 | 
             
            - examples/twitter.rb
         | 
| 49 59 | 
             
            - examples/whoismyrep.rb
         | 
| 50 60 | 
             
            - httparty.gemspec
         | 
| 51 61 | 
             
            - lib/httparty.rb
         | 
| 52 | 
            -
            - lib/httparty/core_ext.rb
         | 
| 53 | 
            -
            - lib/httparty/core_ext/hash.rb
         | 
| 54 62 | 
             
            - lib/httparty/version.rb
         | 
| 55 63 | 
             
            - script/console
         | 
| 56 64 | 
             
            - script/destroy
         | 
| @@ -1,21 +0,0 @@ | |
| 1 | 
            -
            module HTTParty
         | 
| 2 | 
            -
              module CoreExt
         | 
| 3 | 
            -
                module HashConversions
         | 
| 4 | 
            -
                  def to_struct
         | 
| 5 | 
            -
                    o = OpenStruct.new
         | 
| 6 | 
            -
                    self.each do |k, v|
         | 
| 7 | 
            -
                      # if id, we create an accessor so we don't get warning about id deprecation
         | 
| 8 | 
            -
                      if k.to_s == 'id'
         | 
| 9 | 
            -
                        o.class.class_eval "attr_accessor :id"
         | 
| 10 | 
            -
                        o.id = v
         | 
| 11 | 
            -
                      else
         | 
| 12 | 
            -
                        o.send("#{k}=", v.is_a?(Hash) ? v.to_struct : v)
         | 
| 13 | 
            -
                      end
         | 
| 14 | 
            -
                    end
         | 
| 15 | 
            -
                    o
         | 
| 16 | 
            -
                  end
         | 
| 17 | 
            -
                end
         | 
| 18 | 
            -
              end
         | 
| 19 | 
            -
            end
         | 
| 20 | 
            -
             | 
| 21 | 
            -
            Hash.send :include, HTTParty::CoreExt::HashConversions
         | 
    
        data/lib/httparty/core_ext.rb
    DELETED
    
    
    
        data/spec/hash_spec.rb
    DELETED
    
    | @@ -1,11 +0,0 @@ | |
| 1 | 
            -
            require File.join(File.dirname(__FILE__), 'spec_helper')
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            describe HTTParty::CoreExt::HashConversions do
         | 
| 4 | 
            -
              it "should convert hash to struct" do
         | 
| 5 | 
            -
                {'foo' => 'bar'}.to_struct.should == OpenStruct.new(:foo => 'bar')
         | 
| 6 | 
            -
              end
         | 
| 7 | 
            -
              
         | 
| 8 | 
            -
              it 'should convert nested hash to struct' do
         | 
| 9 | 
            -
                {'foo' => {'bar' => 'baz'}}.to_struct.should == OpenStruct.new(:foo => OpenStruct.new(:bar => 'baz'))
         | 
| 10 | 
            -
              end
         | 
| 11 | 
            -
            end
         |