.rubocop.yml

Summary

Maintainability
Test Coverage
inherit_from:
  - .rubocop_todo.yml
  - .rubocop/todo.yml

require: rubocop-performance


AllCops:
  TargetRubyVersion: 3.0
  NewCops: disable
  SuggestExtensions: false
  Exclude:
    - CHANGELOG.md
    - CONDUCT.md
    - CONTRIBUTING.md
    - Gemfile/**/*
    - Gemfile.lock
    - Guardfile/**/*
    - HACKING.md
    - LICENSE/**/*
    - README.md
    - Rakefile/**/*
    - '*'
    - __*
    - __*/**/*
    - appveyor.yml
    - benchmark/**/*
    - benchmark-ips/**/*
    - bin/**/*
    - build/**/*
    - config.ru
    - coverage/**/*
    - docs/**/*
    - examples/**/*
    - exe/**/*
    # - lib/**/*
    - lib/opal/source_map/vlq.rb
    - node_modules/**/*
    # - opal/**/*
    - opal.gemspec
    - pkg/**/*
    - spec/**/*
    # - stdlib/**/*
    - tasks/**/*
    - test/**/*
    - tmp/**/*
    - vendored-minitest/**/*
    - vendor/**/* # present in travis
    # Files thate were copied from MRI as is
    - 'stdlib/benchmark.rb'
    - 'stdlib/observer.rb'
    - 'stdlib/open-uri.rb'
    - 'stdlib/stringio.rb'
    - 'stdlib/source_map/*.rb'
    - 'stdlib/racc/parser.rb'
    - 'stdlib/e2mmap.rb'
    - 'stdlib/matrix.rb'
    - 'stdlib/matrix/*.rb'
    - 'stdlib/pp.rb'
    - 'stdlib/prettyprint.rb'
    - 'stdlib/optparse.rb'
    - 'stdlib/optparse/*.rb'
    - 'stdlib/tmpdir.rb'
    - 'stdlib/tempfile.rb'

inherit_mode:
  merge:
    - Exclude

Naming/MethodName:
  Exclude:
    # Ruby has methods like Integer/Float/Array
    - 'opal/**/*.rb'
    - 'stdlib/**/*.rb'

Layout/ClosingParenthesisIndentation:
  Enabled: false

Layout/CommentIndentation:
  # The following files use comments to show generated ruby code
  Exclude:
    - 'lib/opal/rewriters/binary_operator_assignment.rb'
    - 'lib/opal/rewriters/logical_operator_assignment.rb'
    - 'lib/opal/source_map/file.rb'

# We need to support older rubies
Layout/HeredocIndentation:
  Enabled: false

Style/FrozenStringLiteralComment:
  Exclude:
    - 'opal/**/*.rb'
    - 'stdlib/**/*.rb'

Layout/EmptyLineAfterMagicComment:
  Exclude:
    - 'opal/**/*.rb'
    - 'stdlib/**/*.rb'

Style/GlobalVars:
  Exclude:
    - 'opal/corelib/kernel.rb'
    - 'stdlib/nodejs/irb.rb'
    - 'stdlib/console.rb'
    - 'stdlib/native.rb'
    - 'stdlib/await.rb'

Layout/ExtraSpacing:
  Exclude:
    # This files uses extra spaces to show an inheritance tree of error classes
    - 'opal/corelib/error.rb'

Layout/FirstArrayElementIndentation:
  EnforcedStyle: consistent

Layout/SpaceAroundOperators:
  Exclude:
    - 'opal/corelib/error.rb'

Lint/BooleanSymbol:
  Exclude:
    # There are AST nodes and rewriters with types :true and :false
    - 'lib/opal/nodes/**/*.rb'
    - 'lib/opal/rewriters/**/*.rb'

Lint/InheritException:
  Exclude:
    - 'lib/opal/builder.rb'
    - 'lib/opal/errors.rb'
    - 'opal/**/*.rb'
    - 'stdlib/**/*.rb'

Lint/LiteralAsCondition:
  Exclude:
    # Opal supports if `...js...`
    - 'opal/**/*.rb'
    - 'stdlib/**/*.rb'

Lint/Loop:
  Exclude:
    # This is for optimization purposes mostly
    - 'opal/corelib/io.rb'

# Allow the use of if/unless inside blocks
Style/Next:
  Enabled: false

Lint/RescueException:
  Exclude:
    # That's what MRI does
    - 'opal/corelib/enumerator.rb'
    # Promises must care about all exceptions
    - 'stdlib/promise.rb'
    - 'opal/corelib/binding.rb'

Lint/RedundantStringCoercion:
  Exclude:
    # That's what MRI does
    - 'opal/corelib/error.rb'

Lint/UnusedBlockArgument:
  Exclude:
    # Variable from Ruby can be accessed in JS, rubocop can't catch it (but JSHint can)
    - 'opal/**/*.rb'
    - 'stdlib/**/*.rb'

Lint/UnusedMethodArgument:
  Exclude:
    # Variable from Ruby can be accessed in JS, rubocop can't catch it (but JSHint can)
    - 'opal/**/*.rb'
    - 'stdlib/**/*.rb'

Lint/UselessAssignment:
  Exclude:
    # Variable from Ruby can be accessed in JS, rubocop can't catch it (but JSHint can)
    - 'opal/**/*.rb'
    - 'stdlib/**/*.rb'

Metrics/AbcSize:
  Enabled: false

Metrics/BlockLength:
  Enabled: false

Metrics/BlockNesting:
  Enabled: false

Metrics/ClassLength:
  Enabled: false

Metrics/CyclomaticComplexity:
  Enabled: false

Metrics/MethodLength:
  Enabled: false

Metrics/ModuleLength:
  Enabled: false

Metrics/PerceivedComplexity:
  Enabled: false

Metrics/ParameterLists:
  Exclude:
    # Some Ruby methods take 10 arguments
    - 'opal/**/*.rb'
    - 'stdlib/**/*.rb'

Naming/BinaryOperatorParameterName:
  Exclude:
    # Opal follows MRI argument namings
    - 'opal/**/*.rb'
    - 'stdlib/**/*.rb'

Naming/PredicateName:
  # Ruby has "has_key?" method
  ForbiddenPrefixes: is_, have_

Performance/FlatMap:
  Exclude:
    # That's actually a definition of Enumerable#flat_map
    - 'opal/corelib/enumerable.rb'

Performance/RegexpMatch:
  # This cop converts =~ to match?
  # But this method was introduced only in 2.4
  Enabled: false

Performance/UnfreezeString:
  Enabled: false

Style/AsciiComments:
  Enabled: false

Style/CaseEquality:
  Exclude:
    - 'opal/**/*.rb'
    - 'stdlib/**/*.rb'
    - 'lib/opal/config.rb'

Style/ClassAndModuleChildren:
  Enabled: false

Style/ClassVars:
  Exclude:
    # These classes use class variables on purpose
    - 'lib/opal/rewriters/binary_operator_assignment.rb'
    - 'lib/opal/rewriters/logical_operator_assignment.rb'

Style/CommandLiteral:
  # This cop converts `` to %x{}
  Enabled: false

Style/Documentation:
  Enabled: false

Style/EmptyMethod:
  # There are a lot of empty methods that are required to make MSpec working
  Exclude:
    - 'opal/**/*.rb'
    - 'stdlib/**/*.rb'

Style/IfUnlessModifier:
  Enabled: false

Style/InfiniteLoop:
  # while true is faster than loop
  Enabled: false

Style/InverseMethods:
  # That's what MRI does
  Exclude:
    - 'opal/corelib/basic_object.rb'
    - 'opal/corelib/kernel.rb'

Lint/MissingSuper:
  # Base Opal classes simply can't or shouldn't call super for #method_missing
  Exclude:
    - 'opal/corelib/basic_object.rb'
    - 'opal/corelib/kernel.rb'
    - 'opal/corelib/string/inheritance.rb'
    - 'stdlib/native.rb'
    - 'stdlib/delegate.rb'
    - 'stdlib/ostruct.rb'

Style/MissingRespondToMissing:
  Enabled: true

Style/NumericPredicate:
  Enabled: false

Style/ParallelAssignment:
  Enabled: false

Style/PercentLiteralDelimiters:
  PreferredDelimiters:
    default: '{}'
  Exclude:
    # Opal has a convention of %x{}
    - 'opal/**/*.rb'
    - 'stdlib/**/*.rb'

Style/SafeNavigation:
  # Opal supports old versions of Ruby that don't have safe navigator
  Enabled: false

Style/SpecialGlobalVars:
  Enabled: false

Style/StderrPuts:
  Enabled: false

Style/YodaCondition:
  Exclude:
    # In Opal there are lot of cases like
    # if `..js..` == object
    - 'opal/**/*.rb'
    - 'stdlib/**/*.rb'

Layout/MultilineAssignmentLayout:
  EnforcedStyle: same_line

Style/TrailingCommaInArguments:
  # Any style is allowed
  Enabled: false

Layout/ParameterAlignment:
  EnforcedStyle: with_fixed_indentation

Layout/MultilineMethodCallBraceLayout:
  EnforcedStyle: new_line

Style/Lambda:
  EnforcedStyle: literal

Layout/EmptyLines:
  # Empty lines can be used to separate interface and implementation
  Enabled: false

Style/EmptyElse:
  # Empty 'else' can be used to indicate a potential empty branch condition
  EnforcedStyle: nil

Lint/EmptyWhen:
  # Empty 'when' can be used to indicate a potential empty branch condition
  Enabled: false

Style/StringLiterals:
  Exclude:
    # Nodes are more like DSL, so they are allowed to have any internal rules
    # that make the code more readable
    - 'lib/opal/nodes/**/*.rb'

Style/TrailingUnderscoreVariable:
  # We treat a, = *b construction as a potential source of bugs
  Enabled: false

Style/WhileUntilModifier:
  Enabled: false

Style/RegexpLiteral:
  # Use the style that you like more, but if there are slashes or backslashe
  # prefer %r{} syntax.
  # Rubocop doesn't check for backslashes, so this rule is disabled.
  Enabled: false

Naming/FileName:
  Exclude:
    - 'stdlib/opal-builder.rb'
    - 'stdlib/nodejs/open-uri.rb'
    - 'stdlib/opal-parser.rb'
    - 'stdlib/opal-platform.rb'
    - 'stdlib/opal-source-maps.rb'
    - 'stdlib/opal-replutils.rb'

Naming/ConstantName:
  Exclude:
    # MRI has a constant BigDecimal::SIGN_NaN
    - 'stdlib/bigdecimal.rb'
    - 'stdlib/opal-platform.rb'

Security/Eval:
  Exclude:
    # That's what parser does
    - 'stdlib/opal-parser.rb'

Naming/AccessorMethodName:
  Exclude:
    # StringScanner has method 'get_byte'
    - 'stdlib/strscan.rb'
    # Exception has method 'set_backtrace'
    - 'opal/corelib/error.rb'

Style/RescueStandardError:
  Enabled: false

Style/TrailingCommaInArrayLiteral:
  # Any style is allowed
  Enabled: false

Style/TrailingCommaInHashLiteral:
  # Any style is allowed
  Enabled: false

Style/VariableInterpolation:
  # `#@native.abc` makes sense for Opal
  Enabled: false

Naming/MethodParameterName:
  Exclude:
    # This file uses parser's code that doesn't match our styling requirements
    - 'lib/opal/parser/patch.rb'
    - 'opal/**/*.rb'
    - 'stdlib/**/*.rb'

Lint/BigDecimalNew:
  Exclude:
    # That's the implementation of the Kernel#BigDecimal
    - 'stdlib/bigdecimal/kernel.rb'

Style/MutableConstant:
  Exclude:
    - 'opal/**/*.rb'
    - 'stdlib/**/*.rb'

Style/EmptyCaseCondition:
  Enabled: false


# Use whatever suites the situation, sometimes assign_inside_condition is
# more readable over assign_to_condition despite the risk of repeating the
# variable name.
Style/ConditionalAssignment:
  Enabled: false

Naming/MemoizedInstanceVariableName:
  Exclude:
    - lib/opal/parser/patch.rb # it's a monkey-patch on the parser gem
    - lib/opal/nodes/rescue.rb # we know what we are doing here and no, it's not memoization

Style/AccessModifierDeclarations:
  Enabled: false

Style/MultipleComparison:
  Enabled: false

Layout/EmptyLineAfterGuardClause:
  Enabled: false

Layout/HashAlignment:
  Enabled: false

# No way to set multiple preferred names
Naming/RescuedExceptionsVariableName:
  Enabled: false

Style/Semicolon:
  AllowAsExpressionSeparator: true

Layout/EmptyLinesAroundExceptionHandlingKeywords:
  Enabled: false