Commit 0f3a095d3c659d91f509040cf2eda1ad35ddd0e3

Authored by Tom Cocca
2 parents 4bd761e1 4f9c4cc3
Exists in master

Merge pull request #32 from rafael/master

Update the code to work with Rails 4.
@@ -3,7 +3,7 @@ Bundler::GemHelper.install_tasks @@ -3,7 +3,7 @@ Bundler::GemHelper.install_tasks
3 3
4 require 'rake' 4 require 'rake'
5 require 'rake/testtask' 5 require 'rake/testtask'
6 -require 'rake/rdoctask' 6 +require 'rdoc/task'
7 7
8 desc 'Default: run unit tests.' 8 desc 'Default: run unit tests.'
9 task :default => :test 9 task :default => :test
acts_as_follower.gemspec
@@ -19,7 +19,8 @@ Gem::Specification.new do |s| @@ -19,7 +19,8 @@ Gem::Specification.new do |s|
19 s.require_paths = ["lib"] 19 s.require_paths = ["lib"]
20 20
21 s.add_development_dependency "sqlite3" 21 s.add_development_dependency "sqlite3"
22 - s.add_development_dependency "shoulda"  
23 - s.add_development_dependency "factory_girl"  
24 - s.add_development_dependency "rails", "~>3.0.10" 22 + s.add_development_dependency "shoulda_create"
  23 + s.add_development_dependency "shoulda", "3.5.0"
  24 + s.add_development_dependency "factory_girl", "4.2.0"
  25 + s.add_development_dependency "rails", "~>4.0.0"
25 end 26 end
lib/acts_as_follower/follow_scopes.rb
@@ -2,7 +2,8 @@ module ActsAsFollower #:nodoc: @@ -2,7 +2,8 @@ module ActsAsFollower #:nodoc:
2 module FollowScopes 2 module FollowScopes
3 3
4 def for_follower(follower) 4 def for_follower(follower)
5 - where(:follower_id => follower.id, :follower_type => parent_class_name(follower)) 5 + where(:follower_id => follower.id,
  6 + :follower_type => parent_class_name(follower))
6 end 7 end
7 8
8 def for_followable(followable) 9 def for_followable(followable)
lib/acts_as_follower/followable.rb
@@ -25,8 +25,8 @@ module ActsAsFollower #:nodoc: @@ -25,8 +25,8 @@ module ActsAsFollower #:nodoc:
25 follows = follower_type.constantize. 25 follows = follower_type.constantize.
26 joins(:follows). 26 joins(:follows).
27 where('follows.blocked' => false, 27 where('follows.blocked' => false,
28 - 'follows.followable_id' => self.id,  
29 - 'follows.followable_type' => parent_class_name(self), 28 + 'follows.followable_id' => self.id,
  29 + 'follows.followable_type' => parent_class_name(self),
30 'follows.follower_type' => follower_type) 30 'follows.follower_type' => follower_type)
31 if options.has_key?(:limit) 31 if options.has_key?(:limit)
32 follows = follows.limit(options[:limit]) 32 follows = follows.limit(options[:limit])
@@ -59,19 +59,27 @@ module ActsAsFollower #:nodoc: @@ -59,19 +59,27 @@ module ActsAsFollower #:nodoc:
59 self.followings.blocked.count 59 self.followings.blocked.count
60 end 60 end
61 61
62 - # Returns the following records. 62 + # Returns the followings records scoped
  63 + def followers_scoped
  64 + self.followings.includes(:follower)
  65 + end
  66 +
63 def followers(options={}) 67 def followers(options={})
64 - self.followings.unblocked.includes(:follower).all(options).collect{|f| f.follower} 68 + followers_scope = followers_scoped.unblocked
  69 + followers_scope = apply_options_to_scope(followers_scope, options)
  70 + followers_scope.to_a.collect{|f| f.follower}
65 end 71 end
66 72
67 def blocks(options={}) 73 def blocks(options={})
68 - self.followings.blocked.includes(:follower).all(options).collect{|f| f.follower} 74 + blocked_followers_scope = followers_scoped.blocked
  75 + blocked_followers_scope = apply_options_to_scope(blocked_followers_scope, options)
  76 + blocked_followers_scope.to_a.collect{|f| f.follower}
69 end 77 end
70 78
71 # Returns true if the current instance is followed by the passed record 79 # Returns true if the current instance is followed by the passed record
72 # Returns false if the current instance is blocked by the passed record or no follow is found 80 # Returns false if the current instance is blocked by the passed record or no follow is found
73 def followed_by?(follower) 81 def followed_by?(follower)
74 - self.followings.unblocked.for_follower(follower).exists? 82 + self.followings.unblocked.for_follower(follower).first.present?
75 end 83 end
76 84
77 def block(follower) 85 def block(follower)
@@ -89,7 +97,7 @@ module ActsAsFollower #:nodoc: @@ -89,7 +97,7 @@ module ActsAsFollower #:nodoc:
89 private 97 private
90 98
91 def block_future_follow(follower) 99 def block_future_follow(follower)
92 - follows.create(:followable => self, :follower => follower, :blocked => true) 100 + Follow.create(:followable => self, :follower => follower, :blocked => true)
93 end 101 end
94 102
95 def block_existing_follow(follower) 103 def block_existing_follow(follower)
lib/acts_as_follower/follower.rb
@@ -29,7 +29,7 @@ module ActsAsFollower #:nodoc: @@ -29,7 +29,7 @@ module ActsAsFollower #:nodoc:
29 # Does not allow duplicate records to be created. 29 # Does not allow duplicate records to be created.
30 def follow(followable) 30 def follow(followable)
31 if self != followable 31 if self != followable
32 - self.follows.find_or_create_by_followable_id_and_followable_type(followable.id, parent_class_name(followable)) 32 + self.follows.find_or_create_by(followable_id: followable.id, followable_type: parent_class_name(followable))
33 end 33 end
34 end 34 end
35 35
@@ -40,14 +40,21 @@ module ActsAsFollower #:nodoc: @@ -40,14 +40,21 @@ module ActsAsFollower #:nodoc:
40 end 40 end
41 end 41 end
42 42
  43 + # returns the follows records to the current instance
  44 + def follows_scoped
  45 + self.follows.unblocked.includes(:followable)
  46 + end
  47 +
43 # Returns the follow records related to this instance by type. 48 # Returns the follow records related to this instance by type.
44 def follows_by_type(followable_type, options={}) 49 def follows_by_type(followable_type, options={})
45 - self.follows.unblocked.includes(:followable).for_followable_type(followable_type).all(options) 50 + follows_scope = follows_scoped.for_followable_type(followable_type)
  51 + follows_scope = apply_options_to_scope(follows_scope, options)
46 end 52 end
47 53
48 # Returns the follow records related to this instance with the followable included. 54 # Returns the follow records related to this instance with the followable included.
49 def all_follows(options={}) 55 def all_follows(options={})
50 - self.follows.unblocked.includes(:followable).all(options) 56 + follows_scope = follows_scoped
  57 + follows_scope = apply_options_to_scope(follows_scope, options)
51 end 58 end
52 59
53 # Returns the actual records which this instance is following. 60 # Returns the actual records which this instance is following.
@@ -60,8 +67,8 @@ module ActsAsFollower #:nodoc: @@ -60,8 +67,8 @@ module ActsAsFollower #:nodoc:
60 followables = followable_type.constantize. 67 followables = followable_type.constantize.
61 joins(:followings). 68 joins(:followings).
62 where('follows.blocked' => false, 69 where('follows.blocked' => false,
63 - 'follows.follower_id' => self.id,  
64 - 'follows.follower_type' => parent_class_name(self), 70 + 'follows.follower_id' => self.id,
  71 + 'follows.follower_type' => parent_class_name(self),
65 'follows.followable_type' => followable_type) 72 'follows.followable_type' => followable_type)
66 if options.has_key?(:limit) 73 if options.has_key?(:limit)
67 followables = followables.limit(options[:limit]) 74 followables = followables.limit(options[:limit])
lib/acts_as_follower/follower_lib.rb
@@ -11,5 +11,23 @@ module ActsAsFollower @@ -11,5 +11,23 @@ module ActsAsFollower
11 return obj.class.name 11 return obj.class.name
12 end 12 end
13 13
  14 + def apply_options_to_scope(scope, options = {})
  15 + if options.has_key?(:limit)
  16 + scope = scope.limit(options[:limit])
  17 + end
  18 + if options.has_key?(:includes)
  19 + scope = scope.includes(options[:includes])
  20 + end
  21 + if options.has_key?(:joins)
  22 + scope = scope.joins(options[:joins])
  23 + end
  24 + if options.has_key?(:where)
  25 + scope = scope.order(options[:where])
  26 + end
  27 + if options.has_key?(:order)
  28 + scope = scope.order(options[:order])
  29 + end
  30 + scope
  31 + end
14 end 32 end
15 end 33 end
test/acts_as_followable_test.rb
@@ -4,7 +4,7 @@ class ActsAsFollowableTest < ActiveSupport::TestCase @@ -4,7 +4,7 @@ class ActsAsFollowableTest < ActiveSupport::TestCase
4 4
5 context "instance methods" do 5 context "instance methods" do
6 setup do 6 setup do
7 - @sam = Factory(:sam) 7 + @sam = FactoryGirl.create(:sam)
8 end 8 end
9 9
10 should "be defined" do 10 should "be defined" do
@@ -16,10 +16,10 @@ class ActsAsFollowableTest < ActiveSupport::TestCase @@ -16,10 +16,10 @@ class ActsAsFollowableTest < ActiveSupport::TestCase
16 16
17 context "acts_as_followable" do 17 context "acts_as_followable" do
18 setup do 18 setup do
19 - @sam = Factory(:sam)  
20 - @jon = Factory(:jon)  
21 - @oasis = Factory(:oasis)  
22 - @metallica = Factory(:metallica) 19 + @sam = FactoryGirl.create(:sam)
  20 + @jon = FactoryGirl.create(:jon)
  21 + @oasis = FactoryGirl.create(:oasis)
  22 + @metallica = FactoryGirl.create(:metallica)
23 @sam.follow(@jon) 23 @sam.follow(@jon)
24 end 24 end
25 25
@@ -30,7 +30,7 @@ class ActsAsFollowableTest < ActiveSupport::TestCase @@ -30,7 +30,7 @@ class ActsAsFollowableTest < ActiveSupport::TestCase
30 end 30 end
31 31
32 should "return the proper number of multiple followers" do 32 should "return the proper number of multiple followers" do
33 - @bob = Factory(:bob) 33 + @bob = FactoryGirl.create(:bob)
34 @sam.follow(@bob) 34 @sam.follow(@bob)
35 assert_equal 0, @sam.followers_count 35 assert_equal 0, @sam.followers_count
36 assert_equal 1, @jon.followers_count 36 assert_equal 1, @jon.followers_count
@@ -45,7 +45,7 @@ class ActsAsFollowableTest < ActiveSupport::TestCase @@ -45,7 +45,7 @@ class ActsAsFollowableTest < ActiveSupport::TestCase
45 end 45 end
46 46
47 should "return users (multiple followers)" do 47 should "return users (multiple followers)" do
48 - @bob = Factory(:bob) 48 + @bob = FactoryGirl.create(:bob)
49 @sam.follow(@bob) 49 @sam.follow(@bob)
50 assert_equal [], @sam.followers 50 assert_equal [], @sam.followers
51 assert_equal [@sam], @jon.followers 51 assert_equal [@sam], @jon.followers
@@ -53,7 +53,7 @@ class ActsAsFollowableTest < ActiveSupport::TestCase @@ -53,7 +53,7 @@ class ActsAsFollowableTest < ActiveSupport::TestCase
53 end 53 end
54 54
55 should "return users (multiple followers, complex)" do 55 should "return users (multiple followers, complex)" do
56 - @bob = Factory(:bob) 56 + @bob = FactoryGirl.create(:bob)
57 @sam.follow(@bob) 57 @sam.follow(@bob)
58 @jon.follow(@bob) 58 @jon.follow(@bob)
59 assert_equal [], @sam.followers 59 assert_equal [], @sam.followers
@@ -62,7 +62,7 @@ class ActsAsFollowableTest < ActiveSupport::TestCase @@ -62,7 +62,7 @@ class ActsAsFollowableTest < ActiveSupport::TestCase
62 end 62 end
63 63
64 should "accept AR options" do 64 should "accept AR options" do
65 - @bob = Factory(:bob) 65 + @bob = FactoryGirl.create(:bob)
66 @bob.follow(@jon) 66 @bob.follow(@jon)
67 assert_equal 1, @jon.followers(:limit => 1).count 67 assert_equal 1, @jon.followers(:limit => 1).count
68 end 68 end
@@ -86,7 +86,7 @@ class ActsAsFollowableTest < ActiveSupport::TestCase @@ -86,7 +86,7 @@ class ActsAsFollowableTest < ActiveSupport::TestCase
86 86
87 context "get follow record" do 87 context "get follow record" do
88 setup do 88 setup do
89 - @bob = Factory(:bob) 89 + @bob = FactoryGirl.create(:bob)
90 @follow = @bob.follow(@sam) 90 @follow = @bob.follow(@sam)
91 end 91 end
92 92
@@ -101,7 +101,7 @@ class ActsAsFollowableTest < ActiveSupport::TestCase @@ -101,7 +101,7 @@ class ActsAsFollowableTest < ActiveSupport::TestCase
101 101
102 context "blocks" do 102 context "blocks" do
103 setup do 103 setup do
104 - @bob = Factory(:bob) 104 + @bob = FactoryGirl.create(:bob)
105 @jon.block(@sam) 105 @jon.block(@sam)
106 @jon.block(@bob) 106 @jon.block(@bob)
107 end 107 end
test/acts_as_follower_test.rb
@@ -4,7 +4,7 @@ class ActsAsFollowerTest < ActiveSupport::TestCase @@ -4,7 +4,7 @@ class ActsAsFollowerTest < ActiveSupport::TestCase
4 4
5 context "instance methods" do 5 context "instance methods" do
6 setup do 6 setup do
7 - @sam = Factory(:sam) 7 + @sam = FactoryGirl.create(:sam)
8 end 8 end
9 9
10 should "be defined" do 10 should "be defined" do
@@ -19,9 +19,9 @@ class ActsAsFollowerTest < ActiveSupport::TestCase @@ -19,9 +19,9 @@ class ActsAsFollowerTest < ActiveSupport::TestCase
19 19
20 context "acts_as_follower" do 20 context "acts_as_follower" do
21 setup do 21 setup do
22 - @sam = Factory(:sam)  
23 - @jon = Factory(:jon)  
24 - @oasis = Factory(:oasis) 22 + @sam = FactoryGirl.create(:sam)
  23 + @jon = FactoryGirl.create(:jon)
  24 + @oasis = FactoryGirl.create(:oasis)
25 @sam.follow(@jon) 25 @sam.follow(@jon)
26 @sam.follow(@oasis) 26 @sam.follow(@oasis)
27 end 27 end
@@ -83,8 +83,8 @@ class ActsAsFollowerTest < ActiveSupport::TestCase @@ -83,8 +83,8 @@ class ActsAsFollowerTest < ActiveSupport::TestCase
83 83
84 context "follows" do 84 context "follows" do
85 setup do 85 setup do
86 - @band_follow = Follow.find(:first, :conditions => ["follower_id = ? and follower_type = 'User' and followable_id = ? and followable_type = 'Band'", @sam.id, @oasis.id])  
87 - @user_follow = Follow.find(:first, :conditions => ["follower_id = ? and follower_type = 'User' and followable_id = ? and followable_type = 'User'", @sam.id, @jon.id]) 86 + @band_follow = Follow.where("follower_id = ? and follower_type = 'User' and followable_id = ? and followable_type = 'Band'", @sam.id, @oasis.id).first
  87 + @user_follow = Follow.where("follower_id = ? and follower_type = 'User' and followable_id = ? and followable_type = 'User'", @sam.id, @jon.id).first
88 end 88 end
89 89
90 context "follows_by_type" do 90 context "follows_by_type" do
@@ -94,7 +94,7 @@ class ActsAsFollowerTest < ActiveSupport::TestCase @@ -94,7 +94,7 @@ class ActsAsFollowerTest < ActiveSupport::TestCase
94 end 94 end
95 95
96 should "accept AR options" do 96 should "accept AR options" do
97 - @metallica = Factory(:metallica) 97 + @metallica = FactoryGirl.create(:metallica)
98 @sam.follow(@metallica) 98 @sam.follow(@metallica)
99 assert_equal 1, @sam.follows_by_type('Band', :limit => 1).count 99 assert_equal 1, @sam.follows_by_type('Band', :limit => 1).count
100 end 100 end
@@ -102,7 +102,7 @@ class ActsAsFollowerTest < ActiveSupport::TestCase @@ -102,7 +102,7 @@ class ActsAsFollowerTest < ActiveSupport::TestCase
102 102
103 context "following_by_type_count" do 103 context "following_by_type_count" do
104 should "return the count of the requested type" do 104 should "return the count of the requested type" do
105 - @metallica = Factory(:metallica) 105 + @metallica = FactoryGirl.create(:metallica)
106 @sam.follow(@metallica) 106 @sam.follow(@metallica)
107 assert_equal 2, @sam.following_by_type_count('Band') 107 assert_equal 2, @sam.following_by_type_count('Band')
108 assert_equal 1, @sam.following_by_type_count('User') 108 assert_equal 1, @sam.following_by_type_count('User')
@@ -146,7 +146,7 @@ class ActsAsFollowerTest < ActiveSupport::TestCase @@ -146,7 +146,7 @@ class ActsAsFollowerTest < ActiveSupport::TestCase
146 end 146 end
147 147
148 should "accept AR options" do 148 should "accept AR options" do
149 - @metallica = Factory(:metallica) 149 + @metallica = FactoryGirl.create(:metallica)
150 @sam.follow(@metallica) 150 @sam.follow(@metallica)
151 assert_equal 1, @sam.following_by_type('Band', :limit => 1).to_a.size 151 assert_equal 1, @sam.following_by_type('Band', :limit => 1).to_a.size
152 end 152 end
@@ -159,7 +159,7 @@ class ActsAsFollowerTest < ActiveSupport::TestCase @@ -159,7 +159,7 @@ class ActsAsFollowerTest < ActiveSupport::TestCase
159 end 159 end
160 160
161 should "call following_by_type_count" do 161 should "call following_by_type_count" do
162 - @metallica = Factory(:metallica) 162 + @metallica = FactoryGirl.create(:metallica)
163 @sam.follow(@metallica) 163 @sam.follow(@metallica)
164 assert_equal 2, @sam.following_bands_count 164 assert_equal 2, @sam.following_bands_count
165 assert_equal 1, @sam.following_users_count 165 assert_equal 1, @sam.following_users_count
test/dummy30/config/environments/test.rb
@@ -7,9 +7,6 @@ Dummy::Application.configure do @@ -7,9 +7,6 @@ Dummy::Application.configure do
7 # and recreated between test runs. Don't rely on the data there! 7 # and recreated between test runs. Don't rely on the data there!
8 config.cache_classes = true 8 config.cache_classes = true
9 9
10 - # Log error messages when you accidentally call methods on nil.  
11 - config.whiny_nils = true  
12 -  
13 # Show full error reports and disable caching 10 # Show full error reports and disable caching
14 config.consider_all_requests_local = true 11 config.consider_all_requests_local = true
15 12
test/factories/bands.rb
1 -Factory.define :oasis, :class => Band do |b|  
2 - b.name 'Oasis'  
3 -end 1 +FactoryGirl.define do
  2 + factory :oasis, :class => Band do |b|
  3 + b.name 'Oasis'
  4 + end
4 5
5 -Factory.define :metallica, :class => Band do |b|  
6 - b.name 'Metallica' 6 + factory :metallica, :class => Band do |b|
  7 + b.name 'Metallica'
  8 + end
7 end 9 end
test/factories/users.rb
1 -Factory.define :jon, :class => User do |u|  
2 - u.name 'Jon'  
3 -end 1 +FactoryGirl.define do
  2 + factory :jon, class: User do |u|
  3 + u.name 'Jon'
  4 + end
4 5
5 -Factory.define :sam, :class => User do |u|  
6 - u.name 'Sam'  
7 -end 6 + factory :sam, :class => User do |u|
  7 + u.name 'Sam'
  8 + end
8 9
9 -Factory.define :bob, :class => User do |u|  
10 - u.name 'Bob' 10 + factory :bob, :class => User do |u|
  11 + u.name 'Bob'
  12 + end
11 end 13 end
test/test_helper.rb
@@ -12,6 +12,7 @@ load(File.dirname(__FILE__) + '/schema.rb') @@ -12,6 +12,7 @@ load(File.dirname(__FILE__) + '/schema.rb')
12 require File.dirname(__FILE__) + '/../lib/generators/templates/model.rb' 12 require File.dirname(__FILE__) + '/../lib/generators/templates/model.rb'
13 13
14 require 'shoulda' 14 require 'shoulda'
  15 +require 'shoulda_create'
15 require 'factory_girl' 16 require 'factory_girl'
  17 +ActiveSupport::TestCase.extend(ShouldaCreate)
16 FactoryGirl.find_definitions 18 FactoryGirl.find_definitions
17 -