voltron-notify 0.1.8 → 0.1.9
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 +29 -0
- data/app/controllers/voltron/notification_controller.rb +2 -2
- data/app/models/voltron/notification/email_notification.rb +14 -19
- data/app/models/voltron/notification/sms_notification.rb +29 -25
- data/app/models/voltron/notification.rb +5 -5
- data/lib/generators/templates/config/locales/voltron-notification.yml +28 -0
- data/lib/generators/voltron/notify/install_generator.rb +61 -17
- data/lib/voltron/config/notify.rb +5 -2
- data/lib/voltron/notify/action_dispatch/routes.rb +3 -3
- data/lib/voltron/notify/engine.rb +1 -1
- data/lib/voltron/notify/version.rb +1 -1
- data/lib/voltron/notify.rb +8 -6
- data/voltron-notify.gemspec +22 -20
- metadata +33 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6cdac4cb0e2b131d7b6a088ea7a952cc422a1263
|
4
|
+
data.tar.gz: 9d41eb541fe1686afdca60334d0525583489ebbe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 679e4b2d86d9901e23c7df5db41e01cefebd8ef34d2cba4182f7130093d948c61fe09f49fe59c61f2c3d5707c98614e4fee8c5fbdefca95409c6e1480f61dc62
|
7
|
+
data.tar.gz: a3758d441c5b7cf86332fff0e784f187d5211b7cec6c2797000f8350740e27458f36092cb6df62ec2b5ec309990e387dcc9fb578739c9fcde2b85e5d24498284
|
data/README.md
CHANGED
@@ -88,6 +88,35 @@ end
|
|
88
88
|
|
89
89
|
Note that both SMS and Email notifications have validations on the :to/:from fields, the email subject, and the SMS body text. Since `notifications` is an association, any errors in the actual notification content will bubble up, possibly preventing the `notifyable` model from saving. For that reason, it may be more logical to instead use a @notifyable.notifications.build / @notifyable.save syntax to properly handle errors that may occur.
|
90
90
|
|
91
|
+
Also supported are Twilio status update callbacks for SMS notifications. To enable, you can add the following to your `routes.rb` file
|
92
|
+
|
93
|
+
```ruby
|
94
|
+
Rails.application.routes.draw do
|
95
|
+
|
96
|
+
allow_notification_update(options = {})
|
97
|
+
|
98
|
+
end
|
99
|
+
```
|
100
|
+
|
101
|
+
By default, the default options for notification updates are as follows:
|
102
|
+
|
103
|
+
```
|
104
|
+
# The default url path that Twilio will POST updates to. Can be anything you want so long as it's a valid URL path
|
105
|
+
path: '/notification/update'
|
106
|
+
|
107
|
+
# The controller that will handle the notification update
|
108
|
+
controller: 'voltron/notification'
|
109
|
+
|
110
|
+
# The action that will perform the update
|
111
|
+
action: 'update' #
|
112
|
+
```
|
113
|
+
|
114
|
+
If the value of `controller` or `action` are modified, it is assumed that whatever they point to will handle SMS notification updates. See the description column for "StatusCallback" parameter [here](https://www.twilio.com/docs/api/rest/sending-messages) for information on what Twilio will POST to the callback url. Or, take a look at this gems `app/controller/voltron/notification_controller.rb` file to see what it does by default.
|
115
|
+
|
116
|
+
In order for `allow_notification_update` to generate the correct callback url, please ensure the value of `Voltron.config.base_url` is a valid host name. By default it will attempt to obtain this information from the `:host` parameter of `Rails.application.config.action_controller.default_url_options` but if specified in the Voltron initializer that will
|
117
|
+
|
118
|
+
Note that `allow_notification_update` does nothing if running on a host matching `/localhost|127\.0\.0\.1/i` Since Twilio can't reach locally running apps to POST to, the app will not even provide Twilio with the callback url to try it. If you have a local app host named Twilio will try and POST to it, but will obviously fail for the reasons previously stated. Basically, this feature only works on remotely accessible hosts.
|
119
|
+
|
91
120
|
## Integration with ActiveJob
|
92
121
|
|
93
122
|
Voltron Notify supports sending both email (via deliver_later) and SMS (via Voltron::SmsJob and perform_later). To have all notifications be handled by ActiveJob in conjunction with Sidekiq/Resque/whatever you need only set the config value `Voltron.config.notify.use_queue` to `true`. If ActiveJob is configured properly notifications will send that way instead. You may also optionally set the delay for each notification by setting the value of `Voltron.config.notify.delay` to any time value (i.e. 5.minutes, 3.months, 0.seconds)
|
@@ -9,11 +9,11 @@ class Voltron::NotificationController < ApplicationController
|
|
9
9
|
if sms.update(update_params)
|
10
10
|
head :ok
|
11
11
|
else
|
12
|
-
Voltron.log "(SID: #{params[:MessageSid]}) " + sms.errors.full_messages.join(
|
12
|
+
Voltron.log "(SID: #{params[:MessageSid]}) " + sms.errors.full_messages.join(''), 'Notification Update', Voltron::Notify::LOG_COLOR
|
13
13
|
head :unprocessable_entity
|
14
14
|
end
|
15
15
|
else
|
16
|
-
Voltron.log "SMS Notification with id #{params[:MessageSid]} not found.",
|
16
|
+
Voltron.log "SMS Notification with id #{params[:MessageSid]} not found.", 'Notification Update', Voltron::Notify::LOG_COLOR
|
17
17
|
head :not_found
|
18
18
|
end
|
19
19
|
end
|
@@ -8,6 +8,10 @@ class Voltron::Notification::EmailNotification < ActiveRecord::Base
|
|
8
8
|
|
9
9
|
after_create :deliver_later, if: :use_queue?
|
10
10
|
|
11
|
+
validates_presence_of :to, message: I18n.t('voltron.notification.email.to_blank')
|
12
|
+
|
13
|
+
validates_presence_of :subject, message: I18n.t('voltron.notification.email.subject_blank')
|
14
|
+
|
11
15
|
attr_accessor :vars, :attachments
|
12
16
|
|
13
17
|
def setup
|
@@ -16,20 +20,19 @@ class Voltron::Notification::EmailNotification < ActiveRecord::Base
|
|
16
20
|
@vars ||= {}
|
17
21
|
@attachments ||= {}
|
18
22
|
@mailer_arguments = nil
|
19
|
-
self.mailer_class ||=
|
20
|
-
self.mailer_method ||=
|
23
|
+
self.mailer_class ||= Voltron.config.notify.default_mailer
|
24
|
+
self.mailer_method ||= Voltron.config.notify.default_method
|
25
|
+
template(Voltron.config.notify.default_template)
|
21
26
|
end
|
22
27
|
|
23
28
|
def request
|
24
|
-
# Wrap entire request in
|
25
|
-
|
26
|
-
[{ request: (JSON.parse(request_json) rescue Hash.new) }.deep_symbolize_keys[:request]].flatten
|
29
|
+
# Wrap entire request in array, for consistency
|
30
|
+
Array.wrap({ request: (JSON.parse(request_json) rescue {}) }.with_indifferent_access[:request])
|
27
31
|
end
|
28
32
|
|
29
33
|
def response
|
30
|
-
# Wrap entire response in
|
31
|
-
|
32
|
-
[{ response: (JSON.parse(response_json) rescue Hash.new) }.deep_symbolize_keys[:response]].flatten
|
34
|
+
# Wrap entire response in array, for consistency
|
35
|
+
Array.wrap({ response: (JSON.parse(response_json) rescue {}) }.with_indifferent_access[:response])
|
33
36
|
end
|
34
37
|
|
35
38
|
def after_deliver
|
@@ -67,7 +70,7 @@ class Voltron::Notification::EmailNotification < ActiveRecord::Base
|
|
67
70
|
end
|
68
71
|
|
69
72
|
def method(meth = nil)
|
70
|
-
self.mailer_method = meth || mailer_method
|
73
|
+
self.mailer_method = (meth || mailer_method)
|
71
74
|
end
|
72
75
|
|
73
76
|
def arguments(*args)
|
@@ -76,16 +79,8 @@ class Voltron::Notification::EmailNotification < ActiveRecord::Base
|
|
76
79
|
|
77
80
|
def template(fullpath)
|
78
81
|
parts = fullpath.split("/")
|
79
|
-
self.template_name = parts.pop.sub(/\.(html|text)\..*$/,
|
80
|
-
self.template_path = parts.join(
|
81
|
-
end
|
82
|
-
|
83
|
-
# TODO: Move this to actual validates_* methods
|
84
|
-
def error_messages
|
85
|
-
output = []
|
86
|
-
output << "recipient cannot be blank" if to.blank?
|
87
|
-
output << "subject cannot be blank" if subject.blank?
|
88
|
-
output
|
82
|
+
self.template_name = parts.pop.sub(/\.(html|text)\..*$/, '')
|
83
|
+
self.template_path = parts.join('/')
|
89
84
|
end
|
90
85
|
|
91
86
|
private
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'twilio-ruby'
|
2
2
|
|
3
3
|
class Voltron::Notification::SmsNotification < ActiveRecord::Base
|
4
4
|
|
@@ -14,7 +14,15 @@ class Voltron::Notification::SmsNotification < ActiveRecord::Base
|
|
14
14
|
|
15
15
|
after_create :deliver_later, if: :use_queue?
|
16
16
|
|
17
|
-
validates :status, presence: false, inclusion: { in: %w( accepted queued sending sent delivered received failed undelivered unknown ), message: '
|
17
|
+
validates :status, presence: false, inclusion: { in: %w( accepted queued sending sent delivered received failed undelivered unknown ), message: I18n.t('voltron.notification.sms.status_invalid') }, on: :update
|
18
|
+
|
19
|
+
validates_presence_of :to, message: I18n.t('voltron.notification.sms.to_blank')
|
20
|
+
|
21
|
+
validates_presence_of :from, message: I18n.t('voltron.notification.sms.from_blank')
|
22
|
+
|
23
|
+
validates_presence_of :message, message: I18n.t('voltron.notification.sms.message_blank')
|
24
|
+
|
25
|
+
validate :valid_phone_number
|
18
26
|
|
19
27
|
def setup
|
20
28
|
@request = []
|
@@ -22,17 +30,15 @@ class Voltron::Notification::SmsNotification < ActiveRecord::Base
|
|
22
30
|
end
|
23
31
|
|
24
32
|
def request
|
25
|
-
# Ensure returned object is an array
|
33
|
+
# Ensure returned object is an array of request hashes, for consistency
|
26
34
|
out = Array.wrap((JSON.parse(request_json) rescue nil)).compact
|
27
|
-
out.
|
28
|
-
out
|
35
|
+
out.map { |h| h.with_indifferent_access }
|
29
36
|
end
|
30
37
|
|
31
38
|
def response
|
32
|
-
# Ensure returned object is an array
|
39
|
+
# Ensure returned object is an array of response hashes, for consistency
|
33
40
|
out = Array.wrap((JSON.parse(response_json) rescue nil)).compact
|
34
|
-
out.
|
35
|
-
out
|
41
|
+
out.map { |h| h.with_indifferent_access }
|
36
42
|
end
|
37
43
|
|
38
44
|
def after_deliver
|
@@ -47,6 +53,9 @@ class Voltron::Notification::SmsNotification < ActiveRecord::Base
|
|
47
53
|
end
|
48
54
|
|
49
55
|
def deliver_now
|
56
|
+
@request = request
|
57
|
+
@response = response
|
58
|
+
|
50
59
|
all_attachments = attachments.map(&:attachment)
|
51
60
|
|
52
61
|
# If sending more than 1 attachment, iterate through all but one attachment and send each without a body...
|
@@ -68,15 +77,16 @@ class Voltron::Notification::SmsNotification < ActiveRecord::Base
|
|
68
77
|
def deliver_later
|
69
78
|
job = Voltron::SmsJob.set(wait: Voltron.config.notify.delay).perform_later self
|
70
79
|
@request << job
|
71
|
-
@response << { sid: nil, status: 'unknown' }
|
72
80
|
after_deliver
|
73
81
|
end
|
74
82
|
|
75
|
-
def attach(
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
83
|
+
def attach(*urls)
|
84
|
+
urls.flatten.each do |url|
|
85
|
+
if url.starts_with? 'http'
|
86
|
+
attachments.build attachment: url
|
87
|
+
else
|
88
|
+
attachments.build attachment: Voltron.config.base_url + ActionController::Base.helpers.asset_url(url)
|
89
|
+
end
|
80
90
|
end
|
81
91
|
end
|
82
92
|
|
@@ -86,21 +96,11 @@ class Voltron::Notification::SmsNotification < ActiveRecord::Base
|
|
86
96
|
to_formatted
|
87
97
|
true
|
88
98
|
rescue => e
|
89
|
-
Voltron.log e.message, 'Notify',
|
99
|
+
Voltron.log e.message, 'Notify', Voltron::Notify::LOG_COLOR
|
90
100
|
false
|
91
101
|
end
|
92
102
|
end
|
93
103
|
|
94
|
-
# TODO: Move this to actual validates_* methods
|
95
|
-
def error_messages
|
96
|
-
output = []
|
97
|
-
output << 'recipient cannot be blank' if to.blank?
|
98
|
-
output << 'recipient is not a valid phone number' unless valid_phone?
|
99
|
-
output << 'sender cannot be blank' if from.blank?
|
100
|
-
output << 'message cannot be blank' if message.blank?
|
101
|
-
output
|
102
|
-
end
|
103
|
-
|
104
104
|
def callback_url
|
105
105
|
url = try(:update_voltron_notification_url, host: Voltron.config.base_url).to_s
|
106
106
|
# Don't allow local or blank urls
|
@@ -110,6 +110,10 @@ class Voltron::Notification::SmsNotification < ActiveRecord::Base
|
|
110
110
|
|
111
111
|
private
|
112
112
|
|
113
|
+
def valid_phone_number
|
114
|
+
errors.add :to, I18n.t('voltron.notification.sms.invalid_phone', number: to) unless valid_phone?
|
115
|
+
end
|
116
|
+
|
113
117
|
def use_queue?
|
114
118
|
Voltron.config.notify.use_queue
|
115
119
|
end
|
@@ -11,7 +11,7 @@ module Voltron
|
|
11
11
|
|
12
12
|
before_validation :validate
|
13
13
|
|
14
|
-
PERMITTED_ATTRIBUTES = [:to, :from
|
14
|
+
PERMITTED_ATTRIBUTES = [:to, :from]
|
15
15
|
|
16
16
|
def email(subject, **args, &block)
|
17
17
|
# Get the remaining args as params, that will eventually become assigns in the mailer template
|
@@ -55,15 +55,15 @@ module Voltron
|
|
55
55
|
def validate
|
56
56
|
# Add SMS related errors to self
|
57
57
|
sms_notifications.each do |n|
|
58
|
-
n.
|
59
|
-
self.errors.add
|
58
|
+
unless n.valid?
|
59
|
+
n.errors.full_messages.each { |msg| self.errors.add(:base, msg) }
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
63
63
|
# Add Email related errors to self
|
64
64
|
email_notifications.each do |n|
|
65
|
-
n.
|
66
|
-
self.errors.add
|
65
|
+
unless n.valid?
|
66
|
+
n.errors.full_messages.each { |msg| self.errors.add(:base, msg) }
|
67
67
|
end
|
68
68
|
end
|
69
69
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# This file will be merged with various other Voltron related YAML files with priority
|
2
|
+
# given to what exists in this file to begin with (nothing you add/modify here will be overwritten)
|
3
|
+
# whenever you run `rails g voltron:<gem_name>:install`,
|
4
|
+
# only if the gem in question has any locale data associated with it
|
5
|
+
|
6
|
+
---
|
7
|
+
en:
|
8
|
+
activerecord:
|
9
|
+
attributes:
|
10
|
+
voltron/notification/email_notification:
|
11
|
+
to: Recipient
|
12
|
+
subject: Subject
|
13
|
+
voltron/notification/sms_notification:
|
14
|
+
to: Recipient
|
15
|
+
from: Sender
|
16
|
+
message: Message
|
17
|
+
status: Status
|
18
|
+
voltron:
|
19
|
+
notification:
|
20
|
+
email:
|
21
|
+
to_blank: cannot be blank
|
22
|
+
subject_blank: cannot be blank
|
23
|
+
sms:
|
24
|
+
to_blank: cannot be blank
|
25
|
+
from_blank: cannot be blank
|
26
|
+
message_blank: cannot be blank
|
27
|
+
invalid_phone: number "%{number}" is not a valid phone number
|
28
|
+
status_invalid: must be one of accepted, queued, sending, sent, delivered, received, failed, undelivered, or unknown
|
@@ -1,19 +1,21 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
1
3
|
module Voltron
|
2
4
|
module Notify
|
3
5
|
module Generators
|
4
6
|
class InstallGenerator < Rails::Generators::Base
|
5
7
|
|
6
|
-
source_root File.expand_path(
|
8
|
+
source_root File.expand_path('../../../templates', __FILE__)
|
7
9
|
|
8
|
-
desc
|
10
|
+
desc 'Add Voltron Notify initializer'
|
9
11
|
|
10
12
|
def inject_initializer
|
11
13
|
|
12
|
-
voltron_initialzer_path = Rails.root.join(
|
14
|
+
voltron_initialzer_path = Rails.root.join('config', 'initializers', 'voltron.rb')
|
13
15
|
|
14
16
|
unless File.exist? voltron_initialzer_path
|
15
17
|
unless system("cd #{Rails.root.to_s} && rails generate voltron:install")
|
16
|
-
puts
|
18
|
+
puts 'Voltron initializer does not exist. Please ensure you have the \'voltron\' gem installed and run `rails g voltron:install` to create it'
|
17
19
|
return false
|
18
20
|
end
|
19
21
|
end
|
@@ -34,40 +36,82 @@ module Voltron
|
|
34
36
|
# config.notify.delay = 0.seconds
|
35
37
|
|
36
38
|
# Twilio account id number
|
37
|
-
# config.notify.sms_account_sid =
|
39
|
+
# config.notify.sms_account_sid = ''
|
38
40
|
|
39
41
|
# Twilio authentication token
|
40
|
-
# config.notify.sms_auth_token =
|
42
|
+
# config.notify.sms_auth_token = ''
|
41
43
|
|
42
44
|
# Default from phone number. Must be the number provided by Twilio.
|
43
45
|
# Avoid the overhead of pre-formatting the number by entering in the format "+1234567890"
|
44
|
-
# config.notify.sms_from =
|
46
|
+
# config.notify.sms_from = ''
|
45
47
|
|
46
48
|
# Default from email address. If not specified the default from in the mailer or the :from param on mail() is used
|
47
|
-
# config.notify.email_from =
|
49
|
+
# config.notify.email_from = 'no-reply@example.com'
|
50
|
+
|
51
|
+
# The below 3 options define how email is sent. Each can be overridden within the `notification.email` block
|
52
|
+
# by using the corresponding methods: `mailer`, `method`, and `template`
|
53
|
+
# config.notify.default_mailer = Voltron::NotificationMailer
|
54
|
+
|
55
|
+
# Within the mailer you define when sending a notification, this is the method that will be called
|
56
|
+
# So in the default case, `Voltron::NotificationMailer.notify(...)` will be called
|
57
|
+
# config.notify.default_method = :notify
|
58
|
+
|
59
|
+
# The default mail view template to use
|
60
|
+
# Note that if you decide to use a custom mailer/method, this becomes irrelevant
|
61
|
+
# as you'll have the ability to set the template as you see fit within the mailer's method itself
|
62
|
+
# config.notify.default_template = 'voltron/notification_mailer/notify.html.erb'
|
48
63
|
CONTENT
|
49
64
|
end
|
50
65
|
end
|
51
66
|
end
|
52
67
|
|
53
68
|
def copy_migrations
|
54
|
-
copy_migration
|
55
|
-
copy_migration
|
56
|
-
copy_migration
|
57
|
-
copy_migration
|
69
|
+
copy_migration 'create_voltron_notifications'
|
70
|
+
copy_migration 'create_voltron_notification_sms_notifications'
|
71
|
+
copy_migration 'create_voltron_notification_email_notifications'
|
72
|
+
copy_migration 'create_voltron_notification_sms_notification_attachments'
|
58
73
|
end
|
59
74
|
|
60
75
|
def copy_views
|
61
|
-
copy_file
|
76
|
+
copy_file '../../../app/views/voltron/notification_mailer/notify.html.erb', Rails.root.join('app', 'views', 'voltron', 'notification_mailer', 'notify.html.erb')
|
77
|
+
end
|
78
|
+
|
79
|
+
def copy_locales
|
80
|
+
locale_path = Rails.root.join('config', 'locales', 'voltron.yml')
|
81
|
+
locale = YAML.load_file(locale_path).symbolize_keys rescue {}
|
82
|
+
|
83
|
+
compact_nested = Proc.new do |k, v|
|
84
|
+
v.respond_to?(:delete_if) ? (v.delete_if(&compact_nested); nil) : v.blank?
|
85
|
+
end
|
86
|
+
|
87
|
+
notification_path = File.expand_path('../../../templates/config/locales/voltron-notification.yml', __FILE__)
|
88
|
+
notification_locale = YAML.load_file(notification_path).symbolize_keys
|
89
|
+
|
90
|
+
# Remove keys that don't have values from both hashes
|
91
|
+
notification_locale.delete_if(&compact_nested)
|
92
|
+
locale.delete_if(&compact_nested)
|
93
|
+
|
94
|
+
# Merge the 2 yaml files, giving priority to the original locle file.
|
95
|
+
# We don't want to overwrite anything the user may have created on their own, or modified
|
96
|
+
notification_locale.deep_merge!(locale)
|
97
|
+
|
98
|
+
File.open(locale_path, 'w') do |f|
|
99
|
+
f.puts '# This file will be merged with various other Voltron related YAML files with priority'
|
100
|
+
f.puts '# given to what exists in this file to begin with (nothing you add/modify here will be overwritten)'
|
101
|
+
f.puts '# whenever you run `rails g voltron:<gem_name>:install`,'
|
102
|
+
f.puts '# only if the gem in question has any locale data associated with it'
|
103
|
+
f.puts
|
104
|
+
f.puts notification_locale.stringify_keys.to_yaml(line_width: -1)
|
105
|
+
end
|
62
106
|
end
|
63
107
|
|
64
108
|
protected
|
65
109
|
|
66
110
|
def copy_migration(filename)
|
67
|
-
if migration_exists?(Rails.root.join(
|
68
|
-
say_status(
|
111
|
+
if migration_exists?(Rails.root.join('db', 'migrate'), filename)
|
112
|
+
say_status('skipped', "Migration #{filename}.rb already exists")
|
69
113
|
else
|
70
|
-
copy_file "db/migrate/#{filename}.rb", Rails.root.join(
|
114
|
+
copy_file "db/migrate/#{filename}.rb", Rails.root.join('db', 'migrate', "#{migration_number}_#{filename}.rb")
|
71
115
|
end
|
72
116
|
end
|
73
117
|
|
@@ -82,7 +126,7 @@ CONTENT
|
|
82
126
|
def migration_number
|
83
127
|
@migration_number ||= Time.now.strftime("%Y%m%d%H%M%S").to_i
|
84
128
|
|
85
|
-
while migration_id_exists?(Rails.root.join(
|
129
|
+
while migration_id_exists?(Rails.root.join('db', 'migrate'), @migration_number) do
|
86
130
|
@migration_number += 1
|
87
131
|
end
|
88
132
|
|
@@ -13,12 +13,15 @@ module Voltron
|
|
13
13
|
attr_accessor :sms_account_sid, :sms_auth_token, :sms_from
|
14
14
|
|
15
15
|
# Email config settings
|
16
|
-
attr_accessor :email_from
|
16
|
+
attr_accessor :email_from, :default_mailer, :default_method, :default_template
|
17
17
|
|
18
18
|
def initialize
|
19
19
|
@use_queue ||= false
|
20
20
|
@delay ||= 0.seconds
|
21
|
-
@email_from ||=
|
21
|
+
@email_from ||= 'no-reply@example.com'
|
22
|
+
@default_mailer = Voltron::NotificationMailer
|
23
|
+
@default_method = :notify
|
24
|
+
@default_template = 'voltron/notification_mailer/notify.html.erb'
|
22
25
|
end
|
23
26
|
|
24
27
|
end
|
@@ -3,9 +3,9 @@ module Voltron
|
|
3
3
|
module Routes
|
4
4
|
|
5
5
|
def allow_notification_update(options={})
|
6
|
-
path = (options[:path] ||
|
7
|
-
controller = (options[:controller] ||
|
8
|
-
action = (options[:action] ||
|
6
|
+
path = (options[:path] || '/notification/update').gsub(/(^[\s\/]+)|([\s\/]+$)/, '')
|
7
|
+
controller = (options[:controller] || 'voltron/notification')
|
8
|
+
action = (options[:action] || 'update')
|
9
9
|
post path, to: "#{controller}##{action}", as: :update_voltron_notification
|
10
10
|
end
|
11
11
|
|
@@ -4,7 +4,7 @@ module Voltron
|
|
4
4
|
|
5
5
|
isolate_namespace Voltron
|
6
6
|
|
7
|
-
initializer
|
7
|
+
initializer 'voltron.notify.initialize' do
|
8
8
|
::ActiveRecord::Base.send :extend, ::Voltron::Notify
|
9
9
|
::ActionDispatch::Routing::Mapper.send :include, ::Voltron::Notify::Routes
|
10
10
|
end
|
data/lib/voltron/notify.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
1
|
+
require 'voltron'
|
2
|
+
require 'voltron/notify/version'
|
3
|
+
require 'voltron/notify/action_dispatch/routes'
|
4
|
+
require 'voltron/config/notify'
|
5
5
|
|
6
6
|
module Voltron
|
7
7
|
module Notify
|
8
8
|
|
9
|
+
LOG_COLOR = :light_yellow
|
10
|
+
|
9
11
|
def notifyable
|
10
12
|
include InstanceMethods
|
11
13
|
|
@@ -13,7 +15,7 @@ module Voltron
|
|
13
15
|
|
14
16
|
after_validation :clean_notification_validation
|
15
17
|
|
16
|
-
has_many :notifications, as: :notifyable, class_name:
|
18
|
+
has_many :notifications, as: :notifyable, class_name: '::Voltron::Notification'
|
17
19
|
end
|
18
20
|
|
19
21
|
module InstanceMethods
|
@@ -45,4 +47,4 @@ module Voltron
|
|
45
47
|
end
|
46
48
|
end
|
47
49
|
|
48
|
-
require
|
50
|
+
require 'voltron/notify/engine' if defined?(Rails)
|
data/voltron-notify.gemspec
CHANGED
@@ -1,33 +1,35 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
lib = File.expand_path(
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
4
|
+
require 'voltron/notify/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'voltron-notify'
|
8
8
|
spec.version = Voltron::Notify::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
9
|
+
spec.authors = ['Eric Hainer']
|
10
|
+
spec.email = ['eric@commercekitchen.com']
|
11
11
|
|
12
12
|
spec.summary = %q{Send notifications easier}
|
13
|
-
spec.homepage =
|
14
|
-
spec.license =
|
13
|
+
spec.homepage = 'https://github.com/ehainer/voltron-notify'
|
14
|
+
spec.license = 'MIT'
|
15
15
|
|
16
16
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
17
|
-
spec.bindir =
|
17
|
+
spec.bindir = 'exe'
|
18
18
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
|
-
spec.require_paths = [
|
19
|
+
spec.require_paths = ['lib']
|
20
20
|
|
21
|
-
spec.add_dependency
|
22
|
-
spec.add_dependency
|
23
|
-
spec.add_dependency
|
24
|
-
spec.add_dependency
|
21
|
+
spec.add_dependency 'rails', '>= 4.2'
|
22
|
+
spec.add_dependency 'twilio-ruby', '~> 4.11'
|
23
|
+
spec.add_dependency 'rack', '>= 1.6'
|
24
|
+
spec.add_dependency 'voltron', '>= 0.2.1'
|
25
25
|
|
26
|
-
spec.add_development_dependency
|
27
|
-
spec.add_development_dependency
|
28
|
-
spec.add_development_dependency
|
29
|
-
spec.add_development_dependency
|
30
|
-
spec.add_development_dependency
|
31
|
-
spec.add_development_dependency
|
32
|
-
spec.add_development_dependency
|
26
|
+
spec.add_development_dependency 'simplecov', '0.11.0'
|
27
|
+
spec.add_development_dependency 'bundler', '>= 1.12'
|
28
|
+
spec.add_development_dependency 'rake', '>= 10.0'
|
29
|
+
spec.add_development_dependency 'rspec', '>= 3.0'
|
30
|
+
spec.add_development_dependency 'rspec-rails', '>= 3.4'
|
31
|
+
spec.add_development_dependency 'sqlite3', '>= 1.2'
|
32
|
+
spec.add_development_dependency 'factory_girl_rails', '>= 4.7'
|
33
|
+
spec.add_development_dependency 'letter_opener', '>= 1.0.0'
|
34
|
+
spec.add_development_dependency 'sidekiq', '~> 4.2.10'
|
33
35
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: voltron-notify
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Hainer
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-04-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.2.
|
61
|
+
version: 0.2.1
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 0.2.
|
68
|
+
version: 0.2.1
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: simplecov
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -164,6 +164,34 @@ dependencies:
|
|
164
164
|
- - ">="
|
165
165
|
- !ruby/object:Gem::Version
|
166
166
|
version: '4.7'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: letter_opener
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: 1.0.0
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: 1.0.0
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: sidekiq
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - "~>"
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: 4.2.10
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - "~>"
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: 4.2.10
|
167
195
|
description:
|
168
196
|
email:
|
169
197
|
- eric@commercekitchen.com
|
@@ -189,6 +217,7 @@ files:
|
|
189
217
|
- app/views/voltron/notification_mailer/notify.html.erb
|
190
218
|
- bin/console
|
191
219
|
- bin/setup
|
220
|
+
- lib/generators/templates/config/locales/voltron-notification.yml
|
192
221
|
- lib/generators/templates/db/migrate/create_voltron_notification_email_notifications.rb
|
193
222
|
- lib/generators/templates/db/migrate/create_voltron_notification_sms_notification_attachments.rb
|
194
223
|
- lib/generators/templates/db/migrate/create_voltron_notification_sms_notifications.rb
|