mongoid_socializer_actions 0.1.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,15 @@
1
+ module Mongoid
2
+ class Comment
3
+ include Mongoid::Document
4
+ include Mongoid::Timestamps
5
+
6
+ field :body, type: String
7
+
8
+ belongs_to :commenter, :class_name => 'User', :inverse_of => :comments
9
+ belongs_to :commentable, :polymorphic => true
10
+
11
+ def commentabled_obj
12
+ commentable_type.constantize.find(commentable_id)
13
+ end
14
+ end
15
+ end
data/app/models/like.rb CHANGED
@@ -2,9 +2,6 @@ module Mongoid
2
2
  class Like
3
3
  include Mongoid::Document
4
4
 
5
- # field :like_type
6
- # field :like_id
7
-
8
5
  belongs_to :liker, :class_name => 'User', :inverse_of => :likes
9
6
  belongs_to :likable, :polymorphic => true
10
7
  end
@@ -0,0 +1,15 @@
1
+ module Mongoid
2
+ module Commentable
3
+ extend ActiveSupport::Concern
4
+
5
+ included do |base|
6
+ base.field :comments_count, :type => Integer, :default => 0
7
+ base.has_many :comments, :class_name => 'Mongoid::Comment', :as => :commentable, :dependent => :destroy
8
+ end
9
+
10
+ def commenters
11
+ commenter_ids = comments.distinct('commenter_id')
12
+ User.find(commenter_ids)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,76 @@
1
+ module Mongoid
2
+ module Commenter
3
+ extend ActiveSupport::Concern
4
+
5
+ included do |base|
6
+ base.field :comments_count, :type => Integer, :default => 0
7
+ base.has_many :comments, :class_name => 'Mongoid::Comment', :inverse_of => :commenter, :dependent => :destroy
8
+ end
9
+
10
+ # Comment on a model
11
+ #
12
+ # Example:
13
+ # => @john.comment_on(@photo, { with: "Beautiful" } )
14
+ def comment_on(model, comment_body)
15
+ model.before_commented_by(self) if model.respond_to?('before_commented_by')
16
+ comment = model.comments.create!(body: comment_body)
17
+ comments << comment
18
+ model.inc(:comments_count, 1)
19
+ self.inc(:comments_count, 1)
20
+ model.after_commented_by(self) if model.respond_to?('after_commented_by')
21
+ self.before_comment(model) if self.respond_to?('before_comment')
22
+ self.after_comment(model) if self.respond_to?('after_comment')
23
+ comment
24
+ end
25
+
26
+ # Delete comment a model
27
+ #
28
+ # Example:
29
+ # => @john.delete_comment(comment_id)
30
+ def delete_comment(model_id)
31
+ comment = Comment.where(id: model_id).first
32
+ if comment.present?
33
+ comment.commentabled_obj.inc(:comments_count, -1)
34
+ comment.destroy
35
+ end
36
+ end
37
+
38
+ # Edit comment a model
39
+ #
40
+ # Example:
41
+ # => @john.edit_comment(comment_id, comment_body)
42
+ def edit_comment(comment_id, comment_body)
43
+ comment = Comment.where(_id: comment_id).first
44
+ comment.update_attributes(body: comment_body) if comment.present?
45
+ end
46
+
47
+ def comments_of(model)
48
+ Comment.where(commentable_type: model.class, commentable_id: model.id)
49
+ end
50
+
51
+ # get comments count by model
52
+ #
53
+ # Example:
54
+ # => @john.comments_count_by_model("Photo")
55
+ # => 1
56
+ def comments_count_by_model(model)
57
+ self.comments.where(:likable_type => model).count
58
+ end
59
+
60
+ def get_comments_of_kind(model = nil)
61
+ model ? comments.where(likable_type: model) : comments
62
+ end
63
+
64
+ private
65
+
66
+ def method_missing(missing_method, *args, &block)
67
+ if missing_method.to_s =~ /^(.+)_comments_count$/
68
+ comments_count_by_model($1.camelize)
69
+ elsif missing_method.to_s =~ /^(.+)_comments$/
70
+ get_comments_of_kind($1.singularize.camelize)
71
+ else
72
+ super
73
+ end
74
+ end
75
+ end
76
+ end
File without changes
@@ -1,5 +1,5 @@
1
1
  module Mongoid
2
2
  module MongoidSocializerActions
3
- VERSION = "0.1.0"
3
+ VERSION = "1.0.0"
4
4
  end
5
5
  end
@@ -1,4 +1,8 @@
1
1
  require 'mongoid_socializer_actions/likeable'
2
2
  require 'mongoid_socializer_actions/liker'
3
3
  require 'mongoid_socializer_actions/helper'
4
- require 'models/like'
4
+ require 'models/like'
5
+
6
+ require 'mongoid_socializer_actions/commentable'
7
+ require 'mongoid_socializer_actions/commenter'
8
+ require 'models/comment'
@@ -1,4 +1,5 @@
1
1
  class Album
2
2
  include Mongoid::Document
3
3
  include Mongoid::Likeable
4
+ include Mongoid::Commentable
4
5
  end
@@ -1,4 +1,5 @@
1
1
  class Photo
2
2
  include Mongoid::Document
3
3
  include Mongoid::Likeable
4
+ include Mongoid::Commentable
4
5
  end
@@ -1,6 +1,7 @@
1
1
  class User
2
2
  include Mongoid::Document
3
3
  include Mongoid::Liker
4
+ include Mongoid::Commenter
4
5
 
5
6
  field :name, type: String
6
7
  end
@@ -0,0 +1,79 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe Mongoid::Commenter do
4
+ describe User do
5
+ before :each do
6
+ @john = User.create(name: 'john')
7
+ @jashua = User.create(name: 'jashua')
8
+ end
9
+
10
+ describe Photo do
11
+ before :each do
12
+ @photo1 = Photo.create
13
+ @photo2 = Photo.create
14
+ end
15
+
16
+ it "should have no comments" do
17
+ [@photo1, @photo2].each { |t| t.comments.should be_empty }
18
+ end
19
+
20
+ it "should be commentable" do
21
+ expect{ @john.comment_on(@photo1, "Beautiful") }.to change(Mongoid::Comment, :count).by(1)
22
+ end
23
+
24
+ it "should be commented by commenter" do
25
+ @john.comment_on(@photo1, 'Beautiful')
26
+ @photo1.commenters.should include @john
27
+ end
28
+
29
+ it "should not be commented by others" do
30
+ @photo1.commenters.should_not include @john
31
+ end
32
+
33
+ it "should be commentable by multiple likers" do
34
+ expect do
35
+ @jashua.comment_on(@photo1, 'Beautiful')
36
+ @john.comment_on(@photo1, 'Not Beautiful')
37
+ end.to change { Mongoid::Comment.count }.by(2)
38
+ end
39
+
40
+ it "should be increase comments_count" do
41
+ expect{ @jashua.comment_on(@photo1, 'Beautiful') }.to change(@photo1, :comments_count).by(1)
42
+ end
43
+
44
+ it "should be increase comments_count" do
45
+ expect{ @jashua.comment_on(@photo1, 'Beautiful') }.to change(@jashua, :comments_count).by(1)
46
+ end
47
+
48
+ it "should have the correct comments count" do
49
+ @jashua.comment_on(@photo1, '')
50
+ @john.comment_on(@photo1, '')
51
+ @photo1.comments_count.should be 2
52
+ @jashua.comments_count.should be 1
53
+ @john.comments_count.should be 1
54
+ end
55
+
56
+ it "should be unlikable" do
57
+ comment = @jashua.comment_on(@photo1, 'Beautiful')
58
+ expect{ @jashua.delete_comment(comment) }.to change { Mongoid::Comment.count }.by(-1)
59
+ end
60
+
61
+ it "edit comment" do
62
+ comment = @jashua.comment_on(@photo1, 'Beautiful')
63
+ expect{ @jashua.edit_comment(comment, 'Not Beautiful') }.to change { comment.reload.body }.from('Beautiful').to('Not Beautiful')
64
+ end
65
+ end
66
+
67
+ describe "get comment by model" do
68
+ before :each do
69
+ @photo1 = Photo.create
70
+ @c1 = @john.comment_on(@photo1, "Beautiful")
71
+ @c2 = @john.comment_on(@photo1, "Excellemt")
72
+ end
73
+
74
+ it "should return photo comments" do
75
+ @john.comments_of(@photo1).should include @c1, @c2
76
+ end
77
+ end
78
+ end
79
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongoid_socializer_actions
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 1.0.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2013-02-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: mongoid
16
- requirement: &2152294160 !ruby/object:Gem::Requirement
16
+ requirement: &2152550520 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '3.0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2152294160
24
+ version_requirements: *2152550520
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: activesupport
27
- requirement: &2152293620 !ruby/object:Gem::Requirement
27
+ requirement: &2152549980 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,7 +32,7 @@ dependencies:
32
32
  version: '3.2'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2152293620
35
+ version_requirements: *2152549980
36
36
  description: Add liking, commentable, sharabel, tagabel ability to Mongoid documents.
37
37
  email:
38
38
  - sreehari@activesphere.com
@@ -46,8 +46,12 @@ files:
46
46
  - Gemfile
47
47
  - Rakefile
48
48
  - Readme.md
49
+ - app/models/comment.rb
49
50
  - app/models/like.rb
50
51
  - lib/mongoid_socializer_actions.rb
52
+ - lib/mongoid_socializer_actions/commentable.rb
53
+ - lib/mongoid_socializer_actions/commenter.rb
54
+ - lib/mongoid_socializer_actions/comments_spec.rb
51
55
  - lib/mongoid_socializer_actions/helper.rb
52
56
  - lib/mongoid_socializer_actions/likeable.rb
53
57
  - lib/mongoid_socializer_actions/liker.rb
@@ -57,6 +61,7 @@ files:
57
61
  - spec/mongoid/models/album.rb
58
62
  - spec/mongoid/models/photo.rb
59
63
  - spec/mongoid/models/user.rb
64
+ - spec/mongoid/mongoid_socializer_actions/comments_spec.rb
60
65
  - spec/mongoid/mongoid_socializer_actions/likes_spec.rb
61
66
  - spec/spec_helper.rb
62
67
  homepage: https://github.com/sreehari/mongoid_socializer_actions
@@ -89,5 +94,6 @@ test_files:
89
94
  - spec/mongoid/models/album.rb
90
95
  - spec/mongoid/models/photo.rb
91
96
  - spec/mongoid/models/user.rb
97
+ - spec/mongoid/mongoid_socializer_actions/comments_spec.rb
92
98
  - spec/mongoid/mongoid_socializer_actions/likes_spec.rb
93
99
  - spec/spec_helper.rb