has_redis_feed 0.0.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/lib/has_redis_feed.rb +39 -0
- data/spec/has_redis_feed_spec.rb +52 -0
- data/spec/spec_helper.rb +7 -0
- data/spec/support/active_record.rb +5 -0
- data/spec/support/dummy_model.rb +2 -0
- data/spec/support/redis.rb +9 -0
- metadata +66 -0
@@ -0,0 +1,39 @@
|
|
1
|
+
$:.unshift "#{File.dirname(__FILE__)}/lib"
|
2
|
+
require "active_record"
|
3
|
+
require "redis"
|
4
|
+
|
5
|
+
module HasRedisFeed
|
6
|
+
FEED_COUNT = 4
|
7
|
+
|
8
|
+
def feed(count=FEED_COUNT)
|
9
|
+
encoded_result = $redis.zrevrange feed_key, 0, count
|
10
|
+
if encoded_result and encoded_result.size > 0
|
11
|
+
encoded_result.map { |r| self.decode(r) }
|
12
|
+
else
|
13
|
+
encoded_result
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def push_to_feed(h)
|
18
|
+
encoded_h = self.encode(h)
|
19
|
+
$redis.zadd feed_key, feed_timestamp, encoded_h
|
20
|
+
end
|
21
|
+
|
22
|
+
def feed_timestamp
|
23
|
+
"#{DateTime.now.to_i}"
|
24
|
+
end
|
25
|
+
|
26
|
+
def feed_key
|
27
|
+
"feed:#{self.class.to_s}:#{self.id}"
|
28
|
+
end
|
29
|
+
|
30
|
+
def encode(obj)
|
31
|
+
obj.to_json
|
32
|
+
end
|
33
|
+
|
34
|
+
def decode(json)
|
35
|
+
ActiveSupport::JSON.decode(json)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
ActiveRecord::Base.class_eval { include HasRedisFeed }
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'active_record'
|
3
|
+
require 'support/active_record'
|
4
|
+
require 'support/redis'
|
5
|
+
require 'support/dummy_model'
|
6
|
+
|
7
|
+
describe DummyModel do
|
8
|
+
before(:each) do
|
9
|
+
@dummy_model = DummyModel.create
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should have a key namespaced by the class name' do
|
13
|
+
@dummy_model.feed_key.should == "feed:DummyModel:#{@dummy_model.id}"
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should be able to push to its feed and retrieve the feed' do
|
17
|
+
@dummy_model.push_to_feed({'alphonso' => 'quigley'})
|
18
|
+
@dummy_model.feed.should == [{'alphonso' => 'quigley'}]
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should return the feed in descending created_at order' do
|
22
|
+
@dummy_model.stub(:feed_timestamp).and_return(1)
|
23
|
+
@dummy_model.push_to_feed({'alphonso' => 'old'})
|
24
|
+
@dummy_model.stub(:feed_timestamp).and_return(2)
|
25
|
+
@dummy_model.push_to_feed({'alphonso' => 'new'})
|
26
|
+
@dummy_model.feed.should == [{'alphonso' => 'new'}, {'alphonso' => 'old'}]
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should return the default of 5 items in the feed' do
|
30
|
+
(1..10).each {|i|
|
31
|
+
@dummy_model.stub(:feed_timestamp).and_return(i)
|
32
|
+
@dummy_model.push_to_feed({'a' => 'q' + i.to_s})
|
33
|
+
}
|
34
|
+
@dummy_model.feed.should == [{"a"=>"q10"}, {"a"=>"q9"}, {"a"=>"q8"}, {"a"=>"q7"}, {"a"=>"q6"}]
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should return the correct count' do
|
38
|
+
(1..10).each {|i|
|
39
|
+
@dummy_model.stub(:feed_timestamp).and_return(i)
|
40
|
+
@dummy_model.push_to_feed({'a' => 'q' + i.to_s})
|
41
|
+
}
|
42
|
+
@dummy_model.feed(1).should == [{"a"=>"q10"}, {"a"=>"q9"}]
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should encode hash' do @dummy_model.encode({alphonso: 'quigley'}).should == "{\"alphonso\":\"quigley\"}" end
|
46
|
+
|
47
|
+
it 'should decode hash' do
|
48
|
+
original_h = {'alphonso' => 'quigley'}
|
49
|
+
h = @dummy_model.encode(original_h)
|
50
|
+
@dummy_model.decode(h).should == original_h
|
51
|
+
end
|
52
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: has_redis_feed
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Peter Golov
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-06-29 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: &2152757760 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 2.10.0
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *2152757760
|
25
|
+
description: A simple gem for adding an activity feed to an ActiveRecord object
|
26
|
+
email: peter@golov.me
|
27
|
+
executables: []
|
28
|
+
extensions: []
|
29
|
+
extra_rdoc_files: []
|
30
|
+
files:
|
31
|
+
- lib/has_redis_feed.rb
|
32
|
+
- spec/has_redis_feed_spec.rb
|
33
|
+
- spec/spec_helper.rb
|
34
|
+
- spec/support/active_record.rb
|
35
|
+
- spec/support/dummy_model.rb
|
36
|
+
- spec/support/redis.rb
|
37
|
+
homepage: https://github.com/golov/has_redis_feed
|
38
|
+
licenses: []
|
39
|
+
post_install_message:
|
40
|
+
rdoc_options: []
|
41
|
+
require_paths:
|
42
|
+
- lib
|
43
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
44
|
+
none: false
|
45
|
+
requirements:
|
46
|
+
- - ! '>='
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
requirements: []
|
56
|
+
rubyforge_project:
|
57
|
+
rubygems_version: 1.8.17
|
58
|
+
signing_key:
|
59
|
+
specification_version: 3
|
60
|
+
summary: Redis Activity Feed
|
61
|
+
test_files:
|
62
|
+
- spec/has_redis_feed_spec.rb
|
63
|
+
- spec/spec_helper.rb
|
64
|
+
- spec/support/active_record.rb
|
65
|
+
- spec/support/dummy_model.rb
|
66
|
+
- spec/support/redis.rb
|