gds-api-adapters 0.0.20 → 0.0.23
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.
- 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
|