rubocop 0.29.1 → 0.30.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rubocop might be problematic. Click here for more details.

Files changed (341) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +73 -1
  3. data/README.md +11 -2
  4. data/config/default.yml +194 -6
  5. data/config/disabled.yml +25 -1
  6. data/config/enabled.yml +74 -12
  7. data/lib/rubocop.rb +19 -2
  8. data/lib/rubocop/config.rb +23 -3
  9. data/lib/rubocop/config_loader.rb +9 -1
  10. data/lib/rubocop/cop/autocorrect_logic.rb +26 -0
  11. data/lib/rubocop/cop/cop.rb +33 -17
  12. data/lib/rubocop/cop/lint/assignment_in_condition.rb +16 -4
  13. data/lib/rubocop/cop/lint/block_alignment.rb +5 -14
  14. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
  15. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +61 -0
  16. data/lib/rubocop/cop/lint/void.rb +11 -3
  17. data/lib/rubocop/cop/mixin/on_normal_if_unless.rb +17 -0
  18. data/lib/rubocop/cop/performance/detect.rb +72 -0
  19. data/lib/rubocop/cop/performance/flat_map.rb +64 -0
  20. data/lib/rubocop/cop/performance/reverse_each.rb +43 -0
  21. data/lib/rubocop/cop/performance/sample.rb +58 -0
  22. data/lib/rubocop/cop/performance/size.rb +64 -0
  23. data/lib/rubocop/cop/rails/date.rb +121 -0
  24. data/lib/rubocop/cop/rails/find_by.rb +52 -0
  25. data/lib/rubocop/cop/rails/find_each.rb +41 -0
  26. data/lib/rubocop/cop/rails/time_zone.rb +93 -0
  27. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +45 -0
  28. data/lib/rubocop/cop/style/block_delimiters.rb +186 -0
  29. data/lib/rubocop/cop/style/closing_parenthesis_indentation.rb +76 -0
  30. data/lib/rubocop/cop/style/command_literal.rb +120 -0
  31. data/lib/rubocop/cop/style/copyright.rb +87 -0
  32. data/lib/rubocop/cop/style/documentation.rb +32 -0
  33. data/lib/rubocop/cop/style/empty_else.rb +85 -16
  34. data/lib/rubocop/cop/style/encoding.rb +14 -2
  35. data/lib/rubocop/cop/style/end_of_line.rb +5 -0
  36. data/lib/rubocop/cop/style/hash_syntax.rb +86 -23
  37. data/lib/rubocop/cop/style/if_unless_modifier.rb +15 -0
  38. data/lib/rubocop/cop/style/indentation_consistency.rb +13 -6
  39. data/lib/rubocop/cop/style/indentation_width.rb +34 -10
  40. data/lib/rubocop/cop/style/lambda.rb +32 -17
  41. data/lib/rubocop/cop/style/line_end_concatenation.rb +4 -0
  42. data/lib/rubocop/cop/style/missing_else.rb +72 -0
  43. data/lib/rubocop/cop/style/regexp_literal.rb +89 -58
  44. data/lib/rubocop/cop/style/space_around_operators.rb +13 -2
  45. data/lib/rubocop/cop/style/space_before_block_braces.rb +3 -3
  46. data/lib/rubocop/cop/style/space_inside_block_braces.rb +9 -5
  47. data/lib/rubocop/cop/style/symbol_literal.rb +36 -0
  48. data/lib/rubocop/cop/style/trailing_blank_lines.rb +7 -0
  49. data/lib/rubocop/cop/style/trailing_comma.rb +21 -7
  50. data/lib/rubocop/cop/style/trivial_accessors.rb +17 -3
  51. data/lib/rubocop/cop/style/unneeded_capital_w.rb +4 -6
  52. data/lib/rubocop/cop/style/while_until_modifier.rb +10 -0
  53. data/lib/rubocop/cop/util.rb +24 -19
  54. data/lib/rubocop/cop/variable_force.rb +14 -0
  55. data/lib/rubocop/cop/variable_force/reference.rb +10 -4
  56. data/lib/rubocop/formatter/html_formatter.rb +10 -4
  57. data/lib/rubocop/formatter/text_util.rb +5 -7
  58. data/lib/rubocop/options.rb +47 -45
  59. data/lib/rubocop/path_util.rb +12 -8
  60. data/lib/rubocop/processed_source.rb +12 -1
  61. data/lib/rubocop/rake_task.rb +2 -2
  62. data/lib/rubocop/version.rb +1 -1
  63. data/relnotes/v0.30.0.md +145 -0
  64. data/rubocop.gemspec +15 -3
  65. metadata +22 -545
  66. data/.gitignore +0 -54
  67. data/.rspec +0 -1
  68. data/.rubocop.yml +0 -11
  69. data/.rubocop_todo.yml +0 -28
  70. data/.travis.yml +0 -22
  71. data/Gemfile +0 -15
  72. data/Rakefile +0 -41
  73. data/lib/rubocop/cop/style/blocks.rb +0 -80
  74. data/lib/rubocop/cop/style/unneeded_percent_x.rb +0 -25
  75. data/logo/rubocop-final-logo.eps +0 -0
  76. data/spec/.rubocop.yml +0 -5
  77. data/spec/fixtures/html_formatter/expected.html +0 -495
  78. data/spec/fixtures/html_formatter/project/app/controllers/application_controller.rb +0 -5
  79. data/spec/fixtures/html_formatter/project/app/controllers/books_controller.rb +0 -74
  80. data/spec/fixtures/html_formatter/project/app/models/book.rb +0 -5
  81. data/spec/isolated_environment_spec.rb +0 -24
  82. data/spec/project_spec.rb +0 -119
  83. data/spec/rubocop/cli_spec.rb +0 -2740
  84. data/spec/rubocop/comment_config_spec.rb +0 -105
  85. data/spec/rubocop/config_loader_spec.rb +0 -377
  86. data/spec/rubocop/config_spec.rb +0 -235
  87. data/spec/rubocop/config_store_spec.rb +0 -53
  88. data/spec/rubocop/cop/commissioner_spec.rb +0 -85
  89. data/spec/rubocop/cop/cop_spec.rb +0 -135
  90. data/spec/rubocop/cop/corrector_spec.rb +0 -59
  91. data/spec/rubocop/cop/force_spec.rb +0 -29
  92. data/spec/rubocop/cop/lint/ambiguous_operator_spec.rb +0 -113
  93. data/spec/rubocop/cop/lint/ambiguous_regexp_literal_spec.rb +0 -35
  94. data/spec/rubocop/cop/lint/assignment_in_condition_spec.rb +0 -130
  95. data/spec/rubocop/cop/lint/block_alignment_spec.rb +0 -533
  96. data/spec/rubocop/cop/lint/condition_position_spec.rb +0 -51
  97. data/spec/rubocop/cop/lint/debugger_spec.rb +0 -73
  98. data/spec/rubocop/cop/lint/def_end_alignment_spec.rb +0 -108
  99. data/spec/rubocop/cop/lint/deprecated_class_methods_spec.rb +0 -38
  100. data/spec/rubocop/cop/lint/duplicate_methods_spec.rb +0 -189
  101. data/spec/rubocop/cop/lint/else_layout_spec.rb +0 -65
  102. data/spec/rubocop/cop/lint/empty_ensure_spec.rb +0 -27
  103. data/spec/rubocop/cop/lint/empty_interpolation_spec.rb +0 -18
  104. data/spec/rubocop/cop/lint/end_alignment_spec.rb +0 -91
  105. data/spec/rubocop/cop/lint/end_in_method_spec.rb +0 -29
  106. data/spec/rubocop/cop/lint/ensure_return_spec.rb +0 -39
  107. data/spec/rubocop/cop/lint/eval_spec.rb +0 -33
  108. data/spec/rubocop/cop/lint/handle_exceptions_spec.rb +0 -30
  109. data/spec/rubocop/cop/lint/invalid_character_literal_spec.rb +0 -33
  110. data/spec/rubocop/cop/lint/literal_in_condition_spec.rb +0 -172
  111. data/spec/rubocop/cop/lint/literal_in_interpolation_spec.rb +0 -31
  112. data/spec/rubocop/cop/lint/loop_spec.rb +0 -27
  113. data/spec/rubocop/cop/lint/parentheses_as_grouped_expression_spec.rb +0 -57
  114. data/spec/rubocop/cop/lint/require_parentheses_spec.rb +0 -82
  115. data/spec/rubocop/cop/lint/rescue_exception_spec.rb +0 -123
  116. data/spec/rubocop/cop/lint/shadowing_outer_local_variable_spec.rb +0 -237
  117. data/spec/rubocop/cop/lint/space_before_first_arg_spec.rb +0 -66
  118. data/spec/rubocop/cop/lint/string_conversion_in_interpolation_spec.rb +0 -51
  119. data/spec/rubocop/cop/lint/syntax_spec.rb +0 -34
  120. data/spec/rubocop/cop/lint/underscore_prefixed_variable_name_spec.rb +0 -179
  121. data/spec/rubocop/cop/lint/unreachable_code_spec.rb +0 -63
  122. data/spec/rubocop/cop/lint/unused_block_argument_spec.rb +0 -231
  123. data/spec/rubocop/cop/lint/unused_method_argument_spec.rb +0 -278
  124. data/spec/rubocop/cop/lint/useless_access_modifier_spec.rb +0 -192
  125. data/spec/rubocop/cop/lint/useless_assignment_spec.rb +0 -1778
  126. data/spec/rubocop/cop/lint/useless_comparison_spec.rb +0 -30
  127. data/spec/rubocop/cop/lint/useless_else_without_rescue_spec.rb +0 -48
  128. data/spec/rubocop/cop/lint/useless_setter_call_spec.rb +0 -211
  129. data/spec/rubocop/cop/lint/void_spec.rb +0 -64
  130. data/spec/rubocop/cop/metrics/abc_size_spec.rb +0 -109
  131. data/spec/rubocop/cop/metrics/block_nesting_spec.rb +0 -156
  132. data/spec/rubocop/cop/metrics/class_length_spec.rb +0 -131
  133. data/spec/rubocop/cop/metrics/cyclomatic_complexity_spec.rb +0 -204
  134. data/spec/rubocop/cop/metrics/line_length_spec.rb +0 -136
  135. data/spec/rubocop/cop/metrics/method_length_spec.rb +0 -147
  136. data/spec/rubocop/cop/metrics/parameter_lists_spec.rb +0 -44
  137. data/spec/rubocop/cop/metrics/perceived_complexity_spec.rb +0 -222
  138. data/spec/rubocop/cop/offense_spec.rb +0 -133
  139. data/spec/rubocop/cop/rails/action_filter_spec.rb +0 -64
  140. data/spec/rubocop/cop/rails/default_scope_spec.rb +0 -37
  141. data/spec/rubocop/cop/rails/delegate_spec.rb +0 -177
  142. data/spec/rubocop/cop/rails/has_and_belongs_to_many_spec.rb +0 -13
  143. data/spec/rubocop/cop/rails/output_spec.rb +0 -37
  144. data/spec/rubocop/cop/rails/read_write_attribute_spec.rb +0 -130
  145. data/spec/rubocop/cop/rails/scope_args_spec.rb +0 -25
  146. data/spec/rubocop/cop/rails/validation_spec.rb +0 -28
  147. data/spec/rubocop/cop/severity_spec.rb +0 -113
  148. data/spec/rubocop/cop/style/access_modifier_indentation_spec.rb +0 -421
  149. data/spec/rubocop/cop/style/accessor_method_name_spec.rb +0 -81
  150. data/spec/rubocop/cop/style/alias_spec.rb +0 -59
  151. data/spec/rubocop/cop/style/align_array_spec.rb +0 -123
  152. data/spec/rubocop/cop/style/align_hash_spec.rb +0 -411
  153. data/spec/rubocop/cop/style/align_parameters_spec.rb +0 -431
  154. data/spec/rubocop/cop/style/and_or_spec.rb +0 -235
  155. data/spec/rubocop/cop/style/array_join_spec.rb +0 -29
  156. data/spec/rubocop/cop/style/ascii_comments_spec.rb +0 -21
  157. data/spec/rubocop/cop/style/ascii_identifiers_spec.rb +0 -36
  158. data/spec/rubocop/cop/style/attr_spec.rb +0 -29
  159. data/spec/rubocop/cop/style/bare_percent_literals_spec.rb +0 -132
  160. data/spec/rubocop/cop/style/begin_block_spec.rb +0 -13
  161. data/spec/rubocop/cop/style/block_comments_spec.rb +0 -45
  162. data/spec/rubocop/cop/style/block_end_newline_spec.rb +0 -61
  163. data/spec/rubocop/cop/style/blocks_spec.rb +0 -121
  164. data/spec/rubocop/cop/style/braces_around_hash_parameters_spec.rb +0 -288
  165. data/spec/rubocop/cop/style/case_equality_spec.rb +0 -13
  166. data/spec/rubocop/cop/style/case_indentation_spec.rb +0 -293
  167. data/spec/rubocop/cop/style/character_literal_spec.rb +0 -37
  168. data/spec/rubocop/cop/style/class_and_module_camel_case_spec.rb +0 -40
  169. data/spec/rubocop/cop/style/class_and_module_children_spec.rb +0 -133
  170. data/spec/rubocop/cop/style/class_check_spec.rb +0 -41
  171. data/spec/rubocop/cop/style/class_methods_spec.rb +0 -80
  172. data/spec/rubocop/cop/style/class_vars_spec.rb +0 -19
  173. data/spec/rubocop/cop/style/collection_methods_spec.rb +0 -48
  174. data/spec/rubocop/cop/style/colon_method_call_spec.rb +0 -65
  175. data/spec/rubocop/cop/style/comment_annotation_spec.rb +0 -86
  176. data/spec/rubocop/cop/style/comment_indentation_spec.rb +0 -179
  177. data/spec/rubocop/cop/style/constant_name_spec.rb +0 -65
  178. data/spec/rubocop/cop/style/def_with_parentheses_spec.rb +0 -43
  179. data/spec/rubocop/cop/style/deprecated_hash_methods_spec.rb +0 -45
  180. data/spec/rubocop/cop/style/documentation_spec.rb +0 -146
  181. data/spec/rubocop/cop/style/dot_position_spec.rb +0 -132
  182. data/spec/rubocop/cop/style/double_negation_spec.rb +0 -22
  183. data/spec/rubocop/cop/style/each_with_object_spec.rb +0 -73
  184. data/spec/rubocop/cop/style/else_alignment_spec.rb +0 -506
  185. data/spec/rubocop/cop/style/empty_else_spec.rb +0 -100
  186. data/spec/rubocop/cop/style/empty_line_between_defs_spec.rb +0 -135
  187. data/spec/rubocop/cop/style/empty_lines_around_access_modifier_spec.rb +0 -178
  188. data/spec/rubocop/cop/style/empty_lines_around_block_body_spec.rb +0 -103
  189. data/spec/rubocop/cop/style/empty_lines_around_class_body_spec.rb +0 -135
  190. data/spec/rubocop/cop/style/empty_lines_around_method_body_spec.rb +0 -90
  191. data/spec/rubocop/cop/style/empty_lines_around_module_body_spec.rb +0 -79
  192. data/spec/rubocop/cop/style/empty_lines_spec.rb +0 -51
  193. data/spec/rubocop/cop/style/empty_literal_spec.rb +0 -117
  194. data/spec/rubocop/cop/style/encoding_spec.rb +0 -139
  195. data/spec/rubocop/cop/style/end_block_spec.rb +0 -13
  196. data/spec/rubocop/cop/style/end_of_line_spec.rb +0 -65
  197. data/spec/rubocop/cop/style/even_odd_spec.rb +0 -164
  198. data/spec/rubocop/cop/style/extra_spacing_spec.rb +0 -68
  199. data/spec/rubocop/cop/style/file_name_spec.rb +0 -84
  200. data/spec/rubocop/cop/style/first_parameter_indentation_spec.rb +0 -304
  201. data/spec/rubocop/cop/style/flip_flop_spec.rb +0 -23
  202. data/spec/rubocop/cop/style/for_spec.rb +0 -105
  203. data/spec/rubocop/cop/style/format_string_spec.rb +0 -184
  204. data/spec/rubocop/cop/style/global_vars_spec.rb +0 -34
  205. data/spec/rubocop/cop/style/guard_clause_spec.rb +0 -172
  206. data/spec/rubocop/cop/style/hash_syntax_spec.rb +0 -137
  207. data/spec/rubocop/cop/style/if_unless_modifier_spec.rb +0 -146
  208. data/spec/rubocop/cop/style/if_with_semicolon_spec.rb +0 -24
  209. data/spec/rubocop/cop/style/indent_array_spec.rb +0 -173
  210. data/spec/rubocop/cop/style/indent_hash_spec.rb +0 -367
  211. data/spec/rubocop/cop/style/indentation_consistency_spec.rb +0 -509
  212. data/spec/rubocop/cop/style/indentation_width_spec.rb +0 -885
  213. data/spec/rubocop/cop/style/infinite_loop_spec.rb +0 -48
  214. data/spec/rubocop/cop/style/inline_comment_spec.rb +0 -13
  215. data/spec/rubocop/cop/style/lambda_call_spec.rb +0 -65
  216. data/spec/rubocop/cop/style/lambda_spec.rb +0 -76
  217. data/spec/rubocop/cop/style/leading_comment_space_spec.rb +0 -64
  218. data/spec/rubocop/cop/style/line_end_concatenation_spec.rb +0 -184
  219. data/spec/rubocop/cop/style/method_call_parentheses_spec.rb +0 -59
  220. data/spec/rubocop/cop/style/method_called_on_do_end_block_spec.rb +0 -60
  221. data/spec/rubocop/cop/style/method_def_parentheses_spec.rb +0 -108
  222. data/spec/rubocop/cop/style/method_name_spec.rb +0 -125
  223. data/spec/rubocop/cop/style/module_function_spec.rb +0 -24
  224. data/spec/rubocop/cop/style/multiline_block_chain_spec.rb +0 -78
  225. data/spec/rubocop/cop/style/multiline_block_layout_spec.rb +0 -199
  226. data/spec/rubocop/cop/style/multiline_if_then_spec.rb +0 -134
  227. data/spec/rubocop/cop/style/multiline_operation_indentation_spec.rb +0 -464
  228. data/spec/rubocop/cop/style/multiline_ternary_operator_spec.rb +0 -18
  229. data/spec/rubocop/cop/style/negated_if_spec.rb +0 -102
  230. data/spec/rubocop/cop/style/negated_while_spec.rb +0 -64
  231. data/spec/rubocop/cop/style/nested_ternary_operator_spec.rb +0 -21
  232. data/spec/rubocop/cop/style/next_spec.rb +0 -301
  233. data/spec/rubocop/cop/style/nil_comparison_spec.rb +0 -29
  234. data/spec/rubocop/cop/style/non_nil_check_spec.rb +0 -132
  235. data/spec/rubocop/cop/style/not_spec.rb +0 -28
  236. data/spec/rubocop/cop/style/numeric_literals_spec.rb +0 -80
  237. data/spec/rubocop/cop/style/one_line_conditional_spec.rb +0 -13
  238. data/spec/rubocop/cop/style/op_method_spec.rb +0 -85
  239. data/spec/rubocop/cop/style/parentheses_around_condition_spec.rb +0 -161
  240. data/spec/rubocop/cop/style/percent_literal_delimiters_spec.rb +0 -316
  241. data/spec/rubocop/cop/style/percent_q_literals_spec.rb +0 -122
  242. data/spec/rubocop/cop/style/perl_backrefs_spec.rb +0 -22
  243. data/spec/rubocop/cop/style/predicate_name_spec.rb +0 -57
  244. data/spec/rubocop/cop/style/proc_spec.rb +0 -27
  245. data/spec/rubocop/cop/style/raise_args_spec.rb +0 -87
  246. data/spec/rubocop/cop/style/redundant_begin_spec.rb +0 -121
  247. data/spec/rubocop/cop/style/redundant_exception_spec.rb +0 -59
  248. data/spec/rubocop/cop/style/redundant_return_spec.rb +0 -171
  249. data/spec/rubocop/cop/style/redundant_self_spec.rb +0 -186
  250. data/spec/rubocop/cop/style/regexp_literal_spec.rb +0 -188
  251. data/spec/rubocop/cop/style/rescue_modifier_spec.rb +0 -116
  252. data/spec/rubocop/cop/style/self_assignment_spec.rb +0 -49
  253. data/spec/rubocop/cop/style/semicolon_spec.rb +0 -114
  254. data/spec/rubocop/cop/style/signal_exception_spec.rb +0 -289
  255. data/spec/rubocop/cop/style/single_line_block_params_spec.rb +0 -82
  256. data/spec/rubocop/cop/style/single_line_methods_spec.rb +0 -94
  257. data/spec/rubocop/cop/style/single_space_before_first_arg_spec.rb +0 -63
  258. data/spec/rubocop/cop/style/space_after_colon_spec.rb +0 -55
  259. data/spec/rubocop/cop/style/space_after_comma_spec.rb +0 -30
  260. data/spec/rubocop/cop/style/space_after_control_keyword_spec.rb +0 -84
  261. data/spec/rubocop/cop/style/space_after_method_name_spec.rb +0 -70
  262. data/spec/rubocop/cop/style/space_after_not_spec.rb +0 -22
  263. data/spec/rubocop/cop/style/space_after_semicolon_spec.rb +0 -23
  264. data/spec/rubocop/cop/style/space_around_block_parameters_spec.rb +0 -155
  265. data/spec/rubocop/cop/style/space_around_equals_in_parameter_default_spec.rb +0 -95
  266. data/spec/rubocop/cop/style/space_around_operators_spec.rb +0 -330
  267. data/spec/rubocop/cop/style/space_before_block_braces_spec.rb +0 -73
  268. data/spec/rubocop/cop/style/space_before_comma_spec.rb +0 -42
  269. data/spec/rubocop/cop/style/space_before_comment_spec.rb +0 -34
  270. data/spec/rubocop/cop/style/space_before_modifier_keyword_spec.rb +0 -70
  271. data/spec/rubocop/cop/style/space_before_semicolon_spec.rb +0 -28
  272. data/spec/rubocop/cop/style/space_inside_block_braces_spec.rb +0 -317
  273. data/spec/rubocop/cop/style/space_inside_brackets_spec.rb +0 -83
  274. data/spec/rubocop/cop/style/space_inside_hash_literal_braces_spec.rb +0 -147
  275. data/spec/rubocop/cop/style/space_inside_parens_spec.rb +0 -44
  276. data/spec/rubocop/cop/style/space_inside_range_literal_spec.rb +0 -64
  277. data/spec/rubocop/cop/style/special_global_vars_spec.rb +0 -62
  278. data/spec/rubocop/cop/style/string_literals_in_interpolation_spec.rb +0 -99
  279. data/spec/rubocop/cop/style/string_literals_spec.rb +0 -228
  280. data/spec/rubocop/cop/style/struct_inheritance_spec.rb +0 -44
  281. data/spec/rubocop/cop/style/symbol_array_spec.rb +0 -37
  282. data/spec/rubocop/cop/style/symbol_proc_spec.rb +0 -100
  283. data/spec/rubocop/cop/style/tab_spec.rb +0 -47
  284. data/spec/rubocop/cop/style/trailing_blank_lines_spec.rb +0 -83
  285. data/spec/rubocop/cop/style/trailing_comma_spec.rb +0 -390
  286. data/spec/rubocop/cop/style/trailing_whitespace_spec.rb +0 -31
  287. data/spec/rubocop/cop/style/trivial_accessors_spec.rb +0 -558
  288. data/spec/rubocop/cop/style/unless_else_spec.rb +0 -23
  289. data/spec/rubocop/cop/style/unneeded_capital_w_spec.rb +0 -90
  290. data/spec/rubocop/cop/style/unneeded_percent_q_spec.rb +0 -127
  291. data/spec/rubocop/cop/style/unneeded_percent_x_spec.rb +0 -34
  292. data/spec/rubocop/cop/style/variable_interpolation_spec.rb +0 -76
  293. data/spec/rubocop/cop/style/variable_name_spec.rb +0 -107
  294. data/spec/rubocop/cop/style/when_then_spec.rb +0 -42
  295. data/spec/rubocop/cop/style/while_until_do_spec.rb +0 -55
  296. data/spec/rubocop/cop/style/while_until_modifier_spec.rb +0 -93
  297. data/spec/rubocop/cop/style/word_array_spec.rb +0 -117
  298. data/spec/rubocop/cop/team_spec.rb +0 -190
  299. data/spec/rubocop/cop/util_spec.rb +0 -102
  300. data/spec/rubocop/cop/variable_force/assignment_spec.rb +0 -200
  301. data/spec/rubocop/cop/variable_force/locatable_spec.rb +0 -699
  302. data/spec/rubocop/cop/variable_force/reference_spec.rb +0 -19
  303. data/spec/rubocop/cop/variable_force/scope_spec.rb +0 -319
  304. data/spec/rubocop/cop/variable_force/variable_spec.rb +0 -59
  305. data/spec/rubocop/cop/variable_force/variable_table_spec.rb +0 -276
  306. data/spec/rubocop/cop/variable_force_spec.rb +0 -26
  307. data/spec/rubocop/formatter/base_formatter_spec.rb +0 -191
  308. data/spec/rubocop/formatter/clang_style_formatter_spec.rb +0 -114
  309. data/spec/rubocop/formatter/colorizable_spec.rb +0 -107
  310. data/spec/rubocop/formatter/disabled_config_formatter_spec.rb +0 -50
  311. data/spec/rubocop/formatter/disabled_lines_formatter_spec.rb +0 -67
  312. data/spec/rubocop/formatter/emacs_style_formatter_spec.rb +0 -63
  313. data/spec/rubocop/formatter/file_list_formatter_spec.rb +0 -33
  314. data/spec/rubocop/formatter/formatter_set_spec.rb +0 -141
  315. data/spec/rubocop/formatter/fuubar_style_formatter_spec.rb +0 -129
  316. data/spec/rubocop/formatter/html_formatter_spec.rb +0 -48
  317. data/spec/rubocop/formatter/json_formatter_spec.rb +0 -152
  318. data/spec/rubocop/formatter/offense_count_formatter_spec.rb +0 -75
  319. data/spec/rubocop/formatter/progress_formatter_spec.rb +0 -182
  320. data/spec/rubocop/formatter/simple_text_formatter_spec.rb +0 -135
  321. data/spec/rubocop/formatter/text_util_spec.rb +0 -55
  322. data/spec/rubocop/options_spec.rb +0 -181
  323. data/spec/rubocop/path_util_spec.rb +0 -77
  324. data/spec/rubocop/processed_source_spec.rb +0 -184
  325. data/spec/rubocop/rake_task_spec.rb +0 -122
  326. data/spec/rubocop/runner_spec.rb +0 -99
  327. data/spec/rubocop/string_util_spec.rb +0 -46
  328. data/spec/rubocop/target_finder_spec.rb +0 -245
  329. data/spec/rubocop/token_spec.rb +0 -29
  330. data/spec/spec_helper.rb +0 -39
  331. data/spec/support/cop_helper.rb +0 -75
  332. data/spec/support/cops/class_must_be_a_module_cop.rb +0 -19
  333. data/spec/support/cops/module_must_be_a_class_cop.rb +0 -19
  334. data/spec/support/coverage.rb +0 -15
  335. data/spec/support/custom_matchers.rb +0 -58
  336. data/spec/support/file_helper.rb +0 -23
  337. data/spec/support/jruby_workaround.rb +0 -15
  338. data/spec/support/mri_syntax_checker.rb +0 -73
  339. data/spec/support/shared_contexts.rb +0 -53
  340. data/spec/support/shared_examples.rb +0 -55
  341. data/spec/support/statement_modifier_helper.rb +0 -41
@@ -16,6 +16,7 @@ module RuboCop
16
16
 
17
17
  MSG_MISSING = 'Missing utf-8 encoding comment.'
18
18
  MSG_UNNECESSARY = 'Unnecessary utf-8 encoding comment.'
19
+ ENCODING_PATTERN = /#.*coding\s?[:=]\s?(?:UTF|utf)-8/
19
20
 
20
21
  def investigate(processed_source)
21
22
  return if processed_source.buffer.source.empty?
@@ -26,14 +27,25 @@ module RuboCop
26
27
  return unless message
27
28
 
28
29
  range = source_range(processed_source.buffer, line_number + 1, 0)
29
- add_offense(nil, range, message)
30
+ add_offense(processed_source.tokens.first, range, message)
31
+ end
32
+
33
+ def autocorrect(node)
34
+ encoding = cop_config['AutoCorrectEncodingComment']
35
+ if encoding && encoding =~ ENCODING_PATTERN
36
+ @corrections << lambda do |corrector|
37
+ corrector.replace(node.pos, "#{encoding}\n#{node.pos.source}")
38
+ end
39
+ else
40
+ fail "#{encoding} does not match #{ENCODING_PATTERN}"
41
+ end
30
42
  end
31
43
 
32
44
  private
33
45
 
34
46
  def offense(processed_source, line_number)
35
47
  line = processed_source[line_number]
36
- encoding_present = line =~ /#.*coding\s?[:=]\s?(UTF|utf)-8/
48
+ encoding_present = line =~ ENCODING_PATTERN
37
49
  ascii_only = processed_source.buffer.source.ascii_only?
38
50
  always_encode = style == :always
39
51
 
@@ -8,7 +8,12 @@ module RuboCop
8
8
  MSG = 'Carriage return character detected.'
9
9
 
10
10
  def investigate(processed_source)
11
+ last_token = processed_source.tokens.last
12
+ last_line =
13
+ last_token ? last_token.pos.line : processed_source.lines.length
14
+
11
15
  processed_source.raw_source.each_line.with_index do |line, index|
16
+ break if index >= last_line
12
17
  next unless line =~ /\r$/
13
18
 
14
19
  range =
@@ -13,18 +13,30 @@ module RuboCop
13
13
  include ConfigurableEnforcedStyle
14
14
 
15
15
  MSG_19 = 'Use the new Ruby 1.9 hash syntax.'
16
- MSG_HASH_ROCKETS = 'Always use hash rockets in hashes.'
16
+ MSG_RUBY19_NO_MIXED_KEYS = "Don't mix styles in the same hash."
17
+ MSG_HASH_ROCKETS = 'Use hash rockets syntax.'
18
+
19
+ @force_hash_rockets = false
17
20
 
18
21
  def on_hash(node)
19
- style == :ruby19 ? ruby19_check(node) : hash_rockets_check(node)
22
+ if cop_config['UseHashRocketsWithSymbolValues']
23
+ pairs = *node
24
+ @force_hash_rockets = pairs.any? { |p| symbol_value?(p) }
25
+ end
26
+
27
+ if style == :hash_rockets || @force_hash_rockets
28
+ hash_rockets_check(node)
29
+ elsif style == :ruby19_no_mixed_keys
30
+ ruby19_no_mixed_keys_check(node)
31
+ else
32
+ ruby19_check(node)
33
+ end
20
34
  end
21
35
 
22
36
  def ruby19_check(node)
23
37
  pairs = *node
24
38
 
25
- sym_indices = pairs.all? { |p| word_symbol_pair?(p) }
26
-
27
- check(pairs, '=>', MSG_19) if sym_indices
39
+ check(pairs, '=>', MSG_19) if sym_indices?(pairs)
28
40
  end
29
41
 
30
42
  def hash_rockets_check(node)
@@ -33,27 +45,60 @@ module RuboCop
33
45
  check(pairs, ':', MSG_HASH_ROCKETS)
34
46
  end
35
47
 
36
- def autocorrect(node)
37
- key = node.children.first.loc.expression
38
- op = node.loc.operator
48
+ def ruby19_no_mixed_keys_check(node)
49
+ pairs = *node
39
50
 
51
+ if @force_hash_rockets
52
+ check(pairs, ':', MSG_HASH_ROCKETS)
53
+ elsif sym_indices?(pairs)
54
+ check(pairs, '=>', MSG_19)
55
+ else
56
+ check(pairs, ':', MSG_RUBY19_NO_MIXED_KEYS)
57
+ end
58
+ end
59
+
60
+ def autocorrect(node)
40
61
  @corrections << lambda do |corrector|
41
- if style == :ruby19
42
- range = Parser::Source::Range.new(key.source_buffer,
43
- key.begin_pos, op.end_pos)
44
- range = range_with_surrounding_space(range, :right)
45
- corrector.replace(range,
46
- range.source.sub(/^:(.*\S)\s*=>\s*$/, '\1: '))
62
+ if style == :hash_rockets || @force_hash_rockets
63
+ autocorrect_hash_rockets(corrector, node)
64
+ elsif style == :ruby19_no_mixed_keys
65
+ autocorrect_ruby19_no_mixed_keys(corrector, node)
47
66
  else
48
- corrector.insert_after(key, ' => ')
49
- corrector.insert_before(key, ':')
50
- corrector.remove(range_with_surrounding_space(op))
67
+ autocorrect_ruby19(corrector, node)
51
68
  end
52
69
  end
53
70
  end
54
71
 
72
+ def alternative_style
73
+ case style
74
+ when :hash_rockets then
75
+ :ruby19
76
+ when :ruby19, :ruby19_no_mixed_keys then
77
+ :hash_rockets
78
+ end
79
+ end
80
+
55
81
  private
56
82
 
83
+ def symbol_value?(pair)
84
+ _key, value = *pair
85
+
86
+ value.sym_type?
87
+ end
88
+
89
+ def sym_indices?(pairs)
90
+ pairs.all? { |p| word_symbol_pair?(p) }
91
+ end
92
+
93
+ def word_symbol_pair?(pair)
94
+ key, _value = *pair
95
+
96
+ return false unless key.sym_type?
97
+
98
+ sym_name = key.loc.expression.source
99
+ sym_name !~ /\A:["']|=\z/
100
+ end
101
+
57
102
  def check(pairs, delim, msg)
58
103
  pairs.each do |pair|
59
104
  if pair.loc.operator && pair.loc.operator.is?(delim)
@@ -68,15 +113,33 @@ module RuboCop
68
113
  end
69
114
  end
70
115
 
71
- def word_symbol_pair?(pair)
72
- key, _value = *pair
116
+ def autocorrect_ruby19(corrector, node)
117
+ key = node.children.first.loc.expression
118
+ op = node.loc.operator
119
+
120
+ range = Parser::Source::Range.new(key.source_buffer,
121
+ key.begin_pos, op.end_pos)
122
+ range = range_with_surrounding_space(range, :right)
123
+ corrector.replace(range,
124
+ range.source.sub(/^:(.*\S)\s*=>\s*$/, '\1: '))
125
+ end
126
+
127
+ def autocorrect_hash_rockets(corrector, node)
128
+ key = node.children.first.loc.expression
129
+ op = node.loc.operator
73
130
 
74
- if key.type == :sym
75
- sym_name = key.to_a[0]
131
+ corrector.insert_after(key, ' => ')
132
+ corrector.insert_before(key, ':')
133
+ corrector.remove(range_with_surrounding_space(op))
134
+ end
135
+
136
+ def autocorrect_ruby19_no_mixed_keys(corrector, node)
137
+ op = node.loc.operator
76
138
 
77
- sym_name =~ /\A[A-Za-z_]\w*\z/
139
+ if op.is?(':')
140
+ autocorrect_hash_rockets(corrector, node)
78
141
  else
79
- false
142
+ autocorrect_ruby19(corrector, node)
80
143
  end
81
144
  end
82
145
  end
@@ -23,6 +23,21 @@ module RuboCop
23
23
  return unless fit_within_line_as_modifier_form?(node)
24
24
  add_offense(node, :keyword, message(node.loc.keyword.source))
25
25
  end
26
+
27
+ def autocorrect(node)
28
+ if node.loc.keyword.source == 'if'
29
+ cond, body = *node
30
+ else
31
+ cond, _else, body = *node
32
+ end
33
+
34
+ @corrections << lambda do |corrector|
35
+ oneline = "#{body.loc.expression.source} " \
36
+ "#{node.loc.keyword.source} " +
37
+ cond.loc.expression.source
38
+ corrector.replace(node.loc.expression, oneline)
39
+ end
40
+ end
26
41
  end
27
42
  end
28
43
  end
@@ -16,6 +16,7 @@ module RuboCop
16
16
  class IndentationConsistency < Cop
17
17
  include AutocorrectAlignment
18
18
  include AccessModifierNode
19
+ include ConfigurableEnforcedStyle
19
20
 
20
21
  MSG = 'Inconsistent indentation detected.'
21
22
 
@@ -30,13 +31,19 @@ module RuboCop
30
31
  private
31
32
 
32
33
  def check(node)
33
- children_to_check = node.children.reject do |child|
34
- # Don't check nodes that have special indentation and will be
35
- # checked by the AccessModifierIndentation cop.
36
- modifier_node?(child)
34
+ children_to_check = [[]]
35
+ node.children.each do |child|
36
+ # Modifier nodes have special indentation and will be checked by
37
+ # the AccessModifierIndentation cop. This cop uses them as dividers
38
+ # in rails mode. Then consistency is checked only within each
39
+ # section delimited by a modifier node.
40
+ if modifier_node?(child)
41
+ children_to_check << [] if style == :rails
42
+ else
43
+ children_to_check.last << child
44
+ end
37
45
  end
38
-
39
- check_alignment(children_to_check)
46
+ children_to_check.each { |group| check_alignment(group) }
40
47
  end
41
48
  end
42
49
  end
@@ -51,12 +51,32 @@ module RuboCop
51
51
 
52
52
  def on_module(node)
53
53
  _module_name, *members = *node
54
- members.each { |m| check_indentation(node.loc.keyword, m) }
54
+ check_members(node, members)
55
55
  end
56
56
 
57
57
  def on_class(node)
58
58
  _class_name, _base_class, *members = *node
59
- members.each { |m| check_indentation(node.loc.keyword, m) }
59
+ check_members(node, members)
60
+ end
61
+
62
+ def check_members(node, members)
63
+ check_indentation(node.loc.keyword, members.first)
64
+
65
+ return unless members.any? && members.first.begin_type?
66
+ style =
67
+ config.for_cop('Style/IndentationConsistency')['EnforcedStyle']
68
+ return unless style == 'rails'
69
+
70
+ special = %w(protected private) # Extra indentation step after these.
71
+ previous_modifier = nil
72
+ members.first.children.each do |m|
73
+ if modifier_node?(m) && special.include?(m.loc.expression.source)
74
+ previous_modifier = m
75
+ elsif previous_modifier
76
+ check_indentation(previous_modifier.loc.expression, m, style)
77
+ previous_modifier = nil
78
+ end
79
+ end
60
80
  end
61
81
 
62
82
  def on_send(node)
@@ -171,7 +191,7 @@ module RuboCop
171
191
  check_indentation(node.loc.else, else_clause)
172
192
  end
173
193
 
174
- def check_indentation(base_loc, body_node)
194
+ def check_indentation(base_loc, body_node, style = 'normal')
175
195
  return unless indentation_to_check?(base_loc, body_node)
176
196
 
177
197
  indentation = body_node.loc.column - base_loc.column
@@ -185,14 +205,11 @@ module RuboCop
185
205
  body_node = body_node.children.first
186
206
  end
187
207
 
188
- expr = body_node.loc.expression
189
- begin_pos, ind = expr.begin_pos, expr.begin_pos - indentation
190
- pos = indentation >= 0 ? ind..begin_pos : begin_pos..ind
191
-
192
- r = Parser::Source::Range.new(expr.source_buffer, pos.begin, pos.end)
193
- add_offense(body_node, r,
208
+ indentation_name = style == 'normal' ? '' : "#{style} "
209
+ add_offense(body_node, offending_range(body_node, indentation),
194
210
  format("Use #{configured_indentation_width} (not %d) " \
195
- 'spaces for indentation.', indentation))
211
+ "spaces for #{indentation_name}indentation.",
212
+ indentation))
196
213
  end
197
214
 
198
215
  def indentation_to_check?(base_loc, body_node)
@@ -211,6 +228,13 @@ module RuboCop
211
228
  true
212
229
  end
213
230
 
231
+ def offending_range(body_node, indentation)
232
+ expr = body_node.loc.expression
233
+ begin_pos, ind = expr.begin_pos, expr.begin_pos - indentation
234
+ pos = indentation >= 0 ? ind..begin_pos : begin_pos..ind
235
+ Parser::Source::Range.new(expr.source_buffer, pos.begin, pos.end)
236
+ end
237
+
214
238
  def starts_with_access_modifier?(body_node)
215
239
  body_node.type == :begin && modifier_node?(body_node.children.first)
216
240
  end
@@ -7,6 +7,8 @@ module RuboCop
7
7
  # anonymous functions and uses of the 1.9 lambda syntax for multi-line
8
8
  # anonymous functions.
9
9
  class Lambda < Cop
10
+ include AutocorrectUnlessChangingAST
11
+
10
12
  SINGLE_MSG = 'Use the new lambda literal syntax `->(params) {...}`.'
11
13
  SINGLE_NO_ARG_MSG = 'Use the new lambda literal syntax `-> {...}`.'
12
14
  MULTI_MSG = 'Use the `lambda` method for multi-line lambdas.'
@@ -22,22 +24,22 @@ module RuboCop
22
24
 
23
25
  return unless block_method == TARGET
24
26
  selector = block_method.loc.selector.source
25
- lambda_length = lambda_length(node)
27
+ length = lambda_length(node)
26
28
 
27
- if selector != '->' && lambda_length == 0
28
- add_offense_for_single_line(block_method, args)
29
- elsif selector == '->' && lambda_length > 0
30
- add_offense(block_method, :expression, MULTI_MSG)
29
+ if selector != '->' && length == 1
30
+ add_offense_for_single_line(node, block_method.loc.expression, args)
31
+ elsif selector == '->' && length > 1
32
+ add_offense(node, block_method.loc.expression, MULTI_MSG)
31
33
  end
32
34
  end
33
35
 
34
36
  private
35
37
 
36
- def add_offense_for_single_line(block_method, args)
38
+ def add_offense_for_single_line(block_node, location, args)
37
39
  if args.children.empty?
38
- add_offense(block_method, :expression, SINGLE_NO_ARG_MSG)
40
+ add_offense(block_node, location, SINGLE_NO_ARG_MSG)
39
41
  else
40
- add_offense(block_method, :expression, SINGLE_MSG)
42
+ add_offense(block_node, location, SINGLE_MSG)
41
43
  end
42
44
  end
43
45
 
@@ -45,28 +47,32 @@ module RuboCop
45
47
  start_line = block_node.loc.begin.line
46
48
  end_line = block_node.loc.end.line
47
49
 
48
- end_line - start_line
50
+ end_line - start_line + 1
49
51
  end
50
52
 
51
- def autocorrect(node)
52
- ancestor = node.ancestors.first
53
+ def correction(node)
54
+ lambda do |corrector|
55
+ block_method, _args = *node
53
56
 
54
- @corrections << lambda do |corrector|
55
- if node.loc.expression.source == 'lambda'
56
- autocorrect_old_to_new(corrector, ancestor)
57
+ if block_method.loc.expression.source == 'lambda'
58
+ autocorrect_old_to_new(corrector, node)
57
59
  else
58
- autocorrect_new_to_old(corrector, ancestor)
60
+ autocorrect_new_to_old(corrector, node)
59
61
  end
60
62
  end
61
63
  end
62
64
 
63
65
  def autocorrect_new_to_old(corrector, node)
64
66
  block_method, args = *node
67
+ # Avoid correcting to `lambdado` by inserting whitespace
68
+ # if none exists before or after the lambda arguments.
69
+ if needs_whitespace?(block_method, args, node)
70
+ corrector.insert_before(node.loc.begin, ' ')
71
+ end
65
72
  corrector.replace(block_method.loc.expression, 'lambda')
73
+ corrector.remove(args.loc.expression) if args.loc.expression
66
74
  return if args.children.empty?
67
-
68
75
  arg_str = " |#{lambda_arg_string(args)}|"
69
- corrector.remove(args.loc.expression)
70
76
  corrector.insert_after(node.loc.begin, arg_str)
71
77
  end
72
78
 
@@ -81,6 +87,15 @@ module RuboCop
81
87
  corrector.remove(whitespace_and_old_args)
82
88
  end
83
89
 
90
+ def needs_whitespace?(block_method, args, node)
91
+ selector_end = block_method.loc.selector.end.end_pos
92
+ args_begin = args.loc.begin && args.loc.begin.begin_pos
93
+ args_end = args.loc.end && args.loc.end.end_pos
94
+ block_begin = node.loc.begin.begin_pos
95
+ (block_begin == args_end && selector_end == args_begin) ||
96
+ (block_begin == selector_end)
97
+ end
98
+
84
99
  def lambda_arg_string(args)
85
100
  args.children.map { |a| a.loc.expression.source }.join(', ')
86
101
  end
@@ -36,6 +36,10 @@ module RuboCop
36
36
 
37
37
  def autocorrect(operator_range)
38
38
  @corrections << lambda do |corrector|
39
+ # Include any trailing whitespace so we don't create a syntax error.
40
+ operator_range = range_with_surrounding_space(operator_range,
41
+ :right, nil,
42
+ !:with_newline)
39
43
  corrector.replace(operator_range, '\\')
40
44
  end
41
45
  end
@@ -0,0 +1,72 @@
1
+ # encoding: utf-8
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # Checks for `if` expressions that do not have an `else` branch.
7
+ # SupportedStyles
8
+ #
9
+ # if
10
+ # @example
11
+ # # bad
12
+ # if condition
13
+ # statement
14
+ # end
15
+ #
16
+ # case
17
+ # @example
18
+ # # bad
19
+ # case var
20
+ # when condition
21
+ # statement
22
+ # end
23
+ #
24
+ # @example
25
+ # # good
26
+ # if condition
27
+ # statement
28
+ # else
29
+ # # the content of the else branch will be determined by Style/EmptyElse
30
+ # end
31
+ class MissingElse < Cop
32
+ include OnNormalIfUnless
33
+ include ConfigurableEnforcedStyle
34
+
35
+ MSG = '`%s` condition requires an `else`-clause.'
36
+ MSG_NIL = '`%s` condition requires an `else`-clause with `nil` in it.'
37
+ MSG_EMPTY = '`%s` condition requires an empty `else`-clause.'
38
+
39
+ def on_normal_if_unless(node)
40
+ unless_else_cop = config.for_cop('Style/UnlessElse')
41
+ unless_else_enabled = unless_else_cop['Enabled'] if unless_else_cop
42
+ return if unless_else_enabled &&
43
+ node.loc.keyword &&
44
+ node.loc.keyword.is?('unless')
45
+ check(node, if_else_clause(node)) unless style == :case
46
+ end
47
+
48
+ def on_case(node)
49
+ check(node, case_else_clause(node)) unless style == :if
50
+ end
51
+
52
+ private
53
+
54
+ def check(node, _else_clause)
55
+ return if node.loc.else
56
+ empty_else = config.for_cop('Style/EmptyElse')
57
+
58
+ if empty_else && empty_else['Enabled']
59
+ case empty_else['EnforcedStyle']
60
+ when 'empty'
61
+ add_offense(node, :expression, format(MSG_NIL, node.type))
62
+ when 'nil'
63
+ add_offense(node, :expression, format(MSG_EMPTY, node.type))
64
+ end
65
+ end
66
+
67
+ add_offense(node, :expression, format(MSG, node.type))
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end