gds-api-adapters 67.0.0 → 67.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 35ee9f533f626d99fe8f62ae41b6445e2f75729c333b096c52b90c49555e1d69
4
- data.tar.gz: b1413571e9e8bf09d19497c88790549c947c66258fd25bd11884a6ade859acdf
3
+ metadata.gz: 4f4e9476c570389a75e06b65715133d92402d748e4b15fd0b30782a7eca32847
4
+ data.tar.gz: e1e5d3284178b1f22f29dc63d1cf0fde389c82224f56146d6db40304fa211ca0
5
5
  SHA512:
6
- metadata.gz: b05108e31ccb65d3c2e4735792de423580f2cdbb2ea8d8d0c6de92955b24084559f7e25b6aaed2cbca34b17734d37f2f9df98a5f8d676bcf8e072dc3880aef2b
7
- data.tar.gz: 37ff704afc41d4b516ee043358099d9aadc4097ab0d6f70f47a3c38ed922e29d22c0f3b82a1bcac612c53af8c9649a72066709ddf8134ffe1279125f4e81d62f
6
+ metadata.gz: 392d0964f21b56895aab0fb54a0a566b4c7186f69dbbefa85a31001a255d6cd3a296e982c72df36cc538f93c7beda156430945b86c626a66a50aa35cef29f7b3
7
+ data.tar.gz: 9a41486139d341afcd11559b40407c6bf58836e4aad2f15dce2380297da40e9edb2ef29176410708d067ed692672c54de5cee1b4e455176d4b455682398f30eb
@@ -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"
@@ -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
@@ -80,4 +80,8 @@ private
80
80
 
81
81
  "?#{param_pairs.join('&')}"
82
82
  end
83
+
84
+ def uri_encode(param)
85
+ Addressable::URI.encode(param.to_s)
86
+ end
83
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,18 +110,19 @@ 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
117
117
  #
118
118
  # @return [Hash] subscription_id
119
- def subscribe(subscriber_list_id:, address:, frequency: "immediately")
119
+ def subscribe(subscriber_list_id:, address:, frequency: "immediately", skip_confirmation_email: false)
120
120
  post_json(
121
121
  "#{endpoint}/subscriptions",
122
122
  subscriber_list_id: subscriber_list_id,
123
123
  address: address,
124
124
  frequency: frequency,
125
+ skip_confirmation_email: skip_confirmation_email,
125
126
  )
126
127
  end
127
128
 
@@ -141,7 +142,7 @@ class GdsApi::EmailAlertApi < GdsApi::Base
141
142
  # subscriber_count
142
143
  # }
143
144
  def get_subscriber_list(slug:)
144
- get_json("#{endpoint}/subscriber-lists/#{slug}")
145
+ get_json("#{endpoint}/subscriber-lists/#{uri_encode(slug)}")
145
146
  end
146
147
 
147
148
  # Get a Subscription
@@ -158,7 +159,7 @@ class GdsApi::EmailAlertApi < GdsApi::Base
158
159
  # source
159
160
  # }
160
161
  def get_subscription(id)
161
- get_json("#{endpoint}/subscriptions/#{id}")
162
+ get_json("#{endpoint}/subscriptions/#{uri_encode(id)}")
162
163
  end
163
164
 
164
165
  # Get the latest Subscription that has the same subscriber_list
@@ -177,7 +178,7 @@ class GdsApi::EmailAlertApi < GdsApi::Base
177
178
  # source
178
179
  # }
179
180
  def get_latest_matching_subscription(id)
180
- get_json("#{endpoint}/subscriptions/#{id}/latest")
181
+ get_json("#{endpoint}/subscriptions/#{uri_encode(id)}/latest")
181
182
  end
182
183
 
183
184
  # Get Subscriptions for a Subscriber
@@ -188,9 +189,9 @@ class GdsApi::EmailAlertApi < GdsApi::Base
188
189
  # @return [Hash] subscriber, subscriptions
189
190
  def get_subscriptions(id:, order: nil)
190
191
  if order
191
- get_json("#{endpoint}/subscribers/#{id}/subscriptions?order=#{order}")
192
+ get_json("#{endpoint}/subscribers/#{uri_encode(id)}/subscriptions?order=#{uri_encode(order)}")
192
193
  else
193
- get_json("#{endpoint}/subscribers/#{id}/subscriptions")
194
+ get_json("#{endpoint}/subscribers/#{uri_encode(id)}/subscriptions")
194
195
  end
195
196
  end
196
197
 
@@ -202,7 +203,7 @@ class GdsApi::EmailAlertApi < GdsApi::Base
202
203
  # @return [Hash] subscriber
203
204
  def change_subscriber(id:, new_address:)
204
205
  patch_json(
205
- "#{endpoint}/subscribers/#{id}",
206
+ "#{endpoint}/subscribers/#{uri_encode(id)}",
206
207
  new_address: new_address,
207
208
  )
208
209
  end
@@ -215,7 +216,7 @@ class GdsApi::EmailAlertApi < GdsApi::Base
215
216
  # @return [Hash] subscription
216
217
  def change_subscription(id:, frequency:)
217
218
  patch_json(
218
- "#{endpoint}/subscriptions/#{id}",
219
+ "#{endpoint}/subscriptions/#{uri_encode(id)}",
219
220
  frequency: frequency,
220
221
  )
221
222
  end
@@ -224,16 +225,14 @@ class GdsApi::EmailAlertApi < GdsApi::Base
224
225
  #
225
226
  # @param [string] address Address to send verification email to
226
227
  # @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
228
  #
229
229
  # @return [Hash] subscriber
230
230
  #
231
- def send_subscriber_verification_email(address:, destination:, redirect: nil)
231
+ def send_subscriber_verification_email(address:, destination:)
232
232
  post_json(
233
233
  "#{endpoint}/subscribers/auth-token",
234
234
  address: address,
235
235
  destination: destination,
236
- redirect: redirect,
237
236
  )
238
237
  end
239
238
 
@@ -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
 
@@ -12,6 +12,9 @@ module GdsApi
12
12
  def publish(options)
13
13
  logger.info("Publishing #{options.fetch(:type)} route #{options.fetch(:base_path)}, routing to #{options.fetch(:rendering_app)}")
14
14
 
15
+ update_type = options.fetch(:update_type, "major")
16
+ locale = options.fetch(:locale, "en")
17
+
15
18
  put_content_response = publishing_api.put_content(
16
19
  options.fetch(:content_id),
17
20
  base_path: options.fetch(:base_path),
@@ -19,7 +22,7 @@ module GdsApi
19
22
  schema_name: options.fetch(:schema_name, "special_route"),
20
23
  title: options.fetch(:title),
21
24
  description: options.fetch(:description, ""),
22
- locale: "en",
25
+ locale: locale,
23
26
  details: {},
24
27
  routes: [
25
28
  {
@@ -30,11 +33,11 @@ module GdsApi
30
33
  publishing_app: options.fetch(:publishing_app),
31
34
  rendering_app: options.fetch(:rendering_app),
32
35
  public_updated_at: time.now.iso8601,
33
- update_type: options.fetch(:update_type, "major"),
36
+ update_type: update_type,
34
37
  )
35
38
 
36
39
  publishing_api.patch_links(options.fetch(:content_id), links: options[:links]) if options[:links]
37
- publishing_api.publish(options.fetch(:content_id))
40
+ publishing_api.publish(options.fetch(:content_id), update_type, locale: locale)
38
41
  put_content_response
39
42
  end
40
43
 
@@ -1,6 +1,5 @@
1
1
  require "json"
2
2
  require "forwardable"
3
- require "rack/cache"
4
3
 
5
4
  module GdsApi
6
5
  # This wraps an HTTP response with a JSON body.
@@ -21,6 +20,77 @@ module GdsApi
21
20
  extend Forwardable
22
21
  include Enumerable
23
22
 
23
+ class CacheControl < Hash
24
+ PATTERN = /([-a-z]+)(?:\s*=\s*([^,\s]+))?,?+/i.freeze
25
+
26
+ def initialize(value = nil)
27
+ parse(value)
28
+ end
29
+
30
+ def public?
31
+ self["public"]
32
+ end
33
+
34
+ def private?
35
+ self["private"]
36
+ end
37
+
38
+ def no_cache?
39
+ self["no-cache"]
40
+ end
41
+
42
+ def no_store?
43
+ self["no-store"]
44
+ end
45
+
46
+ def must_revalidate?
47
+ self["must-revalidate"]
48
+ end
49
+
50
+ def proxy_revalidate?
51
+ self["proxy-revalidate"]
52
+ end
53
+
54
+ def max_age
55
+ self["max-age"].to_i if key?("max-age")
56
+ end
57
+
58
+ def reverse_max_age
59
+ self["r-maxage"].to_i if key?("r-maxage")
60
+ end
61
+ alias_method :r_maxage, :reverse_max_age
62
+
63
+ def shared_max_age
64
+ self["s-maxage"].to_i if key?("r-maxage")
65
+ end
66
+ alias_method :s_maxage, :shared_max_age
67
+
68
+ def to_s
69
+ directives = []
70
+ values = []
71
+
72
+ each do |key, value|
73
+ if value == true
74
+ directives << key
75
+ elsif value
76
+ values << "#{key}=#{value}"
77
+ end
78
+ end
79
+
80
+ (directives.sort + values.sort).join(", ")
81
+ end
82
+
83
+ private
84
+
85
+ def parse(header)
86
+ return if header.nil? || header.empty?
87
+
88
+ header.scan(PATTERN).each do |name, value|
89
+ self[name.downcase] = value || true
90
+ end
91
+ end
92
+ end
93
+
24
94
  def_delegators :to_hash, :[], :"<=>", :each, :dig
25
95
 
26
96
  def initialize(http_response, options = {})
@@ -63,7 +133,7 @@ module GdsApi
63
133
  end
64
134
 
65
135
  def cache_control
66
- @cache_control ||= Rack::Cache::CacheControl.new(headers[:cache_control])
136
+ @cache_control ||= CacheControl.new(headers[:cache_control])
67
137
  end
68
138
 
69
139
  def to_hash
@@ -98,9 +98,9 @@ module GdsApi
98
98
  subscriptions.each do |id, params|
99
99
  latest_id, latest_params = get_latest_matching(params, subscriptions)
100
100
  stub_request(:get, "#{EMAIL_ALERT_API_ENDPOINT}/subscriptions/#{id}")
101
- .to_return(status: 200, body: get_subscription_response(id, params).to_json)
101
+ .to_return(status: 200, body: get_subscription_response(id, **params).to_json)
102
102
  stub_request(:get, "#{EMAIL_ALERT_API_ENDPOINT}/subscriptions/#{id}/latest")
103
- .to_return(status: 200, body: get_subscription_response(latest_id, latest_params).to_json)
103
+ .to_return(status: 200, body: get_subscription_response(latest_id, **latest_params).to_json)
104
104
  end
105
105
  end
106
106
 
@@ -218,24 +218,37 @@ module GdsApi
218
218
  .to_return(status: 404)
219
219
  end
220
220
 
221
- def stub_email_alert_api_creates_a_subscription(subscriber_list_id, address, frequency, returned_subscription_id)
221
+ def stub_email_alert_api_creates_a_subscription(subscriber_list_id, address, frequency, returned_subscription_id, skip_confirmation_email: false)
222
222
  stub_request(:post, "#{EMAIL_ALERT_API_ENDPOINT}/subscriptions")
223
223
  .with(
224
- body: { subscriber_list_id: subscriber_list_id, address: address, frequency: frequency }.to_json,
225
- ).to_return(status: 201, body: { subscription_id: returned_subscription_id }.to_json)
224
+ body: {
225
+ subscriber_list_id: subscriber_list_id,
226
+ address: address,
227
+ frequency: frequency,
228
+ skip_confirmation_email: skip_confirmation_email,
229
+ }.to_json,
230
+ ).to_return(status: 201, body: { id: returned_subscription_id }.to_json)
226
231
  end
227
232
 
228
233
  def stub_email_alert_api_creates_an_existing_subscription(subscriber_list_id, address, frequency, returned_subscription_id)
229
234
  stub_request(:post, "#{EMAIL_ALERT_API_ENDPOINT}/subscriptions")
230
235
  .with(
231
- body: { subscriber_list_id: subscriber_list_id, address: address, frequency: frequency }.to_json,
232
- ).to_return(status: 200, body: { subscription_id: returned_subscription_id }.to_json)
236
+ body: hash_including(
237
+ subscriber_list_id: subscriber_list_id,
238
+ address: address,
239
+ frequency: frequency,
240
+ ),
241
+ ).to_return(status: 200, body: { id: returned_subscription_id }.to_json)
233
242
  end
234
243
 
235
244
  def stub_email_alert_api_refuses_to_create_subscription(subscriber_list_id, address, frequency)
236
245
  stub_request(:post, "#{EMAIL_ALERT_API_ENDPOINT}/subscriptions")
237
246
  .with(
238
- body: { subscriber_list_id: subscriber_list_id, address: address, frequency: frequency }.to_json,
247
+ body: hash_including(
248
+ subscriber_list_id: subscriber_list_id,
249
+ address: address,
250
+ frequency: frequency,
251
+ ),
239
252
  ).to_return(status: 422)
240
253
  end
241
254
 
@@ -324,7 +337,7 @@ module GdsApi
324
337
  "id" => id,
325
338
  "frequency" => frequency,
326
339
  "source" => "user_signed_up",
327
- "ended_at" => ended ? Time.now.to_datetime.rfc3339 : nil,
340
+ "ended_at" => ended ? Time.now.iso8601 : nil,
328
341
  "ended_reason" => ended ? "unsubscribed" : nil,
329
342
  "subscriber" => {
330
343
  "id" => subscriber_id,
@@ -394,9 +394,11 @@ module GdsApi
394
394
  # Stub GET /v2/content/:content_id to return a 404 response
395
395
  #
396
396
  # @param content_id [UUID]
397
- def stub_publishing_api_does_not_have_item(content_id)
397
+ def stub_publishing_api_does_not_have_item(content_id, params = {})
398
398
  url = PUBLISHING_API_V2_ENDPOINT + "/content/" + content_id
399
- stub_request(:get, url).to_return(status: 404, body: resource_not_found(content_id, "content item").to_json, headers: {})
399
+ stub_request(:get, url)
400
+ .with(query: hash_including(params))
401
+ .to_return(status: 404, body: resource_not_found(content_id, "content item").to_json, headers: {})
400
402
  end
401
403
 
402
404
  # Stub a request to links endpoint
@@ -1,3 +1,3 @@
1
1
  module GdsApi
2
- VERSION = "67.0.0".freeze
2
+ VERSION = "67.2.1".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gds-api-adapters
3
3
  version: !ruby/object:Gem::Version
4
- version: 67.0.0
4
+ version: 67.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - GOV.UK Dev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-27 00:00:00.000000000 Z
11
+ date: 2020-12-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable
@@ -66,20 +66,6 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: 1.9.0
69
- - !ruby/object:Gem::Dependency
70
- name: rack-cache
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :runtime
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
69
  - !ruby/object:Gem::Dependency
84
70
  name: rest-client
85
71
  requirement: !ruby/object:Gem::Requirement
@@ -156,14 +142,14 @@ dependencies:
156
142
  requirements:
157
143
  - - "~>"
158
144
  - !ruby/object:Gem::Version
159
- version: '1.3'
145
+ version: '1.11'
160
146
  type: :development
161
147
  prerelease: false
162
148
  version_requirements: !ruby/object:Gem::Requirement
163
149
  requirements:
164
150
  - - "~>"
165
151
  - !ruby/object:Gem::Version
166
- version: '1.3'
152
+ version: '1.11'
167
153
  - !ruby/object:Gem::Dependency
168
154
  name: pact
169
155
  requirement: !ruby/object:Gem::Requirement
@@ -179,47 +165,47 @@ dependencies:
179
165
  - !ruby/object:Gem::Version
180
166
  version: '1.20'
181
167
  - !ruby/object:Gem::Dependency
182
- name: pact-consumer-minitest
168
+ name: pact_broker-client
183
169
  requirement: !ruby/object:Gem::Requirement
184
170
  requirements:
185
171
  - - "~>"
186
172
  - !ruby/object:Gem::Version
187
- version: '1.0'
173
+ version: '1.14'
188
174
  type: :development
189
175
  prerelease: false
190
176
  version_requirements: !ruby/object:Gem::Requirement
191
177
  requirements:
192
178
  - - "~>"
193
179
  - !ruby/object:Gem::Version
194
- version: '1.0'
180
+ version: '1.14'
195
181
  - !ruby/object:Gem::Dependency
196
- name: pact-mock_service
182
+ name: pact-consumer-minitest
197
183
  requirement: !ruby/object:Gem::Requirement
198
184
  requirements:
199
185
  - - "~>"
200
186
  - !ruby/object:Gem::Version
201
- version: '2.6'
187
+ version: '1.0'
202
188
  type: :development
203
189
  prerelease: false
204
190
  version_requirements: !ruby/object:Gem::Requirement
205
191
  requirements:
206
192
  - - "~>"
207
193
  - !ruby/object:Gem::Version
208
- version: '2.6'
194
+ version: '1.0'
209
195
  - !ruby/object:Gem::Dependency
210
- name: pact_broker-client
196
+ name: pact-mock_service
211
197
  requirement: !ruby/object:Gem::Requirement
212
198
  requirements:
213
199
  - - "~>"
214
200
  - !ruby/object:Gem::Version
215
- version: '1.14'
201
+ version: '3.6'
216
202
  type: :development
217
203
  prerelease: false
218
204
  version_requirements: !ruby/object:Gem::Requirement
219
205
  requirements:
220
206
  - - "~>"
221
207
  - !ruby/object:Gem::Version
222
- version: '1.14'
208
+ version: '3.6'
223
209
  - !ruby/object:Gem::Dependency
224
210
  name: pry
225
211
  requirement: !ruby/object:Gem::Requirement
@@ -461,7 +447,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
461
447
  - !ruby/object:Gem::Version
462
448
  version: '0'
463
449
  requirements: []
464
- rubygems_version: 3.0.3
450
+ rubygems_version: 3.1.4
465
451
  signing_key:
466
452
  specification_version: 4
467
453
  summary: Adapters to work with GDS APIs