reek 1.2.7.1 → 1.2.7.2

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 (68) hide show
  1. data/History.txt +13 -1
  2. data/config/defaults.reek +4 -1
  3. data/features/masking_smells.feature +7 -7
  4. data/features/rake_task.feature +2 -2
  5. data/features/reports.feature +3 -3
  6. data/features/samples.feature +5 -2
  7. data/features/yaml.feature +0 -39
  8. data/lib/reek.rb +1 -1
  9. data/lib/reek/cli/command_line.rb +3 -3
  10. data/lib/reek/cli/reek_command.rb +5 -6
  11. data/lib/reek/cli/report.rb +9 -20
  12. data/lib/reek/cli/yaml_command.rb +1 -1
  13. data/lib/reek/core/class_context.rb +1 -2
  14. data/lib/reek/core/code_context.rb +10 -27
  15. data/lib/reek/core/code_parser.rb +1 -18
  16. data/lib/reek/core/detector_stack.rb +4 -0
  17. data/lib/reek/core/masking_collection.rb +6 -0
  18. data/lib/reek/core/method_context.rb +8 -56
  19. data/lib/reek/core/module_context.rb +6 -32
  20. data/lib/reek/core/object_refs.rb +36 -36
  21. data/lib/reek/core/singleton_method_context.rb +10 -21
  22. data/lib/reek/core/sniffer.rb +3 -2
  23. data/lib/reek/examiner.rb +39 -31
  24. data/lib/reek/smell_warning.rb +8 -0
  25. data/lib/reek/smells/attribute.rb +4 -2
  26. data/lib/reek/smells/class_variable.rb +3 -3
  27. data/lib/reek/smells/control_couple.rb +1 -2
  28. data/lib/reek/smells/data_clump.rb +86 -9
  29. data/lib/reek/smells/duplication.rb +2 -3
  30. data/lib/reek/smells/feature_envy.rb +9 -4
  31. data/lib/reek/smells/simulated_polymorphism.rb +1 -2
  32. data/lib/reek/smells/smell_detector.rb +0 -6
  33. data/lib/reek/smells/uncommunicative_method_name.rb +8 -2
  34. data/lib/reek/smells/uncommunicative_parameter_name.rb +1 -1
  35. data/lib/reek/smells/uncommunicative_variable_name.rb +1 -1
  36. data/lib/reek/smells/utility_function.rb +17 -5
  37. data/lib/reek/source/reference_collector.rb +21 -0
  38. data/lib/reek/source/sexp_formatter.rb +1 -0
  39. data/lib/reek/source/tree_dresser.rb +67 -9
  40. data/lib/reek/spec/should_reek.rb +1 -1
  41. data/lib/reek/spec/should_reek_of.rb +1 -1
  42. data/lib/reek/spec/should_reek_only_of.rb +1 -1
  43. data/reek.gemspec +3 -3
  44. data/spec/reek/cli/reek_command_spec.rb +3 -2
  45. data/spec/reek/cli/report_spec.rb +2 -2
  46. data/spec/reek/cli/yaml_command_spec.rb +2 -2
  47. data/spec/reek/core/code_context_spec.rb +39 -54
  48. data/spec/reek/core/method_context_spec.rb +7 -26
  49. data/spec/reek/core/module_context_spec.rb +0 -15
  50. data/spec/reek/core/singleton_method_context_spec.rb +0 -6
  51. data/spec/reek/examiner_spec.rb +6 -6
  52. data/spec/reek/smells/attribute_spec.rb +30 -32
  53. data/spec/reek/smells/class_variable_spec.rb +15 -18
  54. data/spec/reek/smells/data_clump_spec.rb +22 -6
  55. data/spec/reek/smells/duplication_spec.rb +33 -19
  56. data/spec/reek/smells/feature_envy_spec.rb +82 -88
  57. data/spec/reek/smells/large_class_spec.rb +1 -1
  58. data/spec/reek/smells/smell_detector_shared.rb +1 -1
  59. data/spec/reek/smells/uncommunicative_method_name_spec.rb +37 -35
  60. data/spec/reek/smells/utility_function_spec.rb +7 -0
  61. data/spec/reek/source/reference_collector_spec.rb +53 -0
  62. data/spec/reek/source/tree_dresser_spec.rb +10 -0
  63. data/spec/reek/spec/should_reek_only_of_spec.rb +1 -1
  64. data/spec/spec_helper.rb +7 -0
  65. metadata +4 -5
  66. data/features/profile.feature +0 -34
  67. data/lib/reek/core/block_context.rb +0 -18
  68. data/spec/reek/core/block_context_spec.rb +0 -26
@@ -18,7 +18,7 @@ module Reek
18
18
  "Expected no smells, but got:\n#{list_smells(@examiner)}"
19
19
  end
20
20
  def list_smells(examiner)
21
- examiner.all_active_smells.map do |smell|
21
+ examiner.smells.map do |smell|
22
22
  "#{smell.report('%c %w (%s)')}"
23
23
  end.join("\n")
24
24
  end
@@ -14,7 +14,7 @@ module Reek
14
14
  end
15
15
  def matches?(actual)
16
16
  @examiner = Examiner.new(actual)
17
- @all_smells = @examiner.all_active_smells
17
+ @all_smells = @examiner.smells
18
18
  @all_smells.any? {|warning| warning.matches?(@klass, @patterns)}
19
19
  end
20
20
  def failure_message_for_should
@@ -13,7 +13,7 @@ module Reek
13
13
  end
14
14
  def matches_examiner?(examiner)
15
15
  @examiner = examiner
16
- @all_smells = @examiner.all_active_smells
16
+ @all_smells = @examiner.smells
17
17
  @all_smells.length == 1 and @all_smells[0].matches?(@klass, @patterns)
18
18
  end
19
19
  def failure_message_for_should
data/reek.gemspec CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{reek}
5
- s.version = "1.2.7.1"
5
+ s.version = "1.2.7.2"
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{2010-02-03}
9
+ s.date = %q{2010-03-05}
10
10
  s.default_executable = %q{reek}
11
11
  s.description = %q{Reek is a tool that examines Ruby classes, modules and methods
12
12
  and reports any code smells it finds.
@@ -14,7 +14,7 @@ and reports any code smells it finds.
14
14
  s.email = ["kevin@rutherford-software.com"]
15
15
  s.executables = ["reek"]
16
16
  s.extra_rdoc_files = ["History.txt", "License.txt"]
17
- s.files = [".yardopts", "History.txt", "License.txt", "README.md", "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", "features/yaml.feature", "lib/reek.rb", "lib/reek/cli/application.rb", "lib/reek/cli/command_line.rb", "lib/reek/cli/help_command.rb", "lib/reek/cli/reek_command.rb", "lib/reek/cli/report.rb", "lib/reek/cli/version_command.rb", "lib/reek/cli/yaml_command.rb", "lib/reek/core/block_context.rb", "lib/reek/core/class_context.rb", "lib/reek/core/code_context.rb", "lib/reek/core/code_parser.rb", "lib/reek/core/detector_stack.rb", "lib/reek/core/masking_collection.rb", "lib/reek/core/method_context.rb", "lib/reek/core/module_context.rb", "lib/reek/core/object_refs.rb", "lib/reek/core/singleton_method_context.rb", "lib/reek/core/smell_configuration.rb", "lib/reek/core/sniffer.rb", "lib/reek/core/stop_context.rb", "lib/reek/examiner.rb", "lib/reek/rake/task.rb", "lib/reek/smell_warning.rb", "lib/reek/smells.rb", "lib/reek/smells/attribute.rb", "lib/reek/smells/boolean_parameter.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/irresponsible_module.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_method_name.rb", "lib/reek/smells/uncommunicative_module_name.rb", "lib/reek/smells/uncommunicative_parameter_name.rb", "lib/reek/smells/uncommunicative_variable_name.rb", "lib/reek/smells/utility_function.rb", "lib/reek/source.rb", "lib/reek/source/code_comment.rb", "lib/reek/source/config_file.rb", "lib/reek/source/core_extras.rb", "lib/reek/source/sexp_formatter.rb", "lib/reek/source/source_code.rb", "lib/reek/source/source_file.rb", "lib/reek/source/source_locator.rb", "lib/reek/source/tree_dresser.rb", "lib/reek/spec.rb", "lib/reek/spec/should_reek.rb", "lib/reek/spec/should_reek_of.rb", "lib/reek/spec/should_reek_only_of.rb", "reek.gemspec", "spec/reek/cli/help_command_spec.rb", "spec/reek/cli/reek_command_spec.rb", "spec/reek/cli/report_spec.rb", "spec/reek/cli/version_command_spec.rb", "spec/reek/cli/yaml_command_spec.rb", "spec/reek/core/block_context_spec.rb", "spec/reek/core/class_context_spec.rb", "spec/reek/core/code_context_spec.rb", "spec/reek/core/code_parser_spec.rb", "spec/reek/core/config_spec.rb", "spec/reek/core/masking_collection_spec.rb", "spec/reek/core/method_context_spec.rb", "spec/reek/core/module_context_spec.rb", "spec/reek/core/object_refs_spec.rb", "spec/reek/core/singleton_method_context_spec.rb", "spec/reek/core/smell_configuration_spec.rb", "spec/reek/core/stop_context_spec.rb", "spec/reek/examiner_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/boolean_parameter_spec.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/irresponsible_module_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/long_yield_list_spec.rb", "spec/reek/smells/nested_iterators_spec.rb", "spec/reek/smells/simulated_polymorphism_spec.rb", "spec/reek/smells/smell_detector_shared.rb", "spec/reek/smells/uncommunicative_method_name_spec.rb", "spec/reek/smells/uncommunicative_module_name_spec.rb", "spec/reek/smells/uncommunicative_parameter_name_spec.rb", "spec/reek/smells/uncommunicative_variable_name_spec.rb", "spec/reek/smells/utility_function_spec.rb", "spec/reek/source/code_comment_spec.rb", "spec/reek/source/object_source_spec.rb", "spec/reek/source/source_code_spec.rb", "spec/reek/source/tree_dresser_spec.rb", "spec/reek/spec/should_reek_of_spec.rb", "spec/reek/spec/should_reek_only_of_spec.rb", "spec/reek/spec/should_reek_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"]
17
+ s.files = [".yardopts", "History.txt", "License.txt", "README.md", "Rakefile", "bin/reek", "config/defaults.reek", "features/masking_smells.feature", "features/options.feature", "features/rake_task.feature", "features/reports.feature", "features/samples.feature", "features/stdin.feature", "features/step_definitions/reek_steps.rb", "features/support/env.rb", "features/yaml.feature", "lib/reek.rb", "lib/reek/cli/application.rb", "lib/reek/cli/command_line.rb", "lib/reek/cli/help_command.rb", "lib/reek/cli/reek_command.rb", "lib/reek/cli/report.rb", "lib/reek/cli/version_command.rb", "lib/reek/cli/yaml_command.rb", "lib/reek/core/class_context.rb", "lib/reek/core/code_context.rb", "lib/reek/core/code_parser.rb", "lib/reek/core/detector_stack.rb", "lib/reek/core/masking_collection.rb", "lib/reek/core/method_context.rb", "lib/reek/core/module_context.rb", "lib/reek/core/object_refs.rb", "lib/reek/core/singleton_method_context.rb", "lib/reek/core/smell_configuration.rb", "lib/reek/core/sniffer.rb", "lib/reek/core/stop_context.rb", "lib/reek/examiner.rb", "lib/reek/rake/task.rb", "lib/reek/smell_warning.rb", "lib/reek/smells.rb", "lib/reek/smells/attribute.rb", "lib/reek/smells/boolean_parameter.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/irresponsible_module.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_method_name.rb", "lib/reek/smells/uncommunicative_module_name.rb", "lib/reek/smells/uncommunicative_parameter_name.rb", "lib/reek/smells/uncommunicative_variable_name.rb", "lib/reek/smells/utility_function.rb", "lib/reek/source.rb", "lib/reek/source/code_comment.rb", "lib/reek/source/config_file.rb", "lib/reek/source/core_extras.rb", "lib/reek/source/reference_collector.rb", "lib/reek/source/sexp_formatter.rb", "lib/reek/source/source_code.rb", "lib/reek/source/source_file.rb", "lib/reek/source/source_locator.rb", "lib/reek/source/tree_dresser.rb", "lib/reek/spec.rb", "lib/reek/spec/should_reek.rb", "lib/reek/spec/should_reek_of.rb", "lib/reek/spec/should_reek_only_of.rb", "reek.gemspec", "spec/reek/cli/help_command_spec.rb", "spec/reek/cli/reek_command_spec.rb", "spec/reek/cli/report_spec.rb", "spec/reek/cli/version_command_spec.rb", "spec/reek/cli/yaml_command_spec.rb", "spec/reek/core/class_context_spec.rb", "spec/reek/core/code_context_spec.rb", "spec/reek/core/code_parser_spec.rb", "spec/reek/core/config_spec.rb", "spec/reek/core/masking_collection_spec.rb", "spec/reek/core/method_context_spec.rb", "spec/reek/core/module_context_spec.rb", "spec/reek/core/object_refs_spec.rb", "spec/reek/core/singleton_method_context_spec.rb", "spec/reek/core/smell_configuration_spec.rb", "spec/reek/core/stop_context_spec.rb", "spec/reek/examiner_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/boolean_parameter_spec.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/irresponsible_module_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/long_yield_list_spec.rb", "spec/reek/smells/nested_iterators_spec.rb", "spec/reek/smells/simulated_polymorphism_spec.rb", "spec/reek/smells/smell_detector_shared.rb", "spec/reek/smells/uncommunicative_method_name_spec.rb", "spec/reek/smells/uncommunicative_module_name_spec.rb", "spec/reek/smells/uncommunicative_parameter_name_spec.rb", "spec/reek/smells/uncommunicative_variable_name_spec.rb", "spec/reek/smells/utility_function_spec.rb", "spec/reek/source/code_comment_spec.rb", "spec/reek/source/object_source_spec.rb", "spec/reek/source/reference_collector_spec.rb", "spec/reek/source/source_code_spec.rb", "spec/reek/source/tree_dresser_spec.rb", "spec/reek/spec/should_reek_of_spec.rb", "spec/reek/spec/should_reek_only_of_spec.rb", "spec/reek/spec/should_reek_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"]
18
18
  s.homepage = %q{http://wiki.github.com/kevinrutherford/reek}
19
19
  s.post_install_message = %q{
20
20
  For more information on reek, see http://wiki.github.com/kevinrutherford/reek
@@ -1,5 +1,6 @@
1
1
  require File.join(File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__)))), 'spec_helper')
2
2
  require File.join(File.dirname(File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__))))), 'lib', 'reek', 'cli', 'reek_command')
3
+ require File.join(File.dirname(File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__))))), 'lib', 'reek', 'cli', 'report')
3
4
  require File.join(File.dirname(File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__))))), 'lib', 'reek', 'examiner')
4
5
 
5
6
  include Reek
@@ -13,7 +14,7 @@ describe ReekCommand do
13
14
  context 'with smells' do
14
15
  before :each do
15
16
  examiner = Examiner.new('def x(); end')
16
- @cmd = ReekCommand.new([examiner], QuietReport, false)
17
+ @cmd = ReekCommand.new([examiner], QuietReport)
17
18
  end
18
19
 
19
20
  it 'displays the correct text on the view' do
@@ -30,7 +31,7 @@ describe ReekCommand do
30
31
  context 'with no smells' do
31
32
  before :each do
32
33
  examiner = Examiner.new('def clean(); end')
33
- @cmd = ReekCommand.new([examiner], QuietReport, false)
34
+ @cmd = ReekCommand.new([examiner], QuietReport)
34
35
  end
35
36
 
36
37
  it 'displays nothing on the view' do
@@ -9,14 +9,14 @@ describe ReportSection, " when empty" do
9
9
  context 'empty source' do
10
10
  it 'has an empty quiet_report' do
11
11
  examiner = Examiner.new('')
12
- ReportSection.new(examiner, false).quiet_report.should == ''
12
+ ReportSection.new(examiner).quiet_report.should == ''
13
13
  end
14
14
  end
15
15
 
16
16
  context 'with a couple of smells' do
17
17
  it 'should mention every smell name' do
18
18
  examiner = Examiner.new('def simple(a) a[3] end')
19
- rpt = ReportSection.new(examiner, false)
19
+ rpt = ReportSection.new(examiner)
20
20
  @lines = rpt.smell_list.split("\n")
21
21
  @lines.should have_at_least(2).lines
22
22
  @lines[0].should match('[Utility Function]')
@@ -12,7 +12,7 @@ describe YamlCommand do
12
12
 
13
13
  context 'with no smells' do
14
14
  before :each do
15
- @examiner.should_receive(:all_smells).and_return([])
15
+ @examiner.should_receive(:smells).and_return([])
16
16
  @cmd = YamlCommand.new([@examiner])
17
17
  end
18
18
 
@@ -30,7 +30,7 @@ describe YamlCommand do
30
30
  context 'with smells' do
31
31
  before :each do
32
32
  @smell = SmellWarning.new('UncommunicativeName', "self", 27, "self", true)
33
- @examiner.should_receive(:all_smells).and_return([@smell])
33
+ @examiner.should_receive(:smells).and_return([@smell])
34
34
  @cmd = YamlCommand.new([@examiner])
35
35
  end
36
36
 
@@ -1,5 +1,4 @@
1
1
  require File.join(File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__)))), 'spec_helper')
2
- require File.join(File.dirname(File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__))))), 'lib', 'reek', 'core', 'block_context')
3
2
  require File.join(File.dirname(File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__))))), 'lib', 'reek', 'core', 'class_context')
4
3
  require File.join(File.dirname(File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__))))), 'lib', 'reek', 'core', 'method_context')
5
4
  require File.join(File.dirname(File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__))))), 'lib', 'reek', 'core', 'module_context')
@@ -8,30 +7,47 @@ require File.join(File.dirname(File.dirname(File.dirname(File.dirname(File.expan
8
7
  include Reek::Core
9
8
 
10
9
  describe CodeContext do
11
- context 'full_name' do
12
- it "reports the full context" do
13
- element = StopContext.new
14
- element = ModuleContext.new(element, 'mod', s(:module, :mod, nil))
15
- element = ClassContext.new(element, [0, :klass], s())
16
- element = MethodContext.new(element, [0, :bad])
17
- element = BlockContext.new(element, s(nil, nil))
18
- element.full_name.should match(/bad/)
19
- element.full_name.should match(/klass/)
20
- element.full_name.should match(/mod/)
10
+ context 'name recognition' do
11
+ before :each do
12
+ @exp_name = 'random_name' # SMELL: could use a String.random here
13
+ @full_name = "::::::::::::::::::::#{@exp_name}"
14
+ @exp = mock('exp')
15
+ @exp.should_receive(:name).any_number_of_times.and_return(@exp_name)
16
+ @exp.should_receive(:full_name).any_number_of_times.and_return(@full_name)
17
+ @ctx = CodeContext.new(nil, @exp)
21
18
  end
22
-
23
- it 'reports the method name via nested blocks' do
24
- element1 = StopContext.new
25
- element2 = MethodContext.new(element1, [0, :bad])
26
- element3 = BlockContext.new(element2, s(nil, nil))
27
- BlockContext.new(element3, s(nil, nil)).full_name.should match(/bad/)
19
+ it 'gets its short name from the exp' do
20
+ @ctx.name.should == @exp_name
21
+ end
22
+ it 'does not match an empty list' do
23
+ @ctx.matches?([]).should == false
24
+ end
25
+ it 'does not match when its own short name is not given' do
26
+ @ctx.matches?(['banana']).should == false
27
+ end
28
+ it 'recognises its own short name' do
29
+ @ctx.matches?(['banana', @exp_name]).should == true
30
+ end
31
+ it 'recognises its short name as a regex' do
32
+ @ctx.matches?([/banana/, /#{@exp_name}/]).should == true
28
33
  end
29
- it 'includes the enclosing context name' do
30
- outer_name = 'randomstring'
31
- outer = mock('outer')
32
- outer.should_receive(:full_name).and_return(outer_name)
33
- ifc = BlockContext.new(outer, s(:if, s()))
34
- ifc.full_name.should == "#{outer_name}/block"
34
+
35
+ context 'when there is an outer' do
36
+ before :each do
37
+ @outer_name = 'another_random sting'
38
+ outer = mock('outer')
39
+ outer.should_receive(:full_name).at_least(:once).and_return(@outer_name)
40
+ @ctx = CodeContext.new(outer, @exp)
41
+ end
42
+ it 'creates the correct full name' do
43
+ @ctx.full_name.should == "#{@full_name}"
44
+ end
45
+ it 'recognises its own full name' do
46
+ @ctx.matches?(['banana', @full_name]).should == true
47
+ end
48
+ it 'recognises its full name as a regex' do
49
+ @ctx.matches?([/banana/, /#{@full_name}/]).should == true
50
+ end
35
51
  end
36
52
  end
37
53
 
@@ -42,41 +58,10 @@ describe CodeContext do
42
58
  element = ModuleContext.new(stop, 'mod', s(:module, :mod, nil))
43
59
  class_element = ClassContext.new(element, [0, :klass], s())
44
60
  element = MethodContext.new(class_element, [0, :bad])
45
- element = BlockContext.new(element, s(nil, nil))
46
61
  element.bananas(17, -5).should == 55
47
62
  end
48
63
  end
49
64
 
50
- context 'name matching' do
51
- it 'should recognise itself in a collection of names' do
52
- element = StopContext.new
53
- element = ModuleContext.new(element, 'mod', s(:module, :mod, nil))
54
- element.matches?(['banana', 'mod']).should == true
55
- end
56
-
57
- it 'should recognise itself in a collection of REs' do
58
- element = StopContext.new
59
- element = ModuleContext.new(element, 'mod', s(:module, :mod, nil))
60
- element.matches?([/banana/, /mod/]).should == true
61
- end
62
-
63
- it 'should recognise its fq name in a collection of names' do
64
- element = StopContext.new
65
- element = ModuleContext.new(element, 'mod', s(:module, :mod, nil))
66
- element = ClassContext.create(element, s(:class, :klass))
67
- element.matches?(['banana', 'mod']).should == true
68
- element.matches?(['banana', 'mod::klass']).should == true
69
- end
70
-
71
- it 'should recognise its fq name in a collection of names' do
72
- element = StopContext.new
73
- element = ModuleContext.new(element, 'mod', s(:module, :mod, nil))
74
- element = ClassContext.create(element, s(:class, :klass))
75
- element.matches?([/banana/, /mod/]).should == true
76
- element.matches?([/banana/, /mod::klass/]).should == true
77
- end
78
- end
79
-
80
65
  context 'enumerating syntax elements' do
81
66
  context 'in an empty module' do
82
67
  before :each do
@@ -6,7 +6,9 @@ include Reek::Core
6
6
 
7
7
  describe MethodContext, 'matching' do
8
8
  before :each do
9
- @element = MethodContext.new(StopContext.new, s(0, :mod))
9
+ exp = mock('exp', :null_object => true)
10
+ exp.should_receive(:full_name).at_least(:once).and_return('mod')
11
+ @element = MethodContext.new(StopContext.new, exp)
10
12
  end
11
13
 
12
14
  it 'should recognise itself in a collection of names' do
@@ -20,46 +22,25 @@ describe MethodContext, 'matching' do
20
22
  end
21
23
  end
22
24
 
23
- describe MethodContext, 'matching fq names' do
24
- before :each do
25
- element = StopContext.new
26
- element = ModuleContext.new(element, 'mod', s(:module, :mod, nil))
27
- element = ClassContext.new(element, 'klass', s())
28
- @element = MethodContext.new(element, s(0, :meth))
29
- end
30
-
31
- it 'should recognise itself in a collection of names' do
32
- @element.matches?(['banana', 'meth']).should == true
33
- @element.matches?(['banana', 'klass#meth']).should == true
34
- @element.matches?(['banana']).should == false
35
- end
36
-
37
- it 'should recognise itself in a collection of names' do
38
- @element.matches?([/banana/, /meth/]).should == true
39
- @element.matches?([/banana/, /klass#meth/]).should == true
40
- @element.matches?([/banana/]).should == false
41
- end
42
- end
43
-
44
25
  describe MethodContext do
45
26
  it 'should record ivars as refs to self' do
46
27
  mctx = MethodContext.new(StopContext.new, [:defn, :feed])
47
28
  mctx.envious_receivers.should == []
48
- mctx.record_call_to([:call, [:ivar, :@cow], :feed_to])
29
+ mctx.record_call_to(ast(:call, s(:ivar, :@cow), :feed_to))
49
30
  mctx.envious_receivers.should == []
50
31
  end
51
32
 
52
33
  it 'should count calls to self' do
53
34
  mctx = MethodContext.new(StopContext.new, [:defn, :equals])
54
35
  mctx.refs.record_ref([:lvar, :other])
55
- mctx.record_call_to([:call, [:self], :thing])
36
+ mctx.record_call_to(ast(:call, s(:self), :thing))
56
37
  mctx.envious_receivers.should be_empty
57
38
  end
58
39
 
59
40
  it 'should recognise a call on self' do
60
41
  mc = MethodContext.new(StopContext.new, s(:defn, :deep))
61
- mc.record_call_to(s(:call, s(:lvar, :text), :each, s(:arglist)))
62
- mc.record_call_to(s(:call, nil, :shelve, s(:arglist)))
42
+ mc.record_call_to(ast(:call, s(:lvar, :text), :each, s(:arglist)))
43
+ mc.record_call_to(ast(:call, nil, :shelve, s(:arglist)))
63
44
  mc.envious_receivers.should be_empty
64
45
  end
65
46
  end
@@ -24,19 +24,4 @@ module ::Global
24
24
  # module for test
25
25
  class Inside; end; end'.should_not reek
26
26
  end
27
-
28
- context 'full_name' do
29
- it "reports full context" do
30
- element = StopContext.new
31
- element = ModuleContext.new(element, 'mod', s(:module, :mod, nil))
32
- element.full_name.should == 'mod'
33
- end
34
- end
35
-
36
- it 'finds fq loaded class' do
37
- exp = [:class, :"Reek::Smells::LargeClass", nil]
38
- ctx = StopContext.new
39
- res = ModuleContext.resolve(exp[1], ctx)
40
- res[1].should == "LargeClass"
41
- end
42
27
  end
@@ -6,10 +6,4 @@ require File.join(File.dirname(File.dirname(File.dirname(File.dirname(File.expan
6
6
  include Reek::Core
7
7
 
8
8
  describe SingletonMethodContext do
9
- it "reports full context" do
10
- element = StopContext.new
11
- element = ModuleContext.new(element, 'mod', s(:module, :mod, nil))
12
- element = SingletonMethodContext.new(element, s(:defs, s(:call, nil, :a, s(:arglist)), :b, s(:args)))
13
- element.full_name.should match(/mod#a\.b/)
14
- end
15
9
  end
@@ -10,32 +10,32 @@ describe Examiner do
10
10
  end
11
11
  it 'doesnt match a fragrant String' do
12
12
  examiner = Examiner.new('def good() true; end')
13
- examiner.all_active_smells.should == []
13
+ examiner.smells.should == []
14
14
  end
15
15
  it 'matches a smelly String' do
16
- Examiner.new('def fine() y = 4; end').all_active_smells.length.should == 1
16
+ Examiner.new('def fine() y = 4; end').smells.length.should == 1
17
17
  end
18
18
 
19
19
  context 'checking code in a Dir' do
20
20
  it 'matches a smelly Dir' do
21
21
  smelly_dir = Dir['spec/samples/all_but_one_masked/*.rb']
22
- Examiner.new(smelly_dir).all_active_smells.length.should == 1
22
+ Examiner.new(smelly_dir).smells.length.should == 1
23
23
  end
24
24
  it 'doesnt match a fragrant Dir' do
25
25
  clean_dir = Dir['spec/samples/three_clean_files/*.rb']
26
- Examiner.new(clean_dir).all_active_smells.length.should == 0
26
+ Examiner.new(clean_dir).smells.length.should == 0
27
27
  end
28
28
  end
29
29
 
30
30
  context 'checking code in a File' do
31
31
  it 'matches a smelly File' do
32
32
  smelly_file = File.new(Dir['spec/samples/all_but_one_masked/d*.rb'][0])
33
- Examiner.new(smelly_file).all_active_smells.length.should == 1
33
+ Examiner.new(smelly_file).smells.length.should == 1
34
34
  end
35
35
 
36
36
  it 'doesnt match a fragrant File' do
37
37
  clean_file = File.new(Dir['spec/samples/three_clean_files/*.rb'][0])
38
- Examiner.new(clean_file).all_active_smells.length.should == 0
38
+ Examiner.new(clean_file).smells.length.should == 0
39
39
  end
40
40
  end
41
41
 
@@ -27,18 +27,37 @@ describe Attribute do
27
27
  end
28
28
 
29
29
  context 'with one attribute' do
30
+ before :each do
31
+ @attr_name = 'super_thing'
32
+ end
33
+
30
34
  shared_examples_for 'one attribute found' do
31
- it 'records the attribute' do
32
- @detector.attributes_in(@ctx).should include([:property, 1])
35
+ before :each do
36
+ ctx = CodeContext.new(nil, @src.to_reek_source.syntax_tree)
37
+ @detector.examine_context(ctx)
38
+ @smells = @detector.smells_found.to_a
33
39
  end
40
+
34
41
  it 'records only that attribute' do
35
- @detector.attributes_in(@ctx).length.should == 1
42
+ @smells.length.should == 1
43
+ end
44
+ it 'reports the attribute name' do
45
+ @smells[0].smell[Attribute::ATTRIBUTE_KEY].should == @attr_name
46
+ end
47
+ it 'reports the declaration line number' do
48
+ @smells[0].lines.should == [1]
49
+ end
50
+ it 'reports the correct smell class' do
51
+ @smells[0].smell_class.should == Attribute::SMELL_CLASS
52
+ end
53
+ it 'reports the context fq name' do
54
+ @smells[0].context.should == 'Fred'
36
55
  end
37
56
  end
38
57
 
39
58
  context 'declared in a class' do
40
59
  before :each do
41
- @ctx = ClassContext.from_s('class Fred; attr :property; end')
60
+ @src = "class Fred; attr :#{@attr_name}; end"
42
61
  end
43
62
 
44
63
  it_should_behave_like 'one attribute found'
@@ -46,7 +65,7 @@ describe Attribute do
46
65
 
47
66
  context 'reader in a class' do
48
67
  before :each do
49
- @ctx = ClassContext.from_s('class Fred; attr_reader :property; end')
68
+ @src = "class Fred; attr_reader :#{@attr_name}; end"
50
69
  end
51
70
 
52
71
  it_should_behave_like 'one attribute found'
@@ -54,7 +73,7 @@ describe Attribute do
54
73
 
55
74
  context 'writer in a class' do
56
75
  before :each do
57
- @ctx = ClassContext.from_s('class Fred; attr_writer :property; end')
76
+ @src = "class Fred; attr_writer :#{@attr_name}; end"
58
77
  end
59
78
 
60
79
  it_should_behave_like 'one attribute found'
@@ -62,7 +81,7 @@ describe Attribute do
62
81
 
63
82
  context 'accessor in a class' do
64
83
  before :each do
65
- @ctx = ClassContext.from_s('class Fred; attr_accessor :property; end')
84
+ @src = "class Fred; attr_accessor :#{@attr_name}; end"
66
85
  end
67
86
 
68
87
  it_should_behave_like 'one attribute found'
@@ -70,7 +89,7 @@ describe Attribute do
70
89
 
71
90
  context 'declared in a module' do
72
91
  before :each do
73
- @ctx = ModuleContext.from_s('module Fred; attr :property; end')
92
+ @src = "module Fred; attr :#{@attr_name}; end"
74
93
  end
75
94
 
76
95
  it_should_behave_like 'one attribute found'
@@ -78,7 +97,7 @@ describe Attribute do
78
97
 
79
98
  context 'reader in a module' do
80
99
  before :each do
81
- @ctx = ModuleContext.from_s('module Fred; attr_reader :property; end')
100
+ @src = "module Fred; attr_reader :#{@attr_name}; end"
82
101
  end
83
102
 
84
103
  it_should_behave_like 'one attribute found'
@@ -86,7 +105,7 @@ describe Attribute do
86
105
 
87
106
  context 'writer in a module' do
88
107
  before :each do
89
- @ctx = ModuleContext.from_s('module Fred; attr_writer :property; end')
108
+ @src = "module Fred; attr_writer :#{@attr_name}; end"
90
109
  end
91
110
 
92
111
  it_should_behave_like 'one attribute found'
@@ -94,31 +113,10 @@ describe Attribute do
94
113
 
95
114
  context 'accessor in a module' do
96
115
  before :each do
97
- @ctx = ModuleContext.from_s('module Fred; attr_accessor :property; end')
116
+ @src = "module Fred; attr_accessor :#{@attr_name}; end"
98
117
  end
99
118
 
100
119
  it_should_behave_like 'one attribute found'
101
120
  end
102
121
  end
103
-
104
- context 'looking at the YAML' do
105
- before :each do
106
- @attr = 'prop'
107
- src = <<EOS
108
- module Fred
109
- attr_writer :#{@attr}
110
- end
111
- EOS
112
- @ctx = ModuleContext.from_s(src)
113
- @detector.examine_context(@ctx)
114
- warning = @detector.smells_found.to_a[0] # SMELL: too cumbersome!
115
- @yaml = warning.to_yaml
116
- end
117
- it 'reports the attribute' do
118
- @yaml.should match(/attribute:\s*#{@attr}/)
119
- end
120
- it 'reports the declaration line number' do
121
- @yaml.should match(/lines:[\s-]*3/)
122
- end
123
- end
124
122
  end