Commit 14f515e1230290b42c437c2824ab7324a5531225
Committed by
GitHub
Exists in
master
Merge pull request #76 from merqlove/feature/custom-parent-classes
Rails 5 AR workflow addition.
Showing
11 changed files
with
119 additions
and
4 deletions
Show diff stats
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/band.rb
test/dummy30/app/models/user.rb
test/follow_test.rb
... | ... | @@ -7,4 +7,55 @@ class FollowTest < 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 | ... | ... |