reek 1.2.3 → 1.2.4

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.
Files changed (47) hide show
  1. data/History.txt +9 -1
  2. data/features/options.feature +1 -9
  3. data/features/samples.feature +7 -2
  4. data/features/step_definitions/reek_steps.rb +3 -3
  5. data/lib/reek.rb +1 -1
  6. data/lib/reek/adapters/application.rb +22 -27
  7. data/lib/reek/adapters/command_line.rb +41 -42
  8. data/lib/reek/adapters/report.rb +30 -23
  9. data/lib/reek/adapters/spec.rb +1 -1
  10. data/lib/reek/code_context.rb +6 -2
  11. data/lib/reek/code_parser.rb +3 -7
  12. data/lib/reek/detector_stack.rb +2 -4
  13. data/lib/reek/help_command.rb +14 -0
  14. data/lib/reek/masking_collection.rb +33 -0
  15. data/lib/reek/method_context.rb +18 -6
  16. data/lib/reek/module_context.rb +0 -13
  17. data/lib/reek/reek_command.rb +28 -0
  18. data/lib/reek/singleton_method_context.rb +1 -1
  19. data/lib/reek/smell_warning.rb +5 -3
  20. data/lib/reek/smells/attribute.rb +17 -1
  21. data/lib/reek/smells/class_variable.rb +1 -1
  22. data/lib/reek/smells/control_couple.rb +13 -10
  23. data/lib/reek/smells/large_class.rb +1 -1
  24. data/lib/reek/smells/long_method.rb +0 -2
  25. data/lib/reek/smells/simulated_polymorphism.rb +2 -2
  26. data/lib/reek/sniffer.rb +1 -3
  27. data/lib/reek/tree_dresser.rb +35 -23
  28. data/lib/reek/version_command.rb +14 -0
  29. data/reek.gemspec +3 -3
  30. data/spec/reek/adapters/report_spec.rb +8 -8
  31. data/spec/reek/adapters/should_reek_of_spec.rb +1 -1
  32. data/spec/reek/adapters/should_reek_only_of_spec.rb +2 -2
  33. data/spec/reek/adapters/should_reek_spec.rb +3 -3
  34. data/spec/reek/code_context_spec.rb +11 -11
  35. data/spec/reek/code_parser_spec.rb +0 -88
  36. data/spec/reek/help_command_spec.rb +24 -0
  37. data/spec/reek/masking_collection_spec.rb +236 -0
  38. data/spec/reek/method_context_spec.rb +43 -1
  39. data/spec/reek/reek_command_spec.rb +45 -0
  40. data/spec/reek/smell_warning_spec.rb +12 -4
  41. data/spec/reek/smells/attribute_spec.rb +79 -7
  42. data/spec/reek/smells/control_couple_spec.rb +40 -11
  43. data/spec/reek/smells/long_parameter_list_spec.rb +1 -1
  44. data/spec/reek/smells/smell_detector_spec.rb +0 -17
  45. data/spec/reek/tree_dresser_spec.rb +20 -0
  46. data/spec/reek/version_command_spec.rb +29 -0
  47. metadata +11 -2
@@ -0,0 +1,14 @@
1
+
2
+ module Reek
3
+
4
+ class VersionCommand
5
+ def initialize(progname)
6
+ @progname = progname
7
+ end
8
+ def execute(view)
9
+ view.output("#{@progname} #{Reek::VERSION}")
10
+ view.report_success
11
+ end
12
+ end
13
+
14
+ 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.2.3"
5
+ s.version = "1.2.4"
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-11-02}
9
+ s.date = %q{2009-11-17}
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", "License.txt", "README.rdoc"]
15
- s.files = ["History.txt", "License.txt", "README.rdoc", "Rakefile", "bin/reek", "config/defaults.reek", "features/masking_smells.feature", "features/options.feature", "features/profile.feature", "features/rake_task.feature", "features/reports.feature", "features/samples.feature", "features/stdin.feature", "features/step_definitions/reek_steps.rb", "features/support/env.rb", "lib/reek.rb", "lib/reek/adapters/application.rb", "lib/reek/adapters/command_line.rb", "lib/reek/adapters/config_file.rb", "lib/reek/adapters/core_extras.rb", "lib/reek/adapters/rake_task.rb", "lib/reek/adapters/report.rb", "lib/reek/adapters/source.rb", "lib/reek/adapters/spec.rb", "lib/reek/block_context.rb", "lib/reek/class_context.rb", "lib/reek/code_context.rb", "lib/reek/code_parser.rb", "lib/reek/configuration.rb", "lib/reek/detector_stack.rb", "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/sexp_formatter.rb", "lib/reek/singleton_method_context.rb", "lib/reek/smell_warning.rb", "lib/reek/smells/attribute.rb", "lib/reek/smells/class_variable.rb", "lib/reek/smells/control_couple.rb", "lib/reek/smells/data_clump.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/simulated_polymorphism.rb", "lib/reek/smells/smell_detector.rb", "lib/reek/smells/uncommunicative_name.rb", "lib/reek/smells/utility_function.rb", "lib/reek/sniffer.rb", "lib/reek/stop_context.rb", "lib/reek/tree_dresser.rb", "lib/reek/yield_call_context.rb", "reek.gemspec", "spec/reek/adapters/report_spec.rb", "spec/reek/adapters/should_reek_of_spec.rb", "spec/reek/adapters/should_reek_only_of_spec.rb", "spec/reek/adapters/should_reek_spec.rb", "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/configuration_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/object_source_spec.rb", "spec/reek/singleton_method_context_spec.rb", "spec/reek/smell_warning_spec.rb", "spec/reek/smells/attribute_spec.rb", "spec/reek/smells/behaves_like_variable_detector.rb", "spec/reek/smells/class_variable_spec.rb", "spec/reek/smells/control_couple_spec.rb", "spec/reek/smells/data_clump_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/simulated_polymorphism_spec.rb", "spec/reek/smells/smell_detector_spec.rb", "spec/reek/smells/uncommunicative_name_spec.rb", "spec/reek/smells/utility_function_spec.rb", "spec/reek/sniffer_spec.rb", "spec/reek/stop_context_spec.rb", "spec/samples/all_but_one_masked/clean_one.rb", "spec/samples/all_but_one_masked/dirty.rb", "spec/samples/all_but_one_masked/masked.reek", "spec/samples/clean_due_to_masking/clean_one.rb", "spec/samples/clean_due_to_masking/clean_three.rb", "spec/samples/clean_due_to_masking/clean_two.rb", "spec/samples/clean_due_to_masking/dirty_one.rb", "spec/samples/clean_due_to_masking/dirty_two.rb", "spec/samples/clean_due_to_masking/masked.reek", "spec/samples/corrupt_config_file/corrupt.reek", "spec/samples/corrupt_config_file/dirty.rb", "spec/samples/empty_config_file/dirty.rb", "spec/samples/empty_config_file/empty.reek", "spec/samples/exceptions.reek", "spec/samples/inline.rb", "spec/samples/masked/dirty.rb", "spec/samples/masked/masked.reek", "spec/samples/mixed_results/clean_one.rb", "spec/samples/mixed_results/clean_three.rb", "spec/samples/mixed_results/clean_two.rb", "spec/samples/mixed_results/dirty_one.rb", "spec/samples/mixed_results/dirty_two.rb", "spec/samples/not_quite_masked/dirty.rb", "spec/samples/not_quite_masked/masked.reek", "spec/samples/optparse.rb", "spec/samples/overrides/masked/dirty.rb", "spec/samples/overrides/masked/lower.reek", "spec/samples/overrides/upper.reek", "spec/samples/redcloth.rb", "spec/samples/three_clean_files/clean_one.rb", "spec/samples/three_clean_files/clean_three.rb", "spec/samples/three_clean_files/clean_two.rb", "spec/samples/two_smelly_files/dirty_one.rb", "spec/samples/two_smelly_files/dirty_two.rb", "spec/spec.opts", "spec/spec_helper.rb", "tasks/reek.rake", "tasks/test.rake"]
15
+ s.files = ["History.txt", "License.txt", "README.rdoc", "Rakefile", "bin/reek", "config/defaults.reek", "features/masking_smells.feature", "features/options.feature", "features/profile.feature", "features/rake_task.feature", "features/reports.feature", "features/samples.feature", "features/stdin.feature", "features/step_definitions/reek_steps.rb", "features/support/env.rb", "lib/reek.rb", "lib/reek/adapters/application.rb", "lib/reek/adapters/command_line.rb", "lib/reek/adapters/config_file.rb", "lib/reek/adapters/core_extras.rb", "lib/reek/adapters/rake_task.rb", "lib/reek/adapters/report.rb", "lib/reek/adapters/source.rb", "lib/reek/adapters/spec.rb", "lib/reek/block_context.rb", "lib/reek/class_context.rb", "lib/reek/code_context.rb", "lib/reek/code_parser.rb", "lib/reek/configuration.rb", "lib/reek/detector_stack.rb", "lib/reek/help_command.rb", "lib/reek/if_context.rb", "lib/reek/masking_collection.rb", "lib/reek/method_context.rb", "lib/reek/module_context.rb", "lib/reek/name.rb", "lib/reek/object_refs.rb", "lib/reek/reek_command.rb", "lib/reek/sexp_formatter.rb", "lib/reek/singleton_method_context.rb", "lib/reek/smell_warning.rb", "lib/reek/smells/attribute.rb", "lib/reek/smells/class_variable.rb", "lib/reek/smells/control_couple.rb", "lib/reek/smells/data_clump.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/simulated_polymorphism.rb", "lib/reek/smells/smell_detector.rb", "lib/reek/smells/uncommunicative_name.rb", "lib/reek/smells/utility_function.rb", "lib/reek/sniffer.rb", "lib/reek/stop_context.rb", "lib/reek/tree_dresser.rb", "lib/reek/version_command.rb", "lib/reek/yield_call_context.rb", "reek.gemspec", "spec/reek/adapters/report_spec.rb", "spec/reek/adapters/should_reek_of_spec.rb", "spec/reek/adapters/should_reek_only_of_spec.rb", "spec/reek/adapters/should_reek_spec.rb", "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/configuration_spec.rb", "spec/reek/help_command_spec.rb", "spec/reek/if_context_spec.rb", "spec/reek/masking_collection_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/object_source_spec.rb", "spec/reek/reek_command_spec.rb", "spec/reek/singleton_method_context_spec.rb", "spec/reek/smell_warning_spec.rb", "spec/reek/smells/attribute_spec.rb", "spec/reek/smells/behaves_like_variable_detector.rb", "spec/reek/smells/class_variable_spec.rb", "spec/reek/smells/control_couple_spec.rb", "spec/reek/smells/data_clump_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/simulated_polymorphism_spec.rb", "spec/reek/smells/smell_detector_spec.rb", "spec/reek/smells/uncommunicative_name_spec.rb", "spec/reek/smells/utility_function_spec.rb", "spec/reek/sniffer_spec.rb", "spec/reek/stop_context_spec.rb", "spec/reek/tree_dresser_spec.rb", "spec/reek/version_command_spec.rb", "spec/samples/all_but_one_masked/clean_one.rb", "spec/samples/all_but_one_masked/dirty.rb", "spec/samples/all_but_one_masked/masked.reek", "spec/samples/clean_due_to_masking/clean_one.rb", "spec/samples/clean_due_to_masking/clean_three.rb", "spec/samples/clean_due_to_masking/clean_two.rb", "spec/samples/clean_due_to_masking/dirty_one.rb", "spec/samples/clean_due_to_masking/dirty_two.rb", "spec/samples/clean_due_to_masking/masked.reek", "spec/samples/corrupt_config_file/corrupt.reek", "spec/samples/corrupt_config_file/dirty.rb", "spec/samples/empty_config_file/dirty.rb", "spec/samples/empty_config_file/empty.reek", "spec/samples/exceptions.reek", "spec/samples/inline.rb", "spec/samples/masked/dirty.rb", "spec/samples/masked/masked.reek", "spec/samples/mixed_results/clean_one.rb", "spec/samples/mixed_results/clean_three.rb", "spec/samples/mixed_results/clean_two.rb", "spec/samples/mixed_results/dirty_one.rb", "spec/samples/mixed_results/dirty_two.rb", "spec/samples/not_quite_masked/dirty.rb", "spec/samples/not_quite_masked/masked.reek", "spec/samples/optparse.rb", "spec/samples/overrides/masked/dirty.rb", "spec/samples/overrides/masked/lower.reek", "spec/samples/overrides/upper.reek", "spec/samples/redcloth.rb", "spec/samples/three_clean_files/clean_one.rb", "spec/samples/three_clean_files/clean_three.rb", "spec/samples/three_clean_files/clean_two.rb", "spec/samples/two_smelly_files/dirty_one.rb", "spec/samples/two_smelly_files/dirty_two.rb", "spec/spec.opts", "spec/spec_helper.rb", "tasks/reek.rake", "tasks/test.rake"]
16
16
  s.homepage = %q{http://wiki.github.com/kevinrutherford/reek}
17
17
  s.post_install_message = %q{
18
18
  For more information on reek, see http://wiki.github.com/kevinrutherford/reek
@@ -9,7 +9,7 @@ include Reek
9
9
 
10
10
  describe ReportSection, " when empty" do
11
11
  before(:each) do
12
- @rpt = ReportSection.new(''.sniff, '%m%c %w (%s)', false)
12
+ @rpt = ReportSection.new(''.sniff, false)
13
13
  end
14
14
 
15
15
  it 'has an empty quiet_report' do
@@ -19,7 +19,7 @@ end
19
19
 
20
20
  describe ReportSection, "smell_list" do
21
21
  before(:each) do
22
- rpt = ReportSection.new('def simple(a) a[3] end'.sniff, false, '%m%c %w (%s)')
22
+ rpt = ReportSection.new('def simple(a) a[3] end'.sniff, false)
23
23
  @lines = rpt.smell_list.split("\n")
24
24
  end
25
25
 
@@ -32,18 +32,18 @@ end
32
32
 
33
33
  describe ReportSection, " as a SortedSet" do
34
34
  it 'should only add a smell once' do
35
- rpt = ReportSection.new(''.sniff, false, '%m%c %w (%s)')
36
- rpt << SmellWarning.new(Smells::FeatureEnvy.new, "self", 'too many!', false)
37
- rpt << SmellWarning.new(Smells::FeatureEnvy.new, "self", 'too many!', false)
35
+ rpt = ReportSection.new(''.sniff, false)
36
+ rpt.found_smell SmellWarning.new(Smells::FeatureEnvy.new, "self", 'too many!', false)
37
+ rpt.found_smell SmellWarning.new(Smells::FeatureEnvy.new, "self", 'too many!', false)
38
38
  lines = rpt.smell_list.split("\n")
39
39
  lines.should have(1).lines
40
40
  end
41
41
 
42
42
  it 'should not count an identical masked smell' do
43
- rpt = ReportSection.new(''.sniff, false, '%m%c %w (%s)')
43
+ rpt = ReportSection.new(''.sniff, false)
44
44
  # SMELL: Duplication -- the SmellWarning knows whether to call << or record_masked_smell
45
- rpt << SmellWarning.new(Smells::FeatureEnvy.new, "self", 'too many!', false)
46
- rpt.record_masked_smell(SmellWarning.new(Smells::FeatureEnvy.new, "self", 'too many!', true))
45
+ rpt.found_smell SmellWarning.new(Smells::FeatureEnvy.new, "self", 'too many!', false)
46
+ rpt.found_masked_smell(SmellWarning.new(Smells::FeatureEnvy.new, "self", 'too many!', true))
47
47
  rpt.header.should == 'string -- 1 warning'
48
48
  end
49
49
  end
@@ -11,7 +11,7 @@ describe ReekMatcher do
11
11
  before :each do
12
12
  smelly_code = Dir['spec/samples/two_smelly_files/*.rb']
13
13
  @sniffers = smelly_code.sniff.sniffers
14
- @full = FullReport.new(@sniffers, '%c %w (%s)', false).report
14
+ @full = VerboseReport.new(@sniffers, false).report
15
15
  end
16
16
 
17
17
  it 'reports quietly' do
@@ -44,7 +44,7 @@ describe ShouldReekOnlyOf, 'checking code in a Dir' do
44
44
 
45
45
  it 'reports the smells when should_not fails' do
46
46
  @matcher.matches?(@smelly_dir).should be_true
47
- @matcher.failure_message_for_should.should include(QuietReport.new(@smelly_dir.sniff.sniffers, '%m%c %w (%s)').report)
47
+ @matcher.failure_message_for_should.should include(QuietReport.new(@smelly_dir.sniff.sniffers).report)
48
48
  end
49
49
  end
50
50
 
@@ -65,7 +65,7 @@ describe ShouldReekOnlyOf, 'checking code in a File' do
65
65
 
66
66
  it 'reports the smells when should_not fails' do
67
67
  @matcher.matches?(@smelly_file).should be_true
68
- @matcher.failure_message_for_should.should include(QuietReport.new(@smelly_file.sniff, '%m%c %w (%s)').report)
68
+ @matcher.failure_message_for_should.should include(QuietReport.new(@smelly_file.sniff).report)
69
69
  end
70
70
  end
71
71
 
@@ -23,7 +23,7 @@ describe ShouldReek, 'checking code in a string' do
23
23
 
24
24
  it 'reports the smells when should_not fails' do
25
25
  @matcher.matches?(@smelly_code).should be_true
26
- @matcher.failure_message_for_should_not.should include(QuietReport.new(@smelly_code.sniff, '%m%c %w (%s)').report)
26
+ @matcher.failure_message_for_should_not.should include(QuietReport.new(@smelly_code.sniff).report)
27
27
  end
28
28
  end
29
29
 
@@ -44,7 +44,7 @@ describe ShouldReek, 'checking code in a Dir' do
44
44
 
45
45
  it 'reports the smells when should_not fails' do
46
46
  @matcher.matches?(@smelly_dir).should be_true
47
- @matcher.failure_message_for_should_not.should include(QuietReport.new(@smelly_dir.sniff.sniffers, '%m%c %w (%s)').report)
47
+ @matcher.failure_message_for_should_not.should include(QuietReport.new(@smelly_dir.sniff.sniffers).report)
48
48
  end
49
49
  end
50
50
 
@@ -65,7 +65,7 @@ describe ShouldReek, 'checking code in a File' do
65
65
 
66
66
  it 'reports the smells when should_not fails' do
67
67
  @matcher.matches?(@smelly_file).should be_true
68
- @matcher.failure_message_for_should_not.should include(QuietReport.new(@smelly_file.sniff, '%m%c %w (%s)').report)
68
+ @matcher.failure_message_for_should_not.should include(QuietReport.new(@smelly_file.sniff).report)
69
69
  end
70
70
  end
71
71
 
@@ -101,20 +101,20 @@ describe CodeContext do
101
101
  @ctx = CodeContext.new(nil, ast)
102
102
  end
103
103
  it 'yields no calls' do
104
- @ctx.each(:call, []) {|exp| raise "#{exp} yielded by empty module!"}
104
+ @ctx.each_node(:call, []) {|exp| raise "#{exp} yielded by empty module!"}
105
105
  end
106
106
  it 'yields one module' do
107
107
  mods = 0
108
- @ctx.each(:module, []) {|exp| mods += 1}
108
+ @ctx.each_node(:module, []) {|exp| mods += 1}
109
109
  mods.should == 1
110
110
  end
111
111
  it "yields the module's full AST" do
112
- @ctx.each(:module, []) {|exp| exp[1].should == @module_name.to_sym}
112
+ @ctx.each_node(:module, []) {|exp| exp[1].should == @module_name.to_sym}
113
113
  end
114
114
 
115
115
  context 'with no block' do
116
116
  it 'returns an empty array of ifs' do
117
- @ctx.each(:if, []).should be_empty
117
+ @ctx.each_node(:if, []).should be_empty
118
118
  end
119
119
  end
120
120
  end
@@ -128,24 +128,24 @@ describe CodeContext do
128
128
  @ctx = CodeContext.new(nil, ast)
129
129
  end
130
130
  it 'yields no ifs' do
131
- @ctx.each(:if, []) {|exp| raise "#{exp} yielded by empty module!"}
131
+ @ctx.each_node(:if, []) {|exp| raise "#{exp} yielded by empty module!"}
132
132
  end
133
133
  it 'yields one module' do
134
- @ctx.each(:module, []).length.should == 1
134
+ @ctx.each_node(:module, []).length.should == 1
135
135
  end
136
136
  it "yields the module's full AST" do
137
- @ctx.each(:module, []) {|exp| exp[1].should == @module_name.to_sym}
137
+ @ctx.each_node(:module, []) {|exp| exp[1].should == @module_name.to_sym}
138
138
  end
139
139
  it 'yields one method' do
140
- @ctx.each(:defn, []).length.should == 1
140
+ @ctx.each_node(:defn, []).length.should == 1
141
141
  end
142
142
  it "yields the method's full AST" do
143
- @ctx.each(:defn, []) {|exp| exp[1].should == @method_name.to_sym}
143
+ @ctx.each_node(:defn, []) {|exp| exp[1].should == @method_name.to_sym}
144
144
  end
145
145
 
146
146
  context 'pruning the traversal' do
147
147
  it 'ignores the call inside the method' do
148
- @ctx.each(:call, [:defn]).should be_empty
148
+ @ctx.each_node(:call, [:defn]).should be_empty
149
149
  end
150
150
  end
151
151
  end
@@ -169,7 +169,7 @@ EOS
169
169
 
170
170
  ast = src.to_reek_source.syntax_tree
171
171
  ctx = CodeContext.new(nil, ast)
172
- ctx.each(:if, []).length.should == 3
172
+ ctx.each_node(:if, []).length.should == 3
173
173
  end
174
174
  end
175
175
  end
@@ -37,91 +37,3 @@ describe CodeParser do
37
37
  'def options() ozz.on { |@list| @prompt = !@list } end'.should_not reek
38
38
  end
39
39
  end
40
-
41
- describe CodeParser do
42
- context 'with no attributes' do
43
- it 'records nothing in the class' do
44
- klass = ClassContext.from_s('class Fred; end')
45
- klass.attributes.should be_empty
46
- end
47
- it 'records nothing in the module' do
48
- ctx = ModuleContext.from_s('module Fred; end')
49
- ctx.attributes.should be_empty
50
- end
51
- end
52
-
53
- context 'with one attribute' do
54
- shared_examples_for 'one attribute found' do
55
- it 'records the attribute' do
56
- @ctx.attributes.should include(Name.new(:property))
57
- end
58
- it 'records only that attribute' do
59
- @ctx.attributes.length.should == 1
60
- end
61
- end
62
-
63
- context 'declared in a class' do
64
- before :each do
65
- @ctx = ClassContext.from_s('class Fred; attr :property; end')
66
- end
67
-
68
- it_should_behave_like 'one attribute found'
69
- end
70
-
71
- context 'reader in a class' do
72
- before :each do
73
- @ctx = ClassContext.from_s('class Fred; attr_reader :property; end')
74
- end
75
-
76
- it_should_behave_like 'one attribute found'
77
- end
78
-
79
- context 'writer in a class' do
80
- before :each do
81
- @ctx = ClassContext.from_s('class Fred; attr_writer :property; end')
82
- end
83
-
84
- it_should_behave_like 'one attribute found'
85
- end
86
-
87
- context 'accessor in a class' do
88
- before :each do
89
- @ctx = ClassContext.from_s('class Fred; attr_accessor :property; end')
90
- end
91
-
92
- it_should_behave_like 'one attribute found'
93
- end
94
-
95
- context 'declared in a module' do
96
- before :each do
97
- @ctx = ModuleContext.from_s('module Fred; attr :property; end')
98
- end
99
-
100
- it_should_behave_like 'one attribute found'
101
- end
102
-
103
- context 'reader in a module' do
104
- before :each do
105
- @ctx = ModuleContext.from_s('module Fred; attr_reader :property; end')
106
- end
107
-
108
- it_should_behave_like 'one attribute found'
109
- end
110
-
111
- context 'writer in a module' do
112
- before :each do
113
- @ctx = ModuleContext.from_s('module Fred; attr_writer :property; end')
114
- end
115
-
116
- it_should_behave_like 'one attribute found'
117
- end
118
-
119
- context 'accessor in a module' do
120
- before :each do
121
- @ctx = ModuleContext.from_s('module Fred; attr_accessor :property; end')
122
- end
123
-
124
- it_should_behave_like 'one attribute found'
125
- end
126
- end
127
- end
@@ -0,0 +1,24 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper.rb'
2
+
3
+ require 'reek/help_command'
4
+
5
+ include Reek
6
+
7
+ describe HelpCommand do
8
+ before :each do
9
+ @text = 'Piece of interesting text'
10
+ @cmd = HelpCommand.new(@text)
11
+ @view = mock('view', :null_object => true)
12
+ @view.should_not_receive(:report_smells)
13
+ end
14
+
15
+ it 'displays the correct text on the view' do
16
+ @view.should_receive(:output).with(@text)
17
+ @cmd.execute(@view)
18
+ end
19
+
20
+ it 'tells the view it succeeded' do
21
+ @view.should_receive(:report_success)
22
+ @cmd.execute(@view)
23
+ end
24
+ end
@@ -0,0 +1,236 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper.rb'
2
+
3
+ require 'reek/masking_collection'
4
+
5
+ include Reek
6
+
7
+ describe MaskingCollection do
8
+ before(:each) do
9
+ @collection = MaskingCollection.new
10
+ end
11
+
12
+ context 'when empty' do
13
+ it 'has no visible items' do
14
+ @collection.num_visible_items.should == 0
15
+ end
16
+ it 'has no masked items' do
17
+ @collection.num_masked_items.should == 0
18
+ end
19
+ it 'yields no items' do
20
+ count = 0
21
+ @collection.each_item {|item| count+= 1}
22
+ count.should == 0
23
+ end
24
+ it 'yields no visible items' do
25
+ count = 0
26
+ @collection.each_visible_item {|item| count+= 1}
27
+ count.should == 0
28
+ end
29
+ end
30
+
31
+ shared_examples_for 'one visible item' do
32
+ it 'has one visible item' do
33
+ @collection.num_visible_items.should == 1
34
+ end
35
+ it 'has no masked items' do
36
+ @collection.num_masked_items.should == 0
37
+ end
38
+ it 'yields one item' do
39
+ count = 0
40
+ @collection.each_item do |item|
41
+ item.should == @item
42
+ count+= 1
43
+ end
44
+ count.should == 1
45
+ end
46
+ it 'yields one visible item' do
47
+ count = 0
48
+ @collection.each_visible_item do |item|
49
+ item.should == @item
50
+ count+= 1
51
+ end
52
+ count.should == 1
53
+ end
54
+ end
55
+
56
+ shared_examples_for 'one masked item' do
57
+ it 'has no visible items' do
58
+ @collection.num_visible_items.should == 0
59
+ end
60
+ it 'has one masked item' do
61
+ @collection.num_masked_items.should == 1
62
+ end
63
+ it 'yields one item' do
64
+ count = 0
65
+ @collection.each_item do |item|
66
+ item.should == @item
67
+ count+= 1
68
+ end
69
+ count.should == 1
70
+ end
71
+ it 'yields no visible items' do
72
+ count = 0
73
+ @collection.each_visible_item { |item| count+= 1 }
74
+ count.should == 0
75
+ end
76
+ end
77
+
78
+ context 'with one visible item' do
79
+ before :each do
80
+ @item = "hello"
81
+ @collection.add(@item)
82
+ end
83
+ it_should_behave_like 'one visible item'
84
+ end
85
+
86
+ context 'with one masked item' do
87
+ before :each do
88
+ @item = "hiding!"
89
+ @collection.add_masked(@item)
90
+ end
91
+ it_should_behave_like 'one masked item'
92
+ end
93
+
94
+ context 'with one masked and one visible' do
95
+ before :each do
96
+ @visible = "visible"
97
+ @masked = "masked"
98
+ @collection.add_masked(@masked)
99
+ @collection.add(@visible)
100
+ end
101
+ it 'has one visible item' do
102
+ @collection.num_visible_items.should == 1
103
+ end
104
+ it 'has one masked item' do
105
+ @collection.num_masked_items.should == 1
106
+ end
107
+ it 'yields both items' do
108
+ yielded_items = []
109
+ @collection.each_item { |item| yielded_items << item }
110
+ yielded_items.length.should == 2
111
+ yielded_items.should include(@visible)
112
+ yielded_items.should include(@masked)
113
+ end
114
+ it 'yields one visible item' do
115
+ count = 0
116
+ @collection.each_visible_item do |item|
117
+ item.should == @visible
118
+ count+= 1
119
+ end
120
+ count.should == 1
121
+ end
122
+ it 'yields the items in sort order' do
123
+ yielded_items = []
124
+ @collection.each_item { |item| yielded_items << item }
125
+ yielded_items.length.should == 2
126
+ yielded_items[0].should == @masked
127
+ yielded_items[1].should == @visible
128
+ end
129
+ end
130
+
131
+ context 'with one visible item added twice' do
132
+ before :each do
133
+ @item = "hello"
134
+ @collection.add(@item)
135
+ @collection.add(@item)
136
+ end
137
+ it_should_behave_like 'one visible item'
138
+ end
139
+
140
+ context 'with one masked item added twice' do
141
+ before :each do
142
+ @item = "hello"
143
+ @collection.add_masked(@item)
144
+ @collection.add_masked(@item)
145
+ end
146
+ it_should_behave_like 'one masked item'
147
+ end
148
+
149
+ context 'with two different visible items' do
150
+ before :each do
151
+ @first_item = "hello"
152
+ @second_item = "goodbye"
153
+ @collection.add(@first_item)
154
+ @collection.add(@second_item)
155
+ end
156
+ it 'has 2 visible items' do
157
+ @collection.num_visible_items.should == 2
158
+ end
159
+ it 'has no masked items' do
160
+ @collection.num_masked_items.should == 0
161
+ end
162
+ it 'yields both items' do
163
+ yielded_items = []
164
+ @collection.each_item { |item| yielded_items << item }
165
+ yielded_items.length.should == 2
166
+ yielded_items.should include(@first_item)
167
+ yielded_items.should include(@second_item)
168
+ end
169
+ it 'yields both visible items' do
170
+ yielded_items = []
171
+ @collection.each_visible_item { |item| yielded_items << item }
172
+ yielded_items.length.should == 2
173
+ yielded_items.should include(@first_item)
174
+ yielded_items.should include(@second_item)
175
+ end
176
+ it 'yields the items in sort order' do
177
+ yielded_items = []
178
+ @collection.each_visible_item { |item| yielded_items << item }
179
+ yielded_items.length.should == 2
180
+ yielded_items[0].should == @second_item
181
+ yielded_items[1].should == @first_item
182
+ end
183
+ end
184
+
185
+ context 'with two different masked items' do
186
+ before :each do
187
+ @first_item = "hello"
188
+ @second_item = "goodbye"
189
+ @collection.add_masked(@first_item)
190
+ @collection.add_masked(@second_item)
191
+ end
192
+ it 'has 0 visible items' do
193
+ @collection.num_visible_items.should == 0
194
+ end
195
+ it 'has 2 masked items' do
196
+ @collection.num_masked_items.should == 2
197
+ end
198
+ it 'yields both items' do
199
+ yielded_items = []
200
+ @collection.each_item { |item| yielded_items << item }
201
+ yielded_items.length.should == 2
202
+ yielded_items.should include(@first_item)
203
+ yielded_items.should include(@second_item)
204
+ end
205
+ it 'yields no visible items' do
206
+ count = 0
207
+ @collection.each_visible_item { |item| count+= 1 }
208
+ count.should == 0
209
+ end
210
+ it 'yields the items in sort order' do
211
+ yielded_items = []
212
+ @collection.each_item { |item| yielded_items << item }
213
+ yielded_items.length.should == 2
214
+ yielded_items[0].should == @second_item
215
+ yielded_items[1].should == @first_item
216
+ end
217
+ end
218
+
219
+ context 'with one masked item later made visible' do
220
+ before :each do
221
+ @item = "hello"
222
+ @collection.add_masked(@item)
223
+ @collection.add(@item)
224
+ end
225
+ it_should_behave_like 'one visible item'
226
+ end
227
+
228
+ context 'with one visible item later masked' do
229
+ before :each do
230
+ @item = "hello"
231
+ @collection.add(@item)
232
+ @collection.add_masked(@item)
233
+ end
234
+ it_should_behave_like 'one visible item'
235
+ end
236
+ end