dagger 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0cafd73f6378598d9ce5a095b498f19239d8bf23
4
- data.tar.gz: 11dd75fb2942eb8da1f6cdcb53f33000478157f1
3
+ metadata.gz: 9359ff69009b6e529fc5a3a85b22a0c36e4749ef
4
+ data.tar.gz: aba7366cb305baef5e51fc13b2a1be735a7fc6fb
5
5
  SHA512:
6
- metadata.gz: 00aa7321875d852c6e7daad0312371455566630a7af8f21e35d011a7c9c8258c86e7956eab77baad47002585b34da8764a1cd700ac2d7191394cbc4953e14408
7
- data.tar.gz: 53677a981090e05d60c13c082eaa9e4571014c24d22df7d09e6ba4d1613f21186d3a8411ef47a39c4a530391f4c0a452a5b8c2501cfa9d27a2db0f04de568743
6
+ metadata.gz: 3b7051c44a65852facf64ce9584972f1904d962567298aa99a043b0912780bcafb767f00efdfbbbd70ddd78f57b950e83d72496b76c739c342b754518cae9346
7
+ data.tar.gz: e2f1f1fe615fb20529e9346f823dd38a7207d599102a8bd698156c657013211b3071ddaae3c5f5d3b0074da2c48f89502cf2b00880e24ef20f5fe2eaaf71a00e
@@ -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
- method = 'get'
6
+ method = if ARGV[1].nil?
7
+ 'get'
9
8
  else
10
- method = ARGV.shift
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
- # puts resp.status
28
- # puts resp.headers
29
- puts resp.body
26
+ if ARGV.include?('-I')
27
+ puts resp.status
28
+ puts resp.headers
29
+ else
30
+ puts resp.body
31
+ end
@@ -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'
@@ -21,11 +21,12 @@ require 'net/https'
21
21
  require 'base64'
22
22
 
23
23
  module Dagger
24
-
24
+
25
25
  DEFAULT_HEADERS = {
26
- 'User-Agent' => "Dagger/#{VERSION} (Ruby Net::HTTP Wrapper, like curl)"
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
@@ -1,20 +1,31 @@
1
- require 'json'
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
- JSON.parse(body)
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
@@ -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 || body
39
+ @data ||= Parsers.new(self).process
40
40
  end
41
41
 
42
42
  end
@@ -1,7 +1,7 @@
1
1
  module Dagger
2
2
  MAJOR = 0
3
- MINOR = 0
4
- PATCH = 1
3
+ MINOR = 1
4
+ PATCH = 0
5
5
 
6
6
  VERSION = [MAJOR, MINOR, PATCH].join('.')
7
- end
7
+ end
@@ -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
@@ -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 { send_request('http://www.google.com') }.not_to raise_error
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.1
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: 2014-04-03 00:00:00.000000000 Z
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: