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,114 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module Cop
|
5
|
+
module Layout
|
6
|
+
# This cop checks the indentation of the first element in an array literal
|
7
|
+
# where the opening bracket and the first element are on separate lines.
|
8
|
+
# The other elements' indentations are handled by the AlignArray cop.
|
9
|
+
#
|
10
|
+
# By default, array literals that are arguments in a method call with
|
11
|
+
# parentheses, and where the opening square bracket of the array is on the
|
12
|
+
# same line as the opening parenthesis of the method call, shall have
|
13
|
+
# their first element indented one step (two spaces) more than the
|
14
|
+
# position inside the opening parenthesis.
|
15
|
+
#
|
16
|
+
# Other array literals shall have their first element indented one step
|
17
|
+
# more than the start of the line where the opening square bracket is.
|
18
|
+
#
|
19
|
+
# This default style is called 'special_inside_parentheses'. Alternative
|
20
|
+
# styles are 'consistent' and 'align_brackets'. Here are examples:
|
21
|
+
#
|
22
|
+
# # special_inside_parentheses
|
23
|
+
# array = [
|
24
|
+
# :value
|
25
|
+
# ]
|
26
|
+
# but_in_a_method_call([
|
27
|
+
# :its_like_this
|
28
|
+
# ])
|
29
|
+
# # consistent
|
30
|
+
# array = [
|
31
|
+
# :value
|
32
|
+
# ]
|
33
|
+
# and_in_a_method_call([
|
34
|
+
# :no_difference
|
35
|
+
# ])
|
36
|
+
# # align_brackets
|
37
|
+
# and_now_for_something = [
|
38
|
+
# :completely_different
|
39
|
+
# ]
|
40
|
+
#
|
41
|
+
class IndentArray < Cop
|
42
|
+
include AutocorrectAlignment
|
43
|
+
include ConfigurableEnforcedStyle
|
44
|
+
include ArrayHashIndentation
|
45
|
+
|
46
|
+
def on_array(node)
|
47
|
+
check(node, nil) if node.loc.begin
|
48
|
+
end
|
49
|
+
|
50
|
+
def on_send(node)
|
51
|
+
each_argument_node(node, :array) do |array_node, left_parenthesis|
|
52
|
+
check(array_node, left_parenthesis)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def brace_alignment_style
|
59
|
+
:align_brackets
|
60
|
+
end
|
61
|
+
|
62
|
+
def check(array_node, left_parenthesis)
|
63
|
+
return if ignored_node?(array_node)
|
64
|
+
|
65
|
+
left_bracket = array_node.loc.begin
|
66
|
+
first_elem = array_node.values.first
|
67
|
+
if first_elem
|
68
|
+
return if first_elem.source_range.line == left_bracket.line
|
69
|
+
check_first(first_elem, left_bracket, left_parenthesis, 0)
|
70
|
+
end
|
71
|
+
|
72
|
+
check_right_bracket(array_node.loc.end, left_bracket,
|
73
|
+
left_parenthesis)
|
74
|
+
end
|
75
|
+
|
76
|
+
def check_right_bracket(right_bracket, left_bracket, left_parenthesis)
|
77
|
+
# if the right bracket is on the same line as the last value, accept
|
78
|
+
return if right_bracket.source_line[0...right_bracket.column] =~ /\S/
|
79
|
+
|
80
|
+
expected_column = base_column(left_bracket, left_parenthesis)
|
81
|
+
@column_delta = expected_column - right_bracket.column
|
82
|
+
return if @column_delta.zero?
|
83
|
+
|
84
|
+
msg = if style == :align_brackets
|
85
|
+
'Indent the right bracket the same as the left bracket.'
|
86
|
+
elsif style == :special_inside_parentheses && left_parenthesis
|
87
|
+
'Indent the right bracket the same as the first position ' \
|
88
|
+
'after the preceding left parenthesis.'
|
89
|
+
else
|
90
|
+
'Indent the right bracket the same as the start of the line' \
|
91
|
+
' where the left bracket is.'
|
92
|
+
end
|
93
|
+
add_offense(right_bracket, right_bracket, msg)
|
94
|
+
end
|
95
|
+
|
96
|
+
# Returns the description of what the correct indentation is based on.
|
97
|
+
def base_description(left_parenthesis)
|
98
|
+
if style == :align_brackets
|
99
|
+
'the position of the opening bracket'
|
100
|
+
elsif left_parenthesis && style == :special_inside_parentheses
|
101
|
+
'the first position after the preceding left parenthesis'
|
102
|
+
else
|
103
|
+
'the start of the line where the left square bracket is'
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def message(base_description)
|
108
|
+
format('Use %d spaces for indentation in an array, relative to %s.',
|
109
|
+
configured_indentation_width, base_description)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module Cop
|
5
|
+
module Layout
|
6
|
+
# This cop checks the indentation of the first line of the
|
7
|
+
# right-hand-side of a multi-line assignment.
|
8
|
+
#
|
9
|
+
# @example
|
10
|
+
# # bad
|
11
|
+
# value =
|
12
|
+
# if foo
|
13
|
+
# 'bar'
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# # good
|
17
|
+
# value =
|
18
|
+
# if foo
|
19
|
+
# 'bar'
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# The indentation of the remaining lines can be corrected with
|
23
|
+
# other cops such as `IndentationConsistency` and `EndAlignment`.
|
24
|
+
class IndentAssignment < Cop
|
25
|
+
include CheckAssignment
|
26
|
+
include AutocorrectAlignment
|
27
|
+
|
28
|
+
MSG = 'Indent the first line of the right-hand-side of a ' \
|
29
|
+
'multi-line assignment.'.freeze
|
30
|
+
|
31
|
+
def check_assignment(node, rhs)
|
32
|
+
return unless rhs
|
33
|
+
return unless node.loc.operator
|
34
|
+
return if node.loc.operator.line == rhs.loc.line
|
35
|
+
|
36
|
+
base = display_column(node.source_range)
|
37
|
+
check_alignment([rhs], base + configured_indentation_width)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module Cop
|
5
|
+
module Layout
|
6
|
+
# This cops checks the indentation of the first key in a hash literal
|
7
|
+
# where the opening brace and the first key are on separate lines. The
|
8
|
+
# other keys' indentations are handled by the AlignHash cop.
|
9
|
+
#
|
10
|
+
# By default, Hash literals that are arguments in a method call with
|
11
|
+
# parentheses, and where the opening curly brace of the hash is on the
|
12
|
+
# same line as the opening parenthesis of the method call, shall have
|
13
|
+
# their first key indented one step (two spaces) more than the position
|
14
|
+
# inside the opening parenthesis.
|
15
|
+
#
|
16
|
+
# Other hash literals shall have their first key indented one step more
|
17
|
+
# than the start of the line where the opening curly brace is.
|
18
|
+
#
|
19
|
+
# This default style is called 'special_inside_parentheses'. Alternative
|
20
|
+
# styles are 'consistent' and 'align_braces'. Here are examples:
|
21
|
+
#
|
22
|
+
# # special_inside_parentheses
|
23
|
+
# hash = {
|
24
|
+
# key: :value
|
25
|
+
# }
|
26
|
+
# but_in_a_method_call({
|
27
|
+
# its_like: :this
|
28
|
+
# })
|
29
|
+
# # consistent
|
30
|
+
# hash = {
|
31
|
+
# key: :value
|
32
|
+
# }
|
33
|
+
# and_in_a_method_call({
|
34
|
+
# no: :difference
|
35
|
+
# })
|
36
|
+
# # align_braces
|
37
|
+
# and_now_for_something = {
|
38
|
+
# completely: :different
|
39
|
+
# }
|
40
|
+
#
|
41
|
+
class IndentHash < Cop
|
42
|
+
include AutocorrectAlignment
|
43
|
+
include ConfigurableEnforcedStyle
|
44
|
+
include ArrayHashIndentation
|
45
|
+
|
46
|
+
def on_hash(node)
|
47
|
+
check(node, nil) if node.loc.begin
|
48
|
+
end
|
49
|
+
|
50
|
+
def on_send(node)
|
51
|
+
each_argument_node(node, :hash) do |hash_node, left_parenthesis|
|
52
|
+
check(hash_node, left_parenthesis)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def brace_alignment_style
|
59
|
+
:align_braces
|
60
|
+
end
|
61
|
+
|
62
|
+
def check(hash_node, left_parenthesis)
|
63
|
+
return if ignored_node?(hash_node)
|
64
|
+
|
65
|
+
left_brace = hash_node.loc.begin
|
66
|
+
first_pair = hash_node.pairs.first
|
67
|
+
|
68
|
+
if first_pair
|
69
|
+
return if first_pair.source_range.line == left_brace.line
|
70
|
+
|
71
|
+
if separator_style?(first_pair)
|
72
|
+
check_based_on_longest_key(hash_node.children, left_brace,
|
73
|
+
left_parenthesis)
|
74
|
+
else
|
75
|
+
check_first(first_pair, left_brace, left_parenthesis, 0)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
check_right_brace(hash_node.loc.end, left_brace, left_parenthesis)
|
80
|
+
end
|
81
|
+
|
82
|
+
def check_right_brace(right_brace, left_brace, left_parenthesis)
|
83
|
+
# if the right brace is on the same line as the last value, accept
|
84
|
+
return if right_brace.source_line[0...right_brace.column] =~ /\S/
|
85
|
+
|
86
|
+
expected_column = base_column(left_brace, left_parenthesis)
|
87
|
+
@column_delta = expected_column - right_brace.column
|
88
|
+
return if @column_delta.zero?
|
89
|
+
|
90
|
+
msg = if style == :align_braces
|
91
|
+
'Indent the right brace the same as the left brace.'
|
92
|
+
elsif style == :special_inside_parentheses && left_parenthesis
|
93
|
+
'Indent the right brace the same as the first position ' \
|
94
|
+
'after the preceding left parenthesis.'
|
95
|
+
else
|
96
|
+
'Indent the right brace the same as the start of the line ' \
|
97
|
+
'where the left brace is.'
|
98
|
+
end
|
99
|
+
add_offense(right_brace, right_brace, msg)
|
100
|
+
end
|
101
|
+
|
102
|
+
def separator_style?(first_pair)
|
103
|
+
separator = first_pair.loc.operator
|
104
|
+
key = "Enforced#{separator.is?(':') ? 'Colon' : 'HashRocket'}Style"
|
105
|
+
config.for_cop('Layout/AlignHash')[key] == 'separator'
|
106
|
+
end
|
107
|
+
|
108
|
+
def check_based_on_longest_key(pairs, left_brace, left_parenthesis)
|
109
|
+
key_lengths = pairs.map do |pair|
|
110
|
+
pair.children.first.source_range.length
|
111
|
+
end
|
112
|
+
check_first(pairs.first, left_brace, left_parenthesis,
|
113
|
+
key_lengths.max - key_lengths.first)
|
114
|
+
end
|
115
|
+
|
116
|
+
# Returns the description of what the correct indentation is based on.
|
117
|
+
def base_description(left_parenthesis)
|
118
|
+
if style == :align_braces
|
119
|
+
'the position of the opening brace'
|
120
|
+
elsif left_parenthesis && style == :special_inside_parentheses
|
121
|
+
'the first position after the preceding left parenthesis'
|
122
|
+
else
|
123
|
+
'the start of the line where the left curly brace is'
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def message(base_description)
|
128
|
+
format('Use %d spaces for indentation in a hash, relative to %s.',
|
129
|
+
configured_indentation_width, base_description)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
@@ -0,0 +1,173 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module Cop
|
5
|
+
module Layout
|
6
|
+
# This cops checks the indentation of the here document bodies. The bodies
|
7
|
+
# are indented one step.
|
8
|
+
# In Ruby 2.3 or newer, squiggly heredocs (`<<~`) should be used. If you
|
9
|
+
# use the older rubies, you should introduce some library to your project
|
10
|
+
# (e.g. ActiveSupport, Powerpack or Unindent).
|
11
|
+
#
|
12
|
+
# @example
|
13
|
+
#
|
14
|
+
# # bad
|
15
|
+
# <<-END
|
16
|
+
# something
|
17
|
+
# END
|
18
|
+
#
|
19
|
+
# # good
|
20
|
+
# # When EnforcedStyle is squiggly, bad code is auto-corrected to the
|
21
|
+
# # following code.
|
22
|
+
# <<~END
|
23
|
+
# something
|
24
|
+
# END
|
25
|
+
#
|
26
|
+
# # good
|
27
|
+
# # When EnforcedStyle is active_support, bad code is auto-corrected to
|
28
|
+
# # the following code.
|
29
|
+
# <<-END.strip_heredoc
|
30
|
+
# something
|
31
|
+
# END
|
32
|
+
class IndentHeredoc < Cop
|
33
|
+
include ConfigurableEnforcedStyle
|
34
|
+
include SafeMode
|
35
|
+
|
36
|
+
RUBY23_MSG = 'Use %d spaces for indentation in a heredoc by using ' \
|
37
|
+
'`<<~` instead of `%s`.'.freeze
|
38
|
+
LIBRARY_MSG = 'Use %d spaces for indentation in a heredoc by using %s.'
|
39
|
+
.freeze
|
40
|
+
StripMethods = {
|
41
|
+
unindent: 'unindent',
|
42
|
+
active_support: 'strip_heredoc',
|
43
|
+
powerpack: 'strip_indent'
|
44
|
+
}.freeze
|
45
|
+
|
46
|
+
def on_str(node)
|
47
|
+
return unless heredoc?(node)
|
48
|
+
|
49
|
+
body_indent_level = body_indent_level(node)
|
50
|
+
|
51
|
+
if heredoc_indent_type(node) == '~'
|
52
|
+
expected_indent_level = base_indent_level(node) + indentation_width
|
53
|
+
return if expected_indent_level == body_indent_level
|
54
|
+
else
|
55
|
+
return unless body_indent_level.zero?
|
56
|
+
end
|
57
|
+
|
58
|
+
add_offense(node, :heredoc_body)
|
59
|
+
end
|
60
|
+
|
61
|
+
alias on_dstr on_str
|
62
|
+
alias on_xstr on_str
|
63
|
+
|
64
|
+
def autocorrect(node)
|
65
|
+
check_style!
|
66
|
+
|
67
|
+
case style
|
68
|
+
when :squiggly
|
69
|
+
correct_by_squiggly(node)
|
70
|
+
else
|
71
|
+
correct_by_library(node)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
private
|
76
|
+
|
77
|
+
def style
|
78
|
+
style = super
|
79
|
+
return style unless style == :auto_detection
|
80
|
+
|
81
|
+
if target_ruby_version >= 2.3
|
82
|
+
:squiggly
|
83
|
+
elsif rails?
|
84
|
+
:active_support
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def message(node)
|
89
|
+
case style
|
90
|
+
when :squiggly
|
91
|
+
current_indent_type = "<<#{heredoc_indent_type(node)}"
|
92
|
+
format(RUBY23_MSG, indentation_width, current_indent_type)
|
93
|
+
when nil
|
94
|
+
method = "some library(e.g. ActiveSupport's `String#strip_heredoc`)"
|
95
|
+
format(LIBRARY_MSG, indentation_width, method)
|
96
|
+
else
|
97
|
+
method = "`String##{StripMethods[style]}`"
|
98
|
+
format(LIBRARY_MSG, indentation_width, method)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def correct_by_squiggly(node)
|
103
|
+
return if target_ruby_version < 2.3
|
104
|
+
lambda do |corrector|
|
105
|
+
if heredoc_indent_type(node) == '~'
|
106
|
+
corrector.replace(node.loc.heredoc_body, indented_body(node))
|
107
|
+
else
|
108
|
+
heredoc_beginning = node.loc.expression.source
|
109
|
+
corrected = heredoc_beginning.sub(/<<-?/, '<<~')
|
110
|
+
corrector.replace(node.loc.expression, corrected)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def correct_by_library(node)
|
116
|
+
lambda do |corrector|
|
117
|
+
corrector.replace(node.loc.heredoc_body, indented_body(node))
|
118
|
+
corrected = ".#{StripMethods[style]}"
|
119
|
+
corrector.insert_after(node.loc.expression, corrected)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def check_style!
|
124
|
+
case style
|
125
|
+
when nil
|
126
|
+
raise Warning, "Auto-correction does not work for #{cop_name}. " \
|
127
|
+
'Please configure EnforcedStyle.'
|
128
|
+
when :squiggly
|
129
|
+
if target_ruby_version < 2.3
|
130
|
+
raise Warning, '`squiggly` style is selectable only on Ruby ' \
|
131
|
+
"2.3 or higher for #{cop_name}."
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def heredoc?(node)
|
137
|
+
node.loc.is_a?(Parser::Source::Map::Heredoc)
|
138
|
+
end
|
139
|
+
|
140
|
+
def indented_body(node)
|
141
|
+
body = node.loc.heredoc_body.source
|
142
|
+
body_indent_level = body_indent_level(node)
|
143
|
+
correct_indent_level = base_indent_level(node) + indentation_width
|
144
|
+
body.gsub(/^\s{#{body_indent_level}}/, ' ' * correct_indent_level)
|
145
|
+
end
|
146
|
+
|
147
|
+
def body_indent_level(node)
|
148
|
+
body = node.loc.heredoc_body.source
|
149
|
+
indent_level(body)
|
150
|
+
end
|
151
|
+
|
152
|
+
def base_indent_level(node)
|
153
|
+
base_line_num = node.loc.expression.line
|
154
|
+
base_line = processed_source.lines[base_line_num - 1]
|
155
|
+
indent_level(base_line)
|
156
|
+
end
|
157
|
+
|
158
|
+
def indent_level(str)
|
159
|
+
str.scan(/^\s*/).reject { |line| line == "\n" }.min_by(&:size).size
|
160
|
+
end
|
161
|
+
|
162
|
+
# Returns '~', '-' or nil
|
163
|
+
def heredoc_indent_type(node)
|
164
|
+
node.source[/^<<([~-])/, 1]
|
165
|
+
end
|
166
|
+
|
167
|
+
def indentation_width
|
168
|
+
@config.for_cop('IndentationWidth')['Width'] || 2
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|