forked from merit-gem/merit
/
merit.rb
108 lines (92 loc) · 2.84 KB
/
merit.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
require 'merit/rule'
require 'merit/rules_badge_methods'
require 'merit/rules_points_methods'
require 'merit/rules_rank_methods'
require 'merit/rules_matcher'
require 'merit/controller_extensions'
require 'merit/model_additions'
require 'merit/judge'
require 'merit/reputation_change_observer'
require 'merit/sash_finder'
require 'merit/base_target_finder'
require 'merit/target_finder'
module Merit
def self.setup
@config ||= Configuration.new
yield @config if block_given?
end
# Check rules on each request
def self.checks_on_each_request
@config.checks_on_each_request
end
# # Define ORM
def self.orm
@config.orm || :active_record
end
# Define user_model_name
def self.user_model
@config.user_model_name.constantize
end
# Define current_user_method
def self.current_user_method
@config.current_user_method || "current_#{@config.user_model_name.downcase}".to_sym
end
def self.observers
@config.observers
end
# @param class_name [String] The string version of observer class
def self.add_observer(class_name)
@config.add_observer(class_name)
end
class Configuration
attr_accessor :checks_on_each_request, :orm, :user_model_name, :observers,
:current_user_method
def initialize
@checks_on_each_request = true
@orm = :active_record
@user_model_name = 'User'
@observers = []
end
def add_observer(class_name)
@observers << class_name
end
end
setup
add_observer('Merit::ReputationChangeObserver')
class BadgeNotFound < Exception; end
class RankAttributeNotDefined < Exception; end
class Engine < Rails::Engine
config.app_generators.orm Merit.orm
initializer 'merit.controller' do |app|
require_models
extend_orm_with_has_merit
ActiveSupport.on_load(:action_controller) do
begin
# Load app rules on boot up
Merit::AppBadgeRules = Merit::BadgeRules.new.defined_rules
Merit::AppPointRules = Merit::PointRules.new.defined_rules
include Merit::ControllerExtensions
rescue NameError => e
# Trap NameError if installing/generating files
raise e unless e.to_s =~ /uninitialized constant Merit::BadgeRules/
end
end
end
def require_models
require 'merit/models/base/merit/sash'
require 'merit/models/base/merit/badges_sash'
require "merit/models/#{Merit.orm}/merit/activity_log"
require "merit/models/#{Merit.orm}/merit/badges_sash"
require "merit/models/#{Merit.orm}/merit/sash"
require "merit/models/#{Merit.orm}/merit/score"
end
def extend_orm_with_has_merit
if Object.const_defined?('ActiveRecord')
ActiveRecord::Base.send :include, Merit
end
if Object.const_defined?('Mongoid')
Mongoid::Document.send :include, Merit
end
end
end
end