reek 1.3.1 → 1.3.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 (128) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG +6 -0
  3. data/README.md +15 -9
  4. data/bin/reek +1 -1
  5. data/config/defaults.reek +71 -86
  6. data/features/command_line_interface/options.feature +0 -15
  7. data/features/reports/reports.feature +23 -0
  8. data/features/samples.feature +3 -12
  9. data/lib/reek.rb +3 -3
  10. data/lib/reek/cli/application.rb +1 -1
  11. data/lib/reek/cli/command_line.rb +10 -8
  12. data/lib/reek/cli/reek_command.rb +6 -7
  13. data/lib/reek/cli/report.rb +34 -38
  14. data/lib/reek/cli/version_command.rb +1 -1
  15. data/lib/reek/cli/yaml_command.rb +1 -1
  16. data/lib/reek/core/code_parser.rb +4 -4
  17. data/lib/reek/core/hash_extensions.rb +2 -2
  18. data/lib/reek/core/method_context.rb +2 -2
  19. data/lib/reek/core/module_context.rb +4 -4
  20. data/lib/reek/core/singleton_method_context.rb +1 -1
  21. data/lib/reek/core/smell_repository.rb +7 -6
  22. data/lib/reek/core/sniffer.rb +4 -4
  23. data/lib/reek/examiner.rb +10 -3
  24. data/lib/reek/smell_warning.rb +0 -2
  25. data/lib/reek/smells.rb +22 -21
  26. data/lib/reek/smells/attribute.rb +4 -8
  27. data/lib/reek/smells/boolean_parameter.rb +2 -2
  28. data/lib/reek/smells/class_variable.rb +3 -2
  29. data/lib/reek/smells/{control_couple.rb → control_parameter.rb} +5 -5
  30. data/lib/reek/smells/data_clump.rb +13 -29
  31. data/lib/reek/smells/{duplication.rb → duplicate_method_call.rb} +9 -11
  32. data/lib/reek/smells/feature_envy.rb +2 -2
  33. data/lib/reek/smells/irresponsible_module.rb +3 -2
  34. data/lib/reek/smells/long_parameter_list.rb +6 -10
  35. data/lib/reek/smells/long_yield_list.rb +4 -8
  36. data/lib/reek/smells/nested_iterators.rb +31 -25
  37. data/lib/reek/smells/nil_check.rb +11 -12
  38. data/lib/reek/smells/{simulated_polymorphism.rb → repeated_conditional.rb} +6 -10
  39. data/lib/reek/smells/smell_detector.rb +3 -6
  40. data/lib/reek/smells/too_many_instance_variables.rb +60 -0
  41. data/lib/reek/smells/too_many_methods.rb +62 -0
  42. data/lib/reek/smells/{long_method.rb → too_many_statements.rb} +7 -12
  43. data/lib/reek/smells/uncommunicative_method_name.rb +3 -7
  44. data/lib/reek/smells/uncommunicative_module_name.rb +3 -7
  45. data/lib/reek/smells/uncommunicative_parameter_name.rb +4 -8
  46. data/lib/reek/smells/uncommunicative_variable_name.rb +5 -9
  47. data/lib/reek/smells/unused_parameters.rb +62 -13
  48. data/lib/reek/smells/utility_function.rb +3 -7
  49. data/lib/reek/source.rb +8 -8
  50. data/lib/reek/source/core_extras.rb +1 -1
  51. data/lib/reek/source/source_code.rb +2 -2
  52. data/lib/reek/source/source_file.rb +2 -2
  53. data/lib/reek/source/source_locator.rb +1 -1
  54. data/lib/reek/source/source_repository.rb +4 -2
  55. data/lib/reek/spec.rb +9 -3
  56. data/lib/reek/spec/should_reek.rb +2 -2
  57. data/lib/reek/spec/should_reek_of.rb +1 -1
  58. data/lib/reek/spec/should_reek_only_of.rb +2 -2
  59. data/lib/reek/version.rb +1 -1
  60. data/reek.gemspec +3 -1
  61. data/spec/gem/updates_spec.rb +1 -1
  62. data/spec/gem/yard_spec.rb +1 -1
  63. data/spec/matchers/smell_of_matcher.rb +53 -19
  64. data/spec/reek/cli/help_command_spec.rb +2 -2
  65. data/spec/reek/cli/reek_command_spec.rb +6 -6
  66. data/spec/reek/cli/report_spec.rb +6 -6
  67. data/spec/reek/cli/version_command_spec.rb +2 -2
  68. data/spec/reek/cli/yaml_command_spec.rb +2 -2
  69. data/spec/reek/core/code_context_spec.rb +4 -4
  70. data/spec/reek/core/code_parser_spec.rb +2 -2
  71. data/spec/reek/core/config_spec.rb +4 -4
  72. data/spec/reek/core/method_context_spec.rb +3 -3
  73. data/spec/reek/core/module_context_spec.rb +3 -3
  74. data/spec/reek/core/object_refs_spec.rb +3 -3
  75. data/spec/reek/core/singleton_method_context_spec.rb +4 -4
  76. data/spec/reek/core/smell_configuration_spec.rb +2 -2
  77. data/spec/reek/core/stop_context_spec.rb +2 -2
  78. data/spec/reek/core/warning_collector_spec.rb +3 -3
  79. data/spec/reek/examiner_spec.rb +13 -4
  80. data/spec/reek/smell_warning_spec.rb +2 -2
  81. data/spec/reek/smells/attribute_spec.rb +4 -4
  82. data/spec/reek/smells/boolean_parameter_spec.rb +3 -3
  83. data/spec/reek/smells/class_variable_spec.rb +4 -4
  84. data/spec/reek/smells/{control_couple_spec.rb → control_parameter_spec.rb} +10 -10
  85. data/spec/reek/smells/data_clump_spec.rb +3 -3
  86. data/spec/reek/smells/{duplication_spec.rb → duplicate_method_call_spec.rb} +42 -26
  87. data/spec/reek/smells/feature_envy_spec.rb +3 -3
  88. data/spec/reek/smells/irresponsible_module_spec.rb +3 -3
  89. data/spec/reek/smells/long_parameter_list_spec.rb +3 -3
  90. data/spec/reek/smells/long_yield_list_spec.rb +3 -3
  91. data/spec/reek/smells/nested_iterators_spec.rb +42 -4
  92. data/spec/reek/smells/nil_check_spec.rb +23 -11
  93. data/spec/reek/smells/{simulated_polymorphism_spec.rb → repeated_conditional_spec.rb} +6 -6
  94. data/spec/reek/smells/smell_detector_shared.rb +2 -2
  95. data/spec/reek/smells/too_many_instance_variables_spec.rb +62 -0
  96. data/spec/reek/smells/{large_class_spec.rb → too_many_methods_spec.rb} +11 -56
  97. data/spec/reek/smells/{long_method_spec.rb → too_many_statements_spec.rb} +17 -17
  98. data/spec/reek/smells/uncommunicative_method_name_spec.rb +5 -5
  99. data/spec/reek/smells/uncommunicative_module_name_spec.rb +5 -5
  100. data/spec/reek/smells/uncommunicative_parameter_name_spec.rb +4 -4
  101. data/spec/reek/smells/uncommunicative_variable_name_spec.rb +5 -5
  102. data/spec/reek/smells/unused_parameters_spec.rb +19 -4
  103. data/spec/reek/smells/utility_function_spec.rb +3 -3
  104. data/spec/reek/source/code_comment_spec.rb +2 -2
  105. data/spec/reek/source/object_source_spec.rb +1 -1
  106. data/spec/reek/source/reference_collector_spec.rb +2 -2
  107. data/spec/reek/source/sexp_formatter_spec.rb +2 -2
  108. data/spec/reek/source/source_code_spec.rb +2 -2
  109. data/spec/reek/source/tree_dresser_spec.rb +2 -2
  110. data/spec/reek/spec/should_reek_of_spec.rb +2 -2
  111. data/spec/reek/spec/should_reek_only_of_spec.rb +2 -2
  112. data/spec/reek/spec/should_reek_spec.rb +2 -2
  113. data/spec/samples/all_but_one_masked/masked.reek +1 -1
  114. data/spec/samples/clean_due_to_masking/masked.reek +1 -1
  115. data/spec/samples/config/allow_duplication.reek +2 -2
  116. data/spec/samples/inline_config/dirty.rb +2 -2
  117. data/spec/samples/mask_some/some.reek +1 -1
  118. data/spec/samples/masked_by_dotfile/dirty.rb +8 -0
  119. data/spec/samples/not_quite_masked/smelly.rb +3 -0
  120. data/spec/samples/overrides/masked/lower.reek +1 -1
  121. data/spec/samples/overrides/upper.reek +1 -1
  122. data/spec/spec_helper.rb +4 -9
  123. data/tasks/test.rake +0 -2
  124. metadata +253 -263
  125. data/lib/reek/smells/large_class.rb +0 -87
  126. data/lib/xp.reek +0 -66
  127. data/spec/gem/manifest_spec.rb +0 -22
  128. data/spec/spec.opts +0 -1
@@ -1,5 +1,5 @@
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', 'cli', 'help_command')
1
+ require 'spec_helper'
2
+ require 'reek/cli/help_command'
3
3
 
4
4
  include Reek::Cli
5
5
 
@@ -1,7 +1,7 @@
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', 'cli', 'reek_command')
3
- require File.join(File.dirname(File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__))))), 'lib', 'reek', 'cli', 'report')
4
- require File.join(File.dirname(File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__))))), 'lib', 'reek', 'examiner')
1
+ require 'spec_helper'
2
+ require 'reek/cli/reek_command'
3
+ require 'reek/cli/report'
4
+ require 'reek/examiner'
5
5
 
6
6
  include Reek
7
7
  include Reek::Cli
@@ -14,7 +14,7 @@ describe ReekCommand do
14
14
  context 'with smells' do
15
15
  before :each do
16
16
  examiner = Examiner.new('def x(); end')
17
- @cmd = ReekCommand.new(QuietReport, ['def x(); end'])
17
+ @cmd = ReekCommand.new(QuietReport.new, ['def x(); end'])
18
18
  end
19
19
 
20
20
  it 'displays the correct text on the view' do
@@ -30,7 +30,7 @@ describe ReekCommand do
30
30
 
31
31
  context 'with no smells' do
32
32
  before :each do
33
- @cmd = ReekCommand.new(QuietReport, ['def clean(); end'])
33
+ @cmd = ReekCommand.new(QuietReport.new, ['def clean(); end'])
34
34
  end
35
35
 
36
36
  it 'displays nothing on the view' do
@@ -1,6 +1,6 @@
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', 'examiner')
3
- require File.join(File.dirname(File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__))))), 'lib', 'reek', 'cli', 'report')
1
+ require 'spec_helper'
2
+ require 'reek/examiner'
3
+ require 'reek/cli/report'
4
4
 
5
5
  include Reek
6
6
  include Reek::Cli
@@ -9,15 +9,15 @@ describe QuietReport, " when empty" do
9
9
  context 'empty source' do
10
10
  it 'has an empty quiet_report' do
11
11
  examiner = Examiner.new('')
12
- QuietReport.new(examiner).report.should == ''
12
+ QuietReport.new.report(examiner).should == ''
13
13
  end
14
14
  end
15
15
 
16
16
  context 'with a couple of smells' do
17
17
  before :each do
18
18
  examiner = Examiner.new('def simple(a) a[3] end')
19
- rpt = QuietReport.new(examiner)
20
- @lines = rpt.report.split("\n")
19
+ rpt = QuietReport.new
20
+ @lines = rpt.report(examiner).split("\n")
21
21
  end
22
22
  it 'has a header and a list of smells' do
23
23
  @lines.should have_at_least(3).lines
@@ -1,5 +1,5 @@
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', 'cli', 'version_command')
1
+ require 'spec_helper'
2
+ require 'reek/cli/version_command'
3
3
 
4
4
  include Reek
5
5
  include Reek::Cli
@@ -1,5 +1,5 @@
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', 'cli', 'yaml_command')
1
+ require 'spec_helper'
2
+ require 'reek/cli/yaml_command'
3
3
 
4
4
  include Reek
5
5
  include Reek::Cli
@@ -1,7 +1,7 @@
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', 'method_context')
3
- require File.join(File.dirname(File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__))))), 'lib', 'reek', 'core', 'module_context')
4
- require File.join(File.dirname(File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__))))), 'lib', 'reek', 'core', 'stop_context')
1
+ require 'spec_helper'
2
+ require 'reek/core/method_context'
3
+ require 'reek/core/module_context'
4
+ require 'reek/core/stop_context'
5
5
 
6
6
  include Reek::Core
7
7
 
@@ -1,5 +1,5 @@
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', 'code_parser')
1
+ require 'spec_helper'
2
+ require 'reek/core/code_parser'
3
3
 
4
4
  include Reek::Core
5
5
 
@@ -1,5 +1,5 @@
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', 'sniffer')
1
+ require 'spec_helper'
2
+ require 'reek/core/sniffer'
3
3
 
4
4
  describe Hash do
5
5
  before :each do
@@ -17,12 +17,12 @@ describe Hash do
17
17
  @first['two']['four'].should == false
18
18
  @first['one'].keys.length.should == 3
19
19
  end
20
-
20
+
21
21
  it 'should deep copy Hashes' do
22
22
  second = @first.deep_copy
23
23
  second['two'].object_id.should_not be_eql(@first['two'].object_id)
24
24
  end
25
-
25
+
26
26
  it 'should merge array values' do
27
27
  @first['three'] = [1,2,3]
28
28
  end
@@ -1,6 +1,6 @@
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', 'method_context')
3
- require File.join(File.dirname(File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__))))), 'lib', 'reek', 'core', 'stop_context')
1
+ require 'spec_helper'
2
+ require 'reek/core/method_context'
3
+ require 'reek/core/stop_context'
4
4
 
5
5
  include Reek::Core
6
6
 
@@ -1,6 +1,6 @@
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', 'module_context')
3
- require File.join(File.dirname(File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__))))), 'lib', 'reek', 'core', 'stop_context')
1
+ require 'spec_helper'
2
+ require 'reek/core/module_context'
3
+ require 'reek/core/stop_context'
4
4
 
5
5
  include Reek::Core
6
6
 
@@ -1,5 +1,5 @@
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', 'object_refs')
1
+ require 'spec_helper'
2
+ require 'reek/core/object_refs'
3
3
 
4
4
  include Reek::Core
5
5
 
@@ -33,7 +33,7 @@ describe ObjectRefs do
33
33
  it 'should not report self as the max' do
34
34
  @refs.self_is_max?.should == false
35
35
  end
36
-
36
+
37
37
  context "with one reference to self" do
38
38
  before(:each) do
39
39
  @refs.record_reference_to(:self)
@@ -1,7 +1,7 @@
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', 'module_context')
3
- require File.join(File.dirname(File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__))))), 'lib', 'reek', 'core', 'singleton_method_context')
4
- require File.join(File.dirname(File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__))))), 'lib', 'reek', 'core', 'stop_context')
1
+ require 'spec_helper'
2
+ require 'reek/core/module_context'
3
+ require 'reek/core/singleton_method_context'
4
+ require 'reek/core/stop_context'
5
5
 
6
6
  include Reek::Core
7
7
 
@@ -1,5 +1,5 @@
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', 'smell_configuration')
1
+ require 'spec_helper'
2
+ require 'reek/core/smell_configuration'
3
3
 
4
4
  include Reek::Core
5
5
 
@@ -1,5 +1,5 @@
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', 'stop_context')
1
+ require 'spec_helper'
2
+ require 'reek/core/stop_context'
3
3
 
4
4
  include Reek
5
5
  include Reek::Core
@@ -1,6 +1,6 @@
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', 'warning_collector')
3
- require File.join(File.dirname(File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__))))), 'lib', 'reek', 'smell_warning')
1
+ require 'spec_helper'
2
+ require 'reek/core/warning_collector'
3
+ require 'reek/smell_warning'
4
4
 
5
5
  include Reek::Core
6
6
 
@@ -1,5 +1,5 @@
1
- require File.join(File.dirname(File.dirname(File.expand_path(__FILE__))), 'spec_helper')
2
- require File.join(File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__)))), 'lib', 'reek', 'examiner')
1
+ require 'spec_helper'
2
+ require 'reek/examiner'
3
3
 
4
4
  include Reek
5
5
 
@@ -65,7 +65,7 @@ describe Examiner do
65
65
  it_should_behave_like 'one smell found'
66
66
  end
67
67
 
68
- context 'with a smelly Dir' do
68
+ context 'with a partially masked smelly Dir' do
69
69
  before :each do
70
70
  smelly_dir = Dir['spec/samples/all_but_one_masked/*.rb']
71
71
  @examiner = Examiner.new(smelly_dir)
@@ -83,7 +83,16 @@ describe Examiner do
83
83
  it_should_behave_like 'no smells found'
84
84
  end
85
85
 
86
- context 'with a smelly File' do
86
+ context 'with a smelly Dir masked by a dotfile' do
87
+ before :each do
88
+ smelly_dir = Dir['spec/samples/masked_by_dotfile/*.rb']
89
+ @examiner = Examiner.new(smelly_dir)
90
+ end
91
+
92
+ it_should_behave_like 'one smell found'
93
+ end
94
+
95
+ context 'with a partially masked smelly File' do
87
96
  before :each do
88
97
  smelly_file = File.new(Dir['spec/samples/all_but_one_masked/d*.rb'][0])
89
98
  @examiner = Examiner.new(smelly_file)
@@ -1,5 +1,5 @@
1
- require File.join(File.dirname(File.dirname(File.expand_path(__FILE__))), 'spec_helper')
2
- require File.join(File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__)))), 'lib', 'reek', 'smell_warning')
1
+ require 'spec_helper'
2
+ require 'reek/smell_warning'
3
3
 
4
4
  include Reek
5
5
 
@@ -1,7 +1,7 @@
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', 'smells', 'attribute')
3
- require File.join(File.dirname(File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__))))), 'lib', 'reek', 'core', 'module_context')
4
- require File.join(File.dirname(File.expand_path(__FILE__)), 'smell_detector_shared')
1
+ require 'spec_helper'
2
+ require 'reek/smells/attribute'
3
+ require 'reek/core/module_context'
4
+ require 'reek/smells/smell_detector_shared'
5
5
 
6
6
  include Reek::Core
7
7
  include Reek::Smells
@@ -1,6 +1,6 @@
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', 'smells', 'boolean_parameter')
3
- require File.join(File.dirname(File.expand_path(__FILE__)), 'smell_detector_shared')
1
+ require 'spec_helper'
2
+ require 'reek/smells/boolean_parameter'
3
+ require 'reek/smells/smell_detector_shared'
4
4
 
5
5
  include Reek::Smells
6
6
 
@@ -1,7 +1,7 @@
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', 'smells', 'class_variable')
3
- require File.join(File.dirname(File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__))))), 'lib', 'reek', 'core', 'module_context')
4
- require File.join(File.dirname(File.expand_path(__FILE__)), 'smell_detector_shared')
1
+ require 'spec_helper'
2
+ require 'reek/smells/class_variable'
3
+ require 'reek/core/module_context'
4
+ require 'reek/smells/smell_detector_shared'
5
5
 
6
6
  include Reek::Core
7
7
  include Reek::Smells
@@ -1,13 +1,13 @@
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', 'smells', 'control_couple')
3
- require File.join(File.dirname(File.expand_path(__FILE__)), 'smell_detector_shared')
1
+ require 'spec_helper'
2
+ require 'reek/smells/control_parameter'
3
+ require 'reek/smells/smell_detector_shared'
4
4
 
5
5
  include Reek::Smells
6
6
 
7
- describe ControlCouple do
7
+ describe ControlParameter do
8
8
  before(:each) do
9
9
  @source_name = 'lets get married'
10
- @detector = ControlCouple.new(@source_name)
10
+ @detector = ControlParameter.new(@source_name)
11
11
  end
12
12
 
13
13
  it_should_behave_like 'SmellDetector'
@@ -15,19 +15,19 @@ describe ControlCouple do
15
15
  context 'conditional on a parameter' do
16
16
  it 'should report a ternary check on a parameter' do
17
17
  src = 'def simple(arga) arga ? @ivar : 3 end'
18
- src.should smell_of(ControlCouple, ControlCouple::PARAMETER_KEY => 'arga')
18
+ src.should smell_of(ControlParameter, ControlParameter::PARAMETER_KEY => 'arga')
19
19
  end
20
20
  it 'should not report a ternary check on an ivar' do
21
21
  src = 'def simple(arga) @ivar ? arga : 3 end'
22
- src.should_not smell_of(ControlCouple)
22
+ src.should_not smell_of(ControlParameter)
23
23
  end
24
24
  it 'should not report a ternary check on a lvar' do
25
25
  src = 'def simple(arga) lvar = 27; lvar ? arga : @ivar end'
26
- src.should_not smell_of(ControlCouple)
26
+ src.should_not smell_of(ControlParameter)
27
27
  end
28
28
  it 'should spot a couple inside a block' do
29
29
  src = 'def blocks(arg) @text.map { |blk| arg ? blk : "#{blk}" } end'
30
- src.should smell_of(ControlCouple, ControlCouple::PARAMETER_KEY => 'arg')
30
+ src.should smell_of(ControlParameter, ControlParameter::PARAMETER_KEY => 'arg')
31
31
  end
32
32
  end
33
33
 
@@ -50,7 +50,7 @@ EOS
50
50
  it_should_behave_like 'common fields set correctly'
51
51
 
52
52
  it 'has the correct fields' do
53
- @warning.smell[ControlCouple::PARAMETER_KEY].should == 'arg'
53
+ @warning.smell[ControlParameter::PARAMETER_KEY].should == 'arg'
54
54
  @warning.lines.should == [3, 5]
55
55
  end
56
56
  end
@@ -1,6 +1,6 @@
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', 'smells', 'data_clump')
3
- require File.join(File.dirname(File.expand_path(__FILE__)), 'smell_detector_shared')
1
+ require 'spec_helper'
2
+ require 'reek/smells/data_clump'
3
+ require 'reek/smells/smell_detector_shared'
4
4
 
5
5
  include Reek::Smells
6
6
 
@@ -1,18 +1,18 @@
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', 'smells', 'duplication')
3
- require File.join(File.dirname(File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__))))), 'lib', 'reek', 'core', 'code_parser')
4
- require File.join(File.dirname(File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__))))), 'lib', 'reek', 'core', 'sniffer')
5
- require File.join(File.dirname(File.expand_path(__FILE__)), 'smell_detector_shared')
1
+ require 'spec_helper'
2
+ require 'reek/smells/duplicate_method_call'
3
+ require 'reek/core/code_parser'
4
+ require 'reek/core/sniffer'
5
+ require 'reek/smells/smell_detector_shared'
6
6
 
7
7
  include Reek
8
8
  include Reek::Smells
9
9
 
10
- describe Duplication do
10
+ describe DuplicateMethodCall do
11
11
 
12
12
  context 'when a smell is reported' do
13
13
  before :each do
14
14
  @source_name = 'copy-cat'
15
- @detector = Duplication.new(@source_name)
15
+ @detector = DuplicateMethodCall.new(@source_name)
16
16
  src = <<EOS
17
17
  def double_thing(other)
18
18
  other[@thing]
@@ -30,7 +30,7 @@ EOS
30
30
  it_should_behave_like 'common fields set correctly'
31
31
 
32
32
  it 'reports the call' do
33
- @warning.smell[Duplication::CALL_KEY].should == 'other[@thing]'
33
+ @warning.smell[DuplicateMethodCall::CALL_KEY].should == 'other[@thing]'
34
34
  end
35
35
  it 'reports the correct lines' do
36
36
  @warning.lines.should == [2,4]
@@ -40,31 +40,47 @@ EOS
40
40
  context "with repeated method calls" do
41
41
  it 'reports repeated call' do
42
42
  src = 'def double_thing() @other.thing + @other.thing end'
43
- src.should smell_of(Duplication, Duplication::CALL_KEY => '@other.thing')
43
+ src.should smell_of(DuplicateMethodCall, DuplicateMethodCall::CALL_KEY => '@other.thing')
44
44
  end
45
45
  it 'reports repeated call to lvar' do
46
46
  src = 'def double_thing(other) other[@thing] + other[@thing] end'
47
- src.should smell_of(Duplication, Duplication::CALL_KEY => 'other[@thing]')
47
+ src.should smell_of(DuplicateMethodCall, DuplicateMethodCall::CALL_KEY => 'other[@thing]')
48
48
  end
49
49
  it 'reports call parameters' do
50
50
  src = 'def double_thing() @other.thing(2,3) + @other.thing(2,3) end'
51
- src.should smell_of(Duplication, Duplication::CALL_KEY => '@other.thing(2, 3)')
51
+ src.should smell_of(DuplicateMethodCall, DuplicateMethodCall::CALL_KEY => '@other.thing(2, 3)')
52
52
  end
53
53
  it 'should report nested calls' do
54
54
  src = 'def double_thing() @other.thing.foo + @other.thing.foo end'
55
- src.should smell_of(Duplication, {Duplication::CALL_KEY => '@other.thing'},
56
- {Duplication::CALL_KEY => '@other.thing.foo'})
55
+ src.should smell_of(DuplicateMethodCall, {DuplicateMethodCall::CALL_KEY => '@other.thing'},
56
+ {DuplicateMethodCall::CALL_KEY => '@other.thing.foo'})
57
57
  end
58
58
  it 'should ignore calls to new' do
59
59
  src = 'def double_thing() @other.new + @other.new end'
60
- src.should_not smell_of(Duplication)
60
+ src.should_not smell_of(DuplicateMethodCall)
61
+ end
62
+ end
63
+
64
+ context "with repeated simple method calls" do
65
+ it 'reports no smell' do
66
+ src = <<-EOS
67
+ def foo
68
+ case bar
69
+ when :baz
70
+ :qux
71
+ else
72
+ bar
73
+ end
74
+ end
75
+ EOS
76
+ src.should_not smell_of(DuplicateMethodCall)
61
77
  end
62
78
  end
63
79
 
64
80
  context 'with repeated attribute assignment' do
65
81
  it 'reports repeated assignment' do
66
82
  src = 'def double_thing(thing) @other[thing] = true; @other[thing] = true; end'
67
- src.should smell_of(Duplication, Duplication::CALL_KEY => '@other[thing] = true')
83
+ src.should smell_of(DuplicateMethodCall, DuplicateMethodCall::CALL_KEY => '@other[thing] = true')
68
84
  end
69
85
  it 'does not report multi-assignments' do
70
86
  src = <<EOS
@@ -73,54 +89,54 @@ def _parse ctxt
73
89
  error, ctxt.index = @err, @err_ind
74
90
  end
75
91
  EOS
76
- src.should_not smell_of(Duplication)
92
+ src.should_not smell_of(DuplicateMethodCall)
77
93
  end
78
94
  end
79
95
 
80
96
  context "non-repeated method calls" do
81
97
  it 'should not report similar calls' do
82
98
  src = 'def equals(other) other.thing == self.thing end'
83
- src.should_not smell_of(Duplication)
99
+ src.should_not smell_of(DuplicateMethodCall)
84
100
  end
85
101
  it 'should respect call parameters' do
86
102
  src = 'def double_thing() @other.thing(3) + @other.thing(2) end'
87
- src.should_not smell_of(Duplication)
103
+ src.should_not smell_of(DuplicateMethodCall)
88
104
  end
89
105
  end
90
106
 
91
107
  context "allowing up to 3 calls" do
92
108
  before :each do
93
- @config = {Duplication::MAX_ALLOWED_CALLS_KEY => 3}
109
+ @config = {DuplicateMethodCall::MAX_ALLOWED_CALLS_KEY => 3}
94
110
  end
95
111
  it 'does not report double calls' do
96
112
  src = 'def double_thing() @other.thing + @other.thing end'
97
- src.should_not smell_of(Duplication).with_config(@config)
113
+ src.should_not smell_of(DuplicateMethodCall).with_config(@config)
98
114
  end
99
115
  it 'does not report triple calls' do
100
116
  src = 'def double_thing() @other.thing + @other.thing + @other.thing end'
101
- src.should_not smell_of(Duplication).with_config(@config)
117
+ src.should_not smell_of(DuplicateMethodCall).with_config(@config)
102
118
  end
103
119
  it 'reports quadruple calls' do
104
120
  src = 'def double_thing() @other.thing + @other.thing + @other.thing + @other.thing end'
105
- src.should smell_of(Duplication, {Duplication::CALL_KEY => '@other.thing', Duplication::OCCURRENCES_KEY => 4}).with_config(@config)
121
+ src.should smell_of(DuplicateMethodCall, {DuplicateMethodCall::CALL_KEY => '@other.thing', DuplicateMethodCall::OCCURRENCES_KEY => 4}).with_config(@config)
106
122
  end
107
123
  end
108
124
 
109
125
  context "allowing calls to some methods" do
110
126
  before :each do
111
- @config = {Duplication::ALLOW_CALLS_KEY => ['@some.thing',/puts/]}
127
+ @config = {DuplicateMethodCall::ALLOW_CALLS_KEY => ['@some.thing',/puts/]}
112
128
  end
113
129
  it 'does not report calls to some methods' do
114
130
  src = 'def double_some_thing() @some.thing + @some.thing end'
115
- src.should_not smell_of(Duplication).with_config(@config)
131
+ src.should_not smell_of(DuplicateMethodCall).with_config(@config)
116
132
  end
117
133
  it 'reports calls to other methods' do
118
134
  src = 'def double_other_thing() @other.thing + @other.thing end'
119
- src.should smell_of(Duplication, {Duplication::CALL_KEY => '@other.thing'}).with_config(@config)
135
+ src.should smell_of(DuplicateMethodCall, {DuplicateMethodCall::CALL_KEY => '@other.thing'}).with_config(@config)
120
136
  end
121
137
  it 'does not report calls to methods specifed with a regular expression' do
122
138
  src = 'def double_puts() puts @other.thing; puts @other.thing end'
123
- src.should smell_of(Duplication, {Duplication::CALL_KEY => '@other.thing'}).with_config(@config)
139
+ src.should smell_of(DuplicateMethodCall, {DuplicateMethodCall::CALL_KEY => '@other.thing'}).with_config(@config)
124
140
  end
125
141
  end
126
142
  end