merit 4.0.0 → 4.0.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f0ee557f98d45fe9a83d5de23d407e2b36f85f6a5d4204b1ed89fec8bf5c90fb
4
- data.tar.gz: ae393531c2a569a8aece0d533523aaa6fa6e407c4fe4aa3efe96f49d349b3d37
3
+ metadata.gz: 1163ea7681b5daca51eb89a7785bc648fe86ddbefff1a05cdc765c20c9b91973
4
+ data.tar.gz: 1329168f700f69f1d0eff4ca196ed511302b7839745eb8ed58bb5bb277cd5d51
5
5
  SHA512:
6
- metadata.gz: c4b48c33d57774076e00d9732ccac73dbb71b1ee1efe87329ba9ee542593e1a8c3823bef1c5c783a45ed46b28cc3eda4626ddefe9683682341ccc8d51bcf9889
7
- data.tar.gz: 0e886c1d895343875d06c537015d4ae14b0723f96d8ddac2a264892b7a3aee0d821f7e6ccb404f68371ac9ca9d5adad78f211b1943747a9bc6dc53361efd6cb6
6
+ metadata.gz: 2e112a21e6ada4964c86c7253c72bc4235f4ab478a876badfa27cf1d60d2cea3ec297f234219100bc9049e50ea859860a7d6c3f504dcca86b8424da3aa28e007
7
+ data.tar.gz: 39f8af732714702142e9b0f279c63b7aa528113fd81f39df99f94ae09ca0320e9a2f52b230dd919bedc9e42f5947aed9ad656df89c84c9bc09a56cdacd7e8438
data/NEWS.md CHANGED
@@ -2,6 +2,24 @@
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
+
5
23
  ## 4.0.0
6
24
 
7
25
  - Stop testing on Rails 5.1
data/README.md CHANGED
@@ -58,12 +58,16 @@ Create badges in `config/initializers/merit.rb`
58
58
  ### Example
59
59
 
60
60
  ```ruby
61
- Merit::Badge.create!(
62
- id: 1,
63
- name: "year-member",
64
- description: "Active member for a year",
65
- custom_fields: { difficulty: :silver }
66
- )
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
67
71
  ```
68
72
 
69
73
  ## Defining Rules
@@ -305,8 +309,8 @@ warning, with a comment to check the configuration for the rule.
305
309
 
306
310
  # Getting Notifications
307
311
 
308
- You can get observers notified any time merit changes reputation in your
309
- application.
312
+ You can get observers notified any time merit automatically changes reputation
313
+ in your application.
310
314
 
311
315
  It needs to implement the `update` method, which receives as parameter the
312
316
  following hash:
@@ -337,6 +341,9 @@ end
337
341
  config.add_observer 'ReputationChangeObserver'
338
342
  ```
339
343
 
344
+ **NOTE:** Observers won’t get notified if you grant reputation with
345
+ direct calls to `add_badge` or `add_point`.
346
+
340
347
  # I18n
341
348
 
342
349
  Merit uses default messages with I18n for notify alerts. To customize your app, you can set up your locale file:
@@ -13,7 +13,7 @@ module Merit
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
 
@@ -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
@@ -4,7 +4,6 @@ module Merit
4
4
  module Generators
5
5
  class InstallGenerator < ::Rails::Generators::Base
6
6
  source_root File.expand_path('../templates', __FILE__)
7
- hook_for :orm
8
7
 
9
8
  desc 'Copy config and rules files'
10
9
  def copy_migrations_and_model
@@ -13,6 +12,10 @@ module Merit
13
12
  template 'merit_point_rules.erb', 'app/models/merit/point_rules.rb'
14
13
  template 'merit_rank_rules.erb', 'app/models/merit/rank_rules.rb'
15
14
  end
15
+
16
+ def run_active_record_generators
17
+ invoke 'merit:active_record:install'
18
+ end
16
19
  end
17
20
  end
18
21
  end
@@ -4,7 +4,6 @@ module Merit
4
4
  module Generators
5
5
  class MeritGenerator < ::Rails::Generators::NamedBase
6
6
  source_root File.expand_path('../templates', __FILE__)
7
- hook_for :orm
8
7
 
9
8
  def inject_merit_content
10
9
  if model_exists?
@@ -12,6 +11,10 @@ module Merit
12
11
  end
13
12
  end
14
13
 
14
+ def run_active_record_generators
15
+ invoke 'merit:active_record:merit'
16
+ end
17
+
15
18
  private
16
19
 
17
20
  def model_exists?
@@ -4,7 +4,10 @@ module Merit
4
4
  module Generators
5
5
  class RemoveGenerator < ::Rails::Generators::NamedBase
6
6
  source_root File.expand_path('../templates', __FILE__)
7
- hook_for :orm
7
+
8
+ def run_active_record_generators
9
+ invoke 'merit:active_record:remove'
10
+ end
8
11
 
9
12
  private
10
13
 
@@ -6,7 +6,7 @@ Merit.setup do |config|
6
6
  # Add application observers to get notifications when reputation changes.
7
7
  # config.add_observer 'MyObserverClassName'
8
8
 
9
- # 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
10
10
  # `:to` option is given. Default is 'User'.
11
11
  # config.user_model_name = 'User'
12
12
 
@@ -17,14 +17,16 @@ Merit.setup do |config|
17
17
  end
18
18
 
19
19
  # Create application badges (uses https://github.com/norman/ambry)
20
- # badge_id = 0
21
- # [{
22
- # id: (badge_id = badge_id+1),
23
- # name: 'just-registered'
24
- # }, {
25
- # id: (badge_id = badge_id+1),
26
- # name: 'best-unicorn',
27
- # custom_fields: { category: 'fantasy' }
28
- # }].each do |attrs|
29
- # 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
30
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
 
data/lib/merit.rb CHANGED
@@ -35,6 +35,16 @@ module Merit
35
35
  @config.add_observer(class_name)
36
36
  end
37
37
 
38
+ # If the app is reloaded, avoid printing `warning: previous definition of AppBadgeRules was here`
39
+ def self.remove_badge_rules
40
+ remove_const(:AppBadgeRules) if self.const_defined?('AppBadgeRules')
41
+ end
42
+
43
+ # If the app is reloaded, avoid printing `warning: previous definition of AppPointRules was here`
44
+ def self.remove_point_rules
45
+ remove_const(:AppPointRules) if self.const_defined?('AppPointRules')
46
+ end
47
+
38
48
  class Configuration
39
49
  attr_accessor :checks_on_each_request, :orm, :user_model_name, :observers,
40
50
  :current_user_method
@@ -61,32 +71,25 @@ module Merit
61
71
  config.app_generators.orm Merit.orm
62
72
 
63
73
  initializer 'merit.controller' do |app|
64
- extend_orm_with_has_merit
65
- ActiveSupport.on_load(action_controller_hook) do
66
- begin
67
- # Load app rules on boot up
68
- Merit::AppBadgeRules = Merit::BadgeRules.new.defined_rules
69
- Merit::AppPointRules = Merit::PointRules.new.defined_rules
70
- include Merit::ControllerExtensions
71
- rescue NameError => e
72
- # Trap NameError if installing/generating files
73
- raise e unless
74
- e.to_s =~ /uninitialized constant Merit::(BadgeRules|PointRules)/
74
+ config.to_prepare do
75
+ ActiveSupport.on_load(:active_record) { include Merit }
76
+ ActiveSupport.on_load(app.config.api_only ? :action_controller_api : :action_controller_base) do
77
+ begin
78
+ # Remove previous definitions of constant if they are defined when app reloads
79
+ Merit.remove_badge_rules
80
+ Merit.remove_point_rules
81
+ # Load app rules on boot up
82
+ Merit::AppBadgeRules = Merit::BadgeRules.new.defined_rules
83
+ Merit::AppPointRules = Merit::PointRules.new.defined_rules
84
+ include Merit::ControllerExtensions
85
+ rescue NameError => e
86
+ # Trap NameError if installing/generating files
87
+ raise e unless
88
+ e.to_s =~ /uninitialized constant Merit::(BadgeRules|PointRules)/
89
+ end
75
90
  end
76
91
  end
77
92
  end
78
-
79
- def extend_orm_with_has_merit
80
- ActiveRecord::Base.include(Merit)
81
- end
82
-
83
- def action_controller_hook
84
- if Rails.application.config.api_only
85
- :action_controller_api
86
- else
87
- :action_controller_base
88
- end
89
- end
90
93
  end
91
94
  end
92
95
 
data/merit.gemspec CHANGED
@@ -6,7 +6,7 @@ Gem::Specification.new do |s|
6
6
  s.files = `git ls-files`.split("\n").reject{|f| f =~ /^\./ }
7
7
  s.test_files = `git ls-files -- test/*`.split("\n")
8
8
  s.license = 'MIT'
9
- s.version = '4.0.0'
9
+ s.version = '4.0.3'
10
10
  s.authors = ["Tute Costa"]
11
11
  s.email = 'tutecosta@gmail.com'
12
12
 
@@ -21,4 +21,5 @@ Gem::Specification.new do |s|
21
21
  s.add_development_dependency 'rubocop'
22
22
  s.add_development_dependency 'minitest-rails'
23
23
  s.add_development_dependency 'mocha'
24
+ s.add_development_dependency 'webrick'
24
25
  end
@@ -10,6 +10,8 @@ class CreateMeritActions < ActiveRecord::Migration[5.0]
10
10
  t.boolean :processed, :default => false
11
11
  t.timestamps null: false
12
12
  end
13
+
14
+ add_index :merit_actions, :processed
13
15
  end
14
16
 
15
17
  def self.down
@@ -2,8 +2,8 @@
2
2
  # of editing this file, please use the migrations feature of Active Record to
3
3
  # incrementally modify your database, and then regenerate this schema definition.
4
4
  #
5
- # This file is the source Rails uses to define your schema when running `rails
6
- # db:schema:load`. When creating a new database, `rails db:schema:load` tends to
5
+ # This file is the source Rails uses to define your schema when running `bin/rails
6
+ # db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to
7
7
  # be faster and is potentially less error prone than running all of your
8
8
  # migrations from scratch. Old migrations may fail to apply correctly if those
9
9
  # migrations use external dependencies or application code.
@@ -49,6 +49,7 @@ ActiveRecord::Schema.define(version: 2014_08_19_133931) do
49
49
  t.datetime "created_at", null: false
50
50
  t.datetime "updated_at", null: false
51
51
  t.text "target_data"
52
+ t.index ["processed"], name: "index_merit_actions_on_processed"
52
53
  end
53
54
 
54
55
  create_table "merit_activity_logs", force: :cascade do |t|
@@ -180,7 +180,7 @@ class NavigationTest < ActionDispatch::IntegrationTest
180
180
 
181
181
  visit "/users/#{user.id}/edit"
182
182
  fill_in 'Name', with: 'a'
183
- assert_difference('Merit::ActivityLog.count', 2) do
183
+ assert_difference('Merit::ActivityLog.count', 1) do
184
184
  click_button('Update User')
185
185
  end
186
186
 
@@ -6,6 +6,22 @@ class SashTest < ActiveSupport::TestCase
6
6
  @sash = Merit::Sash.create
7
7
  end
8
8
 
9
+ describe "#rm_badge" do
10
+ describe "when has badge" do
11
+ it "returns truthy" do
12
+ @sash.badges_sashes.create!(badge_id: 1)
13
+
14
+ assert_equal !!@sash.rm_badge(1), true
15
+ end
16
+ end
17
+
18
+ describe "when does NOT have badge" do
19
+ it "returns falsey" do
20
+ assert_equal !!@sash.rm_badge(0), false
21
+ end
22
+ end
23
+ end
24
+
9
25
  describe "#add_points" do
10
26
  describe "when category specified" do
11
27
  it "should create a new Point with specified category" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: merit
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0
4
+ version: 4.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tute Costa
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-02 00:00:00.000000000 Z
11
+ date: 2022-03-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ambry
@@ -122,6 +122,20 @@ dependencies:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: webrick
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
125
139
  description: Manage badges, points and rankings (reputation) in your Rails app.
126
140
  email: tutecosta@gmail.com
127
141
  executables: []
@@ -265,7 +279,7 @@ homepage: https://github.com/merit-gem/merit
265
279
  licenses:
266
280
  - MIT
267
281
  metadata: {}
268
- post_install_message:
282
+ post_install_message:
269
283
  rdoc_options: []
270
284
  require_paths:
271
285
  - lib
@@ -280,8 +294,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
280
294
  - !ruby/object:Gem::Version
281
295
  version: '0'
282
296
  requirements: []
283
- rubygems_version: 3.0.3
284
- signing_key:
297
+ rubygems_version: 3.2.32
298
+ signing_key:
285
299
  specification_version: 4
286
300
  summary: Reputation engine for Rails apps
287
301
  test_files: