reek 5.4.1 → 6.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +8 -6
  4. data/.rubocop_todo.yml +25 -20
  5. data/.simplecov +1 -0
  6. data/.travis.yml +17 -11
  7. data/CHANGELOG.md +31 -3
  8. data/Dockerfile +1 -0
  9. data/Gemfile +14 -17
  10. data/README.md +15 -11
  11. data/bin/code_climate_reek +12 -2
  12. data/docs/Attribute.md +1 -1
  13. data/docs/Boolean-Parameter.md +1 -1
  14. data/docs/Control-Couple.md +1 -1
  15. data/docs/Nil-Check.md +4 -1
  16. data/features/command_line_interface/options.feature +2 -3
  17. data/features/configuration_files/schema_validation.feature +1 -1
  18. data/features/reports/codeclimate.feature +2 -2
  19. data/features/reports/json.feature +3 -3
  20. data/features/reports/reports.feature +4 -4
  21. data/features/reports/yaml.feature +3 -3
  22. data/features/step_definitions/reek_steps.rb +5 -1
  23. data/features/step_definitions/sample_file_steps.rb +2 -2
  24. data/features/support/env.rb +1 -2
  25. data/lib/reek.rb +1 -0
  26. data/lib/reek/ast/sexp_extensions/arguments.rb +11 -0
  27. data/lib/reek/cli/options.rb +3 -3
  28. data/lib/reek/code_comment.rb +45 -38
  29. data/lib/reek/configuration/app_configuration.rb +4 -3
  30. data/lib/reek/configuration/configuration_converter.rb +2 -2
  31. data/lib/reek/configuration/directory_directives.rb +9 -3
  32. data/lib/reek/context/module_context.rb +3 -1
  33. data/lib/reek/errors/legacy_comment_separator_error.rb +36 -0
  34. data/lib/reek/examiner.rb +3 -3
  35. data/lib/reek/report.rb +5 -7
  36. data/lib/reek/report/code_climate/code_climate_configuration.yml +1 -1
  37. data/lib/reek/report/code_climate/code_climate_report.rb +2 -1
  38. data/lib/reek/report/simple_warning_formatter.rb +0 -7
  39. data/lib/reek/report/text_report.rb +2 -2
  40. data/lib/reek/smell_detectors/base_detector.rb +1 -9
  41. data/lib/reek/smell_detectors/boolean_parameter.rb +3 -1
  42. data/lib/reek/smell_detectors/data_clump.rb +23 -56
  43. data/lib/reek/smell_detectors/nil_check.rb +1 -12
  44. data/lib/reek/smell_detectors/subclassed_from_core_class.rb +3 -7
  45. data/lib/reek/smell_detectors/uncommunicative_variable_name.rb +1 -1
  46. data/lib/reek/smell_warning.rb +1 -2
  47. data/lib/reek/source/source_code.rb +3 -2
  48. data/lib/reek/source/source_locator.rb +13 -10
  49. data/lib/reek/spec/smell_matcher.rb +2 -1
  50. data/lib/reek/version.rb +1 -1
  51. data/reek.gemspec +13 -6
  52. data/spec/performance/reek/smell_detectors/runtime_speed_spec.rb +2 -4
  53. data/spec/quality/documentation_spec.rb +2 -1
  54. data/spec/reek/ast/sexp_extensions_spec.rb +15 -33
  55. data/spec/reek/code_comment_spec.rb +41 -42
  56. data/spec/reek/configuration/directory_directives_spec.rb +6 -0
  57. data/spec/reek/context_builder_spec.rb +110 -113
  58. data/spec/reek/report/code_climate/code_climate_configuration_spec.rb +1 -3
  59. data/spec/reek/report/code_climate/code_climate_fingerprint_spec.rb +26 -26
  60. data/spec/reek/report/code_climate/code_climate_formatter_spec.rb +6 -6
  61. data/spec/reek/report/code_climate/code_climate_report_spec.rb +1 -1
  62. data/spec/reek/report/json_report_spec.rb +1 -1
  63. data/spec/reek/report/location_formatter_spec.rb +3 -3
  64. data/spec/reek/report/text_report_spec.rb +1 -7
  65. data/spec/reek/report/yaml_report_spec.rb +1 -1
  66. data/spec/reek/smell_detectors/base_detector_spec.rb +3 -13
  67. data/spec/reek/smell_detectors/data_clump_spec.rb +14 -0
  68. data/spec/reek/smell_detectors/missing_safe_method_spec.rb +8 -2
  69. data/spec/reek/smell_detectors/nil_check_spec.rb +3 -3
  70. data/spec/reek/smell_warning_spec.rb +12 -12
  71. data/spec/reek/source/source_code_spec.rb +13 -0
  72. data/spec/reek/spec/should_reek_of_spec.rb +0 -1
  73. data/spec/reek/spec/should_reek_only_of_spec.rb +6 -6
  74. data/spec/reek/spec/smell_matcher_spec.rb +1 -1
  75. data/spec/spec_helper.rb +20 -6
  76. data/tasks/configuration.rake +1 -2
  77. metadata +15 -25
  78. data/spec/factories/factories.rb +0 -37
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2cc4e5c07f939e121b14b1b9250411d0e83fce7e936271328731500cf8a93a8e
4
- data.tar.gz: 167f4022f6d3120e9dffb9eb3828f756755790c13c1e70c09f46a20dd1dc23c7
3
+ metadata.gz: 83760bf0344db6b8f65cd5bbb6e57f90ee4e1b54c10edb3920821a517e6649cd
4
+ data.tar.gz: 258214d9022fda0ecbe287c4313719472c30f056c1ff6ffd4f7ff023b255b199
5
5
  SHA512:
6
- metadata.gz: 540da16a41f3939e187389759bfb9893e56f0cdf9f9dee01b09e924ba412c6f42210584b07613122dfbaed26f75991ac2b411a7db78227e175b2aae2dc289db0
7
- data.tar.gz: a354ce529e870797c32b2608f1e05facfbdeb52f8e4fe9de5280b42b769dd2ddbe740a0c374f2cbdc1cc32d5254eb51037861c9149cc4ef427545ea626137ea1
6
+ metadata.gz: 56c12a16cc200dd475d84a543fd9edf2ce888f550a5d4d22cbe813c3439ed0915263340d7c02654417666bcd728ee5e9ba976670cae46098293b58595589f36c
7
+ data.tar.gz: 0f012f16ec237bdece4f797ea2977c0db5fa083df32ac86ce57b14911777eec0d832aff8e861df67c5cc80b847b0c3caf801a157b759724cc9f858ae4236ace9
data/.gitignore CHANGED
@@ -1,4 +1,5 @@
1
1
  pkg
2
+ spec/examples.txt
2
3
  spec/output
3
4
  tmp
4
5
  doc
@@ -9,10 +9,11 @@ AllCops:
9
9
  - 'samples/**/*'
10
10
  - 'tmp/**/*'
11
11
  - 'vendor/**/*'
12
- TargetRubyVersion: 2.3
12
+ NewCops: enable
13
+ TargetRubyVersion: 2.4
13
14
 
14
15
  # Tables are nice
15
- Layout/AlignHash:
16
+ Layout/HashAlignment:
16
17
  EnforcedColonStyle: table
17
18
  EnforcedHashRocketStyle: table
18
19
  EnforcedLastArgumentHashStyle: ignore_implicit
@@ -25,6 +26,10 @@ Layout/DotPosition:
25
26
  Layout/EmptyLineBetweenDefs:
26
27
  AllowAdjacentOneLineDefs: true
27
28
 
29
+ # Be rather lenient with line length
30
+ Layout/LineLength:
31
+ Max: 120
32
+
28
33
  # Always put the closing brace on the last line
29
34
  Layout/MultilineMethodCallBraceLayout:
30
35
  EnforcedStyle: same_line
@@ -53,12 +58,9 @@ Lint/BooleanSymbol:
53
58
  # Spec blocks can be any size
54
59
  Metrics/BlockLength:
55
60
  Exclude:
61
+ - '**/*.gemspec'
56
62
  - 'spec/**/*'
57
63
 
58
- # Be rather lenient with line length
59
- Metrics/LineLength:
60
- Max: 120
61
-
62
64
  # Keyword arguments make long parameter lists readable
63
65
  Metrics/ParameterLists:
64
66
  CountKeywordArgs: false
@@ -1,22 +1,34 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config`
3
- # on 2018-11-04 12:41:28 +0100 using RuboCop version 0.60.0.
3
+ # on 2020-08-19 19:02:50 UTC using RuboCop version 0.89.1.
4
4
  # The point is for the user to remove these configuration records
5
5
  # one by one as the offenses are removed from the code base.
6
6
  # Note that changes in the inspected code, or installation of new
7
7
  # versions of RuboCop, may require this file to be generated again.
8
8
 
9
- # Offense count: 3
9
+ # Offense count: 2
10
+ Lint/MissingSuper:
11
+ Exclude:
12
+ - 'lib/reek/rake/task.rb'
13
+ - 'lib/reek/smell_detectors/base_detector.rb'
14
+
15
+ # Offense count: 2
16
+ Lint/UnreachableLoop:
17
+ Exclude:
18
+ - 'spec/reek/ast/node_spec.rb'
19
+
20
+ # Offense count: 2
21
+ # Configuration parameters: IgnoredMethods.
10
22
  Metrics/AbcSize:
11
23
  Max: 21
12
24
 
13
25
  # Offense count: 1
14
- # Configuration parameters: CountComments.
26
+ # Configuration parameters: CountComments, CountAsOne.
15
27
  Metrics/ClassLength:
16
28
  Max: 161
17
29
 
18
30
  # Offense count: 13
19
- # Configuration parameters: CountComments, ExcludedMethods.
31
+ # Configuration parameters: CountComments, CountAsOne, ExcludedMethods.
20
32
  Metrics/MethodLength:
21
33
  Max: 16
22
34
 
@@ -25,17 +37,6 @@ RSpec/AnyInstance:
25
37
  Exclude:
26
38
  - 'spec/reek/cli/application_spec.rb'
27
39
 
28
- # Offense count: 1
29
- # Configuration parameters: CustomIncludeMethods.
30
- RSpec/EmptyExampleGroup:
31
- Exclude:
32
- - 'spec/factories/factories.rb'
33
-
34
- # Offense count: 1
35
- RSpec/MissingExampleGroupArgument:
36
- Exclude:
37
- - 'spec/factories/factories.rb'
38
-
39
40
  # Offense count: 4
40
41
  RSpec/MultipleDescribes:
41
42
  Exclude:
@@ -44,19 +45,23 @@ RSpec/MultipleDescribes:
44
45
  - 'spec/reek/report/location_formatter_spec.rb'
45
46
  - 'spec/reek/report/progress_formatter_spec.rb'
46
47
 
47
- # Offense count: 32
48
- # Configuration parameters: AggregateFailuresByDefault.
48
+ # Offense count: 30
49
49
  RSpec/MultipleExpectations:
50
50
  Max: 5
51
51
 
52
- # Offense count: 25
52
+ # Offense count: 16
53
+ # Configuration parameters: AllowSubject.
54
+ RSpec/MultipleMemoizedHelpers:
55
+ Max: 9
56
+
57
+ # Offense count: 27
53
58
  RSpec/NestedGroups:
54
59
  Max: 5
55
60
 
56
61
  # Offense count: 2
57
62
  # Cop supports --auto-correct.
58
- # Configuration parameters: ConvertCodeThatCanStartToReturnNil, Whitelist.
59
- # Whitelist: present?, blank?, presence, try, try!
63
+ # Configuration parameters: ConvertCodeThatCanStartToReturnNil, AllowedMethods.
64
+ # AllowedMethods: present?, blank?, presence, try, try!
60
65
  Style/SafeNavigation:
61
66
  Exclude:
62
67
  - 'lib/reek/ast/node.rb'
data/.simplecov CHANGED
@@ -5,6 +5,7 @@ SimpleCov.start do
5
5
  add_filter 'spec/'
6
6
  add_filter 'samples/'
7
7
  coverage_dir 'tmp/coverage'
8
+ enable_coverage :branch
8
9
  end
9
10
 
10
11
  SimpleCov.at_exit do
@@ -1,34 +1,40 @@
1
- dist: trusty
2
- cache: bundler
3
1
  language: ruby
2
+
3
+ dist: xenial
4
+
5
+ cache:
6
+ bundler: true
7
+
4
8
  bundler_args: --without debugging
5
- before_script:
6
- # Avoid Java announcing _JAVA_OPTIONS environment variable
7
- # See https://github.com/travis-ci/travis-ci/issues/8408
8
- - unset _JAVA_OPTIONS
9
+
9
10
  script: bundle exec rake ci
11
+
10
12
  rvm:
11
- - 2.3
12
13
  - 2.4
13
14
  - 2.5
14
15
  - 2.6
15
- - jruby-9.1.17.0
16
- - jruby-9.2.6.0
16
+ - 2.7
17
+ - jruby-9.2
17
18
  - jruby-head
18
19
  - ruby-head
19
- - rubinius-3
20
+
20
21
  matrix:
21
22
  allow_failures:
22
23
  - rvm: jruby-head
23
24
  - rvm: ruby-head
24
- - rvm: rubinius-3
25
25
  fast_finish: true
26
+
26
27
  notifications:
27
28
  email:
28
29
  - timo.roessner@googlemail.com
29
30
  - matijs@matijs.net
30
31
  - chastell@chastell.net
31
32
  irc: irc.freenode.org#reek
33
+
32
34
  branches:
33
35
  only:
34
36
  - master
37
+
38
+ env:
39
+ global:
40
+ - JRUBY_OPTS="--dev"
@@ -1,11 +1,39 @@
1
1
  # Change log
2
2
 
3
- ## Unreleased
3
+ ## 6.0.2 (2020-10-17)
4
+
5
+ * (mvz) Loosen dependency on psych. This should resolve installation problems on
6
+ mingw32
7
+ * (Cesario Uy) Fix typo in docs for "Boolean Parameter" smell
8
+ * (mvz) Set link metadata in gemspec
9
+
10
+ ## 6.0.1 (2020-05-26)
11
+
12
+ * (Maxim Pertsov) Handle absolute paths for directories correctly
13
+
14
+ ## 6.0.0 (2020-03-30)
15
+
16
+ * (mvz) Make codeclimate-engine-rb a development dependency
17
+ * (mvz) Drop support for Ruby 2.3
18
+ * (mvz) Raise error when legacy code comment format is used
19
+ * (mvz) Stop reporting NilCheck for safe navigation
20
+ * (likeath) Properly handle "Forward all" syntax
21
+
22
+ ## 5.6.0 (2020-01-20)
23
+
24
+ * (mvz) Support Ruby 2.7
25
+ * (mvz) Loosen parser dependency to allow version 2.7.x
26
+
27
+ ## 5.5.0 (2019-11-13)
28
+
29
+ * (mvz) Use the Parser class matching current ruby for parsing, instead of
30
+ always picking version 2.6.
4
31
 
5
32
  ## 5.4.1 (2019-11-12)
6
33
 
7
- * (Filipe Esperandio) Bump base image to a more recent ruby version
8
- * (Fernando Contreras) Add quotes inside directory configuration
34
+ * (Filipe Esperandio) Bump base Docker image to a more recent ruby version
35
+ * (Fernando Contreras) Add quotes inside directory configuration example in
36
+ README
9
37
 
10
38
  ## 5.4.0 (2019-04-24)
11
39
 
data/Dockerfile CHANGED
@@ -22,6 +22,7 @@ WORKDIR ${app_dir}
22
22
 
23
23
  RUN gem install rake
24
24
  RUN bundle install --without debugging development
25
+ RUN gem install codeclimate-engine-rb
25
26
 
26
27
  VOLUME ${code_dir}
27
28
  WORKDIR ${code_dir}
data/Gemfile CHANGED
@@ -5,19 +5,19 @@ gemspec
5
5
  ruby RUBY_VERSION
6
6
 
7
7
  group :development do
8
- gem 'aruba', '~> 0.14.8'
9
- gem 'cucumber', '~> 3.0'
10
- gem 'factory_bot', '~> 5.0', '!= 5.1.0'
11
- gem 'kramdown', '~> 2.1'
12
- gem 'kramdown-parser-gfm', '~> 1.0'
13
- gem 'rake', '~> 13.0'
14
- gem 'rspec', '~> 3.0'
15
- gem 'rspec-benchmark', '~> 0.5.0'
16
- gem 'rubocop', '~> 0.75.0'
17
- gem 'rubocop-performance', '~> 1.5.0'
18
- gem 'rubocop-rspec', '~> 1.36.0'
19
- gem 'simplecov', '~> 0.17.0'
20
- gem 'yard', '~> 0.9.5'
8
+ gem 'aruba', '~> 1.0'
9
+ gem 'codeclimate-engine-rb', '~> 0.4.0'
10
+ gem 'cucumber', ['>= 4.0', '< 6.0']
11
+ gem 'kramdown', '~> 2.1'
12
+ gem 'kramdown-parser-gfm', '~> 1.0'
13
+ gem 'rake', '~> 13.0'
14
+ gem 'rspec', '~> 3.0'
15
+ gem 'rspec-benchmark', '~> 0.6.0'
16
+ gem 'rubocop', '~> 0.93.0'
17
+ gem 'rubocop-performance', '~> 1.8.0'
18
+ gem 'rubocop-rspec', '~> 1.43.1'
19
+ gem 'simplecov', ['>= 0.18.0', '< 0.20.0']
20
+ gem 'yard', '~> 0.9.5'
21
21
 
22
22
  platforms :mri do
23
23
  gem 'redcarpet', '~> 3.4'
@@ -25,8 +25,5 @@ group :development do
25
25
  end
26
26
 
27
27
  group :debugging do
28
- gem 'pry'
29
- platforms :mri do
30
- gem 'pry-byebug'
31
- end
28
+ gem 'pry', '~> 0.13.0'
32
29
  end
data/README.md CHANGED
@@ -45,12 +45,6 @@
45
45
  * ![](http://ruby-gem-downloads-badge.herokuapp.com/reek?type=total)
46
46
  * ![](http://ruby-gem-downloads-badge.herokuapp.com/reek?label=downloads-current-version)
47
47
 
48
- ## Reek 5 is out!
49
-
50
- Reek 5 is out and with it a bunch of breaking changes. If you're a new user you can just
51
- continue with the quickstart below. If you're a Reek 4 user and would like to upgrade to 5, don't
52
- worry, this shouldn't take you more than 10 minutes. Check out our [Upgrade Guide](docs/Reek-4-to-Reek-5-migration.md).
53
-
54
48
  ## Quickstart
55
49
 
56
50
  Reek is a tool that examines Ruby classes, modules and methods and reports any
@@ -100,10 +94,14 @@ demo.rb -- 2 warnings:
100
94
 
101
95
  ## Supported Ruby versions
102
96
 
103
- Reek is officially supported for CRuby 2.3 to 2.6 and for JRuby 9.1 and 9.2.
97
+ Reek is officially supported for CRuby 2.4 to 2.7 and for JRuby 9.2.
104
98
  Other Ruby implementations (like Rubinius) are not officially supported but
105
99
  should work as well.
106
100
 
101
+ Note that, on each Ruby version, Reek will use the parser for that version of
102
+ Ruby. So, you should always run Reek using one of your project's target Ruby
103
+ versions.
104
+
107
105
  ## Fixing Smell Warnings
108
106
 
109
107
  Reek focuses on high-level code smells, so we can't tell you how to fix warnings in
@@ -288,7 +286,7 @@ detectors:
288
286
  # You can disable smells completely
289
287
  IrresponsibleModule:
290
288
  enabled: false
291
-
289
+
292
290
  # You can use filters to silence Reek warnings.
293
291
  # Either because you simply disagree with Reek (we are not the police) or
294
292
  # because you want to fix this at a later point in time.
@@ -296,7 +294,7 @@ detectors:
296
294
  exclude:
297
295
  - "MyWorker#self.class_method" # should be refactored
298
296
  - "AnotherWorker#instance_method" # should be refactored as well
299
-
297
+
300
298
  # A lot of smells allow fine tuning their configuration. You can look up all available options
301
299
  # in the corresponding smell documentation in /docs. In most cases you probably can just go
302
300
  # with the defaults as documented in defaults.reek.yml.
@@ -351,9 +349,14 @@ This configuration for instance:
351
349
  detectors:
352
350
  IrresponsibleModule:
353
351
  enabled: false
354
-
352
+
355
353
  TooManyStatements:
356
354
  max_statements: 5
355
+
356
+ directories:
357
+ "app/controllers":
358
+ TooManyStatements:
359
+ max_statements: 10
357
360
  ```
358
361
 
359
362
  translates to:
@@ -370,7 +373,7 @@ are documented in the corresponding smell type /docs page (if you want to get a
370
373
  configurations you can also check out [the `defaults.reek.yml` file in this repository](docs/defaults.reek.yml).
371
374
 
372
375
  Note that you do not need a configuration file at all.
373
- If you're fine with all the [defaults.reek.yml](docs/defaults.reek.yml) we set you can skip this completely.
376
+ If you're fine with all the [defaults](docs/defaults.reek.yml) we set you can skip this completely.
374
377
 
375
378
  Don't worry about introducing a mistake in your configuration file that might go unnoticed - Reek uses a
376
379
  schema to validate your configuration against on start up and will faily loudly in case you
@@ -609,6 +612,7 @@ Be careful though, Reek does not merge your configuration entries, so if you alr
609
612
  Reek
610
613
  * [ruby-critic](https://github.com/whitesmith/rubycritic) - gem that wraps around static analysis gems such as Reek, [flay](https://github.com/seattlerb/flay) and [flog](https://github.com/seattlerb/flog)
611
614
  * [pronto-reek](https://github.com/mmozuras/pronto-reek) - Reek integration for [pronto](https://github.com/mmozuras/pronto)
615
+ * [action-reek](https://github.com/reviewdog/action-reek) - GitHub Action to run reek with [reviewdog](https://github.com/reviewdog/reviewdog) 🐶
612
616
 
613
617
  ### Misc
614
618
 
@@ -6,15 +6,16 @@
6
6
 
7
7
  require_relative '../lib/reek'
8
8
  require_relative '../lib/reek/cli/application'
9
+ require_relative '../lib/reek/report/code_climate'
9
10
 
10
11
  # Map input coming from CodeClimate to Reek.
11
12
  class CodeClimateToReek
12
13
  # Following the spec (https://github.com/codeclimate/spec/blob/master/SPEC.md)
13
14
  # we have to exit with a zero for both failure and success.
14
15
  ENGINE_CONFIGURATION = [
15
- '-f', 'code_climate',
16
16
  '--failure-exit-code', '0',
17
- '--success-exit-code', '0'
17
+ '--success-exit-code', '0',
18
+ '.'
18
19
  ].freeze
19
20
 
20
21
  attr_reader :configuration_file_path, :include_paths_key, :include_paths_default
@@ -54,6 +55,15 @@ class CodeClimateToReek
54
55
  end
55
56
  end
56
57
 
58
+ # Override for ReportCommand to force the use of CodeClimateReport.
59
+ module ReportClassOverride
60
+ def report_class
61
+ Reek::Report::CodeClimateReport
62
+ end
63
+ end
64
+
65
+ Reek::CLI::Command::ReportCommand.prepend ReportClassOverride
66
+
57
67
  application = Reek::CLI::Application.new(CodeClimateToReek.new.cli_arguments)
58
68
 
59
69
  exit application.execute
@@ -29,7 +29,7 @@ test.rb -- 1 warning:
29
29
 
30
30
  ## Support in Reek
31
31
 
32
- This detector it raises a warning for every public `attr_writer`,
32
+ This detector raises a warning for every public `attr_writer`,
33
33
  `attr_accessor`, and `attr` with the writable flag set to `true`.
34
34
 
35
35
  Reek does not raise warnings for read-only attributes.
@@ -38,7 +38,7 @@ Note that both smells are reported, _Boolean Parameter_ and _Control Parameter_.
38
38
 
39
39
  ## Getting rid of the smell
40
40
 
41
- This is highly dependant on your exact architecture, but looking at the example above what you could do is:
41
+ This is highly dependent on your exact architecture, but looking at the example above what you could do is:
42
42
 
43
43
  * Move everything in the `if` branch into a separate method
44
44
  * Move everything in the `else` branch into a separate method
@@ -14,7 +14,7 @@ controlling parameter must be reflected on both sides of the call. A _Control
14
14
  Couple_ also reveals a loss of simplicity: the called method probably has more
15
15
  than one responsibility, because it includes at least two different code paths.
16
16
 
17
- You can find a good write-up regarding this problem [here](http://solnic.eu/2012/04/11/get-rid-of-that-code-smell-control-couple.html).
17
+ You can find a good write-up regarding this problem [here](https://solnic.codes/2012/04/11/get-rid-of-that-code-smell-control-couple/).
18
18
 
19
19
  ## Current Support in Reek
20
20
 
@@ -37,7 +37,10 @@ _Nil Check_ reports use of
37
37
  * <code>.nil?</code> method
38
38
  * <code>==</code> and <code>===</code> operators when checking vs. <code>nil</code>
39
39
  * case statements that use syntax like <code>when nil</code>
40
- * use of the safe navigation operator like `foo&.bar`
40
+
41
+ _Nil Check_ allows use of
42
+
43
+ * the safe navigation operator like `foo&.bar`
41
44
 
42
45
  ## Configuration
43
46