spreedly 1.0.0

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.
Files changed (67) hide show
  1. data/History.txt +6 -0
  2. data/Manifest.txt +66 -0
  3. data/README.txt +68 -0
  4. data/Rakefile +72 -0
  5. data/lib/spreedly.rb +154 -0
  6. data/lib/spreedly/common.rb +24 -0
  7. data/lib/spreedly/mock.rb +113 -0
  8. data/lib/spreedly/version.rb +3 -0
  9. data/test/spreedly_gem_test.rb +152 -0
  10. data/test/test_site.yml +2 -0
  11. data/vendor/httparty/History +108 -0
  12. data/vendor/httparty/MIT-LICENSE +20 -0
  13. data/vendor/httparty/Manifest +55 -0
  14. data/vendor/httparty/README +35 -0
  15. data/vendor/httparty/Rakefile +47 -0
  16. data/vendor/httparty/bin/httparty +98 -0
  17. data/vendor/httparty/cucumber.yml +1 -0
  18. data/vendor/httparty/examples/aaws.rb +32 -0
  19. data/vendor/httparty/examples/basic.rb +11 -0
  20. data/vendor/httparty/examples/delicious.rb +37 -0
  21. data/vendor/httparty/examples/google.rb +16 -0
  22. data/vendor/httparty/examples/rubyurl.rb +14 -0
  23. data/vendor/httparty/examples/twitter.rb +31 -0
  24. data/vendor/httparty/examples/whoismyrep.rb +10 -0
  25. data/vendor/httparty/features/basic_authentication.feature +20 -0
  26. data/vendor/httparty/features/command_line.feature +7 -0
  27. data/vendor/httparty/features/deals_with_http_error_codes.feature +26 -0
  28. data/vendor/httparty/features/handles_multiple_formats.feature +34 -0
  29. data/vendor/httparty/features/steps/env.rb +15 -0
  30. data/vendor/httparty/features/steps/httparty_response_steps.rb +26 -0
  31. data/vendor/httparty/features/steps/httparty_steps.rb +15 -0
  32. data/vendor/httparty/features/steps/mongrel_helper.rb +55 -0
  33. data/vendor/httparty/features/steps/remote_service_steps.rb +47 -0
  34. data/vendor/httparty/features/supports_redirection.feature +22 -0
  35. data/vendor/httparty/httparty.gemspec +37 -0
  36. data/vendor/httparty/lib/core_extensions.rb +189 -0
  37. data/vendor/httparty/lib/httparty.rb +201 -0
  38. data/vendor/httparty/lib/httparty/cookie_hash.rb +9 -0
  39. data/vendor/httparty/lib/httparty/exceptions.rb +7 -0
  40. data/vendor/httparty/lib/httparty/logging.rb +35 -0
  41. data/vendor/httparty/lib/httparty/module_inheritable_attributes.rb +25 -0
  42. data/vendor/httparty/lib/httparty/parsers.rb +4 -0
  43. data/vendor/httparty/lib/httparty/parsers/json.rb +74 -0
  44. data/vendor/httparty/lib/httparty/parsers/xml.rb +209 -0
  45. data/vendor/httparty/lib/httparty/request.rb +169 -0
  46. data/vendor/httparty/lib/httparty/response.rb +17 -0
  47. data/vendor/httparty/lib/httparty/version.rb +3 -0
  48. data/vendor/httparty/setup.rb +1585 -0
  49. data/vendor/httparty/spec/fixtures/delicious.xml +23 -0
  50. data/vendor/httparty/spec/fixtures/empty.xml +0 -0
  51. data/vendor/httparty/spec/fixtures/google.html +3 -0
  52. data/vendor/httparty/spec/fixtures/twitter.json +1 -0
  53. data/vendor/httparty/spec/fixtures/twitter.xml +403 -0
  54. data/vendor/httparty/spec/fixtures/undefined_method_add_node_for_nil.xml +2 -0
  55. data/vendor/httparty/spec/hash_spec.rb +49 -0
  56. data/vendor/httparty/spec/httparty/cookie_hash_spec.rb +38 -0
  57. data/vendor/httparty/spec/httparty/parsers/json_spec.rb +44 -0
  58. data/vendor/httparty/spec/httparty/parsers/xml_spec.rb +454 -0
  59. data/vendor/httparty/spec/httparty/request_spec.rb +203 -0
  60. data/vendor/httparty/spec/httparty/response_spec.rb +53 -0
  61. data/vendor/httparty/spec/httparty_spec.rb +259 -0
  62. data/vendor/httparty/spec/spec.opts +3 -0
  63. data/vendor/httparty/spec/spec_helper.rb +21 -0
  64. data/vendor/httparty/spec/string_spec.rb +29 -0
  65. data/vendor/httparty/website/css/common.css +47 -0
  66. data/vendor/httparty/website/index.html +74 -0
  67. metadata +141 -0
@@ -0,0 +1,37 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{httparty}
5
+ s.version = "0.3.2"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["John Nunemaker"]
9
+ s.date = %q{2009-02-10}
10
+ s.default_executable = %q{httparty}
11
+ s.description = %q{Makes http fun! Also, makes consuming restful web services dead easy.}
12
+ s.email = %q{nunemaker@gmail.com}
13
+ s.executables = ["httparty"]
14
+ s.extra_rdoc_files = ["bin/httparty", "lib/core_extensions.rb", "lib/httparty/cookie_hash.rb", "lib/httparty/exceptions.rb", "lib/httparty/module_inheritable_attributes.rb", "lib/httparty/parsers/json.rb", "lib/httparty/parsers/xml.rb", "lib/httparty/parsers.rb", "lib/httparty/request.rb", "lib/httparty/response.rb", "lib/httparty/version.rb", "lib/httparty.rb", "README"]
15
+ s.files = ["bin/httparty", "cucumber.yml", "examples/aaws.rb", "examples/basic.rb", "examples/delicious.rb", "examples/google.rb", "examples/rubyurl.rb", "examples/twitter.rb", "examples/whoismyrep.rb", "features/basic_authentication.feature", "features/command_line.feature", "features/deals_with_http_error_codes.feature", "features/handles_multiple_formats.feature", "features/steps/env.rb", "features/steps/httparty_response_steps.rb", "features/steps/httparty_steps.rb", "features/steps/mongrel_helper.rb", "features/steps/remote_service_steps.rb", "features/supports_redirection.feature", "History", "httparty.gemspec", "lib/core_extensions.rb", "lib/httparty/cookie_hash.rb", "lib/httparty/exceptions.rb", "lib/httparty/module_inheritable_attributes.rb", "lib/httparty/parsers/json.rb", "lib/httparty/parsers/xml.rb", "lib/httparty/parsers.rb", "lib/httparty/request.rb", "lib/httparty/response.rb", "lib/httparty/version.rb", "lib/httparty.rb", "Manifest", "MIT-LICENSE", "Rakefile", "README", "setup.rb", "spec/fixtures/delicious.xml", "spec/fixtures/empty.xml", "spec/fixtures/google.html", "spec/fixtures/twitter.json", "spec/fixtures/twitter.xml", "spec/fixtures/undefined_method_add_node_for_nil.xml", "spec/hash_spec.rb", "spec/httparty/cookie_hash_spec.rb", "spec/httparty/parsers/json_spec.rb", "spec/httparty/parsers/xml_spec.rb", "spec/httparty/request_spec.rb", "spec/httparty/response_spec.rb", "spec/httparty_spec.rb", "spec/spec.opts", "spec/spec_helper.rb", "spec/string_spec.rb", "website/css/common.css", "website/index.html"]
16
+ s.has_rdoc = true
17
+ s.homepage = %q{http://httparty.rubyforge.org}
18
+ s.post_install_message = %q{When you HTTParty, you must party hard!}
19
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Httparty", "--main", "README"]
20
+ s.require_paths = ["lib"]
21
+ s.rubyforge_project = %q{httparty}
22
+ s.rubygems_version = %q{1.3.1}
23
+ s.summary = %q{Makes http fun! Also, makes consuming restful web services dead easy.}
24
+
25
+ if s.respond_to? :specification_version then
26
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
27
+ s.specification_version = 2
28
+
29
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
30
+ s.add_development_dependency(%q<echoe>, [">= 0"])
31
+ else
32
+ s.add_dependency(%q<echoe>, [">= 0"])
33
+ end
34
+ else
35
+ s.add_dependency(%q<echoe>, [">= 0"])
36
+ end
37
+ end
@@ -0,0 +1,189 @@
1
+ require 'time'
2
+
3
+ # Copyright (c) 2008 Sam Smoot.
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining
6
+ # a copy of this software and associated documentation files (the
7
+ # "Software"), to deal in the Software without restriction, including
8
+ # without limitation the rights to use, copy, modify, merge, publish,
9
+ # distribute, sublicense, and/or sell copies of the Software, and to
10
+ # permit persons to whom the Software is furnished to do so, subject to
11
+ # the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be
14
+ # included in all copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
+
24
+ class Object #:nodoc:
25
+ # @return <TrueClass, FalseClass>
26
+ #
27
+ # @example [].blank? #=> true
28
+ # @example [1].blank? #=> false
29
+ # @example [nil].blank? #=> false
30
+ #
31
+ # Returns true if the object is nil or empty (if applicable)
32
+ def blank?
33
+ nil? || (respond_to?(:empty?) && empty?)
34
+ end unless method_defined?(:blank?)
35
+ end # class Object
36
+
37
+ class Numeric #:nodoc:
38
+ # @return <TrueClass, FalseClass>
39
+ #
40
+ # Numerics can't be blank
41
+ def blank?
42
+ false
43
+ end unless method_defined?(:blank?)
44
+ end # class Numeric
45
+
46
+ class NilClass #:nodoc:
47
+ # @return <TrueClass, FalseClass>
48
+ #
49
+ # Nils are always blank
50
+ def blank?
51
+ true
52
+ end unless method_defined?(:blank?)
53
+ end # class NilClass
54
+
55
+ class TrueClass #:nodoc:
56
+ # @return <TrueClass, FalseClass>
57
+ #
58
+ # True is not blank.
59
+ def blank?
60
+ false
61
+ end unless method_defined?(:blank?)
62
+ end # class TrueClass
63
+
64
+ class FalseClass #:nodoc:
65
+ # False is always blank.
66
+ def blank?
67
+ true
68
+ end unless method_defined?(:blank?)
69
+ end # class FalseClass
70
+
71
+ class String #:nodoc:
72
+ # @example "".blank? #=> true
73
+ # @example " ".blank? #=> true
74
+ # @example " hey ho ".blank? #=> false
75
+ #
76
+ # @return <TrueClass, FalseClass>
77
+ #
78
+ # Strips out whitespace then tests if the string is empty.
79
+ def blank?
80
+ strip.empty?
81
+ end unless method_defined?(:blank?)
82
+
83
+ def snake_case
84
+ return self.downcase if self =~ /^[A-Z]+$/
85
+ self.gsub(/([A-Z]+)(?=[A-Z][a-z]?)|\B[A-Z]/, '_\&') =~ /_*(.*)/
86
+ return $+.downcase
87
+ end unless method_defined?(:snake_case)
88
+ end # class String
89
+
90
+ class Hash #:nodoc:
91
+ # @return <String> This hash as a query string
92
+ #
93
+ # @example
94
+ # { :name => "Bob",
95
+ # :address => {
96
+ # :street => '111 Ruby Ave.',
97
+ # :city => 'Ruby Central',
98
+ # :phones => ['111-111-1111', '222-222-2222']
99
+ # }
100
+ # }.to_params
101
+ # #=> "name=Bob&address[city]=Ruby Central&address[phones][]=111-111-1111&address[phones][]=222-222-2222&address[street]=111 Ruby Ave."
102
+ def to_params
103
+ params = self.map { |k,v| normalize_param(k,v) }.join
104
+ params.chop! # trailing &
105
+ params
106
+ end
107
+
108
+ # @param key<Object> The key for the param.
109
+ # @param value<Object> The value for the param.
110
+ #
111
+ # @return <String> This key value pair as a param
112
+ #
113
+ # @example normalize_param(:name, "Bob Jones") #=> "name=Bob%20Jones&"
114
+ def normalize_param(key, value)
115
+ param = ''
116
+ stack = []
117
+
118
+ if value.is_a?(Array)
119
+ param << value.map { |element| normalize_param("#{key}[]", element) }.join
120
+ elsif value.is_a?(Hash)
121
+ stack << [key,value]
122
+ else
123
+ param << "#{key}=#{URI.encode(value.to_s, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))}&"
124
+ end
125
+
126
+ stack.each do |parent, hash|
127
+ hash.each do |key, value|
128
+ if value.is_a?(Hash)
129
+ stack << ["#{parent}[#{key}]", value]
130
+ else
131
+ param << normalize_param("#{parent}[#{key}]", value)
132
+ end
133
+ end
134
+ end
135
+
136
+ param
137
+ end
138
+
139
+ # @return <String> The hash as attributes for an XML tag.
140
+ #
141
+ # @example
142
+ # { :one => 1, "two"=>"TWO" }.to_xml_attributes
143
+ # #=> 'one="1" two="TWO"'
144
+ def to_xml_attributes
145
+ map do |k,v|
146
+ %{#{k.to_s.snake_case.sub(/^(.{1,1})/) { |m| m.downcase }}="#{v}"}
147
+ end.join(' ')
148
+ end
149
+ end
150
+
151
+ class BlankSlate #:nodoc:
152
+ instance_methods.each { |m| undef_method m unless m =~ /^__|^object_id$/ }
153
+ end
154
+
155
+ case RUBY_VERSION
156
+ when '1.8.6'
157
+ # 1.8.6 has mistyping of transitive in if statement
158
+ require "rexml/document"
159
+ module REXML #:nodoc:
160
+ class Document < Element #:nodoc:
161
+ undef :write
162
+ def write( output=$stdout, indent=-1, transitive=false, ie_hack=false )
163
+ if xml_decl.encoding != "UTF-8" && !output.kind_of?(Output)
164
+ output = Output.new( output, xml_decl.encoding )
165
+ end
166
+ formatter = if indent > -1
167
+ if transitive
168
+ REXML::Formatters::Transitive.new( indent, ie_hack )
169
+ else
170
+ REXML::Formatters::Pretty.new( indent, ie_hack )
171
+ end
172
+ else
173
+ REXML::Formatters::Default.new( ie_hack )
174
+ end
175
+ formatter.write( self, output )
176
+ end
177
+ end
178
+ end
179
+
180
+ # clean up "using default DH parameters" warning for https
181
+ require 'net/https'
182
+ class Net::HTTP
183
+ alias :old_use_ssl= :use_ssl=
184
+ def use_ssl= flag
185
+ self.old_use_ssl = flag
186
+ @ssl_context.tmp_dh_callback = proc {} if @ssl_context
187
+ end
188
+ end
189
+ end
@@ -0,0 +1,201 @@
1
+ $:.unshift(File.dirname(__FILE__))
2
+
3
+ require 'net/http'
4
+ require 'net/https'
5
+ require 'core_extensions'
6
+ require 'httparty/module_inheritable_attributes'
7
+
8
+ module HTTParty
9
+
10
+ AllowedFormats = {
11
+ 'text/xml' => :xml,
12
+ 'application/xml' => :xml,
13
+ 'application/json' => :json,
14
+ 'text/json' => :json,
15
+ 'application/javascript' => :json,
16
+ 'text/javascript' => :json,
17
+ 'text/html' => :html,
18
+ 'application/x-yaml' => :yaml,
19
+ 'text/yaml' => :yaml
20
+ } unless defined?(AllowedFormats)
21
+
22
+ def self.included(base)
23
+ base.extend ClassMethods
24
+ base.send :include, HTTParty::ModuleInheritableAttributes
25
+ base.send(:mattr_inheritable, :default_options)
26
+ base.instance_variable_set("@default_options", {})
27
+ end
28
+
29
+ module ClassMethods
30
+ # Allows setting http proxy information to be used
31
+ #
32
+ # class Foo
33
+ # include HTTParty
34
+ # http_proxy 'http://foo.com', 80
35
+ # end
36
+ def http_proxy(addr=nil, port = nil)
37
+ default_options[:http_proxyaddr] = addr
38
+ default_options[:http_proxyport] = port
39
+ end
40
+
41
+ # Allows setting a base uri to be used for each request.
42
+ # Will normalize uri to include http, etc.
43
+ #
44
+ # class Foo
45
+ # include HTTParty
46
+ # base_uri 'twitter.com'
47
+ # end
48
+ def base_uri(uri=nil)
49
+ return default_options[:base_uri] unless uri
50
+ default_options[:base_uri] = HTTParty.normalize_base_uri(uri)
51
+ end
52
+
53
+ # Allows setting basic authentication username and password.
54
+ #
55
+ # class Foo
56
+ # include HTTParty
57
+ # basic_auth 'username', 'password'
58
+ # end
59
+ def basic_auth(u, p)
60
+ default_options[:basic_auth] = {:username => u, :password => p}
61
+ end
62
+
63
+ # Allows setting default parameters to be appended to each request.
64
+ # Great for api keys and such.
65
+ #
66
+ # class Foo
67
+ # include HTTParty
68
+ # default_params :api_key => 'secret', :another => 'foo'
69
+ # end
70
+ def default_params(h={})
71
+ raise ArgumentError, 'Default params must be a hash' unless h.is_a?(Hash)
72
+ default_options[:default_params] ||= {}
73
+ default_options[:default_params].merge!(h)
74
+ end
75
+
76
+ # Allows setting a base uri to be used for each request.
77
+ #
78
+ # class Foo
79
+ # include HTTParty
80
+ # headers 'Accept' => 'text/html'
81
+ # end
82
+ def headers(h={})
83
+ raise ArgumentError, 'Headers must be a hash' unless h.is_a?(Hash)
84
+ default_options[:headers] ||= {}
85
+ default_options[:headers].merge!(h)
86
+ end
87
+
88
+ def cookies(h={})
89
+ raise ArgumentError, 'Cookies must be a hash' unless h.is_a?(Hash)
90
+ default_options[:cookies] ||= CookieHash.new
91
+ default_options[:cookies].add_cookies(h)
92
+ end
93
+
94
+ # Allows setting the format with which to parse.
95
+ # Must be one of the allowed formats ie: json, xml
96
+ #
97
+ # class Foo
98
+ # include HTTParty
99
+ # format :json
100
+ # end
101
+ def format(f)
102
+ raise UnsupportedFormat, "Must be one of: #{AllowedFormats.values.join(', ')}" unless AllowedFormats.value?(f)
103
+ default_options[:format] = f
104
+ end
105
+
106
+ # Allows making a get request to a url.
107
+ #
108
+ # class Foo
109
+ # include HTTParty
110
+ # end
111
+ #
112
+ # # Simple get with full url
113
+ # Foo.get('http://foo.com/resource.json')
114
+ #
115
+ # # Simple get with full url and query parameters
116
+ # # ie: http://foo.com/resource.json?limit=10
117
+ # Foo.get('http://foo.com/resource.json', :query => {:limit => 10})
118
+ def get(path, options={})
119
+ perform_request Net::HTTP::Get, path, options
120
+ end
121
+
122
+ # Allows making a post request to a url.
123
+ #
124
+ # class Foo
125
+ # include HTTParty
126
+ # end
127
+ #
128
+ # # Simple post with full url and setting the body
129
+ # Foo.post('http://foo.com/resources', :body => {:bar => 'baz'})
130
+ #
131
+ # # Simple post with full url using :query option,
132
+ # # which gets set as form data on the request.
133
+ # Foo.post('http://foo.com/resources', :query => {:bar => 'baz'})
134
+ def post(path, options={})
135
+ perform_request Net::HTTP::Post, path, options
136
+ end
137
+
138
+ def put(path, options={})
139
+ perform_request Net::HTTP::Put, path, options
140
+ end
141
+
142
+ def delete(path, options={})
143
+ perform_request Net::HTTP::Delete, path, options
144
+ end
145
+
146
+ def default_options #:nodoc:
147
+ @default_options
148
+ end
149
+
150
+ private
151
+ def perform_request(http_method, path, options) #:nodoc:
152
+ process_cookies(options)
153
+ Request.new(http_method, path, default_options.dup.merge(options)).perform
154
+ end
155
+
156
+ def process_cookies(options) #:nodoc:
157
+ return unless options[:cookies] || default_options[:cookies]
158
+ options[:headers] ||= {}
159
+ options[:headers]["cookie"] = cookies(options[:cookies] || {}).to_cookie_string
160
+
161
+ default_options.delete(:cookies)
162
+ options.delete(:cookies)
163
+ end
164
+ end
165
+
166
+ def self.normalize_base_uri(url) #:nodoc:
167
+ use_ssl = (url =~ /^https/) || url.include?(':443')
168
+ ends_with_slash = url =~ /\/$/
169
+
170
+ url.chop! if ends_with_slash
171
+ url.gsub!(/^https?:\/\//i, '')
172
+
173
+ "http#{'s' if use_ssl}://#{url}"
174
+ end
175
+
176
+ class Basement #:nodoc:
177
+ include HTTParty
178
+ end
179
+
180
+ def self.get(*args)
181
+ Basement.get(*args)
182
+ end
183
+
184
+ def self.post(*args)
185
+ Basement.post(*args)
186
+ end
187
+
188
+ def self.put(*args)
189
+ Basement.put(*args)
190
+ end
191
+
192
+ def self.delete(*args)
193
+ Basement.delete(*args)
194
+ end
195
+ end
196
+
197
+ require 'httparty/cookie_hash'
198
+ require 'httparty/exceptions'
199
+ require 'httparty/request'
200
+ require 'httparty/response'
201
+ require 'httparty/parsers'
@@ -0,0 +1,9 @@
1
+ class HTTParty::CookieHash < Hash #:nodoc:
2
+ def add_cookies(hash)
3
+ merge!(hash)
4
+ end
5
+
6
+ def to_cookie_string
7
+ collect { |k, v| "#{k}=#{v}" }.join("; ")
8
+ end
9
+ end
@@ -0,0 +1,7 @@
1
+ module HTTParty
2
+ # Exception raised when you attempt to set a non-existant format
3
+ class UnsupportedFormat < StandardError; end
4
+
5
+ # Exception that is raised when request has redirected too many times
6
+ class RedirectionTooDeep < StandardError; end
7
+ end