Class: CodeMetrics::StatisticsCalculator

Inherits:
Object
  • Object
show all
Defined in:
lib/code_metrics/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]/,
  },
  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) ⇒ StatisticsCalculator

Returns a new instance of StatisticsCalculator.



28
29
30
31
32
33
# File 'lib/code_metrics/statistics_calculator.rb', line 28

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.



3
4
5
# File 'lib/code_metrics/statistics_calculator.rb', line 3

def classes
  @classes
end

#code_linesObject (readonly)

Returns the value of attribute code_lines.



3
4
5
# File 'lib/code_metrics/statistics_calculator.rb', line 3

def code_lines
  @code_lines
end

#linesObject (readonly)

Returns the value of attribute lines.



3
4
5
# File 'lib/code_metrics/statistics_calculator.rb', line 3

def lines
  @lines
end

#methodsObject (readonly)

Returns the value of attribute methods.



3
4
5
# File 'lib/code_metrics/statistics_calculator.rb', line 3

def methods
  @methods
end

Instance Method Details

#add(code_metrics_calculator) ⇒ Object



35
36
37
38
39
40
# File 'lib/code_metrics/statistics_calculator.rb', line 35

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

#add_by_file_path(file_path) ⇒ Object



42
43
44
45
46
47
# File 'lib/code_metrics/statistics_calculator.rb', line 42

def add_by_file_path(file_path)
  file_flags = 'rb' # for our purposes, reading in binary encoding is sufficient
  File.open(file_path, file_flags) do |f|
    self.add_by_io(f, file_type(file_path))
  end
end

#add_by_io(io, file_type) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/code_metrics/statistics_calculator.rb', line 49

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] && line =~ patterns[:end_block_comment]
        comment_started = false
      end
      next
    else
      if patterns[:begin_block_comment] && line =~ patterns[:begin_block_comment]
        comment_started = true
        next
      end
    end

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