mongoid_commentable 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -4,6 +4,7 @@ gem "mongoid", "~> 2.0"
4
4
  gem "bson_ext", "~> 1.3"
5
5
 
6
6
  group :development do
7
+ gem "rr"
7
8
  gem "rspec", "~> 2.3.0"
8
9
  gem "database_cleaner"
9
10
  gem "bundler", "~> 1.0.0"
data/Gemfile.lock CHANGED
@@ -26,6 +26,7 @@ GEM
26
26
  will_paginate (~> 3.0.pre)
27
27
  rake (0.8.7)
28
28
  rcov (0.9.9)
29
+ rr (1.0.2)
29
30
  rspec (2.3.0)
30
31
  rspec-core (~> 2.3.0)
31
32
  rspec-expectations (~> 2.3.0)
@@ -47,4 +48,5 @@ DEPENDENCIES
47
48
  jeweler (~> 1.6.0)
48
49
  mongoid (~> 2.0)
49
50
  rcov
51
+ rr
50
52
  rspec (~> 2.3.0)
data/README.rdoc CHANGED
@@ -9,6 +9,9 @@ You can use latest gem:
9
9
  or in Gemfile:
10
10
  gem 'mongoid_commentable'
11
11
 
12
+ Then install required model and views:
13
+ rails generate mongoid_commentable:install
14
+
12
15
  == Usage
13
16
  To make model commentable you need to include Mongoid::Commentable into your document:
14
17
  class Article
@@ -30,11 +33,13 @@ And in your view file:
30
33
  For a reply link add parent comment id:
31
34
  <%= link_to "Reply", new_article_comment_path(:article_id => @article.id.to_s, :parent => comment.id.to_s) %>
32
35
 
33
- If you want to make a custom views for a comments, run:
34
- rails g mongoid_commentable:views
35
-
36
36
  To get a list of all comments, use following method:
37
37
  @article.comments_list
38
+ Example:
39
+ <% @article.comments_list.each do |comment| %>
40
+ <p> <%= comment.author %> </p>
41
+ <p> <%= comment.text %> </p>
42
+ <% end %>
38
43
  it will return comments in ascending order. To get comments in descending order use:
39
44
  @article.comments_list(:sort => :desc)
40
45
  NOTE: For descending ordered comments you need to add index to your model manually:
@@ -48,10 +53,10 @@ To get comment level, use following method:
48
53
  comment.level
49
54
 
50
55
  To mark comment as deleted, use following method:
51
- @article.mark_comment_deleted(comment_id)
56
+ @article.comments.find(comment_id).remove
52
57
 
53
- To get comments count, use:
54
- @article.comments_count
58
+ To restore comment, use method restore:
59
+ @article.comments.find(comment_id).restore
55
60
 
56
61
  == Contributing to mongoid_commentable
57
62
 
data/Rakefile CHANGED
@@ -18,6 +18,7 @@ Jeweler::Tasks.new do |gem|
18
18
  gem.description = %Q{Mongoid_commentable provides methods to create commentable documents}
19
19
  gem.email = "mgolovnia@gmail.com"
20
20
  gem.authors = ["Max Golovnia"]
21
+ gem.version = File.read('VERSION').chomp
21
22
  end
22
23
  Jeweler::RubygemsDotOrgTasks.new
23
24
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.0.2
data/lib/comment.rb ADDED
@@ -0,0 +1,30 @@
1
+ module Mongoid_Commentable
2
+ module Comment
3
+ extend ActiveSupport::Concern
4
+
5
+ included do |base|
6
+ base.attr_accessible :path,:parent
7
+ base.field :path, :type => String, :default => ""
8
+ base.field :parent, :type => String
9
+ base.field :deleted_at, :type => Time
10
+ base.embedded_in :commentable, :polymorphic => true, :inverse_of => :comments
11
+ end
12
+
13
+ def level
14
+ path.count('.')
15
+ end
16
+
17
+ def remove
18
+ self.update_attribute(:deleted_at, Time.now)
19
+ end
20
+
21
+ def restore
22
+ self.update_attribute(:deleted_at, nil)
23
+ end
24
+
25
+ def deleted?
26
+ !!self.deleted_at
27
+ end
28
+
29
+ end
30
+ end
@@ -0,0 +1,20 @@
1
+ require 'tmpdir'
2
+ module Mongoid_Commentable
3
+ module Generators
4
+ class InstallGenerator < Rails::Generators::Base
5
+ source_root File.expand_path("../../templates", __FILE__)
6
+ desc "Creates mongoid_commentable views and model for your application."
7
+ argument :scope, :required => false, :default => nil,
8
+ :desc => "The scope to copy views to"
9
+ def copy_views
10
+ directory "views/comments", "app/views/#{scope || :comments}"
11
+ end
12
+
13
+ def copy_model
14
+ template "models/comment.rb", "app/models/comment.rb"
15
+ end
16
+
17
+ end
18
+ end
19
+ end
20
+
@@ -0,0 +1,7 @@
1
+ class Comment
2
+ include Mongoid::Document
3
+ include Mongoid_Commentable::Comment
4
+ attr_accessible :text, :author
5
+ field :text, :type => String
6
+ field :author, :type => String
7
+ end
@@ -1,25 +1,20 @@
1
1
  module Mongoid::Commentable
2
2
  extend ActiveSupport::Concern
3
-
4
3
  included do |base|
5
4
  base.embeds_many :comments, :as => :commentable
6
- base.field :comments_count, :type => Integer, :default => 0
7
5
  base.index [['comments', Mongo::ASCENDING]]
8
6
  end
9
7
 
10
8
  module ClassMethods
11
-
9
+
12
10
  def commentable?
13
11
  true
14
12
  end
15
-
16
13
  end
17
-
18
14
 
19
15
  def create_comment!(params)
20
16
  comment = comments.create!(params)
21
17
  comment.path = comment.parent ? comments.find(comment.parent).path + '.' + comment.id.to_s : "root."+comment.id.to_s
22
- self.inc(:comments_count,1)
23
18
  comment
24
19
  end
25
20
 
@@ -35,9 +30,5 @@ module Mongoid::Commentable
35
30
  comments.select{|i| i.path =~ Regexp.new('^' + comments.find(comment_id).path)}
36
31
  end
37
32
 
38
- def mark_comment_deleted(comment_id)
39
- comments.find(comment_id).deleted = true
40
- self.inc(:comments_count,-1)
41
- end
42
-
43
33
  end
34
+
@@ -1,6 +1,6 @@
1
+ require 'comment'
1
2
  require File.join(File.dirname(__FILE__), 'mongoid/commentable')
2
-
3
- %w{ models controllers }.each do |dir|
3
+ %w{ controllers }.each do |dir|
4
4
  path = File.join(File.dirname(__FILE__), '../app', dir)
5
5
  $LOAD_PATH << path
6
6
  ActiveSupport::Dependencies.autoload_paths << path
@@ -0,0 +1,82 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{mongoid_commentable}
8
+ s.version = "0.0.2"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = [%q{Max Golovnia}]
12
+ s.date = %q{2011-05-09}
13
+ s.description = %q{Mongoid_commentable provides methods to create commentable documents}
14
+ s.email = %q{mgolovnia@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ "Gemfile",
21
+ "Gemfile.lock",
22
+ "LICENSE.txt",
23
+ "README.rdoc",
24
+ "Rakefile",
25
+ "VERSION",
26
+ "app/controllers/comments_controller.rb",
27
+ "lib/comment.rb",
28
+ "lib/generators/mongoid_commentable/install_generator.rb",
29
+ "lib/generators/templates/models/comment.rb",
30
+ "lib/generators/templates/views/comments/_form.html.erb",
31
+ "lib/generators/templates/views/comments/edit.html.erb",
32
+ "lib/generators/templates/views/comments/index.html.erb",
33
+ "lib/generators/templates/views/comments/new.html.erb",
34
+ "lib/generators/templates/views/comments/show.html.erb",
35
+ "lib/mongoid/commentable.rb",
36
+ "lib/mongoid_commentable.rb",
37
+ "mongoid_commentable.gemspec",
38
+ "spec/models/comment.rb",
39
+ "spec/models/commentable_model.rb",
40
+ "spec/mongoid/commentable_spec.rb",
41
+ "spec/spec_helper.rb"
42
+ ]
43
+ s.homepage = %q{http://github.com/mgolovnia/mongoid_commentable}
44
+ s.licenses = [%q{MIT}]
45
+ s.require_paths = [%q{lib}]
46
+ s.rubygems_version = %q{1.8.1}
47
+ s.summary = %q{Comments for Mongoid documents}
48
+
49
+ if s.respond_to? :specification_version then
50
+ s.specification_version = 3
51
+
52
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
53
+ s.add_runtime_dependency(%q<mongoid>, ["~> 2.0"])
54
+ s.add_runtime_dependency(%q<bson_ext>, ["~> 1.3"])
55
+ s.add_development_dependency(%q<rr>, [">= 0"])
56
+ s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
57
+ s.add_development_dependency(%q<database_cleaner>, [">= 0"])
58
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
59
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.0"])
60
+ s.add_development_dependency(%q<rcov>, [">= 0"])
61
+ else
62
+ s.add_dependency(%q<mongoid>, ["~> 2.0"])
63
+ s.add_dependency(%q<bson_ext>, ["~> 1.3"])
64
+ s.add_dependency(%q<rr>, [">= 0"])
65
+ s.add_dependency(%q<rspec>, ["~> 2.3.0"])
66
+ s.add_dependency(%q<database_cleaner>, [">= 0"])
67
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
68
+ s.add_dependency(%q<jeweler>, ["~> 1.6.0"])
69
+ s.add_dependency(%q<rcov>, [">= 0"])
70
+ end
71
+ else
72
+ s.add_dependency(%q<mongoid>, ["~> 2.0"])
73
+ s.add_dependency(%q<bson_ext>, ["~> 1.3"])
74
+ s.add_dependency(%q<rr>, [">= 0"])
75
+ s.add_dependency(%q<rspec>, ["~> 2.3.0"])
76
+ s.add_dependency(%q<database_cleaner>, [">= 0"])
77
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
78
+ s.add_dependency(%q<jeweler>, ["~> 1.6.0"])
79
+ s.add_dependency(%q<rcov>, [">= 0"])
80
+ end
81
+ end
82
+
@@ -0,0 +1,8 @@
1
+ require File.join(File.dirname(__FILE__),'..','..','lib','comment')
2
+ class Comment
3
+ include Mongoid::Document
4
+ include Mongoid_Commentable::Comment
5
+ attr_accessible :text, :author
6
+ field :text, :type => String
7
+ field :author, :type => String
8
+ end
@@ -0,0 +1,5 @@
1
+ class CommentableModel
2
+ include Mongoid::Document
3
+ include Mongoid::Commentable
4
+ end
5
+
@@ -1,53 +1,48 @@
1
1
  require 'spec_helper'
2
- class TestModel
3
- include Mongoid::Document
4
- include Mongoid::Commentable
5
- end
6
- describe 'Make commentable' do
7
-
8
- let(:test_model){TestModel.create!}
9
-
10
-
11
- it 'should be commentable' do
12
- test_model.class.commentable?.should == true
13
- end
14
-
15
- it 'should allow to add a comment' do
16
- comment = test_model.create_comment!(:author => 'Test author', :text => 'Hello, World!')
17
- comment.author.should == 'Test author'
18
- comment.text.should == 'Hello, World!'
19
- comment.path.should == "root.#{comment.id.to_s}"
20
- comment.deleted.should == false
21
- test_model.comments_count == 1
22
- end
23
-
24
- it 'should allow to add a reply to a comment' do
25
- comment = test_model.create_comment!(:author => 'Author', :text => 'Parent')
26
- reply = test_model.create_comment!(:author => 'Author2', :text => 'Reply', :parent => comment.id.to_s)
27
- test_model.comments.find(reply.id).path.should == "#{comment.path}.#{reply.id.to_s}"
28
- end
29
2
 
30
- it 'should mark comment as deleted' do
31
- comment = test_model.create_comment!(:author => 'Author', :text => 'Parent')
32
- test_model.comments_count == 1
33
- test_model.mark_comment_deleted(comment.id)
34
- test_model.comments.find(comment.id).deleted.should == true
35
- test_model.comments_count == 0
36
- end
37
-
38
- it 'should return a branch of comments' do
39
- parent1 = test_model.create_comment!(:author => 'Test author', :text => 'Parent1')
40
- child1 = test_model.create_comment!(:author => 'Test author', :text => 'Child1', :parent => parent1.id.to_s)
41
- child2 = test_model.create_comment!(:author => 'Test author', :text => 'Parent1', :parent => child1.id.to_s)
42
- parent2 = test_model.create_comment!(:author => 'Test author', :text => 'Parent2')
43
- branch = test_model.branch_for(parent1.id)
44
- branch.should == [parent1,child1,child2]
45
- end
46
-
47
- it 'should return wrong argument error' do
48
- expect{test_model.comments_list(:wrong_argument)}.to raise_error ArgumentError
3
+ describe Mongoid::Commentable do
4
+
5
+ describe Comment do
6
+
7
+ context 'creating new comment' do
8
+ subject {CommentableModel.new.create_comment!(:author => 'Author', :text => 'test') }
9
+ its(:class){should == Comment}
10
+ its(:author){should == 'Author'}
11
+ its(:text){should == 'test'}
12
+ specify{subject.path.should == "root.#{subject.id}"}
13
+ end
14
+
15
+ context 'replying to a comment' do
16
+ before do
17
+ @commentable_model = CommentableModel.new
18
+ 3.times{|i| @commentable_model.create_comment!(nil)}
19
+ @parent = @commentable_model.comments.first
20
+ end
21
+
22
+ subject{@child = @commentable_model.create_comment!(:parent => @parent.id.to_s)}
23
+ specify{subject.path.should == "root.#{@parent.id}.#{subject.id}"}
24
+ end
25
+
26
+ context 'marking comment as deleted' do
27
+ before do
28
+ @comment = CommentableModel.new.create_comment!(nil)
29
+ @comment.remove
30
+ end
31
+ subject {@comment}
32
+ its(:deleted_at){should_not be_nil}
33
+ its(:deleted?){should be_true}
34
+ end
35
+
36
+ context 'getting branch' do
37
+ before do
38
+ @commentable_model = CommentableModel.new
39
+ @comment1 = @commentable_model.create_comment!(nil)
40
+ @comment2 = @commentable_model.create_comment!(nil)
41
+ @child1 = @commentable_model.create_comment!(:parent => @comment1.id.to_s)
42
+ @child2 = @commentable_model.create_comment!(:parent => @child1.id.to_s)
43
+ end
44
+ subject{@commentable_model}
45
+ specify{subject.branch_for(@comment1.id).should == [@comment1,@child1,@child2]}
46
+ end
49
47
  end
50
-
51
-
52
-
53
48
  end
data/spec/spec_helper.rb CHANGED
@@ -1,16 +1,19 @@
1
-
2
- $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../lib')
1
+ $:.unshift(File.join(File.dirname(__FILE__),'..','lib'))
2
+ $:.unshift(File.join(File.dirname(__FILE__),'models'))
3
3
  require 'mongoid'
4
4
  require 'rubygems'
5
5
  require 'bundler'
6
6
  require 'logger'
7
7
  require 'rspec'
8
+ require 'rr'
8
9
  require 'database_cleaner'
9
10
  require 'mongoid_commentable'
11
+ require 'models/comment'
12
+ require 'models/commentable_model'
10
13
 
11
14
 
12
15
  RSpec.configure do |config|
13
- config.mock_with :rspec
16
+ config.mock_with :rr
14
17
  config.before(:suite) do
15
18
  DatabaseCleaner.strategy = :truncation
16
19
  DatabaseCleaner.orm = "mongoid"
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: mongoid_commentable
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.1
5
+ version: 0.0.2
6
6
  platform: ruby
7
7
  authors:
8
8
  - Max Golovnia
@@ -10,8 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-05-02 00:00:00 +03:00
14
- default_executable:
13
+ date: 2011-05-09 00:00:00 Z
15
14
  dependencies:
16
15
  - !ruby/object:Gem::Dependency
17
16
  name: mongoid
@@ -36,8 +35,19 @@ dependencies:
36
35
  prerelease: false
37
36
  version_requirements: *id002
38
37
  - !ruby/object:Gem::Dependency
39
- name: rspec
38
+ name: rr
40
39
  requirement: &id003 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: "0"
45
+ type: :development
46
+ prerelease: false
47
+ version_requirements: *id003
48
+ - !ruby/object:Gem::Dependency
49
+ name: rspec
50
+ requirement: &id004 !ruby/object:Gem::Requirement
41
51
  none: false
42
52
  requirements:
43
53
  - - ~>
@@ -45,10 +55,10 @@ dependencies:
45
55
  version: 2.3.0
46
56
  type: :development
47
57
  prerelease: false
48
- version_requirements: *id003
58
+ version_requirements: *id004
49
59
  - !ruby/object:Gem::Dependency
50
60
  name: database_cleaner
51
- requirement: &id004 !ruby/object:Gem::Requirement
61
+ requirement: &id005 !ruby/object:Gem::Requirement
52
62
  none: false
53
63
  requirements:
54
64
  - - ">="
@@ -56,10 +66,10 @@ dependencies:
56
66
  version: "0"
57
67
  type: :development
58
68
  prerelease: false
59
- version_requirements: *id004
69
+ version_requirements: *id005
60
70
  - !ruby/object:Gem::Dependency
61
71
  name: bundler
62
- requirement: &id005 !ruby/object:Gem::Requirement
72
+ requirement: &id006 !ruby/object:Gem::Requirement
63
73
  none: false
64
74
  requirements:
65
75
  - - ~>
@@ -67,10 +77,10 @@ dependencies:
67
77
  version: 1.0.0
68
78
  type: :development
69
79
  prerelease: false
70
- version_requirements: *id005
80
+ version_requirements: *id006
71
81
  - !ruby/object:Gem::Dependency
72
82
  name: jeweler
73
- requirement: &id006 !ruby/object:Gem::Requirement
83
+ requirement: &id007 !ruby/object:Gem::Requirement
74
84
  none: false
75
85
  requirements:
76
86
  - - ~>
@@ -78,10 +88,10 @@ dependencies:
78
88
  version: 1.6.0
79
89
  type: :development
80
90
  prerelease: false
81
- version_requirements: *id006
91
+ version_requirements: *id007
82
92
  - !ruby/object:Gem::Dependency
83
93
  name: rcov
84
- requirement: &id007 !ruby/object:Gem::Requirement
94
+ requirement: &id008 !ruby/object:Gem::Requirement
85
95
  none: false
86
96
  requirements:
87
97
  - - ">="
@@ -89,7 +99,7 @@ dependencies:
89
99
  version: "0"
90
100
  type: :development
91
101
  prerelease: false
92
- version_requirements: *id007
102
+ version_requirements: *id008
93
103
  description: Mongoid_commentable provides methods to create commentable documents
94
104
  email: mgolovnia@gmail.com
95
105
  executables: []
@@ -100,8 +110,6 @@ extra_rdoc_files:
100
110
  - LICENSE.txt
101
111
  - README.rdoc
102
112
  files:
103
- - .document
104
- - .rspec
105
113
  - Gemfile
106
114
  - Gemfile.lock
107
115
  - LICENSE.txt
@@ -109,18 +117,21 @@ files:
109
117
  - Rakefile
110
118
  - VERSION
111
119
  - app/controllers/comments_controller.rb
112
- - app/models/comment.rb
113
- - app/views/comments/_form.html.erb
114
- - app/views/comments/edit.html.erb
115
- - app/views/comments/index.html.erb
116
- - app/views/comments/new.html.erb
117
- - app/views/comments/show.html.erb
118
- - lib/generators/mongoid_commentable/views_generator.rb
120
+ - lib/comment.rb
121
+ - lib/generators/mongoid_commentable/install_generator.rb
122
+ - lib/generators/templates/models/comment.rb
123
+ - lib/generators/templates/views/comments/_form.html.erb
124
+ - lib/generators/templates/views/comments/edit.html.erb
125
+ - lib/generators/templates/views/comments/index.html.erb
126
+ - lib/generators/templates/views/comments/new.html.erb
127
+ - lib/generators/templates/views/comments/show.html.erb
119
128
  - lib/mongoid/commentable.rb
120
129
  - lib/mongoid_commentable.rb
130
+ - mongoid_commentable.gemspec
131
+ - spec/models/comment.rb
132
+ - spec/models/commentable_model.rb
121
133
  - spec/mongoid/commentable_spec.rb
122
134
  - spec/spec_helper.rb
123
- has_rdoc: true
124
135
  homepage: http://github.com/mgolovnia/mongoid_commentable
125
136
  licenses:
126
137
  - MIT
@@ -134,7 +145,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
134
145
  requirements:
135
146
  - - ">="
136
147
  - !ruby/object:Gem::Version
137
- hash: 3250783174328786593
148
+ hash: 3455755614861241426
138
149
  segments:
139
150
  - 0
140
151
  version: "0"
@@ -147,7 +158,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
147
158
  requirements: []
148
159
 
149
160
  rubyforge_project:
150
- rubygems_version: 1.6.2
161
+ rubygems_version: 1.8.1
151
162
  signing_key:
152
163
  specification_version: 3
153
164
  summary: Comments for Mongoid documents
data/.document DELETED
@@ -1,5 +0,0 @@
1
- lib/**/*.rb
2
- bin/*
3
- -
4
- features/**/*.feature
5
- LICENSE.txt
data/.rspec DELETED
@@ -1 +0,0 @@
1
- --color
@@ -1,17 +0,0 @@
1
- class Comment
2
- include Mongoid::Document
3
- attr_accessible :text, :author, :path, :parent
4
- field :text, :type => String
5
- field :author, :type => String
6
- field :path, :type => String, :default => ""
7
- field :deleted, :type => Boolean, :default => false
8
- field :parent, :type => String
9
- embedded_in :commentable, :polymorphic => true
10
-
11
- def level
12
- path.count('.')
13
- end
14
-
15
-
16
-
17
- end
@@ -1,15 +0,0 @@
1
- require 'tmpdir'
2
- module Mongoid_Commentable
3
- module Generators
4
- class ViewsGenerator < Rails::Generators::Base
5
- source_root File.expand_path("../../../../app/views", __FILE__)
6
- desc "Copies all mongoid_commentable views to your application."
7
- argument :scope, :required => false, :default => nil,
8
- :desc => "The scope to copy views to"
9
- def copy_views
10
- directory "comments", "app/views/#{scope || :comments}"
11
- end
12
- end
13
- end
14
- end
15
-