qalam_merit 4.0.4

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 (138) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +5 -0
  3. data/CODE_OF_CONDUCT.md +84 -0
  4. data/Gemfile +10 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +358 -0
  7. data/RELEASING.md +16 -0
  8. data/Rakefile +44 -0
  9. data/TESTING.txt +12 -0
  10. data/config/locales/en.yml +5 -0
  11. data/lib/merit.rb +95 -0
  12. data/lib/merit/badge_rules_methods.rb +30 -0
  13. data/lib/merit/base_target_finder.rb +31 -0
  14. data/lib/merit/class_methods.rb +41 -0
  15. data/lib/merit/controller_extensions.rb +71 -0
  16. data/lib/merit/generators/active_record/install_generator.rb +40 -0
  17. data/lib/merit/generators/active_record/merit_generator.rb +25 -0
  18. data/lib/merit/generators/active_record/remove_generator.rb +30 -0
  19. data/lib/merit/generators/active_record/templates/add_merit_fields_to_model.erb +7 -0
  20. data/lib/merit/generators/active_record/templates/create_badges_sashes.erb +14 -0
  21. data/lib/merit/generators/active_record/templates/create_merit_actions.erb +16 -0
  22. data/lib/merit/generators/active_record/templates/create_merit_activity_logs.erb +12 -0
  23. data/lib/merit/generators/active_record/templates/create_merit_badges.erb +17 -0
  24. data/lib/merit/generators/active_record/templates/create_sashes.erb +8 -0
  25. data/lib/merit/generators/active_record/templates/create_scores_and_points.erb +16 -0
  26. data/lib/merit/generators/active_record/templates/remove_merit_fields_from_model.erb +7 -0
  27. data/lib/merit/generators/active_record/templates/remove_merit_tables.erb +12 -0
  28. data/lib/merit/generators/install_generator.rb +30 -0
  29. data/lib/merit/generators/merit_generator.rb +33 -0
  30. data/lib/merit/generators/remove_generator.rb +23 -0
  31. data/lib/merit/generators/templates/badge.erb +69 -0
  32. data/lib/merit/generators/templates/merit.erb +18 -0
  33. data/lib/merit/generators/templates/merit_badge_rules.erb +50 -0
  34. data/lib/merit/generators/templates/merit_point_rules.erb +31 -0
  35. data/lib/merit/generators/templates/merit_rank_rules.erb +32 -0
  36. data/lib/merit/generators/templates/qalam_badge_sash.erb +20 -0
  37. data/lib/merit/generators/templates/qalam_sash.erb +14 -0
  38. data/lib/merit/judge.rb +102 -0
  39. data/lib/merit/models/action_concern.rb +50 -0
  40. data/lib/merit/models/active_record/action.rb +11 -0
  41. data/lib/merit/models/active_record/activity_log.rb +11 -0
  42. data/lib/merit/models/active_record/badges_sash.rb +13 -0
  43. data/lib/merit/models/active_record/sash.rb +32 -0
  44. data/lib/merit/models/active_record/score.rb +25 -0
  45. data/lib/merit/models/badges_sash_concern.rb +13 -0
  46. data/lib/merit/models/base/badges_sash.rb +15 -0
  47. data/lib/merit/models/base/sash.rb +55 -0
  48. data/lib/merit/models/sash_concern.rb +53 -0
  49. data/lib/merit/point_rules_methods.rb +33 -0
  50. data/lib/merit/rank_rules_methods.rb +58 -0
  51. data/lib/merit/reputation_change_observer.rb +19 -0
  52. data/lib/merit/rule.rb +35 -0
  53. data/lib/merit/rules_matcher.rb +24 -0
  54. data/lib/merit/sash_finder.rb +15 -0
  55. data/lib/merit/target_finder.rb +43 -0
  56. data/qalam_merit.gemspec +23 -0
  57. data/test/dummy/Rakefile +7 -0
  58. data/test/dummy/app/controllers/admin/users_controller.rb +9 -0
  59. data/test/dummy/app/controllers/api/comments_controller.rb +5 -0
  60. data/test/dummy/app/controllers/api/users_controller.rb +5 -0
  61. data/test/dummy/app/controllers/application_controller.rb +7 -0
  62. data/test/dummy/app/controllers/comments_controller.rb +56 -0
  63. data/test/dummy/app/controllers/registrations_controller.rb +21 -0
  64. data/test/dummy/app/controllers/users_controller.rb +38 -0
  65. data/test/dummy/app/helpers/application_helper.rb +2 -0
  66. data/test/dummy/app/models/address.rb +3 -0
  67. data/test/dummy/app/models/comment.rb +13 -0
  68. data/test/dummy/app/models/dummy_observer.rb +3 -0
  69. data/test/dummy/app/models/merit/badge_rules.rb +66 -0
  70. data/test/dummy/app/models/merit/point_rules.rb +44 -0
  71. data/test/dummy/app/models/merit/rank_rules.rb +24 -0
  72. data/test/dummy/app/models/user.rb +23 -0
  73. data/test/dummy/app/views/admin/users/index.html.erb +26 -0
  74. data/test/dummy/app/views/comments/_form.html.erb +29 -0
  75. data/test/dummy/app/views/comments/edit.html.erb +6 -0
  76. data/test/dummy/app/views/comments/index.html.erb +35 -0
  77. data/test/dummy/app/views/comments/new.html.erb +5 -0
  78. data/test/dummy/app/views/comments/show.html.erb +23 -0
  79. data/test/dummy/app/views/layouts/application.html.erb +24 -0
  80. data/test/dummy/app/views/users/_form.html.erb +22 -0
  81. data/test/dummy/app/views/users/edit.html.erb +6 -0
  82. data/test/dummy/app/views/users/index.html.erb +27 -0
  83. data/test/dummy/app/views/users/new.html.erb +5 -0
  84. data/test/dummy/app/views/users/show.html.erb +18 -0
  85. data/test/dummy/config.ru +4 -0
  86. data/test/dummy/config/application.rb +26 -0
  87. data/test/dummy/config/application_api_only.rb +28 -0
  88. data/test/dummy/config/boot.rb +10 -0
  89. data/test/dummy/config/database.yml +22 -0
  90. data/test/dummy/config/environment.rb +5 -0
  91. data/test/dummy/config/environment_api_only.rb +7 -0
  92. data/test/dummy/config/environments/development.rb +24 -0
  93. data/test/dummy/config/environments/production.rb +51 -0
  94. data/test/dummy/config/environments/test.rb +36 -0
  95. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  96. data/test/dummy/config/initializers/inflections.rb +10 -0
  97. data/test/dummy/config/initializers/merit.rb +47 -0
  98. data/test/dummy/config/initializers/mime_types.rb +5 -0
  99. data/test/dummy/config/initializers/new_framework_defaults.rb +3 -0
  100. data/test/dummy/config/initializers/secret_token.rb +12 -0
  101. data/test/dummy/config/initializers/session_store.rb +8 -0
  102. data/test/dummy/config/locales/en.yml +5 -0
  103. data/test/dummy/config/mongoid.yml +13 -0
  104. data/test/dummy/config/routes.rb +16 -0
  105. data/test/dummy/db/migrate/20110421191249_create_users.rb +12 -0
  106. data/test/dummy/db/migrate/20110421191250_create_comments.rb +16 -0
  107. data/test/dummy/db/migrate/20120318022220_add_fields_to_users.rb +11 -0
  108. data/test/dummy/db/migrate/20130321082817_add_fields_to_comments.rb +11 -0
  109. data/test/dummy/db/migrate/20130329224406_create_merit_actions.rb +18 -0
  110. data/test/dummy/db/migrate/20130329224407_create_merit_activity_logs.rb +15 -0
  111. data/test/dummy/db/migrate/20130329224408_create_sashes.rb +11 -0
  112. data/test/dummy/db/migrate/20130329224409_create_badges_sashes.rb +16 -0
  113. data/test/dummy/db/migrate/20130329224410_create_scores_and_points.rb +20 -0
  114. data/test/dummy/db/migrate/20140211144001_create_addresses.rb +11 -0
  115. data/test/dummy/db/migrate/20140819133931_add_target_data_to_merit_actions.rb +5 -0
  116. data/test/dummy/db/schema.rb +89 -0
  117. data/test/dummy/db/seeds.rb +19 -0
  118. data/test/dummy/public/404.html +26 -0
  119. data/test/dummy/public/422.html +26 -0
  120. data/test/dummy/public/500.html +26 -0
  121. data/test/dummy/public/favicon.ico +0 -0
  122. data/test/dummy/public/rails.js +404 -0
  123. data/test/dummy/public/stylesheets/.gitkeep +0 -0
  124. data/test/dummy/public/stylesheets/scaffold.css +56 -0
  125. data/test/dummy/script/rails +6 -0
  126. data/test/integration/navigation_test.rb +332 -0
  127. data/test/support/integration_case.rb +5 -0
  128. data/test/test_helper.rb +40 -0
  129. data/test/unit/action_test.rb +12 -0
  130. data/test/unit/base_target_finder_test.rb +64 -0
  131. data/test/unit/merit_unit_test.rb +33 -0
  132. data/test/unit/rule_unit_test.rb +57 -0
  133. data/test/unit/rules_matcher_test.rb +37 -0
  134. data/test/unit/sash_finder_test.rb +27 -0
  135. data/test/unit/sash_test.rb +104 -0
  136. data/test/unit/score_test.rb +13 -0
  137. data/test/unit/target_finder_test.rb +98 -0
  138. metadata +360 -0
@@ -0,0 +1,44 @@
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
+ # Thanks for voting point. Tests that both rules are called when both
11
+ # apply.
12
+ score 1, on: 'comments#vote'
13
+ score 1, on: 'comments#vote'
14
+
15
+ # All user's comments earn points
16
+ score 2, to: :user_comments, on: 'comments#vote'
17
+
18
+ # Points to voted user
19
+ score 5, to: :user, on: 'comments#vote', category: 'vote'
20
+
21
+ # Example rule for using model_name in the case of namespaced controllers
22
+ score 1, to: :user, model_name: 'Comment', on: 'api/comments#show'
23
+
24
+ score 20, on: [
25
+ 'comments#create',
26
+ 'registrations#update'
27
+ ] do |object|
28
+ if object.class == Comment
29
+ object.name.length > 4
30
+ else
31
+ true
32
+ end
33
+ end
34
+
35
+ score lambda { |comment| comment.comment.to_i }, to: :user, on: 'comments#create' do |object|
36
+ object.comment.to_i > 0
37
+ end
38
+
39
+ score (-5), to: :user, on: 'comments#destroy' do |comment|
40
+ comment.present?
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,24 @@
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
@@ -0,0 +1,23 @@
1
+ class User < ActiveRecord::Base
2
+ has_merit
3
+
4
+ has_many :addresses
5
+ has_many :comments
6
+
7
+ def model_with_no_reputation
8
+ addresses.first || addresses.create
9
+ end
10
+
11
+ def show_badges
12
+ badges_uniq = Merit::Badge.find_by_id(badge_ids)
13
+ badges_uniq.collect{|b| "#{b.name.capitalize}#{badge_status(b)}" }.join(', ')
14
+ end
15
+
16
+ def badge_status(badge)
17
+ status = []
18
+ count = badges.select{|b| b.name == badge.name }.count
19
+ status << "level: #{badge.level}" if badge.level
20
+ status << "x#{count}" if count > 1
21
+ status.present? ? " (#{status.join(', ')})" : ''
22
+ end
23
+ end
@@ -0,0 +1,26 @@
1
+ <h1>Listing users from Admin</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, data: { :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 %>
@@ -0,0 +1,29 @@
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 %>
@@ -0,0 +1,6 @@
1
+ <h1>Editing comment</h1>
2
+
3
+ <%= render 'form' %>
4
+
5
+ <%= link_to 'Show', @comment %> |
6
+ <%= link_to 'Back', comments_path %>
@@ -0,0 +1,35 @@
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, data: { :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 %>
@@ -0,0 +1,5 @@
1
+ <h1>New comment</h1>
2
+
3
+ <%= render 'form' %>
4
+
5
+ <%= link_to 'Back', comments_path %>
@@ -0,0 +1,23 @@
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 %>
@@ -0,0 +1,24 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <title>Merit Dummy app</title>
6
+ <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
7
+ <script src="/rails.js"></script>
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>
@@ -0,0 +1,22 @@
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 %>
@@ -0,0 +1,6 @@
1
+ <h1>Editing user</h1>
2
+
3
+ <%= render 'form' %>
4
+
5
+ <%= link_to 'Show', @user %> |
6
+ <%= link_to 'Back', users_path %>
@@ -0,0 +1,27 @@
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><%= user.points(category: 'vote') %></td>
18
+ <td><%= link_to 'Show', user %>
19
+ - <%= link_to 'Edit', edit_user_path(user) %>
20
+ - <%= link_to 'Destroy', user, data: { :confirm => 'Are you sure?' }, :method => :delete %></td>
21
+ </tr>
22
+ <% end %>
23
+ </table>
24
+
25
+ <br />
26
+
27
+ <%= link_to 'New User', new_user_path %>
@@ -0,0 +1,5 @@
1
+ <h1>New user</h1>
2
+
3
+ <%= render 'form' %>
4
+
5
+ <%= link_to 'Back', users_path %>
@@ -0,0 +1,18 @@
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 %>
@@ -0,0 +1,4 @@
1
+ # This file is used by Rack-based servers to start the application.
2
+
3
+ require ::File.expand_path('../config/environment', __FILE__)
4
+ run Dummy::Application
@@ -0,0 +1,26 @@
1
+ require File.expand_path('../boot', __FILE__)
2
+
3
+ require "active_model/railtie"
4
+ require "active_record/railtie"
5
+ require "action_controller/railtie"
6
+ require "action_view/railtie"
7
+ require "action_mailer/railtie"
8
+
9
+ Bundler.require
10
+ require "merit"
11
+
12
+ module Dummy
13
+ class Application < ::Rails::Application
14
+ if Rails.version.match? "5.2.+"
15
+ config.active_record.sqlite3.represent_boolean_as_integer = true
16
+ end
17
+
18
+ if Rails.version.match? "6.0.+"
19
+ config.load_defaults "6.0"
20
+ end
21
+
22
+ config.i18n.enforce_available_locales = true
23
+ config.encoding = "utf-8"
24
+ config.filter_parameters += [:password]
25
+ end
26
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "boot"
4
+
5
+ require "rails"
6
+ # Pick the frameworks you want:
7
+ require "active_model/railtie"
8
+ require "active_record/railtie"
9
+ require "action_controller/railtie"
10
+ require "action_view/railtie"
11
+ require "action_mailer/railtie"
12
+
13
+ # require "sprockets/railtie"
14
+ require "rails/test_unit/railtie"
15
+
16
+ # Require the gems listed in Gemfile, including any gems
17
+ # you've limited to :test, :development, or :production.
18
+ Bundler.require
19
+ require "merit"
20
+
21
+ module Dummy
22
+ class Application < ::Rails::Application
23
+ config.load_defaults 5.2 if ENV["RAILS_VERSION"] =~ /^5.2/
24
+ config.api_only = true
25
+ config.i18n.enforce_available_locales = true
26
+ config.encoding = "utf-8"
27
+ end
28
+ end
@@ -0,0 +1,10 @@
1
+ require 'rubygems'
2
+ gemfile = File.expand_path('../../../../Gemfile', __FILE__)
3
+
4
+ if File.exist?(gemfile)
5
+ ENV['BUNDLE_GEMFILE'] = gemfile
6
+ require 'bundler'
7
+ Bundler.setup
8
+ end
9
+
10
+ $:.unshift File.expand_path('../../../../lib', __FILE__)
@@ -0,0 +1,22 @@
1
+ # SQLite version 3.x
2
+ # gem install sqlite3
3
+ development:
4
+ adapter: sqlite3
5
+ database: db/development.sqlite3
6
+ pool: 5
7
+ timeout: 5000
8
+
9
+ # Warning: The database defined as "test" will be erased and
10
+ # re-generated from your development database when you run "rake".
11
+ # Do not set this db to the same as development or production.
12
+ test:
13
+ adapter: sqlite3
14
+ database: db/test.sqlite3
15
+ pool: 5
16
+ timeout: 5000
17
+
18
+ production:
19
+ adapter: sqlite3
20
+ database: db/development.sqlite3
21
+ pool: 5
22
+ timeout: 5000