-
Notifications
You must be signed in to change notification settings - Fork 1
/
scriptlines.rb
71 lines (64 loc) · 1.73 KB
/
scriptlines.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# scriptlines.rb
# A ScriptLines instance analyses a Ruby script and maintains
# counters for the total number of lines, lines of
# code, etc.
class ScriptLines
attr_reader :name
attr_accessor :bytes, :lines, :lines_of_code, :comment_lines
LINE_FORMAT = '%8s %8s %8s %8s %s'
def self.headline
sprintf LINE_FORMAT, "BYTES", "LINES", "LOC", "COMMENT", "FILE"
end
# The 'name' argument is usually a filename
def initialize(name)
@name = name
@bytes = 0
@lines = 0 # total number of lines
@lines_of_code = 0
@comment_lines = 0
end
# Iterates over all the lines in io (io might be a file or a
# string), analyses them and appropriately increases the counter
# attributes.
def read(io)
in_multiline_comment = false
io.each { |line|
@lines += 1
@bytes += line.size
case line
when /^=begin(\s|$)/
in_multiline_comment = true
@comment_lines += 1
when /^=end(\s|$)/:
@comment_lines += 1
in_multiline_comment = false
when /^\s*#/
@comment_lines += 1
when /^\s*$/
# empty/whitespace only line
else
if in_multiline_comment
@comment_lines += 1
else
@lines_of_code += 1
end
end
}
end
# Get a new ScriptLines instance whose counters hold the
# sum of self and other.
def +(other)
sum = self.dup
sum.bytes += other.bytes
sum.lines += other.lines
sum.lines_of_code += other.lines_of_code
sum.comment_lines += other.comment_lines
sum
end
# Get a formatted string containing all counter numbers and the
# name of this instance.
def to_s
sprintf LINE_FORMAT,
@bytes, @lines, @lines_of_code, @comment_lines, @name
end
end