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,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module Cop
|
5
|
+
module Layout
|
6
|
+
# This cops checks for inconsistent indentation.
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
#
|
10
|
+
# class A
|
11
|
+
# def test
|
12
|
+
# puts 'hello'
|
13
|
+
# puts 'world'
|
14
|
+
# end
|
15
|
+
# end
|
16
|
+
class IndentationConsistency < Cop
|
17
|
+
include AutocorrectAlignment
|
18
|
+
include AccessModifierNode
|
19
|
+
include ConfigurableEnforcedStyle
|
20
|
+
|
21
|
+
MSG = 'Inconsistent indentation detected.'.freeze
|
22
|
+
|
23
|
+
def on_begin(node)
|
24
|
+
check(node)
|
25
|
+
end
|
26
|
+
|
27
|
+
def on_kwbegin(node)
|
28
|
+
check(node)
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def check(node)
|
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
|
45
|
+
end
|
46
|
+
children_to_check.each { |group| check_alignment(group) }
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,303 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module Cop
|
5
|
+
module Layout
|
6
|
+
# This cops checks for indentation that doesn't use the specified number
|
7
|
+
# of spaces.
|
8
|
+
#
|
9
|
+
# See also the IndentationConsistency cop which is the companion to this
|
10
|
+
# one.
|
11
|
+
#
|
12
|
+
# @example
|
13
|
+
# # bad, Width: 2
|
14
|
+
# class A
|
15
|
+
# def test
|
16
|
+
# puts 'hello'
|
17
|
+
# end
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# # bad, Width: 2,
|
21
|
+
# IgnoredPatterns:
|
22
|
+
# - '^\s*module'
|
23
|
+
# module A
|
24
|
+
# class B
|
25
|
+
# def test
|
26
|
+
# puts 'hello'
|
27
|
+
# end
|
28
|
+
# end
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
# # good, Width: 2
|
32
|
+
# class A
|
33
|
+
# def test
|
34
|
+
# puts 'hello'
|
35
|
+
# end
|
36
|
+
# end
|
37
|
+
#
|
38
|
+
# # good, Width: 2,
|
39
|
+
# IgnoredPatterns:
|
40
|
+
# - '^\s*module'
|
41
|
+
# module A
|
42
|
+
# class B
|
43
|
+
# def test
|
44
|
+
# puts 'hello'
|
45
|
+
# end
|
46
|
+
# end
|
47
|
+
# end
|
48
|
+
class IndentationWidth < Cop # rubbycop:disable Metrics/ClassLength
|
49
|
+
include EndKeywordAlignment
|
50
|
+
include AutocorrectAlignment
|
51
|
+
include OnMethodDef
|
52
|
+
include CheckAssignment
|
53
|
+
include AccessModifierNode
|
54
|
+
include IgnoredPattern
|
55
|
+
|
56
|
+
SPECIAL_MODIFIERS = %w[private protected].freeze
|
57
|
+
|
58
|
+
def on_rescue(node)
|
59
|
+
_begin_node, *_rescue_nodes, else_node = *node
|
60
|
+
check_indentation(node.loc.else, else_node)
|
61
|
+
end
|
62
|
+
|
63
|
+
def on_ensure(node)
|
64
|
+
check_indentation(node.loc.keyword, node.body)
|
65
|
+
end
|
66
|
+
|
67
|
+
alias on_resbody on_ensure
|
68
|
+
alias on_for on_ensure
|
69
|
+
|
70
|
+
def on_kwbegin(node)
|
71
|
+
# Check indentation against end keyword but only if it's first on its
|
72
|
+
# line.
|
73
|
+
return unless begins_its_line?(node.loc.end)
|
74
|
+
check_indentation(node.loc.end, node.children.first)
|
75
|
+
end
|
76
|
+
|
77
|
+
def on_block(node)
|
78
|
+
_method, _args, body = *node
|
79
|
+
# Check body against end/} indentation. Checking against variable
|
80
|
+
# assignments, etc, would be more difficult. The end/} must be at the
|
81
|
+
# beginning of its line.
|
82
|
+
loc = node.loc
|
83
|
+
return unless begins_its_line?(loc.end)
|
84
|
+
|
85
|
+
check_indentation(loc.end, body)
|
86
|
+
return unless indentation_consistency_style == 'rails'
|
87
|
+
|
88
|
+
check_members(loc.end, [body])
|
89
|
+
end
|
90
|
+
|
91
|
+
def on_module(node)
|
92
|
+
_module_name, *members = *node
|
93
|
+
check_members(node.loc.keyword, members)
|
94
|
+
end
|
95
|
+
|
96
|
+
def on_class(node)
|
97
|
+
_class_name, _base_class, *members = *node
|
98
|
+
check_members(node.loc.keyword, members)
|
99
|
+
end
|
100
|
+
|
101
|
+
def on_send(node)
|
102
|
+
super
|
103
|
+
return unless modifier_and_def_on_same_line?(node)
|
104
|
+
|
105
|
+
*_, body = *node.first_argument
|
106
|
+
|
107
|
+
def_end_config = config.for_cop('Lint/DefEndAlignment')
|
108
|
+
style = def_end_config['EnforcedStyleAlignWith'] || 'start_of_line'
|
109
|
+
base = style == 'def' ? node.first_argument : node
|
110
|
+
|
111
|
+
check_indentation(base.source_range, body)
|
112
|
+
ignore_node(node.first_argument)
|
113
|
+
end
|
114
|
+
|
115
|
+
def on_method_def(node, _method_name, _args, body)
|
116
|
+
check_indentation(node.loc.keyword, body) unless ignored_node?(node)
|
117
|
+
end
|
118
|
+
|
119
|
+
def on_while(node, base = node)
|
120
|
+
return if ignored_node?(node)
|
121
|
+
|
122
|
+
return unless node.single_line_condition?
|
123
|
+
|
124
|
+
check_indentation(base.loc, node.body)
|
125
|
+
end
|
126
|
+
|
127
|
+
alias on_until on_while
|
128
|
+
|
129
|
+
def on_case(case_node)
|
130
|
+
case_node.each_when do |when_node|
|
131
|
+
check_indentation(when_node.loc.keyword, when_node.body)
|
132
|
+
end
|
133
|
+
|
134
|
+
check_indentation(case_node.when_branches.last.loc.keyword,
|
135
|
+
case_node.else_branch)
|
136
|
+
end
|
137
|
+
|
138
|
+
def on_if(node, base = node)
|
139
|
+
return if ignored_node?(node) || !node.body
|
140
|
+
return if node.ternary? || node.modifier_form?
|
141
|
+
|
142
|
+
check_if(node, node.body, node.else_branch, base.loc)
|
143
|
+
end
|
144
|
+
|
145
|
+
private
|
146
|
+
|
147
|
+
def check_members(base, members)
|
148
|
+
check_indentation(base, members.first)
|
149
|
+
|
150
|
+
return unless members.any? && members.first.begin_type?
|
151
|
+
return unless indentation_consistency_style == 'rails'
|
152
|
+
|
153
|
+
each_member(members) do |member, previous_modifier|
|
154
|
+
check_indentation(previous_modifier, member,
|
155
|
+
indentation_consistency_style)
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
def each_member(members)
|
160
|
+
previous_modifier = nil
|
161
|
+
members.first.children.each do |member|
|
162
|
+
if special_modifier?(member)
|
163
|
+
previous_modifier = member
|
164
|
+
elsif previous_modifier
|
165
|
+
yield member, previous_modifier.source_range
|
166
|
+
previous_modifier = nil
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
def special_modifier?(node)
|
172
|
+
modifier_node?(node) && SPECIAL_MODIFIERS.include?(node.source)
|
173
|
+
end
|
174
|
+
|
175
|
+
def indentation_consistency_style
|
176
|
+
config.for_cop('Layout/IndentationConsistency')['EnforcedStyle']
|
177
|
+
end
|
178
|
+
|
179
|
+
def check_assignment(node, rhs)
|
180
|
+
# If there are method calls chained to the right hand side of the
|
181
|
+
# assignment, we let rhs be the receiver of those method calls before
|
182
|
+
# we check its indentation.
|
183
|
+
rhs = first_part_of_call_chain(rhs)
|
184
|
+
return unless rhs
|
185
|
+
|
186
|
+
end_config = config.for_cop('Lint/EndAlignment')
|
187
|
+
style = end_config['EnforcedStyleAlignWith'] || 'keyword'
|
188
|
+
base = variable_alignment?(node.loc, rhs, style.to_sym) ? node : rhs
|
189
|
+
|
190
|
+
case rhs.type
|
191
|
+
when :if then on_if(rhs, base)
|
192
|
+
when :while, :until then on_while(rhs, base)
|
193
|
+
else return
|
194
|
+
end
|
195
|
+
|
196
|
+
ignore_node(rhs)
|
197
|
+
end
|
198
|
+
|
199
|
+
def check_if(node, body, else_clause, base_loc)
|
200
|
+
return if node.ternary?
|
201
|
+
|
202
|
+
check_indentation(base_loc, body)
|
203
|
+
return unless else_clause
|
204
|
+
|
205
|
+
# If the else clause is an elsif, it will get its own on_if call so
|
206
|
+
# we don't need to process it here.
|
207
|
+
return if else_clause.if_type? && else_clause.elsif?
|
208
|
+
|
209
|
+
check_indentation(node.loc.else, else_clause)
|
210
|
+
end
|
211
|
+
|
212
|
+
def check_indentation(base_loc, body_node, style = 'normal')
|
213
|
+
return unless indentation_to_check?(base_loc, body_node)
|
214
|
+
|
215
|
+
indentation = body_node.loc.column - effective_column(base_loc)
|
216
|
+
@column_delta = configured_indentation_width - indentation
|
217
|
+
return if @column_delta.zero?
|
218
|
+
|
219
|
+
offense(body_node, indentation, style)
|
220
|
+
end
|
221
|
+
|
222
|
+
def offense(body_node, indentation, style)
|
223
|
+
# This cop only auto-corrects the first statement in a def body, for
|
224
|
+
# example.
|
225
|
+
if body_node.begin_type? && !parentheses?(body_node)
|
226
|
+
body_node = body_node.children.first
|
227
|
+
end
|
228
|
+
|
229
|
+
# Since autocorrect changes a number of lines, and not only the line
|
230
|
+
# where the reported offending range is, we avoid auto-correction if
|
231
|
+
# this cop has already found other offenses is the same
|
232
|
+
# range. Otherwise, two corrections can interfere with each other,
|
233
|
+
# resulting in corrupted code.
|
234
|
+
node = if autocorrect? && other_offense_in_same_range?(body_node)
|
235
|
+
nil
|
236
|
+
else
|
237
|
+
body_node
|
238
|
+
end
|
239
|
+
|
240
|
+
indentation_name = style == 'normal' ? '' : "#{style} "
|
241
|
+
add_offense(node, offending_range(body_node, indentation),
|
242
|
+
format("Use #{configured_indentation_width} (not %d) " \
|
243
|
+
"spaces for #{indentation_name}indentation.",
|
244
|
+
indentation))
|
245
|
+
end
|
246
|
+
|
247
|
+
# Returns true if the given node is within another node that has
|
248
|
+
# already been marked for auto-correction by this cop.
|
249
|
+
def other_offense_in_same_range?(node)
|
250
|
+
expr = node.source_range
|
251
|
+
@offense_ranges ||= []
|
252
|
+
|
253
|
+
return true if @offense_ranges.any? { |r| within?(expr, r) }
|
254
|
+
|
255
|
+
@offense_ranges << expr
|
256
|
+
false
|
257
|
+
end
|
258
|
+
|
259
|
+
def indentation_to_check?(base_loc, body_node)
|
260
|
+
return false if skip_check?(base_loc, body_node)
|
261
|
+
|
262
|
+
if %i[rescue ensure].include?(body_node.type)
|
263
|
+
block_body, = *body_node
|
264
|
+
return unless block_body
|
265
|
+
end
|
266
|
+
|
267
|
+
true
|
268
|
+
end
|
269
|
+
|
270
|
+
def skip_check?(base_loc, body_node)
|
271
|
+
return true if ignored_line?(base_loc)
|
272
|
+
return true unless body_node
|
273
|
+
|
274
|
+
# Don't check if expression is on same line as "then" keyword, etc.
|
275
|
+
return true if body_node.loc.line == base_loc.line
|
276
|
+
|
277
|
+
return true if starts_with_access_modifier?(body_node)
|
278
|
+
|
279
|
+
# Don't check indentation if the line doesn't start with the body.
|
280
|
+
# For example, lines like "else do_something".
|
281
|
+
first_char_pos_on_line = body_node.source_range.source_line =~ /\S/
|
282
|
+
return true unless body_node.loc.column == first_char_pos_on_line
|
283
|
+
end
|
284
|
+
|
285
|
+
def offending_range(body_node, indentation)
|
286
|
+
expr = body_node.source_range
|
287
|
+
begin_pos = expr.begin_pos
|
288
|
+
ind = expr.begin_pos - indentation
|
289
|
+
pos = indentation >= 0 ? ind..begin_pos : begin_pos..ind
|
290
|
+
range_between(pos.begin, pos.end)
|
291
|
+
end
|
292
|
+
|
293
|
+
def starts_with_access_modifier?(body_node)
|
294
|
+
body_node.begin_type? && modifier_node?(body_node.children.first)
|
295
|
+
end
|
296
|
+
|
297
|
+
def configured_indentation_width
|
298
|
+
cop_config['Width']
|
299
|
+
end
|
300
|
+
end
|
301
|
+
end
|
302
|
+
end
|
303
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module Cop
|
5
|
+
module Layout
|
6
|
+
# This cops checks for indentation of the first non-blank non-comment
|
7
|
+
# line in a file.
|
8
|
+
class InitialIndentation < Cop
|
9
|
+
MSG = 'Indentation of first line in file detected.'.freeze
|
10
|
+
|
11
|
+
def investigate(_processed_source)
|
12
|
+
token = first_token
|
13
|
+
space_before(token) { |space| add_offense(space, token.pos) }
|
14
|
+
end
|
15
|
+
|
16
|
+
def autocorrect(range)
|
17
|
+
->(corrector) { corrector.remove(range) }
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def first_token
|
23
|
+
processed_source.tokens.find { |t| !t.text.start_with?('#') }
|
24
|
+
end
|
25
|
+
|
26
|
+
def space_before(token)
|
27
|
+
return unless token
|
28
|
+
return if token.pos.column.zero?
|
29
|
+
|
30
|
+
token_with_space =
|
31
|
+
range_with_surrounding_space(token.pos, :left, false)
|
32
|
+
# If the file starts with a byte order mark (BOM), the column can be
|
33
|
+
# non-zero, but then we find out here if there's no space to the left
|
34
|
+
# of the first token.
|
35
|
+
return if token_with_space == token.pos
|
36
|
+
|
37
|
+
yield range_between(token_with_space.begin_pos, token.pos.begin_pos)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module Cop
|
5
|
+
module Layout
|
6
|
+
# This cop checks whether comments have a leading space
|
7
|
+
# after the # denoting the start of the comment. The
|
8
|
+
# leading space is not required for some RDoc special syntax,
|
9
|
+
# like #++, #--, #:nodoc, etc. Neither is it required for
|
10
|
+
# =begin/=end comments.
|
11
|
+
class LeadingCommentSpace < Cop
|
12
|
+
MSG = 'Missing space after #.'.freeze
|
13
|
+
|
14
|
+
def investigate(processed_source)
|
15
|
+
processed_source.comments.each do |comment|
|
16
|
+
next unless comment.text =~ /\A#+[^#\s=:+-]/
|
17
|
+
next if comment.text.start_with?('#!') && comment.loc.line == 1
|
18
|
+
|
19
|
+
# in config.ru files, if the first line starts with #\ it is treated
|
20
|
+
# as options (e.g. `#\ -p 8765` sets the request port to 8765)
|
21
|
+
next if comment.text.start_with?('#\\') && comment.loc.line == 1 &&
|
22
|
+
config_ru?(processed_source.buffer.name)
|
23
|
+
|
24
|
+
add_offense(comment, :expression)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def autocorrect(comment)
|
29
|
+
expr = comment.loc.expression
|
30
|
+
b = expr.begin_pos
|
31
|
+
hash_mark = range_between(b, b + 1)
|
32
|
+
->(corrector) { corrector.insert_after(hash_mark, ' ') }
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def config_ru?(file_path)
|
38
|
+
File.basename(file_path).eql?('config.ru')
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module Cop
|
5
|
+
module Layout
|
6
|
+
# This cop checks that the closing brace in an array literal is either
|
7
|
+
# on the same line as the last array element, or a new line.
|
8
|
+
#
|
9
|
+
# When using the `symmetrical` (default) style:
|
10
|
+
#
|
11
|
+
# If an array's opening brace is on the same line as the first element
|
12
|
+
# of the array, then the closing brace should be on the same line as
|
13
|
+
# the last element of the array.
|
14
|
+
#
|
15
|
+
# If an array's opening brace is on the line above the first element
|
16
|
+
# of the array, then the closing brace should be on the line below
|
17
|
+
# the last element of the array.
|
18
|
+
#
|
19
|
+
# When using the `new_line` style:
|
20
|
+
#
|
21
|
+
# The closing brace of a multi-line array literal must be on the line
|
22
|
+
# after the last element of the array.
|
23
|
+
#
|
24
|
+
# When using the `same_line` style:
|
25
|
+
#
|
26
|
+
# The closing brace of a multi-line array literal must be on the same
|
27
|
+
# line as the last element of the array.
|
28
|
+
#
|
29
|
+
# @example
|
30
|
+
#
|
31
|
+
# # symmetrical: bad
|
32
|
+
# # new_line: good
|
33
|
+
# # same_line: bad
|
34
|
+
# [ :a,
|
35
|
+
# :b
|
36
|
+
# ]
|
37
|
+
#
|
38
|
+
# # symmetrical: bad
|
39
|
+
# # new_line: bad
|
40
|
+
# # same_line: good
|
41
|
+
# [
|
42
|
+
# :a,
|
43
|
+
# :b ]
|
44
|
+
#
|
45
|
+
# # symmetrical: good
|
46
|
+
# # new_line: bad
|
47
|
+
# # same_line: good
|
48
|
+
# [ :a,
|
49
|
+
# :b ]
|
50
|
+
#
|
51
|
+
# # symmetrical: good
|
52
|
+
# # new_line: good
|
53
|
+
# # same_line: bad
|
54
|
+
# [
|
55
|
+
# :a,
|
56
|
+
# :b
|
57
|
+
# ]
|
58
|
+
class MultilineArrayBraceLayout < Cop
|
59
|
+
include MultilineLiteralBraceLayout
|
60
|
+
|
61
|
+
SAME_LINE_MESSAGE = 'Closing array brace must be on the same line as ' \
|
62
|
+
'the last array element when opening brace is on the same line as ' \
|
63
|
+
'the first array element.'.freeze
|
64
|
+
|
65
|
+
NEW_LINE_MESSAGE = 'Closing array brace must be on the line after ' \
|
66
|
+
'the last array element when opening brace is on a separate line ' \
|
67
|
+
'from the first array element.'.freeze
|
68
|
+
|
69
|
+
ALWAYS_NEW_LINE_MESSAGE = 'Closing array brace must be on the line ' \
|
70
|
+
'after the last array element.'.freeze
|
71
|
+
|
72
|
+
ALWAYS_SAME_LINE_MESSAGE = 'Closing array brace must be on the same ' \
|
73
|
+
'line as teh last array element.'.freeze
|
74
|
+
|
75
|
+
def on_array(node)
|
76
|
+
check_brace_layout(node)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|