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.
@@ -0,0 +1,13 @@
1
+ FROM ruby:2.6-slim
2
+
3
+ RUN \
4
+ echo "Install Debian packages" \
5
+ && apt-get update \
6
+ && apt-get install -y --no-install-recommends \
7
+ gcc \
8
+ make \
9
+ curl \
10
+ git \
11
+ gnupg
12
+
13
+ WORKDIR /var/project
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
- make -C docker build
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
@@ -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}")
@@ -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("Document is larger than 2MB") if file.size > Client::MAX_FILE_UPLOAD_SIZE
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, :message
4
+ attr_reader :code, :body
5
5
 
6
6
  def initialize(response)
7
7
  @code = response.code
8
- @message = message_from(response.body)
8
+ @body = parse_body(response.body)
9
+ super(build_message)
9
10
  end
10
11
 
11
- def to_s
12
- "#{code} #{message}"
13
- end
12
+ private
14
13
 
15
- def message_from(body)
16
- JSON.parse(body).fetch('errors')
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
  ##
@@ -9,6 +9,6 @@
9
9
 
10
10
  module Notifications
11
11
  class Client
12
- VERSION = "3.1.0".freeze
12
+ VERSION = "5.2.0".freeze
13
13
  end
14
14
  end
@@ -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.13"
26
- spec.add_development_dependency "rake", "~> 12.3"
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", "~> 4.10"
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: 3.1.0
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: 2019-02-27 00:00:00.000000000 Z
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.13'
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.13'
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: '12.3'
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: '12.3'
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: '4.10'
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: '4.10'
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
- rubyforge_project:
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
@@ -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
@@ -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
- .