countloc 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -60,6 +60,15 @@ To export the results to a csv file:
60
60
 
61
61
 
62
62
  == Release Notes
63
+ === Release 0.3.0:
64
+ Features
65
+ * Added support for generating LOC metrics for languages other than Ruby.
66
+ Supported languages: Ruby, Python, C, C++, C#, Java and any language that
67
+ shares the same commenting style as either of these languages.
68
+
69
+ Bugfixes:
70
+ * Added documentation on supported options for CountLOC.countloc()
71
+
63
72
  === Release 0.2.1:
64
73
  Features
65
74
  * None
@@ -31,7 +31,7 @@ require 'time'
31
31
  #
32
32
  module CountLOC
33
33
 
34
- VERSION = '0.2.1'
34
+ VERSION = '0.3.0'
35
35
 
36
36
  # Class that gathers the metrics.
37
37
  #
@@ -42,11 +42,33 @@ module CountLOC
42
42
  attr_reader :name
43
43
  attr_accessor :code, :comments, :blank, :lines
44
44
 
45
- SINGLE_LINE_FULL_PATTERN = /^\s*#/
46
- SINGLE_LINE_MIXED_PATTERN = /#/
47
- MULTI_LINE_BEGIN_PATTERN = /=begin(\s|$)/
48
- MULTI_LINE_END_PATTERN = /=end(\s|$)/
49
- BLANK_LINE_PATTERN = /^\s*$/
45
+ COMMENT_PATTERNS = {
46
+ :ruby => {
47
+ :single_line_full => /^\s*#/,
48
+ :single_line_mixed => /#/,
49
+ :multiline_begin => /=begin(\s|$)/,
50
+ :multiline_end => /=end(\s|$)/,
51
+ :blank_line => /^\s*$/
52
+ },
53
+
54
+ :python => {
55
+ :single_line_full => /^\s*#/,
56
+ :single_line_mixed => /#/,
57
+ :multiline_begin => /^\s*"""/,
58
+ :multiline_end => /"""/,
59
+ :blank_line => /^\s*$/
60
+ },
61
+
62
+ :cplusplus => {
63
+ :single_line_full => /^\s*\/\//,
64
+ :single_line_mixed => /\/\//,
65
+ :multiline_begin => /\/\*/,
66
+ :multiline_end => /\*\/\s*$/,
67
+ :multiline_begin_mixed => /^[^\s]+.*\/\*/,
68
+ :multiline_end_mixed => /\*\/\s*[^\s]+$/,
69
+ :blank_line => /^\s*$/
70
+ }
71
+ }
50
72
 
51
73
  LINE_FORMAT = '%8s %8s %8s %8s %12s %s'
52
74
 
@@ -64,7 +86,24 @@ module CountLOC
64
86
  def self.columnNames
65
87
  self.headline.split(' ', 6)
66
88
  end
67
-
89
+
90
+ #
91
+ # Retrieve the commenting style that should be used for the given
92
+ # file type.
93
+ #
94
+ def self.commentStyle(ext)
95
+ { ".rb" => :ruby,
96
+ ".py" => :python,
97
+ ".c" => :cplusplus,
98
+ ".cpp" => :cplusplus,
99
+ ".cc" => :cplusplus,
100
+ ".cs" => :cplusplus,
101
+ ".h" => :cplusplus,
102
+ ".hpp" => :cplusplus,
103
+ ".java" => :cplusplus
104
+ }[ext]
105
+ end
106
+
68
107
  def initialize(name)
69
108
  @name = name
70
109
  @code = 0
@@ -77,7 +116,7 @@ module CountLOC
77
116
  # Iterates over all the lines in io (io might be a file or a string),
78
117
  # analyzes them and appropriately increases the counter attributes.
79
118
  #
80
- def read(io)
119
+ def read(io, style)
81
120
  in_multiline_comment = false
82
121
  io.each do |line|
83
122
  @lines += 1
@@ -85,23 +124,53 @@ module CountLOC
85
124
  # Process the line to avoid matching comment characters within quoted
86
125
  # strings or regular expressions.
87
126
  line.gsub!(/\'.*?\'/, "X") # Single quoted string
88
- line.gsub!(/\".*?\"/, "X") # Double quoted string
89
- line.gsub!(/\/.*?\//, "X") # Regular expression
127
+ line.gsub!(/[^\"]\"[^\"]+\"/, "X") # Double quoted string
128
+ if style == :ruby:
129
+ line.gsub!(/\/.*?\//, "X") # Regular expression
130
+ end
90
131
 
132
+ patterns = COMMENT_PATTERNS[style]
133
+
134
+ # In the event where the multiline_end pattern is the same as the
135
+ # multiline_begin pattern, it is necessary to check for the ending
136
+ # pattern first - otherwise we will never detect the ending pattern.
137
+ if in_multiline_comment
138
+ if patterns.include?(:multiline_end_mixed) and
139
+ line =~ patterns[:multiline_end_mixed]
140
+ @comments += 1
141
+ @code += 1
142
+ in_multiline_comment = false
143
+ next
144
+ elsif line =~ patterns[:multiline_end]
145
+ @comments += 1
146
+ in_multiline_comment = false
147
+ next
148
+ end
149
+ end
150
+
91
151
  case line
92
- when MULTI_LINE_BEGIN_PATTERN
93
- in_multiline_comment = true
94
- @comments += 1
95
- when MULTI_LINE_END_PATTERN
96
- in_multiline_comment = false
152
+ when patterns[:multiline_begin]
153
+ in_multiline_comment = true
154
+ if patterns.include?(:multiline_begin_mixed) and
155
+ line =~ patterns[:multiline_begin_mixed]
156
+ @code += 1
157
+ end
158
+
159
+ if line.sub(patterns[:multiline_begin], "X") =~ patterns[:multiline_end]
160
+ in_multiline_comment = false
161
+ end
97
162
  @comments += 1
98
- when BLANK_LINE_PATTERN
163
+
164
+ when patterns[:blank_line]
99
165
  @blank += 1
100
- when SINGLE_LINE_FULL_PATTERN
166
+
167
+ when patterns[:single_line_full]
101
168
  @comments += 1
102
- when SINGLE_LINE_MIXED_PATTERN
169
+
170
+ when patterns[:single_line_mixed]
103
171
  @comments += 1
104
172
  @code += 1
173
+
105
174
  else
106
175
  if in_multiline_comment
107
176
  @comments += 1
@@ -240,20 +309,36 @@ module CountLOC
240
309
 
241
310
  #
242
311
  # Generates LOC metrics for the specified files and sends the results to the console.
243
- #
244
- def countloc(files, options = nil)
312
+ # Supported options:
313
+ # * :recurse - recurse into sub-directories. Default = false.
314
+ # * :csv - write the results to a csv file. Default = false.
315
+ # * :csvFilename - name of csv file to generate. Used with :csv option. Default = countloc.csv
316
+ # * :html - write the results to a html file. Default = false.
317
+ # * :htmlFilename - name of html file to generate. Used with :html option. Default = countloc.html
318
+ # * :quiet - do not output results to stdout
319
+ # * :fileTypes - Types of file to include in the LOC analysis. Used for filtering files
320
+ # in recursive analysis and to specify languages other than Ruby. Default = *.rb
321
+ def countloc(files, options = {})
322
+
323
+ # Setup defaults for filenames
324
+ options[:fileTypes] = ["*.rb"] if not options.include?(:fileTypes)
325
+ options[:csvFilename] = "countloc.csv" if not options.include?(:csvFilename)
326
+ options[:htmlFilename] = "countloc.html" if not options.include?(:htmlFilename)
245
327
 
246
328
  # Setup the output writers based on the options
247
- writers = [ConsoleWriter.new]
248
- writers << CsvFileWriter.new(options.csvFilename) if options.csv
249
- writers << HtmlFileWriter.new(options.htmlFilename) if options.html
329
+ writers = []
330
+ writers << ConsoleWriter.new if not options[:quiet]
331
+ writers << CsvFileWriter.new(options[:csvFilename]) if options[:csv]
332
+ writers << HtmlFileWriter.new(options[:htmlFilename]) if options[:html]
250
333
 
251
334
  # Expand directories into the appropriate file lists
252
335
  dirs = files.select { |filename| File.directory?(filename) }
253
336
  if dirs.size > 0
254
- recursePattern = ("**" if options.recurse) || ""
337
+ recursePattern = ("**" if options[:recurse]) || ""
255
338
  files -= dirs
256
- files += dirs.collect { |dirname| Dir.glob(File.join(dirname, recursePattern, "*.rb"))}.flatten
339
+ options[:fileTypes].each do |fileType|
340
+ files += dirs.collect { |dirname| Dir.glob(File.join(dirname, recursePattern, fileType))}.flatten
341
+ end
257
342
  end
258
343
 
259
344
  # Sum will keep the running total
@@ -267,7 +352,7 @@ module CountLOC
267
352
  begin
268
353
  File.open(filename) do |file|
269
354
  counter = LineCounter.new(filename)
270
- counter.read(file)
355
+ counter.read(file, LineCounter.commentStyle(File.extname(filename)))
271
356
  sum += counter
272
357
  results << counter
273
358
  end
@@ -294,8 +379,6 @@ end # module
294
379
  #
295
380
  if $0 == __FILE__:
296
381
 
297
- require 'ostruct'
298
-
299
382
  class CmdLineOptParser
300
383
 
301
384
  def self.usage
@@ -308,19 +391,14 @@ if $0 == __FILE__:
308
391
  def self.parse(args)
309
392
  # The options set on the command line will be collected in "options"
310
393
  # Setup the defaults here
311
- options = OpenStruct.new
312
- options.recurse = false
313
- options.csv = false
314
- options.csvFilename = ""
315
- options.html = false
316
- options.htmlFilename = ""
317
-
394
+ options = {}
395
+
318
396
  begin
319
397
  OptionParser.new do |opts|
320
398
  opts.banner = usage
321
399
 
322
400
  opts.on('-r', '--recurse', 'Recurse into subdirectories') do
323
- options.recurse = true
401
+ options[:recurse] = true
324
402
  end
325
403
 
326
404
  opts.on('-v', '--version', 'Display version number') do
@@ -328,14 +406,24 @@ if $0 == __FILE__:
328
406
  exit
329
407
  end
330
408
 
409
+ opts.on('-q', '--quiet', "Don't write results to stdout") do
410
+ options[:quiet] = true
411
+ end
412
+
331
413
  opts.on('--csv csvFilename', 'Generate csv file') do |csvFilename|
332
- options.csvFilename = csvFilename
333
- options.csv = true
414
+ options[:csvFilename] = csvFilename
415
+ options[:csv] = true
334
416
  end
335
417
 
336
418
  opts.on('--html htmlFilename', 'Generate html file') do |htmlFilename|
337
- options.htmlFilename = htmlFilename
338
- options.html = true
419
+ options[:htmlFilename] = htmlFilename
420
+ options[:html] = true
421
+ end
422
+
423
+ opts.on('--file-types fileTypes',
424
+ "File types to be included.",
425
+ "Default = *.rb") do |fileTypes|
426
+ options[:fileTypes] = fileTypes.split()
339
427
  end
340
428
 
341
429
  opts.on_tail('-h', '--help', 'Display this help and exit') do
@@ -0,0 +1,122 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
2
+
3
+ # Copyright (C) 2009 Stephen Doyle
4
+
5
+ require 'test/unit'
6
+ require 'countloc'
7
+
8
+ class CppTest < Test::Unit::TestCase
9
+
10
+ include CountLOC
11
+
12
+ def setup
13
+ @counter = LineCounter.new('Test')
14
+ @style = :cplusplus
15
+ end
16
+
17
+ def test_single_line_comment
18
+ @counter.read("// This is a comment", @style)
19
+ assert_equal(0, @counter.code)
20
+ assert_equal(1, @counter.comments)
21
+ assert_equal(0, @counter.blank)
22
+ assert_equal(1, @counter.lines)
23
+ end
24
+
25
+ def test_single_line_comment_with_whitespace
26
+ @counter.read(" // This is a comment", @style)
27
+ assert_equal(0, @counter.code)
28
+ assert_equal(1, @counter.comments)
29
+ assert_equal(0, @counter.blank)
30
+ assert_equal(1, @counter.lines)
31
+ end
32
+
33
+ def test_multi_line_comment
34
+ @counter.read(%{/*\nThis is a comment\n*/}, @style)
35
+ assert_equal(0, @counter.code)
36
+ assert_equal(3, @counter.comments)
37
+ assert_equal(0, @counter.blank)
38
+ assert_equal(3, @counter.lines)
39
+ end
40
+
41
+ def test_multi_line_comment_on_a_single_line
42
+ @counter.read(%{/*This is a comment*/}, @style)
43
+ assert_equal(0, @counter.code)
44
+ assert_equal(1, @counter.comments)
45
+ assert_equal(0, @counter.blank)
46
+ assert_equal(1, @counter.lines)
47
+ end
48
+
49
+ def test_multi_line_comment_with_blank_lines
50
+ @counter.read(%{/* This is a comment\n\n*/}, @style)
51
+ assert_equal(0, @counter.code)
52
+ assert_equal(2, @counter.comments)
53
+ assert_equal(1, @counter.blank)
54
+ assert_equal(3, @counter.lines)
55
+ end
56
+
57
+ def test_mixed_with_single_line_comments
58
+ @counter.read("print 'hello' // This is a mixed comment", @style)
59
+ assert_equal(1, @counter.code)
60
+ assert_equal(1, @counter.comments)
61
+ assert_equal(0, @counter.blank)
62
+ assert_equal(1, @counter.lines)
63
+ end
64
+
65
+ def test_mixed_with_multi_line_comments
66
+ @counter.read(%{printf("hello"); /* This is a mixed comment */}, @style)
67
+ assert_equal(1, @counter.code)
68
+ assert_equal(1, @counter.comments)
69
+ assert_equal(0, @counter.blank)
70
+ assert_equal(1, @counter.lines)
71
+ end
72
+
73
+ def test_single_line_comment_char_in_double_quote_string
74
+ @counter.read(%{printf("//comment");}, @style)
75
+ assert_equal(1, @counter.code)
76
+ assert_equal(0, @counter.comments)
77
+ assert_equal(0, @counter.blank)
78
+ assert_equal(1, @counter.lines)
79
+ end
80
+
81
+ def test_multi_line_comment_char_in_double_quote_string
82
+ @counter.read(%{printf("/* comment */");}, @style)
83
+ assert_equal(1, @counter.code)
84
+ assert_equal(0, @counter.comments)
85
+ assert_equal(0, @counter.blank)
86
+ assert_equal(1, @counter.lines)
87
+ end
88
+
89
+ def test_blank_lines_with_newline
90
+ @counter.read("\n", @style)
91
+ assert_equal(0, @counter.code)
92
+ assert_equal(0, @counter.comments)
93
+ assert_equal(1, @counter.blank)
94
+ assert_equal(1, @counter.lines)
95
+ end
96
+
97
+ def test_blank_lines_with_whitespace
98
+ @counter.read(" \t", @style)
99
+ assert_equal(0, @counter.code)
100
+ assert_equal(0, @counter.comments)
101
+ assert_equal(1, @counter.blank)
102
+ assert_equal(1, @counter.lines)
103
+ end
104
+
105
+ def test_mixed_code_and_comments
106
+ @counter.read(
107
+ %{/*\n} +
108
+ %{ * Sample foo function\n} +
109
+ %{ */\n} +
110
+ "void foo() {\n" +
111
+ %{ // say hello\n} +
112
+ %{ printf("Hello World");\n} +
113
+ "}\n\n" +
114
+ %{// The End}, @style)
115
+ assert_equal(3, @counter.code)
116
+ assert_equal(5, @counter.comments)
117
+ assert_equal(1, @counter.blank)
118
+ assert_equal(9, @counter.lines)
119
+ end
120
+
121
+ end
122
+
@@ -0,0 +1,112 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
2
+
3
+ # Copyright (C) 2009 Stephen Doyle
4
+
5
+ require 'test/unit'
6
+ require 'countloc'
7
+
8
+ class PythonTest < Test::Unit::TestCase
9
+
10
+ include CountLOC
11
+
12
+ def setup
13
+ @counter = LineCounter.new('Test')
14
+ @style = :python
15
+ end
16
+
17
+ def test_single_line_comment
18
+ @counter.read("# This is a comment", @style)
19
+ assert_equal(0, @counter.code)
20
+ assert_equal(1, @counter.comments)
21
+ assert_equal(0, @counter.blank)
22
+ assert_equal(1, @counter.lines)
23
+ end
24
+
25
+ def test_single_line_comment_with_whitespace
26
+ @counter.read(" # This is a comment", @style)
27
+ assert_equal(0, @counter.code)
28
+ assert_equal(1, @counter.comments)
29
+ assert_equal(0, @counter.blank)
30
+ assert_equal(1, @counter.lines)
31
+ end
32
+
33
+ def test_multi_line_comment
34
+ @counter.read(%{"""\n# This is a comment\n"""}, @style)
35
+ assert_equal(0, @counter.code)
36
+ assert_equal(3, @counter.comments)
37
+ assert_equal(0, @counter.blank)
38
+ assert_equal(3, @counter.lines)
39
+ end
40
+
41
+ def test_multi_line_comment_on_a_single_line
42
+ @counter.read(%{"""This is a comment"""}, @style)
43
+ assert_equal(0, @counter.code)
44
+ assert_equal(1, @counter.comments)
45
+ assert_equal(0, @counter.blank)
46
+ assert_equal(1, @counter.lines)
47
+ end
48
+
49
+ def test_multi_line_comment_with_blank_lines
50
+ @counter.read(%{"""# This is a comment\n\n"""}, @style)
51
+ assert_equal(0, @counter.code)
52
+ assert_equal(2, @counter.comments)
53
+ assert_equal(1, @counter.blank)
54
+ assert_equal(3, @counter.lines)
55
+ end
56
+
57
+ def test_mixed
58
+ @counter.read("print 'hello' # This is a mixed comment", @style)
59
+ assert_equal(1, @counter.code)
60
+ assert_equal(1, @counter.comments)
61
+ assert_equal(0, @counter.blank)
62
+ assert_equal(1, @counter.lines)
63
+ end
64
+
65
+ def test_comment_char_in_double_quote_string
66
+ @counter.read('print "hello #"', @style)
67
+ assert_equal(1, @counter.code)
68
+ assert_equal(0, @counter.comments)
69
+ assert_equal(0, @counter.blank)
70
+ assert_equal(1, @counter.lines)
71
+ end
72
+
73
+ def test_comment_char_in_single_quote_string
74
+ @counter.read("print 'hello #'", @style)
75
+ assert_equal(1, @counter.code)
76
+ assert_equal(0, @counter.comments)
77
+ assert_equal(0, @counter.blank)
78
+ assert_equal(1, @counter.lines)
79
+ end
80
+
81
+ def test_blank_lines_with_newline
82
+ @counter.read("\n", @style)
83
+ assert_equal(0, @counter.code)
84
+ assert_equal(0, @counter.comments)
85
+ assert_equal(1, @counter.blank)
86
+ assert_equal(1, @counter.lines)
87
+ end
88
+
89
+ def test_blank_lines_with_whitespace
90
+ @counter.read(" \t", @style)
91
+ assert_equal(0, @counter.code)
92
+ assert_equal(0, @counter.comments)
93
+ assert_equal(1, @counter.blank)
94
+ assert_equal(1, @counter.lines)
95
+ end
96
+
97
+ def test_mixed_code_and_comments
98
+ @counter.read("# This is a comment\n" +
99
+ "print 'hello'\n" +
100
+ %{"""\n} +
101
+ %{ multiline comment\n} +
102
+ %{"""\n} +
103
+ %{print 'blah'}, @style)
104
+ assert_equal(2, @counter.code)
105
+ assert_equal(4, @counter.comments)
106
+ assert_equal(0, @counter.blank)
107
+ assert_equal(6, @counter.lines)
108
+ end
109
+
110
+ end
111
+
112
+
@@ -11,98 +11,100 @@ class RubyTest < Test::Unit::TestCase
11
11
 
12
12
  def setup
13
13
  @counter = LineCounter.new('Test')
14
+ @style = :ruby
14
15
  end
15
16
 
16
- def test_ruby_single_line_comment
17
- @counter.read("# This is a comment")
17
+ def test_single_line_comment
18
+ @counter.read("# This is a comment", @style)
18
19
  assert_equal(0, @counter.code)
19
20
  assert_equal(1, @counter.comments)
20
21
  assert_equal(0, @counter.blank)
21
22
  assert_equal(1, @counter.lines)
22
23
  end
23
24
 
24
- def test_ruby_single_line_comment_with_whitespace
25
- @counter.read(" # This is a comment")
25
+ def test_single_line_comment_with_whitespace
26
+ @counter.read(" # This is a comment", @style)
26
27
  assert_equal(0, @counter.code)
27
28
  assert_equal(1, @counter.comments)
28
29
  assert_equal(0, @counter.blank)
29
30
  assert_equal(1, @counter.lines)
30
31
  end
31
32
 
32
- def test_ruby_multi_line_comment
33
- @counter.read("=begin\n# This is a comment\n=end")
33
+ def test_multi_line_comment
34
+ @counter.read("=begin\n# This is a comment\n=end", @style)
34
35
  assert_equal(0, @counter.code)
35
36
  assert_equal(3, @counter.comments)
36
37
  assert_equal(0, @counter.blank)
37
38
  assert_equal(3, @counter.lines)
38
39
  end
39
40
 
40
- def test_ruby_multi_line_comment_with_blank_lines
41
- @counter.read("=begin\n# This is a comment\n\n=end")
41
+ def test_multi_line_comment_with_blank_lines
42
+ @counter.read("=begin\n# This is a comment\n\n=end", @style)
42
43
  assert_equal(0, @counter.code)
43
44
  assert_equal(3, @counter.comments)
44
45
  assert_equal(1, @counter.blank)
45
46
  assert_equal(4, @counter.lines)
46
47
  end
47
48
 
48
- def test_ruby_mixed
49
- @counter.read("puts 'hello' # This is a mixed comment")
49
+ def test_mixed
50
+ @counter.read("puts 'hello' # This is a mixed comment", @style)
50
51
  assert_equal(1, @counter.code)
51
52
  assert_equal(1, @counter.comments)
52
53
  assert_equal(0, @counter.blank)
53
54
  assert_equal(1, @counter.lines)
54
55
  end
55
56
 
56
- def test_ruby_comment_char_in_double_quote_string
57
- @counter.read('puts "hello #"')
57
+ def test_comment_char_in_double_quote_string
58
+ @counter.read('puts "hello #"', @style)
58
59
  assert_equal(1, @counter.code)
59
60
  assert_equal(0, @counter.comments)
60
61
  assert_equal(0, @counter.blank)
61
62
  assert_equal(1, @counter.lines)
62
63
  end
63
64
 
64
- def test_ruby_comment_char_in_single_quote_string
65
- @counter.read("puts 'hello #'")
65
+ def test_comment_char_in_single_quote_string
66
+ @counter.read("puts 'hello #'", @style)
66
67
  assert_equal(1, @counter.code)
67
68
  assert_equal(0, @counter.comments)
68
69
  assert_equal(0, @counter.blank)
69
70
  assert_equal(1, @counter.lines)
70
71
  end
71
72
 
72
- def test_ruby_comment_char_in_regexp
73
- @counter.read("puts /#/")
73
+ def test_comment_char_in_regexp
74
+ @counter.read("puts /#/", @style)
74
75
  assert_equal(1, @counter.code)
75
76
  assert_equal(0, @counter.comments)
76
77
  assert_equal(0, @counter.blank)
77
78
  assert_equal(1, @counter.lines)
78
79
  end
79
80
 
80
- def test_ruby_blank_lines_with_newline
81
- @counter.read("\n")
81
+ def test_blank_lines_with_newline
82
+ @counter.read("\n", @style)
82
83
  assert_equal(0, @counter.code)
83
84
  assert_equal(0, @counter.comments)
84
85
  assert_equal(1, @counter.blank)
85
86
  assert_equal(1, @counter.lines)
86
87
  end
87
88
 
88
- def test_ruby_blank_lines_with_whitespace
89
- @counter.read(" \t")
89
+ def test_blank_lines_with_whitespace
90
+ @counter.read(" \t", @style)
90
91
  assert_equal(0, @counter.code)
91
92
  assert_equal(0, @counter.comments)
92
93
  assert_equal(1, @counter.blank)
93
94
  assert_equal(1, @counter.lines)
94
95
  end
95
96
 
96
- def test_ruby_mixed_code_and_comments
97
+ def test_mixed_code_and_comments
97
98
  @counter.read("# This is a comment\n" +
98
99
  "1.upto(5).each {|x| puts x}\n" +
99
100
  "=begin\n" +
100
101
  " multiline comment\n" +
101
- "=end")
102
- assert_equal(1, @counter.code)
102
+ "=end\n" +
103
+ "puts 'blah'", @style)
104
+ assert_equal(2, @counter.code)
103
105
  assert_equal(4, @counter.comments)
104
106
  assert_equal(0, @counter.blank)
105
- assert_equal(5, @counter.lines)
107
+ assert_equal(6, @counter.lines)
106
108
  end
107
109
 
108
110
  end
@@ -4,3 +4,5 @@ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
4
4
 
5
5
  require 'test/unit'
6
6
  require 'tc_ruby'
7
+ require 'tc_python'
8
+ require 'tc_cpp'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: countloc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stephen Doyle
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-01-06 23:49:40.884164 +00:00
12
+ date: 2009-01-10 22:36:59.574069 +00:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -26,6 +26,8 @@ files:
26
26
  - LICENSE
27
27
  - setup.rb
28
28
  - lib/countloc.rb
29
+ - test/tc_cpp.rb
30
+ - test/tc_python.rb
29
31
  - test/tc_ruby.rb
30
32
  - test/ts_countloc.rb
31
33
  has_rdoc: true