seymour 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +8 -0
- data/CHANGELOG.md +26 -0
- data/Gemfile +23 -0
- data/Gemfile.lock +195 -0
- data/Guardfile +5 -0
- data/TODO +7 -0
- data/lib/seymour/distributable.rb +11 -9
- data/lib/seymour/feed.rb +21 -11
- data/lib/seymour/version.rb +1 -1
- data/seymour.gemspec +34 -0
- data/spec/dummy/config/initializers/session_store.rb +1 -1
- data/spec/dummy/config/initializers/wrap_parameters.rb +1 -1
- data/spec/dummy/db/schema.rb +0 -1
- data/spec/seymour/distributable_spec.rb +17 -4
- data/spec/seymour/feed_spec.rb +22 -1
- metadata +161 -173
- data/lib/seymour/batched_user_enumerator.rb +0 -21
data/.gitignore
ADDED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
## 0.0.6 (2011-10-24)
|
2
|
+
|
3
|
+
* Ruby 1.8.7 compatiblity
|
4
|
+
|
5
|
+
## 0.0.5 (2011-10-24)
|
6
|
+
|
7
|
+
* Support rails ~> 3.0
|
8
|
+
* Remove engine
|
9
|
+
|
10
|
+
## 0.0.4 (2011-10-19)
|
11
|
+
|
12
|
+
* Support batched enumeration for activity distribution
|
13
|
+
* Additional specs for activity feed
|
14
|
+
|
15
|
+
## 0.0.3 (2011-10-16)
|
16
|
+
|
17
|
+
* Added ability to render activity outside request cycle
|
18
|
+
* Using factory girl in specs
|
19
|
+
|
20
|
+
## 0.0.2 (2011-10-16)
|
21
|
+
|
22
|
+
* Added activity distribution to feeds based on 'audience' declarations
|
23
|
+
|
24
|
+
## 0.0.1 (2011-10-13)
|
25
|
+
|
26
|
+
* provide activity feed base class
|
data/Gemfile
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
source "http://rubygems.org"
|
2
|
+
|
3
|
+
# Declare your gem's dependencies in seymour.gemspec.
|
4
|
+
# Bundler will treat runtime dependencies like base dependencies, and
|
5
|
+
# development dependencies will be added by default to the :development group.
|
6
|
+
gemspec
|
7
|
+
|
8
|
+
# Declare any dependencies that are still in development here instead of in
|
9
|
+
# your gemspec. These might include edge Rails or gems from your path or
|
10
|
+
# Git. Remember to move these dependencies to your gemspec before releasing
|
11
|
+
# your gem to rubygems.org.
|
12
|
+
|
13
|
+
# To use debugger
|
14
|
+
group :test, :development do
|
15
|
+
gem 'ruby-debug19', :require => 'ruby-debug', :platform => :ruby_19
|
16
|
+
gem 'ruby-debug', :platform => :ruby_18
|
17
|
+
gem 'guard'
|
18
|
+
gem 'guard-rspec'
|
19
|
+
gem 'rb-fsevent' # Makes guard better
|
20
|
+
gem 'growl_notify' # Makes guard better
|
21
|
+
gem 'launchy'
|
22
|
+
gem 'yard'
|
23
|
+
end
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,195 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
seymour (0.0.6)
|
5
|
+
rails (~> 3.0)
|
6
|
+
redis-namespace
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: http://rubygems.org/
|
10
|
+
specs:
|
11
|
+
actionmailer (3.1.1)
|
12
|
+
actionpack (= 3.1.1)
|
13
|
+
mail (~> 2.3.0)
|
14
|
+
actionpack (3.1.1)
|
15
|
+
activemodel (= 3.1.1)
|
16
|
+
activesupport (= 3.1.1)
|
17
|
+
builder (~> 3.0.0)
|
18
|
+
erubis (~> 2.7.0)
|
19
|
+
i18n (~> 0.6)
|
20
|
+
rack (~> 1.3.2)
|
21
|
+
rack-cache (~> 1.1)
|
22
|
+
rack-mount (~> 0.8.2)
|
23
|
+
rack-test (~> 0.6.1)
|
24
|
+
sprockets (~> 2.0.2)
|
25
|
+
activemodel (3.1.1)
|
26
|
+
activesupport (= 3.1.1)
|
27
|
+
builder (~> 3.0.0)
|
28
|
+
i18n (~> 0.6)
|
29
|
+
activerecord (3.1.1)
|
30
|
+
activemodel (= 3.1.1)
|
31
|
+
activesupport (= 3.1.1)
|
32
|
+
arel (~> 2.2.1)
|
33
|
+
tzinfo (~> 0.3.29)
|
34
|
+
activeresource (3.1.1)
|
35
|
+
activemodel (= 3.1.1)
|
36
|
+
activesupport (= 3.1.1)
|
37
|
+
activesupport (3.1.1)
|
38
|
+
multi_json (~> 1.0)
|
39
|
+
addressable (2.2.6)
|
40
|
+
ammeter (0.2.0)
|
41
|
+
activesupport (~> 3.0)
|
42
|
+
railties (~> 3.0)
|
43
|
+
rspec (~> 2.2)
|
44
|
+
rspec-rails (~> 2.2)
|
45
|
+
archive-tar-minitar (0.5.2)
|
46
|
+
arel (2.2.1)
|
47
|
+
builder (3.0.0)
|
48
|
+
capybara (1.1.1)
|
49
|
+
mime-types (>= 1.16)
|
50
|
+
nokogiri (>= 1.3.3)
|
51
|
+
rack (>= 1.0.0)
|
52
|
+
rack-test (>= 0.5.4)
|
53
|
+
selenium-webdriver (~> 2.0)
|
54
|
+
xpath (~> 0.1.4)
|
55
|
+
childprocess (0.2.2)
|
56
|
+
ffi (~> 1.0.6)
|
57
|
+
columnize (0.3.4)
|
58
|
+
database_cleaner (0.6.7)
|
59
|
+
diff-lcs (1.1.3)
|
60
|
+
erubis (2.7.0)
|
61
|
+
factory_girl (2.1.0)
|
62
|
+
factory_girl_rails (1.2.0)
|
63
|
+
factory_girl (~> 2.1.0)
|
64
|
+
railties (>= 3.0.0)
|
65
|
+
ffi (1.0.9)
|
66
|
+
growl_notify (0.0.3)
|
67
|
+
rb-appscript
|
68
|
+
guard (0.8.8)
|
69
|
+
thor (~> 0.14.6)
|
70
|
+
guard-rspec (0.5.0)
|
71
|
+
guard (>= 0.8.4)
|
72
|
+
hike (1.2.1)
|
73
|
+
i18n (0.6.0)
|
74
|
+
json (1.6.1)
|
75
|
+
json_pure (1.6.1)
|
76
|
+
launchy (2.0.5)
|
77
|
+
addressable (~> 2.2.6)
|
78
|
+
linecache (0.46)
|
79
|
+
rbx-require-relative (> 0.0.4)
|
80
|
+
linecache19 (0.5.12)
|
81
|
+
ruby_core_source (>= 0.1.4)
|
82
|
+
mail (2.3.0)
|
83
|
+
i18n (>= 0.4.0)
|
84
|
+
mime-types (~> 1.16)
|
85
|
+
treetop (~> 1.4.8)
|
86
|
+
mime-types (1.16)
|
87
|
+
multi_json (1.0.3)
|
88
|
+
nokogiri (1.5.0)
|
89
|
+
polyglot (0.3.2)
|
90
|
+
rack (1.3.3)
|
91
|
+
rack-cache (1.1)
|
92
|
+
rack (>= 0.4)
|
93
|
+
rack-mount (0.8.3)
|
94
|
+
rack (>= 1.0.0)
|
95
|
+
rack-ssl (1.3.2)
|
96
|
+
rack
|
97
|
+
rack-test (0.6.1)
|
98
|
+
rack (>= 1.0)
|
99
|
+
rails (3.1.1)
|
100
|
+
actionmailer (= 3.1.1)
|
101
|
+
actionpack (= 3.1.1)
|
102
|
+
activerecord (= 3.1.1)
|
103
|
+
activeresource (= 3.1.1)
|
104
|
+
activesupport (= 3.1.1)
|
105
|
+
bundler (~> 1.0)
|
106
|
+
railties (= 3.1.1)
|
107
|
+
railties (3.1.1)
|
108
|
+
actionpack (= 3.1.1)
|
109
|
+
activesupport (= 3.1.1)
|
110
|
+
rack-ssl (~> 1.3.2)
|
111
|
+
rake (>= 0.8.7)
|
112
|
+
rdoc (~> 3.4)
|
113
|
+
thor (~> 0.14.6)
|
114
|
+
rake (0.9.2.2)
|
115
|
+
rb-appscript (0.6.1)
|
116
|
+
rb-fsevent (0.4.3.1)
|
117
|
+
rbx-require-relative (0.0.5)
|
118
|
+
rdoc (3.10)
|
119
|
+
json (~> 1.4)
|
120
|
+
redis (2.2.2)
|
121
|
+
redis-namespace (1.1.0)
|
122
|
+
redis (< 3.0.0)
|
123
|
+
rspec (2.6.0)
|
124
|
+
rspec-core (~> 2.6.0)
|
125
|
+
rspec-expectations (~> 2.6.0)
|
126
|
+
rspec-mocks (~> 2.6.0)
|
127
|
+
rspec-core (2.6.4)
|
128
|
+
rspec-expectations (2.6.0)
|
129
|
+
diff-lcs (~> 1.1.2)
|
130
|
+
rspec-mocks (2.6.0)
|
131
|
+
rspec-rails (2.6.1)
|
132
|
+
actionpack (~> 3.0)
|
133
|
+
activesupport (~> 3.0)
|
134
|
+
railties (~> 3.0)
|
135
|
+
rspec (~> 2.6.0)
|
136
|
+
ruby-debug (0.10.4)
|
137
|
+
columnize (>= 0.1)
|
138
|
+
ruby-debug-base (~> 0.10.4.0)
|
139
|
+
ruby-debug-base (0.10.4)
|
140
|
+
linecache (>= 0.3)
|
141
|
+
ruby-debug-base19 (0.11.25)
|
142
|
+
columnize (>= 0.3.1)
|
143
|
+
linecache19 (>= 0.5.11)
|
144
|
+
ruby_core_source (>= 0.1.4)
|
145
|
+
ruby-debug19 (0.11.6)
|
146
|
+
columnize (>= 0.3.1)
|
147
|
+
linecache19 (>= 0.5.11)
|
148
|
+
ruby-debug-base19 (>= 0.11.19)
|
149
|
+
ruby_core_source (0.1.5)
|
150
|
+
archive-tar-minitar (>= 0.5.2)
|
151
|
+
rubyzip (0.9.4)
|
152
|
+
selenium-webdriver (2.6.0)
|
153
|
+
childprocess (>= 0.2.1)
|
154
|
+
ffi (>= 1.0.7)
|
155
|
+
json_pure
|
156
|
+
rubyzip
|
157
|
+
sprockets (2.0.2)
|
158
|
+
hike (~> 1.2)
|
159
|
+
rack (~> 1.0)
|
160
|
+
tilt (~> 1.1, != 1.3.0)
|
161
|
+
sqlite3 (1.3.4)
|
162
|
+
steak (2.0.0)
|
163
|
+
capybara (>= 1.0.0)
|
164
|
+
rspec-rails (>= 2.5.0)
|
165
|
+
thor (0.14.6)
|
166
|
+
tilt (1.3.3)
|
167
|
+
treetop (1.4.10)
|
168
|
+
polyglot
|
169
|
+
polyglot (>= 0.3.1)
|
170
|
+
tzinfo (0.3.30)
|
171
|
+
xpath (0.1.4)
|
172
|
+
nokogiri (~> 1.3)
|
173
|
+
yard (0.7.3)
|
174
|
+
|
175
|
+
PLATFORMS
|
176
|
+
ruby
|
177
|
+
|
178
|
+
DEPENDENCIES
|
179
|
+
ammeter
|
180
|
+
capybara
|
181
|
+
database_cleaner
|
182
|
+
factory_girl_rails
|
183
|
+
growl_notify
|
184
|
+
guard
|
185
|
+
guard-rspec
|
186
|
+
launchy
|
187
|
+
rb-fsevent
|
188
|
+
rspec
|
189
|
+
rspec-rails
|
190
|
+
ruby-debug
|
191
|
+
ruby-debug19
|
192
|
+
seymour!
|
193
|
+
sqlite3
|
194
|
+
steak
|
195
|
+
yard
|
data/Guardfile
ADDED
data/TODO
ADDED
@@ -14,7 +14,7 @@ module Seymour
|
|
14
14
|
def audience(*names)
|
15
15
|
options = names.extract_options!
|
16
16
|
names.each do |name|
|
17
|
-
feed_name = options.delete(:feed) || "#{name.downcase.
|
17
|
+
feed_name = options.delete(:feed) || "#{name.to_s.downcase.singularize}_feed".camelize
|
18
18
|
audience_mappings[name] = [feed_name, options]
|
19
19
|
end
|
20
20
|
end
|
@@ -24,7 +24,7 @@ module Seymour
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def feed_class_names
|
27
|
-
audience_mappings.values.map(&:first)
|
27
|
+
audience_mappings.values.map(&:first).flatten
|
28
28
|
end
|
29
29
|
|
30
30
|
def feeds_for(activity)
|
@@ -34,7 +34,7 @@ module Seymour
|
|
34
34
|
def distribute(activity)
|
35
35
|
tap_feeds_for(activity) { |feed| feed.push(activity) }
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
def remove(activity)
|
39
39
|
tap_feeds_for(activity) { |feed| feed.remove(activity) }
|
40
40
|
end
|
@@ -44,11 +44,13 @@ module Seymour
|
|
44
44
|
def tap_feeds_for(activity, &block)
|
45
45
|
[].tap do |feeds|
|
46
46
|
audience_mappings.each do |audience_name, mapping|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
47
|
+
feed_classes, options = mapping
|
48
|
+
[feed_classes].flatten.each do |feed_class_name|
|
49
|
+
try_find_each(activity.send(audience_name), options) do |member|
|
50
|
+
feed = feed_class_name.constantize.new(member)
|
51
|
+
yield feed if block_given?
|
52
|
+
feeds << feed
|
53
|
+
end
|
52
54
|
end
|
53
55
|
end
|
54
56
|
end
|
@@ -61,7 +63,7 @@ module Seymour
|
|
61
63
|
def try_find_each(activity_audience, options = {}, &block)
|
62
64
|
if defined? activity_audience.find_each
|
63
65
|
options[:batch_size] ||= DEFAULT_BATCH_SIZE
|
64
|
-
|
66
|
+
|
65
67
|
# TODO support exclusive scope
|
66
68
|
# activity_audience.find_each(options) do
|
67
69
|
# relation.send(:with_exclusive_scope) &block
|
data/lib/seymour/feed.rb
CHANGED
@@ -27,8 +27,14 @@ module Seymour
|
|
27
27
|
redis.lrange(key, 0, max_size).map{|id| id.to_i }
|
28
28
|
end
|
29
29
|
|
30
|
-
def push(activity
|
31
|
-
perform_push(activity.id
|
30
|
+
def push(activity)
|
31
|
+
perform_push(activity.id) if should_push?(activity)
|
32
|
+
end
|
33
|
+
|
34
|
+
def bulk_push(activities)
|
35
|
+
activities.each do |activity|
|
36
|
+
push(activity)
|
37
|
+
end
|
32
38
|
end
|
33
39
|
|
34
40
|
def remove(activity)
|
@@ -39,15 +45,19 @@ module Seymour
|
|
39
45
|
redis.lrem(key, 0, activity_id)
|
40
46
|
end
|
41
47
|
|
42
|
-
def
|
43
|
-
|
48
|
+
def sort!(options = {})
|
49
|
+
sort({ :order => "DESC", :store => key }.merge(options)) # replaces itself with sorted list
|
50
|
+
end
|
44
51
|
|
45
|
-
|
52
|
+
def sort(options = {})
|
53
|
+
redis.sort(key, options)
|
54
|
+
end
|
46
55
|
|
47
|
-
|
48
|
-
|
49
|
-
|
56
|
+
def sorted_push(activities)
|
57
|
+
bulk_push(activities)
|
58
|
+
sort!
|
50
59
|
end
|
60
|
+
alias_method :insert_and_order, :sorted_push
|
51
61
|
|
52
62
|
protected
|
53
63
|
|
@@ -80,11 +90,11 @@ module Seymour
|
|
80
90
|
end
|
81
91
|
|
82
92
|
def should_push?(activity)
|
83
|
-
|
93
|
+
!activity_ids.include?(activity.id)
|
84
94
|
end
|
85
95
|
|
86
|
-
def perform_push(
|
87
|
-
redis.
|
96
|
+
def perform_push(id)
|
97
|
+
redis.lpush(key, id)
|
88
98
|
redis.ltrim(key, 0, max_size)
|
89
99
|
end
|
90
100
|
end
|
data/lib/seymour/version.rb
CHANGED
data/seymour.gemspec
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
|
4
|
+
# Maintain your gem's version:
|
5
|
+
require "seymour/version"
|
6
|
+
|
7
|
+
# Describe your gem and declare its dependencies:
|
8
|
+
Gem::Specification.new do |s|
|
9
|
+
s.name = "seymour"
|
10
|
+
s.version = Seymour::VERSION
|
11
|
+
s.authors = ["Ross Kaffenberger"]
|
12
|
+
s.email = ["rosskaff@gmail.com"]
|
13
|
+
s.homepage = ""
|
14
|
+
s.summary = %q{Feed me activities, Seymour, please!}
|
15
|
+
s.description = %q{Activity feed distribution for Rails applications}
|
16
|
+
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
s.files = `git ls-files`.split("\n")
|
19
|
+
# s.files = Dir["{lib}/**/*"] + ["MIT-LICENSE", "Rakefile", "README.md"]
|
20
|
+
s.test_files = `git ls-files -- {spec}/*`.split("\n")
|
21
|
+
# s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
22
|
+
|
23
|
+
s.add_dependency "rails", "~> 3.0"
|
24
|
+
s.add_dependency "redis-namespace"
|
25
|
+
|
26
|
+
s.add_development_dependency "rspec"
|
27
|
+
s.add_development_dependency "rspec-rails"
|
28
|
+
s.add_development_dependency 'steak'
|
29
|
+
s.add_development_dependency 'capybara'
|
30
|
+
s.add_development_dependency 'ammeter'
|
31
|
+
s.add_development_dependency 'database_cleaner'
|
32
|
+
s.add_development_dependency 'factory_girl_rails'
|
33
|
+
s.add_development_dependency "sqlite3"
|
34
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# Be sure to restart your server when you modify this file.
|
2
2
|
|
3
|
-
Dummy::Application.config.session_store :cookie_store, key
|
3
|
+
Dummy::Application.config.session_store :cookie_store, :key => '_dummy_session'
|
4
4
|
|
5
5
|
# Use the database for sessions instead of the cookie-based default,
|
6
6
|
# which shouldn't be used to store highly confidential information
|
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
|
7
7
|
ActiveSupport.on_load(:action_controller) do
|
8
|
-
wrap_parameters format
|
8
|
+
wrap_parameters :format => [:json]
|
9
9
|
end
|
10
10
|
|
11
11
|
# Disable root element in JSON by default.
|
data/spec/dummy/db/schema.rb
CHANGED
@@ -5,10 +5,19 @@ describe Seymour::Distributable do
|
|
5
5
|
class DistributableActivity
|
6
6
|
include Seymour::Distributable
|
7
7
|
audience :users, :admin
|
8
|
-
audience :events,
|
8
|
+
audience :events, :batch_size => 100
|
9
9
|
audience :soccer_teams, :feed => "TeamFeed"
|
10
|
+
audience :followers, :feed => %w[ DashboardFeed EmailDigest ]
|
10
11
|
|
11
|
-
|
12
|
+
AUDIENCES = [:users, :admin, :soccer_teams, :events, :followers]
|
13
|
+
|
14
|
+
AUDIENCES.each do |audience_name|
|
15
|
+
attr_writer audience_name
|
16
|
+
|
17
|
+
define_method(audience_name) do
|
18
|
+
instance_variable_get("@#{audience_name}") || []
|
19
|
+
end
|
20
|
+
end
|
12
21
|
end
|
13
22
|
|
14
23
|
describe "class methods" do
|
@@ -29,14 +38,18 @@ describe Seymour::Distributable do
|
|
29
38
|
feed_class_names.should include('EventFeed')
|
30
39
|
end
|
31
40
|
|
41
|
+
it "should support multiple feeds for an audience" do
|
42
|
+
DistributableActivity.audience_names.should include(:followers)
|
43
|
+
DistributableActivity.feed_class_names.should include("DashboardFeed")
|
44
|
+
DistributableActivity.feed_class_names.should include("EmailDigest")
|
45
|
+
end
|
46
|
+
|
32
47
|
end
|
33
48
|
|
34
49
|
describe "feeding" do
|
35
50
|
let(:activity) { DistributableActivity.new }
|
36
51
|
|
37
52
|
before(:each) do
|
38
|
-
activity.soccer_teams = []
|
39
|
-
activity.events = []
|
40
53
|
@user = mock_model(User)
|
41
54
|
@admin = mock_model(User)
|
42
55
|
activity.users = [@user]
|
data/spec/seymour/feed_spec.rb
CHANGED
@@ -56,6 +56,27 @@ describe Seymour::Feed do
|
|
56
56
|
feed.activity_ids.should == [123]
|
57
57
|
new_feed.activity_ids.should == [456]
|
58
58
|
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "bulk_push" do
|
63
|
+
it "should accept multiple values" do
|
64
|
+
feed.bulk_push [mock_model(Activity, :id => 123), mock_model(Activity, :id => 456)]
|
65
|
+
feed.activity_ids.should == [456, 123]
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should not append duplicates" do
|
69
|
+
feed.bulk_push [mock_model(Activity, :id => 123), mock_model(Activity, :id => 456), mock_model(Activity, :id => 123)]
|
70
|
+
feed.activity_ids.should == [456, 123]
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe "sort" do
|
75
|
+
it "should sort list in desc order by default" do
|
76
|
+
feed.bulk_push [mock_model(Activity, :id => 456), mock_model(Activity, :id => 123)]
|
77
|
+
feed.sort!
|
78
|
+
feed.activity_ids.should == [456, 123]
|
79
|
+
end
|
59
80
|
end
|
60
81
|
|
61
82
|
describe "insert_and_order" do
|
@@ -77,7 +98,7 @@ describe Seymour::Feed do
|
|
77
98
|
feed.activity_ids.should == [789, 456, 234, 123]
|
78
99
|
end
|
79
100
|
|
80
|
-
it "should
|
101
|
+
it "should not allow duplicates" do
|
81
102
|
feed.push mock_model(Activity, :id => 123)
|
82
103
|
feed.push mock_model(Activity, :id => 456)
|
83
104
|
|
metadata
CHANGED
@@ -1,138 +1,187 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: seymour
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 19
|
5
5
|
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 6
|
10
|
+
version: 0.0.6
|
6
11
|
platform: ruby
|
7
|
-
authors:
|
12
|
+
authors:
|
8
13
|
- Ross Kaffenberger
|
9
14
|
autorequire:
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
+
|
18
|
+
date: 2011-10-25 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
17
22
|
none: false
|
18
|
-
requirements:
|
23
|
+
requirements:
|
19
24
|
- - ~>
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
hash: 7
|
27
|
+
segments:
|
28
|
+
- 3
|
29
|
+
- 0
|
30
|
+
version: "3.0"
|
31
|
+
requirement: *id001
|
32
|
+
prerelease: false
|
33
|
+
name: rails
|
22
34
|
type: :runtime
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
37
|
+
none: false
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
hash: 3
|
42
|
+
segments:
|
43
|
+
- 0
|
44
|
+
version: "0"
|
45
|
+
requirement: *id002
|
23
46
|
prerelease: false
|
24
|
-
version_requirements: *70116777384080
|
25
|
-
- !ruby/object:Gem::Dependency
|
26
47
|
name: redis-namespace
|
27
|
-
requirement: &70116777383560 !ruby/object:Gem::Requirement
|
28
|
-
none: false
|
29
|
-
requirements:
|
30
|
-
- - ! '>='
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
version: '0'
|
33
48
|
type: :runtime
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
hash: 3
|
56
|
+
segments:
|
57
|
+
- 0
|
58
|
+
version: "0"
|
59
|
+
requirement: *id003
|
34
60
|
prerelease: false
|
35
|
-
version_requirements: *70116777383560
|
36
|
-
- !ruby/object:Gem::Dependency
|
37
61
|
name: rspec
|
38
|
-
requirement: &70116777383100 !ruby/object:Gem::Requirement
|
39
|
-
none: false
|
40
|
-
requirements:
|
41
|
-
- - ! '>='
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
version: '0'
|
44
62
|
type: :development
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
hash: 3
|
70
|
+
segments:
|
71
|
+
- 0
|
72
|
+
version: "0"
|
73
|
+
requirement: *id004
|
45
74
|
prerelease: false
|
46
|
-
version_requirements: *70116777383100
|
47
|
-
- !ruby/object:Gem::Dependency
|
48
75
|
name: rspec-rails
|
49
|
-
requirement: &70116777382580 !ruby/object:Gem::Requirement
|
50
|
-
none: false
|
51
|
-
requirements:
|
52
|
-
- - ! '>='
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
76
|
type: :development
|
77
|
+
- !ruby/object:Gem::Dependency
|
78
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
79
|
+
none: false
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
hash: 3
|
84
|
+
segments:
|
85
|
+
- 0
|
86
|
+
version: "0"
|
87
|
+
requirement: *id005
|
56
88
|
prerelease: false
|
57
|
-
version_requirements: *70116777382580
|
58
|
-
- !ruby/object:Gem::Dependency
|
59
89
|
name: steak
|
60
|
-
requirement: &70116777382160 !ruby/object:Gem::Requirement
|
61
|
-
none: false
|
62
|
-
requirements:
|
63
|
-
- - ! '>='
|
64
|
-
- !ruby/object:Gem::Version
|
65
|
-
version: '0'
|
66
90
|
type: :development
|
91
|
+
- !ruby/object:Gem::Dependency
|
92
|
+
version_requirements: &id006 !ruby/object:Gem::Requirement
|
93
|
+
none: false
|
94
|
+
requirements:
|
95
|
+
- - ">="
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
hash: 3
|
98
|
+
segments:
|
99
|
+
- 0
|
100
|
+
version: "0"
|
101
|
+
requirement: *id006
|
67
102
|
prerelease: false
|
68
|
-
version_requirements: *70116777382160
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
103
|
name: capybara
|
71
|
-
requirement: &70116777381700 !ruby/object:Gem::Requirement
|
72
|
-
none: false
|
73
|
-
requirements:
|
74
|
-
- - ! '>='
|
75
|
-
- !ruby/object:Gem::Version
|
76
|
-
version: '0'
|
77
104
|
type: :development
|
105
|
+
- !ruby/object:Gem::Dependency
|
106
|
+
version_requirements: &id007 !ruby/object:Gem::Requirement
|
107
|
+
none: false
|
108
|
+
requirements:
|
109
|
+
- - ">="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
hash: 3
|
112
|
+
segments:
|
113
|
+
- 0
|
114
|
+
version: "0"
|
115
|
+
requirement: *id007
|
78
116
|
prerelease: false
|
79
|
-
version_requirements: *70116777381700
|
80
|
-
- !ruby/object:Gem::Dependency
|
81
117
|
name: ammeter
|
82
|
-
requirement: &70116777381280 !ruby/object:Gem::Requirement
|
83
|
-
none: false
|
84
|
-
requirements:
|
85
|
-
- - ! '>='
|
86
|
-
- !ruby/object:Gem::Version
|
87
|
-
version: '0'
|
88
118
|
type: :development
|
119
|
+
- !ruby/object:Gem::Dependency
|
120
|
+
version_requirements: &id008 !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ">="
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
hash: 3
|
126
|
+
segments:
|
127
|
+
- 0
|
128
|
+
version: "0"
|
129
|
+
requirement: *id008
|
89
130
|
prerelease: false
|
90
|
-
version_requirements: *70116777381280
|
91
|
-
- !ruby/object:Gem::Dependency
|
92
131
|
name: database_cleaner
|
93
|
-
requirement: &70116777380840 !ruby/object:Gem::Requirement
|
94
|
-
none: false
|
95
|
-
requirements:
|
96
|
-
- - ! '>='
|
97
|
-
- !ruby/object:Gem::Version
|
98
|
-
version: '0'
|
99
132
|
type: :development
|
133
|
+
- !ruby/object:Gem::Dependency
|
134
|
+
version_requirements: &id009 !ruby/object:Gem::Requirement
|
135
|
+
none: false
|
136
|
+
requirements:
|
137
|
+
- - ">="
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
hash: 3
|
140
|
+
segments:
|
141
|
+
- 0
|
142
|
+
version: "0"
|
143
|
+
requirement: *id009
|
100
144
|
prerelease: false
|
101
|
-
version_requirements: *70116777380840
|
102
|
-
- !ruby/object:Gem::Dependency
|
103
145
|
name: factory_girl_rails
|
104
|
-
requirement: &70116777380280 !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
|
-
requirements:
|
107
|
-
- - ! '>='
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
version: '0'
|
110
146
|
type: :development
|
147
|
+
- !ruby/object:Gem::Dependency
|
148
|
+
version_requirements: &id010 !ruby/object:Gem::Requirement
|
149
|
+
none: false
|
150
|
+
requirements:
|
151
|
+
- - ">="
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
hash: 3
|
154
|
+
segments:
|
155
|
+
- 0
|
156
|
+
version: "0"
|
157
|
+
requirement: *id010
|
111
158
|
prerelease: false
|
112
|
-
version_requirements: *70116777380280
|
113
|
-
- !ruby/object:Gem::Dependency
|
114
159
|
name: sqlite3
|
115
|
-
requirement: &70116777379860 !ruby/object:Gem::Requirement
|
116
|
-
none: false
|
117
|
-
requirements:
|
118
|
-
- - ! '>='
|
119
|
-
- !ruby/object:Gem::Version
|
120
|
-
version: '0'
|
121
160
|
type: :development
|
122
|
-
prerelease: false
|
123
|
-
version_requirements: *70116777379860
|
124
161
|
description: Activity feed distribution for Rails applications
|
125
|
-
email:
|
162
|
+
email:
|
126
163
|
- rosskaff@gmail.com
|
127
164
|
executables: []
|
165
|
+
|
128
166
|
extensions: []
|
167
|
+
|
129
168
|
extra_rdoc_files: []
|
130
|
-
|
169
|
+
|
170
|
+
files:
|
171
|
+
- .gitignore
|
172
|
+
- CHANGELOG.md
|
173
|
+
- Gemfile
|
174
|
+
- Gemfile.lock
|
175
|
+
- Guardfile
|
176
|
+
- MIT-LICENSE
|
177
|
+
- README.md
|
178
|
+
- Rakefile
|
179
|
+
- TODO
|
180
|
+
- lib/generators/seymour/feed/USAGE
|
131
181
|
- lib/generators/seymour/feed/feed_generator.rb
|
132
182
|
- lib/generators/seymour/feed/templates/feed.rb
|
133
|
-
- lib/
|
183
|
+
- lib/seymour.rb
|
134
184
|
- lib/seymour/acts_as_activity.rb
|
135
|
-
- lib/seymour/batched_user_enumerator.rb
|
136
185
|
- lib/seymour/distributable.rb
|
137
186
|
- lib/seymour/engine.rb
|
138
187
|
- lib/seymour/feed.rb
|
@@ -140,11 +189,8 @@ files:
|
|
140
189
|
- lib/seymour/render_controller.rb
|
141
190
|
- lib/seymour/renderable.rb
|
142
191
|
- lib/seymour/version.rb
|
143
|
-
- lib/seymour.rb
|
144
192
|
- lib/tasks/seymour_tasks.rake
|
145
|
-
-
|
146
|
-
- Rakefile
|
147
|
-
- README.md
|
193
|
+
- seymour.gemspec
|
148
194
|
- spec/dummy/Rakefile
|
149
195
|
- spec/dummy/app/assets/javascripts/application.js
|
150
196
|
- spec/dummy/app/assets/stylesheets/application.css
|
@@ -207,97 +253,39 @@ files:
|
|
207
253
|
- spec/spec_helper.rb
|
208
254
|
- spec/support/capybara.rb
|
209
255
|
- spec/support/redis.rb
|
210
|
-
homepage:
|
256
|
+
homepage: ""
|
211
257
|
licenses: []
|
258
|
+
|
212
259
|
post_install_message:
|
213
260
|
rdoc_options: []
|
214
|
-
|
261
|
+
|
262
|
+
require_paths:
|
215
263
|
- lib
|
216
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
264
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
217
265
|
none: false
|
218
|
-
requirements:
|
219
|
-
- -
|
220
|
-
- !ruby/object:Gem::Version
|
221
|
-
|
222
|
-
segments:
|
266
|
+
requirements:
|
267
|
+
- - ">="
|
268
|
+
- !ruby/object:Gem::Version
|
269
|
+
hash: 3
|
270
|
+
segments:
|
223
271
|
- 0
|
224
|
-
|
225
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
272
|
+
version: "0"
|
273
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
226
274
|
none: false
|
227
|
-
requirements:
|
228
|
-
- -
|
229
|
-
- !ruby/object:Gem::Version
|
230
|
-
|
231
|
-
segments:
|
275
|
+
requirements:
|
276
|
+
- - ">="
|
277
|
+
- !ruby/object:Gem::Version
|
278
|
+
hash: 3
|
279
|
+
segments:
|
232
280
|
- 0
|
233
|
-
|
281
|
+
version: "0"
|
234
282
|
requirements: []
|
283
|
+
|
235
284
|
rubyforge_project:
|
236
285
|
rubygems_version: 1.8.10
|
237
286
|
signing_key:
|
238
287
|
specification_version: 3
|
239
288
|
summary: Feed me activities, Seymour, please!
|
240
|
-
test_files:
|
241
|
-
|
242
|
-
- spec/dummy/app/assets/javascripts/application.js
|
243
|
-
- spec/dummy/app/assets/stylesheets/application.css
|
244
|
-
- spec/dummy/app/controllers/application_controller.rb
|
245
|
-
- spec/dummy/app/helpers/application_helper.rb
|
246
|
-
- spec/dummy/app/mailers/.gitkeep
|
247
|
-
- spec/dummy/app/models/.gitkeep
|
248
|
-
- spec/dummy/app/models/activities/comment_activity.rb
|
249
|
-
- spec/dummy/app/models/activities/ignored_activity.rb
|
250
|
-
- spec/dummy/app/models/activities/test_activity.rb
|
251
|
-
- spec/dummy/app/models/activity.rb
|
252
|
-
- spec/dummy/app/models/comment.rb
|
253
|
-
- spec/dummy/app/models/event.rb
|
254
|
-
- spec/dummy/app/models/feeds/test_feed.rb
|
255
|
-
- spec/dummy/app/models/user.rb
|
256
|
-
- spec/dummy/app/views/activities/_activity.html.erb
|
257
|
-
- spec/dummy/app/views/activities/_test_activity.html.erb
|
258
|
-
- spec/dummy/app/views/layouts/application.html.erb
|
259
|
-
- spec/dummy/config.ru
|
260
|
-
- spec/dummy/config/application.rb
|
261
|
-
- spec/dummy/config/boot.rb
|
262
|
-
- spec/dummy/config/database.yml
|
263
|
-
- spec/dummy/config/environment.rb
|
264
|
-
- spec/dummy/config/environments/development.rb
|
265
|
-
- spec/dummy/config/environments/production.rb
|
266
|
-
- spec/dummy/config/environments/test.rb
|
267
|
-
- spec/dummy/config/initializers/backtrace_silencers.rb
|
268
|
-
- spec/dummy/config/initializers/inflections.rb
|
269
|
-
- spec/dummy/config/initializers/mime_types.rb
|
270
|
-
- spec/dummy/config/initializers/secret_token.rb
|
271
|
-
- spec/dummy/config/initializers/session_store.rb
|
272
|
-
- spec/dummy/config/initializers/wrap_parameters.rb
|
273
|
-
- spec/dummy/config/locales/en.yml
|
274
|
-
- spec/dummy/config/routes.rb
|
275
|
-
- spec/dummy/db/migrate/20111014120230_create_activities.rb
|
276
|
-
- spec/dummy/db/migrate/20111014120251_create_users.rb
|
277
|
-
- spec/dummy/db/migrate/20111014120336_create_events.rb
|
278
|
-
- spec/dummy/db/migrate/20111015001158_create_comments.rb
|
279
|
-
- spec/dummy/db/schema.rb
|
280
|
-
- spec/dummy/lib/assets/.gitkeep
|
281
|
-
- spec/dummy/lib/seymour/admin_feed.rb
|
282
|
-
- spec/dummy/lib/seymour/event_feed.rb
|
283
|
-
- spec/dummy/lib/seymour/player_feed.rb
|
284
|
-
- spec/dummy/lib/seymour/user_feed.rb
|
285
|
-
- spec/dummy/log/.gitkeep
|
286
|
-
- spec/dummy/public/404.html
|
287
|
-
- spec/dummy/public/422.html
|
288
|
-
- spec/dummy/public/500.html
|
289
|
-
- spec/dummy/public/favicon.ico
|
290
|
-
- spec/dummy/script/rails
|
291
|
-
- spec/dummy/spec/factories.rb
|
292
|
-
- spec/generators/seymour/feed/feed_generator_spec.rb
|
293
|
-
- spec/redis-spec.conf
|
294
|
-
- spec/seymour/distributable_spec.rb
|
295
|
-
- spec/seymour/dummy/test_activity_spec.rb
|
296
|
-
- spec/seymour/feed_spec.rb
|
297
|
-
- spec/seymour/redis_spec.rb
|
298
|
-
- spec/seymour/renderable_spec.rb
|
299
|
-
- spec/seymour_spec.rb
|
300
|
-
- spec/spec_helper.rb
|
301
|
-
- spec/support/capybara.rb
|
302
|
-
- spec/support/redis.rb
|
289
|
+
test_files: []
|
290
|
+
|
303
291
|
has_rdoc:
|
@@ -1,21 +0,0 @@
|
|
1
|
-
class BatchedUserEnumerator
|
2
|
-
def initialize(find_in_batches_options)
|
3
|
-
@find_in_batches_options = find_in_batches_options
|
4
|
-
end
|
5
|
-
|
6
|
-
def self.for_ids(ids)
|
7
|
-
return [] if ids.empty?
|
8
|
-
self.new(:conditions => ['id in (?)', ids])
|
9
|
-
end
|
10
|
-
|
11
|
-
def each
|
12
|
-
User.find_in_batches(@find_in_batches_options) do |users|
|
13
|
-
User.send(:with_exclusive_scope) do
|
14
|
-
users.each do |user|
|
15
|
-
yield user
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
self
|
20
|
-
end
|
21
|
-
end
|