createsend-rails 0.3.4

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: d957ab4e6a2b9d26a77774ffac12a887024561dedffb6b12090c8d810e48c6b0
4
+ data.tar.gz: 547f4cd34f582ae2a3236dec69b275c435a06ab4521710ffb30478903f2532c5
5
+ SHA512:
6
+ metadata.gz: 74fefa0cb13865e050a7cd2915762b256f8f98ab770612b997f569ccb3f7fdc9676c51b990ba1e61975a520e772f40cbbb2c349521a0f302bbe3e138b4c47876
7
+ data.tar.gz: 9be01324754baa6069ca682765b50a5b8c1d629a54fcf8f28be58ecfd24bf4fd649840d5d59fef200dd3d32f3f52347e2dff4cad05764c5c38969031b234fd88
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 Made Tech Ltd
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,51 @@
1
+ # Campaign Monitor - Smart Transactional Emails for Rails
2
+
3
+ [![Build Status](https://travis-ci.org/madetech/createsend-rails.svg?branch=master)](https://travis-ci.org/madetech/createsend-rails)
4
+
5
+
6
+ The `create_send_rails` Gem drops into ActionMailer and sends transactional emails via the [Campaign Monitor API](https://www.campaignmonitor.com/api/), using its [Smart Email](https://www.campaignmonitor.com/api/transactional/#send_a_smart_email) feature.
7
+
8
+ It updates ActionMailer so it defaults to JSON mailer views and allows you to define the data required for each of your mailers.
9
+
10
+ ## Getting Started
11
+
12
+ To get started, add the following line to your applications `Gemfile`:
13
+
14
+ ```ruby
15
+ gem 'createsend-rails'
16
+ ```
17
+ Then update your environment files and set `delivery_method` to `create_send` and include your CampaignMonitor `api_key` within the settings block.
18
+
19
+ ```ruby
20
+ config.action_mailer.delivery_method = :create_send
21
+ config.action_mailer.create_send_settings = {
22
+ api_key: 'INSERT_API_KEY'
23
+ }
24
+ ```
25
+ Now go into your `views/*_mailer/` and add a `.json` view, which defines the data attributes required by your Smart Email template. Below is an example of a password reset email.
26
+
27
+ ```json
28
+ {
29
+ "smart_email_id": "SMART_EMAIL_ID",
30
+ "consent_to_track: "yes|no|unchanged",
31
+ "language": "<%= @user.language %>",
32
+ "name": "<%= @user.name %>",
33
+ "reset_url": "<%= @edit_password_reset_url %>"
34
+ }
35
+ ```
36
+
37
+ ## Credits
38
+
39
+ ![made](https://s3-eu-west-1.amazonaws.com/made-assets/googleapps/google-apps.png)
40
+
41
+ Developed and maintained by [Made Tech Ltd](https://www.madetech.com/). Key contributions:
42
+
43
+
44
+ * [Andrew Scott](https://github.com/askl56)
45
+ * [Rory MacDonald](https://github.com/rorymacdonald)
46
+ * [Seb Ashton](https://github.com/SebAshton)
47
+ * [Martin Vandersteen](https://github.com/MartinVandersteen)
48
+
49
+
50
+ ## License
51
+ Copyright © 2016 [Made Tech Ltd](https://www.madetech.com/). It is free software, and may be redistributed under the terms specified in the MIT-LICENSE file.
@@ -0,0 +1,29 @@
1
+ module CreatesendRails
2
+ class Deliverer
3
+ attr_accessor :settings
4
+
5
+ def initialize(values)
6
+ self.settings = {}.merge(values)
7
+ end
8
+
9
+ def deliver!(mail)
10
+ @mail = mail
11
+ smart_email = ::CreateSend::Transactional::SmartEmail.new(auth, smart_email_id)
12
+ smart_email.send(mail_data)
13
+ end
14
+
15
+ private
16
+
17
+ def auth
18
+ settings.dup
19
+ end
20
+
21
+ def mail_data
22
+ SmartEmailFormatter.new(@mail).format
23
+ end
24
+
25
+ def smart_email_id
26
+ mail_data[:data][:smart_email_id]
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,10 @@
1
+ module CreatesendRails
2
+ module SmartEmailer
3
+ def smart_mail(headers = {}, &block)
4
+ mail(headers, block)
5
+ end
6
+ end
7
+
8
+ module ViewDefaults
9
+ end
10
+ end
@@ -0,0 +1,16 @@
1
+ module CreatesendRails
2
+ module Hash
3
+ def deep_reject(&block)
4
+ dup.deep_reject!(&block)
5
+ end
6
+
7
+ def deep_reject!(&block)
8
+ each do |key, value|
9
+ value.deep_reject!(&block) if value.is_a?(Hash)
10
+ delete(key) if yield(key, value)
11
+ end
12
+ end
13
+ end
14
+ end
15
+
16
+ Hash.include(CreatesendRails::Hash)
@@ -0,0 +1,5 @@
1
+ module CreatesendRails
2
+ class Railtie < Rails::Railtie
3
+ CreatesendRails.install
4
+ end
5
+ end
@@ -0,0 +1,31 @@
1
+ module CreatesendRails
2
+ class SmartEmailFormatter
3
+ def format
4
+ request_body.deep_reject! { |_k, v| v.blank? }
5
+ end
6
+
7
+ private
8
+
9
+ def initialize(message)
10
+ @message = message
11
+ end
12
+
13
+ def request_body
14
+ recipients.merge!(data: values)
15
+ end
16
+
17
+ def recipients
18
+ {
19
+ to: @message.to,
20
+ cc: @message.cc,
21
+ bcc: @message.bcc,
22
+ ConsentToTrack: values.try(:[], :consent_to_track) || 'Yes' # That's not clean, should find better way?
23
+ }.symbolize_keys!
24
+ end
25
+
26
+ def values
27
+ return if @message.try(:body).empty?
28
+ JSON.parse(@message.try(:body).try(:raw_source)).symbolize_keys!
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,3 @@
1
+ module CreatesendRails
2
+ VERSION = '0.3.4'
3
+ end
@@ -0,0 +1,19 @@
1
+ require 'action_mailer'
2
+ require 'createsend-rails/deliverer'
3
+ require 'createsend-rails/ext/action_mailer'
4
+ require 'createsend-rails/ext/hash'
5
+ require 'createsend-rails/smart_email_formatter'
6
+
7
+ module CreatesendRails
8
+ def self.install
9
+ ActionMailer::Base.include(CreatesendRails::SmartEmailer)
10
+ ActionMailer::Base.include(CreatesendRails::ViewDefaults)
11
+ ActionMailer::Base.add_delivery_method :create_send, CreatesendRails::Deliverer
12
+ end
13
+ end
14
+
15
+ if defined?(Rails)
16
+ require 'createsend-rails/railtie'
17
+ else
18
+ CreatesendRails.install
19
+ end
@@ -0,0 +1,39 @@
1
+ describe CreatesendRails::Deliverer do
2
+ before(:all) do
3
+ ActionMailer::Base.create_send_settings = { api_key: 'ABCDEFG' }
4
+ end
5
+
6
+ describe 'action_mailer' do
7
+ it 'allows configuration settings' do
8
+ expect(ActionMailer::Base.create_send_settings[:api_key]).to eq('ABCDEFG')
9
+ end
10
+ end
11
+
12
+ describe 'delivery' do
13
+ context 'valid delivery attributes' do
14
+ subject { described_class.new(request).deliver!(message) }
15
+ let(:request) { double(api: 'abcdef') }
16
+ let(:message) { double }
17
+
18
+ xit 'sends a request to the create_send API' do
19
+ expect(subject).to eq(eukdlx)
20
+ end
21
+
22
+ xit 'return successfully' do
23
+ expect(subject).to eq(true)
24
+ end
25
+ end
26
+
27
+ context 'missing API credentials' do
28
+ subject { described_class.new(request).deliver!(message) }
29
+ let(:request) { double }
30
+ let(:message) { double }
31
+ end
32
+
33
+ context 'missing API credentials' do
34
+ subject { described_class.new(request).deliver!(message) }
35
+ let(:request) { double }
36
+ let(:message) { double }
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,16 @@
1
+ describe CreatesendRails::Hash do
2
+ let(:simple_hash) { { a: 1, d: 2, e: nil } }
3
+ let(:multi_hash) { { a: 5, d: 6, e: nil, f: { a: 1, b: '' } } }
4
+
5
+ describe 'deep_reject!' do
6
+ it 'removes empty objects from the top level' do
7
+ simple_hash.deep_reject! { |_key, value| value.blank? }
8
+ expect(simple_hash).to eq({ a: 1, d: 2 })
9
+ end
10
+
11
+ it 'removes empty objects from multidimensional levels' do
12
+ multi_hash.deep_reject! { |_key, value| value.blank? }
13
+ expect(multi_hash).to eq({ a: 5, d: 6, f: { a: 1 } })
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,40 @@
1
+ describe CreatesendRails::SmartEmailFormatter do
2
+ subject { described_class.new(message).format }
3
+ let(:template) { { reset_url: 'http:://localhost/en/reset' }.to_json }
4
+ let(:message) {
5
+ Mail::Message.new(to: 'user@example.com',
6
+ body: '',
7
+ cc: ['joe@bloggs.com', 'john@bloggs.com'],
8
+ subject: 'subject')
9
+ }
10
+
11
+ it 'include the message recipients' do
12
+ expected_recipients = { to: ['user@example.com'],
13
+ cc: ['joe@bloggs.com', 'john@bloggs.com'] }
14
+
15
+ expect(subject).to include(expected_recipients)
16
+ end
17
+
18
+ context 'include message body' do
19
+ let(:message) {
20
+ Mail::Message.new(to: 'user@example.com',
21
+ body: template,
22
+ cc: ['joe@bloggs.com', 'john@bloggs.com'],
23
+ subject: 'subject')
24
+ }
25
+
26
+ it { expect(subject[:data]).to include(:reset_url) }
27
+ end
28
+
29
+ context 'remove empty key values' do
30
+ let(:message) {
31
+ Mail::Message.new(to: 'user@example.com',
32
+ body: template,
33
+ subject: 'subject')
34
+ }
35
+
36
+ it { expect(subject).to_not include(:cc) }
37
+ it { expect(subject).to_not include(:bcc) }
38
+ it { expect(subject).to_not include(:subject) }
39
+ end
40
+ end
@@ -0,0 +1,7 @@
1
+ require 'simplecov'
2
+ SimpleCov.start
3
+
4
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
5
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
+
7
+ require 'createsend-rails'
metadata ADDED
@@ -0,0 +1,215 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: createsend-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.4
5
+ platform: ruby
6
+ authors:
7
+ - Andrew Scott
8
+ - Rory MacDonald
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2018-10-15 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activesupport
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: 3.0.0
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: 3.0.0
28
+ - !ruby/object:Gem::Dependency
29
+ name: actionmailer
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: 3.0.0
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: 3.0.0
42
+ - !ruby/object:Gem::Dependency
43
+ name: createsend
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: 5.0.0
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: 5.0.0
56
+ - !ruby/object:Gem::Dependency
57
+ name: byebug
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - '='
61
+ - !ruby/object:Gem::Version
62
+ version: 8.2.1
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - '='
68
+ - !ruby/object:Gem::Version
69
+ version: 8.2.1
70
+ - !ruby/object:Gem::Dependency
71
+ name: mime-types
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: 1.25.1
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: 1.25.1
84
+ - !ruby/object:Gem::Dependency
85
+ name: pry-byebug
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - '='
89
+ - !ruby/object:Gem::Version
90
+ version: 3.3.0
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - '='
96
+ - !ruby/object:Gem::Version
97
+ version: 3.3.0
98
+ - !ruby/object:Gem::Dependency
99
+ name: rake
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: rspec
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - "~>"
117
+ - !ruby/object:Gem::Version
118
+ version: '3.0'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - "~>"
124
+ - !ruby/object:Gem::Version
125
+ version: '3.0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: rubocop
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - '='
131
+ - !ruby/object:Gem::Version
132
+ version: 0.37.2
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - '='
138
+ - !ruby/object:Gem::Version
139
+ version: 0.37.2
140
+ - !ruby/object:Gem::Dependency
141
+ name: rubocop-rspec
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - '='
145
+ - !ruby/object:Gem::Version
146
+ version: 1.4.0
147
+ type: :development
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - '='
152
+ - !ruby/object:Gem::Version
153
+ version: 1.4.0
154
+ - !ruby/object:Gem::Dependency
155
+ name: simplecov
156
+ requirement: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - "~>"
159
+ - !ruby/object:Gem::Version
160
+ version: 0.13.0
161
+ type: :development
162
+ prerelease: false
163
+ version_requirements: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - "~>"
166
+ - !ruby/object:Gem::Version
167
+ version: 0.13.0
168
+ description: ''
169
+ email:
170
+ - andrew@madetech.co.uk
171
+ - rory@madetech.co.uk
172
+ executables: []
173
+ extensions: []
174
+ extra_rdoc_files:
175
+ - LICENSE
176
+ - README.md
177
+ files:
178
+ - LICENSE
179
+ - README.md
180
+ - lib/createsend-rails.rb
181
+ - lib/createsend-rails/deliverer.rb
182
+ - lib/createsend-rails/ext/action_mailer.rb
183
+ - lib/createsend-rails/ext/hash.rb
184
+ - lib/createsend-rails/railtie.rb
185
+ - lib/createsend-rails/smart_email_formatter.rb
186
+ - lib/createsend-rails/version.rb
187
+ - spec/createsend_rails/deliverer_spec.rb
188
+ - spec/createsend_rails/hash_spec.rb
189
+ - spec/createsend_rails/smart_email_formatter_spec.rb
190
+ - spec/spec_helper.rb
191
+ homepage: https://github.com/MartinVandersteen/createsend-rails
192
+ licenses: []
193
+ metadata: {}
194
+ post_install_message:
195
+ rdoc_options:
196
+ - "--charset=UTF-8"
197
+ require_paths:
198
+ - lib
199
+ required_ruby_version: !ruby/object:Gem::Requirement
200
+ requirements:
201
+ - - ">="
202
+ - !ruby/object:Gem::Version
203
+ version: '0'
204
+ required_rubygems_version: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ requirements: []
210
+ rubyforge_project:
211
+ rubygems_version: 2.7.7
212
+ signing_key:
213
+ specification_version: 4
214
+ summary: Campaign Monitor transactional email adapter for ActionMailer
215
+ test_files: []