reek 3.2.1 → 3.3.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 (112) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/Rakefile +0 -1
  4. data/config/defaults.reek +1 -1
  5. data/features/samples.feature +17 -16
  6. data/lib/reek.rb +0 -1
  7. data/lib/reek/ast/ast_node_class_map.rb +5 -1
  8. data/lib/reek/ast/node.rb +10 -3
  9. data/lib/reek/ast/object_refs.rb +11 -5
  10. data/lib/reek/ast/reference_collector.rb +6 -2
  11. data/lib/reek/ast/sexp_extensions.rb +42 -1
  12. data/lib/reek/ast/sexp_formatter.rb +2 -1
  13. data/lib/reek/cli/application.rb +12 -9
  14. data/lib/reek/cli/command.rb +6 -0
  15. data/lib/reek/cli/input.rb +4 -4
  16. data/lib/reek/cli/option_interpreter.rb +11 -7
  17. data/lib/reek/cli/options.rb +42 -40
  18. data/lib/reek/cli/reek_command.rb +3 -3
  19. data/lib/reek/cli/silencer.rb +12 -3
  20. data/lib/reek/cli/warning_collector.rb +8 -3
  21. data/lib/reek/code_comment.rb +6 -1
  22. data/lib/reek/configuration/app_configuration.rb +65 -100
  23. data/lib/reek/configuration/configuration_file_finder.rb +4 -13
  24. data/lib/reek/configuration/configuration_validator.rb +35 -0
  25. data/lib/reek/configuration/default_directive.rb +12 -0
  26. data/lib/reek/configuration/directory_directives.rb +54 -0
  27. data/lib/reek/configuration/excluded_paths.rb +18 -0
  28. data/lib/reek/context/code_context.rb +19 -17
  29. data/lib/reek/examiner.rb +9 -7
  30. data/lib/reek/rake/task.rb +12 -22
  31. data/lib/reek/report/formatter.rb +6 -1
  32. data/lib/reek/report/report.rb +22 -13
  33. data/lib/reek/smells/attribute.rb +6 -53
  34. data/lib/reek/smells/control_parameter.rb +21 -13
  35. data/lib/reek/smells/data_clump.rb +17 -9
  36. data/lib/reek/smells/duplicate_method_call.rb +12 -6
  37. data/lib/reek/smells/long_parameter_list.rb +2 -2
  38. data/lib/reek/smells/long_yield_list.rb +4 -4
  39. data/lib/reek/smells/nested_iterators.rb +4 -2
  40. data/lib/reek/smells/nil_check.rb +6 -2
  41. data/lib/reek/smells/repeated_conditional.rb +3 -3
  42. data/lib/reek/smells/smell_configuration.rb +17 -7
  43. data/lib/reek/smells/smell_detector.rb +24 -11
  44. data/lib/reek/smells/smell_repository.rb +1 -1
  45. data/lib/reek/smells/smell_warning.rb +6 -6
  46. data/lib/reek/smells/too_many_instance_variables.rb +2 -2
  47. data/lib/reek/smells/too_many_methods.rb +4 -4
  48. data/lib/reek/smells/too_many_statements.rb +4 -4
  49. data/lib/reek/smells/uncommunicative_method_name.rb +5 -5
  50. data/lib/reek/smells/uncommunicative_module_name.rb +6 -6
  51. data/lib/reek/smells/uncommunicative_parameter_name.rb +8 -4
  52. data/lib/reek/smells/uncommunicative_variable_name.rb +9 -5
  53. data/lib/reek/smells/utility_function.rb +1 -1
  54. data/lib/reek/source/source_code.rb +5 -1
  55. data/lib/reek/source/source_locator.rb +3 -2
  56. data/lib/reek/spec.rb +3 -3
  57. data/lib/reek/spec/should_reek.rb +10 -5
  58. data/lib/reek/spec/should_reek_of.rb +9 -6
  59. data/lib/reek/spec/should_reek_only_of.rb +13 -8
  60. data/lib/reek/tree_dresser.rb +6 -2
  61. data/lib/reek/tree_walker.rb +40 -32
  62. data/lib/reek/version.rb +1 -1
  63. data/reek.gemspec +1 -1
  64. data/spec/reek/ast/node_spec.rb +1 -2
  65. data/spec/reek/ast/object_refs_spec.rb +40 -42
  66. data/spec/reek/ast/sexp_extensions_spec.rb +98 -104
  67. data/spec/reek/cli/warning_collector_spec.rb +8 -12
  68. data/spec/reek/code_comment_spec.rb +3 -5
  69. data/spec/reek/configuration/app_configuration_spec.rb +43 -57
  70. data/spec/reek/configuration/configuration_file_finder_spec.rb +5 -7
  71. data/spec/reek/configuration/default_directive_spec.rb +13 -0
  72. data/spec/reek/configuration/directory_directives_spec.rb +89 -0
  73. data/spec/reek/configuration/excluded_paths_spec.rb +30 -0
  74. data/spec/reek/context/code_context_spec.rb +63 -62
  75. data/spec/reek/context/method_context_spec.rb +8 -12
  76. data/spec/reek/context/module_context_spec.rb +1 -1
  77. data/spec/reek/context/root_context_spec.rb +3 -7
  78. data/spec/reek/examiner_spec.rb +14 -25
  79. data/spec/reek/smells/attribute_spec.rb +2 -4
  80. data/spec/reek/smells/boolean_parameter_spec.rb +5 -7
  81. data/spec/reek/smells/class_variable_spec.rb +29 -44
  82. data/spec/reek/smells/control_parameter_spec.rb +7 -9
  83. data/spec/reek/smells/data_clump_spec.rb +25 -32
  84. data/spec/reek/smells/duplicate_method_call_spec.rb +8 -7
  85. data/spec/reek/smells/feature_envy_spec.rb +16 -17
  86. data/spec/reek/smells/irresponsible_module_spec.rb +2 -4
  87. data/spec/reek/smells/long_parameter_list_spec.rb +6 -9
  88. data/spec/reek/smells/long_yield_list_spec.rb +6 -9
  89. data/spec/reek/smells/nested_iterators_spec.rb +14 -16
  90. data/spec/reek/smells/repeated_conditional_spec.rb +25 -25
  91. data/spec/reek/smells/smell_configuration_spec.rb +32 -27
  92. data/spec/reek/smells/smell_detector_shared.rb +12 -13
  93. data/spec/reek/smells/smell_warning_spec.rb +54 -58
  94. data/spec/reek/smells/too_many_instance_variables_spec.rb +9 -9
  95. data/spec/reek/smells/too_many_methods_spec.rb +13 -14
  96. data/spec/reek/smells/too_many_statements_spec.rb +8 -10
  97. data/spec/reek/smells/uncommunicative_method_name_spec.rb +8 -9
  98. data/spec/reek/smells/uncommunicative_module_name_spec.rb +12 -13
  99. data/spec/reek/smells/uncommunicative_parameter_name_spec.rb +7 -10
  100. data/spec/reek/smells/uncommunicative_variable_name_spec.rb +16 -20
  101. data/spec/reek/smells/utility_function_spec.rb +11 -15
  102. data/spec/reek/source/source_code_spec.rb +6 -11
  103. data/spec/reek/spec/should_reek_of_spec.rb +19 -30
  104. data/spec/reek/spec/should_reek_only_of_spec.rb +28 -34
  105. data/spec/reek/tree_walker_spec.rb +14 -2
  106. data/spec/spec_helper.rb +2 -3
  107. data/tasks/test.rake +0 -5
  108. metadata +10 -6
  109. data/docs/Configuration-Files.md +0 -49
  110. data/spec/gem/updates_spec.rb +0 -25
  111. data/spec/gem/yard_spec.rb +0 -11
  112. data/spec/reek/smells/behaves_like_variable_detector.rb +0 -39
@@ -5,9 +5,9 @@ require_relative '../../lib/reek/source/source_code'
5
5
  # Dummy repository to inject into TreeWalker in order to count statements in
6
6
  # all contexts.
7
7
  class TestSmellRepository
8
- attr_reader :num_statements
8
+ attr_accessor :num_statements
9
9
  def examine(context)
10
- @num_statements = context.num_statements
10
+ self.num_statements = context.num_statements
11
11
  end
12
12
  end
13
13
 
@@ -95,6 +95,18 @@ RSpec.describe Reek::TreeWalker, 'statement counting' do
95
95
  expect(method.num_statements).to eq(6)
96
96
  end
97
97
 
98
+ it 'does not count constant assignment with or equals' do
99
+ source = 'class Hi; CONST ||= 1; end'
100
+ klass = process_method(source)
101
+ expect(klass.num_statements).to eq(0)
102
+ end
103
+
104
+ it 'does not count multi constant assignment' do
105
+ source = 'class Hi; CONST, OTHER_CONST = 1, 2; end'
106
+ klass = process_method(source)
107
+ expect(klass.num_statements).to eq(0)
108
+ end
109
+
98
110
  it 'does not count empty conditional expression' do
99
111
  method = process_method('def one() if val == 4; ; end; end')
100
112
  expect(method.num_statements).to eq(0)
@@ -25,10 +25,9 @@ SAMPLES_PATH = Pathname.new("#{__dir__}/samples").relative_path_from(Pathname.pw
25
25
  module Helpers
26
26
  def test_configuration_for(config)
27
27
  if config.is_a? Pathname
28
- configuration = Reek::Configuration::AppConfiguration.new OpenStruct.new(config_file: config)
28
+ configuration = Reek::Configuration::AppConfiguration.from_path(config)
29
29
  elsif config.is_a? Hash
30
- configuration = Reek::Configuration::AppConfiguration.new
31
- configuration.instance_variable_set :@default_directive, config
30
+ configuration = Reek::Configuration::AppConfiguration.from_map default_directive: config
32
31
  else
33
32
  raise "Unknown config given in `test_configuration_for`: #{config.inspect}"
34
33
  end
@@ -7,11 +7,6 @@ namespace 'test' do
7
7
  t.ruby_opts = ['-Ilib -w']
8
8
  end
9
9
 
10
- desc 'Tests various release attributes of the gem'
11
- RSpec::Core::RakeTask.new('gem') do |t|
12
- t.pattern = 'spec/gem/**/*_spec.rb'
13
- end
14
-
15
10
  desc 'Tests code quality'
16
11
  RSpec::Core::RakeTask.new('quality') do |t|
17
12
  t.pattern = 'spec/quality/**/*_spec.rb'
metadata CHANGED
@@ -1,16 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reek
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.1
4
+ version: 3.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin Rutherford
8
8
  - Timo Roessner
9
9
  - Matijs van Zuijlen
10
+ - Piotr Szotkowski
10
11
  autorequire:
11
12
  bindir: bin
12
13
  cert_chain: []
13
- date: 2015-08-17 00:00:00.000000000 Z
14
+ date: 2015-08-22 00:00:00.000000000 Z
14
15
  dependencies:
15
16
  - !ruby/object:Gem::Dependency
16
17
  name: parser
@@ -226,7 +227,6 @@ files:
226
227
  - docs/Class-Variable.md
227
228
  - docs/Code-Smells.md
228
229
  - docs/Command-Line-Options.md
229
- - docs/Configuration-Files.md
230
230
  - docs/Control-Couple.md
231
231
  - docs/Control-Parameter.md
232
232
  - docs/Data-Clump.md
@@ -296,6 +296,10 @@ files:
296
296
  - lib/reek/code_comment.rb
297
297
  - lib/reek/configuration/app_configuration.rb
298
298
  - lib/reek/configuration/configuration_file_finder.rb
299
+ - lib/reek/configuration/configuration_validator.rb
300
+ - lib/reek/configuration/default_directive.rb
301
+ - lib/reek/configuration/directory_directives.rb
302
+ - lib/reek/configuration/excluded_paths.rb
299
303
  - lib/reek/context/code_context.rb
300
304
  - lib/reek/context/method_context.rb
301
305
  - lib/reek/context/module_context.rb
@@ -349,8 +353,6 @@ files:
349
353
  - lib/reek/version.rb
350
354
  - reek.gemspec
351
355
  - spec/factories/factories.rb
352
- - spec/gem/updates_spec.rb
353
- - spec/gem/yard_spec.rb
354
356
  - spec/quality/reek_source_spec.rb
355
357
  - spec/reek/ast/node_spec.rb
356
358
  - spec/reek/ast/object_refs_spec.rb
@@ -363,6 +365,9 @@ files:
363
365
  - spec/reek/code_comment_spec.rb
364
366
  - spec/reek/configuration/app_configuration_spec.rb
365
367
  - spec/reek/configuration/configuration_file_finder_spec.rb
368
+ - spec/reek/configuration/default_directive_spec.rb
369
+ - spec/reek/configuration/directory_directives_spec.rb
370
+ - spec/reek/configuration/excluded_paths_spec.rb
366
371
  - spec/reek/context/code_context_spec.rb
367
372
  - spec/reek/context/method_context_spec.rb
368
373
  - spec/reek/context/module_context_spec.rb
@@ -375,7 +380,6 @@ files:
375
380
  - spec/reek/report/xml_report_spec.rb
376
381
  - spec/reek/report/yaml_report_spec.rb
377
382
  - spec/reek/smells/attribute_spec.rb
378
- - spec/reek/smells/behaves_like_variable_detector.rb
379
383
  - spec/reek/smells/boolean_parameter_spec.rb
380
384
  - spec/reek/smells/class_variable_spec.rb
381
385
  - spec/reek/smells/control_parameter_spec.rb
@@ -1,49 +0,0 @@
1
- # Configuration Files
2
-
3
- ## Configuration loading
4
-
5
- Configuring `reek` via configuration file is by far the most powerful way.
6
-
7
- There are 3 ways of passing `reek` a configuration file:
8
-
9
- 1. Using the cli "-c" switch (see [Command Line Options](Command-Line-Options.md))
10
- 2. Having a file ending with .reek either in your current working directory or in a parent directory (more on that later)
11
- 3. Having a file ending with .reek in your HOME directory
12
-
13
- The order in which `reek` tries to find such a configuration file is exactly like above: First `reek` checks if we have given it a configuration file explicitly via CLI. Then it checks the current working directory for a file and if it can't find one, it traverses up the directories until it hits the root directory. And lastly, it checks your HOME directory.
14
-
15
- As soon as `reek` detects a configuration file it stops searching immediately, meaning that from `reek`'s point of view there exists one configuration file and one configuration only regardless of how many ".reek" files you might have on your filesystem.
16
-
17
- ## Configuration options for smells
18
-
19
- The first thing you probably want to check out are the [Basic Smell Options](Basic-Smell-Options.md) which are supported by every smell type.
20
- Certain smell types offer a configuration that goes beyond that of the basic smell options - for instance [Data Clump](Data-Clump.md).
21
- All options that go beyond the [Basic Smell Options](Basic-Smell-Options.md) should be documented in the corresponding smell type wiki page but if you want to get a quick and full overview over all possible configurations you can always check out [the default.reek file in this repository](https://github.com/troessner/reek/blob/master/config/defaults.reek).
22
-
23
- Here's an excerpt of a `reek` configuration file from a commercial project:
24
-
25
- ```yaml
26
- ---
27
- IrresponsibleModule:
28
- enabled: false
29
- NestedIterators:
30
- exclude:
31
- - "ActiveModelErrorAdder#self.run" # should be refactored
32
- - "BookingRequests::Transfer#remote_validation"
33
- - "BookingRequestsController#vehicle_options" # respond_to block
34
- - "Content::Base#self.expose_fields" # unavoidable due to metaprogramming
35
- DataClump:
36
- max_copies: 3
37
- min_clump_size: 3
38
- ```
39
-
40
- ## Excluding directories from scans
41
-
42
- You can exclude whole directories from scans using `exclude_paths` in your configuration file:
43
-
44
- ```yaml
45
- ---
46
- exclude_paths:
47
- - app/views
48
- - app/controllers
49
- ```
@@ -1,25 +0,0 @@
1
- require_relative '../spec_helper'
2
- require 'find'
3
-
4
- release_timestamp_file = 'build/.last-release'
5
- if test('f', release_timestamp_file)
6
- describe 'updates' do
7
- before :each do
8
- @release_time = File.stat(release_timestamp_file).mtime
9
- end
10
-
11
- context 'version file' do
12
- it 'has been updated since the last release' do
13
- version_time = File.stat('lib/reek.rb').mtime
14
- expect(version_time).to be > @release_time
15
- end
16
- end
17
-
18
- context 'history file' do
19
- it 'has been updated since the last release' do
20
- history_time = File.stat('History.txt').mtime
21
- expect(history_time).to be > @release_time
22
- end
23
- end
24
- end
25
- end
@@ -1,11 +0,0 @@
1
- require 'open3'
2
- require_relative '../spec_helper'
3
-
4
- RSpec.describe 'yardoc' do
5
- it 'executes successfully with no warnings' do
6
- stdout, stderr, status = Open3.capture3('yardoc')
7
- expect(stdout).to_not include('[warn]')
8
- expect(stderr).to be_empty
9
- expect(status).to be_success
10
- end
11
- end
@@ -1,39 +0,0 @@
1
- RSpec.shared_examples_for 'a variable detector' do
2
- context 'with no variables' do
3
- it "doesn't record a smell" do
4
- @detector.examine_context(@ctx)
5
- expect(@detector.smells_found.length).to eq(0)
6
- end
7
- end
8
-
9
- context 'with one variable encountered twice' do
10
- before :each do
11
- @ctx.send(@record_variable, :something)
12
- @ctx.send(@record_variable, :something)
13
- @detector.examine_context(@ctx)
14
- end
15
-
16
- it 'records only one smell' do
17
- expect(@detector.smells_found.length).to eq(1)
18
- end
19
- it 'mentions the variable name in the report' do
20
- expect(@detector).to have_smell([/something/])
21
- end
22
- end
23
-
24
- context 'with two variables' do
25
- before :each do
26
- @ctx.send(@record_variable, :something)
27
- @ctx.send(@record_variable, :something_else)
28
- @detector.examine_context(@ctx)
29
- end
30
-
31
- it 'records both smells' do
32
- expect(@detector.num_smells).to eq(2)
33
- end
34
- it 'mentions both variable names in the report' do
35
- expect(@detector).to have_smell([/something/])
36
- expect(@detector).to have_smell([/something_else/])
37
- end
38
- end
39
- end