merit 3.0.3 → 4.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -9
  3. data/NEWS.md +25 -0
  4. data/README.md +29 -10
  5. data/app/models/merit/badge.rb +1 -9
  6. data/lib/merit/{rules_badge_methods.rb → badge_rules_methods.rb} +0 -0
  7. data/lib/merit/base_target_finder.rb +1 -6
  8. data/lib/merit/{model_additions.rb → class_methods.rb} +0 -11
  9. data/lib/merit/controller_extensions.rb +4 -22
  10. data/lib/{generators → merit/generators}/active_record/install_generator.rb +8 -8
  11. data/lib/{generators → merit/generators}/active_record/merit_generator.rb +4 -4
  12. data/lib/{generators → merit/generators}/active_record/remove_generator.rb +5 -5
  13. data/lib/{generators/active_record/templates/add_merit_fields_to_model.rb → merit/generators/active_record/templates/add_merit_fields_to_model.erb} +0 -0
  14. data/lib/{generators/active_record/templates/create_badges_sashes.rb → merit/generators/active_record/templates/create_badges_sashes.erb} +0 -0
  15. data/lib/{generators/active_record/templates/create_merit_actions.rb → merit/generators/active_record/templates/create_merit_actions.erb} +2 -0
  16. data/lib/{generators/active_record/templates/create_merit_activity_logs.rb → merit/generators/active_record/templates/create_merit_activity_logs.erb} +0 -0
  17. data/lib/{generators/active_record/templates/create_sashes.rb → merit/generators/active_record/templates/create_sashes.erb} +0 -0
  18. data/lib/{generators/active_record/templates/create_scores_and_points.rb → merit/generators/active_record/templates/create_scores_and_points.erb} +1 -1
  19. data/lib/{generators/active_record/templates/remove_merit_fields_from_model.rb → merit/generators/active_record/templates/remove_merit_fields_from_model.erb} +0 -0
  20. data/lib/{generators/active_record/templates/remove_merit_tables.rb → merit/generators/active_record/templates/remove_merit_tables.erb} +0 -0
  21. data/lib/merit/generators/install_generator.rb +21 -0
  22. data/lib/{generators/merit → merit/generators}/merit_generator.rb +7 -2
  23. data/lib/{generators/merit → merit/generators}/remove_generator.rb +7 -2
  24. data/lib/{generators/merit/templates/merit.rb → merit/generators/templates/merit.erb} +13 -14
  25. data/lib/{generators/merit/templates/merit_badge_rules.rb → merit/generators/templates/merit_badge_rules.erb} +0 -0
  26. data/lib/{generators/merit/templates/merit_point_rules.rb → merit/generators/templates/merit_point_rules.erb} +0 -0
  27. data/lib/{generators/merit/templates/merit_rank_rules.rb → merit/generators/templates/merit_rank_rules.erb} +0 -0
  28. data/lib/merit/judge.rb +6 -5
  29. data/{app/models/merit/action.rb → lib/merit/models/action_concern.rb} +12 -10
  30. data/lib/merit/models/active_record/{merit/action.rb → action.rb} +5 -1
  31. data/lib/merit/models/active_record/{merit/activity_log.rb → activity_log.rb} +3 -1
  32. data/lib/merit/models/active_record/{merit/badges_sash.rb → badges_sash.rb} +4 -2
  33. data/lib/merit/models/active_record/{merit/sash.rb → sash.rb} +5 -2
  34. data/lib/merit/models/active_record/{merit/score.rb → score.rb} +4 -1
  35. data/lib/merit/models/badges_sash_concern.rb +13 -0
  36. data/lib/merit/models/base/badges_sash.rb +1 -1
  37. data/lib/merit/models/base/sash.rb +1 -1
  38. data/lib/merit/models/sash_concern.rb +53 -0
  39. data/lib/merit/{rules_points_methods.rb → point_rules_methods.rb} +0 -0
  40. data/lib/merit/{rules_rank_methods.rb → rank_rules_methods.rb} +3 -18
  41. data/lib/merit.rb +29 -56
  42. data/merit.gemspec +5 -2
  43. data/test/dummy/app/models/address.rb +1 -12
  44. data/test/dummy/app/models/comment.rb +3 -21
  45. data/test/dummy/app/models/user.rb +1 -14
  46. data/test/dummy/config/application.rb +5 -1
  47. data/test/dummy/config/application_api_only.rb +1 -1
  48. data/test/dummy/db/migrate/20130329224406_create_merit_actions.rb +2 -0
  49. data/test/dummy/db/schema.rb +4 -8
  50. data/test/integration/navigation_test.rb +3 -3
  51. data/test/test_helper.rb +0 -2
  52. data/test/unit/base_target_finder_test.rb +7 -26
  53. data/test/unit/merit_unit_test.rb +6 -8
  54. data/test/unit/rule_unit_test.rb +8 -8
  55. data/test/unit/rules_matcher_test.rb +9 -6
  56. data/test/unit/sash_finder_test.rb +5 -5
  57. data/test/unit/sash_test.rb +16 -0
  58. data/test/unit/score_test.rb +1 -1
  59. data/test/unit/target_finder_test.rb +13 -13
  60. metadata +64 -62
  61. data/UPGRADING.md +0 -256
  62. data/lib/generators/active_record/templates/add_target_data_to_merit_actions.rb +0 -5
  63. data/lib/generators/active_record/upgrade_generator.rb +0 -40
  64. data/lib/generators/merit/install_generator.rb +0 -16
  65. data/lib/generators/merit/upgrade_generator.rb +0 -7
  66. data/lib/merit/models/mongoid/merit/action.rb +0 -18
  67. data/lib/merit/models/mongoid/merit/activity_log.rb +0 -11
  68. data/lib/merit/models/mongoid/merit/badges_sash.rb +0 -20
  69. data/lib/merit/models/mongoid/merit/sash.rb +0 -30
  70. data/lib/merit/models/mongoid/merit/score.rb +0 -45
  71. data/test/dummy/db/migrate/20140906225844_create_players.rb +0 -8
  72. data/test/dummy/public/javascripts/application.js +0 -2
  73. data/test/dummy/public/javascripts/controls.js +0 -965
  74. data/test/dummy/public/javascripts/dragdrop.js +0 -974
  75. data/test/dummy/public/javascripts/effects.js +0 -1123
  76. data/test/dummy/public/javascripts/prototype.js +0 -6001
  77. data/test/dummy/public/javascripts/rails.js +0 -191
  78. data/test/orm_models/active_record.rb +0 -11
  79. data/test/orm_models/mongoid.rb +0 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a847a60ecad264aa85e3118fa9e26a974de2e08142577fe134c12e48c4989faf
4
- data.tar.gz: 7f219282c0e6c4f33e10f2b77040ef19dbec9874e11140c47cc216fb17c9665b
3
+ metadata.gz: 1163ea7681b5daca51eb89a7785bc648fe86ddbefff1a05cdc765c20c9b91973
4
+ data.tar.gz: 1329168f700f69f1d0eff4ca196ed511302b7839745eb8ed58bb5bb277cd5d51
5
5
  SHA512:
6
- metadata.gz: 8b2714cb9b1c672ba79a1d1034ac6f53bf66c544d568d358c2fe98f3a42801589db9a1213c7eb36abe03a51f8392b4929d52db06549d8786d6b7bfe125e48486
7
- data.tar.gz: 2c062006a8352ad9bc7bce01db34851a30e4b7b8fce7de19c6dc4377366e743832ad0507e88b498ba1ed9f6f498e787ebddbb6f2c27577d1870c2dd08d0e6679
6
+ metadata.gz: 2e112a21e6ada4964c86c7253c72bc4235f4ab478a876badfa27cf1d60d2cea3ec297f234219100bc9049e50ea859860a7d6c3f504dcca86b8424da3aa28e007
7
+ data.tar.gz: 39f8af732714702142e9b0f279c63b7aa528113fd81f39df99f94ae09ca0320e9a2f52b230dd919bedc9e42f5947aed9ad656df89c84c9bc09a56cdacd7e8438
data/Gemfile CHANGED
@@ -4,16 +4,8 @@ gemspec
4
4
 
5
5
  gem 'rails', "~> #{ENV.fetch('RAILS_VERSION', 6.0)}"
6
6
 
7
- case ENV['ORM']
8
- when 'active_record'
9
- gem 'activerecord'
10
- when 'mongoid'
11
- gem 'mongoid'
12
- end
13
-
14
7
  group :development, :test do
15
- gem 'activerecord-jdbcsqlite3-adapter', :platforms => [:jruby]
16
8
  gem 'sqlite3', '~> 1.4'
17
9
  end
18
10
 
19
- gem 'coveralls', require: false
11
+ gem 'coveralls', '~> 0.8.23', require: false
data/NEWS.md CHANGED
@@ -2,6 +2,31 @@
2
2
 
3
3
  User-visible changes worth mentioning.
4
4
 
5
+ ## 4.0.3
6
+
7
+ - Add webrick as a development dependency
8
+ - [#363] Fix: `warning: already initialized constant Merit::*` messages
9
+ - [#357] Fix `merit_actions` migration template
10
+
11
+ ## 4.0.2
12
+
13
+ - [#355, #356] Add index on merit_actions.processed column
14
+ - [#354] Fix Rails autoloader deprecation warnings
15
+ Requires wrapping `Merit::Badge.create` with `Rails.application.reloader.to_prepare`
16
+ - Test with Ruby 3 and Rails 6.1 (excludes Rails 5.2 with Ruby 3, that errors out)
17
+ - [#288] Don’t send “removed badge” notifications when user doesn’t have the badge
18
+
19
+ ## 4.0.1
20
+
21
+ - [#351] Fix bug on generating migrations
22
+
23
+ ## 4.0.0
24
+
25
+ - Stop testing on Rails 5.1
26
+ - Drop support for mongoid
27
+ - Drop v2 upgrade generators
28
+ - Enable Zeitwerk gem mode (and renames internal merit constants)
29
+
5
30
  ## 3.0.3
6
31
 
7
32
  - Test against Ruby 2.6 and Rails 6
data/README.md CHANGED
@@ -38,8 +38,7 @@ and Rankings.
38
38
  2. Run `rails g merit:install`. This creates several migrations.
39
39
  3. Run `rails g merit MODEL_NAME` (e.g. `user`). This creates a migration and adds `has_merit` to MODEL_NAME.
40
40
  4. Run `rake db:migrate`
41
- 5. Define badges in `config/initializers/merit.rb`. You can also define ORM:
42
- `:active_record` (default) or `:mongoid`.
41
+ 5. Define badges in `config/initializers/merit.rb`
43
42
  6. Configure reputation rules for your application in `app/models/merit/*`
44
43
 
45
44
 
@@ -59,12 +58,16 @@ Create badges in `config/initializers/merit.rb`
59
58
  ### Example
60
59
 
61
60
  ```ruby
62
- Merit::Badge.create!(
63
- id: 1,
64
- name: "year-member",
65
- description: "Active member for a year",
66
- custom_fields: { difficulty: :silver }
67
- )
61
+ # config/initializers/merit.rb
62
+
63
+ Rails.application.reloader.to_prepare do
64
+ Merit::Badge.create!(
65
+ id: 1,
66
+ name: "year-member",
67
+ description: "Active member for a year",
68
+ custom_fields: { difficulty: :silver }
69
+ )
70
+ end
68
71
  ```
69
72
 
70
73
  ## Defining Rules
@@ -114,6 +117,19 @@ grant_on ['users#create', 'users#update'], badge: 'autobiographer', temporary: t
114
117
  end
115
118
  ```
116
119
 
120
+ If your controller is under a namespace other than root (example:
121
+ `Api::ModelController`) then for merit to find your object automatically you
122
+ must specify the model class and not forget that your action is of the form
123
+ `namespace/models#action`.
124
+
125
+ See an example of a `Post` model that belongs to user:
126
+
127
+ ```ruby
128
+ grant_on 'api/posts#create', badge: 'first-post', model_name: 'Post', to: :user do |post|
129
+ post.user.posts.count >= 1
130
+ end
131
+ ```
132
+
117
133
  ## Other Actions
118
134
 
119
135
  ```ruby
@@ -293,8 +309,8 @@ warning, with a comment to check the configuration for the rule.
293
309
 
294
310
  # Getting Notifications
295
311
 
296
- You can get observers notified any time merit changes reputation in your
297
- application.
312
+ You can get observers notified any time merit automatically changes reputation
313
+ in your application.
298
314
 
299
315
  It needs to implement the `update` method, which receives as parameter the
300
316
  following hash:
@@ -325,6 +341,9 @@ end
325
341
  config.add_observer 'ReputationChangeObserver'
326
342
  ```
327
343
 
344
+ **NOTE:** Observers won’t get notified if you grant reputation with
345
+ direct calls to `add_badge` or `add_point`.
346
+
328
347
  # I18n
329
348
 
330
349
  Merit uses default messages with I18n for notify alerts. To customize your app, you can set up your locale file:
@@ -26,14 +26,6 @@ module Merit
26
26
  end
27
27
  end
28
28
 
29
- def _mongoid_sash_in(sashes)
30
- {:sash_id.in => sashes}
31
- end
32
-
33
- def _active_record_sash_in(sashes)
34
- {sash_id: sashes}
35
- end
36
-
37
29
  class << self
38
30
  def find_by_name_and_level(name, level)
39
31
  badges = Merit::Badge.by_name(name)
@@ -51,7 +43,7 @@ module Merit
51
43
  def _define_related_entries_method(meritable_class_name)
52
44
  define_method(:"#{meritable_class_name.underscore.pluralize}") do
53
45
  sashes = BadgesSash.where(badge_id: id).pluck(:sash_id)
54
- meritable_class_name.constantize.where(send "_#{Merit.orm}_sash_in", sashes)
46
+ meritable_class_name.constantize.where(sash_id: sashes)
55
47
  end
56
48
  end
57
49
  end
@@ -25,12 +25,7 @@ module Merit
25
25
  end
26
26
 
27
27
  def reanimate_target_from_action
28
- if @action.respond_to? :target_data
29
- YAML.load(@action.target_data)
30
- else
31
- Merit.upgrade_target_data_warning
32
- nil
33
- end
28
+ YAML.load(@action.target_data)
34
29
  end
35
30
  end
36
31
  end
@@ -9,7 +9,6 @@ module Merit
9
9
  # https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/1079-belongs_to-dependent-destroy-should-destroy-self-before-assocation
10
10
  belongs_to :sash, class_name: 'Merit::Sash', inverse_of: nil, optional: true
11
11
 
12
- send :"_merit_#{Merit.orm}_specific_config"
13
12
  _merit_delegate_methods_to_sash
14
13
  _merit_define_badge_related_entries_method
15
14
  _merit_sash_initializer
@@ -22,16 +21,6 @@ module Merit
22
21
  methods.each { |method| delegate method, to: :_sash }
23
22
  end
24
23
 
25
- def _merit_active_record_specific_config
26
- end
27
-
28
- def _merit_mongoid_specific_config
29
- field :level, type: Integer, default: 0
30
- def find_by_id(id)
31
- where(_id: id).first
32
- end
33
- end
34
-
35
24
  def _merit_define_badge_related_entries_method
36
25
  meritable_class_name = name.demodulize
37
26
  Merit::Badge._define_related_entries_method(meritable_class_name)
@@ -27,16 +27,8 @@ module Merit
27
27
  had_errors: had_errors?,
28
28
  target_model: controller_path,
29
29
  target_id: target_id,
30
- }.merge(target_data_hash)
31
- end
32
-
33
- def target_data_hash
34
- if Merit::Action.new.respond_to?(:target_data)
35
- { target_data: target_object.to_yaml }
36
- else
37
- Merit.upgrade_target_data_warning
38
- {}
39
- end
30
+ target_data: target_object.to_yaml,
31
+ }
40
32
  end
41
33
 
42
34
  def rules_defined?
@@ -69,21 +61,11 @@ module Merit
69
61
 
70
62
  def target_id
71
63
  target_id = target_object.try(:id)
72
- # If target_id is nil
73
- # then use params[:id].
74
- if target_id.nil? && send("check_#{Merit.orm}_id", params[:id])
64
+ # If target_id is nil use (only digits of) params[:id]
65
+ if target_id.nil? && params[:id].to_s =~ /^[0-9]+$/
75
66
  target_id = params[:id]
76
67
  end
77
68
  target_id
78
69
  end
79
-
80
- # This check avoids trying to set a slug as integer FK
81
- def check_active_record_id(id)
82
- id.to_s =~ /^[0-9]+$/
83
- end
84
-
85
- def check_mongoid_id(id)
86
- id.to_s =~ /^[0-9a-fA-F]{24}$/
87
- end
88
70
  end
89
71
  end
@@ -1,8 +1,8 @@
1
1
  require 'rails/generators/active_record'
2
2
 
3
- module ActiveRecord
4
- module Generators
5
- class InstallGenerator < Rails::Generators::Base
3
+ module Merit
4
+ module Generators::ActiveRecord
5
+ class InstallGenerator < ::Rails::Generators::Base
6
6
  include Rails::Generators::Migration
7
7
 
8
8
  source_root File.expand_path('../templates', __FILE__)
@@ -13,19 +13,19 @@ module ActiveRecord
13
13
  end
14
14
 
15
15
  def copy_migrations_and_model
16
- migration_template 'create_merit_actions.rb',
16
+ migration_template 'create_merit_actions.erb',
17
17
  'db/migrate/create_merit_actions.rb'
18
18
 
19
- migration_template 'create_merit_activity_logs.rb',
19
+ migration_template 'create_merit_activity_logs.erb',
20
20
  'db/migrate/create_merit_activity_logs.rb'
21
21
 
22
- migration_template 'create_sashes.rb',
22
+ migration_template 'create_sashes.erb',
23
23
  'db/migrate/create_sashes.rb'
24
24
 
25
- migration_template 'create_badges_sashes.rb',
25
+ migration_template 'create_badges_sashes.erb',
26
26
  'db/migrate/create_badges_sashes.rb'
27
27
 
28
- migration_template 'create_scores_and_points.rb',
28
+ migration_template 'create_scores_and_points.erb',
29
29
  'db/migrate/create_scores_and_points.rb'
30
30
  end
31
31
 
@@ -1,8 +1,8 @@
1
1
  require 'rails/generators/active_record'
2
2
 
3
- module ActiveRecord
4
- module Generators
5
- class MeritGenerator < ActiveRecord::Generators::Base
3
+ module Merit
4
+ module Generators::ActiveRecord
5
+ class MeritGenerator < ::ActiveRecord::Generators::Base
6
6
  include Rails::Generators::Migration
7
7
 
8
8
  source_root File.expand_path('../templates', __FILE__)
@@ -13,7 +13,7 @@ module ActiveRecord
13
13
  end
14
14
 
15
15
  def copy_migrations_and_model
16
- migration_template 'add_merit_fields_to_model.rb',
16
+ migration_template 'add_merit_fields_to_model.erb',
17
17
  "db/migrate/add_merit_fields_to_#{table_name}.rb"
18
18
  end
19
19
 
@@ -1,8 +1,8 @@
1
1
  require 'rails/generators/active_record'
2
2
 
3
- module ActiveRecord
4
- module Generators
5
- class RemoveGenerator < ActiveRecord::Generators::Base
3
+ module Merit
4
+ module Generators::ActiveRecord
5
+ class RemoveGenerator < ::ActiveRecord::Generators::Base
6
6
  include Rails::Generators::Migration
7
7
 
8
8
  source_root File.expand_path('../templates', __FILE__)
@@ -13,11 +13,11 @@ module ActiveRecord
13
13
  end
14
14
 
15
15
  def copy_migrations_and_model
16
- migration_template 'remove_merit_tables.rb',
16
+ migration_template 'remove_merit_tables.erb',
17
17
  'db/migrate/remove_merit_tables.rb'
18
18
 
19
19
  migration_template(
20
- 'remove_merit_fields_from_model.rb',
20
+ 'remove_merit_fields_from_model.erb',
21
21
  "db/migrate/remove_merit_fields_from_#{table_name}.rb"
22
22
  )
23
23
  end
@@ -11,5 +11,7 @@ class CreateMeritActions < ActiveRecord::Migration<%= migration_version %>
11
11
  t.boolean :processed, default: false
12
12
  t.timestamps null: false
13
13
  end
14
+
15
+ add_index :merit_actions, :processed
14
16
  end
15
17
  end
@@ -7,7 +7,7 @@ class CreateScoresAndPoints < ActiveRecord::Migration<%= migration_version %>
7
7
 
8
8
  create_table :merit_score_points do |t|
9
9
  t.references :score
10
- t.integer :num_points, default: 0
10
+ t.bigint :num_points, default: 0
11
11
  t.string :log
12
12
  t.datetime :created_at
13
13
  end
@@ -0,0 +1,21 @@
1
+ require "rails/generators"
2
+
3
+ module Merit
4
+ module Generators
5
+ class InstallGenerator < ::Rails::Generators::Base
6
+ source_root File.expand_path('../templates', __FILE__)
7
+
8
+ desc 'Copy config and rules files'
9
+ def copy_migrations_and_model
10
+ template 'merit.erb', 'config/initializers/merit.rb'
11
+ template 'merit_badge_rules.erb', 'app/models/merit/badge_rules.rb'
12
+ template 'merit_point_rules.erb', 'app/models/merit/point_rules.rb'
13
+ template 'merit_rank_rules.erb', 'app/models/merit/rank_rules.rb'
14
+ end
15
+
16
+ def run_active_record_generators
17
+ invoke 'merit:active_record:install'
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,8 +1,9 @@
1
+ require "rails/generators"
2
+
1
3
  module Merit
2
4
  module Generators
3
- class MeritGenerator < Rails::Generators::NamedBase
5
+ class MeritGenerator < ::Rails::Generators::NamedBase
4
6
  source_root File.expand_path('../templates', __FILE__)
5
- hook_for :orm
6
7
 
7
8
  def inject_merit_content
8
9
  if model_exists?
@@ -10,6 +11,10 @@ module Merit
10
11
  end
11
12
  end
12
13
 
14
+ def run_active_record_generators
15
+ invoke 'merit:active_record:merit'
16
+ end
17
+
13
18
  private
14
19
 
15
20
  def model_exists?
@@ -1,8 +1,13 @@
1
+ require "rails/generators"
2
+
1
3
  module Merit
2
4
  module Generators
3
- class RemoveGenerator < Rails::Generators::NamedBase
5
+ class RemoveGenerator < ::Rails::Generators::NamedBase
4
6
  source_root File.expand_path('../templates', __FILE__)
5
- hook_for :orm
7
+
8
+ def run_active_record_generators
9
+ invoke 'merit:active_record:remove'
10
+ end
6
11
 
7
12
  private
8
13
 
@@ -3,13 +3,10 @@ Merit.setup do |config|
3
3
  # Check rules on each request or in background
4
4
  # config.checks_on_each_request = true
5
5
 
6
- # Define ORM. Could be :active_record (default) and :mongoid
7
- # config.orm = :active_record
8
-
9
6
  # Add application observers to get notifications when reputation changes.
10
7
  # config.add_observer 'MyObserverClassName'
11
8
 
12
- # Define :user_model_name. This model will be used to grand badge if no
9
+ # Define :user_model_name. This model will be used to grant badge if no
13
10
  # `:to` option is given. Default is 'User'.
14
11
  # config.user_model_name = 'User'
15
12
 
@@ -20,14 +17,16 @@ Merit.setup do |config|
20
17
  end
21
18
 
22
19
  # Create application badges (uses https://github.com/norman/ambry)
23
- # badge_id = 0
24
- # [{
25
- # id: (badge_id = badge_id+1),
26
- # name: 'just-registered'
27
- # }, {
28
- # id: (badge_id = badge_id+1),
29
- # name: 'best-unicorn',
30
- # custom_fields: { category: 'fantasy' }
31
- # }].each do |attrs|
32
- # Merit::Badge.create! attrs
20
+ # Rails.application.reloader.to_prepare do
21
+ # badge_id = 0
22
+ # [{
23
+ # id: (badge_id = badge_id+1),
24
+ # name: 'just-registered'
25
+ # }, {
26
+ # id: (badge_id = badge_id+1),
27
+ # name: 'best-unicorn',
28
+ # custom_fields: { category: 'fantasy' }
29
+ # }].each do |attrs|
30
+ # Merit::Badge.create! attrs
31
+ # end
33
32
  # end
data/lib/merit/judge.rb CHANGED
@@ -50,11 +50,12 @@ module Merit
50
50
 
51
51
  def remove_badges
52
52
  sashes.each do |sash|
53
- sash.rm_badge badge.id
54
- notify_observers(
55
- description: I18n.t("merit.removed_badge", badge_name: badge.name),
56
- sash_id: sash.id
57
- )
53
+ if sash.rm_badge badge.id
54
+ notify_observers(
55
+ description: I18n.t("merit.removed_badge", badge_name: badge.name),
56
+ sash_id: sash.id
57
+ )
58
+ end
58
59
  end
59
60
  end
60
61
 
@@ -1,5 +1,3 @@
1
- require_dependency "merit/models/#{Merit.orm}/merit/action"
2
-
3
1
  # Merit::Action general schema
4
2
  # ______________________________________________________________
5
3
  # source | action | target
@@ -12,10 +10,14 @@ require_dependency "merit/models/#{Merit.orm}/merit/action"
12
10
  # ______________________________________________________________
13
11
  #
14
12
  # Rules relate to merit_actions by action name ('controller#action' string)
15
- module Merit
16
- class Action
17
- def self.check_unprocessed
18
- where(processed: false).find_each(&:check_all_rules)
13
+ module Merit::Models
14
+ module ActionConcern
15
+ extend ActiveSupport::Concern
16
+
17
+ class_methods do
18
+ def check_unprocessed
19
+ where(processed: false).find_each(&:check_all_rules)
20
+ end
19
21
  end
20
22
 
21
23
  # Check rules defined for a merit_action
@@ -23,16 +25,16 @@ module Merit
23
25
  mark_as_processed!
24
26
  return if had_errors
25
27
 
26
- check_rules rules_matcher.select_from(AppBadgeRules), :badges
27
- check_rules rules_matcher.select_from(AppPointRules), :points
28
+ check_rules rules_matcher.select_from(Merit::AppBadgeRules), :badges
29
+ check_rules rules_matcher.select_from(Merit::AppPointRules), :points
28
30
  end
29
31
 
30
32
  private
31
33
 
32
34
  def check_rules(rules_array, badges_or_points)
33
35
  rules_array.each do |rule|
34
- judge = Judge.new rule, action: self
35
- judge.send :"apply_#{badges_or_points}"
36
+ judge = Merit::Judge.new(rule, action: self)
37
+ judge.public_send(:"apply_#{badges_or_points}")
36
38
  end
37
39
  end
38
40
 
@@ -1,7 +1,11 @@
1
- module Merit
1
+ module Merit::Models::ActiveRecord
2
2
  class Action < ActiveRecord::Base
3
+ include Merit::Models::ActionConcern
4
+
3
5
  self.table_name = :merit_actions
4
6
 
5
7
  has_many :activity_logs, class_name: 'Merit::ActivityLog'
6
8
  end
7
9
  end
10
+
11
+ class Merit::Action < Merit::Models::ActiveRecord::Action; end
@@ -1,4 +1,4 @@
1
- module Merit
1
+ module Merit::Models::ActiveRecord
2
2
  class ActivityLog < ActiveRecord::Base
3
3
  self.table_name = :merit_activity_logs
4
4
 
@@ -7,3 +7,5 @@ module Merit
7
7
  has_one :sash, through: :related_change
8
8
  end
9
9
  end
10
+
11
+ class Merit::ActivityLog < Merit::Models::ActiveRecord::ActivityLog; end
@@ -1,6 +1,6 @@
1
- module Merit
1
+ module Merit::Models::ActiveRecord
2
2
  class BadgesSash < ActiveRecord::Base
3
- include Base::BadgesSash
3
+ include Merit::Models::BadgesSashConcern
4
4
 
5
5
  has_many :activity_logs,
6
6
  class_name: 'Merit::ActivityLog',
@@ -9,3 +9,5 @@ module Merit
9
9
  validates_presence_of :badge_id, :sash
10
10
  end
11
11
  end
12
+
13
+ class Merit::BadgesSash < Merit::Models::ActiveRecord::BadgesSash; end
@@ -1,4 +1,4 @@
1
- module Merit
1
+ module Merit::Models::ActiveRecord
2
2
  # Sash is a container for reputation data for meritable models. It's an
3
3
  # indirection between meritable models and badges and scores (one to one
4
4
  # relationship).
@@ -6,7 +6,8 @@ module Merit
6
6
  # It's existence make join models like badges_users and scores_users
7
7
  # unnecessary. It should be transparent at the application.
8
8
  class Sash < ActiveRecord::Base
9
- include Base::Sash
9
+ include Merit::Models::SashConcern
10
+
10
11
  has_many :badges_sashes, dependent: :destroy
11
12
  has_many :scores, dependent: :destroy, class_name: 'Merit::Score'
12
13
 
@@ -27,3 +28,5 @@ module Merit
27
28
  end
28
29
  end
29
30
  end
31
+
32
+ class Merit::Sash < Merit::Models::ActiveRecord::Sash; end
@@ -1,4 +1,4 @@
1
- module Merit
1
+ module Merit::Models::ActiveRecord
2
2
  class Score < ActiveRecord::Base
3
3
  self.table_name = :merit_scores
4
4
  belongs_to :sash
@@ -20,3 +20,6 @@ module Merit
20
20
  end
21
21
  end
22
22
  end
23
+
24
+ class Merit::Score < Merit::Models::ActiveRecord::Score; end
25
+ class Merit::Score::Point < Merit::Models::ActiveRecord::Score::Point; end
@@ -0,0 +1,13 @@
1
+ module Merit::Models
2
+ module BadgesSashConcern
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ belongs_to :sash
7
+ end
8
+
9
+ def badge
10
+ Merit::Badge.find(badge_id)
11
+ end
12
+ end
13
+ end
@@ -1,5 +1,5 @@
1
1
  module Merit
2
- module Base
2
+ module Models::Base
3
3
  module BadgesSash
4
4
  extend ActiveSupport::Concern
5
5
 
@@ -1,5 +1,5 @@
1
1
  module Merit
2
- module Base
2
+ module Models::Base
3
3
  module Sash
4
4
  def badges
5
5
  badge_ids.map { |id| Merit::Badge.find id }