fukuzatsu 0.9.13 → 0.9.14
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Gemfile +0 -2
- data/fukuzatsu.gemspec +2 -1
- data/lib/fukuzatsu/analyzer.rb +2 -2
- data/lib/fukuzatsu/cli.rb +40 -38
- data/lib/fukuzatsu/formatters/base.rb +5 -1
- data/lib/fukuzatsu/parsed_file.rb +11 -2
- data/lib/fukuzatsu/parsed_method.rb +7 -5
- data/lib/fukuzatsu/version.rb +1 -1
- data/spec/analyzer_spec.rb +54 -10
- data/spec/cli_spec.rb +85 -0
- data/spec/fixtures/multiple_methods.rb +7 -0
- data/spec/fixtures/nested_methods.rb +8 -0
- data/spec/fixtures/single_class.rb +9 -0
- data/spec/fixtures/single_method.rb +3 -0
- data/spec/formatters/base_spec.rb +56 -0
- data/spec/formatters/csv_spec.rb +41 -0
- data/spec/formatters/html_index_spec.rb +36 -0
- data/spec/formatters/html_spec.rb +47 -0
- data/spec/formatters/text_spec.rb +35 -0
- data/spec/parsed_file_spec.rb +67 -0
- data/spec/parsed_method_spec.rb +34 -0
- data/spec/spec_helper.rb +4 -0
- data/tags +92 -0
- metadata +42 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2f84b5108ad126a90f2320712aa5c5ec01690969
|
4
|
+
data.tar.gz: 7b5d7114da4f187368fef32eaa46949c664cf41b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 18a5e3e5352b534f2e9c1cd1de89c7dfa674e4281c58b36b4c5c973fa1f0d89bfd7bc14b8ad96e5ad3b676095ec50fb08330fe9182a55ef4ce70e0f7a1b43050
|
7
|
+
data.tar.gz: fdf63925b5cf99805c394674c7214a65f0f6c00a7ece731be10ccdbe06f295fea7ba768ef88ed7eda28764bd29f84aaa55d298816828e3e3724be6913b48e6fd
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/fukuzatsu.gemspec
CHANGED
@@ -22,10 +22,11 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.add_dependency "poro_plus"
|
23
23
|
spec.add_dependency "haml"
|
24
24
|
spec.add_dependency "parser"
|
25
|
+
spec.add_dependency "thor"
|
25
26
|
|
26
27
|
spec.add_development_dependency "bundler", "~> 1.6"
|
27
28
|
spec.add_development_dependency "rake"
|
28
29
|
spec.add_development_dependency "rspec"
|
29
|
-
spec.add_development_dependency "
|
30
|
+
spec.add_development_dependency "simplecov"
|
30
31
|
|
31
32
|
end
|
data/lib/fukuzatsu/analyzer.rb
CHANGED
@@ -50,13 +50,13 @@ class Analyzer
|
|
50
50
|
end
|
51
51
|
|
52
52
|
def methods_from(node, methods=[])
|
53
|
-
if node.type == :def || node.type == :defs
|
53
|
+
if node.type == :def || node.type == :defs || node.type == :class
|
54
54
|
name = node.loc.name
|
55
55
|
expression = node.loc.expression
|
56
56
|
methods << ParsedMethod.new(
|
57
57
|
name: content[name.begin_pos..name.end_pos - 1],
|
58
58
|
content: content[expression.begin_pos..expression.end_pos - 1],
|
59
|
-
type: node.type
|
59
|
+
type: [:defs, :class].include?(node.type) ? :class : :instance
|
60
60
|
)
|
61
61
|
end
|
62
62
|
node.children.each do |child|
|
data/lib/fukuzatsu/cli.rb
CHANGED
@@ -13,36 +13,31 @@ module Fukuzatsu
|
|
13
13
|
method_option :threshold, :type => :numeric, :default => 0, :aliases => "-t"
|
14
14
|
|
15
15
|
def check(path="./")
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
last_file = {}
|
20
|
-
|
21
|
-
file_list(path).each do |path_to_file|
|
22
|
-
file = ParsedFile.new(path_to_file: path_to_file)
|
23
|
-
parser = formatter(options).new(file)
|
24
|
-
parser.export
|
25
|
-
file_summary << {
|
26
|
-
results_file: "#{parser.output_path}/#{parser.filename}",
|
27
|
-
path_to_file: path_to_file,
|
28
|
-
class_name: "#{file.class_name}",
|
29
|
-
complexity: file.complexity
|
30
|
-
}
|
31
|
-
file_complexities << file.complexity
|
32
|
-
end
|
33
|
-
|
34
|
-
last_file = handle_index(file_summary) if options['format'] == 'html'
|
35
|
-
report(last_file[:results_file], file_summary.map{|s| s[:results_file]})
|
36
|
-
handle_complexity(options, file_complexities.sort.last, options['threshold'])
|
37
|
-
|
16
|
+
file_list(path).each{ |path_to_file| parse(path_to_file) }
|
17
|
+
handle_index(summaries)
|
18
|
+
report
|
38
19
|
end
|
39
20
|
|
40
21
|
default_task :check
|
41
22
|
|
23
|
+
attr_accessor :summaries, :last_file
|
24
|
+
|
42
25
|
private
|
43
26
|
|
44
|
-
def
|
45
|
-
|
27
|
+
def complexities
|
28
|
+
summaries.to_a.map{|s| s[:complexity]}
|
29
|
+
end
|
30
|
+
|
31
|
+
def file_list(start_file)
|
32
|
+
if File.directory?(start_file)
|
33
|
+
return Dir.glob(File.join(start_file, "**", "*")).select{|n| n =~ /\.rb$/}
|
34
|
+
else
|
35
|
+
return [start_file]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def formatter
|
40
|
+
case options['format']
|
46
41
|
when 'html'
|
47
42
|
Formatters::Html
|
48
43
|
when 'csv'
|
@@ -53,30 +48,37 @@ module Fukuzatsu
|
|
53
48
|
end
|
54
49
|
|
55
50
|
def handle_index(file_summary)
|
51
|
+
return unless options['format'] == 'html'
|
56
52
|
index = Formatters::HtmlIndex.new(file_summary)
|
53
|
+
self.last_file = "#{index.output_path}/#{index.filename}"
|
57
54
|
index.export
|
58
|
-
{results_file: "#{index.output_path}/#{index.filename}"}
|
59
55
|
end
|
60
56
|
|
61
|
-
def
|
62
|
-
|
63
|
-
|
64
|
-
|
57
|
+
def parse(path_to_file, options={})
|
58
|
+
file = ParsedFile.new(path_to_file: path_to_file)
|
59
|
+
parser = formatter.new(file)
|
60
|
+
parser.export
|
61
|
+
self.summaries ||= []
|
62
|
+
self.summaries << file.summary.merge(results_file: parser.path_to_results)
|
63
|
+
end
|
64
|
+
|
65
|
+
def report
|
66
|
+
unless options['format'] == "text"
|
67
|
+
puts "Results written to:"
|
68
|
+
puts last_file.present? && "#{last_file}" || results_files.join("\r\n")
|
69
|
+
end
|
70
|
+
report_complexity
|
65
71
|
end
|
66
72
|
|
67
|
-
def
|
73
|
+
def report_complexity
|
68
74
|
return if options['threshold'].to_i == 0
|
69
|
-
return if
|
70
|
-
puts "Maximum complexity
|
75
|
+
return if complexities.max.to_i <= options['threshold']
|
76
|
+
puts "Maximum complexity of #{complexities.max} exceeds #{options['threshold']} threshold!"
|
71
77
|
exit 1
|
72
78
|
end
|
73
79
|
|
74
|
-
def
|
75
|
-
|
76
|
-
return Dir.glob(File.join(start_file, "**", "*")).select{|n| n =~ /\.rb$/}
|
77
|
-
else
|
78
|
-
return [start_file]
|
79
|
-
end
|
80
|
+
def results_files
|
81
|
+
summaries.map{|s| s[:results_file]}
|
80
82
|
end
|
81
83
|
|
82
84
|
end
|
@@ -28,6 +28,10 @@ module Formatters
|
|
28
28
|
output_path
|
29
29
|
end
|
30
30
|
|
31
|
+
def path_to_results
|
32
|
+
"#{output_path}/#{filename}"
|
33
|
+
end
|
34
|
+
|
31
35
|
def filename
|
32
36
|
self.file.path_to_file.split('/')[-1] + file_extension
|
33
37
|
end
|
@@ -38,7 +42,7 @@ module Formatters
|
|
38
42
|
|
39
43
|
def export
|
40
44
|
begin
|
41
|
-
outfile = File.open("#{
|
45
|
+
outfile = File.open("#{path_to_results}", 'w')
|
42
46
|
outfile.write(content)
|
43
47
|
rescue Exception => e
|
44
48
|
puts "Unable to write output: #{e} #{e.backtrace}"
|
@@ -3,7 +3,7 @@ class ParsedFile
|
|
3
3
|
include PoroPlus
|
4
4
|
include Ephemeral::Base
|
5
5
|
|
6
|
-
attr_accessor :path_to_file, :class_name
|
6
|
+
attr_accessor :complexity, :path_to_file, :class_name, :path_to_results
|
7
7
|
|
8
8
|
def class_name
|
9
9
|
@class_name ||= analyzer.extract_class_name
|
@@ -14,7 +14,7 @@ class ParsedFile
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def analyzer
|
17
|
-
Analyzer.new(content)
|
17
|
+
@analyzer ||= Analyzer.new(content)
|
18
18
|
end
|
19
19
|
|
20
20
|
def complexity
|
@@ -25,4 +25,13 @@ class ParsedFile
|
|
25
25
|
@methods ||= analyzer.extract_methods
|
26
26
|
end
|
27
27
|
|
28
|
+
def summary
|
29
|
+
{
|
30
|
+
results_file: self.path_to_results,
|
31
|
+
path_to_file: self.path_to_file,
|
32
|
+
class_name: self.class_name,
|
33
|
+
complexity: complexity
|
34
|
+
}
|
35
|
+
end
|
36
|
+
|
28
37
|
end
|
@@ -1,17 +1,19 @@
|
|
1
|
-
require 'parser/current'
|
2
|
-
|
3
1
|
class ParsedMethod
|
4
2
|
|
5
3
|
include PoroPlus
|
6
4
|
|
7
|
-
attr_accessor :name, :content, :type
|
5
|
+
attr_accessor :name, :content, :type, :complexity
|
8
6
|
|
9
7
|
def complexity
|
10
|
-
@complexity ||=
|
8
|
+
@complexity ||= analyzer.complexity
|
11
9
|
end
|
12
10
|
|
13
11
|
def prefix
|
14
|
-
self.type ==
|
12
|
+
self.type.to_s == 'class' ? "." : "#"
|
13
|
+
end
|
14
|
+
|
15
|
+
def analyzer
|
16
|
+
Analyzer.new(self.content)
|
15
17
|
end
|
16
18
|
|
17
19
|
end
|
data/lib/fukuzatsu/version.rb
CHANGED
data/spec/analyzer_spec.rb
CHANGED
@@ -36,24 +36,68 @@ describe Analyzer do
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
-
|
39
|
+
describe "#complexity" do
|
40
|
+
context "program_1" do
|
40
41
|
|
41
|
-
|
42
|
+
let(:analyzer) { Analyzer.new(content_1) }
|
43
|
+
|
44
|
+
it "matches the manual calculation of complexity of 4" do
|
45
|
+
expect(analyzer.complexity).to eq(4)
|
46
|
+
end
|
42
47
|
|
43
|
-
it "matches the manual calculation of complexity of 4" do
|
44
|
-
expect(analyzer.complexity).to eq(4)
|
45
48
|
end
|
46
49
|
|
47
|
-
|
50
|
+
context "program_2" do
|
48
51
|
|
49
|
-
|
52
|
+
let(:analyzer) { Analyzer.new(content_2) }
|
50
53
|
|
51
|
-
|
54
|
+
it "matches the manual calculation of complexity of 5" do
|
55
|
+
expect(analyzer.complexity).to eq(5)
|
56
|
+
end
|
52
57
|
|
53
|
-
it "matches the manual calculation of complexity of 5" do
|
54
|
-
expect(analyzer.complexity).to eq(5)
|
55
58
|
end
|
56
|
-
|
59
|
+
end
|
60
|
+
|
61
|
+
describe "extract_methods" do
|
62
|
+
# Note: should implicitly trust private method #methods_from
|
63
|
+
context "from a file with a single method" do
|
64
|
+
let(:analyzer) { Analyzer.new(File.read("spec/fixtures/single_method.rb")) }
|
65
|
+
it "should return a single method" do
|
66
|
+
expect(analyzer.extract_methods.count).to eq 1
|
67
|
+
end
|
68
|
+
it "should extract the method name" do
|
69
|
+
expect(analyzer.extract_methods[0].name).to eq "read_poem"
|
70
|
+
end
|
71
|
+
it "should extract the method content" do
|
72
|
+
expect(analyzer.extract_methods[0].content).to eq 'def read_poem
|
73
|
+
return "I meant to find her when I came/Death had the same design"
|
74
|
+
end'
|
75
|
+
end
|
76
|
+
it "should set type to :instance" do
|
77
|
+
expect(analyzer.extract_methods[0].type).to eq :instance
|
78
|
+
end
|
79
|
+
end
|
80
|
+
context "from a file with multiple methods" do
|
81
|
+
let(:analyzer) { Analyzer.new(File.read("spec/fixtures/multiple_methods.rb")) }
|
82
|
+
it "should return multiple methods" do
|
83
|
+
expect(analyzer.extract_methods.map { |m| m.name }).to eq ["bake_treats", "lower_from_window"]
|
84
|
+
end
|
85
|
+
end
|
86
|
+
context "from a file with nested methods" do
|
87
|
+
let(:analyzer) { Analyzer.new(File.read("spec/fixtures/nested_methods.rb")) }
|
88
|
+
it "should return the root method, and its child" do
|
89
|
+
expect(analyzer.extract_methods.map { |m| m.name }).to eq ["grow_flowers", "water_earth"]
|
90
|
+
end
|
91
|
+
end
|
92
|
+
context "from a file with a class" do
|
93
|
+
let(:analyzer) { Analyzer.new(File.read("spec/fixtures/single_class.rb")) }
|
94
|
+
it "should return the class and its methods" do
|
95
|
+
expect(analyzer.extract_methods.map { |m| m.name }).to eq ["Gown", "initialize", "color"]
|
96
|
+
end
|
97
|
+
it "should set the type of class to :class" do
|
98
|
+
expect(analyzer.extract_methods[0].type).to eq :class
|
99
|
+
end
|
100
|
+
end
|
57
101
|
end
|
58
102
|
|
59
103
|
end
|
data/spec/cli_spec.rb
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Fukuzatsu::CLI" do
|
4
|
+
|
5
|
+
let(:cli) { Fukuzatsu::CLI.new([
|
6
|
+
path: "foo/bar.rb",
|
7
|
+
format: 'text'
|
8
|
+
]
|
9
|
+
)}
|
10
|
+
|
11
|
+
let(:summary_1) {
|
12
|
+
{
|
13
|
+
results_file: "doc/fukuzatsu/file_1.rb.htm",
|
14
|
+
path_to_file: "file_1.rb",
|
15
|
+
class_name: "File_1",
|
16
|
+
complexity: 13
|
17
|
+
}
|
18
|
+
}
|
19
|
+
|
20
|
+
let(:summary_2) {
|
21
|
+
{
|
22
|
+
results_file: "doc/fukuzatsu/file_2.rb.htm",
|
23
|
+
path_to_file: "file_2.rb",
|
24
|
+
class_name: "File_2",
|
25
|
+
complexity: 11
|
26
|
+
}
|
27
|
+
}
|
28
|
+
|
29
|
+
before do
|
30
|
+
allow(cli).to receive(:summaries) { [summary_1, summary_2] }
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "#complexities" do
|
34
|
+
it "extracts complexities from its file summaries" do
|
35
|
+
expect(cli.send(:complexities)).to eq([13,11])
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "#formatter" do
|
40
|
+
it "returns a csv formatter" do
|
41
|
+
allow(cli).to receive(:options) { {'format' => 'csv'} }
|
42
|
+
expect(cli.send(:formatter)).to eq Formatters::Csv
|
43
|
+
end
|
44
|
+
it "returns an html formatter" do
|
45
|
+
allow(cli).to receive(:options) { {'format' => 'html'} }
|
46
|
+
expect(cli.send(:formatter)).to eq Formatters::Html
|
47
|
+
end
|
48
|
+
it "returns a text formatter" do
|
49
|
+
allow(cli).to receive(:options) { {'format' => 'text'} }
|
50
|
+
expect(cli.send(:formatter)).to eq Formatters::Text
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe "#report" do
|
55
|
+
it "does not report if format is text" do
|
56
|
+
allow(cli).to receive(:options) { {'format' => 'text'} }
|
57
|
+
expect(cli.send(:report)).to be_nil
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe "#report_complexity" do
|
62
|
+
it "does not report if threshold is not set" do
|
63
|
+
expect(cli.send(:report_complexity)).to be_nil
|
64
|
+
end
|
65
|
+
|
66
|
+
it "does not report if threshold is respected" do
|
67
|
+
allow(cli).to receive(:options) { {'threshold' => 15} }
|
68
|
+
allow(cli).to receive(:complexities) { [0,13,11] }
|
69
|
+
expect(cli.send(:report_complexity)).to be_nil
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe "#results_files" do
|
75
|
+
it "extracts results files from its file summaries" do
|
76
|
+
expect(cli.send(:results_files)).to eq(
|
77
|
+
[
|
78
|
+
"doc/fukuzatsu/file_1.rb.htm",
|
79
|
+
"doc/fukuzatsu/file_2.rb.htm"
|
80
|
+
]
|
81
|
+
)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Formatters::Base" do
|
4
|
+
|
5
|
+
class Formatters::Sample; include Formatters::Base; end
|
6
|
+
|
7
|
+
let (:parsed_file) { ParsedFile.new(class_name: "Foo", path_to_file: "lib/foo.rb") }
|
8
|
+
let (:formatter) { Formatters::Sample.new(parsed_file) }
|
9
|
+
|
10
|
+
before do
|
11
|
+
allow(formatter).to receive(:header) { "class,method,complexity" }
|
12
|
+
allow(formatter).to receive(:rows) { "Foo,#initialize,24" }
|
13
|
+
allow(formatter).to receive(:footer) { "TOTAL,,24" }
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "#columns" do
|
17
|
+
it "returns default columns" do
|
18
|
+
expect(formatter.columns).to eq(["class", "method", "complexity"])
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "#content" do
|
23
|
+
it "returns expected content" do
|
24
|
+
expect(formatter.content).to eq "class,method,complexity\r\nFoo,#initialize,24\r\nTOTAL,,24"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "#filename" do
|
29
|
+
it "builds a filename" do
|
30
|
+
allow(formatter).to receive(:file_extension) { '.doc' }
|
31
|
+
expect(formatter.filename).to eq "foo.rb.doc"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "#output_path" do
|
36
|
+
it "builds a path" do
|
37
|
+
allow(FileUtils).to receive(:mkpath)
|
38
|
+
expect(formatter.output_path).to eq "doc/fukuzatsu/lib"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "#path_to_results" do
|
43
|
+
it "builds a path" do
|
44
|
+
allow(formatter).to receive(:file_extension) { '.doc' }
|
45
|
+
allow(formatter).to receive(:output_path) { 'doc/fukuzatsu/lib' }
|
46
|
+
expect(formatter.path_to_results).to eq "doc/fukuzatsu/lib/foo.rb.doc"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "#root_path" do
|
51
|
+
it "returns the expected path" do
|
52
|
+
expect(formatter.root_path).to eq "doc/fukuzatsu"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Formatters::Csv" do
|
4
|
+
|
5
|
+
let (:parsed_file) { ParsedFile.new(class_name: "Foo") }
|
6
|
+
let (:method_1) { ParsedMethod.new(
|
7
|
+
name: "initialize",
|
8
|
+
complexity: 13,
|
9
|
+
type: "instance"
|
10
|
+
)
|
11
|
+
}
|
12
|
+
let (:method_2) { ParsedMethod.new(
|
13
|
+
name: "report",
|
14
|
+
complexity: 11,
|
15
|
+
type: "instance"
|
16
|
+
)
|
17
|
+
}
|
18
|
+
let (:formatter) { Formatters::Csv.new(parsed_file) }
|
19
|
+
|
20
|
+
describe "#header" do
|
21
|
+
it "returns a comma-separated header" do
|
22
|
+
expect(formatter.header).to eq "class,method,complexity"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#rows" do
|
27
|
+
it "returns comma-separated rows" do
|
28
|
+
allow(parsed_file).to receive(:methods) { [method_1, method_2] }
|
29
|
+
expect(formatter.rows).to eq(
|
30
|
+
"Foo,#initialize,13\r\nFoo,#report,11"
|
31
|
+
)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "#file_extension" do
|
36
|
+
it "returns the proper extension" do
|
37
|
+
expect(formatter.file_extension).to eq ".csv"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Formatters::HtmlIndex" do
|
4
|
+
|
5
|
+
let(:file_summary) {
|
6
|
+
[
|
7
|
+
{
|
8
|
+
results_file: "doc/fukuzatsu/file_1.rb.htm",
|
9
|
+
path_to_file: "file_1.rb",
|
10
|
+
class_name: "File_1",
|
11
|
+
complexity: 13
|
12
|
+
},
|
13
|
+
{
|
14
|
+
results_file: "doc/fukuzatsu/file_2.rb.htm",
|
15
|
+
path_to_file: "file_2.rb",
|
16
|
+
class_name: "File_2",
|
17
|
+
complexity: 11
|
18
|
+
}
|
19
|
+
]
|
20
|
+
}
|
21
|
+
|
22
|
+
let (:formatter) { Formatters::HtmlIndex.new(file_summary) }
|
23
|
+
|
24
|
+
describe "#initialize" do
|
25
|
+
it "initializes with a file summary" do
|
26
|
+
expect(formatter.file_summary).to eq file_summary
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "#filename" do
|
31
|
+
it "returns the expected filename" do
|
32
|
+
expect(formatter.filename).to eq "index.htm"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Formatters::Text" do
|
4
|
+
|
5
|
+
let (:parsed_file) { ParsedFile.new(class_name: "Foo", complexity: 11) }
|
6
|
+
let (:method_1) { ParsedMethod.new(
|
7
|
+
name: "initialize",
|
8
|
+
complexity: 13,
|
9
|
+
type: "instance"
|
10
|
+
)
|
11
|
+
}
|
12
|
+
let (:method_2) { ParsedMethod.new(
|
13
|
+
name: "report",
|
14
|
+
complexity: 11,
|
15
|
+
type: "instance"
|
16
|
+
)
|
17
|
+
}
|
18
|
+
let (:formatter) { Formatters::Html.new(parsed_file) }
|
19
|
+
|
20
|
+
before do
|
21
|
+
allow(parsed_file).to receive(:methods) { [method_1, method_2] }
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "#header" do
|
25
|
+
it "returns an HTML-formatted header" do
|
26
|
+
expect(formatter.header).to eq(
|
27
|
+
"<th>Class</th>\r\n<th>Method</th>\r\n<th>Complexity</th>"
|
28
|
+
)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "#rows" do
|
33
|
+
it "returns HTML-formatted rows" do
|
34
|
+
expected = "<tr class='even'>\r\n <td>Foo</td>\r\n <td>#initialize</td>\r\n <td>13</td>\r\n</tr>\r\n"
|
35
|
+
expected << "<tr class='odd'>\r\n <td>Foo</td>\r\n <td>#report</td>\r\n <td>11</td>\r\n</tr>"
|
36
|
+
allow(parsed_file).to receive(:methods) { [method_1, method_2] }
|
37
|
+
expect(formatter.rows).to eq(expected)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "#file_extension" do
|
42
|
+
it "returns the proper extension" do
|
43
|
+
expect(formatter.file_extension).to eq ".htm"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Formatters::Text" do
|
4
|
+
|
5
|
+
let (:parsed_file) { ParsedFile.new(class_name: "Foo", complexity: 11) }
|
6
|
+
let (:method_1) { ParsedMethod.new(
|
7
|
+
name: "initialize",
|
8
|
+
complexity: 13,
|
9
|
+
type: "instance"
|
10
|
+
)
|
11
|
+
}
|
12
|
+
let (:method_2) { ParsedMethod.new(
|
13
|
+
name: "report",
|
14
|
+
complexity: 11,
|
15
|
+
type: "instance"
|
16
|
+
)
|
17
|
+
}
|
18
|
+
let (:formatter) { Formatters::Text.new(parsed_file) }
|
19
|
+
|
20
|
+
describe "#header" do
|
21
|
+
it "returns a tab-separated header" do
|
22
|
+
expect(formatter.header).to eq "Foo\t\t11"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#rows" do
|
27
|
+
it "returns tab-separated rows" do
|
28
|
+
allow(parsed_file).to receive(:methods) { [method_1, method_2] }
|
29
|
+
expect(formatter.rows).to eq(
|
30
|
+
["Foo\t#initialize\t13", "Foo\t#report\t11"]
|
31
|
+
)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ParsedFile do
|
4
|
+
|
5
|
+
let(:parsed_file) { ParsedFile.new(path_to_file: "bar/foo.rb") }
|
6
|
+
let(:analyzer) { Analyzer.new("class Foo; end") }
|
7
|
+
|
8
|
+
describe "#class_name" do
|
9
|
+
before do
|
10
|
+
allow(parsed_file).to receive(:analyzer) { analyzer }
|
11
|
+
end
|
12
|
+
it "retrieves class name from analyzer" do
|
13
|
+
expect(parsed_file.class_name).to eq "Foo"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "#content" do
|
18
|
+
it "reads from file" do
|
19
|
+
allow(File).to receive(:open).with("bar/foo.rb", "r") {
|
20
|
+
instance_double("File", read: "whatever")
|
21
|
+
}
|
22
|
+
expect(parsed_file.content).to eq("whatever")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#analyzer" do
|
27
|
+
it "instantiates an Analyzer instance with content" do
|
28
|
+
allow(parsed_file).to receive("content") { "stuff" }
|
29
|
+
expect(parsed_file.analyzer.class.name).to eq "Analyzer"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "#complexity" do
|
34
|
+
before do
|
35
|
+
allow(parsed_file).to receive(:analyzer) { analyzer }
|
36
|
+
end
|
37
|
+
it "retrieves complexity score from analyzer" do
|
38
|
+
allow(analyzer).to receive(:complexity) { 13 }
|
39
|
+
expect(parsed_file.complexity).to eq 13
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "methods" do
|
44
|
+
before do
|
45
|
+
allow(parsed_file).to receive(:analyzer) { analyzer }
|
46
|
+
end
|
47
|
+
it "retrieves methods from analyzer" do
|
48
|
+
allow(analyzer).to receive(:extract_methods) { [:talk, :walk] }
|
49
|
+
expect(parsed_file.methods).to eq([:talk, :walk])
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "summary" do
|
54
|
+
it "builds a hash" do
|
55
|
+
allow(parsed_file).to receive(:path_to_results) { "doc/fukuzatsu/foo.rb.htm" }
|
56
|
+
allow(parsed_file).to receive(:path_to_file) { "foo.rb.htm" }
|
57
|
+
allow(parsed_file).to receive(:class_name) { "Foo" }
|
58
|
+
allow(parsed_file).to receive(:complexity) { 11 }
|
59
|
+
expect(parsed_file.summary[:results_file]).to eq "doc/fukuzatsu/foo.rb.htm"
|
60
|
+
expect(parsed_file.summary[:path_to_file]).to eq "foo.rb.htm"
|
61
|
+
expect(parsed_file.summary[:class_name]).to eq "Foo"
|
62
|
+
expect(parsed_file.summary[:complexity]).to eq 11
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ParsedMethod do
|
4
|
+
|
5
|
+
let(:parsed_method) { ParsedMethod.new }
|
6
|
+
let(:analyzer) { Analyzer.new("class Foo; end") }
|
7
|
+
|
8
|
+
describe "#complexity" do
|
9
|
+
it "retrieves complexity from its analyzer" do
|
10
|
+
allow(parsed_method).to receive(:analyzer) { analyzer }
|
11
|
+
allow(analyzer).to receive(:complexity) { 23 }
|
12
|
+
expect(parsed_method.complexity).to eq 23
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "#analyzer" do
|
17
|
+
it "instantiates an Analyzer instance with content" do
|
18
|
+
allow(parsed_method).to receive("content") { "stuff" }
|
19
|
+
expect(parsed_method.analyzer.class.name).to eq "Analyzer"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "#prefix" do
|
24
|
+
it "returns '.' if its type is class" do
|
25
|
+
allow(parsed_method).to receive("type") { "class" }
|
26
|
+
expect(parsed_method.prefix).to eq "."
|
27
|
+
end
|
28
|
+
it "returns '#' if its type is instance" do
|
29
|
+
allow(parsed_method).to receive("type") { "instance" }
|
30
|
+
expect(parsed_method.prefix).to eq "#"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
data/spec/spec_helper.rb
CHANGED
data/tags
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/
|
2
|
+
!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/
|
3
|
+
!_TAG_PROGRAM_AUTHOR Darren Hiebert /dhiebert@users.sourceforge.net/
|
4
|
+
!_TAG_PROGRAM_NAME Exuberant Ctags //
|
5
|
+
!_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/
|
6
|
+
!_TAG_PROGRAM_VERSION 5.8 //
|
7
|
+
Analyzer lib/fukuzatsu/analyzer.rb /^class Analyzer$/;" c
|
8
|
+
Base lib/fukuzatsu/formatters/base.rb /^ module Base$/;" m class:Formatters
|
9
|
+
Breathalizer spec/fixtures/program_3.rb /^class Breathalizer$/;" c
|
10
|
+
CLI lib/fukuzatsu/cli.rb /^ class CLI < Thor$/;" c class:Fukuzatsu
|
11
|
+
Csv lib/fukuzatsu/formatters/csv.rb /^ class Csv$/;" c class:Formatters
|
12
|
+
Extracted spec/fixtures/eg_mod_class_2.rb /^module Extracted$/;" m
|
13
|
+
Foo spec/fixtures/eg_class.rb /^class Foo$/;" c
|
14
|
+
Foo spec/fixtures/eg_mod_class.rb /^class Foo::Bar$/;" c
|
15
|
+
Formatters lib/fukuzatsu/formatters/base.rb /^module Formatters$/;" m
|
16
|
+
Formatters lib/fukuzatsu/formatters/csv.rb /^module Formatters$/;" m
|
17
|
+
Formatters lib/fukuzatsu/formatters/html.rb /^module Formatters$/;" m
|
18
|
+
Formatters lib/fukuzatsu/formatters/html_index.rb /^module Formatters$/;" m
|
19
|
+
Formatters lib/fukuzatsu/formatters/text.rb /^module Formatters$/;" m
|
20
|
+
Fukuzatsu lib/fukuzatsu.rb /^module Fukuzatsu$/;" m
|
21
|
+
Fukuzatsu lib/fukuzatsu/cli.rb /^module Fukuzatsu$/;" m
|
22
|
+
Fukuzatsu lib/fukuzatsu/version.rb /^module Fukuzatsu$/;" m
|
23
|
+
Html lib/fukuzatsu/formatters/html.rb /^ class Html$/;" c class:Formatters
|
24
|
+
HtmlIndex lib/fukuzatsu/formatters/html_index.rb /^ class HtmlIndex$/;" c class:Formatters
|
25
|
+
ParsedFile lib/fukuzatsu/parsed_file.rb /^class ParsedFile$/;" c
|
26
|
+
ParsedMethod lib/fukuzatsu/parsed_method.rb /^class ParsedMethod$/;" c
|
27
|
+
Something spec/fixtures/eg_module.rb /^module Something$/;" m
|
28
|
+
Text lib/fukuzatsu/formatters/text.rb /^ class Text$/;" c class:Formatters
|
29
|
+
Thing spec/fixtures/eg_mod_class_2.rb /^ class Thing$/;" c class:Extracted
|
30
|
+
analyzer lib/fukuzatsu/parsed_file.rb /^ def analyzer$/;" f class:ParsedFile
|
31
|
+
check lib/fukuzatsu/cli.rb /^ def check(path=".\/")$/;" f class:Fukuzatsu.CLI
|
32
|
+
class_name lib/fukuzatsu/parsed_file.rb /^ def class_name$/;" f class:ParsedFile
|
33
|
+
columns lib/fukuzatsu/formatters/base.rb /^ def columns$/;" f class:Formatters.Base
|
34
|
+
complexity lib/fukuzatsu/analyzer.rb /^ def complexity$/;" f class:Analyzer
|
35
|
+
complexity lib/fukuzatsu/parsed_file.rb /^ def complexity$/;" f class:ParsedFile
|
36
|
+
complexity lib/fukuzatsu/parsed_method.rb /^ def complexity$/;" f class:ParsedMethod
|
37
|
+
complexity spec/fixtures/program_3.rb /^ def complexity$/;" f class:Breathalizer
|
38
|
+
content lib/fukuzatsu/formatters/base.rb /^ def content$/;" f class:Formatters.Base
|
39
|
+
content lib/fukuzatsu/formatters/html.rb /^ def content$/;" f class:Formatters.Html
|
40
|
+
content lib/fukuzatsu/formatters/html_index.rb /^ def content$/;" f class:Formatters.HtmlIndex
|
41
|
+
content lib/fukuzatsu/parsed_file.rb /^ def content$/;" f class:ParsedFile
|
42
|
+
export lib/fukuzatsu/formatters/base.rb /^ def export$/;" f class:Formatters.Base
|
43
|
+
export lib/fukuzatsu/formatters/text.rb /^ def export$/;" f class:Formatters.Text
|
44
|
+
extend_graph lib/fukuzatsu/analyzer.rb /^ def extend_graph$/;" f class:Analyzer
|
45
|
+
extract_class_name lib/fukuzatsu/analyzer.rb /^ def extract_class_name$/;" f class:Analyzer
|
46
|
+
extract_methods lib/fukuzatsu/analyzer.rb /^ def extract_methods$/;" f class:Analyzer
|
47
|
+
file_contents spec/fixtures/program_3.rb /^ def file_contents$/;" f class:Breathalizer
|
48
|
+
file_extension lib/fukuzatsu/formatters/base.rb /^ def file_extension$/;" f class:Formatters.Base
|
49
|
+
file_extension lib/fukuzatsu/formatters/csv.rb /^ def file_extension$/;" f class:Formatters.Csv.rows
|
50
|
+
file_extension lib/fukuzatsu/formatters/html.rb /^ def file_extension$/;" f class:Formatters.Html.rows
|
51
|
+
file_list lib/fukuzatsu/cli.rb /^ def file_list(start_file)$/;" f class:Fukuzatsu
|
52
|
+
filename lib/fukuzatsu/formatters/base.rb /^ def filename$/;" f class:Formatters.Base
|
53
|
+
filename lib/fukuzatsu/formatters/html_index.rb /^ def filename$/;" f class:Formatters.HtmlIndex
|
54
|
+
find_class lib/fukuzatsu/analyzer.rb /^ def find_class(node)$/;" f class:Analyzer
|
55
|
+
footer lib/fukuzatsu/formatters/csv.rb /^ def footer$/;" f class:Formatters.Csv.rows
|
56
|
+
footer lib/fukuzatsu/formatters/html.rb /^ def footer$/;" f class:Formatters.Html.rows
|
57
|
+
footer lib/fukuzatsu/formatters/text.rb /^ def footer$/;" f class:Formatters.Text
|
58
|
+
formatter lib/fukuzatsu/cli.rb /^ def formatter(options)$/;" f class:Fukuzatsu.CLI
|
59
|
+
handle_complexity lib/fukuzatsu/cli.rb /^ def handle_complexity(options, highest_complexity, threshold)$/;" f class:Fukuzatsu
|
60
|
+
handle_index lib/fukuzatsu/cli.rb /^ def handle_index(file_summary)$/;" f class:Fukuzatsu
|
61
|
+
header lib/fukuzatsu/formatters/csv.rb /^ def header$/;" f class:Formatters.Csv
|
62
|
+
header lib/fukuzatsu/formatters/html.rb /^ def header$/;" f class:Formatters.Html
|
63
|
+
header lib/fukuzatsu/formatters/text.rb /^ def header$/;" f class:Formatters.Text
|
64
|
+
included lib/fukuzatsu/formatters/base.rb /^ def self.included(klass)$/;" F class:Formatters.Base
|
65
|
+
initialize lib/fukuzatsu/analyzer.rb /^ def initialize(content)$/;" f class:Analyzer
|
66
|
+
initialize lib/fukuzatsu/formatters/base.rb /^ def initialize(file)$/;" f class:Formatters.Base
|
67
|
+
initialize lib/fukuzatsu/formatters/html_index.rb /^ def initialize(file_summary)$/;" f class:Formatters.HtmlIndex
|
68
|
+
initialize spec/fixtures/program_3.rb /^ def initialize(path_to_file)$/;" f class:Breathalizer
|
69
|
+
methods lib/fukuzatsu/parsed_file.rb /^ def methods$/;" f class:ParsedFile
|
70
|
+
methods_from lib/fukuzatsu/analyzer.rb /^ def methods_from(node, methods=[])$/;" f class:Analyzer
|
71
|
+
output_path lib/fukuzatsu/formatters/base.rb /^ def output_path$/;" f class:Formatters.Base
|
72
|
+
output_path lib/fukuzatsu/formatters/html_index.rb /^ def output_path$/;" f class:Formatters.HtmlIndex
|
73
|
+
output_template lib/fukuzatsu/formatters/html.rb /^ def output_template$/;" f class:Formatters.Html
|
74
|
+
output_template lib/fukuzatsu/formatters/html_index.rb /^ def output_template$/;" f class:Formatters.HtmlIndex
|
75
|
+
parent_node? lib/fukuzatsu/analyzer.rb /^ def parent_node?(node)$/;" f class:Analyzer
|
76
|
+
parse spec/fixtures/program_3.rb /^ def self.parse!(path_to_file)$/;" F class:Breathalizer
|
77
|
+
parse! lib/fukuzatsu/analyzer.rb /^ def parse!$/;" f class:Analyzer
|
78
|
+
parse! spec/fixtures/program_3.rb /^ def parse!$/;" f class:Breathalizer
|
79
|
+
parsed lib/fukuzatsu/analyzer.rb /^ def parsed$/;" f class:Analyzer
|
80
|
+
parsed spec/fixtures/program_3.rb /^ def parsed$/;" f class:Breathalizer
|
81
|
+
prefix lib/fukuzatsu/parsed_method.rb /^ def prefix$/;" f class:ParsedMethod
|
82
|
+
report lib/fukuzatsu/cli.rb /^ def report(last_file, file_list)$/;" f class:Fukuzatsu
|
83
|
+
root_path lib/fukuzatsu/formatters/base.rb /^ def root_path$/;" f class:Formatters.Base
|
84
|
+
rows lib/fukuzatsu/formatters/csv.rb /^ def rows$/;" f class:Formatters.Csv
|
85
|
+
rows lib/fukuzatsu/formatters/html.rb /^ def rows$/;" f class:Formatters.Html
|
86
|
+
rows lib/fukuzatsu/formatters/text.rb /^ def rows$/;" f class:Formatters.Text
|
87
|
+
say_hello spec/fixtures/eg_class.rb /^ def say_hello$/;" f class:Foo
|
88
|
+
spaghetti spec/fixtures/program_1.rb /^def spaghetti$/;" f
|
89
|
+
text_at lib/fukuzatsu/analyzer.rb /^ def text_at(start_pos, end_pos)$/;" f class:Analyzer
|
90
|
+
toppings spec/fixtures/program_2.rb /^def toppings$/;" f
|
91
|
+
traverse lib/fukuzatsu/analyzer.rb /^ def traverse(node, accumulator=[], extract_methods=false)$/;" f class:Analyzer
|
92
|
+
traverse spec/fixtures/program_3.rb /^ def traverse(node)#, accumulator=[])$/;" f class:Breathalizer
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fukuzatsu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bantik
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-07-
|
11
|
+
date: 2014-07-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ephemeral
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: thor
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: bundler
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -109,7 +123,7 @@ dependencies:
|
|
109
123
|
- !ruby/object:Gem::Version
|
110
124
|
version: '0'
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
126
|
+
name: simplecov
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
114
128
|
requirements:
|
115
129
|
- - ">="
|
@@ -156,15 +170,28 @@ files:
|
|
156
170
|
- lib/fukuzatsu/parsed_method.rb
|
157
171
|
- lib/fukuzatsu/version.rb
|
158
172
|
- spec/analyzer_spec.rb
|
173
|
+
- spec/cli_spec.rb
|
159
174
|
- spec/fixtures/eg_class.rb
|
160
175
|
- spec/fixtures/eg_mod_class.rb
|
161
176
|
- spec/fixtures/eg_mod_class_2.rb
|
162
177
|
- spec/fixtures/eg_module.rb
|
178
|
+
- spec/fixtures/multiple_methods.rb
|
179
|
+
- spec/fixtures/nested_methods.rb
|
163
180
|
- spec/fixtures/program_1.rb
|
164
181
|
- spec/fixtures/program_2.rb
|
165
182
|
- spec/fixtures/program_3.rb
|
166
183
|
- spec/fixtures/program_4.rb
|
184
|
+
- spec/fixtures/single_class.rb
|
185
|
+
- spec/fixtures/single_method.rb
|
186
|
+
- spec/formatters/base_spec.rb
|
187
|
+
- spec/formatters/csv_spec.rb
|
188
|
+
- spec/formatters/html_index_spec.rb
|
189
|
+
- spec/formatters/html_spec.rb
|
190
|
+
- spec/formatters/text_spec.rb
|
191
|
+
- spec/parsed_file_spec.rb
|
192
|
+
- spec/parsed_method_spec.rb
|
167
193
|
- spec/spec_helper.rb
|
194
|
+
- tags
|
168
195
|
homepage: https://gitlab.com/coraline/fukuzatsu/tree/master
|
169
196
|
licenses:
|
170
197
|
- MIT
|
@@ -191,12 +218,24 @@ specification_version: 4
|
|
191
218
|
summary: A simple code complexity analyzer.
|
192
219
|
test_files:
|
193
220
|
- spec/analyzer_spec.rb
|
221
|
+
- spec/cli_spec.rb
|
194
222
|
- spec/fixtures/eg_class.rb
|
195
223
|
- spec/fixtures/eg_mod_class.rb
|
196
224
|
- spec/fixtures/eg_mod_class_2.rb
|
197
225
|
- spec/fixtures/eg_module.rb
|
226
|
+
- spec/fixtures/multiple_methods.rb
|
227
|
+
- spec/fixtures/nested_methods.rb
|
198
228
|
- spec/fixtures/program_1.rb
|
199
229
|
- spec/fixtures/program_2.rb
|
200
230
|
- spec/fixtures/program_3.rb
|
201
231
|
- spec/fixtures/program_4.rb
|
232
|
+
- spec/fixtures/single_class.rb
|
233
|
+
- spec/fixtures/single_method.rb
|
234
|
+
- spec/formatters/base_spec.rb
|
235
|
+
- spec/formatters/csv_spec.rb
|
236
|
+
- spec/formatters/html_index_spec.rb
|
237
|
+
- spec/formatters/html_spec.rb
|
238
|
+
- spec/formatters/text_spec.rb
|
239
|
+
- spec/parsed_file_spec.rb
|
240
|
+
- spec/parsed_method_spec.rb
|
202
241
|
- spec/spec_helper.rb
|