seymour 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,3 @@
1
1
  module Seymour
2
- VERSION = "0.0.7"
2
+ VERSION = "0.0.8"
3
3
  end
@@ -21,14 +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
- s.add_dependency "redis-namespace"
24
+ # s.add_dependency "redis-namespace"
25
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'
26
+ s.add_development_dependency "rspec-rails", '~> 2.8.0'
27
+ s.add_development_dependency 'capybara', '~> 1.1.0'
28
+ s.add_development_dependency 'ammeter', '~> 0.2.0'
29
+ s.add_development_dependency 'database_cleaner', '~> 0.7.1'
30
+ s.add_development_dependency 'factory_girl_rails', '~> 1.2.0'
33
31
  s.add_development_dependency "sqlite3"
34
32
  end
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  # This file is auto-generated from the current state of the database. Instead
2
3
  # of editing this file, please use the migrations feature of Active Record to
3
4
  # incrementally modify your database, and then regenerate this schema definition.
@@ -13,8 +14,8 @@
13
14
  ActiveRecord::Schema.define(:version => 20111015001158) do
14
15
 
15
16
  create_table "activities", :force => true do |t|
16
- t.integer "subject_id"
17
- t.string "subject_type"
17
+ t.integer "auditable_id"
18
+ t.string "auditable_type"
18
19
  t.integer "actor_id"
19
20
  t.datetime "created_at"
20
21
  t.datetime "updated_at"
@@ -61,12 +61,19 @@ describe Seymour::Distributable do
61
61
  DistributableActivity.feeds_for(activity).size.should == 2
62
62
  end
63
63
 
64
- it "should assign owner to correct feed type" do
65
- feed_1, feed_2 = DistributableActivity.feeds_for(activity)
66
- feed_1.should be_a(UserFeed)
67
- feed_1.owner.should == @user
68
- feed_2.should be_a(AdminFeed)
69
- feed_2.owner.should == @admin
64
+ it "should return all assigned feed types" do
65
+ feed_classes = DistributableActivity.feeds_for(activity).map(&:class)
66
+ feed_classes.should include(UserFeed)
67
+ feed_classes.should include(AdminFeed)
68
+ end
69
+
70
+ it "should assign owners to correct feed type" do
71
+ feeds = DistributableActivity.feeds_for(activity)
72
+ user_feed = feeds.detect { |feed| feed.is_a?(UserFeed) }
73
+ admin_feed = feeds.detect { |feed| feed.is_a?(AdminFeed) }
74
+
75
+ user_feed.owner.should == @user
76
+ admin_feed.owner.should == @admin
70
77
  end
71
78
 
72
79
  it "should use default batch size if iterating on arel scope" do
@@ -2,9 +2,32 @@ require 'spec_helper'
2
2
 
3
3
  describe Seymour::Feed do
4
4
 
5
- let(:owner) { mock_model(User) }
5
+ module FactoryHelper
6
+ def new_owner
7
+ stub_model(User)
8
+ end
9
+
10
+ def new_activity(attrs = {})
11
+ mock_model(Activity, attrs)
12
+ end
13
+ end
14
+ include FactoryHelper
15
+
16
+ let(:owner) { new_owner }
6
17
  let(:feed) { Seymour::Feed.new(owner) }
7
18
 
19
+ class ListFeed < Seymour::Feed
20
+ key do
21
+ "feed::#{owner.id}"
22
+ end
23
+
24
+ store :list
25
+ end
26
+
27
+ class ZsetFeed < Seymour::Feed
28
+ store :zset
29
+ end
30
+
8
31
  describe "class methods" do
9
32
  describe "feed_classes" do
10
33
  it "should provide a list of feed sub classes" do
@@ -14,11 +37,34 @@ describe Seymour::Feed do
14
37
 
15
38
  describe "distribute" do
16
39
  it "should call activity distribute on activity" do
17
- activity = mock_model(Activity)
40
+ activity = new_activity
18
41
  activity.should_receive(:distribute)
19
42
  Seymour::Feed.distribute(activity)
20
43
  end
21
44
  end
45
+
46
+ describe "key" do
47
+ it "should override default feed key" do
48
+ feed = ListFeed.new(owner)
49
+ feed.key.should == "feed::#{owner.id}"
50
+ end
51
+ end
52
+
53
+ describe "store" do
54
+ it "should default to list feed" do
55
+ feed.store.should be_a(Seymour::Store::List)
56
+ end
57
+
58
+ it "should set type of storage to list" do
59
+ feed = ListFeed.new(owner)
60
+ feed.store.should be_a(Seymour::Store::List)
61
+ end
62
+
63
+ it "should set type of storage to zset" do
64
+ feed = ZsetFeed.new(owner)
65
+ feed.store.should be_a(Seymour::Store::Zset)
66
+ end
67
+ end
22
68
  end
23
69
 
24
70
  describe "activity_ids" do
@@ -27,118 +73,262 @@ describe Seymour::Feed do
27
73
  end
28
74
  end
29
75
 
30
- describe "push" do
31
- it "prepends id of given activity to activity_ids" do
32
- feed.push mock_model(Activity, :id => 123)
33
- feed.activity_ids.should == [123]
76
+ describe "owner" do
77
+ it "should return given owner" do
78
+ feed.owner.should == owner
79
+ end
80
+ end
34
81
 
35
- feed.push mock_model(Activity, :id => 456)
36
- feed.activity_ids.should == [456, 123]
82
+ describe "key" do
83
+ it "should return default" do
84
+ feed.send(:key).should == "#{owner.class.name}:#{owner.id}/seymour::feed"
37
85
  end
86
+ end
87
+
88
+ describe "list feed" do
89
+ describe "push" do
90
+ it "prepends id of given activity to activity_ids" do
91
+ feed.push new_activity(:id => 123)
92
+ feed.activity_ids.should == [123]
93
+
94
+ feed.push new_activity(:id => 456)
95
+ feed.activity_ids.should == [456, 123]
96
+ end
97
+
98
+ it "new feed with same owner pushes to same list" do
99
+ new_feed = Seymour::Feed.new(owner)
38
100
 
39
- it "new feed with same owner pushes to same list" do
40
- new_feed = Seymour::Feed.new(owner)
101
+ feed.push new_activity(:id => 123)
102
+ new_feed.push new_activity(:id => 456)
41
103
 
42
- feed.push mock_model(Activity, :id => 123)
43
- new_feed.push mock_model(Activity, :id => 456)
104
+ feed.activity_ids.should == [456, 123]
105
+ new_feed.activity_ids.should == [456, 123]
106
+ end
107
+
108
+ it "new feed with different owner pushes to different list" do
109
+ new_owner = mock_model(User)
110
+ new_feed = Seymour::Feed.new(new_owner)
111
+
112
+ feed.push new_activity(:id => 123)
113
+ new_feed.push new_activity(:id => 456)
114
+
115
+ feed.activity_ids.should == [123]
116
+ new_feed.activity_ids.should == [456]
117
+ end
44
118
 
45
- feed.activity_ids.should == [456, 123]
46
- new_feed.activity_ids.should == [456, 123]
47
119
  end
48
120
 
49
- it "new feed with different owner pushes to different list" do
50
- new_owner = mock_model(User)
51
- new_feed = Seymour::Feed.new(new_owner)
121
+ describe "bulk_push" do
122
+ it "should accept multiple values" do
123
+ feed.bulk_push [new_activity(:id => 123), new_activity(:id => 456)]
124
+ feed.activity_ids.should == [456, 123]
125
+ end
52
126
 
53
- feed.push mock_model(Activity, :id => 123)
54
- new_feed.push mock_model(Activity, :id => 456)
127
+ it "should not append duplicates" do
128
+ feed.bulk_push [new_activity(:id => 123), new_activity(:id => 456), new_activity(:id => 123)]
129
+ feed.activity_ids.should == [456, 123]
130
+ end
131
+ end
55
132
 
56
- feed.activity_ids.should == [123]
57
- new_feed.activity_ids.should == [456]
133
+ describe "sort" do
134
+ it "should sort list in desc order by default" do
135
+ feed.bulk_push [new_activity(:id => 456), new_activity(:id => 123)]
136
+ feed.sort!
137
+ feed.activity_ids.should == [456, 123]
138
+ end
58
139
  end
59
140
 
60
- end
141
+ describe "insert_and_order" do
142
+ it "should insert activities into the list" do
143
+ activities = [new_activity(:id => 123), new_activity(:id => 456)]
144
+ feed.insert_and_order(activities)
61
145
 
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]
146
+ feed.activity_ids.should == [456, 123]
147
+ end
148
+
149
+ it "should reorder activities by id" do
150
+ feed.push new_activity(:id => 123)
151
+ feed.push new_activity(:id => 456)
152
+
153
+ activities = [new_activity(:id => 234), new_activity(:id => 789)]
154
+
155
+ feed.insert_and_order(activities)
156
+
157
+ feed.activity_ids.should == [789, 456, 234, 123]
158
+ end
159
+
160
+ it "should not allow duplicates" do
161
+ feed.push new_activity(:id => 123)
162
+ feed.push new_activity(:id => 456)
163
+
164
+ activities = [new_activity(:id => 123), new_activity(:id => 789)]
165
+
166
+ feed.insert_and_order(activities)
167
+
168
+ feed.activity_ids.should == [789, 456, 123]
169
+ end
66
170
  end
67
171
 
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]
172
+ describe "remove" do
173
+ it "removes activity from list by id" do
174
+ activity_1 = new_activity(:id => 456)
175
+ activity_2 = new_activity(:id => 789)
176
+ feed.push activity_1
177
+ feed.push activity_2
178
+
179
+ feed.remove activity_1
180
+
181
+ feed.activity_ids.should == [activity_2.id]
182
+ end
71
183
  end
72
- end
73
184
 
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]
185
+ describe "remove_id" do
186
+ it "removes activity_id from list" do
187
+ activity_1 = new_activity(:id => 456)
188
+ activity_2 = new_activity(:id => 789)
189
+ feed.push activity_1
190
+ feed.push activity_2
191
+
192
+ feed.remove_id activity_1.id
193
+
194
+ feed.activity_ids.should == [activity_2.id]
195
+ end
79
196
  end
80
197
  end
81
198
 
82
- describe "insert_and_order" do
83
- it "should insert activities into the list" do
84
- activities = [mock_model(Activity, :id => 123), mock_model(Activity, :id => 456)]
85
- feed.insert_and_order(activities)
199
+ describe "zset" do
200
+ let(:feed) { ZsetFeed.new(owner) }
86
201
 
87
- feed.activity_ids.should == [456, 123]
88
- end
202
+ describe "push" do
203
+ it "returns ids sorted by score, highest to lowest" do
204
+ feed.push new_activity(:id => 123, :score => 1)
205
+ feed.push new_activity(:id => 456, :score => 3)
206
+ feed.activity_ids.should == [456, 123]
207
+ end
89
208
 
90
- it "should reorder activities by id" do
91
- feed.push mock_model(Activity, :id => 123)
92
- feed.push mock_model(Activity, :id => 456)
209
+ it "returns accepts score as second arg" do
210
+ feed.push new_activity(:id => 123), 2
211
+ feed.push new_activity(:id => 456), 1
212
+ feed.activity_ids.should == [123, 456]
213
+ end
214
+
215
+ it "returns ordered by id when scores equal" do
216
+ feed.push new_activity(:id => 456), 1
217
+ feed.push new_activity(:id => 123), 1
218
+ feed.activity_ids.should == [456, 123]
219
+ end
93
220
 
94
- activities = [mock_model(Activity, :id => 234), mock_model(Activity, :id => 789)]
221
+ it "does not add duplicates but updates score" do
222
+ feed.push new_activity(:id => 123), 2
223
+ feed.push new_activity(:id => 456), 1
224
+ feed.push new_activity(:id => 456), 3
225
+ feed.activity_ids.should == [456, 123]
226
+ end
227
+ end
95
228
 
96
- feed.insert_and_order(activities)
229
+ describe "bulk_push" do
230
+ it "should accept multiple values" do
231
+ feed.bulk_push [new_activity(:id => 123, :score => 1), new_activity(:id => 456, :score => 3)]
232
+ feed.activity_ids.should == [456, 123]
233
+ end
97
234
 
98
- feed.activity_ids.should == [789, 456, 234, 123]
235
+ it "should not append duplicates" do
236
+ feed.bulk_push [new_activity(:id => 123, :score => 2),
237
+ new_activity(:id => 456, :score => 1), new_activity(:id => 123, :score => 3)]
238
+ feed.activity_ids.should == [123, 456]
239
+ end
99
240
  end
100
241
 
101
- it "should not allow duplicates" do
102
- feed.push mock_model(Activity, :id => 123)
103
- feed.push mock_model(Activity, :id => 456)
242
+ describe "union" do
243
+ it "should store union of given feeds" do
244
+ feed_1 = ZsetFeed.new(new_owner)
245
+ feed_2 = ZsetFeed.new(new_owner)
104
246
 
105
- activities = [mock_model(Activity, :id => 123), mock_model(Activity, :id => 789)]
247
+ feed_1.push new_activity(:id => 456), 2
248
+ feed_2.push new_activity(:id => 123), 1
249
+ feed_2.push new_activity(:id => 789), 3
106
250
 
107
- feed.insert_and_order(activities)
251
+ feed_1.activity_ids.should == [456]
252
+ feed_2.activity_ids.should == [789, 123]
108
253
 
109
- feed.activity_ids.should == [789, 456, 123]
254
+ feed.union([feed_1, feed_2]).should == 3
255
+ feed.activity_ids.should == [789, 456, 123]
256
+ end
110
257
  end
111
- end
112
258
 
113
- describe "remove" do
114
- it "removes activity from list by id" do
115
- activity_1 = mock_model(Activity, :id => 456)
116
- activity_2 = mock_model(Activity, :id => 789)
117
- feed.push activity_1
118
- feed.push activity_2
259
+ describe "intersect" do
260
+ it "should store intersection of given feeds" do
261
+ feed_1 = ZsetFeed.new(new_owner)
262
+ feed_2 = ZsetFeed.new(new_owner)
263
+
264
+ feed_1.push new_activity(:id => 456), 2
265
+ feed_2.push new_activity(:id => 456), 1
266
+ feed_2.push new_activity(:id => 789), 3
119
267
 
120
- feed.remove activity_1
268
+ feed_1.activity_ids.should == [456]
269
+ feed_2.activity_ids.should == [789, 456]
121
270
 
122
- feed.activity_ids.should == [activity_2.id]
271
+ feed.intersect([feed_1, feed_2])
272
+ feed.activity_ids.should == [456]
273
+ end
123
274
  end
124
- end
125
275
 
126
- describe "remove_id" do
127
- it "removes activity_id from list" do
128
- activity_1 = mock_model(Activity, :id => 456)
129
- activity_2 = mock_model(Activity, :id => 789)
130
- feed.push activity_1
131
- feed.push activity_2
276
+ #
277
+ # describe "insert_and_order" do
278
+ # it "should insert activities into the list" do
279
+ # activities = [new_activity(:id => 123), new_activity(:id => 456)]
280
+ # feed.insert_and_order(activities)
281
+ #
282
+ # feed.activity_ids.should == [456, 123]
283
+ # end
284
+ #
285
+ # it "should reorder activities by id" do
286
+ # feed.push new_activity(:id => 123)
287
+ # feed.push new_activity(:id => 456)
288
+ #
289
+ # activities = [new_activity(:id => 234), new_activity(:id => 789)]
290
+ #
291
+ # feed.insert_and_order(activities)
292
+ #
293
+ # feed.activity_ids.should == [789, 456, 234, 123]
294
+ # end
295
+ #
296
+ # it "should not allow duplicates" do
297
+ # feed.push new_activity(:id => 123)
298
+ # feed.push new_activity(:id => 456)
299
+ #
300
+ # activities = [new_activity(:id => 123), new_activity(:id => 789)]
301
+ #
302
+ # feed.insert_and_order(activities)
303
+ #
304
+ # feed.activity_ids.should == [789, 456, 123]
305
+ # end
306
+ # end
307
+ #
308
+ describe "remove" do
309
+ it "removes activity from list by id" do
310
+ activity_1 = new_activity(:id => 456)
311
+ activity_2 = new_activity(:id => 789)
312
+ feed.push activity_1, 2
313
+ feed.push activity_2, 1
314
+
315
+ feed.remove activity_1
316
+
317
+ feed.activity_ids.should == [activity_2.id]
318
+ end
319
+ end
132
320
 
133
- feed.remove_id activity_1.id
321
+ describe "remove_id" do
322
+ it "removes activity_id from list" do
323
+ activity_1 = new_activity(:id => 456)
324
+ activity_2 = new_activity(:id => 789)
325
+ feed.push activity_1, 2
326
+ feed.push activity_2, 1
134
327
 
135
- feed.activity_ids.should == [activity_2.id]
136
- end
137
- end
328
+ feed.remove_id activity_1.id
138
329
 
139
- describe "owner" do
140
- it "should return given owner" do
141
- feed.owner.should == owner
330
+ feed.activity_ids.should == [activity_2.id]
331
+ end
142
332
  end
143
333
  end
144
334
  end