parole 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fa7a50452389b800759094aa18ff625260946c25
4
- data.tar.gz: 4afa76b5ba285edae56a3715cf470fbdd6a57c47
3
+ metadata.gz: b6ee830289243ba04c8d108f5d7f5735be8306e9
4
+ data.tar.gz: 8faf15de5fceaaa33ce9098bfe68a4e8c32c6a99
5
5
  SHA512:
6
- metadata.gz: 874411296ab97a6e4e148e2c057f247ee4ba504c02072976d337c4c0cf93b66a94c036445bd70d1d28ee61d3c06878f377426bf65fb44f0c50a08b18cd69cfbf
7
- data.tar.gz: 43c3227696e550314dad9f94627dba9b648b988468994a21b3c15493802d7dd48cff9bc12c6388b66b400cce7ae0a54f8caa736f7ca80d396aa2a3d6c922ca2a
6
+ metadata.gz: 57bba72cecc135f0aaa16e5830761cef234ba6b81b30d5a69bab063523f4043642e7f501c444b6031b00175d84c7b458d52dbf00b14105af5dc4e54cf00c2a45
7
+ data.tar.gz: 0fc0fc9d30fce89c01a0fbb04a961ce79e715c172a2b80b8b89a0f80102472623a665d5f6bb488796982ee61d400a6fbf8799e0f94512c631112d82f808daa49
data/.travis.yml ADDED
@@ -0,0 +1,10 @@
1
+ language: ruby
2
+
3
+ rvm:
4
+ - 2.0.0
5
+ - 1.9.3
6
+
7
+ gemfile:
8
+ - gemfiles/Gemfile.activerecord-4.0
9
+
10
+ script: "echo 'DO IT' && bundle exec rake spec"
data/README.md CHANGED
@@ -1,8 +1,16 @@
1
- # Parole
2
-
3
- [![Gem Version](https://badge.fury.io/rb/parole.png)](https://rubygems.org/gems/parole)
4
-
5
- Parole adds the ability to comment on ActiveRecord records.
1
+ <p align="center">
2
+ <a href="https://github.com/mirego/parole">
3
+ <img src="http://i.imgur.com/QQlNfGL.png" alt="Parole" />
4
+ </a>
5
+ <br />
6
+ Parole adds the ability to comment on ActiveRecord records.
7
+ <br /><br />
8
+ <a href="https://rubygems.org/gems/parole"><img src="https://badge.fury.io/rb/parole.png" /></a>
9
+ <a href="https://codeclimate.com/github/mirego/parole"><img src="https://codeclimate.com/github/mirego/parole.png" /></a>
10
+ <a href="https://travis-ci.org/mirego/parole"><img src="https://travis-ci.org/mirego/parole.png?branch=master" /></a>
11
+ </p>
12
+
13
+ ---
6
14
 
7
15
  ## Installation
8
16
 
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec path: '../'
4
+
5
+ gem 'activerecord', '~> 4.0.0'
@@ -10,6 +10,7 @@ class AddParole < ActiveRecord::Migration
10
10
  end
11
11
 
12
12
  add_index :comments, [:commentable_type, :commentable_id, :role]
13
+ add_index :comments, [:commentable_type, :commentable_id]
13
14
  end
14
15
 
15
16
  def self.down
@@ -21,6 +21,10 @@ module Parole
21
21
 
22
22
  protected
23
23
 
24
+ # Update the commentable cache counter columns
25
+ #
26
+ # Look for a `<role>_comments_count` and a `comments_count` column
27
+ # in the commentable model and update their value with the count.
24
28
  def update_cache_counters
25
29
  role_method = :"#{self.role}_comments_count="
26
30
  if commentable.respond_to?(role_method)
@@ -35,6 +39,11 @@ module Parole
35
39
  commentable.save(validate: false)
36
40
  end
37
41
 
42
+ # Make sure that the value of the `role` attribute is a valid role
43
+ # for the commentable.
44
+ #
45
+ # If the commentable doesn't have any comment roles, we make sure
46
+ # that the value is blank.
38
47
  def ensure_valid_role_for_commentable
39
48
  allowed_roles = commentable.class.commentable_options[:roles]
40
49
 
@@ -45,6 +54,8 @@ module Parole
45
54
  end
46
55
  end
47
56
 
57
+ # Make sure that the record we're commenting on is an instance
58
+ # of a commentable model.
48
59
  def ensure_valid_commentable
49
60
  klass = commentable.class
50
61
  errors.add(:commentable, :invalid) unless klass.respond_to?(:acts_as_commentable?) && klass.acts_as_commentable?
@@ -1,3 +1,3 @@
1
1
  module Parole
2
- VERSION = '0.1.1'
2
+ VERSION = '0.1.2'
3
3
  end
@@ -1,4 +1,113 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Parole::Comment do
4
+ describe :ClassMethods do
5
+ describe :create do
6
+ context 'through general `comments` association' do
7
+ before do
8
+ spawn_comment_model
9
+ spawn_commenter_model 'User'
10
+ spawn_commentable_model 'Article'
11
+
12
+ run_migration do
13
+ create_table(:articles, force: true)
14
+ create_table(:users, force: true)
15
+ end
16
+ end
17
+
18
+ let(:commenter) { User.create }
19
+ let(:commentable) { Article.create }
20
+
21
+ context 'without role attribute' do
22
+ let(:comment) { commentable.comments.create(commenter: commenter, comment: 'Booya') }
23
+
24
+ it { expect(comment).to be_persisted }
25
+ it { expect(comment.comment).to eql 'Booya' }
26
+ it { expect(comment.commenter).to eql commenter }
27
+ it { expect(comment.commentable).to eql commentable }
28
+ end
29
+
30
+ context 'with role attribute' do
31
+ let(:comment) { commentable.comments.create(role: 'YEP', commenter: commenter, comment: 'Booya') }
32
+ it { expect(comment).to_not be_persisted }
33
+ it { expect(comment.errors.full_messages).to eql ['Role is invalid'] }
34
+ end
35
+ end
36
+
37
+ context 'through a role-specific comments association' do
38
+ before do
39
+ spawn_comment_model
40
+ spawn_commenter_model 'User'
41
+ spawn_commentable_model 'Article' do
42
+ acts_as_commentable roles: [:photos, :videos]
43
+ end
44
+
45
+ run_migration do
46
+ create_table(:articles, force: true)
47
+ create_table(:users, force: true)
48
+ end
49
+ end
50
+
51
+ let(:commenter) { User.create }
52
+ let(:commentable) { Article.create }
53
+
54
+ context 'with commentable role association method' do
55
+ let(:comment) { commentable.photos_comments.create(commenter: commenter, comment: 'Booya') }
56
+
57
+ it { expect(comment).to be_persisted }
58
+ it { expect(comment.role).to eql 'photos' }
59
+ it { expect(comment.comment).to eql 'Booya' }
60
+ it { expect(comment.commenter).to eql commenter }
61
+ it { expect(comment.commentable).to eql commentable }
62
+ end
63
+
64
+ context 'with commentable main association method' do
65
+ context 'with valid role' do
66
+ let(:comment) { commentable.comments.create(role: 'photos', commenter: commenter, comment: 'Booya') }
67
+
68
+ it { expect(comment).to be_persisted }
69
+ it { expect(comment.role).to eql 'photos' }
70
+ it { expect(comment.comment).to eql 'Booya' }
71
+ it { expect(comment.commenter).to eql commenter }
72
+ it { expect(comment.commentable).to eql commentable }
73
+ end
74
+
75
+ context 'with invalid role' do
76
+ let(:comment) { commentable.comments.create(role: 'NOPE', commenter: commenter, comment: 'Booya') }
77
+ it { expect(comment).to_not be_persisted }
78
+ it { expect(comment.errors.full_messages).to eql ['Role is invalid'] }
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
84
+
85
+ describe :InstanceMethods do
86
+ describe :update_cache_counters do
87
+ before do
88
+ spawn_comment_model
89
+ spawn_commenter_model 'User'
90
+ spawn_commentable_model 'Article' do
91
+ acts_as_commentable roles: [:photos, :videos]
92
+ end
93
+
94
+ run_migration do
95
+ create_table(:users, force: true)
96
+ create_table(:articles, force: true) do |t|
97
+ t.integer :photos_comments_count, default: 0
98
+ t.integer :videos_comments_count, default: 0
99
+ t.integer :comments_count, default: 0
100
+ end
101
+ end
102
+ end
103
+
104
+ let(:commenter) { User.create }
105
+ let(:commentable) { Article.create }
106
+ let(:create_comment!) { commentable.photos_comments.create(commenter: commenter, comment: 'Booya') }
107
+
108
+ it { expect { create_comment! }.to change { commentable.reload.photos_comments_count }.from(0).to(1) }
109
+ it { expect { create_comment! }.to_not change { commentable.reload.videos_comments_count } }
110
+ it { expect { create_comment! }.to change { commentable.reload.comments_count }.from(0).to(1) }
111
+ end
112
+ end
4
113
  end
@@ -1,107 +1,41 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Parole::Commentable do
4
- describe :comments do
5
- before do
6
- spawn_comment_model
7
- spawn_commenter_model 'User'
8
- spawn_commentable_model 'Article'
4
+ describe 'general `comments` relation' do
5
+ let(:relation_class) { ActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_Comment }
9
6
 
10
- run_migration do
11
- create_table(:articles, force: true)
12
- create_table(:users, force: true)
13
- end
14
- end
15
-
16
- let(:commenter) { User.create }
17
- let(:commentable) { Article.create }
18
-
19
- context 'without role attribute' do
20
- let(:comment) { commentable.comments.create(commenter: commenter, comment: 'Booya') }
21
-
22
- it { expect(comment).to be_persisted }
23
- it { expect(comment.comment).to eql 'Booya' }
24
- it { expect(comment.commenter).to eql commenter }
25
- it { expect(comment.commentable).to eql commentable }
26
- end
27
-
28
- context 'with role attribute' do
29
- let(:comment) { commentable.comments.create(role: 'YEP', commenter: commenter, comment: 'Booya') }
30
- it { expect(comment).to_not be_persisted }
31
- it { expect(comment.errors.full_messages).to eql ['Role is invalid'] }
32
- end
33
- end
34
-
35
- describe 'role comments' do
36
- before do
37
- spawn_comment_model
38
- spawn_commenter_model 'User'
39
- spawn_commentable_model 'Article' do
40
- acts_as_commentable roles: [:photos, :videos]
41
- end
42
-
43
- run_migration do
44
- create_table(:articles, force: true)
45
- create_table(:users, force: true)
46
- end
47
- end
7
+ context 'without defined roles' do
8
+ before do
9
+ spawn_comment_model
10
+ spawn_commentable_model 'Article'
48
11
 
49
- let(:commenter) { User.create }
50
- let(:commentable) { Article.create }
51
-
52
- context 'with commentable role association method' do
53
- let(:comment) { commentable.photos_comments.create(commenter: commenter, comment: 'Booya') }
54
-
55
- it { expect(comment).to be_persisted }
56
- it { expect(comment.role).to eql 'photos' }
57
- it { expect(comment.comment).to eql 'Booya' }
58
- it { expect(comment.commenter).to eql commenter }
59
- it { expect(comment.commentable).to eql commentable }
60
- end
61
-
62
- context 'with commentable main association method' do
63
- context 'with valid role' do
64
- let(:comment) { commentable.comments.create(role: 'photos', commenter: commenter, comment: 'Booya') }
65
-
66
- it { expect(comment).to be_persisted }
67
- it { expect(comment.role).to eql 'photos' }
68
- it { expect(comment.comment).to eql 'Booya' }
69
- it { expect(comment.commenter).to eql commenter }
70
- it { expect(comment.commentable).to eql commentable }
12
+ run_migration do
13
+ create_table(:articles, force: true)
14
+ end
71
15
  end
72
16
 
73
- context 'with invalid role' do
74
- let(:comment) { commentable.comments.create(role: 'NOPE', commenter: commenter, comment: 'Booya') }
75
- it { expect(comment).to_not be_persisted }
76
- it { expect(comment.errors.full_messages).to eql ['Role is invalid'] }
77
- end
17
+ it { expect(Article.create.comments).to be_instance_of(ActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_Comment) }
18
+ it { expect(Article.create.comments.new.role).to be_blank }
78
19
  end
79
- end
80
20
 
81
- describe 'cache counters' do
82
- before do
83
- spawn_comment_model
84
- spawn_commenter_model 'User'
85
- spawn_commentable_model 'Article' do
86
- acts_as_commentable roles: [:photos, :videos]
87
- end
21
+ context 'with roles' do
22
+ before do
23
+ spawn_comment_model
24
+ spawn_commentable_model 'Article' do
25
+ acts_as_commentable roles: [:photos, :videos]
26
+ end
88
27
 
89
- run_migration do
90
- create_table(:users, force: true)
91
- create_table(:articles, force: true) do |t|
92
- t.integer :photos_comments_count, default: 0
93
- t.integer :videos_comments_count, default: 0
94
- t.integer :comments_count, default: 0
28
+ run_migration do
29
+ create_table(:articles, force: true)
95
30
  end
96
31
  end
97
- end
98
-
99
- let(:commenter) { User.create }
100
- let(:commentable) { Article.create }
101
- let(:create_comment!) { commentable.photos_comments.create(commenter: commenter, comment: 'Booya') }
102
32
 
103
- it { expect { create_comment! }.to change { commentable.reload.photos_comments_count }.from(0).to(1) }
104
- it { expect { create_comment! }.to_not change { commentable.reload.videos_comments_count } }
105
- it { expect { create_comment! }.to change { commentable.reload.comments_count }.from(0).to(1) }
33
+ it { expect(Article.create.comments).to be_instance_of(relation_class) }
34
+ it { expect(Article.create.photos_comments).to be_instance_of(relation_class) }
35
+ it { expect(Article.create.videos_comments).to be_instance_of(relation_class) }
36
+ it { expect(Article.create.comments.new.role).to be_blank }
37
+ it { expect(Article.create.photos_comments.new.role).to eql 'photos' }
38
+ it { expect(Article.create.videos_comments.new.role).to eql 'videos' }
39
+ end
106
40
  end
107
41
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: parole
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rémi Prévost
@@ -103,9 +103,11 @@ extra_rdoc_files: []
103
103
  files:
104
104
  - .gitignore
105
105
  - .rspec
106
+ - .travis.yml
106
107
  - Gemfile
107
108
  - README.md
108
109
  - Rakefile
110
+ - gemfiles/Gemfile.activerecord-4.0
109
111
  - lib/generators/parole/USAGE
110
112
  - lib/generators/parole/install_generator.rb
111
113
  - lib/generators/parole/templates/migration.rb