notification-handler 3.0.2 → 3.0.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1dc02802065493c5e297334667b3331b8b0c8757e80989b052d6426b154d450b
4
- data.tar.gz: 4c3f0782b4a05e9df8960cfcfcd18cbb27bc14d25855fa0f63ce0b973324b55b
3
+ metadata.gz: 44da09c04b6282f1d6eba56e5a195858d5646964e5e7f6e1ee47eda4252d7df2
4
+ data.tar.gz: acbc2f716492d9450c40d294c91b3a6145e9520bc4a3c942211d9e3f7df668b4
5
5
  SHA512:
6
- metadata.gz: 9a49f5df7d39be5495797718c4909b35c831bcd59dfcde06b14ad7b63a8866d4d9e666cb9de868b30fc18008db0fc9090f8a36bcce98e8fe339625c7b4775ccd
7
- data.tar.gz: fc6f3e388e7cb39e44fcda525b4b6adde35dd7d1adb05733010d4aa1a7c8d4006efbcd04f23f0b15ae24d2257aa05b12bf7ea1891d9d513c7e54f4aa2c86cb5d
6
+ metadata.gz: 41d91481c7d251290aa7c3a12cec7cfa778f74aeb579a3ea7224a3e3947c9736aa0fe8d339d3ec5af16492391c41828d50384b37ab976eff004d842ffe78e5ea
7
+ data.tar.gz: f658cb7133391ac215459a7831b50a6280a4d4aa2e9c2f3d8541725749154197663eec3d83050b27f80a3805fc7bd7c3a8cbcefeed33ce3fee8ba680ece76f3e
data/README.md CHANGED
@@ -1,226 +1,84 @@
1
- # NotificationHandler
1
+ # notifications-rails
2
2
 
3
- [![Gem Version](https://badge.fury.io/rb/notification-handler.svg)](https://badge.fury.io/rb/notification-handler) ![Travis](https://travis-ci.com/jonhue/notifications-rails.svg?branch=master)
3
+ notifications-rails is the most powerful notification library for Rails. It offers not only simple APIs to create and render notifications but also supports user-integration and cross-platform delivery of notifications.
4
4
 
5
- Create and modify your notifications through a simple API.
5
+ ## Philosophy
6
6
 
7
- ---
7
+ notifications-rails has been built with modularity in mind. It currently consists of four components each of which bringing one essential functionality to the integration of notifications in your Rails app.
8
8
 
9
- ## Table of Contents
9
+ **[notification-handler](notification-handler):** Create and modify your notifications through a simple API.
10
10
 
11
- * [Installation](#installation)
12
- * [Usage](#usage)
13
- * [`Notification` API](#notification-api)
14
- * [`notification_target`](#notification_target)
15
- * [`notification_object`](#notification_object)
16
- * [Groups](#groups)
17
- * [Defining a group](#defining-a-group)
18
- * [Using a group](#using-a-group)
19
- * [Caching](#caching)
20
- * [Configuration](#configuration)
21
- * [To Do](#to-do)
22
- * [Contributing](#contributing)
23
- * [Semantic versioning](#semantic-versioning)
11
+ **[notification-renderer](notification-renderer):** Render your notifications in various contexts.
24
12
 
25
- ---
13
+ **[notification-pusher](notification-pusher):** Deliver your notifications to various services, including [Email](notification-pusher/notification-pusher-actionmailer) and [OneSignal](notification-pusher/notification-pusher-onesignal).
26
14
 
27
- ## Installation
28
-
29
- NotificationHandler works with Rails 5 onwards. You can add it to your `Gemfile` with:
30
-
31
- ```ruby
32
- gem 'notification-handler'
33
- ```
34
-
35
- And then execute:
36
-
37
- $ bundle
38
-
39
- Or install it yourself as:
40
-
41
- $ gem install notification-handler
42
-
43
- Now run the generator:
44
-
45
- $ rails g notification_handler:install
46
-
47
- To wrap things up, migrate the changes to your database:
48
-
49
- $ rails db:migrate
50
-
51
- ---
52
-
53
- ## Usage
54
-
55
- ### `Notification` API
56
-
57
- You can use all the ActiveRecord methods you know and love on your `Notification` class. So creating a new notification is dead simple:
58
-
59
- ```ruby
60
- notification = Notification.new
61
- ```
62
-
63
- Every `Notification` object has a `target` record. This target record is the object, that this notification belongs to (or targets). Usually it's a user, but it can be a record of any class:
64
-
65
- ```ruby
66
- notification.target = User.first
67
- ```
68
-
69
- To store information in your `Notification` record you can use the `metadata` attribute that gets serialized as a `Hash`:
70
-
71
- ```ruby
72
- notification.metadata = {
73
- title: 'My first notification',
74
- content: "It looks great, doesn't it?"
75
- }
76
- ```
15
+ **[notification-settings](notification-settings):** Integrates with your authentication solution to craft a personalized user notification platform.
77
16
 
78
- Another form of adding information is by associating an object to the notification. This can be a record of any class you like:
79
-
80
- ```ruby
81
- notification.object = Recipe.first
82
- ```
83
-
84
- The `read` attribute determines whether a notification has been seen or not:
85
-
86
- ```ruby
87
- notification.read = true
88
- notification.read? # true
89
- notification.unread? # false
90
- ```
91
-
92
- You can use scopes to filter for read or unread notifications:
93
-
94
- ```ruby
95
- # Return all read notifications
96
- Notification.read
17
+ You may just use the components you actually need, or instead use this gem to bundle everything for a complete notification solution.
97
18
 
98
- # Return all unread notifications
99
- Notification.unread
100
-
101
- # Number of unread notifications
102
- Notification.unread.size
103
- ```
104
-
105
- ### `notification_target`
106
-
107
- To use records of an ActiveRecord class as notification targets, add the following to your class:
108
-
109
- ```ruby
110
- class User < ApplicationRecord
111
- notification_target
112
- end
113
- ```
114
-
115
- Now belonging notifications are easy to access:
116
-
117
- ```ruby
118
- notifications = User.first.notifications
119
- ```
120
-
121
- You can create a notification from a `target`:
122
-
123
- ```ruby
124
- User.first.notify(object: Recipe.first)
125
- ```
126
-
127
- ### `notification_object`
128
-
129
- When using records of an ActiveRecord class as notification objects, add this to your class:
130
-
131
- ```ruby
132
- class Recipe < ApplicationRecord
133
- notification_object
134
- end
135
- ```
136
-
137
- Now associated notifications are easy to access:
138
-
139
- ```ruby
140
- notifications = Recipe.first.belonging_notifications
141
- ```
142
-
143
- ### Groups
144
-
145
- Groups are a powerful way to bulk-create notifications for multiple objects that don't necessarily have a common class.
146
-
147
- #### Defining a group
19
+ ## Installation
148
20
 
149
- You define groups in your `NotificationHandler` configuration:
21
+ You can add notifications-rails to your `Gemfile` with:
150
22
 
151
23
  ```ruby
152
- NotificationHandler.configure do |config|
153
- config.define_group :subscribers, -> { User.where(subscriber: true) }
154
- end
24
+ gem 'notifications-rails'
155
25
  ```
156
26
 
157
- When creating a notification for the group `:subscribers`, one notification will be added for every target that fulfills this scope: `User.where(subscriber: true)`. You can also target objects from different classes:
27
+ And then run:
158
28
 
159
- ```ruby
160
- NotificationHandler.configure do |config|
161
- config.define_group :subscribers, -> { User.where(subscriber: true) + Admin.all }
162
- config.define_group :company_members, lambda { |company_id|
163
- User.with_role(:member, Company.find(company_id)
164
- }
165
- end
166
- ```
29
+ $ bundle install
167
30
 
168
- The only requirement is that the result of evaluating the proc be Enumerable.
31
+ Or install it yourself as:
169
32
 
170
- #### Using a group
33
+ $ gem install notifications-rails
171
34
 
172
- Bulk-creation of notifications for a certain group is fairly simple:
35
+ If you always want to be up to date fetch the latest from GitHub in your `Gemfile`:
173
36
 
174
37
  ```ruby
175
- notifications = Notification.for_group(:subscribers, attrs: { object: Recipe.first })
176
- notifications = Notification.for_group(:company_members, args: [4], attrs: { object: Recipe.first })
38
+ gem 'notifications-rails', github: 'jonhue/notifications-rails'
177
39
  ```
178
40
 
179
- `Notification.for_group` returns an array of `Notification` objects.
41
+ ## Usage
180
42
 
181
- **Note:** You are not able to set the `target` attribute when a `group` has been specified.
43
+ Details on usage are provided in the [documentation](#philosophy) of the specific modules.
182
44
 
183
- ### Caching
45
+ ## Development
184
46
 
185
- You can cache the amount of unread and read notifications for notification targets by settings the [`cache`](#configuration) configuration option to `true`.
47
+ To start development you first have to fork this repository and locally clone your fork.
186
48
 
187
- Then add the following columns to the database tables of ActiveRecord classes acting as notification targets:
49
+ Install the projects dependencies by running:
188
50
 
189
- ```ruby
190
- add_column :user, :read_notification_count, :integer
191
- add_column :user, :unread_notification_count, :integer
192
- ```
51
+ $ bundle install
193
52
 
194
- ---
53
+ ### Testing
195
54
 
196
- ## Configuration
55
+ Tests are written with RSpec. Integration tests are located in `/spec`, unit tests can be found in `<module>/spec`.
197
56
 
198
- You can configure NotificationHandler by passing a block to `configure`. This can be done in `config/initializers/notification-handler.rb`:
57
+ To run all tests:
199
58
 
200
- ```ruby
201
- NotificationHandler.configure do |config|
202
- config.cache = true
203
- end
204
- ```
205
-
206
- **`cache`** Cache amount of unread and read notifications for notification targets. Takes a boolean. Defaults to `false`.
59
+ $ ./rspec
207
60
 
208
- ---
61
+ To run RuboCop:
209
62
 
210
- ## To Do
63
+ $ bundle exec rubocop
211
64
 
212
- We use [GitHub projects](https://github.com/jonhue/notifications-rails/projects/2) to coordinate the work on this project.
65
+ You can find all commands run by the CI workflow in `.github/workflows/ci.yml`.
213
66
 
214
- To propose your ideas, initiate the discussion by adding a [new issue](https://github.com/jonhue/notifications-rails/issues/new).
67
+ ## Contributing
215
68
 
216
- ---
69
+ We warmly welcome everyone who is intersted in contributing. Please reference our [contributing guidelines](CONTRIBUTING.md) and our [Code of Conduct](CODE_OF_CONDUCT.md).
217
70
 
218
- ## Contributing
71
+ ## Releases
219
72
 
220
- We hope that you will consider contributing to NotificationHandler. Please read this short overview for some information about how to get started:
73
+ [Here](https://github.com/jonhue/notifications-rails/releases) you can find details on all past releases. Unreleased breaking changes that are on the current master can be found [here](CHANGELOG.md).
221
74
 
222
- [Learn more about contributing to this repository](https://github.com/jonhue/notifications-rails/blob/master/CONTRIBUTING.md), [Code of Conduct](https://github.com/jonhue/notifications-rails/blob/master/CODE_OF_CONDUCT.md)
75
+ notifications-rails follows Semantic Versioning 2.0 as defined at http://semver.org. Reference our [security policy](SECURITY.md).
223
76
 
224
- ### Semantic Versioning
77
+ ### Publishing
225
78
 
226
- NotificationHandler follows Semantic Versioning 2.0 as defined at http://semver.org.
79
+ 1. Review breaking changes and deprecations in `CHANGELOG.md`.
80
+ 1. Change the gem version in `VERSION`.
81
+ 1. Reset `CHANGELOG.md`.
82
+ 1. Create a pull request to merge the changes into `master`.
83
+ 1. After the pull request was merged, create a new release listing the breaking changes and commits on `master` since the last release.
84
+ 1. The release workflow will publish the gems to RubyGems.
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'notification-handler'
4
+ require 'notification-renderer'
5
+ require 'notification-pusher'
6
+ require 'notification-settings'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: notification-handler
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.2
4
+ version: 3.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonas Hübotter
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-10-10 00:00:00.000000000 Z
11
+ date: 2020-12-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -151,26 +151,14 @@ dependencies:
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0'
153
153
  description: Create and modify your notifications through a simple API.
154
- email: me@jonhue.me
154
+ email: jonas.huebotter@gmail.com
155
155
  executables: []
156
156
  extensions: []
157
157
  extra_rdoc_files: []
158
158
  files:
159
159
  - LICENSE
160
160
  - README.md
161
- - app/models/notification_handler/notification.rb
162
- - lib/generators/notification_handler/install_generator.rb
163
- - lib/generators/templates/install/initializer.rb
164
- - lib/generators/templates/install/notification_model.rb
165
- - lib/generators/templates/install/notifications_migration.rb.erb
166
- - lib/notification-handler.rb
167
- - lib/notification_handler/configuration.rb
168
- - lib/notification_handler/engine.rb
169
- - lib/notification_handler/group.rb
170
- - lib/notification_handler/notification_lib.rb
171
- - lib/notification_handler/notification_scopes.rb
172
- - lib/notification_handler/object.rb
173
- - lib/notification_handler/target.rb
161
+ - lib/notifications-rails.rb
174
162
  homepage: https://github.com/jonhue/notifications-rails/tree/master/notification-handler
175
163
  licenses:
176
164
  - MIT
@@ -191,7 +179,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
191
179
  - !ruby/object:Gem::Version
192
180
  version: '0'
193
181
  requirements: []
194
- rubygems_version: 3.0.3
182
+ rubygems_version: 3.1.4
195
183
  signing_key:
196
184
  specification_version: 4
197
185
  summary: Create and modify your notifications through a simple API
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module NotificationHandler
4
- class Notification < ApplicationRecord
5
- include NotificationHandler::NotificationLib
6
- include NotificationHandler::NotificationScopes
7
- end
8
- end
@@ -1,46 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rails/generators'
4
- require 'rails/generators/migration'
5
-
6
- module NotificationHandler
7
- class InstallGenerator < Rails::Generators::Base
8
- include Rails::Generators::Migration
9
-
10
- source_root(File.join(File.dirname(__FILE__), '../templates/install'))
11
- desc 'Install NotificationHandler'
12
-
13
- def self.next_migration_number(dirname)
14
- if ActiveRecord::Base.timestamped_migrations
15
- Time.now.utc.strftime('%Y%m%d%H%M%S')
16
- else
17
- format('%<migration_number>.3d',
18
- migration_number: current_migration_number(dirname) + 1)
19
- end
20
- end
21
-
22
- def create_initializer
23
- template 'initializer.rb', 'config/initializers/notification_handler.rb'
24
- end
25
-
26
- def create_notifications_migration_file
27
- migration_template(
28
- 'notifications_migration.rb.erb',
29
- 'db/migrate/notification_handler_migration.rb',
30
- migration_version: migration_version
31
- )
32
- end
33
-
34
- def create_notification_model
35
- template 'notification_model.rb', 'app/models/notification.rb'
36
- end
37
-
38
- private
39
-
40
- def migration_version
41
- return unless Rails.version >= '5.0.0'
42
-
43
- "[#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}]"
44
- end
45
- end
46
- end
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- NotificationHandler.configure do |config|
4
- # Cache amount of unread and read notifications for notification targets.
5
- # Learn more: https://github.com/jonhue/notifications-rails/tree/master/notification-handler#caching
6
- # config.cache = false
7
-
8
- # Groups are a powerful way to bulk-create notifications for multiple objects
9
- # that don't necessarily have a common class.
10
- # Learn more: https://github.com/jonhue/notifications-rails/tree/master/notification-handler#groups
11
- # config.define_group :subscribers, -> { User.where(subscriber: true) }
12
- end
@@ -1,4 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Notification < NotificationHandler::Notification
4
- end
@@ -1,16 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class NotificationHandlerMigration < ActiveRecord::Migration<%= migration_version %>
4
- def change
5
- create_table :notifications do |t|
6
- t.references :target, polymorphic: true, index: true
7
- t.references :object, polymorphic: true, index: true
8
-
9
- t.boolean :read, default: false, null: false, index: true
10
-
11
- t.text :metadata
12
-
13
- t.timestamps
14
- end
15
- end
16
- end
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module NotificationHandler
4
- require_relative 'notification_handler/configuration'
5
-
6
- require_relative 'notification_handler/engine'
7
-
8
- autoload :Group, 'notification_handler/group'
9
-
10
- autoload :Target, 'notification_handler/target'
11
- autoload :Object, 'notification_handler/object'
12
- autoload :NotificationLib, 'notification_handler/notification_lib'
13
- autoload :NotificationScopes, 'notification_handler/notification_scopes'
14
- end
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'group'
4
-
5
- module NotificationHandler
6
- class << self
7
- attr_writer :configuration
8
-
9
- def configuration
10
- @configuration ||= Configuration.new
11
- end
12
- end
13
-
14
- def self.configure
15
- yield configuration
16
- end
17
-
18
- class Configuration
19
- attr_accessor :groups
20
- attr_accessor :cache
21
-
22
- def initialize
23
- @groups = {}
24
- @cache = false
25
- end
26
-
27
- def define_group(name, target_scope)
28
- groups[name.to_sym] = ::NotificationHandler::Group.new(target_scope)
29
- end
30
- end
31
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rails/engine'
4
- require 'active_record'
5
-
6
- module NotificationHandler
7
- class Engine < ::Rails::Engine
8
- initializer 'notification-handler.active_record' do
9
- ActiveSupport.on_load :active_record do
10
- include NotificationHandler::Target
11
- include NotificationHandler::Object
12
- end
13
- end
14
- end
15
- end
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module NotificationHandler
4
- class Group
5
- attr_reader :target_scope
6
-
7
- def initialize(target_scope)
8
- @target_scope = target_scope
9
- end
10
-
11
- def self.find_by_name(name)
12
- NotificationHandler.configuration.groups[name]
13
- end
14
-
15
- def self.find_by_name!(name)
16
- find_by_name(name) ||
17
- raise(ArgumentError,
18
- "Could not find a registered group for #{name}. " \
19
- "Make sure you register it with config.define_group :#{name}")
20
- end
21
- end
22
- end
@@ -1,64 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'active_support'
4
-
5
- module NotificationHandler
6
- module NotificationLib
7
- extend ActiveSupport::Concern
8
-
9
- included do
10
- self.inheritance_column = :_type_disabled
11
-
12
- after_commit :cache
13
-
14
- serialize :metadata, Hash
15
-
16
- belongs_to :target, polymorphic: true
17
- belongs_to :object, polymorphic: true, optional: true
18
-
19
- include NotificationHandler::NotificationLib::InstanceMethods
20
-
21
- if defined?(NotificationRenderer)
22
- include NotificationRenderer::NotificationLib
23
- end
24
- if defined?(NotificationPusher)
25
- include NotificationPusher::NotificationLib
26
- end
27
- if defined?(NotificationSettings)
28
- include NotificationSettings::NotificationLib
29
- end
30
- end
31
-
32
- module ClassMethods
33
- def for_group(group, args: [], attrs: {})
34
- return if group.nil?
35
-
36
- target_scope = NotificationHandler::Group.find_by_name!(group)
37
- .target_scope
38
- target_scope.call(*args)&.map do |target|
39
- Notification.create(attrs.merge(target: target))
40
- end
41
- end
42
- end
43
-
44
- module InstanceMethods
45
- def read?
46
- read
47
- end
48
-
49
- def unread?
50
- !read
51
- end
52
-
53
- private
54
-
55
- def cache
56
- return unless read_changed?
57
-
58
- target.read_notification_count = target.notifications.read.size
59
- target.unread_notification_count = target.notifications.unread.size
60
- target.save!
61
- end
62
- end
63
- end
64
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'active_support'
4
-
5
- module NotificationHandler
6
- module NotificationScopes
7
- extend ActiveSupport::Concern
8
-
9
- included do
10
- scope :read, -> { where(read: true) }
11
- scope :unread, -> { where(read: false) }
12
-
13
- if defined?(NotificationRenderer)
14
- include NotificationRenderer::NotificationScopes
15
- end
16
- if defined?(NotificationSettings)
17
- include NotificationSettings::NotificationScopes
18
- end
19
- end
20
- end
21
- end
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'active_support'
4
-
5
- module NotificationHandler
6
- module Object
7
- extend ActiveSupport::Concern
8
-
9
- included do
10
- def self.notification_object
11
- has_many :belonging_notifications,
12
- as: :object, class_name: 'Notification', dependent: :destroy
13
-
14
- # rubocop:disable Style/GuardClause
15
- if defined?(NotificationSettings)
16
- include NotificationSettings::Subscribable
17
- end
18
- # rubocop:enable Style/GuardClause
19
- end
20
- end
21
- end
22
- end
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'active_support'
4
-
5
- module NotificationHandler
6
- module Target
7
- extend ActiveSupport::Concern
8
-
9
- included do
10
- def self.notification_target
11
- has_many :notifications, as: :target, dependent: :destroy
12
- include NotificationHandler::Target::InstanceMethods
13
-
14
- include NotificationSettings::Target if defined?(NotificationSettings)
15
- # rubocop:disable Style/GuardClause
16
- if defined?(NotificationSettings)
17
- include NotificationSettings::Subscriber
18
- end
19
- # rubocop:enable Style/GuardClause
20
- end
21
- end
22
-
23
- module InstanceMethods
24
- def notify(options = {})
25
- notifications.create(options)
26
- end
27
- end
28
- end
29
- end