rubbycop 0.49.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.
- checksums.yaml +7 -0
- data/LICENSE.txt +21 -0
- data/README.md +211 -0
- data/assets/logo.png +0 -0
- data/assets/output.html.erb +261 -0
- data/bin/rubbycop +17 -0
- data/config/default.yml +1548 -0
- data/config/disabled.yml +119 -0
- data/config/enabled.yml +1734 -0
- data/lib/rubbycop.rb +510 -0
- data/lib/rubbycop/ast/builder.rb +64 -0
- data/lib/rubbycop/ast/node.rb +610 -0
- data/lib/rubbycop/ast/node/and_node.rb +37 -0
- data/lib/rubbycop/ast/node/array_node.rb +48 -0
- data/lib/rubbycop/ast/node/case_node.rb +64 -0
- data/lib/rubbycop/ast/node/ensure_node.rb +25 -0
- data/lib/rubbycop/ast/node/for_node.rb +53 -0
- data/lib/rubbycop/ast/node/hash_node.rb +109 -0
- data/lib/rubbycop/ast/node/if_node.rb +138 -0
- data/lib/rubbycop/ast/node/keyword_splat_node.rb +45 -0
- data/lib/rubbycop/ast/node/mixin/binary_operator_node.rb +23 -0
- data/lib/rubbycop/ast/node/mixin/conditional_node.rb +45 -0
- data/lib/rubbycop/ast/node/mixin/hash_element_node.rb +125 -0
- data/lib/rubbycop/ast/node/mixin/modifier_node.rb +17 -0
- data/lib/rubbycop/ast/node/mixin/predicate_operator_node.rb +35 -0
- data/lib/rubbycop/ast/node/or_node.rb +37 -0
- data/lib/rubbycop/ast/node/pair_node.rb +64 -0
- data/lib/rubbycop/ast/node/resbody_node.rb +25 -0
- data/lib/rubbycop/ast/node/send_node.rb +209 -0
- data/lib/rubbycop/ast/node/until_node.rb +43 -0
- data/lib/rubbycop/ast/node/when_node.rb +61 -0
- data/lib/rubbycop/ast/node/while_node.rb +43 -0
- data/lib/rubbycop/ast/sexp.rb +16 -0
- data/lib/rubbycop/ast/traversal.rb +171 -0
- data/lib/rubbycop/cached_data.rb +63 -0
- data/lib/rubbycop/cli.rb +199 -0
- data/lib/rubbycop/comment_config.rb +155 -0
- data/lib/rubbycop/config.rb +444 -0
- data/lib/rubbycop/config_loader.rb +244 -0
- data/lib/rubbycop/config_loader_resolver.rb +43 -0
- data/lib/rubbycop/config_store.rb +48 -0
- data/lib/rubbycop/cop/autocorrect_logic.rb +26 -0
- data/lib/rubbycop/cop/badge.rb +73 -0
- data/lib/rubbycop/cop/bundler/duplicated_gem.rb +69 -0
- data/lib/rubbycop/cop/bundler/ordered_gems.rb +113 -0
- data/lib/rubbycop/cop/commissioner.rb +118 -0
- data/lib/rubbycop/cop/cop.rb +222 -0
- data/lib/rubbycop/cop/corrector.rb +135 -0
- data/lib/rubbycop/cop/force.rb +41 -0
- data/lib/rubbycop/cop/ignored_node.rb +38 -0
- data/lib/rubbycop/cop/layout/access_modifier_indentation.rb +109 -0
- data/lib/rubbycop/cop/layout/align_array.rb +35 -0
- data/lib/rubbycop/cop/layout/align_hash.rb +235 -0
- data/lib/rubbycop/cop/layout/align_parameters.rb +97 -0
- data/lib/rubbycop/cop/layout/block_end_newline.rb +56 -0
- data/lib/rubbycop/cop/layout/case_indentation.rb +163 -0
- data/lib/rubbycop/cop/layout/closing_parenthesis_indentation.rb +88 -0
- data/lib/rubbycop/cop/layout/comment_indentation.rb +71 -0
- data/lib/rubbycop/cop/layout/dot_position.rb +84 -0
- data/lib/rubbycop/cop/layout/else_alignment.rb +105 -0
- data/lib/rubbycop/cop/layout/empty_line_after_magic_comment.rb +63 -0
- data/lib/rubbycop/cop/layout/empty_line_between_defs.rb +143 -0
- data/lib/rubbycop/cop/layout/empty_lines.rb +60 -0
- data/lib/rubbycop/cop/layout/empty_lines_around_access_modifier.rb +90 -0
- data/lib/rubbycop/cop/layout/empty_lines_around_begin_body.rb +42 -0
- data/lib/rubbycop/cop/layout/empty_lines_around_block_body.rb +41 -0
- data/lib/rubbycop/cop/layout/empty_lines_around_class_body.rb +39 -0
- data/lib/rubbycop/cop/layout/empty_lines_around_exception_handling_keywords.rb +127 -0
- data/lib/rubbycop/cop/layout/empty_lines_around_method_body.rb +41 -0
- data/lib/rubbycop/cop/layout/empty_lines_around_module_body.rb +44 -0
- data/lib/rubbycop/cop/layout/end_of_line.rb +52 -0
- data/lib/rubbycop/cop/layout/extra_spacing.rb +237 -0
- data/lib/rubbycop/cop/layout/first_array_element_line_break.rb +41 -0
- data/lib/rubbycop/cop/layout/first_hash_element_line_break.rb +33 -0
- data/lib/rubbycop/cop/layout/first_method_argument_line_break.rb +49 -0
- data/lib/rubbycop/cop/layout/first_method_parameter_line_break.rb +42 -0
- data/lib/rubbycop/cop/layout/first_parameter_indentation.rb +109 -0
- data/lib/rubbycop/cop/layout/indent_array.rb +114 -0
- data/lib/rubbycop/cop/layout/indent_assignment.rb +42 -0
- data/lib/rubbycop/cop/layout/indent_hash.rb +134 -0
- data/lib/rubbycop/cop/layout/indent_heredoc.rb +173 -0
- data/lib/rubbycop/cop/layout/indentation_consistency.rb +51 -0
- data/lib/rubbycop/cop/layout/indentation_width.rb +303 -0
- data/lib/rubbycop/cop/layout/initial_indentation.rb +42 -0
- data/lib/rubbycop/cop/layout/leading_comment_space.rb +43 -0
- data/lib/rubbycop/cop/layout/multiline_array_brace_layout.rb +81 -0
- data/lib/rubbycop/cop/layout/multiline_assignment_layout.rb +88 -0
- data/lib/rubbycop/cop/layout/multiline_block_layout.rb +134 -0
- data/lib/rubbycop/cop/layout/multiline_hash_brace_layout.rb +81 -0
- data/lib/rubbycop/cop/layout/multiline_method_call_brace_layout.rb +97 -0
- data/lib/rubbycop/cop/layout/multiline_method_call_indentation.rb +215 -0
- data/lib/rubbycop/cop/layout/multiline_method_definition_brace_layout.rb +82 -0
- data/lib/rubbycop/cop/layout/multiline_operation_indentation.rb +89 -0
- data/lib/rubbycop/cop/layout/rescue_ensure_alignment.rb +86 -0
- data/lib/rubbycop/cop/layout/space_after_colon.rb +40 -0
- data/lib/rubbycop/cop/layout/space_after_comma.rb +21 -0
- data/lib/rubbycop/cop/layout/space_after_method_name.rb +37 -0
- data/lib/rubbycop/cop/layout/space_after_not.rb +38 -0
- data/lib/rubbycop/cop/layout/space_after_semicolon.rb +21 -0
- data/lib/rubbycop/cop/layout/space_around_block_parameters.rb +109 -0
- data/lib/rubbycop/cop/layout/space_around_equals_in_parameter_default.rb +68 -0
- data/lib/rubbycop/cop/layout/space_around_keyword.rb +224 -0
- data/lib/rubbycop/cop/layout/space_around_operators.rb +142 -0
- data/lib/rubbycop/cop/layout/space_before_block_braces.rb +54 -0
- data/lib/rubbycop/cop/layout/space_before_comma.rb +16 -0
- data/lib/rubbycop/cop/layout/space_before_comment.rb +27 -0
- data/lib/rubbycop/cop/layout/space_before_first_arg.rb +64 -0
- data/lib/rubbycop/cop/layout/space_before_semicolon.rb +16 -0
- data/lib/rubbycop/cop/layout/space_in_lambda_literal.rb +87 -0
- data/lib/rubbycop/cop/layout/space_inside_array_percent_literal.rb +53 -0
- data/lib/rubbycop/cop/layout/space_inside_block_braces.rb +158 -0
- data/lib/rubbycop/cop/layout/space_inside_brackets.rb +20 -0
- data/lib/rubbycop/cop/layout/space_inside_hash_literal_braces.rb +150 -0
- data/lib/rubbycop/cop/layout/space_inside_parens.rb +16 -0
- data/lib/rubbycop/cop/layout/space_inside_percent_literal_delimiters.rb +64 -0
- data/lib/rubbycop/cop/layout/space_inside_range_literal.rb +63 -0
- data/lib/rubbycop/cop/layout/space_inside_string_interpolation.rb +65 -0
- data/lib/rubbycop/cop/layout/tab.rb +57 -0
- data/lib/rubbycop/cop/layout/trailing_blank_lines.rb +78 -0
- data/lib/rubbycop/cop/layout/trailing_whitespace.rb +28 -0
- data/lib/rubbycop/cop/lint/ambiguous_block_association.rb +66 -0
- data/lib/rubbycop/cop/lint/ambiguous_operator.rb +55 -0
- data/lib/rubbycop/cop/lint/ambiguous_regexp_literal.rb +43 -0
- data/lib/rubbycop/cop/lint/assignment_in_condition.rb +80 -0
- data/lib/rubbycop/cop/lint/block_alignment.rb +229 -0
- data/lib/rubbycop/cop/lint/circular_argument_reference.rb +83 -0
- data/lib/rubbycop/cop/lint/condition_position.rb +52 -0
- data/lib/rubbycop/cop/lint/debugger.rb +72 -0
- data/lib/rubbycop/cop/lint/def_end_alignment.rb +78 -0
- data/lib/rubbycop/cop/lint/deprecated_class_methods.rb +90 -0
- data/lib/rubbycop/cop/lint/duplicate_case_condition.rb +53 -0
- data/lib/rubbycop/cop/lint/duplicate_methods.rb +151 -0
- data/lib/rubbycop/cop/lint/duplicated_key.rb +38 -0
- data/lib/rubbycop/cop/lint/each_with_object_argument.rb +39 -0
- data/lib/rubbycop/cop/lint/else_layout.rb +65 -0
- data/lib/rubbycop/cop/lint/empty_ensure.rb +60 -0
- data/lib/rubbycop/cop/lint/empty_expression.rb +42 -0
- data/lib/rubbycop/cop/lint/empty_interpolation.rb +36 -0
- data/lib/rubbycop/cop/lint/empty_when.rb +38 -0
- data/lib/rubbycop/cop/lint/end_alignment.rb +157 -0
- data/lib/rubbycop/cop/lint/end_in_method.rb +40 -0
- data/lib/rubbycop/cop/lint/ensure_return.rb +43 -0
- data/lib/rubbycop/cop/lint/float_out_of_range.rb +35 -0
- data/lib/rubbycop/cop/lint/format_parameter_mismatch.rb +182 -0
- data/lib/rubbycop/cop/lint/handle_exceptions.rb +56 -0
- data/lib/rubbycop/cop/lint/implicit_string_concatenation.rb +95 -0
- data/lib/rubbycop/cop/lint/ineffective_access_modifier.rb +143 -0
- data/lib/rubbycop/cop/lint/inherit_exception.rb +83 -0
- data/lib/rubbycop/cop/lint/invalid_character_literal.rb +41 -0
- data/lib/rubbycop/cop/lint/literal_in_condition.rb +127 -0
- data/lib/rubbycop/cop/lint/literal_in_interpolation.rb +76 -0
- data/lib/rubbycop/cop/lint/loop.rb +63 -0
- data/lib/rubbycop/cop/lint/multiple_compare.rb +48 -0
- data/lib/rubbycop/cop/lint/nested_method_definition.rb +105 -0
- data/lib/rubbycop/cop/lint/next_without_accumulator.rb +50 -0
- data/lib/rubbycop/cop/lint/non_local_exit_from_iterator.rb +85 -0
- data/lib/rubbycop/cop/lint/parentheses_as_grouped_expression.rb +60 -0
- data/lib/rubbycop/cop/lint/percent_string_array.rb +84 -0
- data/lib/rubbycop/cop/lint/percent_symbol_array.rb +66 -0
- data/lib/rubbycop/cop/lint/rand_one.rb +39 -0
- data/lib/rubbycop/cop/lint/require_parentheses.rb +61 -0
- data/lib/rubbycop/cop/lint/rescue_exception.rb +45 -0
- data/lib/rubbycop/cop/lint/safe_navigation_chain.rb +70 -0
- data/lib/rubbycop/cop/lint/shadowed_exception.rb +132 -0
- data/lib/rubbycop/cop/lint/shadowing_outer_local_variable.rb +53 -0
- data/lib/rubbycop/cop/lint/string_conversion_in_interpolation.rb +58 -0
- data/lib/rubbycop/cop/lint/syntax.rb +55 -0
- data/lib/rubbycop/cop/lint/underscore_prefixed_variable_name.rb +62 -0
- data/lib/rubbycop/cop/lint/unified_integer.rb +42 -0
- data/lib/rubbycop/cop/lint/unneeded_disable.rb +231 -0
- data/lib/rubbycop/cop/lint/unneeded_splat_expansion.rb +141 -0
- data/lib/rubbycop/cop/lint/unreachable_code.rb +52 -0
- data/lib/rubbycop/cop/lint/unused_block_argument.rb +145 -0
- data/lib/rubbycop/cop/lint/unused_method_argument.rb +61 -0
- data/lib/rubbycop/cop/lint/useless_access_modifier.rb +229 -0
- data/lib/rubbycop/cop/lint/useless_assignment.rb +132 -0
- data/lib/rubbycop/cop/lint/useless_comparison.rb +28 -0
- data/lib/rubbycop/cop/lint/useless_else_without_rescue.rb +46 -0
- data/lib/rubbycop/cop/lint/useless_setter_call.rb +162 -0
- data/lib/rubbycop/cop/lint/void.rb +108 -0
- data/lib/rubbycop/cop/message_annotator.rb +116 -0
- data/lib/rubbycop/cop/metrics/abc_size.rb +39 -0
- data/lib/rubbycop/cop/metrics/block_length.rb +32 -0
- data/lib/rubbycop/cop/metrics/block_nesting.rb +64 -0
- data/lib/rubbycop/cop/metrics/class_length.rb +24 -0
- data/lib/rubbycop/cop/metrics/cyclomatic_complexity.rb +31 -0
- data/lib/rubbycop/cop/metrics/line_length.rb +168 -0
- data/lib/rubbycop/cop/metrics/method_length.rb +27 -0
- data/lib/rubbycop/cop/metrics/module_length.rb +24 -0
- data/lib/rubbycop/cop/metrics/parameter_lists.rb +45 -0
- data/lib/rubbycop/cop/metrics/perceived_complexity.rb +61 -0
- data/lib/rubbycop/cop/mixin/access_modifier_node.rb +41 -0
- data/lib/rubbycop/cop/mixin/annotation_comment.rb +36 -0
- data/lib/rubbycop/cop/mixin/array_hash_indentation.rb +82 -0
- data/lib/rubbycop/cop/mixin/array_min_size.rb +59 -0
- data/lib/rubbycop/cop/mixin/array_syntax.rb +15 -0
- data/lib/rubbycop/cop/mixin/autocorrect_alignment.rb +149 -0
- data/lib/rubbycop/cop/mixin/check_assignment.rb +40 -0
- data/lib/rubbycop/cop/mixin/classish_length.rb +36 -0
- data/lib/rubbycop/cop/mixin/code_length.rb +32 -0
- data/lib/rubbycop/cop/mixin/configurable_enforced_style.rb +97 -0
- data/lib/rubbycop/cop/mixin/configurable_formatting.rb +48 -0
- data/lib/rubbycop/cop/mixin/configurable_max.rb +19 -0
- data/lib/rubbycop/cop/mixin/configurable_naming.rb +16 -0
- data/lib/rubbycop/cop/mixin/configurable_numbering.rb +17 -0
- data/lib/rubbycop/cop/mixin/def_node.rb +27 -0
- data/lib/rubbycop/cop/mixin/documentation_comment.rb +46 -0
- data/lib/rubbycop/cop/mixin/duplication.rb +46 -0
- data/lib/rubbycop/cop/mixin/empty_lines_around_body.rb +161 -0
- data/lib/rubbycop/cop/mixin/end_keyword_alignment.rb +85 -0
- data/lib/rubbycop/cop/mixin/enforce_superclass.rb +36 -0
- data/lib/rubbycop/cop/mixin/first_element_line_break.rb +41 -0
- data/lib/rubbycop/cop/mixin/frozen_string_literal.rb +37 -0
- data/lib/rubbycop/cop/mixin/hash_alignment.rb +116 -0
- data/lib/rubbycop/cop/mixin/ignored_pattern.rb +27 -0
- data/lib/rubbycop/cop/mixin/integer_node.rb +12 -0
- data/lib/rubbycop/cop/mixin/match_range.rb +22 -0
- data/lib/rubbycop/cop/mixin/method_complexity.rb +30 -0
- data/lib/rubbycop/cop/mixin/method_preference.rb +30 -0
- data/lib/rubbycop/cop/mixin/min_body_length.rb +19 -0
- data/lib/rubbycop/cop/mixin/multiline_expression_indentation.rb +183 -0
- data/lib/rubbycop/cop/mixin/multiline_literal_brace_layout.rb +152 -0
- data/lib/rubbycop/cop/mixin/negative_conditional.rb +43 -0
- data/lib/rubbycop/cop/mixin/on_method_def.rb +44 -0
- data/lib/rubbycop/cop/mixin/on_normal_if_unless.rb +14 -0
- data/lib/rubbycop/cop/mixin/parentheses.rb +22 -0
- data/lib/rubbycop/cop/mixin/parser_diagnostic.rb +34 -0
- data/lib/rubbycop/cop/mixin/percent_literal.rb +100 -0
- data/lib/rubbycop/cop/mixin/preceding_following_alignment.rb +89 -0
- data/lib/rubbycop/cop/mixin/rescue_node.rb +21 -0
- data/lib/rubbycop/cop/mixin/safe_assignment.rb +20 -0
- data/lib/rubbycop/cop/mixin/safe_mode.rb +22 -0
- data/lib/rubbycop/cop/mixin/space_after_punctuation.rb +55 -0
- data/lib/rubbycop/cop/mixin/space_before_punctuation.rb +48 -0
- data/lib/rubbycop/cop/mixin/space_inside.rb +76 -0
- data/lib/rubbycop/cop/mixin/statement_modifier.rb +69 -0
- data/lib/rubbycop/cop/mixin/string_help.rb +33 -0
- data/lib/rubbycop/cop/mixin/string_literals_help.rb +33 -0
- data/lib/rubbycop/cop/mixin/surrounding_space.rb +40 -0
- data/lib/rubbycop/cop/mixin/target_rails_version.rb +16 -0
- data/lib/rubbycop/cop/mixin/target_ruby_version.rb +16 -0
- data/lib/rubbycop/cop/mixin/too_many_lines.rb +39 -0
- data/lib/rubbycop/cop/mixin/trailing_comma.rb +161 -0
- data/lib/rubbycop/cop/mixin/unused_argument.rb +42 -0
- data/lib/rubbycop/cop/offense.rb +188 -0
- data/lib/rubbycop/cop/performance/caller.rb +41 -0
- data/lib/rubbycop/cop/performance/case_when_splat.rb +176 -0
- data/lib/rubbycop/cop/performance/casecmp.rb +107 -0
- data/lib/rubbycop/cop/performance/compare_with_block.rb +107 -0
- data/lib/rubbycop/cop/performance/count.rb +98 -0
- data/lib/rubbycop/cop/performance/detect.rb +107 -0
- data/lib/rubbycop/cop/performance/double_start_end_with.rb +102 -0
- data/lib/rubbycop/cop/performance/end_with.rb +55 -0
- data/lib/rubbycop/cop/performance/fixed_size.rb +56 -0
- data/lib/rubbycop/cop/performance/flat_map.rb +73 -0
- data/lib/rubbycop/cop/performance/hash_each_methods.rb +84 -0
- data/lib/rubbycop/cop/performance/lstrip_rstrip.rb +41 -0
- data/lib/rubbycop/cop/performance/range_include.rb +41 -0
- data/lib/rubbycop/cop/performance/redundant_block_call.rb +93 -0
- data/lib/rubbycop/cop/performance/redundant_match.rb +55 -0
- data/lib/rubbycop/cop/performance/redundant_merge.rb +149 -0
- data/lib/rubbycop/cop/performance/redundant_sort_by.rb +45 -0
- data/lib/rubbycop/cop/performance/regexp_match.rb +215 -0
- data/lib/rubbycop/cop/performance/reverse_each.rb +40 -0
- data/lib/rubbycop/cop/performance/sample.rb +140 -0
- data/lib/rubbycop/cop/performance/size.rb +71 -0
- data/lib/rubbycop/cop/performance/start_with.rb +58 -0
- data/lib/rubbycop/cop/performance/string_replacement.rb +170 -0
- data/lib/rubbycop/cop/performance/times_map.rb +61 -0
- data/lib/rubbycop/cop/rails/action_filter.rb +96 -0
- data/lib/rubbycop/cop/rails/active_support_aliases.rb +68 -0
- data/lib/rubbycop/cop/rails/application_job.rb +32 -0
- data/lib/rubbycop/cop/rails/application_record.rb +32 -0
- data/lib/rubbycop/cop/rails/blank.rb +138 -0
- data/lib/rubbycop/cop/rails/date.rb +127 -0
- data/lib/rubbycop/cop/rails/delegate.rb +106 -0
- data/lib/rubbycop/cop/rails/delegate_allow_blank.rb +51 -0
- data/lib/rubbycop/cop/rails/dynamic_find_by.rb +81 -0
- data/lib/rubbycop/cop/rails/enum_uniqueness.rb +43 -0
- data/lib/rubbycop/cop/rails/exit.rb +61 -0
- data/lib/rubbycop/cop/rails/file_path.rb +75 -0
- data/lib/rubbycop/cop/rails/find_by.rb +51 -0
- data/lib/rubbycop/cop/rails/find_each.rb +47 -0
- data/lib/rubbycop/cop/rails/has_and_belongs_to_many.rb +18 -0
- data/lib/rubbycop/cop/rails/http_positional_arguments.rb +106 -0
- data/lib/rubbycop/cop/rails/not_null_column.rb +67 -0
- data/lib/rubbycop/cop/rails/output.rb +23 -0
- data/lib/rubbycop/cop/rails/output_safety.rb +58 -0
- data/lib/rubbycop/cop/rails/pluralization_grammar.rb +106 -0
- data/lib/rubbycop/cop/rails/present.rb +143 -0
- data/lib/rubbycop/cop/rails/read_write_attribute.rb +65 -0
- data/lib/rubbycop/cop/rails/relative_date_constant.rb +88 -0
- data/lib/rubbycop/cop/rails/request_referer.rb +56 -0
- data/lib/rubbycop/cop/rails/reversible_migration.rb +216 -0
- data/lib/rubbycop/cop/rails/safe_navigation.rb +91 -0
- data/lib/rubbycop/cop/rails/save_bang.rb +160 -0
- data/lib/rubbycop/cop/rails/scope_args.rb +29 -0
- data/lib/rubbycop/cop/rails/skips_model_validations.rb +63 -0
- data/lib/rubbycop/cop/rails/time_zone.rb +197 -0
- data/lib/rubbycop/cop/rails/uniq_before_pluck.rb +93 -0
- data/lib/rubbycop/cop/rails/validation.rb +64 -0
- data/lib/rubbycop/cop/registry.rb +171 -0
- data/lib/rubbycop/cop/security/eval.rb +30 -0
- data/lib/rubbycop/cop/security/json_load.rb +44 -0
- data/lib/rubbycop/cop/security/marshal_load.rb +37 -0
- data/lib/rubbycop/cop/security/yaml_load.rb +37 -0
- data/lib/rubbycop/cop/severity.rb +76 -0
- data/lib/rubbycop/cop/style/accessor_method_name.rb +45 -0
- data/lib/rubbycop/cop/style/alias.rb +119 -0
- data/lib/rubbycop/cop/style/and_or.rb +125 -0
- data/lib/rubbycop/cop/style/array_join.rb +30 -0
- data/lib/rubbycop/cop/style/ascii_comments.rb +38 -0
- data/lib/rubbycop/cop/style/ascii_identifiers.rb +36 -0
- data/lib/rubbycop/cop/style/attr.rb +50 -0
- data/lib/rubbycop/cop/style/auto_resource_cleanup.rb +42 -0
- data/lib/rubbycop/cop/style/bare_percent_literals.rb +57 -0
- data/lib/rubbycop/cop/style/begin_block.rb +16 -0
- data/lib/rubbycop/cop/style/block_comments.rb +46 -0
- data/lib/rubbycop/cop/style/block_delimiters.rb +228 -0
- data/lib/rubbycop/cop/style/braces_around_hash_parameters.rb +138 -0
- data/lib/rubbycop/cop/style/case_equality.rb +18 -0
- data/lib/rubbycop/cop/style/character_literal.rb +43 -0
- data/lib/rubbycop/cop/style/class_and_module_camel_case.rb +29 -0
- data/lib/rubbycop/cop/style/class_and_module_children.rb +69 -0
- data/lib/rubbycop/cop/style/class_check.rb +40 -0
- data/lib/rubbycop/cop/style/class_methods.rb +67 -0
- data/lib/rubbycop/cop/style/class_vars.rb +23 -0
- data/lib/rubbycop/cop/style/collection_methods.rb +51 -0
- data/lib/rubbycop/cop/style/colon_method_call.rb +33 -0
- data/lib/rubbycop/cop/style/command_literal.rb +119 -0
- data/lib/rubbycop/cop/style/comment_annotation.rb +62 -0
- data/lib/rubbycop/cop/style/conditional_assignment.rb +691 -0
- data/lib/rubbycop/cop/style/constant_name.rb +29 -0
- data/lib/rubbycop/cop/style/copyright.rb +89 -0
- data/lib/rubbycop/cop/style/def_with_parentheses.rb +31 -0
- data/lib/rubbycop/cop/style/documentation.rb +79 -0
- data/lib/rubbycop/cop/style/documentation_method.rb +80 -0
- data/lib/rubbycop/cop/style/double_negation.rb +35 -0
- data/lib/rubbycop/cop/style/each_for_simple_loop.rb +57 -0
- data/lib/rubbycop/cop/style/each_with_object.rb +91 -0
- data/lib/rubbycop/cop/style/empty_case_condition.rb +84 -0
- data/lib/rubbycop/cop/style/empty_else.rb +138 -0
- data/lib/rubbycop/cop/style/empty_literal.rb +108 -0
- data/lib/rubbycop/cop/style/empty_method.rb +102 -0
- data/lib/rubbycop/cop/style/encoding.rb +92 -0
- data/lib/rubbycop/cop/style/end_block.rb +17 -0
- data/lib/rubbycop/cop/style/even_odd.rb +56 -0
- data/lib/rubbycop/cop/style/file_name.rb +183 -0
- data/lib/rubbycop/cop/style/flip_flop.rb +20 -0
- data/lib/rubbycop/cop/style/for.rb +50 -0
- data/lib/rubbycop/cop/style/format_string.rb +46 -0
- data/lib/rubbycop/cop/style/format_string_token.rb +141 -0
- data/lib/rubbycop/cop/style/frozen_string_literal_comment.rb +96 -0
- data/lib/rubbycop/cop/style/global_vars.rb +70 -0
- data/lib/rubbycop/cop/style/guard_clause.rb +90 -0
- data/lib/rubbycop/cop/style/hash_syntax.rb +214 -0
- data/lib/rubbycop/cop/style/identical_conditional_branches.rb +130 -0
- data/lib/rubbycop/cop/style/if_inside_else.rb +45 -0
- data/lib/rubbycop/cop/style/if_unless_modifier.rb +80 -0
- data/lib/rubbycop/cop/style/if_unless_modifier_of_if_unless.rb +38 -0
- data/lib/rubbycop/cop/style/if_with_semicolon.rb +20 -0
- data/lib/rubbycop/cop/style/implicit_runtime_error.rb +31 -0
- data/lib/rubbycop/cop/style/infinite_loop.rb +91 -0
- data/lib/rubbycop/cop/style/inline_comment.rb +32 -0
- data/lib/rubbycop/cop/style/inverse_methods.rb +130 -0
- data/lib/rubbycop/cop/style/lambda.rb +209 -0
- data/lib/rubbycop/cop/style/lambda_call.rb +66 -0
- data/lib/rubbycop/cop/style/line_end_concatenation.rb +115 -0
- data/lib/rubbycop/cop/style/method_call_with_args_parentheses.rb +107 -0
- data/lib/rubbycop/cop/style/method_call_without_args_parentheses.rb +75 -0
- data/lib/rubbycop/cop/style/method_called_on_do_end_block.rb +44 -0
- data/lib/rubbycop/cop/style/method_def_parentheses.rb +83 -0
- data/lib/rubbycop/cop/style/method_missing.rb +81 -0
- data/lib/rubbycop/cop/style/method_name.rb +28 -0
- data/lib/rubbycop/cop/style/missing_else.rb +100 -0
- data/lib/rubbycop/cop/style/mixin_grouping.rb +135 -0
- data/lib/rubbycop/cop/style/module_function.rb +64 -0
- data/lib/rubbycop/cop/style/multiline_block_chain.rb +42 -0
- data/lib/rubbycop/cop/style/multiline_if_modifier.rb +63 -0
- data/lib/rubbycop/cop/style/multiline_if_then.rb +47 -0
- data/lib/rubbycop/cop/style/multiline_memoization.rb +77 -0
- data/lib/rubbycop/cop/style/multiline_ternary_operator.rb +19 -0
- data/lib/rubbycop/cop/style/mutable_constant.rb +68 -0
- data/lib/rubbycop/cop/style/negated_if.rb +103 -0
- data/lib/rubbycop/cop/style/negated_while.rb +32 -0
- data/lib/rubbycop/cop/style/nested_modifier.rb +87 -0
- data/lib/rubbycop/cop/style/nested_parenthesized_calls.rb +61 -0
- data/lib/rubbycop/cop/style/nested_ternary_operator.rb +21 -0
- data/lib/rubbycop/cop/style/next.rb +225 -0
- data/lib/rubbycop/cop/style/nil_comparison.rb +35 -0
- data/lib/rubbycop/cop/style/non_nil_check.rb +121 -0
- data/lib/rubbycop/cop/style/not.rb +69 -0
- data/lib/rubbycop/cop/style/numeric_literal_prefix.rb +97 -0
- data/lib/rubbycop/cop/style/numeric_literals.rb +101 -0
- data/lib/rubbycop/cop/style/numeric_predicate.rb +140 -0
- data/lib/rubbycop/cop/style/one_line_conditional.rb +75 -0
- data/lib/rubbycop/cop/style/op_method.rb +41 -0
- data/lib/rubbycop/cop/style/option_hash.rb +58 -0
- data/lib/rubbycop/cop/style/optional_arguments.rb +62 -0
- data/lib/rubbycop/cop/style/parallel_assignment.rb +287 -0
- data/lib/rubbycop/cop/style/parentheses_around_condition.rb +56 -0
- data/lib/rubbycop/cop/style/percent_literal_delimiters.rb +100 -0
- data/lib/rubbycop/cop/style/percent_q_literals.rb +52 -0
- data/lib/rubbycop/cop/style/perl_backrefs.rb +31 -0
- data/lib/rubbycop/cop/style/predicate_name.rb +67 -0
- data/lib/rubbycop/cop/style/preferred_hash_methods.rb +78 -0
- data/lib/rubbycop/cop/style/proc.rb +26 -0
- data/lib/rubbycop/cop/style/raise_args.rb +140 -0
- data/lib/rubbycop/cop/style/redundant_begin.rb +47 -0
- data/lib/rubbycop/cop/style/redundant_exception.rb +55 -0
- data/lib/rubbycop/cop/style/redundant_freeze.rb +45 -0
- data/lib/rubbycop/cop/style/redundant_parentheses.rb +199 -0
- data/lib/rubbycop/cop/style/redundant_return.rb +121 -0
- data/lib/rubbycop/cop/style/redundant_self.rb +144 -0
- data/lib/rubbycop/cop/style/regexp_literal.rb +114 -0
- data/lib/rubbycop/cop/style/rescue_modifier.rb +37 -0
- data/lib/rubbycop/cop/style/safe_navigation.rb +145 -0
- data/lib/rubbycop/cop/style/self_assignment.rb +93 -0
- data/lib/rubbycop/cop/style/semicolon.rb +70 -0
- data/lib/rubbycop/cop/style/send.rb +21 -0
- data/lib/rubbycop/cop/style/signal_exception.rb +109 -0
- data/lib/rubbycop/cop/style/single_line_block_params.rb +68 -0
- data/lib/rubbycop/cop/style/single_line_methods.rb +77 -0
- data/lib/rubbycop/cop/style/special_global_vars.rb +156 -0
- data/lib/rubbycop/cop/style/stabby_lambda_parentheses.rb +113 -0
- data/lib/rubbycop/cop/style/string_literals.rb +102 -0
- data/lib/rubbycop/cop/style/string_literals_in_interpolation.rb +30 -0
- data/lib/rubbycop/cop/style/string_methods.rb +34 -0
- data/lib/rubbycop/cop/style/struct_inheritance.rb +32 -0
- data/lib/rubbycop/cop/style/symbol_array.rb +109 -0
- data/lib/rubbycop/cop/style/symbol_literal.rb +32 -0
- data/lib/rubbycop/cop/style/symbol_proc.rb +143 -0
- data/lib/rubbycop/cop/style/ternary_parentheses.rb +200 -0
- data/lib/rubbycop/cop/style/trailing_comma_in_arguments.rb +64 -0
- data/lib/rubbycop/cop/style/trailing_comma_in_literal.rb +56 -0
- data/lib/rubbycop/cop/style/trailing_underscore_variable.rb +113 -0
- data/lib/rubbycop/cop/style/trivial_accessors.rb +176 -0
- data/lib/rubbycop/cop/style/unless_else.rb +39 -0
- data/lib/rubbycop/cop/style/unneeded_capital_w.rb +41 -0
- data/lib/rubbycop/cop/style/unneeded_interpolation.rb +98 -0
- data/lib/rubbycop/cop/style/unneeded_percent_q.rb +96 -0
- data/lib/rubbycop/cop/style/variable_interpolation.rb +44 -0
- data/lib/rubbycop/cop/style/variable_name.rb +39 -0
- data/lib/rubbycop/cop/style/variable_number.rb +78 -0
- data/lib/rubbycop/cop/style/when_then.rb +24 -0
- data/lib/rubbycop/cop/style/while_until_do.rb +36 -0
- data/lib/rubbycop/cop/style/while_until_modifier.rb +41 -0
- data/lib/rubbycop/cop/style/word_array.rb +114 -0
- data/lib/rubbycop/cop/style/zero_length_predicate.rb +90 -0
- data/lib/rubbycop/cop/team.rb +193 -0
- data/lib/rubbycop/cop/util.rb +309 -0
- data/lib/rubbycop/cop/variable_force.rb +458 -0
- data/lib/rubbycop/cop/variable_force/assignment.rb +90 -0
- data/lib/rubbycop/cop/variable_force/branch.rb +318 -0
- data/lib/rubbycop/cop/variable_force/branchable.rb +21 -0
- data/lib/rubbycop/cop/variable_force/reference.rb +49 -0
- data/lib/rubbycop/cop/variable_force/scope.rb +107 -0
- data/lib/rubbycop/cop/variable_force/variable.rb +103 -0
- data/lib/rubbycop/cop/variable_force/variable_table.rb +128 -0
- data/lib/rubbycop/error.rb +11 -0
- data/lib/rubbycop/formatter/base_formatter.rb +123 -0
- data/lib/rubbycop/formatter/clang_style_formatter.rb +54 -0
- data/lib/rubbycop/formatter/colorizable.rb +41 -0
- data/lib/rubbycop/formatter/disabled_config_formatter.rb +181 -0
- data/lib/rubbycop/formatter/disabled_lines_formatter.rb +57 -0
- data/lib/rubbycop/formatter/emacs_style_formatter.rb +24 -0
- data/lib/rubbycop/formatter/file_list_formatter.rb +19 -0
- data/lib/rubbycop/formatter/formatter_set.rb +102 -0
- data/lib/rubbycop/formatter/fuubar_style_formatter.rb +80 -0
- data/lib/rubbycop/formatter/html_formatter.rb +134 -0
- data/lib/rubbycop/formatter/json_formatter.rb +74 -0
- data/lib/rubbycop/formatter/offense_count_formatter.rb +55 -0
- data/lib/rubbycop/formatter/progress_formatter.rb +63 -0
- data/lib/rubbycop/formatter/simple_text_formatter.rb +136 -0
- data/lib/rubbycop/formatter/text_util.rb +20 -0
- data/lib/rubbycop/formatter/worst_offenders_formatter.rb +60 -0
- data/lib/rubbycop/magic_comment.rb +210 -0
- data/lib/rubbycop/name_similarity.rb +21 -0
- data/lib/rubbycop/node_pattern.rb +543 -0
- data/lib/rubbycop/options.rb +355 -0
- data/lib/rubbycop/path_util.rb +36 -0
- data/lib/rubbycop/platform.rb +11 -0
- data/lib/rubbycop/processed_source.rb +151 -0
- data/lib/rubbycop/rake_task.rb +86 -0
- data/lib/rubbycop/remote_config.rb +78 -0
- data/lib/rubbycop/result_cache.rb +176 -0
- data/lib/rubbycop/rspec/cop_helper.rb +98 -0
- data/lib/rubbycop/rspec/host_environment_simulation_helper.rb +32 -0
- data/lib/rubbycop/rspec/shared_contexts.rb +98 -0
- data/lib/rubbycop/rspec/shared_examples.rb +92 -0
- data/lib/rubbycop/rspec/support.rb +8 -0
- data/lib/rubbycop/runner.rb +338 -0
- data/lib/rubbycop/string_interpreter.rb +57 -0
- data/lib/rubbycop/string_util.rb +156 -0
- data/lib/rubbycop/target_finder.rb +201 -0
- data/lib/rubbycop/token.rb +25 -0
- data/lib/rubbycop/version.rb +19 -0
- data/lib/rubbycop/warning.rb +11 -0
- metadata +663 -0
@@ -0,0 +1,82 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module Cop
|
5
|
+
module Layout
|
6
|
+
# This cop checks that the closing brace in a method definition is either
|
7
|
+
# on the same line as the last method parameter, or a new line.
|
8
|
+
#
|
9
|
+
# When using the `symmetrical` (default) style:
|
10
|
+
#
|
11
|
+
# If a method definition's opening brace is on the same line as the
|
12
|
+
# first parameter of the definition, then the closing brace should be
|
13
|
+
# on the same line as the last parameter of the definition.
|
14
|
+
#
|
15
|
+
# If an method definition's opening brace is on the line above the first
|
16
|
+
# parameter of the definition, then the closing brace should be on the
|
17
|
+
# line below the last parameter of the definition.
|
18
|
+
#
|
19
|
+
# When using the `new_line` style:
|
20
|
+
#
|
21
|
+
# The closing brace of a multi-line method definition must be on the line
|
22
|
+
# after the last parameter of the definition.
|
23
|
+
#
|
24
|
+
# When using the `same_line` style:
|
25
|
+
#
|
26
|
+
# The closing brace of a multi-line method definition must be on the same
|
27
|
+
# line as the last parameter of the definition.
|
28
|
+
#
|
29
|
+
# @example
|
30
|
+
#
|
31
|
+
# # symmetrical: bad
|
32
|
+
# # new_line: good
|
33
|
+
# # same_line: bad
|
34
|
+
# def foo(a,
|
35
|
+
# b
|
36
|
+
# )
|
37
|
+
#
|
38
|
+
# # symmetrical: bad
|
39
|
+
# # new_line: bad
|
40
|
+
# # same_line: good
|
41
|
+
# def foo(
|
42
|
+
# a,
|
43
|
+
# b)
|
44
|
+
#
|
45
|
+
# # symmetrical: good
|
46
|
+
# # new_line: bad
|
47
|
+
# # same_line: good
|
48
|
+
# def foo(a,
|
49
|
+
# b)
|
50
|
+
#
|
51
|
+
# # symmetrical: good
|
52
|
+
# # new_line: good
|
53
|
+
# # same_line: bad
|
54
|
+
# def foo(
|
55
|
+
# a,
|
56
|
+
# b
|
57
|
+
# )
|
58
|
+
class MultilineMethodDefinitionBraceLayout < Cop
|
59
|
+
include OnMethodDef
|
60
|
+
include MultilineLiteralBraceLayout
|
61
|
+
|
62
|
+
SAME_LINE_MESSAGE = 'Closing method definition brace must be on the ' \
|
63
|
+
'same line as the last parameter when opening brace is on the same ' \
|
64
|
+
'line as the first parameter.'.freeze
|
65
|
+
|
66
|
+
NEW_LINE_MESSAGE = 'Closing method definition brace must be on the ' \
|
67
|
+
'line after the last parameter when opening brace is on a separate ' \
|
68
|
+
'line from the first parameter.'.freeze
|
69
|
+
|
70
|
+
ALWAYS_NEW_LINE_MESSAGE = 'Closing method definition brace must be ' \
|
71
|
+
'on the line after the last parameter.'.freeze
|
72
|
+
|
73
|
+
ALWAYS_SAME_LINE_MESSAGE = 'Closing method definition brace must be ' \
|
74
|
+
'on the same line as the last parameter.'.freeze
|
75
|
+
|
76
|
+
def on_method_def(_node, _method_name, args, _body)
|
77
|
+
check_brace_layout(args)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module Cop
|
5
|
+
module Layout
|
6
|
+
# This cop checks the indentation of the right hand side operand in
|
7
|
+
# binary operations that span more than one line.
|
8
|
+
#
|
9
|
+
# @example
|
10
|
+
# # bad
|
11
|
+
# if a +
|
12
|
+
# b
|
13
|
+
# something
|
14
|
+
# end
|
15
|
+
class MultilineOperationIndentation < Cop
|
16
|
+
include ConfigurableEnforcedStyle
|
17
|
+
include AutocorrectAlignment
|
18
|
+
include MultilineExpressionIndentation
|
19
|
+
|
20
|
+
def on_and(node)
|
21
|
+
check_and_or(node)
|
22
|
+
end
|
23
|
+
|
24
|
+
def on_or(node)
|
25
|
+
check_and_or(node)
|
26
|
+
end
|
27
|
+
|
28
|
+
def validate_config
|
29
|
+
return unless style == :aligned && cop_config['IndentationWidth']
|
30
|
+
|
31
|
+
raise ValidationError, 'The `Layout/MultilineOperationIndentation`' \
|
32
|
+
' cop only accepts an `IndentationWidth` ' \
|
33
|
+
'configuration parameter when ' \
|
34
|
+
'`EnforcedStyle` is `indented`.'
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def relevant_node?(node)
|
40
|
+
!node.loc.dot # Don't check method calls with dot operator.
|
41
|
+
end
|
42
|
+
|
43
|
+
def check_and_or(node)
|
44
|
+
lhs, rhs = *node
|
45
|
+
range = offending_range(node, lhs, rhs.source_range, style)
|
46
|
+
check(range, node, lhs, rhs.source_range)
|
47
|
+
end
|
48
|
+
|
49
|
+
def offending_range(node, lhs, rhs, given_style)
|
50
|
+
return false unless begins_its_line?(rhs)
|
51
|
+
return false if lhs.loc.line == rhs.line # Needed for unary op.
|
52
|
+
return false if not_for_this_cop?(node)
|
53
|
+
|
54
|
+
correct_column = if should_align?(node, rhs, given_style)
|
55
|
+
node.loc.column
|
56
|
+
else
|
57
|
+
indentation(lhs) + correct_indentation(node)
|
58
|
+
end
|
59
|
+
@column_delta = correct_column - rhs.column
|
60
|
+
rhs if @column_delta.nonzero?
|
61
|
+
end
|
62
|
+
|
63
|
+
def should_align?(node, rhs, given_style)
|
64
|
+
assignment_node = part_of_assignment_rhs(node, rhs)
|
65
|
+
if assignment_node
|
66
|
+
assignment_rhs = CheckAssignment.extract_rhs(assignment_node)
|
67
|
+
return true if begins_its_line?(assignment_rhs.source_range)
|
68
|
+
end
|
69
|
+
|
70
|
+
given_style == :aligned &&
|
71
|
+
(kw_node_with_special_indentation(node) ||
|
72
|
+
assignment_node ||
|
73
|
+
argument_in_method_call(node, :with_or_without_parentheses))
|
74
|
+
end
|
75
|
+
|
76
|
+
def message(node, lhs, rhs)
|
77
|
+
what = operation_description(node, rhs)
|
78
|
+
if should_align?(node, rhs, style)
|
79
|
+
"Align the operands of #{what} spanning multiple lines."
|
80
|
+
else
|
81
|
+
used_indentation = rhs.column - indentation(lhs)
|
82
|
+
"Use #{correct_indentation(node)} (not #{used_indentation}) " \
|
83
|
+
"spaces for indenting #{what} spanning multiple lines."
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module Cop
|
5
|
+
module Layout
|
6
|
+
# This cop checks whether the rescue and ensure keywords are aligned
|
7
|
+
# properly.
|
8
|
+
#
|
9
|
+
# @example
|
10
|
+
#
|
11
|
+
# # bad
|
12
|
+
# begin
|
13
|
+
# something
|
14
|
+
# rescue
|
15
|
+
# puts 'error'
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
# # good
|
19
|
+
# begin
|
20
|
+
# something
|
21
|
+
# rescue
|
22
|
+
# puts 'error'
|
23
|
+
# end
|
24
|
+
class RescueEnsureAlignment < Cop
|
25
|
+
MSG = '`%s` at %d, %d is not aligned with `end` at %d, %d.'.freeze
|
26
|
+
|
27
|
+
def on_resbody(node)
|
28
|
+
check(node) unless modifier?(node)
|
29
|
+
end
|
30
|
+
|
31
|
+
def on_ensure(node)
|
32
|
+
check(node)
|
33
|
+
end
|
34
|
+
|
35
|
+
def investigate(processed_source)
|
36
|
+
@modifier_locations =
|
37
|
+
processed_source.tokens.each_with_object([]) do |token, locations|
|
38
|
+
next unless token.type == :kRESCUE_MOD
|
39
|
+
locations << token.pos
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def autocorrect(node)
|
44
|
+
whitespace = whitespace_range(node)
|
45
|
+
return false unless whitespace.source.strip.empty?
|
46
|
+
|
47
|
+
new_column = ancestor_node(node).loc.end.column
|
48
|
+
->(corrector) { corrector.replace(whitespace, ' ' * new_column) }
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def check(node)
|
54
|
+
end_loc = ancestor_node(node).loc.end
|
55
|
+
kw_loc = node.loc.keyword
|
56
|
+
|
57
|
+
return if end_loc.column == kw_loc.column
|
58
|
+
return if end_loc.line == kw_loc.line
|
59
|
+
|
60
|
+
add_offense(node, kw_loc, format_message(kw_loc, end_loc))
|
61
|
+
end
|
62
|
+
|
63
|
+
def format_message(kw_loc, end_loc)
|
64
|
+
format(MSG, kw_loc.source, kw_loc.line, kw_loc.column, end_loc.line,
|
65
|
+
end_loc.column)
|
66
|
+
end
|
67
|
+
|
68
|
+
def modifier?(node)
|
69
|
+
return false unless @modifier_locations.respond_to?(:include?)
|
70
|
+
@modifier_locations.include?(node.loc.keyword)
|
71
|
+
end
|
72
|
+
|
73
|
+
def whitespace_range(node)
|
74
|
+
begin_pos = node.loc.keyword.begin_pos
|
75
|
+
current_column = node.loc.keyword.column
|
76
|
+
|
77
|
+
range_between(begin_pos - current_column, begin_pos)
|
78
|
+
end
|
79
|
+
|
80
|
+
def ancestor_node(node)
|
81
|
+
node.each_ancestor(:kwbegin, :def, :defs, :class, :module).first
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module Cop
|
5
|
+
module Layout
|
6
|
+
# Checks for colon (:) not followed by some kind of space.
|
7
|
+
# N.B. this cop does not handle spaces after a ternary operator, which are
|
8
|
+
# instead handled by Layout/SpaceAroundOperators.
|
9
|
+
class SpaceAfterColon < Cop
|
10
|
+
MSG = 'Space missing after colon.'.freeze
|
11
|
+
|
12
|
+
def on_pair(node)
|
13
|
+
return unless node.colon?
|
14
|
+
|
15
|
+
colon = node.loc.operator
|
16
|
+
|
17
|
+
add_offense(colon, colon) unless followed_by_space?(colon)
|
18
|
+
end
|
19
|
+
|
20
|
+
def on_kwoptarg(node)
|
21
|
+
# We have no direct reference to the colon source range following an
|
22
|
+
# optional keyword argument's name, so must construct one.
|
23
|
+
colon = node.loc.name.end.resize(1)
|
24
|
+
|
25
|
+
add_offense(colon, colon) unless followed_by_space?(colon)
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def followed_by_space?(colon)
|
31
|
+
colon.source_buffer.source[colon.end_pos] =~ /\s/
|
32
|
+
end
|
33
|
+
|
34
|
+
def autocorrect(range)
|
35
|
+
->(corrector) { corrector.insert_after(range, ' ') }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module Cop
|
5
|
+
module Layout
|
6
|
+
# Checks for comma (,) not followed by some kind of space.
|
7
|
+
class SpaceAfterComma < Cop
|
8
|
+
include SpaceAfterPunctuation
|
9
|
+
|
10
|
+
def space_style_before_rcurly
|
11
|
+
cfg = config.for_cop('Layout/SpaceInsideHashLiteralBraces')
|
12
|
+
cfg['EnforcedStyle'] || 'space'
|
13
|
+
end
|
14
|
+
|
15
|
+
def kind(token)
|
16
|
+
'comma' if token.type == :tCOMMA
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module Cop
|
5
|
+
module Layout
|
6
|
+
# Checks for space between a method name and a left parenthesis in defs.
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
#
|
10
|
+
# # bad
|
11
|
+
# def func (x) ... end
|
12
|
+
#
|
13
|
+
# # good
|
14
|
+
# def func(x) ... end
|
15
|
+
class SpaceAfterMethodName < Cop
|
16
|
+
include OnMethodDef
|
17
|
+
|
18
|
+
MSG = 'Do not put a space between a method name and the opening ' \
|
19
|
+
'parenthesis.'.freeze
|
20
|
+
|
21
|
+
def on_method_def(_node, _method_name, args, _body)
|
22
|
+
return unless args.loc.begin && args.loc.begin.is?('(')
|
23
|
+
expr = args.source_range
|
24
|
+
pos_before_left_paren = range_between(expr.begin_pos - 1,
|
25
|
+
expr.begin_pos)
|
26
|
+
return unless pos_before_left_paren.source =~ /\s/
|
27
|
+
|
28
|
+
add_offense(pos_before_left_paren, pos_before_left_paren)
|
29
|
+
end
|
30
|
+
|
31
|
+
def autocorrect(pos_before_left_paren)
|
32
|
+
->(corrector) { corrector.remove(pos_before_left_paren) }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module Cop
|
5
|
+
module Layout
|
6
|
+
# This cop checks for space after `!`.
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
# # bad
|
10
|
+
# ! something
|
11
|
+
#
|
12
|
+
# # good
|
13
|
+
# !something
|
14
|
+
class SpaceAfterNot < Cop
|
15
|
+
MSG = 'Do not leave space between `!` and its argument.'.freeze
|
16
|
+
|
17
|
+
def on_send(node)
|
18
|
+
return unless node.keyword_bang? && whitespace_after_operator?(node)
|
19
|
+
|
20
|
+
add_offense(node, :expression)
|
21
|
+
end
|
22
|
+
|
23
|
+
def whitespace_after_operator?(node)
|
24
|
+
node.receiver.loc.column - node.loc.column > 1
|
25
|
+
end
|
26
|
+
|
27
|
+
def autocorrect(node)
|
28
|
+
lambda do |corrector|
|
29
|
+
corrector.remove(
|
30
|
+
range_between(node.loc.selector.end_pos,
|
31
|
+
node.receiver.source_range.begin_pos)
|
32
|
+
)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module Cop
|
5
|
+
module Layout
|
6
|
+
# Checks for semicolon (;) not followed by some kind of space.
|
7
|
+
class SpaceAfterSemicolon < Cop
|
8
|
+
include SpaceAfterPunctuation
|
9
|
+
|
10
|
+
def space_style_before_rcurly
|
11
|
+
cfg = config.for_cop('Layout/SpaceInsideBlockBraces')
|
12
|
+
cfg['EnforcedStyle'] || 'space'
|
13
|
+
end
|
14
|
+
|
15
|
+
def kind(token)
|
16
|
+
'semicolon' if token.type == :tSEMI
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module Cop
|
5
|
+
module Layout
|
6
|
+
# Checks the spacing inside and after block parameters pipes.
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
#
|
10
|
+
# # bad
|
11
|
+
# {}.each { | x, y |puts x }
|
12
|
+
#
|
13
|
+
# # good
|
14
|
+
# {}.each { |x, y| puts x }
|
15
|
+
class SpaceAroundBlockParameters < Cop
|
16
|
+
include ConfigurableEnforcedStyle
|
17
|
+
|
18
|
+
def on_block(node)
|
19
|
+
_method, args, body = *node
|
20
|
+
opening_pipe = args.loc.begin
|
21
|
+
closing_pipe = args.loc.end
|
22
|
+
return unless !args.children.empty? && opening_pipe
|
23
|
+
|
24
|
+
check_inside_pipes(args.children, opening_pipe, closing_pipe)
|
25
|
+
|
26
|
+
if body
|
27
|
+
check_space(closing_pipe.end_pos, body.source_range.begin_pos,
|
28
|
+
closing_pipe, 'after closing `|`')
|
29
|
+
end
|
30
|
+
|
31
|
+
check_each_arg(args)
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def style_parameter_name
|
37
|
+
'EnforcedStyleInsidePipes'
|
38
|
+
end
|
39
|
+
|
40
|
+
def check_inside_pipes(args, opening_pipe, closing_pipe)
|
41
|
+
if style == :no_space
|
42
|
+
check_no_space_style_inside_pipes(args, opening_pipe, closing_pipe)
|
43
|
+
elsif style == :space
|
44
|
+
check_space_style_inside_pipes(args, opening_pipe, closing_pipe)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def check_no_space_style_inside_pipes(args, opening_pipe, closing_pipe)
|
49
|
+
first = args.first.source_range
|
50
|
+
last = args.last.source_range
|
51
|
+
|
52
|
+
check_no_space(opening_pipe.end_pos, first.begin_pos,
|
53
|
+
'Space before first')
|
54
|
+
check_no_space(last_end_pos_inside_pipes(last.end_pos),
|
55
|
+
closing_pipe.begin_pos, 'Space after last')
|
56
|
+
end
|
57
|
+
|
58
|
+
def check_space_style_inside_pipes(args, opening_pipe, closing_pipe)
|
59
|
+
first = args.first.source_range
|
60
|
+
last = args.last.source_range
|
61
|
+
last_end_pos = last_end_pos_inside_pipes(last.end_pos)
|
62
|
+
|
63
|
+
check_space(opening_pipe.end_pos, first.begin_pos, first,
|
64
|
+
'before first block parameter')
|
65
|
+
check_space(last_end_pos, closing_pipe.begin_pos, last,
|
66
|
+
'after last block parameter')
|
67
|
+
check_no_space(opening_pipe.end_pos, first.begin_pos - 1,
|
68
|
+
'Extra space before first')
|
69
|
+
check_no_space(last_end_pos + 1, closing_pipe.begin_pos,
|
70
|
+
'Extra space after last')
|
71
|
+
end
|
72
|
+
|
73
|
+
def last_end_pos_inside_pipes(pos)
|
74
|
+
processed_source.buffer.source[pos] == ',' ? pos + 1 : pos
|
75
|
+
end
|
76
|
+
|
77
|
+
def check_each_arg(args)
|
78
|
+
args.children.butfirst.each do |arg|
|
79
|
+
expr = arg.source_range
|
80
|
+
check_no_space(range_with_surrounding_space(expr, :left).begin_pos,
|
81
|
+
expr.begin_pos - 1, 'Extra space before')
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def check_space(space_begin_pos, space_end_pos, range, msg)
|
86
|
+
return if space_begin_pos != space_end_pos
|
87
|
+
|
88
|
+
add_offense(range, range, "Space #{msg} missing.")
|
89
|
+
end
|
90
|
+
|
91
|
+
def check_no_space(space_begin_pos, space_end_pos, msg)
|
92
|
+
return if space_begin_pos >= space_end_pos
|
93
|
+
|
94
|
+
range = range_between(space_begin_pos, space_end_pos)
|
95
|
+
add_offense(range, range, "#{msg} block parameter detected.")
|
96
|
+
end
|
97
|
+
|
98
|
+
def autocorrect(range)
|
99
|
+
lambda do |corrector|
|
100
|
+
case range.source
|
101
|
+
when /^\s+$/ then corrector.remove(range)
|
102
|
+
else corrector.insert_after(range, ' ')
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|