reek 2.1.0 → 2.2.0

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 (179) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +2 -21
  3. data/.travis.yml +1 -0
  4. data/.yardopts +3 -6
  5. data/CHANGELOG +6 -0
  6. data/CONTRIBUTING.md +8 -3
  7. data/README.md +94 -42
  8. data/config/defaults.reek +0 -1
  9. data/docs/API.md +50 -0
  10. data/docs/Attribute.md +43 -0
  11. data/docs/Basic-Smell-Options.md +44 -0
  12. data/docs/Boolean-Parameter.md +52 -0
  13. data/docs/Class-Variable.md +40 -0
  14. data/docs/Code-Smells.md +34 -0
  15. data/docs/Command-Line-Options.md +84 -0
  16. data/docs/Configuration-Files.md +38 -0
  17. data/docs/Control-Couple.md +22 -0
  18. data/docs/Control-Parameter.md +29 -0
  19. data/docs/Data-Clump.md +44 -0
  20. data/docs/Duplicate-Method-Call.md +49 -0
  21. data/docs/Feature-Envy.md +29 -0
  22. data/docs/How-reek-works-internally.md +44 -0
  23. data/docs/Irresponsible-Module.md +39 -0
  24. data/docs/Large-Class.md +20 -0
  25. data/docs/Long-Parameter-List.md +38 -0
  26. data/docs/Long-Yield-List.md +36 -0
  27. data/docs/Module-Initialize.md +62 -0
  28. data/docs/Nested-Iterators.md +38 -0
  29. data/docs/Nil-Check.md +39 -0
  30. data/docs/Prima-Donna-Method.md +53 -0
  31. data/docs/RSpec-matchers.md +133 -0
  32. data/docs/Rake-Task.md +58 -0
  33. data/docs/Reek-Driven-Development.md +45 -0
  34. data/docs/Repeated-Conditional.md +44 -0
  35. data/docs/Simulated-Polymorphism.md +16 -0
  36. data/docs/Smell-Suppression.md +32 -0
  37. data/docs/Too-Many-Instance-Variables.md +43 -0
  38. data/docs/Too-Many-Methods.md +55 -0
  39. data/docs/Too-Many-Statements.md +50 -0
  40. data/docs/Uncommunicative-Method-Name.md +24 -0
  41. data/docs/Uncommunicative-Module-Name.md +23 -0
  42. data/docs/Uncommunicative-Name.md +16 -0
  43. data/docs/Uncommunicative-Parameter-Name.md +24 -0
  44. data/docs/Uncommunicative-Variable-Name.md +24 -0
  45. data/docs/Unused-Parameters.md +27 -0
  46. data/docs/Utility-Function.md +46 -0
  47. data/docs/Versioning-Policy.md +7 -0
  48. data/docs/YAML-Reports.md +111 -0
  49. data/docs/yard_plugin.rb +14 -0
  50. data/features/command_line_interface/options.feature +1 -0
  51. data/features/programmatic_access.feature +1 -1
  52. data/features/samples.feature +3 -3
  53. data/lib/reek.rb +2 -2
  54. data/lib/reek/cli/input.rb +2 -2
  55. data/lib/reek/cli/option_interpreter.rb +2 -0
  56. data/lib/reek/cli/options.rb +10 -4
  57. data/lib/reek/cli/reek_command.rb +2 -2
  58. data/lib/reek/cli/report/report.rb +60 -0
  59. data/lib/reek/cli/silencer.rb +13 -0
  60. data/lib/reek/{source → core}/ast_node.rb +1 -1
  61. data/lib/reek/{source → core}/ast_node_class_map.rb +10 -11
  62. data/lib/reek/{source → core}/code_comment.rb +1 -1
  63. data/lib/reek/core/code_context.rb +1 -1
  64. data/lib/reek/core/examiner.rb +85 -0
  65. data/lib/reek/core/method_context.rb +1 -1
  66. data/lib/reek/core/module_context.rb +2 -2
  67. data/lib/reek/core/reference_collector.rb +31 -0
  68. data/lib/reek/core/singleton_method_context.rb +0 -4
  69. data/lib/reek/core/smell_repository.rb +4 -2
  70. data/lib/reek/{source → core}/tree_dresser.rb +1 -1
  71. data/lib/reek/{source → sexp}/sexp_extensions.rb +5 -5
  72. data/lib/reek/sexp/sexp_formatter.rb +29 -0
  73. data/lib/reek/sexp/sexp_node.rb +91 -0
  74. data/lib/reek/smells.rb +4 -2
  75. data/lib/reek/smells/attribute.rb +35 -7
  76. data/lib/reek/smells/boolean_parameter.rb +1 -1
  77. data/lib/reek/smells/class_variable.rb +1 -1
  78. data/lib/reek/smells/control_parameter.rb +1 -1
  79. data/lib/reek/smells/data_clump.rb +1 -1
  80. data/lib/reek/smells/duplicate_method_call.rb +12 -4
  81. data/lib/reek/smells/feature_envy.rb +1 -1
  82. data/lib/reek/smells/irresponsible_module.rb +3 -3
  83. data/lib/reek/smells/long_parameter_list.rb +1 -1
  84. data/lib/reek/smells/long_yield_list.rb +1 -1
  85. data/lib/reek/smells/module_initialize.rb +1 -1
  86. data/lib/reek/smells/nested_iterators.rb +1 -1
  87. data/lib/reek/smells/nil_check.rb +3 -2
  88. data/lib/reek/smells/prima_donna_method.rb +18 -11
  89. data/lib/reek/smells/repeated_conditional.rb +3 -3
  90. data/lib/reek/smells/smell_detector.rb +5 -1
  91. data/lib/reek/smells/smell_warning.rb +99 -0
  92. data/lib/reek/smells/too_many_instance_variables.rb +1 -1
  93. data/lib/reek/smells/too_many_methods.rb +1 -1
  94. data/lib/reek/smells/too_many_statements.rb +1 -1
  95. data/lib/reek/smells/uncommunicative_method_name.rb +1 -1
  96. data/lib/reek/smells/uncommunicative_module_name.rb +1 -1
  97. data/lib/reek/smells/uncommunicative_parameter_name.rb +1 -1
  98. data/lib/reek/smells/uncommunicative_variable_name.rb +1 -1
  99. data/lib/reek/smells/unused_parameters.rb +1 -1
  100. data/lib/reek/smells/utility_function.rb +3 -16
  101. data/lib/reek/source/source_code.rb +31 -13
  102. data/lib/reek/source/source_locator.rb +16 -17
  103. data/lib/reek/source/source_repository.rb +10 -11
  104. data/lib/reek/spec/should_reek.rb +2 -2
  105. data/lib/reek/spec/should_reek_of.rb +2 -2
  106. data/lib/reek/spec/should_reek_only_of.rb +2 -2
  107. data/lib/reek/version.rb +1 -1
  108. data/reek.gemspec +3 -4
  109. data/spec/factories/factories.rb +1 -1
  110. data/spec/gem/yard_spec.rb +1 -1
  111. data/spec/quality/reek_source_spec.rb +2 -2
  112. data/spec/reek/cli/html_report_spec.rb +3 -3
  113. data/spec/reek/cli/json_report_spec.rb +3 -3
  114. data/spec/reek/cli/{option_interperter_spec.rb → option_interpreter_spec.rb} +1 -1
  115. data/spec/reek/cli/options_spec.rb +19 -0
  116. data/spec/reek/cli/text_report_spec.rb +7 -7
  117. data/spec/reek/cli/xml_report_spec.rb +34 -0
  118. data/spec/reek/cli/yaml_report_spec.rb +3 -3
  119. data/spec/reek/configuration/app_configuration_spec.rb +1 -1
  120. data/spec/reek/configuration/configuration_file_finder_spec.rb +22 -1
  121. data/spec/reek/{source → core}/code_comment_spec.rb +14 -14
  122. data/spec/reek/core/code_context_spec.rb +1 -1
  123. data/spec/reek/{examiner_spec.rb → core/examiner_spec.rb} +12 -12
  124. data/spec/reek/core/method_context_spec.rb +27 -22
  125. data/spec/reek/core/module_context_spec.rb +2 -2
  126. data/spec/reek/core/object_refs_spec.rb +1 -1
  127. data/spec/reek/{source → core}/object_source_spec.rb +1 -1
  128. data/spec/reek/{source → core}/reference_collector_spec.rb +25 -16
  129. data/spec/reek/core/singleton_method_context_spec.rb +12 -2
  130. data/spec/reek/core/smell_configuration_spec.rb +1 -1
  131. data/spec/reek/core/smell_repository_spec.rb +12 -1
  132. data/spec/reek/core/stop_context_spec.rb +1 -1
  133. data/spec/reek/core/tree_dresser_spec.rb +16 -0
  134. data/spec/reek/core/tree_walker_spec.rb +3 -3
  135. data/spec/reek/core/warning_collector_spec.rb +6 -6
  136. data/spec/reek/{source → sexp}/sexp_extensions_spec.rb +8 -8
  137. data/spec/reek/{source → sexp}/sexp_formatter_spec.rb +11 -5
  138. data/spec/reek/{source → sexp}/sexp_node_spec.rb +3 -3
  139. data/spec/reek/smells/attribute_spec.rb +89 -85
  140. data/spec/reek/smells/behaves_like_variable_detector.rb +1 -1
  141. data/spec/reek/smells/boolean_parameter_spec.rb +1 -1
  142. data/spec/reek/smells/class_variable_spec.rb +1 -1
  143. data/spec/reek/smells/control_parameter_spec.rb +1 -1
  144. data/spec/reek/smells/data_clump_spec.rb +2 -2
  145. data/spec/reek/smells/duplicate_method_call_spec.rb +1 -1
  146. data/spec/reek/smells/feature_envy_spec.rb +2 -2
  147. data/spec/reek/smells/irresponsible_module_spec.rb +1 -1
  148. data/spec/reek/smells/long_parameter_list_spec.rb +2 -2
  149. data/spec/reek/smells/long_yield_list_spec.rb +1 -1
  150. data/spec/reek/smells/module_initialize_spec.rb +1 -1
  151. data/spec/reek/smells/nested_iterators_spec.rb +2 -2
  152. data/spec/reek/smells/nil_check_spec.rb +1 -1
  153. data/spec/reek/smells/prima_donna_method_spec.rb +1 -1
  154. data/spec/reek/smells/repeated_conditional_spec.rb +1 -1
  155. data/spec/reek/smells/smell_detector_shared.rb +2 -2
  156. data/spec/reek/{smell_warning_spec.rb → smells/smell_warning_spec.rb} +7 -7
  157. data/spec/reek/smells/too_many_instance_variables_spec.rb +1 -1
  158. data/spec/reek/smells/too_many_methods_spec.rb +1 -1
  159. data/spec/reek/smells/too_many_statements_spec.rb +4 -4
  160. data/spec/reek/smells/uncommunicative_method_name_spec.rb +1 -1
  161. data/spec/reek/smells/uncommunicative_module_name_spec.rb +1 -1
  162. data/spec/reek/smells/uncommunicative_parameter_name_spec.rb +1 -1
  163. data/spec/reek/smells/uncommunicative_variable_name_spec.rb +1 -1
  164. data/spec/reek/smells/unused_parameters_spec.rb +1 -1
  165. data/spec/reek/smells/utility_function_spec.rb +1 -1
  166. data/spec/reek/source/source_code_spec.rb +1 -1
  167. data/spec/reek/spec/should_reek_of_spec.rb +1 -1
  168. data/spec/reek/spec/should_reek_only_of_spec.rb +1 -1
  169. data/spec/reek/spec/should_reek_spec.rb +1 -1
  170. data/spec/samples/checkstyle.xml +2 -0
  171. data/spec/spec_helper.rb +15 -3
  172. metadata +68 -38
  173. data/.ruby-gemset +0 -1
  174. data/lib/reek/examiner.rb +0 -79
  175. data/lib/reek/smell_warning.rb +0 -87
  176. data/lib/reek/source/reference_collector.rb +0 -27
  177. data/lib/reek/source/sexp_formatter.rb +0 -22
  178. data/lib/reek/source/sexp_node.rb +0 -79
  179. data/spec/reek/source/tree_dresser_spec.rb +0 -16
@@ -1,13 +1,13 @@
1
1
  require_relative '../../spec_helper'
2
- require_relative '../../../lib/reek/examiner'
2
+ require_relative '../../../lib/reek/core/examiner'
3
3
  require_relative '../../../lib/reek/cli/report/report'
4
4
  require_relative '../../../lib/reek/cli/report/formatter'
5
5
 
6
- describe Reek::CLI::Report::JSONReport do
6
+ RSpec.describe Reek::CLI::Report::JSONReport do
7
7
  let(:instance) { Reek::CLI::Report::JSONReport.new }
8
8
 
9
9
  context 'empty source' do
10
- let(:examiner) { Reek::Examiner.new('') }
10
+ let(:examiner) { Reek::Core::Examiner.new('') }
11
11
 
12
12
  before do
13
13
  instance.add_examiner examiner
@@ -2,7 +2,7 @@ require_relative '../../spec_helper'
2
2
 
3
3
  require_relative '../../../lib/reek/cli/options'
4
4
 
5
- describe Reek::CLI::OptionInterpreter do
5
+ RSpec.describe Reek::CLI::OptionInterpreter do
6
6
  let(:options) { OpenStruct.new }
7
7
  let(:instance) { Reek::CLI::OptionInterpreter.new(options) }
8
8
 
@@ -0,0 +1,19 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ require_relative '../../../lib/reek/cli/options'
4
+
5
+ RSpec.describe Reek::CLI::Options do
6
+ describe '#initialize' do
7
+ it 'should enable colors when stdout is a TTY' do
8
+ allow($stdout).to receive_messages(tty?: false)
9
+ options = Reek::CLI::Options.new.parse
10
+ expect(options.colored).to be false
11
+ end
12
+
13
+ it 'should not enable colors when stdout is not a TTY' do
14
+ allow($stdout).to receive_messages(tty?: true)
15
+ options = Reek::CLI::Options.new.parse
16
+ expect(options.colored).to be true
17
+ end
18
+ end
19
+ end
@@ -1,11 +1,11 @@
1
1
  require_relative '../../spec_helper'
2
- require_relative '../../../lib/reek/examiner'
2
+ require_relative '../../../lib/reek/core/examiner'
3
3
  require_relative '../../../lib/reek/cli/report/report'
4
4
  require_relative '../../../lib/reek/cli/report/formatter'
5
5
  require_relative '../../../lib/reek/cli/report/heading_formatter'
6
6
  require 'rainbow'
7
7
 
8
- describe Reek::CLI::Report::TextReport do
8
+ RSpec.describe Reek::CLI::Report::TextReport do
9
9
  let(:report_options) do
10
10
  {
11
11
  warning_formatter: Reek::CLI::Report::SimpleWarningFormatter.new,
@@ -17,7 +17,7 @@ describe Reek::CLI::Report::TextReport do
17
17
 
18
18
  context 'with a single empty source' do
19
19
  before do
20
- instance.add_examiner Reek::Examiner.new('')
20
+ instance.add_examiner Reek::Core::Examiner.new('')
21
21
  end
22
22
 
23
23
  it 'has an empty quiet_report' do
@@ -27,8 +27,8 @@ describe Reek::CLI::Report::TextReport do
27
27
 
28
28
  context 'with non smelly files' do
29
29
  before do
30
- instance.add_examiner(Reek::Examiner.new('def simple() puts "a" end'))
31
- instance.add_examiner(Reek::Examiner.new('def simple() puts "a" end'))
30
+ instance.add_examiner(Reek::Core::Examiner.new('def simple() puts "a" end'))
31
+ instance.add_examiner(Reek::Core::Examiner.new('def simple() puts "a" end'))
32
32
  end
33
33
 
34
34
  context 'with colors disabled' do
@@ -54,8 +54,8 @@ describe Reek::CLI::Report::TextReport do
54
54
 
55
55
  context 'with a couple of smells' do
56
56
  before do
57
- instance.add_examiner(Reek::Examiner.new('def simple(a) a[3] end'))
58
- instance.add_examiner(Reek::Examiner.new('def simple(a) a[3] end'))
57
+ instance.add_examiner(Reek::Core::Examiner.new('def simple(a) a[3] end'))
58
+ instance.add_examiner(Reek::Core::Examiner.new('def simple(a) a[3] end'))
59
59
  end
60
60
 
61
61
  context 'with colors disabled' do
@@ -0,0 +1,34 @@
1
+ require_relative '../../spec_helper'
2
+ require_relative '../../../lib/reek/core/examiner'
3
+ require_relative '../../../lib/reek/cli/report/report'
4
+ require_relative '../../../lib/reek/cli/report/formatter'
5
+
6
+ RSpec.describe Reek::CLI::Report::XMLReport do
7
+ let(:instance) { Reek::CLI::Report::XMLReport.new }
8
+
9
+ context 'empty source' do
10
+ let(:examiner) { Reek::Core::Examiner.new('') }
11
+
12
+ before do
13
+ instance.add_examiner examiner
14
+ end
15
+
16
+ it 'prints empty checkstyle xml' do
17
+ expect { instance.show }.to output("<?xml version='1.0'?>\n<checkstyle/>\n").to_stdout
18
+ end
19
+ end
20
+
21
+ context 'source with voliations' do
22
+ let(:examiner) { Reek::Core::Examiner.new('def simple(a) a[0] end') }
23
+
24
+ before do
25
+ allow(File).to receive(:realpath).and_return('/some/path')
26
+ instance.add_examiner examiner
27
+ end
28
+
29
+ it 'prints non-empty checkstyle xml' do
30
+ sample_path = File.expand_path 'checkstyle.xml', 'spec/samples'
31
+ expect { instance.show }.to output(File.read(sample_path)).to_stdout
32
+ end
33
+ end
34
+ end
@@ -1,13 +1,13 @@
1
1
  require_relative '../../spec_helper'
2
- require_relative '../../../lib/reek/examiner'
2
+ require_relative '../../../lib/reek/core/examiner'
3
3
  require_relative '../../../lib/reek/cli/report/report'
4
4
  require_relative '../../../lib/reek/cli/report/formatter'
5
5
 
6
- describe Reek::CLI::Report::YAMLReport do
6
+ RSpec.describe Reek::CLI::Report::YAMLReport do
7
7
  let(:instance) { Reek::CLI::Report::YAMLReport.new }
8
8
 
9
9
  context 'empty source' do
10
- let(:examiner) { Reek::Examiner.new('') }
10
+ let(:examiner) { Reek::Core::Examiner.new('') }
11
11
 
12
12
  before do
13
13
  instance.add_examiner examiner
@@ -2,7 +2,7 @@ require_relative '../../spec_helper'
2
2
  require_relative '../../../lib/reek/configuration/app_configuration'
3
3
  require_relative '../../../lib/reek/core/smell_repository'
4
4
 
5
- describe Reek::Configuration::AppConfiguration do
5
+ RSpec.describe Reek::Configuration::AppConfiguration do
6
6
  let(:sample_configuration_path) { 'spec/samples/simple_configuration.reek' }
7
7
  let(:sample_configuration_loaded) do
8
8
  {
@@ -1,10 +1,11 @@
1
1
  # encoding: UTF-8
2
2
 
3
+ require 'fileutils'
3
4
  require 'pathname'
4
5
  require 'tmpdir'
5
6
  require_relative '../../spec_helper'
6
7
 
7
- describe Reek::Configuration::ConfigurationFileFinder do
8
+ RSpec.describe Reek::Configuration::ConfigurationFileFinder do
8
9
  describe '.find' do
9
10
  it 'returns the config_file if it’s set' do
10
11
  config_file = double
@@ -39,6 +40,7 @@ describe Reek::Configuration::ConfigurationFileFinder do
39
40
  end
40
41
 
41
42
  it 'returns the file in home if traversing from the current dir fails' do
43
+ skip_if_a_config_in_tempdir
42
44
  Dir.mktmpdir do |tempdir|
43
45
  current = Pathname.new(tempdir)
44
46
  home = Pathname.new('spec/samples')
@@ -48,6 +50,7 @@ describe Reek::Configuration::ConfigurationFileFinder do
48
50
  end
49
51
 
50
52
  it 'returns nil when there are no files to find' do
53
+ skip_if_a_config_in_tempdir
51
54
  Dir.mktmpdir do |tempdir|
52
55
  current = Pathname.new(tempdir)
53
56
  home = Pathname.new(tempdir)
@@ -55,5 +58,23 @@ describe Reek::Configuration::ConfigurationFileFinder do
55
58
  expect(found).to be_nil
56
59
  end
57
60
  end
61
+
62
+ it 'works with paths that need escaping' do
63
+ Dir.mktmpdir("ma\ngic d*r") do |tempdir|
64
+ config = Pathname.new("#{tempdir}/ma\ngic f*le.reek")
65
+ subdir = Pathname.new("#{tempdir}/ma\ngic subd*r")
66
+ FileUtils.touch config
67
+ FileUtils.mkdir subdir
68
+ found = described_class.find(current: subdir)
69
+ expect(found).to eq(config)
70
+ end
71
+ end
72
+
73
+ private
74
+
75
+ def skip_if_a_config_in_tempdir
76
+ found = described_class.find(current: Pathname.new(Dir.tmpdir))
77
+ skip "skipped: #{found} exists and would fail this test" if found
78
+ end
58
79
  end
59
80
  end
@@ -1,10 +1,10 @@
1
1
  require_relative '../../spec_helper'
2
- require_relative '../../../lib/reek/source/code_comment'
2
+ require_relative '../../../lib/reek/core/code_comment'
3
3
 
4
- describe Reek::Source::CodeComment do
4
+ RSpec.describe Reek::Core::CodeComment do
5
5
  context 'with an empty comment' do
6
6
  before :each do
7
- @comment = Reek::Source::CodeComment.new('')
7
+ @comment = described_class.new('')
8
8
  end
9
9
  it 'is not descriptive' do
10
10
  expect(@comment).not_to be_descriptive
@@ -16,37 +16,37 @@ describe Reek::Source::CodeComment do
16
16
 
17
17
  context 'comment checks' do
18
18
  it 'rejects an empty comment' do
19
- expect(Reek::Source::CodeComment.new('#')).not_to be_descriptive
19
+ expect(described_class.new('#')).not_to be_descriptive
20
20
  end
21
21
  it 'rejects a 1-word comment' do
22
- expect(Reek::Source::CodeComment.new("# fred\n# ")).not_to be_descriptive
22
+ expect(described_class.new("# fred\n# ")).not_to be_descriptive
23
23
  end
24
24
  it 'accepts a 2-word comment' do
25
- expect(Reek::Source::CodeComment.new('# fred here ')).to be_descriptive
25
+ expect(described_class.new('# fred here ')).to be_descriptive
26
26
  end
27
27
  it 'accepts a multi-word comment' do
28
28
  comment = "# fred here \n# with \n # biscuits "
29
- expect(Reek::Source::CodeComment.new(comment)).to be_descriptive
29
+ expect(described_class.new(comment)).to be_descriptive
30
30
  end
31
31
  end
32
32
 
33
33
  context 'comment config' do
34
34
  it 'parses hashed options' do
35
35
  comment = '# :reek:Duplication: { enabled: false }'
36
- config = Reek::Source::CodeComment.new(comment).config
36
+ config = described_class.new(comment).config
37
37
  expect(config).to include('Duplication')
38
38
  expect(config['Duplication']).to include('enabled')
39
39
  expect(config['Duplication']['enabled']).to be_falsey
40
40
  end
41
41
  it 'parses hashed options with ruby names' do
42
42
  comment = '# :reek:nested_iterators: { enabled: true }'
43
- config = Reek::Source::CodeComment.new(comment).config
43
+ config = described_class.new(comment).config
44
44
  expect(config).to include('NestedIterators')
45
45
  expect(config['NestedIterators']).to include('enabled')
46
46
  expect(config['NestedIterators']['enabled']).to be_truthy
47
47
  end
48
48
  it 'parses multiple hashed options' do
49
- config = Reek::Source::CodeComment.new('
49
+ config = described_class.new('
50
50
  # :reek:Duplication: { enabled: false }
51
51
  :reek:nested_iterators: { enabled: true }
52
52
  ').config
@@ -57,7 +57,7 @@ describe Reek::Source::CodeComment do
57
57
  expect(config['NestedIterators']['enabled']).to be_truthy
58
58
  end
59
59
  it 'parses multiple hashed options on the same line' do
60
- config = Reek::Source::CodeComment.new('
60
+ config = described_class.new('
61
61
  #:reek:Duplication: { enabled: false } and :reek:nested_iterators: { enabled: true }
62
62
  ').config
63
63
  expect(config).to include('Duplication', 'NestedIterators')
@@ -68,7 +68,7 @@ describe Reek::Source::CodeComment do
68
68
  end
69
69
  it 'parses multiple unhashed options on the same line' do
70
70
  comment = '# :reek:Duplication and :reek:nested_iterators'
71
- config = Reek::Source::CodeComment.new(comment).config
71
+ config = described_class.new(comment).config
72
72
  expect(config).to include('Duplication', 'NestedIterators')
73
73
  expect(config['Duplication']).to include('enabled')
74
74
  expect(config['Duplication']['enabled']).to be_falsey
@@ -76,13 +76,13 @@ describe Reek::Source::CodeComment do
76
76
  expect(config['NestedIterators']['enabled']).to be_falsey
77
77
  end
78
78
  it 'disables the smell if no options are specifed' do
79
- config = Reek::Source::CodeComment.new('# :reek:Duplication').config
79
+ config = described_class.new('# :reek:Duplication').config
80
80
  expect(config).to include('Duplication')
81
81
  expect(config['Duplication']).to include('enabled')
82
82
  expect(config['Duplication']['enabled']).to be_falsey
83
83
  end
84
84
  it 'ignores smells after a space' do
85
- config = Reek::Source::CodeComment.new('# :reek: Duplication').config
85
+ config = described_class.new('# :reek: Duplication').config
86
86
  expect(config).not_to include('Duplication')
87
87
  end
88
88
  end
@@ -3,7 +3,7 @@ require_relative '../../../lib/reek/core/method_context'
3
3
  require_relative '../../../lib/reek/core/module_context'
4
4
  require_relative '../../../lib/reek/core/stop_context'
5
5
 
6
- describe Reek::Core::CodeContext do
6
+ RSpec.describe Reek::Core::CodeContext do
7
7
  context 'name recognition' do
8
8
  before :each do
9
9
  @exp_name = 'random_name' # SMELL: could use a String.random here
@@ -1,7 +1,7 @@
1
- require_relative '../spec_helper'
2
- require_relative '../../lib/reek/examiner'
1
+ require_relative '../../spec_helper'
2
+ require_relative '../../../lib/reek/core/examiner'
3
3
 
4
- shared_examples_for 'no smells found' do
4
+ RSpec.shared_examples_for 'no smells found' do
5
5
  it 'is not smelly' do
6
6
  expect(@examiner).not_to be_smelly
7
7
  end
@@ -10,7 +10,7 @@ shared_examples_for 'no smells found' do
10
10
  end
11
11
  end
12
12
 
13
- shared_examples_for 'one smell found' do
13
+ RSpec.shared_examples_for 'one smell found' do
14
14
  it 'is smelly' do
15
15
  expect(@examiner).to be_smelly
16
16
  end
@@ -22,14 +22,14 @@ shared_examples_for 'one smell found' do
22
22
  end
23
23
  end
24
24
 
25
- describe Reek::Examiner do
25
+ RSpec.describe Reek::Core::Examiner do
26
26
  before :each do
27
27
  @expected_first_smell = 'NestedIterators'
28
28
  end
29
29
 
30
30
  context 'with a fragrant String' do
31
31
  before :each do
32
- @examiner = Reek::Examiner.new('def good() true; end')
32
+ @examiner = described_class.new('def good() true; end')
33
33
  end
34
34
 
35
35
  it_should_behave_like 'no smells found'
@@ -37,7 +37,7 @@ describe Reek::Examiner do
37
37
 
38
38
  context 'with a smelly String' do
39
39
  before :each do
40
- @examiner = Reek::Examiner.new('def fine() y = 4; end')
40
+ @examiner = described_class.new('def fine() y = 4; end')
41
41
  @expected_first_smell = 'UncommunicativeName'
42
42
  end
43
43
 
@@ -53,7 +53,7 @@ describe Reek::Examiner do
53
53
 
54
54
  before :each do
55
55
  smelly_dir = Dir['spec/samples/all_but_one_masked/*.rb']
56
- @examiner = Reek::Examiner.new(smelly_dir)
56
+ @examiner = described_class.new(smelly_dir)
57
57
  end
58
58
 
59
59
  it_should_behave_like 'one smell found'
@@ -62,7 +62,7 @@ describe Reek::Examiner do
62
62
  context 'with a fragrant Dir' do
63
63
  before :each do
64
64
  clean_dir = Dir['spec/samples/three_clean_files/*.rb']
65
- @examiner = Reek::Examiner.new(clean_dir)
65
+ @examiner = described_class.new(clean_dir)
66
66
  end
67
67
 
68
68
  it_should_behave_like 'no smells found'
@@ -77,7 +77,7 @@ describe Reek::Examiner do
77
77
 
78
78
  before :each do
79
79
  smelly_dir = Dir['spec/samples/masked_by_dotfile/*.rb']
80
- @examiner = Reek::Examiner.new(smelly_dir)
80
+ @examiner = described_class.new(smelly_dir)
81
81
  end
82
82
 
83
83
  it_should_behave_like 'one smell found'
@@ -92,7 +92,7 @@ describe Reek::Examiner do
92
92
 
93
93
  before :each do
94
94
  smelly_file = File.new(Dir['spec/samples/all_but_one_masked/d*.rb'][0])
95
- @examiner = Reek::Examiner.new(smelly_file)
95
+ @examiner = described_class.new(smelly_file)
96
96
  end
97
97
 
98
98
  it_should_behave_like 'one smell found'
@@ -101,7 +101,7 @@ describe Reek::Examiner do
101
101
  context 'with a fragrant File' do
102
102
  before :each do
103
103
  clean_file = File.new(Dir['spec/samples/three_clean_files/*.rb'][0])
104
- @examiner = Reek::Examiner.new(clean_file)
104
+ @examiner = described_class.new(clean_file)
105
105
  end
106
106
 
107
107
  it_should_behave_like 'no smells found'
@@ -2,7 +2,7 @@ require_relative '../../spec_helper'
2
2
  require_relative '../../../lib/reek/core/method_context'
3
3
  require_relative '../../../lib/reek/core/stop_context'
4
4
 
5
- describe Reek::Core::MethodContext, 'matching' do
5
+ RSpec.describe Reek::Core::MethodContext, 'matching' do
6
6
  before :each do
7
7
  exp = double('exp').as_null_object
8
8
  expect(exp).to receive(:full_name).at_least(:once).and_return('mod')
@@ -20,33 +20,38 @@ describe Reek::Core::MethodContext, 'matching' do
20
20
  end
21
21
  end
22
22
 
23
- describe Reek::Core::MethodContext do
24
- it 'should record ivars as refs to self' do
25
- sexp = s(:def, :feed, s(:args), nil)
26
- mctx = Reek::Core::MethodContext.new(Reek::Core::StopContext.new, sexp)
27
- expect(mctx.envious_receivers).to eq([])
28
- mctx.record_call_to(s(:send, s(:ivar, :@cow), :feed_to))
29
- expect(mctx.envious_receivers).to eq([])
23
+ RSpec.describe Reek::Core::MethodContext do
24
+ let(:mc) do
25
+ sexp = s(:def, :foo, s(:args, s(:arg, :bar)), nil)
26
+ Reek::Core::MethodContext.new(Reek::Core::StopContext.new, sexp)
30
27
  end
31
28
 
32
- it 'should count calls to self' do
33
- sexp = s(:def, :equals, s(:args), nil)
34
- mctx = Reek::Core::MethodContext.new(Reek::Core::StopContext.new, sexp)
35
- mctx.refs.record_reference_to([:lvar, :other])
36
- mctx.record_call_to(s(:send, s(:self), :thing))
37
- expect(mctx.envious_receivers).to be_empty
38
- end
29
+ describe '#envious_receivers' do
30
+ it 'should ignore ivars as refs to self' do
31
+ mc.record_call_to s(:send, s(:ivar, :@cow), :feed_to)
32
+ expect(mc.envious_receivers).to be_empty
33
+ end
34
+
35
+ it 'should ignore explicit calls to self' do
36
+ mc.refs.record_reference_to [:lvar, :other]
37
+ mc.record_call_to s(:send, s(:self), :thing)
38
+ expect(mc.envious_receivers).to be_empty
39
+ end
39
40
 
40
- it 'should recognise a call on self' do
41
- sexp = s(:def, :deep, s(:args), nil)
42
- mc = Reek::Core::MethodContext.new(Reek::Core::StopContext.new, sexp)
43
- mc.record_call_to(s(:send, s(:lvar, :text), :each, s(:arglist)))
44
- mc.record_call_to(s(:send, nil, :shelve, s(:arglist)))
45
- expect(mc.envious_receivers).to be_empty
41
+ it 'should ignore implicit calls to self' do
42
+ mc.record_call_to s(:send, s(:lvar, :text), :each, s(:arglist))
43
+ mc.record_call_to s(:send, nil, :shelve, s(:arglist))
44
+ expect(mc.envious_receivers).to be_empty
45
+ end
46
+
47
+ it 'should record envious calls' do
48
+ mc.record_call_to s(:send, s(:lvar, :bar), :baz)
49
+ expect(mc.envious_receivers).to eq(bar: 1)
50
+ end
46
51
  end
47
52
  end
48
53
 
49
- describe Reek::Core::MethodParameters, 'default assignments' do
54
+ RSpec.describe Reek::Core::MethodParameters, 'default assignments' do
50
55
  def assignments_from(src)
51
56
  exp = Reek::Source::SourceCode.from(src).syntax_tree
52
57
  ctx = Reek::Core::MethodContext.new(Reek::Core::StopContext.new, exp)