minimal_feedback 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -23,7 +23,18 @@ rake db:migrate
23
23
  Let's say we have an Issue ActiveRecord model and we want to be able to give it feedback
24
24
 
25
25
  ```ruby
26
+ class User < ActiveRecord::Base
27
+ has_many :issues
28
+ end
29
+
26
30
  class Issue < ActiveRecord::Base
31
+ include MinimalFeedback
32
+
33
+ attr_accessor :condition
34
+
35
+ allow_feedback :if => proc { condition }
36
+
37
+ belongs_to :user
27
38
  end
28
39
  ```
29
40
 
@@ -31,6 +42,7 @@ What would happen with this configuration:
31
42
 
32
43
  ```ruby
33
44
  issue = Issue.create
45
+ issue.condition = proc { true }
34
46
  issue.give_feedback(:positive)
35
47
  issue.feedbacks.first.type
36
48
  => :positive
@@ -40,6 +52,8 @@ issue.feedbacks.last.type
40
52
  => :negative
41
53
  ```
42
54
 
55
+ Else if the condition proc returns false when the feedback validation is performed an exception is raised
56
+
43
57
  ## Contributing
44
58
 
45
59
  1. Fork it
@@ -3,6 +3,7 @@ class CreateMsmStates < ActiveRecord::Migration
3
3
  create_table :mf_feedbacks do |t|
4
4
  t.string :type
5
5
  t.integer :rating
6
+ t.references :user
6
7
  t.references :rateable, :polymorphic => true
7
8
  t.timestamps
8
9
  end
@@ -5,9 +5,16 @@ module MinimalFeedback
5
5
  self.table_name = 'mf_feedbacks'
6
6
 
7
7
  belongs_to :rateable, :polymorphic => true
8
+ belongs_to :user
8
9
 
9
10
  validates :rating, :inclusion => { :in => [1, -1] }
10
11
 
12
+ validate do
13
+ if rateable.class.feedback_condition && !rateable.instance_eval(&rateable.class.feedback_condition).call
14
+ errors.add(:base, 'feedback is not allowed')
15
+ end
16
+ end
17
+
11
18
  def type
12
19
  case rating
13
20
  when 1
@@ -1,3 +1,3 @@
1
1
  module MinimalFeedback
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -10,16 +10,31 @@ module MinimalFeedback
10
10
 
11
11
  class InvalidFeedbackError < StandardError; end
12
12
 
13
- def give_feedback(type)
14
- feedback_type = type.to_sym
15
- case feedback_type
13
+ cattr_accessor :feedback_condition
14
+
15
+ def self.allow_feedback(options)
16
+ self.feedback_condition = options[:if]
17
+ end
18
+
19
+ def give_feedback(*args)
20
+ options = args.extract_options!
21
+ type = args.first.to_sym
22
+
23
+ feedback = Feedback.new do |f|
24
+ f.rateable = self
25
+ f.user = options[:user]
26
+ end
27
+
28
+ case type
16
29
  when :positive
17
- Feedback.create(:rating => 1) { |f| f.rateable = self }
30
+ feedback.rating = 1
18
31
  when :negative
19
- Feedback.create(:rating => -1) { |f| f.rateable = self }
32
+ feedback.rating = -1
20
33
  else
21
34
  raise InvalidFeedbackError
22
35
  end
36
+
37
+ feedback.save!
23
38
  end
24
39
  end
25
40
  end
@@ -1,32 +1,61 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  ActiveRecord::Base.connection.execute("DROP TABLE IF EXISTS 'mf_feedbacks'")
4
+ ActiveRecord::Base.connection.execute("DROP TABLE IF EXISTS 'users'")
4
5
  ActiveRecord::Base.connection.execute("DROP TABLE IF EXISTS 'issues'")
5
6
  ActiveRecord::Base.connection.create_table(:mf_feedbacks) do |t|
6
7
  t.string :type
7
8
  t.integer :rating
9
+ t.references :user
8
10
  t.references :rateable, :polymorphic => true
9
11
  t.timestamps
10
12
  end
11
13
 
12
- ActiveRecord::Base.connection.create_table(:issues)
14
+ ActiveRecord::Base.connection.create_table(:users)
15
+ ActiveRecord::Base.connection.create_table(:issues) do |t|
16
+ t.references :user
17
+ end
18
+
19
+ class User < ActiveRecord::Base
20
+ has_many :issues
21
+ end
13
22
 
14
23
  class Issue < ActiveRecord::Base
15
24
  include MinimalFeedback
25
+
26
+ attr_accessor :condition
27
+
28
+ allow_feedback :if => proc { condition }
29
+
30
+ belongs_to :user
16
31
  end
17
32
 
18
33
  describe Issue do
19
34
  before(:each) do
20
- @issue = Issue.create
35
+ @user = User.create
36
+ @issue = Issue.create do |i|
37
+ i.user = @user
38
+ end
21
39
  end
22
40
 
23
41
  it 'assigns positive feedback' do
24
- @issue.give_feedback(:positive)
42
+ user = User.create
43
+ @issue.condition = proc { true }
44
+ @issue.give_feedback(:positive, :user => user)
45
+
25
46
  @issue.feedbacks.first.type.should == :positive
26
47
  end
27
48
 
28
49
  it 'assigns negative feedback' do
29
- @issue.give_feedback(:negative)
50
+ user = User.create
51
+ @issue.condition = proc { true }
52
+ @issue.give_feedback(:negative, :user => user)
53
+
30
54
  @issue.feedbacks.first.type.should == :negative
31
55
  end
56
+
57
+ it 'cannot assign feedback if the condition is false' do
58
+ @issue.condition = proc { false }
59
+ expect { @issue.give_feedback(:positive, :user => @user) }.to raise_error
60
+ end
32
61
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minimal_feedback
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -143,7 +143,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
143
143
  version: '0'
144
144
  segments:
145
145
  - 0
146
- hash: 4159579160644425485
146
+ hash: -2381872170530731746
147
147
  required_rubygems_version: !ruby/object:Gem::Requirement
148
148
  none: false
149
149
  requirements:
@@ -152,7 +152,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
152
152
  version: '0'
153
153
  segments:
154
154
  - 0
155
- hash: 4159579160644425485
155
+ hash: -2381872170530731746
156
156
  requirements: []
157
157
  rubyforge_project:
158
158
  rubygems_version: 1.8.24