qalam_merit 4.0.35

Sign up to get free protection for your applications and to get access to all the features.
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 +49 -0
  32. data/lib/merit/generators/templates/badge_sash.erb +21 -0
  33. data/lib/merit/generators/templates/merit.erb +18 -0
  34. data/lib/merit/generators/templates/merit_badge_rules.erb +50 -0
  35. data/lib/merit/generators/templates/merit_point_rules.erb +31 -0
  36. data/lib/merit/generators/templates/merit_rank_rules.erb +32 -0
  37. data/lib/merit/generators/templates/sash.erb +15 -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.35
5
+ platform: ruby
6
+ authors:
7
+ - Tute Costa
8
+ - Ahmed Abdelhamid
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2021-02-15 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/badge_sash.erb
151
+ - lib/merit/generators/templates/merit.erb
152
+ - lib/merit/generators/templates/merit_badge_rules.erb
153
+ - lib/merit/generators/templates/merit_point_rules.erb
154
+ - lib/merit/generators/templates/merit_rank_rules.erb
155
+ - lib/merit/generators/templates/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