mail-notify 1.2.0 → 2.0.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
+ # frozen_string_literal: true
2
+
3
+ module Mail
4
+ module Notify
5
+ class Engine < Rails::Engine
6
+ initializer "mail-notify.add_delivery_method", before: "action_mailer.set_configs" do
7
+ ActionMailer::Base.add_delivery_method(:notify, Mail::Notify::DeliveryMethod)
8
+
9
+ config.action_mailer.preview_interceptors = [:mail_notify_preview_interceptor]
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ ##
4
+ # This is a ActionMailer interceptor class for previews from the Notifications API
5
+ #
6
+ # See ActionMailer::Base:
7
+ #
8
+ # https://github.com/rails/rails/blob/v5.2.8.1/actionmailer/lib/action_mailer/base.rb#L367
9
+
10
+ class MailNotifyPreviewInterceptor
11
+ ##
12
+ # ActionMailer call back when a preview is being generated.
13
+ #
14
+ # Transforms the content of the passed in message.
15
+
16
+ def self.previewing_email(message)
17
+ new(message).transform!
18
+ end
19
+
20
+ ##
21
+ # Creates a new MailNotifyPreviewInterceptor ready for use.
22
+
23
+ def initialize(message)
24
+ @message = message
25
+ end
26
+
27
+ ##
28
+ # Transforms the content of the message to that from the Notifications API preview.
29
+ #
30
+ # The html is wrapped in a layout and rendered by the MailNotifyPreviewsControllers renderer.
31
+
32
+ def transform!
33
+ # the messages delivery method will be our Mail::Notify::DeliveryMethod and have the `preview` method.
34
+ preview = @message.delivery_method.preview(@message)
35
+
36
+ @message.subject = preview.subject
37
+ @message.html_part.body = renderer.render html: preview.html.html_safe, layout: "govuk_notify_layout"
38
+ @message.text_part.body = preview.body
39
+
40
+ @message
41
+ end
42
+
43
+ private
44
+
45
+ def renderer
46
+ # rendering in Rails without a controller gets far too complicated, instead
47
+ # we rely on this empty controller to do it for us.
48
+
49
+ MailNotifyPreviewsController.renderer
50
+ end
51
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ ##
4
+ # Empty controller used by MailNotifyPreviewInterceptor to render html.
5
+
6
+ class MailNotifyPreviewsController < ActionController::Base; end
@@ -2,21 +2,99 @@
2
2
 
3
3
  module Mail
4
4
  module Notify
5
+ ##
6
+ # The Mail Notify base Mailer class, overridden in Rails applications to provide the additional
7
+ # Notify behaviour along with the application behaviour.
8
+
5
9
  class Mailer < ActionMailer::Base
6
- def view_mail(template_id, headers)
7
- raise ArgumentError, "You must specify a template ID" if template_id.blank?
10
+ ##
11
+ # Set a default from address, will only be used in previews if a from address is not supplied
12
+ # by subclasses
13
+
14
+ default from: "preview@notifications.service.gov.uk"
15
+
16
+ ##
17
+ # Send an email where the content is managed in the Notify template.
18
+ #
19
+ # The required arguments are:
20
+ #
21
+ # - template_id
22
+ # - to address
23
+ #
24
+ # Can include personalisation.
25
+ #
26
+ # Add any additional headers in the options hash.
27
+ #
28
+ # A default subject is supplied as ActionMailer requires one, however it will never be used as
29
+ # the subject is assumed to be managed in the Notify template.
30
+
31
+ def template_mail(template_id, options)
32
+ raise ArgumentError, "You must specify a Notify template ID" if template_id.blank?
33
+ raise ArgumentError, "You must specify a to address" if options[:to].nil? || options[:to].blank?
34
+
35
+ message.template_id = template_id
36
+ message.reply_to_id = options[:reply_to_id]
37
+ message.reference = options[:reference]
38
+
39
+ message.personalisation = options[:personalisation] || {}
40
+
41
+ headers = options.except([:personalisation, :reply_to_id, :reference])
8
42
 
9
- mail(headers.merge(template_id: template_id))
43
+ headers[:subject] = "Subject managed in Notify" unless options[:subject]
44
+
45
+ # We have to set the html and the plain text content to nil to prevent Rails from looking
46
+ # for the content in the views. We replace nil with the content returned from Notify before
47
+ # sending or previewing
48
+ mail(headers) do |format|
49
+ format.text { nil }
50
+ format.html { nil }
51
+ end
10
52
  end
11
53
 
12
- def template_mail(template_id, headers)
13
- raise ArgumentError, "You must specify a template ID" if template_id.blank?
54
+ ##
55
+ # Send an email where the content is managed in the Rails application.
56
+ #
57
+ # The required arguments are:
58
+ #
59
+ # - template_id
60
+ # - to address
61
+ # - subject
62
+ #
63
+ # Personalisation will dropped as all content comes from the view provided by Rails.
64
+ #
65
+ # Add any additional headers in the options hash.
66
+
67
+ def view_mail(template_id, options)
68
+ raise ArgumentError, "You must specify a Notify template ID" if template_id.blank?
69
+ raise ArgumentError, "You must supply a to address" if options[:to].blank?
70
+ raise ArgumentError, "You must specify a subject" if options[:subject].blank?
71
+
72
+ message.template_id = template_id
73
+ message.reply_to_id = options[:reply_to_id]
74
+ message.reference = options[:reference]
75
+
76
+ subject = options[:subject]
77
+ headers = options.except([:personalisation, :reply_to_id, :reference])
14
78
 
15
- mail(headers.merge(body: "", subject: "", template_id: template_id))
79
+ # we have to render the view for the message and grab the raw source, then we set that as the
80
+ # body in the personalisation for sending to the Notify API.
81
+ body = mail(headers).body.raw_source
82
+
83
+ # The 'view mail' works by sending a subject and body as personalisation options, these are
84
+ # then used in the Notify template to provide content.
85
+ message.personalisation = {subject: subject, body: body}
86
+
87
+ mail(headers) do |format|
88
+ format.text { nil }
89
+ format.html { nil }
90
+ end
16
91
  end
17
92
 
93
+ ##
94
+ # allows blank personalisation options
95
+
18
96
  def blank_allowed(value)
19
- value.presence || Personalisation::BLANK
97
+ value.to_s
20
98
  end
21
99
  end
22
100
  end
@@ -3,9 +3,7 @@
3
3
  module Mail
4
4
  module Notify
5
5
  module Message
6
- def preview
7
- delivery_method.preview(self) if delivery_method.respond_to?(:preview)
8
- end
6
+ attr_accessor :template_id, :personalisation, :reply_to_id, :reference
9
7
  end
10
8
  end
11
9
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Mail
4
4
  module Notify
5
- VERSION = "1.2.0"
5
+ VERSION = "2.0.0"
6
6
  end
7
7
  end
data/lib/mail/notify.rb CHANGED
@@ -3,12 +3,12 @@
3
3
  require "notifications/client"
4
4
 
5
5
  require "mail/notify/version"
6
- require "mail/notify/railtie" if defined? Rails
6
+ require "mail/notify/engine" if defined? Rails
7
7
  require "mail/notify/delivery_method"
8
- require "mail/notify/personalisation"
9
8
  require "mail/notify/mailer"
10
9
  require "mail/notify/message"
11
- require "mail/notify/mailers_controller"
10
+ require "mail/notify/mail_notify_previews_controller"
11
+ require "mail/notify/mail_notify_preview_interceptor"
12
12
 
13
13
  Mail::Message.include Mail::Notify::Message
14
14
 
data/mail-notify.gemspec CHANGED
@@ -7,10 +7,10 @@ require "mail/notify/version"
7
7
  Gem::Specification.new do |spec|
8
8
  spec.name = "mail-notify"
9
9
  spec.version = Mail::Notify::VERSION
10
- spec.authors = ["Stuart Harrison"]
10
+ spec.authors = ["Stuart Harrison", "Meyric Rawlings"]
11
11
  spec.email = ["pezholio@gmail.com"]
12
12
 
13
- spec.summary = "ActionMailer support for the GOV.UK Notify API"
13
+ spec.summary = "Rails plugin, send and preview email with GOV.UK Notify"
14
14
  spec.homepage = "https://github.com/dxw/mail-notify"
15
15
  spec.license = "MIT"
16
16
 
@@ -26,20 +26,21 @@ Gem::Specification.new do |spec|
26
26
  spec.require_paths = ["lib"]
27
27
 
28
28
  spec.add_development_dependency "bundler", "~> 2.0"
29
- spec.add_development_dependency "coveralls", "~> 0.8.22"
29
+ spec.add_development_dependency "simplecov", "~> 0.21"
30
+ spec.add_development_dependency "simplecov-lcov"
30
31
  spec.add_development_dependency "pry", "~> 0.14.1"
31
- spec.add_development_dependency "rails", "~> 7"
32
- spec.add_development_dependency "rake", "~> 13.0.6"
32
+ spec.add_development_dependency "rails", "7.0.8"
33
+ spec.add_development_dependency "rake", "~> 13.2.1"
33
34
  spec.add_development_dependency "rspec-rails", "~> 5.1"
34
35
  spec.add_development_dependency "standard", "~> 1"
35
- spec.add_development_dependency "sqlite3", "~> 1.6.2"
36
- spec.add_development_dependency "webmock", "~> 3.16.0"
37
- spec.add_development_dependency "rspec-mocks", "~> 3.11.0"
36
+ spec.add_development_dependency "sqlite3", "~> 1.7.2"
37
+ spec.add_development_dependency "webmock", "~> 3.23.0"
38
+ spec.add_development_dependency "rspec-mocks", "~> 3.13.0"
38
39
 
39
- spec.add_dependency "actionmailer", ">= 5.2.4.6"
40
- spec.add_dependency "activesupport", ">= 5.2.4.6"
41
- spec.add_dependency "actionpack", ">= 5.2.7.1"
42
- spec.add_dependency "actionview", ">= 5.2.7.1"
43
- spec.add_dependency "notifications-ruby-client", "~> 5.1"
44
40
  spec.add_dependency "rack", ">= 2.1.4.1"
41
+ spec.add_dependency "actionmailer", ">= 5.2.8.1"
42
+ spec.add_dependency "activesupport", ">= 5.2.8.1"
43
+ spec.add_dependency "actionpack", ">= 5.2.8.1"
44
+ spec.add_dependency "actionview", ">= 5.2.8.1"
45
+ spec.add_dependency "notifications-ruby-client", "~> 6.0"
45
46
  end
data/renovate.json CHANGED
@@ -2,5 +2,7 @@
2
2
  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
3
3
  "extends": [
4
4
  "config:base"
5
- ]
5
+ ],
6
+ "dependencyDashboard": false,
7
+ "ignoreDeps": ["ruby-version"]
6
8
  }
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mail-notify
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stuart Harrison
8
+ - Meyric Rawlings
8
9
  autorequire:
9
10
  bindir: exe
10
11
  cert_chain: []
11
- date: 2023-10-25 00:00:00.000000000 Z
12
+ date: 2024-04-23 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: bundler
@@ -25,19 +26,33 @@ dependencies:
25
26
  - !ruby/object:Gem::Version
26
27
  version: '2.0'
27
28
  - !ruby/object:Gem::Dependency
28
- name: coveralls
29
+ name: simplecov
29
30
  requirement: !ruby/object:Gem::Requirement
30
31
  requirements:
31
32
  - - "~>"
32
33
  - !ruby/object:Gem::Version
33
- version: 0.8.22
34
+ version: '0.21'
34
35
  type: :development
35
36
  prerelease: false
36
37
  version_requirements: !ruby/object:Gem::Requirement
37
38
  requirements:
38
39
  - - "~>"
39
40
  - !ruby/object:Gem::Version
40
- version: 0.8.22
41
+ version: '0.21'
42
+ - !ruby/object:Gem::Dependency
43
+ name: simplecov-lcov
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
41
56
  - !ruby/object:Gem::Dependency
42
57
  name: pry
43
58
  requirement: !ruby/object:Gem::Requirement
@@ -56,30 +71,30 @@ dependencies:
56
71
  name: rails
57
72
  requirement: !ruby/object:Gem::Requirement
58
73
  requirements:
59
- - - "~>"
74
+ - - '='
60
75
  - !ruby/object:Gem::Version
61
- version: '7'
76
+ version: 7.0.8
62
77
  type: :development
63
78
  prerelease: false
64
79
  version_requirements: !ruby/object:Gem::Requirement
65
80
  requirements:
66
- - - "~>"
81
+ - - '='
67
82
  - !ruby/object:Gem::Version
68
- version: '7'
83
+ version: 7.0.8
69
84
  - !ruby/object:Gem::Dependency
70
85
  name: rake
71
86
  requirement: !ruby/object:Gem::Requirement
72
87
  requirements:
73
88
  - - "~>"
74
89
  - !ruby/object:Gem::Version
75
- version: 13.0.6
90
+ version: 13.2.1
76
91
  type: :development
77
92
  prerelease: false
78
93
  version_requirements: !ruby/object:Gem::Requirement
79
94
  requirements:
80
95
  - - "~>"
81
96
  - !ruby/object:Gem::Version
82
- version: 13.0.6
97
+ version: 13.2.1
83
98
  - !ruby/object:Gem::Dependency
84
99
  name: rspec-rails
85
100
  requirement: !ruby/object:Gem::Requirement
@@ -114,126 +129,126 @@ dependencies:
114
129
  requirements:
115
130
  - - "~>"
116
131
  - !ruby/object:Gem::Version
117
- version: 1.6.2
132
+ version: 1.7.2
118
133
  type: :development
119
134
  prerelease: false
120
135
  version_requirements: !ruby/object:Gem::Requirement
121
136
  requirements:
122
137
  - - "~>"
123
138
  - !ruby/object:Gem::Version
124
- version: 1.6.2
139
+ version: 1.7.2
125
140
  - !ruby/object:Gem::Dependency
126
141
  name: webmock
127
142
  requirement: !ruby/object:Gem::Requirement
128
143
  requirements:
129
144
  - - "~>"
130
145
  - !ruby/object:Gem::Version
131
- version: 3.16.0
146
+ version: 3.23.0
132
147
  type: :development
133
148
  prerelease: false
134
149
  version_requirements: !ruby/object:Gem::Requirement
135
150
  requirements:
136
151
  - - "~>"
137
152
  - !ruby/object:Gem::Version
138
- version: 3.16.0
153
+ version: 3.23.0
139
154
  - !ruby/object:Gem::Dependency
140
155
  name: rspec-mocks
141
156
  requirement: !ruby/object:Gem::Requirement
142
157
  requirements:
143
158
  - - "~>"
144
159
  - !ruby/object:Gem::Version
145
- version: 3.11.0
160
+ version: 3.13.0
146
161
  type: :development
147
162
  prerelease: false
148
163
  version_requirements: !ruby/object:Gem::Requirement
149
164
  requirements:
150
165
  - - "~>"
151
166
  - !ruby/object:Gem::Version
152
- version: 3.11.0
167
+ version: 3.13.0
153
168
  - !ruby/object:Gem::Dependency
154
- name: actionmailer
169
+ name: rack
155
170
  requirement: !ruby/object:Gem::Requirement
156
171
  requirements:
157
172
  - - ">="
158
173
  - !ruby/object:Gem::Version
159
- version: 5.2.4.6
174
+ version: 2.1.4.1
160
175
  type: :runtime
161
176
  prerelease: false
162
177
  version_requirements: !ruby/object:Gem::Requirement
163
178
  requirements:
164
179
  - - ">="
165
180
  - !ruby/object:Gem::Version
166
- version: 5.2.4.6
181
+ version: 2.1.4.1
167
182
  - !ruby/object:Gem::Dependency
168
- name: activesupport
183
+ name: actionmailer
169
184
  requirement: !ruby/object:Gem::Requirement
170
185
  requirements:
171
186
  - - ">="
172
187
  - !ruby/object:Gem::Version
173
- version: 5.2.4.6
188
+ version: 5.2.8.1
174
189
  type: :runtime
175
190
  prerelease: false
176
191
  version_requirements: !ruby/object:Gem::Requirement
177
192
  requirements:
178
193
  - - ">="
179
194
  - !ruby/object:Gem::Version
180
- version: 5.2.4.6
195
+ version: 5.2.8.1
181
196
  - !ruby/object:Gem::Dependency
182
- name: actionpack
197
+ name: activesupport
183
198
  requirement: !ruby/object:Gem::Requirement
184
199
  requirements:
185
200
  - - ">="
186
201
  - !ruby/object:Gem::Version
187
- version: 5.2.7.1
202
+ version: 5.2.8.1
188
203
  type: :runtime
189
204
  prerelease: false
190
205
  version_requirements: !ruby/object:Gem::Requirement
191
206
  requirements:
192
207
  - - ">="
193
208
  - !ruby/object:Gem::Version
194
- version: 5.2.7.1
209
+ version: 5.2.8.1
195
210
  - !ruby/object:Gem::Dependency
196
- name: actionview
211
+ name: actionpack
197
212
  requirement: !ruby/object:Gem::Requirement
198
213
  requirements:
199
214
  - - ">="
200
215
  - !ruby/object:Gem::Version
201
- version: 5.2.7.1
216
+ version: 5.2.8.1
202
217
  type: :runtime
203
218
  prerelease: false
204
219
  version_requirements: !ruby/object:Gem::Requirement
205
220
  requirements:
206
221
  - - ">="
207
222
  - !ruby/object:Gem::Version
208
- version: 5.2.7.1
223
+ version: 5.2.8.1
209
224
  - !ruby/object:Gem::Dependency
210
- name: notifications-ruby-client
225
+ name: actionview
211
226
  requirement: !ruby/object:Gem::Requirement
212
227
  requirements:
213
- - - "~>"
228
+ - - ">="
214
229
  - !ruby/object:Gem::Version
215
- version: '5.1'
230
+ version: 5.2.8.1
216
231
  type: :runtime
217
232
  prerelease: false
218
233
  version_requirements: !ruby/object:Gem::Requirement
219
234
  requirements:
220
- - - "~>"
235
+ - - ">="
221
236
  - !ruby/object:Gem::Version
222
- version: '5.1'
237
+ version: 5.2.8.1
223
238
  - !ruby/object:Gem::Dependency
224
- name: rack
239
+ name: notifications-ruby-client
225
240
  requirement: !ruby/object:Gem::Requirement
226
241
  requirements:
227
- - - ">="
242
+ - - "~>"
228
243
  - !ruby/object:Gem::Version
229
- version: 2.1.4.1
244
+ version: '6.0'
230
245
  type: :runtime
231
246
  prerelease: false
232
247
  version_requirements: !ruby/object:Gem::Requirement
233
248
  requirements:
234
- - - ">="
249
+ - - "~>"
235
250
  - !ruby/object:Gem::Version
236
- version: 2.1.4.1
251
+ version: '6.0'
237
252
  description:
238
253
  email:
239
254
  - pezholio@gmail.com
@@ -241,11 +256,11 @@ executables: []
241
256
  extensions: []
242
257
  extra_rdoc_files: []
243
258
  files:
244
- - ".coveralls.yml"
245
259
  - ".github/dependabot.yml"
246
260
  - ".github/setup-rubygems.sh"
247
- - ".github/workflows/build.yml"
261
+ - ".github/workflows/ci.yml"
248
262
  - ".github/workflows/publish.yml"
263
+ - ".github/workflows/rails-integration-tests.yml"
249
264
  - ".gitignore"
250
265
  - ".rspec"
251
266
  - ".rubocop.yml"
@@ -253,21 +268,24 @@ files:
253
268
  - CHANGELOG.md
254
269
  - CODE_OF_CONDUCT.md
255
270
  - CONTRIBUTING.md
271
+ - Dockerfile
256
272
  - Gemfile
257
273
  - LICENSE.txt
258
274
  - README.md
259
275
  - Rakefile
276
+ - app/views/layouts/govuk_notify_layout.html.erb
260
277
  - bin/console
278
+ - bin/rspec
261
279
  - bin/setup
280
+ - bin/standardrb
262
281
  - docs/screenshot.png
263
282
  - lib/mail/notify.rb
264
283
  - lib/mail/notify/delivery_method.rb
265
- - lib/mail/notify/layouts/govuk_notify_layout.html.erb
284
+ - lib/mail/notify/engine.rb
285
+ - lib/mail/notify/mail_notify_preview_interceptor.rb
286
+ - lib/mail/notify/mail_notify_previews_controller.rb
266
287
  - lib/mail/notify/mailer.rb
267
- - lib/mail/notify/mailers_controller.rb
268
288
  - lib/mail/notify/message.rb
269
- - lib/mail/notify/personalisation.rb
270
- - lib/mail/notify/railtie.rb
271
289
  - lib/mail/notify/version.rb
272
290
  - mail-notify.gemspec
273
291
  - renovate.json
@@ -293,5 +311,5 @@ requirements: []
293
311
  rubygems_version: 3.1.6
294
312
  signing_key:
295
313
  specification_version: 4
296
- summary: ActionMailer support for the GOV.UK Notify API
314
+ summary: Rails plugin, send and preview email with GOV.UK Notify
297
315
  test_files: []
data/.coveralls.yml DELETED
File without changes
@@ -1,27 +0,0 @@
1
- name: Build
2
-
3
- on: [push, pull_request]
4
-
5
- jobs:
6
- build:
7
-
8
- runs-on: ubuntu-latest
9
-
10
- steps:
11
- - uses: actions/checkout@v3
12
- - name: Set up Ruby
13
- uses: ruby/setup-ruby@v1
14
- - name: Set up cache
15
- uses: actions/cache@preview
16
- with:
17
- path: vendor/bundle
18
- key: ${{ runner.os }}-gem-${{ hashFiles('**/mail-notify.gemspec') }}
19
- restore-keys: |
20
- ${{ runner.os }}-gem-
21
- - name: Build and test with Rake
22
- run: |
23
- sudo apt-get update
24
- sudo apt-get install sqlite3 libsqlite3-dev
25
- gem install bundler
26
- bundle install --jobs 4 --retry 3 --path ./vendor/bundle
27
- bundle exec rake
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Mail
4
- module Notify
5
- module MailersController
6
- def preview
7
- @email_action = File.basename(params[:path])
8
- return super unless @preview.email_exists?(@email_action)
9
-
10
- @email = @preview.call(@email_action, params)
11
-
12
- return super unless notify?
13
-
14
- return render_part if params[:part]
15
-
16
- render_preview_wrapper
17
- end
18
-
19
- private
20
-
21
- def render_part
22
- # Add the current directory to the view path so that Rails can find
23
- # the `govuk_notify_layout` layout
24
- append_view_path(__dir__)
25
-
26
- response.content_type = "text/html"
27
- render html: @email.preview.html.html_safe, layout: "govuk_notify_layout"
28
- end
29
-
30
- def render_preview_wrapper
31
- @part = @email
32
- render action: "email", layout: false, formats: %i[html]
33
- end
34
-
35
- def notify?
36
- @email.delivery_method.instance_of?(Mail::Notify::DeliveryMethod)
37
- end
38
- end
39
- end
40
- end
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Mail
4
- module Notify
5
- class Personalisation
6
- BLANK = Object.new
7
-
8
- def initialize(mail)
9
- @body = mail.body.raw_source
10
- @subject = mail.subject
11
- @personalisation = mail[:personalisation]&.unparsed_value || {}
12
- end
13
-
14
- def to_h
15
- merged_options
16
- .reject { |_k, v| v.blank? }
17
- .transform_values { |value| (value == BLANK) ? "" : value }
18
- end
19
-
20
- private
21
-
22
- def merged_options
23
- {
24
- body: @body,
25
- subject: @subject
26
- }.merge(@personalisation)
27
- end
28
- end
29
- end
30
- end