tekeya 0.0.7 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -19,6 +19,7 @@ group :test do
19
19
  gem 'fabrication' , '~> 2.3.0'
20
20
  gem 'faker' , '~> 1.1.2'
21
21
  gem 'simplecov' , '~> 0.7.0'
22
+ gem 'timecop' , '~> 0.5.9.1'
22
23
  end
23
24
 
24
25
  platforms :jruby do
@@ -4,8 +4,10 @@ class CreateActivities < ActiveRecord::Migration
4
4
  t.string :activity_type, null: false
5
5
  t.integer :entity_id, null: false
6
6
  t.string :entity_type, null: false
7
+ t.integer :author_id, null: false
8
+ t.string :author_type, null: false
7
9
 
8
10
  t.timestamps
9
11
  end
10
12
  end
11
- end
13
+ end
@@ -36,7 +36,7 @@ module Tekeya
36
36
  attachments << ::Tekeya::Attachment.new(attachable: attachable)
37
37
  end
38
38
 
39
- create(activity_type: meth, attachments: attachments, group_with_recent: options[:group].nil? ? true : options[:group])
39
+ create(activity_type: meth, attachments: attachments, group_with_recent: options[:group].nil? ? true : options[:group], author: options[:author])
40
40
  else
41
41
  super
42
42
  end
@@ -312,13 +312,19 @@ module Tekeya
312
312
  acts_keys = ::Tekeya.redis.zrevrange(pkey, 0, -1)
313
313
  # Retrieve the aggregates
314
314
  acts_keys.each do |act_key|
315
- acts << ::Tekeya::Feed::Activity::Item.from_redis(act_key, self)
315
+ # Make `from_redis` only hit the db if author != entity
316
+ key_components = act_key.split(':')
317
+ actor = if key_components[4] == self.class.to_s && key_components[5] == self.entity_primary_key
318
+ self
319
+ end
320
+
321
+ acts << ::Tekeya::Feed::Activity::Item.from_redis(act_key, actor)
316
322
  end
317
323
  else
318
324
  # Retrieve the activities from the DB
319
325
  db_recent_activities = self.activities.recent
320
326
  db_recent_activities.each do |activity|
321
- acts << ::Tekeya::Feed::Activity::Item.from_db(activity, self)
327
+ acts << ::Tekeya::Feed::Activity::Item.from_db(activity, activity.author)
322
328
  end
323
329
  end
324
330
 
@@ -19,4 +19,4 @@ module Tekeya
19
19
  end
20
20
  end
21
21
  end
22
- end
22
+ end
@@ -5,17 +5,23 @@ module Tekeya
5
5
 
6
6
  included do
7
7
  belongs_to :entity, polymorphic: true, autosave: true
8
+ belongs_to :author, polymorphic: true, autosave: true
8
9
  has_many :attachments, as: :attache, class_name: 'Tekeya::Attachment'
9
10
 
11
+ before_create do |act|
12
+ act.author ||= act.entity
13
+ end
10
14
  before_create :group_activities
15
+
11
16
  after_create :write_activity_in_redis
12
17
  after_destroy :delete_activity_from_redis
13
18
 
14
19
  accepts_nested_attributes_for :attachments
15
20
 
16
- validates_presence_of :attachments
21
+ validates_presence_of :attachments, :activity_type
17
22
 
18
23
  attr_writer :group_with_recent
24
+ attr_accessible :attachments, :activity_type, :author, :entity, :group_with_recent
19
25
  end
20
26
 
21
27
  # Check if this activity is cached in redis
@@ -40,7 +46,14 @@ module Tekeya
40
46
  return current_time_from_proper_timezone.to_i
41
47
  end
42
48
  else
43
- return Time.now.to_i
49
+ if from_time.present?
50
+ stamp = from_time.to_i
51
+
52
+ # floors the timestamp to the nearest 15 minute
53
+ return (stamp.to_f / 15.minutes).floor * 15.minutes
54
+ else
55
+ return Time.now.to_i
56
+ end
44
57
  end
45
58
  end
46
59
 
@@ -48,7 +61,16 @@ module Tekeya
48
61
  #
49
62
  # @return [String] the activity key
50
63
  def activity_key
51
- "activity:#{self.id}:#{self.entity_type}:#{self.entity.send(self.entity.entity_primary_key)}:#{self.activity_type}:#{score}"
64
+ k = []
65
+ k[0] = 'activity'
66
+ k[1] = self.id
67
+ k[2] = self.entity_type
68
+ k[3] = self.entity.send(self.entity.entity_primary_key)
69
+ k[4] = self.author_type
70
+ k[5] = self.author.send(self.author.entity_primary_key)
71
+ k[6] = self.activity_type
72
+ k[7] = score(self.created_at)
73
+ k.join(':')
52
74
  end
53
75
 
54
76
  # @private
@@ -82,7 +104,9 @@ module Tekeya
82
104
  def group_activities
83
105
  if self.group_with_recent
84
106
  self.created_at = current_time_from_proper_timezone
85
- rel = self.class.where(created_at: self.created_at, activity_type: self.activity_type, entity_id: self.entity_id, entity_type: entity_type)
107
+ rel = self.class.where( created_at: self.created_at, activity_type: self.activity_type,
108
+ entity_id: self.entity_id, entity_type: entity_type,
109
+ author_id: self.author_id, author_type: self.author_type)
86
110
  if rel.count > 0
87
111
  activity = rel.first
88
112
  activity.attachments << self.attachments
@@ -122,4 +146,4 @@ module Tekeya
122
146
  end
123
147
  end
124
148
  end
125
- end
149
+ end
@@ -21,12 +21,12 @@ module Tekeya
21
21
  key_components = key.split(':')
22
22
 
23
23
  act_id = key_components[1]
24
- act_type = key_components[4].to_sym
25
- act_time = Time.at(key_components[5].to_i)
24
+ act_type = key_components[6].to_sym
25
+ act_time = Time.at(key_components[7].to_i)
26
26
 
27
27
  if act_actor.nil?
28
- actor_class = key_components[2].safe_constantize
29
- act_actor = actor_class.where(:"#{actor_class.entity_primary_key}" => key_components[3]).first
28
+ actor_class = key_components[4].safe_constantize
29
+ act_actor = actor_class.where(:"#{actor_class.entity_primary_key}" => key_components[5]).first
30
30
  end
31
31
 
32
32
  act_attachments = ::Tekeya.redis.smembers(key).map{|act|
@@ -47,7 +47,7 @@ module Tekeya
47
47
  act_id = activity.id.to_s
48
48
  act_type = activity.activity_type.to_sym
49
49
  act_time = activity.created_at
50
- act_actor ||= activity.entity
50
+ act_actor ||= activity.author || activity.entity
51
51
  act_attachments = activity.attachments.map(&:attachable)
52
52
 
53
53
  return self.new(act_id, act_type, act_attachments, act_actor, act_time)
@@ -12,6 +12,7 @@ module Tekeya
12
12
  def self.perform(untracked_feed_key, untracker_feed_key)
13
13
  # get the keys to the activities so we can decrement the counters later
14
14
  activity_keys = ::Tekeya.redis.zrange(untracked_feed_key, 0, -1)
15
+ return if activity_keys.empty?
15
16
 
16
17
  ::Tekeya.redis.multi do
17
18
  # delete the latest activities of the untracked entity from the tracker feed
@@ -12,4 +12,4 @@ module Tekeya
12
12
  end
13
13
  end
14
14
  end
15
- end
15
+ end
@@ -9,6 +9,7 @@ module Tekeya
9
9
  belongs_to :notification_attache, polymorphic: true, autosave: true
10
10
 
11
11
  include ActiveModel::Serializers::JSON
12
+ attr_accessible :attache, :attachable, :notification_attache
12
13
  end
13
14
 
14
15
  module ClassMethods
@@ -16,4 +17,4 @@ module Tekeya
16
17
 
17
18
  end
18
19
  end
19
- end
20
+ end
@@ -15,6 +15,7 @@ module Tekeya
15
15
  validates_presence_of :actors
16
16
 
17
17
  attr_writer :group_with_recent
18
+ attr_accessible :entity, :subject, :actors, :notification_type, :read, :group_with_recent
18
19
  end
19
20
 
20
21
  module ClassMethods
@@ -90,4 +91,4 @@ module Tekeya
90
91
  end
91
92
  end
92
93
  end
93
- end
94
+ end
@@ -1,3 +1,3 @@
1
1
  module Tekeya
2
- VERSION = "0.0.7"
2
+ VERSION = "0.0.9"
3
3
  end
@@ -35,7 +35,7 @@ RSpec.configure do |config|
35
35
  DatabaseCleaner.clean
36
36
  end
37
37
 
38
- config.after(:each) do
38
+ config.before(:each) do
39
39
  Tekeya.relations.truncate
40
40
  Tekeya.redis.flushall
41
41
  end
@@ -63,7 +63,7 @@ RSpec.configure do |config|
63
63
  "loglevel" => "debug",
64
64
  "logfile" => "stdout",
65
65
  "databases" => 16
66
- }.map { |k, v| "#{k} #{v}" }.join('\n')
66
+ }.map { |k, v| "#{k} #{v}" }.join("\n")
67
67
  `echo '#{redis_options}' | redis-server -`
68
68
  end
69
69
 
@@ -75,4 +75,4 @@ RSpec.configure do |config|
75
75
 
76
76
  FileUtils.rm_r "#{File.dirname(__FILE__)}/rails_app/db/test.sqlite3" rescue nil
77
77
  end
78
- end
78
+ end
@@ -104,7 +104,10 @@ describe "Tekeya" do
104
104
  @act1.destroy
105
105
  @act3.destroy
106
106
  @act4.destroy
107
- @act5.destroy
107
+
108
+ Timecop.travel(Time.at(20.minutes)) do
109
+ @act5.destroy
110
+ end
108
111
  end
109
112
 
110
113
  it "should remove the activity from the cache when its deleted from the db" do
@@ -167,4 +170,4 @@ describe "Tekeya" do
167
170
  end
168
171
  end
169
172
  end
170
- end
173
+ end
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.7
4
+ version: 0.0.9
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: 2012-11-08 00:00:00.000000000 Z
13
+ date: 2013-01-27 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: redis
17
- requirement: &70202793029420 !ruby/object:Gem::Requirement
17
+ requirement: &70269641288980 !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: *70202793029420
25
+ version_requirements: *70269641288980
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: rebat
28
- requirement: &70202793028660 !ruby/object:Gem::Requirement
28
+ requirement: &70269641287740 !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: *70202793028660
36
+ version_requirements: *70269641287740
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: resque
39
- requirement: &70202793027640 !ruby/object:Gem::Requirement
39
+ requirement: &70269641285760 !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: *70202793027640
47
+ version_requirements: *70269641285760
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: railties
50
- requirement: &70202793026420 !ruby/object:Gem::Requirement
50
+ requirement: &70269641284580 !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: *70202793026420
58
+ version_requirements: *70269641284580
59
59
  description: a social engine for Rails applications based on Redis and RebatDB
60
60
  email:
61
61
  - omar.mekky@mashsolvents.com