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 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: