activist 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/.rvmrc +2 -0
- data/Gemfile.lock +1 -1
- data/README.markdown +29 -4
- data/activist.gemspec +23 -23
- data/lib/activist.rb +2 -2
- data/lib/activist/action.rb +1 -1
- data/lib/activist/actor.rb +1 -3
- data/lib/activist/store.rb +43 -5
- data/lib/activist/stream.rb +5 -3
- data/lib/activist/version.rb +1 -1
- data/lib/generators/activist/install/install_generator.rb +7 -7
- data/lib/generators/activist/install/templates/activist_status.rb +3 -0
- data/lib/generators/activist/install/templates/{create_statuses.rb → create_activist_statuses.rb} +4 -4
- data/spec/activist_spec.rb +29 -8
- data/spec/setup.rb +20 -9
- metadata +10 -7
- data/lib/generators/activist/install/templates/status.rb +0 -3
data/.rvmrc
ADDED
data/Gemfile.lock
CHANGED
data/README.markdown
CHANGED
@@ -4,6 +4,10 @@ Activity stream in rails 3.0 applications
|
|
4
4
|
|
5
5
|
Based on http://activitystrea.ms/spec/1.0/atom-activity-01.html
|
6
6
|
|
7
|
+
## Requirements ##
|
8
|
+
|
9
|
+
* Redis
|
10
|
+
|
7
11
|
## Installation ##
|
8
12
|
|
9
13
|
Just run the following command :
|
@@ -20,17 +24,17 @@ And run
|
|
20
24
|
|
21
25
|
## Usage ##
|
22
26
|
|
23
|
-
First generate a
|
27
|
+
First generate a status model :
|
24
28
|
|
25
29
|
rails generate activist:install
|
26
30
|
|
27
|
-
This command creates a new model called
|
31
|
+
This command creates a new model called __ActivistStatus__ in *'app/models'* :
|
28
32
|
|
29
|
-
class
|
33
|
+
class ActivistStatus < ActiveRecord::Base
|
30
34
|
serialize :data, Hash
|
31
35
|
end
|
32
36
|
|
33
|
-
It also creates a new migration for the
|
37
|
+
It also creates a new migration for the __ActivistStatus__ model so don't forget to migrate your database :
|
34
38
|
|
35
39
|
rake db:migrate
|
36
40
|
|
@@ -47,3 +51,24 @@ Then add __activist__ in your user model :
|
|
47
51
|
[user]
|
48
52
|
end
|
49
53
|
end
|
54
|
+
|
55
|
+
And finally create some activities :
|
56
|
+
|
57
|
+
class Post < ActiveRecord::Base
|
58
|
+
include Activist::Action
|
59
|
+
|
60
|
+
belongs_to :user
|
61
|
+
|
62
|
+
activities :public, :on => :after_create
|
63
|
+
activities :private, :actor => :user, :action => :posted, :on => :after_create
|
64
|
+
activities :public, :on => :after_update, :data => proc { |post| post.changes }
|
65
|
+
|
66
|
+
after_destroy
|
67
|
+
activity :private, :action => :deleted
|
68
|
+
end
|
69
|
+
|
70
|
+
def promote
|
71
|
+
self.title = "[PROMOTED] #{self.title}"
|
72
|
+
activity :private, :action => :promoted, :data => proc { |post| { :title => post.title } }
|
73
|
+
end
|
74
|
+
end
|
data/activist.gemspec
CHANGED
@@ -1,33 +1,33 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
$:.push File.expand_path(
|
3
|
-
require
|
2
|
+
$:.push File.expand_path('../lib', __FILE__)
|
3
|
+
require 'activist/version'
|
4
4
|
|
5
5
|
Gem::Specification.new do |s|
|
6
|
-
s.name =
|
6
|
+
s.name = 'activist'
|
7
7
|
s.version = Activist::VERSION
|
8
8
|
s.platform = Gem::Platform::RUBY
|
9
|
-
s.authors = [
|
10
|
-
s.email = [
|
11
|
-
s.homepage =
|
12
|
-
s.summary = %q{
|
13
|
-
s.description = %q{
|
14
|
-
|
15
|
-
s.extra_rdoc_files = [
|
16
|
-
|
17
|
-
s.required_rubygems_version =
|
9
|
+
s.authors = ['Adrian Dulić']
|
10
|
+
s.email = ['adulic@gmail.com']
|
11
|
+
s.homepage = 'http://github.com/adriandulic/activist'
|
12
|
+
s.summary = %q{Redis and database based activity stream in Rails 3 applications}
|
13
|
+
s.description = %q{Redis and database based activity stream in Rails 3 applications}
|
14
|
+
|
15
|
+
s.extra_rdoc_files = ['README.markdown']
|
16
|
+
|
17
|
+
s.required_rubygems_version = '>= 1.3.6'
|
18
18
|
s.rubyforge_project = s.name
|
19
|
-
|
20
|
-
s.add_dependency
|
21
|
-
s.add_dependency
|
22
|
-
s.add_dependency
|
23
|
-
|
24
|
-
s.add_development_dependency
|
25
|
-
s.add_development_dependency
|
26
|
-
s.add_development_dependency
|
27
|
-
s.add_development_dependency
|
28
|
-
|
19
|
+
|
20
|
+
s.add_dependency 'redis', '~> 2.2'
|
21
|
+
s.add_dependency 'redis-namespace', '0.10.0'
|
22
|
+
s.add_dependency 'activesupport', '~> 3.0'
|
23
|
+
|
24
|
+
s.add_development_dependency 'bundler', '~> 1.0'
|
25
|
+
s.add_development_dependency 'rspec', '~> 2.0'
|
26
|
+
s.add_development_dependency 'activerecord', '~> 3.0'
|
27
|
+
s.add_development_dependency 'sqlite3-ruby', '~> 1.3.2'
|
28
|
+
|
29
29
|
s.files = `git ls-files`.split("\n")
|
30
30
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
31
31
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
32
|
-
s.require_paths = [
|
32
|
+
s.require_paths = ['lib']
|
33
33
|
end
|
data/lib/activist.rb
CHANGED
@@ -3,9 +3,9 @@ require 'redis/namespace'
|
|
3
3
|
require 'redis'
|
4
4
|
|
5
5
|
module Activist
|
6
|
+
autoload :Action, 'activist/action'
|
7
|
+
autoload :Actor, 'activist/actor'
|
6
8
|
autoload :Redis, 'activist/redis'
|
7
9
|
autoload :Store, 'activist/store'
|
8
|
-
autoload :Actor, 'activist/actor'
|
9
|
-
autoload :Action, 'activist/action'
|
10
10
|
autoload :Stream, 'activist/stream'
|
11
11
|
end
|
data/lib/activist/action.rb
CHANGED
data/lib/activist/actor.rb
CHANGED
data/lib/activist/store.rb
CHANGED
@@ -3,9 +3,38 @@ module Activist
|
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
|
5
5
|
module InstanceMethods
|
6
|
+
# Options:
|
7
|
+
# :actor (optional)
|
8
|
+
# :action (optional)
|
9
|
+
# :on (required)
|
10
|
+
# :data (optional)
|
11
|
+
# :if (optional)
|
12
|
+
# :unless (optional)
|
6
13
|
def store_activities(stream, options = {})
|
7
14
|
options.symbolize_keys!
|
8
|
-
|
15
|
+
|
16
|
+
callback = options.delete(:on)
|
17
|
+
|
18
|
+
if_condition = case options[:if]
|
19
|
+
when Symbol
|
20
|
+
send(options[:if])
|
21
|
+
when Proc
|
22
|
+
options[:if].call(self)
|
23
|
+
else
|
24
|
+
true
|
25
|
+
end
|
26
|
+
return unless if_condition
|
27
|
+
|
28
|
+
unless_condition = case options[:unless]
|
29
|
+
when Symbol
|
30
|
+
send(options[:unless])
|
31
|
+
when Proc
|
32
|
+
options[:unless].call(self)
|
33
|
+
else
|
34
|
+
false
|
35
|
+
end
|
36
|
+
return if unless_condition
|
37
|
+
|
9
38
|
actor = case options[:actor]
|
10
39
|
when nil
|
11
40
|
send(:user)
|
@@ -14,8 +43,9 @@ module Activist
|
|
14
43
|
when Proc
|
15
44
|
options[:actor].call(self)
|
16
45
|
else
|
17
|
-
|
46
|
+
nil
|
18
47
|
end
|
48
|
+
|
19
49
|
action = if options[:action].nil?
|
20
50
|
case callback
|
21
51
|
when :before_create, :after_create
|
@@ -27,14 +57,22 @@ module Activist
|
|
27
57
|
when :before_destroy, :after_destroy
|
28
58
|
options[:action] = :destroyed
|
29
59
|
else
|
30
|
-
|
60
|
+
nil
|
31
61
|
end
|
32
62
|
else
|
33
63
|
options[:action]
|
34
64
|
end
|
35
|
-
data = options[:data]
|
36
65
|
|
37
|
-
|
66
|
+
data = case options[:data]
|
67
|
+
when Hash
|
68
|
+
options[:data]
|
69
|
+
when Proc
|
70
|
+
options[:data].call(self)
|
71
|
+
else
|
72
|
+
nil
|
73
|
+
end
|
74
|
+
|
75
|
+
status = ::ActivistStatus.create! do |s|
|
38
76
|
s.actor_class = actor.class.to_s
|
39
77
|
s.actor_id = actor.id
|
40
78
|
s.action = action
|
data/lib/activist/stream.rb
CHANGED
@@ -15,8 +15,10 @@ module Activist
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def all(options={})
|
18
|
-
|
19
|
-
|
18
|
+
options[:offset] ||= 0
|
19
|
+
options[:limit] ||= size.to_i
|
20
|
+
activities = Redis.execute.lrange(to_key, options[:offset], options[:offset] + options[:limit])
|
21
|
+
::ActivistStatus.where(:id => activities)
|
20
22
|
end
|
21
23
|
|
22
24
|
def size
|
@@ -28,7 +30,7 @@ module Activist
|
|
28
30
|
end
|
29
31
|
|
30
32
|
def to_key
|
31
|
-
"#{
|
33
|
+
"#{actor.class}.#{actor.id}:#{name}"
|
32
34
|
end
|
33
35
|
end
|
34
36
|
end
|
data/lib/activist/version.rb
CHANGED
@@ -5,19 +5,19 @@ module Activist
|
|
5
5
|
module Generators
|
6
6
|
class InstallGenerator < Rails::Generators::Base
|
7
7
|
include Rails::Generators::Migration
|
8
|
-
|
8
|
+
|
9
9
|
def self.source_root
|
10
10
|
@source_root ||= File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
def self.next_migration_number
|
14
|
-
Time.now.utc.strftime(
|
14
|
+
Time.now.utc.strftime('%Y%m%d%H%M%S')
|
15
15
|
end
|
16
|
-
|
17
|
-
desc
|
16
|
+
|
17
|
+
desc 'This generator creates a status model and its migration file'
|
18
18
|
def create_friendship_model_files
|
19
|
-
template '
|
20
|
-
template '
|
19
|
+
template 'activist_status.rb', 'app/models/activist_status.rb'
|
20
|
+
template 'create_activist_statuses.rb', "db/migrate/#{self.class.next_migration_number}_create_activist_statuses.rb"
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
data/lib/generators/activist/install/templates/{create_statuses.rb → create_activist_statuses.rb}
RENAMED
@@ -1,6 +1,6 @@
|
|
1
|
-
class
|
1
|
+
class CreateActivistStatuses < ActiveRecord::Migration
|
2
2
|
def self.up
|
3
|
-
create_table :
|
3
|
+
create_table :activist_statuses do |t|
|
4
4
|
t.string :actor_class
|
5
5
|
t.integer :actor_id
|
6
6
|
t.string :action
|
@@ -11,8 +11,8 @@ class CreateStatuses < ActiveRecord::Migration
|
|
11
11
|
t.timestamps
|
12
12
|
end
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
def self.down
|
16
|
-
drop_table :
|
16
|
+
drop_table :activist_statuses
|
17
17
|
end
|
18
18
|
end
|
data/spec/activist_spec.rb
CHANGED
@@ -1,23 +1,44 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Activist do
|
4
|
-
before do
|
5
|
-
@region = Region.create!(:name =>
|
6
|
-
@kate = User.create!(:name =>
|
7
|
-
@john = User.create!(:name =>
|
4
|
+
before :all do
|
5
|
+
@region = Region.create!(:name => 'Mazovia')
|
6
|
+
@kate = User.create!(:name => 'Kate', :regions => Region.all)
|
7
|
+
@john = User.create!(:name => 'John', :regions => Region.all)
|
8
|
+
@note = Note.create!(:note => 'Note by Kate', :user => @kate)
|
8
9
|
end
|
9
10
|
|
10
|
-
context
|
11
|
-
it
|
11
|
+
context 'actor' do
|
12
|
+
it 'should create streams for actor' do
|
12
13
|
@kate.public_stream.should be_kind_of Activist::Stream
|
13
14
|
@kate.regional_stream.should be_kind_of Activist::Stream
|
14
15
|
@kate.private_stream.should be_kind_of Activist::Stream
|
15
16
|
end
|
16
17
|
end
|
17
18
|
|
18
|
-
context
|
19
|
+
context 'action' do
|
20
|
+
it 'should define activist methods' do
|
21
|
+
@note.public_methods.should include(:activist_regional_after_create)
|
22
|
+
@note.public_methods.should include(:activist_private_after_create)
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should define activist class methods' do
|
26
|
+
@note.class.public_methods.should include(:activities)
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should define activist instance methods' do
|
30
|
+
@note.public_methods.should include(:activity)
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should not pass' do
|
34
|
+
size = @kate.regional_stream.size
|
35
|
+
@empty = Note.create!(:note => '', :user => @kate)
|
36
|
+
@kate.regional_stream.size.should == size
|
37
|
+
@present = Note.create!(:note => 'Some note', :user => @kate)
|
38
|
+
@kate.regional_stream.size.should == size + 1
|
39
|
+
end
|
19
40
|
end
|
20
41
|
|
21
|
-
context
|
42
|
+
context 'stream' do
|
22
43
|
end
|
23
44
|
end
|
data/spec/setup.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
require 'active_record'
|
2
2
|
|
3
3
|
ActiveRecord::Base.establish_connection(
|
4
|
-
:adapter =>
|
5
|
-
:database =>
|
4
|
+
:adapter => 'sqlite3',
|
5
|
+
:database => ':memory:'
|
6
6
|
)
|
7
7
|
ActiveRecord::Migration.verbose = false
|
8
8
|
|
9
9
|
ActiveRecord::Schema.define do
|
10
|
-
create_table :
|
10
|
+
create_table :activist_statuses, :force => true do |t|
|
11
11
|
t.string :actor_class
|
12
12
|
t.integer :actor_id
|
13
13
|
t.string :action
|
@@ -22,9 +22,11 @@ ActiveRecord::Schema.define do
|
|
22
22
|
t.string :name
|
23
23
|
end
|
24
24
|
|
25
|
-
create_table :
|
25
|
+
create_table :user_regions, :force => true do |t|
|
26
26
|
t.integer :user_id
|
27
27
|
t.integer :region_id
|
28
|
+
t.datetime :created_at
|
29
|
+
t.datetime :updated_at
|
28
30
|
end
|
29
31
|
|
30
32
|
create_table :users, :force => true do |t|
|
@@ -40,18 +42,26 @@ end
|
|
40
42
|
REDIS = Redis.new(:host => '127.0.0.1', :port => 6379)
|
41
43
|
Activist::Redis.execute.flushall
|
42
44
|
|
43
|
-
class
|
45
|
+
class ActivistStatus < ActiveRecord::Base
|
44
46
|
serialize :data, Hash
|
45
47
|
end
|
46
48
|
|
47
49
|
class Region < ActiveRecord::Base
|
48
|
-
|
50
|
+
has_many :user_regions
|
51
|
+
has_many :users, :through => :user_regions
|
52
|
+
end
|
53
|
+
|
54
|
+
class UserRegion < ActiveRecord::Base
|
55
|
+
belongs_to :user
|
56
|
+
belongs_to :region
|
49
57
|
end
|
50
58
|
|
51
59
|
class User < ActiveRecord::Base
|
52
60
|
include Activist::Actor
|
61
|
+
|
53
62
|
has_many :notes
|
54
|
-
|
63
|
+
has_many :user_regions
|
64
|
+
has_many :regions, :through => :user_regions
|
55
65
|
|
56
66
|
stream :public do
|
57
67
|
all
|
@@ -68,10 +78,11 @@ end
|
|
68
78
|
|
69
79
|
class Note < ActiveRecord::Base
|
70
80
|
include Activist::Action
|
81
|
+
|
71
82
|
belongs_to :user
|
72
83
|
|
73
|
-
activities :
|
74
|
-
activities :
|
84
|
+
activities :private, :on => :after_create
|
85
|
+
activities :regional, :on => :after_create, :if => proc { |note| note.note.present? }
|
75
86
|
|
76
87
|
after_destroy do |note|
|
77
88
|
activity :private, :action => :deleted
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: activist
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.4
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- "Adrian Duli\xC4\x87"
|
@@ -10,7 +10,8 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-
|
13
|
+
date: 2011-06-27 00:00:00 +02:00
|
14
|
+
default_executable:
|
14
15
|
dependencies:
|
15
16
|
- !ruby/object:Gem::Dependency
|
16
17
|
name: redis
|
@@ -89,7 +90,7 @@ dependencies:
|
|
89
90
|
version: 1.3.2
|
90
91
|
type: :development
|
91
92
|
version_requirements: *id007
|
92
|
-
description:
|
93
|
+
description: Redis and database based activity stream in Rails 3 applications
|
93
94
|
email:
|
94
95
|
- adulic@gmail.com
|
95
96
|
executables: []
|
@@ -100,6 +101,7 @@ extra_rdoc_files:
|
|
100
101
|
- README.markdown
|
101
102
|
files:
|
102
103
|
- .gitignore
|
104
|
+
- .rvmrc
|
103
105
|
- Gemfile
|
104
106
|
- Gemfile.lock
|
105
107
|
- LICENCE
|
@@ -114,11 +116,12 @@ files:
|
|
114
116
|
- lib/activist/stream.rb
|
115
117
|
- lib/activist/version.rb
|
116
118
|
- lib/generators/activist/install/install_generator.rb
|
117
|
-
- lib/generators/activist/install/templates/
|
118
|
-
- lib/generators/activist/install/templates/
|
119
|
+
- lib/generators/activist/install/templates/activist_status.rb
|
120
|
+
- lib/generators/activist/install/templates/create_activist_statuses.rb
|
119
121
|
- spec/activist_spec.rb
|
120
122
|
- spec/setup.rb
|
121
123
|
- spec/spec_helper.rb
|
124
|
+
has_rdoc: true
|
122
125
|
homepage: http://github.com/adriandulic/activist
|
123
126
|
licenses: []
|
124
127
|
|
@@ -142,10 +145,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
142
145
|
requirements: []
|
143
146
|
|
144
147
|
rubyforge_project: activist
|
145
|
-
rubygems_version: 1.
|
148
|
+
rubygems_version: 1.6.2
|
146
149
|
signing_key:
|
147
150
|
specification_version: 3
|
148
|
-
summary:
|
151
|
+
summary: Redis and database based activity stream in Rails 3 applications
|
149
152
|
test_files:
|
150
153
|
- spec/activist_spec.rb
|
151
154
|
- spec/setup.rb
|