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,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module Cop
|
5
|
+
# Common functionality for checking assignment nodes.
|
6
|
+
module CheckAssignment
|
7
|
+
Util::ASGN_NODES.each do |type|
|
8
|
+
define_method("on_#{type}") do |node|
|
9
|
+
check_assignment(node, extract_rhs(node))
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def on_send(node)
|
14
|
+
return unless node.setter_method?
|
15
|
+
|
16
|
+
rhs = extract_rhs(node)
|
17
|
+
|
18
|
+
return unless rhs
|
19
|
+
|
20
|
+
check_assignment(node, rhs)
|
21
|
+
end
|
22
|
+
|
23
|
+
module_function
|
24
|
+
|
25
|
+
def extract_rhs(node)
|
26
|
+
if node.casgn_type?
|
27
|
+
_scope, _lhs, rhs = *node
|
28
|
+
elsif node.op_asgn_type?
|
29
|
+
_lhs, _op, rhs = *node
|
30
|
+
elsif Util::ASGN_NODES.include?(node.type)
|
31
|
+
_lhs, rhs = *node
|
32
|
+
elsif node.send_type?
|
33
|
+
rhs = node.last_argument
|
34
|
+
end
|
35
|
+
|
36
|
+
rhs
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module Cop
|
5
|
+
# Common functionality for checking length of classes and modules.
|
6
|
+
module ClassishLength
|
7
|
+
include CodeLength
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def code_length(node)
|
12
|
+
body_line_numbers = line_range(node).to_a[1...-1]
|
13
|
+
|
14
|
+
target_line_numbers = body_line_numbers -
|
15
|
+
line_numbers_of_inner_nodes(node, :module, :class)
|
16
|
+
|
17
|
+
target_line_numbers.reduce(0) do |length, line_number|
|
18
|
+
source_line = processed_source[line_number]
|
19
|
+
next length if irrelevant_line(source_line)
|
20
|
+
length + 1
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def line_numbers_of_inner_nodes(node, *types)
|
25
|
+
line_numbers = Set.new
|
26
|
+
|
27
|
+
node.each_descendant(*types) do |inner_node|
|
28
|
+
line_range = line_range(inner_node)
|
29
|
+
line_numbers.merge(line_range)
|
30
|
+
end
|
31
|
+
|
32
|
+
line_numbers.to_a
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module Cop
|
5
|
+
# Common functionality for checking length of code segments.
|
6
|
+
module CodeLength
|
7
|
+
include ConfigurableMax
|
8
|
+
|
9
|
+
def max_length
|
10
|
+
cop_config['Max']
|
11
|
+
end
|
12
|
+
|
13
|
+
def count_comments?
|
14
|
+
cop_config['CountComments']
|
15
|
+
end
|
16
|
+
|
17
|
+
def check_code_length(node)
|
18
|
+
length = code_length(node)
|
19
|
+
return unless length > max_length
|
20
|
+
|
21
|
+
add_offense(node, :expression, message(length, max_length)) do
|
22
|
+
self.max = length
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# Returns true for lines that shall not be included in the count.
|
27
|
+
def irrelevant_line(source_line)
|
28
|
+
source_line.blank? || !count_comments? && comment_line?(source_line)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module Cop
|
5
|
+
# Handles `EnforcedStyle` configuration parameters.
|
6
|
+
module ConfigurableEnforcedStyle
|
7
|
+
def opposite_style_detected
|
8
|
+
style_detected(alternative_style)
|
9
|
+
end
|
10
|
+
|
11
|
+
def correct_style_detected
|
12
|
+
style_detected(style)
|
13
|
+
end
|
14
|
+
|
15
|
+
def unexpected_style_detected(unexpected)
|
16
|
+
style_detected(unexpected)
|
17
|
+
end
|
18
|
+
|
19
|
+
def ambiguous_style_detected(*possibilities)
|
20
|
+
style_detected(possibilities)
|
21
|
+
end
|
22
|
+
|
23
|
+
def style_detected(detected)
|
24
|
+
return if no_acceptable_style?
|
25
|
+
|
26
|
+
# `detected` can be a single style, or an Array of possible styles
|
27
|
+
# (if there is more than one which matches the observed code)
|
28
|
+
detected_as_strings = Array(detected).map(&:to_s)
|
29
|
+
|
30
|
+
updated_list = if detected_style
|
31
|
+
detected_style & detected_as_strings
|
32
|
+
else
|
33
|
+
# We haven't observed any specific style yet.
|
34
|
+
detected_as_strings
|
35
|
+
end
|
36
|
+
if updated_list.empty?
|
37
|
+
no_acceptable_style!
|
38
|
+
else
|
39
|
+
self.detected_style = updated_list
|
40
|
+
config_to_allow_offenses[style_parameter_name] = updated_list.first
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def no_acceptable_style?
|
45
|
+
config_to_allow_offenses['Enabled'] == false
|
46
|
+
end
|
47
|
+
|
48
|
+
def no_acceptable_style!
|
49
|
+
self.config_to_allow_offenses = { 'Enabled' => false }
|
50
|
+
end
|
51
|
+
|
52
|
+
def detected_style
|
53
|
+
Formatter::DisabledConfigFormatter.detected_styles[cop_name] ||= nil
|
54
|
+
end
|
55
|
+
|
56
|
+
def detected_style=(style)
|
57
|
+
Formatter::DisabledConfigFormatter.detected_styles[cop_name] = style
|
58
|
+
end
|
59
|
+
|
60
|
+
alias conflicting_styles_detected no_acceptable_style!
|
61
|
+
alias unrecognized_style_detected no_acceptable_style!
|
62
|
+
|
63
|
+
def style
|
64
|
+
@enforced_style ||= begin
|
65
|
+
s = cop_config[style_parameter_name].to_sym
|
66
|
+
unless supported_styles.include?(s)
|
67
|
+
raise "Unknown style #{s} selected!"
|
68
|
+
end
|
69
|
+
s
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def alternative_style
|
74
|
+
if supported_styles.size != 2
|
75
|
+
raise 'alternative_style can only be used when there are exactly ' \
|
76
|
+
'2 SupportedStyles'
|
77
|
+
end
|
78
|
+
alternative_styles.first
|
79
|
+
end
|
80
|
+
|
81
|
+
def alternative_styles
|
82
|
+
(supported_styles - [style])
|
83
|
+
end
|
84
|
+
|
85
|
+
def supported_styles
|
86
|
+
@supported_styles ||= begin
|
87
|
+
supported_styles = Util.to_supported_styles(style_parameter_name)
|
88
|
+
cop_config[supported_styles].map(&:to_sym)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def style_parameter_name
|
93
|
+
'EnforcedStyle'
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module Cop
|
5
|
+
# Shared functionality between mixins that enforce naming conventions
|
6
|
+
module ConfigurableFormatting
|
7
|
+
include ConfigurableEnforcedStyle
|
8
|
+
|
9
|
+
def check_name(node, name, name_range)
|
10
|
+
return if operator?(name)
|
11
|
+
|
12
|
+
if valid_name?(node, name)
|
13
|
+
correct_style_detected
|
14
|
+
else
|
15
|
+
add_offense(node, name_range, message(style)) do
|
16
|
+
report_opposing_styles(node, name)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def report_opposing_styles(node, name)
|
22
|
+
alternative_styles.each do |alternative|
|
23
|
+
if valid_name?(node, name, alternative)
|
24
|
+
return unexpected_style_detected(alternative)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def valid_name?(node, name, given_style = style)
|
30
|
+
name.match(self.class::FORMATS.fetch(given_style)) ||
|
31
|
+
class_emitter_method?(node, name)
|
32
|
+
end
|
33
|
+
|
34
|
+
# A class emitter method is a singleton method in a class/module, where
|
35
|
+
# the method has the same name as a class defined in the class/module.
|
36
|
+
def class_emitter_method?(node, name)
|
37
|
+
return false unless node.parent && node.defs_type?
|
38
|
+
# a class emitter method may be defined inside `def self.included`,
|
39
|
+
# `def self.extended`, etc.
|
40
|
+
node = node.parent while node.parent.defs_type?
|
41
|
+
|
42
|
+
node.parent.each_child_node(:class).any? do |c|
|
43
|
+
c.loc.name.is?(name.to_s)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module Cop
|
5
|
+
# Handles `Max` configuration parameters, especially setting them to an
|
6
|
+
# appropriate value with --auto-gen-config.
|
7
|
+
module ConfigurableMax
|
8
|
+
def max=(value)
|
9
|
+
cfg = config_to_allow_offenses
|
10
|
+
value = [cfg[max_parameter_name], value].max if cfg[max_parameter_name]
|
11
|
+
cfg[max_parameter_name] = value
|
12
|
+
end
|
13
|
+
|
14
|
+
def max_parameter_name
|
15
|
+
'Max'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module Cop
|
5
|
+
# This module provides functionality for checking if names match the
|
6
|
+
# configured EnforcedStyle.
|
7
|
+
module ConfigurableNaming
|
8
|
+
include ConfigurableFormatting
|
9
|
+
|
10
|
+
FORMATS = {
|
11
|
+
snake_case: /^@{0,2}[\da-z_]+[!?=]?$/,
|
12
|
+
camelCase: /^@{0,2}_?[a-z][\da-zA-Z]+[!?=]?$/
|
13
|
+
}.freeze
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module Cop
|
5
|
+
# This module provides functionality for checking if numbering match the
|
6
|
+
# configured EnforcedStyle.
|
7
|
+
module ConfigurableNumbering
|
8
|
+
include ConfigurableFormatting
|
9
|
+
|
10
|
+
FORMATS = {
|
11
|
+
snake_case: /(?:[a-z_]|_\d+)$/,
|
12
|
+
normalcase: /(?:_\D*|[A-Za-z]\d*)$/,
|
13
|
+
non_integer: /[A-Za-z_]$/
|
14
|
+
}.freeze
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module Cop
|
5
|
+
# Common functionality for checking if nodes.
|
6
|
+
module DefNode
|
7
|
+
extend NodePattern::Macros
|
8
|
+
|
9
|
+
NON_PUBLIC_MODIFIERS = %w[private protected].freeze
|
10
|
+
|
11
|
+
def non_public?(node)
|
12
|
+
non_public_modifier?(node.parent) ||
|
13
|
+
preceding_non_public_modifier?(node)
|
14
|
+
end
|
15
|
+
|
16
|
+
def preceding_non_public_modifier?(node)
|
17
|
+
stripped_source_upto(node.loc.line).any? do |line|
|
18
|
+
NON_PUBLIC_MODIFIERS.include?(line)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def_node_matcher :non_public_modifier?, <<-PATTERN
|
23
|
+
(send nil {:private :protected} ({def defs} ...))
|
24
|
+
PATTERN
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module Cop
|
5
|
+
# Common functionality for checking documentation.
|
6
|
+
module DocumentationComment
|
7
|
+
extend NodePattern::Macros
|
8
|
+
include Style::AnnotationComment
|
9
|
+
|
10
|
+
def_node_matcher :constant_definition?, '{class module casgn}'
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def documentation_comment?(node)
|
15
|
+
preceding_lines = preceding_lines(node)
|
16
|
+
|
17
|
+
return false unless preceding_comment?(node, preceding_lines.last)
|
18
|
+
|
19
|
+
preceding_lines.any? do |comment|
|
20
|
+
!annotation?(comment) &&
|
21
|
+
!interpreter_directive_comment?(comment) &&
|
22
|
+
!rubbycop_directive_comment?(comment)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def preceding_comment?(n1, n2)
|
27
|
+
n1 && n2 && preceed?(n2, n1) &&
|
28
|
+
comment_line?(n2.loc.expression.source)
|
29
|
+
end
|
30
|
+
|
31
|
+
def preceding_lines(node)
|
32
|
+
processed_source.ast_with_comments[node].select do |line|
|
33
|
+
line.loc.line < node.loc.line
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def interpreter_directive_comment?(comment)
|
38
|
+
comment.text =~ /^#\s*(frozen_string_literal|encoding):/
|
39
|
+
end
|
40
|
+
|
41
|
+
def rubbycop_directive_comment?(comment)
|
42
|
+
comment.text =~ CommentConfig::COMMENT_DIRECTIVE_REGEXP
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module Cop
|
5
|
+
# Common functionality for dealing with duplication.
|
6
|
+
module Duplication
|
7
|
+
private
|
8
|
+
|
9
|
+
# Whether the `collection` contains any duplicates.
|
10
|
+
#
|
11
|
+
# @param [Array] collection an array to check for duplicates
|
12
|
+
# @return [Boolean] whether the array contains any duplicates
|
13
|
+
def duplicates?(collection)
|
14
|
+
collection.size > 1 && collection.size > collection.uniq.size
|
15
|
+
end
|
16
|
+
|
17
|
+
# Returns all duplicates, including the first instance of the duplicated
|
18
|
+
# elements.
|
19
|
+
#
|
20
|
+
# @param [Array] collection an array to return duplicates for
|
21
|
+
# @return [Array] all the duplicates
|
22
|
+
def duplicates(collection)
|
23
|
+
grouped_duplicates(collection).flatten
|
24
|
+
end
|
25
|
+
|
26
|
+
# Returns the consecutive duplicates, leaving out the first instance of
|
27
|
+
# the duplicated elements.
|
28
|
+
#
|
29
|
+
# @param [Array] collection an array to return consecutive duplicates for
|
30
|
+
# @return [Array] the consecutive duplicates
|
31
|
+
def consecutive_duplicates(collection)
|
32
|
+
grouped_duplicates(collection).flat_map { |items| items[1..-1] }
|
33
|
+
end
|
34
|
+
|
35
|
+
# Returns a hash of grouped duplicates. The key will be the first
|
36
|
+
# instance of the element, and the value an `array` of the initial
|
37
|
+
# element and all duplicate instances.
|
38
|
+
#
|
39
|
+
# @param [Array] collection an array to group duplicates for
|
40
|
+
# @return [Array] the grouped duplicates
|
41
|
+
def grouped_duplicates(collection)
|
42
|
+
collection.group_by { |item| item }.values.reject(&:one?)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,161 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module Cop
|
5
|
+
module Layout
|
6
|
+
# Common functionality for checking if presence/absence of empty lines
|
7
|
+
# around some kind of body matches the configuration.
|
8
|
+
module EmptyLinesAroundBody
|
9
|
+
extend NodePattern::Macros
|
10
|
+
include ConfigurableEnforcedStyle
|
11
|
+
|
12
|
+
MSG_EXTRA = 'Extra empty line detected at %s body %s.'.freeze
|
13
|
+
MSG_MISSING = 'Empty line missing at %s body %s.'.freeze
|
14
|
+
MSG_DEFERRED = 'Empty line missing before first %s definition'.freeze
|
15
|
+
|
16
|
+
def_node_matcher :constant_definition?, '{class module}'
|
17
|
+
def_node_matcher :empty_line_required?, '{def defs class module}'
|
18
|
+
|
19
|
+
def autocorrect(args)
|
20
|
+
offense_style, range = args
|
21
|
+
lambda do |corrector|
|
22
|
+
case offense_style
|
23
|
+
when :no_empty_lines then
|
24
|
+
corrector.remove(range)
|
25
|
+
when :empty_lines then
|
26
|
+
corrector.insert_before(range, "\n")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def check(node, body)
|
34
|
+
# When style is `empty_lines`, if the body is empty, we don't enforce
|
35
|
+
# the presence OR absence of an empty line
|
36
|
+
# But if style is `no_empty_lines`, there must not be an empty line
|
37
|
+
return unless body || style == :no_empty_lines
|
38
|
+
return if node.single_line?
|
39
|
+
|
40
|
+
first_line = node.source_range.first_line
|
41
|
+
last_line = node.source_range.last_line
|
42
|
+
|
43
|
+
case style
|
44
|
+
when :empty_lines_except_namespace
|
45
|
+
check_empty_lines_except_namespace(body, first_line, last_line)
|
46
|
+
when :empty_lines_special
|
47
|
+
check_empty_lines_special(body, first_line, last_line)
|
48
|
+
else
|
49
|
+
check_both(style, first_line, last_line)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def check_empty_lines_except_namespace(body, first_line, last_line)
|
54
|
+
if namespace?(body, with_one_child: true)
|
55
|
+
check_both(:no_empty_lines, first_line, last_line)
|
56
|
+
else
|
57
|
+
check_both(:empty_lines, first_line, last_line)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def check_empty_lines_special(body, first_line, last_line)
|
62
|
+
return unless body
|
63
|
+
if namespace?(body, with_one_child: true)
|
64
|
+
check_both(:no_empty_lines, first_line, last_line)
|
65
|
+
else
|
66
|
+
if first_child_requires_empty_line?(body)
|
67
|
+
check_beginning(:empty_lines, first_line)
|
68
|
+
else
|
69
|
+
check_beginning(:no_empty_lines, first_line)
|
70
|
+
check_deferred_empty_line(body)
|
71
|
+
end
|
72
|
+
check_ending(:empty_lines, last_line)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def check_both(style, first_line, last_line)
|
77
|
+
check_beginning(style, first_line)
|
78
|
+
check_ending(style, last_line)
|
79
|
+
end
|
80
|
+
|
81
|
+
def check_beginning(style, first_line)
|
82
|
+
check_source(style, first_line, 'beginning')
|
83
|
+
end
|
84
|
+
|
85
|
+
def check_ending(style, last_line)
|
86
|
+
check_source(style, last_line - 2, 'end')
|
87
|
+
end
|
88
|
+
|
89
|
+
def check_source(style, line_no, desc)
|
90
|
+
case style
|
91
|
+
when :no_empty_lines
|
92
|
+
check_line(style, line_no, message(MSG_EXTRA, desc), &:empty?)
|
93
|
+
when :empty_lines
|
94
|
+
check_line(style, line_no, message(MSG_MISSING, desc)) do |line|
|
95
|
+
!line.empty?
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def check_line(style, line, msg)
|
101
|
+
return unless yield(processed_source.lines[line])
|
102
|
+
|
103
|
+
offset = style == :empty_lines && msg.include?('end.') ? 2 : 1
|
104
|
+
range = source_range(processed_source.buffer, line + offset, 0)
|
105
|
+
add_offense([style, range], range, msg)
|
106
|
+
end
|
107
|
+
|
108
|
+
def check_deferred_empty_line(body)
|
109
|
+
node = first_empty_line_required_child(body)
|
110
|
+
return unless node
|
111
|
+
|
112
|
+
line = previous_line_ignoring_comments(node.loc.first_line)
|
113
|
+
return if processed_source[line].empty?
|
114
|
+
|
115
|
+
range = source_range(processed_source.buffer, line + 2, 0)
|
116
|
+
add_offense([:empty_lines, range], range, deferred_message(node))
|
117
|
+
end
|
118
|
+
|
119
|
+
def namespace?(body, with_one_child: false)
|
120
|
+
if body.begin_type?
|
121
|
+
return false if with_one_child
|
122
|
+
body.children.all? { |child| constant_definition?(child) }
|
123
|
+
else
|
124
|
+
constant_definition?(body)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def first_child_requires_empty_line?(body)
|
129
|
+
if body.begin_type?
|
130
|
+
empty_line_required?(body.children.first)
|
131
|
+
else
|
132
|
+
empty_line_required?(body)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def first_empty_line_required_child(body)
|
137
|
+
if body.begin_type?
|
138
|
+
body.children.find { |child| empty_line_required?(child) }
|
139
|
+
elsif empty_line_required?(body)
|
140
|
+
body
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
def previous_line_ignoring_comments(send_line)
|
145
|
+
(send_line - 2).downto(0) do |line|
|
146
|
+
return line unless comment_line?(processed_source[line])
|
147
|
+
end
|
148
|
+
0
|
149
|
+
end
|
150
|
+
|
151
|
+
def message(type, desc)
|
152
|
+
format(type, self.class::KIND, desc)
|
153
|
+
end
|
154
|
+
|
155
|
+
def deferred_message(node)
|
156
|
+
format(MSG_DEFERRED, node.type)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|