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,64 @@
1
+ require 'test_helper'
2
+
3
+ describe Merit::BaseTargetFinder do
4
+ describe '#find' do
5
+ describe 'rule has a model_name' do
6
+ it "should prioritize the rule's model name" do
7
+ rule = Merit::Rule.new
8
+ rule.to = :itself
9
+ rule.model_name = 'comment'
10
+ action = Merit::Action.new(target_model: 'users', target_id: 2)
11
+ comment = Comment.new
12
+
13
+ Comment.stubs(:find_by_id).with(2).returns(comment)
14
+
15
+ finder = Merit::BaseTargetFinder.new(rule, action)
16
+ collection = finder.find
17
+ _(collection).must_be :==, comment
18
+ end
19
+ end
20
+
21
+ describe 'rule has no model_name' do
22
+ it 'should fall back to the action#target_model' do
23
+ rule = Merit::Rule.new
24
+ rule.to = :itself
25
+ action = Merit::Action.new(target_model: 'users', target_id: 3)
26
+ user = User.new(id: 3)
27
+
28
+ User.stubs(:find_by_id).with(3).returns(user)
29
+
30
+ finder = Merit::BaseTargetFinder.new(rule, action)
31
+ _(finder.find).must_be :==, user
32
+ end
33
+ end
34
+
35
+ describe 'when the targeted class is not meritable' do
36
+ it 'should warn and return' do
37
+ rule = Merit::Rule.new
38
+ rule.to = :itself
39
+ rule.model_name = 'registrations'
40
+ action = Merit::Action.new(target_model: 'users', target_id: 220)
41
+
42
+ finder = Merit::BaseTargetFinder.new(rule, action)
43
+ Rails.logger.expects(:warn)
44
+ _(finder.find).must_be_nil
45
+ end
46
+ end
47
+
48
+ describe 'target was destroyed' do
49
+ it 'gets the object from the JSON data in the merit_actions table' do
50
+ comment = Comment.new(name: 'the comment name')
51
+
52
+ rule = Merit::Rule.new
53
+ rule.to = :itself
54
+ rule.model_name = 'comment'
55
+ action = Merit::Action.new(target_model: 'comment',
56
+ target_id: 2,
57
+ target_data: comment.to_yaml)
58
+
59
+ finder = Merit::BaseTargetFinder.new(rule, action)
60
+ _(finder.find.name).must_be :==, 'the comment name'
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,33 @@
1
+ require 'test_helper'
2
+
3
+ class MeritUnitTest < ActiveSupport::TestCase
4
+ test 'extends only meritable models' do
5
+ assert User.method_defined?(:points), 'has_merit adds methods'
6
+ assert !Address.method_defined?(:points), 'other models aren\'t extended'
7
+ end
8
+
9
+ test 'Badges get "related_models" methods' do
10
+ Comment.new; User.new # load meritable classes
11
+ assert Merit::Badge.method_defined?(:comments), 'Badge#comments should be defined'
12
+ assert Merit::Badge.method_defined?(:users), 'Badge#users should be defined'
13
+ end
14
+
15
+ test 'unknown ranking raises exception' do
16
+ class WeirdRankRules
17
+ include Merit::RankRulesMethods
18
+ def initialize
19
+ set_rank level: 1, to: User, level_name: :clown
20
+ end
21
+ end
22
+ assert_raises Merit::RankAttributeNotDefined do
23
+ WeirdRankRules.new.check_rank_rules
24
+ end
25
+ end
26
+
27
+ test 'Badge#custom_fields_hash saves correctly' do
28
+ Merit::Badge.create(id: 99,
29
+ name: 'test-badge',
30
+ custom_fields: { key_1: 'value1' })
31
+ assert_equal 'value1', Merit::Badge.find(99).custom_fields[:key_1]
32
+ end
33
+ end
@@ -0,0 +1,57 @@
1
+ require 'test_helper'
2
+
3
+ describe Merit::Rule do
4
+ before do
5
+ @rule = Merit::Rule.new
6
+ end
7
+
8
+ describe '#applies (with block)' do
9
+ before do
10
+ @rule.block = ->(obj) { obj.length < 4 }
11
+ end
12
+
13
+ it 'truthy block should make rule apply' do
14
+ _(@rule.applies?('str')).must_be :==, true
15
+ end
16
+
17
+ it 'falsy block should make rule fail' do
18
+ _(@rule.applies?('string')).must_be :==, false
19
+ end
20
+
21
+ it 'block needs parameter for rule to pass' do
22
+ _(@rule.applies?).must_be :==, false
23
+ end
24
+ end
25
+
26
+ describe '#applies (without block)' do
27
+ it 'empty condition should make rule apply' do
28
+ _(@rule.applies?).must_be :==, true
29
+ end
30
+ end
31
+
32
+ describe '#badge' do
33
+ it 'raises exception on inexistent badge' do
34
+ @rule.badge_name = 'inexistent'
35
+ _(-> { @rule.badge }).must_raise Merit::BadgeNotFound
36
+ end
37
+
38
+ it 'finds related badge by name, when the name is a string' do
39
+ Merit::Badge.create(id: 98, name: 'test-badge-98')
40
+ @rule.badge_name = "test-badge-98"
41
+ _(@rule.badge).must_be :==, Merit::Badge.find(98)
42
+ end
43
+
44
+ it 'finds related badge by name, when the name is a symbol' do
45
+ Merit::Badge.create(id: 100, name: :testbadge)
46
+ @rule.badge_name = 'testbadge'
47
+ _(@rule.badge).must_be :==, Merit::Badge.find(100)
48
+ @rule.badge
49
+ end
50
+
51
+ it 'finds related badge by name' do
52
+ Merit::Badge.create(id: 98, name: 'test-badge-98')
53
+ @rule.badge_id = 98
54
+ _(@rule.badge).must_be :==, Merit::Badge.find(98)
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,37 @@
1
+ require 'test_helper'
2
+
3
+ describe Merit::RulesMatcher do
4
+
5
+ describe 'rules actions are treated as a regexp' do
6
+ it 'selects matching rules (suffix)' do
7
+ matcher = Merit::RulesMatcher.new('comments', 'update')
8
+ selected = matcher.select_from(
9
+ 'comments#update' => 'comments#update',
10
+ 'comments#up' => 'comments#up',
11
+ 'comments#up$' => 'comments#up$',
12
+ 'comments#up.+$' => 'comments#up.+$',
13
+ )
14
+ _(selected).must_be :==, ['comments#update', 'comments#up.+$']
15
+
16
+ matcher = Merit::RulesMatcher.new('comments', 'up')
17
+ selected = matcher.select_from(
18
+ 'comments#update' => 'comments#update',
19
+ 'comments#up' => 'comments#up',
20
+ 'comments#up$' => 'comments#up$',
21
+ 'comments#up.+$' => 'comments#up.+$',
22
+ )
23
+ _(selected).must_be :==, ['comments#up', 'comments#up$']
24
+ end
25
+
26
+ it 'selects matching rules (prefix)' do
27
+ matcher = Merit::RulesMatcher.new('/posts/1/comments', 'create')
28
+ selected = matcher.select_from(
29
+ 'comments#create' => 'comments#create',
30
+ '^comments#create' => '^comments#create',
31
+ '^.*/comments#create' => '^.*/comments#create',
32
+ )
33
+ _(selected).must_be :==, ['^.*/comments#create']
34
+ end
35
+ end
36
+
37
+ end
@@ -0,0 +1,27 @@
1
+ require 'test_helper'
2
+
3
+ describe Merit::SashFinder do
4
+ it 'should return an array of sashes of the target objects' do
5
+ sash_1 = Merit::Sash.new
6
+ user_1 = User.new
7
+ user_1.stubs(:_sash).returns(sash_1)
8
+
9
+ sash_2 = Merit::Sash.new
10
+ user_2 = User.new
11
+ user_2.stubs(:_sash).returns(sash_2)
12
+
13
+ # TODO: With stub we are not exercising compact
14
+ # object_without_sash = OpenStruct.new
15
+ # users = [user_1, user_2, object_without_sash]
16
+ users = [user_1, user_2]
17
+
18
+ rule = Merit::Rule.new
19
+ action = Merit::Action.new
20
+
21
+ Merit::SashFinder.stubs(:targets).returns(users)
22
+ sashes = Merit::SashFinder.find(rule, action)
23
+ _(sashes.count).must_be :==, 2
24
+ _(sashes).must_include sash_1
25
+ _(sashes).must_include sash_2
26
+ end
27
+ end
@@ -0,0 +1,104 @@
1
+ require 'test_helper'
2
+
3
+ class SashTest < ActiveSupport::TestCase
4
+ before do
5
+ @custom_category = 'custom_category'
6
+ @sash = Merit::Sash.create
7
+ end
8
+
9
+ describe "#add_points" do
10
+ describe "when category specified" do
11
+ it "should create a new Point with specified category" do
12
+ @sash.add_points 5, category: @custom_category
13
+ score = Merit::Score.last
14
+ point = score.score_points.last
15
+
16
+ assert_equal point.num_points, 5
17
+ assert_equal score.category, @custom_category
18
+ end
19
+ end
20
+
21
+ it "should create a new Point in category default with specified number of points" do
22
+ assert_difference("Merit::Score::Point.count", 1) do
23
+ @sash.add_points 5
24
+ end
25
+ score = Merit::Score.last
26
+ point = score.score_points.last
27
+
28
+ assert_equal point.num_points, 5
29
+ assert_equal score.category, 'default'
30
+ end
31
+ end
32
+
33
+ describe "#subtract_points" do
34
+ describe "when category specified" do
35
+ it "should create a new Point with specified category" do
36
+ @sash.subtract_points 5, category: @custom_category
37
+ score = Merit::Score.last
38
+ point = score.score_points.last
39
+
40
+ assert_equal point.num_points, -5
41
+ assert_equal score.category, @custom_category
42
+ end
43
+ end
44
+
45
+ it "should create a new Point in category default with inverse of specified number of points" do
46
+ assert_difference("Merit::Score::Point.count", 1) do
47
+ @sash.subtract_points 5
48
+ end
49
+ score = Merit::Score.last
50
+ point = score.score_points.last
51
+
52
+ assert_equal point.num_points, -5
53
+ assert_equal score.category, 'default'
54
+ end
55
+ end
56
+
57
+ describe "#points" do
58
+ before do
59
+ @sash.add_points 5, category: @custom_category
60
+ @sash.add_points 7
61
+ end
62
+
63
+ describe "when category specified" do
64
+ it "should retrieve the number of points of the category" do
65
+ assert_equal 5, @sash.points(category: @custom_category)
66
+ end
67
+ end
68
+
69
+ it "should retrieve the sum of points of all categories" do
70
+ assert_equal 12, @sash.points
71
+ end
72
+ end
73
+
74
+ describe "#score_points" do
75
+ before do
76
+ @point1 = @sash.add_points 5, category: @custom_category
77
+ @point2 = @sash.add_points 7
78
+ end
79
+
80
+ describe "when category specified" do
81
+ it "should return the points of the category" do
82
+ assert_equal 1, @sash.score_points(category: @custom_category).size
83
+ scores = @sash.score_points(category: @custom_category)
84
+ assert scores.include? @point1
85
+ assert !scores.include?(@point2)
86
+ end
87
+
88
+ it "should return no Points if category doesn't exist" do
89
+ assert_equal 0, @sash.score_points(category: 'non-existing').size
90
+ end
91
+ end
92
+
93
+ it "should return all points" do
94
+ assert_equal 2, @sash.score_points.size
95
+ assert @sash.score_points.include? @point1
96
+ assert @sash.score_points.include? @point2
97
+ end
98
+
99
+ it "should return no Points if no points found" do
100
+ @sash1 = Merit::Sash.create
101
+ assert_equal 0, @sash1.score_points.size
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,13 @@
1
+ require 'test_helper'
2
+
3
+ describe Merit::Score do
4
+ it 'Point#sash_id delegates to Score' do
5
+ score = Merit::Score.new
6
+ score.sash_id = 33
7
+
8
+ point = Merit::Score::Point.new
9
+ point.score = score
10
+
11
+ _(point.sash_id).must_be :==, score.sash_id
12
+ end
13
+ end
@@ -0,0 +1,98 @@
1
+ require 'test_helper'
2
+
3
+ describe Merit::TargetFinder do
4
+ describe '#find' do
5
+ describe 'rule#to is :itself' do
6
+ it 'should return the base target' do
7
+ rule = Merit::Rule.new
8
+ rule.to = :itself
9
+ action = Merit::Action.new
10
+
11
+ comment = Comment.new
12
+
13
+ Merit::BaseTargetFinder
14
+ .stubs(:find)
15
+ .with(rule, action)
16
+ .returns(comment)
17
+
18
+ finder = Merit::TargetFinder.new(rule, action)
19
+ collection = finder.find
20
+ _(collection.size).must_be :==, 1
21
+ _(collection).must_include comment
22
+ end
23
+ end
24
+
25
+ describe 'rule#to is :action_user' do
26
+ before do
27
+ Merit.setup { |config| config.user_model_name = 'User' }
28
+ end
29
+ after do
30
+ Merit.setup { |config| config.user_model_name = 'User' }
31
+ end
32
+
33
+ it 'should return an array including user that executed the action' do
34
+ rule = Merit::Rule.new
35
+ rule.to = :action_user
36
+ action = Merit::Action.new(user_id: 22)
37
+ user = User.new
38
+
39
+ User.stubs(:find_by_id).with(22).returns(user)
40
+
41
+ finder = Merit::TargetFinder.new(rule, action)
42
+ collection = finder.find
43
+ _(collection.size).must_be :==, 1
44
+ _(collection).must_include user
45
+ end
46
+
47
+ describe 'when user does not exist' do
48
+ it 'should return warn and return an empty array' do
49
+ rule = Merit::Rule.new
50
+ rule.to = :action_user
51
+ action = Merit::Action.new(user_id: 22)
52
+
53
+ Rails.logger.expects(:warn).with('[merit] no User found with id 22')
54
+ finder = Merit::TargetFinder.new(rule, action)
55
+ _(finder.find).must_be_empty
56
+ end
57
+ end
58
+ end
59
+
60
+ describe 'rule#to is defined but neither :itself or :action_user' do
61
+ it 'should return the corresponding object on the original target' do
62
+ rule = Merit::Rule.new
63
+ rule.to = :user
64
+ rule.model_name = 'comments'
65
+ action = Merit::Action.new(target_id: 40)
66
+
67
+ user = User.new
68
+ comment = Comment.new
69
+ comment.stubs(:user).returns(user)
70
+ Comment.stubs(:find_by_id).with(40).returns(comment)
71
+
72
+ finder = Merit::TargetFinder.new(rule, action)
73
+ collection = finder.find
74
+ _(collection.size).must_be :==, 1
75
+ _(collection).must_include user
76
+ end
77
+
78
+ describe 'rule#to does not exist as a method on the original target' do
79
+ it 'should warn and return an empty array' do
80
+ rule = Merit::Rule.new
81
+ rule.to = :non_existent
82
+ rule.model_name = 'comments'
83
+ action = Merit::Action.new(target_id: 40)
84
+
85
+ comment = Comment.new
86
+ Comment.stubs(:find_by_id).with(40).returns(comment)
87
+
88
+ str = '[merit] NoMethodError on `Comment#non_existent`'
89
+ str << ' (called from Merit::TargetFinder#other_target)'
90
+
91
+ Rails.logger.expects(:warn).with(str)
92
+ finder = Merit::TargetFinder.new(rule, action)
93
+ _(finder.find).must_be_empty
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
metadata ADDED
@@ -0,0 +1,360 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: qalam_merit
3
+ version: !ruby/object:Gem::Version
4
+ version: 4.0.4
5
+ platform: ruby
6
+ authors:
7
+ - Tute Costa
8
+ - Ahmed Abdelhamid
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2021-02-21 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: zeitwerk
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: rails
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: 5.1.6
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: 5.1.6
42
+ - !ruby/object:Gem::Dependency
43
+ name: capybara
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: simplecov
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: rubocop
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: minitest-rails
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: mocha
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ description: Manage badges, points and rankings (reputation) in your Rails app.
113
+ email:
114
+ - tutecosta@gmail.com
115
+ - a.hamid@nezam.io
116
+ executables: []
117
+ extensions: []
118
+ extra_rdoc_files: []
119
+ files:
120
+ - CHANGELOG.md
121
+ - CODE_OF_CONDUCT.md
122
+ - Gemfile
123
+ - LICENSE.txt
124
+ - README.md
125
+ - RELEASING.md
126
+ - Rakefile
127
+ - TESTING.txt
128
+ - config/locales/en.yml
129
+ - lib/merit.rb
130
+ - lib/merit/badge_rules_methods.rb
131
+ - lib/merit/base_target_finder.rb
132
+ - lib/merit/class_methods.rb
133
+ - lib/merit/controller_extensions.rb
134
+ - lib/merit/generators/active_record/install_generator.rb
135
+ - lib/merit/generators/active_record/merit_generator.rb
136
+ - lib/merit/generators/active_record/remove_generator.rb
137
+ - lib/merit/generators/active_record/templates/add_merit_fields_to_model.erb
138
+ - lib/merit/generators/active_record/templates/create_badges_sashes.erb
139
+ - lib/merit/generators/active_record/templates/create_merit_actions.erb
140
+ - lib/merit/generators/active_record/templates/create_merit_activity_logs.erb
141
+ - lib/merit/generators/active_record/templates/create_merit_badges.erb
142
+ - lib/merit/generators/active_record/templates/create_sashes.erb
143
+ - lib/merit/generators/active_record/templates/create_scores_and_points.erb
144
+ - lib/merit/generators/active_record/templates/remove_merit_fields_from_model.erb
145
+ - lib/merit/generators/active_record/templates/remove_merit_tables.erb
146
+ - lib/merit/generators/install_generator.rb
147
+ - lib/merit/generators/merit_generator.rb
148
+ - lib/merit/generators/remove_generator.rb
149
+ - lib/merit/generators/templates/badge.erb
150
+ - lib/merit/generators/templates/merit.erb
151
+ - lib/merit/generators/templates/merit_badge_rules.erb
152
+ - lib/merit/generators/templates/merit_point_rules.erb
153
+ - lib/merit/generators/templates/merit_rank_rules.erb
154
+ - lib/merit/generators/templates/qalam_badge_sash.erb
155
+ - lib/merit/generators/templates/qalam_sash.erb
156
+ - lib/merit/judge.rb
157
+ - lib/merit/models/action_concern.rb
158
+ - lib/merit/models/active_record/action.rb
159
+ - lib/merit/models/active_record/activity_log.rb
160
+ - lib/merit/models/active_record/badges_sash.rb
161
+ - lib/merit/models/active_record/sash.rb
162
+ - lib/merit/models/active_record/score.rb
163
+ - lib/merit/models/badges_sash_concern.rb
164
+ - lib/merit/models/base/badges_sash.rb
165
+ - lib/merit/models/base/sash.rb
166
+ - lib/merit/models/sash_concern.rb
167
+ - lib/merit/point_rules_methods.rb
168
+ - lib/merit/rank_rules_methods.rb
169
+ - lib/merit/reputation_change_observer.rb
170
+ - lib/merit/rule.rb
171
+ - lib/merit/rules_matcher.rb
172
+ - lib/merit/sash_finder.rb
173
+ - lib/merit/target_finder.rb
174
+ - qalam_merit.gemspec
175
+ - test/dummy/Rakefile
176
+ - test/dummy/app/controllers/admin/users_controller.rb
177
+ - test/dummy/app/controllers/api/comments_controller.rb
178
+ - test/dummy/app/controllers/api/users_controller.rb
179
+ - test/dummy/app/controllers/application_controller.rb
180
+ - test/dummy/app/controllers/comments_controller.rb
181
+ - test/dummy/app/controllers/registrations_controller.rb
182
+ - test/dummy/app/controllers/users_controller.rb
183
+ - test/dummy/app/helpers/application_helper.rb
184
+ - test/dummy/app/models/address.rb
185
+ - test/dummy/app/models/comment.rb
186
+ - test/dummy/app/models/dummy_observer.rb
187
+ - test/dummy/app/models/merit/badge_rules.rb
188
+ - test/dummy/app/models/merit/point_rules.rb
189
+ - test/dummy/app/models/merit/rank_rules.rb
190
+ - test/dummy/app/models/user.rb
191
+ - test/dummy/app/views/admin/users/index.html.erb
192
+ - test/dummy/app/views/comments/_form.html.erb
193
+ - test/dummy/app/views/comments/edit.html.erb
194
+ - test/dummy/app/views/comments/index.html.erb
195
+ - test/dummy/app/views/comments/new.html.erb
196
+ - test/dummy/app/views/comments/show.html.erb
197
+ - test/dummy/app/views/layouts/application.html.erb
198
+ - test/dummy/app/views/users/_form.html.erb
199
+ - test/dummy/app/views/users/edit.html.erb
200
+ - test/dummy/app/views/users/index.html.erb
201
+ - test/dummy/app/views/users/new.html.erb
202
+ - test/dummy/app/views/users/show.html.erb
203
+ - test/dummy/config.ru
204
+ - test/dummy/config/application.rb
205
+ - test/dummy/config/application_api_only.rb
206
+ - test/dummy/config/boot.rb
207
+ - test/dummy/config/database.yml
208
+ - test/dummy/config/environment.rb
209
+ - test/dummy/config/environment_api_only.rb
210
+ - test/dummy/config/environments/development.rb
211
+ - test/dummy/config/environments/production.rb
212
+ - test/dummy/config/environments/test.rb
213
+ - test/dummy/config/initializers/backtrace_silencers.rb
214
+ - test/dummy/config/initializers/inflections.rb
215
+ - test/dummy/config/initializers/merit.rb
216
+ - test/dummy/config/initializers/mime_types.rb
217
+ - test/dummy/config/initializers/new_framework_defaults.rb
218
+ - test/dummy/config/initializers/secret_token.rb
219
+ - test/dummy/config/initializers/session_store.rb
220
+ - test/dummy/config/locales/en.yml
221
+ - test/dummy/config/mongoid.yml
222
+ - test/dummy/config/routes.rb
223
+ - test/dummy/db/migrate/20110421191249_create_users.rb
224
+ - test/dummy/db/migrate/20110421191250_create_comments.rb
225
+ - test/dummy/db/migrate/20120318022220_add_fields_to_users.rb
226
+ - test/dummy/db/migrate/20130321082817_add_fields_to_comments.rb
227
+ - test/dummy/db/migrate/20130329224406_create_merit_actions.rb
228
+ - test/dummy/db/migrate/20130329224407_create_merit_activity_logs.rb
229
+ - test/dummy/db/migrate/20130329224408_create_sashes.rb
230
+ - test/dummy/db/migrate/20130329224409_create_badges_sashes.rb
231
+ - test/dummy/db/migrate/20130329224410_create_scores_and_points.rb
232
+ - test/dummy/db/migrate/20140211144001_create_addresses.rb
233
+ - test/dummy/db/migrate/20140819133931_add_target_data_to_merit_actions.rb
234
+ - test/dummy/db/schema.rb
235
+ - test/dummy/db/seeds.rb
236
+ - test/dummy/public/404.html
237
+ - test/dummy/public/422.html
238
+ - test/dummy/public/500.html
239
+ - test/dummy/public/favicon.ico
240
+ - test/dummy/public/rails.js
241
+ - test/dummy/public/stylesheets/.gitkeep
242
+ - test/dummy/public/stylesheets/scaffold.css
243
+ - test/dummy/script/rails
244
+ - test/integration/navigation_test.rb
245
+ - test/support/integration_case.rb
246
+ - test/test_helper.rb
247
+ - test/unit/action_test.rb
248
+ - test/unit/base_target_finder_test.rb
249
+ - test/unit/merit_unit_test.rb
250
+ - test/unit/rule_unit_test.rb
251
+ - test/unit/rules_matcher_test.rb
252
+ - test/unit/sash_finder_test.rb
253
+ - test/unit/sash_test.rb
254
+ - test/unit/score_test.rb
255
+ - test/unit/target_finder_test.rb
256
+ homepage: https://github.com/merit-gem/merit
257
+ licenses:
258
+ - MIT
259
+ metadata: {}
260
+ post_install_message:
261
+ rdoc_options: []
262
+ require_paths:
263
+ - lib
264
+ required_ruby_version: !ruby/object:Gem::Requirement
265
+ requirements:
266
+ - - ">="
267
+ - !ruby/object:Gem::Version
268
+ version: 2.3.0
269
+ required_rubygems_version: !ruby/object:Gem::Requirement
270
+ requirements:
271
+ - - ">="
272
+ - !ruby/object:Gem::Version
273
+ version: '0'
274
+ requirements: []
275
+ rubygems_version: 3.2.3
276
+ signing_key:
277
+ specification_version: 4
278
+ summary: Reputation engine for Rails apps
279
+ test_files:
280
+ - test/dummy/Rakefile
281
+ - test/dummy/app/controllers/admin/users_controller.rb
282
+ - test/dummy/app/controllers/api/comments_controller.rb
283
+ - test/dummy/app/controllers/api/users_controller.rb
284
+ - test/dummy/app/controllers/application_controller.rb
285
+ - test/dummy/app/controllers/comments_controller.rb
286
+ - test/dummy/app/controllers/registrations_controller.rb
287
+ - test/dummy/app/controllers/users_controller.rb
288
+ - test/dummy/app/helpers/application_helper.rb
289
+ - test/dummy/app/models/address.rb
290
+ - test/dummy/app/models/comment.rb
291
+ - test/dummy/app/models/dummy_observer.rb
292
+ - test/dummy/app/models/merit/badge_rules.rb
293
+ - test/dummy/app/models/merit/point_rules.rb
294
+ - test/dummy/app/models/merit/rank_rules.rb
295
+ - test/dummy/app/models/user.rb
296
+ - test/dummy/app/views/admin/users/index.html.erb
297
+ - test/dummy/app/views/comments/_form.html.erb
298
+ - test/dummy/app/views/comments/edit.html.erb
299
+ - test/dummy/app/views/comments/index.html.erb
300
+ - test/dummy/app/views/comments/new.html.erb
301
+ - test/dummy/app/views/comments/show.html.erb
302
+ - test/dummy/app/views/layouts/application.html.erb
303
+ - test/dummy/app/views/users/_form.html.erb
304
+ - test/dummy/app/views/users/edit.html.erb
305
+ - test/dummy/app/views/users/index.html.erb
306
+ - test/dummy/app/views/users/new.html.erb
307
+ - test/dummy/app/views/users/show.html.erb
308
+ - test/dummy/config.ru
309
+ - test/dummy/config/application.rb
310
+ - test/dummy/config/application_api_only.rb
311
+ - test/dummy/config/boot.rb
312
+ - test/dummy/config/database.yml
313
+ - test/dummy/config/environment.rb
314
+ - test/dummy/config/environment_api_only.rb
315
+ - test/dummy/config/environments/development.rb
316
+ - test/dummy/config/environments/production.rb
317
+ - test/dummy/config/environments/test.rb
318
+ - test/dummy/config/initializers/backtrace_silencers.rb
319
+ - test/dummy/config/initializers/inflections.rb
320
+ - test/dummy/config/initializers/merit.rb
321
+ - test/dummy/config/initializers/mime_types.rb
322
+ - test/dummy/config/initializers/new_framework_defaults.rb
323
+ - test/dummy/config/initializers/secret_token.rb
324
+ - test/dummy/config/initializers/session_store.rb
325
+ - test/dummy/config/locales/en.yml
326
+ - test/dummy/config/mongoid.yml
327
+ - test/dummy/config/routes.rb
328
+ - test/dummy/db/migrate/20110421191249_create_users.rb
329
+ - test/dummy/db/migrate/20110421191250_create_comments.rb
330
+ - test/dummy/db/migrate/20120318022220_add_fields_to_users.rb
331
+ - test/dummy/db/migrate/20130321082817_add_fields_to_comments.rb
332
+ - test/dummy/db/migrate/20130329224406_create_merit_actions.rb
333
+ - test/dummy/db/migrate/20130329224407_create_merit_activity_logs.rb
334
+ - test/dummy/db/migrate/20130329224408_create_sashes.rb
335
+ - test/dummy/db/migrate/20130329224409_create_badges_sashes.rb
336
+ - test/dummy/db/migrate/20130329224410_create_scores_and_points.rb
337
+ - test/dummy/db/migrate/20140211144001_create_addresses.rb
338
+ - test/dummy/db/migrate/20140819133931_add_target_data_to_merit_actions.rb
339
+ - test/dummy/db/schema.rb
340
+ - test/dummy/db/seeds.rb
341
+ - test/dummy/public/404.html
342
+ - test/dummy/public/422.html
343
+ - test/dummy/public/500.html
344
+ - test/dummy/public/favicon.ico
345
+ - test/dummy/public/rails.js
346
+ - test/dummy/public/stylesheets/.gitkeep
347
+ - test/dummy/public/stylesheets/scaffold.css
348
+ - test/dummy/script/rails
349
+ - test/integration/navigation_test.rb
350
+ - test/support/integration_case.rb
351
+ - test/test_helper.rb
352
+ - test/unit/action_test.rb
353
+ - test/unit/base_target_finder_test.rb
354
+ - test/unit/merit_unit_test.rb
355
+ - test/unit/rule_unit_test.rb
356
+ - test/unit/rules_matcher_test.rb
357
+ - test/unit/sash_finder_test.rb
358
+ - test/unit/sash_test.rb
359
+ - test/unit/score_test.rb
360
+ - test/unit/target_finder_test.rb