commontator 0.1.46 → 0.2.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/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright 2012 YOURNAME
1
+ Copyright 2012 Rice University
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -1,25 +1,116 @@
1
1
  # Common Tator
2
2
 
3
3
  A Rails engine for comments
4
- This is not ready for use yet. We recommend you do not use this gem until it is done.
5
4
 
6
5
  ## Installation
7
6
 
8
- Add this line to your application's Gemfile:
7
+ There are 4 steps you must follow to install commontator:
9
8
 
10
- gem 'commontator'
9
+ 1. Gem
11
10
 
12
- And then execute:
11
+ Add this line to your application's Gemfile:
13
12
 
14
- $ bundle
13
+ ```ruby
14
+ gem 'commontator', '~> 0.2.0'
15
+ ```
15
16
 
16
- Or install it yourself as:
17
+ And then execute:
17
18
 
18
- $ gem install commontator
19
+ ```sh
20
+ $ bundle
21
+ ```
22
+
23
+ Or install it yourself as:
24
+
25
+ ```sh
26
+ $ gem install commontator
27
+ ```
28
+
29
+ 2. Initializer and Migration
30
+
31
+ Run the following command to copy commontator's initializer and migration to your own app:
32
+
33
+ ```sh
34
+ $ rake commontator:install
35
+ ```
36
+
37
+ And then execute:
38
+
39
+ ```sh
40
+ $ rake db:migrate
41
+ ```
42
+
43
+ Or run each rake task manually:
44
+
45
+ ```sh
46
+ $ rake commontator:install:initializers
47
+
48
+ $ rake commontator:install:migrations
49
+
50
+ $ rake db:migrate
51
+ ```
52
+
53
+ 3. Configuration
54
+
55
+ Change commontator's configurations to suit your needs by editing config/intializers/commontator.rb.
56
+
57
+ 4. Routes
58
+
59
+ Add this line to your application's routes file:
60
+
61
+ ```ruby
62
+ mount Commontator::Engine => "/commontator"
63
+ ```
64
+
65
+ You can change the mount path if you would like a different one.
19
66
 
20
67
  ## Usage
21
68
 
22
- TODO: Write usage instructions here
69
+ Follow the steps below to add commontator to your models and views:
70
+
71
+ 1. Models
72
+
73
+ Add this line to your user model(s) (or any models that should be able to make comments):
74
+
75
+ ```ruby
76
+ acts_as_commontator
77
+ ```
78
+
79
+ Add this line to any models you want to be able to comment on:
80
+
81
+ ```ruby
82
+ acts_as_commontable
83
+ ```
84
+
85
+ 2. Views
86
+
87
+ Add the following line to any view where you want to display comments:
88
+
89
+ ```erb
90
+ <%= commontator_thread_link(commontable) %>
91
+ ```
92
+
93
+ Where commontable is an instance of some model that acts_as_commontable.
94
+
95
+ That's it! Commontator is now ready for use.
96
+
97
+ ## Customization
98
+
99
+ Copy commontator's files to your app using any of the following commands:
100
+
101
+ ```sh
102
+ rake commontator:copy:images
103
+ rake commontator:copy:stylesheets
104
+
105
+ rake commontator:copy:views
106
+ rake commontator:copy:mailers
107
+ rake commontator:copy:helpers
108
+
109
+ rake commontator:copy:controllers
110
+ rake commontator:copy:models
111
+ ```
112
+
113
+ You are now free to modify them and have any changes made manifest in your application.
23
114
 
24
115
  ## Contributing
25
116
 
@@ -8,8 +8,7 @@ module Commontator
8
8
  setup_variables(comment)
9
9
 
10
10
  mail(:bcc => @bcc,
11
- :subject => @subject,
12
- :body => @body)
11
+ :subject => @subject)
13
12
  end
14
13
 
15
14
  protected
@@ -43,8 +42,6 @@ protected
43
42
  params[:commontable_id] = @commontable_id
44
43
 
45
44
  @subject = @config.subscription_email_subject_proc.call(params)
46
- @body = @config.subscription_email_body_proc.blank? ? nil : \
47
- @config.subscription_email_body_proc.call?(params)
48
45
  end
49
46
 
50
47
  end
@@ -42,9 +42,7 @@ protected
42
42
  params[:commontable_name] = @commontable_name
43
43
  params[:commontable_id] = @commontable_id
44
44
 
45
- @subject = params[:config].subscription_email_subject_proc.call(params)
46
- @body = params[:config].subscription_email_body_proc.blank? ? nil : \
47
- params[:config].subscription_email_body_proc.call?(params)
45
+ @subject = @config.subscription_email_subject_proc.call(params)
48
46
  end
49
47
 
50
48
  end
@@ -1,6 +1,5 @@
1
1
  module Commontator
2
2
  class Comment < ActiveRecord::Base
3
-
4
3
  belongs_to :commontator, :polymorphic => true
5
4
  belongs_to :deleter, :polymorphic => true
6
5
  belongs_to :thread
@@ -79,6 +78,5 @@ module Commontator
79
78
  can_be_voted_on? && !thread.is_closed? &&\
80
79
  thread.can_be_read_by?(user) && user != commontator
81
80
  end
82
-
83
81
  end
84
82
  end
@@ -65,7 +65,7 @@ module Commontator
65
65
  end
66
66
 
67
67
  def can_be_deleted_by?(user)
68
- !thread.is_closed? && !is_deleted? &&\
68
+ !thread.is_closed? &&\
69
69
  ((user == commontator && thread.config.can_delete_own_comments) &&\
70
70
  (thread.comments.last == self || thread.config.can_delete_old_comments)) ||\
71
71
  thread.can_be_edited_by?(user)
@@ -1,6 +1,5 @@
1
1
  module Commontator
2
2
  class Subscription < ActiveRecord::Base
3
-
4
3
  belongs_to :subscriber, :polymorphic => true
5
4
  belongs_to :thread
6
5
 
@@ -16,6 +15,5 @@ module Commontator
16
15
  def mark_as_unread
17
16
  self.update_attribute(:is_unread, true)
18
17
  end
19
-
20
18
  end
21
19
  end
@@ -4,11 +4,11 @@ module Commontator
4
4
  belongs_to :subscriber, :polymorphic => true
5
5
  belongs_to :thread
6
6
 
7
- attr_accessible :subscriber, :thread
8
-
9
7
  validates_presence_of :subscriber, :thread
10
8
  validates_uniqueness_of :thread_id, :scope => [:subscriber_id, :subscriber_type]
11
9
 
10
+ attr_accessible :subscriber, :thread
11
+
12
12
  def mark_as_read
13
13
  self.update_attribute(:is_unread, false)
14
14
  end
@@ -1,16 +1,24 @@
1
1
  module Commontator
2
2
  class Thread < ActiveRecord::Base
3
-
4
3
  belongs_to :closer, :polymorphic => true
5
4
  belongs_to :commontable, :polymorphic => true
6
5
 
7
6
  has_many :comments, :dependent => :destroy
8
7
  has_many :subscriptions, :dependent => :destroy
9
8
 
10
- validates_presence_of :commontable, :allow_nil => true
9
+ validates_presence_of :commontable, :on => :create
11
10
 
12
11
  attr_accessible :is_closed
13
12
 
13
+ def config
14
+ commontable.try(:commontable_config)
15
+ end
16
+
17
+ def comments
18
+ (!commontable.blank? && config.comments_can_be_voted_on && config.comments_ordered_by_votes) ? \
19
+ super.order("cached_votes_down - cached_votes_up") : super
20
+ end
21
+
14
22
  def subscribers
15
23
  subscriptions.collect{|s| s.subscriber}
16
24
  end
@@ -23,10 +31,6 @@ module Commontator
23
31
  !closed_at.blank?
24
32
  end
25
33
 
26
- def config
27
- commontable.commontable_config
28
- end
29
-
30
34
  def is_subscribed?(user)
31
35
  !subscription_for(subscriber).blank?
32
36
  end
@@ -69,7 +73,9 @@ module Commontator
69
73
 
70
74
  # Creates a new empty thread and assigns it to the commontable
71
75
  # The old thread is kept in the database for archival purposes
76
+
72
77
  def clear(user = nil)
78
+ return if commontable.blank?
73
79
  new_thread = Thread.new
74
80
  new_thread.commontable = commontable
75
81
  self.with_lock do
@@ -91,27 +97,27 @@ module Commontator
91
97
  ####################
92
98
 
93
99
  def comment_created_callback(user, comment)
94
- commontable.send(config.comment_created_callback, user, comment) unless config.comment_created_callback.blank?
100
+ commontable.send(config.comment_created_callback, user, comment) unless commontable.blank? || config.comment_created_callback.blank?
95
101
  end
96
102
 
97
103
  def comment_edited_callback(user, comment)
98
- commontable.send(config.comment_edited_callback, user, comment) unless config.comment_edited_callback.blank?
104
+ commontable.send(config.comment_edited_callback, user, comment) unless commontable.blank? || config.comment_edited_callback.blank?
99
105
  end
100
106
 
101
107
  def comment_deleted_callback(user, comment)
102
- commontable.send(config.comment_deleted_callback, user, comment) unless config.comment_deleted_callback.blank?
108
+ commontable.send(config.comment_deleted_callback, user, comment) unless commontable.blank? || config.comment_deleted_callback.blank?
103
109
  end
104
110
 
105
111
  def thread_closed_callback(user)
106
- commontable.send(config.thread_closed_callback, user) unless config.thread_closed_callback.blank?
112
+ commontable.send(config.thread_closed_callback, user) unless commontable.blank? || config.thread_closed_callback.blank?
107
113
  end
108
114
 
109
115
  def subscribe_callback(user)
110
- commontable.send(config.subscribe_callback, user) unless config.subscribe_callback.blank?
116
+ commontable.send(config.subscribe_callback, user) unless commontable.blank? || config.subscribe_callback.blank?
111
117
  end
112
118
 
113
119
  def unsubscribe_callback(user)
114
- commontable.send(config.unsubscribe_callback, user) unless config.unsubscribe_callback.blank?
120
+ commontable.send(config.unsubscribe_callback, user) unless commontable.blank? || config.unsubscribe_callback.blank?
115
121
  end
116
122
 
117
123
  ##########################
@@ -119,20 +125,19 @@ module Commontator
119
125
  ##########################
120
126
 
121
127
  def can_be_read_by?(user) # Reader and poster capabilities
122
- ((!is_closed? || config.closed_threads_are_readable) &&\
128
+ (!commontable.blank? && (!is_closed? || config.closed_threads_are_readable) &&\
123
129
  config.can_read_thread_method.blank? ? true : commontable.send(config.can_read_thread_method, user)) ||\
124
130
  can_be_edited_by?(user)
125
131
  end
126
132
 
127
133
  def can_be_edited_by?(user) # Thread admin capabilities
128
- config.can_edit_thread_method.blank? ?
134
+ !commontable.blank? && (config.can_edit_thread_method.blank? ?
129
135
  (user.commontator_config.is_admin_method.blank? ? false : user.send(user.commontator_config.is_admin_method)) :
130
- commontable.send(config.can_edit_thread_method, user)
136
+ commontable.send(config.can_edit_thread_method, user))
131
137
  end
132
138
 
133
139
  def can_subscribe?(user)
134
- config.can_subscribe_to_thread && can_be_read_by?(user)
140
+ !commontable.blank? && config.can_subscribe_to_thread && can_be_read_by?(user)
135
141
  end
136
-
137
142
  end
138
143
  end
@@ -1,16 +1,24 @@
1
1
  module Commontator
2
2
  class Thread < ActiveRecord::Base
3
-
4
3
  belongs_to :closer, :polymorphic => true
5
4
  belongs_to :commontable, :polymorphic => true
6
5
 
7
6
  has_many :comments, :dependent => :destroy
8
7
  has_many :subscriptions, :dependent => :destroy
9
8
 
10
- validates_presence_of :commontable, :allow_nil => true
9
+ validates_presence_of :commontable, :on => :create
11
10
 
12
11
  attr_accessible :is_closed
13
12
 
13
+ def config
14
+ commontable.try(:commontable_config)
15
+ end
16
+
17
+ def comments
18
+ (!commontable.blank? && config.comments_can_be_voted_on && config.comments_ordered_by_votes) ? \
19
+ super.order("cached_votes_down - cached_votes_up") : super
20
+ end
21
+
14
22
  def subscribers
15
23
  subscriptions.collect{|s| s.subscriber}
16
24
  end
@@ -23,10 +31,6 @@ module Commontator
23
31
  !closed_at.blank?
24
32
  end
25
33
 
26
- def config
27
- commontable.commontable_config
28
- end
29
-
30
34
  def is_subscribed?(user)
31
35
  !subscription_for(subscriber).blank?
32
36
  end
@@ -69,7 +73,9 @@ module Commontator
69
73
 
70
74
  # Creates a new empty thread and assigns it to the commontable
71
75
  # The old thread is kept in the database for archival purposes
76
+
72
77
  def clear(user = nil)
78
+ return if commontable.blank?
73
79
  new_thread = Thread.new
74
80
  new_thread.commontable = commontable
75
81
  self.with_lock do
@@ -91,30 +97,27 @@ module Commontator
91
97
  ####################
92
98
 
93
99
  def comment_created_callback(user, comment)
94
- self.subscribe(user) if config.auto_subscribe_on_comment
95
- self.mark_as_unread_except_for(user)
96
- SubscriptionMailer.comment_created_email(comment)
97
- commontable.send(config.comment_created_callback, user, comment) unless config.comment_created_callback.blank?
100
+ commontable.send(config.comment_created_callback, user, comment) unless commontable.blank? || config.comment_created_callback.blank?
98
101
  end
99
102
 
100
103
  def comment_edited_callback(user, comment)
101
- commontable.send(config.comment_edited_callback, user, comment) unless config.comment_edited_callback.blank?
104
+ commontable.send(config.comment_edited_callback, user, comment) unless commontable.blank? || config.comment_edited_callback.blank?
102
105
  end
103
106
 
104
107
  def comment_deleted_callback(user, comment)
105
- commontable.send(config.comment_deleted_callback, user, comment) unless config.comment_deleted_callback.blank?
108
+ commontable.send(config.comment_deleted_callback, user, comment) unless commontable.blank? || config.comment_deleted_callback.blank?
106
109
  end
107
110
 
108
111
  def thread_closed_callback(user)
109
- commontable.send(config.thread_closed_callback, user) unless config.thread_closed_callback.blank?
112
+ commontable.send(config.thread_closed_callback, user) unless commontable.blank? || config.thread_closed_callback.blank?
110
113
  end
111
114
 
112
115
  def subscribe_callback(user)
113
- commontable.send(config.subscribe_callback, user) unless config.subscribe_callback.blank?
116
+ commontable.send(config.subscribe_callback, user) unless commontable.blank? || config.subscribe_callback.blank?
114
117
  end
115
118
 
116
119
  def unsubscribe_callback(user)
117
- commontable.send(config.unsubscribe_callback, user) unless config.unsubscribe_callback.blank?
120
+ commontable.send(config.unsubscribe_callback, user) unless commontable.blank? || config.unsubscribe_callback.blank?
118
121
  end
119
122
 
120
123
  ##########################
@@ -122,20 +125,19 @@ module Commontator
122
125
  ##########################
123
126
 
124
127
  def can_be_read_by?(user) # Reader and poster capabilities
125
- ((!is_closed? || config.closed_threads_are_readable) &&\
128
+ (!commontable.blank? && (!is_closed? || config.closed_threads_are_readable) &&\
126
129
  config.can_read_thread_method.blank? ? true : commontable.send(config.can_read_thread_method, user)) ||\
127
130
  can_be_edited_by?(user)
128
131
  end
129
132
 
130
133
  def can_be_edited_by?(user) # Thread admin capabilities
131
- config.can_edit_thread_method.blank? ?
134
+ !commontable.blank? && (config.can_edit_thread_method.blank? ?
132
135
  (user.commontator_config.is_admin_method.blank? ? false : user.send(user.commontator_config.is_admin_method)) :
133
- commontable.send(config.can_edit_thread_method, user)
136
+ commontable.send(config.can_edit_thread_method, user))
134
137
  end
135
138
 
136
139
  def can_subscribe?(user)
137
- config.can_subscribe_to_thread && can_be_read_by?(user)
140
+ !commontable.blank? && config.can_subscribe_to_thread && can_be_read_by?(user)
138
141
  end
139
-
140
142
  end
141
143
  end
@@ -1,7 +1,164 @@
1
- # Example initializer
2
-
1
+ # Change the settings below to suit your needs
2
+ # All settings are initially set to their default values
3
3
  Commontator.configure do |config|
4
4
 
5
- #config.current_user_method = :current_user
5
+ # Engine Configuration
6
+
7
+ # Method called on ApplicationController to return the current user
8
+ # Default: 'current_user'
9
+ config.current_user_method = 'current_user'
10
+
11
+ # Proc that is called when a view wants to set the page heading.
12
+ # Default: Proc.new {}
13
+ config.heading_proc = nil
14
+
15
+ # Proc that is called after any javascript runs (e.g. to clear flash notices)
16
+ # Default: Proc.new {}
17
+ config.javascript_proc = nil
18
+
19
+
20
+ # Commontator (User model) Configuration
21
+
22
+ # Whether the commontator's name is clickable in the comment view
23
+ # Default: false
24
+ config.commontator_name_clickable = false
25
+
26
+ # The method that return the commontator's email address
27
+ # Default: 'email'
28
+ config.commontator_email_method = 'email'
29
+
30
+ # The method that return the commontator's name
31
+ # Default: '' (Anonymous)
32
+ config.commontator_name_method = ''
33
+
34
+ # Method that returns true if the commontator is an admin for all threads
35
+ # Admins can always delete other users' comments and close threads
36
+ # Default: '' (no admins)
37
+ config.is_admin_method = ''
38
+
39
+
40
+ # Commontable (Commentable model) Configuration
41
+
42
+ # What a comment is called in your application
43
+ # Default: 'comment'
44
+ config.comment_name = 'comment'
45
+
46
+ # Verb used when creating comments (present)
47
+ # Default: 'post'
48
+ config.comment_create_verb_present = 'post'
49
+
50
+ # Verb used when creating comments (past)
51
+ # Default: 'posted'
52
+ config.comment_create_verb_past = 'posted'
53
+
54
+ # What a commontable is called in your application
55
+ # If you have multiple commontable models,
56
+ # you might want to pass this configuration value
57
+ # as an argument to acts_as_commontable in each one
58
+ # Default: 'commontable'
59
+ config.commontable_name = 'commontable'
60
+
61
+ # Proc that returns the subscription email subject
62
+ # Default: Proc.new {}
63
+ config.subscription_email_subject_proc = Proc.new {|params| \
64
+ "#{params[:commontator_name]} #{params[:config].comment_create_verb_past} a " + \
65
+ "#{params[:config].comment_name} on #{params[:commontable_name]} ##{params[:commontable_id]}"}
66
+
67
+ # The format of the timestamps used by Commontator
68
+ # Default: '%b %d %Y, %I:%M %p'
69
+ config.timestamp_format = '%b %d %Y, %I:%M %p'
70
+
71
+ # Whether admins can edit other users' comments
72
+ # Default: false
73
+ config.admin_can_edit_comments = false
74
+
75
+ # Whether users automatically subscribe to a thread when commenting
76
+ # Default: false
77
+ config.auto_subscribe_on_comment = false
78
+
79
+ # Whether users can edit their own comments
80
+ # Default: true
81
+ config.can_edit_own_comments = true
82
+
83
+ # Whether users can edit their own comments
84
+ # after someone posted a newer comment
85
+ # Default: false
86
+ config.can_edit_old_comments = false
87
+
88
+ # Whether users can delete their own comments
89
+ # Default: false
90
+ config.can_delete_own_comments = false
91
+
92
+ # Whether users can delete their own comments
93
+ # after someone posted a newer comment
94
+ # Default: false
95
+ config.can_delete_old_comments = false
96
+
97
+ # Whether users can manually subscribe or unsubscribe to threads
98
+ # Default: true
99
+ config.can_subscribe_to_thread = true
100
+
101
+ # Whether users can vote on other users' comments
102
+ # Note: requires acts_as_votable gem installed
103
+ # and configured for your application
104
+ # Default: false
105
+ config.comments_can_be_voted_on = false
106
+
107
+ # Whether comments should be ordered by vote score
108
+ # instead of by order posted
109
+ # Default: false
110
+ config.comments_ordered_by_votes = false
111
+
112
+ # Whether users can read threads closed by admins
113
+ # Default: true
114
+ config.closed_threads_are_readable = true
115
+
116
+ # Whether comments deleted by admins can be seen
117
+ # (the content will still be hidden)
118
+ # Default: true
119
+ config.deleted_comments_are_visible = true
120
+
121
+ # Method called on commontable to return its id
122
+ # Default: 'id'
123
+ config.commontable_id_method = 'id'
124
+
125
+ # Method called on commontable and passed user as argument
126
+ # If true, that user is an admin for that particular commontable's thread
127
+ # Default: '' (no thread-specific admins)
128
+ config.can_edit_thread_method = ''
129
+
130
+ # Method called on commontable and passed user as argument
131
+ # If true, that user is allowed to read that commontable's thread
132
+ # Default: '' (no read restrictions)
133
+ config.can_read_thread_method = ''
134
+
135
+ # Method called on commontable when a comment is created
136
+ # Passed user, comment as arguments
137
+ # Default: '' (no callback)
138
+ config.comment_created_callback = ''
139
+
140
+ # Method called on commontable when a comment is edited
141
+ # Passed user, comment as arguments
142
+ # Default: '' (no callback)
143
+ config.comment_edited_callback = ''
144
+
145
+ # Method called on commontable when a comment is deleted
146
+ # Passed user, comment as arguments
147
+ # Default: '' (no callback)
148
+ config.comment_deleted_callback = ''
149
+
150
+ # Method called on commontable when a thread is closed
151
+ # Passed user as argument
152
+ # Default: '' (no callback)
153
+ config.thread_closed_callback = ''
154
+
155
+ # Method called on commontable when a thread is subscribed to
156
+ # Passed user as argument
157
+ # Default: '' (no callback)
158
+ config.subscribe_callback = ''
6
159
 
160
+ # Method called on commontable when a thread is unsubscribed to
161
+ # Passed user as argument
162
+ # Default: '' (no callback)
163
+ config.unsubscribe_callback = ''
7
164
  end