seymour 0.0.8 → 0.0.9
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/CHANGELOG.md +6 -0
- data/Gemfile +0 -1
- data/Gemfile.ci +1 -0
- data/README.md +2 -2
- data/lib/generators/seymour/feed/feed_generator.rb +0 -19
- data/lib/seymour/distributable.rb +14 -12
- data/lib/seymour/renderable.rb +14 -19
- data/lib/seymour/version.rb +1 -1
- data/seymour.gemspec +6 -6
- data/spec/factories/factories.rb +13 -0
- data/spec/seymour/distributable_spec.rb +27 -7
- data/spec/seymour/dummy/test_activity_spec.rb +1 -1
- metadata +44 -33
- data/spec/dummy/spec/factories.rb +0 -11
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
data/Gemfile.ci
CHANGED
data/README.md
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# Seymour
|
2
2
|
|
3
|
-
Feed me
|
3
|
+
Activities feeds with Redis. Feed me, Seymour, please!
|
4
4
|
|
5
|
-
Seymour is a library for distributing activity items to
|
5
|
+
Seymour is a library for distributing activity items to Redis-backed activity feeds
|
6
6
|
in a Rails application.
|
7
7
|
|
8
8
|
[](http://travis-ci.org/rossta/seymour)
|
@@ -11,22 +11,3 @@ module Seymour
|
|
11
11
|
|
12
12
|
end
|
13
13
|
end
|
14
|
-
# module Draper
|
15
|
-
# class DecoratorGenerator < Rails::Generators::NamedBase
|
16
|
-
# source_root File.expand_path('../templates', __FILE__)
|
17
|
-
#
|
18
|
-
# DECORATORS_ROOT = 'app/decorators/'
|
19
|
-
# APPLICATION_DECORATOR = 'application_decorator.rb'
|
20
|
-
# APPLICATION_DECORATOR_PATH = DECORATORS_ROOT + APPLICATION_DECORATOR
|
21
|
-
#
|
22
|
-
# def build_model_and_application_decorators
|
23
|
-
# empty_directory "app/decorators"
|
24
|
-
# unless File.exists?(APPLICATION_DECORATOR_PATH)
|
25
|
-
# template APPLICATION_DECORATOR, APPLICATION_DECORATOR_PATH
|
26
|
-
# end
|
27
|
-
# template 'decorator.rb', "#{DECORATORS_ROOT}#{singular_name}_decorator.rb"
|
28
|
-
# end
|
29
|
-
#
|
30
|
-
# hook_for :test_framework
|
31
|
-
# end
|
32
|
-
# end
|
@@ -47,6 +47,7 @@ module Seymour
|
|
47
47
|
feed_classes, options = mapping
|
48
48
|
[feed_classes].flatten.each do |feed_class_name|
|
49
49
|
try_find_each(activity.send(audience_name), options) do |member|
|
50
|
+
|
50
51
|
feed = feed_class_name.constantize.new(member)
|
51
52
|
yield feed if block_given?
|
52
53
|
feeds << feed
|
@@ -69,28 +70,29 @@ module Seymour
|
|
69
70
|
# relation.send(:with_exclusive_scope) &block
|
70
71
|
# end
|
71
72
|
activity_audience.find_each(options, &block)
|
72
|
-
|
73
|
+
elsif activity_audience.respond_to?(:each)
|
73
74
|
activity_audience.each &block
|
75
|
+
elsif !activity_audience.nil?
|
76
|
+
yield activity_audience
|
74
77
|
end
|
75
78
|
end
|
76
79
|
|
77
80
|
end
|
78
81
|
|
79
|
-
|
82
|
+
# instance methods
|
80
83
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
def remove
|
86
|
-
self.class.remove(self)
|
87
|
-
end
|
84
|
+
def distribute
|
85
|
+
self.class.distribute(self)
|
86
|
+
end
|
88
87
|
|
89
|
-
|
90
|
-
|
91
|
-
|
88
|
+
def remove
|
89
|
+
self.class.remove(self)
|
90
|
+
end
|
92
91
|
|
92
|
+
def feeds
|
93
|
+
self.class.feeds_for(self)
|
93
94
|
end
|
95
|
+
|
94
96
|
end
|
95
97
|
|
96
98
|
|
data/lib/seymour/renderable.rb
CHANGED
@@ -6,31 +6,26 @@ module Seymour
|
|
6
6
|
module Renderable
|
7
7
|
extend ActiveSupport::Concern
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
return nil
|
15
|
-
end
|
16
|
-
|
17
|
-
def render(controller_name, action_name, env = {})
|
18
|
-
# TODO define proper server name
|
19
|
-
# { "REQUEST_URI" => "", "SERVER_NAME" => 'http://www.example.com' }.merge(env))
|
9
|
+
def render_html
|
10
|
+
render("seymour/render", "activity", "seymour.activity" => self)
|
11
|
+
rescue RenderError
|
12
|
+
return nil
|
13
|
+
end
|
20
14
|
|
21
|
-
|
22
|
-
|
15
|
+
def render(controller_name, action_name, env = {})
|
16
|
+
# TODO define proper server name
|
17
|
+
# { "REQUEST_URI" => "", "SERVER_NAME" => 'http://www.example.com' }.merge(env))
|
23
18
|
|
24
|
-
|
19
|
+
env = Rack::MockRequest.env_for("/",
|
20
|
+
{ "REQUEST_URI" => "", "SERVER_NAME" => '' }.merge(env))
|
25
21
|
|
26
|
-
|
27
|
-
raise RenderError.new("#{controller_name}##{action_name}") unless status.to_i == 200
|
28
|
-
response.body
|
29
|
-
end
|
22
|
+
controller_class = "#{controller_name}_controller".classify.constantize
|
30
23
|
|
24
|
+
status, headers, response = controller_class.action(action_name.to_sym).call(env)
|
25
|
+
raise RenderError.new("#{controller_name}##{action_name}") unless status.to_i == 200
|
26
|
+
response.body
|
31
27
|
end
|
32
28
|
|
33
|
-
|
34
29
|
end
|
35
30
|
|
36
31
|
end
|
data/lib/seymour/version.rb
CHANGED
data/seymour.gemspec
CHANGED
@@ -21,12 +21,12 @@ Gem::Specification.new do |s|
|
|
21
21
|
# s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
22
22
|
|
23
23
|
s.add_dependency "rails", "~> 3.0"
|
24
|
-
|
24
|
+
s.add_dependency "redis-namespace"
|
25
25
|
|
26
|
-
s.add_development_dependency "rspec-rails"
|
27
|
-
s.add_development_dependency 'capybara'
|
28
|
-
s.add_development_dependency '
|
29
|
-
s.add_development_dependency '
|
30
|
-
s.add_development_dependency 'factory_girl_rails', '~> 1.2.0'
|
26
|
+
s.add_development_dependency "rspec-rails"
|
27
|
+
s.add_development_dependency 'capybara'
|
28
|
+
s.add_development_dependency 'database_cleaner'
|
29
|
+
s.add_development_dependency 'factory_girl_rails'
|
31
30
|
s.add_development_dependency "sqlite3"
|
31
|
+
s.add_development_dependency 'ammeter'
|
32
32
|
end
|
@@ -8,16 +8,23 @@ describe Seymour::Distributable do
|
|
8
8
|
audience :events, :batch_size => 100
|
9
9
|
audience :soccer_teams, :feed => "TeamFeed"
|
10
10
|
audience :followers, :feed => %w[ DashboardFeed EmailDigest ]
|
11
|
+
audience :for_one, :feed => "UserFeed"
|
11
12
|
|
12
|
-
|
13
|
+
GROUP_AUDIENCES = [:users, :admin, :soccer_teams, :events, :followers]
|
13
14
|
|
14
|
-
|
15
|
+
GROUP_AUDIENCES.each do |audience_name|
|
15
16
|
attr_writer audience_name
|
16
17
|
|
17
18
|
define_method(audience_name) do
|
18
19
|
instance_variable_get("@#{audience_name}") || []
|
19
20
|
end
|
20
21
|
end
|
22
|
+
|
23
|
+
attr_writer :for_one
|
24
|
+
def for_one
|
25
|
+
@for_one || nil
|
26
|
+
end
|
27
|
+
|
21
28
|
end
|
22
29
|
|
23
30
|
describe "class methods" do
|
@@ -28,6 +35,8 @@ describe Seymour::Distributable do
|
|
28
35
|
audience_names.should include(:admin)
|
29
36
|
audience_names.should include(:soccer_teams)
|
30
37
|
audience_names.should include(:events)
|
38
|
+
audience_names.should include(:followers)
|
39
|
+
audience_names.should include(:for_one)
|
31
40
|
end
|
32
41
|
|
33
42
|
it "should list activity feed classes" do
|
@@ -57,17 +66,17 @@ describe Seymour::Distributable do
|
|
57
66
|
end
|
58
67
|
|
59
68
|
describe "feeds_for" do
|
60
|
-
it "
|
69
|
+
it "builds feed for each audience member" do
|
61
70
|
DistributableActivity.feeds_for(activity).size.should == 2
|
62
71
|
end
|
63
72
|
|
64
|
-
it "
|
73
|
+
it "returns all assigned feed types" do
|
65
74
|
feed_classes = DistributableActivity.feeds_for(activity).map(&:class)
|
66
75
|
feed_classes.should include(UserFeed)
|
67
76
|
feed_classes.should include(AdminFeed)
|
68
77
|
end
|
69
78
|
|
70
|
-
it "
|
79
|
+
it "assigns owners to correct feed type" do
|
71
80
|
feeds = DistributableActivity.feeds_for(activity)
|
72
81
|
user_feed = feeds.detect { |feed| feed.is_a?(UserFeed) }
|
73
82
|
admin_feed = feeds.detect { |feed| feed.is_a?(AdminFeed) }
|
@@ -76,17 +85,28 @@ describe Seymour::Distributable do
|
|
76
85
|
admin_feed.owner.should == @admin
|
77
86
|
end
|
78
87
|
|
79
|
-
it "
|
88
|
+
it "uses default batch size if iterating on arel scope" do
|
80
89
|
activity.users = User.scoped
|
81
90
|
activity.users.should_receive(:find_each).with(:batch_size => 500)
|
82
91
|
DistributableActivity.feeds_for(activity)
|
83
92
|
end
|
84
93
|
|
85
|
-
it "
|
94
|
+
it "uses specified batch size if iterating on arel scope" do
|
86
95
|
activity.events = Event.scoped
|
87
96
|
activity.events.should_receive(:find_each).with(:batch_size => 100)
|
88
97
|
DistributableActivity.feeds_for(activity)
|
89
98
|
end
|
99
|
+
|
100
|
+
it "returns feed for non-enumerable audience (of one)" do
|
101
|
+
activity.users = []
|
102
|
+
activity.admin = []
|
103
|
+
activity.for_one = @user
|
104
|
+
feeds = DistributableActivity.feeds_for(activity)
|
105
|
+
feeds.size.should == 1
|
106
|
+
feeds.map(&:class).should include(UserFeed)
|
107
|
+
feeds.map(&:owner).should include(@user)
|
108
|
+
end
|
109
|
+
|
90
110
|
end
|
91
111
|
end
|
92
112
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: seymour
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-09-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
16
|
-
requirement: &
|
16
|
+
requirement: &70212259063200 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,65 +21,76 @@ dependencies:
|
|
21
21
|
version: '3.0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70212259063200
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
|
-
name:
|
27
|
-
requirement: &
|
26
|
+
name: redis-namespace
|
27
|
+
requirement: &70212259078560 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
|
-
- -
|
30
|
+
- - ! '>='
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
33
|
-
type: :
|
32
|
+
version: '0'
|
33
|
+
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70212259078560
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
|
-
name:
|
38
|
-
requirement: &
|
37
|
+
name: rspec-rails
|
38
|
+
requirement: &70212259076840 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
|
-
- -
|
41
|
+
- - ! '>='
|
42
42
|
- !ruby/object:Gem::Version
|
43
|
-
version:
|
43
|
+
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70212259076840
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
|
-
name:
|
49
|
-
requirement: &
|
48
|
+
name: capybara
|
49
|
+
requirement: &70212259074960 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ! '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0
|
54
|
+
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70212259074960
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: database_cleaner
|
60
|
-
requirement: &
|
60
|
+
requirement: &70212259073280 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
|
-
- -
|
63
|
+
- - ! '>='
|
64
64
|
- !ruby/object:Gem::Version
|
65
|
-
version: 0
|
65
|
+
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70212259073280
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: factory_girl_rails
|
71
|
-
requirement: &
|
71
|
+
requirement: &70212259085340 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
|
-
- -
|
74
|
+
- - ! '>='
|
75
75
|
- !ruby/object:Gem::Version
|
76
|
-
version:
|
76
|
+
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70212259085340
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: sqlite3
|
82
|
-
requirement: &
|
82
|
+
requirement: &70212259083120 !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
type: :development
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: *70212259083120
|
91
|
+
- !ruby/object:Gem::Dependency
|
92
|
+
name: ammeter
|
93
|
+
requirement: &70212259082400 !ruby/object:Gem::Requirement
|
83
94
|
none: false
|
84
95
|
requirements:
|
85
96
|
- - ! '>='
|
@@ -87,7 +98,7 @@ dependencies:
|
|
87
98
|
version: '0'
|
88
99
|
type: :development
|
89
100
|
prerelease: false
|
90
|
-
version_requirements: *
|
101
|
+
version_requirements: *70212259082400
|
91
102
|
description: Activity feed distribution for Rails applications
|
92
103
|
email:
|
93
104
|
- rosskaff@gmail.com
|
@@ -174,7 +185,7 @@ files:
|
|
174
185
|
- spec/dummy/public/500.html
|
175
186
|
- spec/dummy/public/favicon.ico
|
176
187
|
- spec/dummy/script/rails
|
177
|
-
- spec/
|
188
|
+
- spec/factories/factories.rb
|
178
189
|
- spec/generators/seymour/feed/feed_generator_spec.rb
|
179
190
|
- spec/redis-spec.conf
|
180
191
|
- spec/seymour/distributable_spec.rb
|
@@ -200,7 +211,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
200
211
|
version: '0'
|
201
212
|
segments:
|
202
213
|
- 0
|
203
|
-
hash:
|
214
|
+
hash: 2321509907141063680
|
204
215
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
205
216
|
none: false
|
206
217
|
requirements:
|
@@ -209,7 +220,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
209
220
|
version: '0'
|
210
221
|
segments:
|
211
222
|
- 0
|
212
|
-
hash:
|
223
|
+
hash: 2321509907141063680
|
213
224
|
requirements: []
|
214
225
|
rubyforge_project:
|
215
226
|
rubygems_version: 1.8.10
|