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,3 @@
1
+ *.gem
2
+ .bundle
3
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in redis_feed.gemspec
4
+ gemspec
@@ -0,0 +1,20 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ redis_feed (0.0.1)
5
+ SystemTimer
6
+ redis
7
+
8
+ GEM
9
+ remote: http://rubygems.org/
10
+ specs:
11
+ SystemTimer (1.2.3)
12
+ minitest (2.7.0)
13
+ redis (2.2.2)
14
+
15
+ PLATFORMS
16
+ ruby
17
+
18
+ DEPENDENCIES
19
+ minitest
20
+ redis_feed!
@@ -0,0 +1,20 @@
1
+ # Redis feed
2
+ [![Build Status](https://secure.travis-ci.org/joahking/redis_feed.png)](http://travis-ci.org/joahking/redis_feed)
3
+
4
+ A minimal activity feed written in redis. It is the feed in use in http://para.pent.es
5
+
6
+ # Theory
7
+
8
+ * http://www.quora.com/What-are-best-practices-for-building-something-like-a-News-Feed?q=news+feeds
9
+ * http://www.quora.com/What-are-the-scaling-issues-to-keep-in-mind-while-developing-a-social-network-feed
10
+ * https://github.com/agoragames/activity_feed
11
+ * http://jimneath.org/2011/03/24/using-redis-with-ruby-on-rails.html
12
+ * technoweeny presentation and the paper in it
13
+
14
+ ## TODO
15
+ * read events from inbox
16
+ * events partials
17
+ * move specs from para.pent.es in here
18
+ * DSL in models
19
+ * unsubscribe (I don't need it now)
20
+ * generators, rails integration
@@ -0,0 +1,11 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rake'
3
+ require 'rake/testtask'
4
+
5
+ task :default => :test
6
+
7
+ Rake::TestTask.new do |t|
8
+ t.libs << 'test'
9
+ t.test_files = FileList['test/**/*_test.rb']
10
+ t.verbose = true
11
+ end
@@ -0,0 +1,5 @@
1
+ require "redis_feed/version"
2
+ require "redis_feed/config"
3
+ require "redis_feed/db"
4
+ require "redis_feed/reader"
5
+ require "redis_feed/source"
@@ -0,0 +1,7 @@
1
+ module RedisFeed
2
+ class Config
3
+ class << self
4
+ attr_accessor :redis
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,11 @@
1
+ module RedisFeed
2
+ class NoRedisError < Exception; end
3
+
4
+ class DB
5
+ def self.method_missing method, *args #, &block)
6
+ raise NoRedisError unless Config.redis
7
+
8
+ Config.redis.send method, *args
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,8 @@
1
+ module RedisFeed
2
+ class Reader
3
+ def self.read(inbox)
4
+ #TODO test this
5
+ DB.lrange inbox, 0, 10
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,45 @@
1
+ module RedisFeed
2
+ module Source
3
+
4
+ def self.included(base)
5
+ base.class_eval do
6
+ after_save :push_event_to_readers
7
+ end
8
+ base.send :include, InstanceMethods
9
+ end
10
+
11
+ module InstanceMethods
12
+ #you might want a shorter key
13
+ def feed_key
14
+ "#{self.class.to_s}/#{id}"
15
+ end
16
+
17
+ def outboxes
18
+ "#{feed_key}/o"
19
+ end
20
+
21
+ def subscribe(reader)
22
+ DB.sadd outboxes, reader
23
+ end
24
+
25
+ def readers
26
+ DB.smembers outboxes
27
+ end
28
+
29
+ def push_event_to_readers
30
+ readers.each do |reader|
31
+ DB.lpush reader, event
32
+ end
33
+ end
34
+
35
+ def event
36
+ # o means object, # e means event
37
+ e = {:o => self.class.to_s, :id => self.id, :e => 'created'}
38
+ # u means user
39
+ e[:u] = @current_user.id if @current_user
40
+ e.to_json
41
+ end
42
+ end
43
+
44
+ end
45
+ end
@@ -0,0 +1,3 @@
1
+ module RedisFeed
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "redis_feed/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "redis_feed"
7
+ s.version = RedisFeed::VERSION
8
+ s.authors = ["Joaquin Rivera Padron"]
9
+ s.email = ["joahking@gmail.com"]
10
+ s.homepage = ""
11
+ s.summary = %q{A minimal feed using redis}
12
+ s.description = %q{A minimal feed using redis}
13
+
14
+ s.rubyforge_project = "redis_feed"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ # specify any dependencies here; for example:
22
+ s.add_development_dependency "rake"
23
+ s.add_development_dependency "minitest"
24
+ s.add_runtime_dependency "redis"
25
+ s.add_runtime_dependency "SystemTimer"
26
+ end
@@ -0,0 +1,11 @@
1
+ require 'test_helper'
2
+
3
+ module RedisFeed
4
+ describe DB do
5
+ describe "with no redis configured" do
6
+ it "must raise NoRedisError" do
7
+ lambda { DB.any_method }.must_raise(RedisFeed::NoRedisError)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,4 @@
1
+ require 'rubygems'
2
+ require 'minitest/spec'
3
+ require 'minitest/autorun'
4
+ require 'redis_feed'
metadata ADDED
@@ -0,0 +1,134 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: redis_feed
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Joaquin Rivera Padron
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-11-15 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rake
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
31
+ version: "0"
32
+ type: :development
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: minitest
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ hash: 3
43
+ segments:
44
+ - 0
45
+ version: "0"
46
+ type: :development
47
+ version_requirements: *id002
48
+ - !ruby/object:Gem::Dependency
49
+ name: redis
50
+ prerelease: false
51
+ requirement: &id003 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ hash: 3
57
+ segments:
58
+ - 0
59
+ version: "0"
60
+ type: :runtime
61
+ version_requirements: *id003
62
+ - !ruby/object:Gem::Dependency
63
+ name: SystemTimer
64
+ prerelease: false
65
+ requirement: &id004 !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ hash: 3
71
+ segments:
72
+ - 0
73
+ version: "0"
74
+ type: :runtime
75
+ version_requirements: *id004
76
+ description: A minimal feed using redis
77
+ email:
78
+ - joahking@gmail.com
79
+ executables: []
80
+
81
+ extensions: []
82
+
83
+ extra_rdoc_files: []
84
+
85
+ files:
86
+ - .gitignore
87
+ - Gemfile
88
+ - Gemfile.lock
89
+ - README.md
90
+ - Rakefile
91
+ - lib/redis_feed.rb
92
+ - lib/redis_feed/config.rb
93
+ - lib/redis_feed/db.rb
94
+ - lib/redis_feed/reader.rb
95
+ - lib/redis_feed/source.rb
96
+ - lib/redis_feed/version.rb
97
+ - redis_feed.gemspec
98
+ - test/redis_feed/db_test.rb
99
+ - test/test_helper.rb
100
+ homepage: ""
101
+ licenses: []
102
+
103
+ post_install_message:
104
+ rdoc_options: []
105
+
106
+ require_paths:
107
+ - lib
108
+ required_ruby_version: !ruby/object:Gem::Requirement
109
+ none: false
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ hash: 3
114
+ segments:
115
+ - 0
116
+ version: "0"
117
+ required_rubygems_version: !ruby/object:Gem::Requirement
118
+ none: false
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ hash: 3
123
+ segments:
124
+ - 0
125
+ version: "0"
126
+ requirements: []
127
+
128
+ rubyforge_project: redis_feed
129
+ rubygems_version: 1.8.11
130
+ signing_key:
131
+ specification_version: 3
132
+ summary: A minimal feed using redis
133
+ test_files: []
134
+