reek 1.3.1 → 1.3.2

Sign up to get free protection for your applications and to get access to all the features.
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