Chris@0
|
1 ($:.unshift '../..'; require 'coderay') unless defined? CodeRay
|
Chris@0
|
2 module CodeRay
|
Chris@0
|
3 module Encoders
|
Chris@0
|
4
|
Chris@0
|
5 # Counts the LoC (Lines of Code). Returns an Integer >= 0.
|
Chris@0
|
6 #
|
Chris@0
|
7 # Alias: :loc
|
Chris@0
|
8 #
|
Chris@0
|
9 # Everything that is not comment, markup, doctype/shebang, or an empty line,
|
Chris@0
|
10 # is considered to be code.
|
Chris@0
|
11 #
|
Chris@0
|
12 # For example,
|
Chris@0
|
13 # * HTML files not containing JavaScript have 0 LoC
|
Chris@0
|
14 # * in a Java class without comments, LoC is the number of non-empty lines
|
Chris@0
|
15 #
|
Chris@0
|
16 # A Scanner class should define the token kinds that are not code in the
|
Chris@0
|
17 # KINDS_NOT_LOC constant, which defaults to [:comment, :doctype].
|
Chris@0
|
18 class LinesOfCode < Encoder
|
Chris@0
|
19
|
Chris@0
|
20 register_for :lines_of_code
|
Chris@0
|
21
|
Chris@0
|
22 NON_EMPTY_LINE = /^\s*\S.*$/
|
Chris@0
|
23
|
Chris@0
|
24 def compile tokens, options
|
Chris@0
|
25 if scanner = tokens.scanner
|
Chris@0
|
26 kinds_not_loc = scanner.class::KINDS_NOT_LOC
|
Chris@0
|
27 else
|
Chris@0
|
28 warn ArgumentError, 'Tokens have no scanner.' if $VERBOSE
|
Chris@0
|
29 kinds_not_loc = CodeRay::Scanners::Scanner::KINDS_NOT_LOC
|
Chris@0
|
30 end
|
Chris@0
|
31 code = tokens.token_class_filter :exclude => kinds_not_loc
|
Chris@0
|
32 @loc = code.text.scan(NON_EMPTY_LINE).size
|
Chris@0
|
33 end
|
Chris@0
|
34
|
Chris@0
|
35 def finish options
|
Chris@0
|
36 @loc
|
Chris@0
|
37 end
|
Chris@0
|
38
|
Chris@0
|
39 end
|
Chris@0
|
40
|
Chris@0
|
41 end
|
Chris@0
|
42 end
|
Chris@0
|
43
|
Chris@0
|
44 if $0 == __FILE__
|
Chris@0
|
45 $VERBOSE = true
|
Chris@0
|
46 $: << File.join(File.dirname(__FILE__), '..')
|
Chris@0
|
47 eval DATA.read, nil, $0, __LINE__ + 4
|
Chris@0
|
48 end
|
Chris@0
|
49
|
Chris@0
|
50 __END__
|
Chris@0
|
51 require 'test/unit'
|
Chris@0
|
52
|
Chris@0
|
53 class LinesOfCodeTest < Test::Unit::TestCase
|
Chris@0
|
54
|
Chris@0
|
55 def test_creation
|
Chris@0
|
56 assert CodeRay::Encoders::LinesOfCode < CodeRay::Encoders::Encoder
|
Chris@0
|
57 filter = nil
|
Chris@0
|
58 assert_nothing_raised do
|
Chris@0
|
59 filter = CodeRay.encoder :loc
|
Chris@0
|
60 end
|
Chris@0
|
61 assert_kind_of CodeRay::Encoders::LinesOfCode, filter
|
Chris@0
|
62 assert_nothing_raised do
|
Chris@0
|
63 filter = CodeRay.encoder :lines_of_code
|
Chris@0
|
64 end
|
Chris@0
|
65 assert_kind_of CodeRay::Encoders::LinesOfCode, filter
|
Chris@0
|
66 end
|
Chris@0
|
67
|
Chris@0
|
68 def test_lines_of_code
|
Chris@0
|
69 tokens = CodeRay.scan <<-RUBY, :ruby
|
Chris@0
|
70 #!/usr/bin/env ruby
|
Chris@0
|
71
|
Chris@0
|
72 # a minimal Ruby program
|
Chris@0
|
73 puts "Hello world!"
|
Chris@0
|
74 RUBY
|
Chris@0
|
75 assert_equal 1, CodeRay::Encoders::LinesOfCode.new.encode_tokens(tokens)
|
Chris@0
|
76 assert_equal 1, tokens.lines_of_code
|
Chris@0
|
77 assert_equal 1, tokens.loc
|
Chris@0
|
78 end
|
Chris@0
|
79
|
Chris@0
|
80 def test_filtering_block_tokens
|
Chris@0
|
81 tokens = CodeRay::Tokens.new
|
Chris@0
|
82 tokens << ["Hello\n", :world]
|
Chris@0
|
83 tokens << ["Hello\n", :space]
|
Chris@0
|
84 tokens << ["Hello\n", :comment]
|
Chris@0
|
85 assert_equal 2, CodeRay::Encoders::LinesOfCode.new.encode_tokens(tokens)
|
Chris@0
|
86 assert_equal 2, tokens.lines_of_code
|
Chris@0
|
87 assert_equal 2, tokens.loc
|
Chris@0
|
88 end
|
Chris@0
|
89
|
Chris@0
|
90 end |