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