the_comments_ruby 2.3.3
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.
- checksums.yaml +7 -0
- data/.gitignore +30 -0
- data/.ruby-gemset.example +1 -0
- data/.ruby-version.example +1 -0
- data/.rvmrc.example +1 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +338 -0
- data/Rakefile +1 -0
- data/app/assets/javascripts/the_comments.js.coffee +108 -0
- data/app/assets/javascripts/the_comments_manage.js.coffee +27 -0
- data/app/assets/stylesheets/the_comments.css.scss +248 -0
- data/app/controllers/_templates_/comments_controller.rb +44 -0
- data/app/controllers/concerns/the_comments/controller.rb +197 -0
- data/app/controllers/concerns/the_comments/view_token.rb +20 -0
- data/app/helpers/render_comments_tree_helper.rb +111 -0
- data/app/models/_templates_/comment.rb +38 -0
- data/app/models/concerns/the_comments/comment.rb +116 -0
- data/app/models/concerns/the_comments/comment_states.rb +80 -0
- data/app/models/concerns/the_comments/commentable.rb +69 -0
- data/app/models/concerns/the_comments/user.rb +56 -0
- data/app/views/the_comments/_tree.html.erb +3 -0
- data/app/views/the_comments/haml/_additional_info.html.haml +13 -0
- data/app/views/the_comments/haml/_comment.html.haml +1 -0
- data/app/views/the_comments/haml/_comment_body.html.haml +25 -0
- data/app/views/the_comments/haml/_comment_edit.html.haml +26 -0
- data/app/views/the_comments/haml/_form.html.haml +8 -0
- data/app/views/the_comments/haml/_guest_form.html.haml +22 -0
- data/app/views/the_comments/haml/_logined_form.html.haml +18 -0
- data/app/views/the_comments/haml/_manage_controls.html.haml +30 -0
- data/app/views/the_comments/haml/_sidebar.html.haml +9 -0
- data/app/views/the_comments/haml/_sidebar_admin.html.haml +12 -0
- data/app/views/the_comments/haml/_sidebar_backlink.html.haml +3 -0
- data/app/views/the_comments/haml/_sidebar_user.html.haml +29 -0
- data/app/views/the_comments/haml/_tree.html.haml +16 -0
- data/app/views/the_comments/haml/manage.html.haml +26 -0
- data/app/views/the_comments/slim/_additional_info.html.slim +13 -0
- data/app/views/the_comments/slim/_comment.html.slim +1 -0
- data/app/views/the_comments/slim/_comment_body.html.slim +24 -0
- data/app/views/the_comments/slim/_comment_edit.html.slim +26 -0
- data/app/views/the_comments/slim/_form.html.slim +8 -0
- data/app/views/the_comments/slim/_guest_form.html.slim +22 -0
- data/app/views/the_comments/slim/_logined_form.html.slim +18 -0
- data/app/views/the_comments/slim/_manage_controls.html.slim +30 -0
- data/app/views/the_comments/slim/_sidebar.html.slim +9 -0
- data/app/views/the_comments/slim/_sidebar_admin.html.slim +12 -0
- data/app/views/the_comments/slim/_sidebar_backlink.html.slim +3 -0
- data/app/views/the_comments/slim/_sidebar_user.html.slim +29 -0
- data/app/views/the_comments/slim/_tree.html.slim +16 -0
- data/app/views/the_comments/slim/index.html.slim +18 -0
- data/app/views/the_comments/slim/manage.html.slim +26 -0
- data/app/views/the_comments/slim/my_comments.html.slim +28 -0
- data/config/initializers/the_comments.rb +14 -0
- data/config/locales/en.yml +68 -0
- data/config/locales/ru.yml +71 -0
- data/config/routes.rb +38 -0
- data/db/migrate/20130101010101_the_comments_change_user.rb +18 -0
- data/db/migrate/20130101010102_the_comments_create_comments.rb +50 -0
- data/db/migrate/20130101010103_the_comments_change_commentable.rb +13 -0
- data/docs/admin_ui_installation.md +145 -0
- data/docs/advanced_installation.md +185 -0
- data/docs/comment_api.md +58 -0
- data/docs/commentable_api.md +59 -0
- data/docs/config_file.md +27 -0
- data/docs/content_preprocessors.md +73 -0
- data/docs/customazation_of_views.md +30 -0
- data/docs/denormalization_and_recent_comments.md +40 -0
- data/docs/documentation.md +29 -0
- data/docs/generators.md +74 -0
- data/docs/pagination.md +123 -0
- data/docs/routes.md +77 -0
- data/docs/screencast.jpg +0 -0
- data/docs/the_comments.jpg +0 -0
- data/docs/the_comments_view_1.gif +0 -0
- data/docs/the_comments_view_2.gif +0 -0
- data/docs/the_comments_view_3.gif +0 -0
- data/docs/the_comments_view_4.gif +0 -0
- data/docs/the_comments_view_5.gif +0 -0
- data/docs/user_api.md +75 -0
- data/docs/what_is_comcoms.md +63 -0
- data/docs/whats_wrong_with_other_gems.md +28 -0
- data/docs/where_is_example_application.md +37 -0
- data/gem_version.rb +3 -0
- data/lib/generators/the_comments/USAGE +44 -0
- data/lib/generators/the_comments/the_comments_generator.rb +56 -0
- data/lib/generators/the_comments/views_generator.rb +79 -0
- data/lib/the_comments/config.rb +37 -0
- data/lib/the_comments/version.rb +1 -0
- data/lib/the_comments.rb +28 -0
- data/spec/dummy_app/.gitignore +18 -0
- data/spec/dummy_app/.rspec +1 -0
- data/spec/dummy_app/Gemfile +43 -0
- data/spec/dummy_app/README.md +33 -0
- data/spec/dummy_app/Rakefile +6 -0
- data/spec/dummy_app/app/assets/images/.keep +0 -0
- data/spec/dummy_app/app/assets/javascripts/admin_panel.js +5 -0
- data/spec/dummy_app/app/assets/javascripts/application.js +16 -0
- data/spec/dummy_app/app/assets/stylesheets/admin_panel.css +3 -0
- data/spec/dummy_app/app/assets/stylesheets/app.css.scss +4 -0
- data/spec/dummy_app/app/assets/stylesheets/application.css +16 -0
- data/spec/dummy_app/app/controllers/application_controller.rb +7 -0
- data/spec/dummy_app/app/controllers/comments_controller.rb +28 -0
- data/spec/dummy_app/app/controllers/concerns/.keep +0 -0
- data/spec/dummy_app/app/controllers/posts_controller.rb +13 -0
- data/spec/dummy_app/app/controllers/users_controller.rb +7 -0
- data/spec/dummy_app/app/helpers/application_helper.rb +2 -0
- data/spec/dummy_app/app/mailers/.keep +0 -0
- data/spec/dummy_app/app/models/.keep +0 -0
- data/spec/dummy_app/app/models/comment.rb +32 -0
- data/spec/dummy_app/app/models/concerns/.keep +0 -0
- data/spec/dummy_app/app/models/post.rb +17 -0
- data/spec/dummy_app/app/models/user.rb +21 -0
- data/spec/dummy_app/app/views/layouts/admin.html.haml +25 -0
- data/spec/dummy_app/app/views/layouts/application.html.haml +20 -0
- data/spec/dummy_app/app/views/posts/index.html.haml +22 -0
- data/spec/dummy_app/app/views/posts/show.html.haml +7 -0
- data/spec/dummy_app/bin/bundle +3 -0
- data/spec/dummy_app/bin/rails +4 -0
- data/spec/dummy_app/bin/rake +4 -0
- data/spec/dummy_app/config/application.rb +23 -0
- data/spec/dummy_app/config/boot.rb +4 -0
- data/spec/dummy_app/config/database.yml +11 -0
- data/spec/dummy_app/config/environment.rb +5 -0
- data/spec/dummy_app/config/environments/development.rb +29 -0
- data/spec/dummy_app/config/environments/production.rb +80 -0
- data/spec/dummy_app/config/environments/test.rb +36 -0
- data/spec/dummy_app/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy_app/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy_app/config/initializers/inflections.rb +16 -0
- data/spec/dummy_app/config/initializers/mime_types.rb +5 -0
- data/spec/dummy_app/config/initializers/secret_token.rb +12 -0
- data/spec/dummy_app/config/initializers/session_store.rb +3 -0
- data/spec/dummy_app/config/initializers/sorcery.rb +437 -0
- data/spec/dummy_app/config/initializers/the_comments.rb +14 -0
- data/spec/dummy_app/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy_app/config/locales/en.yml +23 -0
- data/spec/dummy_app/config/routes.rb +19 -0
- data/spec/dummy_app/config.ru +4 -0
- data/spec/dummy_app/db/migrate/20130712061503_sorcery_core.rb +16 -0
- data/spec/dummy_app/db/migrate/20130712065951_create_posts.rb +11 -0
- data/spec/dummy_app/db/migrate/20131027185332_change_user.the_comments_engine.rb +19 -0
- data/spec/dummy_app/db/migrate/20131027185333_create_comments.the_comments_engine.rb +51 -0
- data/spec/dummy_app/db/migrate/20131027185334_change_commentable.the_comments_engine.rb +14 -0
- data/spec/dummy_app/db/schema.rb +74 -0
- data/spec/dummy_app/db/seeds.rb +42 -0
- data/spec/dummy_app/lib/assets/.keep +0 -0
- data/spec/dummy_app/lib/tasks/.keep +0 -0
- data/spec/dummy_app/lib/tasks/app_bootstrap.rake +15 -0
- data/spec/dummy_app/log/.keep +0 -0
- data/spec/dummy_app/public/404.html +58 -0
- data/spec/dummy_app/public/422.html +58 -0
- data/spec/dummy_app/public/500.html +57 -0
- data/spec/dummy_app/public/favicon.ico +0 -0
- data/spec/dummy_app/public/robots.txt +5 -0
- data/spec/dummy_app/spec/factories/post.rb +6 -0
- data/spec/dummy_app/spec/factories/user.rb +6 -0
- data/spec/dummy_app/spec/models/user_counters_spec.rb +339 -0
- data/spec/dummy_app/spec/spec_helper.rb +29 -0
- data/spec/dummy_app/test/controllers/.keep +0 -0
- data/spec/dummy_app/test/fixtures/.keep +0 -0
- data/spec/dummy_app/test/helpers/.keep +0 -0
- data/spec/dummy_app/test/integration/.keep +0 -0
- data/spec/dummy_app/test/mailers/.keep +0 -0
- data/spec/dummy_app/test/models/.keep +0 -0
- data/spec/dummy_app/test/test_helper.rb +15 -0
- data/spec/dummy_app/vendor/assets/javascripts/.keep +0 -0
- data/spec/dummy_app/vendor/assets/stylesheets/.keep +0 -0
- data/the_comments.gemspec +25 -0
- data/the_comments.yml.teamocil.example +11 -0
- data/views_converter.rb +16 -0
- metadata +333 -0
data/docs/routes.md
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
← [documentation](documentation.md)
|
|
2
|
+
|
|
3
|
+
## TheComments Routes
|
|
4
|
+
|
|
5
|
+
**config/routes.rb**
|
|
6
|
+
|
|
7
|
+
```ruby
|
|
8
|
+
MyApp::Application.routes.draw do
|
|
9
|
+
root 'posts#index'
|
|
10
|
+
resources :posts
|
|
11
|
+
|
|
12
|
+
# ...
|
|
13
|
+
|
|
14
|
+
# TheComments routes
|
|
15
|
+
concern :user_comments, TheComments::UserRoutes.new
|
|
16
|
+
concern :admin_comments, TheComments::AdminRoutes.new
|
|
17
|
+
resources :comments, concerns: [:user_comments, :admin_comments]
|
|
18
|
+
end
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
And after that you can see routes:
|
|
22
|
+
|
|
23
|
+
```ruby
|
|
24
|
+
rake routes | grep comments
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
```ruby
|
|
28
|
+
comments / TheComments::Engine
|
|
29
|
+
to_spam_comment POST /comments/:id/to_spam(.:format) comments#to_spam
|
|
30
|
+
to_draft_comment POST /comments/:id/to_draft(.:format) comments#to_draft
|
|
31
|
+
to_published_comment POST /comments/:id/to_published(.:format) comments#to_published
|
|
32
|
+
to_deleted_comment DELETE /comments/:id/to_deleted(.:format) comments#to_deleted
|
|
33
|
+
manage_comments GET /comments/manage(.:format) comments#manage
|
|
34
|
+
my_draft_comments GET /comments/my_draft(.:format) comments#my_draft
|
|
35
|
+
my_published_comments GET /comments/my_published(.:format) comments#my_published
|
|
36
|
+
my_comments_comments GET /comments/my_comments(.:format) comments#my_comments
|
|
37
|
+
total_draft_comments GET /comments/total_draft(.:format) comments#total_draft
|
|
38
|
+
total_published_comments GET /comments/total_published(.:format) comments#total_published
|
|
39
|
+
total_deleted_comments GET /comments/total_deleted(.:format) comments#total_deleted
|
|
40
|
+
total_spam_comments GET /comments/total_spam(.:format) comments#total_spam
|
|
41
|
+
draft_comments GET /comments/draft(.:format) comments#draft
|
|
42
|
+
published_comments GET /comments/published(.:format) comments#published
|
|
43
|
+
deleted_comments GET /comments/deleted(.:format) comments#deleted
|
|
44
|
+
spam_comments GET /comments/spam(.:format) comments#spam
|
|
45
|
+
comments GET /comments(.:format) comments#index
|
|
46
|
+
POST /comments(.:format) comments#create
|
|
47
|
+
new_comment GET /comments/new(.:format) comments#new
|
|
48
|
+
edit_comment GET /comments/:id/edit(.:format) comments#edit
|
|
49
|
+
comment GET /comments/:id(.:format) comments#show
|
|
50
|
+
PATCH /comments/:id(.:format) comments#update
|
|
51
|
+
PUT /comments/:id(.:format) comments#update
|
|
52
|
+
DELETE /comments/:id(.:format) comments#destroy
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
And now you can use url helpers with 2 ways:
|
|
56
|
+
|
|
57
|
+
### Way 1. Url Helpers
|
|
58
|
+
|
|
59
|
+
```ruby
|
|
60
|
+
= link_to 'link', comments_path
|
|
61
|
+
= link_to 'link', manage_comments_path
|
|
62
|
+
= link_to 'link', new_comment_path
|
|
63
|
+
|
|
64
|
+
= link_to 'link', comment_path(@comment)
|
|
65
|
+
= link_to 'link', to_spam_comment_path(@comment)
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Way 2. Array notation
|
|
69
|
+
|
|
70
|
+
```ruby
|
|
71
|
+
= link_to 'link', [:index, :comments]
|
|
72
|
+
= link_to 'link', [:manage, :comments]
|
|
73
|
+
= link_to 'link', [:draft, :comments]
|
|
74
|
+
|
|
75
|
+
= link_to 'link', [@comment]
|
|
76
|
+
= link_to 'link', [:to_spam, @comment]
|
|
77
|
+
```
|
data/docs/screencast.jpg
ADDED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
data/docs/user_api.md
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
← [documentation](documentation.md)
|
|
2
|
+
|
|
3
|
+
### User API
|
|
4
|
+
|
|
5
|
+
**When User is not commentable model**
|
|
6
|
+
|
|
7
|
+
```ruby
|
|
8
|
+
class User < ActiveRecord::Base
|
|
9
|
+
include TheCommentsUser
|
|
10
|
+
|
|
11
|
+
has_many :posts # commentable model
|
|
12
|
+
has_many :products # commentable model
|
|
13
|
+
end
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
:warning: Please, read this: [What is ComComs?](what_is_comcoms.md)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
We can use following methods
|
|
20
|
+
|
|
21
|
+
```ruby
|
|
22
|
+
@user = User.first
|
|
23
|
+
|
|
24
|
+
@user.comcoms #=> all comments for posts and products, where user is owner
|
|
25
|
+
|
|
26
|
+
# cache counters
|
|
27
|
+
@user.draft_comcoms_count # => 1
|
|
28
|
+
@user.published_comcoms_count # => 5
|
|
29
|
+
@user.deleted_comcoms_count # => 3
|
|
30
|
+
@user.spam_comcoms_count # => 2
|
|
31
|
+
|
|
32
|
+
# equal values, but with request to database
|
|
33
|
+
@user.comcoms.with_state([:draft]).count # => 1
|
|
34
|
+
@user.comcoms.with_state([:published]).count # => 5
|
|
35
|
+
@user.comcoms.with_state([:deleted]).count # => 3
|
|
36
|
+
@user.comcoms.where(spam: true).count # => 2
|
|
37
|
+
|
|
38
|
+
# draft and published comments
|
|
39
|
+
# written by this user
|
|
40
|
+
@user.my_comments # => ActiveRecord::Relation
|
|
41
|
+
|
|
42
|
+
# cache counters for comments
|
|
43
|
+
# written by this user
|
|
44
|
+
# there is no cache counter for deleted state!
|
|
45
|
+
@user.my_draft_comments_count # => 3
|
|
46
|
+
@user.my_published_comments_count # => 7
|
|
47
|
+
|
|
48
|
+
# equal values, but with request to database
|
|
49
|
+
@user.my_draft_comments.count # => 3
|
|
50
|
+
@user.my_published_comments.count # => 7
|
|
51
|
+
@user.my_deleted_comments.count # => 1
|
|
52
|
+
|
|
53
|
+
# helper methods to get comments
|
|
54
|
+
# written by this user
|
|
55
|
+
@user.my_draft_comments # => ActiveRecord::Relation
|
|
56
|
+
@user.my_published_comments # => ActiveRecord::Relation
|
|
57
|
+
@user.my_deleted_comments # => ActiveRecord::Relation
|
|
58
|
+
|
|
59
|
+
# recalculate cache counters
|
|
60
|
+
@user.recalculate_my_comments_counter!
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**When User is commentable model**
|
|
64
|
+
|
|
65
|
+
```ruby
|
|
66
|
+
class User < ActiveRecord::Base
|
|
67
|
+
include TheCommentsUser
|
|
68
|
+
include TheCommentsCommentable
|
|
69
|
+
|
|
70
|
+
has_many :posts # commentable model
|
|
71
|
+
has_many :products # commentable model
|
|
72
|
+
end
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
you should to use following instruction [Commentable API](commentable_api.md)
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
← [documentation](documentation.md)
|
|
2
|
+
|
|
3
|
+
### What is ComComs?
|
|
4
|
+
|
|
5
|
+
:warning: **comcoms** - is main method to get all comments related with user's commentable models.
|
|
6
|
+
|
|
7
|
+
:warning: **comments** - is main method to get comments related with any commentable model.
|
|
8
|
+
|
|
9
|
+
**ComComs** - **com**ments of **com**mentable models
|
|
10
|
+
|
|
11
|
+
ComComs are all incoming comments for all models, where this user is owner.
|
|
12
|
+
|
|
13
|
+
For example, some user **has_many :posts**, and **has_many :products** - all comments for all user's posts and all user's products called as **comcoms**.
|
|
14
|
+
|
|
15
|
+
#### Why we need ComComs?
|
|
16
|
+
|
|
17
|
+
User model can be commentable too. For example to build user's "public wall" (like tweets list for current user).
|
|
18
|
+
|
|
19
|
+
And we should to separate **comments** attached to user model (tweets) and comments attached to any another user's model.
|
|
20
|
+
|
|
21
|
+
That is why User model in-fact has following relationship declarations:
|
|
22
|
+
|
|
23
|
+
```ruby
|
|
24
|
+
class User < ActiveRecord::Base
|
|
25
|
+
has_many :comcoms, class_name: :Comment, foreign_key: :holder_id
|
|
26
|
+
|
|
27
|
+
# and if User model is commentable model
|
|
28
|
+
# has_many :comments, as: :commentable
|
|
29
|
+
|
|
30
|
+
has_many :posts
|
|
31
|
+
has_many :products
|
|
32
|
+
end
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
in real application it should be described like this:
|
|
36
|
+
|
|
37
|
+
```ruby
|
|
38
|
+
class User < ActiveRecord::Base
|
|
39
|
+
include TheCommentsUser
|
|
40
|
+
include TheCommentsCommentable
|
|
41
|
+
|
|
42
|
+
has_many :posts
|
|
43
|
+
has_many :products
|
|
44
|
+
end
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
But in most popular situation User model should not be commentable, and you should use only **comcoms** method to get all comments related with this user:
|
|
48
|
+
|
|
49
|
+
```ruby
|
|
50
|
+
class User < ActiveRecord::Base
|
|
51
|
+
include TheCommentsUser
|
|
52
|
+
|
|
53
|
+
has_many :posts
|
|
54
|
+
has_many :products
|
|
55
|
+
end
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
and later in your application
|
|
59
|
+
|
|
60
|
+
```ruby
|
|
61
|
+
@user = User.find params[:id]
|
|
62
|
+
@user.comcoms.count # => 42
|
|
63
|
+
```
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
← [documentation](documentation.md)
|
|
2
|
+
|
|
3
|
+
### What's wrong with other gems?
|
|
4
|
+
|
|
5
|
+
Take a look at [Ruby-Toolbox](https://www.ruby-toolbox.com/categories/rails_comments). What can we see?
|
|
6
|
+
|
|
7
|
+
* [Acts as commentable with threading](https://github.com/elight/acts_as_commentable_with_threading) - Where is the render helper for the tree? There is no helper! Am I supposed to write a render helper for the tree myself? Nooooo!!! I'm sorry, I can't use this gem.
|
|
8
|
+
* [acts_as_commentable](https://github.com/jackdempsey/acts_as_commentable) - I can see the code for models. But I can't see the code for controllers and views. Unfortunately, there is no threading. This isn't enough for me.
|
|
9
|
+
* [opinio](https://github.com/Draiken/opinio) - Better, but still no threading. I can do better!
|
|
10
|
+
* [has_threaded_comments](https://github.com/aarongough/has_threaded_comments) - A solid gem. Has model, controller and view helpers for tree rendering! **But** last activity was 2 years ago, it still needs a few features - I can do better.
|
|
11
|
+
|
|
12
|
+
### Why is TheComments better than other gems?
|
|
13
|
+
|
|
14
|
+
1. TheComments allows for threaded comments
|
|
15
|
+
2. **Only TheComments has special helper for tree rendering** (based on [TheSortableTree](https://github.com/the-teacher/the_sortable_tree)).
|
|
16
|
+
3. TheComments is designed to reduce database requests. Helpful for cache counters.
|
|
17
|
+
4. TheComments has a solution for [building Recent Comments](https://github.com/the-teacher/the_comments/blob/master/docs/denormalization_and_recent_comments.md) (for polymorphic relations)
|
|
18
|
+
5. TheComments is designed for text preprocessors (Textile, Markdown, Sanitize, Coderay etc.)
|
|
19
|
+
6. TheComments has an admin UI based on bootstrap 3
|
|
20
|
+
7. TheComments is an "all-in-one" solution.<br>
|
|
21
|
+
It has: Models and Controllers logic (via concerns), Generators, Views, Helper for fast Tree rendering and Admin UI.
|
|
22
|
+
8. If you have problems with TheComments, I'll try to help you via skype: **ilya.killich**
|
|
23
|
+
|
|
24
|
+
### TheComments based on:
|
|
25
|
+
|
|
26
|
+
1. [AwesomeNestedSet](https://github.com/collectiveidea/awesome_nested_set) - for comments threading
|
|
27
|
+
2. [TheSortableTree](https://github.com/the-teacher/the_sortable_tree) - for fast rendering of comments tree
|
|
28
|
+
3. [State Machine](https://github.com/pluginaweek/state_machine) - to provide easy and correct recalculation cache counters on states transitions
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
← [documentation](documentation.md)
|
|
2
|
+
|
|
3
|
+
### Dummy Application
|
|
4
|
+
|
|
5
|
+
TheComments repository contains a dummy application for development and testing.
|
|
6
|
+
|
|
7
|
+
It's here: [Dummy App](https://github.com/the-teacher/the_comments/tree/master/spec/dummy_app)
|
|
8
|
+
|
|
9
|
+
To run the dummy app:
|
|
10
|
+
|
|
11
|
+
```ruby
|
|
12
|
+
git clone https://github.com/the-teacher/the_comments.git
|
|
13
|
+
|
|
14
|
+
cd the_comments/spec/dummy_app/
|
|
15
|
+
|
|
16
|
+
bundle
|
|
17
|
+
|
|
18
|
+
rake db:bootstrap_and_seed
|
|
19
|
+
|
|
20
|
+
rails s -p 3000 -b localhost
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Run tests
|
|
24
|
+
|
|
25
|
+
To run the RSPEC tests:
|
|
26
|
+
|
|
27
|
+
```ruby
|
|
28
|
+
git clone https://github.com/the-teacher/the_comments.git
|
|
29
|
+
|
|
30
|
+
cd the_comments/spec/dummy_app/
|
|
31
|
+
|
|
32
|
+
bundle
|
|
33
|
+
|
|
34
|
+
rake db:bootstrap RAILS_ENV=test
|
|
35
|
+
|
|
36
|
+
rspec --format documentation
|
|
37
|
+
```
|
data/gem_version.rb
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
Description:
|
|
2
|
+
TheComments: generators will copy files for organize comments tree in your web project
|
|
3
|
+
|
|
4
|
+
Usage: [bundle exec] rails g the_comments NAME
|
|
5
|
+
Usage: [bundle exec] rails g the_comments:views NAME
|
|
6
|
+
|
|
7
|
+
# This text:
|
|
8
|
+
> rails g the_comments --help
|
|
9
|
+
|
|
10
|
+
# Main generators:
|
|
11
|
+
> rails g the_comments install
|
|
12
|
+
|
|
13
|
+
This will create:
|
|
14
|
+
config/initializers/the_comments.rb
|
|
15
|
+
app/controllers/comments_controller.rb
|
|
16
|
+
app/models/comment.rb
|
|
17
|
+
|
|
18
|
+
# Controller generators:
|
|
19
|
+
> rails g the_comments controllers
|
|
20
|
+
|
|
21
|
+
This will create:
|
|
22
|
+
app/controllers/comments_controller.rb
|
|
23
|
+
|
|
24
|
+
# Model generators:
|
|
25
|
+
> rails g the_comments models
|
|
26
|
+
|
|
27
|
+
This will create:
|
|
28
|
+
app/models/comment.rb
|
|
29
|
+
|
|
30
|
+
# Config generators:
|
|
31
|
+
> rails g the_comments config
|
|
32
|
+
|
|
33
|
+
# Locals generators:
|
|
34
|
+
> rails g the_comments locales
|
|
35
|
+
|
|
36
|
+
# View Generators:
|
|
37
|
+
> rails g the_comments:views js
|
|
38
|
+
> rails g the_comments:views css
|
|
39
|
+
> rails g the_comments:views assets
|
|
40
|
+
> rails g the_comments:views helper
|
|
41
|
+
> rails g the_comments:views views
|
|
42
|
+
|
|
43
|
+
# Migrations:
|
|
44
|
+
> rake the_comments_engine:install:migrations
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
class TheCommentsGenerator < Rails::Generators::NamedBase
|
|
2
|
+
source_root File.expand_path('../templates', __FILE__)
|
|
3
|
+
# argument :xname, type: :string, default: :xname
|
|
4
|
+
|
|
5
|
+
# > rails g the_comments NAME
|
|
6
|
+
def generate_controllers
|
|
7
|
+
case gen_name
|
|
8
|
+
when 'locales'
|
|
9
|
+
cp_locales
|
|
10
|
+
when 'models'
|
|
11
|
+
cp_models
|
|
12
|
+
when 'controllers'
|
|
13
|
+
cp_controllers
|
|
14
|
+
when 'config'
|
|
15
|
+
cp_config
|
|
16
|
+
when 'install'
|
|
17
|
+
cp_config
|
|
18
|
+
cp_models
|
|
19
|
+
cp_controllers
|
|
20
|
+
else
|
|
21
|
+
puts 'TheComments Generator - wrong Name'
|
|
22
|
+
puts 'Try to use [ install | config | controllers | models ]'
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
def root_path; TheComments::Engine.root; end
|
|
29
|
+
|
|
30
|
+
def gen_name
|
|
31
|
+
name.to_s.downcase
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def cp_config
|
|
35
|
+
copy_file "#{root_path}/config/initializers/the_comments.rb",
|
|
36
|
+
"config/initializers/the_comments.rb"
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def cp_models
|
|
40
|
+
copy_file "#{root_path}/app/models/_templates_/comment.rb",
|
|
41
|
+
"app/models/comment.rb"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def cp_controllers
|
|
45
|
+
copy_file "#{root_path}/app/controllers/_templates_/comments_controller.rb",
|
|
46
|
+
"app/controllers/comments_controller.rb"
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def cp_locales
|
|
50
|
+
copy_file "#{root_path}/config/locales/en.yml",
|
|
51
|
+
"config/locales/en.the_comments.yml"
|
|
52
|
+
|
|
53
|
+
copy_file "#{root_path}/config/locales/ru.yml",
|
|
54
|
+
"config/locales/ru.the_comments.yml"
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
module TheComments
|
|
2
|
+
module Generators
|
|
3
|
+
class ViewsGenerator < Rails::Generators::NamedBase
|
|
4
|
+
source_root TheComments::Engine.root
|
|
5
|
+
|
|
6
|
+
def self.banner
|
|
7
|
+
<<-BANNER.chomp
|
|
8
|
+
|
|
9
|
+
USAGE: [bundle exec] rails g the_comments:views NAME
|
|
10
|
+
|
|
11
|
+
> rails g the_comments:views js
|
|
12
|
+
> rails g the_comments:views css
|
|
13
|
+
> rails g the_comments:views assets
|
|
14
|
+
|
|
15
|
+
> rails g the_comments:views views
|
|
16
|
+
> rails g the_comments:views helper
|
|
17
|
+
|
|
18
|
+
> rails g the_comments:views all
|
|
19
|
+
|
|
20
|
+
BANNER
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def copy_sortable_tree_files
|
|
24
|
+
copy_gem_files
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
|
|
29
|
+
def param_name
|
|
30
|
+
name.downcase
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def copy_gem_files
|
|
34
|
+
case param_name
|
|
35
|
+
when 'js'
|
|
36
|
+
js_copy
|
|
37
|
+
when 'css'
|
|
38
|
+
css_copy
|
|
39
|
+
when 'assets'
|
|
40
|
+
js_copy; css_copy
|
|
41
|
+
when 'views'
|
|
42
|
+
views_copy
|
|
43
|
+
when 'helper'
|
|
44
|
+
helper_copy
|
|
45
|
+
when 'all'
|
|
46
|
+
js_copy
|
|
47
|
+
css_copy
|
|
48
|
+
views_copy
|
|
49
|
+
helper_copy
|
|
50
|
+
else
|
|
51
|
+
puts 'TheComments View Generator - wrong Name'
|
|
52
|
+
puts "Wrong params - use only [ js | css | assets | views | helper | all ] values"
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def js_copy
|
|
57
|
+
f1 = "app/assets/javascripts/the_comments.js.coffee"
|
|
58
|
+
f2 = "app/assets/javascripts/the_comments_manage.js.coffee"
|
|
59
|
+
copy_file f1, f1
|
|
60
|
+
copy_file f2, f2
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def css_copy
|
|
64
|
+
f1 = "app/assets/stylesheets/the_comments.css.scss"
|
|
65
|
+
copy_file f1, f1
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def views_copy
|
|
69
|
+
d1 = "app/views/the_comments"
|
|
70
|
+
directory d1, d1
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def helper_copy
|
|
74
|
+
f1 = "app/helpers/render_comments_tree_helper.rb"
|
|
75
|
+
copy_file f1, f1
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
module TheComments
|
|
2
|
+
def self.configure(&block)
|
|
3
|
+
yield @config ||= TheComments::Configuration.new
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
def self.config
|
|
7
|
+
@config
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# Configuration class
|
|
11
|
+
class Configuration
|
|
12
|
+
include ActiveSupport::Configurable
|
|
13
|
+
|
|
14
|
+
config_accessor :max_reply_depth,
|
|
15
|
+
:tolerance_time,
|
|
16
|
+
:default_state,
|
|
17
|
+
:default_owner_state,
|
|
18
|
+
:empty_inputs,
|
|
19
|
+
:default_title,
|
|
20
|
+
:template_engine,
|
|
21
|
+
:empty_trap_protection,
|
|
22
|
+
:tolerance_time_protection
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
configure do |config|
|
|
26
|
+
config.max_reply_depth = 3
|
|
27
|
+
config.tolerance_time = 5
|
|
28
|
+
config.default_state = :draft
|
|
29
|
+
config.default_owner_state = :published
|
|
30
|
+
config.empty_inputs = [:message]
|
|
31
|
+
config.default_title = 'Undefined title'
|
|
32
|
+
config.template_engine = :haml
|
|
33
|
+
|
|
34
|
+
config.empty_trap_protection = true
|
|
35
|
+
config.tolerance_time_protection = true
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require File.expand_path('../../../gem_version', __FILE__)
|
data/lib/the_comments.rb
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require 'state_machine'
|
|
2
|
+
require 'state_machine/version'
|
|
3
|
+
|
|
4
|
+
require 'the_simple_sort'
|
|
5
|
+
require 'the_sortable_tree'
|
|
6
|
+
|
|
7
|
+
require 'the_comments/config'
|
|
8
|
+
require 'the_comments/version'
|
|
9
|
+
|
|
10
|
+
module TheComments
|
|
11
|
+
COMMENTS_COOKIES_TOKEN = 'JustTheCommentsCookies'
|
|
12
|
+
|
|
13
|
+
class Engine < Rails::Engine
|
|
14
|
+
config.autoload_paths += Dir["#{config.root}/app/controllers/concerns/**/"]
|
|
15
|
+
config.autoload_paths += Dir["#{config.root}/app/models/concerns/**/"]
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Loading of concerns
|
|
20
|
+
_root_ = File.expand_path('../../', __FILE__)
|
|
21
|
+
require "#{_root_}/config/routes.rb"
|
|
22
|
+
|
|
23
|
+
if StateMachine::VERSION.to_f <= 1.2
|
|
24
|
+
module StateMachine::Integrations::ActiveModel
|
|
25
|
+
puts "You should not in here"
|
|
26
|
+
public :around_validation
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# See http://help.github.com/ignore-files/ for more about ignoring files.
|
|
2
|
+
#
|
|
3
|
+
# If you find yourself ignoring temporary files generated by your text editor
|
|
4
|
+
# or operating system, you probably want to add a global ignore instead:
|
|
5
|
+
# git config --global core.excludesfile '~/.gitignore_global'
|
|
6
|
+
|
|
7
|
+
# Ignore bundler config.
|
|
8
|
+
/.bundle
|
|
9
|
+
.rvmrc
|
|
10
|
+
|
|
11
|
+
# Ignore the default SQLite database.
|
|
12
|
+
/db/*.db
|
|
13
|
+
/db/*.sqlite3
|
|
14
|
+
/db/*.sqlite3-journal
|
|
15
|
+
|
|
16
|
+
# Ignore all logfiles and tempfiles.
|
|
17
|
+
/log/*.log
|
|
18
|
+
/tmp
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
--color
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
source 'https://rubygems.org'
|
|
2
|
+
|
|
3
|
+
# Base gems
|
|
4
|
+
gem 'rails', '4.1.4 ' #github: 'rails/rails', branch: 'master'
|
|
5
|
+
gem 'sqlite3'
|
|
6
|
+
|
|
7
|
+
gem 'jquery-rails'
|
|
8
|
+
gem 'jbuilder', '~> 1.2'
|
|
9
|
+
|
|
10
|
+
gem 'uglifier', '>= 1.3.0'
|
|
11
|
+
gem 'sass-rails', '~> 4.0.0'
|
|
12
|
+
gem 'coffee-rails', '~> 4.0.0'
|
|
13
|
+
|
|
14
|
+
gem 'thin', group: [:development]
|
|
15
|
+
# gem 'therubyracer', platforms: :ruby
|
|
16
|
+
gem 'sdoc', require: false, group: [:doc]
|
|
17
|
+
|
|
18
|
+
# App gems
|
|
19
|
+
gem 'haml'
|
|
20
|
+
gem 'sorcery'
|
|
21
|
+
gem 'kaminari'
|
|
22
|
+
gem 'haml-rails'
|
|
23
|
+
|
|
24
|
+
# TheComments requires
|
|
25
|
+
gem 'the_comments',
|
|
26
|
+
path: '../../'
|
|
27
|
+
|
|
28
|
+
gem 'bootstrap-sass',
|
|
29
|
+
github: 'thomas-mcdonald/bootstrap-sass'
|
|
30
|
+
|
|
31
|
+
gem 'awesome_nested_set',
|
|
32
|
+
git: 'https://github.com/collectiveidea/awesome_nested_set.git',
|
|
33
|
+
branch: 'master'
|
|
34
|
+
|
|
35
|
+
# Test gems
|
|
36
|
+
group :development, :test do
|
|
37
|
+
gem 'faker'
|
|
38
|
+
gem 'factory_girl'
|
|
39
|
+
gem "factory_girl_rails"
|
|
40
|
+
gem 'rspec-rails', '~> 2.0'
|
|
41
|
+
|
|
42
|
+
# gem 'database_cleaner'
|
|
43
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
## TheComments Dummy App
|
|
2
|
+
|
|
3
|
+
### First step
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
git clone https://github.com/the-teacher/the_comments.git
|
|
7
|
+
|
|
8
|
+
cd the_comments/spec/dummy_app/
|
|
9
|
+
|
|
10
|
+
bundle
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
### App start
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
rake db:bootstrap_and_seed
|
|
17
|
+
|
|
18
|
+
rails s -p 3000 -b localhost
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Browser
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
http://localhost:3000/
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Tests start
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
rake db:bootstrap RAILS_ENV=test
|
|
31
|
+
|
|
32
|
+
rspec --format documentation
|
|
33
|
+
```
|
|
File without changes
|