merit 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- merit (0.4.2)
4
+ merit (0.6.0)
5
5
  ambry
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -96,7 +96,7 @@ Define rules on <tt>app/models/merit_rank_rules.rb</tt>:
96
96
  Check for rules on a rake task executed in background like:
97
97
 
98
98
  task :cron => :environment do
99
- MeritRankRules.new.check_rank_rules
99
+ Merit::RankRules.new.check_rank_rules
100
100
  end
101
101
 
102
102
 
@@ -115,7 +115,6 @@ Check for rules on a rake task executed in background like:
115
115
  # To-do list
116
116
 
117
117
  * Abstract User (rule.rb#51 for instance) into a Merit option.
118
- * What happens if 'class MeritPointRules; include Merit::PointRules' is changed by 'module Merit::PointRules'?
119
118
  * Should namespace app/models into Merit module.
120
119
  * rescue ActiveRecord::... should depend on ORM used (MongoMapper?)
121
120
  * Why 1.8.7 tests are not passing?
data/UPGRADING.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # Upgrading
2
2
 
3
+ ## to 0.6.0
4
+
5
+ <tt>MeritBadgeRules</tt>, <tt>MeritPointRules</tt> and <tt>MeritRankRules</tt>
6
+ are now namespaced into Merit module. Move and change:
7
+
8
+ <pre>
9
+ app/models/merit_{badge|point|rank}_rules.rb -> app/models/merit/{badge|point|rank}_rules.rb
10
+ </pre>
11
+ <pre>
12
+ -class Merit{Badge|Point|Rank}Rules
13
+ - include Merit::{Badge|Point|Rank}Rules
14
+ +module Merit
15
+ + class {Badge|Point|Rank}Rules
16
+ </pre>
17
+
3
18
  ## to 0.5.0
4
19
 
5
20
  Add <tt>log:string</tt> column to <tt>merit_actions</tt> table.
@@ -14,7 +14,7 @@ class MeritAction
14
14
  end
15
15
 
16
16
  # Check Point rules
17
- actions_to_point = MeritPointRules.new.actions_to_point
17
+ actions_to_point = Merit::PointRules.new.actions_to_point
18
18
  if actions_to_point[action_name].present?
19
19
  point_rule = actions_to_point[action_name]
20
20
  point_rule[:to].each do |to|
@@ -5,9 +5,9 @@ module Merit
5
5
  desc "Copy config and rules files"
6
6
  def copy_migrations_and_model
7
7
  template 'merit.rb', 'config/initializers/merit.rb'
8
- template 'merit_badge_rules.rb', 'app/models/merit_badge_rules.rb'
9
- template 'merit_point_rules.rb', 'app/models/merit_point_rules.rb'
10
- template 'merit_rank_rules.rb', 'app/models/merit_rank_rules.rb'
8
+ template 'merit_badge_rules.rb', 'app/models/merit/badge_rules.rb'
9
+ template 'merit_point_rules.rb', 'app/models/merit/point_rules.rb'
10
+ template 'merit_rank_rules.rb', 'app/models/merit/rank_rules.rb'
11
11
  end
12
12
  end
13
13
  end
@@ -14,27 +14,27 @@
14
14
  # badge is granted, then it's removed. It's false by default (badges are kept
15
15
  # forever).
16
16
 
17
- class MeritBadgeRules
18
- include Merit::BadgeRules
17
+ module Merit
18
+ class BadgeRules
19
+ def initialize
20
+ # If it creates user, grant badge
21
+ # Should be "current_user" after registration for badge to be granted.
22
+ # grant_on 'users#create', :badge => 'just-registered', :to => :itself
19
23
 
20
- def initialize
21
- # If it creates user, grant badge
22
- # Should be "current_user" after registration for badge to be granted.
23
- # grant_on 'users#create', :badge => 'just-registered', :to => :itself
24
+ # If it has 10 comments, grant commenter-10 badge
25
+ # grant_on 'comments#create', :badge => 'commenter', :level => 10 do |comment|
26
+ # comment.user.comments.count == 10
27
+ # end
24
28
 
25
- # If it has 10 comments, grant commenter-10 badge
26
- # grant_on 'comments#create', :badge => 'commenter', :level => 10 do |comment|
27
- # comment.user.comments.count == 10
28
- # end
29
+ # If it has 5 votes, grant relevant-commenter badge
30
+ # grant_on 'comments#vote', :badge => 'relevant-commenter', :to => :user do |comment|
31
+ # comment.votes.count == 5
32
+ # end
29
33
 
30
- # If it has 5 votes, grant relevant-commenter badge
31
- # grant_on 'comments#vote', :badge => 'relevant-commenter', :to => :user do |comment|
32
- # comment.votes.count == 5
33
- # end
34
-
35
- # Changes his name by one wider than 4 chars (arbitrary ruby code case)
36
- # grant_on 'registrations#update', :badge => 'autobiographer', :temporary => true, :model_name => 'User' do |user|
37
- # user.name.length > 4
38
- # end
34
+ # Changes his name by one wider than 4 chars (arbitrary ruby code case)
35
+ # grant_on 'registrations#update', :badge => 'autobiographer', :temporary => true, :model_name => 'User' do |user|
36
+ # user.name.length > 4
37
+ # end
38
+ end
39
39
  end
40
- end
40
+ end
@@ -3,19 +3,19 @@
3
3
  # actions-triggered, either to the action user or to the method (or array of
4
4
  # methods) defined in the +:to+ option.
5
5
 
6
- class MeritPointRules
7
- include Merit::PointRules
8
-
9
- def initialize
10
- # score 10, :on => [
11
- # 'users#update'
12
- # ]
13
- #
14
- # score 15, :on => 'reviews#create', :to => [:reviewer, :reviewed]
15
- #
16
- # score 20, :on => [
17
- # 'comments#create',
18
- # 'photos#create'
19
- # ]
6
+ module Merit
7
+ class PointRules
8
+ def initialize
9
+ # score 10, :on => [
10
+ # 'users#update'
11
+ # ]
12
+ #
13
+ # score 15, :on => 'reviews#create', :to => [:reviewer, :reviewed]
14
+ #
15
+ # score 20, :on => [
16
+ # 'comments#create',
17
+ # 'photos#create'
18
+ # ]
19
+ end
20
20
  end
21
- end
21
+ end
@@ -8,20 +8,20 @@
8
8
  # * :+level_name+ attribute name (default is empty and results in 'level'
9
9
  # attribute, if set it's appended like 'level_#{level_name}')
10
10
 
11
- class MeritRankRules
12
- include Merit::RankRules
13
-
14
- def initialize
15
- # set_rank :level => 1, :to => Commiter.active do |commiter|
16
- # commiter.repositories.count > 1 && commiter.followers >= 10
17
- # end
18
- #
19
- # set_rank :level => 2, :to => Commiter.active do |commiter|
20
- # commiter.branches.count > 1 && commiter.followers >= 10
21
- # end
22
- #
23
- # set_rank :level => 3, :to => Commiter.active do |commiter|
24
- # commiter.branches.count > 2 && commiter.followers >= 20
25
- # end
11
+ module Merit
12
+ class RankRules
13
+ def initialize
14
+ # set_rank :level => 1, :to => Commiter.active do |commiter|
15
+ # commiter.repositories.count > 1 && commiter.followers >= 10
16
+ # end
17
+ #
18
+ # set_rank :level => 2, :to => Commiter.active do |commiter|
19
+ # commiter.branches.count > 1 && commiter.followers >= 10
20
+ # end
21
+ #
22
+ # set_rank :level => 3, :to => Commiter.active do |commiter|
23
+ # commiter.branches.count > 2 && commiter.followers >= 20
24
+ # end
25
+ end
26
26
  end
27
- end
27
+ end
@@ -6,8 +6,8 @@ module Merit
6
6
  def self.included(base)
7
7
  base.after_filter do |controller|
8
8
  action = "#{controller_name}\##{action_name}"
9
- badge_rules = ::MeritBadgeRules.new
10
- point_rules = ::MeritPointRules.new
9
+ badge_rules = BadgeRules.new
10
+ point_rules = PointRules.new
11
11
  if badge_rules.defined_rules[action].present? || point_rules.actions_to_point[action].present?
12
12
  target_id = params[:id]
13
13
  # TODO: target_object should be configurable (now it's singularized controller name)
@@ -29,7 +29,7 @@ module Merit
29
29
  #
30
30
  # Luego chequea las condiciones sincronizadamente, o mediante un proceso en
31
31
  # background, por ejemplo cada 5 minutos (Merit::BadgeRules#check_new_actions).
32
- module BadgeRules
32
+ class BadgeRules
33
33
  # Define rule for granting badges
34
34
  def grant_on(action, *args, &block)
35
35
  options = args.extract_options!
@@ -2,7 +2,7 @@ module Merit
2
2
  # Points are a simple integer value which are given to "meritable" resources
3
3
  # according to rules in +app/models/merit_point_rules.rb+. They are given on
4
4
  # actions-triggered.
5
- module PointRules
5
+ class PointRules
6
6
  # Define rules on certaing actions for giving points
7
7
  def score(points, *args, &block)
8
8
  options = args.extract_options!
@@ -8,7 +8,7 @@ module Merit
8
8
  # * :+to+ model or scope to check if new rankings apply
9
9
  # * :+level_name+ attribute name (default is empty and results in 'level'
10
10
  # attribute, if set it's appended like 'level_#{level_name}')
11
- module RankRules
11
+ class RankRules
12
12
  # Populates +defined_rules+ hash with following hierarchy:
13
13
  # defined_rules[ModelToRank] = { levels => blocks }
14
14
  def set_rank(*args, &block)
data/merit.gemspec CHANGED
@@ -4,7 +4,7 @@ Gem::Specification.new do |s|
4
4
  s.description = "Manage badges, points and rankings (reputation) of resources in a Rails application."
5
5
  s.homepage = "http://github.com/tute/merit"
6
6
  s.files = `git ls-files`.split("\n").reject{|f| f =~ /^\./ }
7
- s.version = "0.5.0"
7
+ s.version = "0.6.0"
8
8
  s.authors = ["Tute Costa"]
9
9
  s.email = 'tutecosta@gmail.com'
10
10
  s.add_dependency 'ambry'
@@ -0,0 +1,41 @@
1
+ # +grant_on+ accepts:
2
+ # * Nothing (always grants)
3
+ # * A block which evaluates to boolean (recieves the object as parameter)
4
+ # * A block with a hash composed of methods to run on the target object with
5
+ # expected values (+:votes => 5+ for instance).
6
+ #
7
+ # +grant_on+ can have a +:to+ method name, which called over the target object
8
+ # should retrieve the object to badge (could be +:user+, +:self+, +:follower+,
9
+ # etc). If it's not defined merit will apply the badge to the user who
10
+ # triggered the action (:action_user by default). If it's :itself, it badges
11
+ # the created object (new user for instance).
12
+ #
13
+ # The :temporary option indicates that if the condition doesn't hold but the
14
+ # badge is granted, then it's removed. It's false by default (badges are kept
15
+ # forever).
16
+
17
+ module Merit
18
+ class BadgeRules
19
+ def initialize
20
+ # If it creates user, grant badge
21
+ # Should be "current_user" after registration for badge to be granted.
22
+ grant_on 'users#create', :badge => 'just-registered', :to => :itself
23
+
24
+ # If it has 10 comments, grant commenter-10 badge
25
+ grant_on 'comments#create', :badge => 'commenter', :level => 10 do |comment|
26
+ comment.user.comments.count == 10
27
+ end
28
+
29
+ # If it has at least 10 votes, grant relevant-commenter badge
30
+ grant_on 'comments#vote', :badge => 'relevant-commenter', :to => :user do |comment|
31
+ comment.votes >= 10
32
+ end
33
+
34
+ # Changes his name by one wider than 4 chars (arbitrary ruby code and custom model_name)
35
+ # This badge is temporary (user may lose it)
36
+ grant_on 'registrations#update', :badge => 'autobiographer', :temporary => true, :model_name => 'User' do |user|
37
+ user.name.length > 4
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,18 @@
1
+ # Points are a simple integer value which are given to "meritable" resources
2
+ # according to rules in +app/models/merit_point_rules.rb+. They are given on
3
+ # actions-triggered.
4
+
5
+ module Merit
6
+ class PointRules
7
+ def initialize
8
+ score 5, :to => :user, :on => [
9
+ 'comments#vote'
10
+ ]
11
+
12
+ score 20, :on => [
13
+ 'comments#create',
14
+ 'registrations#update'
15
+ ]
16
+ end
17
+ end
18
+ end
@@ -8,14 +8,14 @@
8
8
  # * :+level_name+ attribute name (default is empty and results in 'level'
9
9
  # attribute, if set it's appended like 'level_#{level_name}')
10
10
 
11
- class MeritRankRules
12
- include Merit::RankRules
13
-
14
- def initialize
15
- # i stars for i chars name
16
- (1..5).each do |i|
17
- set_rank :level => i, :to => User do |user|
18
- user.name.length == i
11
+ module Merit
12
+ class RankRules
13
+ def initialize
14
+ # i stars for i chars name
15
+ (1..5).each do |i|
16
+ set_rank :level => i, :to => User do |user|
17
+ user.name.length == i
18
+ end
19
19
  end
20
20
  end
21
21
  end
@@ -106,7 +106,7 @@ class NavigationTest < ActiveSupport::IntegrationCase
106
106
 
107
107
  user = User.where(:name => 'ab').first
108
108
  assert_equal 0, user.level, "User level should be 0."
109
- MeritRankRules.new.check_rank_rules
109
+ Merit::RankRules.new.check_rank_rules
110
110
  user.reload
111
111
  assert_equal 2, user.level, "User level should be 2."
112
112
 
@@ -116,7 +116,7 @@ class NavigationTest < ActiveSupport::IntegrationCase
116
116
  click_button('Update User')
117
117
 
118
118
  user = User.where(:name => 'a').first
119
- MeritRankRules.new.check_rank_rules
119
+ Merit::RankRules.new.check_rank_rules
120
120
  user.reload
121
121
  assert_equal 2, user.level, "User level should be 2."
122
122
 
@@ -126,7 +126,7 @@ class NavigationTest < ActiveSupport::IntegrationCase
126
126
  click_button('Update User')
127
127
 
128
128
  user = User.where(:name => 'abcde').first
129
- MeritRankRules.new.check_rank_rules
129
+ Merit::RankRules.new.check_rank_rules
130
130
  user.reload
131
131
  assert_equal 5, user.level, "User level should be 5."
132
132
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: merit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-04-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ambry
16
- requirement: &70296877186780 !ruby/object:Gem::Requirement
16
+ requirement: &70166979392500 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70296877186780
24
+ version_requirements: *70166979392500
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rails
27
- requirement: &70296877186260 !ruby/object:Gem::Requirement
27
+ requirement: &70166979391980 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 3.0.10
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70296877186260
35
+ version_requirements: *70166979391980
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: sqlite3
38
- requirement: &70296877185840 !ruby/object:Gem::Requirement
38
+ requirement: &70166979391560 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70296877185840
46
+ version_requirements: *70166979391560
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: haml
49
- requirement: &70296879096200 !ruby/object:Gem::Requirement
49
+ requirement: &70166981534740 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70296879096200
57
+ version_requirements: *70166981534740
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: capybara
60
- requirement: &70296879094600 !ruby/object:Gem::Requirement
60
+ requirement: &70166981531180 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,7 +65,7 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70296879094600
68
+ version_requirements: *70166981531180
69
69
  description: Manage badges, points and rankings (reputation) of resources in a Rails
70
70
  application.
71
71
  email: tutecosta@gmail.com
@@ -112,9 +112,9 @@ files:
112
112
  - test/dummy/app/controllers/users_controller.rb
113
113
  - test/dummy/app/helpers/application_helper.rb
114
114
  - test/dummy/app/models/comment.rb
115
- - test/dummy/app/models/merit_badge_rules.rb
116
- - test/dummy/app/models/merit_point_rules.rb
117
- - test/dummy/app/models/merit_rank_rules.rb
115
+ - test/dummy/app/models/merit/badge_rules.rb
116
+ - test/dummy/app/models/merit/point_rules.rb
117
+ - test/dummy/app/models/merit/rank_rules.rb
118
118
  - test/dummy/app/models/user.rb
119
119
  - test/dummy/app/views/comments/_form.html.erb
120
120
  - test/dummy/app/views/comments/edit.html.erb
@@ -1,41 +0,0 @@
1
- # +grant_on+ accepts:
2
- # * Nothing (always grants)
3
- # * A block which evaluates to boolean (recieves the object as parameter)
4
- # * A block with a hash composed of methods to run on the target object with
5
- # expected values (+:votes => 5+ for instance).
6
- #
7
- # +grant_on+ can have a +:to+ method name, which called over the target object
8
- # should retrieve the object to badge (could be +:user+, +:self+, +:follower+,
9
- # etc). If it's not defined merit will apply the badge to the user who
10
- # triggered the action (:action_user by default). If it's :itself, it badges
11
- # the created object (new user for instance).
12
- #
13
- # The :temporary option indicates that if the condition doesn't hold but the
14
- # badge is granted, then it's removed. It's false by default (badges are kept
15
- # forever).
16
-
17
- class MeritBadgeRules
18
- include Merit::BadgeRules
19
-
20
- def initialize
21
- # If it creates user, grant badge
22
- # Should be "current_user" after registration for badge to be granted.
23
- grant_on 'users#create', :badge => 'just-registered', :to => :itself
24
-
25
- # If it has 10 comments, grant commenter-10 badge
26
- grant_on 'comments#create', :badge => 'commenter', :level => 10 do |comment|
27
- comment.user.comments.count == 10
28
- end
29
-
30
- # If it has at least 10 votes, grant relevant-commenter badge
31
- grant_on 'comments#vote', :badge => 'relevant-commenter', :to => :user do |comment|
32
- comment.votes >= 10
33
- end
34
-
35
- # Changes his name by one wider than 4 chars (arbitrary ruby code and custom model_name)
36
- # This badge is temporary (user may lose it)
37
- grant_on 'registrations#update', :badge => 'autobiographer', :temporary => true, :model_name => 'User' do |user|
38
- user.name.length > 4
39
- end
40
- end
41
- end
@@ -1,18 +0,0 @@
1
- # Points are a simple integer value which are given to "meritable" resources
2
- # according to rules in +app/models/merit_point_rules.rb+. They are given on
3
- # actions-triggered.
4
-
5
- class MeritPointRules
6
- include Merit::PointRules
7
-
8
- def initialize
9
- score 5, :to => :user, :on => [
10
- 'comments#vote'
11
- ]
12
-
13
- score 20, :on => [
14
- 'comments#create',
15
- 'registrations#update'
16
- ]
17
- end
18
- end