activity_feed 1.1.1 → 1.2

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,5 +1,9 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 1.2
4
+
5
+ * Support aggregate feeds
6
+
3
7
  ## 1.1.1
4
8
 
5
9
  * Removing activemodel dependency since that is not needed
@@ -24,6 +24,8 @@ ActivityFeed.redis = Redis.new(:host => '127.0.0.1', :port => 6379)
24
24
  ActivityFeed.namespace = 'activity'
25
25
  ActivityFeed.key = 'feed'
26
26
  ActivityFeed.persistence = :memory # (or :active_record or :mongo_mapper or :ohm)
27
+ ActivityFeed.aggregate = true
28
+ ActivityFeed.aggregate_key = 'aggregate'
27
29
  ```
28
30
 
29
31
  ## Usage
@@ -167,7 +169,7 @@ ruby-1.9.2-p290 :012 > feed.page(1)
167
169
  ruby-1.9.2-p290 :013 >
168
170
  ```
169
171
 
170
- ### Ohm-backed persistence
172
+ ### Ohm persistence
171
173
 
172
174
  ActivityFeed can also use Ohm to persist the items in Redis. You can set this using:
173
175
 
@@ -216,6 +218,55 @@ ActivityFeed::Foo::Item
216
218
  The custom class should implement a find(item_or_item_id) method that does "the right thing".
217
219
  Consult the specs to see this working if you have questions.
218
220
 
221
+ ### Feeds and Aggregation Feeds
222
+
223
+ activity_feed uses the following key in adding the item to Redis: `ActivityFeed.namespace:ActivityFeed.key:self.user_id`. By default, activity_feed in the `create_item` call will
224
+ also add the item in Redis to an aggregate feed using the key: `ActivityFeed.namespace:ActivityFeed.key:ActivityFeed.aggregate_key:self.user_id`.
225
+
226
+ You can control aggregation globally by setting the ActivityFeed.aggregate property to either `true` or `false`. You can override the global aggregation setting on the
227
+ `create_item` call by passing either `true` or `false` as the 2nd argument.
228
+
229
+ Below is an example of an aggregate feed:
230
+
231
+ ```ruby
232
+ ruby-1.9.2-p290 :001 > require 'activity_feed'
233
+ => true
234
+ ruby-1.9.2-p290 :002 > require 'pp'
235
+ => true
236
+ ruby-1.9.2-p290 :003 >
237
+ ruby-1.9.2-p290 :004 > $redis = Redis.new(:host => '127.0.0.1', :port => 6379)
238
+ => #<Redis client v2.2.2 connected to redis://127.0.0.1:6379/0 (Redis v2.4.4)>
239
+ ruby-1.9.2-p290 :005 > ActivityFeed.redis = $redis
240
+ => #<Redis client v2.2.2 connected to redis://127.0.0.1:6379/0 (Redis v2.4.4)>
241
+ ruby-1.9.2-p290 :006 > ActivityFeed.persistence = :ohm
242
+ => :ohm
243
+ ruby-1.9.2-p290 :007 >
244
+ ruby-1.9.2-p290 :008 > 1.upto(5) do |index|
245
+ ruby-1.9.2-p290 :009 > item = ActivityFeed.create_item(:user_id => 1, :nickname => 'nickname_1', :text => "text_#{index}")
246
+ ruby-1.9.2-p290 :010?> sleep(1)
247
+ ruby-1.9.2-p290 :011?> another_item = ActivityFeed.create_item(:user_id => 2, :nickname => 'nickname_2', :text => "test_nickname2_#{index}")
248
+ ruby-1.9.2-p290 :012?> sleep(1)
249
+ ruby-1.9.2-p290 :013?> ActivityFeed.aggregate_item(another_item, 1)
250
+ ruby-1.9.2-p290 :014?> end
251
+ => 1
252
+ ruby-1.9.2-p290 :015 >
253
+ ruby-1.9.2-p290 :016 > feed = ActivityFeed::Feed.new(1)
254
+ => #<ActivityFeed::Feed:0x000001014b9298 @feederboard=#<Leaderboard:0x000001014b91a8 @leaderboard_name="activity:feed:1", @page_size=25, @redis_connection=#<Redis client v2.2.2 connected to redis://127.0.0.1:6379/0 (Redis v2.4.4)>>, @feederboard_aggregate=#<Leaderboard:0x000001014b9090 @leaderboard_name="activity:feed:aggregate:1", @page_size=25, @redis_connection=#<Redis client v2.2.2 connected to redis://127.0.0.1:6379/0 (Redis v2.4.4)>>>
255
+ ruby-1.9.2-p290 :017 > pp feed.page(1, true)
256
+ [#<ActivityFeed::Ohm::Item:10 created_at="2011-11-29 21:18:40 UTC" updated_at="2011-11-29 21:18:40 UTC" user_id="2" nickname="nickname_2" type=nil title=nil text="test_nickname2_5" url=nil icon=nil sticky=nil>,
257
+ #<ActivityFeed::Ohm::Item:9 created_at="2011-11-29 21:18:39 UTC" updated_at="2011-11-29 21:18:39 UTC" user_id="1" nickname="nickname_1" type=nil title=nil text="text_5" url=nil icon=nil sticky=nil>,
258
+ #<ActivityFeed::Ohm::Item:8 created_at="2011-11-29 21:18:38 UTC" updated_at="2011-11-29 21:18:38 UTC" user_id="2" nickname="nickname_2" type=nil title=nil text="test_nickname2_4" url=nil icon=nil sticky=nil>,
259
+ #<ActivityFeed::Ohm::Item:7 created_at="2011-11-29 21:18:37 UTC" updated_at="2011-11-29 21:18:37 UTC" user_id="1" nickname="nickname_1" type=nil title=nil text="text_4" url=nil icon=nil sticky=nil>,
260
+ #<ActivityFeed::Ohm::Item:6 created_at="2011-11-29 21:18:36 UTC" updated_at="2011-11-29 21:18:36 UTC" user_id="2" nickname="nickname_2" type=nil title=nil text="test_nickname2_3" url=nil icon=nil sticky=nil>,
261
+ #<ActivityFeed::Ohm::Item:5 created_at="2011-11-29 21:18:35 UTC" updated_at="2011-11-29 21:18:35 UTC" user_id="1" nickname="nickname_1" type=nil title=nil text="text_3" url=nil icon=nil sticky=nil>,
262
+ #<ActivityFeed::Ohm::Item:4 created_at="2011-11-29 21:18:34 UTC" updated_at="2011-11-29 21:18:34 UTC" user_id="2" nickname="nickname_2" type=nil title=nil text="test_nickname2_2" url=nil icon=nil sticky=nil>,
263
+ #<ActivityFeed::Ohm::Item:3 created_at="2011-11-29 21:18:33 UTC" updated_at="2011-11-29 21:18:33 UTC" user_id="1" nickname="nickname_1" type=nil title=nil text="text_2" url=nil icon=nil sticky=nil>,
264
+ #<ActivityFeed::Ohm::Item:2 created_at="2011-11-29 21:18:32 UTC" updated_at="2011-11-29 21:18:32 UTC" user_id="2" nickname="nickname_2" type=nil title=nil text="test_nickname2_1" url=nil icon=nil sticky=nil>,
265
+ #<ActivityFeed::Ohm::Item:1 created_at="2011-11-29 21:18:31 UTC" updated_at="2011-11-29 21:18:31 UTC" user_id="1" nickname="nickname_1" type=nil title=nil text="text_1" url=nil icon=nil sticky=nil>]
266
+ => [#<ActivityFeed::Ohm::Item:10 created_at="2011-11-29 21:18:40 UTC" updated_at="2011-11-29 21:18:40 UTC" user_id="2" nickname="nickname_2" type=nil title=nil text="test_nickname2_5" url=nil icon=nil sticky=nil>, #<ActivityFeed::Ohm::Item:9 created_at="2011-11-29 21:18:39 UTC" updated_at="2011-11-29 21:18:39 UTC" user_id="1" nickname="nickname_1" type=nil title=nil text="text_5" url=nil icon=nil sticky=nil>, #<ActivityFeed::Ohm::Item:8 created_at="2011-11-29 21:18:38 UTC" updated_at="2011-11-29 21:18:38 UTC" user_id="2" nickname="nickname_2" type=nil title=nil text="test_nickname2_4" url=nil icon=nil sticky=nil>, #<ActivityFeed::Ohm::Item:7 created_at="2011-11-29 21:18:37 UTC" updated_at="2011-11-29 21:18:37 UTC" user_id="1" nickname="nickname_1" type=nil title=nil text="text_4" url=nil icon=nil sticky=nil>, #<ActivityFeed::Ohm::Item:6 created_at="2011-11-29 21:18:36 UTC" updated_at="2011-11-29 21:18:36 UTC" user_id="2" nickname="nickname_2" type=nil title=nil text="test_nickname2_3" url=nil icon=nil sticky=nil>, #<ActivityFeed::Ohm::Item:5 created_at="2011-11-29 21:18:35 UTC" updated_at="2011-11-29 21:18:35 UTC" user_id="1" nickname="nickname_1" type=nil title=nil text="text_3" url=nil icon=nil sticky=nil>, #<ActivityFeed::Ohm::Item:4 created_at="2011-11-29 21:18:34 UTC" updated_at="2011-11-29 21:18:34 UTC" user_id="2" nickname="nickname_2" type=nil title=nil text="test_nickname2_2" url=nil icon=nil sticky=nil>, #<ActivityFeed::Ohm::Item:3 created_at="2011-11-29 21:18:33 UTC" updated_at="2011-11-29 21:18:33 UTC" user_id="1" nickname="nickname_1" type=nil title=nil text="text_2" url=nil icon=nil sticky=nil>, #<ActivityFeed::Ohm::Item:2 created_at="2011-11-29 21:18:32 UTC" updated_at="2011-11-29 21:18:32 UTC" user_id="2" nickname="nickname_2" type=nil title=nil text="test_nickname2_1" url=nil icon=nil sticky=nil>, #<ActivityFeed::Ohm::Item:1 created_at="2011-11-29 21:18:31 UTC" updated_at="2011-11-29 21:18:31 UTC" user_id="1" nickname="nickname_1" type=nil title=nil text="text_1" url=nil icon=nil sticky=nil>]
267
+ ruby-1.9.2-p290 :018 >
268
+ ```
269
+
219
270
  ## Contributing to Activity Feed
220
271
 
221
272
  * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
@@ -10,6 +10,8 @@ module ActivityFeed
10
10
  mattr_accessor :namespace
11
11
  mattr_accessor :key
12
12
  mattr_accessor :persistence
13
+ mattr_accessor :aggregate_key
14
+ mattr_accessor :aggregate
13
15
 
14
16
  def self.persistence=(type = :memory)
15
17
  @@persistence_type = type
@@ -34,12 +36,25 @@ module ActivityFeed
34
36
  @@persistence = klazz
35
37
  end
36
38
 
37
- def self.create_item(attributes)
39
+ def self.create_item(attributes, aggregate = ActivityFeed.aggregate)
38
40
  item = @@persistence.new(attributes)
39
41
  item.save
40
- item
42
+ ActivityFeed.aggregate_item(item) if aggregate
43
+ item
41
44
  end
42
45
 
46
+ def self.aggregate_item(item, user_id = nil)
47
+ user_id_for_aggregate = user_id.nil? ? item.user_id : user_id
48
+ case @@persistence_type
49
+ when :active_record, :mongo_mapper
50
+ ActivityFeed.redis.zadd(ActivityFeed.feed_key(user_id_for_aggregate, true), item.created_at.to_i, item.id)
51
+ when :ohm
52
+ ActivityFeed.redis.zadd(ActivityFeed.feed_key(user_id_for_aggregate, true), DateTime.parse(item.created_at).to_i, item.id)
53
+ else
54
+ ActivityFeed.redis.zadd(ActivityFeed.feed_key(user_id_for_aggregate, true), DateTime.now.to_i, item.attributes.to_json)
55
+ end
56
+ end
57
+
43
58
  def self.load_item(item_or_item_id)
44
59
  case @@persistence_type
45
60
  when :active_record
@@ -55,7 +70,17 @@ module ActivityFeed
55
70
  end
56
71
  end
57
72
 
73
+ def self.feed_key(user_id, aggregate = false)
74
+ if aggregate
75
+ "#{ActivityFeed.namespace}:#{ActivityFeed.key}:#{ActivityFeed.aggregate_key}:#{user_id}"
76
+ else
77
+ "#{ActivityFeed.namespace}:#{ActivityFeed.key}:#{user_id}"
78
+ end
79
+ end
80
+
58
81
  self.namespace = 'activity'
59
82
  self.key = 'feed'
83
+ self.aggregate_key = 'aggregate'
84
+ self.aggregate = true
60
85
  self.persistence = :memory
61
86
  end
@@ -10,7 +10,7 @@ module ActivityFeed
10
10
  private
11
11
 
12
12
  def update_redis
13
- ActivityFeed.redis.zadd("#{ActivityFeed.namespace}:#{ActivityFeed.key}:#{self.user_id}", self.created_at.to_i, self.id)
13
+ ActivityFeed.redis.zadd(ActivityFeed.feed_key(self.user_id), self.created_at.to_i, self.id)
14
14
  end
15
15
  end
16
16
  end
@@ -3,24 +3,27 @@ require 'leaderboard'
3
3
  module ActivityFeed
4
4
  class Feed
5
5
  def initialize(user_id)
6
- @feederboard = Leaderboard.new("#{ActivityFeed.namespace}:#{ActivityFeed.key}:#{user_id}", Leaderboard::DEFAULT_OPTIONS, {:redis_connection => ActivityFeed.redis})
6
+ @feederboard = Leaderboard.new(ActivityFeed.feed_key(user_id), Leaderboard::DEFAULT_OPTIONS, {:redis_connection => ActivityFeed.redis})
7
+ @feederboard_aggregate = Leaderboard.new(ActivityFeed.feed_key(user_id, true), Leaderboard::DEFAULT_OPTIONS, {:redis_connection => ActivityFeed.redis})
7
8
  end
8
9
 
9
- def page(page)
10
+ def page(page, aggregate = false)
10
11
  feed_items = []
11
- @feederboard.leaders(page).each do |feed_item|
12
+
13
+ feed = aggregate ? @feederboard_aggregate : @feederboard
14
+ feed.leaders(page).each do |feed_item|
12
15
  feed_items << ActivityFeed.load_item(feed_item[:member])
13
16
  end
14
17
 
15
18
  feed_items
16
19
  end
17
20
 
18
- def total_pages
19
- @feederboard.total_pages
21
+ def total_pages(aggregate = false)
22
+ aggregate ? @feederboard_aggregate.total_pages : @feederboard.total_pages
20
23
  end
21
24
 
22
- def total_items
23
- @feederboard.total_members
25
+ def total_items(aggregate = false)
26
+ aggregate ? @feederboard_aggregate.total_members : @feederboard.total_members
24
27
  end
25
28
  end
26
29
  end
@@ -21,11 +21,15 @@ module ActivityFeed
21
21
  self.send("#{key}=", value)
22
22
  end
23
23
  end
24
+
25
+ def attributes
26
+ @attributes
27
+ end
24
28
 
25
29
  def save
26
30
  raise 'user_id MUST be defined in the attributes' if user_id.blank?
27
31
 
28
- ActivityFeed.redis.zadd("#{ActivityFeed.namespace}:#{ActivityFeed.key}:#{self.user_id}", DateTime.now.to_i, @attributes.to_json)
32
+ ActivityFeed.redis.zadd(ActivityFeed.feed_key(self.user_id), DateTime.now.to_i, @attributes.to_json)
29
33
  end
30
34
  end
31
35
  end
@@ -23,7 +23,7 @@ module ActivityFeed
23
23
  private
24
24
 
25
25
  def update_redis
26
- ActivityFeed.redis.zadd("#{ActivityFeed.namespace}:#{ActivityFeed.key}:#{self.user_id}", self.created_at.to_i, self.id)
26
+ ActivityFeed.redis.zadd(ActivityFeed.feed_key(self.user_id), self.created_at.to_i, self.id)
27
27
  end
28
28
  end
29
29
  end
@@ -21,7 +21,7 @@ module ActivityFeed
21
21
  private
22
22
 
23
23
  def update_redis
24
- ActivityFeed.redis.zadd("#{ActivityFeed.namespace}:#{ActivityFeed.key}:#{self.user_id}", self.created_at.to_i, self.id)
24
+ ActivityFeed.redis.zadd(ActivityFeed.feed_key(self.user_id), DateTime.parse(self.created_at).to_i, self.id)
25
25
  end
26
26
  end
27
27
  end
@@ -1,3 +1,3 @@
1
1
  module ActivityFeed
2
- VERSION = "1.1.1"
2
+ VERSION = "1.2"
3
3
  end
@@ -17,6 +17,10 @@ module ActivityFeed
17
17
  self.send("#{key}=", value)
18
18
  end
19
19
  end
20
+
21
+ def attributes
22
+ @attributes
23
+ end
20
24
 
21
25
  def self.find(item)
22
26
  JSON.parse(item)
@@ -25,7 +29,7 @@ module ActivityFeed
25
29
  def save
26
30
  raise 'user_id MUST be defined in the attributes' if user_id.blank?
27
31
 
28
- ActivityFeed.redis.zadd("#{ActivityFeed.namespace}:#{ActivityFeed.key}:#{self.user_id}", DateTime.now.to_i, @attributes.to_json)
32
+ ActivityFeed.redis.zadd(ActivityFeed.feed_key(self.user_id), DateTime.now.to_i, @attributes.to_json)
29
33
  end
30
34
  end
31
35
  end
@@ -1,11 +1,13 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe ActivityFeed do
4
- it 'should have defaults set for :namespace and :key' do
4
+ it 'should have defaults set' do
5
5
  ActivityFeed.namespace.should eql('activity')
6
6
  ActivityFeed.key.should eql('feed')
7
7
  ActivityFeed.persistence = :memory
8
8
  ActivityFeed.persistence.should be(ActivityFeed::Memory::Item)
9
+ ActivityFeed.aggregate_key.should eql('aggregate')
10
+ ActivityFeed.aggregate.should be(true)
9
11
  end
10
12
 
11
13
  describe 'creating' do
@@ -13,9 +15,10 @@ describe ActivityFeed do
13
15
  user_id = 1
14
16
  ActivityFeed.persistence = :memory
15
17
 
16
- ActivityFeed.redis.zcard("#{ActivityFeed.namespace}:#{ActivityFeed.key}:#{user_id}").should be(0)
17
- ActivityFeed.create_item(:user_id => user_id, :text => 'This is text for my activity feed')
18
- ActivityFeed.redis.zcard("#{ActivityFeed.namespace}:#{ActivityFeed.key}:#{user_id}").should be(1)
18
+ ActivityFeed.redis.zcard(ActivityFeed.feed_key(user_id)).should be(0)
19
+ activity_feed_item = ActivityFeed.create_item(:user_id => user_id, :text => 'This is text for my activity feed')
20
+ ActivityFeed.redis.zcard(ActivityFeed.feed_key(user_id)).should be(1)
21
+ ActivityFeed.redis.zcard(ActivityFeed.feed_key(user_id, true)).should be(1)
19
22
  end
20
23
 
21
24
  it 'should allow you to create a new item using :mongo_mapper' do
@@ -23,9 +26,10 @@ describe ActivityFeed do
23
26
  ActivityFeed.persistence = :mongo_mapper
24
27
 
25
28
  ActivityFeed::MongoMapper::Item.count.should be(0)
26
- ActivityFeed.redis.zcard("#{ActivityFeed.namespace}:#{ActivityFeed.key}:#{user_id}").should be(0)
27
- ActivityFeed.create_item(:user_id => user_id, :text => 'This is text for my activity feed')
28
- ActivityFeed.redis.zcard("#{ActivityFeed.namespace}:#{ActivityFeed.key}:#{user_id}").should be(1)
29
+ ActivityFeed.redis.zcard(ActivityFeed.feed_key(user_id)).should be(0)
30
+ activity_feed_item = ActivityFeed.create_item(:user_id => user_id, :text => 'This is text for my activity feed')
31
+ ActivityFeed.redis.zcard(ActivityFeed.feed_key(user_id)).should be(1)
32
+ ActivityFeed.redis.zcard(ActivityFeed.feed_key(user_id, true)).should be(1)
29
33
  ActivityFeed::MongoMapper::Item.count.should be(1)
30
34
  end
31
35
 
@@ -34,9 +38,10 @@ describe ActivityFeed do
34
38
  ActivityFeed.persistence = :active_record
35
39
 
36
40
  ActivityFeed::ActiveRecord::Item.count.should be(0)
37
- ActivityFeed.redis.zcard("#{ActivityFeed.namespace}:#{ActivityFeed.key}:#{user_id}").should be(0)
38
- ActivityFeed.create_item(:user_id => user_id, :text => 'This is text for my activity feed')
39
- ActivityFeed.redis.zcard("#{ActivityFeed.namespace}:#{ActivityFeed.key}:#{user_id}").should be(1)
41
+ ActivityFeed.redis.zcard(ActivityFeed.feed_key(user_id)).should be(0)
42
+ activity_feed_item = ActivityFeed.create_item(:user_id => user_id, :text => 'This is text for my activity feed')
43
+ ActivityFeed.redis.zcard(ActivityFeed.feed_key(user_id)).should be(1)
44
+ ActivityFeed.redis.zcard(ActivityFeed.feed_key(user_id, true)).should be(1)
40
45
  ActivityFeed::ActiveRecord::Item.count.should be(1)
41
46
  end
42
47
 
@@ -45,9 +50,22 @@ describe ActivityFeed do
45
50
  ActivityFeed.persistence = :ohm
46
51
 
47
52
  ActivityFeed::Ohm::Item.all.count.should be(0)
48
- ActivityFeed.redis.zcard("#{ActivityFeed.namespace}:#{ActivityFeed.key}:#{user_id}").should be(0)
49
- ActivityFeed.create_item(:user_id => user_id, :text => 'This is text for my activity feed')
50
- ActivityFeed.redis.zcard("#{ActivityFeed.namespace}:#{ActivityFeed.key}:#{user_id}").should be(1)
53
+ ActivityFeed.redis.zcard(ActivityFeed.feed_key(user_id)).should be(0)
54
+ activity_feed_item = ActivityFeed.create_item(:user_id => user_id, :text => 'This is text for my activity feed')
55
+ ActivityFeed.redis.zcard(ActivityFeed.feed_key(user_id)).should be(1)
56
+ ActivityFeed.redis.zcard(ActivityFeed.feed_key(user_id, true)).should be(1)
57
+ ActivityFeed::Ohm::Item.all.count.should be(1)
58
+ end
59
+
60
+ it 'should allow you to create a new item and not aggregate the item' do
61
+ user_id = 1
62
+ ActivityFeed.persistence = :ohm
63
+
64
+ ActivityFeed::Ohm::Item.all.count.should be(0)
65
+ ActivityFeed.redis.zcard(ActivityFeed.feed_key(user_id)).should be(0)
66
+ activity_feed_item = ActivityFeed.create_item({:user_id => user_id, :text => 'This is text for my activity feed'}, false)
67
+ ActivityFeed.redis.zcard(ActivityFeed.feed_key(user_id)).should be(1)
68
+ ActivityFeed.redis.zcard(ActivityFeed.feed_key(user_id, true)).should be(0)
51
69
  ActivityFeed::Ohm::Item.all.count.should be(1)
52
70
  end
53
71
  end
@@ -99,9 +117,11 @@ describe ActivityFeed do
99
117
  user_id = 1
100
118
  ActivityFeed.persistence = :custom
101
119
 
102
- ActivityFeed.redis.zcard("#{ActivityFeed.namespace}:#{ActivityFeed.key}:#{user_id}").should be(0)
103
- ActivityFeed.create_item(:user_id => user_id, :text => 'This is text for my activity feed')
104
- ActivityFeed.redis.zcard("#{ActivityFeed.namespace}:#{ActivityFeed.key}:#{user_id}").should be(1)
120
+ ActivityFeed.redis.zcard(ActivityFeed.feed_key(user_id)).should be(0)
121
+ activity_feed_item = ActivityFeed.create_item(:user_id => user_id, :text => 'This is text for my activity feed')
122
+ ActivityFeed.redis.zcard(ActivityFeed.feed_key(user_id)).should be(1)
123
+ ActivityFeed.aggregate_item(activity_feed_item)
124
+ ActivityFeed.redis.zcard(ActivityFeed.feed_key(user_id, true)).should be(1)
105
125
  end
106
126
 
107
127
  it 'should allow you to load an item using a custom persistence handler class' do
@@ -64,6 +64,22 @@ describe ActivityFeed::Feed do
64
64
  feed.total_pages.should be(2)
65
65
  end
66
66
 
67
+ describe 'feed aggregation' do
68
+ it 'should pull up the correct list of items from an aggregated activity feed' do
69
+ ActivityFeed.persistence = :ohm
70
+ 1.upto(5) do |index|
71
+ item = ActivityFeed.create_item(:user_id => 1, :nickname => 'nickname_1', :text => "text_#{index}")
72
+ another_item = ActivityFeed.create_item(:user_id => 2, :nickname => 'nickname_2', :text => "test_another_item_#{index}")
73
+ ActivityFeed.aggregate_item(another_item, 1)
74
+ end
75
+
76
+ feed = ActivityFeed::Feed.new(1)
77
+ feed.total_pages(true).should be(1)
78
+ feed.total_items(true).should be(10)
79
+ feed.page(1, true).size.should be(10)
80
+ end
81
+ end
82
+
67
83
  describe 'custom persistence' do
68
84
  it 'should allow you to pull up the correct list of ActivityFeed::Custom::Item when calling #page using :custom' do
69
85
  ActivityFeed.persistence = :custom
@@ -14,9 +14,11 @@ describe 'ActivityFeed::Item' do
14
14
  it 'should add the feed item ID to redis' do
15
15
  item = Fabricate.build(ActivityFeed.persistence)
16
16
 
17
- ActivityFeed.redis.zcard("#{ActivityFeed.namespace}:#{ActivityFeed.key}:#{item.user_id}").should be(0)
17
+ ActivityFeed.redis.zcard(ActivityFeed.feed_key(item.user_id)).should be(0)
18
18
  item.save
19
- ActivityFeed.redis.zcard("#{ActivityFeed.namespace}:#{ActivityFeed.key}:#{item.user_id}").should be(1)
19
+ ActivityFeed.redis.zcard(ActivityFeed.feed_key(item.user_id)).should be(1)
20
+ ActivityFeed.aggregate_item(item)
21
+ ActivityFeed.redis.zcard(ActivityFeed.feed_key(item.user_id, true)).should be(1)
20
22
  end
21
23
 
22
24
  it 'should have default attributes for .title .url .icon and .sticky' do
@@ -31,12 +33,16 @@ describe 'ActivityFeed::Item' do
31
33
  it 'should not create a new item in Redis after saving, only on create' do
32
34
  item = Fabricate.build(ActivityFeed::Memory::Item)
33
35
 
34
- ActivityFeed.redis.zcard("#{ActivityFeed.namespace}:#{ActivityFeed.key}:#{item.user_id}").should be(0)
36
+ ActivityFeed.redis.zcard(ActivityFeed.feed_key(item.user_id)).should be(0)
35
37
  item.save
36
- ActivityFeed.redis.zcard("#{ActivityFeed.namespace}:#{ActivityFeed.key}:#{item.user_id}").should be(1)
38
+ ActivityFeed.redis.zcard(ActivityFeed.feed_key(item.user_id)).should be(1)
39
+ ActivityFeed.aggregate_item(item)
40
+ ActivityFeed.redis.zcard(ActivityFeed.feed_key(item.user_id, true)).should be(1)
37
41
 
38
42
  item.text = 'updated text'
39
43
  item.save
40
- ActivityFeed.redis.zcard("#{ActivityFeed.namespace}:#{ActivityFeed.key}:#{item.user_id}").should be(1)
44
+ ActivityFeed.redis.zcard(ActivityFeed.feed_key(item.user_id)).should be(1)
45
+ ActivityFeed.aggregate_item(item)
46
+ ActivityFeed.redis.zcard(ActivityFeed.feed_key(item.user_id, true)).should be(1)
41
47
  end
42
48
  end
@@ -2,6 +2,6 @@ require 'spec_helper'
2
2
 
3
3
  describe ActivityFeed do
4
4
  it "should be the correct version" do
5
- ActivityFeed::VERSION.should == '1.1.1'
5
+ ActivityFeed::VERSION.should == '1.2'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,199 +1,203 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: activity_feed
3
- version: !ruby/object:Gem::Version
4
- version: 1.1.1
3
+ version: !ruby/object:Gem::Version
5
4
  prerelease:
5
+ version: "1.2"
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - David Czarnecki
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-10-08 00:00:00.000000000Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
12
+
13
+ date: 2011-11-30 00:00:00 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
15
16
  name: rake
16
- requirement: &70162674967220 !ruby/object:Gem::Requirement
17
+ requirement: &id001 !ruby/object:Gem::Requirement
17
18
  none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: '0'
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: "0"
22
23
  type: :development
23
24
  prerelease: false
24
- version_requirements: *70162674967220
25
- - !ruby/object:Gem::Dependency
25
+ version_requirements: *id001
26
+ - !ruby/object:Gem::Dependency
26
27
  name: rspec
27
- requirement: &70162674966800 !ruby/object:Gem::Requirement
28
+ requirement: &id002 !ruby/object:Gem::Requirement
28
29
  none: false
29
- requirements:
30
- - - ! '>='
31
- - !ruby/object:Gem::Version
32
- version: '0'
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
33
34
  type: :development
34
35
  prerelease: false
35
- version_requirements: *70162674966800
36
- - !ruby/object:Gem::Dependency
36
+ version_requirements: *id002
37
+ - !ruby/object:Gem::Dependency
37
38
  name: database_cleaner
38
- requirement: &70162674966380 !ruby/object:Gem::Requirement
39
+ requirement: &id003 !ruby/object:Gem::Requirement
39
40
  none: false
40
- requirements:
41
- - - ! '>='
42
- - !ruby/object:Gem::Version
43
- version: '0'
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: "0"
44
45
  type: :development
45
46
  prerelease: false
46
- version_requirements: *70162674966380
47
- - !ruby/object:Gem::Dependency
47
+ version_requirements: *id003
48
+ - !ruby/object:Gem::Dependency
48
49
  name: fabrication
49
- requirement: &70162674965960 !ruby/object:Gem::Requirement
50
+ requirement: &id004 !ruby/object:Gem::Requirement
50
51
  none: false
51
- requirements:
52
- - - ! '>='
53
- - !ruby/object:Gem::Version
54
- version: '0'
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: "0"
55
56
  type: :development
56
57
  prerelease: false
57
- version_requirements: *70162674965960
58
- - !ruby/object:Gem::Dependency
58
+ version_requirements: *id004
59
+ - !ruby/object:Gem::Dependency
59
60
  name: mongo_mapper
60
- requirement: &70162674965540 !ruby/object:Gem::Requirement
61
+ requirement: &id005 !ruby/object:Gem::Requirement
61
62
  none: false
62
- requirements:
63
- - - ! '>='
64
- - !ruby/object:Gem::Version
65
- version: '0'
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: "0"
66
67
  type: :development
67
68
  prerelease: false
68
- version_requirements: *70162674965540
69
- - !ruby/object:Gem::Dependency
69
+ version_requirements: *id005
70
+ - !ruby/object:Gem::Dependency
70
71
  name: mongo_ext
71
- requirement: &70162674965120 !ruby/object:Gem::Requirement
72
+ requirement: &id006 !ruby/object:Gem::Requirement
72
73
  none: false
73
- requirements:
74
- - - ! '>='
75
- - !ruby/object:Gem::Version
76
- version: '0'
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: "0"
77
78
  type: :development
78
79
  prerelease: false
79
- version_requirements: *70162674965120
80
- - !ruby/object:Gem::Dependency
80
+ version_requirements: *id006
81
+ - !ruby/object:Gem::Dependency
81
82
  name: bson_ext
82
- requirement: &70162674964700 !ruby/object:Gem::Requirement
83
+ requirement: &id007 !ruby/object:Gem::Requirement
83
84
  none: false
84
- requirements:
85
- - - ! '>='
86
- - !ruby/object:Gem::Version
87
- version: '0'
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: "0"
88
89
  type: :development
89
90
  prerelease: false
90
- version_requirements: *70162674964700
91
- - !ruby/object:Gem::Dependency
91
+ version_requirements: *id007
92
+ - !ruby/object:Gem::Dependency
92
93
  name: activerecord
93
- requirement: &70162674964280 !ruby/object:Gem::Requirement
94
+ requirement: &id008 !ruby/object:Gem::Requirement
94
95
  none: false
95
- requirements:
96
- - - ! '>='
97
- - !ruby/object:Gem::Version
98
- version: '0'
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: "0"
99
100
  type: :development
100
101
  prerelease: false
101
- version_requirements: *70162674964280
102
- - !ruby/object:Gem::Dependency
102
+ version_requirements: *id008
103
+ - !ruby/object:Gem::Dependency
103
104
  name: sqlite3
104
- requirement: &70162674963860 !ruby/object:Gem::Requirement
105
+ requirement: &id009 !ruby/object:Gem::Requirement
105
106
  none: false
106
- requirements:
107
- - - ! '>='
108
- - !ruby/object:Gem::Version
109
- version: '0'
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: "0"
110
111
  type: :development
111
112
  prerelease: false
112
- version_requirements: *70162674963860
113
- - !ruby/object:Gem::Dependency
113
+ version_requirements: *id009
114
+ - !ruby/object:Gem::Dependency
114
115
  name: ohm
115
- requirement: &70162674963440 !ruby/object:Gem::Requirement
116
+ requirement: &id010 !ruby/object:Gem::Requirement
116
117
  none: false
117
- requirements:
118
- - - ! '>='
119
- - !ruby/object:Gem::Version
120
- version: '0'
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: "0"
121
122
  type: :development
122
123
  prerelease: false
123
- version_requirements: *70162674963440
124
- - !ruby/object:Gem::Dependency
124
+ version_requirements: *id010
125
+ - !ruby/object:Gem::Dependency
125
126
  name: ohm-contrib
126
- requirement: &70162674963020 !ruby/object:Gem::Requirement
127
+ requirement: &id011 !ruby/object:Gem::Requirement
127
128
  none: false
128
- requirements:
129
- - - ! '>='
130
- - !ruby/object:Gem::Version
131
- version: '0'
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: "0"
132
133
  type: :development
133
134
  prerelease: false
134
- version_requirements: *70162674963020
135
- - !ruby/object:Gem::Dependency
135
+ version_requirements: *id011
136
+ - !ruby/object:Gem::Dependency
136
137
  name: activesupport
137
- requirement: &70162674962600 !ruby/object:Gem::Requirement
138
+ requirement: &id012 !ruby/object:Gem::Requirement
138
139
  none: false
139
- requirements:
140
- - - ! '>='
141
- - !ruby/object:Gem::Version
142
- version: '0'
140
+ requirements:
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ version: "0"
143
144
  type: :runtime
144
145
  prerelease: false
145
- version_requirements: *70162674962600
146
- - !ruby/object:Gem::Dependency
146
+ version_requirements: *id012
147
+ - !ruby/object:Gem::Dependency
147
148
  name: i18n
148
- requirement: &70162674962180 !ruby/object:Gem::Requirement
149
+ requirement: &id013 !ruby/object:Gem::Requirement
149
150
  none: false
150
- requirements:
151
- - - ! '>='
152
- - !ruby/object:Gem::Version
153
- version: '0'
151
+ requirements:
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ version: "0"
154
155
  type: :runtime
155
156
  prerelease: false
156
- version_requirements: *70162674962180
157
- - !ruby/object:Gem::Dependency
157
+ version_requirements: *id013
158
+ - !ruby/object:Gem::Dependency
158
159
  name: json
159
- requirement: &70162674961760 !ruby/object:Gem::Requirement
160
+ requirement: &id014 !ruby/object:Gem::Requirement
160
161
  none: false
161
- requirements:
162
- - - ! '>='
163
- - !ruby/object:Gem::Version
164
- version: '0'
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: "0"
165
166
  type: :runtime
166
167
  prerelease: false
167
- version_requirements: *70162674961760
168
- - !ruby/object:Gem::Dependency
168
+ version_requirements: *id014
169
+ - !ruby/object:Gem::Dependency
169
170
  name: redis
170
- requirement: &70162674961340 !ruby/object:Gem::Requirement
171
+ requirement: &id015 !ruby/object:Gem::Requirement
171
172
  none: false
172
- requirements:
173
- - - ! '>='
174
- - !ruby/object:Gem::Version
175
- version: '0'
173
+ requirements:
174
+ - - ">="
175
+ - !ruby/object:Gem::Version
176
+ version: "0"
176
177
  type: :runtime
177
178
  prerelease: false
178
- version_requirements: *70162674961340
179
- - !ruby/object:Gem::Dependency
179
+ version_requirements: *id015
180
+ - !ruby/object:Gem::Dependency
180
181
  name: leaderboard
181
- requirement: &70162674960920 !ruby/object:Gem::Requirement
182
+ requirement: &id016 !ruby/object:Gem::Requirement
182
183
  none: false
183
- requirements:
184
- - - ! '>='
185
- - !ruby/object:Gem::Version
186
- version: '0'
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: "0"
187
188
  type: :runtime
188
189
  prerelease: false
189
- version_requirements: *70162674960920
190
+ version_requirements: *id016
190
191
  description: Activity feeds backed by Redis
191
- email:
192
+ email:
192
193
  - dczarnecki@agoragames.com
193
194
  executables: []
195
+
194
196
  extensions: []
197
+
195
198
  extra_rdoc_files: []
196
- files:
199
+
200
+ files:
197
201
  - .gitignore
198
202
  - .rvmrc
199
203
  - CHANGELOG.markdown
@@ -218,29 +222,38 @@ files:
218
222
  - spec/version_spec.rb
219
223
  homepage: https://github.com/agoragames/activity_feed
220
224
  licenses: []
225
+
221
226
  post_install_message:
222
227
  rdoc_options: []
223
- require_paths:
228
+
229
+ require_paths:
224
230
  - lib
225
- required_ruby_version: !ruby/object:Gem::Requirement
231
+ required_ruby_version: !ruby/object:Gem::Requirement
226
232
  none: false
227
- requirements:
228
- - - ! '>='
229
- - !ruby/object:Gem::Version
230
- version: '0'
231
- required_rubygems_version: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - ">="
235
+ - !ruby/object:Gem::Version
236
+ hash: 2506402929405040614
237
+ segments:
238
+ - 0
239
+ version: "0"
240
+ required_rubygems_version: !ruby/object:Gem::Requirement
232
241
  none: false
233
- requirements:
234
- - - ! '>='
235
- - !ruby/object:Gem::Version
236
- version: '0'
242
+ requirements:
243
+ - - ">="
244
+ - !ruby/object:Gem::Version
245
+ hash: 2506402929405040614
246
+ segments:
247
+ - 0
248
+ version: "0"
237
249
  requirements: []
250
+
238
251
  rubyforge_project: activity_feed
239
- rubygems_version: 1.8.6
252
+ rubygems_version: 1.8.11
240
253
  signing_key:
241
254
  specification_version: 3
242
255
  summary: Activity feeds backed by Redis
243
- test_files:
256
+ test_files:
244
257
  - spec/activity_feed/custom/item.rb
245
258
  - spec/activity_feed_spec.rb
246
259
  - spec/fabricators/item_fabricator.rb