preek 1.1.0 → 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 37e624d4a67976a8062a37c690c17957dd605706
4
- data.tar.gz: 744b77bcea99590f34da0ee56b8bc72d15525b3a
3
+ metadata.gz: 6a2898d250cb8cea642a90c538ce337b21b582fb
4
+ data.tar.gz: 963cbb7dcebd619e3da7a47fd2fdce46d767a406
5
5
  SHA512:
6
- metadata.gz: 9d7fb7c110fd621346a35d1c6c1eaf46b4888a6d5e25a99c2632e5ecc7dfa69b16bf8caf5b16bc7c80e99021a1fbf1cfdede29a2722c2fffa11b8928d7e196bb
7
- data.tar.gz: fa3d7538f75edf82b4976ffd2ab4047e7e46096617ae4c81a070b461ee6d725ed622a1ad0c6fd27751a7ddbac3fa4dd849e8c5beec1b3f76c309db0f528d5d8d
6
+ metadata.gz: 0f33bf0471e6fde2f572c62bd546da8611ef8be0f54ce4e81bcfaac2da2335c9e55ae2f4b4cfea0300a503c89272ec1444ea8c95bb7cad4cedfb610e465bd8c6
7
+ data.tar.gz: 3a51ab71c58530be58fd33affcf172ac7b4f8abc781050d73f02da3fb103d04a71a8bf49c9bbae1d20af7faacfd4575d8769ee2e8b42c6f3753fb205c82f0ed4
data/README.md CHANGED
@@ -31,8 +31,9 @@ Usage:
31
31
  preek smell FILE(S)|DIR
32
32
 
33
33
  Options:
34
- -i, [--irresponsible] # include IrresponsibleModule smell in output.
35
-
34
+ -i, [--irresponsible] # Include IrresponsibleModule smell in output.
35
+ -c, [--compact] # Compact output.
36
+ -v, [--verbose] # Report files with no smells
36
37
 
37
38
  Commands:
38
39
  preek help [COMMAND] # Describe available commands or one specific command
@@ -1,11 +1,10 @@
1
1
  module Preek
2
2
  require 'preek/version'
3
- require 'preek/smell_collector'
4
- require 'preek/smell_reporter'
3
+ require 'preek/examiner'
4
+ require 'preek/report'
5
+ require 'preek/output'
5
6
 
6
7
  def self.Smell(filenames, excludes = [])
7
- files, not_files = filenames.partition { |file| File.exists? file }
8
- smelly_files = SmellCollector.new(files, excludes).smelly_files
9
- SmellReporter.new(smelly_files, not_files).print_result
8
+ Examiner.new(filenames, excludes).perform
10
9
  end
11
10
  end
@@ -1,8 +1,5 @@
1
1
  require 'thor'
2
-
3
2
  require 'preek/version'
4
- require 'preek/smell_collector'
5
- require 'preek/smell_reporter'
6
3
 
7
4
  module Preek
8
5
 
@@ -16,15 +13,37 @@ module Preek
16
13
  end
17
14
 
18
15
  desc 'smell FILE(S)|DIR', 'Pretty format Reek output'
16
+
19
17
  method_option :irresponsible,
20
18
  type: :boolean,
21
19
  aliases: '-i',
22
- desc: 'include IrresponsibleModule smell in output.'
20
+ desc: 'Include IrresponsibleModule smell in output.'
21
+
22
+ method_option :compact,
23
+ type: :boolean,
24
+ aliases: '-c',
25
+ desc: 'Compact output.'
26
+
27
+ method_option :verbose,
28
+ type: :boolean,
29
+ aliases: '-v',
30
+ desc: 'Report files with no smells.'
31
+
32
+
23
33
  def smell(*args)
24
- Preek::Smell(args, excludes)
34
+ Examiner.new(args, excludes, reporter: reporter, output: output).perform
25
35
  end
26
36
 
27
37
  private
38
+
39
+ def reporter
40
+ options[:verbose] ? VerboseReport : QuietReport
41
+ end
42
+
43
+ def output
44
+ options[:compact] ? CompactOutput : Output
45
+ end
46
+
28
47
  def _aliases
29
48
  {
30
49
  irresponsible: 'IrresponsibleModule'
@@ -0,0 +1,68 @@
1
+ require 'reek/examiner'
2
+
3
+ module Preek
4
+ class Examiner
5
+ def initialize(files, excludes = [], options = {})
6
+ @files = files
7
+ @excludes = excludes
8
+ @reporter = options[:reporter] || VerboseReport
9
+ output_class = options[:output] || Output
10
+ @output = output_class.new
11
+ @total_smells = 0
12
+ end
13
+
14
+ def perform
15
+ examine_and_report
16
+ report_totals if totals_to_report?
17
+ @output.print_line
18
+ report_non_existing if non_existing_files?
19
+ end
20
+
21
+ private
22
+ def examine_and_report
23
+ sources.each do |source|
24
+ examiner = Reek::Examiner.new(source)
25
+ filter_excludes_from(examiner)
26
+ @reporter.new(examiner, @output).report
27
+ @total_smells += examiner.smells_count
28
+ end
29
+ end
30
+
31
+ def filter_excludes_from(examiner)
32
+ examiner.smells.delete_if do |smell|
33
+ @excludes.include? smell.smell_class
34
+ end
35
+ end
36
+
37
+ def totals_to_report?
38
+ return false if @reporter.verbose? || @sources.count == 0
39
+ @total_smells == 0
40
+ end
41
+
42
+ def report_totals
43
+ @output.print_line
44
+ @output.green :success, %(No smells detected)
45
+ end
46
+
47
+ def report_non_existing
48
+ @output.red :error, %{No such file(s) - #{non_existing_files.join(', ')}.\n}
49
+ @output.print_line
50
+ end
51
+
52
+ def existing_files
53
+ @existing_files ||= @files.select {|file| File.exists? file}
54
+ end
55
+
56
+ def non_existing_files?
57
+ !non_existing_files.empty?
58
+ end
59
+
60
+ def non_existing_files
61
+ @files - existing_files
62
+ end
63
+
64
+ def sources
65
+ @sources ||= Reek::Source::SourceLocator.new(existing_files).all_sources
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,36 @@
1
+ require 'thor/shell/color'
2
+ module Preek
3
+ class Output < Thor::Shell::Color
4
+ def status(*args)
5
+ say_status *args
6
+ end
7
+
8
+ def print_line
9
+ say "\n\t#{'-'*60}\n\n"
10
+ end
11
+
12
+ def blue(*args)
13
+ status *args, :blue
14
+ end
15
+
16
+ def green(*args)
17
+ status *args, :green
18
+ end
19
+
20
+ def red(*args)
21
+ status *args, :red
22
+ end
23
+ end
24
+
25
+ class CompactOutput < Output
26
+ def status(title, text, color = nil)
27
+ title = title.to_s + ": " if title.is_a?(Symbol)
28
+ say title, color, false
29
+ say text
30
+ end
31
+
32
+ def print_line
33
+ say "\n-\n\n"
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,64 @@
1
+ require 'preek/ext/smell_warning'
2
+ require 'preek/smell_file'
3
+ require 'preek/smell_klass'
4
+ module Preek
5
+ class VerboseReport
6
+ def self.verbose?
7
+ true
8
+ end
9
+
10
+ def initialize(examiner, output)
11
+ @examiner, @output = examiner, output
12
+ end
13
+
14
+ def report
15
+ print_header
16
+ if @examiner.smelly?
17
+ report_smells
18
+ else
19
+ report_success
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def print_header
26
+ @output.print_line
27
+ @output.blue :file, "#{@examiner.description}\n"
28
+ end
29
+
30
+ def smell_file
31
+ SmellFile.new(@examiner)
32
+ end
33
+
34
+ def report_smells
35
+ smell_file.klasses do |klass|
36
+ @output.green :class, klass.name
37
+ @output.red :smells, ''
38
+ klass.smells.each &print_smell
39
+ end
40
+ end
41
+
42
+ def print_smell
43
+ lambda {|smell| @output.status nil, smell }
44
+ end
45
+
46
+ def print_klass_smells(smells)
47
+ smells.each {|smell| @output.status nil, smell }
48
+ end
49
+
50
+ def report_success
51
+ @output.green :success, "No smells detected.\n"
52
+ end
53
+ end
54
+
55
+ class QuietReport < VerboseReport
56
+ def self.verbose?
57
+ false
58
+ end
59
+
60
+ def report
61
+ print_header && report_smells if @examiner.smelly?
62
+ end
63
+ end
64
+ end
@@ -1,7 +1,6 @@
1
1
  module Preek
2
2
  # A smelly file
3
3
  class SmellFile
4
- attr_reader :klasses
5
4
 
6
5
  def initialize(examiner)
7
6
  @examiner = examiner
@@ -15,6 +14,13 @@ module Preek
15
14
 
16
15
  alias :filename :file
17
16
 
17
+ def klasses
18
+ return @klasses unless block_given?
19
+ @klasses.each do |name, klass|
20
+ yield klass
21
+ end
22
+ end
23
+
18
24
  private
19
25
  def add_smells_to_klasses
20
26
  @examiner.smells.each do |smell|
@@ -1,5 +1,5 @@
1
1
  module Preek
2
- # A container for a smelly klass in a file!
2
+ # A container for smells in a class
3
3
  class SmellKlass
4
4
  attr_reader :name
5
5
 
@@ -1,3 +1,3 @@
1
1
  module Preek
2
- VERSION = "1.1.0"
2
+ VERSION = "1.2.1"
3
3
  end
@@ -19,8 +19,8 @@ Gem::Specification.new do |gem|
19
19
  gem.add_runtime_dependency "thor", ">=0.16"
20
20
  gem.add_runtime_dependency "reek", ">=1.3"
21
21
  gem.add_development_dependency "rspec", ">=2.13"
22
+ gem.add_development_dependency "rspec-given"
22
23
  gem.add_development_dependency "guard", ">=1.6"
23
- gem.add_development_dependency "guard-pushover"
24
24
  gem.add_development_dependency "guard-rspec", ">=2.4"
25
25
  gem.add_development_dependency 'coveralls'
26
26
  end
@@ -10,133 +10,116 @@ describe Preek::CLI do
10
10
  end
11
11
 
12
12
  describe "#version" do
13
- let(:output) { capture(:stdout) { subject.version} }
14
- it "outputs the gem version in the right format" do
15
- output.should =~ /(\d\.?){3}/
16
- end
13
+ When(:output) { capture(:stdout) { subject.version} }
14
+ Then {output.should =~ /(\d\.?){3}/}
17
15
  end
18
16
 
19
- describe "#parse" do
20
- let(:output) { capture(:stdout) { subject.smell(*args) } }
21
- let(:args) { ['i/am/not/a_file'] }
17
+ describe "#smell" do
18
+
19
+ When(:output) { capture(:stdout) { subject.smell(*args) } }
22
20
 
23
21
  context "with non-existing file in ARGS" do
24
- let(:args) { ['i/am/not/a_file'] }
25
- # it "does not output 'success'" do
26
- # output.should_not include("success")
27
- # end
28
- it "outputs 'No such file'" do
29
- output.should include("No such file")
30
- end
31
- it "outputs the name of the file" do
32
- output.should include(args[0])
33
- end
22
+ Given(:args) { ['i/am/not/a_file'] }
23
+ Then{output.should_not include("success")}
24
+ Then{output.should include("No such file")}
25
+ Then{output.should include(args[0])}
34
26
  end
35
27
 
36
- context "when given file has no smells" do
37
- let(:args){ [test_file('non_smelly')] }
38
- it "output contains 'success! No smells'" do
39
- output.should include("No smells")
40
- end
41
- end
28
+ context 'default quiet report' do
42
29
 
43
- context "when given file has Irresponsible smell" do
44
- let(:args){ [test_file('irresponsible')] }
45
- it "output contains 'success! No smells'" do
46
- output.should include("No smells")
30
+ context "when given file has no smells" do
31
+ Given(:args){ [test_file('non_smelly')] }
32
+ Then{output.should include("No smells")}
33
+ Then{output.should_not include(args[0])}
47
34
  end
48
- end
49
-
50
- context "when given file has Irresponsible smell with --irresponsible options" do
51
- let(:args){ [test_file('irresponsible')] }
52
35
 
53
- before :each do
54
- subject.options = {irresponsible: true}
36
+ context "when given file has no smells" do
37
+ Given(:args){ [test_file('non_smelly'), 'i/am/not/a_file'] }
38
+ Then{output.should include("No smells")}
39
+ Then{output.should_not include(args[0])}
40
+ Then{output.should include("No such file")}
41
+ Then{output.should include(args[1])}
55
42
  end
56
43
 
57
- it "output contains 'Irresponsible'" do
58
- output.should include("Irresponsible")
44
+ context "when given file has Irresponsible smell" do
45
+ Given(:args){ [test_file('irresponsible')] }
46
+ Then{output.should include("No smells")}
47
+ Then{output.should_not include(args[0])}
59
48
  end
60
49
 
61
- end
62
-
63
- context "when given a file with two smelly classes" do
64
- let(:args){ [test_file('two_smelly_classes')] }
65
- it "output contains one classnames" do
66
- output.should include('SecondSmelly')
67
- end
68
- it "output contains one smell" do
69
- output.should include('UncommunicativeMethodName')
50
+ context "when given a file with two smelly classes" do
51
+ Given(:args){ [test_file('two_smelly_classes')] }
52
+ Then{output.should include('SecondSmelly')}
53
+ Then{output.should include('UncommunicativeMethodName')}
70
54
  end
71
- end
72
55
 
73
- context "when given a file with two smelly classes with --irresponsible options" do
74
- let(:args){ [test_file('two_smelly_classes')] }
75
- before :each do
76
- subject.options = {irresponsible: true}
56
+ context "when given two smelly files" do
57
+ Given(:args){ [test_file('too_many_statements'), test_file('two_smelly_classes')] }
58
+ Then{output.should include('UncommunicativeMethodName', 'TooManyStatements')}
59
+ Then{output.should include(args[0], args[1])}
60
+ Then{output.should include("#loong_method", "#x")}
77
61
  end
78
62
 
79
- it "output contains both classnames" do
80
- output.should include('FirstSmelly', 'SecondSmelly')
81
- end
82
- it "output contains both smells" do
83
- output.should include('IrresponsibleModule', 'UncommunicativeMethodName')
63
+ context "when given one file without smells and another with smells" do
64
+ Given(:args){ [test_file('non_smelly'), test_file('too_many_statements')] }
65
+
66
+ Then{output.should include('TooManyStatements')}
67
+ Then{output.should include(args[1])}
68
+ Then{output.should include("#loong_method")}
69
+ Then{output.should_not include(args[0])}
84
70
  end
85
- end
86
71
 
87
- context "when given a file with two different smells with --irresponsible options" do
88
- let(:args){ [test_file('irresponsible_and_lazy')] }
89
- it "output contains both smells" do
90
- subject.options = {irresponsible: true}
91
- output.should include('IrresponsibleModule', 'UncommunicativeMethodName')
72
+ context "when given file has NilCheck smell" do
73
+ Given(:args){ [test_file('nil_check')] }
74
+ Then{output.should include("NilCheck")}
75
+ Then{output.should include(args[0])}
92
76
  end
93
77
  end
94
78
 
95
- context "when given two smelly files" do
96
- let(:args){ [test_file('too_many_statements'), test_file('two_smelly_classes')] }
97
- before :each do
98
- subject.options = {irresponsible: true}
99
- end
79
+ context 'with --irresponsible option' do
80
+ Given{subject.options = {irresponsible: true} }
100
81
 
101
- it "output contains all smells" do
102
- output.should include('IrresponsibleModule', 'UncommunicativeMethodName', 'TooManyStatements')
82
+ context "when given file has Irresponsible smell" do
83
+ Given(:args){ [test_file('irresponsible')] }
84
+ Then{output.should include("Irresponsible")}
103
85
  end
104
86
 
105
- it "output contains both filenames" do
106
- output.should include(args[0], args[1])
87
+ context "when given a file with two smelly classes" do
88
+ Given(:args){ [test_file('two_smelly_classes')] }
89
+ Then{output.should include('FirstSmelly', 'SecondSmelly')}
90
+ Then{output.should include('IrresponsibleModule', 'UncommunicativeMethodName')}
107
91
  end
108
92
 
109
- it "output contains the names of the smelly methods" do
110
- output.should include("#loong_method", "#x")
93
+ context "when given two smelly files" do
94
+ Given(:args){ [test_file('too_many_statements'), test_file('two_smelly_classes')] }
95
+ Then{output.should include('IrresponsibleModule', 'UncommunicativeMethodName', 'TooManyStatements')}
96
+ Then{output.should include(args[0], args[1])}
97
+ Then{output.should include("#loong_method", "#x")}
111
98
  end
112
- end
113
99
 
114
- context "when given one file without smells and another with smells" do
115
- let(:args){ [test_file('non_smelly'), test_file('two_smelly_classes')] }
116
- before :each do
117
- subject.options = {irresponsible: true}
100
+ context "when given a file with two different smells" do
101
+ Given(:args){ [test_file('irresponsible_and_lazy')] }
102
+ Then{output.should include('IrresponsibleModule', 'UncommunicativeMethodName')}
118
103
  end
104
+ end
119
105
 
120
- it "output contains all smells" do
121
- output.should include('IrresponsibleModule', 'UncommunicativeMethodName')
122
- end
106
+ context 'with --verbose option' do
107
+ Given{subject.options = {verbose: true}}
123
108
 
124
- it "output contains only smelly filename" do
125
- output.should include(args[1])
109
+ context "when given file has no smells" do
110
+ Given(:args){ [test_file('non_smelly')] }
111
+ Then{output.should include("No smells")}
112
+ Then{output.should include(args[0])}
126
113
  end
127
114
 
128
- it "output contains the names of the smelly method" do
129
- output.should include("#x")
115
+ context "when given two smelly files" do
116
+ Given(:args){ [test_file('too_many_statements'), test_file('two_smelly_classes')] }
117
+ Then{output.should include(args[0], args[1])}
130
118
  end
131
- end
132
119
 
133
- context "when given file has NilCheck smell" do
134
- let(:args){ [test_file('nil_check')] }
135
- it "output contains 'NilCheck'" do
136
- output.should include("NilCheck")
137
- end
138
- it "outputs the name of the file" do
139
- output.should include(args[0])
120
+ context "when given one file without smells and another with smells" do
121
+ Given(:args){ [test_file('non_smelly'), test_file('too_many_statements')] }
122
+ Then{output.should include(args[1], args[0])}
140
123
  end
141
124
  end
142
125
  end
@@ -4,6 +4,7 @@ Coveralls.wear!
4
4
  $:.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
5
5
  require 'stringio'
6
6
  require File.expand_path('../../lib/preek', __FILE__)
7
+ require 'rspec/given'
7
8
 
8
9
  RSpec.configure do |config|
9
10
  config.treat_symbols_as_metadata_keys_with_true_values = true
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: preek
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jon Neverland
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-25 00:00:00.000000000 Z
11
+ date: 2013-09-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -53,33 +53,33 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '2.13'
55
55
  - !ruby/object:Gem::Dependency
56
- name: guard
56
+ name: rspec-given
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - '>='
60
60
  - !ruby/object:Gem::Version
61
- version: '1.6'
61
+ version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - '>='
67
67
  - !ruby/object:Gem::Version
68
- version: '1.6'
68
+ version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: guard-pushover
70
+ name: guard
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - '>='
74
74
  - !ruby/object:Gem::Version
75
- version: '0'
75
+ version: '1.6'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - '>='
81
81
  - !ruby/object:Gem::Version
82
- version: '0'
82
+ version: '1.6'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: guard-rspec
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -127,11 +127,12 @@ files:
127
127
  - bin/preek
128
128
  - lib/preek.rb
129
129
  - lib/preek/cli.rb
130
+ - lib/preek/examiner.rb
130
131
  - lib/preek/ext/smell_warning.rb
131
- - lib/preek/smell_collector.rb
132
+ - lib/preek/output.rb
133
+ - lib/preek/report.rb
132
134
  - lib/preek/smell_file.rb
133
135
  - lib/preek/smell_klass.rb
134
- - lib/preek/smell_reporter.rb
135
136
  - lib/preek/version.rb
136
137
  - preek.gemspec
137
138
  - spec/capture_helper.rb
@@ -163,7 +164,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
163
164
  version: '0'
164
165
  requirements: []
165
166
  rubyforge_project:
166
- rubygems_version: 2.0.2
167
+ rubygems_version: 2.0.3
167
168
  signing_key:
168
169
  specification_version: 4
169
170
  summary: It might reek but its pretty
@@ -1,45 +0,0 @@
1
- require 'reek'
2
-
3
- require 'preek/ext/smell_warning'
4
-
5
- require 'preek/smell_file'
6
- require 'preek/smell_klass'
7
-
8
- module Preek
9
- # This is a 'Collector'
10
- class SmellCollector
11
- def initialize(files, excludes = [])
12
- @files = files.delete_if { |file| !File.exists? file }
13
- @excludes = excludes
14
- end
15
-
16
- def smelly_files
17
- @smelly_files ||= files_from_sources
18
- end
19
-
20
- private
21
- def files_from_sources
22
- filtered_sources.map do |examiner|
23
- SmellFile.new(examiner) if examiner.smelly?
24
- end.compact
25
- end
26
-
27
- def filtered_sources
28
- sources.map do |source|
29
- examiner = Reek::Examiner.new(source)
30
- filter_excludes_from(examiner)
31
- examiner
32
- end
33
- end
34
-
35
- def filter_excludes_from(examiner)
36
- examiner.smells.delete_if do |smell|
37
- @excludes.include? smell.smell_class
38
- end
39
- end
40
-
41
- def sources
42
- Reek::Source::SourceLocator.new(@files).all_sources
43
- end
44
- end
45
- end
@@ -1,64 +0,0 @@
1
- require 'thor/shell/color'
2
- module Preek
3
- # Here we report the smells in a nice fashion
4
- class SmellReporter < Thor::Shell::Color
5
- def initialize(smelly_files, not_files)
6
- @smelly_files = smelly_files
7
- @not_files = not_files
8
- @padding = 0
9
- end
10
-
11
- def print_smells
12
- if success?
13
- say_status 'success!', 'No smells detected.'
14
- else
15
- print_each_smell
16
- end
17
- print_not_files
18
- end
19
- alias :print_result :print_smells
20
-
21
- private
22
- def success?
23
- @smelly_files.empty?
24
- end
25
-
26
- def print_not_files
27
- return if @not_files.empty?
28
- say_status :error, "No such file(s) - #{@not_files.join(', ')}.", :red
29
- end
30
-
31
- def print_each_smell
32
- print_line
33
- @smelly_files.each do |smelly|
34
- say_status 'file', format_path(smelly.filename), :blue
35
- print_klasses smelly.klasses
36
- end
37
- end
38
-
39
- def print_klasses klasses
40
- klasses.each do |index, klass|
41
- say_status "\n\tclass", klass.name
42
- say_status 'smells', '', :red
43
- print_klass_smells klass.smells
44
- end
45
- print_line
46
- end
47
-
48
- def print_klass_smells smells
49
- smells.each {|smell|
50
- say_status nil, smell
51
- }
52
- end
53
-
54
- def print_line
55
- say "\n\t#{'-'*60}\n\n"
56
- end
57
-
58
- def padding; 0; end
59
-
60
- def format_path file
61
- File.expand_path(file)
62
- end
63
- end
64
- end