gds-api-adapters 63.5.0 → 67.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -23
  3. data/Rakefile +7 -8
  4. data/lib/gds_api.rb +2 -14
  5. data/lib/gds_api/asset_manager.rb +1 -1
  6. data/lib/gds_api/base.rb +8 -3
  7. data/lib/gds_api/email_alert_api.rb +10 -12
  8. data/lib/gds_api/exceptions.rb +3 -4
  9. data/lib/gds_api/imminence.rb +3 -3
  10. data/lib/gds_api/json_client.rb +8 -8
  11. data/lib/gds_api/list_response.rb +6 -6
  12. data/lib/gds_api/performance_platform/data_out.rb +21 -21
  13. data/lib/gds_api/publishing_api.rb +2 -2
  14. data/lib/gds_api/response.rb +80 -6
  15. data/lib/gds_api/test_helpers/asset_manager.rb +0 -17
  16. data/lib/gds_api/test_helpers/calendars.rb +0 -9
  17. data/lib/gds_api/test_helpers/content_store.rb +0 -9
  18. data/lib/gds_api/test_helpers/email_alert_api.rb +11 -35
  19. data/lib/gds_api/test_helpers/imminence.rb +11 -14
  20. data/lib/gds_api/test_helpers/licence_application.rb +8 -16
  21. data/lib/gds_api/test_helpers/link_checker_api.rb +0 -8
  22. data/lib/gds_api/test_helpers/local_links_manager.rb +0 -13
  23. data/lib/gds_api/test_helpers/mapit.rb +15 -26
  24. data/lib/gds_api/test_helpers/organisations.rb +13 -18
  25. data/lib/gds_api/test_helpers/performance_platform/data_out.rb +34 -34
  26. data/lib/gds_api/test_helpers/publishing_api.rb +42 -61
  27. data/lib/gds_api/test_helpers/search.rb +5 -5
  28. data/lib/gds_api/test_helpers/support.rb +0 -5
  29. data/lib/gds_api/test_helpers/support_api.rb +16 -20
  30. data/lib/gds_api/test_helpers/worldwide.rb +52 -32
  31. data/lib/gds_api/version.rb +1 -1
  32. metadata +15 -32
  33. data/lib/gds_api/publishing_api_v2.rb +0 -14
  34. data/lib/gds_api/test_helpers/alias_deprecated.rb +0 -13
  35. data/lib/gds_api/test_helpers/publishing_api_v2.rb +0 -13
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eaa3295a40ef152d5e1cc0d71442ef8abd68f3e62de0cf7ce314b00db8f57178
4
- data.tar.gz: 20e6c32c3239ccae9d3f420ebcbb854d874b5c5c3ea69104e99925f4fbfbc956
3
+ metadata.gz: fa2f8e5ae181c47883077132c2fb3a4910d28567860c2466f594ebf0d5aaa305
4
+ data.tar.gz: 1f5c76190d01dea3f9d7772bd613e7b05f532e2a1df4eaed2987df335ac707e6
5
5
  SHA512:
6
- metadata.gz: 0adba4b355ca9d0ec902a913327d96dc150006d5f24355fcb0e58c84680db2d126354a0654fb9bfc8f2265c85f94a67b374ce47c463bd201a4adee61420c3dcc
7
- data.tar.gz: a2e6b2ca43a3abb580226ea0ba2bd02ff580a7c900fc5168157b74eda4b49c69d897131ccbe81506a86ed615aa4b622908e8df5a58b5b0c7e1c00d67837adb2e
6
+ metadata.gz: d86be0927061f0fe19b6da7333dcdbba7ab1f54411a6c6bfbbe59f7bbc9a6b6c469609e3ecd597c5c2d41798170f114f14396791b980a7c26968e45fcb975913
7
+ data.tar.gz: fb2556343854773fec59ce8e02341263cfb5829bdd18223c65381035274b6554aeb431fc12e98a0483c1608879c272bead25f58f97ce29d540a33c17b3631905
data/README.md CHANGED
@@ -5,9 +5,7 @@ A set of API adapters to work with the GDS APIs.
5
5
  Example usage:
6
6
 
7
7
  ```ruby
8
- require 'gds_api/search'
9
- search = GdsApi::Search.new(Plek.new.find('search))
10
- results = search.search(q: "taxes")
8
+ GdsApi.publishing_api.get_content("f3bbdec2-0e62-4520-a7fd-6ffd5d36e03a")
11
9
  ```
12
10
 
13
11
  Example adapters for frequently used applications:
@@ -39,12 +37,11 @@ GdsApi::Base.logger = Logger.new("/path/to/file.log")
39
37
  ## Setting the timeout
40
38
 
41
39
  By default the JsonClient timeout is set to 4 seconds. If this is exceeded a
42
- `GdsApi::TimedOutException` will be raised. Individual clients may decide to
43
- override this timeout. Alternatively, you can override this in the application
40
+ `GdsApi::TimedOutException` will be raised. You can override this by doing:
44
41
  that uses the adapter with:
45
42
 
46
43
  ```ruby
47
- Services.publishing_api.client.options[:timeout] = number_of_seconds
44
+ adapter = GdsApi.publishing_api(timeout: <number_of_seconds>)
48
45
  ```
49
46
 
50
47
  In most cases, there is an upper-limit of 30 seconds imposed by the app server
@@ -85,23 +82,6 @@ There are also test helpers for stubbing various requests in other apps.
85
82
 
86
83
  See [all the test helpers in lib/gds_api/test_helpers](/lib/gds_api/test_helpers).
87
84
 
88
- ### Dependencies
89
-
90
- Some of the helpers come with additional dependencies that you'll need to
91
- have installed and configured in your consuming app/lib.
92
-
93
- At time of writing, these are:
94
-
95
- * [WebMock](https://github.com/bblimke/webmock)
96
-
97
- ### Documentation
98
-
99
- See [RubyDoc](http://www.rubydoc.info/gems/gds-api-adapters) for some limited documentation.
100
-
101
- To run a Yard server locally to preview documentation, run:
102
-
103
- $ bundle exec yard server --reload
104
-
105
85
  ## Licence
106
86
 
107
87
  Released under the MIT Licence, a copy of which can be found in the file
data/Rakefile CHANGED
@@ -1,7 +1,5 @@
1
- # -*- encoding: utf-8 -*-
2
-
3
1
  require "rdoc/task"
4
- require 'rake/testtask'
2
+ require "rake/testtask"
5
3
 
6
4
  RDoc::Task.new do |rd|
7
5
  rd.rdoc_files.include("lib/**/*.rb")
@@ -13,14 +11,15 @@ Rake::TestTask.new("test") do |t|
13
11
  t.test_files = FileList["test/**/*_test.rb"]
14
12
  t.warning = false
15
13
  end
16
- task default: :test
17
14
 
18
- require 'pact_broker/client/tasks'
15
+ task default: %i[lint test]
16
+
17
+ require "pact_broker/client/tasks"
19
18
 
20
19
  def configure_pact_broker_location(task)
21
20
  task.pact_broker_base_url = ENV.fetch("PACT_BROKER_BASE_URL")
22
- if ENV['PACT_BROKER_USERNAME']
23
- task.pact_broker_basic_auth = { username: ENV['PACT_BROKER_USERNAME'], password: ENV['PACT_BROKER_PASSWORD'] }
21
+ if ENV["PACT_BROKER_USERNAME"]
22
+ task.pact_broker_basic_auth = { username: ENV["PACT_BROKER_USERNAME"], password: ENV["PACT_BROKER_PASSWORD"] }
24
23
  end
25
24
  end
26
25
 
@@ -31,5 +30,5 @@ end
31
30
 
32
31
  desc "Run the linter against changed files"
33
32
  task :lint do
34
- sh "bundle exec rubocop --format clang lib test"
33
+ sh "bundle exec rubocop --format clang"
35
34
  end
@@ -1,4 +1,6 @@
1
+ require "addressable"
1
2
  require "plek"
3
+ require "time"
2
4
  require "gds_api/asset_manager"
3
5
  require "gds_api/calendars"
4
6
  require "gds_api/content_store"
@@ -11,7 +13,6 @@ require "gds_api/mapit"
11
13
  require "gds_api/maslow"
12
14
  require "gds_api/organisations"
13
15
  require "gds_api/publishing_api"
14
- require "gds_api/publishing_api_v2"
15
16
  require "gds_api/router"
16
17
  require "gds_api/search"
17
18
  require "gds_api/support"
@@ -139,19 +140,6 @@ module GdsApi
139
140
  )
140
141
  end
141
142
 
142
- # Creates a GdsApi::PublishingApiV2 adapter
143
- #
144
- # This will set a bearer token if a PUBLISHING_API_BEARER_TOKEN environment
145
- # variable is set
146
- #
147
- # @return [GdsApi::PublishingApiV2]
148
- def self.publishing_api_v2(options = {})
149
- GdsApi::PublishingApiV2.new(
150
- Plek.find("publishing-api"),
151
- { bearer_token: ENV["PUBLISHING_API_BEARER_TOKEN"] }.merge(options),
152
- )
153
- end
154
-
155
143
  # Creates a GdsApi::Router adapter for communicating with Router API
156
144
  #
157
145
  # This will set a bearer token if a ROUTER_API_BEARER_TOKEN environment
@@ -136,7 +136,7 @@ class GdsApi::AssetManager < GdsApi::Base
136
136
  #
137
137
  # @raise [HTTPErrorResponse] if the request returns an error
138
138
  def whitehall_asset(legacy_url_path)
139
- get_json("#{base_url}/whitehall_assets/#{Addressable::URI.encode(legacy_url_path)}")
139
+ get_json("#{base_url}/whitehall_assets/#{uri_encode(legacy_url_path)}")
140
140
  end
141
141
 
142
142
  # Updates an asset given a hash with one +file+ attribute
@@ -24,7 +24,8 @@ class GdsApi::Base
24
24
  :put_json,
25
25
  :patch_json,
26
26
  :delete_json,
27
- :get_raw, :get_raw!,
27
+ :get_raw,
28
+ :get_raw!,
28
29
  :put_multipart,
29
30
  :post_multipart
30
31
 
@@ -69,9 +70,9 @@ private
69
70
  param_pairs = params.sort.map { |key, value|
70
71
  case value
71
72
  when Array
72
- value.map { |v|
73
+ value.map do |v|
73
74
  "#{CGI.escape(key.to_s + '[]')}=#{CGI.escape(v.to_s)}"
74
- }
75
+ end
75
76
  else
76
77
  "#{CGI.escape(key.to_s)}=#{CGI.escape(value.to_s)}"
77
78
  end
@@ -79,4 +80,8 @@ private
79
80
 
80
81
  "?#{param_pairs.join('&')}"
81
82
  end
83
+
84
+ def uri_encode(param)
85
+ Addressable::URI.encode(param.to_s)
86
+ end
82
87
  end
@@ -101,7 +101,7 @@ class GdsApi::EmailAlertApi < GdsApi::Base
101
101
  #
102
102
  # @return [nil]
103
103
  def unsubscribe(uuid)
104
- post_json("#{endpoint}/unsubscribe/#{uuid}")
104
+ post_json("#{endpoint}/unsubscribe/#{uri_encode(uuid)}")
105
105
  end
106
106
 
107
107
  # Unsubscribe subscriber from everything
@@ -110,7 +110,7 @@ class GdsApi::EmailAlertApi < GdsApi::Base
110
110
  #
111
111
  # @return [nil]
112
112
  def unsubscribe_subscriber(id)
113
- delete_json("#{endpoint}/subscribers/#{id}")
113
+ delete_json("#{endpoint}/subscribers/#{uri_encode(id)}")
114
114
  end
115
115
 
116
116
  # Subscribe
@@ -141,7 +141,7 @@ class GdsApi::EmailAlertApi < GdsApi::Base
141
141
  # subscriber_count
142
142
  # }
143
143
  def get_subscriber_list(slug:)
144
- get_json("#{endpoint}/subscriber-lists/#{slug}")
144
+ get_json("#{endpoint}/subscriber-lists/#{uri_encode(slug)}")
145
145
  end
146
146
 
147
147
  # Get a Subscription
@@ -158,7 +158,7 @@ class GdsApi::EmailAlertApi < GdsApi::Base
158
158
  # source
159
159
  # }
160
160
  def get_subscription(id)
161
- get_json("#{endpoint}/subscriptions/#{id}")
161
+ get_json("#{endpoint}/subscriptions/#{uri_encode(id)}")
162
162
  end
163
163
 
164
164
  # Get the latest Subscription that has the same subscriber_list
@@ -177,7 +177,7 @@ class GdsApi::EmailAlertApi < GdsApi::Base
177
177
  # source
178
178
  # }
179
179
  def get_latest_matching_subscription(id)
180
- get_json("#{endpoint}/subscriptions/#{id}/latest")
180
+ get_json("#{endpoint}/subscriptions/#{uri_encode(id)}/latest")
181
181
  end
182
182
 
183
183
  # Get Subscriptions for a Subscriber
@@ -188,9 +188,9 @@ class GdsApi::EmailAlertApi < GdsApi::Base
188
188
  # @return [Hash] subscriber, subscriptions
189
189
  def get_subscriptions(id:, order: nil)
190
190
  if order
191
- get_json("#{endpoint}/subscribers/#{id}/subscriptions?order=#{order}")
191
+ get_json("#{endpoint}/subscribers/#{uri_encode(id)}/subscriptions?order=#{uri_encode(order)}")
192
192
  else
193
- get_json("#{endpoint}/subscribers/#{id}/subscriptions")
193
+ get_json("#{endpoint}/subscribers/#{uri_encode(id)}/subscriptions")
194
194
  end
195
195
  end
196
196
 
@@ -202,7 +202,7 @@ class GdsApi::EmailAlertApi < GdsApi::Base
202
202
  # @return [Hash] subscriber
203
203
  def change_subscriber(id:, new_address:)
204
204
  patch_json(
205
- "#{endpoint}/subscribers/#{id}",
205
+ "#{endpoint}/subscribers/#{uri_encode(id)}",
206
206
  new_address: new_address,
207
207
  )
208
208
  end
@@ -215,7 +215,7 @@ class GdsApi::EmailAlertApi < GdsApi::Base
215
215
  # @return [Hash] subscription
216
216
  def change_subscription(id:, frequency:)
217
217
  patch_json(
218
- "#{endpoint}/subscriptions/#{id}",
218
+ "#{endpoint}/subscriptions/#{uri_encode(id)}",
219
219
  frequency: frequency,
220
220
  )
221
221
  end
@@ -224,16 +224,14 @@ class GdsApi::EmailAlertApi < GdsApi::Base
224
224
  #
225
225
  # @param [string] address Address to send verification email to
226
226
  # @param [string] destination Path on GOV.UK that subscriber will be emailed
227
- # @param [string, nil] redirect Path on GOV.UK to be encoded into the token for redirecting
228
227
  #
229
228
  # @return [Hash] subscriber
230
229
  #
231
- def send_subscriber_verification_email(address:, destination:, redirect: nil)
230
+ def send_subscriber_verification_email(address:, destination:)
232
231
  post_json(
233
232
  "#{endpoint}/subscribers/auth-token",
234
233
  address: address,
235
234
  destination: destination,
236
- redirect: redirect,
237
235
  )
238
236
  end
239
237
 
@@ -22,11 +22,10 @@ module GdsApi
22
22
  class HTTPErrorResponse < BaseError
23
23
  attr_accessor :code, :error_details
24
24
 
25
- def initialize(code, message = nil, error_details = nil, request_body = nil)
25
+ def initialize(code, message = nil, error_details = nil)
26
26
  super(message)
27
27
  @code = code
28
28
  @error_details = error_details
29
- @request_body = request_body
30
29
  end
31
30
  end
32
31
 
@@ -53,8 +52,8 @@ module GdsApi
53
52
  class HTTPGatewayTimeout < HTTPIntermittentServerError; end
54
53
 
55
54
  module ExceptionHandling
56
- def build_specific_http_error(error, url, details = nil, request_body = nil)
57
- message = "URL: #{url}\nResponse body:\n#{error.http_body}\n\nRequest body:\n#{request_body}"
55
+ def build_specific_http_error(error, url, details = nil)
56
+ message = "URL: #{url}\nResponse body:\n#{error.http_body}"
58
57
  code = error.http_code
59
58
  error_class_for_code(code).new(code, message, details)
60
59
  end
@@ -20,8 +20,8 @@ class GdsApi::Imminence < GdsApi::Base
20
20
  end
21
21
 
22
22
  def self.parse_place_hash(place_hash)
23
- location = self.extract_location_hash(place_hash["location"])
24
- address = self.extract_address_hash(place_hash)
23
+ location = extract_location_hash(place_hash["location"])
24
+ address = extract_address_hash(place_hash)
25
25
 
26
26
  place_hash.merge(location).merge(address)
27
27
  end
@@ -31,7 +31,7 @@ class GdsApi::Imminence < GdsApi::Base
31
31
  end
32
32
 
33
33
  def areas_for_postcode(postcode)
34
- url = "#{@endpoint}/areas/#{ERB::Util.url_encode(postcode)}.json"
34
+ url = "#{@endpoint}/areas/#{uri_encode(postcode)}.json"
35
35
  get_json(url)
36
36
  end
37
37
 
@@ -29,7 +29,7 @@ module GdsApi
29
29
  end
30
30
 
31
31
  def self.default_request_with_json_body_headers
32
- self.default_request_headers.merge(self.json_body_headers)
32
+ default_request_headers.merge(json_body_headers)
33
33
  end
34
34
 
35
35
  def self.json_body_headers
@@ -83,7 +83,7 @@ module GdsApi
83
83
  def do_raw_request(method, url, params = nil)
84
84
  do_request(method, url, params)
85
85
  rescue RestClient::Exception => e
86
- raise build_specific_http_error(e, url, nil, params)
86
+ raise build_specific_http_error(e, url, nil)
87
87
  end
88
88
 
89
89
  # method: the symbolic name of the method to use, e.g. :get, :post
@@ -105,11 +105,11 @@ module GdsApi
105
105
  rescue JSON::ParserError
106
106
  nil
107
107
  end
108
- raise build_specific_http_error(e, url, error_details, params)
108
+ raise build_specific_http_error(e, url, error_details)
109
109
  end
110
110
 
111
111
  # If no custom response is given, just instantiate Response
112
- create_response ||= Proc.new { |r| Response.new(r) }
112
+ create_response ||= proc { |r| Response.new(r) }
113
113
  create_response.call(response)
114
114
  end
115
115
 
@@ -177,10 +177,10 @@ module GdsApi
177
177
  ::RestClient::Request.execute(method_params)
178
178
  rescue Errno::ECONNREFUSED => e
179
179
  logger.error loggable.merge(status: "refused", error_message: e.message, error_class: e.class.name, end_time: Time.now.to_f).to_json
180
- raise GdsApi::EndpointNotFound.new("Could not connect to #{url}")
180
+ raise GdsApi::EndpointNotFound, "Could not connect to #{url}"
181
181
  rescue RestClient::Exceptions::Timeout => e
182
182
  logger.error loggable.merge(status: "timeout", error_message: e.message, error_class: e.class.name, end_time: Time.now.to_f).to_json
183
- raise GdsApi::TimedOutException.new
183
+ raise GdsApi::TimedOutException
184
184
  rescue URI::InvalidURIError => e
185
185
  logger.error loggable.merge(status: "invalid_uri", error_message: e.message, error_class: e.class.name, end_time: Time.now.to_f).to_json
186
186
  raise GdsApi::InvalidUrl
@@ -192,10 +192,10 @@ module GdsApi
192
192
  raise
193
193
  rescue Errno::ECONNRESET => e
194
194
  logger.error loggable.merge(status: "connection_reset", error_message: e.message, error_class: e.class.name, end_time: Time.now.to_f).to_json
195
- raise GdsApi::TimedOutException.new
195
+ raise GdsApi::TimedOutException
196
196
  rescue SocketError => e
197
197
  logger.error loggable.merge(status: "socket_error", error_message: e.message, error_class: e.class.name, end_time: Time.now.to_f).to_json
198
- raise GdsApi::SocketErrorException.new
198
+ raise GdsApi::SocketErrorException
199
199
  end
200
200
  end
201
201
  end
@@ -25,7 +25,7 @@ module GdsApi
25
25
  end
26
26
 
27
27
  def has_next_page?
28
- ! page_link("next").nil?
28
+ !page_link("next").nil?
29
29
  end
30
30
 
31
31
  def next_page
@@ -39,7 +39,7 @@ module GdsApi
39
39
  end
40
40
 
41
41
  def has_previous_page?
42
- ! page_link("previous").nil?
42
+ !page_link("previous").nil?
43
43
  end
44
44
 
45
45
  def previous_page
@@ -70,12 +70,12 @@ module GdsApi
70
70
  # point. Note that the responses are stored so subsequent pages will not be
71
71
  # loaded multiple times.
72
72
  def with_subsequent_pages
73
- Enumerator.new { |yielder|
74
- self.each do |i| yielder << i end
73
+ Enumerator.new do |yielder|
74
+ each { |i| yielder << i }
75
75
  if has_next_page?
76
- next_page.with_subsequent_pages.each do |i| yielder << i end
76
+ next_page.with_subsequent_pages.each { |i| yielder << i }
77
77
  end
78
- }
78
+ end
79
79
  end
80
80
 
81
81
  private
@@ -70,40 +70,40 @@ module GdsApi
70
70
 
71
71
  def search_terms(slug)
72
72
  options = {
73
- slug: slug,
74
- transaction: "search-terms",
75
- group_by: "searchKeyword",
76
- collect: "searchUniques:sum",
73
+ slug: slug,
74
+ transaction: "search-terms",
75
+ group_by: "searchKeyword",
76
+ collect: "searchUniques:sum",
77
77
  }
78
78
  statistics(options)
79
79
  end
80
80
 
81
81
  def searches(slug, is_multipart)
82
82
  options = {
83
- slug: slug,
84
- transaction: "search-terms",
85
- group_by: "pagePath",
86
- collect: "searchUniques:sum",
83
+ slug: slug,
84
+ transaction: "search-terms",
85
+ group_by: "pagePath",
86
+ collect: "searchUniques:sum",
87
87
  }
88
88
  statistics(options, is_multipart)
89
89
  end
90
90
 
91
91
  def page_views(slug, is_multipart)
92
92
  options = {
93
- slug: slug,
94
- transaction: "page-statistics",
95
- group_by: "pagePath",
96
- collect: "uniquePageviews:sum",
93
+ slug: slug,
94
+ transaction: "page-statistics",
95
+ group_by: "pagePath",
96
+ collect: "uniquePageviews:sum",
97
97
  }
98
98
  statistics(options, is_multipart)
99
99
  end
100
100
 
101
101
  def problem_reports(slug, is_multipart)
102
102
  options = {
103
- slug: slug,
104
- transaction: "page-contacts",
105
- group_by: "pagePath",
106
- collect: "total:sum",
103
+ slug: slug,
104
+ transaction: "page-contacts",
105
+ group_by: "pagePath",
106
+ collect: "total:sum",
107
107
  }
108
108
  statistics(options, is_multipart)
109
109
  end
@@ -114,11 +114,11 @@ module GdsApi
114
114
  # Backdrop can be found here: https://github.com/alphagov/backdrop
115
115
  def statistics(options, is_multipart = false)
116
116
  params = {
117
- group_by: options[:group_by],
118
- collect: options[:collect],
119
- duration: 42,
120
- period: "day",
121
- end_at: Date.today.to_time.getutc.iso8601,
117
+ group_by: options[:group_by],
118
+ collect: options[:collect],
119
+ duration: 42,
120
+ period: "day",
121
+ end_at: Date.today.to_time.getutc.iso8601,
122
122
  }
123
123
 
124
124
  filter_param = is_multipart ? :filter_by_prefix : :filter_by