mongoid_follow 0.0.2 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.rdoc CHANGED
@@ -1,57 +1,75 @@
1
- = Follow stuff for Mongoid
1
+ = Follow feature for Rails3 with Mongoid
2
2
 
3
3
  == Installation
4
4
 
5
5
  In Gemfile:
6
- gem 'mongoid_follow""
6
+ gem 'mongoid_follow'
7
+
8
+ == Legend (to ease complications)
9
+
10
+ "follower" is a model who follows
11
+ "followee" is a model who would be followed
7
12
 
8
13
  == To use
9
14
 
10
- To make mongoid_follow usable you need to include Mongoid::Followee into your document
11
- Meanwhile, you also need to include Mongoid::Follower in your follower model:
15
+ To make mongoid_follow usable you need to include Mongoid::Followee into your document who would be followed then you also need to include Mongoid::Follower in your follower model:
12
16
 
13
17
  class User
14
18
  include Mongoid::Document
19
+
15
20
  include Mongoid::Followee
16
21
  include Mongoid::Follower
17
22
  end
18
23
 
19
24
  class Group
20
25
  include Mongoid::Document
26
+
21
27
  include Mongoid::Followee
22
28
  end
23
29
 
24
30
  You can then follow a model using:
25
31
 
26
- @bonnie = User.new
27
- @bonnie.save
32
+ @bonnie = User.create
33
+ @clyde = User.create
34
+
35
+ @bonnie.follow(@clyde)
36
+ @bonnie.unfollow(@clyde)
37
+
38
+ You can also see whether a model is a follower of another model or if a model is a followee of another model:
39
+
40
+ @clyde.follower?(@bonnie)
41
+ @bonnie.followee?(@clyde)
42
+
43
+ You can also be a follower of other models
28
44
 
29
- current_user.follow(@clyde)
30
- current_user.unfollow?(@clyde)
45
+ @gang = Group.create
46
+ @bonnie.follow(@group)
31
47
 
32
- You can also see whether a model is a follower of another model or a model is a followee of another model:
48
+ @gang.follower?(@bonnie)
49
+ @bonnie.follows?(@gang)
33
50
 
34
- current_user.follower?(@clyde)
35
- current_user.followee?(@clyde)
51
+ * Any bug or issue, please send me an email to aeguintu@gmail.com
36
52
 
37
- Of course, you can get a list of followers/followees:
53
+ == For development
38
54
 
39
- @clyde.followers
40
- @bonnie.followees
55
+ gem install 'mongoid'
56
+ gem install 'bson_ext'
57
+ gem install 'database_cleaner'
58
+ gem install 'rspec'
41
59
 
42
- * Any bug or issue, please send me an email: aeguintu@gmail.com
60
+ rake spec/specs/follow_spec_rb
43
61
 
44
62
  == TODO
45
63
 
46
- * finish up todo's
47
- * count of followers/followees
48
- * common followers (or maybe followees)
49
- * maybe... (un)authorization of who can follow (model)
50
- * most/least followed/following #FINISHED
64
+ * finish up todo's (list of followers and followees) ==FINISHED
65
+ * count of followers/followees ==FINISHED
66
+ * common followers (or maybe followees) ==FINISHED
51
67
 
52
68
  == Thanks
53
69
 
54
- Thanks the mongoid_followable for
70
+ Super thanks:
71
+ to mongoid_followable.
72
+ to Tristan Peralta.
55
73
 
56
74
  == Copyright
57
75
 
@@ -3,10 +3,11 @@ module Mongoid
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  included do |base|
6
+ base.field :fferc, :type => Integer, :default => 0
6
7
  base.has_many :followers, :class_name => 'Follow', :as => :follower, :dependent => :destroy
7
8
  end
8
9
 
9
- # see if this model is followed of some model
10
+ # know if self is followed by model
10
11
  #
11
12
  # Example:
12
13
  # >> @clyde.follower?(@bonnie)
@@ -15,13 +16,41 @@ module Mongoid
15
16
  0 < self.followers.find(:all, conditions: {ff_id: model.id}).limit(1).count
16
17
  end
17
18
 
19
+ # get followees count
20
+ #
21
+ # Example:
22
+ # >> @bonnie.followees_count
23
+ # => 1
24
+ def followers_count
25
+ self.fferc
26
+ end
27
+
18
28
  # view all selfs followers
19
29
  #
20
30
  # Example:
21
- # >> @clyde.follower?(@bonnie)
22
- # => true
23
- def followers(model)
24
- #TODO
31
+ # >> @clyde.all_followers
32
+ # => [@bonnie, @alec]
33
+ def all_followers
34
+ get_followers_of(self)
35
+ end
36
+
37
+ # view all common followers of self against model
38
+ #
39
+ # Example:
40
+ # >> @clyde.common_followers_with(@gang)
41
+ # => [@bonnie, @alec]
42
+ def common_followers_with(model)
43
+ model_followers = get_followers_of(model)
44
+ self_followers = get_followers_of(self)
45
+
46
+ self_followers & model_followers
47
+ end
48
+
49
+ private
50
+ def get_followers_of(me)
51
+ me.followers.collect do |f|
52
+ f.ff_type.constantize.find(f.ff_id)
53
+ end
25
54
  end
26
55
  end
27
56
  end
@@ -3,6 +3,7 @@ module Mongoid
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  included do |base|
6
+ base.field :ffeec, :type => Integer, :default => 0
6
7
  base.has_many :followees, :class_name => 'Follow', :as => :followee, :dependent => :destroy
7
8
  end
8
9
 
@@ -11,9 +12,15 @@ module Mongoid
11
12
  # Example:
12
13
  # >> @bonnie.follow(@clyde)
13
14
  def follow(model)
14
- model.followers.create!(:ff_type => self.class.name, :ff_id => self.id)
15
+ if self.id != model.id && !self.follows?(model)
16
+ model.followers.create!(:ff_type => self.class.name, :ff_id => self.id)
17
+ model.inc(:fferc, 1)
15
18
 
16
- self.followees.create!(:ff_type => model.class.name, :ff_id => model.id)
19
+ self.followees.create!(:ff_type => model.class.name, :ff_id => model.id)
20
+ self.inc(:ffeec, 1)
21
+ else
22
+ return false
23
+ end
17
24
  end
18
25
 
19
26
  # unfollow a model
@@ -21,12 +28,18 @@ module Mongoid
21
28
  # Example:
22
29
  # >> @bonnie.unfollow(@clyde)
23
30
  def unfollow(model)
24
- model.followers.where(:ff_type => self.class.name, :ff_id => self.id).destroy
31
+ if self.id != model.id && self.follows?(model)
32
+ model.followers.where(:ff_type => self.class.name, :ff_id => self.id).destroy
33
+ model.inc(:fferc, -1)
25
34
 
26
- self.followees.where(:ff_type => model.class.name, :ff_id => model.id).destroy
35
+ self.followees.where(:ff_type => model.class.name, :ff_id => model.id).destroy
36
+ self.inc(:ffeec, -1)
37
+ else
38
+ return false
39
+ end
27
40
  end
28
41
 
29
- # follow a model
42
+ # know if self is already following model
30
43
  #
31
44
  # Example:
32
45
  # >> @bonnie.follows?(@clyde)
@@ -35,12 +48,41 @@ module Mongoid
35
48
  0 < self.followees.find(:all, conditions: {ff_id: model.id}).limit(1).count
36
49
  end
37
50
 
51
+ # get followees count
52
+ #
53
+ # Example:
54
+ # >> @bonnie.followees_count
55
+ # => 1
56
+ def followees_count
57
+ self.ffeec
58
+ end
59
+
38
60
  # view all selfs followees
39
61
  #
40
62
  # Example:
41
- # >> @alec.followees
42
- def followees(model)
43
- # TODO
63
+ # >> @alec.all_followees
64
+ # => [@bonnie]
65
+ def all_followees
66
+ get_followees_of(self)
67
+ end
68
+
69
+ # view all common followees of self against model
70
+ #
71
+ # Example:
72
+ # >> @clyde.common_followees_with(@gang)
73
+ # => [@bonnie, @alec]
74
+ def common_followees_with(model)
75
+ model_followees = get_followees_of(model)
76
+ self_followees = get_followees_of(self)
77
+
78
+ self_followees & model_followees
79
+ end
80
+
81
+ private
82
+ def get_followees_of(me)
83
+ me.followees.collect do |f|
84
+ f.ff_type.constantize.find(f.ff_id)
85
+ end
44
86
  end
45
87
  end
46
88
  end
@@ -1,3 +1,3 @@
1
1
  module MongoidFollow
2
- VERSION = "0.0.2"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -9,8 +9,8 @@ Gem::Specification.new do |s|
9
9
  s.authors = ["Alec Guintu"]
10
10
  s.email = ["animerei12@gmail.com"]
11
11
  s.homepage = "https://github.com/alecguintu/mongoid_follow"
12
- s.summary = %q{ Add basic "follow" features to rails3/mongoid }
13
- s.description = %q{ A gem to add a basic "follow" feature if you're using rails3 with mongoid }
12
+ s.summary = %q{ Add basic "follow" features to rails3 + mongoid }
13
+ s.description = %q{ Gem to add basic "follow" features if you're using rails3 with mongoid }
14
14
 
15
15
  s.rubyforge_project = "mongoid_follow"
16
16
 
data/spec/models/group.rb CHANGED
@@ -1,4 +1,6 @@
1
1
  class Group
2
2
  include Mongoid::Document
3
3
  include Mongoid::Followee
4
+
5
+ field :name
4
6
  end
data/spec/models/user.rb CHANGED
@@ -2,4 +2,6 @@ class User
2
2
  include Mongoid::Document
3
3
  include Mongoid::Followee
4
4
  include Mongoid::Follower
5
+
6
+ field :name
5
7
  end
@@ -5,17 +5,11 @@ describe Mongoid::Follower do
5
5
  describe User do
6
6
 
7
7
  before do
8
- @bonnie = User.new
9
- @bonnie.save
8
+ @bonnie = User.create(:name => 'Bonnie')
9
+ @clyde = User.create(:name => 'Clyde')
10
+ @alec = User.create(:name => 'Alec')
10
11
 
11
- @clyde = User.new
12
- @clyde.save
13
-
14
- @alec = User.new
15
- @alec.save
16
-
17
- @gang = Group.new
18
- @gang.save
12
+ @gang = Group.create(:name => 'Gang')
19
13
  end
20
14
 
21
15
  it "should have no follows or followers" do
@@ -33,6 +27,16 @@ describe Mongoid::Follower do
33
27
  @clyde.follower?(@bonnie).should be_true
34
28
  end
35
29
 
30
+ it "should decline to follow self" do
31
+ @bonnie.follow(@bonnie).should be_false
32
+ end
33
+
34
+ it "should decline two follows" do
35
+ @bonnie.follow(@clyde)
36
+
37
+ @bonnie.follow(@clyde).should be_false
38
+ end
39
+
36
40
  it "can unfollow another User" do
37
41
  @bonnie.follows?(@clyde).should be_false
38
42
  @clyde.follower?(@bonnie).should be_false
@@ -46,11 +50,80 @@ describe Mongoid::Follower do
46
50
  @clyde.follower?(@bonnie).should be_false
47
51
  end
48
52
 
53
+ it "should decline unfollow of non-followed User" do
54
+ @bonnie.unfollow(@clyde).should be_false
55
+ end
56
+
57
+ it "should decline unfollow of self" do
58
+ @bonnie.unfollow(@bonnie).should be_false
59
+ end
60
+
49
61
  it "can follow a group" do
50
62
  @bonnie.follow(@gang)
51
63
 
52
64
  @bonnie.follows?(@gang).should be_true
53
65
  @gang.follower?(@bonnie).should be_true
54
66
  end
67
+
68
+ it "should increment / decrement counters" do
69
+ @clyde.followers_count.should == 0
70
+
71
+ @bonnie.follow(@clyde)
72
+
73
+ @bonnie.followees_count.should == 1
74
+ @clyde.followers_count.should == 1
75
+
76
+ @alec.follow(@clyde)
77
+ @clyde.followers_count.should == 2
78
+ @bonnie.followers_count.should == 0
79
+
80
+ @alec.unfollow(@clyde)
81
+ @alec.followees_count.should == 0
82
+ @clyde.followers_count.should == 1
83
+
84
+ @bonnie.unfollow(@clyde)
85
+ @bonnie.followees_count.should == 0
86
+ @clyde.followers_count.should == 0
87
+ end
88
+
89
+ it "should list all followers" do
90
+ @bonnie.follow(@clyde)
91
+ # @clyde.all_followers.should == [@bonnie] # spec has an error on last #all_followers when this is called
92
+
93
+ @alec.follow(@clyde)
94
+ @clyde.all_followers.should == [@bonnie, @alec]
95
+ end
96
+
97
+ it "should list all followee" do
98
+ @bonnie.follow(@clyde)
99
+ # @bonnie.all_followees.should == [@clyde] # spec has an error on last #all_followees when this is called
100
+
101
+ @bonnie.follow(@gang)
102
+ @bonnie.all_followees.should == [@clyde, @gang]
103
+ end
104
+
105
+ it "should have common followers" do
106
+ @bonnie.follow(@clyde)
107
+ @bonnie.follow(@gang)
108
+
109
+ @gang.common_followers_with(@clyde).should == [@bonnie]
110
+
111
+ @alec.follow(@clyde)
112
+ @alec.follow(@gang)
113
+
114
+ @clyde.common_followers_with(@gang).should == [@bonnie, @alec]
115
+ end
116
+
117
+ it "should have common followees" do
118
+ @bonnie.follow(@gang)
119
+ @alec.follow(@gang)
120
+
121
+ @alec.common_followees_with(@bonnie).should == [@gang]
122
+
123
+ @bonnie.follow(@clyde)
124
+ @alec.follow(@clyde)
125
+
126
+ @bonnie.common_followees_with(@alec).should == [@gang, @clyde]
127
+ end
55
128
  end
56
129
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: mongoid_follow
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.2
5
+ version: 0.1.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Alec Guintu
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-10-10 00:00:00 +08:00
13
+ date: 2011-11-03 00:00:00 +08:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -57,7 +57,7 @@ dependencies:
57
57
  version: "0"
58
58
  type: :development
59
59
  version_requirements: *id004
60
- description: " A gem to add a basic \"follow\" feature if you're using rails3 with mongoid "
60
+ description: " Gem to add basic \"follow\" features if you're using rails3 with mongoid "
61
61
  email:
62
62
  - animerei12@gmail.com
63
63
  executables: []
@@ -109,7 +109,7 @@ rubyforge_project: mongoid_follow
109
109
  rubygems_version: 1.6.2
110
110
  signing_key:
111
111
  specification_version: 3
112
- summary: Add basic "follow" features to rails3/mongoid
112
+ summary: Add basic "follow" features to rails3 + mongoid
113
113
  test_files:
114
114
  - spec/models/group.rb
115
115
  - spec/models/user.rb