reek 4.4.2 → 4.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (143) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +10 -1
  3. data/CHANGELOG.md +16 -0
  4. data/CONTRIBUTING.md +52 -23
  5. data/README.md +16 -3
  6. data/ataru_setup.rb +1 -1
  7. data/docs/API.md +1 -4
  8. data/docs/How-reek-works-internally.md +5 -5
  9. data/docs/Style-Guide.md +7 -0
  10. data/features/command_line_interface/options.feature +1 -0
  11. data/features/command_line_interface/show_progress.feature +33 -0
  12. data/features/configuration_files/masking_smells.feature +0 -1
  13. data/features/configuration_via_source_comments/erroneous_source_comments.feature +18 -4
  14. data/features/configuration_via_source_comments/well_formed_source_comments.feature +116 -0
  15. data/features/step_definitions/sample_file_steps.rb +5 -0
  16. data/features/todo_list.feature +42 -14
  17. data/lib/reek.rb +1 -1
  18. data/lib/reek/cli/application.rb +5 -0
  19. data/lib/reek/cli/command/report_command.rb +6 -1
  20. data/lib/reek/cli/command/todo_list_command.rb +1 -2
  21. data/lib/reek/cli/options.rb +19 -3
  22. data/lib/reek/code_comment.rb +83 -11
  23. data/lib/reek/configuration/configuration_validator.rb +2 -2
  24. data/lib/reek/errors/bad_detector_in_comment_error.rb +35 -0
  25. data/lib/reek/errors/garbage_detector_configuration_in_comment_error.rb +34 -0
  26. data/lib/reek/examiner.rb +36 -14
  27. data/lib/reek/report.rb +28 -9
  28. data/lib/reek/report/base_report.rb +77 -0
  29. data/lib/reek/report/code_climate.rb +4 -0
  30. data/lib/reek/report/code_climate/code_climate_fingerprint.rb +48 -0
  31. data/lib/reek/report/code_climate/code_climate_formatter.rb +5 -0
  32. data/lib/reek/report/code_climate/code_climate_report.rb +19 -0
  33. data/lib/reek/report/formatter.rb +5 -56
  34. data/lib/reek/report/{heading_formatter.rb → formatter/heading_formatter.rb} +4 -4
  35. data/lib/reek/report/formatter/location_formatter.rb +41 -0
  36. data/lib/reek/report/formatter/progress_formatter.rb +80 -0
  37. data/lib/reek/report/formatter/simple_warning_formatter.rb +35 -0
  38. data/lib/reek/report/formatter/wiki_link_warning_formatter.rb +35 -0
  39. data/lib/reek/report/html_report.rb +21 -0
  40. data/lib/reek/report/{html_report.html.erb → html_report/html_report.html.erb} +0 -0
  41. data/lib/reek/report/json_report.rb +18 -0
  42. data/lib/reek/report/text_report.rb +68 -0
  43. data/lib/reek/report/xml_report.rb +61 -0
  44. data/lib/reek/report/yaml_report.rb +18 -0
  45. data/lib/reek/smell_detectors.rb +30 -0
  46. data/lib/reek/{smells → smell_detectors}/attribute.rb +3 -3
  47. data/lib/reek/{smells/smell_detector.rb → smell_detectors/base_detector.rb} +3 -3
  48. data/lib/reek/{smells → smell_detectors}/boolean_parameter.rb +3 -3
  49. data/lib/reek/{smells → smell_detectors}/class_variable.rb +3 -3
  50. data/lib/reek/{smells → smell_detectors}/control_parameter.rb +3 -3
  51. data/lib/reek/{smells → smell_detectors}/data_clump.rb +3 -3
  52. data/lib/reek/{smells/smell_repository.rb → smell_detectors/detector_repository.rb} +9 -9
  53. data/lib/reek/{smells → smell_detectors}/duplicate_method_call.rb +3 -3
  54. data/lib/reek/{smells → smell_detectors}/feature_envy.rb +3 -3
  55. data/lib/reek/{smells → smell_detectors}/instance_variable_assumption.rb +3 -3
  56. data/lib/reek/{smells → smell_detectors}/irresponsible_module.rb +3 -3
  57. data/lib/reek/{smells → smell_detectors}/long_parameter_list.rb +3 -3
  58. data/lib/reek/{smells → smell_detectors}/long_yield_list.rb +3 -3
  59. data/lib/reek/{smells → smell_detectors}/manual_dispatch.rb +3 -3
  60. data/lib/reek/{smells → smell_detectors}/module_initialize.rb +3 -3
  61. data/lib/reek/{smells → smell_detectors}/nested_iterators.rb +3 -3
  62. data/lib/reek/{smells → smell_detectors}/nil_check.rb +3 -3
  63. data/lib/reek/{smells → smell_detectors}/prima_donna_method.rb +3 -3
  64. data/lib/reek/{smells → smell_detectors}/repeated_conditional.rb +3 -3
  65. data/lib/reek/{smells → smell_detectors}/smell_configuration.rb +1 -1
  66. data/lib/reek/{smells → smell_detectors}/smell_warning.rb +1 -1
  67. data/lib/reek/{smells → smell_detectors}/subclassed_from_core_class.rb +3 -3
  68. data/lib/reek/{smells → smell_detectors}/too_many_constants.rb +3 -3
  69. data/lib/reek/{smells → smell_detectors}/too_many_instance_variables.rb +3 -3
  70. data/lib/reek/{smells → smell_detectors}/too_many_methods.rb +3 -3
  71. data/lib/reek/{smells → smell_detectors}/too_many_statements.rb +3 -3
  72. data/lib/reek/{smells → smell_detectors}/uncommunicative_method_name.rb +3 -3
  73. data/lib/reek/{smells → smell_detectors}/uncommunicative_module_name.rb +3 -3
  74. data/lib/reek/{smells → smell_detectors}/uncommunicative_parameter_name.rb +3 -3
  75. data/lib/reek/{smells → smell_detectors}/uncommunicative_variable_name.rb +3 -3
  76. data/lib/reek/{smells → smell_detectors}/unused_parameters.rb +3 -3
  77. data/lib/reek/{smells → smell_detectors}/unused_private_method.rb +3 -3
  78. data/lib/reek/{smells → smell_detectors}/utility_function.rb +3 -3
  79. data/lib/reek/spec/should_reek_of.rb +1 -1
  80. data/lib/reek/version.rb +1 -1
  81. data/reek.gemspec +1 -1
  82. data/spec/factories/factories.rb +6 -6
  83. data/spec/reek/cli/command/report_command_spec.rb +3 -1
  84. data/spec/reek/cli/options_spec.rb +12 -2
  85. data/spec/reek/code_comment_spec.rb +18 -6
  86. data/spec/reek/configuration/app_configuration_spec.rb +12 -12
  87. data/spec/reek/configuration/default_directive_spec.rb +1 -1
  88. data/spec/reek/configuration/directory_directives_spec.rb +2 -2
  89. data/spec/reek/examiner_spec.rb +56 -28
  90. data/spec/reek/report/code_climate/code_climate_fingerprint_spec.rb +122 -0
  91. data/spec/reek/report/{code_climate_formatter_spec.rb → code_climate/code_climate_formatter_spec.rb} +6 -2
  92. data/spec/reek/report/{code_climate_report_spec.rb → code_climate/code_climate_report_spec.rb} +7 -5
  93. data/spec/reek/report/{location_formatter_spec.rb → formatter/location_formatter_spec.rb} +4 -4
  94. data/spec/reek/report/formatter/progress_formatter_spec.rb +68 -0
  95. data/spec/reek/report/html_report_spec.rb +1 -1
  96. data/spec/reek/report/json_report_spec.rb +2 -2
  97. data/spec/reek/report/text_report_spec.rb +3 -4
  98. data/spec/reek/report/xml_report_spec.rb +1 -1
  99. data/spec/reek/report/yaml_report_spec.rb +2 -2
  100. data/spec/reek/report_spec.rb +3 -3
  101. data/spec/reek/{smells → smell_detectors}/attribute_spec.rb +2 -2
  102. data/spec/reek/{smells/smell_detector_spec.rb → smell_detectors/base_detector_spec.rb} +5 -5
  103. data/spec/reek/{smells → smell_detectors}/boolean_parameter_spec.rb +2 -2
  104. data/spec/reek/{smells → smell_detectors}/class_variable_spec.rb +2 -2
  105. data/spec/reek/{smells → smell_detectors}/control_parameter_spec.rb +2 -2
  106. data/spec/reek/{smells → smell_detectors}/data_clump_spec.rb +2 -2
  107. data/spec/reek/smell_detectors/detector_repository_spec.rb +22 -0
  108. data/spec/reek/{smells → smell_detectors}/duplicate_method_call_spec.rb +6 -6
  109. data/spec/reek/{smells → smell_detectors}/feature_envy_spec.rb +2 -2
  110. data/spec/reek/{smells → smell_detectors}/instance_variable_assumption_spec.rb +2 -2
  111. data/spec/reek/{smells → smell_detectors}/irresponsible_module_spec.rb +2 -2
  112. data/spec/reek/{smells → smell_detectors}/long_parameter_list_spec.rb +2 -2
  113. data/spec/reek/{smells → smell_detectors}/long_yield_list_spec.rb +2 -2
  114. data/spec/reek/{smells → smell_detectors}/manual_dispatch_spec.rb +2 -2
  115. data/spec/reek/{smells → smell_detectors}/module_initialize_spec.rb +2 -2
  116. data/spec/reek/{smells → smell_detectors}/nested_iterators_spec.rb +4 -4
  117. data/spec/reek/{smells → smell_detectors}/nil_check_spec.rb +2 -2
  118. data/spec/reek/{smells → smell_detectors}/prima_donna_method_spec.rb +2 -2
  119. data/spec/reek/{smells → smell_detectors}/repeated_conditional_spec.rb +2 -2
  120. data/spec/reek/{smells → smell_detectors}/smell_configuration_spec.rb +2 -2
  121. data/spec/reek/{smells → smell_detectors}/smell_warning_spec.rb +3 -3
  122. data/spec/reek/{smells → smell_detectors}/subclassed_from_core_class_spec.rb +2 -2
  123. data/spec/reek/{smells → smell_detectors}/too_many_constants_spec.rb +3 -3
  124. data/spec/reek/{smells → smell_detectors}/too_many_instance_variables_spec.rb +3 -3
  125. data/spec/reek/{smells → smell_detectors}/too_many_methods_spec.rb +3 -3
  126. data/spec/reek/{smells → smell_detectors}/too_many_statements_spec.rb +3 -3
  127. data/spec/reek/{smells → smell_detectors}/uncommunicative_method_name_spec.rb +2 -2
  128. data/spec/reek/{smells → smell_detectors}/uncommunicative_module_name_spec.rb +2 -2
  129. data/spec/reek/{smells → smell_detectors}/uncommunicative_parameter_name_spec.rb +2 -2
  130. data/spec/reek/{smells → smell_detectors}/uncommunicative_variable_name_spec.rb +2 -2
  131. data/spec/reek/{smells → smell_detectors}/unused_parameters_spec.rb +2 -2
  132. data/spec/reek/{smells → smell_detectors}/unused_private_method_spec.rb +4 -4
  133. data/spec/reek/{smells → smell_detectors}/utility_function_spec.rb +3 -3
  134. data/spec/reek/spec/should_reek_of_spec.rb +3 -3
  135. data/tasks/configuration.rake +2 -2
  136. metadata +95 -81
  137. data/features/smells/subclassed_from_core_class.feature +0 -14
  138. data/features/smells/too_many_constants.feature +0 -19
  139. data/lib/reek/errors.rb +0 -32
  140. data/lib/reek/report/location_formatter.rb +0 -39
  141. data/lib/reek/report/report.rb +0 -229
  142. data/lib/reek/smells.rb +0 -30
  143. data/spec/reek/smells/smell_repository_spec.rb +0 -22
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9726cb15a47090a670c986a90860b2ba22826416
4
- data.tar.gz: 61c5759684ec24d5d0e7bd1e4d2e035a5263d25f
3
+ metadata.gz: f44c19009380c9dff7c4d8ef4dcdbe6f788d46b2
4
+ data.tar.gz: b9cfe47dc250a613611f414463a6dbca748690c8
5
5
  SHA512:
6
- metadata.gz: ee0920b75d4b8be3d47940587f97aea414a0eb9faa83b2871d1d8627021c155674e108746a74588357f576b0d2783c59fadb40eae2d1972493eeb873e268b5af
7
- data.tar.gz: 235a55cefe8256fb4d20529f10e1db0c3f4719641cd34c1c8e8d7b20d6c4e86fe07ae541990c92c4f22f838c2fe2476c9ce48b1a7145af2d74c735867d4940b0
6
+ metadata.gz: 221c0dbe79b6a6758a30ded23285fd715634843c3ac9bb0b9883aef9a0ebffcf84531dc6e492f091b2fa11cb7087470c96632aa45b53704da831a0a64feb7c1a
7
+ data.tar.gz: 51c17f02b1aa2c8ff8cf701ba7bc9d98c058a9c4e62fc2b6f246fd43f3be17ed12b6cc58ccb247f99527f909db50c5b4ab7085b08392a4b2c9e26137c8081bb2
@@ -44,7 +44,9 @@ RSpec/ExampleLength:
44
44
  RSpec/MultipleDescribes:
45
45
  Exclude:
46
46
  - 'spec/reek/ast/sexp_extensions_spec.rb'
47
- - 'spec/reek/report/location_formatter_spec.rb'
47
+ - 'spec/reek/code_comment_spec.rb'
48
+ - 'spec/reek/report/formatter/location_formatter_spec.rb'
49
+ - 'spec/reek/report/formatter/progress_formatter_spec.rb'
48
50
 
49
51
  # FIXME: Update specs to avoid offenses
50
52
  RSpec/MultipleExpectations:
@@ -69,6 +71,13 @@ RSpec/VerifiedDoubles:
69
71
  - 'spec/reek/context/method_context_spec.rb'
70
72
  - 'spec/reek/context/module_context_spec.rb'
71
73
 
74
+ # rubocop-rspec expects a CodeClimate namespace to go with the code_climate directory.
75
+ RSpec/FilePath:
76
+ Exclude:
77
+ - 'spec/reek/report/code_climate/code_climate_fingerprint_spec.rb'
78
+ - 'spec/reek/report/code_climate/code_climate_formatter_spec.rb'
79
+ - 'spec/reek/report/code_climate/code_climate_report_spec.rb'
80
+
72
81
  Style/AccessorMethodName:
73
82
  Exclude:
74
83
  - 'lib/reek/context/visibility_tracker.rb'
@@ -1,5 +1,21 @@
1
1
  # Change log
2
2
 
3
+ ## 4.5.0 (2016-10-12)
4
+
5
+ * (maxjacobson) Emit fingerprints in Code Climate reporter
6
+ * (mvz) Disable progress for piped output
7
+ * (mvz) Update progress formatter to match changed file location
8
+ * (jhubert) Add progress formatters for showing progress on each file
9
+
10
+ ## 4.4.4 (2016-09-29)
11
+
12
+ * (troessner) Create a fresh todo file on every run
13
+ * (troessner) Handle garbage in comment config properly
14
+
15
+ ## 4.4.3 (2016-09-24)
16
+
17
+ * (troessner) Improve handling of internal errors in detectors and the corresponding error messages
18
+
3
19
  ## 4.4.2 (2016-09-21)
4
20
 
5
21
  * (troessner) Fail properly on bad configuration comments
@@ -27,7 +27,7 @@ version, Ruby platform (MRI, JRuby, etc.), operating system.
27
27
  Try to provide a minimal example that reproduces the issue.
28
28
  Extra kudos if you can write it as a failing test. :)
29
29
 
30
- ## Contribute features, bugfixes, documentation
30
+ ## Contributing features, bugfixes, documentation
31
31
 
32
32
  ### Getting started
33
33
 
@@ -55,20 +55,21 @@ start contributing.
55
55
  Then start hacking and add new tests which make sure that your new feature works or
56
56
  demonstrate that your fix was needed.
57
57
 
58
- ### Tests
58
+ ### RSpec Specs
59
59
 
60
- Reek is using [Rspec](http://rspec.info/) for unit and functional testing and [cucumber]() for integration tests.
60
+ Reek uses [Rspec](http://rspec.info/) for unit and functional testing.
61
61
 
62
- When it comes to Rspec we're trying to follow [betterspecs](http://betterspecs.org/).
63
- We're not using Rspec's [shared examples](https://www.relishapp.com/rspec/rspec-core/docs/example-groups/shared-examples) because we find
64
- them rather harming than helpful.
65
- You can find an excellent cheat sheet on how to write idiomatic Rspec [here](http://www.rubypigeon.com/posts/rspec-core-cheat-sheet).
62
+ We're trying to follow [betterspecs](http://betterspecs.org/). We're not using
63
+ RSpec's
64
+ [shared examples](https://www.relishapp.com/rspec/rspec-core/docs/example-groups/shared-examples)
65
+ because we find them rather harming than helpful. You can find an excellent
66
+ cheat sheet on how to write idiomatic Rspec
67
+ [here](http://www.rubypigeon.com/posts/rspec-core-cheat-sheet).
66
68
 
67
- **Spec naming conventions**
68
-
69
- We do not use the popular "foo" / "bar" naming when it comes to the question "how to come up with good example names?".
70
- Instead, we use the [military alphabet](https://en.wikipedia.org/wiki/NATO_phonetic_alphabet) in ascending order
71
- which means that we would write this
69
+ We do not use the popular "foo" / "bar" naming when it comes to the question
70
+ "how to come up with good example names?". Instead, we use the
71
+ [military alphabet](https://en.wikipedia.org/wiki/NATO_phonetic_alphabet) in
72
+ ascending order which means that we would write this
72
73
 
73
74
  ```Ruby
74
75
  class Foo
@@ -88,13 +89,43 @@ class Alfa
88
89
  end
89
90
  ```
90
91
 
91
- ### How to write new smell detectors
92
+ ### Cucumber Features
93
+
94
+ Reek uses [Cucumber](https://cucumber.io/) with
95
+ [Aruba](https://github.com/cucumber/aruba) for integration tests. Keep the
96
+ following in mind when writing cucumber features.
97
+
98
+ #### What to test
99
+
100
+ Not everything needs a cucumber feature. We try to limit cucumber features to
101
+ things that really require end-to-end testing of Reek's behavior. In
102
+ particular, this means individual smell detectors should not have their own
103
+ scenarios.
104
+
105
+ #### TTY output checks
106
+
107
+ Some default behaviors of Reek depend on whether the output is a TTY, for
108
+ example output coloring and the progress bar. Because under Aruba stdout is
109
+ *not* a TTY, Reeks default behavior in the scenarios is different in this
110
+ regard than if it were run in a terminal.
111
+
112
+ #### Failing Cucumber Scenarios
113
+
114
+ If there is a failing scenario and you can not figure out why it is failing,
115
+ just run the failing scenario: `bundle exec cucumber
116
+ features/failing_scenario.feature:line`. By doing so Aruba will leave its set
117
+ up in the `tmp/aruba` directory. You can then `cd` into this directory and run
118
+ Reek the same way the cucumber scenario actually ran it. This way you can debug
119
+ scenario failures that can be very opaque sometimes.
120
+
121
+ ### Writing new smell detectors
92
122
 
93
123
  Please see [our separate guide](docs/How-To-Write-New-Detectors.md) for this.
94
124
 
95
- ### Finishing up
125
+ ### Creating your pull request
96
126
 
97
- We care a lot about [good commit messages](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html).
127
+ We care a lot about [good commit
128
+ messages](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html).
98
129
 
99
130
  Once you’re happy with your feature / fix – or want to
100
131
  share it as a work-in-progress and request comments – once
@@ -116,13 +147,14 @@ Then go to your GitHub fork and [make a pull
116
147
  request](https://help.github.com/articles/creating-a-pull-request/)
117
148
  to the original repository.
118
149
 
119
- ## Review and Fixes
150
+ ### Review and Fixes
120
151
 
121
152
  Try to gauge and let us know in the pull request whether what
122
153
  you propose is a backward-compatible bugfix and should go into the
123
154
  next patch release, is a backward-compatible feature and should go
124
155
  into the next minor release, or has to break backward-compatibility
125
- and so needs to wait for the next major release of Reek.
156
+ and so needs to wait for the next major release of Reek. See also our
157
+ versioning policy below.
126
158
 
127
159
  Once your PR is open someone will review it, discuss the details (if
128
160
  needed) and either merge right away or ask for some further fixes.
@@ -142,14 +174,11 @@ git rebase -i master
142
174
  # squash squash squash
143
175
  git push -f origin
144
176
  ```
145
- ## Failing Cucumber Scenarios
146
-
147
- If there is a failing scenario and you can not figure out why it is failing, just run the failing scenario: `bundle exec cucumber features/failing_scenario.feature:line`. By doing so Aruba will leave its set up in the `tmp/aruba` directory. You can then `cd` into this directory and run Reek the same way the cucumber scenario actually ran it. This way you can debug scenario failures that can be very opaque sometimes.
148
177
 
149
178
  ## Versioning policy
150
179
 
151
180
  We are following [semantic versioning](http://semver.org/).
152
181
 
153
- ## Breaking changes
154
-
155
- If you're working on a change that is breaking backwards-compatibility according to our versioning policy from above just go ahead with your pull request like normal. We'll discuss this then in the pull request and help you to point your pull request to the right branch.
182
+ If you're working on a change that is breaking backwards-compatibility
183
+ just go ahead with your pull request like normal. We'll discuss this then in
184
+ the pull request and help you to point your pull request to the right branch.
data/README.md CHANGED
@@ -84,6 +84,9 @@ Reek will report the following code smells in this file:
84
84
 
85
85
  ```
86
86
  $ reek demo.rb
87
+ Inspecting 1 file(s):
88
+ S
89
+
87
90
  demo.rb -- 2 warnings:
88
91
  [4]:UncommunicativeMethodName: Smelly#x has the name 'x' [https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Method-Name.md]
89
92
  [5]:UncommunicativeVariableName: Smelly#x has the variable name 'y' [https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Variable-Name.md]
@@ -404,13 +407,23 @@ via:
404
407
  reek -c whatever/.todo.reek lib/
405
408
  ```
406
409
 
407
- Note that if you re-run
410
+ It's important to understand that the number one use case of the `--todo` flag
411
+ is to be run once at the beginning of the introduction of Reek to ease the transition.
412
+ If you find yourself re-running Reek with the `--todo` flag in order to silence new warnings
413
+ you're defeating the purpose of both the `--todo` flag and of Reek itself.
414
+
415
+ As a consequence, running Reek with the `--todo` flag again will overwrite '.todo.reek' without
416
+ asking (should not be a problem since this file is supposed to be versioned) and
417
+ without taking **any** other configuration file you might have into account.
418
+
419
+ This means that when you run
408
420
 
409
421
  ```Bash
410
- reek --todo lib/
422
+ reek -c other_configuration.reek --todo lib/
411
423
  ```
412
424
 
413
- '.todo.reek' will get overwritten with a possibly updated configuration.
425
+ `other_configuration.reek` will simply be ignored (as outlined before, Reek
426
+ is supposed to have one configuration file and one file only).
414
427
 
415
428
  ## Usage
416
429
 
@@ -1,5 +1,5 @@
1
1
  require 'reek'
2
- require 'reek/smells'
2
+ require 'reek/smell_detectors'
3
3
 
4
4
  # Ataru setup module.
5
5
  module Setup
@@ -55,9 +55,6 @@ Note that `Reek::Examiner.new` can take `source` as `String`, `Pathname`, `File`
55
55
  Everything that is mentioned in this document can be considered stable in the
56
56
  sense that it will only change across major versions.
57
57
 
58
- `Reek 3` was the first major version with a stable API. As soon as `Reek 4`
59
- is released we will mark the differences between `3` and `4`.
60
-
61
58
  There is one thing in this API documentation you can't and shouldn't rely on:
62
59
  The `SmellWarning` messages itself.
63
60
 
@@ -147,7 +144,7 @@ Instead of the smell detector names you can also use the full detector class in
147
144
  your configuration hash, for example:
148
145
 
149
146
  ```ruby
150
- config_hash = { Reek::Smells::IrresponsibleModule => { 'enabled' => false } }
147
+ config_hash = { Reek::SmellDetectors::IrresponsibleModule => { 'enabled' => false } }
151
148
  ```
152
149
 
153
150
  Of course, directory specific configuration and excluded paths are supported as
@@ -40,9 +40,9 @@
40
40
  Examiner (core/examiner) --------------------------------------
41
41
  * generates the AST out of the given source
42
42
  * adorns the generated AST via a TreeDresser (core/tree_dresser)
43
- * initializes a SmellRepository with all relevant smells (smells/smell_repository)
43
+ * initializes a DetectorRepository with all relevant smells (smells/detector_repository)
44
44
  * builds a tree of Contexts using ContextBuilder
45
- * tells the SmellRepository above to run each of its smell detectors above on each of the contexts
45
+ * tells the DetectorRepository above to run each of its smell detectors above on each of the contexts
46
46
  / | \
47
47
  / | \
48
48
  / | \
@@ -50,7 +50,7 @@
50
50
  \ | /
51
51
  \ | /
52
52
  \ | /
53
- SmellRepository
53
+ DetectorRepository
54
54
  |
55
55
  |
56
56
  |
@@ -66,7 +66,7 @@ The overall workflow is like this:
66
66
  |
67
67
  |
68
68
  |
69
- Initialize SmellRepository only with eligible smells
69
+ Initialize DetectorRepository only with eligible SmellDetectors
70
70
  |
71
71
  |
72
72
  |
@@ -111,4 +111,4 @@ The overall workflow is like this:
111
111
  |
112
112
  |
113
113
  A ContextBuilder then traverses this now adorned tree again and
114
- runs all SmellDetectors from the SmellRepository above
114
+ runs all SmellDetectors from the DetectorRepository above
@@ -10,3 +10,10 @@ We use instance vars only:
10
10
  For everything else we use proper getters / setters.
11
11
 
12
12
  If possible those should be private.
13
+
14
+ ## Data types
15
+
16
+ - Class or module names that are carried around in hashes and configuration and what
17
+ not should be designated by constants. So `DuplicateMethodCall`, not `:DuplicateMethodCall` or `"DuplicateMethodCall"`
18
+ - Hash keys should be all symbols unless they designate classes / modules - see above.
19
+ - Everything else like messages or parameters in smell warnings should be strings, nothing else.
@@ -61,6 +61,7 @@ Feature: Reek can be controlled using command-line options
61
61
  -U, --[no-]wiki-links Show link to related wiki page for each smell (default: true)
62
62
  -n, --[no-]line-numbers Show line numbers in the output (default: true)
63
63
  -s, --single-line Show location in editor-compatible single-line-per-smell format
64
+ -P, --[no-]progress Show progress of each source as it is examined (default: true)
64
65
  --sort-by SORTING Sort reported files by the given criterium:
65
66
  smelliness ("smelliest" files first)
66
67
  none (default - output in processing order)
@@ -0,0 +1,33 @@
1
+ Feature: Show progress
2
+ In order to see the progress of the examiners
3
+ As a developer
4
+ I want to be able to selectively activate progress reporting
5
+
6
+ # Note that --progress is the default on TTYs, but needs to be explicitely
7
+ # enabled here because output in the cucumber scenarios does not go to a TTY.
8
+ Scenario: shows progress output on mixed files by default
9
+ Given a directory called 'mixed_files' containing some clean and smelly files
10
+ When I run reek --progress mixed_files
11
+ Then the exit status indicates smells
12
+ And it reports:
13
+ """
14
+ Inspecting 2 file(s):
15
+ .S
16
+
17
+ mixed_files/dirty.rb -- 2 warnings:
18
+ [4]:UncommunicativeMethodName: Smelly#x has the name 'x' [https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Method-Name.md]
19
+ [5]:UncommunicativeVariableName: Smelly#x has the variable name 'y' [https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Variable-Name.md]
20
+ 2 total warnings
21
+ """
22
+
23
+ Scenario: --no-progress disables progress output
24
+ Given a directory called 'mixed_files' containing some clean and smelly files
25
+ When I run reek --no-progress mixed_files
26
+ Then the exit status indicates smells
27
+ And it reports:
28
+ """
29
+ mixed_files/dirty.rb -- 2 warnings:
30
+ [4]:UncommunicativeMethodName: Smelly#x has the name 'x' [https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Method-Name.md]
31
+ [5]:UncommunicativeVariableName: Smelly#x has the variable name 'y' [https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Variable-Name.md]
32
+ 2 total warnings
33
+ """
@@ -52,7 +52,6 @@ Feature: Masking smells using config files
52
52
  [5]:UncommunicativeVariableName: Smelly#x has the variable name 'y' [https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Variable-Name.md]
53
53
  """
54
54
 
55
-
56
55
  Scenario: Disable UtilityFunction for non-public methods
57
56
  Given the smelly file 'smelly_with_modifiers.rb'
58
57
  And a configuration file 'non_public_modifiers_mask.reek'
@@ -8,18 +8,18 @@ Feature: Erroneous source comments are handled properly
8
8
  re-run Reek.
9
9
 
10
10
  Scenario: Unknown smell detector
11
- Given a file named "bad_detector.rb" with:
11
+ Given a file named "bad_comment.rb" with:
12
12
  """
13
13
  # Test class
14
14
  # :reek:UnknownDetectorName
15
15
  def x
16
16
  end
17
17
  """
18
- When I run reek bad_detector.rb
18
+ When I run reek bad_comment.rb
19
19
  Then it reports the error "Error: You are trying to configure an unknown smell detector 'UnknownDetectorName'"
20
20
 
21
21
  Scenario: One good file, one bad file
22
- Given a file named "bad_detector.rb" with:
22
+ Given a file named "bad_comment.rb" with:
23
23
  """
24
24
  # Test class
25
25
  # :reek:UnknownDetectorName
@@ -27,7 +27,7 @@ Feature: Erroneous source comments are handled properly
27
27
  end
28
28
  """
29
29
  Given the smelly file 'smelly.rb'
30
- When I run reek bad_detector.rb smelly.rb
30
+ When I run reek bad_comment.rb smelly.rb
31
31
  Then it reports the error "Error: You are trying to configure an unknown smell detector 'UnknownDetectorName'"
32
32
  And the exit status indicates smells
33
33
  And it reports:
@@ -37,3 +37,17 @@ Feature: Erroneous source comments are handled properly
37
37
  [5]:UncommunicativeVariableName: Smelly#x has the variable name 'y' [https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Variable-Name.md]
38
38
  2 total warnings
39
39
  """
40
+
41
+ Scenario: Garbage as content
42
+ Given a file named "bad_comment.rb" with:
43
+ """
44
+ # Test class
45
+ # :reek:UncommunicativeMethodName { thats: a: bad: config }
46
+ def x
47
+ end
48
+ """
49
+ When I run reek bad_comment.rb
50
+ Then it reports the error "Error: You are trying to configure the smell detector 'UncommunicativeMethodName'"
51
+ And it reports the error "Unfortunately we can not parse the configuration you have given."
52
+ And it reports the error "The source is 'bad_comment.rb'"
53
+ And it reports the error "the comment belongs to the expression starting in line 3"
@@ -0,0 +1,116 @@
1
+ Feature: Well formed source comments are handled properly
2
+ As a developer I want to be able to have a fine-grained control
3
+ over how Reek handles smells via source code comments.
4
+
5
+ Scenario: Disable smell detector implicitly
6
+ Given a file named "disable_detector_implicitly.rb" with:
7
+ """
8
+ # Test class
9
+ # :reek:TooManyInstanceVariables
10
+ class Alfa
11
+ def initialize
12
+ @charlie = @delta = @echo = @foxtrot = @hotel = 1
13
+ end
14
+ end
15
+ """
16
+ When I run reek disable_detector_implicitly.rb
17
+ Then it succeeds
18
+ And it reports nothing
19
+
20
+ Scenario: Disable smell detector explicitly
21
+ Given a file named "disable_detector_explicitly.rb" with:
22
+ """
23
+ # Test class
24
+ # :reek:TooManyInstanceVariables { enabled: false }
25
+ class Alfa
26
+ def initialize
27
+ @charlie = @delta = @echo = @foxtrot = @hotel = 1
28
+ end
29
+ end
30
+ """
31
+ When I run reek disable_detector_explicitly.rb
32
+ Then it succeeds
33
+ And it reports nothing
34
+
35
+ Scenario: Enable smell detector explicitly
36
+ Given a file named "enable_detector_explicitly.rb" with:
37
+ """
38
+ # Test class
39
+ # :reek:TooManyInstanceVariables { enabled: true }
40
+ class Alfa
41
+ def initialize
42
+ @charlie = @delta = @echo = @foxtrot = @hotel = 1
43
+ end
44
+ end
45
+ """
46
+ When I run reek enable_detector_explicitly.rb
47
+ Then the exit status indicates smells
48
+ And it reports:
49
+ """
50
+ enable_detector_explicitly.rb -- 1 warning:
51
+ [3]:TooManyInstanceVariables: Alfa has at least 5 instance variables [https://github.com/troessner/reek/blob/master/docs/Too-Many-Instance-Variables.md]
52
+ """
53
+
54
+ Scenario: Configure smell detector with the basic exclude option as string
55
+ Given a file named "configure_exclude_option.rb" with:
56
+ """
57
+ # Test class
58
+ # :reek:TooManyInstanceVariables { exclude: '@hotel' }
59
+ class Alfa
60
+ def initialize
61
+ @charlie = @delta = @echo = @foxtrot = @hotel = 1
62
+ end
63
+ end
64
+ """
65
+ When I run reek configure_exclude_option.rb
66
+ Then it succeeds
67
+ And it reports nothing
68
+
69
+ Scenario: Configure smell detector with the basic exclude option as regex
70
+ Given a file named "configure_exclude_option.rb" with:
71
+ """
72
+ # Test class
73
+ # :reek:TooManyInstanceVariables { exclude: /hotel/ }
74
+ class Alfa
75
+ def initialize
76
+ @charlie = @delta = @echo = @foxtrot = @hotel = 1
77
+ end
78
+ end
79
+ """
80
+ When I run reek configure_exclude_option.rb
81
+ Then it succeeds
82
+ And it reports nothing
83
+
84
+ Scenario: Configure smell detector with a detector specific option that silences it
85
+ Given a file named "configure_detector_specific_option.rb" with:
86
+ """
87
+ # Test class
88
+ # :reek:TooManyInstanceVariables { max_instance_variables: 5 }
89
+ class Alfa
90
+ def initialize
91
+ @charlie = @delta = @echo = @foxtrot = @hotel = 1
92
+ end
93
+ end
94
+ """
95
+ When I run reek configure_detector_specific_option.rb
96
+ Then it succeeds
97
+ And it reports nothing
98
+
99
+ Scenario: Configure smell detector with a detector specific option that makes it report again
100
+ Given a file named "configure_detector_specific_option.rb" with:
101
+ """
102
+ # Test class
103
+ # :reek:TooManyInstanceVariables { max_instance_variables: 2 }
104
+ class Alfa
105
+ def initialize
106
+ @charlie = @delta = @echo = 1
107
+ end
108
+ end
109
+ """
110
+ When I run reek configure_detector_specific_option.rb
111
+ Then the exit status indicates smells
112
+ And it reports:
113
+ """
114
+ configure_detector_specific_option.rb -- 1 warning:
115
+ [3]:TooManyInstanceVariables: Alfa has at least 3 instance variables [https://github.com/troessner/reek/blob/master/docs/Too-Many-Instance-Variables.md]
116
+ """