outbox 0.1.2 → 0.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.
- checksums.yaml +4 -4
- data/README.md +61 -7
- data/lib/outbox.rb +1 -0
- data/lib/outbox/clients/mail_client.rb +13 -7
- data/lib/outbox/define_inheritable_method.rb +3 -4
- data/lib/outbox/message.rb +9 -7
- data/lib/outbox/message_clients.rb +1 -1
- data/lib/outbox/message_fields.rb +6 -6
- data/lib/outbox/message_types.rb +4 -4
- data/lib/outbox/messages/base.rb +9 -2
- data/lib/outbox/messages/sms.rb +29 -0
- data/lib/outbox/version.rb +1 -1
- data/spec/outbox/messages/sms_spec.rb +71 -0
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f4d0674db8e9a1b5e9ff4177d0ceb2ad37b10ae5
|
4
|
+
data.tar.gz: aed0fd01ee8e3022b381e9e5cdc6de527fc1a120
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ad5f555dbe59e569c0f8a77c12d37d2847f21706f056b929fbc3b1a44a9cc22ecaf25064a5d58b02f9065072cf9e88b333756c851629563303515ced2113d4d9
|
7
|
+
data.tar.gz: 6cc7e36744f7b5a5f71ebc8f6cdbf826ff8f1e0323aafa5927534e9c7f6b3485a46720d9606c0fbd7fc8fe5f831a59954107eb03b06ea8df7ed9699b396b7ab0
|
data/README.md
CHANGED
@@ -34,13 +34,15 @@ This gem is still in early development with plans to support email, SMS, and pus
|
|
34
34
|
|
35
35
|
### Email
|
36
36
|
|
37
|
-
| Service | Alias | Client
|
38
|
-
|
39
|
-
| [Mail gem](https://github.com/mikel/mail) | `:mail` | MailClient |
|
37
|
+
| Service | Alias | Client | Gem |
|
38
|
+
|-------------------------------------------|---------|-------------------------------|----------|
|
39
|
+
| [Mail gem](https://github.com/mikel/mail) | `:mail` | `Outbox::Clients::MailClient` | Included |
|
40
40
|
|
41
41
|
### SMS
|
42
42
|
|
43
|
-
|
43
|
+
| Service | Alias | Client | Gem |
|
44
|
+
|-------------------------------------------------|-----------|--------------------------|------------------------------------------------------------|
|
45
|
+
| [Twilio](https://github.com/twilio/twilio-ruby) | `:twilio` | `Outbox::Twilio::Client` | [outbox-twilio](https://github.com/localmed/outbox-twilio) |
|
44
46
|
|
45
47
|
### Push
|
46
48
|
|
@@ -67,7 +69,7 @@ message = Outbox::Message.new do
|
|
67
69
|
end
|
68
70
|
|
69
71
|
ios_push do
|
70
|
-
|
72
|
+
badge '+1'
|
71
73
|
sound 'default'
|
72
74
|
end
|
73
75
|
|
@@ -75,7 +77,11 @@ message = Outbox::Message.new do
|
|
75
77
|
end
|
76
78
|
|
77
79
|
# This will deliver the message to User's given contact points.
|
78
|
-
message.deliver
|
80
|
+
message.deliver(
|
81
|
+
email: 'user@gmail.com',
|
82
|
+
sms: '+15551234567',
|
83
|
+
ios_push: 'FE66489F304DC75B8D6E8200DFF8A456E8DAEACEC428B427E9518741C92C6660'
|
84
|
+
)
|
79
85
|
```
|
80
86
|
|
81
87
|
### Making an email
|
@@ -108,7 +114,55 @@ email.deliver
|
|
108
114
|
Configuration
|
109
115
|
-------------
|
110
116
|
|
111
|
-
|
117
|
+
Configuration can be done in two ways:
|
118
|
+
|
119
|
+
### 1. Configure clients as you need them
|
120
|
+
|
121
|
+
``` ruby
|
122
|
+
mail_client = Outbox::Clients::MailClient.new(
|
123
|
+
delivery_method: :smtp,
|
124
|
+
smtp_settings: {}
|
125
|
+
)
|
126
|
+
sms_client = Outbox::Twilio::Client.new(
|
127
|
+
account_sid: 'ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
|
128
|
+
auth_token: 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'
|
129
|
+
)
|
130
|
+
message = Outbox::Message.new do
|
131
|
+
email do
|
132
|
+
client(mail_client)
|
133
|
+
# content...
|
134
|
+
end
|
135
|
+
|
136
|
+
sms do
|
137
|
+
client(sms_client)
|
138
|
+
# content...
|
139
|
+
end
|
140
|
+
end
|
141
|
+
```
|
142
|
+
|
143
|
+
### 2. Configure a default client for each message type
|
144
|
+
|
145
|
+
``` ruby
|
146
|
+
Outbox::Messages::Email.default_client(
|
147
|
+
:mail,
|
148
|
+
delivery_method: :smtp,
|
149
|
+
smtp_settings: {}
|
150
|
+
)
|
151
|
+
Outbox::Messages::SMS.default_client(
|
152
|
+
:twilio,
|
153
|
+
account_sid: 'ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
|
154
|
+
auth_token: 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'
|
155
|
+
)
|
156
|
+
message = Outbox::Message.new do
|
157
|
+
email do
|
158
|
+
# content...
|
159
|
+
end
|
160
|
+
|
161
|
+
sms do
|
162
|
+
# content...
|
163
|
+
end
|
164
|
+
end
|
165
|
+
```
|
112
166
|
|
113
167
|
Contributing
|
114
168
|
------------
|
data/lib/outbox.rb
CHANGED
@@ -11,17 +11,23 @@ module Outbox
|
|
11
11
|
# Returns the configured delivery method settings. This will also check
|
12
12
|
# the Rails-style #{delivery_method}_settings key as well.
|
13
13
|
#
|
14
|
-
# client = Outbox::Clients::MailClient.new
|
15
|
-
#
|
16
|
-
#
|
14
|
+
# client = Outbox::Clients::MailClient.new(
|
15
|
+
# delivery_method: :sendmail,
|
16
|
+
# delivery_method_settings: { location: '/usr/bin/sendmail' }
|
17
|
+
# )
|
17
18
|
# client.delivery_method_settings #=> { location: '/usr/bin/sendmail' }
|
18
19
|
#
|
19
|
-
# client = Outbox::Clients::MailClient.new
|
20
|
-
#
|
21
|
-
#
|
20
|
+
# client = Outbox::Clients::MailClient.new(
|
21
|
+
# delivery_method: :sendmail,
|
22
|
+
# sendmail_settings: { location: '/usr/bin/sendmail' }
|
23
|
+
# )
|
22
24
|
# client.delivery_method_settings #=> { location: '/usr/bin/sendmail' }
|
23
25
|
def delivery_method_settings
|
24
|
-
|
26
|
+
(
|
27
|
+
settings[:delivery_method_settings] ||
|
28
|
+
settings[:"#{delivery_method}_settings"] ||
|
29
|
+
{}
|
30
|
+
)
|
25
31
|
end
|
26
32
|
|
27
33
|
def deliver(email)
|
@@ -14,11 +14,10 @@ module Outbox
|
|
14
14
|
protected
|
15
15
|
|
16
16
|
def get_inheritable_module(mod_name)
|
17
|
-
if const_defined?(mod_name,
|
18
|
-
|
17
|
+
if const_defined?(mod_name, false)
|
18
|
+
const_get(mod_name)
|
19
19
|
else
|
20
|
-
|
21
|
-
include mod
|
20
|
+
include const_set(mod_name, Module.new)
|
22
21
|
end
|
23
22
|
end
|
24
23
|
end
|
data/lib/outbox/message.rb
CHANGED
@@ -3,6 +3,7 @@ module Outbox
|
|
3
3
|
include MessageTypes
|
4
4
|
|
5
5
|
register_message_type :email, Outbox::Messages::Email
|
6
|
+
register_message_type :sms, Outbox::Messages::SMS
|
6
7
|
|
7
8
|
# Use the Outbox::Clients::TestClient for all message types. This is
|
8
9
|
# useful for testing or working an a development environment.
|
@@ -26,23 +27,24 @@ module Outbox
|
|
26
27
|
def initialize(message_type_values = nil, &block)
|
27
28
|
if block_given?
|
28
29
|
instance_eval(&block)
|
29
|
-
|
30
|
-
assign_message_type_values(message_type_values)
|
30
|
+
elsif message_type_values
|
31
|
+
assign_message_type_values(message_type_values)
|
31
32
|
end
|
32
33
|
end
|
33
34
|
|
34
35
|
# Loops through each registered message type and sets the content body.
|
35
36
|
def body(value)
|
36
|
-
each_message_type do |
|
37
|
+
each_message_type do |_, message|
|
37
38
|
next if message.nil?
|
38
39
|
message.body = value
|
39
40
|
end
|
40
41
|
end
|
41
|
-
|
42
|
+
alias_method :body=, :body
|
42
43
|
|
43
|
-
# Delivers all of the messages to the given 'audience'. An 'audience'
|
44
|
-
# can be a hash or an object that responds to the current message
|
45
|
-
# the message types specified in the 'audience' object will
|
44
|
+
# Delivers all of the messages to the given 'audience'. An 'audience'
|
45
|
+
# object can be a hash or an object that responds to the current message
|
46
|
+
# types. Only the message types specified in the 'audience' object will
|
47
|
+
# be sent to.
|
46
48
|
#
|
47
49
|
# message.deliver email: 'hello@example.com', sms: '+15555555555'
|
48
50
|
# audience = OpenStruct.new
|
@@ -32,7 +32,7 @@ module Outbox
|
|
32
32
|
default_client.settings.merge!(settings) if settings
|
33
33
|
default_client.settings
|
34
34
|
end
|
35
|
-
|
35
|
+
alias_method :default_client_settings=, :default_client_settings
|
36
36
|
|
37
37
|
# Registers a client class with an alias.
|
38
38
|
#
|
@@ -18,7 +18,7 @@ module Outbox
|
|
18
18
|
@defaults.merge!(defaults) if defaults
|
19
19
|
@defaults
|
20
20
|
end
|
21
|
-
|
21
|
+
alias_method :defaults=, :defaults
|
22
22
|
|
23
23
|
# Returns the defined fields for this message type.
|
24
24
|
#
|
@@ -118,7 +118,7 @@ module Outbox
|
|
118
118
|
fields(*names)
|
119
119
|
end
|
120
120
|
end
|
121
|
-
|
121
|
+
alias_method :required_field, :required_fields
|
122
122
|
|
123
123
|
protected
|
124
124
|
|
@@ -176,7 +176,7 @@ module Outbox
|
|
176
176
|
if new_fields.nil?
|
177
177
|
fields = {}
|
178
178
|
self.class.fields.each do |field|
|
179
|
-
fields[field] =
|
179
|
+
fields[field] = public_send(field)
|
180
180
|
end
|
181
181
|
fields
|
182
182
|
else
|
@@ -191,7 +191,7 @@ module Outbox
|
|
191
191
|
# message.fields #=> { to: 'Bob', from: 'Sally' }
|
192
192
|
def fields=(new_fields)
|
193
193
|
new_fields.each do |field, value|
|
194
|
-
|
194
|
+
public_send(field, value) if respond_to?(field)
|
195
195
|
end
|
196
196
|
end
|
197
197
|
|
@@ -199,9 +199,9 @@ module Outbox
|
|
199
199
|
# validation issues.
|
200
200
|
def validate_fields
|
201
201
|
self.class.required_fields.each do |field|
|
202
|
-
value =
|
202
|
+
value = public_send(field)
|
203
203
|
if value.nil? || value.respond_to?(:empty?) && value.empty?
|
204
|
-
raise Outbox::MissingRequiredFieldError
|
204
|
+
raise Outbox::MissingRequiredFieldError, "Missing required field: #{field}"
|
205
205
|
end
|
206
206
|
end
|
207
207
|
end
|
data/lib/outbox/message_types.rb
CHANGED
@@ -31,8 +31,8 @@ module Outbox
|
|
31
31
|
define_message_type_defaults_accessors(name, message_type)
|
32
32
|
end
|
33
33
|
|
34
|
-
# Returns a hash of the registred message types, where the key is the
|
35
|
-
# of the message type and the value is the message type class.
|
34
|
+
# Returns a hash of the registred message types, where the key is the
|
35
|
+
# name of the message type and the value is the message type class.
|
36
36
|
def message_types
|
37
37
|
@message_types ||= {}
|
38
38
|
end
|
@@ -100,7 +100,7 @@ module Outbox
|
|
100
100
|
# the value is a hash of options for that message type.
|
101
101
|
def assign_message_type_values(values)
|
102
102
|
values.each do |key, value|
|
103
|
-
|
103
|
+
public_send(key, value) if respond_to?(key)
|
104
104
|
end
|
105
105
|
end
|
106
106
|
|
@@ -108,7 +108,7 @@ module Outbox
|
|
108
108
|
# of that type on this message.
|
109
109
|
def each_message_type
|
110
110
|
self.class.message_types.each_key do |message_type|
|
111
|
-
yield message_type,
|
111
|
+
yield message_type, public_send(message_type)
|
112
112
|
end
|
113
113
|
end
|
114
114
|
end
|
data/lib/outbox/messages/base.rb
CHANGED
@@ -7,7 +7,10 @@ module Outbox
|
|
7
7
|
# Make a new message. Every message type can be created using a hash,
|
8
8
|
# block, or direct assignment.
|
9
9
|
#
|
10
|
-
# message = Email.new
|
10
|
+
# message = Email.new(
|
11
|
+
# to: 'someone@example.com',
|
12
|
+
# from: 'company@example.com'
|
13
|
+
# )
|
11
14
|
# message = Email.new do
|
12
15
|
# to 'someone@example.com'
|
13
16
|
# from 'company@example.com'
|
@@ -17,7 +20,11 @@ module Outbox
|
|
17
20
|
# message.from = 'company@example.com'
|
18
21
|
def initialize(fields = nil, &block)
|
19
22
|
@fields = {}
|
20
|
-
|
23
|
+
if self.class.default_client
|
24
|
+
@client = self.class.default_client.dup
|
25
|
+
else
|
26
|
+
@client = nil
|
27
|
+
end
|
21
28
|
|
22
29
|
self.fields = self.class.defaults
|
23
30
|
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Outbox
|
2
|
+
module Messages
|
3
|
+
# SMS tend to support very different types of parameters, so only
|
4
|
+
# the most common ones will be directly applied to the SMS message class.
|
5
|
+
# All of the other ones can be set using the arbitrary field access with
|
6
|
+
# [] and []=.
|
7
|
+
#
|
8
|
+
# sms = Outbox::Messages::SMS.new do
|
9
|
+
# to '+14155551212'
|
10
|
+
# from 'Company Name'
|
11
|
+
# body 'Hellow world'
|
12
|
+
# end
|
13
|
+
# sms.client :twilio, api_key: '...'
|
14
|
+
# sms.deliver
|
15
|
+
class SMS < Base
|
16
|
+
required_fields :to, :from, :body
|
17
|
+
|
18
|
+
def audience=(audience) # :nodoc:
|
19
|
+
case audience
|
20
|
+
when String
|
21
|
+
self.to = audience
|
22
|
+
else
|
23
|
+
audience = Outbox::Accessor.new(audience)
|
24
|
+
self.to = audience[:to]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/outbox/version.rb
CHANGED
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Outbox::Messages::SMS do
|
4
|
+
it 'sets common sms fields' do
|
5
|
+
sms = Outbox::Messages::SMS.new do
|
6
|
+
to '+14155551212'
|
7
|
+
from 'Company Name'
|
8
|
+
body 'Hello world.'
|
9
|
+
end
|
10
|
+
expect(sms.to).to eq('+14155551212')
|
11
|
+
expect(sms.from).to eq('Company Name')
|
12
|
+
expect(sms.body).to eq('Hello world.')
|
13
|
+
end
|
14
|
+
|
15
|
+
describe '#audience=' do
|
16
|
+
context 'with a string' do
|
17
|
+
it 'sets the To: field' do
|
18
|
+
email = Outbox::Messages::SMS.new
|
19
|
+
email.audience = '+14155551212'
|
20
|
+
expect(email.to).to eq('+14155551212')
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'with a hash' do
|
25
|
+
it 'sets multiple fields' do
|
26
|
+
email = Outbox::Messages::SMS.new
|
27
|
+
email.audience = { to: '+14155551212' }
|
28
|
+
expect(email.to).to eq('+14155551212')
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'with an object' do
|
33
|
+
it 'sets multiple fields' do
|
34
|
+
email = Outbox::Messages::SMS.new
|
35
|
+
email.audience = OpenStruct.new to: '+14155551212'
|
36
|
+
expect(email.to).to eq('+14155551212')
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe '#validate_fields' do
|
42
|
+
before do
|
43
|
+
@valid_sms = Outbox::Messages::SMS.new do
|
44
|
+
to '+14155551212'
|
45
|
+
from 'john@gmail.com'
|
46
|
+
body 'Hello world.'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'requires a To: field' do
|
51
|
+
@valid_sms.to = nil
|
52
|
+
expect {
|
53
|
+
@valid_sms.validate_fields
|
54
|
+
}.to raise_error(Outbox::MissingRequiredFieldError)
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'requires a From: field' do
|
58
|
+
@valid_sms.from = nil
|
59
|
+
expect {
|
60
|
+
@valid_sms.validate_fields
|
61
|
+
}.to raise_error(Outbox::MissingRequiredFieldError)
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'requires a Body: field' do
|
65
|
+
@valid_sms.body = nil
|
66
|
+
expect {
|
67
|
+
@valid_sms.validate_fields
|
68
|
+
}.to raise_error(Outbox::MissingRequiredFieldError)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: outbox
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pete Browne
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-07-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mail
|
@@ -106,6 +106,7 @@ files:
|
|
106
106
|
- lib/outbox/message_types.rb
|
107
107
|
- lib/outbox/messages/base.rb
|
108
108
|
- lib/outbox/messages/email.rb
|
109
|
+
- lib/outbox/messages/sms.rb
|
109
110
|
- lib/outbox/version.rb
|
110
111
|
- outbox.gemspec
|
111
112
|
- spec/outbox/accessor_spec.rb
|
@@ -115,6 +116,7 @@ files:
|
|
115
116
|
- spec/outbox/message_spec.rb
|
116
117
|
- spec/outbox/messages/base_spec.rb
|
117
118
|
- spec/outbox/messages/email_spec.rb
|
119
|
+
- spec/outbox/messages/sms_spec.rb
|
118
120
|
- spec/outbox_spec.rb
|
119
121
|
- spec/spec_helper.rb
|
120
122
|
homepage: https://github.com/localmed/outbox
|
@@ -137,7 +139,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
137
139
|
version: '0'
|
138
140
|
requirements: []
|
139
141
|
rubyforge_project:
|
140
|
-
rubygems_version: 2.
|
142
|
+
rubygems_version: 2.2.2
|
141
143
|
signing_key:
|
142
144
|
specification_version: 4
|
143
145
|
summary: Outbox is a generic interface for sending notifications using a variety of
|
@@ -150,5 +152,6 @@ test_files:
|
|
150
152
|
- spec/outbox/message_spec.rb
|
151
153
|
- spec/outbox/messages/base_spec.rb
|
152
154
|
- spec/outbox/messages/email_spec.rb
|
155
|
+
- spec/outbox/messages/sms_spec.rb
|
153
156
|
- spec/outbox_spec.rb
|
154
157
|
- spec/spec_helper.rb
|