gds-api-adapters 0.0.20 → 0.0.23
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/gds_api/base.rb +16 -2
- data/lib/gds_api/contactotron.rb +1 -1
- data/lib/gds_api/json_client.rb +72 -0
- data/lib/gds_api/needotron.rb +4 -4
- data/lib/gds_api/oauth2_client.rb +25 -0
- data/lib/gds_api/panopticon.rb +6 -7
- data/lib/gds_api/publisher.rb +3 -3
- data/lib/gds_api/response.rb +49 -0
- data/lib/gds_api/test_helpers/publisher.rb +3 -3
- data/lib/gds_api/version.rb +1 -1
- data/test/contactotron_api_test.rb +1 -1
- data/test/{json_utils_test.rb → json_client_test.rb} +47 -13
- data/test/panopticon_api_test.rb +14 -4
- data/test/publisher_api_test.rb +2 -1
- data/test/test_helper.rb +4 -0
- metadata +106 -69
- data/lib/gds_api/json_utils.rb +0 -83
data/lib/gds_api/base.rb
CHANGED
@@ -1,9 +1,23 @@
|
|
1
|
-
require_relative '
|
1
|
+
require_relative 'json_client'
|
2
2
|
require 'cgi'
|
3
3
|
require 'null_logger'
|
4
4
|
|
5
5
|
class GdsApi::Base
|
6
|
-
|
6
|
+
extend Forwardable
|
7
|
+
|
8
|
+
def client
|
9
|
+
@client ||= create_client
|
10
|
+
end
|
11
|
+
|
12
|
+
def create_client
|
13
|
+
if options[:access_key]
|
14
|
+
GdsApi::OAuth2Client.new(options)
|
15
|
+
else
|
16
|
+
GdsApi::JsonClient.new(options)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def_delegators :client, :get_json, :post_json, :put_json
|
7
21
|
|
8
22
|
attr_reader :options
|
9
23
|
|
data/lib/gds_api/contactotron.rb
CHANGED
@@ -0,0 +1,72 @@
|
|
1
|
+
require_relative 'response'
|
2
|
+
require_relative 'exceptions'
|
3
|
+
|
4
|
+
module GdsApi
|
5
|
+
class JsonClient
|
6
|
+
attr_accessor :logger, :options
|
7
|
+
|
8
|
+
def initialize(options = {})
|
9
|
+
@logger = options[:logger] || GdsApi::Base.logger
|
10
|
+
@options = options
|
11
|
+
end
|
12
|
+
|
13
|
+
REQUEST_HEADERS = {
|
14
|
+
'Accept' => 'application/json',
|
15
|
+
'Content-Type' => 'application/json',
|
16
|
+
'User-Agent' => "GDS Api Client v. #{GdsApi::VERSION}"
|
17
|
+
}
|
18
|
+
DEFAULT_TIMEOUT_IN_SECONDS = 0.5
|
19
|
+
|
20
|
+
def get_json(url)
|
21
|
+
do_request(Net::HTTP::Get, url)
|
22
|
+
end
|
23
|
+
|
24
|
+
def post_json(url, params)
|
25
|
+
do_request(Net::HTTP::Post, url, params)
|
26
|
+
end
|
27
|
+
|
28
|
+
def put_json(url, params)
|
29
|
+
do_request(Net::HTTP::Put, url, params)
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def do_request(method_class, url, params = nil)
|
35
|
+
loggable = {request_uri: url, start_time: Time.now.to_f}
|
36
|
+
start_logging = loggable.merge(action: 'start')
|
37
|
+
logger.debug start_logging.to_json
|
38
|
+
|
39
|
+
url = URI.parse(url)
|
40
|
+
path = url.path
|
41
|
+
path = path + "?" + url.query if url.query
|
42
|
+
|
43
|
+
response = Net::HTTP.start(url.host, url.port, nil, nil, nil, nil, {use_ssl: url.port == 443, verify_mode: (OpenSSL::SSL::VERIFY_NONE if url.port == 443) }) do |http|
|
44
|
+
http.read_timeout = options[:timeout] || DEFAULT_TIMEOUT_IN_SECONDS
|
45
|
+
request = method_class.new(path, REQUEST_HEADERS)
|
46
|
+
request.basic_auth(@options[:basic_auth][:user], @options[:basic_auth][:password]) if @options[:basic_auth]
|
47
|
+
request.body = params.to_json if params
|
48
|
+
http.request(request)
|
49
|
+
end
|
50
|
+
|
51
|
+
if response.is_a?(Net::HTTPSuccess)
|
52
|
+
logger.info loggable.merge(status: 'success', end_time: Time.now.to_f).to_json
|
53
|
+
Response.new(response)
|
54
|
+
else
|
55
|
+
body = begin
|
56
|
+
JSON.parse(response.body)
|
57
|
+
rescue
|
58
|
+
response.body
|
59
|
+
end
|
60
|
+
loggable.merge!(status: response.code, end_time: Time.now.to_f, body: body)
|
61
|
+
logger.warn loggable.to_json
|
62
|
+
nil
|
63
|
+
end
|
64
|
+
rescue Errno::ECONNREFUSED
|
65
|
+
logger.error loggable.merge(status: 'refused', end_time: Time.now.to_f).to_json
|
66
|
+
raise GdsApi::EndpointNotFound.new("Could not connect to #{url}")
|
67
|
+
rescue Timeout::Error, Errno::ECONNRESET => e
|
68
|
+
logger.error loggable.merge(status: 'failed', end_time: Time.now.to_f).to_json
|
69
|
+
nil
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
data/lib/gds_api/needotron.rb
CHANGED
@@ -2,13 +2,13 @@ require_relative 'base'
|
|
2
2
|
|
3
3
|
class GdsApi::Needotron < GdsApi::Base
|
4
4
|
def need_by_id(id, opts = {})
|
5
|
-
|
6
|
-
return nil if
|
5
|
+
response = get_json("#{base_url}/#{id}.json")
|
6
|
+
return nil if response.nil? or response['need'].nil?
|
7
7
|
|
8
8
|
if opts[:as_hash]
|
9
|
-
|
9
|
+
response.to_hash
|
10
10
|
else
|
11
|
-
to_ostruct
|
11
|
+
response.to_ostruct.need
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative 'response'
|
2
|
+
require_relative 'exceptions'
|
3
|
+
|
4
|
+
# TODO: This is a work in progress
|
5
|
+
module GdsApi
|
6
|
+
class OAuth2Client
|
7
|
+
def initialize(options)
|
8
|
+
raise "access_token required" unless options[:access_token]
|
9
|
+
@oauth_client = OAuth2::Client.new(nil, nil)
|
10
|
+
@access_token = OAuth2::AccessToken.new(@oauth_client, options[:access_token], options[:token_options])
|
11
|
+
end
|
12
|
+
|
13
|
+
def get_json(url)
|
14
|
+
@access_token.get(url, headers: REQUEST_HEADERS)
|
15
|
+
end
|
16
|
+
|
17
|
+
def post_json(url, params)
|
18
|
+
@access_token.post(url, body: params, headers: REQUEST_HEADERS)
|
19
|
+
end
|
20
|
+
|
21
|
+
def put_json(url, params)
|
22
|
+
@access_token.put(url, body: params, headers: REQUEST_HEADERS)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/gds_api/panopticon.rb
CHANGED
@@ -1,16 +1,15 @@
|
|
1
1
|
require_relative 'base'
|
2
2
|
|
3
3
|
class GdsApi::Panopticon < GdsApi::Base
|
4
|
+
def all
|
5
|
+
url = base_url + '.json'
|
6
|
+
json = get_json url
|
7
|
+
to_ostruct json
|
8
|
+
end
|
4
9
|
|
5
10
|
def artefact_for_slug(slug, opts = {})
|
6
11
|
return nil if slug.nil? or slug == ''
|
7
|
-
|
8
|
-
details = get_json(url_for_slug(slug))
|
9
|
-
if opts[:as_hash]
|
10
|
-
details
|
11
|
-
else
|
12
|
-
to_ostruct(details)
|
13
|
-
end
|
12
|
+
get_json(url_for_slug(slug))
|
14
13
|
end
|
15
14
|
|
16
15
|
def create_artefact(artefact)
|
data/lib/gds_api/publisher.rb
CHANGED
@@ -6,9 +6,9 @@ class GdsApi::Publisher < GdsApi::Base
|
|
6
6
|
def publication_for_slug(slug, options = {})
|
7
7
|
return nil if slug.nil? or slug == ''
|
8
8
|
|
9
|
-
|
10
|
-
if
|
11
|
-
container = to_ostruct
|
9
|
+
response = get_json(url_for_slug(slug, options))
|
10
|
+
if response
|
11
|
+
container = response.to_ostruct
|
12
12
|
container.extend(GdsApi::PartMethods) if container.parts
|
13
13
|
convert_updated_date(container)
|
14
14
|
container
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'ostruct'
|
3
|
+
require_relative 'core-ext/openstruct'
|
4
|
+
|
5
|
+
module GdsApi
|
6
|
+
class Response
|
7
|
+
extend Forwardable
|
8
|
+
include Enumerable
|
9
|
+
|
10
|
+
def_delegators :to_hash, :[], :"<=>", :each
|
11
|
+
|
12
|
+
def initialize(net_http_response)
|
13
|
+
@net_http_response = net_http_response
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_hash
|
17
|
+
@parsed ||= JSON.parse(@net_http_response.body)
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_ostruct
|
21
|
+
self.class.build_ostruct_recursively(to_hash)
|
22
|
+
end
|
23
|
+
|
24
|
+
def method_missing(method)
|
25
|
+
if to_hash.has_key?(method.to_s)
|
26
|
+
to_ostruct.send(method)
|
27
|
+
else
|
28
|
+
super
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def respond_to_missing?(method)
|
33
|
+
to_hash.has_key?(method.to_s) || super
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def self.build_ostruct_recursively(value)
|
39
|
+
case value
|
40
|
+
when Hash
|
41
|
+
OpenStruct.new(Hash[value.map { |k, v| [k, build_ostruct_recursively(v)] }])
|
42
|
+
when Array
|
43
|
+
value.map { |v| build_ostruct_recursively(v) }
|
44
|
+
else
|
45
|
+
value
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'gds_api/
|
1
|
+
require 'gds_api/json_client'
|
2
2
|
|
3
3
|
module GdsApi
|
4
4
|
module TestHelpers
|
@@ -29,8 +29,8 @@ module GdsApi
|
|
29
29
|
json = JSON.dump(output_details)
|
30
30
|
slug = input_details.delete('slug')
|
31
31
|
uri = "#{PUBLISHER_ENDPOINT}/local_transactions/#{slug}/verify_snac.json"
|
32
|
-
stub_request(:post, uri).with(:body => JSON.dump(input_details),
|
33
|
-
:headers => GdsApi::
|
32
|
+
stub_request(:post, uri).with(:body => JSON.dump(input_details),
|
33
|
+
:headers => GdsApi::JsonClient::REQUEST_HEADERS).
|
34
34
|
to_return(:body => json, :status => 200)
|
35
35
|
end
|
36
36
|
|
data/lib/gds_api/version.rb
CHANGED
@@ -12,6 +12,6 @@ class ContactotronApiTest < MiniTest::Unit::TestCase
|
|
12
12
|
def test_should_fetch_and_parse_JSON_into_ostruct
|
13
13
|
uri = "http://contactotron.platform/contacts/1"
|
14
14
|
contactotron_has_contact(uri, {details: 'value'})
|
15
|
-
assert_equal
|
15
|
+
assert_equal "value", api.contact_for_uri(uri).details
|
16
16
|
end
|
17
17
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
require_relative 'test_helper'
|
2
|
-
require 'gds_api/
|
2
|
+
require 'gds_api/base'
|
3
|
+
require 'gds_api/json_client'
|
3
4
|
require 'rack'
|
5
|
+
require 'base64'
|
4
6
|
|
5
7
|
StubRackApp = lambda do |env|
|
6
8
|
sleep(30)
|
@@ -8,29 +10,31 @@ StubRackApp = lambda do |env|
|
|
8
10
|
[200, {"Content-Type" => "text/plain", "Content-Length" => body.length.to_s}, [body]]
|
9
11
|
end
|
10
12
|
|
11
|
-
class
|
12
|
-
|
13
|
+
class JsonClientTest < MiniTest::Spec
|
14
|
+
def setup
|
15
|
+
@client = GdsApi::JsonClient.new
|
16
|
+
end
|
13
17
|
|
14
18
|
def options; {}; end
|
15
19
|
def pending_test_long_requests_timeout
|
16
20
|
url = "http://www.example.com/timeout.json"
|
17
21
|
stub_request(:get, url).to_rack(StubRackApp)
|
18
22
|
assert_raises GdsApi::TimedOut do
|
19
|
-
get_json(url)
|
23
|
+
@client.get_json(url)
|
20
24
|
end
|
21
25
|
end
|
22
26
|
|
23
27
|
def test_get_returns_nil_on_timeout
|
24
28
|
url = "http://some.endpoint/some.json"
|
25
29
|
stub_request(:get, url).to_raise(Timeout::Error)
|
26
|
-
assert_nil get_json(url)
|
30
|
+
assert_nil @client.get_json(url)
|
27
31
|
end
|
28
32
|
|
29
33
|
def test_get_should_raise_endpoint_not_found_if_connection_refused
|
30
34
|
url = "http://some.endpoint/some.json"
|
31
35
|
stub_request(:get, url).to_raise(Errno::ECONNREFUSED)
|
32
36
|
assert_raises GdsApi::EndpointNotFound do
|
33
|
-
get_json(url)
|
37
|
+
@client.get_json(url)
|
34
38
|
end
|
35
39
|
end
|
36
40
|
|
@@ -38,32 +42,62 @@ class JsonUtilsTest < MiniTest::Unit::TestCase
|
|
38
42
|
url = "http://some.endpoint/some.json"
|
39
43
|
stub_request(:get, url).to_raise(Errno::ECONNREFUSED)
|
40
44
|
assert_raises GdsApi::EndpointNotFound do
|
41
|
-
get_json(url)
|
45
|
+
@client.get_json(url)
|
42
46
|
end
|
43
47
|
end
|
44
48
|
|
45
49
|
def test_post_returns_nil_on_timeout
|
46
50
|
url = "http://some.endpoint/some.json"
|
47
51
|
stub_request(:post, url).to_raise(Timeout::Error)
|
48
|
-
assert_nil post_json(url, {})
|
52
|
+
assert_nil @client.post_json(url, {})
|
49
53
|
end
|
50
54
|
|
51
|
-
def
|
55
|
+
def test_should_fetch_and_parse_json_into_response
|
52
56
|
url = "http://some.endpoint/some.json"
|
53
57
|
stub_request(:get, url).to_return(:body => "{}",:status => 200)
|
54
|
-
assert_equal
|
58
|
+
assert_equal GdsApi::Response, @client.get_json(url).class
|
55
59
|
end
|
56
60
|
|
57
61
|
def test_should_return_nil_if_404_returned_from_endpoint
|
58
62
|
url = "http://some.endpoint/some.json"
|
59
63
|
stub_request(:get, url).to_return(:body => "{}", :status => 404)
|
60
|
-
assert_nil get_json(url)
|
64
|
+
assert_nil @client.get_json(url)
|
61
65
|
end
|
62
|
-
|
66
|
+
|
67
|
+
def empty_response
|
68
|
+
net_http_response = stub(:body => '{}')
|
69
|
+
GdsApi::Response.new(net_http_response)
|
70
|
+
end
|
71
|
+
|
63
72
|
def test_put_json_does_put_with_json_encoded_packet
|
64
73
|
url = "http://some.endpoint/some.json"
|
65
74
|
payload = {a:1}
|
66
75
|
stub_request(:put, url).with(body: payload.to_json).to_return(:body => "{}", :status => 200)
|
67
|
-
assert_equal({}, put_json(url, payload))
|
76
|
+
assert_equal({}, @client.put_json(url, payload).to_hash)
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_can_convert_response_to_ostruct
|
80
|
+
url = "http://some.endpoint/some.json"
|
81
|
+
payload = {a:1}
|
82
|
+
stub_request(:put, url).with(body: payload.to_json).to_return(:body => '{"a":1}', :status => 200)
|
83
|
+
response = @client.put_json(url, payload)
|
84
|
+
assert_equal(OpenStruct.new(a:1), response.to_ostruct)
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_can_access_attributes_of_response_directly
|
88
|
+
url = "http://some.endpoint/some.json"
|
89
|
+
payload = {a:1}
|
90
|
+
stub_request(:put, url).with(body: payload.to_json).to_return(:body => '{"a":{"b":2}}', :status => 200)
|
91
|
+
response = @client.put_json(url, payload)
|
92
|
+
assert_equal 2, response.a.b
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_client_can_use_basic_auth
|
96
|
+
client = GdsApi::JsonClient.new(basic_auth: {user: 'user', password: 'password'})
|
97
|
+
|
98
|
+
stub_request(:put, "http://user:password@some.endpoint/some.json")
|
99
|
+
.to_return(:body => '{"a":1}', :status => 200)
|
100
|
+
response = client.put_json("http://some.endpoint/some.json", {})
|
101
|
+
assert_equal 1, response.a
|
68
102
|
end
|
69
103
|
end
|
data/test/panopticon_api_test.rb
CHANGED
@@ -37,14 +37,14 @@ class PanopticonApiTest < MiniTest::Unit::TestCase
|
|
37
37
|
def test_given_a_slug_can_fetch_artefact_as_hash
|
38
38
|
panopticon_has_metadata(basic_artefact)
|
39
39
|
artefact = api.artefact_for_slug(basic_artefact[:slug], :as_hash => true)
|
40
|
-
|
40
|
+
assert_equal basic_artefact[:name], artefact['name']
|
41
41
|
end
|
42
42
|
|
43
43
|
def should_fetch_and_parse_JSON_into_hash
|
44
44
|
url = "#{PANOPTICON_ENDPOINT}/some.json"
|
45
|
-
stub_request(:get, url).to_return(body: {}.to_json)
|
46
|
-
|
47
|
-
assert_equal
|
45
|
+
stub_request(:get, url).to_return(body: {a:1}.to_json)
|
46
|
+
|
47
|
+
assert_equal 1, api.get_json(url)['a']
|
48
48
|
end
|
49
49
|
|
50
50
|
def test_should_return_nil_if_404_returned_from_endpoint
|
@@ -83,4 +83,14 @@ class PanopticonApiTest < MiniTest::Unit::TestCase
|
|
83
83
|
|
84
84
|
api.update_artefact(1, basic_artefact)
|
85
85
|
end
|
86
|
+
|
87
|
+
def test_can_use_basic_auth
|
88
|
+
credentials = {user: 'fred', password: 'secret'}
|
89
|
+
api = GdsApi::Panopticon.new('test', endpoint_url: 'http://some.url', basic_auth: credentials)
|
90
|
+
url = "http://#{credentials[:user]}:#{credentials[:password]}@some.url/artefacts/1.json"
|
91
|
+
stub_request(:put, url)
|
92
|
+
.to_return(status: 200, body: '{}')
|
93
|
+
|
94
|
+
api.update_artefact(1, basic_artefact)
|
95
|
+
end
|
86
96
|
end
|
data/test/publisher_api_test.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
require 'gds_api/publisher'
|
3
|
+
require 'gds_api/json_client'
|
3
4
|
require 'gds_api/test_helpers/publisher'
|
4
5
|
|
5
6
|
class GdsApi::PublisherTest < MiniTest::Unit::TestCase
|
@@ -100,7 +101,7 @@ class GdsApi::PublisherTest < MiniTest::Unit::TestCase
|
|
100
101
|
|
101
102
|
def test_should_be_able_to_retrieve_local_transaction_details
|
102
103
|
stub_request(:post, "#{PUBLISHER_ENDPOINT}/local_transactions/fake-transaction/verify_snac.json").
|
103
|
-
with(:body => "{\"snac_codes\":[12345]}", :headers => GdsApi::
|
104
|
+
with(:body => "{\"snac_codes\":[12345]}", :headers => GdsApi::JsonClient::REQUEST_HEADERS).
|
104
105
|
to_return(:status => 200, :body => '{"snac": "12345"}', :headers => {})
|
105
106
|
assert_equal '12345', api.council_for_slug('fake-transaction', [12345])
|
106
107
|
end
|
data/test/test_helper.rb
CHANGED
@@ -1,8 +1,12 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
Bundler.setup :default, :development, :test
|
3
|
+
|
1
4
|
require 'minitest/autorun'
|
2
5
|
require 'webmock/minitest'
|
3
6
|
require 'rack/utils'
|
4
7
|
require 'simplecov'
|
5
8
|
require 'simplecov-rcov'
|
9
|
+
require 'mocha'
|
6
10
|
|
7
11
|
SimpleCov.start do
|
8
12
|
add_filter "/test/"
|
metadata
CHANGED
@@ -1,111 +1,139 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: gds-api-adapters
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.20
|
3
|
+
version: !ruby/object:Gem::Version
|
5
4
|
prerelease:
|
5
|
+
version: 0.0.23
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- James Stewart
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
|
13
|
+
date: 2012-01-10 00:00:00 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
15
16
|
name: plek
|
16
|
-
requirement: &
|
17
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
17
18
|
none: false
|
18
|
-
requirements:
|
19
|
-
- -
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version:
|
19
|
+
requirements:
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: "0"
|
22
23
|
type: :runtime
|
23
24
|
prerelease: false
|
24
|
-
version_requirements: *
|
25
|
-
- !ruby/object:Gem::Dependency
|
25
|
+
version_requirements: *id001
|
26
|
+
- !ruby/object:Gem::Dependency
|
26
27
|
name: null_logger
|
27
|
-
requirement: &
|
28
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
28
29
|
none: false
|
29
|
-
requirements:
|
30
|
-
- -
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
version:
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: "0"
|
33
34
|
type: :runtime
|
34
35
|
prerelease: false
|
35
|
-
version_requirements: *
|
36
|
-
- !ruby/object:Gem::Dependency
|
36
|
+
version_requirements: *id002
|
37
|
+
- !ruby/object:Gem::Dependency
|
37
38
|
name: rake
|
38
|
-
requirement: &
|
39
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
39
40
|
none: false
|
40
|
-
requirements:
|
41
|
+
requirements:
|
41
42
|
- - ~>
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
+
- !ruby/object:Gem::Version
|
43
44
|
version: 0.9.2.2
|
44
45
|
type: :development
|
45
46
|
prerelease: false
|
46
|
-
version_requirements: *
|
47
|
-
- !ruby/object:Gem::Dependency
|
47
|
+
version_requirements: *id003
|
48
|
+
- !ruby/object:Gem::Dependency
|
48
49
|
name: webmock
|
49
|
-
requirement: &
|
50
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
50
51
|
none: false
|
51
|
-
requirements:
|
52
|
+
requirements:
|
52
53
|
- - ~>
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: "1.7"
|
55
56
|
type: :development
|
56
57
|
prerelease: false
|
57
|
-
version_requirements: *
|
58
|
-
- !ruby/object:Gem::Dependency
|
58
|
+
version_requirements: *id004
|
59
|
+
- !ruby/object:Gem::Dependency
|
60
|
+
name: mocha
|
61
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
62
|
+
none: false
|
63
|
+
requirements:
|
64
|
+
- - ~>
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: 0.10.0
|
67
|
+
type: :development
|
68
|
+
prerelease: false
|
69
|
+
version_requirements: *id005
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: minitest
|
72
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 2.10.0
|
78
|
+
type: :development
|
79
|
+
prerelease: false
|
80
|
+
version_requirements: *id006
|
81
|
+
- !ruby/object:Gem::Dependency
|
59
82
|
name: rack
|
60
|
-
requirement: &
|
83
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
61
84
|
none: false
|
62
|
-
requirements:
|
63
|
-
- -
|
64
|
-
- !ruby/object:Gem::Version
|
65
|
-
version:
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: "0"
|
66
89
|
type: :development
|
67
90
|
prerelease: false
|
68
|
-
version_requirements: *
|
69
|
-
- !ruby/object:Gem::Dependency
|
91
|
+
version_requirements: *id007
|
92
|
+
- !ruby/object:Gem::Dependency
|
70
93
|
name: simplecov
|
71
|
-
requirement: &
|
94
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
72
95
|
none: false
|
73
|
-
requirements:
|
96
|
+
requirements:
|
74
97
|
- - ~>
|
75
|
-
- !ruby/object:Gem::Version
|
76
|
-
version: 0.4
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: 0.5.4
|
77
100
|
type: :development
|
78
101
|
prerelease: false
|
79
|
-
version_requirements: *
|
80
|
-
- !ruby/object:Gem::Dependency
|
102
|
+
version_requirements: *id008
|
103
|
+
- !ruby/object:Gem::Dependency
|
81
104
|
name: simplecov-rcov
|
82
|
-
requirement: &
|
105
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
83
106
|
none: false
|
84
|
-
requirements:
|
85
|
-
- -
|
86
|
-
- !ruby/object:Gem::Version
|
87
|
-
version:
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: "0"
|
88
111
|
type: :development
|
89
112
|
prerelease: false
|
90
|
-
version_requirements: *
|
113
|
+
version_requirements: *id009
|
91
114
|
description: A set of adapters providing easy access to the GDS gov.uk APIs
|
92
|
-
email:
|
115
|
+
email:
|
93
116
|
- jystewart@gmail.com
|
94
117
|
executables: []
|
118
|
+
|
95
119
|
extensions: []
|
120
|
+
|
96
121
|
extra_rdoc_files: []
|
97
|
-
|
122
|
+
|
123
|
+
files:
|
98
124
|
- lib/gds_api/base.rb
|
99
125
|
- lib/gds_api/contactotron.rb
|
100
126
|
- lib/gds_api/core-ext/openstruct.rb
|
101
127
|
- lib/gds_api/exceptions.rb
|
102
128
|
- lib/gds_api/helpers.rb
|
103
129
|
- lib/gds_api/imminence.rb
|
104
|
-
- lib/gds_api/
|
130
|
+
- lib/gds_api/json_client.rb
|
105
131
|
- lib/gds_api/needotron.rb
|
132
|
+
- lib/gds_api/oauth2_client.rb
|
106
133
|
- lib/gds_api/panopticon.rb
|
107
134
|
- lib/gds_api/part_methods.rb
|
108
135
|
- lib/gds_api/publisher.rb
|
136
|
+
- lib/gds_api/response.rb
|
109
137
|
- lib/gds_api/test_helpers/contactotron.rb
|
110
138
|
- lib/gds_api/test_helpers/imminence.rb
|
111
139
|
- lib/gds_api/test_helpers/panopticon.rb
|
@@ -115,38 +143,47 @@ files:
|
|
115
143
|
- Rakefile
|
116
144
|
- test/contactotron_api_test.rb
|
117
145
|
- test/gds_api_base_test.rb
|
118
|
-
- test/
|
146
|
+
- test/json_client_test.rb
|
119
147
|
- test/panopticon_api_test.rb
|
120
148
|
- test/publisher_api_test.rb
|
121
149
|
- test/test_helper.rb
|
122
150
|
homepage: http://github.com/alphagov/gds-api-adapters
|
123
151
|
licenses: []
|
152
|
+
|
124
153
|
post_install_message:
|
125
154
|
rdoc_options: []
|
126
|
-
|
155
|
+
|
156
|
+
require_paths:
|
127
157
|
- lib
|
128
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
158
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
129
159
|
none: false
|
130
|
-
requirements:
|
131
|
-
- -
|
132
|
-
- !ruby/object:Gem::Version
|
133
|
-
|
134
|
-
|
160
|
+
requirements:
|
161
|
+
- - ">="
|
162
|
+
- !ruby/object:Gem::Version
|
163
|
+
hash: -3544667812721100865
|
164
|
+
segments:
|
165
|
+
- 0
|
166
|
+
version: "0"
|
167
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
135
168
|
none: false
|
136
|
-
requirements:
|
137
|
-
- -
|
138
|
-
- !ruby/object:Gem::Version
|
139
|
-
|
169
|
+
requirements:
|
170
|
+
- - ">="
|
171
|
+
- !ruby/object:Gem::Version
|
172
|
+
hash: -3544667812721100865
|
173
|
+
segments:
|
174
|
+
- 0
|
175
|
+
version: "0"
|
140
176
|
requirements: []
|
177
|
+
|
141
178
|
rubyforge_project:
|
142
|
-
rubygems_version: 1.8.
|
179
|
+
rubygems_version: 1.8.13
|
143
180
|
signing_key:
|
144
181
|
specification_version: 3
|
145
182
|
summary: Adapters to work with GDS APIs
|
146
|
-
test_files:
|
183
|
+
test_files:
|
147
184
|
- test/contactotron_api_test.rb
|
148
185
|
- test/gds_api_base_test.rb
|
149
|
-
- test/
|
186
|
+
- test/json_client_test.rb
|
150
187
|
- test/panopticon_api_test.rb
|
151
188
|
- test/publisher_api_test.rb
|
152
189
|
- test/test_helper.rb
|
data/lib/gds_api/json_utils.rb
DELETED
@@ -1,83 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
require 'net/http'
|
3
|
-
require 'ostruct'
|
4
|
-
require_relative 'core-ext/openstruct'
|
5
|
-
require_relative 'version'
|
6
|
-
require_relative 'exceptions'
|
7
|
-
|
8
|
-
module GdsApi::JsonUtils
|
9
|
-
REQUEST_HEADERS = {
|
10
|
-
'Accept' => 'application/json',
|
11
|
-
'Content-Type' => 'application/json',
|
12
|
-
'User-Agent' => "GDS Api Client v. #{GdsApi::VERSION}"
|
13
|
-
}
|
14
|
-
DEFAULT_TIMEOUT_IN_SECONDS = 0.5
|
15
|
-
|
16
|
-
def do_request(url, &block)
|
17
|
-
loggable = {request_uri: url, start_time: Time.now.to_f}
|
18
|
-
|
19
|
-
url = URI.parse(url)
|
20
|
-
request = url.path
|
21
|
-
request = request + "?" + url.query if url.query
|
22
|
-
logger.debug "I will request #{request}"
|
23
|
-
|
24
|
-
response = Net::HTTP.start(url.host, url.port, nil, nil, nil, nil, {use_ssl: url.port == 443, verify_mode: (OpenSSL::SSL::VERIFY_NONE if url.port == 443) }) do |http|
|
25
|
-
http.read_timeout = options[:timeout] || DEFAULT_TIMEOUT_IN_SECONDS
|
26
|
-
yield http, request
|
27
|
-
end
|
28
|
-
|
29
|
-
if response.is_a?(Net::HTTPSuccess)
|
30
|
-
logger.info loggable.merge(status: 'success', end_time: Time.now).to_json
|
31
|
-
JSON.parse(response.body)
|
32
|
-
else
|
33
|
-
body = begin
|
34
|
-
JSON.parse(response.body)
|
35
|
-
rescue
|
36
|
-
response.body
|
37
|
-
end
|
38
|
-
loggable.merge!(status: response.code, end_time: Time.now.to_f, body: body)
|
39
|
-
logger.warn loggable.to_json
|
40
|
-
nil
|
41
|
-
end
|
42
|
-
rescue Errno::ECONNREFUSED
|
43
|
-
logger.error loggable.merge(status: 'refused', end_time: Time.now.to_f).to_json
|
44
|
-
raise GdsApi::EndpointNotFound.new("Could not connect to #{url}")
|
45
|
-
rescue Timeout::Error, Errno::ECONNRESET => e
|
46
|
-
logger.error loggable.merge(status: 'failed', end_time: Time.now.to_f).to_json
|
47
|
-
nil
|
48
|
-
end
|
49
|
-
|
50
|
-
def logger
|
51
|
-
GdsApi::Base.logger
|
52
|
-
end
|
53
|
-
private :logger
|
54
|
-
|
55
|
-
def get_json(url)
|
56
|
-
do_request(url) do |http, path|
|
57
|
-
http.get(path, REQUEST_HEADERS)
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def post_json(url, params)
|
62
|
-
do_request(url) do |http, path|
|
63
|
-
http.post(path, params.to_json, REQUEST_HEADERS)
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
def put_json(url, params)
|
68
|
-
do_request(url) do |http, path|
|
69
|
-
http.put(path, params.to_json, REQUEST_HEADERS)
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
def to_ostruct(object)
|
74
|
-
case object
|
75
|
-
when Hash
|
76
|
-
OpenStruct.new Hash[object.map { |key, value| [key, to_ostruct(value)] }]
|
77
|
-
when Array
|
78
|
-
object.map { |k| to_ostruct(k) }
|
79
|
-
else
|
80
|
-
object
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|