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 CHANGED
@@ -1,9 +1,23 @@
1
- require_relative 'json_utils'
1
+ require_relative 'json_client'
2
2
  require 'cgi'
3
3
  require 'null_logger'
4
4
 
5
5
  class GdsApi::Base
6
- include GdsApi::JsonUtils
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
 
@@ -6,6 +6,6 @@ require_relative 'base'
6
6
  class GdsApi::Contactotron < GdsApi::Base
7
7
 
8
8
  def contact_for_uri(uri)
9
- to_ostruct get_json(uri)
9
+ get_json(uri)
10
10
  end
11
11
  end
@@ -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
@@ -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
- need_hash = get_json("#{base_url}/#{id}.json")
6
- return nil if need_hash.nil? or need_hash['need'].nil?
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
- need_hash
9
+ response.to_hash
10
10
  else
11
- to_ostruct(need_hash['need'])
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
@@ -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)
@@ -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
- publication_hash = get_json(url_for_slug(slug, options))
10
- if publication_hash
11
- container = to_ostruct(publication_hash)
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/json_utils'
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::JsonUtils::REQUEST_HEADERS).
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
 
@@ -1,3 +1,3 @@
1
1
  module GdsApi
2
- VERSION = '0.0.20'
2
+ VERSION = '0.0.23'
3
3
  end
@@ -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 OpenStruct, api.contact_for_uri(uri).class
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/json_utils'
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 JsonUtilsTest < MiniTest::Unit::TestCase
12
- include GdsApi::JsonUtils
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 test_should_fetch_and_parse_json_into_hash
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 Hash, get_json(url).class
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
@@ -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
- assert artefact.is_a?(Hash)
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 Hash, api.get_json(url).class
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
@@ -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::JsonUtils::REQUEST_HEADERS).
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
- date: 2012-01-05 00:00:00.000000000Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
12
+
13
+ date: 2012-01-10 00:00:00 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
15
16
  name: plek
16
- requirement: &70348224358200 !ruby/object:Gem::Requirement
17
+ requirement: &id001 !ruby/object:Gem::Requirement
17
18
  none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: '0'
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: "0"
22
23
  type: :runtime
23
24
  prerelease: false
24
- version_requirements: *70348224358200
25
- - !ruby/object:Gem::Dependency
25
+ version_requirements: *id001
26
+ - !ruby/object:Gem::Dependency
26
27
  name: null_logger
27
- requirement: &70348224356460 !ruby/object:Gem::Requirement
28
+ requirement: &id002 !ruby/object:Gem::Requirement
28
29
  none: false
29
- requirements:
30
- - - ! '>='
31
- - !ruby/object:Gem::Version
32
- version: '0'
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
33
34
  type: :runtime
34
35
  prerelease: false
35
- version_requirements: *70348224356460
36
- - !ruby/object:Gem::Dependency
36
+ version_requirements: *id002
37
+ - !ruby/object:Gem::Dependency
37
38
  name: rake
38
- requirement: &70348224344180 !ruby/object:Gem::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: *70348224344180
47
- - !ruby/object:Gem::Dependency
47
+ version_requirements: *id003
48
+ - !ruby/object:Gem::Dependency
48
49
  name: webmock
49
- requirement: &70348224342980 !ruby/object:Gem::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: '1.7'
54
+ - !ruby/object:Gem::Version
55
+ version: "1.7"
55
56
  type: :development
56
57
  prerelease: false
57
- version_requirements: *70348224342980
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: &70348224342540 !ruby/object:Gem::Requirement
83
+ requirement: &id007 !ruby/object:Gem::Requirement
61
84
  none: false
62
- requirements:
63
- - - ! '>='
64
- - !ruby/object:Gem::Version
65
- version: '0'
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: "0"
66
89
  type: :development
67
90
  prerelease: false
68
- version_requirements: *70348224342540
69
- - !ruby/object:Gem::Dependency
91
+ version_requirements: *id007
92
+ - !ruby/object:Gem::Dependency
70
93
  name: simplecov
71
- requirement: &70348224342000 !ruby/object:Gem::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.2
98
+ - !ruby/object:Gem::Version
99
+ version: 0.5.4
77
100
  type: :development
78
101
  prerelease: false
79
- version_requirements: *70348224342000
80
- - !ruby/object:Gem::Dependency
102
+ version_requirements: *id008
103
+ - !ruby/object:Gem::Dependency
81
104
  name: simplecov-rcov
82
- requirement: &70348224341560 !ruby/object:Gem::Requirement
105
+ requirement: &id009 !ruby/object:Gem::Requirement
83
106
  none: false
84
- requirements:
85
- - - ! '>='
86
- - !ruby/object:Gem::Version
87
- version: '0'
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: "0"
88
111
  type: :development
89
112
  prerelease: false
90
- version_requirements: *70348224341560
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
- files:
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/json_utils.rb
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/json_utils_test.rb
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
- require_paths:
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
- version: '0'
134
- required_rubygems_version: !ruby/object:Gem::Requirement
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
- version: '0'
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.10
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/json_utils_test.rb
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
@@ -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