createsend-rails 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
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: []