acts_as_stream 0.0.2.alpha.4 → 0.0.3.alpha.1
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.
data/README.md
CHANGED
@@ -10,6 +10,9 @@ A highly configurable activity stream system built on top of Redis
|
|
10
10
|
* You're welcome to use it, and I'd love feedback
|
11
11
|
* Caveat Downloader
|
12
12
|
|
13
|
+
### Extra special notes
|
14
|
+
The move to 0.0.3.alpha.1 involves a change to the key structure. See below.
|
15
|
+
|
13
16
|
## Installation
|
14
17
|
|
15
18
|
Install
|
@@ -68,6 +71,51 @@ follower.get_activity.first
|
|
68
71
|
|
69
72
|
## Advanced Usage
|
70
73
|
|
74
|
+
## Key structure
|
75
|
+
|
76
|
+
### Activity Keys
|
77
|
+
Keys for Redis activity packages are created using the format
|
78
|
+
|
79
|
+
```
|
80
|
+
<namespace>:<activity_scope>:<id>
|
81
|
+
```
|
82
|
+
|
83
|
+
where ```namespace``` and ```activity_scope``` are set in the ActsAsStream configuration and default to
|
84
|
+
a base key of ```acts_as_stream:activity``` and id is the value of ```activity_incr``` which defaults to
|
85
|
+
```acts_as_stream:activity:activity_counter```
|
86
|
+
|
87
|
+
The Activity ID is also added to a sorted set with the key
|
88
|
+
|
89
|
+
```
|
90
|
+
<namespace>:<activity_scope>:sorted <time> <id>
|
91
|
+
```
|
92
|
+
|
93
|
+
where <time> is floating point seconds since the epoch and <id> is as above. This allows for time-based
|
94
|
+
sorting of activities.
|
95
|
+
|
96
|
+
### Followers
|
97
|
+
|
98
|
+
Followers are notified by an arbitrary string key that can literally be whatever you want, but which defaults
|
99
|
+
to
|
100
|
+
|
101
|
+
```
|
102
|
+
<namespace>:<activity_scope>:<streamable_object_id> <time> <activity_id>
|
103
|
+
```
|
104
|
+
|
105
|
+
where ```streamable_object_id``` is the value of ```activity_attr```, both of which are set in the configuration options.
|
106
|
+
```activity_attr``` defaults to ```id``` and can be set on a per model basis. ```activity_id``` is the id of the activity
|
107
|
+
given above.
|
108
|
+
|
109
|
+
Activities are also stored as a list keyed by id
|
110
|
+
|
111
|
+
```
|
112
|
+
<namespace>:<activity_scope>:followers:<activity_id> <follower_key>
|
113
|
+
```
|
114
|
+
|
115
|
+
where ```follower_key``` is the key used above, and activity_id is the id of the activity.
|
116
|
+
|
117
|
+
The following system allows for time sorted organization of activities, and ability to see all "viewers" of an activity.
|
118
|
+
|
71
119
|
## Configuration
|
72
120
|
|
73
121
|
## Future Plans
|
@@ -4,26 +4,20 @@ module ActsAsStream
|
|
4
4
|
def register_new_activity! package = nil
|
5
5
|
return if package.nil?
|
6
6
|
id = increment!
|
7
|
-
this_time = time
|
8
7
|
ActsAsStream.redis.multi do
|
9
8
|
#Add the key and package to the system
|
10
9
|
ActsAsStream.redis.set "#{base_key}:#{id}", package
|
11
|
-
#Add a
|
12
|
-
ActsAsStream.redis.zadd "#{base_key}:
|
13
|
-
ActsAsStream.redis.set "#{base_key}:id:#{id}", this_time
|
10
|
+
#Add the id to a sorted set scored by time
|
11
|
+
ActsAsStream.redis.zadd "#{base_key}:sorted", Time.now.to_f, id
|
14
12
|
end
|
15
|
-
raise "### Unable to set Time keys!" if ActsAsStream.redis.get("#{base_key}:id:#{id}") != this_time.to_s
|
16
|
-
#return the current activity ID
|
17
13
|
id
|
18
14
|
end
|
19
15
|
|
20
16
|
def deregister_activity! ident
|
21
17
|
return if ident.nil?
|
22
|
-
score = ActsAsStream.redis.get "#{base_key}:id:#{ident}"
|
23
18
|
ActsAsStream.redis.multi do
|
24
19
|
ActsAsStream.redis.del "#{base_key}:#{ident}"
|
25
|
-
ActsAsStream.redis.zrem "#{base_key}:
|
26
|
-
ActsAsStream.redis.del "#{base_key}:id:#{ident}"
|
20
|
+
ActsAsStream.redis.zrem "#{base_key}:sorted", ident
|
27
21
|
end
|
28
22
|
deregister_followers! ident
|
29
23
|
end
|
@@ -32,11 +26,9 @@ module ActsAsStream
|
|
32
26
|
options.assert_valid_keys(:following_keys, :activity_id)
|
33
27
|
return if options[:following_keys].nil? or options[:activity_id].nil?
|
34
28
|
raise ":following_keys must be an array of keys" if not options[:following_keys].is_a? Array
|
35
|
-
time = Time.now.to_i
|
36
|
-
|
37
29
|
ActsAsStream.redis.multi do
|
38
30
|
options[:following_keys].each do |key|
|
39
|
-
ActsAsStream.redis.zadd key,
|
31
|
+
ActsAsStream.redis.zadd key, Time.now.to_f, options[:activity_id]
|
40
32
|
ActsAsStream.redis.lpush "#{base_key}:followers:#{options[:activity_id]}", key
|
41
33
|
end
|
42
34
|
end
|
@@ -71,6 +63,10 @@ module ActsAsStream
|
|
71
63
|
ActsAsStream.redis.zrevrange(follower_key, starting_offset, ending_offset, :with_scores => false).map{|i| get_activity i}
|
72
64
|
end
|
73
65
|
|
66
|
+
def get_activity_since follower_key, since = 2.days.ago
|
67
|
+
|
68
|
+
end
|
69
|
+
|
74
70
|
def get_activity id
|
75
71
|
ActsAsStream.redis.get "#{base_key}:#{id}"
|
76
72
|
end
|
@@ -17,7 +17,11 @@ module ActsAsStream
|
|
17
17
|
[:who, :object].each do |opt|
|
18
18
|
#unless we are ignoring the stream hash for this object, use StreamableObject.stream_hash
|
19
19
|
unless opts[:ignore_stream_hash_on].include?(opt) or not opts[opt].respond_to?(:to_stream_hash)
|
20
|
-
|
20
|
+
begin
|
21
|
+
opts[opt] = opts[opt].to_stream_hash
|
22
|
+
rescue NoMethodError
|
23
|
+
raise "The class #{opts[opt].class.name} does not have a method called #{opts[opt].activity_attr}. Perhaps you should look at your ActsAsStream configuration, or set :activity_attr"
|
24
|
+
end
|
21
25
|
end
|
22
26
|
end
|
23
27
|
|
@@ -22,14 +22,14 @@ module ActsAsStream
|
|
22
22
|
def to_stream_hash
|
23
23
|
{self.class.name.tableize.singularize => {'id' => self.id, activity_attr.to_s => self.send(activity_attr)}}
|
24
24
|
end
|
25
|
-
def
|
25
|
+
def streamable_object_id
|
26
26
|
self.send(self.class.activity_attr)
|
27
27
|
end
|
28
28
|
def activity_key
|
29
|
-
"#{self.class.activity_key_base}:#{
|
29
|
+
"#{self.class.activity_key_base}:#{streamable_object_id}"
|
30
30
|
end
|
31
31
|
def following_key
|
32
|
-
"#{ActsAsStream.namespace}:#{self.class.name.tableize.singularize}:#{
|
32
|
+
"#{ActsAsStream.namespace}:#{self.class.name.tableize.singularize}:#{streamable_object_id}:#{activity_scope}"
|
33
33
|
end
|
34
34
|
|
35
35
|
def register_activity! package
|
@@ -61,6 +61,9 @@ module ActsAsStream
|
|
61
61
|
ActsAsStream.get_activity_for following_key,
|
62
62
|
:page_size => activity_count,
|
63
63
|
:page => 1
|
64
|
+
elsif options[:since]
|
65
|
+
time = options[:since]
|
66
|
+
|
64
67
|
else
|
65
68
|
options = {:page_size => ActsAsStream.page_size, :page => 1}.merge options
|
66
69
|
ActsAsStream.get_activity_for following_key, :page_size => options[:page_size], :page => options[:page]
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: acts_as_stream
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3.alpha.1
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-03-
|
12
|
+
date: 2012-03-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
16
|
-
requirement: &
|
16
|
+
requirement: &70294530388220 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '3.1'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70294530388220
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: redis
|
27
|
-
requirement: &
|
27
|
+
requirement: &70294530387540 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70294530387540
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: sqlite3
|
38
|
-
requirement: &
|
38
|
+
requirement: &70294530386780 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70294530386780
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: acts_as_amico
|
49
|
-
requirement: &
|
49
|
+
requirement: &70294530385860 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70294530385860
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: rspec-rails
|
60
|
-
requirement: &
|
60
|
+
requirement: &70294530385100 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70294530385100
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: spork
|
71
|
-
requirement: &
|
71
|
+
requirement: &70294530400080 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ~>
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: 0.9.0.rc
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70294530400080
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: guard-rspec
|
82
|
-
requirement: &
|
82
|
+
requirement: &70294530399320 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *70294530399320
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: guard-spork
|
93
|
-
requirement: &
|
93
|
+
requirement: &70294530398540 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ! '>='
|
@@ -98,10 +98,10 @@ dependencies:
|
|
98
98
|
version: '0'
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *70294530398540
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: factory_girl_rails
|
104
|
-
requirement: &
|
104
|
+
requirement: &70294530397940 !ruby/object:Gem::Requirement
|
105
105
|
none: false
|
106
106
|
requirements:
|
107
107
|
- - ! '>='
|
@@ -109,10 +109,10 @@ dependencies:
|
|
109
109
|
version: '0'
|
110
110
|
type: :development
|
111
111
|
prerelease: false
|
112
|
-
version_requirements: *
|
112
|
+
version_requirements: *70294530397940
|
113
113
|
- !ruby/object:Gem::Dependency
|
114
114
|
name: simplecov
|
115
|
-
requirement: &
|
115
|
+
requirement: &70294530396580 !ruby/object:Gem::Requirement
|
116
116
|
none: false
|
117
117
|
requirements:
|
118
118
|
- - ! '>='
|
@@ -120,10 +120,10 @@ dependencies:
|
|
120
120
|
version: '0'
|
121
121
|
type: :development
|
122
122
|
prerelease: false
|
123
|
-
version_requirements: *
|
123
|
+
version_requirements: *70294530396580
|
124
124
|
- !ruby/object:Gem::Dependency
|
125
125
|
name: fakeweb
|
126
|
-
requirement: &
|
126
|
+
requirement: &70294530395540 !ruby/object:Gem::Requirement
|
127
127
|
none: false
|
128
128
|
requirements:
|
129
129
|
- - ! '>='
|
@@ -131,10 +131,10 @@ dependencies:
|
|
131
131
|
version: '0'
|
132
132
|
type: :development
|
133
133
|
prerelease: false
|
134
|
-
version_requirements: *
|
134
|
+
version_requirements: *70294530395540
|
135
135
|
- !ruby/object:Gem::Dependency
|
136
136
|
name: uuidtools
|
137
|
-
requirement: &
|
137
|
+
requirement: &70294530394620 !ruby/object:Gem::Requirement
|
138
138
|
none: false
|
139
139
|
requirements:
|
140
140
|
- - ! '>='
|
@@ -142,7 +142,7 @@ dependencies:
|
|
142
142
|
version: '0'
|
143
143
|
type: :development
|
144
144
|
prerelease: false
|
145
|
-
version_requirements: *
|
145
|
+
version_requirements: *70294530394620
|
146
146
|
description: Rails injectable Redis-backed activity stream system. This is an alpha
|
147
147
|
release of code that I just wrote and put into production on 3/11/12. Send feedback
|
148
148
|
and post bugs to the Github page, but use at your own risk!
|