gds-api-adapters 63.4.0 → 67.0.1

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.
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 +3 -15
  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 +9 -9
  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 +9 -33
  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 +38 -59
  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 +14 -31
  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: a2d2ac699458ff698449cf7f1b853386a53cfc5f7c6cfa27b035619f4519a317
4
- data.tar.gz: b0602b61f003e2783b1c1316c94b211b33f141286d5f198c0536f2ba05d77156
3
+ metadata.gz: 98cbc4b338641aff5589875074e2fb2d6ef4227a004f04855cfffbf9c0eb5348
4
+ data.tar.gz: 5934de7d813457a5cf01c026ff91bed99445492a43df9c9704abc123db140c7d
5
5
  SHA512:
6
- metadata.gz: a82622969113834480c212952fddb7dc006092be6e59a328426f3a2bc3425ca49887d7652088c65e3e8722bc3a60137e337382f0f2a8cecfb08aa814aed788d8
7
- data.tar.gz: b6aa5456c1c18ee1facaff816f5bac337f057cf441688bd20cfb0d33fd4d326706a57b4c0feae4e8304e2a436feb693c67a12b0afaf54f98cc823030e6bb92e9
6
+ metadata.gz: 00bab1a4b50de5937794758bbdca11c093d3d58c147fed73cb1c3ad89c0c1a9c8d4e2cac2691a31540d9d5c1f92de9a413c25b339a1430dbc367e7f5649afe08
7
+ data.tar.gz: 14a690b77a277f543b800d48da87cac0c78e6edaf2ced0e04a5f9244104707b3f3cf34e77f9cba0cd39e3fca0c53a2672659a17b00611d575d28c43bd25d236b
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
@@ -197,6 +185,6 @@ module GdsApi
197
185
  #
198
186
  # @return [GdsApi::Worldwide]
199
187
  def self.worldwide(options = {})
200
- GdsApi::Worldwide.new(Plek.find("whitehall-frontend"), options)
188
+ GdsApi::Worldwide.new(Plek.new.website_root, options)
201
189
  end
202
190
  end
@@ -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
@@ -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