acts_as_follower 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -191,14 +191,16 @@ If you have updates or patches or want to contribute I would love to see what yo
191
191
 
192
192
  Thanks to everyone for their interest and time in committing to making this plugin better.
193
193
 
194
- * dougal (Douglas F Shearer) - http://github.com/dougal
195
- * jdg (Jonathan George) - http://github.com/jdg
196
- * m3talsmith (Michael Christenson II) - http://github.com/m3talsmith
197
- * joergbattermann (Jörg Battermann) - http://github.com/joergbattermann
198
- * TomK32 (Thomas R. Koll) - http://github.com/TomK32
199
- * drcapulet (Alex Coomans) - http://github.com/drcapulet
200
- * jhchabran (Jean Hadrien Chabran) - http://github.com/jhchabran
201
- * arthurgeek (Arthur Zapparoli) - http://github.com/arthurgeek
194
+ * dougal (Douglas F Shearer) - https://github.com/dougal
195
+ * jdg (Jonathan George) - https://github.com/jdg
196
+ * m3talsmith (Michael Christenson II) - https://github.com/m3talsmith
197
+ * joergbattermann (Jörg Battermann) - https://github.com/joergbattermann
198
+ * TomK32 (Thomas R. Koll) - https://github.com/TomK32
199
+ * drcapulet (Alex Coomans) - https://github.com/drcapulet
200
+ * jhchabran (Jean Hadrien Chabran) - https://github.com/jhchabran
201
+ * arthurgeek (Arthur Zapparoli) - https://github.com/arthurgeek
202
+ * james2m (James McCarthy) - https://github.com/james2m
203
+ * peterjm (Peter McCracken) - https://github.com/peterjm
202
204
 
203
205
  Please let me know if I missed you.
204
206
 
data/Rakefile CHANGED
@@ -25,7 +25,6 @@ Rake::RDocTask.new(:rdoc) do |rdoc|
25
25
  end
26
26
 
27
27
  namespace :rcov do
28
-
29
28
  desc "Generate a coverage report in coverage/"
30
29
  task :gen do
31
30
  sh "rcov --output coverage test/*_test.rb --exclude 'gems/*'"
@@ -35,5 +34,4 @@ namespace :rcov do
35
34
  task :clobber do
36
35
  sh "rm -rdf coverage"
37
36
  end
38
-
39
- end
37
+ end
@@ -4,8 +4,7 @@ module ActsAsFollower
4
4
  autoload :Follower, 'acts_as_follower/follower'
5
5
  autoload :Followable, 'acts_as_follower/followable'
6
6
  autoload :FollowerLib, 'acts_as_follower/follower_lib'
7
-
7
+ autoload :FollowScopes, 'acts_as_follower/follow_scopes'
8
+
8
9
  require 'acts_as_follower/railtie' if defined?(Rails) && Rails::VERSION::MAJOR >= 3
9
10
  end
10
-
11
-
@@ -0,0 +1,37 @@
1
+ module ActsAsFollower #:nodoc:
2
+ module FollowScopes
3
+
4
+ def for_follower(follower)
5
+ where(:follower_id => follower.id, :follower_type => parent_class_name(follower))
6
+ end
7
+
8
+ def for_followable(followable)
9
+ where(:followable_id => followable.id, :followable_type => parent_class_name(followable))
10
+ end
11
+
12
+ def for_follower_type(follower_type)
13
+ where(:follower_type => follower_type)
14
+ end
15
+
16
+ def for_followable_type(followable_type)
17
+ where(:followable_type => followable_type)
18
+ end
19
+
20
+ def recent(from)
21
+ where(["created_at > ?", (from || 2.weeks.ago).to_s(:db)])
22
+ end
23
+
24
+ def descending
25
+ order("follows.created_at DESC")
26
+ end
27
+
28
+ def unblocked
29
+ where(:blocked => false)
30
+ end
31
+
32
+ def blocked
33
+ where(:blocked => true)
34
+ end
35
+
36
+ end
37
+ end
@@ -13,7 +13,6 @@ module ActsAsFollower #:nodoc:
13
13
  end
14
14
  end
15
15
 
16
-
17
16
  module InstanceMethods
18
17
 
19
18
  # Returns the number of followers a record has.
@@ -24,15 +23,17 @@ module ActsAsFollower #:nodoc:
24
23
  # Returns the followers by a given type
25
24
  def followers_by_type(follower_type, options={})
26
25
  follows = follower_type.constantize.
27
- includes(:follows).
28
- where('blocked = ?', false).
29
- where(
30
- "follows.followable_id = ? AND follows.followable_type = ? AND follows.follower_type = ?",
31
- self.id, parent_class_name(self), follower_type
32
- )
26
+ joins(:follows).
27
+ where('follows.blocked' => false,
28
+ 'follows.followable_id' => self.id,
29
+ 'follows.followable_type' => parent_class_name(self),
30
+ 'follows.follower_type' => follower_type)
33
31
  if options.has_key?(:limit)
34
32
  follows = follows.limit(options[:limit])
35
33
  end
34
+ if options.has_key?(:includes)
35
+ follows = follows.includes(options[:includes])
36
+ end
36
37
  follows
37
38
  end
38
39
 
@@ -70,8 +71,7 @@ module ActsAsFollower #:nodoc:
70
71
  # Returns true if the current instance is followed by the passed record
71
72
  # Returns false if the current instance is blocked by the passed record or no follow is found
72
73
  def followed_by?(follower)
73
- f = get_follow_for(follower)
74
- (f && !f.blocked?) ? true : false
74
+ self.followings.unblocked.for_follower(follower).exists?
75
75
  end
76
76
 
77
77
  def block(follower)
@@ -82,12 +82,12 @@ module ActsAsFollower #:nodoc:
82
82
  get_follow_for(follower).try(:delete)
83
83
  end
84
84
 
85
- private
86
-
87
85
  def get_follow_for(follower)
88
- Follow.for_followable(self).for_follower(follower).first
86
+ self.followings.for_follower(follower).first
89
87
  end
90
88
 
89
+ private
90
+
91
91
  def block_future_follow(follower)
92
92
  follows.create(:followable => self, :follower => follower, :blocked => true)
93
93
  end
@@ -28,9 +28,8 @@ module ActsAsFollower #:nodoc:
28
28
  # Creates a new follow record for this instance to follow the passed object.
29
29
  # Does not allow duplicate records to be created.
30
30
  def follow(followable)
31
- follow = get_follow(followable)
32
- if follow.blank? && self != followable
33
- Follow.create(:followable => followable, :follower => self)
31
+ if self != followable
32
+ self.follows.find_or_create_by_followable_id_and_followable_type(followable.id, parent_class_name(followable))
34
33
  end
35
34
  end
36
35
 
@@ -43,7 +42,7 @@ module ActsAsFollower #:nodoc:
43
42
 
44
43
  # Returns the follow records related to this instance by type.
45
44
  def follows_by_type(followable_type, options={})
46
- Follow.unblocked.includes(:followable).for_follower(self).for_followable_type(followable_type).find(:all, options)
45
+ self.follows.unblocked.includes(:followable).for_followable_type(followable_type).all(options)
47
46
  end
48
47
 
49
48
  # Returns the follow records related to this instance with the followable included.
@@ -58,21 +57,23 @@ module ActsAsFollower #:nodoc:
58
57
 
59
58
  # Returns the actual records of a particular type which this record is following.
60
59
  def following_by_type(followable_type, options={})
61
- follows = followable_type.constantize.
62
- includes(:followings).
63
- where('blocked = ?', false).
64
- where(
65
- "follows.follower_id = ? AND follows.follower_type = ? AND follows.followable_type = ?",
66
- self.id, parent_class_name(self), followable_type
67
- )
60
+ followables = followable_type.constantize.
61
+ joins(:followings).
62
+ where('follows.blocked' => false,
63
+ 'follows.follower_id' => self.id,
64
+ 'follows.follower_type' => parent_class_name(self),
65
+ 'follows.followable_type' => followable_type)
68
66
  if options.has_key?(:limit)
69
- follows = follows.limit(options[:limit])
67
+ followables = followables.limit(options[:limit])
70
68
  end
71
- follows
69
+ if options.has_key?(:includes)
70
+ followables = followables.includes(options[:includes])
71
+ end
72
+ followables
72
73
  end
73
74
 
74
75
  def following_by_type_count(followable_type)
75
- Follow.unblocked.for_follower(self).for_followable_type(followable_type).count
76
+ follows.unblocked.for_followable_type(followable_type).count
76
77
  end
77
78
 
78
79
  # Allows magic names on following_by_type
@@ -91,7 +92,7 @@ module ActsAsFollower #:nodoc:
91
92
 
92
93
  # Returns a follow record for the current instance and followable object.
93
94
  def get_follow(followable)
94
- Follow.unblocked.for_follower(self).for_followable(followable).first
95
+ self.follows.unblocked.for_followable(followable).first
95
96
  end
96
97
 
97
98
  end
@@ -1,8 +1,8 @@
1
1
  module ActsAsFollower
2
2
  module FollowerLib
3
-
3
+
4
4
  private
5
-
5
+
6
6
  # Retrieves the parent class name if using STI.
7
7
  def parent_class_name(obj)
8
8
  if obj.class.superclass != ActiveRecord::Base
@@ -10,6 +10,6 @@ module ActsAsFollower
10
10
  end
11
11
  return obj.class.name
12
12
  end
13
-
13
+
14
14
  end
15
15
  end
@@ -3,13 +3,13 @@ require 'rails'
3
3
 
4
4
  module ActsAsFollower
5
5
  class Railtie < Rails::Railtie
6
-
6
+
7
7
  initializer "acts_as_follower.active_record" do |app|
8
8
  ActiveSupport.on_load :active_record do
9
9
  include ActsAsFollower::Follower
10
10
  include ActsAsFollower::Followable
11
11
  end
12
12
  end
13
-
13
+
14
14
  end
15
- end
15
+ end
@@ -1,3 +1,3 @@
1
1
  module ActsAsFollower
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -1,21 +1,14 @@
1
1
  class Follow < ActiveRecord::Base
2
+
2
3
  extend ActsAsFollower::FollowerLib
3
-
4
- scope :for_follower, lambda { |follower| where(["follower_id = ? AND follower_type = ?", follower.id, parent_class_name(follower)]) }
5
- scope :for_followable, lambda { |followable| where(["followable_id = ? AND followable_type = ?", followable.id, parent_class_name(followable)]) }
6
- scope :for_follower_type, lambda { |follower_type| where("follower_type = ?", follower_type) }
7
- scope :for_followable_type, lambda { |followable_type| where("followable_type = ?", followable_type) }
8
- scope :recent, lambda { |from| where(["created_at > ?", (from || 2.weeks.ago).to_s(:db)]) }
9
- scope :descending, order("follows.created_at DESC")
10
- scope :unblocked, where(:blocked => false)
11
- scope :blocked, where(:blocked => true)
12
-
4
+ extend ActsAsFollower::FollowScopes
5
+
13
6
  # NOTE: Follows belong to the "followable" interface, and also to followers
14
7
  belongs_to :followable, :polymorphic => true
15
8
  belongs_to :follower, :polymorphic => true
16
-
9
+
17
10
  def block!
18
11
  self.update_attribute(:blocked, true)
19
12
  end
20
-
13
+
21
14
  end
@@ -84,6 +84,21 @@ class ActsAsFollowableTest < ActiveSupport::TestCase
84
84
  should_change("@sam.all_following.size", :by => -1) { @sam.all_following.size }
85
85
  end
86
86
 
87
+ context "get follow record" do
88
+ setup do
89
+ @bob = Factory(:bob)
90
+ @follow = @bob.follow(@sam)
91
+ end
92
+
93
+ should "return follow record" do
94
+ assert_equal @follow, @sam.get_follow_for(@bob)
95
+ end
96
+
97
+ should "return nil" do
98
+ assert_nil @sam.get_follow_for(@jon)
99
+ end
100
+ end
101
+
87
102
  context "blocks" do
88
103
  setup do
89
104
  @bob = Factory(:bob)
@@ -148,7 +148,7 @@ class ActsAsFollowerTest < ActiveSupport::TestCase
148
148
  should "accept AR options" do
149
149
  @metallica = Factory(:metallica)
150
150
  @sam.follow(@metallica)
151
- assert_equal 1, @sam.following_by_type('Band', :limit => 1).count
151
+ assert_equal 1, @sam.following_by_type('Band', :limit => 1).to_a.size
152
152
  end
153
153
  end
154
154
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: acts_as_follower
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 0
10
- version: 0.1.0
9
+ - 1
10
+ version: 0.1.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Tom Cocca
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-09-21 00:00:00 -04:00
18
+ date: 2011-11-06 01:00:00 -04:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -94,6 +94,7 @@ files:
94
94
  - acts_as_follower.gemspec
95
95
  - init.rb
96
96
  - lib/acts_as_follower.rb
97
+ - lib/acts_as_follower/follow_scopes.rb
97
98
  - lib/acts_as_follower/followable.rb
98
99
  - lib/acts_as_follower/follower.rb
99
100
  - lib/acts_as_follower/follower_lib.rb