merit 1.7.1 → 1.8.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.
Files changed (101) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -1
  3. data/Gemfile +7 -0
  4. data/README.md +31 -4
  5. data/app/models/merit/action.rb +2 -3
  6. data/app/models/merit/badge.rb +2 -2
  7. data/lib/generators/active_record/install_generator.rb +1 -1
  8. data/lib/generators/active_record/merit_generator.rb +2 -2
  9. data/lib/generators/active_record/remove_generator.rb +2 -2
  10. data/lib/generators/active_record/templates/create_badges_sashes.rb +1 -1
  11. data/lib/generators/active_record/templates/create_merit_actions.rb +3 -3
  12. data/lib/generators/active_record/templates/create_scores_and_points.rb +2 -2
  13. data/lib/generators/active_record/templates/remove_merit_tables.rb +1 -1
  14. data/lib/generators/merit/install_generator.rb +1 -1
  15. data/lib/generators/merit/merit_generator.rb +2 -3
  16. data/lib/generators/merit/remove_generator.rb +3 -3
  17. data/lib/generators/merit/templates/merit.rb +10 -4
  18. data/lib/merit.rb +43 -15
  19. data/lib/merit/base_target_finder.rb +1 -3
  20. data/lib/merit/judge.rb +26 -6
  21. data/lib/merit/model_additions.rb +10 -17
  22. data/lib/merit/models/active_record/merit/action.rb +1 -1
  23. data/lib/merit/models/active_record/merit/activity_log.rb +1 -0
  24. data/lib/merit/models/active_record/merit/badges_sash.rb +6 -10
  25. data/lib/merit/models/active_record/merit/sash.rb +2 -38
  26. data/lib/merit/models/active_record/merit/score.rb +6 -5
  27. data/lib/merit/models/base/merit/badges_sash.rb +15 -0
  28. data/lib/merit/models/base/merit/sash.rb +42 -0
  29. data/lib/merit/models/mongoid/merit/action.rb +8 -6
  30. data/lib/merit/models/mongoid/merit/activity_log.rb +11 -0
  31. data/lib/merit/models/mongoid/merit/badges_sash.rb +19 -0
  32. data/lib/merit/models/mongoid/merit/sash.rb +28 -0
  33. data/lib/merit/models/mongoid/merit/score.rb +41 -0
  34. data/lib/merit/reputation_change_observer.rb +11 -0
  35. data/lib/merit/rule.rb +1 -1
  36. data/lib/merit/rules_matcher.rb +0 -2
  37. data/lib/merit/rules_rank_methods.rb +1 -1
  38. data/lib/merit/target_finder.rb +1 -2
  39. data/merit.gemspec +2 -1
  40. data/test/dummy/app/models/comment.rb +16 -1
  41. data/test/dummy/app/models/dummy_observer.rb +3 -0
  42. data/test/dummy/app/models/user.rb +14 -1
  43. data/test/dummy/config/initializers/merit.rb +3 -4
  44. data/test/dummy/config/mongoid.yml +13 -0
  45. data/test/integration/navigation_test.rb +19 -2
  46. data/test/unit/merit_unit_test.rb +1 -1
  47. metadata +25 -56
  48. data/lib/merit/models/mongoid/sash.rb +0 -14
  49. data/lib/merit/observer.rb +0 -13
  50. data/test/dummy-mongoid/Rakefile +0 -7
  51. data/test/dummy-mongoid/app/controllers/application_controller.rb +0 -7
  52. data/test/dummy-mongoid/app/controllers/comments_controller.rb +0 -90
  53. data/test/dummy-mongoid/app/controllers/registrations_controller.rb +0 -15
  54. data/test/dummy-mongoid/app/controllers/users_controller.rb +0 -67
  55. data/test/dummy-mongoid/app/helpers/application_helper.rb +0 -2
  56. data/test/dummy-mongoid/app/models/comment.rb +0 -13
  57. data/test/dummy-mongoid/app/models/merit/badge_rules.rb +0 -49
  58. data/test/dummy-mongoid/app/models/merit/point_rules.rb +0 -20
  59. data/test/dummy-mongoid/app/models/merit/rank_rules.rb +0 -24
  60. data/test/dummy-mongoid/app/models/user.rb +0 -25
  61. data/test/dummy-mongoid/app/views/comments/_form.html.erb +0 -29
  62. data/test/dummy-mongoid/app/views/comments/edit.html.erb +0 -6
  63. data/test/dummy-mongoid/app/views/comments/index.html.erb +0 -35
  64. data/test/dummy-mongoid/app/views/comments/new.html.erb +0 -5
  65. data/test/dummy-mongoid/app/views/comments/show.html.erb +0 -23
  66. data/test/dummy-mongoid/app/views/layouts/application.html.erb +0 -24
  67. data/test/dummy-mongoid/app/views/users/_form.html.erb +0 -22
  68. data/test/dummy-mongoid/app/views/users/edit.html.erb +0 -6
  69. data/test/dummy-mongoid/app/views/users/index.html.erb +0 -26
  70. data/test/dummy-mongoid/app/views/users/new.html.erb +0 -5
  71. data/test/dummy-mongoid/app/views/users/show.html.erb +0 -18
  72. data/test/dummy-mongoid/config.ru +0 -4
  73. data/test/dummy-mongoid/config/application.rb +0 -22
  74. data/test/dummy-mongoid/config/boot.rb +0 -10
  75. data/test/dummy-mongoid/config/environment.rb +0 -5
  76. data/test/dummy-mongoid/config/environments/development.rb +0 -25
  77. data/test/dummy-mongoid/config/environments/production.rb +0 -49
  78. data/test/dummy-mongoid/config/environments/test.rb +0 -35
  79. data/test/dummy-mongoid/config/initializers/backtrace_silencers.rb +0 -7
  80. data/test/dummy-mongoid/config/initializers/inflections.rb +0 -10
  81. data/test/dummy-mongoid/config/initializers/merit.rb +0 -37
  82. data/test/dummy-mongoid/config/initializers/mime_types.rb +0 -5
  83. data/test/dummy-mongoid/config/initializers/secret_token.rb +0 -7
  84. data/test/dummy-mongoid/config/initializers/session_store.rb +0 -8
  85. data/test/dummy-mongoid/config/locales/en.yml +0 -5
  86. data/test/dummy-mongoid/config/mongoid.yml +0 -14
  87. data/test/dummy-mongoid/config/routes.rb +0 -9
  88. data/test/dummy-mongoid/db/seeds.rb +0 -17
  89. data/test/dummy-mongoid/public/404.html +0 -26
  90. data/test/dummy-mongoid/public/422.html +0 -26
  91. data/test/dummy-mongoid/public/500.html +0 -26
  92. data/test/dummy-mongoid/public/favicon.ico +0 -0
  93. data/test/dummy-mongoid/public/javascripts/application.js +0 -2
  94. data/test/dummy-mongoid/public/javascripts/controls.js +0 -965
  95. data/test/dummy-mongoid/public/javascripts/dragdrop.js +0 -974
  96. data/test/dummy-mongoid/public/javascripts/effects.js +0 -1123
  97. data/test/dummy-mongoid/public/javascripts/prototype.js +0 -6001
  98. data/test/dummy-mongoid/public/javascripts/rails.js +0 -191
  99. data/test/dummy-mongoid/public/stylesheets/.gitkeep +0 -0
  100. data/test/dummy-mongoid/public/stylesheets/scaffold.css +0 -56
  101. data/test/dummy-mongoid/script/rails +0 -6
@@ -1,67 +0,0 @@
1
- class UsersController < ApplicationController
2
- # GET /users
3
- # GET /users.xml
4
- def index
5
- @users = User.all
6
-
7
- respond_to do |format|
8
- format.html # index.html.erb
9
- format.xml { render :xml => @users }
10
- end
11
- end
12
-
13
- # GET /users/1
14
- # GET /users/1.xml
15
- def show
16
- @user = User.find(params[:id])
17
-
18
- respond_to do |format|
19
- format.html # show.html.erb
20
- format.xml { render :xml => @user }
21
- end
22
- end
23
-
24
- # GET /users/new
25
- # GET /users/new.xml
26
- def new
27
- @user = User.new
28
-
29
- respond_to do |format|
30
- format.html # new.html.erb
31
- format.xml { render :xml => @user }
32
- end
33
- end
34
-
35
- # GET /users/1/edit
36
- def edit
37
- @user = User.find(params[:id])
38
- end
39
-
40
- # POST /users
41
- # POST /users.xml
42
- def create
43
- @user = User.new(params[:user])
44
-
45
- respond_to do |format|
46
- if @user.save
47
- format.html { redirect_to(@user, :notice => 'User was successfully created.') }
48
- format.xml { render :xml => @user, :status => :created, :location => @user }
49
- else
50
- format.html { render "new" }
51
- format.xml { render :xml => @user.errors, :status => :unprocessable_entity }
52
- end
53
- end
54
- end
55
-
56
- # DELETE /users/1
57
- # DELETE /users/1.xml
58
- def destroy
59
- @user = User.find(params[:id])
60
- @user.destroy
61
-
62
- respond_to do |format|
63
- format.html { redirect_to(users_url) }
64
- format.xml { head :ok }
65
- end
66
- end
67
- end
@@ -1,2 +0,0 @@
1
- module ApplicationHelper
2
- end
@@ -1,13 +0,0 @@
1
- class Comment
2
- include Mongoid::Document
3
- include Mongoid::Timestamps
4
- belongs_to :user
5
-
6
- field :name
7
- field :comment
8
- field :votes, :type => Integer, :default => 0
9
-
10
- attr_accessible :name, :comment, :user_id, :votes
11
-
12
- validates :name, :comment, :user_id, :presence => true
13
- end
@@ -1,49 +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
- module Merit
18
- class BadgeRules
19
- include Merit::BadgeRulesMethods
20
-
21
- def initialize
22
- # If it creates user, grant badge
23
- # Should be "current_user" after registration for badge to be granted.
24
- # Example rule with block with no parameters
25
- grant_on 'users#create', :badge => 'just-registered', :to => :itself do
26
- Date.today > 1.year.ago.to_date
27
- end
28
-
29
- # Example rule for multiple badge granting
30
- grant_on 'users#index', :badge => 'gossip', :multiple => true
31
-
32
- # If it has 10 comments, grant commenter-10 badge
33
- grant_on 'comments#create', :badge => 'commenter', :level => 10 do |comment|
34
- comment.user.comments.count >= 10
35
- end
36
-
37
- # If it has at least 10 votes, grant relevant-commenter badge
38
- grant_on 'comments#vote', :badge => 'relevant-commenter', :to => :user do |comment|
39
- comment.votes >= 10
40
- end
41
-
42
- # Changes his name by one wider than 4 chars (arbitrary ruby code and custom model_name)
43
- # This badge is temporary (user may lose it)
44
- grant_on 'registrations#update', :badge => 'autobiographer', :temporary => true, :model_name => 'User' do |user|
45
- user.name.length > 4
46
- end
47
- end
48
- end
49
- end
@@ -1,20 +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
- module Merit
6
- class PointRules
7
- include Merit::PointRulesMethods
8
-
9
- def initialize
10
- score 5, :to => :user, :on => [
11
- 'comments#vote'
12
- ]
13
-
14
- score 20, :on => [
15
- 'comments#create',
16
- 'registrations#update'
17
- ]
18
- end
19
- end
20
- end
@@ -1,24 +0,0 @@
1
- # 5 stars is a common ranking use case. They are not given at specified
2
- # actions like badges, you should define a cron job to test if ranks are to be
3
- # granted.
4
- #
5
- # +set_rank+ accepts:
6
- # * :+level+ ranking level (greater is better)
7
- # * :+to+ model or scope to check if new rankings apply
8
- # * :+level_name+ attribute name (default is empty and results in 'level'
9
- # attribute, if set it's appended like 'level_#{level_name}')
10
-
11
- module Merit
12
- class RankRules
13
- include Merit::RankRulesMethods
14
-
15
- def initialize
16
- # i stars for i chars name
17
- (1..5).each do |i|
18
- set_rank :level => i, :to => User do |user|
19
- user.name.length == i
20
- end
21
- end
22
- end
23
- end
24
- end
@@ -1,25 +0,0 @@
1
- class User
2
- include Mongoid::Document
3
- include Mongoid::Timestamps
4
-
5
- has_merit
6
-
7
- field :name
8
-
9
- has_many :comments
10
-
11
- attr_accessible :name
12
-
13
- def show_badges
14
- badges_uniq = Badge.find_by_id(badge_ids)
15
- badges_uniq.collect{|b| "#{b.name.capitalize}#{badge_status(b)}" }.join(', ')
16
- end
17
-
18
- def badge_status(badge)
19
- status = []
20
- count = badges.select{|b| b.name == badge.name }.count
21
- status << "level: #{badge.level}" if badge.level
22
- status << "x#{count}" if count > 1
23
- status.present? ? " (#{status.join(', ')})" : ''
24
- end
25
- end
@@ -1,29 +0,0 @@
1
- <%= form_for(@comment) do |f| %>
2
- <% if @comment.errors.any? %>
3
- <div id="error_explanation">
4
- <h2><%= pluralize(@comment.errors.count, "error") %> prohibited this comment from being saved:</h2>
5
-
6
- <ul>
7
- <% @comment.errors.full_messages.each do |msg| %>
8
- <li><%= msg %></li>
9
- <% end %>
10
- </ul>
11
- </div>
12
- <% end %>
13
-
14
- <div class="field">
15
- <%= f.label :name %><br />
16
- <%= f.text_field :name %>
17
- </div>
18
- <div class="field">
19
- <%= f.label :comment %><br />
20
- <%= f.text_area :comment %>
21
- </div>
22
- <div class="field">
23
- <%= f.label :user_id %><br />
24
- <%= f.text_field :user_id %>
25
- </div>
26
- <div class="actions">
27
- <%= f.submit %>
28
- </div>
29
- <% end %>
@@ -1,6 +0,0 @@
1
- <h1>Editing comment</h1>
2
-
3
- <%= render 'form' %>
4
-
5
- <%= link_to 'Show', @comment %> |
6
- <%= link_to 'Back', comments_path %>
@@ -1,35 +0,0 @@
1
- <h1>Listing comments</h1>
2
-
3
- <table>
4
- <tr>
5
- <th>Name</th>
6
- <th>Comment</th>
7
- <th>User</th>
8
- <th>Votes</th>
9
- <th>Vote up!</th>
10
- <th></th>
11
- <th></th>
12
- <th></th>
13
- </tr>
14
-
15
- <% @comments.each do |comment| %>
16
- <tr id="c_<%= comment.id %>">
17
- <td><%= comment.name %></td>
18
- <td><%= comment.comment %></td>
19
- <td><%= comment.user_id %></td>
20
- <td><%= comment.votes %></td>
21
- <td>
22
- <% (1..5).each do |i| %>
23
- <%= link_to "#{i}", "/comments/#{comment.id}/vote/#{i}" %>
24
- <% end %>
25
- </td>
26
- <td><%= link_to 'Show', comment %></td>
27
- <td><%= link_to 'Edit', edit_comment_path(comment) %></td>
28
- <td><%= link_to 'Destroy', comment, :confirm => 'Are you sure?', :method => :delete %></td>
29
- </tr>
30
- <% end %>
31
- </table>
32
-
33
- <br />
34
-
35
- <%= link_to 'New Comment', new_comment_path %>
@@ -1,5 +0,0 @@
1
- <h1>New comment</h1>
2
-
3
- <%= render 'form' %>
4
-
5
- <%= link_to 'Back', comments_path %>
@@ -1,23 +0,0 @@
1
- <p>
2
- <b>Name:</b>
3
- <%= @comment.name %>
4
- </p>
5
-
6
- <p>
7
- <b>Comment:</b>
8
- <%= @comment.comment %>
9
- </p>
10
-
11
- <p>
12
- <b>User:</b>
13
- <%= @comment.user_id %>
14
- </p>
15
-
16
- <p>
17
- <b>Vote:</b>
18
- <%= @comment.votes %>
19
- </p>
20
-
21
-
22
- <%= link_to 'Edit', edit_comment_path(@comment) %> |
23
- <%= link_to 'Back', comments_path %>
@@ -1,24 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="utf-8" />
5
- <title>Merit Dummy app</title>
6
- <%= stylesheet_link_tag :all %>
7
- <%= javascript_include_tag :all %>
8
- <%= csrf_meta_tag %>
9
- </head>
10
- <body>
11
- <h1><%= link_to 'Dummy app', '/' %></h1>
12
-
13
- <% flash.each do |name, msg| %>
14
- <%= content_tag :p, msg, :class => (name == 'error' ? 'error' : 'notice') %>
15
- <% end %>
16
-
17
- <%= yield %>
18
-
19
- <ul>
20
- <li><%= link_to 'Users', users_url %></li>
21
- <li><%= link_to 'Comments', comments_url %></li>
22
- </ul>
23
- </body>
24
- </html>
@@ -1,22 +0,0 @@
1
- <% obj = params[:action] == 'new' ? @user : [:registrations, @user] %>
2
- <%= form_for obj do |f| %>
3
- <% if @user.errors.any? %>
4
- <div id="error_explanation">
5
- <h2><%= pluralize(@user.errors.count, "error") %> prohibited this user from being saved:</h2>
6
-
7
- <ul>
8
- <% @user.errors.full_messages.each do |msg| %>
9
- <li><%= msg %></li>
10
- <% end %>
11
- </ul>
12
- </div>
13
- <% end %>
14
-
15
- <div class="field">
16
- <%= f.label :name %><br />
17
- <%= f.text_field :name %>
18
- </div>
19
- <div class="actions">
20
- <%= f.submit %>
21
- </div>
22
- <% end %>
@@ -1,6 +0,0 @@
1
- <h1>Editing user</h1>
2
-
3
- <%= render 'form' %>
4
-
5
- <%= link_to 'Show', @user %> |
6
- <%= link_to 'Back', users_path %>
@@ -1,26 +0,0 @@
1
- <h1>Listing users</h1>
2
-
3
- <table>
4
- <tr>
5
- <th>Name</th>
6
- <th>#Comments</th>
7
- <th>Badges</th>
8
- <th>Points</th>
9
- </tr>
10
-
11
- <% @users.each do |user| %>
12
- <tr>
13
- <td><%= user.name %></td>
14
- <td><%= user.comments.count %></td>
15
- <td><%= user.show_badges %></td>
16
- <td><%= user.points %></td>
17
- <td><%= link_to 'Show', user %>
18
- - <%= link_to 'Edit', edit_user_path(user) %>
19
- - <%= link_to 'Destroy', user, :confirm => 'Are you sure?', :method => :delete %></td>
20
- </tr>
21
- <% end %>
22
- </table>
23
-
24
- <br />
25
-
26
- <%= link_to 'New User', new_user_path %>
@@ -1,5 +0,0 @@
1
- <h1>New user</h1>
2
-
3
- <%= render 'form' %>
4
-
5
- <%= link_to 'Back', users_path %>
@@ -1,18 +0,0 @@
1
- <p>
2
- <b>Name:</b>
3
- <%= @user.name %>
4
- </p>
5
-
6
- <p>
7
- <b>Comments:</b>
8
- <%= @user.comments.count %>
9
- </p>
10
-
11
- <p>
12
- <b>Badges:</b>
13
- <%= @user.show_badges %>
14
- </p>
15
-
16
-
17
- <%= link_to 'Edit', edit_user_path(@user) %> |
18
- <%= link_to 'Back', users_path %>
@@ -1,4 +0,0 @@
1
- # This file is used by Rack-based servers to start the application.
2
-
3
- require ::File.expand_path('../config/environment', __FILE__)
4
- run DummyMongoid::Application
@@ -1,22 +0,0 @@
1
- require File.expand_path('../boot', __FILE__)
2
-
3
- require "action_controller/railtie"
4
- require "action_view/railtie"
5
- require "action_mailer/railtie"
6
-
7
- Bundler.require
8
- require "merit"
9
-
10
- module DummyMongoid
11
- class Application < Rails::Application
12
- # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
13
- # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
14
- # config.i18n.default_locale = :de
15
-
16
- # Configure the default encoding used in templates for Ruby 1.9.
17
- config.encoding = "utf-8"
18
-
19
- # Configure sensitive parameters which will be filtered from the log file.
20
- config.filter_parameters += [:password]
21
- end
22
- end