aitch 0.1.1 → 0.1.2
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.
- checksums.yaml +4 -4
- data/.coveralls.yml +1 -0
- data/README.md +1 -0
- data/lib/aitch.rb +3 -1
- data/lib/aitch/request.rb +3 -5
- data/lib/aitch/response.rb +8 -0
- data/lib/aitch/uri.rb +43 -0
- data/lib/aitch/utils.rb +11 -0
- data/lib/aitch/version.rb +1 -1
- data/spec/aitch/request_spec.rb +21 -5
- data/spec/aitch/response_spec.rb +11 -0
- data/spec/aitch/uri_spec.rb +36 -0
- data/spec/aitch/utils_spec.rb +13 -0
- metadata +10 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 53e317f071ded556b9eff2bfbf8b222cbfc6735a
|
4
|
+
data.tar.gz: e24ee0d7e6f28c49b49b22de458f663a7776ff3e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2e19f66a240033ab32c969190dfa4994cfd6da5a6132bbd3fcc9331b4ff12f8d78193474d8be432bb206d9b59c3270657afcdc2d99ea98b93668ea3a6a2aa983
|
7
|
+
data.tar.gz: 626726af8014cbb4391c7be9da92c469cfc5519cd9f7e842ba874320e20375cfe7fcc4bd35a9e995f028856386a6c52d70218fb8d89a054aa1176fa507bb6643
|
data/.coveralls.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
service_name: travis-ci
|
data/README.md
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
[](https://travis-ci.org/fnando/aitch)
|
4
4
|
[](https://codeclimate.com/github/fnando/aitch/)
|
5
5
|
[](https://rubygems.org/gems/aitch)
|
6
|
+
[](https://coveralls.io/r/fnando/aitch)
|
6
7
|
|
7
8
|
A simple HTTP client.
|
8
9
|
|
data/lib/aitch.rb
CHANGED
@@ -3,13 +3,15 @@ require "forwardable"
|
|
3
3
|
require "json"
|
4
4
|
require "zlib"
|
5
5
|
|
6
|
+
require "aitch/utils"
|
7
|
+
require "aitch/uri"
|
6
8
|
require "aitch/namespace"
|
7
9
|
require "aitch/configuration"
|
8
10
|
require "aitch/errors"
|
9
11
|
require "aitch/request"
|
10
12
|
require "aitch/redirect"
|
11
|
-
require "aitch/response"
|
12
13
|
require "aitch/response/errors"
|
14
|
+
require "aitch/response"
|
13
15
|
require "aitch/response/body"
|
14
16
|
require "aitch/xml_parser"
|
15
17
|
require "aitch/version"
|
data/lib/aitch/request.rb
CHANGED
@@ -33,8 +33,8 @@ module Aitch
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def request
|
36
|
-
@request ||= http_method_class.new(
|
37
|
-
set_body(request)
|
36
|
+
@request ||= http_method_class.new(uri.request_uri).tap do |request|
|
37
|
+
set_body(request) if request.request_body_permitted?
|
38
38
|
set_user_agent(request)
|
39
39
|
set_gzip(request)
|
40
40
|
set_headers(request)
|
@@ -51,9 +51,7 @@ module Aitch
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def uri
|
54
|
-
@uri ||= URI.
|
55
|
-
rescue URI::InvalidURIError
|
56
|
-
raise InvalidURIError
|
54
|
+
@uri ||= URI.new(url, data, http_method_class::REQUEST_HAS_BODY)
|
57
55
|
end
|
58
56
|
|
59
57
|
def http_method_class
|
data/lib/aitch/response.rb
CHANGED
@@ -9,6 +9,14 @@ module Aitch
|
|
9
9
|
@http_response = http_response
|
10
10
|
end
|
11
11
|
|
12
|
+
ERRORS.each do |status_code, exception|
|
13
|
+
method_name = Utils.underscore(exception.name.split("::").last).gsub("_error", "")
|
14
|
+
|
15
|
+
define_method "#{method_name}?" do
|
16
|
+
code == status_code
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
12
20
|
def code
|
13
21
|
@http_response.code.to_i
|
14
22
|
end
|
data/lib/aitch/uri.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
module Aitch
|
2
|
+
class URI
|
3
|
+
extend Forwardable
|
4
|
+
|
5
|
+
def_delegators :@uri, :host, :port, :scheme
|
6
|
+
|
7
|
+
def initialize(url, data = {}, request_has_body = false)
|
8
|
+
@url = url
|
9
|
+
@data = data
|
10
|
+
@request_has_body = request_has_body
|
11
|
+
|
12
|
+
begin
|
13
|
+
@uri = ::URI.parse(url)
|
14
|
+
rescue ::URI::InvalidURIError => error
|
15
|
+
raise InvalidURIError, error
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def request_has_body?
|
20
|
+
@request_has_body
|
21
|
+
end
|
22
|
+
|
23
|
+
def path
|
24
|
+
File.join("/", @uri.path)
|
25
|
+
end
|
26
|
+
|
27
|
+
def request_uri
|
28
|
+
[path, query, fragment].compact.join("")
|
29
|
+
end
|
30
|
+
|
31
|
+
def fragment
|
32
|
+
"##{@uri.fragment}" if @uri.fragment
|
33
|
+
end
|
34
|
+
|
35
|
+
def query
|
36
|
+
query = [@uri.query]
|
37
|
+
query << ::URI.encode_www_form(@data.to_a) if !request_has_body? && @data.respond_to?(:to_a)
|
38
|
+
query = query.compact.reject(&:empty?).join("&")
|
39
|
+
|
40
|
+
"?#{query}" unless query == ""
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/aitch/utils.rb
ADDED
data/lib/aitch/version.rb
CHANGED
data/spec/aitch/request_spec.rb
CHANGED
@@ -4,7 +4,7 @@ describe Aitch::Request do
|
|
4
4
|
def build_request(options = {})
|
5
5
|
Aitch::Request.new({
|
6
6
|
request_method: "get",
|
7
|
-
url: "
|
7
|
+
url: "http://example.org",
|
8
8
|
config: Aitch::Configuration.new
|
9
9
|
}.merge(options))
|
10
10
|
end
|
@@ -50,28 +50,35 @@ describe Aitch::Request do
|
|
50
50
|
end
|
51
51
|
|
52
52
|
it "sets request body from hash" do
|
53
|
-
request = build_request(data: {a: 1}).request
|
53
|
+
request = build_request(request_method: "post", data: {a: 1}).request
|
54
54
|
expect(request.body).to eql("a=1")
|
55
55
|
end
|
56
56
|
|
57
57
|
it "sets request body from string" do
|
58
|
-
request = build_request(data: "some body").request
|
58
|
+
request = build_request(request_method: "post", data: "some body").request
|
59
59
|
expect(request.body).to eql("some body")
|
60
60
|
end
|
61
61
|
|
62
62
|
it "sets request body from to_h protocol" do
|
63
63
|
data = stub(to_h: {a: 1})
|
64
|
-
request = build_request(data: data).request
|
64
|
+
request = build_request(request_method: "post", data: data).request
|
65
65
|
expect(request.body).to eql("a=1")
|
66
66
|
end
|
67
67
|
|
68
68
|
it "sets request body from to_s protocol" do
|
69
69
|
data = stub(to_s: "some body")
|
70
|
-
request = build_request(data: data).request
|
70
|
+
request = build_request(request_method: "post", data: data).request
|
71
71
|
|
72
72
|
expect(request.body).to eql("some body")
|
73
73
|
end
|
74
74
|
|
75
|
+
it "sets query string from hash data" do
|
76
|
+
FakeWeb.register_uri :get, "http://example.org/?a=1&b=2", body: "hello"
|
77
|
+
requester = build_request(data: {a: 1, b: 2})
|
78
|
+
|
79
|
+
expect(requester.perform.body).to eql("hello")
|
80
|
+
end
|
81
|
+
|
75
82
|
it "sets default headers" do
|
76
83
|
requester = build_request
|
77
84
|
requester.config.default_headers = {"HEADER" => "VALUE"}
|
@@ -162,4 +169,13 @@ describe Aitch::Request do
|
|
162
169
|
}.to raise_error(Aitch::TooManyRedirectsError)
|
163
170
|
end
|
164
171
|
end
|
172
|
+
|
173
|
+
describe "GET requests" do
|
174
|
+
it "sets data as query string" do
|
175
|
+
FakeWeb.register_uri(:get, %r[.+], body: "")
|
176
|
+
Aitch.get("http://example.org/", a: 1, b: 2)
|
177
|
+
|
178
|
+
expect(FakeWeb.last_request.path).to eql("/?a=1&b=2")
|
179
|
+
end
|
180
|
+
end
|
165
181
|
end
|
data/spec/aitch/response_spec.rb
CHANGED
@@ -177,4 +177,15 @@ describe Aitch::Response do
|
|
177
177
|
expect(response.data).to be_a(Nokogiri::XML::Document)
|
178
178
|
end
|
179
179
|
end
|
180
|
+
|
181
|
+
Aitch::Response::ERRORS.each do |code, exception|
|
182
|
+
name = Aitch::Utils.underscore(exception.name.split("::").last).gsub("_error", "")
|
183
|
+
|
184
|
+
it "detects response as #{name}" do
|
185
|
+
config = mock
|
186
|
+
http_response = stub(code: code)
|
187
|
+
response = Aitch::Response.new(config, http_response)
|
188
|
+
expect(response.public_send("#{name}?")).to be_true
|
189
|
+
end
|
190
|
+
end
|
180
191
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Aitch::URI do
|
4
|
+
it "returns default path" do
|
5
|
+
expect(Aitch::URI.new("http://example.org").path).to eql("/")
|
6
|
+
end
|
7
|
+
|
8
|
+
it "returns defined path" do
|
9
|
+
expect(Aitch::URI.new("http://example.org/some/path").path).to eql("/some/path")
|
10
|
+
end
|
11
|
+
|
12
|
+
it "returns fragment" do
|
13
|
+
expect(Aitch::URI.new("http://example.org/#top").fragment).to eql("#top")
|
14
|
+
end
|
15
|
+
|
16
|
+
it "returns query string" do
|
17
|
+
expect(Aitch::URI.new("http://example.org/?a=1&b=2").query).to eql("?a=1&b=2")
|
18
|
+
end
|
19
|
+
|
20
|
+
it "converts data into query string" do
|
21
|
+
expect(Aitch::URI.new("http://example.org", a: 1, b: 2).query).to eql("?a=1&b=2")
|
22
|
+
end
|
23
|
+
|
24
|
+
it "merges data into query string" do
|
25
|
+
expect(Aitch::URI.new("http://example.org/?a=1&b=2", c: 3).query).to eql("?a=1&b=2&c=3")
|
26
|
+
end
|
27
|
+
|
28
|
+
it "ignores data when request has body" do
|
29
|
+
expect(Aitch::URI.new("http://example.org/", {c: 3}, true).query).to eql(nil)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "returns request uri" do
|
33
|
+
uri = Aitch::URI.new("http://example.org/some/path?a=1&b=2#hello", c: 3)
|
34
|
+
expect(uri.request_uri).to eql("/some/path?a=1&b=2&c=3#hello")
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Aitch::Utils do
|
4
|
+
describe ".underscore" do
|
5
|
+
it "replaces capital letters by underscores" do
|
6
|
+
expect(Aitch::Utils.underscore("SomeConstantName")).to eql("some_constant_name")
|
7
|
+
end
|
8
|
+
|
9
|
+
it "considers URI acronym" do
|
10
|
+
expect(Aitch::Utils.underscore("RequestURITooLong")).to eql("request_uri_too_long")
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aitch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nando Vieira
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-05-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -115,6 +115,7 @@ executables: []
|
|
115
115
|
extensions: []
|
116
116
|
extra_rdoc_files: []
|
117
117
|
files:
|
118
|
+
- .coveralls.yml
|
118
119
|
- .gitignore
|
119
120
|
- .rspec
|
120
121
|
- .travis.yml
|
@@ -132,6 +133,8 @@ files:
|
|
132
133
|
- lib/aitch/response.rb
|
133
134
|
- lib/aitch/response/body.rb
|
134
135
|
- lib/aitch/response/errors.rb
|
136
|
+
- lib/aitch/uri.rb
|
137
|
+
- lib/aitch/utils.rb
|
135
138
|
- lib/aitch/version.rb
|
136
139
|
- lib/aitch/xml_parser.rb
|
137
140
|
- spec/aitch/aitch_spec.rb
|
@@ -139,6 +142,8 @@ files:
|
|
139
142
|
- spec/aitch/namespace_spec.rb
|
140
143
|
- spec/aitch/request_spec.rb
|
141
144
|
- spec/aitch/response_spec.rb
|
145
|
+
- spec/aitch/uri_spec.rb
|
146
|
+
- spec/aitch/utils_spec.rb
|
142
147
|
- spec/aitch/xml_parser_spec.rb
|
143
148
|
- spec/spec_helper.rb
|
144
149
|
homepage: http://rubygems.org/gems/aitch
|
@@ -161,7 +166,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
161
166
|
version: '0'
|
162
167
|
requirements: []
|
163
168
|
rubyforge_project:
|
164
|
-
rubygems_version: 2.0.
|
169
|
+
rubygems_version: 2.0.3
|
165
170
|
signing_key:
|
166
171
|
specification_version: 4
|
167
172
|
summary: A simple HTTP client
|
@@ -171,5 +176,7 @@ test_files:
|
|
171
176
|
- spec/aitch/namespace_spec.rb
|
172
177
|
- spec/aitch/request_spec.rb
|
173
178
|
- spec/aitch/response_spec.rb
|
179
|
+
- spec/aitch/uri_spec.rb
|
180
|
+
- spec/aitch/utils_spec.rb
|
174
181
|
- spec/aitch/xml_parser_spec.rb
|
175
182
|
- spec/spec_helper.rb
|