httprb 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,14 @@
1
+ require 'httprb/dsl'
2
+ require 'httprb/delegate'
3
+
4
+ module HTTPrb
5
+ require 'httprb/version'
6
+
7
+ begin
8
+ require 'net/https'
9
+ rescue LoadError
10
+ $stderr << "HTTPS not found- disabled"
11
+ end
12
+ end
13
+
14
+ include HTTPrb::Delegator
@@ -0,0 +1,75 @@
1
+ # Delegator
2
+ #
3
+ # inspired by Sinatra, required to play nicely with Sinatra
4
+ # (and any other colliding namespace).
5
+ #
6
+ # It is important to note that all methods defined by HTTPrb
7
+ # (get, head, put, post, delete), if defined by the programmer
8
+ # or by an included module (ahem, Sinatra), Delegator will
9
+ # alias them to a dispatch method, which will do the following:
10
+ # 1. print a warning to the user that a collision was
11
+ # deteted and handled.
12
+ # 2. tell the user how to call HTTPrb's methods
13
+ # 3. call the original method (not HTTPrb's)
14
+
15
+ require 'irb/completion'
16
+
17
+ module HTTPrb
18
+
19
+ module Delegator
20
+ def self.delegate_collision(method)
21
+ ENV['HTTPRB_COLLISION_PREFIX'] ||= 'client_'
22
+ ENV['HTTPRB_IGNORE_COLLISIONS'] ||= 'true'
23
+ eval <<-RUBY, binding, '(__DELEGATE__)', 1
24
+ alias_method #{method.inspect}_original, #{method.inspect}
25
+
26
+ def #{method}(*args, &b)
27
+ if ENV['HTTPRB_IGNORE_COLLISIONS'] == 'true'
28
+ puts "WARNING: Namespace collision detected"
29
+ puts "HTTPrb::#{method} has been renamed to #{ENV['HTTPRB_COLLISION_PREFIX']}#{method}"
30
+ puts "To disable this message, set HTTPRB_IGNORE_COLLISIONS to false"
31
+ end
32
+ #{method}_original(*args, &b)
33
+ end
34
+
35
+ def #{ENV['HTTPRB_COLLISION_PREFIX']}#{method}(*args, &b)
36
+ ::HTTPrb.send(#{method.inspect}, *args, &b)
37
+ end
38
+ private #{method.inspect}
39
+ RUBY
40
+ end
41
+
42
+ def self.collides?(method)
43
+ unless Object.const_defined?(:IRB) and IRB.respond_to?(:conf)
44
+ eval <<-RUBY
45
+ module ::IRB
46
+ def IRB.binding
47
+ #{binding}
48
+ end
49
+ def IRB.workspace; IRB; end
50
+ def IRB.conf; {:MAIN_CONTEXT => IRB}; end
51
+ end
52
+ RUBY
53
+ end
54
+ ::IRB::InputCompletor::CompletionProc.call(method.to_s).include?(method.to_s)
55
+ end
56
+
57
+ def self.delegate(*methods)
58
+ methods.each do |method_name|
59
+ if self.collides?(method_name)
60
+ self.delegate_collision(method_name)
61
+ else
62
+ eval <<-RUBY, binding, '(__DELEGATE__)', 1
63
+ def #{method_name}(*args, &b)
64
+ ::HTTPrb.send(#{method_name.inspect}, *args, &b)
65
+ end
66
+ private #{method_name.inspect}
67
+ RUBY
68
+ end
69
+ end
70
+ end
71
+
72
+ delegate :get, :put, :post, :delete, :head
73
+ end
74
+
75
+ end
@@ -0,0 +1,91 @@
1
+ # where the magic happens
2
+
3
+ # this mixin sets up the DSL, wrapping net/http for
4
+ # your programming pleasure
5
+
6
+ # note that each of the following methods accepts a
7
+ # block- this is the beauty of the whole thing.
8
+
9
+ # if you're wondering about the code duplication, read:
10
+ #
11
+ # http://blog.sidu.in/2007/11/ruby-blocks-gotchas.html
12
+ #
13
+ # implicit invocation of blocks is just faster. so we
14
+ # duplicate code. :(
15
+
16
+ require 'httprb/request'
17
+ require 'httprb/http_cache'
18
+
19
+ module HTTPrb
20
+ public
21
+ # get request
22
+ #
23
+ # * options are not generally used; HTTPrb::Request
24
+ # offers additional methods for option generation/
25
+ # handling.
26
+ # * accepts a block, handing off the HTTPrb::Request
27
+ # object to it, if provided.
28
+ def HTTPrb.get(url, options = {})
29
+ options[:type] = 'GET'
30
+ req = Request.new(url, options)
31
+ yield(req) if block_given?
32
+ HTTPrb::HTTPCache.instance.make_request(req)
33
+ end
34
+
35
+ # head request
36
+ #
37
+ # * options are not generally used; HTTPrb::Request
38
+ # offers additional methods for option generation/
39
+ # handling.
40
+ # * accepts a block, handing off the HTTPrb::Request
41
+ # object to it, if provided.
42
+ def HTTPrb.head(url, options = {})
43
+ options[:type] = 'HEAD'
44
+ req = Request.new(url, options)
45
+ yield(req) if block_given?
46
+ HTTPrb::HTTPCache.instance.make_request(req)
47
+ end
48
+
49
+ # post request
50
+ #
51
+ # * options are not generally used; HTTPrb::Request
52
+ # offers additional methods for option generation/
53
+ # handling.
54
+ # * accepts a block, handing off the HTTPrb::Request
55
+ # object to it, if provided.
56
+ def HTTPrb.post(url, options = {})
57
+ options[:type] = 'POST'
58
+ req = Request.new(url, options)
59
+ yield(req) if block_given?
60
+ HTTPrb::HTTPCache.instance.make_request(req)
61
+ end
62
+
63
+ # put request
64
+ #
65
+ # * options are not generally used; HTTPrb::Request
66
+ # offers additional methods for option generation/
67
+ # handling.
68
+ # * accepts a block, handing off the HTTPrb::Request
69
+ # object to it, if provided.
70
+ def HTTPrb.put(url, options = {})
71
+ options[:type] = 'PUT'
72
+ req = Request.new(url, options)
73
+ yield(req) if block_given?
74
+ HTTPrb::HTTPCache.instance.make_request(req)
75
+ end
76
+
77
+ # delete request
78
+ #
79
+ # * options are not generally used; HTTPrb::Request
80
+ # offers additional methods for option generation/
81
+ # handling.
82
+ # * accepts a block, handing off the HTTPrb::Request
83
+ # object to it, if provided.
84
+ def HTTPrb.delete(url, options = {})
85
+ options[:type] = 'DELETE'
86
+ req = Request.new(url, options)
87
+ yield(req) if block_given?
88
+ HTTPrb::HTTPCache.instance.make_request(req)
89
+ end
90
+
91
+ end
@@ -0,0 +1,33 @@
1
+ # a bit of insanity. a singleton representation
2
+ # of a Net::HTTP object. provides connection
3
+ # caching when the host is the same. no real
4
+ # benefit when changing servers (the underlying
5
+ # connection changes when changing servers, no
6
+ # way around that).
7
+
8
+ require 'singleton'
9
+ require 'net/http'
10
+ require 'net/https'
11
+
12
+ module HTTPrb
13
+
14
+ class HTTPCache
15
+ include Singleton
16
+ attr_reader :http
17
+
18
+ # accepts an HTTPrb::Request object, performs
19
+ # the request, and returns the Net::HTTP result
20
+ def make_request(req)
21
+ if @http && @http.address == req.uri.host && !@http.started?
22
+ @http.start
23
+ else
24
+ @http = Net::HTTP.new(req.uri.host, req.uri.port)
25
+ @http.use_ssl = req.ssl?
26
+ @http.set_debug_output($stderr) if req.debug
27
+ @http.start
28
+ end
29
+ @http.request(req.http_request)
30
+ end
31
+ end
32
+
33
+ end
@@ -0,0 +1,160 @@
1
+ # more magic found here.
2
+
3
+ # HTTPrb::Request is where most of the actual
4
+ # functionality is provided. URI parsing,
5
+ # Net::HTTP::Request generation, etc., are all
6
+ # handled here.
7
+
8
+ require 'uri'
9
+ require 'cgi'
10
+
11
+ module HTTPrb
12
+
13
+ class Request
14
+ attr_accessor :uri, :headers, :parameters, :ssl, :debug
15
+ attr_reader :options
16
+
17
+ # create an HTTPrb::Request object
18
+ #
19
+ # the uri can be formatted however is most
20
+ # convenient to you- if the scheme (http://)
21
+ # is provided, it will be respected. if not
22
+ # provided, the default is http.
23
+ #
24
+ # if https:// is given as the scheme and the
25
+ # necesary openssl library is installed
26
+ # (meaning "require 'net/http'" doesn't fail)
27
+ # then ssl will be used.
28
+ #
29
+ # note that the 'options' parameter is only
30
+ # truly useful (or good) when not passing a
31
+ # block to the DSL. when a block is provided,
32
+ # using the accessor methods for each option
33
+ # (headers, parameters, etc.) is vastly
34
+ # preferred.
35
+ def initialize(uri, options = {})
36
+ if uri.is_a? URI
37
+ @uri = uri
38
+ elsif uri.is_a? String
39
+ @uri = URI.parse(uri)
40
+ if !@uri.scheme
41
+ @uri = URI.parse("http://" + uri)
42
+ end
43
+ else
44
+ raise Exception, "Invalid URL"
45
+ end
46
+ @uri.path = "/" if @uri.path.empty?
47
+ @ssl = true if @uri.scheme == "https"
48
+
49
+ @options = options
50
+ @options[:type] = 'GET' unless @options[:type]
51
+ @debug = options[:debug] ? true : false
52
+
53
+ @parameters = {}
54
+ if @uri.query
55
+ CGI.parse(@uri.query).each do |k,v|
56
+ if v.length == 1
57
+ @parameters[k] = v.first
58
+ else
59
+ @parameters[k] = v
60
+ end
61
+ end
62
+ end
63
+ @headers = {}
64
+ end
65
+
66
+ # sets up HTTP basic auth- identical to
67
+ # Net::HTTP request objects.
68
+ def basic_auth(user, pass)
69
+ @options[:basic_auth] = true
70
+ @options[:user] = user
71
+ @options[:pass] = pass
72
+ end
73
+
74
+ # set or add to a query parameter key/value pair
75
+ # if you wish to set multiple values for a key,
76
+ # provide an array of values as the second argument.
77
+ def parameter(key, value = nil)
78
+ @parameters[key] = value
79
+ end
80
+
81
+ # set a header key/value pair
82
+ def header(key, value)
83
+ if @headers[key]
84
+ if @headers[key].is_a? Array
85
+ @headers[key] << value
86
+ else
87
+ cur = @headers[key]
88
+ @headers[key] = [cur, value]
89
+ end
90
+ else
91
+ @headers[key] = value
92
+ end
93
+ end
94
+
95
+ # generates the query string based on the provided
96
+ # parameter dictionary
97
+ def query_string
98
+ if !@parameters.empty?
99
+ # this is crabby because query strings can have more than
100
+ # one value per key- the key, in that case, is simply
101
+ # repeated with the additional value.
102
+ queries = []
103
+ @parameters.each do |k,v|
104
+ if v.is_a?(Array)
105
+ v.each {|val| queries << "#{k}=#{CGI.escape(val.to_s)}"}
106
+ else
107
+ queries << "#{k}=#{CGI.escape(v.to_s)}"
108
+ end
109
+ end
110
+ return queries.join('&')
111
+ end
112
+ return ""
113
+ end
114
+
115
+ # generates a Net::HTTP request object. for use
116
+ # when the request is passed to Net::HTTP.
117
+ def http_request
118
+ path = "#{@uri.path}?#{query_string}"
119
+ http_req = case @options[:type].upcase
120
+ when 'GET'
121
+ Net::HTTP::Get.new(path)
122
+ when 'POST'
123
+ Net::HTTP::Post.new(path)
124
+ when 'PUT'
125
+ Net::HTTP::Put.new(path)
126
+ when 'HEAD'
127
+ Net::HTTP::Head.new(path)
128
+ when 'DELETE'
129
+ Net::HTTP::Delete.new(path)
130
+ else
131
+ Net::HTTP::Get.new(path)
132
+ end
133
+ if @options[:basic_auth] && @options[:user] && @options[:pass]
134
+ http_req.basic_auth(@options[:user], @options[:pass])
135
+ end
136
+
137
+ @headers.each do |key, value|
138
+ if value.is_a? Array
139
+ value.each {|v| http_req.add_field(key, v)}
140
+ else
141
+ http_req.add_field(key, value)
142
+ end
143
+ end
144
+
145
+ return http_req
146
+ end
147
+
148
+ # yep, you got it. we're messing with your mind
149
+ # here. nothing to see here, move along...
150
+ def method_missing(method)
151
+ if method == :"ssl?"
152
+ return @ssl
153
+ elsif @options.keys.include?(method)
154
+ return @options[method]
155
+ end
156
+ super
157
+ end
158
+ end
159
+
160
+ end
@@ -0,0 +1,8 @@
1
+ module HTTPrb
2
+ # HTTPrb version
3
+ VERSION = '0.1.3'
4
+ VERSION_ARRAY = VERSION.split(/\./).map { |x| x.to_i } # :nodoc:
5
+ VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
6
+ VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
7
+ VERSION_BUILD = VERSION_ARRAY[2] # :nodoc:
8
+ end
@@ -0,0 +1,30 @@
1
+ require 'test/unit'
2
+
3
+ $:.unshift File.join(File.dirname(File.dirname(__FILE__)), 'lib')
4
+ require 'httprb'
5
+
6
+ class TestDSL < Test::Unit::TestCase
7
+ def setup
8
+ end
9
+
10
+ def teardown
11
+ end
12
+
13
+ def test_collisions
14
+ assert_not_nil res = client_get('http://mozy.com')
15
+ assert_not_nil res = client_head('mozy.com')
16
+ assert_not_nil res = client_put('mozy.com')
17
+ assert_not_nil res = client_post('mozy.com')
18
+ assert_not_nil res = client_delete('mozy.com')
19
+ end
20
+
21
+ def test_custom_prefix
22
+ ENV['HTTPRB_COLLISION_PREFIX'] = 'my_client'
23
+ load 'httprb.rb'
24
+ assert_not_nil res = my_client_get('mozy.com')
25
+ assert_not_nil res = my_client_head('mozy.com')
26
+ assert_not_nil res = my_client_put('mozy.com')
27
+ assert_not_nil res = my_client_post('mozy.com')
28
+ assert_not_nil res = my_client_delete('mozy.com')
29
+ end
30
+ end
@@ -0,0 +1,124 @@
1
+ require 'test/unit'
2
+
3
+ $:.unshift File.join(File.dirname(File.dirname(__FILE__)), 'lib')
4
+ require 'httprb'
5
+
6
+ class TestDSL < Test::Unit::TestCase
7
+ def setup
8
+ end
9
+
10
+ def teardown
11
+ end
12
+
13
+ def test_get_urls
14
+ assert_not_nil res = get('http://mozy.com')
15
+ assert_not_nil res = get('mozy.com')
16
+ end
17
+
18
+ def test_get
19
+ assert_not_nil res = get('http://mozy.com')
20
+ assert res.code =~ /2[0-9].|3[0-9]./
21
+ end
22
+
23
+ def test_get_block
24
+ res = get 'http://google.com' do |req|
25
+ assert_not_nil req
26
+ assert req.options[:type] == 'GET'
27
+ assert req.uri.host = 'mozy.com'
28
+ end
29
+ assert_not_nil res
30
+ assert res.code =~ /2[0-9].|3[0-9]./
31
+ end
32
+
33
+ def test_get_ssl
34
+ assert_not_nil res = get('https://mozy.com/', {:use_ssl => true})
35
+ assert res.code =~ /2[0-9].|3[0-9]./
36
+ end
37
+
38
+ def test_get_ssl_block
39
+ res = get 'https://mozy.com/' do |req|
40
+ assert_not_nil req
41
+ assert req.options[:type] == 'GET'
42
+ assert req.uri.host = 'mozy.com'
43
+ end
44
+ assert res.code =~ /2[0-9].|3[0-9]./
45
+ end
46
+
47
+ def test_head
48
+ assert_not_nil res = head('http://mozy.com')
49
+ assert res.code =~ /2[0-9].|3[0-9]./
50
+ end
51
+
52
+ def test_head_block
53
+ res = head 'http://google.com' do |req|
54
+ assert_not_nil req
55
+ assert req.options[:type] == 'HEAD'
56
+ assert req.uri.host = 'mozy.com'
57
+ end
58
+ assert_not_nil res
59
+ assert res.code =~ /2[0-9].|3[0-9]./
60
+ end
61
+
62
+ def test_put
63
+ assert_not_nil res = put('http://mozy.com')
64
+ assert res.code =~ /2[0-9].|3[0-9]./
65
+ end
66
+
67
+ def test_put_block
68
+ res = put 'http://google.com' do |req|
69
+ assert_not_nil req
70
+ assert req.options[:type] == 'PUT'
71
+ assert req.uri.host = 'mozy.com'
72
+ end
73
+ assert_not_nil res
74
+ assert res.code =~ /2[0-9].|3[0-9]./
75
+ end
76
+
77
+ def test_post
78
+ assert_not_nil res = post('http://mozy.com')
79
+ assert res.code =~ /2[0-9].|3[0-9]./
80
+ end
81
+
82
+ def test_post_block
83
+ res = post 'http://google.com' do |req|
84
+ assert_not_nil req
85
+ assert req.options[:type] == 'POST'
86
+ assert req.uri.host = 'mozy.com'
87
+ end
88
+ assert_not_nil res
89
+ assert res.code =~ /2[0-9].|3[0-9]./
90
+ end
91
+
92
+ def test_delete
93
+ assert_not_nil res = delete('http://mozy.com')
94
+ assert res.code =~ /2[0-9].|3[0-9]./
95
+ end
96
+
97
+ def test_delete_block
98
+ res = delete 'http://google.com' do |req|
99
+ assert_not_nil req
100
+ assert req.options[:type] == 'DELETE'
101
+ assert req.uri.host = 'mozy.com'
102
+ end
103
+ assert_not_nil res
104
+ assert res.code =~ /2[0-9].|3[0-9]./
105
+ end
106
+
107
+ def test_params
108
+ res = get 'http://mozy.com' do |req|
109
+ assert req.parameter "key", "value"
110
+ assert req.parameter "key2", "value"
111
+ assert req.parameters.include?("key")
112
+ assert req.parameters.include?("key2")
113
+ assert req.http_request.path.include?("key=value")
114
+ end
115
+ end
116
+
117
+ def test_headers
118
+ res = get 'http://mozy.com' do |req|
119
+ assert req.header "x-key", "value"
120
+ assert req.headers["x-key"] == "value"
121
+ assert req.http_request["x-key"] == "value"
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,41 @@
1
+ require 'test/unit'
2
+
3
+ require File.join(File.dirname(File.dirname(__FILE__)), 'lib/httprb/http_cache.rb')
4
+ require File.join(File.dirname(File.dirname(__FILE__)), 'lib/httprb/request.rb')
5
+
6
+ class TestHTTPCache < Test::Unit::TestCase
7
+ def setup; end
8
+ def teardown; end
9
+
10
+ def test_connection_caching
11
+ assert_not_nil cache = HTTPrb::HTTPCache.instance
12
+
13
+ # start things out with a little google...
14
+ assert_not_nil req = HTTPrb::Request.new("http://google.com")
15
+ assert_not_nil res = cache.make_request(req)
16
+ assert res.code =~ /2[0-9].|3[0-9]./
17
+ assert cache.http
18
+ assert cache.http.started?
19
+
20
+ # play it again, sam... (to test connection caching)
21
+ assert_not_nil res = cache.make_request(req)
22
+ assert res.code =~ /2[0-9].|3[0-9]./
23
+ assert cache.http
24
+ assert cache.http.started?
25
+
26
+ # try a different host- should transparently stop
27
+ # caching, start over, and make the request
28
+ assert_not_nil req = HTTPrb::Request.new("http://yahoo.com")
29
+ assert_not_nil res = cache.make_request(req)
30
+ assert res.code =~ /2[0-9].|3[0-9]./
31
+ assert cache.http
32
+ assert cache.http.started?
33
+ end
34
+
35
+ def test_ssl
36
+ assert_not_nil cache = HTTPrb::HTTPCache.instance
37
+
38
+ assert_not_nil req = HTTPrb::Request.new("https://www.bankofamerica.com")
39
+ assert_not_nil res = cache.make_request(req)
40
+ end
41
+ end
@@ -0,0 +1,53 @@
1
+ require 'test/unit'
2
+
3
+ require File.join(File.dirname(File.dirname(__FILE__)), 'lib/httprb/request.rb')
4
+ require 'net/http'
5
+
6
+ class TestRequest < Test::Unit::TestCase
7
+ def setup; end
8
+ def teardown; end
9
+
10
+ def test_request_types
11
+ assert_not_nil req = HTTPrb::Request.new('http://google.com', {:type => 'POST'})
12
+ assert req.http_request.is_a? Net::HTTP::Post
13
+ assert_not_nil req = HTTPrb::Request.new('http://google.com', {:type => 'PUT'})
14
+ assert req.http_request.is_a? Net::HTTP::Put
15
+ assert_not_nil req = HTTPrb::Request.new('http://google.com', {:type => 'HEAD'})
16
+ assert req.http_request.is_a? Net::HTTP::Head
17
+ assert_not_nil req = HTTPrb::Request.new('http://google.com', {:type => 'DELETE'})
18
+ assert req.http_request.is_a? Net::HTTP::Delete
19
+ assert_not_nil req = HTTPrb::Request.new('http://google.com', {:type => 'GET'})
20
+ assert req.http_request.is_a? Net::HTTP::Get
21
+ assert_not_nil req = HTTPrb::Request.new('http://google.com')
22
+ assert req.http_request.is_a? Net::HTTP::Get
23
+ end
24
+
25
+ def test_ssl
26
+ assert_not_nil req = HTTPrb::Request.new("https://www.bankofamerica.com")
27
+ assert req.ssl?
28
+ assert req.ssl
29
+ end
30
+
31
+ def test_paramaters
32
+ assert_not_nil req = HTTPrb::Request.new('http://localhost', {:type => 'GET'})
33
+ assert req.parameter "key", "value"
34
+ assert req.http_request.path == '/?key=value'
35
+ assert req.parameter "key", ["value", "value2"]
36
+ assert req.http_request.path == '/?key=value&key=value2' || req.http_request.path == '/?key=value2&key=value'
37
+ end
38
+
39
+ def test_query_string_params
40
+ assert_not_nil req = HTTPrb::Request.new('http://localhost?key=value&key2=value2', {:type => 'GET'})
41
+ assert req.parameters["key"] == "value"
42
+ assert req.parameters["key2"] == "value2"
43
+ assert_not_nil req = HTTPrb::Request.new('http://localhost?key=value&key=value2', {:type => 'GET'})
44
+ assert req.parameters["key"].is_a?(Array)
45
+ assert req.parameters["key"].include?('value') && req.parameters["key"].include?('value2')
46
+ end
47
+
48
+ def test_headers
49
+ assert_not_nil req = HTTPrb::Request.new('http://localhost', {:type => 'GET'})
50
+ assert(req.header "key", "value")
51
+ assert(req.http_request["key"] == "value")
52
+ end
53
+ end
metadata ADDED
@@ -0,0 +1,70 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: httprb
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 3
9
+ version: 0.1.3
10
+ platform: ruby
11
+ authors:
12
+ - thomas metge
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-11-13 00:00:00 -07:00
18
+ default_executable:
19
+ dependencies: []
20
+
21
+ description: HTTP client DSL, inspired by sinatra.
22
+ email: tom@accident-prone.com
23
+ executables: []
24
+
25
+ extensions: []
26
+
27
+ extra_rdoc_files: []
28
+
29
+ files:
30
+ - lib/httprb/delegate.rb
31
+ - lib/httprb/dsl.rb
32
+ - lib/httprb/http_cache.rb
33
+ - lib/httprb/request.rb
34
+ - lib/httprb/version.rb
35
+ - lib/httprb.rb
36
+ has_rdoc: true
37
+ homepage: http://github.com/tommetge/httprb
38
+ licenses: []
39
+
40
+ post_install_message:
41
+ rdoc_options: []
42
+
43
+ require_paths:
44
+ - lib
45
+ required_ruby_version: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ segments:
50
+ - 0
51
+ version: "0"
52
+ required_rubygems_version: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ segments:
57
+ - 0
58
+ version: "0"
59
+ requirements: []
60
+
61
+ rubyforge_project:
62
+ rubygems_version: 1.3.6
63
+ signing_key:
64
+ specification_version: 3
65
+ summary: "http the ruby way: sinatra-like http client DSL"
66
+ test_files:
67
+ - tests/disabled/test_collisions.rb
68
+ - tests/test_dsl.rb
69
+ - tests/test_http_cache.rb
70
+ - tests/test_request.rb