reek 3.2.1 → 3.3.0

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