danielpclark/trav3

View on GitHub
.rubocop.yml

Summary

Maintainability
Test Coverage
# Common configuration.

AllCops:
  RubyInterpreters:
    - ruby
    - rake
  # Include common Ruby source files.
  Include:
    - '**/*.rb'
    - '**/*.gemspec'
    - '**/*.rake'
    - '**/*.spec'
    - '**/Gemfile'
    - '**/Guardfile'
    - '**/Rakefile'
  Exclude:
    - '.git/**/*'
    - 'vendor/**/*'
  # Default formatter will be used if no `-f/--format` option is given.
  DefaultFormatter: progress
  # Cop names are displayed in offense messages by default. Change behavior
  # by overriding DisplayCopNames, or by giving the `--no-display-cop-names`
  # option.
  DisplayCopNames: true
  # Style guide URLs are not displayed in offense messages by default. Change
  # behavior by overriding `DisplayStyleGuide`, or by giving the
  # `-S/--display-style-guide` option.
  DisplayStyleGuide: false
  # When specifying style guide URLs, any paths and/or fragments will be
  # evaluated relative to the base URL.
  StyleGuideBaseURL: https://github.com/rubocop-hq/ruby-style-guide
  # Extra details are not displayed in offense messages by default. Change
  # behavior by overriding ExtraDetails, or by giving the
  # `-E/--extra-details` option.
  ExtraDetails: false
  # Additional cops that do not reference a style guide rule may be enabled by
  # default. Change behavior by overriding `StyleGuideCopsOnly`, or by giving
  # the `--only-guide-cops` option.
  StyleGuideCopsOnly: false
  # All cops except the ones configured `Enabled: false` in this file are enabled by default.
  # Change this behavior by overriding either `DisabledByDefault` or `EnabledByDefault`.
  # When `DisabledByDefault` is `true`, all cops in the default configuration
  # are disabled, and only cops in user configuration are enabled. This makes
  # cops opt-in instead of opt-out. Note that when `DisabledByDefault` is `true`,
  # cops in user configuration will be enabled even if they don't set the
  # Enabled parameter.
  # When `EnabledByDefault` is `true`, all cops, even those configured `Enabled: false`
  # in this file are enabled by default. Cops can still be disabled in user configuration.
  # Note that it is invalid to set both EnabledByDefault and DisabledByDefault
  # to true in the same configuration.
  EnabledByDefault: false
  DisabledByDefault: false
  # Enables the result cache if `true`. Can be overridden by the `--cache` command
  # line option.
  UseCache: true
  # Threshold for how many files can be stored in the result cache before some
  # of the files are automatically removed.
  MaxFilesInCache: 20000
  # The cache will be stored in "rubocop_cache" under this directory. If
  # CacheRootDirectory is ~ (nil), which it is by default, the root will be
  # taken from the environment variable `$XDG_CACHE_HOME` if it is set, or if
  # `$XDG_CACHE_HOME` is not set, it will be `$HOME/.cache/`.
  CacheRootDirectory: ~
  # It is possible for a malicious user to know the location of RuboCop's cache
  # directory by looking at CacheRootDirectory, and create a symlink in its
  # place that could cause RuboCop to overwrite unintended files, or read
  # malicious input. If you are certain that your cache location is secure from
  # this kind of attack, and wish to use a symlinked cache location, set this
  # value to "true".
  AllowSymlinksInCacheRootDirectory: false
  # What MRI version of the Ruby interpreter is the inspected code intended to
  # run on? (If there is more than one, set this to the lowest version.)
  # If a value is specified for TargetRubyVersion then it is used. Acceptable
  # values are specificed as a float (i.e. 2.5); the teeny version of Ruby
  # should not be included. If the project specifies a Ruby version in the
  # .ruby-version file, Gemfile or gems.rb file, RuboCop will try to determine
  # the desired version of Ruby by inspecting the .ruby-version file first,
  # followed by the Gemfile.lock or gems.locked file. (Although the Ruby version
  # is specified in the Gemfile or gems.rb file, RuboCop reads the final value
  # from the lock file.) If the Ruby version is still unresolved, RuboCop will
  # use the oldest officially supported Ruby version (currently Ruby 2.2).
  TargetRubyVersion: 2.3

#################### Bundler ###############################

Bundler/DuplicatedGem:
  Description: 'Checks for duplicate gem entries in Gemfile.'
  Enabled: true
  VersionAdded: '0.46'
  Include:
    - '**/*.gemfile'
    - '**/Gemfile'
    - '**/gems.rb'

Bundler/GemComment:
  Description: 'Add a comment describing each gem.'
  Enabled: false
  VersionAdded: '0.59'
  Include:
    - '**/*.gemfile'
    - '**/Gemfile'
    - '**/gems.rb'
  Whitelist: []

Bundler/InsecureProtocolSource:
  Description: >-
                 The source `:gemcutter`, `:rubygems` and `:rubyforge` are deprecated
                 because HTTP requests are insecure. Please change your source to
                 'https://rubygems.org' if possible, or 'http://rubygems.org' if not.
  Enabled: true
  VersionAdded: '0.50'
  Include:
    - '**/*.gemfile'
    - '**/Gemfile'
    - '**/gems.rb'

Bundler/OrderedGems:
  Description: >-
                 Gems within groups in the Gemfile should be alphabetically sorted.
  Enabled: true
  VersionAdded: '0.46'
  VersionChanged: '0.47'
  TreatCommentsAsGroupSeparators: true
  Include:
    - '**/*.gemfile'
    - '**/Gemfile'
    - '**/gems.rb'

#################### Gemspec ###############################

Gemspec/DuplicatedAssignment:
  Description: 'An attribute assignment method calls should be listed only once in a gemspec.'
  Enabled: true
  VersionAdded: '0.52'
  Include:
    - '**/*.gemspec'

Gemspec/OrderedDependencies:
  Description: >-
                 Dependencies in the gemspec should be alphabetically sorted.
  Enabled: true
  VersionAdded: '0.51'
  TreatCommentsAsGroupSeparators: true
  Include:
    - '**/*.gemspec'

Gemspec/RequiredRubyVersion:
  Description: 'Checks that `required_ruby_version` of gemspec and `TargetRubyVersion` of .rubocop.yml are equal.'
  Enabled: true
  VersionAdded: '0.52'
  Include:
    - '**/*.gemspec'

#################### Layout ###########################

Layout/AccessModifierIndentation:
  Description: Check indentation of private/protected visibility modifiers.
  StyleGuide: '#indent-public-private-protected'
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: indent
  SupportedStyles:
    - outdent
    - indent
  # By default, the indentation width from Layout/IndentationWidth is used
  # But it can be overridden by setting this parameter
  IndentationWidth: ~

Layout/AlignArray:
  Description: >-
                 Align the elements of an array literal if they span more than
                 one line.
  StyleGuide: '#align-multiline-arrays'
  Enabled: true
  VersionAdded: '0.49'

Layout/AlignHash:
  Description: >-
                 Align the elements of a hash literal if they span more than
                 one line.
  Enabled: true
  VersionAdded: '0.49'
  # Alignment of entries using hash rocket as separator. Valid values are:
  #
  # key - left alignment of keys
  #   'a' => 2
  #   'bb' => 3
  # separator - alignment of hash rockets, keys are right aligned
  #    'a' => 2
  #   'bb' => 3
  # table - left alignment of keys, hash rockets, and values
  #   'a'  => 2
  #   'bb' => 3
  EnforcedHashRocketStyle: key
  SupportedHashRocketStyles:
    - key
    - separator
    - table
  # Alignment of entries using colon as separator. Valid values are:
  #
  # key - left alignment of keys
  #   a: 0
  #   bb: 1
  # separator - alignment of colons, keys are right aligned
  #    a: 0
  #   bb: 1
  # table - left alignment of keys and values
  #   a:  0
  #   bb: 1
  EnforcedColonStyle: key
  SupportedColonStyles:
    - key
    - separator
    - table
  # Select whether hashes that are the last argument in a method call should be
  # inspected? Valid values are:
  #
  # always_inspect - Inspect both implicit and explicit hashes.
  #   Registers an offense for:
  #     function(a: 1,
  #       b: 2)
  #   Registers an offense for:
  #     function({a: 1,
  #       b: 2})
  # always_ignore - Ignore both implicit and explicit hashes.
  #   Accepts:
  #     function(a: 1,
  #       b: 2)
  #   Accepts:
  #     function({a: 1,
  #       b: 2})
  # ignore_implicit - Ignore only implicit hashes.
  #   Accepts:
  #     function(a: 1,
  #       b: 2)
  #   Registers an offense for:
  #     function({a: 1,
  #       b: 2})
  # ignore_explicit - Ignore only explicit hashes.
  #   Accepts:
  #     function({a: 1,
  #       b: 2})
  #   Registers an offense for:
  #     function(a: 1,
  #       b: 2)
  EnforcedLastArgumentHashStyle: always_inspect
  SupportedLastArgumentHashStyles:
    - always_inspect
    - always_ignore
    - ignore_implicit
    - ignore_explicit

Layout/AlignParameters:
  Description: >-
                 Align the parameters of a method call if they span more
                 than one line.
  StyleGuide: '#no-double-indent'
  Enabled: true
  VersionAdded: '0.49'
  # Alignment of parameters in multi-line method calls.
  #
  # The `with_first_parameter` style aligns the following lines along the same
  # column as the first parameter.
  #
  #     method_call(a,
  #                 b)
  #
  # The `with_fixed_indentation` style aligns the following lines with one
  # level of indentation relative to the start of the line with the method call.
  #
  #     method_call(a,
  #       b)
  EnforcedStyle: with_first_parameter
  SupportedStyles:
    - with_first_parameter
    - with_fixed_indentation
  # By default, the indentation width from Layout/IndentationWidth is used
  # But it can be overridden by setting this parameter
  IndentationWidth: ~

Layout/BlockAlignment:
  Description: 'Align block ends correctly.'
  Enabled: true
  VersionAdded: '0.53'
  # The value `start_of_block` means that the `end` should be aligned with line
  # where the `do` keyword appears.
  # The value `start_of_line` means it should be aligned with the whole
  # expression's starting line.
  # The value `either` means both are allowed.
  EnforcedStyleAlignWith: either
  SupportedStylesAlignWith:
    - either
    - start_of_block
    - start_of_line

Layout/BlockEndNewline:
  Description: 'Put end statement of multiline block on its own line.'
  Enabled: true
  VersionAdded: '0.49'

Layout/CaseIndentation:
  Description: 'Indentation of when in a case/when/[else/]end.'
  StyleGuide: '#indent-when-to-case'
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: case
  SupportedStyles:
    - case
    - end
  IndentOneStep: false
  # By default, the indentation width from `Layout/IndentationWidth` is used.
  # But it can be overridden by setting this parameter.
  # This only matters if `IndentOneStep` is `true`
  IndentationWidth: ~

Layout/ClassStructure:
  Description: 'Enforces a configured order of definitions within a class body.'
  StyleGuide: 'https://github.com/rubocop-hq/ruby-style-guide#consistent-classes'
  Enabled: false
  VersionAdded: '0.52'
  Categories:
    module_inclusion:
      - include
      - prepend
      - extend
  ExpectedOrder:
      - module_inclusion
      - constants
      - public_class_methods
      - initializer
      - public_methods
      - protected_methods
      - private_methods

Layout/ClosingHeredocIndentation:
  Description: 'Checks the indentation of here document closings.'
  Enabled: true
  VersionAdded: '0.57'

Layout/ClosingParenthesisIndentation:
  Description: 'Checks the indentation of hanging closing parentheses.'
  Enabled: true
  VersionAdded: '0.49'

Layout/CommentIndentation:
  Description: 'Indentation of comments.'
  Enabled: true
  VersionAdded: '0.49'

Layout/ConditionPosition:
  Description: >-
                 Checks for condition placed in a confusing position relative to
                 the keyword.
  StyleGuide: '#same-line-condition'
  Enabled: true
  VersionAdded: '0.53'

Layout/DefEndAlignment:
  Description: 'Align ends corresponding to defs correctly.'
  Enabled: true
  VersionAdded: '0.53'
  # The value `def` means that `end` should be aligned with the def keyword.
  # The value `start_of_line` means that `end` should be aligned with method
  # calls like `private`, `public`, etc, if present in front of the `def`
  # keyword on the same line.
  EnforcedStyleAlignWith: start_of_line
  SupportedStylesAlignWith:
    - start_of_line
    - def
  AutoCorrect: false
  Severity: warning

Layout/DotPosition:
  Description: 'Checks the position of the dot in multi-line method calls.'
  StyleGuide: '#consistent-multi-line-chains'
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: leading
  SupportedStyles:
    - leading
    - trailing

Layout/ElseAlignment:
  Description: 'Align elses and elsifs correctly.'
  Enabled: true
  VersionAdded: '0.49'

Layout/EmptyComment:
  Description: 'Checks empty comment.'
  Enabled: true
  VersionAdded: '0.53'
  AllowBorderComment: true
  AllowMarginComment: true

Layout/EmptyLineAfterGuardClause:
  Description: 'Add empty line after guard clause.'
  Enabled: true
  VersionAdded: '0.56'
  VersionChanged: '0.59'

Layout/EmptyLineAfterMagicComment:
  Description: 'Add an empty line after magic comments to separate them from code.'
  StyleGuide: '#separate-magic-comments-from-code'
  Enabled: true
  VersionAdded: '0.49'

Layout/EmptyLineBetweenDefs:
  Description: 'Use empty lines between defs.'
  StyleGuide: '#empty-lines-between-methods'
  Enabled: true
  VersionAdded: '0.49'
  # If `true`, this parameter means that single line method definitions don't
  # need an empty line between them.
  AllowAdjacentOneLineDefs: false
  # Can be array to specify minimum and maximum number of empty lines, e.g. [1, 2]
  NumberOfEmptyLines: 1

Layout/EmptyLines:
  Description: "Don't use several empty lines in a row."
  StyleGuide: '#two-or-more-empty-lines'
  Enabled: true
  VersionAdded: '0.49'

Layout/EmptyLinesAroundAccessModifier:
  Description: "Keep blank lines around access modifiers."
  StyleGuide: '#empty-lines-around-access-modifier'
  Enabled: true
  VersionAdded: '0.49'

Layout/EmptyLinesAroundArguments:
  Description: "Keeps track of empty lines around method arguments."
  Enabled: true
  VersionAdded: '0.52'

Layout/EmptyLinesAroundBeginBody:
  Description: "Keeps track of empty lines around begin-end bodies."
  StyleGuide: '#empty-lines-around-bodies'
  Enabled: true
  VersionAdded: '0.49'

Layout/EmptyLinesAroundBlockBody:
  Description: "Keeps track of empty lines around block bodies."
  StyleGuide: '#empty-lines-around-bodies'
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: no_empty_lines
  SupportedStyles:
    - empty_lines
    - no_empty_lines

Layout/EmptyLinesAroundClassBody:
  Description: "Keeps track of empty lines around class bodies."
  StyleGuide: '#empty-lines-around-bodies'
  Enabled: true
  VersionAdded: '0.49'
  VersionChanged: '0.53'
  EnforcedStyle: no_empty_lines
  SupportedStyles:
    - empty_lines
    - empty_lines_except_namespace
    - empty_lines_special
    - no_empty_lines
    - beginning_only
    - ending_only

Layout/EmptyLinesAroundExceptionHandlingKeywords:
  Description: "Keeps track of empty lines around exception handling keywords."
  StyleGuide: '#empty-lines-around-bodies'
  Enabled: true
  VersionAdded: '0.49'

Layout/EmptyLinesAroundMethodBody:
  Description: "Keeps track of empty lines around method bodies."
  StyleGuide: '#empty-lines-around-bodies'
  Enabled: true
  VersionAdded: '0.49'

Layout/EmptyLinesAroundModuleBody:
  Description: "Keeps track of empty lines around module bodies."
  StyleGuide: '#empty-lines-around-bodies'
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: no_empty_lines
  SupportedStyles:
    - empty_lines
    - empty_lines_except_namespace
    - empty_lines_special
    - no_empty_lines

Layout/EndAlignment:
  Description: 'Align ends correctly.'
  Enabled: true
  VersionAdded: '0.53'
  # The value `keyword` means that `end` should be aligned with the matching
  # keyword (`if`, `while`, etc.).
  # The value `variable` means that in assignments, `end` should be aligned
  # with the start of the variable on the left hand side of `=`. In all other
  # situations, `end` should still be aligned with the keyword.
  # The value `start_of_line` means that `end` should be aligned with the start
  # of the line which the matching keyword appears on.
  EnforcedStyleAlignWith: keyword
  SupportedStylesAlignWith:
    - keyword
    - variable
    - start_of_line
  AutoCorrect: false
  Severity: warning

Layout/EndOfLine:
  Description: 'Use Unix-style line endings.'
  StyleGuide: '#crlf'
  Enabled: true
  VersionAdded: '0.49'
  # The `native` style means that CR+LF (Carriage Return + Line Feed) is
  # enforced on Windows, and LF is enforced on other platforms. The other styles
  # mean LF and CR+LF, respectively.
  EnforcedStyle: native
  SupportedStyles:
    - native
    - lf
    - crlf

Layout/ExtraSpacing:
  Description: 'Do not use unnecessary spacing.'
  Enabled: true
  VersionAdded: '0.49'
  # When true, allows most uses of extra spacing if the intent is to align
  # things with the previous or next line, not counting empty lines or comment
  # lines.
  AllowForAlignment: true
  # When true, forces the alignment of `=` in assignments on consecutive lines.
  ForceEqualSignAlignment: false

Layout/FirstArrayElementLineBreak:
  Description: >-
                 Checks for a line break before the first element in a
                 multi-line array.
  Enabled: false
  VersionAdded: '0.49'

Layout/FirstHashElementLineBreak:
  Description: >-
                 Checks for a line break before the first element in a
                 multi-line hash.
  Enabled: false
  VersionAdded: '0.49'

Layout/FirstMethodArgumentLineBreak:
  Description: >-
                 Checks for a line break before the first argument in a
                 multi-line method call.
  Enabled: false
  VersionAdded: '0.49'

Layout/FirstMethodParameterLineBreak:
  Description: >-
                 Checks for a line break before the first parameter in a
                 multi-line method parameter definition.
  Enabled: false
  VersionAdded: '0.49'

Layout/FirstParameterIndentation:
  Description: 'Checks the indentation of the first parameter in a method call.'
  Enabled: true
  VersionAdded: '0.49'
  VersionChanged: '0.56'
  EnforcedStyle: special_for_inner_method_call_in_parentheses
  SupportedStyles:
    # The first parameter should always be indented one step more than the
    # preceding line.
    - consistent
    # The first parameter should always be indented one level relative to the
    # parent that is receiving the parameter
    - consistent_relative_to_receiver
    # The first parameter should normally be indented one step more than the
    # preceding line, but if it's a parameter for a method call that is itself
    # a parameter in a method call, then the inner parameter should be indented
    # relative to the inner method.
    - special_for_inner_method_call
    # Same as `special_for_inner_method_call` except that the special rule only
    # applies if the outer method call encloses its arguments in parentheses.
    - special_for_inner_method_call_in_parentheses
  # By default, the indentation width from `Layout/IndentationWidth` is used
  # But it can be overridden by setting this parameter
  IndentationWidth: ~

Layout/IndentArray:
  Description: >-
                 Checks the indentation of the first element in an array
                 literal.
  Enabled: true
  VersionAdded: '0.49'
  # The value `special_inside_parentheses` means that array literals with
  # brackets that have their opening bracket on the same line as a surrounding
  # opening round parenthesis, shall have their first element indented relative
  # to the first position inside the parenthesis.
  #
  # The value `consistent` means that the indentation of the first element shall
  # always be relative to the first position of the line where the opening
  # bracket is.
  #
  # The value `align_brackets` means that the indentation of the first element
  # shall always be relative to the position of the opening bracket.
  EnforcedStyle: special_inside_parentheses
  SupportedStyles:
    - special_inside_parentheses
    - consistent
    - align_brackets
  # By default, the indentation width from `Layout/IndentationWidth` is used
  # But it can be overridden by setting this parameter
  IndentationWidth: ~

Layout/IndentAssignment:
  Description: >-
                 Checks the indentation of the first line of the
                 right-hand-side of a multi-line assignment.
  Enabled: true
  VersionAdded: '0.49'
  # By default, the indentation width from `Layout/IndentationWidth` is used
  # But it can be overridden by setting this parameter
  IndentationWidth: ~

Layout/IndentHash:
  Description: 'Checks the indentation of the first key in a hash literal.'
  Enabled: true
  VersionAdded: '0.49'
  # The value `special_inside_parentheses` means that hash literals with braces
  # that have their opening brace on the same line as a surrounding opening
  # round parenthesis, shall have their first key indented relative to the
  # first position inside the parenthesis.
  #
  # The value `consistent` means that the indentation of the first key shall
  # always be relative to the first position of the line where the opening
  # brace is.
  #
  # The value `align_braces` means that the indentation of the first key shall
  # always be relative to the position of the opening brace.
  EnforcedStyle: special_inside_parentheses
  SupportedStyles:
    - special_inside_parentheses
    - consistent
    - align_braces
  # By default, the indentation width from `Layout/IndentationWidth` is used
  # But it can be overridden by setting this parameter
  IndentationWidth: ~

Layout/IndentHeredoc:
  Description: 'This cop checks the indentation of the here document bodies.'
  StyleGuide: '#squiggly-heredocs'
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: auto_detection
  SupportedStyles:
    - auto_detection
    - squiggly
    - active_support
    - powerpack
    - unindent

Layout/IndentationConsistency:
  Description: 'Keep indentation straight.'
  StyleGuide: '#spaces-indentation'
  Enabled: true
  VersionAdded: '0.49'
  # The difference between `rails` and `normal` is that the `rails` style
  # prescribes that in classes and modules the `protected` and `private`
  # modifier keywords shall be indented the same as public methods and that
  # protected and private members shall be indented one step more than the
  # modifiers. Other than that, both styles mean that entities on the same
  # logical depth shall have the same indentation.
  EnforcedStyle: normal
  SupportedStyles:
    - normal
    - rails

Layout/IndentationWidth:
  Description: 'Use 2 spaces for indentation.'
  StyleGuide: '#spaces-indentation'
  Enabled: true
  VersionAdded: '0.49'
  # Number of spaces for each indentation level.
  Width: 2
  IgnoredPatterns: []

Layout/InitialIndentation:
  Description: >-
    Checks the indentation of the first non-blank non-comment line in a file.
  Enabled: true
  VersionAdded: '0.49'

Layout/LeadingBlankLines:
  Description: Check for unnecessary blank lines at the beginning of a file.
  Enabled: true
  VersionAdded: '0.57'

Layout/LeadingCommentSpace:
  Description: 'Comments should start with a space.'
  StyleGuide: '#hash-space'
  Enabled: true
  VersionAdded: '0.49'

Layout/MultilineArrayBraceLayout:
  Description: >-
                 Checks that the closing brace in an array literal is
                 either on the same line as the last array element, or
                 a new line.
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: symmetrical
  SupportedStyles:
    # symmetrical: closing brace is positioned in same way as opening brace
    # new_line: closing brace is always on a new line
    # same_line: closing brace is always on the same line as last element
    - symmetrical
    - new_line
    - same_line

Layout/MultilineAssignmentLayout:
  Description: 'Check for a newline after the assignment operator in multi-line assignments.'
  StyleGuide: '#indent-conditional-assignment'
  Enabled: false
  VersionAdded: '0.49'
  # The types of assignments which are subject to this rule.
  SupportedTypes:
    - block
    - case
    - class
    - if
    - kwbegin
    - module
  EnforcedStyle: new_line
  SupportedStyles:
    # Ensures that the assignment operator and the rhs are on the same line for
    # the set of supported types.
    - same_line
    # Ensures that the assignment operator and the rhs are on separate lines
    # for the set of supported types.
    - new_line

Layout/MultilineBlockLayout:
  Description: 'Ensures newlines after multiline block do statements.'
  Enabled: true
  VersionAdded: '0.49'

Layout/MultilineHashBraceLayout:
  Description: >-
                 Checks that the closing brace in a hash literal is
                 either on the same line as the last hash element, or
                 a new line.
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: symmetrical
  SupportedStyles:
    # symmetrical: closing brace is positioned in same way as opening brace
    # new_line: closing brace is always on a new line
    # same_line: closing brace is always on same line as last element
    - symmetrical
    - new_line
    - same_line

Layout/MultilineMethodCallBraceLayout:
  Description: >-
                 Checks that the closing brace in a method call is
                 either on the same line as the last method argument, or
                 a new line.
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: symmetrical
  SupportedStyles:
    # symmetrical: closing brace is positioned in same way as opening brace
    # new_line: closing brace is always on a new line
    # same_line: closing brace is always on the same line as last argument
    - symmetrical
    - new_line
    - same_line

Layout/MultilineMethodCallIndentation:
  Description: >-
                 Checks indentation of method calls with the dot operator
                 that span more than one line.
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: aligned
  SupportedStyles:
    - aligned
    - indented
    - indented_relative_to_receiver
  # By default, the indentation width from Layout/IndentationWidth is used
  # But it can be overridden by setting this parameter
  IndentationWidth: ~

Layout/MultilineMethodDefinitionBraceLayout:
  Description: >-
                 Checks that the closing brace in a method definition is
                 either on the same line as the last method parameter, or
                 a new line.
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: symmetrical
  SupportedStyles:
    # symmetrical: closing brace is positioned in same way as opening brace
    # new_line: closing brace is always on a new line
    # same_line: closing brace is always on the same line as last parameter
    - symmetrical
    - new_line
    - same_line

Layout/MultilineOperationIndentation:
  Description: >-
                 Checks indentation of binary operations that span more than
                 one line.
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: aligned
  SupportedStyles:
    - aligned
    - indented
  # By default, the indentation width from `Layout/IndentationWidth` is used
  # But it can be overridden by setting this parameter
  IndentationWidth: ~

Layout/RescueEnsureAlignment:
  Description: 'Align rescues and ensures correctly.'
  Enabled: true
  VersionAdded: '0.49'

Layout/SpaceAfterColon:
  Description: 'Use spaces after colons.'
  StyleGuide: '#spaces-operators'
  Enabled: true
  VersionAdded: '0.49'

Layout/SpaceAfterComma:
  Description: 'Use spaces after commas.'
  StyleGuide: '#spaces-operators'
  Enabled: true
  VersionAdded: '0.49'

Layout/SpaceAfterMethodName:
  Description: >-
                 Do not put a space between a method name and the opening
                 parenthesis in a method definition.
  StyleGuide: '#parens-no-spaces'
  Enabled: true
  VersionAdded: '0.49'

Layout/SpaceAfterNot:
  Description: Tracks redundant space after the ! operator.
  StyleGuide: '#no-space-bang'
  Enabled: true
  VersionAdded: '0.49'

Layout/SpaceAfterSemicolon:
  Description: 'Use spaces after semicolons.'
  StyleGuide: '#spaces-operators'
  Enabled: true
  VersionAdded: '0.49'

Layout/SpaceAroundBlockParameters:
  Description: 'Checks the spacing inside and after block parameters pipes.'
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyleInsidePipes: no_space
  SupportedStylesInsidePipes:
    - space
    - no_space

Layout/SpaceAroundEqualsInParameterDefault:
  Description: >-
                 Checks that the equals signs in parameter default assignments
                 have or don't have surrounding space depending on
                 configuration.
  StyleGuide: '#spaces-around-equals'
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: space
  SupportedStyles:
    - space
    - no_space

Layout/SpaceAroundKeyword:
  Description: 'Use a space around keywords if appropriate.'
  Enabled: true
  VersionAdded: '0.49'

Layout/SpaceAroundOperators:
  Description: 'Use a single space around operators.'
  StyleGuide: '#spaces-operators'
  Enabled: true
  VersionAdded: '0.49'
  # When `true`, allows most uses of extra spacing if the intent is to align
  # with an operator on the previous or next line, not counting empty lines
  # or comment lines.
  AllowForAlignment: true

Layout/SpaceBeforeBlockBraces:
  Description: >-
                 Checks that the left block brace has or doesn't have space
                 before it.
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: space
  SupportedStyles:
    - space
    - no_space
  EnforcedStyleForEmptyBraces: space
  SupportedStylesForEmptyBraces:
    - space
    - no_space
  VersionChanged: '0.52.1'

Layout/SpaceBeforeComma:
  Description: 'No spaces before commas.'
  Enabled: true
  VersionAdded: '0.49'

Layout/SpaceBeforeComment:
  Description: >-
                 Checks for missing space between code and a comment on the
                 same line.
  Enabled: true
  VersionAdded: '0.49'

Layout/SpaceBeforeFirstArg:
  Description: >-
                 Checks that exactly one space is used between a method name
                 and the first argument for method calls without parentheses.
  Enabled: true
  VersionAdded: '0.49'
  # When `true`, allows most uses of extra spacing if the intent is to align
  # things with the previous or next line, not counting empty lines or comment
  # lines.
  AllowForAlignment: true

Layout/SpaceBeforeSemicolon:
  Description: 'No spaces before semicolons.'
  Enabled: true
  VersionAdded: '0.49'

Layout/SpaceInLambdaLiteral:
  Description: 'Checks for spaces in lambda literals.'
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: require_no_space
  SupportedStyles:
    - require_no_space
    - require_space

Layout/SpaceInsideArrayLiteralBrackets:
  Description: 'Checks the spacing inside array literal brackets.'
  Enabled: true
  VersionAdded: '0.52'
  EnforcedStyle: no_space
  SupportedStyles:
    - space
    - no_space
    # 'compact' normally requires a space inside the brackets, with the exception
    # that successive left brackets or right brackets are collapsed together
    - compact
  EnforcedStyleForEmptyBrackets: no_space
  SupportedStylesForEmptyBrackets:
    - space
    - no_space

Layout/SpaceInsideArrayPercentLiteral:
  Description: 'No unnecessary additional spaces between elements in %i/%w literals.'
  Enabled: true
  VersionAdded: '0.49'

Layout/SpaceInsideBlockBraces:
  Description: >-
                 Checks that block braces have or don't have surrounding space.
                 For blocks taking parameters, checks that the left brace has
                 or doesn't have trailing space.
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: space
  SupportedStyles:
    - space
    - no_space
  EnforcedStyleForEmptyBraces: no_space
  SupportedStylesForEmptyBraces:
    - space
    - no_space
  # Space between `{` and `|`. Overrides `EnforcedStyle` if there is a conflict.
  SpaceBeforeBlockParameters: true

Layout/SpaceInsideHashLiteralBraces:
  Description: "Use spaces inside hash literal braces - or don't."
  StyleGuide: '#spaces-operators'
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: space
  SupportedStyles:
    - space
    - no_space
    # 'compact' normally requires a space inside hash braces, with the exception
    # that successive left braces or right braces are collapsed together
    - compact
  EnforcedStyleForEmptyBraces: no_space
  SupportedStylesForEmptyBraces:
    - space
    - no_space


Layout/SpaceInsideParens:
  Description: 'No spaces after ( or before ).'
  StyleGuide: '#spaces-braces'
  Enabled: false
  VersionAdded: '0.49'
  VersionChanged: '0.55'
  EnforcedStyle: no_space
  SupportedStyles:
    - space
    - no_space

Layout/SpaceInsidePercentLiteralDelimiters:
  Description: 'No unnecessary spaces inside delimiters of %i/%w/%x literals.'
  Enabled: true
  VersionAdded: '0.49'

Layout/SpaceInsideRangeLiteral:
  Description: 'No spaces inside range literals.'
  StyleGuide: '#no-space-inside-range-literals'
  Enabled: true
  VersionAdded: '0.49'

Layout/SpaceInsideReferenceBrackets:
  Description: 'Checks the spacing inside referential brackets.'
  Enabled: true
  VersionAdded: '0.52'
  VersionChanged: '0.53'
  EnforcedStyle: no_space
  SupportedStyles:
    - space
    - no_space
  EnforcedStyleForEmptyBrackets: no_space
  SupportedStylesForEmptyBrackets:
    - space
    - no_space

Layout/SpaceInsideStringInterpolation:
  Description: 'Checks for padding/surrounding spaces inside string interpolation.'
  StyleGuide: '#string-interpolation'
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: no_space
  SupportedStyles:
    - space
    - no_space

Layout/Tab:
  Description: 'No hard tabs.'
  StyleGuide: '#spaces-indentation'
  Enabled: true
  VersionAdded: '0.49'
  VersionChanged: '0.51'
  # By default, the indentation width from Layout/IndentationWidth is used
  # But it can be overridden by setting this parameter
  # It is used during auto-correction to determine how many spaces should
  # replace each tab.
  IndentationWidth: ~

Layout/TrailingBlankLines:
  Description: 'Checks trailing blank lines and final newline.'
  StyleGuide: '#newline-eof'
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: final_newline
  SupportedStyles:
    - final_newline
    - final_blank_line

Layout/TrailingWhitespace:
  Description: 'Avoid trailing whitespace.'
  StyleGuide: '#no-trailing-whitespace'
  Enabled: true
  VersionAdded: '0.49'
  VersionChanged: '0.55'
  AllowInHeredoc: false

#################### Lint ##################################
### Warnings

Lint/AmbiguousBlockAssociation:
  Description: >-
                 Checks for ambiguous block association with method when param passed without
                 parentheses.
  StyleGuide: '#syntax'
  Enabled: true
  VersionAdded: '0.48'

Lint/AmbiguousOperator:
  Description: >-
                 Checks for ambiguous operators in the first argument of a
                 method invocation without parentheses.
  StyleGuide: '#method-invocation-parens'
  Enabled: true
  VersionAdded: '0.17'

Lint/AmbiguousRegexpLiteral:
  Description: >-
                 Checks for ambiguous regexp literals in the first argument of
                 a method invocation without parentheses.
  Enabled: true
  VersionAdded: '0.17'

Lint/AssignmentInCondition:
  Description: "Don't use assignment in conditions."
  StyleGuide: '#safe-assignment-in-condition'
  Enabled: true
  VersionAdded: '0.9'
  AllowSafeAssignment: true

Lint/BigDecimalNew:
  Description: '`BigDecimal.new()` is deprecated. Use `BigDecimal()` instead.'
  Enabled: true
  VersionAdded: '0.53'

Lint/BooleanSymbol:
  Description: 'Check for `:true` and `:false` symbols.'
  Enabled: true
  VersionAdded: '0.50'

Lint/CircularArgumentReference:
  Description: "Default values in optional keyword arguments and optional ordinal arguments should not refer back to the name of the argument."
  Enabled: true
  VersionAdded: '0.33'

Lint/Debugger:
  Description: 'Check for debugger calls.'
  Enabled: true
  VersionAdded: '0.14'
  VersionChanged: '0.49'

Lint/DeprecatedClassMethods:
  Description: 'Check for deprecated class method calls.'
  Enabled: true
  VersionAdded: '0.19'

Lint/DuplicateCaseCondition:
  Description: 'Do not repeat values in case conditionals.'
  Enabled: true
  VersionAdded: '0.45'

Lint/DuplicateMethods:
  Description: 'Check for duplicate method definitions.'
  Enabled: true
  VersionAdded: '0.29'

Lint/DuplicatedKey:
  Description: 'Check for duplicate keys in hash literals.'
  Enabled: true
  VersionAdded: '0.34'

Lint/EachWithObjectArgument:
  Description: 'Check for immutable argument given to each_with_object.'
  Enabled: true
  VersionAdded: '0.31'

Lint/ElseLayout:
  Description: 'Check for odd code arrangement in an else block.'
  Enabled: true
  VersionAdded: '0.17'

Lint/EmptyEnsure:
  Description: 'Checks for empty ensure block.'
  Enabled: true
  VersionAdded: '0.10'
  VersionChanged: '0.48'
  AutoCorrect: false

Lint/EmptyExpression:
  Description: 'Checks for empty expressions.'
  Enabled: true
  VersionAdded: '0.45'

Lint/EmptyInterpolation:
  Description: 'Checks for empty string interpolation.'
  Enabled: true
  VersionAdded: '0.20'
  VersionChanged: '0.45'

Lint/EmptyWhen:
  Description: 'Checks for `when` branches with empty bodies.'
  Enabled: true
  VersionAdded: '0.45'

Lint/EndInMethod:
  Description: 'END blocks should not be placed inside method definitions.'
  Enabled: true
  VersionAdded: '0.9'

Lint/EnsureReturn:
  Description: 'Do not use return in an ensure block.'
  StyleGuide: '#no-return-ensure'
  Enabled: true
  VersionAdded: '0.9'

Lint/ErbNewArguments:
  Description: 'Use `:trim_mode` and `:eoutvar` keyword arguments to `ERB.new`.'
  Enabled: true
  VersionAdded: '0.56'

Lint/FloatOutOfRange:
  Description: >-
                 Catches floating-point literals too large or small for Ruby to
                 represent.
  Enabled: true
  VersionAdded: '0.36'

Lint/FormatParameterMismatch:
  Description: 'The number of parameters to format/sprint must match the fields.'
  Enabled: true
  VersionAdded: '0.33'

Lint/HandleExceptions:
  Description: "Don't suppress exception."
  StyleGuide: '#dont-hide-exceptions'
  Enabled: true
  VersionAdded: '0.9'

Lint/ImplicitStringConcatenation:
  Description: >-
                 Checks for adjacent string literals on the same line, which
                 could better be represented as a single string literal.
  Enabled: true
  VersionAdded: '0.36'

Lint/IneffectiveAccessModifier:
  Description: >-
                 Checks for attempts to use `private` or `protected` to set
                 the visibility of a class method, which does not work.
  Enabled: true
  VersionAdded: '0.36'

Lint/InheritException:
  Description: 'Avoid inheriting from the `Exception` class.'
  Enabled: true
  VersionAdded: '0.41'
  # The default base class in favour of `Exception`.
  EnforcedStyle: runtime_error
  SupportedStyles:
    - runtime_error
    - standard_error

Lint/InterpolationCheck:
  Description: 'Raise warning for interpolation in single q strs'
  Enabled: true
  VersionAdded: '0.50'

Lint/LiteralAsCondition:
  Description: 'Checks of literals used in conditions.'
  Enabled: true
  VersionAdded: '0.51'

Lint/LiteralInInterpolation:
  Description: 'Checks for literals used in interpolation.'
  Enabled: true
  VersionAdded: '0.19'
  VersionChanged: '0.32'

Lint/Loop:
  Description: >-
                 Use Kernel#loop with break rather than begin/end/until or
                 begin/end/while for post-loop tests.
  StyleGuide: '#loop-with-break'
  Enabled: true
  VersionAdded: '0.9'

Lint/MissingCopEnableDirective:
  Description: 'Checks for a `# rubocop:enable` after `# rubocop:disable`'
  Enabled: true
  VersionAdded: '0.52'
  # Maximum number of consecutive lines the cop can be disabled for.
  # 0 allows only single-line disables
  # 1 would mean the maximum allowed is the following:
  #   # rubocop:disable SomeCop
  #   a = 1
  #   # rubocop:enable SomeCop
  # .inf for any size
  MaximumRangeSize: .inf

Lint/MultipleCompare:
  Description: "Use `&&` operator to compare multiple value."
  Enabled: true
  VersionAdded: '0.47'

Lint/NestedMethodDefinition:
  Description: 'Do not use nested method definitions.'
  StyleGuide: '#no-nested-methods'
  Enabled: true
  VersionAdded: '0.32'

Lint/NestedPercentLiteral:
  Description: 'Checks for nested percent literals.'
  Enabled: true
  VersionAdded: '0.52'

Lint/NextWithoutAccumulator:
  Description:  >-
                  Do not omit the accumulator when calling `next`
                  in a `reduce`/`inject` block.
  Enabled: true
  VersionAdded: '0.36'

Lint/NonLocalExitFromIterator:
  Description: 'Do not use return in iterator to cause non-local exit.'
  Enabled: true
  VersionAdded: '0.30'

Lint/NumberConversion:
  Description: 'Checks unsafe usage of number conversion methods.'
  Enabled: false
  VersionAdded: '0.53'

Lint/OrderedMagicComments:
  Description: 'Checks the proper ordering of magic comments and whether a magic comment is not placed before a shebang.'
  Enabled: true
  VersionAdded: '0.53'

Lint/ParenthesesAsGroupedExpression:
  Description: >-
                 Checks for method calls with a space before the opening
                 parenthesis.
  StyleGuide: '#parens-no-spaces'
  Enabled: true
  VersionAdded: '0.12'

Lint/PercentStringArray:
  Description: >-
                 Checks for unwanted commas and quotes in %w/%W literals.
  Enabled: true
  VersionAdded: '0.41'

Lint/PercentSymbolArray:
  Description: >-
                 Checks for unwanted commas and colons in %i/%I literals.
  Enabled: true
  VersionAdded: '0.41'

Lint/RandOne:
  Description: >-
                 Checks for `rand(1)` calls. Such calls always return `0`
                 and most likely a mistake.
  Enabled: true
  VersionAdded: '0.36'

Lint/RedundantWithIndex:
  Description: 'Checks for redundant `with_index`.'
  Enabled: true
  VersionAdded: '0.50'

Lint/RedundantWithObject:
  Description: 'Checks for redundant `with_object`.'
  Enabled: true
  VersionAdded: '0.51'

Lint/RegexpAsCondition:
  Description: >-
                 Do not use regexp literal as a condition.
                 The regexp literal matches `$_` implicitly.
  Enabled: true
  VersionAdded: '0.51'

Lint/RequireParentheses:
  Description: >-
                 Use parentheses in the method call to avoid confusion
                 about precedence.
  Enabled: true
  VersionAdded: '0.18'

Lint/RescueException:
  Description: 'Avoid rescuing the Exception class.'
  StyleGuide: '#no-blind-rescues'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.27.1'

Lint/RescueType:
  Description: 'Avoid rescuing from non constants that could result in a `TypeError`.'
  Enabled: true
  VersionAdded: '0.49'

Lint/ReturnInVoidContext:
  Description: 'Checks for return in void context.'
  Enabled: true
  VersionAdded: '0.50'

Lint/SafeNavigationChain:
  Description: 'Do not chain ordinary method call after safe navigation operator.'
  Enabled: true
  VersionAdded: '0.47'
  VersionChanged: '0.56'
  Whitelist:
    - present?
    - blank?
    - presence
    - try
    - try!

Lint/SafeNavigationConsistency:
  Description: >-
                 Check to make sure that if safe navigation is used for a method
                 call in an `&&` or `||` condition that safe navigation is used
                 for all method calls on that same object.
  Enabled: true
  VersionAdded: '0.55'
  Whitelist:
    - present?
    - blank?
    - presence
    - try
    - try!


Lint/ScriptPermission:
  Description: 'Grant script file execute permission.'
  Enabled: true
  VersionAdded: '0.49'
  VersionChanged: '0.50'

Lint/ShadowedArgument:
  Description: 'Avoid reassigning arguments before they were used.'
  Enabled: true
  VersionAdded: '0.52'
  IgnoreImplicitReferences: false


Lint/ShadowedException:
  Description: >-
                  Avoid rescuing a higher level exception
                  before a lower level exception.
  Enabled: true
  VersionAdded: '0.41'

Lint/ShadowingOuterLocalVariable:
  Description: >-
                 Do not use the same name as outer local variable
                 for block arguments or block local variables.
  Enabled: true
  VersionAdded: '0.9'

Lint/StringConversionInInterpolation:
  Description: 'Checks for Object#to_s usage in string interpolation.'
  StyleGuide: '#no-to-s'
  Enabled: true
  VersionAdded: '0.19'
  VersionChanged: '0.20'

Lint/Syntax:
  Description: 'Checks syntax error'
  Enabled: true
  VersionAdded: '0.9'


Lint/UnderscorePrefixedVariableName:
  Description: 'Do not use prefix `_` for a variable that is used.'
  Enabled: true
  VersionAdded: '0.21'

Lint/UnifiedInteger:
  Description: 'Use Integer instead of Fixnum or Bignum'
  Enabled: true
  VersionAdded: '0.43'

Lint/UnneededCopDisableDirective:
  Description: >-
                 Checks for rubocop:disable comments that can be removed.
                 Note: this cop is not disabled when disabling all cops.
                 It must be explicitly disabled.
  Enabled: true
  VersionAdded: '0.53'

Lint/UnneededCopEnableDirective:
  Description: Checks for rubocop:enable comments that can be removed.
  Enabled: true
  VersionAdded: '0.53'

Lint/UnneededRequireStatement:
  Description: 'Checks for unnecessary `require` statement.'
  Enabled: true
  VersionAdded: '0.51'

Lint/UnneededSplatExpansion:
  Description: 'Checks for splat unnecessarily being called on literals'
  Enabled: true
  VersionAdded: '0.43'

Lint/UnreachableCode:
  Description: 'Unreachable code.'
  Enabled: true
  VersionAdded: '0.9'

Lint/UnusedBlockArgument:
  Description: 'Checks for unused block arguments.'
  StyleGuide: '#underscore-unused-vars'
  Enabled: true
  VersionAdded: '0.21'
  VersionChanged: '0.22'
  IgnoreEmptyBlocks: true
  AllowUnusedKeywordArguments: false

Lint/UnusedMethodArgument:
  Description: 'Checks for unused method arguments.'
  StyleGuide: '#underscore-unused-vars'
  Enabled: true
  VersionAdded: '0.21'
  VersionChanged: '0.35'
  AllowUnusedKeywordArguments: false
  IgnoreEmptyMethods: true

Lint/UriEscapeUnescape:
  Description: >-
                 `URI.escape` method is obsolete and should not be used. Instead, use
                 `CGI.escape`, `URI.encode_www_form` or `URI.encode_www_form_component`
                 depending on your specific use case.
                 Also `URI.unescape` method is obsolete and should not be used. Instead, use
                 `CGI.unescape`, `URI.decode_www_form` or `URI.decode_www_form_component`
                 depending on your specific use case.
  Enabled: true
  VersionAdded: '0.50'

Lint/UriRegexp:
  Description: 'Use `URI::DEFAULT_PARSER.make_regexp` instead of `URI.regexp`.'
  Enabled: true
  VersionAdded: '0.50'

Lint/UselessAccessModifier:
  Description: 'Checks for useless access modifiers.'
  Enabled: true
  VersionAdded: '0.20'
  VersionChanged: '0.47'
  ContextCreatingMethods: []
  MethodCreatingMethods: []

Lint/UselessAssignment:
  Description: 'Checks for useless assignment to a local variable.'
  StyleGuide: '#underscore-unused-vars'
  Enabled: true
  VersionAdded: '0.11'

Lint/UselessComparison:
  Description: 'Checks for comparison of something with itself.'
  Enabled: true
  VersionAdded: '0.11'

Lint/UselessElseWithoutRescue:
  Description: 'Checks for useless `else` in `begin..end` without `rescue`.'
  Enabled: true
  VersionAdded: '0.17'

Lint/UselessSetterCall:
  Description: 'Checks for useless setter call to a local variable.'
  Enabled: true
  VersionAdded: '0.13'

Lint/Void:
  Description: 'Possible use of operator/literal/variable in void context.'
  Enabled: true
  VersionAdded: '0.9'
  CheckForMethodsWithNoSideEffects: false

#################### Metrics ###############################

Metrics/AbcSize:
  Description: >-
                 A calculated magnitude based on number of assignments,
                 branches, and conditions.
  Reference: 'http://c2.com/cgi/wiki?AbcMetric'
  Enabled: true
  VersionAdded: '0.27'
  # The ABC size is a calculated magnitude, so this number can be an Integer or
  # a Float.
  Max: 21

Metrics/BlockLength:
  Description: 'Avoid long blocks with many lines.'
  Enabled: false
  VersionAdded: '0.44'
  VersionChanged: '0.58'
  CountComments: false  # count full line comments?
  Max: 25
  ExcludedMethods:
    # By default, exclude the `#refine` method, as it tends to have larger
    # associated blocks.
    - refine

Metrics/BlockNesting:
  Description: 'Avoid excessive block nesting'
  StyleGuide: '#three-is-the-number-thou-shalt-count'
  Enabled: true
  VersionAdded: '0.25'
  VersionChanged: '0.47'
  CountBlocks: false
  Max: 3

Metrics/ClassLength:
  Description: 'Avoid classes longer than 100 lines of code.'
  Enabled: true
  VersionAdded: '0.25'
  CountComments: false  # count full line comments?
  Max: 100

# Avoid complex methods.
Metrics/CyclomaticComplexity:
  Description: >-
                 A complexity metric that is strongly correlated to the number
                 of test cases needed to validate a method.
  Enabled: true
  VersionAdded: '0.25'
  Max: 6

Metrics/LineLength:
  # Don't use length as documentation imported from TravisCI takes more space
  Description: 'Limit lines to 80 characters.'
  StyleGuide: '#80-character-limits'
  Enabled: false
  VersionAdded: '0.25'
  VersionChanged: '0.46'
  Max: 80
  # To make it possible to copy or click on URIs in the code, we allow lines
  # containing a URI to be longer than Max.
  AllowHeredoc: true
  AllowURI: true
  URISchemes:
    - http
    - https
  # The IgnoreCopDirectives option causes the LineLength rule to ignore cop
  # directives like '# rubocop: enable ...' when calculating a line's length.
  IgnoreCopDirectives: false
  # The IgnoredPatterns option is a list of !ruby/regexp and/or string
  # elements. Strings will be converted to Regexp objects. A line that matches
  # any regular expression listed in this option will be ignored by LineLength.
  IgnoredPatterns: []

Metrics/MethodLength:
  Description: 'Avoid methods longer than 10 lines of code.'
  StyleGuide: '#short-methods'
  Enabled: true
  VersionAdded: '0.25'
  VersionChanged: '0.59.2'
  CountComments: false  # count full line comments?
  Max: 10
  ExcludedMethods: []

Metrics/ModuleLength:
  Description: 'Avoid modules longer than 100 lines of code.'
  Enabled: true
  VersionAdded: '0.31'
  CountComments: false  # count full line comments?
  Max: 100

Metrics/ParameterLists:
  Description: 'Avoid parameter lists longer than three or four parameters.'
  StyleGuide: '#too-many-params'
  Enabled: true
  VersionAdded: '0.25'
  Max: 5
  CountKeywordArgs: true

Metrics/PerceivedComplexity:
  Description: >-
                 A complexity metric geared towards measuring complexity for a
                 human reader.
  Enabled: true
  VersionAdded: '0.25'
  Max: 7

#################### Naming ##############################

Naming/AccessorMethodName:
  Description: Check the naming of accessor methods for get_/set_.
  StyleGuide: '#accessor_mutator_method_names'
  Enabled: true
  VersionAdded: '0.50'

Naming/AsciiIdentifiers:
  Description: 'Use only ascii symbols in identifiers.'
  StyleGuide: '#english-identifiers'
  Enabled: true
  VersionAdded: '0.50'

Naming/BinaryOperatorParameterName:
  Description: 'When defining binary operators, name the argument other.'
  StyleGuide: '#other-arg'
  Enabled: true
  VersionAdded: '0.50'

Naming/ClassAndModuleCamelCase:
  Description: 'Use CamelCase for classes and modules.'
  StyleGuide: '#camelcase-classes'
  Enabled: true
  VersionAdded: '0.50'

Naming/ConstantName:
  Description: 'Constants should use SCREAMING_SNAKE_CASE.'
  StyleGuide: '#screaming-snake-case'
  Enabled: true
  VersionAdded: '0.50'

Naming/FileName:
  Description: 'Use snake_case for source file names.'
  StyleGuide: '#snake-case-files'
  Enabled: true
  VersionAdded: '0.50'
  # Camel case file names listed in `AllCops:Include` and all file names listed
  # in `AllCops:Exclude` are excluded by default. Add extra excludes here.
  Exclude: []
  # When `true`, requires that each source file should define a class or module
  # with a name which matches the file name (converted to ... case).
  # It further expects it to be nested inside modules which match the names
  # of subdirectories in its path.
  ExpectMatchingDefinition: false
  # If non-`nil`, expect all source file names to match the following regex.
  # Only the file name itself is matched, not the entire file path.
  # Use anchors as necessary if you want to match the entire name rather than
  # just a part of it.
  Regex: ~
  # With `IgnoreExecutableScripts` set to `true`, this cop does not
  # report offending filenames for executable scripts (i.e. source
  # files with a shebang in the first line).
  IgnoreExecutableScripts: true
  AllowedAcronyms:
    - CLI
    - DSL
    - ACL
    - API
    - ASCII
    - CPU
    - CSS
    - DNS
    - EOF
    - GUID
    - HTML
    - HTTP
    - HTTPS
    - ID
    - IP
    - JSON
    - LHS
    - QPS
    - RAM
    - RHS
    - RPC
    - SLA
    - SMTP
    - SQL
    - SSH
    - TCP
    - TLS
    - TTL
    - UDP
    - UI
    - UID
    - UUID
    - URI
    - URL
    - UTF8
    - VM
    - XML
    - XMPP
    - XSRF
    - XSS

Naming/HeredocDelimiterCase:
  Description: 'Use configured case for heredoc delimiters.'
  StyleGuide: '#heredoc-delimiters'
  Enabled: true
  VersionAdded: '0.50'
  EnforcedStyle: uppercase
  SupportedStyles:
    - lowercase
    - uppercase

Naming/HeredocDelimiterNaming:
  Description: 'Use descriptive heredoc delimiters.'
  StyleGuide: '#heredoc-delimiters'
  Enabled: true
  VersionAdded: '0.50'
  Blacklist:
    - !ruby/regexp '/(^|\s)(EO[A-Z]{1}|END)(\s|$)/'

Naming/MemoizedInstanceVariableName:
  Description: >-
    Memoized method name should match memo instance variable name.
  Enabled: true
  VersionAdded: '0.53'
  VersionChanged: '0.58'
  EnforcedStyleForLeadingUnderscores: disallowed
  SupportedStylesForLeadingUnderscores:
    - disallowed
    - required
    - optional

Naming/MethodName:
  Description: 'Use the configured style when naming methods.'
  StyleGuide: '#snake-case-symbols-methods-vars'
  Enabled: true
  VersionAdded: '0.50'
  EnforcedStyle: snake_case
  SupportedStyles:
    - snake_case
    - camelCase

Naming/PredicateName:
  Description: 'Check the names of predicate methods.'
  StyleGuide: '#bool-methods-qmark'
  Enabled: true
  VersionAdded: '0.50'
  VersionChanged: '0.51'
  # Predicate name prefixes.
  NamePrefix:
    - is_
    - has_
    - have_
  # Predicate name prefixes that should be removed.
  NamePrefixBlacklist:
    - is_
    - has_
    - have_
  # Predicate names which, despite having a blacklisted prefix, or no `?`,
  # should still be accepted
  NameWhitelist:
    - is_a?
  # Method definition macros for dynamically generated methods.
  MethodDefinitionMacros:
    - define_method
    - define_singleton_method
  # Exclude Rspec specs because there is a strong convention to write spec
  # helpers in the form of `have_something` or `be_something`.
  Exclude:
    - 'spec/**/*'

Naming/UncommunicativeBlockParamName:
  Description: >-
                Checks for block parameter names that contain capital letters,
                end in numbers, or do not meet a minimal length.
  Enabled: true
  VersionAdded: '0.53'
  # Parameter names may be equal to or greater than this value
  MinNameLength: 1
  AllowNamesEndingInNumbers: true
  # Whitelisted names that will not register an offense
  AllowedNames: []
  # Blacklisted names that will register an offense
  ForbiddenNames: []

Naming/UncommunicativeMethodParamName:
  Description: >-
                Checks for method parameter names that contain capital letters,
                end in numbers, or do not meet a minimal length.
  Enabled: true
  VersionAdded: '0.53'
  VersionChanged: '0.59'
  # Parameter names may be equal to or greater than this value
  MinNameLength: 3
  AllowNamesEndingInNumbers: true
  # Whitelisted names that will not register an offense
  AllowedNames:
    - io
    - id
    - to
    - by
    - 'on'
    - in
    - at
    - ip
    - db
  # Blacklisted names that will register an offense
  ForbiddenNames: []


Naming/VariableName:
  Description: 'Use the configured style when naming variables.'
  StyleGuide: '#snake-case-symbols-methods-vars'
  Enabled: true
  VersionAdded: '0.50'
  EnforcedStyle: snake_case
  SupportedStyles:
    - snake_case
    - camelCase

Naming/VariableNumber:
  Description: 'Use the configured style when numbering variables.'
  Enabled: true
  VersionAdded: '0.50'
  EnforcedStyle: normalcase
  SupportedStyles:
    - snake_case
    - normalcase
    - non_integer

#################### Performance ###########################

Performance/Caller:
  Description: >-
             Use `caller(n..n)` instead of `caller`.
  Enabled: true
  VersionAdded: '0.49'

Performance/CaseWhenSplat:
  Description: >-
                 Reordering `when` conditions with a splat to the end
                 of the `when` branches can improve performance.
  Enabled: false
  AutoCorrect: false
  SafeAutoCorrect: false
  VersionAdded: '0.34'
  VersionChanged: '0.59'

Performance/Casecmp:
  Description: >-
             Use `casecmp` rather than `downcase ==`, `upcase ==`, `== downcase`, or `== upcase`..
  Reference: 'https://github.com/JuanitoFatas/fast-ruby#stringcasecmp-vs-stringdowncase---code'
  Enabled: true
  VersionAdded: '0.36'

Performance/ChainArrayAllocation:
  Description: >-
                  Instead of chaining array methods that allocate new arrays, mutate an
                  existing array.
  Reference: 'https://twitter.com/schneems/status/1034123879978029057'
  Enabled: false
  VersionAdded: '0.59'

Performance/CompareWithBlock:
  Description: 'Use `sort_by(&:foo)` instead of `sort { |a, b| a.foo <=> b.foo }`.'
  Enabled: true
  VersionAdded: '0.46'

Performance/Count:
  Description: >-
                  Use `count` instead of `select...size`, `reject...size`,
                  `select...count`, `reject...count`, `select...length`,
                  and `reject...length`.
  # This cop has known compatibility issues with `ActiveRecord` and other
  # frameworks. ActiveRecord's `count` ignores the block that is passed to it.
  # For more information, see the documentation in the cop itself.
  # If you understand the known risk, you can disable `SafeMode`.
  SafeMode: true
  Enabled: true
  VersionAdded: '0.31'
  VersionChanged: '0.39'

Performance/Detect:
  Description: >-
                  Use `detect` instead of `select.first`, `find_all.first`,
                  `select.last`, and `find_all.last`.
  Reference: 'https://github.com/JuanitoFatas/fast-ruby#enumerabledetect-vs-enumerableselectfirst-code'
  # This cop has known compatibility issues with `ActiveRecord` and other
  # frameworks. `ActiveRecord` does not implement a `detect` method and `find`
  # has its own meaning. Correcting `ActiveRecord` methods with this cop
  # should be considered unsafe.
  SafeMode: true
  Enabled: true
  VersionAdded: '0.30'
  VersionChanged: '0.39'

Performance/DoubleStartEndWith:
  Description: >-
                  Use `str.{start,end}_with?(x, ..., y, ...)`
                  instead of `str.{start,end}_with?(x, ...) || str.{start,end}_with?(y, ...)`.
  Enabled: true
  VersionAdded: '0.36'
  VersionChanged: '0.48'
  # Used to check for `starts_with?` and `ends_with?`.
  # These methods are defined by `ActiveSupport`.
  IncludeActiveSupportAliases: false

Performance/EndWith:
  Description: 'Use `end_with?` instead of a regex match anchored to the end of a string.'
  Reference: 'https://github.com/JuanitoFatas/fast-ruby#stringmatch-vs-stringstart_withstringend_with-code-start-code-end'
  # This will change to a new method call which isn't guaranteed to be on the
  # object. Switching these methods has to be done with knowledge of the types
  # of the variables which rubocop doesn't have.
  SafeAutoCorrect: false
  AutoCorrect: false
  Enabled: true
  VersionAdded: '0.36'
  VersionChanged: '0.44'

Performance/FixedSize:
  Description: 'Do not compute the size of statically sized objects except in constants'
  Enabled: true
  VersionAdded: '0.35'

Performance/FlatMap:
  Description: >-
                  Use `Enumerable#flat_map`
                  instead of `Enumerable#map...Array#flatten(1)`
                  or `Enumberable#collect..Array#flatten(1)`
  Reference: 'https://github.com/JuanitoFatas/fast-ruby#enumerablemaparrayflatten-vs-enumerableflat_map-code'
  Enabled: true
  VersionAdded: '0.30'
  EnabledForFlattenWithoutParams: false
  # If enabled, this cop will warn about usages of
  # `flatten` being called without any parameters.
  # This can be dangerous since `flat_map` will only flatten 1 level, and
  # `flatten` without any parameters can flatten multiple levels.

Performance/InefficientHashSearch:
  Description: 'Use `key?` or `value?` instead of `keys.include?` or `values.include?`'
  Reference: 'https://github.com/JuanitoFatas/fast-ruby#hashkey-instead-of-hashkeysinclude-code'
  Enabled: true
  VersionAdded: '0.56'
  Safe: false

Performance/LstripRstrip:
  Description: 'Use `strip` instead of `lstrip.rstrip`.'
  Enabled: true
  VersionAdded: '0.36'

Performance/OpenStruct:
  Description: 'Use `Struct` instead of `OpenStruct`.'
  Enabled: false
  VersionAdded: '0.61'
  Safe: false

Performance/RangeInclude:
  Description: 'Use `Range#cover?` instead of `Range#include?`.'
  Reference: 'https://github.com/JuanitoFatas/fast-ruby#cover-vs-include-code'
  Enabled: true
  VersionAdded: '0.36'

Performance/RedundantBlockCall:
  Description: 'Use `yield` instead of `block.call`.'
  Reference: 'https://github.com/JuanitoFatas/fast-ruby#proccall-and-block-arguments-vs-yieldcode'
  Enabled: true
  VersionAdded: '0.36'

Performance/RedundantMatch:
  Description: >-
                  Use `=~` instead of `String#match` or `Regexp#match` in a context where the
                  returned `MatchData` is not needed.
  Enabled: true
  VersionAdded: '0.36'

Performance/RedundantMerge:
  Description: 'Use Hash#[]=, rather than Hash#merge! with a single key-value pair.'
  Reference: 'https://github.com/JuanitoFatas/fast-ruby#hashmerge-vs-hash-code'
  Enabled: true
  VersionAdded: '0.36'
  # Max number of key-value pairs to consider an offense
  MaxKeyValuePairs: 2

Performance/RedundantSortBy:
  Description: 'Use `sort` instead of `sort_by { |x| x }`.'
  Enabled: true
  VersionAdded: '0.36'

Performance/RegexpMatch:
  Description: >-
                  Use `match?` instead of `Regexp#match`, `String#match`, `Symbol#match`,
                  `Regexp#===`, or `=~` when `MatchData` is not used.
  Reference: 'https://github.com/JuanitoFatas/fast-ruby#regexp-vs-stringmatch-vs-string-vs-stringmatch-code-'
  Enabled: true
  VersionAdded: '0.47'

Performance/ReverseEach:
  Description: 'Use `reverse_each` instead of `reverse.each`.'
  Reference: 'https://github.com/JuanitoFatas/fast-ruby#enumerablereverseeach-vs-enumerablereverse_each-code'
  Enabled: true
  VersionAdded: '0.30'

Performance/Sample:
  Description: >-
                  Use `sample` instead of `shuffle.first`,
                  `shuffle.last`, and `shuffle[Integer]`.
  Reference: 'https://github.com/JuanitoFatas/fast-ruby#arrayshufflefirst-vs-arraysample-code'
  Enabled: true
  VersionAdded: '0.30'

Performance/Size:
  Description: >-
                  Use `size` instead of `count` for counting
                  the number of elements in `Array` and `Hash`.
  Reference: 'https://github.com/JuanitoFatas/fast-ruby#arraylength-vs-arraysize-vs-arraycount-code'
  Enabled: true
  VersionAdded: '0.30'

Performance/StartWith:
  Description: 'Use `start_with?` instead of a regex match anchored to the beginning of a string.'
  Reference: 'https://github.com/JuanitoFatas/fast-ruby#stringmatch-vs-stringstart_withstringend_with-code-start-code-end'
  # This will change to a new method call which isn't guaranteed to be on the
  # object. Switching these methods has to be done with knowledge of the types
  # of the variables which rubocop doesn't have.
  SafeAutoCorrect: false
  AutoCorrect: false
  Enabled: true
  VersionAdded: '0.36'
  VersionChanged: '0.44'

Performance/StringReplacement:
  Description: >-
                  Use `tr` instead of `gsub` when you are replacing the same
                  number of characters. Use `delete` instead of `gsub` when
                  you are deleting characters.
  Reference: 'https://github.com/JuanitoFatas/fast-ruby#stringgsub-vs-stringtr-code'
  Enabled: true
  VersionAdded: '0.33'

Performance/TimesMap:
  Description: 'Checks for .times.map calls.'
  AutoCorrect: false
  Enabled: true
  VersionAdded: '0.36'
  VersionChanged: '0.50'
  SafeAutoCorrect: false # see https://github.com/rubocop-hq/rubocop/issues/4658

Performance/UnfreezeString:
  Description: 'Use unary plus to get an unfrozen string literal.'
  Enabled: true
  VersionAdded: '0.50'

Performance/UnneededSort:
  Description: >-
                  Use `min` instead of `sort.first`,
                  `max_by` instead of `sort_by...last`, etc.
  Enabled: true
  VersionAdded: '0.55'

Performance/UriDefaultParser:
  Description: 'Use `URI::DEFAULT_PARSER` instead of `URI::Parser.new`.'
  Enabled: true
  VersionAdded: '0.50'

#################### Style ###############################

Style/AccessModifierDeclarations:
  Description: 'Checks style of how access modifiers are used.'
  Enabled: false
  VersionAdded: '0.57'
  EnforcedStyle: group
  SupportedStyles:
    - inline
    - group

Style/Alias:
  Description: 'Use alias instead of alias_method.'
  StyleGuide: '#alias-method'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.36'
  EnforcedStyle: prefer_alias
  SupportedStyles:
    - prefer_alias
    - prefer_alias_method

Style/AndOr:
  Description: 'Use &&/|| instead of and/or.'
  StyleGuide: '#no-and-or-or'
  Enabled: false
  VersionAdded: '0.9'
  VersionChanged: '0.25'
  # Whether `and` and `or` are banned only in conditionals (conditionals)
  # or completely (always).
  EnforcedStyle: always
  SupportedStyles:
    - always
    - conditionals

Style/ArrayJoin:
  Description: 'Use Array#join instead of Array#*.'
  StyleGuide: '#array-join'
  Enabled: true
  VersionAdded: '0.20'
  VersionChanged: '0.31'

Style/AsciiComments:
  Description: 'Use only ascii symbols in comments.'
  StyleGuide: '#english-comments'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.52'
  AllowedChars: []

Style/Attr:
  Description: 'Checks for uses of Module#attr.'
  StyleGuide: '#attr'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.12'

Style/AutoResourceCleanup:
  Description: 'Suggests the usage of an auto resource cleanup version of a method (if available).'
  Enabled: false
  VersionAdded: '0.30'

Style/BarePercentLiterals:
  Description: 'Checks if usage of %() or %Q() matches configuration.'
  StyleGuide: '#percent-q-shorthand'
  Enabled: true
  VersionAdded: '0.25'
  EnforcedStyle: bare_percent
  SupportedStyles:
    - percent_q
    - bare_percent

Style/BeginBlock:
  Description: 'Avoid the use of BEGIN blocks.'
  StyleGuide: '#no-BEGIN-blocks'
  Enabled: true
  VersionAdded: '0.9'

Style/BlockComments:
  Description: 'Do not use block comments.'
  StyleGuide: '#no-block-comments'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.23'

Style/BlockDelimiters:
  Description: >-
                Avoid using {...} for multi-line blocks (multiline chaining is
                always ugly).
                Prefer {...} over do...end for single-line blocks.
  StyleGuide: '#single-line-blocks'
  Enabled: true
  VersionAdded: '0.30'
  VersionChanged: '0.35'
  EnforcedStyle: line_count_based
  SupportedStyles:
    # The `line_count_based` style enforces braces around single line blocks and
    # do..end around multi-line blocks.
    - line_count_based
    # The `semantic` style enforces braces around functional blocks, where the
    # primary purpose of the block is to return a value and do..end for
    # procedural blocks, where the primary purpose of the block is its
    # side-effects.
    #
    # This looks at the usage of a block's method to determine its type (e.g. is
    # the result of a `map` assigned to a variable or passed to another
    # method) but exceptions are permitted in the `ProceduralMethods`,
    # `FunctionalMethods` and `IgnoredMethods` sections below.
    - semantic
    # The `braces_for_chaining` style enforces braces around single line blocks
    # and do..end around multi-line blocks, except for multi-line blocks whose
    # return value is being chained with another method (in which case braces
    # are enforced).
    - braces_for_chaining
  ProceduralMethods:
    # Methods that are known to be procedural in nature but look functional from
    # their usage, e.g.
    #
    #   time = Benchmark.realtime do
    #     foo.bar
    #   end
    #
    # Here, the return value of the block is discarded but the return value of
    # `Benchmark.realtime` is used.
    - benchmark
    - bm
    - bmbm
    - create
    - each_with_object
    - measure
    - new
    - realtime
    - tap
    - with_object
  FunctionalMethods:
    # Methods that are known to be functional in nature but look procedural from
    # their usage, e.g.
    #
    #   let(:foo) { Foo.new }
    #
    # Here, the return value of `Foo.new` is used to define a `foo` helper but
    # doesn't appear to be used from the return value of `let`.
    - let
    - let!
    - subject
    - watch
  IgnoredMethods:
    # Methods that can be either procedural or functional and cannot be
    # categorised from their usage alone, e.g.
    #
    #   foo = lambda do |x|
    #     puts "Hello, #{x}"
    #   end
    #
    #   foo = lambda do |x|
    #     x * 100
    #   end
    #
    # Here, it is impossible to tell from the return value of `lambda` whether
    # the inner block's return value is significant.
    - lambda
    - proc
    - it

Style/BracesAroundHashParameters:
  Description: 'Enforce braces style around hash parameters.'
  Enabled: true
  VersionAdded: '0.14.1'
  VersionChanged: '0.28'
  EnforcedStyle: no_braces
  SupportedStyles:
    # The `braces` style enforces braces around all method parameters that are
    # hashes.
    - braces
    # The `no_braces` style checks that the last parameter doesn't have braces
    # around it.
    - no_braces
    # The `context_dependent` style checks that the last parameter doesn't have
    # braces around it, but requires braces if the second to last parameter is
    # also a hash literal.
    - context_dependent

Style/CaseEquality:
  Description: 'Avoid explicit use of the case equality operator(===).'
  StyleGuide: '#no-case-equality'
  Enabled: true
  VersionAdded: '0.9'

Style/CharacterLiteral:
  Description: 'Checks for uses of character literals.'
  StyleGuide: '#no-character-literals'
  Enabled: true
  VersionAdded: '0.9'

Style/ClassAndModuleChildren:
  Description: 'Checks style of children classes and modules.'
  StyleGuide: '#namespace-definition'
  # Moving from compact to nested children requires knowledge of whether the
  # outer parent is a module or a class. Moving from nested to compact requires
  # verification that the outer parent is defined elsewhere. Rubocop does not
  # have the knowledge to perform either operation safely and thus requires
  # manual oversight.
  SafeAutoCorrect: false
  AutoCorrect: false
  Enabled: true
  VersionAdded: '0.19'
  #
  # Basically there are two different styles:
  #
  # `nested` - have each child on a separate line
  #   class Foo
  #     class Bar
  #     end
  #   end
  #
  # `compact` - combine definitions as much as possible
  #   class Foo::Bar
  #   end
  #
  # The compact style is only forced, for classes or modules with one child.
  EnforcedStyle: nested
  SupportedStyles:
    - nested
    - compact

Style/ClassCheck:
  Description: 'Enforces consistent use of `Object#is_a?` or `Object#kind_of?`.'
  Enabled: true
  VersionAdded: '0.24'
  EnforcedStyle: is_a?
  SupportedStyles:
    - is_a?
    - kind_of?

Style/ClassMethods:
  Description: 'Use self when defining module/class methods.'
  StyleGuide: '#def-self-class-methods'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.20'

Style/ClassVars:
  Description: 'Avoid the use of class variables.'
  StyleGuide: '#no-class-vars'
  Enabled: true
  VersionAdded: '0.13'

# Align with the style guide.
Style/CollectionMethods:
  Description: 'Preferred collection methods.'
  StyleGuide: '#map-find-select-reduce-size'
  Enabled: false
  VersionAdded: '0.9'
  VersionChanged: '0.27'
  Safe: false
  # Mapping from undesired method to desired method
  # e.g. to use `detect` over `find`:
  #
  # Style/CollectionMethods:
  #   PreferredMethods:
  #     find: detect
  PreferredMethods:
    collect: 'map'
    collect!: 'map!'
    inject: 'reduce'
    detect: 'find'
    find_all: 'select'

Style/ColonMethodCall:
  Description: 'Do not use :: for method call.'
  StyleGuide: '#double-colons'
  Enabled: true
  VersionAdded: '0.9'

Style/ColonMethodDefinition:
  Description: 'Do not use :: for defining class methods.'
  StyleGuide: '#colon-method-definition'
  Enabled: true
  VersionAdded: '0.52'

Style/CommandLiteral:
  Description: 'Use `` or %x around command literals.'
  StyleGuide: '#percent-x'
  Enabled: true
  VersionAdded: '0.30'
  EnforcedStyle: backticks
  # backticks: Always use backticks.
  # percent_x: Always use `%x`.
  # mixed: Use backticks on single-line commands, and `%x` on multi-line commands.
  SupportedStyles:
    - backticks
    - percent_x
    - mixed
  # If `false`, the cop will always recommend using `%x` if one or more backticks
  # are found in the command string.
  AllowInnerBackticks: false

# Checks formatting of special comments
Style/CommentAnnotation:
  Description: >-
                 Checks formatting of special comments
                 (TODO, FIXME, OPTIMIZE, HACK, REVIEW).
  StyleGuide: '#annotate-keywords'
  Enabled: true
  VersionAdded: '0.10'
  VersionChanged: '0.31'
  Keywords:
    - TODO
    - FIXME
    - OPTIMIZE
    - HACK
    - REVIEW

Style/CommentedKeyword:
  Description: 'Do not place comments on the same line as certain keywords.'
  Enabled: true
  VersionAdded: '0.51'

Style/ConditionalAssignment:
  Description: >-
                 Use the return value of `if` and `case` statements for
                 assignment to a variable and variable comparison instead
                 of assigning that variable inside of each branch.
  Enabled: true
  VersionAdded: '0.36'
  VersionChanged: '0.47'
  EnforcedStyle: assign_to_condition
  SupportedStyles:
    - assign_to_condition
    - assign_inside_condition
  # When configured to `assign_to_condition`, `SingleLineConditionsOnly`
  # will only register an offense when all branches of a condition are
  # a single line.
  # When configured to `assign_inside_condition`, `SingleLineConditionsOnly`
  # will only register an offense for assignment to a condition that has
  # at least one multiline branch.
  SingleLineConditionsOnly: true
  IncludeTernaryExpressions: true

# Checks that you have put a copyright in a comment before any code.
#
# You can override the default Notice in your .rubocop.yml file.
#
# In order to use autocorrect, you must supply a value for the
# `AutocorrectNotice` key that matches the regexp Notice. A blank
# `AutocorrectNotice` will cause an error during autocorrect.
#
# Autocorrect will add a copyright notice in a comment at the top
# of the file immediately after any shebang or encoding comments.
#
# Example rubocop.yml:
#
# Style/Copyright:
#   Enabled: true
#   Notice: 'Copyright (\(c\) )?2015 Yahoo! Inc'
#   AutocorrectNotice: '# Copyright (c) 2015 Yahoo! Inc.'
#
Style/Copyright:
  Description: 'Include a copyright notice in each file before any code.'
  Enabled: false
  VersionAdded: '0.30'
  Notice: '^Copyright (\(c\) )?2[0-9]{3} .+'
  AutocorrectNotice: ''

Style/DateTime:
  Description: 'Use Time over DateTime.'
  StyleGuide: '#date--time'
  Enabled: false
  VersionAdded: '0.51'
  VersionChanged: '0.59'
  AllowCoercion: false

Style/DefWithParentheses:
  Description: 'Use def with parentheses when there are arguments.'
  StyleGuide: '#method-parens'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.12'

Style/Dir:
  Description: >-
                 Use the `__dir__` method to retrieve the canonicalized
                 absolute path to the current file.
  Enabled: true
  VersionAdded: '0.50'

Style/Documentation:
  Description: 'Document classes and non-namespace modules.'
  Enabled: false
  VersionAdded: '0.9'
  Exclude:
    - 'spec/**/*'
    - 'test/**/*'

Style/DocumentationMethod:
  Description: 'Checks for missing documentation comment for public methods.'
  Enabled: false
  VersionAdded: '0.43'
  Exclude:
    - 'spec/**/*'
    - 'test/**/*'
  RequireForNonPublicMethods: false

Style/DoubleNegation:
  Description: 'Checks for uses of double negation (!!).'
  StyleGuide: '#no-bang-bang'
  Enabled: true
  VersionAdded: '0.19'

Style/EachForSimpleLoop:
  Description: >-
                 Use `Integer#times` for a simple loop which iterates a fixed
                 number of times.
  Enabled: true
  VersionAdded: '0.41'

Style/EachWithObject:
  Description: 'Prefer `each_with_object` over `inject` or `reduce`.'
  Enabled: true
  VersionAdded: '0.22'
  VersionChanged: '0.42'

Style/EmptyBlockParameter:
  Description: 'Omit pipes for empty block parameters.'
  Enabled: true
  VersionAdded: '0.52'

Style/EmptyCaseCondition:
  Description: 'Avoid empty condition in case statements.'
  Enabled: true
  VersionAdded: '0.40'

Style/EmptyElse:
  Description: 'Avoid empty else-clauses.'
  Enabled: true
  VersionAdded: '0.28'
  VersionChanged: '0.32'
  EnforcedStyle: both
  # empty - warn only on empty `else`
  # nil - warn on `else` with nil in it
  # both - warn on empty `else` and `else` with `nil` in it
  SupportedStyles:
    - empty
    - nil
    - both

Style/EmptyLambdaParameter:
  Description: 'Omit parens for empty lambda parameters.'
  Enabled: true
  VersionAdded: '0.52'

Style/EmptyLiteral:
  Description: 'Prefer literals to Array.new/Hash.new/String.new.'
  StyleGuide: '#literal-array-hash'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.12'

Style/EmptyMethod:
  Description: 'Checks the formatting of empty method definitions.'
  StyleGuide: '#no-single-line-methods'
  Enabled: true
  VersionAdded: '0.46'
  EnforcedStyle: compact
  SupportedStyles:
    - compact
    - expanded

Style/Encoding:
  Description: 'Use UTF-8 as the source file encoding.'
  StyleGuide: '#utf-8'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.50'

Style/EndBlock:
  Description: 'Avoid the use of END blocks.'
  StyleGuide: '#no-END-blocks'
  Enabled: true
  VersionAdded: '0.9'

Style/EvalWithLocation:
  Description: 'Pass `__FILE__` and `__LINE__` to `eval` method, as they are used by backtraces.'
  Enabled: true
  VersionAdded: '0.52'

Style/EvenOdd:
  Description: 'Favor the use of Integer#even? && Integer#odd?'
  StyleGuide: '#predicate-methods'
  Enabled: true
  VersionAdded: '0.12'
  VersionChanged: '0.29'

Style/ExpandPathArguments:
  Description: "Use `expand_path(__dir__)` instead of `expand_path('..', __FILE__)`."
  Enabled: true
  VersionAdded: '0.53'

Lint/FlipFlop:
  Description: 'Checks for flip-flops'
  StyleGuide: '#no-flip-flops'
  Enabled: true
  VersionAdded: '0.16'

Style/For:
  Description: 'Checks use of for or each in multiline loops.'
  StyleGuide: '#no-for-loops'
  Enabled: true
  VersionAdded: '0.13'
  VersionChanged: '0.59'
  EnforcedStyle: each
  SupportedStyles:
    - each
    - for

Style/FormatString:
  Description: 'Enforce the use of Kernel#sprintf, Kernel#format or String#%.'
  StyleGuide: '#sprintf'
  Enabled: true
  VersionAdded: '0.19'
  VersionChanged: '0.49'
  EnforcedStyle: format
  SupportedStyles:
    - format
    - sprintf
    - percent

Style/FormatStringToken:
  Description: 'Use a consistent style for format string tokens.'
  Enabled: true
  EnforcedStyle: annotated
  SupportedStyles:
    # Prefer tokens which contain a sprintf like type annotation like
    # `%<name>s`, `%<age>d`, `%<score>f`
    - annotated
    # Prefer simple looking "template" style tokens like `%{name}`, `%{age}`
    - template
    - unannotated
  VersionAdded: '0.49'
  VersionChanged: '0.52'

Style/FrozenStringLiteralComment:
  Description: >-
                 Add the frozen_string_literal comment to the top of files
                 to help transition from Ruby 2.3.0 to Ruby 3.0.
  Enabled: true
  VersionAdded: '0.36'
  VersionChanged: '0.47'
  EnforcedStyle: when_needed
  SupportedStyles:
    # `when_needed` will add the frozen string literal comment to files
    # only when the `TargetRubyVersion` is set to 2.3+.
    - when_needed
    # `always` will always add the frozen string literal comment to a file
    # regardless of the Ruby version or if `freeze` or `<<` are called on a
    # string literal. If you run code against multiple versions of Ruby, it is
    # possible that this will create errors in Ruby 2.3.0+.
    - always
    # `never` will enforce that the frozen string literal comment does not
    # exist in a file.
    - never

Style/GlobalVars:
  Description: 'Do not introduce global variables.'
  StyleGuide: '#instance-vars'
  Reference: 'https://www.zenspider.com/ruby/quickref.html'
  Enabled: true
  VersionAdded: '0.13'
  # Built-in global variables are allowed by default.
  AllowedVariables: []

Style/GuardClause:
  Description: 'Check for conditionals that can be replaced with guard clauses'
  StyleGuide: '#no-nested-conditionals'
  Enabled: true
  VersionAdded: '0.20'
  VersionChanged: '0.22'
  # `MinBodyLength` defines the number of lines of the a body of an `if` or `unless`
  # needs to have to trigger this cop
  MinBodyLength: 1

Style/HashSyntax:
  Description: >-
                 Prefer Ruby 1.9 hash syntax { a: 1, b: 2 } over 1.8 syntax
                 { :a => 1, :b => 2 }.
  StyleGuide: '#hash-literals'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.43'
  EnforcedStyle: ruby19
  SupportedStyles:
    # checks for 1.9 syntax (e.g. {a: 1}) for all symbol keys
    - ruby19
    # checks for hash rocket syntax for all hashes
    - hash_rockets
    # forbids mixed key syntaxes (e.g. {a: 1, :b => 2})
    - no_mixed_keys
    # enforces both ruby19 and no_mixed_keys styles
    - ruby19_no_mixed_keys
  # Force hashes that have a symbol value to use hash rockets
  UseHashRocketsWithSymbolValues: false
  # Do not suggest { a?: 1 } over { :a? => 1 } in ruby19 style
  PreferHashRocketsForNonAlnumEndingSymbols: false

Style/IdenticalConditionalBranches:
  Description: >-
                 Checks that conditional statements do not have an identical
                 line at the end of each branch, which can validly be moved
                 out of the conditional.
  Enabled: true
  VersionAdded: '0.36'

Style/IfInsideElse:
  Description: 'Finds if nodes inside else, which can be converted to elsif.'
  Enabled: true
  VersionAdded: '0.36'

Style/IfUnlessModifier:
  Description: >-
                 Favor modifier if/unless usage when you have a
                 single-line body.
  StyleGuide: '#if-as-a-modifier'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.30'

Style/IfUnlessModifierOfIfUnless:
  Description: >-
                 Avoid modifier if/unless usage on conditionals.
  Enabled: true
  VersionAdded: '0.39'

Style/IfWithSemicolon:
  Description: 'Do not use if x; .... Use the ternary operator instead.'
  StyleGuide: '#no-semicolon-ifs'
  Enabled: true
  VersionAdded: '0.9'

Style/ImplicitRuntimeError:
  Description: >-
                 Use `raise` or `fail` with an explicit exception class and
                 message, rather than just a message.
  Enabled: false
  VersionAdded: '0.41'

Style/InfiniteLoop:
  Description: 'Use Kernel#loop for infinite loops.'
  StyleGuide: '#infinite-loop'
  Enabled: true
  VersionAdded: '0.26'
  VersionChanged: '0.61'
  SafeAutoCorrect: true

Style/InlineComment:
  Description: 'Avoid trailing inline comments.'
  Enabled: false
  VersionAdded: '0.23'

Style/InverseMethods:
  Description: >-
                 Use the inverse method instead of `!.method`
                 if an inverse method is defined.
  Enabled: true
  Safe: false
  VersionAdded: '0.48'
  # `InverseMethods` are methods that can be inverted by a not (`not` or `!`)
  # The relationship of inverse methods only needs to be defined in one direction.
  # Keys and values both need to be defined as symbols.
  InverseMethods:
    :any?: :none?
    :even?: :odd?
    :==: :!=
    :=~: :!~
    :<: :>=
    :>: :<=
    # `ActiveSupport` defines some common inverse methods. They are listed below,
    # and not enabled by default.
    #:present?: :blank?,
    #:include?: :exclude?
  # `InverseBlocks` are methods that are inverted by inverting the return
  # of the block that is passed to the method
  InverseBlocks:
    :select: :reject
    :select!: :reject!

Style/IpAddresses:
  Description: "Don't include literal IP addresses in code."
  Enabled: false
  VersionAdded: '0.58'
  # Allow strings to be whitelisted
  Whitelist:
    - "::"
    # :: is a valid IPv6 address, but could potentially be legitimately in code

Style/Lambda:
  Description: 'Use the new lambda literal syntax for single-line blocks.'
  StyleGuide: '#lambda-multi-line'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.40'
  EnforcedStyle: line_count_dependent
  SupportedStyles:
    - line_count_dependent
    - lambda
    - literal

Style/LambdaCall:
  Description: 'Use lambda.call(...) instead of lambda.(...).'
  StyleGuide: '#proc-call'
  Enabled: true
  VersionAdded: '0.13.1'
  VersionChanged: '0.14'
  EnforcedStyle: call
  SupportedStyles:
    - call
    - braces

Style/LineEndConcatenation:
  Description: >-
                 Use \ instead of + or << to concatenate two string literals at
                 line end.
  Enabled: true
  VersionAdded: '0.18'

Style/MethodCallWithArgsParentheses:
  Description: 'Use parentheses for method calls with arguments.'
  StyleGuide: '#method-invocation-parens'
  Enabled: false
  VersionAdded: '0.47'
  VersionChanged: '0.61'
  IgnoreMacros: true
  IgnoredMethods: []
  AllowParenthesesInMultilineCall: false
  AllowParenthesesInChaining: false
  EnforcedStyle: require_parentheses
  SupportedStyles:
    - require_parentheses
    - omit_parentheses

Style/MethodCallWithoutArgsParentheses:
  Description: 'Do not use parentheses for method calls with no arguments.'
  StyleGuide: '#method-invocation-parens'
  Enabled: true
  IgnoredMethods: []
  VersionAdded: '0.47'
  VersionChanged: '0.55'

Style/MethodCalledOnDoEndBlock:
  Description: 'Avoid chaining a method call on a do...end block.'
  StyleGuide: '#single-line-blocks'
  Enabled: false
  VersionAdded: '0.14'

Style/MethodDefParentheses:
  Description: >-
                 Checks if the method definitions have or don't have
                 parentheses.
  StyleGuide: '#method-parens'
  Enabled: true
  VersionAdded: '0.16'
  VersionChanged: '0.35'
  EnforcedStyle: require_parentheses
  SupportedStyles:
    - require_parentheses
    - require_no_parentheses
    - require_no_parentheses_except_multiline

Style/MethodMissingSuper:
  Description: Checks for `method_missing` to call `super`.
  StyleGuide: '#no-method-missing'
  Enabled: true
  VersionAdded: '0.56'

Style/MinMax:
  Description: >-
                 Use `Enumerable#minmax` instead of `Enumerable#min`
                 and `Enumerable#max` in conjunction.'
  Enabled: true
  VersionAdded: '0.50'

Style/MissingElse:
  Description: >-
                Require if/case expressions to have an else branches.
                If enabled, it is recommended that
                Style/UnlessElse and Style/EmptyElse be enabled.
                This will conflict with Style/EmptyElse if
                Style/EmptyElse is configured to style "both"
  Enabled: false
  VersionAdded: '0.30'
  VersionChanged: '0.38'
  EnforcedStyle: both
  SupportedStyles:
    # if - warn when an if expression is missing an else branch
    # case - warn when a case expression is missing an else branch
    # both - warn when an if or case expression is missing an else branch
    - if
    - case
    - both

Style/MissingRespondToMissing:
  Description: >-
                  Checks if `method_missing` is implemented
                  without implementing `respond_to_missing`.
  StyleGuide: '#no-method-missing'
  Enabled: true
  VersionAdded: '0.56'

Style/MixinGrouping:
  Description: 'Checks for grouping of mixins in `class` and `module` bodies.'
  StyleGuide: '#mixin-grouping'
  Enabled: true
  VersionAdded: '0.48'
  VersionChanged: '0.49'
  EnforcedStyle: separated
  SupportedStyles:
    # separated: each mixed in module goes in a separate statement.
    # grouped: mixed in modules are grouped into a single statement.
    - separated
    - grouped

Style/MixinUsage:
  Description: 'Checks that `include`, `extend` and `prepend` exists at the top level.'
  Enabled: true
  VersionAdded: '0.51'

Style/ModuleFunction:
  Description: 'Checks for usage of `extend self` in modules.'
  StyleGuide: '#module-function'
  Enabled: true
  VersionAdded: '0.11'
  VersionChanged: '0.53'
  EnforcedStyle: module_function
  SupportedStyles:
    - module_function
    - extend_self

Style/MultilineBlockChain:
  Description: 'Avoid multi-line chains of blocks.'
  StyleGuide: '#single-line-blocks'
  Enabled: true
  VersionAdded: '0.13'

Style/MultilineIfModifier:
  Description: 'Only use if/unless modifiers on single line statements.'
  StyleGuide: '#no-multiline-if-modifiers'
  Enabled: true
  VersionAdded: '0.45'

Style/MultilineIfThen:
  Description: 'Do not use then for multi-line if/unless.'
  StyleGuide: '#no-then'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.26'

Style/MultilineMemoization:
  Description: 'Wrap multiline memoizations in a `begin` and `end` block.'
  Enabled: true
  VersionAdded: '0.44'
  VersionChanged: '0.48'
  EnforcedStyle: keyword
  SupportedStyles:
    - keyword
    - braces

Style/MultilineMethodSignature:
  Description: 'Avoid multi-line method signatures.'
  Enabled: false
  VersionAdded: '0.59'

Style/MultilineTernaryOperator:
  Description: >-
                 Avoid multi-line ?: (the ternary operator);
                 use if/unless instead.
  StyleGuide: '#no-multiline-ternary'
  Enabled: true
  VersionAdded: '0.9'

Style/MultipleComparison:
  Description: >-
                 Avoid comparing a variable with multiple items in a conditional,
                 use Array#include? instead.
  Enabled: true
  VersionAdded: '0.49'

Style/MutableConstant:
  Description: 'Do not assign mutable objects to constants.'
  Enabled: true
  VersionAdded: '0.34'

Style/NegatedIf:
  Description: >-
                 Favor unless over if for negative conditions
                 (or control flow or).
  StyleGuide: '#unless-for-negatives'
  Enabled: true
  VersionAdded: '0.20'
  VersionChanged: '0.48'
  EnforcedStyle: both
  SupportedStyles:
    # both: prefix and postfix negated `if` should both use `unless`
    # prefix: only use `unless` for negated `if` statements positioned before the body of the statement
    # postfix: only use `unless` for negated `if` statements positioned after the body of the statement
    - both
    - prefix
    - postfix

Style/NegatedWhile:
  Description: 'Favor until over while for negative conditions.'
  StyleGuide: '#until-for-negatives'
  Enabled: true
  VersionAdded: '0.20'

Style/NestedModifier:
  Description: 'Avoid using nested modifiers.'
  StyleGuide: '#no-nested-modifiers'
  Enabled: true
  VersionAdded: '0.35'

Style/NestedParenthesizedCalls:
  Description: >-
                 Parenthesize method calls which are nested inside the
                 argument list of another parenthesized method call.
  Enabled: true
  VersionAdded: '0.36'
  VersionChanged: '0.50'
  Whitelist:
    - be
    - be_a
    - be_an
    - be_between
    - be_falsey
    - be_kind_of
    - be_instance_of
    - be_truthy
    - be_within
    - eq
    - eql
    - end_with
    - include
    - match
    - raise_error
    - respond_to
    - start_with

Style/NestedTernaryOperator:
  Description: 'Use one expression per branch in a ternary operator.'
  StyleGuide: '#no-nested-ternary'
  Enabled: true
  VersionAdded: '0.9'

Style/Next:
  Description: 'Use `next` to skip iteration instead of a condition at the end.'
  StyleGuide: '#no-nested-conditionals'
  Enabled: true
  VersionAdded: '0.22'
  VersionChanged: '0.35'
  # With `always` all conditions at the end of an iteration needs to be
  # replaced by next - with `skip_modifier_ifs` the modifier if like this one
  # are ignored: [1, 2].each { |a| return 'yes' if a == 1 }
  EnforcedStyle: skip_modifier_ifs
  # `MinBodyLength` defines the number of lines of the a body of an `if` or `unless`
  # needs to have to trigger this cop
  MinBodyLength: 3
  SupportedStyles:
    - skip_modifier_ifs
    - always

Style/NilComparison:
  Description: 'Prefer x.nil? to x == nil.'
  StyleGuide: '#predicate-methods'
  Enabled: true
  VersionAdded: '0.12'
  VersionChanged: '0.59'
  EnforcedStyle: predicate
  SupportedStyles:
    - predicate
    - comparison

Style/NonNilCheck:
  Description: 'Checks for redundant nil checks.'
  StyleGuide: '#no-non-nil-checks'
  Enabled: true
  VersionAdded: '0.20'
  VersionChanged: '0.22'
  # With `IncludeSemanticChanges` set to `true`, this cop reports offenses for
  # `!x.nil?` and autocorrects that and `x != nil` to solely `x`, which is
  # **usually** OK, but might change behavior.
  #
  # With `IncludeSemanticChanges` set to `false`, this cop does not report
  # offenses for `!x.nil?` and does no changes that might change behavior.
  IncludeSemanticChanges: false

Style/Not:
  Description: 'Use ! instead of not.'
  StyleGuide: '#bang-not-not'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.20'

Style/NumericLiteralPrefix:
  Description: 'Use smallcase prefixes for numeric literals.'
  StyleGuide: '#numeric-literal-prefixes'
  Enabled: true
  VersionAdded: '0.41'
  EnforcedOctalStyle: zero_with_o
  SupportedOctalStyles:
    - zero_with_o
    - zero_only


Style/NumericLiterals:
  Description: >-
                 Add underscores to large numeric literals to improve their
                 readability.
  StyleGuide: '#underscores-in-numerics'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.48'
  MinDigits: 5
  Strict: false

Style/NumericPredicate:
  Description: >-
                 Checks for the use of predicate- or comparison methods for
                 numeric comparisons.
  StyleGuide: '#predicate-methods'
  Safe: false
  # This will change to a new method call which isn't guaranteed to be on the
  # object. Switching these methods has to be done with knowledge of the types
  # of the variables which rubocop doesn't have.
  SafeAutoCorrect: false
  AutoCorrect: false
  Enabled: true
  VersionAdded: '0.42'
  VersionChanged: '0.59'
  EnforcedStyle: predicate
  SupportedStyles:
    - predicate
    - comparison
  IgnoredMethods: []
  # Exclude RSpec specs because assertions like `expect(1).to be > 0` cause
  # false positives.
  Exclude:
    - 'spec/**/*'

Style/OneLineConditional:
  Description: >-
                 Favor the ternary operator(?:) over
                 if/then/else/end constructs.
  StyleGuide: '#ternary-operator'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.38'

Style/OptionHash:
  Description: "Don't use option hashes when you can use keyword arguments."
  Enabled: false
  VersionAdded: '0.33'
  VersionChanged: '0.34'
  # A list of parameter names that will be flagged by this cop.
  SuspiciousParamNames:
    - options
    - opts
    - args
    - params
    - parameters

Style/OptionalArguments:
  Description: >-
                 Checks for optional arguments that do not appear at the end
                 of the argument list
  StyleGuide: '#optional-arguments'
  Enabled: true
  VersionAdded: '0.33'

Style/OrAssignment:
  Description: 'Recommend usage of double pipe equals (||=) where applicable.'
  StyleGuide: '#double-pipe-for-uninit'
  Enabled: true
  VersionAdded: '0.50'

Style/ParallelAssignment:
  Description: >-
                  Check for simple usages of parallel assignment.
                  It will only warn when the number of variables
                  matches on both sides of the assignment.
  StyleGuide: '#parallel-assignment'
  Enabled: true
  VersionAdded: '0.32'

Style/ParenthesesAroundCondition:
  Description: >-
                 Don't use parentheses around the condition of an
                 if/unless/while.
  StyleGuide: '#no-parens-around-condition'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.56'
  AllowSafeAssignment: true
  AllowInMultilineConditions: false

Style/PercentLiteralDelimiters:
  Description: 'Use `%`-literal delimiters consistently'
  StyleGuide: '#percent-literal-braces'
  Enabled: true
  VersionAdded: '0.19'
  # Specify the default preferred delimiter for all types with the 'default' key
  # Override individual delimiters (even with default specified) by specifying
  # an individual key
  PreferredDelimiters:
    default: ()
    '%i': '[]'
    '%I': '[]'
    '%r': '{}'
    '%w': '[]'
    '%W': '[]'
  VersionChanged: '0.48.1'

Style/PercentQLiterals:
  Description: 'Checks if uses of %Q/%q match the configured preference.'
  Enabled: true
  VersionAdded: '0.25'
  EnforcedStyle: lower_case_q
  SupportedStyles:
    - lower_case_q # Use `%q` when possible, `%Q` when necessary
    - upper_case_q # Always use `%Q`

Style/PerlBackrefs:
  Description: 'Avoid Perl-style regex back references.'
  StyleGuide: '#no-perl-regexp-last-matchers'
  Enabled: true
  VersionAdded: '0.13'

Style/PreferredHashMethods:
  Description: 'Checks use of `has_key?` and `has_value?` Hash methods.'
  StyleGuide: '#hash-key'
  Enabled: true
  VersionAdded: '0.41'
  VersionChanged: '0.44'
  EnforcedStyle: short
  SupportedStyles:
    - short
    - verbose

Style/Proc:
  Description: 'Use proc instead of Proc.new.'
  StyleGuide: '#proc'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.18'

Style/RaiseArgs:
  Description: 'Checks the arguments passed to raise/fail.'
  StyleGuide: '#exception-class-messages'
  Enabled: true
  VersionAdded: '0.14'
  VersionChanged: '0.40'
  EnforcedStyle: exploded
  SupportedStyles:
    - compact # raise Exception.new(msg)
    - exploded # raise Exception, msg

Style/RandomWithOffset:
  Description: >-
                 Prefer to use ranges when generating random numbers instead of
                 integers with offsets.
  StyleGuide: '#random-numbers'
  Enabled: true
  VersionAdded: '0.52'

Style/RedundantBegin:
  Description: "Don't use begin blocks when they are not needed."
  StyleGuide: '#begin-implicit'
  Enabled: true
  VersionAdded: '0.10'
  VersionChanged: '0.21'

Style/RedundantConditional:
  Description: "Don't return true/false from a conditional."
  Enabled: true
  VersionAdded: '0.50'

Style/RedundantException:
  Description: "Checks for an obsolete RuntimeException argument in raise/fail."
  StyleGuide: '#no-explicit-runtimeerror'
  Enabled: true
  VersionAdded: '0.14'
  VersionChanged: '0.29'

Style/RedundantFreeze:
  Description: "Checks usages of Object#freeze on immutable objects."
  Enabled: true
  VersionAdded: '0.34'

Style/RedundantParentheses:
  Description: "Checks for parentheses that seem not to serve any purpose."
  Enabled: true
  VersionAdded: '0.36'

Style/RedundantReturn:
  Description: "Don't use return where it's not required."
  StyleGuide: '#no-explicit-return'
  Enabled: true
  VersionAdded: '0.10'
  VersionChanged: '0.14'
  # When `true` allows code like `return x, y`.
  AllowMultipleReturnValues: false

Style/RedundantSelf:
  Description: "Don't use self where it's not needed."
  StyleGuide: '#no-self-unless-required'
  Enabled: true
  VersionAdded: '0.10'
  VersionChanged: '0.13'

Style/RegexpLiteral:
  Description: 'Use / or %r around regular expressions.'
  StyleGuide: '#percent-r'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.30'
  EnforcedStyle: slashes
  # slashes: Always use slashes.
  # percent_r: Always use `%r`.
  # mixed: Use slashes on single-line regexes, and `%r` on multi-line regexes.
  SupportedStyles:
    - slashes
    - percent_r
    - mixed
  # If `false`, the cop will always recommend using `%r` if one or more slashes
  # are found in the regexp string.
  AllowInnerSlashes: true

Style/RescueModifier:
  Description: 'Avoid using rescue in its modifier form.'
  StyleGuide: '#no-rescue-modifiers'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.34'

Style/RescueStandardError:
  Description: 'Avoid rescuing without specifying an error class.'
  Enabled: true
  VersionAdded: '0.52'
  EnforcedStyle: explicit
  # implicit: Do not include the error class, `rescue`
  # explicit: Require an error class `rescue StandardError`
  SupportedStyles:
    - implicit
    - explicit

Style/ReturnNil:
  Description: 'Use return instead of return nil.'
  Enabled: false
  EnforcedStyle: return
  SupportedStyles:
    - return
    - return_nil
  VersionAdded: '0.50'

Style/SafeNavigation:
  Description: >-
                  This cop transforms usages of a method call safeguarded by
                  a check for the existence of the object to
                  safe navigation (`&.`).
  Enabled: true
  VersionAdded: '0.43'
  VersionChanged: '0.44'
  # Safe navigation may cause a statement to start returning `nil` in addition
  # to whatever it used to return.
  ConvertCodeThatCanStartToReturnNil: false
  Whitelist:
    - present?
    - blank?
    - presence
    - try
    - try!
  VersionChanged: '0.56'

Style/SelfAssignment:
  Description: >-
                 Checks for places where self-assignment shorthand should have
                 been used.
  StyleGuide: '#self-assignment'
  Enabled: true
  VersionAdded: '0.19'
  VersionChanged: '0.29'

Style/Semicolon:
  Description: "Don't use semicolons to terminate expressions."
  StyleGuide: '#no-semicolon'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.19'
  # Allow `;` to separate several expressions on the same line.
  AllowAsExpressionSeparator: false

Style/Send:
  Description: 'Prefer `Object#__send__` or `Object#public_send` to `send`, as `send` may overlap with existing methods.'
  StyleGuide: '#prefer-public-send'
  Enabled: false
  VersionAdded: '0.33'

Style/SignalException:
  Description: 'Checks for proper usage of fail and raise.'
  StyleGuide: '#prefer-raise-over-fail'
  Enabled: true
  VersionAdded: '0.11'
  VersionChanged: '0.37'
  EnforcedStyle: only_raise
  SupportedStyles:
    - only_raise
    - only_fail
    - semantic

Style/SingleLineBlockParams:
  Description: 'Enforces the names of some block params.'
  Enabled: false
  VersionAdded: '0.16'
  VersionChanged: '0.47'
  Methods:
    - reduce:
        - acc
        - elem
    - inject:
        - acc
        - elem

Style/SingleLineMethods:
  Description: 'Avoid single-line methods.'
  StyleGuide: '#no-single-line-methods'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.19'
  AllowIfMethodIsEmpty: true

Style/SpecialGlobalVars:
  Description: 'Avoid Perl-style global variables.'
  StyleGuide: '#no-cryptic-perlisms'
  Enabled: true
  VersionAdded: '0.13'
  VersionChanged: '0.36'
  SafeAutoCorrect: false
  EnforcedStyle: use_english_names
  SupportedStyles:
    - use_perl_names
    - use_english_names

Style/StabbyLambdaParentheses:
  Description: 'Check for the usage of parentheses around stabby lambda arguments.'
  StyleGuide: '#stabby-lambda-with-args'
  Enabled: true
  VersionAdded: '0.35'
  EnforcedStyle: require_parentheses
  SupportedStyles:
    - require_parentheses
    - require_no_parentheses

Style/StderrPuts:
  Description: 'Use `warn` instead of `$stderr.puts`.'
  StyleGuide: '#warn'
  Enabled: true
  VersionAdded: '0.51'

Style/StringHashKeys:
  Description: 'Prefer symbols instead of strings as hash keys.'
  StyleGuide: '#symbols-as-keys'
  Enabled: false
  VersionAdded: '0.52'

Style/StringLiterals:
  Description: 'Checks if uses of quotes match the configured preference.'
  StyleGuide: '#consistent-string-literals'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.36'
  EnforcedStyle: single_quotes
  SupportedStyles:
    - single_quotes
    - double_quotes
  # If `true`, strings which span multiple lines using `\` for continuation must
  # use the same type of quotes on each line.
  ConsistentQuotesInMultiline: false

Style/StringLiteralsInInterpolation:
  Description: >-
                 Checks if uses of quotes inside expressions in interpolated
                 strings match the configured preference.
  Enabled: true
  VersionAdded: '0.27'
  EnforcedStyle: single_quotes
  SupportedStyles:
    - single_quotes
    - double_quotes

Style/StringMethods:
  Description: 'Checks if configured preferred methods are used over non-preferred.'
  Enabled: false
  VersionAdded: '0.34'
  VersionChanged: '0.34.2'
  # Mapping from undesired method to desired_method
  # e.g. to use `to_sym` over `intern`:
  #
  # StringMethods:
  #   PreferredMethods:
  #     intern: to_sym
  PreferredMethods:
    intern: to_sym

Style/StructInheritance:
  Description: 'Checks for inheritance from Struct.new.'
  StyleGuide: '#no-extend-struct-new'
  Enabled: true
  VersionAdded: '0.29'

Style/SymbolArray:
  Description: 'Use %i or %I for arrays of symbols.'
  StyleGuide: '#percent-i'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.49'
  EnforcedStyle: percent
  MinSize: 2
  SupportedStyles:
    - percent
    - brackets

Style/SymbolLiteral:
  Description: 'Use plain symbols instead of string symbols when possible.'
  Enabled: true
  VersionAdded: '0.30'

Style/SymbolProc:
  Description: 'Use symbols as procs instead of blocks when possible.'
  Enabled: true
  VersionAdded: '0.26'
  VersionChanged: '0.40'
  # A list of method names to be ignored by the check.
  # The names should be fairly unique, otherwise you'll end up ignoring lots of code.
  IgnoredMethods:
    - respond_to
    - define_method

Style/TernaryParentheses:
  Description: 'Checks for use of parentheses around ternary conditions.'
  Enabled: true
  VersionAdded: '0.42'
  VersionChanged: '0.46'
  EnforcedStyle: require_no_parentheses
  SupportedStyles:
    - require_parentheses
    - require_no_parentheses
    - require_parentheses_when_complex
  AllowSafeAssignment: true

Style/TrailingBodyOnClass:
  Description: 'Class body goes below class statement.'
  Enabled: true
  VersionAdded: '0.53'

Style/TrailingBodyOnMethodDefinition:
  Description: 'Method body goes below definition.'
  Enabled: true
  VersionAdded: '0.52'

Style/TrailingBodyOnModule:
  Description: 'Module body goes below module statement.'
  Enabled: true
  VersionAdded: '0.53'

Style/TrailingCommaInArguments:
  Description: 'Checks for trailing comma in argument lists.'
  StyleGuide: '#no-trailing-params-comma'
  Enabled: true
  VersionAdded: '0.36'
  # If `comma`, the cop requires a comma after the last argument, but only for
  # parenthesized method calls where each argument is on its own line.
  # If `consistent_comma`, the cop requires a comma after the last argument,
  # for all parenthesized method calls with arguments.
  EnforcedStyleForMultiline: no_comma
  SupportedStylesForMultiline:
    - comma
    - consistent_comma
    - no_comma

Style/TrailingCommaInArrayLiteral:
  Description: 'Checks for trailing comma in array literals.'
  StyleGuide: '#no-trailing-array-commas'
  Enabled: true
  VersionAdded: '0.53'
  # but only when each item is on its own line.
  # If `consistent_comma`, the cop requires a comma after the last item of all
  # non-empty array literals.
  EnforcedStyleForMultiline: no_comma
  SupportedStylesForMultiline:
    - comma
    - consistent_comma
    - no_comma

Style/TrailingCommaInHashLiteral:
  Description: 'Checks for trailing comma in hash literals.'
  Enabled: true
  # If `comma`, the cop requires a comma after the last item in a hash,
  # but only when each item is on its own line.
  # If `consistent_comma`, the cop requires a comma after the last item of all
  # non-empty hash literals.
  EnforcedStyleForMultiline: no_comma
  SupportedStylesForMultiline:
    - comma
    - consistent_comma
    - no_comma
  VersionAdded: '0.53'

Style/TrailingMethodEndStatement:
  Description: 'Checks for trailing end statement on line of method body.'
  Enabled: true
  VersionAdded: '0.52'

Style/TrailingUnderscoreVariable:
  Description: >-
                 Checks for the usage of unneeded trailing underscores at the
                 end of parallel variable assignment.
  AllowNamedUnderscoreVariables: true
  Enabled: true
  VersionAdded: '0.31'
  VersionChanged: '0.35'

# `TrivialAccessors` requires exact name matches and doesn't allow
# predicated methods by default.
Style/TrivialAccessors:
  Description: 'Prefer attr_* methods to trivial readers/writers.'
  StyleGuide: '#attr_family'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.38'
  # When set to `false` the cop will suggest the use of accessor methods
  # in situations like:
  #
  # def name
  #   @other_name
  # end
  #
  # This way you can uncover "hidden" attributes in your code.
  ExactNameMatch: true
  AllowPredicates: true
  # Allows trivial writers that don't end in an equal sign. e.g.
  #
  # def on_exception(action)
  #   @on_exception=action
  # end
  # on_exception :restart
  #
  # Commonly used in DSLs
  AllowDSLWriters: false
  IgnoreClassMethods: false
  Whitelist:
    - to_ary
    - to_a
    - to_c
    - to_enum
    - to_h
    - to_hash
    - to_i
    - to_int
    - to_io
    - to_open
    - to_path
    - to_proc
    - to_r
    - to_regexp
    - to_str
    - to_s
    - to_sym

Style/UnlessElse:
  Description: >-
                 Do not use unless with else. Rewrite these with the positive
                 case first.
  StyleGuide: '#no-else-with-unless'
  Enabled: true
  VersionAdded: '0.9'

Style/UnneededCapitalW:
  Description: 'Checks for %W when interpolation is not needed.'
  Enabled: true
  VersionAdded: '0.21'
  VersionChanged: '0.24'

Style/UnneededCondition:
  Description: 'Checks for unnecessary conditional expressions.'
  Enabled: true
  VersionAdded: '0.57'

Style/UnneededInterpolation:
  Description: 'Checks for strings that are just an interpolated expression.'
  Enabled: true
  VersionAdded: '0.36'

Style/UnneededPercentQ:
  Description: 'Checks for %q/%Q when single quotes or double quotes would do.'
  StyleGuide: '#percent-q'
  Enabled: true
  VersionAdded: '0.24'

Style/UnpackFirst:
  Description: >-
                 Checks for accessing the first element of `String#unpack`
                 instead of using `unpack1`
  Enabled: true
  VersionAdded: '0.54'

Style/VariableInterpolation:
  Description: >-
                 Don't interpolate global, instance and class variables
                 directly in strings.
  StyleGuide: '#curlies-interpolate'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.20'

Style/WhenThen:
  Description: 'Use when x then ... for one-line cases.'
  StyleGuide: '#one-line-cases'
  Enabled: true
  VersionAdded: '0.9'

Style/WhileUntilDo:
  Description: 'Checks for redundant do after while or until.'
  StyleGuide: '#no-multiline-while-do'
  Enabled: true
  VersionAdded: '0.9'

Style/WhileUntilModifier:
  Description: >-
                 Favor modifier while/until usage when you have a
                 single-line body.
  StyleGuide: '#while-as-a-modifier'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.30'

Style/WordArray:
  Description: 'Use %w or %W for arrays of words.'
  StyleGuide: '#percent-w'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.36'
  EnforcedStyle: percent
  SupportedStyles:
    # percent style: %w(word1 word2)
    - percent
    # bracket style: ['word1', 'word2']
    - brackets
  # The `MinSize` option causes the `WordArray` rule to be ignored for arrays
  # smaller than a certain size. The rule is only applied to arrays
  # whose element count is greater than or equal to `MinSize`.
  MinSize: 2
  # The regular expression `WordRegex` decides what is considered a word.
  WordRegex: !ruby/regexp '/\A[\p{Word}\n\t]+\z/'

Style/YodaCondition:
  Description: 'Do not use literals as the first operand of a comparison.'
  Reference: 'https://en.wikipedia.org/wiki/Yoda_conditions'
  Enabled: false
  EnforcedStyle: forbid_for_all_comparison_operators
  SupportedStyles:
    - forbid_for_all_comparison_operators
    - forbid_for_equality_operators_only
    - require_for_all_comparison_operators
    - require_for_equality_operators_only
  VersionAdded: '0.49'
  VersionChanged: '0.50'

Style/ZeroLengthPredicate:
  Description: 'Use #empty? when testing for objects of length 0.'
  Enabled: true
  Safe: false
  VersionAdded: '0.37'
  VersionChanged: '0.39'