Commit 14f515e1230290b42c437c2824ab7324a5531225

Authored by Justin Coyne
Committed by GitHub
2 parents 74f80f07 e14a1e4a
Exists in master

Merge pull request #76 from merqlove/feature/custom-parent-classes

Rails 5 AR workflow addition.
README.rdoc
... ... @@ -76,6 +76,18 @@ Make your model(s) that can follow other models acts_as_follower
76 76 ...
77 77 end
78 78  
  79 +Extended setup:
  80 + # config/initializers/acts_as_follower.rb
  81 +
  82 + # By default list of parent classes includes only `[ApplicationRecord, ActiveRecord::Base]`.
  83 + ActsAsFollower.custom_parent_classes = [CustomRecord]
  84 +
  85 + # OR
  86 +
  87 + ActsAsFollower.setup do |c|
  88 + c.custom_parent_classes = [...]
  89 + end
  90 +
79 91 ---
80 92  
81 93 === acts_as_follower methods
... ...
lib/acts_as_follower.rb
... ... @@ -6,5 +6,25 @@ module ActsAsFollower
6 6 autoload :FollowerLib, 'acts_as_follower/follower_lib'
7 7 autoload :FollowScopes, 'acts_as_follower/follow_scopes'
8 8  
  9 + def self.setup
  10 + @configuration ||= Configuration.new
  11 + yield @configuration if block_given?
  12 + end
  13 +
  14 + def self.method_missing(method_name, *args, &block)
  15 + @configuration.respond_to?(method_name) ?
  16 + @configuration.send(method_name, *args, &block) : super
  17 + end
  18 +
  19 + class Configuration
  20 + attr_accessor :custom_parent_classes
  21 +
  22 + def initialize
  23 + @custom_parent_classes = []
  24 + end
  25 + end
  26 +
  27 + setup
  28 +
9 29 require 'acts_as_follower/railtie' if defined?(Rails) && Rails::VERSION::MAJOR >= 3
10 30 end
... ...
lib/acts_as_follower/follower_lib.rb
... ... @@ -3,12 +3,14 @@ module ActsAsFollower
3 3  
4 4 private
5 5  
  6 + DEFAULT_PARENTS = [ApplicationRecord, ActiveRecord::Base]
  7 +
6 8 # Retrieves the parent class name if using STI.
7 9 def parent_class_name(obj)
8   - if obj.class.superclass != ActiveRecord::Base
  10 + unless parent_classes.include?(obj.class.superclass)
9 11 return obj.class.superclass.name
10 12 end
11   - return obj.class.name
  13 + obj.class.name
12 14 end
13 15  
14 16 def apply_options_to_scope(scope, options = {})
... ... @@ -29,5 +31,11 @@ module ActsAsFollower
29 31 end
30 32 scope
31 33 end
  34 +
  35 + def parent_classes
  36 + return DEFAULT_PARENTS unless ActsAsFollower.custom_parent_classes
  37 +
  38 + ActsAsFollower.custom_parent_classes + DEFAULT_PARENTS
  39 + end
32 40 end
33 41 end
... ...
test/dummy30/app/models/application_record.rb 0 โ†’ 100644
... ... @@ -0,0 +1,3 @@
  1 +class ApplicationRecord < ActiveRecord::Base
  2 + self.abstract_class = true
  3 +end
... ...
test/dummy30/app/models/band.rb
1   -class Band < ActiveRecord::Base
  1 +class Band < ApplicationRecord
2 2 validates_presence_of :name
3 3 acts_as_followable
4 4 end
... ...
test/dummy30/app/models/custom_record.rb 0 โ†’ 100644
... ... @@ -0,0 +1,3 @@
  1 +class CustomRecord < ActiveRecord::Base
  2 + self.abstract_class = true
  3 +end
... ...
test/dummy30/app/models/some.rb 0 โ†’ 100644
... ... @@ -0,0 +1,5 @@
  1 +class Some < CustomRecord
  2 + validates_presence_of :name
  3 + acts_as_follower
  4 + acts_as_followable
  5 +end
... ...
test/dummy30/app/models/user.rb
1   -class User < ActiveRecord::Base
  1 +class User < ApplicationRecord
2 2 validates_presence_of :name
3 3 acts_as_follower
4 4 acts_as_followable
... ...
test/factories/somes.rb 0 โ†’ 100644
... ... @@ -0,0 +1,9 @@
  1 +FactoryGirl.define do
  2 + factory :daddy, :class => Some do |b|
  3 + b.name 'Daddy'
  4 + end
  5 +
  6 + factory :mommy, :class => Some do |b|
  7 + b.name 'Mommy'
  8 + end
  9 +end
... ...
test/follow_test.rb
... ... @@ -7,4 +7,55 @@ class FollowTest &lt; ActiveSupport::TestCase
7 7 assert true
8 8 end
9 9  
  10 + context "configuration with setters" do
  11 + should "contain custom parents" do
  12 + ActsAsFollower.custom_parent_classes = [CustomRecord]
  13 +
  14 + assert_equal [CustomRecord], ActsAsFollower.custom_parent_classes
  15 + end
  16 + end
  17 +
  18 + context "#setup" do
  19 + should "contain custom parents via setup" do
  20 + ActsAsFollower.setup do |c|
  21 + c.custom_parent_classes = [CustomRecord]
  22 + end
  23 +
  24 + assert_equal [CustomRecord], ActsAsFollower.custom_parent_classes
  25 + end
  26 + end
  27 +
  28 + context "with custom parents" do
  29 + setup do
  30 + @daddy = FactoryGirl.create(:daddy)
  31 + @mommy = FactoryGirl.create(:mommy)
  32 + @oasis = FactoryGirl.create(:oasis)
  33 + @metallica = FactoryGirl.create(:metallica)
  34 + end
  35 +
  36 + should "be followed" do
  37 + ActsAsFollower.custom_parent_classes = [CustomRecord]
  38 +
  39 + @daddy.follow(@mommy)
  40 + @daddy.follow(@metallica)
  41 + @mommy.follow(@oasis)
  42 + assert_equal true, @daddy.following?(@mommy)
  43 + assert_equal false, @mommy.following?(@daddy)
  44 + assert_equal true, @mommy.followed_by?(@daddy)
  45 + assert_equal false, @daddy.followed_by?(@mommy)
  46 + assert_equal true, @metallica.followed_by?(@daddy)
  47 + assert_equal true, @oasis.followed_by?(@mommy)
  48 + assert_equal true, @daddy.following?(@metallica)
  49 + assert_equal true, @mommy.following?(@oasis)
  50 + end
  51 +
  52 + should "be not followed" do
  53 + ActsAsFollower.custom_parent_classes = []
  54 +
  55 + @daddy.follow(@mommy)
  56 + @mommy.follow(@oasis)
  57 + assert_equal false, @daddy.following?(@mommy)
  58 + assert_equal false, @mommy.following?(@oasis)
  59 + end
  60 + end
10 61 end
... ...
test/schema.rb
... ... @@ -18,4 +18,8 @@ ActiveRecord::Schema.define :version =&gt; 0 do
18 18 t.column :name, :string
19 19 end
20 20  
  21 + create_table :somes, :force => true do |t|
  22 + t.column :name, :string
  23 + end
  24 +
21 25 end
... ...