acts_as_stream 0.0.3.alpha.2 → 0.0.3.alpha.6
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.
@@ -1,26 +1,35 @@
|
|
1
1
|
module ActsAsStream
|
2
2
|
module Connector
|
3
3
|
|
4
|
-
def register_new_activity! package = nil
|
4
|
+
def register_new_activity! package = nil, key = nil
|
5
5
|
return if package.nil?
|
6
6
|
id = increment!
|
7
7
|
ActsAsStream.redis.multi do
|
8
|
+
time = Time.now.to_f
|
8
9
|
#Add the key and package to the system
|
9
10
|
ActsAsStream.redis.set "#{base_key}:#{id}", package
|
10
11
|
#Add the id to a sorted set scored by time
|
11
|
-
ActsAsStream.redis.zadd "#{base_key}:sorted",
|
12
|
+
ActsAsStream.redis.zadd "#{base_key}:sorted", time, id
|
13
|
+
if key.present?
|
14
|
+
ActsAsStream.redis.zadd key, time, id
|
15
|
+
end
|
12
16
|
end
|
13
17
|
id
|
14
18
|
end
|
15
19
|
|
16
|
-
def deregister_activity! ident
|
20
|
+
def deregister_activity! ident, key = nil, mentions_key = nil
|
17
21
|
return if ident.nil?
|
18
22
|
ActsAsStream.redis.multi do
|
19
23
|
ActsAsStream.redis.del "#{base_key}:#{ident}"
|
20
24
|
ActsAsStream.redis.zrem "#{base_key}:sorted", ident
|
25
|
+
if key.present?
|
26
|
+
ActsAsStream.redis.zrem key, ident
|
27
|
+
end
|
21
28
|
end
|
22
29
|
deregister_followers! ident
|
23
|
-
|
30
|
+
if mentions_key.present?
|
31
|
+
deregister_mentioned! ident, mentions_key
|
32
|
+
end
|
24
33
|
end
|
25
34
|
|
26
35
|
def register_followers! options = {}
|
@@ -50,18 +59,23 @@ module ActsAsStream
|
|
50
59
|
end
|
51
60
|
|
52
61
|
def register_mentions! options = {}
|
53
|
-
options.assert_valid_keys(:mentioned_keys, :activity_id)
|
62
|
+
options.assert_valid_keys(:mentioned_keys, :activity_id, :key)
|
54
63
|
return if options[:mentioned_keys].nil? or options[:activity_id].nil?
|
55
64
|
raise ":mentioned_keys must be an array of keys" if not options[:mentioned_keys].is_a? Array
|
65
|
+
time = Time.now.to_f
|
56
66
|
ActsAsStream.redis.multi do
|
57
67
|
options[:mentioned_keys].each do |key|
|
58
|
-
ActsAsStream.redis.zadd key,
|
68
|
+
ActsAsStream.redis.zadd key, time, options[:activity_id]
|
59
69
|
ActsAsStream.redis.lpush "#{base_key}:mentions:#{options[:activity_id]}", key
|
60
70
|
end
|
71
|
+
if options[:key].present?
|
72
|
+
ActsAsStream.redis.zadd options[:key], time, options[:activity_id]
|
73
|
+
end
|
61
74
|
end
|
75
|
+
time
|
62
76
|
end
|
63
77
|
|
64
|
-
def deregister_mentioned! activity_id = nil
|
78
|
+
def deregister_mentioned! activity_id = nil, key = nil
|
65
79
|
return if activity_id.nil?
|
66
80
|
mentioned_key = "#{base_key}:mentions:#{activity_id}"
|
67
81
|
return if mentioned_key.nil?
|
@@ -73,26 +87,27 @@ module ActsAsStream
|
|
73
87
|
ActsAsStream.redis.zrem f, activity_id
|
74
88
|
end
|
75
89
|
ActsAsStream.redis.del "#{base_key}:mentions:#{activity_id}"
|
90
|
+
ActsAsStream.redis.zrem key, activity_id
|
76
91
|
end
|
77
92
|
end
|
78
93
|
|
79
|
-
def get_activity_for
|
94
|
+
def get_activity_for key, options = {}
|
95
|
+
offsets = get_offsets({:key => key}.merge options)
|
96
|
+
ActsAsStream.redis.zrevrange(key, offsets[:start], offsets[:end], :with_scores => false).map{|i| get_activity i}
|
97
|
+
end
|
98
|
+
|
99
|
+
def get_offsets(options = {})
|
80
100
|
options = {:page => 1, :page_size => ActsAsStream.page_size}.merge options
|
81
101
|
options[:page] = 1 if options[:page] < 1
|
82
102
|
|
83
|
-
if options[:page] > total_pages(
|
84
|
-
options[:page] = total_pages(
|
103
|
+
if options[:page] > total_pages(options[:key], options[:page_size])
|
104
|
+
options[:page] = total_pages(options[:key], options[:page_size])
|
85
105
|
end
|
86
106
|
|
87
107
|
starting_offset = ((options[:page] - 1) * options[:page_size])
|
88
108
|
starting_offset = 0 if starting_offset < 0
|
89
109
|
ending_offset = (starting_offset + options[:page_size]) - 1
|
90
|
-
|
91
|
-
ActsAsStream.redis.zrevrange(follower_key, starting_offset, ending_offset, :with_scores => false).map{|i| get_activity i}
|
92
|
-
end
|
93
|
-
|
94
|
-
def get_activity_since follower_key, since = 2.days.ago
|
95
|
-
|
110
|
+
{:start => starting_offset, :end => ending_offset}
|
96
111
|
end
|
97
112
|
|
98
113
|
def get_activity id
|
@@ -30,5 +30,14 @@ module ActsAsStream
|
|
30
30
|
# then, if everything is fine, bundle it up into a JSON string
|
31
31
|
opts.to_json
|
32
32
|
end
|
33
|
+
|
34
|
+
def parse package
|
35
|
+
package = JSON.parse(package)
|
36
|
+
package.keys.each{|k| package[k.to_sym] = package[k]; package.delete(k)}
|
37
|
+
package[:who].keys.each{|k| package[:who] = k.titleize.constantize.find(package[:who][k]["id"].to_i)}
|
38
|
+
package[:object].keys.each{|k| package[:object] = k.titleize.constantize.find(package[:object][k]["id"].to_i)}
|
39
|
+
package
|
40
|
+
end
|
41
|
+
|
33
42
|
end
|
34
43
|
end
|
@@ -8,7 +8,12 @@ module ActsAsStream
|
|
8
8
|
module ClassMethods
|
9
9
|
|
10
10
|
def acts_as_stream options = {}
|
11
|
-
cattr_accessor :activity_scope,
|
11
|
+
cattr_accessor :activity_scope,
|
12
|
+
:activity_attr,
|
13
|
+
:activity_key_base,
|
14
|
+
:followers_attr,
|
15
|
+
:mentions_scope,
|
16
|
+
:mentions_key_base
|
12
17
|
self.activity_scope = options[:activity_scope] || ActsAsStream.activity_scope
|
13
18
|
self.mentions_scope = options[:mentions_scope] || ActsAsStream.mentions_scope
|
14
19
|
self.activity_attr = options[:activity_attr] || ActsAsStream.activity_attr
|
@@ -16,6 +21,7 @@ module ActsAsStream
|
|
16
21
|
self.followers_attr = options[:followers_attr] || :all_followers
|
17
22
|
send :include, ActsAsStream::StreamableObject::InstanceMethods
|
18
23
|
unless options[:ignore_mentions]
|
24
|
+
self.mentions_key_base = "#{ActsAsStream.namespace}:#{self.mentions_scope}"
|
19
25
|
send :include, ActsAsStream::StreamableObject::MentionsMethods
|
20
26
|
end
|
21
27
|
end
|
@@ -27,22 +33,23 @@ module ActsAsStream
|
|
27
33
|
{self.class.name.tableize.singularize => {'id' => self.id, activity_attr.to_s => self.send(activity_attr)}}
|
28
34
|
end
|
29
35
|
def streamable_object_id
|
30
|
-
self.send(self.class.activity_attr)
|
36
|
+
"#{self.class.name.tableize.singularize}:#{self.send(self.class.activity_attr)}"
|
31
37
|
end
|
32
38
|
def activity_key
|
33
|
-
"#{self.class.activity_key_base}:#{streamable_object_id}"
|
39
|
+
"#{self.class.activity_key_base}:by:#{streamable_object_id}"
|
34
40
|
end
|
35
41
|
def following_key
|
36
|
-
"#{
|
42
|
+
"#{self.class.activity_key_base}:for:#{streamable_object_id}"
|
37
43
|
end
|
38
44
|
def register_activity! package
|
39
|
-
act_id = ActsAsStream.register_new_activity! package
|
45
|
+
act_id = ActsAsStream.register_new_activity! package, activity_key
|
40
46
|
self.register_followers! act_id
|
41
47
|
act_id
|
42
48
|
end
|
43
49
|
|
44
50
|
def delete_activity act_id
|
45
|
-
ActsAsStream.deregister_activity! act_id
|
51
|
+
ActsAsStream.deregister_activity! act_id, activity_key
|
52
|
+
ActsAsStream.deregister_mentions! act_id, mentions_key if respond_to? mentions_key
|
46
53
|
end
|
47
54
|
|
48
55
|
def register_followers! act_id
|
@@ -60,22 +67,28 @@ module ActsAsStream
|
|
60
67
|
ActsAsStream.package options
|
61
68
|
end
|
62
69
|
|
63
|
-
def
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
end
|
70
|
+
def get_activity_for(options = {})
|
71
|
+
options = {:whom => :others}.merge options
|
72
|
+
self.send("get_#{options[:whom]}_activity", options)
|
73
|
+
end
|
74
|
+
def get_own_activity(options = {})
|
75
|
+
options[:key] = activity_key
|
76
|
+
get_activity options
|
77
|
+
end
|
78
|
+
def get_others_activity(options = {})
|
79
|
+
options[:key] = following_key
|
80
|
+
get_activity options
|
75
81
|
end
|
82
|
+
def activity_count since=nil
|
83
|
+
since ||= self.created_at.to_i
|
84
|
+
ActsAsStream.redis.zcount following_key, "(#{since}", "+inf"
|
85
|
+
end
|
86
|
+
private
|
76
87
|
|
77
|
-
def
|
78
|
-
|
88
|
+
def get_activity(options = {})
|
89
|
+
options[:page_size] = activity_count if options[:all] and activity_count > 0
|
90
|
+
options = {:page_size => ActsAsStream.page_size, :page => 1}.merge options
|
91
|
+
ActsAsStream.get_activity_for options[:key], :page_size => options[:page_size], :page => options[:page]
|
79
92
|
end
|
80
93
|
|
81
94
|
end
|
@@ -83,11 +96,36 @@ module ActsAsStream
|
|
83
96
|
module MentionsMethods
|
84
97
|
def register_mentions!(options = {})
|
85
98
|
options[:mentioned_keys] = [options[:mentioned_keys]] unless options[:mentioned_keys].is_a?(Array)
|
86
|
-
ActsAsStream.register_mentions!
|
99
|
+
ActsAsStream.register_mentions! options
|
100
|
+
end
|
101
|
+
def mentioned_by_others_key
|
102
|
+
"#{self.class.mentions_key_base}:of:#{streamable_object_id}"
|
87
103
|
end
|
88
104
|
def mentions_key
|
89
|
-
"#{
|
105
|
+
"#{self.class.mentions_key_base}:by:#{streamable_object_id}"
|
106
|
+
end
|
107
|
+
def mentions_count since = nil
|
108
|
+
since ||= 0
|
109
|
+
ActsAsStream.redis.zcount mentioned_by_others_key, "(#{since}", "+inf"
|
90
110
|
end
|
111
|
+
def get_mentions_activity(options = {})
|
112
|
+
options[:key] = mentioned_by_others_key
|
113
|
+
get_activity options
|
114
|
+
end
|
115
|
+
def get_own_mentions_activity(options = {})
|
116
|
+
options[:key] = mentions_key
|
117
|
+
get_activity options
|
118
|
+
end
|
119
|
+
|
120
|
+
private
|
121
|
+
|
122
|
+
def get_mentions(options = {})
|
123
|
+
options[:page_size] = mentions_count if options[:all]
|
124
|
+
options = {:page_size => ActsAsStream.page_size, :page => 1}.merge options
|
125
|
+
ActsAsStream.get_activity_for options[:key], :page_size => options[:page_size], :page => options[:page]
|
126
|
+
end
|
127
|
+
|
128
|
+
|
91
129
|
end
|
92
130
|
end
|
93
131
|
end
|
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.3.alpha.
|
4
|
+
version: 0.0.3.alpha.6
|
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-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
16
|
-
requirement: &
|
16
|
+
requirement: &70193007625380 !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: *70193007625380
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: redis
|
27
|
-
requirement: &
|
27
|
+
requirement: &70193007624560 !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: *70193007624560
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: sqlite3
|
38
|
-
requirement: &
|
38
|
+
requirement: &70193007623860 !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: *70193007623860
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: acts_as_amico
|
49
|
-
requirement: &
|
49
|
+
requirement: &70193007622960 !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: *70193007622960
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: rspec-rails
|
60
|
-
requirement: &
|
60
|
+
requirement: &70193007622120 !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: *70193007622120
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: spork
|
71
|
-
requirement: &
|
71
|
+
requirement: &70193007620420 !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: *70193007620420
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: guard-rspec
|
82
|
-
requirement: &
|
82
|
+
requirement: &70193007636080 !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: *70193007636080
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: guard-spork
|
93
|
-
requirement: &
|
93
|
+
requirement: &70193007635340 !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: *70193007635340
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: factory_girl_rails
|
104
|
-
requirement: &
|
104
|
+
requirement: &70193007634780 !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: *70193007634780
|
113
113
|
- !ruby/object:Gem::Dependency
|
114
114
|
name: simplecov
|
115
|
-
requirement: &
|
115
|
+
requirement: &70193007633440 !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: *70193007633440
|
124
124
|
- !ruby/object:Gem::Dependency
|
125
125
|
name: fakeweb
|
126
|
-
requirement: &
|
126
|
+
requirement: &70193007632400 !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: *70193007632400
|
135
135
|
- !ruby/object:Gem::Dependency
|
136
136
|
name: uuidtools
|
137
|
-
requirement: &
|
137
|
+
requirement: &70193007631020 !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: *70193007631020
|
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!
|
@@ -161,7 +161,7 @@ files:
|
|
161
161
|
- MIT-LICENSE
|
162
162
|
- Rakefile
|
163
163
|
- README.md
|
164
|
-
homepage: http://github.com/mettadore/acts_as_stream
|
164
|
+
homepage: http://github.com/mettadore/acts_as_stream
|
165
165
|
licenses: []
|
166
166
|
post_install_message:
|
167
167
|
rdoc_options: []
|