reek 0.3.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +20 -0
- data/README.txt +4 -80
- data/Rakefile +15 -4
- data/bin/reek +10 -16
- data/config/defaults.reek +53 -0
- data/lib/reek.rb +1 -21
- data/lib/reek/block_context.rb +37 -0
- data/lib/reek/class_context.rb +73 -0
- data/lib/reek/code_context.rb +47 -0
- data/lib/reek/code_parser.rb +204 -0
- data/lib/reek/exceptions.reek +13 -0
- data/lib/reek/if_context.rb +25 -0
- data/lib/reek/method_context.rb +85 -0
- data/lib/reek/module_context.rb +34 -0
- data/lib/reek/name.rb +42 -0
- data/lib/reek/object_refs.rb +3 -6
- data/lib/reek/options.rb +60 -40
- data/lib/reek/rake_task.rb +20 -29
- data/lib/reek/report.rb +16 -27
- data/lib/reek/sexp_formatter.rb +52 -0
- data/lib/reek/singleton_method_context.rb +27 -0
- data/lib/reek/smell_warning.rb +49 -0
- data/lib/reek/smells/control_couple.rb +21 -13
- data/lib/reek/smells/duplication.rb +23 -27
- data/lib/reek/smells/feature_envy.rb +18 -25
- data/lib/reek/smells/large_class.rb +32 -17
- data/lib/reek/smells/long_method.rb +24 -16
- data/lib/reek/smells/long_parameter_list.rb +25 -18
- data/lib/reek/smells/long_yield_list.rb +7 -9
- data/lib/reek/smells/nested_iterators.rb +13 -9
- data/lib/reek/smells/smell_detector.rb +66 -0
- data/lib/reek/smells/smells.rb +71 -10
- data/lib/reek/smells/uncommunicative_name.rb +49 -41
- data/lib/reek/smells/utility_function.rb +18 -18
- data/lib/reek/source.rb +116 -0
- data/lib/reek/spec.rb +146 -0
- data/lib/reek/stop_context.rb +62 -0
- data/lib/reek/yield_call_context.rb +14 -0
- data/reek.gemspec +42 -0
- data/spec/integration/reek_source_spec.rb +20 -0
- data/spec/{script_spec.rb → integration/script_spec.rb} +11 -24
- data/spec/reek/class_context_spec.rb +198 -0
- data/spec/reek/code_context_spec.rb +92 -0
- data/spec/reek/code_parser_spec.rb +44 -0
- data/spec/reek/config_spec.rb +42 -0
- data/spec/reek/if_context_spec.rb +17 -0
- data/spec/reek/method_context_spec.rb +52 -0
- data/spec/reek/module_context_spec.rb +38 -0
- data/spec/reek/options_spec.rb +2 -28
- data/spec/reek/report_spec.rb +6 -40
- data/spec/reek/sexp_formatter_spec.rb +31 -0
- data/spec/reek/singleton_method_context_spec.rb +17 -0
- data/spec/reek/smells/control_couple_spec.rb +10 -18
- data/spec/reek/smells/duplication_spec.rb +53 -32
- data/spec/reek/smells/feature_envy_spec.rb +87 -49
- data/spec/reek/smells/large_class_spec.rb +45 -4
- data/spec/reek/smells/long_method_spec.rb +25 -41
- data/spec/reek/smells/long_parameter_list_spec.rb +30 -76
- data/spec/reek/smells/nested_iterators_spec.rb +19 -29
- data/spec/reek/smells/smell_spec.rb +9 -18
- data/spec/reek/smells/uncommunicative_name_spec.rb +88 -53
- data/spec/reek/smells/utility_function_spec.rb +45 -44
- data/spec/samples/inline_spec.rb +40 -0
- data/spec/samples/optparse_spec.rb +100 -0
- data/spec/samples/redcloth_spec.rb +93 -0
- data/spec/spec_helper.rb +3 -1
- data/tasks/reek.rake +1 -10
- data/tasks/rspec.rake +16 -35
- metadata +43 -46
- data/lib/reek/checker.rb +0 -66
- data/lib/reek/class_checker.rb +0 -25
- data/lib/reek/file_checker.rb +0 -20
- data/lib/reek/method_checker.rb +0 -198
- data/lib/reek/printer.rb +0 -154
- data/lib/reek/smells/smell.rb +0 -56
- data/lib/reek/version.rb +0 -9
- data/setup.rb +0 -1585
- data/spec/integration_spec.rb +0 -30
- data/spec/reek/class_checker_spec.rb +0 -48
- data/spec/reek/method_checker_spec.rb +0 -67
- data/spec/reek/printer_spec.rb +0 -30
- data/spec/reek_source_spec.rb +0 -12
- data/spec/samples/inline.reek +0 -27
- data/spec/samples/optparse.reek +0 -79
- data/spec/samples/optparse/date.rb +0 -17
- data/spec/samples/optparse/shellwords.rb +0 -6
- data/spec/samples/optparse/time.rb +0 -10
- data/spec/samples/optparse/uri.rb +0 -6
- data/spec/samples/optparse/version.rb +0 -70
- data/spec/samples/redcloth.reek +0 -65
- data/tasks/samples.rake +0 -17
- data/website/index.html +0 -71
- data/website/index.txt +0 -40
- data/website/javascripts/rounded_corners_lite.inc.js +0 -285
- data/website/stylesheets/screen.css +0 -138
- data/website/template.rhtml +0 -48
@@ -1,6 +1,5 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require 'reek/smells/smell'
|
1
|
+
require 'reek/smells/smell_detector'
|
2
|
+
require 'reek/smell_warning'
|
4
3
|
|
5
4
|
module Reek
|
6
5
|
module Smells
|
@@ -8,27 +7,28 @@ module Reek
|
|
8
7
|
#
|
9
8
|
# A Utility Function is any instance method that has no
|
10
9
|
# dependency on the state of the instance.
|
10
|
+
#
|
11
|
+
# Currently +UtilityFunction+ will warn about any method that:
|
12
|
+
#
|
13
|
+
# * is non-empty
|
14
|
+
# * does not override an inherited method
|
15
|
+
# * calls at least one method on another object
|
16
|
+
# * doesn't use any of self's instance variables
|
17
|
+
# * doesn't use any of self's methods
|
11
18
|
#
|
12
|
-
class UtilityFunction <
|
19
|
+
class UtilityFunction < SmellDetector
|
13
20
|
|
14
21
|
#
|
15
22
|
# Checks whether the given +method+ is a utility function.
|
16
|
-
# Any smells found are added to the +report
|
17
|
-
# and false otherwise.
|
23
|
+
# Any smells found are added to the +report+.
|
18
24
|
#
|
19
|
-
def
|
20
|
-
return false if method.
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
false
|
26
|
-
end
|
27
|
-
|
28
|
-
def detailed_report
|
29
|
-
"#{@context} doesn't depend on instance state"
|
25
|
+
def examine_context(method, report)
|
26
|
+
return false if method.calls.keys.length == 0 or
|
27
|
+
method.num_statements == 0 or
|
28
|
+
method.depends_on_instance?
|
29
|
+
report << SmellWarning.new(self, method,
|
30
|
+
"doesn't depend on instance state")
|
30
31
|
end
|
31
32
|
end
|
32
|
-
|
33
33
|
end
|
34
34
|
end
|
data/lib/reek/source.rb
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'reek/code_parser'
|
2
|
+
require 'reek/report'
|
3
|
+
require 'reek/smells/smells'
|
4
|
+
|
5
|
+
module Reek
|
6
|
+
|
7
|
+
#
|
8
|
+
# A +Source+ object represents a chunk of Ruby source code.
|
9
|
+
#
|
10
|
+
# The various class methods are factories that will create +Source+
|
11
|
+
# instances from various types of input.
|
12
|
+
#
|
13
|
+
class Source
|
14
|
+
|
15
|
+
#
|
16
|
+
# Factory method: creates a +Source+ object by reading Ruby code from
|
17
|
+
# the +IO+ stream. The stream is consumed upto end-of-file, but the
|
18
|
+
# source code is not parsed until +report+ is called. +desc+ provides
|
19
|
+
# a string description to be used in the header of formatted reports.
|
20
|
+
#
|
21
|
+
def self.from_io(ios, desc)
|
22
|
+
code = ios.readlines.join
|
23
|
+
return new(code, desc)
|
24
|
+
end
|
25
|
+
|
26
|
+
#
|
27
|
+
# Factory method: creates a +Source+ object by reading Ruby code from
|
28
|
+
# the +code+ string. The code is not parsed until +report+ is called.
|
29
|
+
#
|
30
|
+
def self.from_s(code)
|
31
|
+
return new(code, 'string')
|
32
|
+
end
|
33
|
+
|
34
|
+
#
|
35
|
+
# Factory method: creates a +Source+ object by reading Ruby code from
|
36
|
+
# File +file+. The source code is not parsed until +report+ is called.
|
37
|
+
#
|
38
|
+
def self.from_f(file)
|
39
|
+
from_path(file.path)
|
40
|
+
end
|
41
|
+
|
42
|
+
#
|
43
|
+
# Factory method: creates a +Source+ object by reading Ruby code from
|
44
|
+
# the named file. The source code is not parsed until +report+ is called.
|
45
|
+
#
|
46
|
+
def self.from_path(filename)
|
47
|
+
code = IO.readlines(filename).join
|
48
|
+
return new(code, filename, File.dirname(filename))
|
49
|
+
end
|
50
|
+
|
51
|
+
#
|
52
|
+
# Factory method: creates a +Source+ object from an array of file paths.
|
53
|
+
# No source code is actually parsed until the report is accessed.
|
54
|
+
#
|
55
|
+
def self.from_pathlist(paths)
|
56
|
+
sources = paths.map {|path| Source.from_path(path) }
|
57
|
+
SourceList.new(sources)
|
58
|
+
end
|
59
|
+
|
60
|
+
def initialize(code, desc, dir = '.') # :nodoc:
|
61
|
+
@source = code
|
62
|
+
@dir = dir
|
63
|
+
@desc = desc
|
64
|
+
end
|
65
|
+
|
66
|
+
#
|
67
|
+
# Returns a +Report+ listing the smells found in this source. The first
|
68
|
+
# call to +report+ parses the source code and constructs a list of
|
69
|
+
# +SmellWarning+s found; subsequent calls simply return this same list.
|
70
|
+
#
|
71
|
+
def report
|
72
|
+
unless @report
|
73
|
+
@report = Report.new
|
74
|
+
smells = SmellConfig.new.load_local(@dir).smell_listeners
|
75
|
+
CodeParser.new(@report, smells).check_source(@source)
|
76
|
+
end
|
77
|
+
@report
|
78
|
+
end
|
79
|
+
|
80
|
+
def smelly?
|
81
|
+
report.length > 0
|
82
|
+
end
|
83
|
+
|
84
|
+
#
|
85
|
+
# Checks this source for instances of +smell_class+, and returns +true+
|
86
|
+
# only if one of them has a report string matching all of the +patterns+.
|
87
|
+
#
|
88
|
+
def has_smell?(smell_class, patterns)
|
89
|
+
report.any? { |smell| smell.matches?(smell_class, patterns) }
|
90
|
+
end
|
91
|
+
|
92
|
+
def to_s
|
93
|
+
@desc
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
#
|
98
|
+
# Represents a list of Sources as if they were a single source.
|
99
|
+
#
|
100
|
+
class SourceList
|
101
|
+
def initialize(sources)
|
102
|
+
@sources = sources
|
103
|
+
end
|
104
|
+
|
105
|
+
def smelly?
|
106
|
+
@sources.any? {|source| source.smelly? }
|
107
|
+
end
|
108
|
+
|
109
|
+
def report
|
110
|
+
@sources.select {|src| src.smelly? }.map do |src|
|
111
|
+
warnings = src.report
|
112
|
+
"\"#{src}\" -- #{warnings.length} warnings:\n#{warnings.to_s}\n"
|
113
|
+
end.join("\n")
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
data/lib/reek/spec.rb
ADDED
@@ -0,0 +1,146 @@
|
|
1
|
+
require 'reek/source'
|
2
|
+
|
3
|
+
module Reek
|
4
|
+
|
5
|
+
#
|
6
|
+
# Provides matchers for Rspec, making it easy to check code quality.
|
7
|
+
#
|
8
|
+
# If you require this module somewhere within your spec (or in your spec_helper),
|
9
|
+
# Reek will arrange to update Spec::Runner's config so that it knows about the
|
10
|
+
# matchers defined here.
|
11
|
+
#
|
12
|
+
# === Examples
|
13
|
+
#
|
14
|
+
# Here's a spec that ensures there are no smell warnings in the current project:
|
15
|
+
#
|
16
|
+
# describe 'source code quality' do
|
17
|
+
# Dir['lib/**/*.rb'].each do |path|
|
18
|
+
# it "reports no smells in #{path}" do
|
19
|
+
# File.new(path).should_not reek
|
20
|
+
# end
|
21
|
+
# end
|
22
|
+
# end
|
23
|
+
#
|
24
|
+
# And here's an even simpler way to do the same:
|
25
|
+
#
|
26
|
+
# it 'has no code smells' do
|
27
|
+
# Dir['lib/**/*.rb'].should_not reek
|
28
|
+
# end
|
29
|
+
#
|
30
|
+
# Here's a simple check of a code fragment:
|
31
|
+
#
|
32
|
+
# 'def equals(other) other.thing == self.thing end'.should_not reek
|
33
|
+
#
|
34
|
+
# And a more complex example, making use of one of the factory methods for
|
35
|
+
# +Source+ so that the code is parsed and analysed only once:
|
36
|
+
#
|
37
|
+
# ruby = 'def double_thing() @other.thing.foo + @other.thing.foo end'.to_source
|
38
|
+
# ruby.should reek_of(:Duplication, /@other.thing[^\.]/)
|
39
|
+
# ruby.should reek_of(:Duplication, /@other.thing.foo/)
|
40
|
+
# ruby.should_not reek_of(:FeatureEnvy)
|
41
|
+
#
|
42
|
+
module Spec
|
43
|
+
class ShouldReek # :nodoc:
|
44
|
+
def matches?(actual)
|
45
|
+
@source = actual.to_source
|
46
|
+
@source.smelly?
|
47
|
+
end
|
48
|
+
def failure_message_for_should
|
49
|
+
"Expected source to reek, but it didn't"
|
50
|
+
end
|
51
|
+
def failure_message_for_should_not
|
52
|
+
"Expected no smells, but got:\n#{@source.report}"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
#
|
57
|
+
# Returns +true+ if and only if the target source code contains smells.
|
58
|
+
#
|
59
|
+
def reek
|
60
|
+
ShouldReek.new
|
61
|
+
end
|
62
|
+
|
63
|
+
class ShouldReekOf # :nodoc:
|
64
|
+
def initialize(klass, patterns)
|
65
|
+
@klass = klass
|
66
|
+
@patterns = patterns
|
67
|
+
end
|
68
|
+
def matches?(actual)
|
69
|
+
@source = actual.to_source
|
70
|
+
@source.has_smell?(@klass, @patterns)
|
71
|
+
end
|
72
|
+
def failure_message_for_should
|
73
|
+
"Expected #{@source} to reek of #{@klass}, but it didn't"
|
74
|
+
end
|
75
|
+
def failure_message_for_should_not
|
76
|
+
"Expected #{@source} not to reek of #{@klass}, but got:\n#{@source.report}"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
#
|
81
|
+
# Checks the target source code for instances of +smell_class+,
|
82
|
+
# and returns +true+ only if one of them has a report string matching
|
83
|
+
# all of the +patterns+.
|
84
|
+
#
|
85
|
+
def reek_of(smell_class, *patterns)
|
86
|
+
ShouldReekOf.new(smell_class, patterns)
|
87
|
+
end
|
88
|
+
|
89
|
+
class ShouldReekOnlyOf # :nodoc:
|
90
|
+
def initialize(klass, patterns)
|
91
|
+
@klass = klass
|
92
|
+
@patterns = patterns
|
93
|
+
end
|
94
|
+
def matches?(actual)
|
95
|
+
@source = actual.to_source
|
96
|
+
@source.report.length == 1 and @source.has_smell?(@klass, @patterns)
|
97
|
+
end
|
98
|
+
def failure_message_for_should
|
99
|
+
"Expected source to reek only of #{@klass}, but got:\n#{@source.report}"
|
100
|
+
end
|
101
|
+
def failure_message_for_should_not
|
102
|
+
"Expected source not to reek only of #{@klass}, but it did"
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
#
|
107
|
+
# As for reek_of, but the matched smell warning must be the only warning of
|
108
|
+
# any kind in the target source code's Reek report.
|
109
|
+
#
|
110
|
+
def reek_only_of(smell_class, *patterns)
|
111
|
+
ShouldReekOnlyOf.new(smell_class, patterns)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
class File
|
117
|
+
def to_source
|
118
|
+
Reek::Source.from_f(self)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
class String
|
123
|
+
def to_source
|
124
|
+
Reek::Source.from_s(self)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
class Array
|
129
|
+
def to_source
|
130
|
+
Reek::Source.from_pathlist(self)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
module Reek
|
135
|
+
class Source
|
136
|
+
def to_source
|
137
|
+
self
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
if Object.const_defined?(:Spec)
|
143
|
+
Spec::Runner.configure do |config|
|
144
|
+
config.include(Reek::Spec)
|
145
|
+
end
|
146
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module Reek
|
2
|
+
class StopContext
|
3
|
+
|
4
|
+
def initialize
|
5
|
+
@refs = ObjectRefs.new
|
6
|
+
@myself = Object
|
7
|
+
end
|
8
|
+
|
9
|
+
def count_statements(num)
|
10
|
+
0
|
11
|
+
end
|
12
|
+
|
13
|
+
def find_module(name)
|
14
|
+
sym = name.to_s
|
15
|
+
@myself.const_defined?(sym) ? @myself.const_get(sym) : nil
|
16
|
+
end
|
17
|
+
|
18
|
+
def has_parameter(sym)
|
19
|
+
false
|
20
|
+
end
|
21
|
+
|
22
|
+
def inside_a_block?
|
23
|
+
false
|
24
|
+
end
|
25
|
+
|
26
|
+
def is_overriding_method?(name)
|
27
|
+
false
|
28
|
+
end
|
29
|
+
|
30
|
+
def num_statements
|
31
|
+
0
|
32
|
+
end
|
33
|
+
|
34
|
+
def refs
|
35
|
+
@refs
|
36
|
+
end
|
37
|
+
|
38
|
+
def record_depends_on_self
|
39
|
+
false
|
40
|
+
end
|
41
|
+
|
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
|
+
def outer_name
|
59
|
+
''
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
data/reek.gemspec
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{reek}
|
5
|
+
s.version = "0.3.1.6"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Kevin Rutherford"]
|
9
|
+
s.date = %q{2009-04-03}
|
10
|
+
s.default_executable = %q{reek}
|
11
|
+
s.description = %q{Code smell detector for Ruby}
|
12
|
+
s.email = ["kevin@rutherford-software.com"]
|
13
|
+
s.executables = ["reek"]
|
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/integration/reek_source_spec.rb", "spec/integration/script_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/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/samples/inline.rb", "spec/samples/inline_spec.rb", "spec/samples/optparse.rb", "spec/samples/optparse_spec.rb", "spec/samples/redcloth.rb", "spec/samples/redcloth_spec.rb", "spec/spec.opts", "spec/spec_helper.rb", "tasks/reek.rake", "tasks/rspec.rake"]
|
16
|
+
s.has_rdoc = true
|
17
|
+
s.homepage = %q{http://wiki.github.com/kevinrutherford/reek}
|
18
|
+
s.post_install_message = %q{
|
19
|
+
For more information on reek, see http://wiki.github.com/kevinrutherford/reek
|
20
|
+
}
|
21
|
+
s.rdoc_options = ["--main", "README.txt"]
|
22
|
+
s.require_paths = ["lib"]
|
23
|
+
s.rubyforge_project = %q{reek}
|
24
|
+
s.rubygems_version = %q{1.3.1}
|
25
|
+
s.summary = %q{Code smell detector for Ruby}
|
26
|
+
|
27
|
+
if s.respond_to? :specification_version then
|
28
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
29
|
+
s.specification_version = 2
|
30
|
+
|
31
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
32
|
+
s.add_runtime_dependency(%q<ParseTree>, ["~> 3.0"])
|
33
|
+
s.add_runtime_dependency(%q<sexp_processor>, ["~> 3.0"])
|
34
|
+
else
|
35
|
+
s.add_dependency(%q<ParseTree>, ["~> 3.0"])
|
36
|
+
s.add_dependency(%q<sexp_processor>, ["~> 3.0"])
|
37
|
+
end
|
38
|
+
else
|
39
|
+
s.add_dependency(%q<ParseTree>, ["~> 3.0"])
|
40
|
+
s.add_dependency(%q<sexp_processor>, ["~> 3.0"])
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper.rb'
|
2
|
+
|
3
|
+
describe 'Reek source code:' do
|
4
|
+
Dir['lib/**/*.rb'].each do |path|
|
5
|
+
it "reports no smells in #{path}" do
|
6
|
+
File.new(path).should_not reek
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'reports no smells via the Dir matcher' do
|
11
|
+
Dir['lib/**/*.rb'].should_not reek
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe 'RakeTask' do
|
16
|
+
it 'should report no duplication' do
|
17
|
+
report = `rake reek`.split("\n")
|
18
|
+
report.length.should == 1
|
19
|
+
end
|
20
|
+
end
|