123456789_123456789_123456789_123456789_123456789_

Class: CodeStatisticsCalculator

Do not use. This class is for internal use only.
Relationships & Source Files
Inherits: Object
Defined in: railties/lib/rails/code_statistics_calculator.rb

Constant Summary

  • PATTERNS =
    # File 'railties/lib/rails/code_statistics_calculator.rb', line 6
    {
      rb: {
        line_comment: /^\s*#/,
        begin_block_comment: /^=begin/,
        end_block_comment: /^=end/,
        class: /^\s*class\s+[_A-Z]/,
        method: /^\s*def\s+[_a-z]/,
      },
      erb: {
        line_comment: %r{((^\s*<%#.*%>)|(<!--.*-->))},
      },
      css: {
        line_comment: %r{^\s*/\*.*\*/},
      },
      scss: {
        line_comment: %r{((^\s*/\*.*\*/)|(^\s*//))},
      },
      js: {
        line_comment: %r{^\s*//},
        begin_block_comment: %r{^\s*/\*},
        end_block_comment: %r{\*/},
        method: /function(\s+[_a-zA-Z][\da-zA-Z]*)?\s*\(/,
      },
      coffee: {
        line_comment: /^\s*#/,
        begin_block_comment: /^\s*###/,
        end_block_comment: /^\s*###/,
        class: /^\s*class\s+[_A-Z]/,
        method: /[-=]>/,
      }
    }

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(lines = 0, code_lines = 0, classes = 0, methods = 0) ⇒ CodeStatisticsCalculator

[ GitHub ]

  
# File 'railties/lib/rails/code_statistics_calculator.rb', line 41

def initialize(lines = 0, code_lines = 0, classes = 0, methods = 0)
  @lines = lines
  @code_lines = code_lines
  @classes = classes
  @methods = methods
end

Instance Attribute Details

#classes (readonly)

[ GitHub ]

  
# File 'railties/lib/rails/code_statistics_calculator.rb', line 4

attr_reader :lines, :code_lines, :classes, :methods

#code_lines (readonly)

[ GitHub ]

  
# File 'railties/lib/rails/code_statistics_calculator.rb', line 4

attr_reader :lines, :code_lines, :classes, :methods

#lines (readonly)

[ GitHub ]

  
# File 'railties/lib/rails/code_statistics_calculator.rb', line 4

attr_reader :lines, :code_lines, :classes, :methods

#methods (readonly)

[ GitHub ]

  
# File 'railties/lib/rails/code_statistics_calculator.rb', line 4

attr_reader :lines, :code_lines, :classes, :methods

Instance Method Details

#add(code_statistics_calculator)

[ GitHub ]

  
# File 'railties/lib/rails/code_statistics_calculator.rb', line 48

def add(code_statistics_calculator)
  @lines += code_statistics_calculator.lines
  @code_lines += code_statistics_calculator.code_lines
  @classes += code_statistics_calculator.classes
  @methods += code_statistics_calculator.methods
end

#add_by_file_path(file_path)

[ GitHub ]

  
# File 'railties/lib/rails/code_statistics_calculator.rb', line 55

def add_by_file_path(file_path)
  File.open(file_path) do |f|
    add_by_io(f, file_type(file_path))
  end
end

#add_by_io(io, file_type)

[ GitHub ]

  
# File 'railties/lib/rails/code_statistics_calculator.rb', line 61

def add_by_io(io, file_type)
  patterns = PATTERNS[file_type] || {}

  comment_started = false

  while line = io.gets
    @lines += 1

    if comment_started
      if patterns[:end_block_comment] && patterns[:end_block_comment].match?(line)
        comment_started = false
      end
      next
    else
      if patterns[:begin_block_comment] && patterns[:begin_block_comment].match?(line)
        comment_started = true
        next
      end
    end

    @classes   += 1 if patterns[:class] && patterns[:class].match?(line)
    @methods   += 1 if patterns[:method] && patterns[:method].match?(line)
    if !line.match?(/^\s*$/) && (patterns[:line_comment].nil? || !line.match?(patterns[:line_comment]))
      @code_lines += 1
    end
  end
end

#file_type(file_path) (private)

[ GitHub ]

  
# File 'railties/lib/rails/code_statistics_calculator.rb', line 90

def file_type(file_path)
  if file_path.end_with? "_test.rb"
    :minitest
  else
    File.extname(file_path).delete_prefix(".").downcase.to_sym
  end
end