commontator 4.0.1 → 4.0.2

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.
Files changed (76) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -5
  3. data/app/controllers/commontator/comments_controller.rb +6 -6
  4. data/app/controllers/commontator/subscriptions_controller.rb +2 -2
  5. data/app/controllers/commontator/threads_controller.rb +2 -2
  6. data/app/views/commontator/comments/_actions.html.erb +1 -1
  7. data/app/views/commontator/comments/_votes.html.erb +4 -4
  8. data/app/views/commontator/shared/_thread.html.erb +1 -1
  9. data/app/views/commontator/subscriptions/_link.html.erb +1 -1
  10. data/app/views/commontator/threads/_show.html.erb +1 -1
  11. data/config/routes.rb +9 -9
  12. data/lib/commontator/version.rb +1 -1
  13. data/spec/app/controllers/commontator/comments_controller_spec.rb +40 -40
  14. data/spec/app/controllers/commontator/subscriptions_controller_spec.rb +12 -12
  15. data/spec/app/controllers/commontator/threads_controller_spec.rb +12 -12
  16. data/spec/dummy/db/test.sqlite3 +0 -0
  17. data/spec/dummy/log/test.log +4176 -0
  18. metadata +4 -91
  19. data/app/controllers/commontator/application_controller.rb~ +0 -27
  20. data/app/controllers/commontator/comments_controller.rb~ +0 -144
  21. data/app/controllers/commontator/subscriptions_controller.rb~ +0 -32
  22. data/app/controllers/commontator/threads_controller.rb~ +0 -42
  23. data/app/mailers/commontator/subscriptions_mailer.rb~ +0 -50
  24. data/app/models/commontator/comment.rb~ +0 -104
  25. data/app/models/commontator/subscription.rb~ +0 -18
  26. data/app/models/commontator/thread.rb~ +0 -124
  27. data/app/models/commontator/tree.rb~ +0 -123
  28. data/app/views/commontator/comments/_actions.html.erb~ +0 -30
  29. data/app/views/commontator/comments/_body.html.erb~ +0 -8
  30. data/app/views/commontator/comments/_form.html.erb~ +0 -38
  31. data/app/views/commontator/comments/_show.html.erb~ +0 -44
  32. data/app/views/commontator/comments/_votes.html.erb~ +0 -57
  33. data/app/views/commontator/comments/delete.js.erb~ +0 -17
  34. data/app/views/commontator/shared/_thread.html.erb~ +0 -20
  35. data/app/views/commontator/subscriptions/_link.html.erb~ +0 -16
  36. data/app/views/commontator/threads/_show.html.erb~ +0 -62
  37. data/config/initializers/commontator.rb~ +0 -171
  38. data/config/routes.rb~ +0 -22
  39. data/db/migrate/0_install.rb~ +0 -50
  40. data/lib/commontator.rb~ +0 -61
  41. data/lib/commontator/acts_as_commontable.rb~ +0 -45
  42. data/lib/commontator/acts_as_commontator.rb~ +0 -31
  43. data/lib/commontator/controller_includes.rb~ +0 -22
  44. data/lib/commontator/security_transgression.rb~ +0 -3
  45. data/lib/commontator/shared_helper.rb~ +0 -42
  46. data/lib/commontator/version.rb~ +0 -3
  47. data/lib/tasks/commontator_tasks.rake~ +0 -42
  48. data/spec/app/controllers/commontator/comments_controller_spec.rb~ +0 -563
  49. data/spec/app/controllers/commontator/subscriptions_controller_spec.rb~ +0 -99
  50. data/spec/app/controllers/commontator/threads_controller_spec.rb~ +0 -121
  51. data/spec/app/helpers/commontator/application_helper_spec.rb~ +0 -9
  52. data/spec/app/helpers/commontator/threads_helper_spec.rb~ +0 -17
  53. data/spec/app/mailers/commontator/subscriptions_mailer_spec.rb~ +0 -30
  54. data/spec/app/models/commontator/comment_observer_spec.rb~ +0 -27
  55. data/spec/app/models/commontator/comment_spec.rb~ +0 -61
  56. data/spec/app/models/commontator/subscription_spec.rb~ +0 -28
  57. data/spec/app/models/commontator/thread_spec.rb~ +0 -130
  58. data/spec/dummy/README.md~ +0 -3
  59. data/spec/dummy/Rakefile~ +0 -7
  60. data/spec/dummy/config.ru~ +0 -4
  61. data/spec/dummy/config/application.rb~ +0 -23
  62. data/spec/dummy/config/environment.rb~ +0 -5
  63. data/spec/dummy/config/environments/development.rb~ +0 -31
  64. data/spec/dummy/config/environments/production.rb~ +0 -67
  65. data/spec/dummy/config/environments/test.rb~ +0 -31
  66. data/spec/dummy/config/initializers/secret_token.rb~ +0 -12
  67. data/spec/lib/commontator/acts_as_commontable_spec.rb~ +0 -26
  68. data/spec/lib/commontator/acts_as_commontator_spec.rb~ +0 -25
  69. data/spec/lib/commontator/commontable_config_spec.rb~ +0 -26
  70. data/spec/lib/commontator/commontator_config_spec.rb~ +0 -26
  71. data/spec/lib/commontator/controller_includes_spec.rb~ +0 -15
  72. data/spec/lib/commontator/shared_helper_spec.rb~ +0 -16
  73. data/spec/lib/commontator_spec.rb~ +0 -23
  74. data/spec/minitest_helper.rb~ +0 -35
  75. data/spec/spec_helper.rb~ +0 -36
  76. data/spec/test_helper.rb~ +0 -37
@@ -1,42 +0,0 @@
1
- module Commontator
2
- class ThreadsController < Commontator::ApplicationController
3
- before_filter :get_thread
4
- before_filter :set_commontable_url, :only => :show
5
-
6
- # GET /threads/1
7
- def show
8
- commontator_thread_show(@thread.commontable)
9
-
10
- respond_to do |format|
11
- format.html { redirect_to commontable_url }
12
- format.js
13
- end
14
- end
15
-
16
- # PATCH /threads/1/close
17
- def close
18
- raise SecurityTransgression unless @thread.can_be_edited_by?(@user)
19
-
20
- @thread.errors.add(:base, 'This thread has already been closed.') \
21
- unless @thread.close(@user)
22
-
23
- respond_to do |format|
24
- format.html { redirect_to @thread }
25
- format.js { render :show }
26
- end
27
- end
28
-
29
- # PUT /threads/1/reopen
30
- def reopen
31
- raise SecurityTransgression unless @thread.can_be_edited_by?(@user)
32
-
33
- @thread.errors.add(:base, 'This thread is not closed.') \
34
- unless @thread.reopen
35
-
36
- respond_to do |format|
37
- format.html { redirect_to @thread }
38
- format.js { render :show }
39
- end
40
- end
41
- end
42
- end
@@ -1,50 +0,0 @@
1
- module Commontator
2
- class SubscriptionsMailer < ActionMailer::Base
3
- include SharedHelper
4
- include ThreadsHelper
5
-
6
- def comment_created(comment, recipients)
7
- setup_variables(comment, recipients)
8
-
9
- mail :to => 'Undisclosed Recipients'
10
- :bcc => @bcc,
11
- :from => @from,
12
- :subject => @subject
13
- end
14
-
15
- protected
16
-
17
- def setup_variables(comment, recipients)
18
- @comment = comment
19
- @thread = @comment.thread
20
- @creator = @comment.creator
21
-
22
- @commontable = @thread.commontable
23
- @config = @thread.config
24
-
25
- @creator_name = commontator_name(@creator)
26
- @comment_timestamp = @comment.timestamp
27
-
28
- @commontable_name = commontable_name(@thread)
29
- @commontable_id = commontable_id(@thread).to_s
30
-
31
- @commontable_url = ApplicationController.commontable_url
32
-
33
- params = Hash.new
34
- params[:comment] = @comment
35
- params[:thread] = @thread
36
- params[:creator] = @creator
37
- params[:commontable] = @commontable
38
- params[:config] = @config
39
- params[:creator_name] = @creator_name
40
- params[:comment_timestamp] = @comment_timestamp
41
- params[:commontable_name] = @commontable_name
42
- params[:commontable_id] = @commontable_id
43
- params[:commontable_url] = @commontable_url
44
-
45
- @bcc = recipients.collect{|s| commontator_email(s)}
46
- @from = @config.subscription_email_from_proc.call(params)
47
- @subject = @config.subscription_email_subject_proc.call(params)
48
- end
49
- end
50
- end
@@ -1,104 +0,0 @@
1
- module Commontator
2
- class Comment < ActiveRecord::Base
3
- belongs_to :creator, :polymorphic => true
4
- belongs_to :editor, :polymorphic => true
5
- belongs_to :thread
6
-
7
- has_one :commontable, :through => :thread
8
-
9
- attr_accessible :body if respond_to?(:attr_accessible)
10
-
11
- validates_presence_of :creator, :on => :create
12
- validates_presence_of :editor, :on => :update
13
- validates_presence_of :thread
14
- validates_presence_of :body
15
-
16
- validates_uniqueness_of :body, :scope => [:creator_type, :creator_id, :thread_id],
17
- :message => 'has already been posted'
18
-
19
- protected
20
-
21
- cattr_accessor :acts_as_votable_initialized
22
-
23
- public
24
-
25
- def is_votable?
26
- return true if acts_as_votable_initialized
27
- return false unless self.class.respond_to?(:acts_as_votable)
28
- self.class.acts_as_votable
29
- self.class.acts_as_votable_initialized = true
30
- end
31
-
32
- def get_vote_by(user)
33
- return nil unless is_votable?
34
- votes.where(:voter_type => user.class.name, :voter_id => user.id).first
35
- end
36
-
37
- def is_modified?
38
- !editor.nil?
39
- end
40
-
41
- def is_deleted?
42
- !deleted_at.blank?
43
- end
44
-
45
- def delete_by(user)
46
- return false if is_deleted?
47
- self.deleted_at = Time.now
48
- self.editor = user
49
- self.save
50
- end
51
-
52
- def undelete_by(user)
53
- return false unless is_deleted?
54
- self.deleted_at = nil
55
- self.editor = user
56
- self.save
57
- end
58
-
59
- def timestamp
60
- config = thread.config
61
- "#{config.comment_create_verb_past.capitalize} on " + \
62
- created_at.strftime(config.timestamp_format) + \
63
- (is_modified? ? " | Last #{config.comment_edit_verb_past} on " + \
64
- updated_at.strftime(config.timestamp_format) : '')
65
- end
66
-
67
- ##################
68
- # Access Control #
69
- ##################
70
-
71
- def can_be_read_by?(user)
72
- (thread.can_be_read_by?(user) && \
73
- (!is_deleted? || thread.config.deleted_comments_are_visible)) ||\
74
- thread.can_be_edited_by?(user)
75
- end
76
-
77
- def can_be_created_by?(user)
78
- !thread.is_closed? && thread.can_be_read_by?(user) && user == creator
79
- end
80
-
81
- def can_be_edited_by?(user)
82
- !thread.is_closed? && !is_deleted? &&\
83
- ((user == creator && thread.config.can_edit_own_comments && thread.can_be_read_by?(user)) ||\
84
- (thread.can_be_edited_by?(user) && thread.config.admin_can_edit_comments)) &&\
85
- (thread.comments.last == self || thread.config.can_edit_old_comments)
86
- end
87
-
88
- def can_be_deleted_by?(user)
89
- (!thread.is_closed? &&\
90
- ((user == creator && thread.config.can_delete_own_comments && \
91
- thread.can_be_read_by?(user) && (!is_deleted? || editor == user)) &&\
92
- (thread.comments.last == self || thread.config.can_delete_old_comments))) ||\
93
- thread.can_be_edited_by?(user)
94
- end
95
-
96
- def can_be_voted_on?
97
- !thread.is_closed? && is_votable? && !is_deleted? && thread.config.can_vote_on_comments
98
- end
99
-
100
- def can_be_voted_on_by?(user)
101
- can_be_voted_on? && thread.can_be_read_by?(user) && user != creator
102
- end
103
- end
104
- end
@@ -1,18 +0,0 @@
1
- module Commontator
2
- class Subscription < ActiveRecord::Base
3
- belongs_to :subscriber, :polymorphic => true
4
-
5
- belongs_to :thread
6
-
7
- validates_presence_of :subscriber, :thread
8
- validates_uniqueness_of :thread_id, :scope => [:subscriber_type, :subscriber_id]
9
-
10
- def mark_as_read
11
- update_attribute(:unread, 0)
12
- end
13
-
14
- def add_unread
15
- update_attribute(:unread, unread + 1)
16
- end
17
- end
18
- end
@@ -1,124 +0,0 @@
1
- module Commontator
2
- class Thread < ActiveRecord::Base
3
- belongs_to :closer, :polymorphic => true
4
- belongs_to :commontable, :polymorphic => true
5
-
6
- has_many :comments, :dependent => :destroy
7
- has_many :subscriptions, :dependent => :destroy
8
-
9
- validates_presence_of :commontable, :unless => :is_closed?
10
- validates_uniqueness_of :commontable_id, :scope => :commontable_type, :allow_nil => true
11
-
12
- def config
13
- commontable.try(:commontable_config) || Commontator
14
- end
15
-
16
- def ordered_comments
17
- (config.can_vote_on_comments && config.comments_ordered_by_votes) ? \
18
- comments.order("cached_votes_down - cached_votes_up") : comments
19
- end
20
-
21
- def is_closed?
22
- !closed_at.blank?
23
- end
24
-
25
- def subscribers
26
- subscriptions.collect{|s| s.subscriber}
27
- end
28
-
29
- def active_subscribers
30
- subscribers.select{|s| s.is_commontator && s.commontator_config.subscription_email_enable_proc.call(s)}
31
- end
32
-
33
- def subscription_for(subscriber)
34
- return nil if subscriber.nil? || !subscriber.is_commontator
35
- subscriber.subscriptions.where(:thread_id => self.id).first
36
- end
37
-
38
- def is_subscribed?(subscriber)
39
- !subscription_for(subscriber).blank?
40
- end
41
-
42
- def subscribe(subscriber)
43
- return false if is_subscribed?(subscriber) || !subscriber.is_commontator
44
- subscription = Subscription.new
45
- subscription.subscriber = subscriber
46
- subscription.thread => self
47
- subscription.save
48
- end
49
-
50
- def unsubscribe(subscriber)
51
- subscription = subscription_for(subscriber)
52
- return false if subscription.blank?
53
- subscription.destroy
54
- end
55
-
56
- def add_unread_except_for(subscriber)
57
- Subscription.transaction do
58
- subscriptions.each{|s| s.add_unread unless s.subscriber == subscriber}
59
- end
60
- end
61
-
62
- def mark_as_read_for(subscriber)
63
- return if !subscription_for(subscriber)
64
- subscription_for(subscriber).mark_as_read
65
- end
66
-
67
- def close(user = nil)
68
- return false if is_closed?
69
- self.closed_at = Time.now
70
- self.closer = user
71
- save
72
- end
73
-
74
- def reopen
75
- return false unless is_closed? && !commontable.nil?
76
- self.closed_at = nil
77
- save
78
- end
79
-
80
- # Creates a new empty thread and assigns it to the commontable
81
- # The old thread is kept in the database for archival purposes
82
- def clear(user = nil)
83
- return if commontable.blank?
84
- new_thread = Thread.new
85
- new_thread.commontable = commontable
86
- with_lock do
87
- self.commontable = nil
88
- self.closed_at = Time.now
89
- self.closer = user
90
- save!
91
- new_thread.save!
92
- subscriptions.each do |s|
93
- s.thread = new_thread
94
- s.save!
95
- s.mark_as_read
96
- end
97
- end
98
- end
99
-
100
- ##################
101
- # Access Control #
102
- ##################
103
-
104
- # Reader and poster capabilities
105
- def can_be_read_by?(user)
106
- (!commontable.nil? && \
107
- (!is_closed? || config.closed_threads_are_readable) && \
108
- config.can_read_thread_proc.call(self, user)) || \
109
- can_be_edited_by?(user)
110
- end
111
-
112
- # Thread moderator capabilities
113
- def can_be_edited_by?(user)
114
- (!commontable.nil? && \
115
- config.can_edit_thread_proc.call(self, user)) || \
116
- (!user.nil? && user.is_commontator && \
117
- user.commontator_config.user_admin_proc.call(user))
118
- end
119
-
120
- def can_subscribe?(user)
121
- !commontable.nil? && config.can_subscribe_to_thread && !is_closed? && can_be_read_by?(user)
122
- end
123
- end
124
- end
@@ -1,123 +0,0 @@
1
- module Linkifier
2
- class Tree < ActiveRecord::Base
3
- belongs_to :closer, :polymorphic => true
4
- belongs_to :commontable, :polymorphic => true
5
-
6
- has_many :comments, :dependent => :destroy
7
- has_many :subscriptions, :dependent => :destroy
8
-
9
- validates_presence_of :commontable, :on => :create
10
-
11
- attr_accessible :is_closed
12
-
13
- def config
14
- commontable.try(:commontable_config)
15
- end
16
-
17
- def ordered_comments
18
- (!commontable.blank? && config.can_vote_on_comments && config.comments_ordered_by_votes) ? \
19
- comments.order("cached_votes_down - cached_votes_up") : comments
20
- end
21
-
22
- def subscribers
23
- subscriptions.collect{|s| s.subscriber}
24
- end
25
-
26
- def active_subscribers
27
- subscribers.select{|s| s.commontator_config.subscription_email_enable_proc.call(s)}
28
- end
29
-
30
- def subscription_for(subscriber)
31
- return nil if subscriber.nil?
32
- Subscription.find_by_thread_id_and_subscriber_id_and_subscriber_type(self.id, subscriber.id, subscriber.class.name)
33
- end
34
-
35
- def is_closed?
36
- !closed_at.blank?
37
- end
38
-
39
- def is_subscribed?(subscriber)
40
- !subscription_for(subscriber).blank?
41
- end
42
-
43
- def subscribe(subscriber)
44
- return false if is_subscribed?(subscriber)
45
- subscription = Subscription.create(
46
- :subscriber => subscriber, :thread => self)
47
- end
48
-
49
- def unsubscribe(subscriber)
50
- subscription = subscription_for(subscriber)
51
- return false if subscription.blank?
52
- subscription.destroy
53
- end
54
-
55
- def mark_as_read_for(subscriber)
56
- return if !subscription_for(subscriber)
57
- subscription_for(subscriber).mark_as_read
58
- end
59
-
60
- def add_unread_except_for(subscriber)
61
- Subscription.transaction do
62
- subscriptions.each{|s| s.add_unread unless s.subscriber == subscriber}
63
- end
64
- end
65
-
66
- def close(user = nil)
67
- return false if is_closed?
68
- self.closed_at = Time.now
69
- self.closer = user
70
- self.save!
71
- end
72
-
73
- def reopen
74
- return false unless is_closed?
75
- self.closed_at = nil
76
- self.save!
77
- end
78
-
79
- # Creates a new empty thread and assigns it to the commontable
80
- # The old thread is kept in the database for archival purposes
81
-
82
- def clear(user = nil)
83
- return if commontable.blank?
84
- new_thread = Thread.new
85
- new_thread.commontable = commontable
86
- self.with_lock do
87
- new_thread.save!
88
- commontable.thread = new_thread
89
- commontable.save!
90
- subscriptions.each do |s|
91
- s.thread = new_thread
92
- s.save!
93
- s.mark_as_read
94
- end
95
- self.commontable = nil
96
- self.close(user)
97
- end
98
- end
99
-
100
- ##########################
101
- # Access control methods #
102
- ##########################
103
-
104
- # Reader and poster capabilities
105
- def can_be_read_by?(user)
106
- (!commontable.blank? && \
107
- (!is_closed? || config.closed_threads_are_readable) && \
108
- config.can_read_thread_proc.call(self, user)) || \
109
- can_be_edited_by?(user)
110
- end
111
-
112
- # Thread moderator capabilities
113
- def can_be_edited_by?(user)
114
- !commontable.blank? && \
115
- (config.can_edit_thread_proc.call(self, user) || \
116
- (!user.nil? && user.commontator_config.user_admin_proc.call(user)))
117
- end
118
-
119
- def can_subscribe?(user)
120
- !commontable.blank? && config.can_subscribe_to_thread && !is_closed? && can_be_read_by?(user)
121
- end
122
- end
123
- end