crier 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +65 -0
- data/lib/crier/acts_as_crier.rb +35 -0
- data/lib/crier/listening.rb +11 -0
- data/lib/crier/notification.rb +29 -0
- data/lib/crier/version.rb +3 -0
- data/lib/crier.rb +20 -0
- data/lib/tasks/crier_tasks.rake +32 -0
- metadata +79 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: fb5415fa85424816676fe6ae83a4bc2eac4a52b4
|
4
|
+
data.tar.gz: 8f006ece5a90a38925788fbfb9a7db7f30fb0143
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 9f15a7d2b94be0ed17a1fad2a22747011b738c1f7edfbd250d9dc85a630982c67506b2d6732beb68922f6c4a677bc850fea07537304b09ce65cbe030b067c846
|
7
|
+
data.tar.gz: 3ee4e43692408be9e213ed14769d45c109d580c21c4bb0723214d633a32f66e9a1fb62ee0d6cbc519a85fa0b9f567a7d18f7c31ea02f090a5f248a0048d4441c
|
data/README.md
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
crier
|
2
|
+
=====
|
3
|
+
|
4
|
+
Simple notification system for the whole town
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
### in your Gemfile
|
9
|
+
|
10
|
+
```ruby
|
11
|
+
gem 'crier'
|
12
|
+
```
|
13
|
+
|
14
|
+
### at the command line
|
15
|
+
|
16
|
+
```bash
|
17
|
+
rake crier:create_tables # not working yet
|
18
|
+
```
|
19
|
+
|
20
|
+
## Usage
|
21
|
+
|
22
|
+
```ruby
|
23
|
+
class User < ActiveRecord::Base
|
24
|
+
acts_as_crier
|
25
|
+
end
|
26
|
+
```
|
27
|
+
|
28
|
+
### Notification Attributes
|
29
|
+
|
30
|
+
* crier: Who did the crying
|
31
|
+
* subject: What they were crying about
|
32
|
+
* action: What action was being carried out
|
33
|
+
* scope: A way to group notifications for easy querying
|
34
|
+
* audience: An optional list of users who can see the notification
|
35
|
+
* metadata: A hash of metadata to go along with the notification (automatically includes :crier, :subject, :action)
|
36
|
+
|
37
|
+
### Public Crying
|
38
|
+
|
39
|
+
```ruby
|
40
|
+
# cry(message, metadata, audience)
|
41
|
+
|
42
|
+
someuser.cry("Hello, my name is.") # Shout about yourself
|
43
|
+
someuser.cry("The roof is on fire!", :subject => @house) # Shout about the house
|
44
|
+
someuser.cry("Bring out yer dead", :scope => :my_town) # Shout within a custom scope for finding
|
45
|
+
someuser.cry("Reticulating Splines", :action => :reticulated) # Shout with a specific action verb for use in the view
|
46
|
+
someuser.cry("This is why I'm hot!", :reasons => @reasons) # Shout with custom metadata
|
47
|
+
```
|
48
|
+
|
49
|
+
### Private Crying
|
50
|
+
|
51
|
+
Cries are public unless they have an audience.
|
52
|
+
|
53
|
+
```ruby
|
54
|
+
someuser.cry("Lend me your ears", {}, @other_users) # Shout only to specific users
|
55
|
+
someuser.cry("Lend me your ears").to(@other_users) # Shout only to specific users, alternate syntax, non-transactional
|
56
|
+
someuser.cry("Lend me your ears").to_others(@other_users) # Shout only to specific users, alternate syntax, non-transactional, excludes crier from @other_users
|
57
|
+
```
|
58
|
+
|
59
|
+
### Listening
|
60
|
+
|
61
|
+
```ruby
|
62
|
+
Crier::Notification.heard_by(some_user) # Get all the notifications the user heard
|
63
|
+
Crier::Notification.about(@record) # Get all the notifications with the given subject
|
64
|
+
Crier::Notification.in_scope(:my_town) # Get all the notifications within the given scope
|
65
|
+
```
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Crier
|
2
|
+
module ActMethod
|
3
|
+
def acts_as_crier(options = {})
|
4
|
+
has_many :listenings, :class_name => 'Crier::Listening', :dependent => :delete_all
|
5
|
+
has_many :private_notifications, :class_name => 'Crier::Notification', :source => :notification, :through => :listenings
|
6
|
+
|
7
|
+
extend Crier::ClassMethods
|
8
|
+
include Crier::InstanceMethods
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
module ClassMethods
|
13
|
+
end
|
14
|
+
|
15
|
+
module InstanceMethods
|
16
|
+
def cry(message, metadata = {}, audience = nil)
|
17
|
+
Notification.create! do |n|
|
18
|
+
n.message = message
|
19
|
+
n.crier = metadata.delete(:crier) || self
|
20
|
+
n.subject = metadata.delete(:subject) || self
|
21
|
+
n.action = metadata.delete(:action)
|
22
|
+
n.metadata = metadata
|
23
|
+
n.audience = Array(audience)
|
24
|
+
n.scope = Crier::HelperMethods.scope_for(n.subject)
|
25
|
+
n.private = true if audience
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
module HelperMethods
|
31
|
+
def self.scope_for(record)
|
32
|
+
"#{record.class.name}##{record.id}"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Crier
|
2
|
+
# If a notification has listeners, the notification is considered private and only available to those listeners
|
3
|
+
class Listening < ActiveRecord::Base
|
4
|
+
self.table_name = 'crier_listenings'
|
5
|
+
|
6
|
+
belongs_to :notification
|
7
|
+
belongs_to :user
|
8
|
+
|
9
|
+
validates_presence_of :user_id, :notification_id
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Crier
|
2
|
+
class Notification < ActiveRecord::Base
|
3
|
+
self.table_name = 'crier_notifications'
|
4
|
+
|
5
|
+
belongs_to :crier, :class_name => 'User'
|
6
|
+
belongs_to :subject, :polymorphic => true
|
7
|
+
|
8
|
+
has_many :listenings, :dependent => :delete_all
|
9
|
+
has_many :audience, :through => :listenings, :source => :user # If any, this constitutes a private audience for this notification
|
10
|
+
|
11
|
+
store :metadata
|
12
|
+
|
13
|
+
scope :heard_by, lambda {|user| joins("LEFT OUTER JOIN #{Listening.table_name} ON #{Listening.table_name}.notification_id = #{table_name}.id").where("#{Listening.table_name}.user_id = #{user.id} OR NOT private")}
|
14
|
+
scope :about, lambda {|subject| where(:subject_id => subject.id, :subject_type => subject.class) }
|
15
|
+
scope :in_scope, lambda {|scope| where(:scope => scope) }
|
16
|
+
|
17
|
+
# Shortcut for creating a private audience for this notification
|
18
|
+
def to(audience)
|
19
|
+
self.update_column(:private, true)
|
20
|
+
self.audience = (self.audience + Array(audience)).uniq
|
21
|
+
|
22
|
+
return self
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_others(audience)
|
26
|
+
to(Array(audience) - [crier])
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/crier.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# Load the crier files
|
2
|
+
require 'crier/acts_as_crier'
|
3
|
+
require 'crier/listening'
|
4
|
+
require 'crier/notification'
|
5
|
+
|
6
|
+
# FIXME: This doesn't seem to connect to the database correctly
|
7
|
+
# Load the rake tasks
|
8
|
+
# require 'rails'
|
9
|
+
# module Crier
|
10
|
+
# class Railtie < Rails::Railtie
|
11
|
+
# railtie_name :crier
|
12
|
+
|
13
|
+
# rake_tasks do
|
14
|
+
# load "tasks/crier_tasks.rake"
|
15
|
+
# end
|
16
|
+
# end
|
17
|
+
# end
|
18
|
+
|
19
|
+
# Load the act method
|
20
|
+
ActiveRecord::Base.send :extend, Crier::ActMethod
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# desc "Explaining what the task does"
|
2
|
+
|
3
|
+
namespace :crier do
|
4
|
+
task :create_tables do
|
5
|
+
ActiveRecord::Migration.create_table Crier::Notification.table_name, :force => true do |t|
|
6
|
+
t.string :scope
|
7
|
+
t.text :message
|
8
|
+
|
9
|
+
t.integer :crier_id
|
10
|
+
|
11
|
+
t.string :subject_type
|
12
|
+
t.integer :subject_id
|
13
|
+
|
14
|
+
t.string :action
|
15
|
+
|
16
|
+
t.text :metadata
|
17
|
+
|
18
|
+
t.boolean :private, :null => false, :default => false
|
19
|
+
t.timestamps
|
20
|
+
end
|
21
|
+
|
22
|
+
ActiveRecord::Migration.add_index Crier::Notification.table_name, :scope
|
23
|
+
|
24
|
+
ActiveRecord::Migration.create_table Crier::Listening.table_name, :force => true do |t|
|
25
|
+
t.belongs_to :notification
|
26
|
+
t.belongs_to :user
|
27
|
+
end
|
28
|
+
|
29
|
+
ActiveRecord::Migration.add_index Crier::Listening.table_name, :notification_id
|
30
|
+
ActiveRecord::Migration.add_index Crier::Listening.table_name, :user_id
|
31
|
+
end
|
32
|
+
end
|
metadata
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: crier
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ryan Wallace
|
8
|
+
- Nicholas Jakobsen
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2014-01-28 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rails
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '3.1'
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - "~>"
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '3.1'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: sqlite3
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
type: :development
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
description: Simple notification for the whole town
|
43
|
+
email:
|
44
|
+
- contact@culturecode.ca
|
45
|
+
executables: []
|
46
|
+
extensions: []
|
47
|
+
extra_rdoc_files: []
|
48
|
+
files:
|
49
|
+
- README.md
|
50
|
+
- lib/crier.rb
|
51
|
+
- lib/crier/acts_as_crier.rb
|
52
|
+
- lib/crier/listening.rb
|
53
|
+
- lib/crier/notification.rb
|
54
|
+
- lib/crier/version.rb
|
55
|
+
- lib/tasks/crier_tasks.rake
|
56
|
+
homepage:
|
57
|
+
licenses: []
|
58
|
+
metadata: {}
|
59
|
+
post_install_message:
|
60
|
+
rdoc_options: []
|
61
|
+
require_paths:
|
62
|
+
- lib
|
63
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '0'
|
73
|
+
requirements: []
|
74
|
+
rubyforge_project:
|
75
|
+
rubygems_version: 2.2.1
|
76
|
+
signing_key:
|
77
|
+
specification_version: 4
|
78
|
+
summary: Simple notification for the whole town
|
79
|
+
test_files: []
|