tekeya 0.0.9 → 0.0.10

Sign up to get free protection for your applications and to get access to all the features.
@@ -16,11 +16,14 @@ module Tekeya
16
16
  has_many :activities, as: :entity, class_name: "::Tekeya::Activity", dependent: :destroy do
17
17
  # Returns activities dating up to 10 days in the past
18
18
  def recent
19
- unless ::Tekeya::Configuration.instance.feed_storage_orm.to_sym == :mongoid
19
+ c = unless ::Tekeya::Configuration.instance.feed_storage_orm.to_sym == :mongoid
20
20
  where("created_at > ?", 10.days.ago).order('created_at DESC')
21
21
  else
22
22
  criteria.where(:created_at.gte => 10.days.ago).desc('created_at')
23
23
  end
24
+
25
+ c = yield c if block_given?
26
+ c
24
27
  end
25
28
 
26
29
  # Any method missing invoked on activities is considered a new activity
@@ -301,13 +304,13 @@ module Tekeya
301
304
  # Returns the entity's recent activities
302
305
  #
303
306
  # @return [Array] the list of recent activities by this entity
304
- def profile_feed
307
+ def profile_feed(&blck)
305
308
  acts = []
306
309
  pkey = self.profile_feed_key
307
310
  recent_activities_count = ::Tekeya.redis.zcard(pkey)
308
311
 
309
312
  # Check if the cache is not empty
310
- if recent_activities_count > 0
313
+ if recent_activities_count > 0 && !block_given?
311
314
  # Retrieve the aggregate keys from redis
312
315
  acts_keys = ::Tekeya.redis.zrevrange(pkey, 0, -1)
313
316
  # Retrieve the aggregates
@@ -322,7 +325,7 @@ module Tekeya
322
325
  end
323
326
  else
324
327
  # Retrieve the activities from the DB
325
- db_recent_activities = self.activities.recent
328
+ db_recent_activities = self.activities.recent(&blck)
326
329
  db_recent_activities.each do |activity|
327
330
  acts << ::Tekeya::Feed::Activity::Item.from_db(activity, activity.author)
328
331
  end
@@ -334,23 +337,29 @@ module Tekeya
334
337
  # Returns the entity's feed
335
338
  #
336
339
  # @return [Array] the list of activities for the entities tracked by this entity
337
- def feed
340
+ def feed(&blck)
338
341
  acts = []
339
342
  fkey = self.feed_key
340
343
  recent_activities_count = ::Tekeya.redis.zcard(fkey)
341
344
 
342
345
  # Check if the cache is not empty
343
- if recent_activities_count > 0
346
+ if recent_activities_count > 0 && !block_given?
344
347
  # Retrieve the aggregate keys from redis
345
348
  acts_keys = ::Tekeya.redis.zrevrange(fkey, 0, -1)
346
349
  # Retrieve the aggregates
347
350
  acts_keys.each do |act_key|
348
- acts << ::Tekeya::Feed::Activity::Item.from_redis(act_key, self)
351
+ # Make `from_redis` only hit the db if author != entity
352
+ key_components = act_key.split(':')
353
+ actor = if key_components[4] == self.class.to_s && key_components[5] == self.entity_primary_key
354
+ self
355
+ end
356
+
357
+ acts << ::Tekeya::Feed::Activity::Item.from_redis(act_key, actor)
349
358
  end
350
359
  else
351
360
  # Retrieve the activities from the DB
352
361
  (self.tracking + [self]).each do |tracker|
353
- db_recent_activities = tracker.activities.recent
362
+ db_recent_activities = tracker.activities.recent(&blck)
354
363
  db_recent_activities.each do |activity|
355
364
  acts << ::Tekeya::Feed::Activity::Item.from_db(activity, tracker)
356
365
  end
@@ -416,17 +425,19 @@ module Tekeya
416
425
  # Retrieves rebat relations
417
426
  def tekeya_relations_of(from, relation_type, entity_type, reverse = false)
418
427
  result_entity_class = entity_type.safe_constantize if entity_type
419
- unless reverse
428
+ relations = unless reverse
420
429
  ::Tekeya.relations.where(from.send(from.class.entity_primary_key), from.class.name, nil, entity_type, relation_type).entries.map do |entry|
421
- result_entity_class ||= entry.toEntityType.safe_constantize
422
- result_entity_class.where(:"#{result_entity_class.entity_primary_key}" => entry.toEntityId).first
430
+ entity_class = result_entity_class || entry.toEntityType.safe_constantize
431
+ entity_class.where(:"#{entity_class.entity_primary_key}" => entry.toEntityId).first
423
432
  end
424
433
  else
425
434
  ::Tekeya.relations.where(nil, entity_type, from.send(from.class.entity_primary_key), from.class.name, relation_type).entries.map do |entry|
426
- result_entity_class ||= entry.fromEntityType.safe_constantize
427
- result_entity_class.where(:"#{result_entity_class.entity_primary_key}" => entry.fromEntityId).first
435
+ entity_class = result_entity_class || entry.fromEntityType.safe_constantize
436
+ entity_class.where(:"#{entity_class.entity_primary_key}" => entry.fromEntityId).first
428
437
  end
429
438
  end
439
+
440
+ relations.compact
430
441
  end
431
442
 
432
443
  # @private
@@ -2,13 +2,14 @@ module Tekeya
2
2
  module Feed
3
3
  module Activity
4
4
  class Item
5
- attr_reader :activity_id, :activity_type, :attachments, :actor, :timestamp
5
+ attr_reader :activity_id, :activity_type, :attachments, :actor, :author, :timestamp
6
6
 
7
- def initialize(activity_id, activity_type, attachments, actor, timestamp)
7
+ def initialize(activity_id, activity_type, attachments, actor, author, timestamp)
8
8
  @activity_id = activity_id
9
9
  @activity_type = activity_type
10
10
  @attachments = attachments
11
11
  @actor = actor
12
+ @author = author
12
13
  @timestamp = timestamp
13
14
  end
14
15
 
@@ -25,8 +26,15 @@ module Tekeya
25
26
  act_time = Time.at(key_components[7].to_i)
26
27
 
27
28
  if act_actor.nil?
28
- actor_class = key_components[4].safe_constantize
29
- act_actor = actor_class.where(:"#{actor_class.entity_primary_key}" => key_components[5]).first
29
+ actor_class = key_components[2].safe_constantize
30
+ act_actor = actor_class.where(:"#{actor_class.entity_primary_key}" => key_components[3]).first
31
+ end
32
+
33
+ act_author = unless key_components[2] == key_components[4] && key_components[3] == key_components[5]
34
+ author_class = key_components[4].safe_constantize
35
+ author_class.where(:"#{actor_class.entity_primary_key}" => key_components[5]).first
36
+ else
37
+ act_actor
30
38
  end
31
39
 
32
40
  act_attachments = ::Tekeya.redis.smembers(key).map{|act|
@@ -35,7 +43,7 @@ module Tekeya
35
43
  att['attachable_type'].safe_constantize.find att['attachable_id']
36
44
  }
37
45
 
38
- return self.new(act_id, act_type, act_attachments, act_actor, act_time)
46
+ return self.new(act_id, act_type, act_attachments, act_actor, act_author, act_time)
39
47
  end
40
48
 
41
49
  # Builds a feed item a DB activity
@@ -47,10 +55,11 @@ module Tekeya
47
55
  act_id = activity.id.to_s
48
56
  act_type = activity.activity_type.to_sym
49
57
  act_time = activity.created_at
50
- act_actor ||= activity.author || activity.entity
58
+ act_actor ||= activity.entity
59
+ act_author = activity.author
51
60
  act_attachments = activity.attachments.map(&:attachable)
52
61
 
53
- return self.new(act_id, act_type, act_attachments, act_actor, act_time)
62
+ return self.new(act_id, act_type, act_attachments, act_actor, act_author, act_time)
54
63
  end
55
64
  end
56
65
  end
@@ -1,3 +1,3 @@
1
1
  module Tekeya
2
- VERSION = "0.0.9"
2
+ VERSION = "0.0.10"
3
3
  end
@@ -0,0 +1,3 @@
1
+ Fabricator(:company) do
2
+ name { "#{Faker::Name.name}'s Company" }
3
+ end
@@ -0,0 +1,3 @@
1
+ class Company < ActiveRecord::Base
2
+ include Tekeya::Entity
3
+ end
@@ -0,0 +1,7 @@
1
+ class Company
2
+ include Mongoid::Document
3
+ include Mongoid::Timestamps
4
+ include Tekeya::Entity
5
+
6
+ field :name, type: String
7
+ end
@@ -0,0 +1,9 @@
1
+ class CreateCompanies < ActiveRecord::Migration
2
+ def change
3
+ create_table :companies do |t|
4
+ t.string :name
5
+
6
+ t.timestamps
7
+ end
8
+ end
9
+ end
@@ -15,9 +15,9 @@ describe "Tekeya" do
15
15
  @act2 = @user.activities.liked Fabricate(:status)
16
16
  @act3 = @user.activities.shared Fabricate(:status)
17
17
 
18
- # Created after the grouping interval
18
+ # Created before the grouping interval
19
19
  @act4 = @user.activities.new activity_type: :liked, attachments: [Fabricate.build(:attachment)]
20
- @act4.stub(:current_time_from_proper_timezone => @act1.created_at + 20.minutes)
20
+ @act4.stub(:current_time_from_proper_timezone => @act1.created_at - 20.minutes)
21
21
  @act4.save!
22
22
 
23
23
  # Manually not grouped
@@ -102,11 +102,14 @@ describe "Tekeya" do
102
102
  describe "retrieval" do
103
103
  before :each do
104
104
  @user3 = Fabricate(:user)
105
+ @company = Fabricate(:company)
106
+
105
107
  @user.track(@user2)
106
108
  @user.block(@user3)
107
109
  @user.join(@group)
108
110
  @user2.join(@group)
109
111
  @user3.join(@group)
112
+ @company.track(@user2)
110
113
  end
111
114
 
112
115
  it "should return tracked entities" do
@@ -115,6 +118,7 @@ describe "Tekeya" do
115
118
 
116
119
  it "should return trackers" do
117
120
  @user2.trackers.include?(@user).should == true
121
+ @user2.trackers.include?(@company).should == true
118
122
  end
119
123
 
120
124
  it "should return blocked entities" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tekeya
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.9
4
+ version: 0.0.10
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-01-27 00:00:00.000000000 Z
13
+ date: 2013-04-14 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: redis
17
- requirement: &70269641288980 !ruby/object:Gem::Requirement
17
+ requirement: &70225140539400 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ~>
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: 3.0.1
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *70269641288980
25
+ version_requirements: *70225140539400
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: rebat
28
- requirement: &70269641287740 !ruby/object:Gem::Requirement
28
+ requirement: &70225140538900 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ~>
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: 0.1.4
34
34
  type: :runtime
35
35
  prerelease: false
36
- version_requirements: *70269641287740
36
+ version_requirements: *70225140538900
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: resque
39
- requirement: &70269641285760 !ruby/object:Gem::Requirement
39
+ requirement: &70225140538420 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ~>
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: 1.23.0
45
45
  type: :runtime
46
46
  prerelease: false
47
- version_requirements: *70269641285760
47
+ version_requirements: *70225140538420
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: railties
50
- requirement: &70269641284580 !ruby/object:Gem::Requirement
50
+ requirement: &70225140537940 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ~>
@@ -55,7 +55,7 @@ dependencies:
55
55
  version: '3.1'
56
56
  type: :runtime
57
57
  prerelease: false
58
- version_requirements: *70269641284580
58
+ version_requirements: *70225140537940
59
59
  description: a social engine for Rails applications based on Redis and RebatDB
60
60
  email:
61
61
  - omar.mekky@mashsolvents.com
@@ -107,17 +107,20 @@ files:
107
107
  - lib/tekeya/railtie.rb
108
108
  - lib/tekeya/version.rb
109
109
  - spec/fabricators/attachment_fabricator.rb
110
+ - spec/fabricators/company_fabricator.rb
110
111
  - spec/fabricators/group_fabricator.rb
111
112
  - spec/fabricators/status_fabricator.rb
112
113
  - spec/fabricators/user_fabricator.rb
113
114
  - spec/orm/active_record.rb
114
115
  - spec/orm/mongoid.rb
115
116
  - spec/rails_app/Rakefile
117
+ - spec/rails_app/app/active_record/company.rb
116
118
  - spec/rails_app/app/active_record/group.rb
117
119
  - spec/rails_app/app/active_record/status.rb
118
120
  - spec/rails_app/app/active_record/user.rb
119
121
  - spec/rails_app/app/controllers/application_controller.rb
120
122
  - spec/rails_app/app/helpers/application_helper.rb
123
+ - spec/rails_app/app/mongoid/company.rb
121
124
  - spec/rails_app/app/mongoid/group.rb
122
125
  - spec/rails_app/app/mongoid/status.rb
123
126
  - spec/rails_app/app/mongoid/user.rb
@@ -140,6 +143,7 @@ files:
140
143
  - spec/rails_app/db/migrate/100_create_users.rb
141
144
  - spec/rails_app/db/migrate/101_create_groups.rb
142
145
  - spec/rails_app/db/migrate/102_create_statuses.rb
146
+ - spec/rails_app/db/migrate/103_create_companies.rb
143
147
  - spec/rails_app/db/seeds.rb
144
148
  - spec/rails_app/public/404.html
145
149
  - spec/rails_app/public/422.html
@@ -181,17 +185,20 @@ specification_version: 3
181
185
  summary: a social engine for Rails applications based on Redis and RebatDB.
182
186
  test_files:
183
187
  - spec/fabricators/attachment_fabricator.rb
188
+ - spec/fabricators/company_fabricator.rb
184
189
  - spec/fabricators/group_fabricator.rb
185
190
  - spec/fabricators/status_fabricator.rb
186
191
  - spec/fabricators/user_fabricator.rb
187
192
  - spec/orm/active_record.rb
188
193
  - spec/orm/mongoid.rb
189
194
  - spec/rails_app/Rakefile
195
+ - spec/rails_app/app/active_record/company.rb
190
196
  - spec/rails_app/app/active_record/group.rb
191
197
  - spec/rails_app/app/active_record/status.rb
192
198
  - spec/rails_app/app/active_record/user.rb
193
199
  - spec/rails_app/app/controllers/application_controller.rb
194
200
  - spec/rails_app/app/helpers/application_helper.rb
201
+ - spec/rails_app/app/mongoid/company.rb
195
202
  - spec/rails_app/app/mongoid/group.rb
196
203
  - spec/rails_app/app/mongoid/status.rb
197
204
  - spec/rails_app/app/mongoid/user.rb
@@ -214,6 +221,7 @@ test_files:
214
221
  - spec/rails_app/db/migrate/100_create_users.rb
215
222
  - spec/rails_app/db/migrate/101_create_groups.rb
216
223
  - spec/rails_app/db/migrate/102_create_statuses.rb
224
+ - spec/rails_app/db/migrate/103_create_companies.rb
217
225
  - spec/rails_app/db/seeds.rb
218
226
  - spec/rails_app/public/404.html
219
227
  - spec/rails_app/public/422.html