dagger 0.0.1 → 0.1.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.
- checksums.yaml +4 -4
- data/README.md +53 -0
- data/bin/dagger +10 -8
- data/dagger.gemspec +8 -0
- data/lib/dagger.rb +9 -7
- data/lib/dagger/parsers.rb +18 -7
- data/lib/dagger/response.rb +9 -9
- data/lib/dagger/version.rb +3 -3
- data/test/parsers_spec.rb +108 -0
- data/test/requests_spec.rb +6 -6
- metadata +90 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9359ff69009b6e529fc5a3a85b22a0c36e4749ef
|
4
|
+
data.tar.gz: aba7366cb305baef5e51fc13b2a1be735a7fc6fb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3b7051c44a65852facf64ce9584972f1904d962567298aa99a043b0912780bcafb767f00efdfbbbd70ddd78f57b950e83d72496b76c739c342b754518cae9346
|
7
|
+
data.tar.gz: e2f1f1fe615fb20529e9346f823dd38a7207d599102a8bd698156c657013211b3071ddaae3c5f5d3b0074da2c48f89502cf2b00880e24ef20f5fe2eaaf71a00e
|
data/README.md
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
# Dagger
|
2
|
+
|
3
|
+
Very simple wrapper around Net::HTTP.
|
4
|
+
|
5
|
+
# Installation
|
6
|
+
|
7
|
+
In your Gemfile:
|
8
|
+
|
9
|
+
gem 'dagger'
|
10
|
+
|
11
|
+
# Usage
|
12
|
+
|
13
|
+
## `get(url)`
|
14
|
+
|
15
|
+
```rb
|
16
|
+
require 'dagger'
|
17
|
+
resp = Dagger.get('http://google.com')
|
18
|
+
|
19
|
+
puts resp.body # => "<!doctype html...>"
|
20
|
+
```
|
21
|
+
|
22
|
+
## `post(url, data)`
|
23
|
+
|
24
|
+
```rb
|
25
|
+
resp = Dagger.post('http://api.server.com', { foo: 'bar' })
|
26
|
+
puts resp.status # => 200
|
27
|
+
|
28
|
+
# if the endpoint returned a parseable content-type (e.g. 'application/json')
|
29
|
+
# then `resp.data` will return the parsed result. `body` contains the raw data.
|
30
|
+
puts resp.data # => { result: 'GREAT SUCCESS!' }
|
31
|
+
```
|
32
|
+
|
33
|
+
Same syntax applies for `put`, `patch` and `delete` requests. You can also pass options as the third param:
|
34
|
+
|
35
|
+
```rb
|
36
|
+
opts = {
|
37
|
+
follow: true, # follow redirects (10 by default)
|
38
|
+
headers: { 'Accept': 'text/xml' },
|
39
|
+
username: 'dagger', # for HTTP auth
|
40
|
+
password: 'fidelio',
|
41
|
+
open_timeout: 30,
|
42
|
+
read_timeout: 30
|
43
|
+
}
|
44
|
+
resp = Dagger.post('http://test.server.com', { payload: 1 }, opts)
|
45
|
+
```
|
46
|
+
|
47
|
+
# Credits
|
48
|
+
|
49
|
+
Written by Tomás Pollak.
|
50
|
+
|
51
|
+
# Copyright
|
52
|
+
|
53
|
+
(c) Fork, Ltd. MIT Licensed.
|
data/bin/dagger
CHANGED
@@ -1,17 +1,16 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
|
3
2
|
require 'dagger'
|
4
3
|
|
5
4
|
method = ARGV[0] or abort "Usage: dagger [method] [url] [data]"
|
6
5
|
|
7
|
-
if ARGV[1].nil?
|
8
|
-
|
6
|
+
method = if ARGV[1].nil?
|
7
|
+
'get'
|
9
8
|
else
|
10
|
-
|
9
|
+
ARGV.shift
|
11
10
|
end
|
12
11
|
|
13
12
|
def parse_data(str)
|
14
|
-
{} # not ready yet.
|
13
|
+
{} # not ready yet. TODO!
|
15
14
|
end
|
16
15
|
|
17
16
|
url = ARGV[0]
|
@@ -24,6 +23,9 @@ options = {
|
|
24
23
|
# puts "#{method} #{url}"
|
25
24
|
resp = Dagger.send(method, url, data, options)
|
26
25
|
|
27
|
-
|
28
|
-
|
29
|
-
puts resp.
|
26
|
+
if ARGV.include?('-I')
|
27
|
+
puts resp.status
|
28
|
+
puts resp.headers
|
29
|
+
else
|
30
|
+
puts resp.body
|
31
|
+
end
|
data/dagger.gemspec
CHANGED
@@ -14,6 +14,14 @@ Gem::Specification.new do |s|
|
|
14
14
|
s.required_rubygems_version = ">= 1.3.6"
|
15
15
|
s.rubyforge_project = "dagger"
|
16
16
|
|
17
|
+
s.add_development_dependency "bundler", ">= 1.0.0"
|
18
|
+
s.add_development_dependency "rspec-core"
|
19
|
+
s.add_development_dependency "rspec-mocks"
|
20
|
+
s.add_development_dependency "rspec-expectations"
|
21
|
+
|
22
|
+
s.add_runtime_dependency "oj", "~> 2.1"
|
23
|
+
s.add_runtime_dependency "ox", "~> 2.4"
|
24
|
+
|
17
25
|
s.files = `git ls-files`.split("\n")
|
18
26
|
s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
|
19
27
|
s.require_path = 'lib'
|
data/lib/dagger.rb
CHANGED
@@ -21,11 +21,12 @@ require 'net/https'
|
|
21
21
|
require 'base64'
|
22
22
|
|
23
23
|
module Dagger
|
24
|
-
|
24
|
+
|
25
25
|
DEFAULT_HEADERS = {
|
26
|
-
'
|
26
|
+
'Accept' => '*/*',
|
27
|
+
'User-Agent' => "Dagger/#{VERSION} (Ruby Net::HTTP Wrapper, like curl)"
|
27
28
|
}
|
28
|
-
|
29
|
+
|
29
30
|
def self.get(uri, query = nil, opts = {})
|
30
31
|
raise ArgumentError.new("Empty URL!") if (uri || '').strip == ''
|
31
32
|
|
@@ -46,8 +47,8 @@ module Dagger
|
|
46
47
|
opts[:follow] -= 1
|
47
48
|
return get(resp['Location'], nil, opts)
|
48
49
|
end
|
49
|
-
|
50
|
-
build_response(resp, data || resp.body) # 1.8 vs 1.9 style responses
|
50
|
+
|
51
|
+
build_response(resp, data || resp.body) # 1.8 vs 1.9 style responses
|
51
52
|
end
|
52
53
|
|
53
54
|
def self.post(uri, params = {}, options = {})
|
@@ -86,7 +87,7 @@ module Dagger
|
|
86
87
|
resp, data = client(uri, opts).send(*args)
|
87
88
|
build_response(resp, data || resp.body) # 1.8 vs 1.9 style responses
|
88
89
|
end
|
89
|
-
|
90
|
+
|
90
91
|
def self.build_response(resp, body)
|
91
92
|
resp.extend(Response)
|
92
93
|
resp.set_body(body) unless resp.body
|
@@ -101,10 +102,11 @@ module Dagger
|
|
101
102
|
http.verify_mode = opts[:verify_ssl] ? OpenSSL::SSL::VERIFY_PEER : OpenSSL::SSL::VERIFY_NONE
|
102
103
|
http
|
103
104
|
end
|
104
|
-
|
105
|
+
|
105
106
|
def self.parse_uri(uri)
|
106
107
|
uri = 'http://' + uri unless uri.to_s['http']
|
107
108
|
uri = URI.parse(uri)
|
109
|
+
raise ArgumentError.new("Invalid URI: #{uri}") unless uri.is_a?(URI::HTTP)
|
108
110
|
uri.path = '/' if uri.path == ''
|
109
111
|
uri
|
110
112
|
end
|
data/lib/dagger/parsers.rb
CHANGED
@@ -1,20 +1,31 @@
|
|
1
|
-
require '
|
1
|
+
require 'oj'
|
2
|
+
require 'ox'
|
2
3
|
|
3
4
|
class Parsers
|
4
|
-
|
5
|
+
|
5
6
|
def initialize(response)
|
6
7
|
@body = response.body
|
7
8
|
@normalized = response.content_type.to_s.sub('/', '_')
|
8
9
|
end
|
9
|
-
|
10
|
+
|
10
11
|
def process
|
11
12
|
send(@normalized, @body) if respond_to?(@normalized)
|
12
13
|
end
|
13
|
-
|
14
|
+
|
14
15
|
def application_json(body)
|
15
|
-
|
16
|
+
Oj.load(body)
|
17
|
+
rescue Oj::ParseError
|
18
|
+
nil
|
16
19
|
end
|
17
|
-
|
20
|
+
|
18
21
|
alias_method :text_javascript, :application_json
|
19
|
-
|
22
|
+
|
23
|
+
def text_xml(body)
|
24
|
+
Ox.parse(body)
|
25
|
+
rescue Ox::ParseError
|
26
|
+
nil
|
27
|
+
end
|
28
|
+
|
29
|
+
alias_method :application_xml, :text_xml
|
30
|
+
|
20
31
|
end
|
data/lib/dagger/response.rb
CHANGED
@@ -3,40 +3,40 @@ module Dagger
|
|
3
3
|
module Response
|
4
4
|
|
5
5
|
attr_reader :body
|
6
|
-
|
6
|
+
|
7
7
|
def self.extended(base)
|
8
8
|
# puts base.inspect
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
def set_body(string)
|
12
12
|
raise "Body is set!" if body
|
13
13
|
@body = string
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
def headers
|
17
17
|
to_hash # from Net::HTTPHeader module
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
def code
|
21
21
|
super.to_i
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
def content_type
|
25
25
|
self['Content-Type']
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
alias_method :status, :code
|
29
29
|
|
30
30
|
def to_s
|
31
31
|
body.to_s
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
def to_a
|
35
35
|
[code, headers, to_s]
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
def data
|
39
|
-
@data ||= Parsers.new(self).process
|
39
|
+
@data ||= Parsers.new(self).process
|
40
40
|
end
|
41
41
|
|
42
42
|
end
|
data/lib/dagger/version.rb
CHANGED
@@ -0,0 +1,108 @@
|
|
1
|
+
require './lib/dagger'
|
2
|
+
|
3
|
+
require 'rspec/mocks'
|
4
|
+
require 'rspec/expectations'
|
5
|
+
|
6
|
+
describe 'Parsers' do
|
7
|
+
|
8
|
+
def send_request
|
9
|
+
Dagger.get('http://foobar.com/test')
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:fake_http) { double('Net::HTTP') }
|
13
|
+
let(:fake_resp) { double('Net::HTTPResponse', code: 200) }
|
14
|
+
|
15
|
+
before do
|
16
|
+
allow(Net::HTTP).to receive(:new).and_return(fake_http)
|
17
|
+
allow(fake_http).to receive(:verify_mode=).and_return(true)
|
18
|
+
allow(fake_http).to receive(:request).and_return(fake_resp)
|
19
|
+
end
|
20
|
+
|
21
|
+
describe 'json' do
|
22
|
+
before do
|
23
|
+
allow(fake_resp).to receive(:content_type).and_return('application/json')
|
24
|
+
end
|
25
|
+
|
26
|
+
describe 'non matching content-type' do
|
27
|
+
before do
|
28
|
+
allow(fake_resp).to receive(:content_type).and_return('text/html')
|
29
|
+
allow(fake_resp).to receive(:body).and_return('foo')
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'returns nil' do
|
33
|
+
expect(send_request.data).to eql(nil)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe 'empty data' do
|
38
|
+
before do
|
39
|
+
allow(fake_resp).to receive(:body).and_return('')
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'returns nil' do
|
43
|
+
expect(send_request.data).to eql(nil)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe 'invalid data' do
|
48
|
+
before do
|
49
|
+
allow(fake_resp).to receive(:body).and_return('abcdef')
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'returns nil' do
|
53
|
+
expect(send_request.data).to eql(nil)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe 'valid data' do
|
58
|
+
before do
|
59
|
+
allow(fake_resp).to receive(:body).and_return('{"foo":123}')
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'returns nil' do
|
63
|
+
expect(send_request.data).to eql({'foo' => 123})
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
describe 'XML' do
|
70
|
+
before do
|
71
|
+
allow(fake_resp).to receive(:content_type).and_return('text/xml')
|
72
|
+
end
|
73
|
+
|
74
|
+
describe 'empty data' do
|
75
|
+
before do
|
76
|
+
allow(fake_resp).to receive(:body).and_return('')
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'returns nil' do
|
80
|
+
expect(send_request.data).to eql(nil)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe 'invalid data' do
|
85
|
+
before do
|
86
|
+
allow(fake_resp).to receive(:body).and_return('abcdef')
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'returns nil' do
|
90
|
+
expect(send_request.data).to eql(nil)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe 'valid data' do
|
95
|
+
before do
|
96
|
+
allow(fake_resp).to receive(:body).and_return('<xml><foo>123</foo></xml>')
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'returns nil' do
|
100
|
+
res = send_request.data
|
101
|
+
expect(res).to be_a(Ox::Element)
|
102
|
+
expect(res.foo).to be_a(Ox::Element)
|
103
|
+
expect(res.foo.text).to eql('123')
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
end
|
data/test/requests_spec.rb
CHANGED
@@ -12,7 +12,7 @@ describe 'Requests' do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
describe 'empty url' do
|
15
|
-
|
15
|
+
|
16
16
|
it 'raises error' do
|
17
17
|
expect { send_request('') }.to raise_error(ArgumentError)
|
18
18
|
end
|
@@ -20,7 +20,7 @@ describe 'Requests' do
|
|
20
20
|
end
|
21
21
|
|
22
22
|
describe 'invalid URL' do
|
23
|
-
|
23
|
+
|
24
24
|
it 'raises error' do
|
25
25
|
expect { send_request('asd123.rewqw') }.to raise_error(SocketError)
|
26
26
|
end
|
@@ -28,17 +28,17 @@ describe 'Requests' do
|
|
28
28
|
end
|
29
29
|
|
30
30
|
describe 'nonexisting host' do
|
31
|
-
|
31
|
+
|
32
32
|
it 'raises error' do
|
33
|
-
expect { send_request('http://www.foobar1234567890foobar.com/hello') }.to raise_error(SocketError)
|
33
|
+
expect { send_request('http://www.foobar1234567890foobar.com/hello') }.to raise_error(SocketError)
|
34
34
|
end
|
35
35
|
|
36
36
|
end
|
37
37
|
|
38
38
|
describe 'valid host' do
|
39
|
-
|
39
|
+
|
40
40
|
it 'works' do
|
41
|
-
expect
|
41
|
+
expect(send_request('http://www.google.com')).to be_a(Net::HTTPResponse)
|
42
42
|
end
|
43
43
|
|
44
44
|
end
|
metadata
CHANGED
@@ -1,15 +1,99 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dagger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tomás Pollak
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
11
|
+
date: 2016-11-19 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.0.0
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec-core
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec-mocks
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec-expectations
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: oj
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '2.1'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '2.1'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: ox
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '2.4'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '2.4'
|
13
97
|
description: Dagger.post(url, params).body
|
14
98
|
email:
|
15
99
|
- tomas@forkhq.com
|
@@ -20,6 +104,7 @@ extra_rdoc_files: []
|
|
20
104
|
files:
|
21
105
|
- ".gitignore"
|
22
106
|
- Gemfile
|
107
|
+
- README.md
|
23
108
|
- Rakefile
|
24
109
|
- bin/dagger
|
25
110
|
- dagger.gemspec
|
@@ -27,6 +112,7 @@ files:
|
|
27
112
|
- lib/dagger/parsers.rb
|
28
113
|
- lib/dagger/response.rb
|
29
114
|
- lib/dagger/version.rb
|
115
|
+
- test/parsers_spec.rb
|
30
116
|
- test/requests_spec.rb
|
31
117
|
homepage: https://github.com/tomas/dagger
|
32
118
|
licenses: []
|
@@ -52,3 +138,4 @@ signing_key:
|
|
52
138
|
specification_version: 4
|
53
139
|
summary: Simplified Net::HTTP wrapper.
|
54
140
|
test_files: []
|
141
|
+
has_rdoc:
|