mandrill-rails 1.3.1 → 1.4.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 +8 -8
- data/README.rdoc +23 -2
- data/lib/generators/templates/controller.rb +18 -0
- data/lib/generators/web_hook_generator.rb +83 -0
- data/lib/mandrill-rails/version.rb +1 -1
- data/mandrill-rails.gemspec +1 -0
- data/spec/generators/web_hook_generator_spec.rb +246 -0
- data/spec/mandrill/web_hook/processor_spec.rb +0 -7
- data/spec/rails_app/config/routes.rb +4 -0
- metadata +22 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZDEzMWQyMzk4ZDZjMzk2ZTBkM2M5YzdiMjc4ZWNmN2RmM2NlYjFlNw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
YWE3NjlmM2IzZWNlZTZlMzgyMzA0ZjQyMTVlZjFkYzJkZGRkNjgwNA==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MzIzZDNkYzRiMjAzZTlhYTIyZjJlNzkyY2Y1ZWQ4NDM1YmQ1NTBiYWUyMTE1
|
10
|
+
YmFiYmIyZDViNDRlNzYxY2EzZWQxZjg3MzVlNTM5YWY3ODNmZDVmMGEwNWIy
|
11
|
+
MThlYTMxYzBlYzA3NTBlNDVlYzNkZDNmNmY5M2YwYTc4NmUyZWU=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
YTFlMzEzNWZlZTJjYmU2MzM0MTllMzJmZjlkNzQwZGZmYTI0ZTlkNjY5YmIy
|
14
|
+
NWJkZDVhMDMyYzQzYjAzODQyNDk3YWMyM2ZmZDNlYmY5NTJhYzgxMTZiMDBl
|
15
|
+
Yzg4MDAyZDIzMzljNzUwNWQ5MTc5YjQyM2M2Y2Y5ZDEzMDEyNDM=
|
data/README.rdoc
CHANGED
@@ -16,7 +16,6 @@ FYI, {Mandrill}[http://mandrill.com/] is the transactional email service by the
|
|
16
16
|
* Requires Rails >= 3.0.3 (including 3.1, 3.2 and 4).
|
17
17
|
|
18
18
|
Food for thought (upcoming features maybe)..
|
19
|
-
* some generators may be handy to avoid the manual coding to wire up web hooks
|
20
19
|
* I thought about implementing this as an engine, but the overhead did not seem appropriate. Maybe that view will change..
|
21
20
|
|
22
21
|
== The Mandrill::Rails Cookbook
|
@@ -48,7 +47,29 @@ See the section below on 'Contributing to Mandrill::Rails' for more information.
|
|
48
47
|
|
49
48
|
Say we have configured Mandrill to send requests to /inbox at our site (see the next recipes for how you do that).
|
50
49
|
|
51
|
-
Once we have Mandrill::Rails in our project, we just need to do two things.
|
50
|
+
Once we have Mandrill::Rails in our project, we just need to do two things. You can run a generator to do it for you, or you can configure things manually:
|
51
|
+
|
52
|
+
==== Using the generator
|
53
|
+
|
54
|
+
Run the generator and specify the name for your route and controller:
|
55
|
+
|
56
|
+
rails generate mandrill inbox
|
57
|
+
|
58
|
+
This will create a resource route and corresponding controller at /inbox.
|
59
|
+
|
60
|
+
If you need a namespaced controller, specify it in the name:
|
61
|
+
|
62
|
+
rails generate mandrill hooks/inbox
|
63
|
+
|
64
|
+
This creates an `inbox` route that points to the `Hooks:InboxController` class.
|
65
|
+
|
66
|
+
If you prefer pluralized names, that can be specified with a flag:
|
67
|
+
|
68
|
+
rails generate mandrill inbox --pluralize_names
|
69
|
+
|
70
|
+
This will create an `InboxesController` class and a resource route called `inboxes`.
|
71
|
+
|
72
|
+
==== Manual configuration
|
52
73
|
|
53
74
|
First, configure a resource route:
|
54
75
|
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class <%= @controller_name %>Controller < ApplicationController
|
2
|
+
include Mandrill::Rails::WebHookProcessor
|
3
|
+
|
4
|
+
# To completely ignore unhandled events (not even logging), uncomment this line
|
5
|
+
# ignore_unhandled_events!
|
6
|
+
|
7
|
+
# If you want unhandled events to raise a hard exception, uncomment this line
|
8
|
+
# unhandled_events_raise_exceptions!
|
9
|
+
|
10
|
+
# To enable authentication, uncomment this line and set your API key.
|
11
|
+
# It is recommended you pull your API keys from environment settings,
|
12
|
+
# or use some other means to avoid committing the API keys in your source code.
|
13
|
+
# authenticate_with_mandrill_keys! 'YOUR_MANDRILL_WEBHOOK_KEY'
|
14
|
+
|
15
|
+
def handle_inbound(event_payload)
|
16
|
+
head(:ok)
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'rails/generators/named_base'
|
2
|
+
|
3
|
+
module Mandrill
|
4
|
+
module Rails
|
5
|
+
module Generators
|
6
|
+
class WebHookGenerator < ::Rails::Generators::Base
|
7
|
+
namespace 'mandrill'
|
8
|
+
desc 'Generates a controller and routes for Mandrill web hooks.'
|
9
|
+
argument :name, type: :string
|
10
|
+
class_option :pluralize_names, aliases: '-p', type: :boolean, default: false,
|
11
|
+
desc: 'Pluralize names in route and controller'
|
12
|
+
class_option :routes, type: :boolean, default: true,
|
13
|
+
desc: 'Creates routes for web hooks'
|
14
|
+
class_option :controller, type: :boolean, default: true,
|
15
|
+
desc: 'Creates a controller for web hooks'
|
16
|
+
|
17
|
+
source_root File.expand_path("../templates", __FILE__)
|
18
|
+
|
19
|
+
def initialize(args, *options)
|
20
|
+
args[0] = args[0].dup if args[0].is_a?(String) && args[0].frozen?
|
21
|
+
super
|
22
|
+
assign_names!(self.name)
|
23
|
+
end
|
24
|
+
|
25
|
+
def add_routes
|
26
|
+
return unless options.routes?
|
27
|
+
hook_route = "resource :#{resource_name}"
|
28
|
+
|
29
|
+
controller = controller_path
|
30
|
+
|
31
|
+
hook_route << %Q(, :controller => '#{controller}')
|
32
|
+
hook_route << %Q(, :only => [:show,:create])
|
33
|
+
route hook_route
|
34
|
+
end
|
35
|
+
|
36
|
+
def add_controller
|
37
|
+
return unless options.controller?
|
38
|
+
@controller_name = class_name
|
39
|
+
template 'controller.rb', controller_destination
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
attr_reader :file_name
|
45
|
+
|
46
|
+
def assign_names!(name)
|
47
|
+
@class_path = name.include?('/') ? name.split('/') : name.split('::')
|
48
|
+
@class_path.map!(&:underscore)
|
49
|
+
@file_name = @class_path.pop
|
50
|
+
end
|
51
|
+
|
52
|
+
def class_name
|
53
|
+
@class_name ||= (@class_path + [resource_name]).map!(&:camelize).join('::')
|
54
|
+
end
|
55
|
+
|
56
|
+
def controller_destination
|
57
|
+
"app/controllers/#{controller_path}_controller.rb"
|
58
|
+
end
|
59
|
+
|
60
|
+
def controller_path
|
61
|
+
@controller_path ||= if class_name.include?('::')
|
62
|
+
@class_path.collect {|dname| dname }.join + "/" + resource_name
|
63
|
+
else
|
64
|
+
resource_name
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def plural_name
|
69
|
+
@plural_name ||= singular_name.pluralize
|
70
|
+
end
|
71
|
+
|
72
|
+
def resource_name
|
73
|
+
return singular_name unless options.pluralize_names?
|
74
|
+
plural_name
|
75
|
+
end
|
76
|
+
|
77
|
+
def singular_name
|
78
|
+
file_name.downcase
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
data/mandrill-rails.gemspec
CHANGED
@@ -21,6 +21,7 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.7"
|
22
22
|
spec.add_development_dependency "rake", "~> 10.0"
|
23
23
|
spec.add_development_dependency "rspec", "~> 3.0"
|
24
|
+
spec.add_development_dependency "generator_spec", "~> 0.9"
|
24
25
|
spec.add_development_dependency "guard-rspec", "~> 4.5"
|
25
26
|
spec.add_development_dependency "rdoc"
|
26
27
|
|
@@ -0,0 +1,246 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'generator_spec'
|
3
|
+
require 'generators/web_hook_generator'
|
4
|
+
|
5
|
+
describe Mandrill::Rails::Generators::WebHookGenerator, type: :generator do
|
6
|
+
destination File.expand_path("../../tmp", __FILE__)
|
7
|
+
|
8
|
+
before do
|
9
|
+
prepare_destination
|
10
|
+
copy_routes
|
11
|
+
end
|
12
|
+
|
13
|
+
describe 'route generation' do
|
14
|
+
context 'with no pluralized option' do
|
15
|
+
context 'with simple names' do
|
16
|
+
before { run_generator %w(inbox) }
|
17
|
+
|
18
|
+
it 'creates a proper route' do
|
19
|
+
match = "resource :inbox, :controller => 'inbox', :only => [:show,:create]"
|
20
|
+
expect(destination_root).to have_structure {
|
21
|
+
directory 'config' do
|
22
|
+
file 'routes.rb' do
|
23
|
+
contains match
|
24
|
+
end
|
25
|
+
end
|
26
|
+
}
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context 'with namespaced names' do
|
31
|
+
before { run_generator %w(hooks/inbox) }
|
32
|
+
|
33
|
+
it 'creates a proper route' do
|
34
|
+
match = "resource :inbox, :controller => 'hooks/inbox', :only => [:show,:create]"
|
35
|
+
expect(destination_root).to have_structure {
|
36
|
+
directory 'config' do
|
37
|
+
file 'routes.rb' do
|
38
|
+
contains match
|
39
|
+
end
|
40
|
+
end
|
41
|
+
}
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'with capitalized names' do
|
46
|
+
before { run_generator %w(Inbox) }
|
47
|
+
|
48
|
+
it 'creates a proper route' do
|
49
|
+
match = "resource :inbox, :controller => 'inbox', :only => [:show,:create]"
|
50
|
+
expect(destination_root).to have_structure {
|
51
|
+
directory 'config' do
|
52
|
+
file 'routes.rb' do
|
53
|
+
contains match
|
54
|
+
end
|
55
|
+
end
|
56
|
+
}
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context 'with an explicit pluralized option' do
|
62
|
+
context 'with simple names' do
|
63
|
+
before { run_generator %w(inbox --pluralize_names) }
|
64
|
+
|
65
|
+
it 'creates a proper route' do
|
66
|
+
match = "resource :inboxes, :controller => 'inboxes', :only => [:show,:create]"
|
67
|
+
expect(destination_root).to have_structure {
|
68
|
+
directory 'config' do
|
69
|
+
file 'routes.rb' do
|
70
|
+
contains match
|
71
|
+
end
|
72
|
+
end
|
73
|
+
}
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context 'with namespaced names' do
|
78
|
+
before { run_generator %w(hooks/inbox --pluralize_names) }
|
79
|
+
|
80
|
+
it 'creates a proper route' do
|
81
|
+
match = "resource :inboxes, :controller => 'hooks/inboxes', :only => [:show,:create]"
|
82
|
+
expect(destination_root).to have_structure {
|
83
|
+
directory 'config' do
|
84
|
+
file 'routes.rb' do
|
85
|
+
contains match
|
86
|
+
end
|
87
|
+
end
|
88
|
+
}
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
context 'with capitalized names' do
|
93
|
+
before { run_generator %w(hooks/Inbox --pluralize_names) }
|
94
|
+
|
95
|
+
it 'creates a proper route' do
|
96
|
+
match = "resource :inboxes, :controller => 'hooks/inboxes', :only => [:show,:create]"
|
97
|
+
expect(destination_root).to have_structure {
|
98
|
+
directory 'config' do
|
99
|
+
file 'routes.rb' do
|
100
|
+
contains match
|
101
|
+
end
|
102
|
+
end
|
103
|
+
}
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
describe 'controller generation' do
|
110
|
+
context 'with controller explicitly skipped' do
|
111
|
+
before { run_generator %w(inbox --skip-controller) }
|
112
|
+
|
113
|
+
it 'does not create a controller file' do
|
114
|
+
expect(destination_root).to have_structure {
|
115
|
+
directory 'app' do
|
116
|
+
directory 'controllers' do
|
117
|
+
no_file 'inbox_controller.rb'
|
118
|
+
end
|
119
|
+
end
|
120
|
+
}
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
context 'with no pluralized option' do
|
125
|
+
context 'with simple names' do
|
126
|
+
before { run_generator %w(inbox) }
|
127
|
+
|
128
|
+
it 'creates a proper controller file' do
|
129
|
+
match = 'class InboxController < ApplicationController'
|
130
|
+
expect(destination_root).to have_structure {
|
131
|
+
directory 'app' do
|
132
|
+
directory 'controllers' do
|
133
|
+
file 'inbox_controller.rb' do
|
134
|
+
contains match
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
}
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
context 'with namespaced names' do
|
143
|
+
before { run_generator %w(hooks/inbox) }
|
144
|
+
|
145
|
+
it 'creates a proper controller file' do
|
146
|
+
match = 'class Hooks::InboxController < ApplicationController'
|
147
|
+
expect(destination_root).to have_structure {
|
148
|
+
directory 'app' do
|
149
|
+
directory 'controllers' do
|
150
|
+
directory 'hooks' do
|
151
|
+
file 'inbox_controller.rb' do
|
152
|
+
contains match
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
}
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
context 'with capitalized names' do
|
162
|
+
before { run_generator %w(hooks/Inbox) }
|
163
|
+
|
164
|
+
it 'creates a proper controller file' do
|
165
|
+
match = 'class Hooks::InboxController < ApplicationController'
|
166
|
+
expect(destination_root).to have_structure {
|
167
|
+
directory 'app' do
|
168
|
+
directory 'controllers' do
|
169
|
+
directory 'hooks' do
|
170
|
+
file 'inbox_controller.rb' do
|
171
|
+
contains match
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
}
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
context 'with an explicit pluralized option' do
|
182
|
+
context 'with simple names' do
|
183
|
+
before { run_generator %w(inbox --pluralize_names) }
|
184
|
+
|
185
|
+
it 'creates a proper controller file' do
|
186
|
+
match = 'class InboxesController < ApplicationController'
|
187
|
+
expect(destination_root).to have_structure {
|
188
|
+
directory 'app' do
|
189
|
+
directory 'controllers' do
|
190
|
+
file 'inboxes_controller.rb' do
|
191
|
+
contains match
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
}
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
context 'with namespaced names' do
|
200
|
+
before { run_generator %w(hooks/inbox --pluralize_names) }
|
201
|
+
|
202
|
+
it 'creates a proper controller file' do
|
203
|
+
match = 'class Hooks::InboxesController < ApplicationController'
|
204
|
+
expect(destination_root).to have_structure {
|
205
|
+
directory 'app' do
|
206
|
+
directory 'controllers' do
|
207
|
+
directory 'hooks' do
|
208
|
+
file 'inboxes_controller.rb' do
|
209
|
+
contains match
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
213
|
+
end
|
214
|
+
}
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
context 'with capitalized names' do
|
219
|
+
before { run_generator %w(hooks/Inboxes --pluralized_names) }
|
220
|
+
|
221
|
+
it 'creates a proper controller file' do
|
222
|
+
match = 'class Hooks::InboxesController < ApplicationController'
|
223
|
+
expect(destination_root).to have_structure {
|
224
|
+
directory 'app' do
|
225
|
+
directory 'controllers' do
|
226
|
+
directory 'hooks' do
|
227
|
+
file 'inboxes_controller.rb' do
|
228
|
+
contains match
|
229
|
+
end
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
233
|
+
}
|
234
|
+
end
|
235
|
+
end
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
def copy_routes
|
241
|
+
routes = File.expand_path('../../rails_app/config/routes.rb', __FILE__)
|
242
|
+
destination = File.join(destination_root, 'config')
|
243
|
+
|
244
|
+
FileUtils.mkdir_p(destination)
|
245
|
+
FileUtils.cp routes, destination
|
246
|
+
end
|
@@ -90,13 +90,6 @@ describe Mandrill::WebHook::Processor do
|
|
90
90
|
end
|
91
91
|
end
|
92
92
|
context "and default missing handler behaviour" do
|
93
|
-
before do
|
94
|
-
class ::Rails
|
95
|
-
end
|
96
|
-
end
|
97
|
-
after do
|
98
|
-
Object.send(:remove_const, :Rails)
|
99
|
-
end
|
100
93
|
it "logs an error" do
|
101
94
|
processor.on_unhandled_mandrill_events = :log
|
102
95
|
logger = double()
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mandrill-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paul Gallagher
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-11-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ~>
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '3.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: generator_spec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ~>
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0.9'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ~>
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0.9'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: guard-rspec
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -110,6 +124,8 @@ files:
|
|
110
124
|
- LICENSE
|
111
125
|
- README.rdoc
|
112
126
|
- Rakefile
|
127
|
+
- lib/generators/templates/controller.rb
|
128
|
+
- lib/generators/web_hook_generator.rb
|
113
129
|
- lib/mandrill-rails.rb
|
114
130
|
- lib/mandrill-rails/errors.rb
|
115
131
|
- lib/mandrill-rails/version.rb
|
@@ -141,11 +157,13 @@ files:
|
|
141
157
|
- spec/fixtures/webhook_examples/send.json
|
142
158
|
- spec/fixtures/webhook_examples/sync_blacklist.json
|
143
159
|
- spec/fixtures/webhook_examples/sync_whitelist.json
|
160
|
+
- spec/generators/web_hook_generator_spec.rb
|
144
161
|
- spec/mandrill-rails/web_hook_processor_spec.rb
|
145
162
|
- spec/mandrill/web_hook/attachment_spec.rb
|
146
163
|
- spec/mandrill/web_hook/event_decorator_spec.rb
|
147
164
|
- spec/mandrill/web_hook/image_spec.rb
|
148
165
|
- spec/mandrill/web_hook/processor_spec.rb
|
166
|
+
- spec/rails_app/config/routes.rb
|
149
167
|
- spec/spec_helper.rb
|
150
168
|
- spec/support/fixtures_helper.rb
|
151
169
|
homepage: https://github.com/evendis/mandrill-rails
|
@@ -195,10 +213,12 @@ test_files:
|
|
195
213
|
- spec/fixtures/webhook_examples/send.json
|
196
214
|
- spec/fixtures/webhook_examples/sync_blacklist.json
|
197
215
|
- spec/fixtures/webhook_examples/sync_whitelist.json
|
216
|
+
- spec/generators/web_hook_generator_spec.rb
|
198
217
|
- spec/mandrill-rails/web_hook_processor_spec.rb
|
199
218
|
- spec/mandrill/web_hook/attachment_spec.rb
|
200
219
|
- spec/mandrill/web_hook/event_decorator_spec.rb
|
201
220
|
- spec/mandrill/web_hook/image_spec.rb
|
202
221
|
- spec/mandrill/web_hook/processor_spec.rb
|
222
|
+
- spec/rails_app/config/routes.rb
|
203
223
|
- spec/spec_helper.rb
|
204
224
|
- spec/support/fixtures_helper.rb
|