noticed 1.2.11 → 1.2.16
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +66 -14
- data/lib/generators/noticed/delivery_method_generator.rb +19 -0
- data/lib/generators/noticed/model_generator.rb +11 -2
- data/lib/generators/noticed/templates/delivery_method.rb.tt +12 -0
- data/lib/noticed.rb +1 -0
- data/lib/noticed/base.rb +17 -6
- data/lib/noticed/delivery_methods/action_cable.rb +12 -12
- data/lib/noticed/delivery_methods/base.rb +25 -1
- data/lib/noticed/delivery_methods/email.rb +2 -0
- data/lib/noticed/model.rb +4 -4
- data/{app/channels → lib}/noticed/notification_channel.rb +0 -0
- data/lib/noticed/translation.rb +1 -1
- data/lib/noticed/version.rb +1 -1
- metadata +9 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3b37e7d17da790342493c2ffc575cc5d013ac156b7ac600fb0022c79bcb034de
|
4
|
+
data.tar.gz: 87fc46cbf6829e174b0dc6df1751187965e645f7461848469e48a2ea7bcb6a46
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b9b4db6825f88670f27d768f40724fbd22c2f8e92fc6ce5f3bc32650cc9e77475d3c6eecb51fd7f59b10d70e735f648c92ecdae6f6d4b8ff61ff4b5c39e501d3
|
7
|
+
data.tar.gz: f474ad70283d4faa9b33bd51346acb64b29a4076b9c9c0ffcff58e60f75d331bc54b162a8e3d77310153d39caf898ac2924b234389b1089b3262b35fa7b48ac3
|
data/README.md
CHANGED
@@ -78,7 +78,7 @@ To add delivery methods, simply `include` the module for the delivery methods yo
|
|
78
78
|
class CommentNotification < Noticed::Base
|
79
79
|
deliver_by :database
|
80
80
|
deliver_by :action_cable
|
81
|
-
deliver_by :email, if: :email_notifications?
|
81
|
+
deliver_by :email, mailer: 'CommentMailer', if: :email_notifications?
|
82
82
|
|
83
83
|
# I18n helpers
|
84
84
|
def message
|
@@ -86,6 +86,7 @@ class CommentNotification < Noticed::Base
|
|
86
86
|
end
|
87
87
|
|
88
88
|
# URL helpers are accessible in notifications
|
89
|
+
# Don't forget to set your default_url_options so Rails knows how to generate urls
|
89
90
|
def url
|
90
91
|
post_path(params[:post])
|
91
92
|
end
|
@@ -113,6 +114,12 @@ You can define helper methods inside your Notification object to make it easier
|
|
113
114
|
|
114
115
|
Rails url helpers are included in notification classes by default so you have full access to them just like you would in your controllers and views.
|
115
116
|
|
117
|
+
Don't forget, you'll need to configure `default_url_options` in order for Rails to know what host and port to use when generating URLs.
|
118
|
+
|
119
|
+
```ruby
|
120
|
+
Rails.application.routes.default_url_options[:host] = 'localhost:3000'
|
121
|
+
```
|
122
|
+
|
116
123
|
**Callbacks**
|
117
124
|
|
118
125
|
Like ActiveRecord, notifications have several different types of callbacks.
|
@@ -120,7 +127,7 @@ Like ActiveRecord, notifications have several different types of callbacks.
|
|
120
127
|
```ruby
|
121
128
|
class CommentNotification < Noticed::Base
|
122
129
|
deliver_by :database
|
123
|
-
deliver_by :email
|
130
|
+
deliver_by :email, mailer: 'CommentMailer'
|
124
131
|
|
125
132
|
# Callbacks for the entire delivery
|
126
133
|
before_deliver :whatever
|
@@ -158,7 +165,7 @@ For example:
|
|
158
165
|
|
159
166
|
```ruby
|
160
167
|
class CommentNotification < Noticed::Base
|
161
|
-
deliver_by :email, if: :email_notifications?
|
168
|
+
deliver_by :email, mailer: 'CommentMailer', if: :email_notifications?
|
162
169
|
|
163
170
|
def email_notifications?
|
164
171
|
recipient.email_notifications?
|
@@ -311,22 +318,28 @@ Sends an SMS notification via Vonage / Nexmo.
|
|
311
318
|
|
312
319
|
### 🚚 Custom Delivery Methods
|
313
320
|
|
314
|
-
|
321
|
+
To generate a custom delivery method, simply run
|
315
322
|
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
end
|
320
|
-
```
|
323
|
+
`rails generate noticed:delivery_method Discord`
|
324
|
+
|
325
|
+
This will generate a new `DeliveryMethods::Discord` class inside the `app/notifications/delivery_methods` folder, which can be used to deliver notifications to Discord.
|
321
326
|
|
322
327
|
```ruby
|
323
|
-
class
|
328
|
+
class DeliveryMethods::Discord < Noticed::DeliveryMethods::Base
|
324
329
|
def deliver
|
325
330
|
# Logic for sending a Discord notification
|
326
331
|
end
|
327
332
|
end
|
328
333
|
```
|
329
334
|
|
335
|
+
You can use the custom delivery method thus created by adding a `deliver_by` line with a unique name and `class` option in your notification class.
|
336
|
+
|
337
|
+
```ruby
|
338
|
+
class MyNotification < Noticed::Base
|
339
|
+
deliver_by :discord, class: "DeliveryMethods::Discord"
|
340
|
+
end
|
341
|
+
```
|
342
|
+
|
330
343
|
Delivery methods have access to the following methods and attributes:
|
331
344
|
|
332
345
|
* `notification` - The instance of the Notification. You can call methods on the notification to let the user easily override formatting and other functionality of the delivery method.
|
@@ -334,12 +347,51 @@ Delivery methods have access to the following methods and attributes:
|
|
334
347
|
* `recipient` - The object who should receive the notification. This is typically a User, Account, or other ActiveRecord model.
|
335
348
|
* `params` - The params passed into the notification. This is details about the event that happened. For example, a user commenting on a post would have params of `{ user: User.first }`
|
336
349
|
|
350
|
+
#### Validating options passed to Custom Delivery methods
|
351
|
+
|
352
|
+
The presence of the delivery method options is automatically validated if using the `option(s)` method.
|
353
|
+
|
354
|
+
If you want to validate that the passed options contain valid values, or to add any custom validations, override the `self.validate!(delivery_method_options)` method from the `Noticed::DeliveryMethods::Base` class.
|
355
|
+
|
356
|
+
```ruby
|
357
|
+
class DeliveryMethods::Discord < Noticed::DeliveryMethods::Base
|
358
|
+
option :username # Requires the username option to be passed
|
359
|
+
|
360
|
+
def deliver
|
361
|
+
# Logic for sending a Discord notification
|
362
|
+
end
|
363
|
+
|
364
|
+
def self.validate!(delivery_method_options)
|
365
|
+
super # Don't forget to call super, otherwise option presence won't be validated
|
366
|
+
|
367
|
+
# Custom validations
|
368
|
+
if delivery_method_options[:username].blank?
|
369
|
+
raise Noticed::ValidationError, 'the `username` option must be present'
|
370
|
+
end
|
371
|
+
end
|
372
|
+
end
|
373
|
+
|
374
|
+
class CommentNotification < Noticed::Base
|
375
|
+
deliver_by :discord, class: 'DeliveryMethods::Discord'
|
376
|
+
end
|
377
|
+
```
|
378
|
+
|
379
|
+
Now it will raise an error because a required argument is missing.
|
380
|
+
|
381
|
+
To fix the error, the argument has to be passed correctly. For example:
|
382
|
+
|
383
|
+
```ruby
|
384
|
+
class CommentNotification < Noticed::Base
|
385
|
+
deliver_by :discord, class: 'DeliveryMethods::Discord', username: User.admin.username
|
386
|
+
end
|
387
|
+
```
|
388
|
+
|
337
389
|
#### Callbacks
|
338
390
|
|
339
391
|
Callbacks for delivery methods wrap the *actual* delivery of the notification. You can use `before_deliver`, `around_deliver` and `after_deliver` in your custom delivery methods.
|
340
392
|
|
341
393
|
```ruby
|
342
|
-
class
|
394
|
+
class DeliveryMethods::Discord < Noticed::DeliveryMethods::Base
|
343
395
|
after_deliver do
|
344
396
|
# Do whatever you want
|
345
397
|
end
|
@@ -351,13 +403,13 @@ end
|
|
351
403
|
Rails 6.1+ can serialize Class and Module objects as arguments to ActiveJob. The following syntax should work for Rails 6.1+:
|
352
404
|
|
353
405
|
```ruby
|
354
|
-
deliver_by
|
406
|
+
deliver_by DeliveryMethods::Discord
|
355
407
|
```
|
356
408
|
|
357
|
-
For Rails 6.0
|
409
|
+
For Rails 6.0, you must pass strings of the class names in the `deliver_by` options.
|
358
410
|
|
359
411
|
```ruby
|
360
|
-
deliver_by :discord, class: "
|
412
|
+
deliver_by :discord, class: "DeliveryMethods::Discord"
|
361
413
|
```
|
362
414
|
|
363
415
|
We recommend the Rails 6.0 compatible options to prevent confusion.
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "rails/generators/named_base"
|
4
|
+
|
5
|
+
module Noticed
|
6
|
+
module Generators
|
7
|
+
class DeliveryMethodGenerator < Rails::Generators::NamedBase
|
8
|
+
include Rails::Generators::ResourceHelpers
|
9
|
+
|
10
|
+
source_root File.expand_path("../templates", __FILE__)
|
11
|
+
|
12
|
+
desc "Generates a class for a custom delivery method with the given NAME."
|
13
|
+
|
14
|
+
def generate_notification
|
15
|
+
template "delivery_method.rb", "app/notifications/delivery_methods/#{singular_name}.rb"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -15,13 +15,22 @@ module Noticed
|
|
15
15
|
argument :attributes, type: :array, default: [], banner: "field:type field:type"
|
16
16
|
|
17
17
|
def generate_notification
|
18
|
-
generate :model, name, "recipient:references{polymorphic}", "type", params_column, "read_at:datetime", *attributes
|
18
|
+
generate :model, name, "recipient:references{polymorphic}", "type", params_column, "read_at:datetime:index", *attributes
|
19
19
|
end
|
20
20
|
|
21
21
|
def add_noticed_model
|
22
22
|
inject_into_class model_path, class_name, " include Noticed::Model\n"
|
23
23
|
end
|
24
24
|
|
25
|
+
def add_not_nullable
|
26
|
+
migration_path = Dir.glob(Rails.root.join("db/migrate/*")).max_by { |f| File.mtime(f) }
|
27
|
+
|
28
|
+
# Force is required because null: false already exists in the file and Thor isn't smart enough to tell the difference
|
29
|
+
insert_into_file migration_path, after: "t.string :type", force: true do
|
30
|
+
", null: false"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
25
34
|
def done
|
26
35
|
readme "README" if behavior == :invoke
|
27
36
|
end
|
@@ -34,7 +43,7 @@ module Noticed
|
|
34
43
|
|
35
44
|
def params_column
|
36
45
|
case ActiveRecord::Base.configurations.configs_for(spec_name: "primary").config["adapter"]
|
37
|
-
when "
|
46
|
+
when "mysql2"
|
38
47
|
"params:json"
|
39
48
|
when "postgresql"
|
40
49
|
"params:jsonb"
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class DeliveryMethods::<%= class_name %> < Noticed::DeliveryMethods::Base
|
2
|
+
def deliver
|
3
|
+
# Logic for sending the notification
|
4
|
+
end
|
5
|
+
|
6
|
+
# You may override this method to validate options for the delivery method
|
7
|
+
# Invalid options should raise a ValidationError
|
8
|
+
#
|
9
|
+
# def self.validate!(options)
|
10
|
+
# raise ValidationError, "required_option missing" unless options[:required_option]
|
11
|
+
# end
|
12
|
+
end
|
data/lib/noticed.rb
CHANGED
@@ -8,6 +8,7 @@ module Noticed
|
|
8
8
|
autoload :Model, "noticed/model"
|
9
9
|
autoload :TextCoder, "noticed/text_coder"
|
10
10
|
autoload :Translation, "noticed/translation"
|
11
|
+
autoload :NotificationChannel, "noticed/notification_channel"
|
11
12
|
|
12
13
|
module DeliveryMethods
|
13
14
|
autoload :Base, "noticed/delivery_methods/base"
|
data/lib/noticed/base.rb
CHANGED
@@ -32,7 +32,7 @@ module Noticed
|
|
32
32
|
def params(*names)
|
33
33
|
param_names.concat Array.wrap(names)
|
34
34
|
end
|
35
|
-
|
35
|
+
alias_method :param, :params
|
36
36
|
end
|
37
37
|
|
38
38
|
def initialize(params = {})
|
@@ -97,13 +97,12 @@ module Noticed
|
|
97
97
|
}
|
98
98
|
|
99
99
|
run_callbacks delivery_method[:name] do
|
100
|
-
|
101
|
-
enqueue ?
|
100
|
+
method = delivery_method_for(delivery_method[:name], delivery_method[:options])
|
101
|
+
enqueue ? method.perform_later(args) : method.perform_now(args)
|
102
102
|
end
|
103
103
|
end
|
104
104
|
|
105
|
-
|
106
|
-
def get_class(name, options)
|
105
|
+
def delivery_method_for(name, options)
|
107
106
|
if options[:class]
|
108
107
|
options[:class].constantize
|
109
108
|
else
|
@@ -111,13 +110,25 @@ module Noticed
|
|
111
110
|
end
|
112
111
|
end
|
113
112
|
|
114
|
-
# Validates that all params are present
|
115
113
|
def validate!
|
114
|
+
validate_params_present!
|
115
|
+
validate_options_of_delivery_methods!
|
116
|
+
end
|
117
|
+
|
118
|
+
# Validates that all params are present
|
119
|
+
def validate_params_present!
|
116
120
|
self.class.param_names.each do |param_name|
|
117
121
|
if params[param_name].nil?
|
118
122
|
raise ValidationError, "#{param_name} is missing."
|
119
123
|
end
|
120
124
|
end
|
121
125
|
end
|
126
|
+
|
127
|
+
def validate_options_of_delivery_methods!
|
128
|
+
delivery_methods.each do |delivery_method|
|
129
|
+
method = delivery_method_for(delivery_method[:name], delivery_method[:options])
|
130
|
+
method.validate!(delivery_method[:options])
|
131
|
+
end
|
132
|
+
end
|
122
133
|
end
|
123
134
|
end
|
@@ -17,18 +17,18 @@ module Noticed
|
|
17
17
|
|
18
18
|
def channel
|
19
19
|
@channel ||= begin
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
20
|
+
value = options[:channel]
|
21
|
+
case value
|
22
|
+
when String
|
23
|
+
value.constantize
|
24
|
+
when Symbol
|
25
|
+
notification.send(value)
|
26
|
+
when Class
|
27
|
+
value
|
28
|
+
else
|
29
|
+
Noticed::NotificationChannel
|
30
|
+
end
|
31
|
+
end
|
32
32
|
end
|
33
33
|
end
|
34
34
|
end
|
@@ -4,11 +4,35 @@ module Noticed
|
|
4
4
|
extend ActiveModel::Callbacks
|
5
5
|
define_model_callbacks :deliver
|
6
6
|
|
7
|
-
|
7
|
+
class_attribute :option_names, instance_writer: false, default: []
|
8
|
+
|
9
|
+
attr_reader :notification, :options, :params, :recipient, :record
|
10
|
+
|
11
|
+
class << self
|
12
|
+
# Copy option names from parent
|
13
|
+
def inherited(base) #:nodoc:
|
14
|
+
base.option_names = option_names.dup
|
15
|
+
super
|
16
|
+
end
|
17
|
+
|
18
|
+
def options(*names)
|
19
|
+
option_names.concat Array.wrap(names)
|
20
|
+
end
|
21
|
+
alias_method :option, :options
|
22
|
+
|
23
|
+
def validate!(delivery_method_options)
|
24
|
+
option_names.each do |option_name|
|
25
|
+
unless delivery_method_options.key? option_name
|
26
|
+
raise ValidationError, "option `#{option_name}` must be set for #{name}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
8
31
|
|
9
32
|
def perform(args)
|
10
33
|
@notification = args[:notification_class].constantize.new(args[:params])
|
11
34
|
@options = args[:options]
|
35
|
+
@params = args[:params]
|
12
36
|
@recipient = args[:recipient]
|
13
37
|
@record = args[:record]
|
14
38
|
|
data/lib/noticed/model.rb
CHANGED
@@ -32,10 +32,10 @@ module Noticed
|
|
32
32
|
# Rehydrate the database notification into the Notification object for rendering
|
33
33
|
def to_notification
|
34
34
|
@_notification ||= begin
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
35
|
+
instance = type.constantize.with(params)
|
36
|
+
instance.record = self
|
37
|
+
instance
|
38
|
+
end
|
39
39
|
end
|
40
40
|
|
41
41
|
def mark_as_read!
|
File without changes
|
data/lib/noticed/translation.rb
CHANGED
data/lib/noticed/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: noticed
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.16
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Oliver
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-10-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -91,10 +91,11 @@ files:
|
|
91
91
|
- MIT-LICENSE
|
92
92
|
- README.md
|
93
93
|
- Rakefile
|
94
|
-
-
|
94
|
+
- lib/generators/noticed/delivery_method_generator.rb
|
95
95
|
- lib/generators/noticed/model_generator.rb
|
96
96
|
- lib/generators/noticed/notification_generator.rb
|
97
97
|
- lib/generators/noticed/templates/README
|
98
|
+
- lib/generators/noticed/templates/delivery_method.rb.tt
|
98
99
|
- lib/generators/noticed/templates/notification.rb.tt
|
99
100
|
- lib/noticed.rb
|
100
101
|
- lib/noticed/base.rb
|
@@ -109,6 +110,7 @@ files:
|
|
109
110
|
- lib/noticed/delivery_methods/vonage.rb
|
110
111
|
- lib/noticed/engine.rb
|
111
112
|
- lib/noticed/model.rb
|
113
|
+
- lib/noticed/notification_channel.rb
|
112
114
|
- lib/noticed/text_coder.rb
|
113
115
|
- lib/noticed/translation.rb
|
114
116
|
- lib/noticed/version.rb
|
@@ -117,7 +119,7 @@ homepage: https://github.com/excid3/noticed
|
|
117
119
|
licenses:
|
118
120
|
- MIT
|
119
121
|
metadata: {}
|
120
|
-
post_install_message:
|
122
|
+
post_install_message:
|
121
123
|
rdoc_options: []
|
122
124
|
require_paths:
|
123
125
|
- lib
|
@@ -132,8 +134,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
132
134
|
- !ruby/object:Gem::Version
|
133
135
|
version: '0'
|
134
136
|
requirements: []
|
135
|
-
rubygems_version: 3.1.
|
136
|
-
signing_key:
|
137
|
+
rubygems_version: 3.1.4
|
138
|
+
signing_key:
|
137
139
|
specification_version: 4
|
138
140
|
summary: Notifications for Ruby on Rails applications
|
139
141
|
test_files: []
|