maremma 1.0.0 → 1.0.1

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: 30550938a1699f8e0e09fdf6292f3e92a23445d0
4
- data.tar.gz: 7e61b93e27de91251455a44bfc1fa7cc7c2d8abd
3
+ metadata.gz: 2afaf83b4f0e5b91eb5b2a74e56a7292919b84d4
4
+ data.tar.gz: c01ce052e14830d112fdc43e4f6f7cd2da6cfd1f
5
5
  SHA512:
6
- metadata.gz: 2aac0440dd63a4d48a8fd01ef2345d0e797df2a8ea275eb789b2e6cc96d86fc4466a5023c33f892d3282d8921f3232a63a5243402efbdc5b679c6b79c4c5e30f
7
- data.tar.gz: cb1c930340e29f9a2a30f080357aa2bedacb434b895a4dd8710c366ab8b5e36c640963212f7bf9ae51455f0134c4bcf846af40dcb0ee7dfb21b681173650d9fd
6
+ metadata.gz: 57c2cc958450f2afd128563bfe44226c9a8455cb006d40b3f413349d681347092a4128366f1248618f1211a8306e1fd945adb7cefbda57cc270e86cd89398df1
7
+ data.tar.gz: ea99d5bfd797b0823f1b6fc4ee8297a69aff7f403056fa83130c0d06da007421350008cb5dd5f1c4ae93684c7b89f4307779568f9c9a3a537fc9c6bc0d61fd37
data/Gemfile.lock CHANGED
@@ -46,6 +46,7 @@ GEM
46
46
  rack (1.6.4)
47
47
  rack-test (0.6.3)
48
48
  rack (>= 1.0)
49
+ rake (10.4.2)
49
50
  rspec (3.4.0)
50
51
  rspec-core (~> 3.4.0)
51
52
  rspec-expectations (~> 3.4.0)
@@ -76,6 +77,7 @@ DEPENDENCIES
76
77
  bundler (~> 1.0)
77
78
  maremma!
78
79
  rack-test
80
+ rake
79
81
  rspec (~> 3.4)
80
82
  vcr
81
83
  webmock
data/README.md CHANGED
@@ -23,7 +23,7 @@ gem install maremma
23
23
 
24
24
  ## Usage
25
25
  ```ruby
26
- get_result(url)
26
+ Maremma.get(url)
27
27
  ```
28
28
 
29
29
  ## License
data/lib/maremma.rb CHANGED
@@ -1 +1,119 @@
1
- require 'maremma/base'
1
+ require 'active_support/all'
2
+ require 'json'
3
+ require 'nokogiri'
4
+ require 'faraday'
5
+ require 'faraday_middleware'
6
+ require 'faraday/encoding'
7
+ require 'excon'
8
+ require 'uri'
9
+
10
+ DEFAULT_TIMEOUT = 60
11
+ NETWORKABLE_EXCEPTIONS = [Faraday::ClientError,
12
+ Faraday::TimeoutError,
13
+ Faraday::SSLError,
14
+ Faraday::ConnectionFailed,
15
+ URI::InvalidURIError,
16
+ Encoding::UndefinedConversionError,
17
+ ArgumentError,
18
+ NoMethodError,
19
+ TypeError]
20
+
21
+ module Maremma
22
+ def self.get(url, content_type: 'json', headers: {}, **options)
23
+ conn = faraday_conn(content_type, options)
24
+ conn = auth_conn(conn, options)
25
+
26
+ conn.options[:timeout] = options[:timeout] || DEFAULT_TIMEOUT
27
+
28
+ # make sure we use a 'Host' header
29
+ headers['Host'] = URI.parse(url).host
30
+
31
+ if options[:data]
32
+ response = conn.post url, {}, headers do |request|
33
+ request.body = options[:data]
34
+ end
35
+ else
36
+ response = conn.get url, {}, headers
37
+ end
38
+ parse_response(response.body)
39
+ rescue *NETWORKABLE_EXCEPTIONS => error
40
+ rescue_faraday_error(error)
41
+ end
42
+
43
+ def self.faraday_conn(content_type = 'json', options = {})
44
+ # use short version for html, xml and json
45
+ content_types = { "html" => 'text/html; charset=UTF-8',
46
+ "xml" => 'application/xml',
47
+ "json" => 'application/json' }
48
+ accept_header = content_types.fetch(content_type, content_type)
49
+
50
+ # redirect limit
51
+ limit = options[:limit] || 10
52
+
53
+ Faraday.new do |c|
54
+ c.headers['Accept'] = accept_header
55
+ c.headers['User-Agent'] = "spinone - http://#{ENV['HOSTNAME']}"
56
+ c.use FaradayMiddleware::FollowRedirects, limit: limit, cookie: :all
57
+ c.request :multipart
58
+ c.request :json if accept_header == 'application/json'
59
+ c.use Faraday::Response::RaiseError
60
+ c.response :encoding
61
+ c.adapter :excon
62
+ end
63
+ end
64
+
65
+ def self.auth_conn(conn, options)
66
+ if options[:bearer]
67
+ conn.authorization :Bearer, options[:bearer]
68
+ elsif options[:token]
69
+ conn.authorization :Token, token: options[:token]
70
+ elsif options[:username]
71
+ conn.basic_auth(options[:username], options[:password])
72
+ end
73
+ conn
74
+ end
75
+
76
+ def self.rescue_faraday_error(error)
77
+ if error.is_a?(Faraday::ResourceNotFound)
78
+ { error: "resource not found", status: 404 }
79
+ elsif error.is_a?(Faraday::TimeoutError) || error.is_a?(Faraday::ConnectionFailed) || (error.try(:response) && error.response[:status] == 408)
80
+ { error: "execution expired", status: 408 }
81
+ else
82
+ { error: parse_error_response(error.message), status: 400 }
83
+ end
84
+ end
85
+
86
+ def self.parse_error_response(string)
87
+ string = parse_response(string)
88
+
89
+ if string.is_a?(Hash) && string['error']
90
+ string['error']
91
+ else
92
+ string
93
+ end
94
+ end
95
+
96
+ def self.parse_response(string)
97
+ from_json(string) || from_xml(string) || from_string(string)
98
+ end
99
+
100
+ protected
101
+
102
+ def self.from_xml(string)
103
+ if Nokogiri::XML(string).errors.empty?
104
+ Hash.from_xml(string)
105
+ else
106
+ nil
107
+ end
108
+ end
109
+
110
+ def self.from_json(string)
111
+ JSON.parse(string)
112
+ rescue JSON::ParserError
113
+ nil
114
+ end
115
+
116
+ def self.from_string(string)
117
+ string.gsub(/\s+\n/, "\n").strip.force_encoding('UTF-8')
118
+ end
119
+ end
@@ -1,3 +1,3 @@
1
1
  module Maremma
2
- VERSION = "1.0.0"
2
+ VERSION = "1.0.1"
3
3
  end
@@ -1,35 +1,36 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Maremma::Base do
3
+ describe Maremma do
4
+ subject { Maremma }
4
5
  let(:url) { "http://example.org" }
5
6
  let(:data) { { "name" => "Fred" } }
6
7
  let(:post_data) { { "name" => "Jack" } }
7
8
 
8
- context "get_result" do
9
+ context "get" do
9
10
  it "get json" do
10
11
  stub = stub_request(:get, url).to_return(:body => data.to_json, :status => 200, :headers => { "Content-Type" => "application/json" })
11
- response = subject.get_result(url)
12
+ response = subject.get(url)
12
13
  expect(response).to eq(data)
13
14
  expect(stub).to have_been_requested
14
15
  end
15
16
 
16
17
  it "get xml" do
17
18
  stub = stub_request(:get, url).to_return(:body => data.to_xml, :status => 200, :headers => { "Content-Type" => "application/xml" })
18
- response = subject.get_result(url, content_type: 'xml')
19
+ response = subject.get(url, content_type: 'xml')
19
20
  expect(response).to eq('hash' => data)
20
21
  expect(stub).to have_been_requested
21
22
  end
22
23
 
23
24
  it "get html" do
24
25
  stub = stub_request(:get, url).to_return(:body => data.to_s, :status => 200, :headers => { "Content-Type" => "text/html" })
25
- response = subject.get_result(url, content_type: 'html')
26
+ response = subject.get(url, content_type: 'html')
26
27
  expect(response).to eq(data.to_s)
27
28
  expect(stub).to have_been_requested
28
29
  end
29
30
 
30
31
  it "post xml" do
31
32
  stub = stub_request(:post, url).with(:body => post_data.to_xml).to_return(:body => data.to_xml, :status => 200, :headers => { "Content-Type" => "text/html" })
32
- subject.get_result(url, content_type: 'xml', data: post_data.to_xml) { |response| expect(Hash.from_xml(response.to_s)["hash"]).to eq(data) }
33
+ subject.get(url, content_type: 'xml', data: post_data.to_xml) { |response| expect(Hash.from_xml(response.to_s)["hash"]).to eq(data) }
33
34
  expect(stub).to have_been_requested
34
35
  end
35
36
  end
@@ -37,28 +38,28 @@ describe Maremma::Base do
37
38
  context "empty response" do
38
39
  it "get json" do
39
40
  stub = stub_request(:get, url).to_return(:body => nil, :status => 200, :headers => { "Content-Type" => "application/json" })
40
- response = subject.get_result(url)
41
+ response = subject.get(url)
41
42
  expect(response).to be_blank
42
43
  expect(stub).to have_been_requested
43
44
  end
44
45
 
45
46
  it "get xml" do
46
47
  stub = stub_request(:get, url).to_return(:body => nil, :status => 200, :headers => { "Content-Type" => "application/xml" })
47
- response = subject.get_result(url, content_type: 'xml')
48
+ response = subject.get(url, content_type: 'xml')
48
49
  expect(response).to be_blank
49
50
  expect(stub).to have_been_requested
50
51
  end
51
52
 
52
53
  it "get html" do
53
54
  stub = stub_request(:get, url).to_return(:body => nil, :status => 200, :headers => { "Content-Type" => "text/html" })
54
- response = subject.get_result(url, content_type: 'html')
55
+ response = subject.get(url, content_type: 'html')
55
56
  expect(response).to be_blank
56
57
  expect(stub).to have_been_requested
57
58
  end
58
59
 
59
60
  it "post xml" do
60
61
  stub = stub_request(:post, url).with(:body => post_data.to_xml).to_return(:body => nil, :status => 200, :headers => { "Content-Type" => "application/xml" })
61
- subject.get_result(url, content_type: 'xml', data: post_data.to_xml) { |response| expect(response).to be_nil }
62
+ subject.get(url, content_type: 'xml', data: post_data.to_xml) { |response| expect(response).to be_nil }
62
63
  expect(stub).to have_been_requested
63
64
  end
64
65
  end
@@ -68,25 +69,25 @@ describe Maremma::Base do
68
69
 
69
70
  it "get json" do
70
71
  stub = stub_request(:get, url).to_return(:body => error.to_json, :status => [404], :headers => { "Content-Type" => "application/json" })
71
- expect(subject.get_result(url)).to eq(error)
72
+ expect(subject.get(url)).to eq(error)
72
73
  expect(stub).to have_been_requested
73
74
  end
74
75
 
75
76
  it "get xml" do
76
77
  stub = stub_request(:get, url).to_return(:body => error.to_xml, :status => [404], :headers => { "Content-Type" => "application/xml" })
77
- expect(subject.get_result(url, content_type: 'xml')).to eq(error)
78
+ expect(subject.get(url, content_type: 'xml')).to eq(error)
78
79
  expect(stub).to have_been_requested
79
80
  end
80
81
 
81
82
  it "get html" do
82
83
  stub = stub_request(:get, url).to_return(:body => error.to_s, :status => [404], :headers => { "Content-Type" => "text/html" })
83
- expect(subject.get_result(url, content_type: 'html')).to eq(error)
84
+ expect(subject.get(url, content_type: 'html')).to eq(error)
84
85
  expect(stub).to have_been_requested
85
86
  end
86
87
 
87
88
  it "post xml" do
88
89
  stub = stub_request(:post, url).with(:body => post_data.to_xml).to_return(:body => error.to_xml, :status => [404], :headers => { "Content-Type" => "application/xml" })
89
- subject.get_result(url, content_type: 'xml', data: post_data.to_xml) { |response| expect(Hash.from_xml(response.to_s)["hash"]).to eq(error) }
90
+ subject.get(url, content_type: 'xml', data: post_data.to_xml) { |response| expect(Hash.from_xml(response.to_s)["hash"]).to eq(error) }
90
91
  expect(stub).to have_been_requested
91
92
  end
92
93
  end
@@ -94,28 +95,28 @@ describe Maremma::Base do
94
95
  context "request timeout" do
95
96
  it "get json" do
96
97
  stub = stub_request(:get, url).to_return(:status => [408])
97
- response = subject.get_result(url)
98
+ response = subject.get(url)
98
99
  expect(response).to eq(error: "execution expired", status: 408)
99
100
  expect(stub).to have_been_requested
100
101
  end
101
102
 
102
103
  it "get xml" do
103
104
  stub = stub_request(:get, url).to_return(:status => [408])
104
- response = subject.get_result(url, content_type: 'xml')
105
+ response = subject.get(url, content_type: 'xml')
105
106
  expect(response).to eq(error: "execution expired", status: 408)
106
107
  expect(stub).to have_been_requested
107
108
  end
108
109
 
109
110
  it "get html" do
110
111
  stub = stub_request(:get, url).to_return(:status => [408])
111
- response = subject.get_result(url, content_type: 'html')
112
+ response = subject.get(url, content_type: 'html')
112
113
  expect(response).to eq(error: "execution expired", status: 408)
113
114
  expect(stub).to have_been_requested
114
115
  end
115
116
 
116
117
  it "post xml" do
117
118
  stub = stub_request(:post, url).with(:body => post_data.to_xml).to_return(:status => [408])
118
- subject.get_result(url, content_type: 'xml', data: post_data.to_xml) { |response| expect(response).to be_nil }
119
+ subject.get(url, content_type: 'xml', data: post_data.to_xml) { |response| expect(response).to be_nil }
119
120
  expect(stub).to have_been_requested
120
121
  end
121
122
  end
@@ -123,28 +124,28 @@ describe Maremma::Base do
123
124
  context "request timeout internal" do
124
125
  it "get json" do
125
126
  stub = stub_request(:get, url).to_timeout
126
- response = subject.get_result(url)
127
+ response = subject.get(url)
127
128
  expect(response).to eq(error: "execution expired", status: 408)
128
129
  expect(stub).to have_been_requested
129
130
  end
130
131
 
131
132
  it "get xml" do
132
133
  stub = stub_request(:get, url).to_timeout
133
- response = subject.get_result(url, content_type: 'xml')
134
+ response = subject.get(url, content_type: 'xml')
134
135
  expect(response).to eq(error: "execution expired", status: 408)
135
136
  expect(stub).to have_been_requested
136
137
  end
137
138
 
138
139
  it "get html" do
139
140
  stub = stub_request(:get, url).to_timeout
140
- response = subject.get_result(url, content_type: 'html')
141
+ response = subject.get(url, content_type: 'html')
141
142
  expect(response).to eq(error: "execution expired", status: 408)
142
143
  expect(stub).to have_been_requested
143
144
  end
144
145
 
145
146
  it "post xml" do
146
147
  stub = stub_request(:post, url).with(:body => post_data.to_xml).to_timeout
147
- subject.get_result(url, content_type: 'xml', data: post_data.to_xml) { |response| expect(response).to be_nil }
148
+ subject.get(url, content_type: 'xml', data: post_data.to_xml) { |response| expect(response).to be_nil }
148
149
  expect(stub).to have_been_requested
149
150
  end
150
151
  end
@@ -155,7 +156,7 @@ describe Maremma::Base do
155
156
  it "redirect" do
156
157
  stub_request(:get, url).to_return(status: 301, headers: { location: redirect_url })
157
158
  stub_request(:get, redirect_url).to_return(status: 200, body: "Test")
158
- response = subject.get_result(url)
159
+ response = subject.get(url)
159
160
  expect(response).to eq("Test")
160
161
  end
161
162
 
@@ -165,7 +166,7 @@ describe Maremma::Base do
165
166
  stub_request(:get, redirect_url+ "/x").to_return(status: 301, headers: { location: redirect_url + "/y" })
166
167
  stub_request(:get, redirect_url+ "/y").to_return(status: 301, headers: { location: redirect_url + "/z" })
167
168
  stub_request(:get, redirect_url + "/z").to_return(status: 200, body: "Test")
168
- response = subject.get_result(url)
169
+ response = subject.get(url)
169
170
  expect(response).to eq("Test")
170
171
  end
171
172
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: maremma
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martin Fenner
@@ -249,10 +249,9 @@ files:
249
249
  - README.md
250
250
  - Rakefile
251
251
  - lib/maremma.rb
252
- - lib/maremma/base.rb
253
252
  - lib/maremma/version.rb
254
253
  - maremma.gemspec
255
- - spec/base_spec.rb
254
+ - spec/maremma_spec.rb
256
255
  - spec/spec_helper.rb
257
256
  homepage: https://github.com/datacite/maremma
258
257
  licenses:
@@ -279,5 +278,5 @@ signing_key:
279
278
  specification_version: 4
280
279
  summary: Simplified network calls
281
280
  test_files:
282
- - spec/base_spec.rb
281
+ - spec/maremma_spec.rb
283
282
  - spec/spec_helper.rb
data/lib/maremma/base.rb DELETED
@@ -1,121 +0,0 @@
1
- require 'active_support/all'
2
- require 'json'
3
- require 'nokogiri'
4
- require 'faraday'
5
- require 'faraday_middleware'
6
- require 'faraday/encoding'
7
- require 'excon'
8
- require 'uri'
9
-
10
- DEFAULT_TIMEOUT = 60
11
- NETWORKABLE_EXCEPTIONS = [Faraday::ClientError,
12
- Faraday::TimeoutError,
13
- Faraday::SSLError,
14
- Faraday::ConnectionFailed,
15
- URI::InvalidURIError,
16
- Encoding::UndefinedConversionError,
17
- ArgumentError,
18
- NoMethodError,
19
- TypeError]
20
-
21
- module Maremma
22
- class Base
23
- def get_result(url, content_type: 'json', headers: {}, **options)
24
- conn = faraday_conn(content_type, options)
25
- conn = auth_conn(conn, options)
26
-
27
- conn.options[:timeout] = options[:timeout] || DEFAULT_TIMEOUT
28
-
29
- # make sure we use a 'Host' header
30
- headers['Host'] = URI.parse(url).host
31
-
32
- if options[:data]
33
- response = conn.post url, {}, headers do |request|
34
- request.body = options[:data]
35
- end
36
- else
37
- response = conn.get url, {}, headers
38
- end
39
- parse_response(response.body)
40
- rescue *NETWORKABLE_EXCEPTIONS => error
41
- rescue_faraday_error(error)
42
- end
43
-
44
- def faraday_conn(content_type = 'json', options = {})
45
- # use short version for html, xml and json
46
- content_types = { "html" => 'text/html; charset=UTF-8',
47
- "xml" => 'application/xml',
48
- "json" => 'application/json' }
49
- accept_header = content_types.fetch(content_type, content_type)
50
-
51
- # redirect limit
52
- limit = options[:limit] || 10
53
-
54
- Faraday.new do |c|
55
- c.headers['Accept'] = accept_header
56
- c.headers['User-Agent'] = "spinone - http://#{ENV['HOSTNAME']}"
57
- c.use FaradayMiddleware::FollowRedirects, limit: limit, cookie: :all
58
- c.request :multipart
59
- c.request :json if accept_header == 'application/json'
60
- c.use Faraday::Response::RaiseError
61
- c.response :encoding
62
- c.adapter :excon
63
- end
64
- end
65
-
66
- def auth_conn(conn, options)
67
- if options[:bearer]
68
- conn.authorization :Bearer, options[:bearer]
69
- elsif options[:token]
70
- conn.authorization :Token, token: options[:token]
71
- elsif options[:username]
72
- conn.basic_auth(options[:username], options[:password])
73
- end
74
- conn
75
- end
76
-
77
- def rescue_faraday_error(error)
78
- if error.is_a?(Faraday::ResourceNotFound)
79
- { error: "resource not found", status: 404 }
80
- elsif error.is_a?(Faraday::TimeoutError) || error.is_a?(Faraday::ConnectionFailed) || (error.try(:response) && error.response[:status] == 408)
81
- { error: "execution expired", status: 408 }
82
- else
83
- { error: parse_error_response(error.message), status: 400 }
84
- end
85
- end
86
-
87
- def parse_error_response(string)
88
- string = parse_response(string)
89
-
90
- if string.is_a?(Hash) && string['error']
91
- string['error']
92
- else
93
- string
94
- end
95
- end
96
-
97
- def parse_response(string)
98
- from_json(string) || from_xml(string) || from_string(string)
99
- end
100
-
101
- protected
102
-
103
- def from_xml(string)
104
- if Nokogiri::XML(string).errors.empty?
105
- Hash.from_xml(string)
106
- else
107
- nil
108
- end
109
- end
110
-
111
- def from_json(string)
112
- JSON.parse(string)
113
- rescue JSON::ParserError
114
- nil
115
- end
116
-
117
- def from_string(string)
118
- string.gsub(/\s+\n/, "\n").strip.force_encoding('UTF-8')
119
- end
120
- end
121
- end