acts_as_stream 0.0.2.alpha.4 → 0.0.3.alpha.1

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -22,7 +22,7 @@ module ActsAsStream
22
22
  end
23
23
 
24
24
  def namespace
25
- @namespace ||= :activity_stream
25
+ @namespace ||= :acts_as_stream
26
26
  end
27
27
 
28
28
  def activity_key
@@ -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 timed key, scored by id, and an id-based key
12
- ActsAsStream.redis.zadd "#{base_key}:time:#{this_time}", id, id
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}:time:#{score}", ident
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, time, options[:activity_id]
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
- opts[opt] = opts[opt].to_stream_hash
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 activity_id
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}:#{activity_id}"
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}:#{activity_id}:#{activity_scope}"
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]
@@ -1,3 +1,3 @@
1
1
  module ActsAsStream
2
- VERSION = "0.0.2.alpha.4"
2
+ VERSION = "0.0.3.alpha.1"
3
3
  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.2.alpha.4
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 00:00:00.000000000 Z
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: &70105178638780 !ruby/object:Gem::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: *70105178638780
24
+ version_requirements: *70294530388220
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: redis
27
- requirement: &70105178637860 !ruby/object:Gem::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: *70105178637860
35
+ version_requirements: *70294530387540
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: sqlite3
38
- requirement: &70105178637260 !ruby/object:Gem::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: *70105178637260
46
+ version_requirements: *70294530386780
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: acts_as_amico
49
- requirement: &70105178636420 !ruby/object:Gem::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: *70105178636420
57
+ version_requirements: *70294530385860
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rspec-rails
60
- requirement: &70105178635460 !ruby/object:Gem::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: *70105178635460
68
+ version_requirements: *70294530385100
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: spork
71
- requirement: &70105178649900 !ruby/object:Gem::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: *70105178649900
79
+ version_requirements: *70294530400080
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: guard-rspec
82
- requirement: &70105178649040 !ruby/object:Gem::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: *70105178649040
90
+ version_requirements: *70294530399320
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: guard-spork
93
- requirement: &70105178648320 !ruby/object:Gem::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: *70105178648320
101
+ version_requirements: *70294530398540
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: factory_girl_rails
104
- requirement: &70105178647300 !ruby/object:Gem::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: *70105178647300
112
+ version_requirements: *70294530397940
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: simplecov
115
- requirement: &70105178646380 !ruby/object:Gem::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: *70105178646380
123
+ version_requirements: *70294530396580
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: fakeweb
126
- requirement: &70105178645340 !ruby/object:Gem::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: *70105178645340
134
+ version_requirements: *70294530395540
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: uuidtools
137
- requirement: &70105178644000 !ruby/object:Gem::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: *70105178644000
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!