class RubyCritic::AnalysedModulesCollection

Constants

COST_LIMIT

Limit used to prevent very bad modules to have excessive impact in the overall result. See limited_cost_for

COST_MULTIPLIER
MAX_SCORE

Score goes from 0 (worst) to 100 (perfect)

ZERO_SCORE_COST

Projects with an average cost of 16 (or above) will score 0, since 16 is where the worst possible rating (F) starts

Public Class Methods

new(paths, modules = nil) click to toggle source
# File lib/rubycritic/core/analysed_modules_collection.rb, line 20
def initialize(paths, modules = nil)
  @modules = SourceLocator.new(paths).pathnames.map do |pathname|
    if modules
      analysed_module = modules.find { |mod| mod.pathname == pathname }
      build_analysed_module(analysed_module)
    else
      AnalysedModule.new(pathname: pathname)
    end
  end
end

Public Instance Methods

each(&block) click to toggle source
# File lib/rubycritic/core/analysed_modules_collection.rb, line 31
def each(&block)
  @modules.each(&block)
end
find(module_path) click to toggle source
# File lib/rubycritic/core/analysed_modules_collection.rb, line 39
def find(module_path)
  @modules.find { |mod| mod.pathname == module_path }
end
for_rating(rating) click to toggle source
# File lib/rubycritic/core/analysed_modules_collection.rb, line 59
def for_rating(rating)
  find_all { |mod| mod.rating.to_s == rating }
end
score() click to toggle source
# File lib/rubycritic/core/analysed_modules_collection.rb, line 47
def score
  if @modules.any?
    (MAX_SCORE - (average_limited_cost * COST_MULTIPLIER)).round(2)
  else
    0.0
  end
end
summary() click to toggle source
# File lib/rubycritic/core/analysed_modules_collection.rb, line 55
def summary
  AnalysisSummary.generate(self)
end
to_json(*options) click to toggle source
# File lib/rubycritic/core/analysed_modules_collection.rb, line 43
def to_json(*options)
  @modules.to_json(*options)
end
where(module_paths) click to toggle source
# File lib/rubycritic/core/analysed_modules_collection.rb, line 35
def where(module_paths)
  @modules.find_all { |mod| module_paths.include? mod.path }
end

Private Instance Methods

average_cost() click to toggle source
# File lib/rubycritic/core/analysed_modules_collection.rb, line 69
def average_cost
  num_modules = @modules.size
  if num_modules.positive?
    sum { |mod| limited_cost_for(mod) } / num_modules.to_f
  else
    0.0
  end
end
average_limited_cost() click to toggle source
# File lib/rubycritic/core/analysed_modules_collection.rb, line 65
def average_limited_cost
  [average_cost, ZERO_SCORE_COST].min
end
build_analysed_module(analysed_module) click to toggle source
# File lib/rubycritic/core/analysed_modules_collection.rb, line 82
def build_analysed_module(analysed_module)
  AnalysedModule.new(
    pathname: analysed_module.pathname,
    name: analysed_module.name,
    smells: analysed_module.smells,
    churn: analysed_module.churn,
    committed_at: analysed_module.committed_at,
    complexity: analysed_module.complexity,
    duplication: analysed_module.duplication,
    methods_count: analysed_module.methods_count
  )
end
limited_cost_for(mod) click to toggle source
# File lib/rubycritic/core/analysed_modules_collection.rb, line 78
def limited_cost_for(mod)
  [mod.cost, COST_LIMIT].min
end