reek 6.0.2 → 6.1.4

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 (247) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +13 -0
  3. data/.github/workflows/ruby.yml +57 -0
  4. data/.rubocop.yml +6 -4
  5. data/.rubocop_todo.yml +6 -4
  6. data/CHANGELOG.md +42 -0
  7. data/CONTRIBUTING.md +4 -1
  8. data/Dockerfile +1 -1
  9. data/Gemfile +7 -7
  10. data/README.md +2 -2
  11. data/bin/code_climate_reek +2 -3
  12. data/lib/reek/ast/ast_node_class_map.rb +1 -1
  13. data/lib/reek/ast/node.rb +1 -1
  14. data/lib/reek/ast/sexp_extensions/arguments.rb +20 -0
  15. data/lib/reek/ast/sexp_extensions/case.rb +1 -1
  16. data/lib/reek/ast/sexp_extensions/if.rb +1 -1
  17. data/lib/reek/ast/sexp_extensions/send.rb +1 -1
  18. data/lib/reek/cli/command/todo_list_command.rb +2 -2
  19. data/lib/reek/cli/options.rb +6 -6
  20. data/lib/reek/code_comment.rb +22 -17
  21. data/lib/reek/configuration/configuration_file_finder.rb +2 -1
  22. data/lib/reek/configuration/excluded_paths.rb +2 -1
  23. data/lib/reek/context/code_context.rb +1 -1
  24. data/lib/reek/context/module_context.rb +4 -0
  25. data/lib/reek/context/refinement_context.rb +16 -0
  26. data/lib/reek/context/send_context.rb +6 -0
  27. data/lib/reek/context_builder.rb +17 -3
  28. data/lib/reek/rake/task.rb +5 -5
  29. data/lib/reek/report/code_climate/code_climate_configuration.yml +3 -3
  30. data/lib/reek/report/code_climate/code_climate_formatter.rb +1 -3
  31. data/lib/reek/smell_detectors/base_detector.rb +1 -1
  32. data/lib/reek/smell_detectors/class_variable.rb +2 -2
  33. data/lib/reek/smell_detectors/control_parameter_helpers/candidate.rb +6 -6
  34. data/lib/reek/smell_detectors/duplicate_method_call.rb +5 -5
  35. data/lib/reek/smell_detectors/unused_private_method.rb +1 -0
  36. data/lib/reek/smell_warning.rb +1 -1
  37. data/lib/reek/source/source_locator.rb +1 -3
  38. data/lib/reek/spec/should_reek_of.rb +11 -9
  39. data/lib/reek/spec.rb +1 -1
  40. data/lib/reek/version.rb +2 -2
  41. data/reek.gemspec +28 -25
  42. metadata +13 -240
  43. data/.travis.yml +0 -40
  44. data/docs/API.md +0 -174
  45. data/docs/Attribute.md +0 -39
  46. data/docs/Basic-Smell-Options.md +0 -85
  47. data/docs/Boolean-Parameter.md +0 -54
  48. data/docs/Class-Variable.md +0 -40
  49. data/docs/Code-Smells.md +0 -39
  50. data/docs/Command-Line-Options.md +0 -119
  51. data/docs/Control-Couple.md +0 -26
  52. data/docs/Control-Parameter.md +0 -32
  53. data/docs/Data-Clump.md +0 -46
  54. data/docs/Duplicate-Method-Call.md +0 -264
  55. data/docs/Feature-Envy.md +0 -93
  56. data/docs/How-To-Write-New-Detectors.md +0 -132
  57. data/docs/How-reek-works-internally.md +0 -114
  58. data/docs/Instance-Variable-Assumption.md +0 -163
  59. data/docs/Irresponsible-Module.md +0 -47
  60. data/docs/Large-Class.md +0 -16
  61. data/docs/Long-Parameter-List.md +0 -39
  62. data/docs/Long-Yield-List.md +0 -37
  63. data/docs/Manual-Dispatch.md +0 -30
  64. data/docs/Missing-Safe-Method.md +0 -92
  65. data/docs/Module-Initialize.md +0 -62
  66. data/docs/Nested-Iterators.md +0 -59
  67. data/docs/Nil-Check.md +0 -47
  68. data/docs/RSpec-matchers.md +0 -129
  69. data/docs/Rake-Task.md +0 -66
  70. data/docs/Reek-4-to-Reek-5-migration.md +0 -188
  71. data/docs/Reek-Driven-Development.md +0 -46
  72. data/docs/Repeated-Conditional.md +0 -47
  73. data/docs/Simulated-Polymorphism.md +0 -16
  74. data/docs/Smell-Suppression.md +0 -96
  75. data/docs/Style-Guide.md +0 -19
  76. data/docs/Subclassed-From-Core-Class.md +0 -79
  77. data/docs/Too-Many-Constants.md +0 -37
  78. data/docs/Too-Many-Instance-Variables.md +0 -43
  79. data/docs/Too-Many-Methods.md +0 -56
  80. data/docs/Too-Many-Statements.md +0 -54
  81. data/docs/Uncommunicative-Method-Name.md +0 -94
  82. data/docs/Uncommunicative-Module-Name.md +0 -92
  83. data/docs/Uncommunicative-Name.md +0 -18
  84. data/docs/Uncommunicative-Parameter-Name.md +0 -90
  85. data/docs/Uncommunicative-Variable-Name.md +0 -96
  86. data/docs/Unused-Parameters.md +0 -28
  87. data/docs/Unused-Private-Method.md +0 -101
  88. data/docs/Utility-Function.md +0 -56
  89. data/docs/Versioning-Policy.md +0 -7
  90. data/docs/YAML-Reports.md +0 -93
  91. data/docs/defaults.reek.yml +0 -129
  92. data/docs/templates/default/docstring/html/public_api_marker.erb +0 -3
  93. data/docs/templates/default/docstring/setup.rb +0 -37
  94. data/docs/templates/default/fulldoc/html/css/common.css +0 -1
  95. data/docs/yard_plugin.rb +0 -17
  96. data/features/command_line_interface/basic_usage.feature +0 -15
  97. data/features/command_line_interface/options.feature +0 -123
  98. data/features/command_line_interface/show_progress.feature +0 -33
  99. data/features/command_line_interface/smell_selection.feature +0 -15
  100. data/features/command_line_interface/smells_count.feature +0 -38
  101. data/features/command_line_interface/stdin.feature +0 -65
  102. data/features/configuration_files/accept_setting.feature +0 -87
  103. data/features/configuration_files/directory_specific_directives.feature +0 -274
  104. data/features/configuration_files/exclude_directives.feature +0 -35
  105. data/features/configuration_files/exclude_paths_directives.feature +0 -42
  106. data/features/configuration_files/masking_smells.feature +0 -94
  107. data/features/configuration_files/mix_accept_reject_setting.feature +0 -84
  108. data/features/configuration_files/reject_setting.feature +0 -89
  109. data/features/configuration_files/schema_validation.feature +0 -59
  110. data/features/configuration_files/show_configuration_file.feature +0 -44
  111. data/features/configuration_files/unused_private_method.feature +0 -68
  112. data/features/configuration_loading.feature +0 -91
  113. data/features/configuration_via_source_comments/erroneous_source_comments.feature +0 -68
  114. data/features/configuration_via_source_comments/well_formed_source_comments.feature +0 -116
  115. data/features/locales.feature +0 -32
  116. data/features/programmatic_access.feature +0 -41
  117. data/features/rake_task/rake_task.feature +0 -138
  118. data/features/reports/codeclimate.feature +0 -59
  119. data/features/reports/json.feature +0 -59
  120. data/features/reports/reports.feature +0 -219
  121. data/features/reports/yaml.feature +0 -52
  122. data/features/rspec_matcher.feature +0 -41
  123. data/features/samples.feature +0 -305
  124. data/features/step_definitions/.rubocop.yml +0 -5
  125. data/features/step_definitions/reek_steps.rb +0 -102
  126. data/features/step_definitions/sample_file_steps.rb +0 -63
  127. data/features/support/env.rb +0 -33
  128. data/features/todo_list.feature +0 -108
  129. data/samples/checkstyle.xml +0 -7
  130. data/samples/clean_source/clean.rb +0 -6
  131. data/samples/configuration/accepts_rejects_and_excludes_for_detectors.reek.yml +0 -29
  132. data/samples/configuration/accepts_rejects_and_excludes_for_directory_directives.reek.yml +0 -30
  133. data/samples/configuration/corrupt.reek +0 -1
  134. data/samples/configuration/empty.reek +0 -0
  135. data/samples/configuration/full_configuration.reek +0 -13
  136. data/samples/configuration/full_mask.reek +0 -6
  137. data/samples/configuration/home/home.reek.yml +0 -4
  138. data/samples/configuration/partial_mask.reek +0 -4
  139. data/samples/configuration/regular_configuration/.reek.yml +0 -4
  140. data/samples/configuration/regular_configuration/empty_sub_directory/.gitignore +0 -0
  141. data/samples/configuration/with_excluded_paths.reek +0 -5
  142. data/samples/no_config_file/.keep +0 -0
  143. data/samples/paths.rb +0 -5
  144. data/samples/smelly_source/inline.rb +0 -704
  145. data/samples/smelly_source/optparse.rb +0 -1788
  146. data/samples/smelly_source/redcloth.rb +0 -1130
  147. data/samples/smelly_source/ruby.rb +0 -368
  148. data/samples/smelly_source/smelly.rb +0 -7
  149. data/samples/source_with_exclude_paths/ignore_me/uncommunicative_method_name.rb +0 -5
  150. data/samples/source_with_exclude_paths/nested/ignore_me_as_well/irresponsible_module.rb +0 -2
  151. data/samples/source_with_exclude_paths/nested/uncommunicative_parameter_name.rb +0 -6
  152. data/samples/source_with_exclude_paths/nested/uncommunicative_variable_name.rb +0 -6
  153. data/samples/source_with_hidden_directories/.hidden/hidden.rb +0 -1
  154. data/samples/source_with_hidden_directories/not_hidden.rb +0 -1
  155. data/samples/source_with_non_ruby_files/gibberish +0 -1
  156. data/samples/source_with_non_ruby_files/python_source.py +0 -1
  157. data/samples/source_with_non_ruby_files/ruby.rb +0 -6
  158. data/spec/performance/reek/smell_detectors/runtime_speed_spec.rb +0 -15
  159. data/spec/quality/documentation_spec.rb +0 -41
  160. data/spec/quality/reek_source_spec.rb +0 -11
  161. data/spec/reek/ast/node_spec.rb +0 -211
  162. data/spec/reek/ast/object_refs_spec.rb +0 -83
  163. data/spec/reek/ast/reference_collector_spec.rb +0 -47
  164. data/spec/reek/ast/sexp_extensions_spec.rb +0 -498
  165. data/spec/reek/cli/application_spec.rb +0 -168
  166. data/spec/reek/cli/command/report_command_spec.rb +0 -44
  167. data/spec/reek/cli/command/todo_list_command_spec.rb +0 -86
  168. data/spec/reek/cli/options_spec.rb +0 -51
  169. data/spec/reek/cli/silencer_spec.rb +0 -28
  170. data/spec/reek/code_comment_spec.rb +0 -184
  171. data/spec/reek/configuration/app_configuration_spec.rb +0 -195
  172. data/spec/reek/configuration/configuration_file_finder_spec.rb +0 -230
  173. data/spec/reek/configuration/default_directive_spec.rb +0 -13
  174. data/spec/reek/configuration/directory_directives_spec.rb +0 -122
  175. data/spec/reek/configuration/excluded_paths_spec.rb +0 -16
  176. data/spec/reek/configuration/rake_task_converter_spec.rb +0 -33
  177. data/spec/reek/configuration/schema_validator_spec.rb +0 -165
  178. data/spec/reek/context/code_context_spec.rb +0 -192
  179. data/spec/reek/context/ghost_context_spec.rb +0 -60
  180. data/spec/reek/context/method_context_spec.rb +0 -72
  181. data/spec/reek/context/module_context_spec.rb +0 -55
  182. data/spec/reek/context/root_context_spec.rb +0 -12
  183. data/spec/reek/context/statement_counter_spec.rb +0 -24
  184. data/spec/reek/context_builder_spec.rb +0 -457
  185. data/spec/reek/detector_repository_spec.rb +0 -22
  186. data/spec/reek/documentation_link_spec.rb +0 -20
  187. data/spec/reek/errors/base_error_spec.rb +0 -13
  188. data/spec/reek/examiner_spec.rb +0 -309
  189. data/spec/reek/logging_error_handler_spec.rb +0 -24
  190. data/spec/reek/rake/task_spec.rb +0 -56
  191. data/spec/reek/report/code_climate/code_climate_configuration_spec.rb +0 -22
  192. data/spec/reek/report/code_climate/code_climate_fingerprint_spec.rb +0 -126
  193. data/spec/reek/report/code_climate/code_climate_formatter_spec.rb +0 -51
  194. data/spec/reek/report/code_climate/code_climate_report_spec.rb +0 -56
  195. data/spec/reek/report/html_report_spec.rb +0 -19
  196. data/spec/reek/report/json_report_spec.rb +0 -58
  197. data/spec/reek/report/location_formatter_spec.rb +0 -32
  198. data/spec/reek/report/progress_formatter_spec.rb +0 -68
  199. data/spec/reek/report/text_report_spec.rb +0 -89
  200. data/spec/reek/report/xml_report_spec.rb +0 -24
  201. data/spec/reek/report/yaml_report_spec.rb +0 -55
  202. data/spec/reek/report_spec.rb +0 -28
  203. data/spec/reek/smell_configuration_spec.rb +0 -56
  204. data/spec/reek/smell_detectors/attribute_spec.rb +0 -197
  205. data/spec/reek/smell_detectors/base_detector_spec.rb +0 -50
  206. data/spec/reek/smell_detectors/boolean_parameter_spec.rb +0 -93
  207. data/spec/reek/smell_detectors/class_variable_spec.rb +0 -106
  208. data/spec/reek/smell_detectors/control_parameter_spec.rb +0 -300
  209. data/spec/reek/smell_detectors/data_clump_spec.rb +0 -134
  210. data/spec/reek/smell_detectors/duplicate_method_call_spec.rb +0 -211
  211. data/spec/reek/smell_detectors/feature_envy_spec.rb +0 -295
  212. data/spec/reek/smell_detectors/instance_variable_assumption_spec.rb +0 -96
  213. data/spec/reek/smell_detectors/irresponsible_module_spec.rb +0 -226
  214. data/spec/reek/smell_detectors/long_parameter_list_spec.rb +0 -61
  215. data/spec/reek/smell_detectors/long_yield_list_spec.rb +0 -49
  216. data/spec/reek/smell_detectors/manual_dispatch_spec.rb +0 -75
  217. data/spec/reek/smell_detectors/missing_safe_method_spec.rb +0 -68
  218. data/spec/reek/smell_detectors/module_initialize_spec.rb +0 -77
  219. data/spec/reek/smell_detectors/nested_iterators_spec.rb +0 -333
  220. data/spec/reek/smell_detectors/nil_check_spec.rb +0 -100
  221. data/spec/reek/smell_detectors/repeated_conditional_spec.rb +0 -100
  222. data/spec/reek/smell_detectors/subclassed_from_core_class_spec.rb +0 -77
  223. data/spec/reek/smell_detectors/too_many_constants_spec.rb +0 -144
  224. data/spec/reek/smell_detectors/too_many_instance_variables_spec.rb +0 -132
  225. data/spec/reek/smell_detectors/too_many_methods_spec.rb +0 -54
  226. data/spec/reek/smell_detectors/too_many_statements_spec.rb +0 -90
  227. data/spec/reek/smell_detectors/uncommunicative_method_name_spec.rb +0 -78
  228. data/spec/reek/smell_detectors/uncommunicative_module_name_spec.rb +0 -78
  229. data/spec/reek/smell_detectors/uncommunicative_parameter_name_spec.rb +0 -147
  230. data/spec/reek/smell_detectors/uncommunicative_variable_name_spec.rb +0 -201
  231. data/spec/reek/smell_detectors/unused_parameters_spec.rb +0 -114
  232. data/spec/reek/smell_detectors/unused_private_method_spec.rb +0 -205
  233. data/spec/reek/smell_detectors/utility_function_spec.rb +0 -293
  234. data/spec/reek/smell_warning_spec.rb +0 -137
  235. data/spec/reek/source/source_code_spec.rb +0 -79
  236. data/spec/reek/source/source_locator_spec.rb +0 -166
  237. data/spec/reek/spec/should_reek_of_spec.rb +0 -153
  238. data/spec/reek/spec/should_reek_only_of_spec.rb +0 -91
  239. data/spec/reek/spec/should_reek_spec.rb +0 -52
  240. data/spec/reek/spec/smell_matcher_spec.rb +0 -87
  241. data/spec/reek/tree_dresser_spec.rb +0 -46
  242. data/spec/spec_helper.rb +0 -110
  243. data/tasks/configuration.rake +0 -18
  244. data/tasks/console.rake +0 -5
  245. data/tasks/reek.rake +0 -6
  246. data/tasks/rubocop.rake +0 -11
  247. data/tasks/test.rake +0 -32
@@ -1,368 +0,0 @@
1
- module CodeRay
2
- module Scanners
3
-
4
- # This scanner is really complex, since Ruby _is_ a complex language!
5
- #
6
- # It tries to highlight 100% of all common code,
7
- # and 90% of strange codes.
8
- #
9
- # It is optimized for HTML highlighting, and is not very useful for
10
- # parsing or pretty printing.
11
- #
12
- # For now, I think it's better than the scanners in VIM or Syntax, or
13
- # any highlighter I was able to find, except Caleb's RubyLexer.
14
- #
15
- # I hope it's also better than the rdoc/irb lexer.
16
- class Ruby < Scanner
17
-
18
- include Streamable
19
-
20
- register_for :ruby
21
- file_extension 'rb'
22
-
23
- helper :patterns
24
-
25
- private
26
- def scan_tokens tokens, options
27
- last_token_dot = false
28
- value_expected = true
29
- heredocs = nil
30
- last_state = nil
31
- state = :initial
32
- depth = nil
33
- inline_block_stack = []
34
-
35
- patterns = Patterns # avoid constant lookup
36
-
37
- until eos?
38
- match = nil
39
- kind = nil
40
-
41
- if state.instance_of? patterns::StringState
42
- # {{{
43
- match = scan_until(state.pattern) || scan_until(/\z/)
44
- tokens << [match, :content] unless match.empty?
45
- break if eos?
46
-
47
- if state.heredoc and self[1] # end of heredoc
48
- match = getch.to_s
49
- match << scan_until(/$/) unless eos?
50
- tokens << [match, :delimiter]
51
- tokens << [:close, state.type]
52
- state = state.next_state
53
- next
54
- end
55
-
56
- case match = getch
57
-
58
- when state.delim
59
- if state.paren
60
- state.paren_depth -= 1
61
- if state.paren_depth > 0
62
- tokens << [match, :nesting_delimiter]
63
- next
64
- end
65
- end
66
- tokens << [match, :delimiter]
67
- if state.type == :regexp and not eos?
68
- modifiers = scan(/#{patterns::REGEXP_MODIFIERS}/ox)
69
- tokens << [modifiers, :modifier] unless modifiers.empty?
70
- end
71
- tokens << [:close, state.type]
72
- value_expected = false
73
- state = state.next_state
74
-
75
- when '\\'
76
- if state.interpreted
77
- if esc = scan(/ #{patterns::ESCAPE} /ox)
78
- tokens << [match + esc, :char]
79
- else
80
- tokens << [match, :error]
81
- end
82
- else
83
- case m = getch
84
- when state.delim, '\\'
85
- tokens << [match + m, :char]
86
- when nil
87
- tokens << [match, :error]
88
- else
89
- tokens << [match + m, :content]
90
- end
91
- end
92
-
93
- when '#'
94
- case peek(1)
95
- when '{'
96
- inline_block_stack << [state, depth, heredocs]
97
- value_expected = true
98
- state = :initial
99
- depth = 1
100
- tokens << [:open, :inline]
101
- tokens << [match + getch, :inline_delimiter]
102
- when '$', '@'
103
- tokens << [match, :escape]
104
- last_state = state # scan one token as normal code, then return here
105
- state = :initial
106
- else
107
- raise_inspect 'else-case # reached; #%p not handled' % peek(1), tokens
108
- end
109
-
110
- when state.paren
111
- state.paren_depth += 1
112
- tokens << [match, :nesting_delimiter]
113
-
114
- when /#{patterns::REGEXP_SYMBOLS}/ox
115
- tokens << [match, :function]
116
-
117
- else
118
- raise_inspect 'else-case " reached; %p not handled, state = %p' % [match, state], tokens
119
-
120
- end
121
- next
122
- # }}}
123
- else
124
- # {{{
125
- if match = scan(/[ \t\f]+/)
126
- kind = :space
127
- match << scan(/\s*/) unless eos? or heredocs
128
- tokens << [match, kind]
129
- next
130
-
131
- elsif match = scan(/\\?\n/)
132
- kind = :space
133
- if match == "\n"
134
- value_expected = true # FIXME not quite true
135
- state = :initial if state == :undef_comma_expected
136
- end
137
- if heredocs
138
- unscan # heredoc scanning needs \n at start
139
- state = heredocs.shift
140
- tokens << [:open, state.type]
141
- heredocs = nil if heredocs.empty?
142
- next
143
- else
144
- match << scan(/\s*/) unless eos?
145
- end
146
- tokens << [match, kind]
147
- next
148
-
149
- elsif match = scan(/\#.*/) or
150
- ( bol? and match = scan(/#{patterns::RUBYDOC_OR_DATA}/o) )
151
- kind = :comment
152
- value_expected = true
153
- tokens << [match, kind]
154
- next
155
-
156
- elsif state == :initial
157
-
158
- # IDENTS #
159
- if match = scan(/#{patterns::METHOD_NAME}/o)
160
- if last_token_dot
161
- kind = if match[/^[A-Z]/] and not match?(/\(/) then :constant else :ident end
162
- else
163
- kind = patterns::IDENT_KIND[match]
164
- if kind == :ident and match[/^[A-Z]/] and not match[/[!?]$/] and not match?(/\(/)
165
- kind = :constant
166
- elsif kind == :reserved
167
- state = patterns::DEF_NEW_STATE[match]
168
- end
169
- end
170
- ## experimental!
171
- value_expected = :set if
172
- patterns::REGEXP_ALLOWED[match] or check(/#{patterns::VALUE_FOLLOWS}/o)
173
-
174
- elsif last_token_dot and match = scan(/#{patterns::METHOD_NAME_OPERATOR}/o)
175
- kind = :ident
176
- value_expected = :set if check(/#{patterns::VALUE_FOLLOWS}/o)
177
-
178
- # OPERATORS #
179
- elsif not last_token_dot and match = scan(/ \.\.\.? | (?:\.|::)() | [,\(\)\[\]\{\}] | ==?=? /x)
180
- if match !~ / [.\)\]\}] /x or match =~ /\.\.\.?/
181
- value_expected = :set
182
- end
183
- last_token_dot = :set if self[1]
184
- kind = :operator
185
- unless inline_block_stack.empty?
186
- case match
187
- when '{'
188
- depth += 1
189
- when '}'
190
- depth -= 1
191
- if depth == 0 # closing brace of inline block reached
192
- state, depth, heredocs = inline_block_stack.pop
193
- tokens << [match, :inline_delimiter]
194
- kind = :inline
195
- match = :close
196
- end
197
- end
198
- end
199
-
200
- elsif match = scan(/ ['"] /mx)
201
- tokens << [:open, :string]
202
- kind = :delimiter
203
- state = patterns::StringState.new :string, match == '"', match # important for streaming
204
-
205
- elsif match = scan(/#{patterns::INSTANCE_VARIABLE}/o)
206
- kind = :instance_variable
207
-
208
- elsif value_expected and match = scan(/\//)
209
- tokens << [:open, :regexp]
210
- kind = :delimiter
211
- interpreted = true
212
- state = patterns::StringState.new :regexp, interpreted, match
213
-
214
- elsif match = scan(/#{patterns::NUMERIC}/o)
215
- kind = if self[1] then :float else :integer end
216
-
217
- elsif match = scan(/#{patterns::SYMBOL}/o)
218
- case delim = match[1]
219
- when ?', ?"
220
- tokens << [:open, :symbol]
221
- tokens << [':', :symbol]
222
- match = delim.chr
223
- kind = :delimiter
224
- state = patterns::StringState.new :symbol, delim == ?", match
225
- else
226
- kind = :symbol
227
- end
228
-
229
- elsif match = scan(/ [-+!~^]=? | [*|&]{1,2}=? | >>? /x)
230
- value_expected = :set
231
- kind = :operator
232
-
233
- elsif value_expected and match = scan(/#{patterns::HEREDOC_OPEN}/o)
234
- indented = self[1] == '-'
235
- quote = self[3]
236
- delim = self[quote ? 4 : 2]
237
- kind = patterns::QUOTE_TO_TYPE[quote]
238
- tokens << [:open, kind]
239
- tokens << [match, :delimiter]
240
- match = :close
241
- heredoc = patterns::StringState.new kind, quote != '\'', delim, (indented ? :indented : :linestart )
242
- heredocs ||= [] # create heredocs if empty
243
- heredocs << heredoc
244
-
245
- elsif value_expected and match = scan(/#{patterns::FANCY_START_CORRECT}/o)
246
- kind, interpreted = *patterns::FancyStringType.fetch(self[1]) do
247
- raise_inspect 'Unknown fancy string: %%%p' % k, tokens
248
- end
249
- tokens << [:open, kind]
250
- state = patterns::StringState.new kind, interpreted, self[2]
251
- kind = :delimiter
252
-
253
- elsif value_expected and match = scan(/#{patterns::CHARACTER}/o)
254
- kind = :integer
255
-
256
- elsif match = scan(/ [\/%]=? | <(?:<|=>?)? | [?:;] /x)
257
- value_expected = :set
258
- kind = :operator
259
-
260
- elsif match = scan(/`/)
261
- if last_token_dot
262
- kind = :operator
263
- else
264
- tokens << [:open, :shell]
265
- kind = :delimiter
266
- state = patterns::StringState.new :shell, true, match
267
- end
268
-
269
- elsif match = scan(/#{patterns::GLOBAL_VARIABLE}/o)
270
- kind = :global_variable
271
-
272
- elsif match = scan(/#{patterns::CLASS_VARIABLE}/o)
273
- kind = :class_variable
274
-
275
- else
276
- kind = :error
277
- match = getch
278
-
279
- end
280
-
281
- elsif state == :def_expected
282
- state = :initial
283
- if match = scan(/(?>#{patterns::METHOD_NAME_EX})(?!\.|::)/o)
284
- kind = :method
285
- else
286
- next
287
- end
288
-
289
- elsif state == :undef_expected
290
- state = :undef_comma_expected
291
- if match = scan(/#{patterns::METHOD_NAME_EX}/o)
292
- kind = :method
293
- elsif match = scan(/#{patterns::SYMBOL}/o)
294
- case delim = match[1]
295
- when ?', ?"
296
- tokens << [:open, :symbol]
297
- tokens << [':', :symbol]
298
- match = delim.chr
299
- kind = :delimiter
300
- state = patterns::StringState.new :symbol, delim == ?", match
301
- state.next_state = :undef_comma_expected
302
- else
303
- kind = :symbol
304
- end
305
- else
306
- state = :initial
307
- next
308
- end
309
-
310
- elsif state == :undef_comma_expected
311
- if match = scan(/,/)
312
- kind = :operator
313
- state = :undef_expected
314
- else
315
- state = :initial
316
- next
317
- end
318
-
319
- elsif state == :module_expected
320
- if match = scan(/<</)
321
- kind = :operator
322
- else
323
- state = :initial
324
- if match = scan(/ (?:#{patterns::IDENT}::)* #{patterns::IDENT} /ox)
325
- kind = :class
326
- else
327
- next
328
- end
329
- end
330
-
331
- end
332
- # }}}
333
-
334
- value_expected = value_expected == :set
335
- last_token_dot = last_token_dot == :set
336
-
337
- if $DEBUG and not kind
338
- raise_inspect 'Error token %p in line %d' %
339
- [[match, kind], line], tokens, state
340
- end
341
- raise_inspect 'Empty token', tokens unless match
342
-
343
- tokens << [match, kind]
344
-
345
- if last_state
346
- state = last_state
347
- last_state = nil
348
- end
349
- end
350
- end
351
-
352
- inline_block_stack << [state] if state.is_a? patterns::StringState
353
- until inline_block_stack.empty?
354
- this_block = inline_block_stack.pop
355
- tokens << [:close, :inline] if this_block.size > 1
356
- state = this_block.first
357
- tokens << [:close, state.type]
358
- end
359
-
360
- tokens
361
- end
362
-
363
- end
364
-
365
- end
366
- end
367
-
368
- # vim:fdm=marker
@@ -1,7 +0,0 @@
1
- # Smelly class
2
- class Smelly
3
- # This will reek of UncommunicativeMethodName
4
- def x
5
- y = 10 # This will reek of UncommunicativeVariableName
6
- end
7
- 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,6 +0,0 @@
1
- # Klass comment.
2
- class Klass
3
- def meth
4
- x = 5
5
- end
6
- end
@@ -1 +0,0 @@
1
- adfasfsadfasdfsafsad
@@ -1 +0,0 @@
1
- print("Hello, World!")
@@ -1,6 +0,0 @@
1
- # Klass comment
2
- class Klass
3
- def method(a)
4
- a + @x
5
- end
6
- end
@@ -1,15 +0,0 @@
1
- require_relative '../../../spec_helper'
2
- require_lib 'reek/examiner'
3
-
4
- RSpec.describe 'Runtime speed' do
5
- let(:source_directory) { SAMPLES_DIR.join('smelly_source') }
6
-
7
- it 'runs on our smelly sources in less than 5 seconds' do
8
- expect do
9
- Dir[source_directory.join('**/*.rb')].each do |entry|
10
- examiner = Reek::Examiner.new Pathname.new(entry)
11
- examiner.smells.size
12
- end
13
- end.to perform_under(5).sec
14
- end
15
- end
@@ -1,41 +0,0 @@
1
- require_relative '../spec_helper'
2
- require 'kramdown'
3
-
4
- RSpec.describe 'Documentation' do
5
- root = File.expand_path('../..', __dir__)
6
- files = Dir.glob(File.join(root, '*.md')) + Dir.glob(File.join(root, 'docs', '*.md'))
7
- code_types = [:codeblock, :codespan]
8
-
9
- files.each do |file|
10
- describe "from #{file}" do
11
- text = File.read(file)
12
- doc = Kramdown::Document.new(text, input: 'GFM')
13
- blocks = doc.root.children
14
-
15
- blocks.each do |block|
16
- # Only consider code blocks with language 'ruby'.
17
- next unless code_types.include?(block.type)
18
- next unless block.attr['class'] == 'language-ruby'
19
-
20
- it "has a valid sample at #{block.options[:location] + 1}" do
21
- code = block.value.strip
22
-
23
- # Replace lines of the form `<expression> # => <result>` with
24
- # assertions.
25
- #
26
- # For example,
27
- #
28
- # 2 + 2 # => 4
29
- #
30
- # will be replaced by
31
- #
32
- # assert_equal(4, 2 + 2)
33
- #
34
- spec_code = code.gsub(/(^.+) # ?=> (.+$)/, 'assert_equal(\2, \1)')
35
-
36
- eval spec_code # rubocop:disable Security/Eval
37
- end
38
- end
39
- end
40
- end
41
- end
@@ -1,11 +0,0 @@
1
- require_relative '../spec_helper'
2
-
3
- RSpec.describe 'Reek source code' do
4
- Pathname.glob('lib/**/*.rb').each do |pathname|
5
- describe pathname do
6
- it 'has no smells' do
7
- expect(pathname).not_to reek
8
- end
9
- end
10
- end
11
- end