Sha256: 7f227b1665bf066dbbb905df316f663d7f1194e93d0df177d2b39557cdd8c13c

Contents?: true

Size: 1.18 KB

Versions: 5

Compression:

Stored size: 1.18 KB

Contents

require "rubycritic/source_locator"
require "rubycritic/core/analysed_module"

module Rubycritic
  class AnalysedModulesCollection
    include Enumerable

    # Limit used to prevent very bad modules to have excessive impact in the
    # overall result. See #limited_cost_for
    COST_LIMIT = 32
    # Score goes from 0 (worst) to 100 (perfect)
    MAX_SCORE = 100
    # Projects with an average cost of 16 (or above) will score 0, since 16
    # is where the worst possible rating (F) starts
    ZERO_SCORE_COST = 16
    COST_MULTIPLIER = MAX_SCORE.to_f / ZERO_SCORE_COST

    def initialize(paths)
      @modules = SourceLocator.new(paths).pathnames.map do |pathname|
        AnalysedModule.new(:pathname => pathname)
      end
    end

    def each(&block)
      @modules.each(&block)
    end

    def to_json(*options)
      @modules.to_json(*options)
    end

    def score
      MAX_SCORE - average_limited_cost * COST_MULTIPLIER
    rescue
      0.0
    end

    private

    def average_limited_cost
      avg = map { |mod| limited_cost_for(mod) }.reduce(:+) / @modules.size.to_f
      [avg, ZERO_SCORE_COST].min
    end

    def limited_cost_for(mod)
      [mod.cost, COST_LIMIT].min
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
rubycritic-2.6.0 lib/rubycritic/core/analysed_modules_collection.rb
rubycritic-2.5.0 lib/rubycritic/core/analysed_modules_collection.rb
rubycritic-2.4.1 lib/rubycritic/core/analysed_modules_collection.rb
rubycritic-2.4.0 lib/rubycritic/core/analysed_modules_collection.rb
rubycritic-2.3.0 lib/rubycritic/core/analysed_modules_collection.rb