recommendable 1.1.4 → 1.1.5

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.markdown CHANGED
@@ -1,8 +1,22 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
- 1.1.2 (Current version)
4
+ 1.1.5 (Current version)
5
5
  -----------------------
6
+ * Fix #47, a problem where models could not recommend themselves
7
+
8
+ 1.1.4
9
+ -----
10
+ * Fix #41, a problem where Resque rake tasks were required regardless of whether or not it was bundled
11
+ * Fix #46 by adding UniqueJob middleware for Sidekiq.
12
+ * Added caches for an item's number of likes and dislikes received
13
+
14
+ 1.1.3
15
+ -----
16
+ * Update Redis.
17
+
18
+ 1.1.2
19
+ -----
6
20
  * Fix #38, a problem with enqueueing users based on updating the score of a recommendable record
7
21
 
8
22
  1.1.1
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- recommendable (1.1.3)
4
+ recommendable (1.1.5)
5
5
  hooks
6
6
  rails (>= 3.0.0)
7
7
  redis (>= 2.2.0)
@@ -43,7 +43,7 @@ GEM
43
43
  hooks (0.2.0)
44
44
  i18n (0.6.0)
45
45
  journey (1.0.4)
46
- json (1.7.3)
46
+ json (1.7.4)
47
47
  mail (2.4.4)
48
48
  i18n (>= 0.4.0)
49
49
  mime-types (~> 1.16)
@@ -7,7 +7,10 @@ module Recommendable
7
7
  belongs_to :dislikeable, :polymorphic => true
8
8
 
9
9
  validates :user_id, :uniqueness => { :scope => [:dislikeable_id, :dislikeable_type],
10
- :message => "has already disliked this item" }
10
+ :message => "has already disliked this item" },
11
+ :presence => true
12
+ validates_presence_of :dislikeable_id
13
+ validates_presence_of :dislikeable_type
11
14
 
12
15
  def dislikeable_type=(sType)
13
16
  super sType.to_s.classify.constantize.base_class.to_s
@@ -7,7 +7,10 @@ module Recommendable
7
7
  belongs_to :ignorable, :polymorphic => true
8
8
 
9
9
  validates :user_id, :uniqueness => { :scope => [:ignorable_id, :ignorable_type],
10
- :message => "has already ignored this item" }
10
+ :message => "has already ignored this item" },
11
+ :presence => true
12
+ validates_presence_of :ignorable_id
13
+ validates_presence_of :ignorable_type
11
14
 
12
15
  def ignorable_type=(sType)
13
16
  super sType.to_s.classify.constantize.base_class.to_s
@@ -4,10 +4,13 @@ module Recommendable
4
4
  attr_accessible :user_id, :likeable_id, :likeable_type
5
5
 
6
6
  belongs_to :user, :class_name => Recommendable.user_class.to_s, :foreign_key => :user_id
7
- belongs_to :likeable, :polymorphic => true
7
+ belongs_to :likeable, :polymorphic => true, :foreign_key => :likeable_id
8
8
 
9
9
  validates :user_id, :uniqueness => { :scope => [:likeable_id, :likeable_type],
10
- :message => "has already liked this item" }
10
+ :message => "has already liked this item" },
11
+ :presence => true
12
+ validates_presence_of :likeable_id
13
+ validates_presence_of :likeable_type
11
14
 
12
15
  def likeable_type=(sType)
13
16
  super sType.to_s.classify.constantize.base_class.to_s
@@ -7,7 +7,10 @@ module Recommendable
7
7
  belongs_to :stashable, :polymorphic => :true
8
8
 
9
9
  validates :user_id, :uniqueness => { :scope => [:stashable_id, :stashable_type],
10
- :message => "has already stashed this item" }
10
+ :message => "has already stashed this item" },
11
+ :presence => true
12
+ validates_presence_of :stashable_id
13
+ validates_presence_of :stashable_type
11
14
 
12
15
  def stashable_type=(sType)
13
16
  super sType.to_s.classify.constantize.base_class.to_s
@@ -7,19 +7,19 @@ module Recommendable
7
7
  class_eval do
8
8
  Recommendable.recommendable_classes << self
9
9
 
10
- has_many :likes, :as => :likeable, :dependent => :destroy,
11
- :class_name => "Recommendable::Like"
12
- has_many :dislikes, :as => :dislikeable, :dependent => :destroy,
13
- :class_name => "Recommendable::Dislike"
14
- has_many :ignores, :as => :ignorable, :dependent => :destroy,
15
- :class_name => "Recommendable::Ignore"
16
- has_many :stashes, :as => :stashable, :dependent => :destroy,
17
- :class_name => "Recommendable::Stash"
18
-
19
- has_many :liked_by, :through => :likes, :source => :user, :foreign_key => :user_id,
20
- :class_name => Recommendable.user_class.to_s
21
- has_many :disliked_by, :through => :dislikes, :source => :user, :foreign_key => :user_id,
22
- :class_name => Recommendable.user_class.to_s
10
+ has_many :recommendable_likes, :as => :likeable, :dependent => :destroy,
11
+ :class_name => "Recommendable::Like"
12
+ has_many :recommendable_dislikes, :as => :dislikeable, :dependent => :destroy,
13
+ :class_name => "Recommendable::Dislike"
14
+ has_many :recommendable_ignores, :as => :ignorable, :dependent => :destroy,
15
+ :class_name => "Recommendable::Ignore"
16
+ has_many :recommendable_stashes, :as => :stashable, :dependent => :destroy,
17
+ :class_name => "Recommendable::Stash"
18
+
19
+ has_many :liked_by, :through => :recommendable_likes, :source => :user,
20
+ :foreign_key => :user_id, :class_name => Recommendable.user_class.to_s
21
+ has_many :disliked_by, :through => :recommendable_dislikes, :source => :user,
22
+ :foreign_key => :user_id, :class_name => Recommendable.user_class.to_s
23
23
 
24
24
  include LikeableMethods
25
25
  include DislikeableMethods
@@ -29,7 +29,7 @@ module Recommendable
29
29
  def self.acts_as_recommendable?() true end
30
30
 
31
31
  def been_rated?
32
- likes.count + dislikes.count > 0
32
+ recommendable_likes.count + recommendable_dislikes.count > 0
33
33
  end
34
34
 
35
35
  # Returns an array of users that have liked or disliked this item.
@@ -53,9 +53,9 @@ module Recommendable
53
53
  return 0 unless been_rated?
54
54
 
55
55
  z = 1.96
56
- n = likes.count + dislikes.count
56
+ n = recommendable_likes.count + recommendable_dislikes.count
57
57
 
58
- phat = likes.count / n.to_f
58
+ phat = recommendable_likes.count / n.to_f
59
59
  score = (phat + z*z/(2*n) - z * Math.sqrt((phat*(1-phat)+z*z/(4*n))/n))/(1+z*z/n)
60
60
 
61
61
  Recommendable.redis.zadd self.class.score_set, score, self.id
@@ -93,14 +93,15 @@ module Recommendable
93
93
  # @return [Array] an array of user IDs
94
94
  # @private
95
95
  def rates_by
96
- likes.map(&:user_id) + dislikes.map(&:user_id)
96
+ recommendable_likes.map(&:user_id) + recommendable_dislikes.map(&:user_id)
97
97
  end
98
98
 
99
99
  def self.score_set
100
100
  "#{self}:sorted"
101
101
  end
102
102
 
103
- private :likes, :dislikes, :ignores, :stashes
103
+ private :recommendable_likes, :recommendable_dislikes,
104
+ :recommendable_ignores, :recommendable_stashes
104
105
  end
105
106
  end
106
107
 
@@ -1,7 +1,7 @@
1
1
  module Recommendable
2
2
  MAJOR = 1
3
3
  MINOR = 1
4
- PATCH = 4
4
+ PATCH = 5
5
5
 
6
6
  VERSION = [MAJOR, MINOR, PATCH].join '.'
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: recommendable
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.4
4
+ version: 1.1.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-24 00:00:00.000000000 Z
12
+ date: 2012-07-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sqlite3