From 971e1d150f54f5627a82f39b7a3590fef6944da4 Mon Sep 17 00:00:00 2001 From: John Nunemaker Date: Tue, 13 Sep 2011 12:29:26 -0400 Subject: [PATCH] You can now party without crack. --- Gemfile | 8 +++-- README.rdoc | 2 +- features/steps/env.rb | 1 - httparty.gemspec | 7 ----- lib/httparty.rb | 7 +---- lib/httparty/hash_conversions.rb | 51 ++++++++++++++++++++++++++++++++ lib/httparty/request.rb | 4 +-- 7 files changed, 60 insertions(+), 20 deletions(-) create mode 100644 lib/httparty/hash_conversions.rb diff --git a/Gemfile b/Gemfile index feb5b076..0dac7b63 100644 --- a/Gemfile +++ b/Gemfile @@ -1,6 +1,8 @@ source :rubygems gemspec -group(:development) do - gem 'rake', '~> 0.8.7' -end \ No newline at end of file +gem 'rake', '~> 0.8.7' +gem 'cucumber', '~> 0.7' +gem 'fakeweb', '~> 1.2' +gem 'rspec', '~> 1.3' +gem 'mongrel', '1.2.0.pre2' diff --git a/README.rdoc b/README.rdoc index f78fbc02..630d06e2 100644 --- a/README.rdoc +++ b/README.rdoc @@ -42,7 +42,7 @@ options. Below is an example of how easy it is. == Requirements -* Crack http://github.com/jnunemaker/crack/ - For XML and JSON parsing. +* multijson and multixml * You like to party! == Install diff --git a/features/steps/env.rb b/features/steps/env.rb index 9c042e6b..8bf4bb3d 100644 --- a/features/steps/env.rb +++ b/features/steps/env.rb @@ -1,5 +1,4 @@ require 'mongrel' -require 'active_support' require './lib/httparty' require 'spec/expectations' diff --git a/httparty.gemspec b/httparty.gemspec index f6219f44..d21692f3 100644 --- a/httparty.gemspec +++ b/httparty.gemspec @@ -12,16 +12,9 @@ Gem::Specification.new do |s| s.summary = %q{Makes http fun! Also, makes consuming restful web services dead easy.} s.description = %q{Makes http fun! Also, makes consuming restful web services dead easy.} - s.add_dependency 'crack', HTTParty::CRACK_DEPENDENCY s.add_dependency 'multi_json' s.add_dependency 'multi_xml' - s.add_development_dependency "activesupport", "~> 2.3" - s.add_development_dependency "cucumber", "~> 0.7" - s.add_development_dependency "fakeweb", "~> 1.2" - s.add_development_dependency "rspec", "~> 1.3" - s.add_development_dependency "mongrel", "1.2.0.pre2" - s.post_install_message = "When you HTTParty, you must party hard!" s.files = `git ls-files`.split("\n") diff --git a/lib/httparty.rb b/lib/httparty.rb index b2753631..f6488d82 100644 --- a/lib/httparty.rb +++ b/lib/httparty.rb @@ -3,7 +3,6 @@ require 'net/https' require 'uri' require 'zlib' -require 'crack' require 'multi_xml' require 'multi_json' @@ -443,15 +442,11 @@ def self.head(*args) def self.options(*args) Basement.options(*args) end - end require 'httparty/core_extensions' +require 'httparty/hash_conversions' require 'httparty/exceptions' require 'httparty/parser' require 'httparty/request' require 'httparty/response' - -if Crack::VERSION != HTTParty::CRACK_DEPENDENCY - warn "warning: HTTParty depends on version #{HTTParty::CRACK_DEPENDENCY} of crack, not #{Crack::VERSION}." -end diff --git a/lib/httparty/hash_conversions.rb b/lib/httparty/hash_conversions.rb new file mode 100644 index 00000000..6331aa27 --- /dev/null +++ b/lib/httparty/hash_conversions.rb @@ -0,0 +1,51 @@ +module HTTParty + module HashConversions + # @return This hash as a query string + # + # @example + # { :name => "Bob", + # :address => { + # :street => '111 Ruby Ave.', + # :city => 'Ruby Central', + # :phones => ['111-111-1111', '222-222-2222'] + # } + # }.to_params + # #=> "name=Bob&address[city]=Ruby Central&address[phones][]=111-111-1111&address[phones][]=222-222-2222&address[street]=111 Ruby Ave." + def self.to_params(hash) + params = hash.map { |k,v| normalize_param(k,v) }.join + params.chop! # trailing & + params + end + + # @param key The key for the param. + # @param value The value for the param. + # + # @return This key value pair as a param + # + # @example normalize_param(:name, "Bob Jones") #=> "name=Bob%20Jones&" + def self.normalize_param(key, value) + param = '' + stack = [] + + if value.is_a?(Array) + param << value.map { |element| normalize_param("#{key}[]", element) }.join + elsif value.is_a?(Hash) + stack << [key,value] + else + param << "#{key}=#{URI.encode(value.to_s, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))}&" + end + + stack.each do |parent, hash| + hash.each do |key, value| + if value.is_a?(Hash) + stack << ["#{parent}[#{key}]", value] + else + param << normalize_param("#{parent}[#{key}]", value) + end + end + end + + param + end + end +end \ No newline at end of file diff --git a/lib/httparty/request.rb b/lib/httparty/request.rb index 78f9ddcc..ec1fc8d9 100644 --- a/lib/httparty/request.rb +++ b/lib/httparty/request.rb @@ -18,7 +18,7 @@ class Request #:nodoc: elsif value.is_a?(Array) value.map {|v| "#{key}=#{URI.encode(v.to_s, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))}"} else - {key => value}.to_params + HashConversions.to_params(key => value) end end.flatten.sort.join('&') end @@ -143,7 +143,7 @@ def normalize_query(query) if query_string_normalizer query_string_normalizer.call(query) else - query.to_params + HashConversions.to_params(query) end end