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.
@@ -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
@@ -0,0 +1,7 @@
1
+ require 'rspec'
2
+ require_relative '../lib/has_redis_feed.rb'
3
+
4
+ RSpec.configure do |config|
5
+ config.color_enabled = true
6
+ config.formatter = 'documentation'
7
+ end
@@ -0,0 +1,5 @@
1
+ ActiveRecord::Base.establish_connection adapter: "sqlite3", database: ":memory:"
2
+
3
+ ActiveRecord::Migration.create_table :dummy_models do |t|
4
+ t.timestamps
5
+ end
@@ -0,0 +1,2 @@
1
+ class DummyModel < ActiveRecord::Base
2
+ end
@@ -0,0 +1,9 @@
1
+ port = 10000
2
+ $redis = Redis.new(:host => 'localhost', :port => port)
3
+ begin
4
+ $redis.flushall
5
+ rescue Errno::ECONNREFUSED
6
+ puts "Redis is not listening in port #{port}. Run:"
7
+ puts " redis-server ./spec/support/redis.conf"
8
+ exit
9
+ end
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