kevinrutherford-reek 1.0.1 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +42 -22
- data/config/defaults.reek +1 -0
- data/lib/reek.rb +1 -1
- data/lib/reek/block_context.rb +27 -5
- data/lib/reek/class_context.rb +5 -4
- data/lib/reek/code_parser.rb +26 -11
- data/lib/reek/method_context.rb +18 -12
- data/lib/reek/module_context.rb +1 -1
- data/lib/reek/name.rb +8 -1
- data/lib/reek/object_refs.rb +2 -3
- data/lib/reek/report.rb +11 -4
- data/lib/reek/sexp_formatter.rb +4 -46
- data/lib/reek/smells/large_class.rb +26 -7
- data/lib/reek/smells/long_parameter_list.rb +1 -1
- data/lib/reek/smells/smells.rb +4 -8
- data/lib/reek/source.rb +31 -4
- data/lib/reek/spec.rb +6 -0
- data/lib/reek/stop_context.rb +4 -16
- data/lib/reek/yield_call_context.rb +1 -3
- data/reek.gemspec +8 -5
- data/spec/reek/block_context_spec.rb +40 -0
- data/spec/reek/class_context_spec.rb +11 -0
- data/spec/reek/code_context_spec.rb +2 -1
- data/spec/reek/code_parser_spec.rb +0 -10
- data/spec/reek/config_spec.rb +2 -2
- data/spec/reek/method_context_spec.rb +14 -0
- data/spec/reek/name_spec.rb +13 -0
- data/spec/reek/object_refs_spec.rb +11 -9
- data/spec/reek/report_spec.rb +1 -1
- data/spec/reek/sexp_formatter_spec.rb +5 -4
- data/spec/reek/singleton_method_context_spec.rb +1 -1
- data/spec/reek/smells/duplication_spec.rb +2 -2
- data/spec/reek/smells/feature_envy_spec.rb +132 -36
- data/spec/reek/smells/large_class_spec.rb +48 -47
- data/spec/reek/smells/long_method_spec.rb +1 -1
- data/spec/reek/smells/long_parameter_list_spec.rb +4 -11
- data/spec/reek/smells/uncommunicative_name_spec.rb +6 -1
- data/spec/reek/smells/utility_function_spec.rb +6 -9
- data/spec/{samples → slow}/inline_spec.rb +14 -10
- data/spec/{samples → slow}/optparse_spec.rb +20 -12
- data/spec/{samples → slow}/redcloth_spec.rb +16 -8
- data/spec/{integration → slow}/reek_source_spec.rb +0 -0
- data/spec/{samples → slow/samples}/inline.rb +0 -0
- data/spec/{samples → slow/samples}/optparse.rb +0 -0
- data/spec/{samples → slow/samples}/redcloth.rb +0 -0
- data/spec/{integration → slow}/script_spec.rb +0 -0
- data/spec/{reek/source_spec.rb → slow/source_list_spec.rb} +3 -3
- data/spec/spec_helper.rb +2 -0
- data/tasks/rspec.rake +1 -1
- metadata +24 -12
@@ -9,8 +9,9 @@ module Reek
|
|
9
9
|
# instance variables, methods or lines of code.
|
10
10
|
#
|
11
11
|
# Currently +LargeClass+ only reports classes having more than a
|
12
|
-
# configurable number of methods
|
13
|
-
#
|
12
|
+
# configurable number of methods or instance variables. The method count
|
13
|
+
# includes public, protected and
|
14
|
+
# private methods, and excludes methods inherited from superclasses or
|
14
15
|
# included modules.
|
15
16
|
#
|
16
17
|
class LargeClass < SmellDetector
|
@@ -19,6 +20,10 @@ module Reek
|
|
19
20
|
# permitted in a class.
|
20
21
|
MAX_ALLOWED_METHODS_KEY = 'max_methods'
|
21
22
|
|
23
|
+
# The name of the config field that sets the maximum number of instance
|
24
|
+
# variables permitted in a class.
|
25
|
+
MAX_ALLOWED_IVARS_KEY = 'max_instance_variables'
|
26
|
+
|
22
27
|
def self.contexts # :nodoc:
|
23
28
|
[:class]
|
24
29
|
end
|
@@ -26,6 +31,7 @@ module Reek
|
|
26
31
|
def self.default_config
|
27
32
|
super.adopt(
|
28
33
|
MAX_ALLOWED_METHODS_KEY => 25,
|
34
|
+
MAX_ALLOWED_IVARS_KEY => 9,
|
29
35
|
EXCLUDE_KEY => ['Array', 'Hash', 'Module', 'String']
|
30
36
|
)
|
31
37
|
end
|
@@ -33,17 +39,30 @@ module Reek
|
|
33
39
|
def initialize(config = LargeClass.default_config)
|
34
40
|
super
|
35
41
|
@max_methods = config[MAX_ALLOWED_METHODS_KEY]
|
42
|
+
@max_instance_variables = config[MAX_ALLOWED_IVARS_KEY]
|
43
|
+
end
|
44
|
+
|
45
|
+
def check_num_methods(klass, report) # :nodoc:
|
46
|
+
count = klass.num_methods
|
47
|
+
return if count <= @max_methods
|
48
|
+
report << SmellWarning.new(self, klass,
|
49
|
+
"has at least #{count} methods")
|
50
|
+
end
|
51
|
+
|
52
|
+
def check_num_ivars(klass, report) # :nodoc:
|
53
|
+
count = klass.variable_names.length
|
54
|
+
return if count <= @max_instance_variables
|
55
|
+
report << SmellWarning.new(self, klass,
|
56
|
+
"has at least #{count} instance variables")
|
36
57
|
end
|
37
58
|
|
38
59
|
#
|
39
|
-
# Checks
|
60
|
+
# Checks +klass+ for too many methods or too many instance variables.
|
40
61
|
# Any smells found are added to the +report+.
|
41
62
|
#
|
42
63
|
def examine_context(klass, report)
|
43
|
-
|
44
|
-
|
45
|
-
report << SmellWarning.new(self, klass,
|
46
|
-
"has at least #{num_methods} methods")
|
64
|
+
check_num_methods(klass, report)
|
65
|
+
check_num_ivars(klass, report)
|
47
66
|
end
|
48
67
|
end
|
49
68
|
end
|
data/lib/reek/smells/smells.rb
CHANGED
@@ -11,13 +11,10 @@ require 'reek/smells/utility_function'
|
|
11
11
|
require 'yaml'
|
12
12
|
|
13
13
|
class Hash
|
14
|
-
def
|
15
|
-
|
16
|
-
self[key].adopt!(other[key])
|
17
|
-
end
|
18
|
-
self
|
14
|
+
def push_keys(hash)
|
15
|
+
keys.each {|key| hash[key].adopt!(self[key]) }
|
19
16
|
end
|
20
|
-
|
17
|
+
|
21
18
|
def adopt!(other)
|
22
19
|
other.keys.each do |key|
|
23
20
|
ov = other[key]
|
@@ -69,8 +66,7 @@ module Reek
|
|
69
66
|
def load_local(file)
|
70
67
|
path = File.expand_path(file)
|
71
68
|
all_reekfiles(path).each do |rfile|
|
72
|
-
|
73
|
-
@config.value_merge!(cf)
|
69
|
+
YAML.load_file(rfile).push_keys(@config)
|
74
70
|
end
|
75
71
|
self
|
76
72
|
end
|
data/lib/reek/source.rb
CHANGED
@@ -12,6 +12,14 @@ module Reek
|
|
12
12
|
#
|
13
13
|
class Source
|
14
14
|
|
15
|
+
#
|
16
|
+
# Factory method: creates a +Source+ from obj.
|
17
|
+
# The code is not parsed until +report+ is called.
|
18
|
+
#
|
19
|
+
def self.from_object(obj)
|
20
|
+
return ObjectSource.new(obj, obj.to_s)
|
21
|
+
end
|
22
|
+
|
15
23
|
#
|
16
24
|
# Factory method: creates a +Source+ object by reading Ruby code from
|
17
25
|
# the +IO+ stream. The stream is consumed upto end-of-file, but the
|
@@ -57,10 +65,15 @@ module Reek
|
|
57
65
|
SourceList.new(sources)
|
58
66
|
end
|
59
67
|
|
60
|
-
def initialize(code, desc, dir =
|
68
|
+
def initialize(code, desc, dir = nil) # :nodoc:
|
61
69
|
@source = code
|
62
|
-
@dir = dir
|
63
70
|
@desc = desc
|
71
|
+
@cf = SmellConfig.new
|
72
|
+
@cf = @cf.load_local(dir) if dir
|
73
|
+
end
|
74
|
+
|
75
|
+
def check(parser) # :nodoc:
|
76
|
+
parser.check_source(@source)
|
64
77
|
end
|
65
78
|
|
66
79
|
#
|
@@ -71,8 +84,7 @@ module Reek
|
|
71
84
|
def report
|
72
85
|
unless @report
|
73
86
|
@report = Report.new
|
74
|
-
|
75
|
-
CodeParser.new(@report, smells).check_source(@source)
|
87
|
+
check(CodeParser.new(@report, @cf.smell_listeners))
|
76
88
|
end
|
77
89
|
@report
|
78
90
|
end
|
@@ -89,6 +101,12 @@ module Reek
|
|
89
101
|
report.any? { |smell| smell.matches?(smell_class, patterns) }
|
90
102
|
end
|
91
103
|
|
104
|
+
# Creates a formatted report of all the +Smells::SmellWarning+ objects recorded in
|
105
|
+
# this report, with a heading.
|
106
|
+
def full_report
|
107
|
+
report.full_report(@desc)
|
108
|
+
end
|
109
|
+
|
92
110
|
def to_s
|
93
111
|
@desc
|
94
112
|
end
|
@@ -110,4 +128,13 @@ module Reek
|
|
110
128
|
ReportList.new(@sources)
|
111
129
|
end
|
112
130
|
end
|
131
|
+
|
132
|
+
#
|
133
|
+
# Represents an in-memory object that will be checked for smells.
|
134
|
+
#
|
135
|
+
class ObjectSource < Source
|
136
|
+
def check(parser) # :nodoc:
|
137
|
+
parser.check_object(@source)
|
138
|
+
end
|
139
|
+
end
|
113
140
|
end
|
data/lib/reek/spec.rb
CHANGED
data/lib/reek/stop_context.rb
CHANGED
@@ -5,6 +5,10 @@ module Reek
|
|
5
5
|
@refs = ObjectRefs.new
|
6
6
|
@myself = Object
|
7
7
|
end
|
8
|
+
def method_missing(method, *args)
|
9
|
+
nil
|
10
|
+
end
|
11
|
+
|
8
12
|
|
9
13
|
def count_statements(num)
|
10
14
|
0
|
@@ -39,22 +43,6 @@ module Reek
|
|
39
43
|
false
|
40
44
|
end
|
41
45
|
|
42
|
-
def record_call_to(exp)
|
43
|
-
nil
|
44
|
-
end
|
45
|
-
|
46
|
-
def record_method(name)
|
47
|
-
end
|
48
|
-
|
49
|
-
def record_parameter(sym)
|
50
|
-
end
|
51
|
-
|
52
|
-
def record_instance_variable(sym)
|
53
|
-
end
|
54
|
-
|
55
|
-
def record_local_variable(sym)
|
56
|
-
end
|
57
|
-
|
58
46
|
def outer_name
|
59
47
|
''
|
60
48
|
end
|
data/reek.gemspec
CHANGED
@@ -2,17 +2,17 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{reek}
|
5
|
-
s.version = "1.
|
5
|
+
s.version = "1.1.1"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Kevin Rutherford"]
|
9
|
-
s.date = %q{2009-
|
9
|
+
s.date = %q{2009-05-08}
|
10
10
|
s.default_executable = %q{reek}
|
11
11
|
s.description = %q{Code smell detector for Ruby}
|
12
12
|
s.email = ["kevin@rutherford-software.com"]
|
13
13
|
s.executables = ["reek"]
|
14
14
|
s.extra_rdoc_files = ["History.txt", "README.txt"]
|
15
|
-
s.files = ["History.txt", "README.txt", "Rakefile", "bin/reek", "config/defaults.reek", "lib/reek.rb", "lib/reek/block_context.rb", "lib/reek/class_context.rb", "lib/reek/code_context.rb", "lib/reek/code_parser.rb", "lib/reek/exceptions.reek", "lib/reek/if_context.rb", "lib/reek/method_context.rb", "lib/reek/module_context.rb", "lib/reek/name.rb", "lib/reek/object_refs.rb", "lib/reek/options.rb", "lib/reek/rake_task.rb", "lib/reek/report.rb", "lib/reek/sexp_formatter.rb", "lib/reek/singleton_method_context.rb", "lib/reek/smell_warning.rb", "lib/reek/smells/control_couple.rb", "lib/reek/smells/duplication.rb", "lib/reek/smells/feature_envy.rb", "lib/reek/smells/large_class.rb", "lib/reek/smells/long_method.rb", "lib/reek/smells/long_parameter_list.rb", "lib/reek/smells/long_yield_list.rb", "lib/reek/smells/nested_iterators.rb", "lib/reek/smells/smell_detector.rb", "lib/reek/smells/smells.rb", "lib/reek/smells/uncommunicative_name.rb", "lib/reek/smells/utility_function.rb", "lib/reek/source.rb", "lib/reek/spec.rb", "lib/reek/stop_context.rb", "lib/reek/yield_call_context.rb", "reek.gemspec", "spec/
|
15
|
+
s.files = ["History.txt", "README.txt", "Rakefile", "bin/reek", "config/defaults.reek", "lib/reek.rb", "lib/reek/block_context.rb", "lib/reek/class_context.rb", "lib/reek/code_context.rb", "lib/reek/code_parser.rb", "lib/reek/exceptions.reek", "lib/reek/if_context.rb", "lib/reek/method_context.rb", "lib/reek/module_context.rb", "lib/reek/name.rb", "lib/reek/object_refs.rb", "lib/reek/options.rb", "lib/reek/rake_task.rb", "lib/reek/report.rb", "lib/reek/sexp_formatter.rb", "lib/reek/singleton_method_context.rb", "lib/reek/smell_warning.rb", "lib/reek/smells/control_couple.rb", "lib/reek/smells/duplication.rb", "lib/reek/smells/feature_envy.rb", "lib/reek/smells/large_class.rb", "lib/reek/smells/long_method.rb", "lib/reek/smells/long_parameter_list.rb", "lib/reek/smells/long_yield_list.rb", "lib/reek/smells/nested_iterators.rb", "lib/reek/smells/smell_detector.rb", "lib/reek/smells/smells.rb", "lib/reek/smells/uncommunicative_name.rb", "lib/reek/smells/utility_function.rb", "lib/reek/source.rb", "lib/reek/spec.rb", "lib/reek/stop_context.rb", "lib/reek/yield_call_context.rb", "reek.gemspec", "spec/reek/block_context_spec.rb", "spec/reek/class_context_spec.rb", "spec/reek/code_context_spec.rb", "spec/reek/code_parser_spec.rb", "spec/reek/config_spec.rb", "spec/reek/if_context_spec.rb", "spec/reek/method_context_spec.rb", "spec/reek/module_context_spec.rb", "spec/reek/name_spec.rb", "spec/reek/object_refs_spec.rb", "spec/reek/options_spec.rb", "spec/reek/report_spec.rb", "spec/reek/sexp_formatter_spec.rb", "spec/reek/singleton_method_context_spec.rb", "spec/reek/smells/control_couple_spec.rb", "spec/reek/smells/duplication_spec.rb", "spec/reek/smells/feature_envy_spec.rb", "spec/reek/smells/large_class_spec.rb", "spec/reek/smells/long_method_spec.rb", "spec/reek/smells/long_parameter_list_spec.rb", "spec/reek/smells/nested_iterators_spec.rb", "spec/reek/smells/smell_spec.rb", "spec/reek/smells/uncommunicative_name_spec.rb", "spec/reek/smells/utility_function_spec.rb", "spec/slow/inline_spec.rb", "spec/slow/optparse_spec.rb", "spec/slow/redcloth_spec.rb", "spec/slow/reek_source_spec.rb", "spec/slow/samples/inline.rb", "spec/slow/samples/optparse.rb", "spec/slow/samples/redcloth.rb", "spec/slow/script_spec.rb", "spec/slow/source_list_spec.rb", "spec/spec.opts", "spec/spec_helper.rb", "tasks/reek.rake", "tasks/rspec.rake"]
|
16
16
|
s.has_rdoc = true
|
17
17
|
s.homepage = %q{http://wiki.github.com/kevinrutherford/reek}
|
18
18
|
s.post_install_message = %q{
|
@@ -21,22 +21,25 @@ For more information on reek, see http://wiki.github.com/kevinrutherford/reek
|
|
21
21
|
s.rdoc_options = ["--main", "README.txt"]
|
22
22
|
s.require_paths = ["lib"]
|
23
23
|
s.rubyforge_project = %q{reek}
|
24
|
-
s.rubygems_version = %q{1.3.
|
24
|
+
s.rubygems_version = %q{1.3.2}
|
25
25
|
s.summary = %q{Code smell detector for Ruby}
|
26
26
|
|
27
27
|
if s.respond_to? :specification_version then
|
28
28
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
29
|
-
s.specification_version =
|
29
|
+
s.specification_version = 3
|
30
30
|
|
31
31
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
32
32
|
s.add_runtime_dependency(%q<ParseTree>, ["~> 3.0"])
|
33
|
+
s.add_runtime_dependency(%q<ruby2ruby>, ["~> 1.2"])
|
33
34
|
s.add_runtime_dependency(%q<sexp_processor>, ["~> 3.0"])
|
34
35
|
else
|
35
36
|
s.add_dependency(%q<ParseTree>, ["~> 3.0"])
|
37
|
+
s.add_dependency(%q<ruby2ruby>, ["~> 1.2"])
|
36
38
|
s.add_dependency(%q<sexp_processor>, ["~> 3.0"])
|
37
39
|
end
|
38
40
|
else
|
39
41
|
s.add_dependency(%q<ParseTree>, ["~> 3.0"])
|
42
|
+
s.add_dependency(%q<ruby2ruby>, ["~> 1.2"])
|
40
43
|
s.add_dependency(%q<sexp_processor>, ["~> 3.0"])
|
41
44
|
end
|
42
45
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper.rb'
|
2
|
+
|
3
|
+
require 'reek/block_context'
|
4
|
+
require 'reek/method_context'
|
5
|
+
|
6
|
+
include Reek
|
7
|
+
|
8
|
+
describe BlockContext do
|
9
|
+
|
10
|
+
it "should record single parameter" do
|
11
|
+
element = StopContext.new
|
12
|
+
element = BlockContext.new(element, s(s(:lasgn, :x), nil))
|
13
|
+
element.variable_names.should == [Name.new(:x)]
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should record single parameter within a method" do
|
17
|
+
element = StopContext.new
|
18
|
+
element = MethodContext.new(element, s(:defn, :help))
|
19
|
+
element = BlockContext.new(element, s(s(:lasgn, :x), nil))
|
20
|
+
element.variable_names.should == [Name.new(:x)]
|
21
|
+
end
|
22
|
+
|
23
|
+
it "records multiple parameters" do
|
24
|
+
element = StopContext.new
|
25
|
+
element = BlockContext.new(element, s(s(:masgn, s(:array, s(:lasgn, :x), s(:lasgn, :y))), nil))
|
26
|
+
element.variable_names.should == [Name.new(:x), Name.new(:y)]
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should not pass parameters upward" do
|
30
|
+
mc = MethodContext.new(StopContext.new, s(:defn, :help))
|
31
|
+
element = BlockContext.new(mc, s(s(:lasgn, :x)))
|
32
|
+
mc.variable_names.should be_empty
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'records local variables' do
|
36
|
+
bctx = BlockContext.new(StopContext.new, nil)
|
37
|
+
bctx.record_local_variable(:q2)
|
38
|
+
bctx.variable_names.should include(Name.new(:q2))
|
39
|
+
end
|
40
|
+
end
|
@@ -196,3 +196,14 @@ describe CodeContext, 'find class' do
|
|
196
196
|
end
|
197
197
|
end
|
198
198
|
end
|
199
|
+
|
200
|
+
describe ClassContext do
|
201
|
+
it 'should not report empty class in another module' do
|
202
|
+
'class Treetop::Runtime::SyntaxNode; end'.should_not reek
|
203
|
+
end
|
204
|
+
|
205
|
+
it 'should deal with :: scoped names' do
|
206
|
+
element = ClassContext.create(StopContext.new, [:colon2, [:colon2, [:const, :Treetop], :Runtime], :SyntaxNode])
|
207
|
+
element.num_methods.should == 0
|
208
|
+
end
|
209
|
+
end
|
@@ -45,7 +45,8 @@ describe CodeContext, 'instance variables' do
|
|
45
45
|
element = MethodContext.new(class_element, [0, :bad])
|
46
46
|
element = BlockContext.new(element, nil)
|
47
47
|
element.record_instance_variable(:fred)
|
48
|
-
class_element.variable_names.should ==
|
48
|
+
class_element.variable_names.size.should == 1
|
49
|
+
class_element.variable_names.should include(Name.new(:fred))
|
49
50
|
end
|
50
51
|
end
|
51
52
|
|
@@ -20,16 +20,6 @@ describe CodeParser, 'with a global method definition' do
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
describe CodeParser, 'when given a C extension' do
|
24
|
-
before(:each) do
|
25
|
-
@cchk = CodeParser.new(Report.new, SmellConfig.new.smell_listeners)
|
26
|
-
end
|
27
|
-
|
28
|
-
it 'should ignore :cfunc' do
|
29
|
-
@cchk.check_object(Enumerable)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
23
|
describe CodeParser, 'when a yield is the receiver' do
|
34
24
|
it 'should report no problems' do
|
35
25
|
source = 'def values(*args)
|
data/spec/reek/config_spec.rb
CHANGED
@@ -17,7 +17,7 @@ describe 'Config' do
|
|
17
17
|
other = Hash.new {|hash,key| hash[key] = {} }
|
18
18
|
other['one']['gunk'] = 45
|
19
19
|
other['two']['four'] = false
|
20
|
-
@first
|
20
|
+
other.push_keys(@first)
|
21
21
|
@first['two']['four'].should == false
|
22
22
|
@first['one'].keys.length.should == 3
|
23
23
|
end
|
@@ -36,7 +36,7 @@ describe Config, 'merging arrays' do
|
|
36
36
|
it 'should merge array values' do
|
37
37
|
first = {'key' => {'one' => [1,2,3]}}
|
38
38
|
second = {'key' => {'one' => [4,5]}}
|
39
|
-
|
39
|
+
second.push_keys(first)
|
40
40
|
first['key']['one'].should == [1,2,3,4,5]
|
41
41
|
end
|
42
42
|
end
|
@@ -49,4 +49,18 @@ describe MethodContext do
|
|
49
49
|
mctx.record_call_to([:call, [:ivar, :@cow], :feed_to])
|
50
50
|
mctx.envious_receivers.should == []
|
51
51
|
end
|
52
|
+
|
53
|
+
it 'should count calls to self' do
|
54
|
+
mctx = MethodContext.new(StopContext.new, [:defn, :equals])
|
55
|
+
mctx.refs.record_ref([:lvar, :other])
|
56
|
+
mctx.record_call_to([:call, [:self], :thing])
|
57
|
+
mctx.envious_receivers.should be_empty
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should recognise a call on self' do
|
61
|
+
mc = MethodContext.new(StopContext.new, s(:defn, :deep))
|
62
|
+
mc.record_call_to(s(:call, s(:lvar, :text), :each, s(:arglist)))
|
63
|
+
mc.record_call_to(s(:call, nil, :shelve, s(:arglist)))
|
64
|
+
mc.envious_receivers.should be_empty
|
65
|
+
end
|
52
66
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper.rb'
|
2
|
+
require 'reek/name'
|
3
|
+
|
4
|
+
include Reek
|
5
|
+
|
6
|
+
describe Name, 'resolving symbols' do
|
7
|
+
it 'finds fq loaded class' do
|
8
|
+
exp = [:class, :"Reek::Smells::LargeClass", nil]
|
9
|
+
ctx = StopContext.new
|
10
|
+
res = Name.resolve(exp[1], ctx)
|
11
|
+
res[1].should == "LargeClass"
|
12
|
+
end
|
13
|
+
end
|
@@ -9,8 +9,8 @@ describe ObjectRefs, 'when empty' do
|
|
9
9
|
@refs = ObjectRefs.new
|
10
10
|
end
|
11
11
|
|
12
|
-
it 'should report
|
13
|
-
@refs.refs_to_self.should ==
|
12
|
+
it 'should report no refs to self' do
|
13
|
+
@refs.refs_to_self.should == 0
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
@@ -23,7 +23,7 @@ describe ObjectRefs, 'with no refs to self' do
|
|
23
23
|
end
|
24
24
|
|
25
25
|
it 'should report no refs to self' do
|
26
|
-
@refs.refs_to_self.should ==
|
26
|
+
@refs.refs_to_self.should == 0
|
27
27
|
end
|
28
28
|
|
29
29
|
it 'should report :a as the max' do
|
@@ -45,16 +45,16 @@ describe ObjectRefs, 'with one ref to self' do
|
|
45
45
|
end
|
46
46
|
|
47
47
|
it 'should report 1 ref to self' do
|
48
|
-
@refs.refs_to_self.should ==
|
48
|
+
@refs.refs_to_self.should == 1
|
49
49
|
end
|
50
50
|
|
51
|
-
it 'should report self among the max' do
|
51
|
+
it 'should not report self among the max' do
|
52
52
|
@refs.max_keys.should be_include('a')
|
53
|
-
@refs.max_keys.
|
53
|
+
@refs.max_keys.should_not include(Sexp.from_array([:lit, :self]))
|
54
54
|
end
|
55
55
|
|
56
|
-
it 'should report self as the max' do
|
57
|
-
@refs.self_is_max?.should ==
|
56
|
+
it 'should not report self as the max' do
|
57
|
+
@refs.self_is_max?.should == false
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
@@ -62,6 +62,7 @@ describe ObjectRefs, 'with many refs to self' do
|
|
62
62
|
before(:each) do
|
63
63
|
@refs = ObjectRefs.new
|
64
64
|
@refs.record_reference_to_self
|
65
|
+
@refs.record_reference_to_self
|
65
66
|
@refs.record_ref('a')
|
66
67
|
@refs.record_reference_to_self
|
67
68
|
@refs.record_ref('b')
|
@@ -87,6 +88,7 @@ describe ObjectRefs, 'when self is not the only max' do
|
|
87
88
|
@refs = ObjectRefs.new
|
88
89
|
@refs.record_ref('a')
|
89
90
|
@refs.record_reference_to_self
|
91
|
+
@refs.record_reference_to_self
|
90
92
|
@refs.record_ref('b')
|
91
93
|
@refs.record_ref('a')
|
92
94
|
end
|
@@ -115,7 +117,7 @@ describe ObjectRefs, 'when self is not among the max' do
|
|
115
117
|
end
|
116
118
|
|
117
119
|
it 'should report all refs to self' do
|
118
|
-
@refs.refs_to_self.should ==
|
120
|
+
@refs.refs_to_self.should == 0
|
119
121
|
end
|
120
122
|
|
121
123
|
it 'should not report self among the max' do
|