notifications-ruby-client 3.1.0 → 5.2.0
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.
- checksums.yaml +4 -4
- data/.gitignore +2 -4
- data/CHANGELOG.md +26 -0
- data/CONTRIBUTING.md +6 -1
- data/DOCUMENTATION.md +227 -155
- data/Dockerfile +13 -0
- data/Makefile +14 -22
- data/bin/test_client.rb +23 -0
- data/lib/notifications/client.rb +8 -0
- data/lib/notifications/client/helper_methods.rb +3 -3
- data/lib/notifications/client/request_error.rb +14 -7
- data/lib/notifications/client/speaker.rb +13 -0
- data/lib/notifications/client/version.rb +1 -1
- data/notifications-ruby-client.gemspec +3 -4
- metadata +10 -26
- data/docker/Dockerfile +0 -26
- data/docker/Makefile +0 -16
data/Dockerfile
ADDED
data/Makefile
CHANGED
@@ -32,18 +32,14 @@ generate-env-file: ## Generate the environment file for running the tests inside
|
|
32
32
|
|
33
33
|
.PHONY: prepare-docker-runner-image
|
34
34
|
prepare-docker-runner-image: ## Prepare the Docker builder image
|
35
|
-
|
35
|
+
docker pull `grep "FROM " Dockerfile | cut -d ' ' -f 2` || true
|
36
|
+
docker build -t ${DOCKER_BUILDER_IMAGE_NAME} .
|
36
37
|
|
37
38
|
.PHONY: build-with-docker
|
38
39
|
build-with-docker: prepare-docker-runner-image ## Build inside a Docker container
|
39
40
|
docker run -i --rm \
|
40
41
|
--name "${DOCKER_CONTAINER_PREFIX}-build" \
|
41
42
|
-v "`pwd`:/var/project" \
|
42
|
-
-e http_proxy="${HTTP_PROXY}" \
|
43
|
-
-e HTTP_PROXY="${HTTP_PROXY}" \
|
44
|
-
-e https_proxy="${HTTPS_PROXY}" \
|
45
|
-
-e HTTPS_PROXY="${HTTPS_PROXY}" \
|
46
|
-
-e NO_PROXY="${NO_PROXY}" \
|
47
43
|
${DOCKER_BUILDER_IMAGE_NAME} \
|
48
44
|
make build
|
49
45
|
|
@@ -52,36 +48,32 @@ test-with-docker: prepare-docker-runner-image generate-env-file ## Run tests ins
|
|
52
48
|
docker run -i --rm \
|
53
49
|
--name "${DOCKER_CONTAINER_PREFIX}-test" \
|
54
50
|
-v "`pwd`:/var/project" \
|
55
|
-
-e http_proxy="${HTTP_PROXY}" \
|
56
|
-
-e HTTP_PROXY="${HTTP_PROXY}" \
|
57
|
-
-e https_proxy="${HTTPS_PROXY}" \
|
58
|
-
-e HTTPS_PROXY="${HTTPS_PROXY}" \
|
59
|
-
-e NO_PROXY="${NO_PROXY}" \
|
60
51
|
--env-file docker.env \
|
61
52
|
${DOCKER_BUILDER_IMAGE_NAME} \
|
62
|
-
make test
|
53
|
+
make build test
|
63
54
|
|
64
55
|
.PHONY: integration-test-with-docker
|
65
56
|
integration-test-with-docker: prepare-docker-runner-image generate-env-file ## Run integration tests inside a Docker container
|
66
57
|
docker run -i --rm \
|
67
58
|
--name "${DOCKER_CONTAINER_PREFIX}-integration-test" \
|
68
59
|
-v "`pwd`:/var/project" \
|
69
|
-
-e http_proxy="${HTTP_PROXY}" \
|
70
|
-
-e HTTP_PROXY="${HTTP_PROXY}" \
|
71
|
-
-e https_proxy="${HTTPS_PROXY}" \
|
72
|
-
-e HTTPS_PROXY="${HTTPS_PROXY}" \
|
73
|
-
-e NO_PROXY="${NO_PROXY}" \
|
74
60
|
--env-file docker.env \
|
75
61
|
${DOCKER_BUILDER_IMAGE_NAME} \
|
76
|
-
make integration-test
|
62
|
+
make build integration-test
|
63
|
+
|
64
|
+
.PHONY: get-client-version
|
65
|
+
get-client-version: ## Retrieve client version number from source code
|
66
|
+
@ruby -e "require './lib/notifications/client/version'; puts Notifications::Client::VERSION"
|
67
|
+
|
68
|
+
.PHONY: publish-to-rubygems
|
69
|
+
publish-to-rubygems: ## Create gemspec file and publish to rubygems
|
70
|
+
$(if ${GEM_HOST_API_KEY},,$(error Must specify GEM_HOST_API_KEY))
|
71
|
+
gem build notifications-ruby-client.gemspec --output=release.gem
|
72
|
+
gem push release.gem
|
77
73
|
|
78
74
|
.PHONY: clean-docker-containers
|
79
75
|
clean-docker-containers: ## Clean up any remaining docker containers
|
80
76
|
docker rm -f $(shell docker ps -q -f "name=${DOCKER_CONTAINER_PREFIX}") 2> /dev/null || true
|
81
77
|
|
82
|
-
.PHONY: run-govuk-lint
|
83
|
-
run-govuk-lint: ## Runs GOVUK-lint for Ruby
|
84
|
-
bundle exec govuk-lint-ruby lib spec bin/test_client
|
85
|
-
|
86
78
|
clean:
|
87
79
|
rm -rf vendor
|
data/bin/test_client.rb
CHANGED
@@ -20,6 +20,7 @@ def main
|
|
20
20
|
test_get_notification_by_id_endpoint(client, precompiled_letter_notification.id, 'precompiled_letter')
|
21
21
|
test_get_all_notifications(client)
|
22
22
|
test_get_received_texts
|
23
|
+
test_get_pdf_for_letter(client, letter_notification.id)
|
23
24
|
p 'ruby client integration tests pass'
|
24
25
|
exit 0
|
25
26
|
end
|
@@ -205,6 +206,28 @@ def test_get_notification_by_id_endpoint(client, id, message_type)
|
|
205
206
|
end
|
206
207
|
end
|
207
208
|
|
209
|
+
def test_get_pdf_for_letter(client, id)
|
210
|
+
response = nil
|
211
|
+
|
212
|
+
# try 15 times with 3 secs sleep between each attempt, to get the PDF
|
213
|
+
15.times do
|
214
|
+
begin
|
215
|
+
response = client.get_pdf_for_letter(id)
|
216
|
+
rescue Notifications::Client::BadRequestError
|
217
|
+
sleep(3)
|
218
|
+
end
|
219
|
+
|
220
|
+
if !response.nil?
|
221
|
+
break
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
unless !response.nil? && response.start_with?("%PDF-")
|
226
|
+
p "get_pdf_for_letter response for " + id + " is not a PDF: " + response.to_s
|
227
|
+
exit 1
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
208
231
|
def hash_key_should_not_be_nil(fields, obj, method_name)
|
209
232
|
fields.each do |field|
|
210
233
|
if obj.has_value?(:"#{field}")
|
data/lib/notifications/client.rb
CHANGED
@@ -67,6 +67,14 @@ module Notifications
|
|
67
67
|
)
|
68
68
|
end
|
69
69
|
|
70
|
+
##
|
71
|
+
# @param id [String]
|
72
|
+
# @see Notifications::Client::Speaker#get
|
73
|
+
# @return [String]
|
74
|
+
def get_pdf_for_letter(id)
|
75
|
+
speaker.get_pdf_for_letter(id)
|
76
|
+
end
|
77
|
+
|
70
78
|
##
|
71
79
|
# @param id [String]
|
72
80
|
# @see Notifications::Client::Speaker#get
|
@@ -1,9 +1,9 @@
|
|
1
1
|
require "base64"
|
2
2
|
|
3
3
|
module Notifications
|
4
|
-
def self.prepare_upload(file)
|
5
|
-
raise ArgumentError.new("
|
4
|
+
def self.prepare_upload(file, is_csv=false)
|
5
|
+
raise ArgumentError.new("File is larger than 2MB") if file.size > Client::MAX_FILE_UPLOAD_SIZE
|
6
6
|
|
7
|
-
{ file: Base64.strict_encode64(file.read) }
|
7
|
+
{ file: Base64.strict_encode64(file.read), is_csv: is_csv }
|
8
8
|
end
|
9
9
|
end
|
@@ -1,22 +1,29 @@
|
|
1
1
|
module Notifications
|
2
2
|
class Client
|
3
3
|
class RequestError < StandardError
|
4
|
-
attr_reader :code, :
|
4
|
+
attr_reader :code, :body
|
5
5
|
|
6
6
|
def initialize(response)
|
7
7
|
@code = response.code
|
8
|
-
@
|
8
|
+
@body = parse_body(response.body)
|
9
|
+
super(build_message)
|
9
10
|
end
|
10
11
|
|
11
|
-
|
12
|
-
"#{code} #{message}"
|
13
|
-
end
|
12
|
+
private
|
14
13
|
|
15
|
-
def
|
16
|
-
JSON.parse(body)
|
14
|
+
def parse_body(body)
|
15
|
+
JSON.parse(body)
|
17
16
|
rescue JSON::ParserError
|
18
17
|
body
|
19
18
|
end
|
19
|
+
|
20
|
+
def build_message
|
21
|
+
return body if body.is_a?(String)
|
22
|
+
|
23
|
+
error_messages = body.fetch('errors')
|
24
|
+
.map { |e| "#{e.fetch('error')}: #{e.fetch('message')}" }
|
25
|
+
error_messages.join(", ")
|
26
|
+
end
|
20
27
|
end
|
21
28
|
|
22
29
|
class ClientError < RequestError; end
|
@@ -118,6 +118,19 @@ module Notifications
|
|
118
118
|
perform_request!(request)
|
119
119
|
end
|
120
120
|
|
121
|
+
def get_pdf_for_letter(id)
|
122
|
+
path = "/v2/notifications/" << id << "/pdf"
|
123
|
+
request = Net::HTTP::Get.new(path, headers)
|
124
|
+
|
125
|
+
# can't use `perform_request!` because we're just returning raw binary data
|
126
|
+
response = open(request)
|
127
|
+
if response.is_a?(Net::HTTPClientError) || response.is_a?(Net::HTTPServerError)
|
128
|
+
raise build_error(response)
|
129
|
+
else
|
130
|
+
response.body
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
121
134
|
private
|
122
135
|
|
123
136
|
##
|
@@ -22,10 +22,9 @@ Gem::Specification.new do |spec|
|
|
22
22
|
|
23
23
|
spec.add_runtime_dependency "jwt", ">= 1.5", "< 3"
|
24
24
|
|
25
|
-
spec.add_development_dependency "bundler", "~> 1.
|
26
|
-
spec.add_development_dependency "rake", "~>
|
25
|
+
spec.add_development_dependency "bundler", "~> 1.7"
|
26
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
27
27
|
spec.add_development_dependency "rspec", "~> 3.7"
|
28
28
|
spec.add_development_dependency "webmock", "~> 3.4"
|
29
|
-
spec.add_development_dependency "factory_bot", "~>
|
30
|
-
spec.add_development_dependency "govuk-lint", "~> 3.8"
|
29
|
+
spec.add_development_dependency "factory_bot", "~> 5.2"
|
31
30
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: notifications-ruby-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 5.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Government Digital Service
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-08-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jwt
|
@@ -36,28 +36,28 @@ dependencies:
|
|
36
36
|
requirements:
|
37
37
|
- - "~>"
|
38
38
|
- !ruby/object:Gem::Version
|
39
|
-
version: '1.
|
39
|
+
version: '1.7'
|
40
40
|
type: :development
|
41
41
|
prerelease: false
|
42
42
|
version_requirements: !ruby/object:Gem::Requirement
|
43
43
|
requirements:
|
44
44
|
- - "~>"
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version: '1.
|
46
|
+
version: '1.7'
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rake
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|
50
50
|
requirements:
|
51
51
|
- - "~>"
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version: '
|
53
|
+
version: '13.0'
|
54
54
|
type: :development
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
57
|
requirements:
|
58
58
|
- - "~>"
|
59
59
|
- !ruby/object:Gem::Version
|
60
|
-
version: '
|
60
|
+
version: '13.0'
|
61
61
|
- !ruby/object:Gem::Dependency
|
62
62
|
name: rspec
|
63
63
|
requirement: !ruby/object:Gem::Requirement
|
@@ -92,28 +92,14 @@ dependencies:
|
|
92
92
|
requirements:
|
93
93
|
- - "~>"
|
94
94
|
- !ruby/object:Gem::Version
|
95
|
-
version: '
|
95
|
+
version: '5.2'
|
96
96
|
type: :development
|
97
97
|
prerelease: false
|
98
98
|
version_requirements: !ruby/object:Gem::Requirement
|
99
99
|
requirements:
|
100
100
|
- - "~>"
|
101
101
|
- !ruby/object:Gem::Version
|
102
|
-
version: '
|
103
|
-
- !ruby/object:Gem::Dependency
|
104
|
-
name: govuk-lint
|
105
|
-
requirement: !ruby/object:Gem::Requirement
|
106
|
-
requirements:
|
107
|
-
- - "~>"
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
version: '3.8'
|
110
|
-
type: :development
|
111
|
-
prerelease: false
|
112
|
-
version_requirements: !ruby/object:Gem::Requirement
|
113
|
-
requirements:
|
114
|
-
- - "~>"
|
115
|
-
- !ruby/object:Gem::Version
|
116
|
-
version: '3.8'
|
102
|
+
version: '5.2'
|
117
103
|
description:
|
118
104
|
email:
|
119
105
|
- notify@digital.cabinet-office.gov.uk
|
@@ -128,6 +114,7 @@ files:
|
|
128
114
|
- CHANGELOG.md
|
129
115
|
- CONTRIBUTING.md
|
130
116
|
- DOCUMENTATION.md
|
117
|
+
- Dockerfile
|
131
118
|
- Gemfile
|
132
119
|
- LICENSE
|
133
120
|
- Makefile
|
@@ -137,8 +124,6 @@ files:
|
|
137
124
|
- bin/generate_docker_env.sh
|
138
125
|
- bin/setup
|
139
126
|
- bin/test_client.rb
|
140
|
-
- docker/Dockerfile
|
141
|
-
- docker/Makefile
|
142
127
|
- lib/notifications/client.rb
|
143
128
|
- lib/notifications/client/helper_methods.rb
|
144
129
|
- lib/notifications/client/notification.rb
|
@@ -173,8 +158,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
173
158
|
- !ruby/object:Gem::Version
|
174
159
|
version: '0'
|
175
160
|
requirements: []
|
176
|
-
|
177
|
-
rubygems_version: 2.7.6
|
161
|
+
rubygems_version: 3.0.3
|
178
162
|
signing_key:
|
179
163
|
specification_version: 4
|
180
164
|
summary: Ruby client for GOV.UK Notifications API
|
data/docker/Dockerfile
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
FROM ruby:2.3.1-slim
|
2
|
-
|
3
|
-
ARG HTTP_PROXY
|
4
|
-
ARG HTTPS_PROXY
|
5
|
-
ARG NO_PROXY
|
6
|
-
|
7
|
-
RUN \
|
8
|
-
echo "Install Debian packages" \
|
9
|
-
&& ([ -z "$HTTP_PROXY" ] || echo "Acquire::http::Proxy \"${HTTP_PROXY}\";" > /etc/apt/apt.conf.d/99HttpProxy) \
|
10
|
-
&& apt-get update \
|
11
|
-
&& apt-get install -y --no-install-recommends \
|
12
|
-
gcc \
|
13
|
-
make \
|
14
|
-
curl \
|
15
|
-
git \
|
16
|
-
|
17
|
-
&& echo "Clean up" \
|
18
|
-
&& rm -rf /var/lib/apt/lists/* /tmp/*
|
19
|
-
|
20
|
-
ENV PATH=/var/project/vendor/bin:$PATH \
|
21
|
-
BUNDLE_PATH="/var/project/vendor/bundle" \
|
22
|
-
BUNDLE_BIN="/var/project/vendor/bin" \
|
23
|
-
BUNDLE_APP_CONFIG="/var/project/.bundle"
|
24
|
-
|
25
|
-
|
26
|
-
WORKDIR /var/project
|
data/docker/Makefile
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
.DEFAULT_GOAL := help
|
2
|
-
SHELL := /bin/bash
|
3
|
-
|
4
|
-
.PHONY: help
|
5
|
-
help:
|
6
|
-
@cat $(MAKEFILE_LIST) | grep -E '^[a-zA-Z_-]+:.*?## .*$$' | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
|
7
|
-
|
8
|
-
.PHONY: build
|
9
|
-
build:
|
10
|
-
docker pull `grep "FROM " Dockerfile | cut -d ' ' -f 2` || true
|
11
|
-
docker build \
|
12
|
-
--build-arg HTTP_PROXY="${HTTP_PROXY}" \
|
13
|
-
--build-arg HTTPS_PROXY="${HTTP_PROXY}" \
|
14
|
-
--build-arg NO_PROXY="${NO_PROXY}" \
|
15
|
-
-t govuk/notify-ruby-client-builder \
|
16
|
-
.
|