Class: CodeStatisticsCalculator

Inherits:
Object
  • Object
show all
Defined in:
railties/lib/rails/code_statistics_calculator.rb

Overview

:nodoc:

Constant Summary collapse

PATTERNS =
{
  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: /[-=]>/,
  }
}

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(lines = 0, code_lines = 0, classes = 0, methods = 0) ⇒ CodeStatisticsCalculator

Returns a new instance of CodeStatisticsCalculator.



41
42
43
44
45
46
# 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

#classesObject (readonly)

Returns the value of attribute classes



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

def classes
  @classes
end

#code_linesObject (readonly)

Returns the value of attribute code_lines



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

def code_lines
  @code_lines
end

#linesObject (readonly)

Returns the value of attribute lines



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

def lines
  @lines
end

#methodsObject (readonly)

Returns the value of attribute methods



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

def methods
  @methods
end

Instance Method Details

#add(code_statistics_calculator) ⇒ Object



48
49
50
51
52
53
# 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) ⇒ Object



55
56
57
58
59
# 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) ⇒ Object



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
# 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