reek 6.0.3 → 6.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (231) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +31 -26
  3. data/.rubocop.yml +5 -3
  4. data/CHANGELOG.md +22 -1
  5. data/CONTRIBUTING.md +3 -0
  6. data/Dockerfile +1 -1
  7. data/Gemfile +7 -7
  8. data/README.md +1 -1
  9. data/bin/code_climate_reek +2 -3
  10. data/lib/reek/ast/ast_node_class_map.rb +1 -1
  11. data/lib/reek/ast/sexp_extensions/arguments.rb +11 -0
  12. data/lib/reek/ast/sexp_extensions/case.rb +1 -1
  13. data/lib/reek/ast/sexp_extensions/if.rb +1 -1
  14. data/lib/reek/ast/sexp_extensions/send.rb +1 -1
  15. data/lib/reek/cli/command/todo_list_command.rb +1 -1
  16. data/lib/reek/cli/options.rb +1 -1
  17. data/lib/reek/code_comment.rb +22 -17
  18. data/lib/reek/context_builder.rb +1 -1
  19. data/lib/reek/rake/task.rb +1 -1
  20. data/lib/reek/report/code_climate/code_climate_formatter.rb +1 -3
  21. data/lib/reek/smell_detectors/base_detector.rb +1 -1
  22. data/lib/reek/smell_warning.rb +1 -1
  23. data/lib/reek/source/source_locator.rb +1 -3
  24. data/lib/reek/spec/should_reek_of.rb +6 -4
  25. data/lib/reek/version.rb +2 -2
  26. data/reek.gemspec +28 -25
  27. metadata +7 -225
  28. data/docs/API.md +0 -174
  29. data/docs/Attribute.md +0 -39
  30. data/docs/Basic-Smell-Options.md +0 -85
  31. data/docs/Boolean-Parameter.md +0 -54
  32. data/docs/Class-Variable.md +0 -40
  33. data/docs/Code-Smells.md +0 -39
  34. data/docs/Command-Line-Options.md +0 -119
  35. data/docs/Control-Couple.md +0 -26
  36. data/docs/Control-Parameter.md +0 -32
  37. data/docs/Data-Clump.md +0 -46
  38. data/docs/Duplicate-Method-Call.md +0 -264
  39. data/docs/Feature-Envy.md +0 -93
  40. data/docs/How-To-Write-New-Detectors.md +0 -132
  41. data/docs/How-reek-works-internally.md +0 -114
  42. data/docs/Instance-Variable-Assumption.md +0 -163
  43. data/docs/Irresponsible-Module.md +0 -47
  44. data/docs/Large-Class.md +0 -16
  45. data/docs/Long-Parameter-List.md +0 -39
  46. data/docs/Long-Yield-List.md +0 -37
  47. data/docs/Manual-Dispatch.md +0 -30
  48. data/docs/Missing-Safe-Method.md +0 -92
  49. data/docs/Module-Initialize.md +0 -62
  50. data/docs/Nested-Iterators.md +0 -59
  51. data/docs/Nil-Check.md +0 -47
  52. data/docs/RSpec-matchers.md +0 -129
  53. data/docs/Rake-Task.md +0 -66
  54. data/docs/Reek-4-to-Reek-5-migration.md +0 -188
  55. data/docs/Reek-Driven-Development.md +0 -46
  56. data/docs/Repeated-Conditional.md +0 -47
  57. data/docs/Simulated-Polymorphism.md +0 -16
  58. data/docs/Smell-Suppression.md +0 -96
  59. data/docs/Style-Guide.md +0 -19
  60. data/docs/Subclassed-From-Core-Class.md +0 -79
  61. data/docs/Too-Many-Constants.md +0 -37
  62. data/docs/Too-Many-Instance-Variables.md +0 -43
  63. data/docs/Too-Many-Methods.md +0 -56
  64. data/docs/Too-Many-Statements.md +0 -54
  65. data/docs/Uncommunicative-Method-Name.md +0 -94
  66. data/docs/Uncommunicative-Module-Name.md +0 -92
  67. data/docs/Uncommunicative-Name.md +0 -18
  68. data/docs/Uncommunicative-Parameter-Name.md +0 -90
  69. data/docs/Uncommunicative-Variable-Name.md +0 -96
  70. data/docs/Unused-Parameters.md +0 -28
  71. data/docs/Unused-Private-Method.md +0 -101
  72. data/docs/Utility-Function.md +0 -56
  73. data/docs/Versioning-Policy.md +0 -7
  74. data/docs/YAML-Reports.md +0 -93
  75. data/docs/defaults.reek.yml +0 -129
  76. data/docs/templates/default/docstring/html/public_api_marker.erb +0 -3
  77. data/docs/templates/default/docstring/setup.rb +0 -35
  78. data/docs/templates/default/fulldoc/html/css/common.css +0 -1
  79. data/docs/yard_plugin.rb +0 -17
  80. data/features/command_line_interface/basic_usage.feature +0 -15
  81. data/features/command_line_interface/options.feature +0 -123
  82. data/features/command_line_interface/show_progress.feature +0 -33
  83. data/features/command_line_interface/smell_selection.feature +0 -15
  84. data/features/command_line_interface/smells_count.feature +0 -38
  85. data/features/command_line_interface/stdin.feature +0 -65
  86. data/features/configuration_files/accept_setting.feature +0 -87
  87. data/features/configuration_files/directory_specific_directives.feature +0 -274
  88. data/features/configuration_files/exclude_directives.feature +0 -35
  89. data/features/configuration_files/exclude_paths_directives.feature +0 -42
  90. data/features/configuration_files/masking_smells.feature +0 -94
  91. data/features/configuration_files/mix_accept_reject_setting.feature +0 -84
  92. data/features/configuration_files/reject_setting.feature +0 -89
  93. data/features/configuration_files/schema_validation.feature +0 -59
  94. data/features/configuration_files/show_configuration_file.feature +0 -44
  95. data/features/configuration_files/unused_private_method.feature +0 -68
  96. data/features/configuration_loading.feature +0 -91
  97. data/features/configuration_via_source_comments/erroneous_source_comments.feature +0 -68
  98. data/features/configuration_via_source_comments/well_formed_source_comments.feature +0 -116
  99. data/features/locales.feature +0 -32
  100. data/features/programmatic_access.feature +0 -41
  101. data/features/rake_task/rake_task.feature +0 -138
  102. data/features/reports/codeclimate.feature +0 -59
  103. data/features/reports/json.feature +0 -59
  104. data/features/reports/reports.feature +0 -219
  105. data/features/reports/yaml.feature +0 -52
  106. data/features/rspec_matcher.feature +0 -41
  107. data/features/samples.feature +0 -305
  108. data/features/step_definitions/.rubocop.yml +0 -5
  109. data/features/step_definitions/reek_steps.rb +0 -102
  110. data/features/step_definitions/sample_file_steps.rb +0 -63
  111. data/features/support/env.rb +0 -33
  112. data/features/todo_list.feature +0 -108
  113. data/samples/checkstyle.xml +0 -7
  114. data/samples/clean_source/clean.rb +0 -6
  115. data/samples/configuration/accepts_rejects_and_excludes_for_detectors.reek.yml +0 -29
  116. data/samples/configuration/accepts_rejects_and_excludes_for_directory_directives.reek.yml +0 -30
  117. data/samples/configuration/corrupt.reek +0 -1
  118. data/samples/configuration/empty.reek +0 -0
  119. data/samples/configuration/full_configuration.reek +0 -13
  120. data/samples/configuration/full_mask.reek +0 -6
  121. data/samples/configuration/home/home.reek.yml +0 -4
  122. data/samples/configuration/partial_mask.reek +0 -4
  123. data/samples/configuration/regular_configuration/.reek.yml +0 -4
  124. data/samples/configuration/regular_configuration/empty_sub_directory/.gitignore +0 -0
  125. data/samples/configuration/with_excluded_paths.reek +0 -5
  126. data/samples/no_config_file/.keep +0 -0
  127. data/samples/paths.rb +0 -5
  128. data/samples/smelly_source/inline.rb +0 -704
  129. data/samples/smelly_source/optparse.rb +0 -1788
  130. data/samples/smelly_source/redcloth.rb +0 -1130
  131. data/samples/smelly_source/ruby.rb +0 -368
  132. data/samples/smelly_source/smelly.rb +0 -7
  133. data/samples/source_with_exclude_paths/ignore_me/uncommunicative_method_name.rb +0 -5
  134. data/samples/source_with_exclude_paths/nested/ignore_me_as_well/irresponsible_module.rb +0 -2
  135. data/samples/source_with_exclude_paths/nested/uncommunicative_parameter_name.rb +0 -6
  136. data/samples/source_with_exclude_paths/nested/uncommunicative_variable_name.rb +0 -6
  137. data/samples/source_with_hidden_directories/.hidden/hidden.rb +0 -1
  138. data/samples/source_with_hidden_directories/not_hidden.rb +0 -1
  139. data/samples/source_with_non_ruby_files/gibberish +0 -1
  140. data/samples/source_with_non_ruby_files/python_source.py +0 -1
  141. data/samples/source_with_non_ruby_files/ruby.rb +0 -6
  142. data/spec/performance/reek/smell_detectors/runtime_speed_spec.rb +0 -15
  143. data/spec/quality/documentation_spec.rb +0 -41
  144. data/spec/quality/reek_source_spec.rb +0 -11
  145. data/spec/reek/ast/node_spec.rb +0 -211
  146. data/spec/reek/ast/object_refs_spec.rb +0 -83
  147. data/spec/reek/ast/reference_collector_spec.rb +0 -47
  148. data/spec/reek/ast/sexp_extensions_spec.rb +0 -498
  149. data/spec/reek/cli/application_spec.rb +0 -168
  150. data/spec/reek/cli/command/report_command_spec.rb +0 -44
  151. data/spec/reek/cli/command/todo_list_command_spec.rb +0 -86
  152. data/spec/reek/cli/options_spec.rb +0 -51
  153. data/spec/reek/cli/silencer_spec.rb +0 -28
  154. data/spec/reek/code_comment_spec.rb +0 -184
  155. data/spec/reek/configuration/app_configuration_spec.rb +0 -195
  156. data/spec/reek/configuration/configuration_file_finder_spec.rb +0 -230
  157. data/spec/reek/configuration/default_directive_spec.rb +0 -13
  158. data/spec/reek/configuration/directory_directives_spec.rb +0 -122
  159. data/spec/reek/configuration/excluded_paths_spec.rb +0 -25
  160. data/spec/reek/configuration/rake_task_converter_spec.rb +0 -33
  161. data/spec/reek/configuration/schema_validator_spec.rb +0 -165
  162. data/spec/reek/context/code_context_spec.rb +0 -192
  163. data/spec/reek/context/ghost_context_spec.rb +0 -60
  164. data/spec/reek/context/method_context_spec.rb +0 -72
  165. data/spec/reek/context/module_context_spec.rb +0 -55
  166. data/spec/reek/context/root_context_spec.rb +0 -12
  167. data/spec/reek/context/statement_counter_spec.rb +0 -24
  168. data/spec/reek/context_builder_spec.rb +0 -457
  169. data/spec/reek/detector_repository_spec.rb +0 -22
  170. data/spec/reek/documentation_link_spec.rb +0 -20
  171. data/spec/reek/errors/base_error_spec.rb +0 -13
  172. data/spec/reek/examiner_spec.rb +0 -309
  173. data/spec/reek/logging_error_handler_spec.rb +0 -24
  174. data/spec/reek/rake/task_spec.rb +0 -56
  175. data/spec/reek/report/code_climate/code_climate_configuration_spec.rb +0 -22
  176. data/spec/reek/report/code_climate/code_climate_fingerprint_spec.rb +0 -126
  177. data/spec/reek/report/code_climate/code_climate_formatter_spec.rb +0 -51
  178. data/spec/reek/report/code_climate/code_climate_report_spec.rb +0 -56
  179. data/spec/reek/report/html_report_spec.rb +0 -19
  180. data/spec/reek/report/json_report_spec.rb +0 -58
  181. data/spec/reek/report/location_formatter_spec.rb +0 -32
  182. data/spec/reek/report/progress_formatter_spec.rb +0 -68
  183. data/spec/reek/report/text_report_spec.rb +0 -89
  184. data/spec/reek/report/xml_report_spec.rb +0 -24
  185. data/spec/reek/report/yaml_report_spec.rb +0 -55
  186. data/spec/reek/report_spec.rb +0 -28
  187. data/spec/reek/smell_configuration_spec.rb +0 -56
  188. data/spec/reek/smell_detectors/attribute_spec.rb +0 -197
  189. data/spec/reek/smell_detectors/base_detector_spec.rb +0 -50
  190. data/spec/reek/smell_detectors/boolean_parameter_spec.rb +0 -93
  191. data/spec/reek/smell_detectors/class_variable_spec.rb +0 -106
  192. data/spec/reek/smell_detectors/control_parameter_spec.rb +0 -300
  193. data/spec/reek/smell_detectors/data_clump_spec.rb +0 -134
  194. data/spec/reek/smell_detectors/duplicate_method_call_spec.rb +0 -211
  195. data/spec/reek/smell_detectors/feature_envy_spec.rb +0 -295
  196. data/spec/reek/smell_detectors/instance_variable_assumption_spec.rb +0 -96
  197. data/spec/reek/smell_detectors/irresponsible_module_spec.rb +0 -226
  198. data/spec/reek/smell_detectors/long_parameter_list_spec.rb +0 -61
  199. data/spec/reek/smell_detectors/long_yield_list_spec.rb +0 -49
  200. data/spec/reek/smell_detectors/manual_dispatch_spec.rb +0 -75
  201. data/spec/reek/smell_detectors/missing_safe_method_spec.rb +0 -68
  202. data/spec/reek/smell_detectors/module_initialize_spec.rb +0 -77
  203. data/spec/reek/smell_detectors/nested_iterators_spec.rb +0 -333
  204. data/spec/reek/smell_detectors/nil_check_spec.rb +0 -100
  205. data/spec/reek/smell_detectors/repeated_conditional_spec.rb +0 -100
  206. data/spec/reek/smell_detectors/subclassed_from_core_class_spec.rb +0 -77
  207. data/spec/reek/smell_detectors/too_many_constants_spec.rb +0 -144
  208. data/spec/reek/smell_detectors/too_many_instance_variables_spec.rb +0 -132
  209. data/spec/reek/smell_detectors/too_many_methods_spec.rb +0 -54
  210. data/spec/reek/smell_detectors/too_many_statements_spec.rb +0 -90
  211. data/spec/reek/smell_detectors/uncommunicative_method_name_spec.rb +0 -78
  212. data/spec/reek/smell_detectors/uncommunicative_module_name_spec.rb +0 -78
  213. data/spec/reek/smell_detectors/uncommunicative_parameter_name_spec.rb +0 -147
  214. data/spec/reek/smell_detectors/uncommunicative_variable_name_spec.rb +0 -201
  215. data/spec/reek/smell_detectors/unused_parameters_spec.rb +0 -114
  216. data/spec/reek/smell_detectors/unused_private_method_spec.rb +0 -205
  217. data/spec/reek/smell_detectors/utility_function_spec.rb +0 -309
  218. data/spec/reek/smell_warning_spec.rb +0 -137
  219. data/spec/reek/source/source_code_spec.rb +0 -79
  220. data/spec/reek/source/source_locator_spec.rb +0 -166
  221. data/spec/reek/spec/should_reek_of_spec.rb +0 -153
  222. data/spec/reek/spec/should_reek_only_of_spec.rb +0 -91
  223. data/spec/reek/spec/should_reek_spec.rb +0 -52
  224. data/spec/reek/spec/smell_matcher_spec.rb +0 -87
  225. data/spec/reek/tree_dresser_spec.rb +0 -46
  226. data/spec/spec_helper.rb +0 -110
  227. data/tasks/configuration.rake +0 -18
  228. data/tasks/console.rake +0 -5
  229. data/tasks/reek.rake +0 -6
  230. data/tasks/rubocop.rake +0 -11
  231. 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