reek 4.7.3 → 5.0.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 (248) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +17 -12
  3. data/.rubocop.yml +18 -3
  4. data/.simplecov +1 -0
  5. data/.travis.yml +3 -4
  6. data/.yardopts +1 -1
  7. data/CHANGELOG.md +45 -0
  8. data/Gemfile +4 -4
  9. data/README.md +134 -104
  10. data/Rakefile +16 -3
  11. data/bin/reek +1 -3
  12. data/docs/API.md +2 -9
  13. data/docs/Basic-Smell-Options.md +51 -11
  14. data/docs/Code-Smells.md +1 -1
  15. data/docs/Command-Line-Options.md +14 -4
  16. data/docs/Duplicate-Method-Call.md +49 -1
  17. data/docs/Feature-Envy.md +44 -0
  18. data/docs/How-To-Write-New-Detectors.md +2 -3
  19. data/docs/Instance-Variable-Assumption.md +1 -1
  20. data/docs/{Prima-Donna-Method.md → Missing-Safe-Method.md} +11 -9
  21. data/docs/Rake-Task.md +1 -1
  22. data/docs/Reek-4-to-Reek-5-migration.md +193 -0
  23. data/docs/Reek-Driven-Development.md +1 -1
  24. data/docs/Uncommunicative-Method-Name.md +45 -6
  25. data/docs/Uncommunicative-Module-Name.md +49 -7
  26. data/docs/Uncommunicative-Parameter-Name.md +43 -5
  27. data/docs/Uncommunicative-Variable-Name.md +73 -2
  28. data/docs/Unused-Private-Method.md +2 -2
  29. data/docs/defaults.reek.yml +129 -0
  30. data/docs/yard_plugin.rb +1 -0
  31. data/features/command_line_interface/basic_usage.feature +2 -2
  32. data/features/command_line_interface/options.feature +46 -4
  33. data/features/command_line_interface/show_progress.feature +4 -4
  34. data/features/command_line_interface/smell_selection.feature +1 -1
  35. data/features/command_line_interface/smells_count.feature +6 -6
  36. data/features/command_line_interface/stdin.feature +30 -8
  37. data/features/configuration_files/accept_setting.feature +45 -28
  38. data/features/configuration_files/directory_specific_directives.feature +78 -73
  39. data/features/configuration_files/exclude_directives.feature +11 -10
  40. data/features/configuration_files/exclude_paths_directives.feature +4 -4
  41. data/features/configuration_files/masking_smells.feature +38 -9
  42. data/features/configuration_files/mix_accept_reject_setting.feature +31 -28
  43. data/features/configuration_files/reject_setting.feature +52 -41
  44. data/features/configuration_files/schema_validation.feature +59 -0
  45. data/features/configuration_files/unused_private_method.feature +18 -16
  46. data/features/configuration_loading.feature +53 -10
  47. data/features/configuration_via_source_comments/erroneous_source_comments.feature +2 -2
  48. data/features/configuration_via_source_comments/well_formed_source_comments.feature +2 -2
  49. data/features/locales.feature +2 -2
  50. data/features/rake_task/rake_task.feature +15 -15
  51. data/features/reports/json.feature +3 -3
  52. data/features/reports/reports.feature +34 -34
  53. data/features/reports/yaml.feature +3 -3
  54. data/features/rspec_matcher.feature +9 -1
  55. data/features/samples.feature +287 -287
  56. data/features/step_definitions/reek_steps.rb +4 -0
  57. data/features/step_definitions/sample_file_steps.rb +9 -4
  58. data/features/support/env.rb +2 -2
  59. data/features/todo_list.feature +26 -23
  60. data/lib/reek/ast/node.rb +40 -55
  61. data/lib/reek/ast/object_refs.rb +1 -1
  62. data/lib/reek/ast/reference_collector.rb +2 -4
  63. data/lib/reek/ast/sexp_extensions/case.rb +1 -1
  64. data/lib/reek/ast/sexp_extensions/if.rb +8 -1
  65. data/lib/reek/ast/sexp_extensions/logical_operators.rb +1 -1
  66. data/lib/reek/ast/sexp_extensions/methods.rb +4 -6
  67. data/lib/reek/cli/application.rb +4 -3
  68. data/lib/reek/cli/command/report_command.rb +1 -2
  69. data/lib/reek/cli/command/todo_list_command.rb +8 -8
  70. data/lib/reek/cli/options.rb +29 -14
  71. data/lib/reek/cli/silencer.rb +14 -3
  72. data/lib/reek/code_comment.rb +14 -16
  73. data/lib/reek/configuration/app_configuration.rb +32 -28
  74. data/lib/reek/configuration/configuration_converter.rb +110 -0
  75. data/lib/reek/configuration/configuration_file_finder.rb +15 -40
  76. data/lib/reek/configuration/configuration_validator.rb +12 -23
  77. data/lib/reek/configuration/default_directive.rb +17 -3
  78. data/lib/reek/configuration/directory_directives.rb +17 -11
  79. data/lib/reek/configuration/excluded_paths.rb +1 -1
  80. data/lib/reek/configuration/rake_task_converter.rb +29 -0
  81. data/lib/reek/configuration/schema.yml +210 -0
  82. data/lib/reek/configuration/schema_validator.rb +38 -0
  83. data/lib/reek/context/attribute_context.rb +1 -1
  84. data/lib/reek/context/code_context.rb +8 -11
  85. data/lib/reek/context/method_context.rb +7 -12
  86. data/lib/reek/context/module_context.rb +4 -4
  87. data/lib/reek/context_builder.rb +11 -11
  88. data/lib/reek/detector_repository.rb +6 -0
  89. data/lib/reek/documentation_link.rb +28 -0
  90. data/lib/reek/errors/bad_detector_configuration_key_in_comment_error.rb +13 -12
  91. data/lib/reek/errors/bad_detector_in_comment_error.rb +11 -10
  92. data/lib/reek/errors/base_error.rb +3 -0
  93. data/lib/reek/errors/config_file_error.rb +11 -0
  94. data/lib/reek/errors/encoding_error.rb +16 -11
  95. data/lib/reek/errors/garbage_detector_configuration_in_comment_error.rb +11 -10
  96. data/lib/reek/errors/incomprehensible_source_error.rb +20 -22
  97. data/lib/reek/errors/syntax_error.rb +41 -0
  98. data/lib/reek/examiner.rb +19 -25
  99. data/lib/reek/logging_error_handler.rb +7 -5
  100. data/lib/reek/rake/task.rb +3 -3
  101. data/lib/reek/report/base_report.rb +8 -12
  102. data/lib/reek/report/code_climate/code_climate_configuration.rb +1 -1
  103. data/lib/reek/report/code_climate/code_climate_configuration.yml +6 -10
  104. data/lib/reek/report/documentation_link_warning_formatter.rb +17 -0
  105. data/lib/reek/report/heading_formatter.rb +54 -0
  106. data/lib/reek/report/json_report.rb +1 -1
  107. data/lib/reek/report/location_formatter.rb +40 -0
  108. data/lib/reek/report/progress_formatter.rb +79 -0
  109. data/lib/reek/report/simple_warning_formatter.rb +34 -0
  110. data/lib/reek/report/text_report.rb +1 -2
  111. data/lib/reek/report/xml_report.rb +3 -3
  112. data/lib/reek/report/yaml_report.rb +1 -1
  113. data/lib/reek/report.rb +15 -10
  114. data/lib/reek/smell_configuration.rb +2 -2
  115. data/lib/reek/smell_detectors/attribute.rb +0 -1
  116. data/lib/reek/smell_detectors/base_detector.rb +9 -12
  117. data/lib/reek/smell_detectors/boolean_parameter.rb +0 -1
  118. data/lib/reek/smell_detectors/class_variable.rb +3 -11
  119. data/lib/reek/smell_detectors/control_parameter.rb +17 -32
  120. data/lib/reek/smell_detectors/data_clump.rb +3 -4
  121. data/lib/reek/smell_detectors/duplicate_method_call.rb +6 -7
  122. data/lib/reek/smell_detectors/feature_envy.rb +1 -1
  123. data/lib/reek/smell_detectors/instance_variable_assumption.rb +1 -10
  124. data/lib/reek/smell_detectors/irresponsible_module.rb +0 -1
  125. data/lib/reek/smell_detectors/long_parameter_list.rb +1 -2
  126. data/lib/reek/smell_detectors/long_yield_list.rb +2 -3
  127. data/lib/reek/smell_detectors/manual_dispatch.rb +3 -3
  128. data/lib/reek/smell_detectors/{prima_donna_method.rb → missing_safe_method.rb} +6 -7
  129. data/lib/reek/smell_detectors/module_initialize.rb +1 -2
  130. data/lib/reek/smell_detectors/nested_iterators.rb +6 -6
  131. data/lib/reek/smell_detectors/nil_check.rb +0 -1
  132. data/lib/reek/smell_detectors/repeated_conditional.rb +3 -4
  133. data/lib/reek/smell_detectors/subclassed_from_core_class.rb +0 -1
  134. data/lib/reek/smell_detectors/too_many_constants.rb +2 -3
  135. data/lib/reek/smell_detectors/too_many_instance_variables.rb +1 -2
  136. data/lib/reek/smell_detectors/too_many_methods.rb +1 -2
  137. data/lib/reek/smell_detectors/too_many_statements.rb +1 -2
  138. data/lib/reek/smell_detectors/uncommunicative_method_name.rb +2 -3
  139. data/lib/reek/smell_detectors/uncommunicative_module_name.rb +2 -3
  140. data/lib/reek/smell_detectors/uncommunicative_parameter_name.rb +2 -3
  141. data/lib/reek/smell_detectors/uncommunicative_variable_name.rb +6 -7
  142. data/lib/reek/smell_detectors/unused_parameters.rb +0 -1
  143. data/lib/reek/smell_detectors/unused_private_method.rb +0 -1
  144. data/lib/reek/smell_detectors/utility_function.rb +2 -3
  145. data/lib/reek/smell_detectors.rb +1 -2
  146. data/lib/reek/smell_warning.rb +15 -8
  147. data/lib/reek/source/source_code.rb +50 -72
  148. data/lib/reek/source/source_locator.rb +7 -7
  149. data/lib/reek/spec/should_reek.rb +2 -2
  150. data/lib/reek/spec/should_reek_of.rb +9 -16
  151. data/lib/reek/spec/should_reek_only_of.rb +4 -4
  152. data/lib/reek/spec.rb +6 -6
  153. data/lib/reek/tree_dresser.rb +5 -5
  154. data/lib/reek/version.rb +1 -1
  155. data/reek.gemspec +5 -5
  156. data/samples/checkstyle.xml +1 -1
  157. data/samples/configuration/accepts_rejects_and_excludes_for_detectors.reek.yml +29 -0
  158. data/samples/configuration/accepts_rejects_and_excludes_for_directory_directives.reek.yml +30 -0
  159. data/samples/configuration/full_configuration.reek +8 -4
  160. data/samples/configuration/full_mask.reek +5 -4
  161. data/samples/configuration/partial_mask.reek +3 -2
  162. data/samples/configuration/regular_configuration/.reek.yml +4 -0
  163. data/samples/paths.rb +5 -4
  164. data/samples/source_with_hidden_directories/.hidden/hidden.rb +1 -0
  165. data/samples/source_with_hidden_directories/not_hidden.rb +1 -0
  166. data/spec/factories/factories.rb +2 -13
  167. data/spec/reek/ast/node_spec.rb +103 -10
  168. data/spec/reek/ast/reference_collector_spec.rb +1 -1
  169. data/spec/reek/ast/sexp_extensions_spec.rb +2 -2
  170. data/spec/reek/cli/application_spec.rb +50 -38
  171. data/spec/reek/cli/command/todo_list_command_spec.rb +6 -4
  172. data/spec/reek/cli/silencer_spec.rb +28 -0
  173. data/spec/reek/code_comment_spec.rb +31 -38
  174. data/spec/reek/configuration/app_configuration_spec.rb +46 -33
  175. data/spec/reek/configuration/configuration_file_finder_spec.rb +133 -49
  176. data/spec/reek/configuration/default_directive_spec.rb +1 -1
  177. data/spec/reek/configuration/directory_directives_spec.rb +6 -7
  178. data/spec/reek/configuration/excluded_paths_spec.rb +6 -6
  179. data/spec/reek/configuration/rake_task_converter_spec.rb +33 -0
  180. data/spec/reek/configuration/schema_validator_spec.rb +165 -0
  181. data/spec/reek/context/code_context_spec.rb +60 -96
  182. data/spec/reek/context/ghost_context_spec.rb +1 -1
  183. data/spec/reek/context/root_context_spec.rb +1 -1
  184. data/spec/reek/documentation_link_spec.rb +20 -0
  185. data/spec/reek/errors/base_error_spec.rb +13 -0
  186. data/spec/reek/examiner_spec.rb +100 -30
  187. data/spec/reek/report/code_climate/code_climate_fingerprint_spec.rb +82 -80
  188. data/spec/reek/report/code_climate/code_climate_formatter_spec.rb +6 -6
  189. data/spec/reek/report/json_report_spec.rb +13 -46
  190. data/spec/reek/report/{formatter/location_formatter_spec.rb → location_formatter_spec.rb} +5 -5
  191. data/spec/reek/report/{formatter/progress_formatter_spec.rb → progress_formatter_spec.rb} +4 -4
  192. data/spec/reek/report/text_report_spec.rb +4 -4
  193. data/spec/reek/report/xml_report_spec.rb +3 -3
  194. data/spec/reek/report/yaml_report_spec.rb +9 -38
  195. data/spec/reek/report_spec.rb +3 -3
  196. data/spec/reek/smell_detectors/boolean_parameter_spec.rb +2 -2
  197. data/spec/reek/smell_detectors/class_variable_spec.rb +26 -32
  198. data/spec/reek/smell_detectors/control_parameter_spec.rb +34 -4
  199. data/spec/reek/smell_detectors/duplicate_method_call_spec.rb +3 -3
  200. data/spec/reek/smell_detectors/feature_envy_spec.rb +47 -2
  201. data/spec/reek/smell_detectors/{prima_donna_method_spec.rb → missing_safe_method_spec.rb} +9 -9
  202. data/spec/reek/smell_detectors/module_initialize_spec.rb +14 -0
  203. data/spec/reek/smell_detectors/nested_iterators_spec.rb +1 -1
  204. data/spec/reek/smell_detectors/too_many_constants_spec.rb +3 -3
  205. data/spec/reek/smell_detectors/too_many_instance_variables_spec.rb +1 -1
  206. data/spec/reek/smell_detectors/uncommunicative_method_name_spec.rb +6 -6
  207. data/spec/reek/smell_detectors/uncommunicative_module_name_spec.rb +6 -4
  208. data/spec/reek/smell_detectors/uncommunicative_parameter_name_spec.rb +6 -4
  209. data/spec/reek/smell_detectors/uncommunicative_variable_name_spec.rb +9 -9
  210. data/spec/reek/smell_detectors/unused_parameters_spec.rb +3 -3
  211. data/spec/reek/smell_detectors/unused_private_method_spec.rb +10 -10
  212. data/spec/reek/smell_detectors/utility_function_spec.rb +5 -5
  213. data/spec/reek/smell_warning_spec.rb +12 -8
  214. data/spec/reek/source/source_code_spec.rb +17 -43
  215. data/spec/reek/source/source_locator_spec.rb +17 -17
  216. data/spec/reek/spec/should_reek_of_spec.rb +7 -11
  217. data/spec/reek/spec/should_reek_only_of_spec.rb +2 -2
  218. data/spec/reek/spec/should_reek_spec.rb +3 -3
  219. data/spec/reek/spec/smell_matcher_spec.rb +3 -3
  220. data/spec/reek/tree_dresser_spec.rb +12 -17
  221. data/spec/spec_helper.rb +6 -17
  222. data/tasks/configuration.rake +8 -5
  223. metadata +71 -41
  224. data/defaults.reek +0 -131
  225. data/features/configuration_files/warn_about_multiple_configuration_files.feature +0 -44
  226. data/lib/reek/report/formatter/heading_formatter.rb +0 -52
  227. data/lib/reek/report/formatter/location_formatter.rb +0 -42
  228. data/lib/reek/report/formatter/progress_formatter.rb +0 -81
  229. data/lib/reek/report/formatter/simple_warning_formatter.rb +0 -35
  230. data/lib/reek/report/formatter/wiki_link_warning_formatter.rb +0 -36
  231. data/lib/reek/report/formatter.rb +0 -33
  232. data/lib/reek/smell_detectors/syntax.rb +0 -37
  233. data/samples/configuration/non_public_modifiers_mask.reek +0 -3
  234. data/samples/smelly_with_inline_mask.rb +0 -8
  235. data/samples/smelly_with_modifiers.rb +0 -12
  236. data/samples/source_with_hidden_directories/.hidden/uncommunicative_method_name.rb +0 -5
  237. data/samples/source_with_non_ruby_files/uncommunicative_parameter_name.rb +0 -6
  238. data/spec/reek/smell_detectors/syntax_spec.rb +0 -17
  239. /data/{samples/configuration/more_than_one_configuration_file/regular.reek → .reek.yml} +0 -0
  240. /data/samples/{clean.rb → clean_source/clean.rb} +0 -0
  241. /data/samples/{exceptions.reek → configuration/home/home.reek.yml} +0 -0
  242. /data/samples/configuration/{more_than_one_configuration_file/todo.reek → regular_configuration/empty_sub_directory/.gitignore} +0 -0
  243. /data/samples/{configuration/single_configuration_file/.reek → no_config_file/.keep} +0 -0
  244. /data/samples/{inline.rb → smelly_source/inline.rb} +0 -0
  245. /data/samples/{optparse.rb → smelly_source/optparse.rb} +0 -0
  246. /data/samples/{redcloth.rb → smelly_source/redcloth.rb} +0 -0
  247. /data/samples/{smelly.rb → smelly_source/smelly.rb} +0 -0
  248. /data/samples/{source_with_hidden_directories/uncommunicative_parameter_name.rb → source_with_non_ruby_files/ruby.rb} +0 -0
data/defaults.reek DELETED
@@ -1,131 +0,0 @@
1
- ---
2
- Attribute:
3
- enabled: true
4
- exclude: []
5
- BooleanParameter:
6
- enabled: true
7
- exclude: []
8
- ClassVariable:
9
- enabled: true
10
- exclude: []
11
- ControlParameter:
12
- enabled: true
13
- exclude: []
14
- DataClump:
15
- enabled: true
16
- exclude: []
17
- max_copies: 2
18
- min_clump_size: 2
19
- DuplicateMethodCall:
20
- enabled: true
21
- exclude: []
22
- max_calls: 1
23
- allow_calls: []
24
- FeatureEnvy:
25
- enabled: true
26
- exclude: []
27
- InstanceVariableAssumption:
28
- enabled: true
29
- exclude: []
30
- IrresponsibleModule:
31
- enabled: true
32
- exclude: []
33
- LongParameterList:
34
- enabled: true
35
- exclude: []
36
- max_params: 3
37
- overrides:
38
- initialize:
39
- max_params: 5
40
- LongYieldList:
41
- enabled: true
42
- exclude: []
43
- max_params: 3
44
- ManualDispatch:
45
- enabled: true
46
- exclude: []
47
- ModuleInitialize:
48
- enabled: true
49
- exclude: []
50
- NestedIterators:
51
- enabled: true
52
- exclude: []
53
- max_allowed_nesting: 1
54
- ignore_iterators:
55
- - tap
56
- NilCheck:
57
- enabled: true
58
- exclude: []
59
- PrimaDonnaMethod:
60
- enabled: true
61
- exclude: []
62
- RepeatedConditional:
63
- enabled: true
64
- exclude: []
65
- max_ifs: 2
66
- SubclassedFromCoreClass:
67
- enabled: true
68
- exclude: []
69
- Syntax:
70
- enabled: true
71
- exclude: []
72
- TooManyConstants:
73
- enabled: true
74
- exclude: []
75
- max_constants: 5
76
- TooManyInstanceVariables:
77
- enabled: true
78
- exclude: []
79
- max_instance_variables: 4
80
- TooManyMethods:
81
- enabled: true
82
- exclude: []
83
- max_methods: 15
84
- TooManyStatements:
85
- enabled: true
86
- exclude:
87
- - initialize
88
- max_statements: 5
89
- UncommunicativeMethodName:
90
- enabled: true
91
- exclude: []
92
- reject:
93
- - !ruby/regexp /^[a-z]$/
94
- - !ruby/regexp /[0-9]$/
95
- - !ruby/regexp /[A-Z]/
96
- accept: []
97
- UncommunicativeModuleName:
98
- enabled: true
99
- exclude: []
100
- reject:
101
- - !ruby/regexp /^.$/
102
- - !ruby/regexp /[0-9]$/
103
- accept: []
104
- UncommunicativeParameterName:
105
- enabled: true
106
- exclude: []
107
- reject:
108
- - !ruby/regexp /^.$/
109
- - !ruby/regexp /[0-9]$/
110
- - !ruby/regexp /[A-Z]/
111
- - !ruby/regexp /^_/
112
- accept: []
113
- UncommunicativeVariableName:
114
- enabled: true
115
- exclude: []
116
- reject:
117
- - !ruby/regexp /^.$/
118
- - !ruby/regexp /[0-9]$/
119
- - !ruby/regexp /[A-Z]/
120
- accept:
121
- - !ruby/regexp /^_$/
122
- UnusedParameters:
123
- enabled: true
124
- exclude: []
125
- UnusedPrivateMethod:
126
- enabled: false
127
- exclude: []
128
- UtilityFunction:
129
- enabled: true
130
- exclude: []
131
- public_methods_only: false
@@ -1,44 +0,0 @@
1
- Feature: Warn on multiple configuration files
2
- Reek is designed for one configuration file and for one configuration file only.
3
- We should make this clear to the user by warning him when we detect multiple
4
- configuration files and then exiting the program.
5
-
6
- Scenario: Warn on more than one configuration file
7
- Given the smelly file 'smelly.rb'
8
- And a file named "config.reek" with:
9
- """
10
- ---
11
- UncommunicativeMethodName:
12
- enabled: false
13
- """
14
- And a file named ".todo.reek" with:
15
- """
16
- ---
17
- UtilityFunction:
18
- enabled: false
19
- """
20
- When I run reek smelly.rb
21
- Then it reports the error "Error: Found multiple configuration files '.todo.reek', 'config.reek'"
22
- And it reports the error "Reek supports only one configuration file. You have 2 options now:"
23
- And it reports the error "1) Remove all offending files"
24
- And it reports the error "2) Be specific about which one you want to load via the -c switch"
25
- And the exit status indicates an error
26
-
27
- Scenario: Do not warn on more than one when we explicitly specify one configuration file
28
- Given the smelly file 'smelly.rb'
29
- And a file named "config.reek" with:
30
- """
31
- ---
32
- UncommunicativeMethodName:
33
- enabled: false
34
- """
35
- And a file named ".todo.reek" with:
36
- """
37
- ---
38
- UtilityFunction:
39
- enabled: false
40
- """
41
- When I run reek -c config.reek smelly.rb
42
- Then the exit status indicates smells
43
- And it reports no errors
44
-
@@ -1,52 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Reek
4
- module Report
5
- module Formatter
6
- #
7
- # Base class for heading formatters.
8
- # Is responsible for formatting the heading emitted for each examiner
9
- #
10
- # @abstract Override {#show_header?} to implement a heading formatter.
11
- class HeadingFormatterBase
12
- attr_reader :report_formatter
13
-
14
- def initialize(report_formatter)
15
- @report_formatter = report_formatter
16
- end
17
-
18
- # :reek:UtilityFunction
19
- def show_header?(_examiner)
20
- raise NotImplementedError
21
- end
22
-
23
- def header(examiner)
24
- if show_header?(examiner)
25
- report_formatter.header examiner
26
- else
27
- ''
28
- end
29
- end
30
- end
31
-
32
- #
33
- # Lists out each examiner, even if it has no smell
34
- #
35
- class VerboseHeadingFormatter < HeadingFormatterBase
36
- def show_header?(_examiner)
37
- true
38
- end
39
- end
40
-
41
- #
42
- # Lists only smelly examiners
43
- #
44
- class QuietHeadingFormatter < HeadingFormatterBase
45
- # :reek:UtilityFunction
46
- def show_header?(examiner)
47
- examiner.smelly?
48
- end
49
- end
50
- end
51
- end
52
- end
@@ -1,42 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Reek
4
- module Report
5
- module Formatter
6
- #
7
- # Formats the location of a warning as an empty string.
8
- #
9
- module BlankLocationFormatter
10
- module_function
11
-
12
- def format(_warning)
13
- ''
14
- end
15
- end
16
-
17
- #
18
- # Formats the location of a warning as an array of line numbers.
19
- #
20
- module DefaultLocationFormatter
21
- module_function
22
-
23
- def format(warning)
24
- "#{warning.lines.sort.inspect}:"
25
- end
26
- end
27
-
28
- #
29
- # Formats the location of a warning as a combination of source file name
30
- # and line number. In this format, it is not possible to show more than
31
- # one line number, so the first number is displayed.
32
- #
33
- module SingleLineLocationFormatter
34
- module_function
35
-
36
- def format(warning)
37
- "#{warning.source}:#{warning.lines.sort.first}: "
38
- end
39
- end
40
- end
41
- end
42
- end
@@ -1,81 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Reek
4
- module Report
5
- module Formatter
6
- module ProgressFormatter
7
- #
8
- # Base class for progress formatters.
9
- # Is responsible for formatting the progress emitted for each examiner
10
- #
11
- # @abstract Override {#header, #progress, #footer} to implement a progress formatter.
12
- class Base
13
- attr_reader :sources_count
14
-
15
- def initialize(sources_count)
16
- @sources_count = sources_count
17
- end
18
-
19
- def header
20
- raise NotImplementedError
21
- end
22
-
23
- def progress(_examiner)
24
- raise NotImplementedError
25
- end
26
-
27
- def footer
28
- raise NotImplementedError
29
- end
30
- end
31
-
32
- #
33
- # Shows the status of each source as either a dot (.) or an S
34
- #
35
- class Dots < Base
36
- NO_WARNINGS_COLOR = :green
37
- WARNINGS_COLOR = :red
38
-
39
- def header
40
- "Inspecting #{sources_count} file(s):\n"
41
- end
42
-
43
- def progress(examiner)
44
- examiner.smelly? ? display_smelly : display_clean
45
- end
46
-
47
- def footer
48
- "\n\n"
49
- end
50
-
51
- private
52
-
53
- def display_clean
54
- Rainbow('.').color(NO_WARNINGS_COLOR)
55
- end
56
-
57
- def display_smelly
58
- Rainbow('S').color(WARNINGS_COLOR)
59
- end
60
- end
61
-
62
- #
63
- # Does not show progress
64
- #
65
- class Quiet < Base
66
- def header
67
- ''
68
- end
69
-
70
- def progress(_examiner)
71
- ''
72
- end
73
-
74
- def footer
75
- ''
76
- end
77
- end
78
- end
79
- end
80
- end
81
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Reek
4
- module Report
5
- module Formatter
6
- #
7
- # Basic formatter that just shows a simple message for each warning,
8
- # prepended with the result of the passed-in location formatter.
9
- #
10
- class SimpleWarningFormatter
11
- def initialize(location_formatter: BlankLocationFormatter)
12
- @location_formatter = location_formatter
13
- end
14
-
15
- def format(warning)
16
- "#{location_formatter.format(warning)}#{warning.base_message}"
17
- end
18
-
19
- # :reek:UtilityFunction
20
- def format_hash(warning)
21
- warning.yaml_hash
22
- end
23
-
24
- # :reek:UtilityFunction
25
- def format_code_climate_hash(warning)
26
- CodeClimateFormatter.new(warning).render
27
- end
28
-
29
- private
30
-
31
- attr_reader :location_formatter
32
- end
33
- end
34
- end
35
- end
@@ -1,36 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'simple_warning_formatter'
4
-
5
- module Reek
6
- module Report
7
- module Formatter
8
- #
9
- # Formatter that adds a link to the wiki to the basic message from
10
- # SimpleWarningFormatter.
11
- #
12
- class WikiLinkWarningFormatter < SimpleWarningFormatter
13
- BASE_URL_FOR_HELP_LINK = 'https://github.com/troessner/reek/blob/master/docs/'.freeze
14
-
15
- def format(warning)
16
- "#{super} [#{explanatory_link(warning)}]"
17
- end
18
-
19
- def format_hash(warning)
20
- super.merge('wiki_link' => explanatory_link(warning))
21
- end
22
-
23
- private
24
-
25
- def explanatory_link(warning)
26
- "#{BASE_URL_FOR_HELP_LINK}#{class_name_to_param(warning.smell_type)}.md"
27
- end
28
-
29
- # :reek:UtilityFunction
30
- def class_name_to_param(name)
31
- name.split(/(?=[A-Z])/).join('-')
32
- end
33
- end
34
- end
35
- end
36
- end
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'code_climate/code_climate_formatter'
4
- require_relative 'formatter/heading_formatter'
5
- require_relative 'formatter/location_formatter'
6
- require_relative 'formatter/progress_formatter'
7
- require_relative 'formatter/simple_warning_formatter'
8
- require_relative 'formatter/wiki_link_warning_formatter'
9
-
10
- module Reek
11
- module Report
12
- #
13
- # Formatter handling the formatting of the report at large.
14
- # Formatting of the individual warnings is handled by the
15
- # passed-in warning formatter.
16
- #
17
- module Formatter
18
- module_function
19
-
20
- def format_list(warnings, formatter: SimpleWarningFormatter.new)
21
- warnings.map { |warning| " #{formatter.format(warning)}" }.join("\n")
22
- end
23
-
24
- def header(examiner)
25
- count = examiner.smells_count
26
- result = Rainbow("#{examiner.description} -- ").cyan +
27
- Rainbow("#{count} warning").yellow
28
- result += Rainbow('s').yellow unless count == 1
29
- result
30
- end
31
- end
32
- end
33
- end
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'base_detector'
4
-
5
- module Reek
6
- module SmellDetectors
7
- # Check syntax errors.
8
- # Note: this detector is called by examiner directly unlike other detectors.
9
- class Syntax < BaseDetector
10
- # Context duck type for this atypical smell detector
11
- DummyContext = Struct.new(:exp, :full_name)
12
- # Exp duck type for this atypical smell detector
13
- DummyExp = Struct.new(:source)
14
-
15
- def self.contexts
16
- []
17
- end
18
-
19
- def self.smells_from_source(source)
20
- new.smells_from_source(source)
21
- end
22
-
23
- # :reek:FeatureEnvy
24
- def smells_from_source(source)
25
- context = DummyContext.new(
26
- DummyExp.new(source.origin),
27
- 'This file')
28
- source.diagnostics.map do |diagnostic|
29
- smell_warning(
30
- context: context,
31
- lines: [diagnostic.location.line],
32
- message: "has #{diagnostic.message}")
33
- end
34
- end
35
- end
36
- end
37
- end
@@ -1,3 +0,0 @@
1
- ---
2
- UtilityFunction:
3
- public_methods_only: true
@@ -1,8 +0,0 @@
1
- # Smelly class
2
- # disables :reek:UncommunicativeVariableName
3
- class Smelly
4
- # This will reek of UncommunicativeMethodName
5
- def x
6
- y = 10 # This will NOT reek of UncommunicativeVariableName
7
- end
8
- end
@@ -1,12 +0,0 @@
1
- # Smelly class for testing purposes
2
- #
3
- # Not necessary for the feature per se but for
4
- # removing distracting output. :reek:UnusedPrivateMethod
5
- #
6
- class Klass
7
- def public_method(arg) arg.to_s; end
8
- protected
9
- def protected_method(arg) arg.to_s; end
10
- private
11
- def private_method(arg) arg.to_s; end
12
- end
@@ -1,5 +0,0 @@
1
- # Klass comment.
2
- class Klass
3
- def m
4
- end
5
- end
@@ -1,6 +0,0 @@
1
- # Klass comment
2
- class Klass
3
- def method(a)
4
- a + @x
5
- end
6
- end
@@ -1,17 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/smell_detectors/syntax'
3
-
4
- RSpec.describe Reek::SmellDetectors::Syntax do
5
- it 'reports the right values' do
6
- src = <<-EOS
7
- class Alfa
8
- edn
9
- EOS
10
-
11
- expect(src).to reek_of(:Syntax,
12
- lines: [3],
13
- context: 'This file',
14
- message: 'has unexpected token $end',
15
- source: 'string')
16
- end
17
- end
File without changes
File without changes
File without changes
File without changes
File without changes