lib/inch/evaluation/base.rb in inch-0.1.4 vs lib/inch/evaluation/base.rb in inch-0.2.0
- old
+ new
@@ -7,33 +7,40 @@
MIN_SCORE = 0
MAX_SCORE = 100
TAGGED_SCORE = 20 # assigned per unconsidered tag
-
+ # @return [CodeObject::Proxy::Base]
attr_accessor :object
+
attr_reader :min_score, :max_score
+ # @param object [CodeObject::Proxy::Base]
def initialize(object)
self.object = object
@roles = []
evaluate
end
+ # Evaluates the objects and assigns roles
+ # @abstract
def evaluate
end
+ # @return [Float]
def max_score
arr = @roles.map(&:max_score).compact
[MAX_SCORE].concat(arr).min
end
+ # @return [Float]
def min_score
arr = @roles.map(&:min_score).compact
[MIN_SCORE].concat(arr).max
end
+ # @return [Float]
def score
value = @roles.inject(0) { |sum,r| sum + r.score.to_f }
if value < min_score
min_score
elsif value > max_score
@@ -41,21 +48,58 @@
else
value
end
end
+ # @return [Fixnum]
def priority
@roles.inject(0) { |sum,r| sum + r.priority.to_i }
end
+ # @return [Array<Evaluation::Role::Base>]
def roles
@roles
end
+ class << self
+ attr_reader :criteria_map
+
+ # Defines the weights during evaluation for different criteria
+ #
+ # MethodObject.criteria do
+ # docstring 0.5
+ # parameters 0.4
+ # return_type 0.1
+ #
+ # if object.constructor?
+ # parameters 0.5
+ # return_type 0.0
+ # end
+ # end
+ #
+ # @return [void]
+ def criteria(&block)
+ @criteria_map ||= {}
+ @criteria_map[to_s] ||= Criteria.new(&block)
+ end
+ end
+
protected
def add_role(role)
@roles << role
+ end
+
+ def criteria
+ @criteria ||= begin
+ c = self.class.criteria_map[self.class.to_s]
+ c.evaluate(object)
+ c
+ end
+ end
+
+ def score_for(criteria_name)
+ criteria.send(criteria_name) * MAX_SCORE
end
end
end
end