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,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module AST
|
5
|
+
# A node extension for `until` nodes. This will be used in place of a plain
|
6
|
+
# node when the builder constructs the AST, making its methods available
|
7
|
+
# to all `until` nodes within RubbyCop.
|
8
|
+
class UntilNode < Node
|
9
|
+
include ConditionalNode
|
10
|
+
include ModifierNode
|
11
|
+
|
12
|
+
# Returns the keyword of the `until` statement as a string.
|
13
|
+
#
|
14
|
+
# @return [String] the keyword of the `until` statement
|
15
|
+
def keyword
|
16
|
+
'until'
|
17
|
+
end
|
18
|
+
|
19
|
+
# Returns the inverse keyword of the `until` node as a string.
|
20
|
+
# Returns `while` for `until` nodes and vice versa.
|
21
|
+
#
|
22
|
+
# @return [String] the inverse keyword of the `until` statement
|
23
|
+
def inverse_keyword
|
24
|
+
'while'
|
25
|
+
end
|
26
|
+
|
27
|
+
# Checks whether the `until` node has a `do` keyword.
|
28
|
+
#
|
29
|
+
# @return [Boolean] whether the `until` node has a `do` keyword
|
30
|
+
def do?
|
31
|
+
loc.begin && loc.begin.is?('do')
|
32
|
+
end
|
33
|
+
|
34
|
+
# Custom destructuring method. This can be used to normalize
|
35
|
+
# destructuring for different variations of the node.
|
36
|
+
#
|
37
|
+
# @return [Array<Node>] the different parts of the `until` statement
|
38
|
+
def node_parts
|
39
|
+
to_a
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module AST
|
5
|
+
# A node extension for `when` nodes. This will be used in place of a plain
|
6
|
+
# node when the builder constructs the AST, making its methods available
|
7
|
+
# to all `when` nodes within RubbyCop.
|
8
|
+
class WhenNode < Node
|
9
|
+
# Returns an array of all the conditions in the `when` branch.
|
10
|
+
#
|
11
|
+
# @return [Array<Node>] an array of condition nodes
|
12
|
+
def conditions
|
13
|
+
node_parts[0...-1]
|
14
|
+
end
|
15
|
+
|
16
|
+
# Calls the given block for each condition node in the `when` branch.
|
17
|
+
# If no block is given, an `Enumerator` is returned.
|
18
|
+
#
|
19
|
+
# @return [self] if a block is given
|
20
|
+
# @return [Enumerator] if no block is given
|
21
|
+
def each_condition
|
22
|
+
return conditions.to_enum(__method__) unless block_given?
|
23
|
+
|
24
|
+
conditions.each do |condition|
|
25
|
+
yield condition
|
26
|
+
end
|
27
|
+
|
28
|
+
self
|
29
|
+
end
|
30
|
+
|
31
|
+
# Returns the index of the `when` branch within the `case` statement.
|
32
|
+
#
|
33
|
+
# @return [Integer] the index of the `when` branch
|
34
|
+
def branch_index
|
35
|
+
parent.when_branches.index(self)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Checks whether the `when` node has a `then` keyword.
|
39
|
+
#
|
40
|
+
# @return [Boolean] whether the `when` node has a `then` keyword
|
41
|
+
def then?
|
42
|
+
loc.begin && loc.begin.is?('then')
|
43
|
+
end
|
44
|
+
|
45
|
+
# Returns the body of the `when` node.
|
46
|
+
#
|
47
|
+
# @return [Node, nil] the body of the `when` node
|
48
|
+
def body
|
49
|
+
node_parts[-1]
|
50
|
+
end
|
51
|
+
|
52
|
+
# Custom destructuring method. This can be used to normalize
|
53
|
+
# destructuring for different variations of the node.
|
54
|
+
#
|
55
|
+
# @return [Array<Node>] the different parts of the `until` statement
|
56
|
+
def node_parts
|
57
|
+
to_a
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module AST
|
5
|
+
# A node extension for `while` nodes. This will be used in place of a plain
|
6
|
+
# node when the builder constructs the AST, making its methods available
|
7
|
+
# to all `while` nodes within RubbyCop.
|
8
|
+
class WhileNode < Node
|
9
|
+
include ConditionalNode
|
10
|
+
include ModifierNode
|
11
|
+
|
12
|
+
# Returns the keyword of the `while` statement as a string.
|
13
|
+
#
|
14
|
+
# @return [String] the keyword of the `while` statement
|
15
|
+
def keyword
|
16
|
+
'while'
|
17
|
+
end
|
18
|
+
|
19
|
+
# Returns the inverse keyword of the `while` node as a string.
|
20
|
+
# Returns `until` for `while` nodes and vice versa.
|
21
|
+
#
|
22
|
+
# @return [String] the inverse keyword of the `while` statement
|
23
|
+
def inverse_keyword
|
24
|
+
'until'
|
25
|
+
end
|
26
|
+
|
27
|
+
# Checks whether the `until` node has a `do` keyword.
|
28
|
+
#
|
29
|
+
# @return [Boolean] whether the `until` node has a `do` keyword
|
30
|
+
def do?
|
31
|
+
loc.begin && loc.begin.is?('do')
|
32
|
+
end
|
33
|
+
|
34
|
+
# Custom destructuring method. This can be used to normalize
|
35
|
+
# destructuring for different variations of the node.
|
36
|
+
#
|
37
|
+
# @return [Array<Node>] the different parts of the `while` statement
|
38
|
+
def node_parts
|
39
|
+
to_a
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module AST
|
5
|
+
# This module provides a shorthand method to create a {Node} like
|
6
|
+
# `Parser::AST::Sexp`.
|
7
|
+
#
|
8
|
+
# @see http://rubydoc.info/gems/ast/AST/Sexp
|
9
|
+
module Sexp
|
10
|
+
# Creates a {Node} with type `type` and children `children`.
|
11
|
+
def s(type, *children)
|
12
|
+
Node.new(type, children)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,171 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
module AST
|
5
|
+
# Provides methods for traversing an AST.
|
6
|
+
# Does not transform an AST; for that, use Parser::AST::Processor.
|
7
|
+
# Override methods to perform custom processing. Remember to call `super`
|
8
|
+
# if you want to recursively process descendant nodes.
|
9
|
+
module Traversal
|
10
|
+
def walk(node)
|
11
|
+
return if node.nil?
|
12
|
+
send(:"on_#{node.type}", node)
|
13
|
+
nil
|
14
|
+
end
|
15
|
+
|
16
|
+
NO_CHILD_NODES = %i[true false nil int float complex
|
17
|
+
rational str sym regopt self lvar
|
18
|
+
ivar cvar gvar nth_ref back_ref cbase
|
19
|
+
arg restarg blockarg shadowarg
|
20
|
+
kwrestarg zsuper lambda redo retry].freeze
|
21
|
+
ONE_CHILD_NODE = %i[splat kwsplat block_pass not break next
|
22
|
+
preexe postexe match_current_line defined?
|
23
|
+
arg_expr].freeze
|
24
|
+
MANY_CHILD_NODES = %i[dstr dsym xstr regexp array hash pair
|
25
|
+
irange erange mlhs masgn or_asgn and_asgn
|
26
|
+
undef alias args super yield or and
|
27
|
+
while_post until_post iflipflop eflipflop
|
28
|
+
match_with_lvasgn begin kwbegin return].freeze
|
29
|
+
SECOND_CHILD_ONLY = %i[lvasgn ivasgn cvasgn gvasgn optarg kwarg
|
30
|
+
kwoptarg].freeze
|
31
|
+
|
32
|
+
NO_CHILD_NODES.each do |type|
|
33
|
+
module_eval("def on_#{type}(node); end")
|
34
|
+
end
|
35
|
+
|
36
|
+
ONE_CHILD_NODE.each do |type|
|
37
|
+
module_eval(<<-END)
|
38
|
+
def on_#{type}(node)
|
39
|
+
if (child = node.children[0])
|
40
|
+
send(:"on_\#{child.type}", child)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
END
|
44
|
+
end
|
45
|
+
|
46
|
+
MANY_CHILD_NODES.each do |type|
|
47
|
+
module_eval(<<-END)
|
48
|
+
def on_#{type}(node)
|
49
|
+
node.children.each { |child| send(:"on_\#{child.type}", child) }
|
50
|
+
nil
|
51
|
+
end
|
52
|
+
END
|
53
|
+
end
|
54
|
+
|
55
|
+
SECOND_CHILD_ONLY.each do |type|
|
56
|
+
# Guard clause is for nodes nested within mlhs
|
57
|
+
module_eval(<<-END)
|
58
|
+
def on_#{type}(node)
|
59
|
+
if (child = node.children[1])
|
60
|
+
send(:"on_\#{child.type}", child)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
END
|
64
|
+
end
|
65
|
+
|
66
|
+
def on_const(node)
|
67
|
+
return unless (child = node.children[0])
|
68
|
+
send(:"on_#{child.type}", child)
|
69
|
+
end
|
70
|
+
|
71
|
+
def on_casgn(node)
|
72
|
+
children = node.children
|
73
|
+
if (child = children[0]) # always const???
|
74
|
+
send(:"on_#{child.type}", child)
|
75
|
+
end
|
76
|
+
return unless (child = children[2])
|
77
|
+
send(:"on_#{child.type}", child)
|
78
|
+
end
|
79
|
+
|
80
|
+
def on_class(node)
|
81
|
+
children = node.children
|
82
|
+
child = children[0] # always const???
|
83
|
+
send(:"on_#{child.type}", child)
|
84
|
+
if (child = children[1])
|
85
|
+
send(:"on_#{child.type}", child)
|
86
|
+
end
|
87
|
+
return unless (child = children[2])
|
88
|
+
send(:"on_#{child.type}", child)
|
89
|
+
end
|
90
|
+
|
91
|
+
def on_def(node)
|
92
|
+
children = node.children
|
93
|
+
on_args(children[1])
|
94
|
+
return unless (child = children[2])
|
95
|
+
send(:"on_#{child.type}", child)
|
96
|
+
end
|
97
|
+
|
98
|
+
def on_send(node)
|
99
|
+
node.children.each_with_index do |child, i|
|
100
|
+
next if i == 1
|
101
|
+
send(:"on_#{child.type}", child) if child
|
102
|
+
end
|
103
|
+
nil
|
104
|
+
end
|
105
|
+
|
106
|
+
alias on_csend on_send
|
107
|
+
|
108
|
+
def on_op_asgn(node)
|
109
|
+
children = node.children
|
110
|
+
child = children[0]
|
111
|
+
send(:"on_#{child.type}", child)
|
112
|
+
child = children[2]
|
113
|
+
send(:"on_#{child.type}", child)
|
114
|
+
end
|
115
|
+
|
116
|
+
def on_defs(node)
|
117
|
+
children = node.children
|
118
|
+
child = children[0]
|
119
|
+
send(:"on_#{child.type}", child)
|
120
|
+
on_args(children[2])
|
121
|
+
return unless (child = children[3])
|
122
|
+
send(:"on_#{child.type}", child)
|
123
|
+
end
|
124
|
+
|
125
|
+
def on_if(node)
|
126
|
+
children = node.children
|
127
|
+
child = children[0]
|
128
|
+
send(:"on_#{child.type}", child)
|
129
|
+
if (child = children[1])
|
130
|
+
send(:"on_#{child.type}", child)
|
131
|
+
end
|
132
|
+
return unless (child = children[2])
|
133
|
+
send(:"on_#{child.type}", child)
|
134
|
+
end
|
135
|
+
|
136
|
+
def on_while(node)
|
137
|
+
children = node.children
|
138
|
+
child = children[0]
|
139
|
+
send(:"on_#{child.type}", child)
|
140
|
+
return unless (child = children[1])
|
141
|
+
send(:"on_#{child.type}", child)
|
142
|
+
end
|
143
|
+
|
144
|
+
alias on_until on_while
|
145
|
+
alias on_module on_while
|
146
|
+
alias on_sclass on_while
|
147
|
+
|
148
|
+
def on_block(node)
|
149
|
+
children = node.children
|
150
|
+
child = children[0]
|
151
|
+
send(:"on_#{child.type}", child) # can be send, zsuper...
|
152
|
+
on_args(children[1])
|
153
|
+
return unless (child = children[2])
|
154
|
+
send(:"on_#{child.type}", child)
|
155
|
+
end
|
156
|
+
|
157
|
+
def on_case(node)
|
158
|
+
node.children.each do |child|
|
159
|
+
send(:"on_#{child.type}", child) if child
|
160
|
+
end
|
161
|
+
nil
|
162
|
+
end
|
163
|
+
|
164
|
+
alias on_rescue on_case
|
165
|
+
alias on_resbody on_case
|
166
|
+
alias on_ensure on_case
|
167
|
+
alias on_for on_case
|
168
|
+
alias on_when on_case
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module RubbyCop
|
6
|
+
# Converts RubbyCop objects to and from the serialization format JSON.
|
7
|
+
class CachedData
|
8
|
+
def initialize(filename)
|
9
|
+
@filename = filename
|
10
|
+
end
|
11
|
+
|
12
|
+
def from_json(text)
|
13
|
+
deserialize_offenses(JSON.parse(text))
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_json(offenses)
|
17
|
+
JSON.dump(offenses.map { |o| serialize_offense(o) })
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def serialize_offense(offense)
|
23
|
+
{
|
24
|
+
# Calling #to_s here ensures that the serialization works when using
|
25
|
+
# other json serializers such as Oj. Some of these gems do not call
|
26
|
+
# #to_s implicitly.
|
27
|
+
severity: offense.severity.to_s,
|
28
|
+
location: {
|
29
|
+
begin_pos: offense.location.begin_pos,
|
30
|
+
end_pos: offense.location.end_pos
|
31
|
+
},
|
32
|
+
message: message(offense),
|
33
|
+
cop_name: offense.cop_name,
|
34
|
+
status: offense.status
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
def message(offense)
|
39
|
+
# JSON.dump will fail if the offense message contains text which is not
|
40
|
+
# valid UTF-8
|
41
|
+
message = offense.message
|
42
|
+
if message.respond_to?(:scrub)
|
43
|
+
message.scrub
|
44
|
+
else
|
45
|
+
message.chars.select(&:valid_encoding?).join
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# Restore an offense object loaded from a JSON file.
|
50
|
+
def deserialize_offenses(offenses)
|
51
|
+
source_buffer = Parser::Source::Buffer.new(@filename)
|
52
|
+
source_buffer.source = File.read(@filename, encoding: Encoding::UTF_8)
|
53
|
+
offenses.map! do |o|
|
54
|
+
location = Parser::Source::Range.new(source_buffer,
|
55
|
+
o['location']['begin_pos'],
|
56
|
+
o['location']['end_pos'])
|
57
|
+
Cop::Offense.new(o['severity'], location,
|
58
|
+
o['message'],
|
59
|
+
o['cop_name'], o['status'].to_sym)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
data/lib/rubbycop/cli.rb
ADDED
@@ -0,0 +1,199 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubbyCop
|
4
|
+
# The CLI is a class responsible of handling all the command line interface
|
5
|
+
# logic.
|
6
|
+
class CLI
|
7
|
+
include Formatter::TextUtil
|
8
|
+
|
9
|
+
class Finished < RuntimeError; end
|
10
|
+
|
11
|
+
attr_reader :options, :config_store
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@options = {}
|
15
|
+
@config_store = ConfigStore.new
|
16
|
+
end
|
17
|
+
|
18
|
+
# Entry point for the application logic. Here we
|
19
|
+
# do the command line arguments processing and inspect
|
20
|
+
# the target files
|
21
|
+
# @return [Integer] UNIX exit code
|
22
|
+
def run(args = ARGV)
|
23
|
+
@options, paths = Options.new.parse(args)
|
24
|
+
validate_options_vs_config
|
25
|
+
act_on_options
|
26
|
+
apply_default_formatter
|
27
|
+
|
28
|
+
execute_runner(paths)
|
29
|
+
rescue RubbyCop::Error => e
|
30
|
+
$stderr.puts Rainbow("Error: #{e.message}").red
|
31
|
+
return 2
|
32
|
+
rescue Finished
|
33
|
+
return 0
|
34
|
+
rescue StandardError, SyntaxError => e
|
35
|
+
$stderr.puts e.message
|
36
|
+
$stderr.puts e.backtrace
|
37
|
+
return 2
|
38
|
+
end
|
39
|
+
|
40
|
+
def trap_interrupt(runner)
|
41
|
+
Signal.trap('INT') do
|
42
|
+
exit!(1) if runner.aborting?
|
43
|
+
runner.abort
|
44
|
+
$stderr.puts
|
45
|
+
$stderr.puts 'Exiting... Interrupt again to exit immediately.'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def validate_options_vs_config
|
52
|
+
if @options[:parallel] &&
|
53
|
+
!@config_store.for(Dir.pwd).for_all_cops['UseCache']
|
54
|
+
raise ArgumentError, '-P/--parallel uses caching to speed up ' \
|
55
|
+
'execution, so combining with AllCops: ' \
|
56
|
+
'UseCache: false is not allowed.'
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def act_on_options
|
61
|
+
handle_exiting_options
|
62
|
+
|
63
|
+
ConfigLoader.debug = @options[:debug]
|
64
|
+
ConfigLoader.auto_gen_config = @options[:auto_gen_config]
|
65
|
+
|
66
|
+
@config_store.options_config = @options[:config] if @options[:config]
|
67
|
+
@config_store.force_default_config! if @options[:force_default_config]
|
68
|
+
|
69
|
+
if @options[:color]
|
70
|
+
# color output explicitly forced on
|
71
|
+
Rainbow.enabled = true
|
72
|
+
elsif @options[:color] == false
|
73
|
+
# color output explicitly forced off
|
74
|
+
Rainbow.enabled = false
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def execute_runner(paths)
|
79
|
+
runner = Runner.new(@options, @config_store)
|
80
|
+
|
81
|
+
trap_interrupt(runner)
|
82
|
+
all_passed = runner.run(paths)
|
83
|
+
display_warning_summary(runner.warnings)
|
84
|
+
display_error_summary(runner.errors)
|
85
|
+
maybe_print_corrected_source
|
86
|
+
|
87
|
+
all_passed && !runner.aborting? && runner.errors.empty? ? 0 : 1
|
88
|
+
end
|
89
|
+
|
90
|
+
def handle_exiting_options
|
91
|
+
return unless Options::EXITING_OPTIONS.any? { |o| @options.key? o }
|
92
|
+
|
93
|
+
puts RubbyCop::Version.version(false) if @options[:version]
|
94
|
+
puts RubbyCop::Version.version(true) if @options[:verbose_version]
|
95
|
+
print_available_cops if @options[:show_cops]
|
96
|
+
raise Finished
|
97
|
+
end
|
98
|
+
|
99
|
+
def apply_default_formatter
|
100
|
+
# This must be done after the options have already been processed,
|
101
|
+
# because they can affect how ConfigStore behaves
|
102
|
+
@options[:formatters] ||= begin
|
103
|
+
cfg = @config_store.for(Dir.pwd).for_all_cops
|
104
|
+
formatter = cfg['DefaultFormatter'] || 'progress'
|
105
|
+
[[formatter, @options[:output_path]]]
|
106
|
+
end
|
107
|
+
|
108
|
+
return unless @options[:auto_gen_config]
|
109
|
+
|
110
|
+
@options[:formatters] << [Formatter::DisabledConfigFormatter,
|
111
|
+
ConfigLoader::AUTO_GENERATED_FILE]
|
112
|
+
end
|
113
|
+
|
114
|
+
def print_available_cops
|
115
|
+
# Load the configs so the require()s are done for custom cops
|
116
|
+
@config_store.for(Dir.pwd)
|
117
|
+
registry = Cop::Cop.registry
|
118
|
+
show_all = @options[:show_cops].empty?
|
119
|
+
|
120
|
+
if show_all
|
121
|
+
puts "# Available cops (#{registry.length}) + config for #{Dir.pwd}: "
|
122
|
+
end
|
123
|
+
|
124
|
+
registry.departments.sort!.each do |department|
|
125
|
+
print_cops_of_department(registry, department, show_all)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def print_cops_of_department(registry, department, show_all)
|
130
|
+
selected_cops = if show_all
|
131
|
+
cops_of_department(registry, department)
|
132
|
+
else
|
133
|
+
selected_cops_of_department(registry, department)
|
134
|
+
end
|
135
|
+
|
136
|
+
puts "# Department '#{department}' (#{selected_cops.length}):" if show_all
|
137
|
+
|
138
|
+
print_cop_details(selected_cops)
|
139
|
+
end
|
140
|
+
|
141
|
+
def print_cop_details(cops)
|
142
|
+
cops.each do |cop|
|
143
|
+
puts '# Supports --auto-correct' if cop.new.support_autocorrect?
|
144
|
+
puts "#{cop.cop_name}:"
|
145
|
+
puts config_lines(cop)
|
146
|
+
puts
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
def selected_cops_of_department(cops, department)
|
151
|
+
cops_of_department(cops, department).select do |cop|
|
152
|
+
@options[:show_cops].include?(cop.cop_name)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
def cops_of_department(cops, department)
|
157
|
+
cops.with_department(department).sort!
|
158
|
+
end
|
159
|
+
|
160
|
+
def config_lines(cop)
|
161
|
+
cnf = @config_store.for(Dir.pwd).for_cop(cop)
|
162
|
+
cnf.to_yaml.lines.to_a.butfirst.map { |line| ' ' + line }
|
163
|
+
end
|
164
|
+
|
165
|
+
def display_warning_summary(warnings)
|
166
|
+
return if warnings.empty?
|
167
|
+
|
168
|
+
warn Rainbow("\n#{pluralize(warnings.size, 'warning')}:").yellow
|
169
|
+
|
170
|
+
warnings.each { |warning| warn warning }
|
171
|
+
end
|
172
|
+
|
173
|
+
def display_error_summary(errors)
|
174
|
+
return if errors.empty?
|
175
|
+
|
176
|
+
warn Rainbow("\n#{pluralize(errors.size, 'error')} occurred:").red
|
177
|
+
|
178
|
+
errors.each { |error| warn error }
|
179
|
+
|
180
|
+
warn <<-END.strip_indent
|
181
|
+
Errors are usually caused by RubbyCop bugs.
|
182
|
+
Please, report your problems to RubbyCop's issue tracker.
|
183
|
+
Mention the following information in the issue report:
|
184
|
+
#{RubbyCop::Version.version(true)}
|
185
|
+
END
|
186
|
+
end
|
187
|
+
|
188
|
+
def maybe_print_corrected_source
|
189
|
+
# If we are asked to autocorrect source code read from stdin, the only
|
190
|
+
# reasonable place to write it is to stdout
|
191
|
+
# Unfortunately, we also write other information to stdout
|
192
|
+
# So a delimiter is needed for tools to easily identify where the
|
193
|
+
# autocorrected source begins
|
194
|
+
return unless @options[:stdin] && @options[:auto_correct]
|
195
|
+
puts '=' * 20
|
196
|
+
print @options[:stdin]
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|