pax_global_header00006660000000000000000000000064141016224740014513gustar00rootroot0000000000000052 comment=298ec79bcc02dc0b3cd2d20f5b778ceaf2dd99ad babosa-2.0.0/000077500000000000000000000000001410162247400127415ustar00rootroot00000000000000babosa-2.0.0/.gemtest000066400000000000000000000000001410162247400144000ustar00rootroot00000000000000babosa-2.0.0/.github/000077500000000000000000000000001410162247400143015ustar00rootroot00000000000000babosa-2.0.0/.github/workflows/000077500000000000000000000000001410162247400163365ustar00rootroot00000000000000babosa-2.0.0/.github/workflows/main.yml000066400000000000000000000007611410162247400200110ustar00rootroot00000000000000name: CI on: push: branches: - 'master' pull_request: jobs: test: strategy: matrix: ruby: [ 2.5, 2.6, 2.7, 3.0, jruby, truffleruby-head ] fail-fast: false max-parallel: 10 runs-on: ubuntu-latest env: CI: true name: ${{ matrix.ruby }} steps: - uses: actions/checkout@v2 - uses: ruby/setup-ruby@v1 with: bundler-cache: true ruby-version: ${{ matrix.ruby }} - run: bundle exec rake babosa-2.0.0/.gitignore000066400000000000000000000000541410162247400147300ustar00rootroot00000000000000Gemfile Gemfile.lock coverage pkg .rbx tags babosa-2.0.0/.rubocop.yml000066400000000000000000004031021410162247400152130ustar00rootroot00000000000000# Common configuration. AllCops: RubyInterpreters: - ruby - macruby - rake - jruby - rbx # Include common Ruby source files. Include: - '**/*.rb' - '**/*.arb' - '**/*.axlsx' - '**/*.builder' - '**/*.fcgi' - '**/*.gemfile' - '**/*.gemspec' - '**/*.god' - '**/*.jb' - '**/*.jbuilder' - '**/*.mspec' - '**/*.opal' - '**/*.pluginspec' - '**/*.podspec' - '**/*.rabl' - '**/*.rake' - '**/*.rbuild' - '**/*.rbw' - '**/*.rbx' - '**/*.ru' - '**/*.ruby' - '**/*.spec' - '**/*.thor' - '**/*.watchr' - '**/.irbrc' - '**/.pryrc' - '**/.simplecov' - '**/buildfile' - '**/Appraisals' - '**/Berksfile' - '**/Brewfile' - '**/Buildfile' - '**/Capfile' - '**/Cheffile' - '**/Dangerfile' - '**/Deliverfile' - '**/Fastfile' - '**/*Fastfile' - '**/Gemfile' - '**/Guardfile' - '**/Jarfile' - '**/Mavenfile' - '**/Podfile' - '**/Puppetfile' - '**/Rakefile' - '**/rakefile' - '**/Snapfile' - '**/Steepfile' - '**/Thorfile' - '**/Vagabondfile' - '**/Vagrantfile' Exclude: - 'node_modules/**/*' - 'tmp/**/*' - 'vendor/**/*' - '.git/**/*' # 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://rubystyle.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 # New cops introduced between major versions are set to a special pending status # and are not enabled by default with warning message. # Change this behavior by overriding either `NewCops: enable` or `NewCops: disable`. # When `NewCops` is `enable`, pending cops are enabled in bulk. Can be overridden by # the `--enable-pending-cops` command-line option. # When `NewCops` is `disable`, pending cops are disabled in bulk. Can be overridden by # the `--disable-pending-cops` command-line option. NewCops: enable # 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/`. # The CacheRootDirectory can be overwritten by passing the `--cache-root` command # line option or by setting `$RUBOCOP_CACHE_ROOT` environment variable. 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.4). TargetRubyVersion: 2.5 #################### 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' VersionChanged: '0.85' Include: - '**/*.gemfile' - '**/Gemfile' - '**/gems.rb' IgnoredGems: [] OnlyFor: [] 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 # By default, "-" and "_" are ignored for order purposes. # This can be overridden by setting this parameter to true. ConsiderPunctuation: false 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 # By default, "-" and "_" are ignored for order purposes. # This can be overridden by setting this parameter to true. ConsiderPunctuation: false Include: - '**/*.gemspec' Gemspec/RequiredRubyVersion: Description: 'Checks that `required_ruby_version` of gemspec is specified and equal to `TargetRubyVersion` of .rubocop.yml.' Enabled: true VersionAdded: '0.52' VersionChanged: '0.89' Include: - '**/*.gemspec' Gemspec/RubyVersionGlobalsUsage: Description: Checks usage of RUBY_VERSION in gemspec. StyleGuide: '#no-ruby-version-in-the-gemspec' Enabled: true VersionAdded: '0.72' 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/ArgumentAlignment: Description: >- Align the arguments of a method call if they span more than one line. StyleGuide: '#no-double-indent' Enabled: true VersionAdded: '0.68' VersionChanged: '0.77' # Alignment of arguments in multi-line method calls. # # The `with_first_argument` 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_argument SupportedStyles: - with_first_argument - with_fixed_indentation # By default, the indentation width from Layout/IndentationWidth is used # But it can be overridden by setting this parameter IndentationWidth: ~ Layout/ArrayAlignment: Description: >- Align the elements of an array literal if they span more than one line. StyleGuide: '#no-double-indent' Enabled: true VersionAdded: '0.49' VersionChanged: '0.77' # Alignment of elements of a multi-line array. # # The `with_first_parameter` style aligns the following lines along the same # column as the first element. # # array = [1, 2, 3, # 4, 5, 6] # # The `with_fixed_indentation` style aligns the following lines with one # level of indentation relative to the start of the line with start of array. # # array = [1, 2, 3, # 4, 5, 6] EnforcedStyle: with_first_element SupportedStyles: - with_first_element - with_fixed_indentation # By default, the indentation width from Layout/IndentationWidth is used # But it can be overridden by setting this parameter IndentationWidth: ~ Layout/AssignmentIndentation: Description: >- Checks the indentation of the first line of the right-hand-side of a multi-line assignment. Enabled: true VersionAdded: '0.49' VersionChanged: '0.77' # By default, the indentation width from `Layout/IndentationWidth` is used # But it can be overridden by setting this parameter IndentationWidth: ~ Layout/BeginEndAlignment: Description: 'Align ends corresponding to begins correctly.' Enabled: pending VersionAdded: '0.91' # The value `start_of_line` means that `end` should be aligned the start of the line # where the `begin` keyword is. # The value `begin` means that `end` should be aligned with the `begin` keyword. EnforcedStyleAlignWith: start_of_line SupportedStylesAlignWith: - start_of_line - begin Severity: warning 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: '#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' VersionChanged: '0.83' 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 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/EmptyLineAfterMultilineCondition: Description: 'Enforces empty line after multiline condition.' # This is disabled, because this style is not very common in practice. Enabled: false VersionAdded: '0.90' Reference: - https://github.com/airbnb/ruby#multiline-if-newline 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' EnforcedStyle: around SupportedStyles: - around - only_before Reference: # A reference to `EnforcedStyle: only_before`. - https://edgeguides.rubyonrails.org/contributing_to_ruby_on_rails.html#follow-the-coding-conventions Layout/EmptyLinesAroundArguments: Description: "Keeps track of empty lines around method arguments." Enabled: true VersionAdded: '0.52' Layout/EmptyLinesAroundAttributeAccessor: Description: "Keep blank lines around attribute accessors." StyleGuide: '#empty-lines-around-attribute-accessor' Enabled: pending VersionAdded: '0.83' VersionChanged: '0.84' AllowAliasSyntax: true AllowedMethods: - alias_method - public - protected - private 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 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, allows things like 'obj.meth(arg) # comment', # rather than insisting on 'obj.meth(arg) # comment'. # If done for alignment, either this OR AllowForAlignment will allow it. AllowBeforeTrailingComments: false # When true, forces the alignment of `=` in assignments on consecutive lines. ForceEqualSignAlignment: false Layout/FirstArgumentIndentation: Description: 'Checks the indentation of the first argument in a method call.' Enabled: true VersionAdded: '0.68' VersionChanged: '0.77' 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/FirstArrayElementIndentation: Description: >- Checks the indentation of the first element in an array literal. Enabled: true VersionAdded: '0.68' VersionChanged: '0.77' # 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/FirstArrayElementLineBreak: Description: >- Checks for a line break before the first element in a multi-line array. Enabled: false VersionAdded: '0.49' Layout/FirstHashElementIndentation: Description: 'Checks the indentation of the first key in a hash literal.' Enabled: true VersionAdded: '0.68' VersionChanged: '0.77' # 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/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 definition. Enabled: true VersionAdded: '0.49' VersionChanged: '0.77' EnforcedStyle: consistent SupportedStyles: - consistent - align_parentheses # By default, the indentation width from `Layout/IndentationWidth` is used # But it can be overridden by setting this parameter IndentationWidth: ~ Layout/HashAlignment: Description: >- Align the elements of a hash literal if they span more than one line. Enabled: true AllowMultipleStyles: true VersionAdded: '0.49' VersionChanged: '0.77' # 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: table 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: table 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/HeredocArgumentClosingParenthesis: Description: >- Checks for the placement of the closing parenthesis in a method call that passes a HEREDOC string as an argument. Enabled: false StyleGuide: '#heredoc-argument-closing-parentheses' VersionAdded: '0.68' Layout/HeredocIndentation: Description: 'This cop checks the indentation of the here document bodies.' StyleGuide: '#squiggly-heredocs' Enabled: true VersionAdded: '0.49' VersionChanged: '0.85' Layout/IndentationConsistency: Description: 'Keep indentation straight.' StyleGuide: '#spaces-indentation' Enabled: true VersionAdded: '0.49' # The difference between `indented` and `normal` is that the `indented_internal_methods` # 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 - indented_internal_methods Reference: # A reference to `EnforcedStyle: indented_internal_methods`. - https://edgeguides.rubyonrails.org/contributing_to_ruby_on_rails.html#follow-the-coding-conventions Layout/IndentationStyle: Description: 'Consistent indentation either with tabs only or spaces only.' StyleGuide: '#spaces-indentation' Enabled: true VersionAdded: '0.49' VersionChanged: '0.82' # 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: ~ EnforcedStyle: spaces SupportedStyles: - spaces - tabs 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/LeadingCommentSpace: Description: 'Comments should start with a space.' StyleGuide: '#hash-space' Enabled: true VersionAdded: '0.49' VersionChanged: '0.73' AllowDoxygenCommentStyle: false AllowGemfileRubyComment: false Layout/LeadingEmptyLines: Description: Check for unnecessary blank lines at the beginning of a file. Enabled: true VersionAdded: '0.57' VersionChanged: '0.77' Layout/LineLength: Description: 'Checks that line length does not exceed the configured limit.' StyleGuide: '#max-line-length' Enabled: true VersionAdded: '0.25' VersionChanged: '0.84' AutoCorrect: false Max: 120 # 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: true # 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: [] 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/MultilineArrayLineBreaks: Description: >- Checks that each item in a multi-line array literal starts on a separate line. Enabled: false VersionAdded: '0.67' 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/MultilineHashKeyLineBreaks: Description: >- Checks that each item in a multi-line hash literal starts on a separate line. Enabled: false VersionAdded: '0.67' Layout/MultilineMethodArgumentLineBreaks: Description: >- Checks that each argument in a multi-line method call starts on a separate line. Enabled: false VersionAdded: '0.67' 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/ParameterAlignment: Description: >- Align the parameters of a method definition if they span more than one line. StyleGuide: '#no-double-indent' Enabled: true VersionAdded: '0.49' VersionChanged: '0.77' # 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. # # def method_foo(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. # # def method_foo(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/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/SpaceAroundMethodCallOperator: Description: 'Checks method call operators to not have spaces around them.' Enabled: pending VersionAdded: '0.82' 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 EnforcedStyleForExponentOperator: no_space SupportedStylesForExponentOperator: - space - no_space 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-braces' Enabled: true VersionAdded: '0.49' EnforcedStyle: no_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: true 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/TrailingEmptyLines: Description: 'Checks trailing blank lines and final newline.' StyleGuide: '#newline-eof' Enabled: true VersionAdded: '0.49' VersionChanged: '0.77' 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.83' AllowInHeredoc: true #################### 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' VersionChanged: '0.83' Lint/AmbiguousRegexpLiteral: Description: >- Checks for ambiguous regexp literals in the first argument of a method invocation without parentheses. Enabled: true VersionAdded: '0.17' VersionChanged: '0.83' 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/BinaryOperatorWithIdenticalOperands: Description: 'This cop checks for places where binary operator has identical operands.' Enabled: pending Safe: false VersionAdded: '0.89' Lint/BooleanSymbol: Description: 'Check for `:true` and `:false` symbols.' Enabled: true Safe: false VersionAdded: '0.50' VersionChanged: '0.83' 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/ConstantDefinitionInBlock: Description: 'Do not define constants within a block.' StyleGuide: '#no-constant-definition-in-block' Enabled: pending VersionAdded: '0.91' Lint/ConstantResolution: Description: 'Check that constants are fully qualified with `::`.' Enabled: false VersionAdded: '0.86' # Restrict this cop to only looking at certain names Only: [] # Restrict this cop from only looking at certain names Ignore: [] 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/DeprecatedOpenSSLConstant: Description: "Don't use algorithm constants for `OpenSSL::Cipher` and `OpenSSL::Digest`." Enabled: pending VersionAdded: '0.84' Lint/DisjunctiveAssignmentInConstructor: Description: 'In constructor, plain assignment is preferred over disjunctive.' Enabled: true Safe: false VersionAdded: '0.62' VersionChanged: '0.88' Lint/DuplicateCaseCondition: Description: 'Do not repeat values in case conditionals.' Enabled: true VersionAdded: '0.45' Lint/DuplicateElsifCondition: Description: 'Do not repeat conditions used in if `elsif`.' Enabled: 'pending' VersionAdded: '0.88' Lint/DuplicateHashKey: Description: 'Check for duplicate keys in hash literals.' Enabled: true VersionAdded: '0.34' VersionChanged: '0.77' Lint/DuplicateMethods: Description: 'Check for duplicate method definitions.' Enabled: true VersionAdded: '0.29' Lint/DuplicateRequire: Description: 'Check for duplicate `require`s and `require_relative`s.' Enabled: pending VersionAdded: '0.90' Lint/DuplicateRescueException: Description: 'Checks that there are no repeated exceptions used in `rescue` expressions.' Enabled: pending VersionAdded: '0.89' 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/EmptyConditionalBody: Description: 'This cop checks for the presence of `if`, `elsif` and `unless` branches without a body.' Enabled: 'pending' AllowComments: true VersionAdded: '0.89' Lint/EmptyEnsure: Description: 'Checks for empty ensure block.' Enabled: true VersionAdded: '0.10' VersionChanged: '0.48' Lint/EmptyExpression: Description: 'Checks for empty expressions.' Enabled: true VersionAdded: '0.45' Lint/EmptyFile: Description: 'Enforces that Ruby source files are not empty.' Enabled: pending AllowComments: true VersionAdded: '0.90' 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 AllowComments: true VersionAdded: '0.45' VersionChanged: '0.83' Lint/EnsureReturn: Description: 'Do not use return in an ensure block.' StyleGuide: '#no-return-ensure' Enabled: true VersionAdded: '0.9' VersionChanged: '0.83' Lint/ErbNewArguments: Description: 'Use `:trim_mode` and `:eoutvar` keyword arguments to `ERB.new`.' Enabled: true VersionAdded: '0.56' Lint/FlipFlop: Description: 'Checks for flip-flops.' StyleGuide: '#no-flip-flops' Enabled: true VersionAdded: '0.16' Lint/FloatComparison: Description: 'Checks for the presence of precise comparison of floating point numbers.' StyleGuide: '#float-comparison' Enabled: pending VersionAdded: '0.89' 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/HashCompareByIdentity: Description: 'Prefer using `Hash#compare_by_identity` than using `object_id` for keys.' StyleGuide: '#identity-comparison' Enabled: pending Safe: false VersionAdded: '0.93' Lint/HeredocMethodCallPosition: Description: >- Checks for the ordering of a method call where the receiver of the call is a HEREDOC. Enabled: false StyleGuide: '#heredoc-method-calls' VersionAdded: '0.68' Lint/IdentityComparison: Description: 'Prefer `equal?` over `==` when comparing `object_id`.' Enabled: pending StyleGuide: '#identity-comparison' VersionAdded: '0.91' 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 Safe: false VersionAdded: '0.50' VersionChanged: '0.87' 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' VersionChanged: '0.89' 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/MissingSuper: Description: >- This cop checks for the presence of constructors and lifecycle callbacks without calls to `super`'. Enabled: false VersionAdded: '0.89' Lint/MixedRegexpCaptureTypes: Description: 'Do not mix named captures and numbered captures in a Regexp literal.' Enabled: pending VersionAdded: '0.85' Lint/MultipleComparison: Description: "Use `&&` operator to compare multiple values." Enabled: true VersionAdded: '0.47' VersionChanged: '0.77' 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/NonDeterministicRequireOrder: Description: 'Always sort arrays returned by Dir.glob when requiring files.' Enabled: true VersionAdded: '0.78' Safe: false 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' VersionChanged: '0.70' SafeAutoCorrect: false 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/OutOfRangeRegexpRef: Description: 'Checks for out of range reference for Regexp because it always returns nil.' Enabled: pending Safe: false VersionAdded: '0.89' Lint/ParenthesesAsGroupedExpression: Description: >- Checks for method calls with a space before the opening parenthesis. StyleGuide: '#parens-no-spaces' Enabled: true VersionAdded: '0.12' VersionChanged: '0.83' Lint/PercentStringArray: Description: >- Checks for unwanted commas and quotes in %w/%W literals. Enabled: true Safe: false VersionAdded: '0.41' Lint/PercentSymbolArray: Description: >- Checks for unwanted commas and colons in %i/%I literals. Enabled: true VersionAdded: '0.41' Lint/RaiseException: Description: Checks for `raise` or `fail` statements which are raising `Exception` class. StyleGuide: '#raise-exception' Enabled: pending Safe: false VersionAdded: '0.81' VersionChanged: '0.86' AllowedImplicitNamespaces: - 'Gem' Lint/RandOne: Description: >- Checks for `rand(1)` calls. Such calls always return `0` and most likely a mistake. Enabled: true VersionAdded: '0.36' Lint/RedundantCopDisableDirective: 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.76' Lint/RedundantCopEnableDirective: Description: Checks for rubocop:enable comments that can be removed. Enabled: true VersionAdded: '0.76' Lint/RedundantRequireStatement: Description: 'Checks for unnecessary `require` statement.' Enabled: true VersionAdded: '0.76' Lint/RedundantSafeNavigation: Description: 'Checks for redundant safe navigation calls.' Enabled: pending VersionAdded: '0.93' Safe: false Lint/RedundantSplatExpansion: Description: 'Checks for splat unnecessarily being called on literals.' Enabled: true VersionAdded: '0.76' Lint/RedundantStringCoercion: Description: 'Checks for Object#to_s usage in string interpolation.' StyleGuide: '#no-to-s' Enabled: true VersionAdded: '0.19' VersionChanged: '0.77' 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' VersionChanged: '0.86' 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.77' AllowedMethods: - present? - blank? - presence - try - try! - in? 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' VersionChanged: '0.77' AllowedMethods: - present? - blank? - presence - try - try! Lint/SafeNavigationWithEmpty: Description: 'Avoid `foo&.empty?` in conditionals.' Enabled: true VersionAdded: '0.62' VersionChanged: '0.87' Lint/ScriptPermission: Description: 'Grant script file execute permission.' Enabled: true VersionAdded: '0.49' VersionChanged: '0.50' Lint/SelfAssignment: Description: 'Checks for self-assignments.' Enabled: pending VersionAdded: '0.89' Lint/SendWithMixinArgument: Description: 'Checks for `send` method when using mixin.' Enabled: true VersionAdded: '0.75' 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/StructNewOverride: Description: 'Disallow overriding the `Struct` built-in methods via `Struct.new`.' Enabled: pending VersionAdded: '0.81' Lint/SuppressedException: Description: "Don't suppress exceptions." StyleGuide: '#dont-hide-exceptions' Enabled: true AllowComments: true VersionAdded: '0.9' VersionChanged: '0.81' Lint/ToJSON: Description: 'Ensure #to_json includes an optional argument.' Enabled: true VersionAdded: '0.66' Lint/TopLevelReturnWithArgument: Description: 'This cop detects top level return statements with argument.' Enabled: 'pending' VersionAdded: '0.89' Lint/TrailingCommaInAttributeDeclaration: Description: 'This cop checks for trailing commas in attribute declarations.' Enabled: pending VersionAdded: '0.90' Lint/UnderscorePrefixedVariableName: Description: 'Do not use prefix `_` for a variable that is used.' Enabled: true VersionAdded: '0.21' AllowKeywordBlockArguments: false Lint/UnifiedInteger: Description: 'Use Integer instead of Fixnum or Bignum.' Enabled: true VersionAdded: '0.43' Lint/UnreachableCode: Description: 'Unreachable code.' Enabled: true VersionAdded: '0.9' Lint/UnreachableLoop: Description: 'This cop checks for loops that will have at most one iteration.' Enabled: pending VersionAdded: '0.89' 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.81' AllowUnusedKeywordArguments: false IgnoreEmptyMethods: true IgnoreNotImplementedMethods: 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.83' ContextCreatingMethods: [] MethodCreatingMethods: [] Lint/UselessAssignment: Description: 'Checks for useless assignment to a local variable.' StyleGuide: '#underscore-unused-vars' Enabled: true VersionAdded: '0.11' Lint/UselessElseWithoutRescue: Description: 'Checks for useless `else` in `begin..end` without `rescue`.' Enabled: true VersionAdded: '0.17' Lint/UselessMethodDefinition: Description: 'Checks for useless method definitions.' Enabled: pending VersionAdded: '0.90' Safe: false AllowComments: true Lint/UselessSetterCall: Description: 'Checks for useless setter call to a local variable.' Enabled: true VersionAdded: '0.13' VersionChanged: '0.80' Safe: false Lint/UselessTimes: Description: 'Checks for useless `Integer#times` calls.' Enabled: pending VersionAdded: '0.91' Safe: false 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 - https://en.wikipedia.org/wiki/ABC_Software_Metric Enabled: true VersionAdded: '0.27' VersionChanged: '0.81' # The ABC size is a calculated magnitude, so this number can be an Integer or # a Float. IgnoredMethods: [] Max: 22 Metrics/BlockLength: Description: 'Avoid long blocks with many lines.' Enabled: true VersionAdded: '0.44' VersionChanged: '0.87' CountComments: false # count full line comments? Max: 25 CountAsOne: [] Exclude: - '**/*.gemspec' - 'spec/**/*' 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' VersionChanged: '0.87' CountComments: false # count full line comments? Max: 200 CountAsOne: [] # 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' VersionChanged: '0.81' IgnoredMethods: [] Max: 7 Metrics/MethodLength: Description: 'Avoid methods longer than 10 lines of code.' StyleGuide: '#short-methods' Enabled: true VersionAdded: '0.25' VersionChanged: '0.87' CountComments: false # count full line comments? Max: 15 CountAsOne: [] Metrics/ModuleLength: Description: 'Avoid modules longer than 100 lines of code.' Enabled: true VersionAdded: '0.31' VersionChanged: '0.87' CountComments: false # count full line comments? Max: 100 CountAsOne: [] 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' VersionChanged: '0.81' IgnoredMethods: [] Max: 8 ################## Migration ############################# Migration/DepartmentName: Description: >- Check that cop names in rubocop:disable (etc) comments are given with department name. Enabled: true VersionAdded: '0.75' #################### 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 and constants.' StyleGuide: '#english-identifiers' Enabled: true VersionAdded: '0.50' VersionChanged: '0.87' AsciiConstants: true Naming/BinaryOperatorParameterName: Description: 'When defining binary operators, name the argument other.' StyleGuide: '#other-arg' Enabled: true VersionAdded: '0.50' Naming/BlockParameterName: 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' VersionChanged: '0.77' # Parameter names may be equal to or greater than this value MinNameLength: 1 AllowNamesEndingInNumbers: true # Allowed names that will not register an offense AllowedNames: [] # Forbidden names that will register an offense ForbiddenNames: [] Naming/ClassAndModuleCamelCase: Description: 'Use CamelCase for classes and modules.' StyleGuide: '#camelcase-classes' Enabled: true VersionAdded: '0.50' VersionChanged: '0.85' # Allowed class/module names can be specified here. # These can be full or part of the name. AllowedNames: - module_parent 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 # When `false`, changes the behavior of ExpectMatchingDefinition to match only # whether each source file's class or module name matches the file name -- # not whether the nested module hierarchy matches the subdirectory path. CheckDefinitionPathHierarchy: true # 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' ForbiddenDelimiters: - !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 # Method names matching patterns are always allowed. # # IgnoredPatterns: # - '\A\s*onSelectionBulkChange\s*' # - '\A\s*onSelectionCleared\s*' # IgnoredPatterns: [] Naming/MethodParameterName: 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.77' # Parameter names may be equal to or greater than this value MinNameLength: 3 AllowNamesEndingInNumbers: true # Allowed names that will not register an offense AllowedNames: - at - by - db - id - in - io - ip - of - 'on' - os - pp - to # Forbidden names that will register an offense ForbiddenNames: [] Naming/PredicateName: Description: 'Check the names of predicate methods.' StyleGuide: '#bool-methods-qmark' Enabled: true VersionAdded: '0.50' VersionChanged: '0.77' # Predicate name prefixes. NamePrefix: - is_ - has_ - have_ # Predicate name prefixes that should be removed. ForbiddenPrefixes: - is_ - has_ - have_ # Predicate names which, despite having a forbidden prefix, or no `?`, # should still be accepted AllowedMethods: - 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/RescuedExceptionsVariableName: Description: 'Use consistent rescued exceptions variables naming.' Enabled: true VersionAdded: '0.67' VersionChanged: '0.68' PreferredName: e 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 #################### Security ############################## Security/Eval: Description: 'The use of eval represents a serious security risk.' Enabled: true VersionAdded: '0.47' Security/JSONLoad: Description: >- Prefer usage of `JSON.parse` over `JSON.load` due to potential security issues. See reference for more information. Reference: 'https://ruby-doc.org/stdlib-2.7.0/libdoc/json/rdoc/JSON.html#method-i-load' Enabled: true VersionAdded: '0.43' VersionChanged: '0.44' # Autocorrect here will change to a method that may cause crashes depending # on the value of the argument. AutoCorrect: false SafeAutoCorrect: false Security/MarshalLoad: Description: >- Avoid using of `Marshal.load` or `Marshal.restore` due to potential security issues. See reference for more information. Reference: 'https://ruby-doc.org/core-2.7.0/Marshal.html#module-Marshal-label-Security+considerations' Enabled: true VersionAdded: '0.47' Security/Open: Description: 'The use of Kernel#open represents a serious security risk.' Enabled: true VersionAdded: '0.53' Safe: false Security/YAMLLoad: Description: >- Prefer usage of `YAML.safe_load` over `YAML.load` due to potential security issues. See reference for more information. Reference: 'https://ruby-doc.org/stdlib-2.7.0/libdoc/yaml/rdoc/YAML.html#module-YAML-label-Security' Enabled: true VersionAdded: '0.47' SafeAutoCorrect: false #################### Style ############################### Style/AccessModifierDeclarations: Description: 'Checks style of how access modifiers are used.' Enabled: true VersionAdded: '0.57' VersionChanged: '0.81' EnforcedStyle: group SupportedStyles: - inline - group AllowModifiersOnSymbols: true Style/AccessorGrouping: Description: 'Checks for grouping of accessors in `class` and `module` bodies.' Enabled: 'pending' VersionAdded: '0.87' EnforcedStyle: grouped SupportedStyles: # separated: each accessor goes in a separate statement. # grouped: accessors are grouped into a single statement. - separated - grouped Style/Alias: Description: 'Use alias instead of alias_method.' StyleGuide: '#alias-method-lexically' 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: true VersionAdded: '0.9' VersionChanged: '0.25' # Whether `and` and `or` are banned only in conditionals (conditionals) # or completely (always). EnforcedStyle: conditionals SupportedStyles: - always - conditionals Style/ArrayCoercion: Description: >- Use Array() instead of explicit Array check or [*var], when dealing with a variable you want to treat as an Array, but you're not certain it's an array. StyleGuide: '#array-coercion' Safe: false Enabled: false VersionAdded: '0.88' 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: false 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/BisectedAttrAccessor: Description: >- Checks for places where `attr_reader` and `attr_writer` for the same method can be combined into single `attr_accessor`. Enabled: 'pending' VersionAdded: '0.87' 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 # multi-line procedural blocks, where the primary purpose of the block is # its side-effects. Single-line procedural blocks may only use do-end, # unless AllowBracesOnProceduralOneLiners has a truthy value (see below). # # 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 # The `always_braces` style always enforces braces. - always_braces 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 # The AllowBracesOnProceduralOneLiners option is ignored unless the # EnforcedStyle is set to `semantic`. If so: # # If AllowBracesOnProceduralOneLiners is unspecified, or set to any # falsey value, then semantic purity is maintained, so one-line # procedural blocks must use do-end, not braces. # # # bad # collection.each { |element| puts element } # # # good # collection.each do |element| puts element end # # If AllowBracesOnProceduralOneLiners is set to any truthy value, # then one-line procedural blocks may use either style. # # # good # collection.each { |element| puts element } # # # also good # collection.each do |element| puts element end AllowBracesOnProceduralOneLiners: false # The BracesRequiredMethods overrides all other configurations except # IgnoredMethods. It can be used to enforce that all blocks for specific # methods use braces. For example, you can use this to enforce Sorbet # signatures use braces even when the rest of your codebase enforces # the `line_count_based` style. BracesRequiredMethods: [] Style/CaseEquality: Description: 'Avoid explicit use of the case equality operator(===).' StyleGuide: '#no-case-equality' Enabled: true VersionAdded: '0.9' VersionChanged: '0.89' # If AllowOnConstant is enabled, the cop will ignore violations when the receiver of # the case equality operator is a constant. # # # bad # /string/ === "string" # # # good # String === "string" AllowOnConstant: false Style/CaseLikeIf: Description: 'This cop identifies places where `if-elsif` constructions can be replaced with `case-when`.' StyleGuide: '#case-vs-if-else' Enabled: 'pending' Safe: false VersionAdded: '0.88' 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 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?`.' StyleGuide: '#is-a-vs-kind-of' Enabled: true VersionAdded: '0.24' EnforcedStyle: is_a? SupportedStyles: - is_a? - kind_of? Style/ClassEqualityComparison: Description: 'Enforces the use of `Object#instance_of?` instead of class comparison for equality.' StyleGuide: '#instance-of-vs-class-comparison' Enabled: pending VersionAdded: '0.93' IgnoredMethods: - == - equal? - eql? Style/ClassMethods: Description: 'Use self when defining module/class methods.' StyleGuide: '#def-self-class-methods' Enabled: true VersionAdded: '0.9' VersionChanged: '0.20' Style/ClassMethodsDefinitions: Description: 'Enforces using `def self.method_name` or `class << self` to define class methods.' StyleGuide: '#def-self-class-methods' Enabled: false VersionAdded: '0.89' EnforcedStyle: def_self SupportedStyles: - def_self - self_class 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-include-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' member?: 'include?' 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/CombinableLoops: Description: >- Checks for places where multiple consecutive loops over the same data can be combined into a single loop. Enabled: pending Safe: false VersionAdded: '0.90' 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: false 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 Style/ConstantVisibility: Description: >- Check that class- and module constants have visibility declarations. Enabled: false VersionAdded: '0.66' # 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.92' SafeAutoCorrect: false 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/DisableCopsWithinSourceCodeDirective: Description: >- Forbids disabling/enabling cops within source code. Enabled: false VersionAdded: '0.82' 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/DocumentDynamicEvalDefinition: Enabled: false Style/DoubleCopDisableDirective: Description: 'Checks for double rubocop:disable comments on a single line.' Enabled: true VersionAdded: '0.73' Style/DoubleNegation: Description: 'Checks for uses of double negation (!!).' StyleGuide: '#no-bang-bang' Enabled: true VersionAdded: '0.19' VersionChanged: '0.84' EnforcedStyle: allowed_in_returns SafeAutoCorrect: false SupportedStyles: - allowed_in_returns - forbidden 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: false 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' VersionChanged: '0.81' 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' Style/ExplicitBlockArgument: Description: >- Consider using explicit block argument to avoid writing block literal that just passes its arguments to another block. StyleGuide: '#block-argument' Enabled: pending VersionAdded: '0.89' Style/ExponentialNotation: Description: 'When using exponential notation, favor a mantissa between 1 (inclusive) and 10 (exclusive).' StyleGuide: '#exponential-notation' Enabled: pending VersionAdded: '0.82' EnforcedStyle: scientific SupportedStyles: - scientific - engineering - integral Style/FloatDivision: Description: 'For performing float division, coerce one side only.' StyleGuide: '#float-division' Reference: 'https://github.com/rubocop-hq/ruby-style-guide/issues/628' Enabled: true VersionAdded: '0.72' EnforcedStyle: single_coerce SupportedStyles: - left_coerce - right_coerce - single_coerce - fdiv 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 # `%s`, `%d`, `%f` - annotated # Prefer simple looking "template" style tokens like `%{name}`, `%{age}` - template - unannotated VersionAdded: '0.49' VersionChanged: '0.75' Style/FrozenStringLiteralComment: Description: >- Add the frozen_string_literal comment to the top of files to help transition to frozen string literals by default. Enabled: true VersionAdded: '0.36' VersionChanged: '0.79' EnforcedStyle: always SupportedStyles: # `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. It is possible that this will create errors. - always # `always_true` will add the frozen string literal comment to a file, # similarly to the `always` style, but will also change any disabled # comments (e.g. `# frozen_string_literal: false`) to be enabled. - always_true # `never` will enforce that the frozen string literal comment does not # exist in a file. - never SafeAutoCorrect: true Style/GlobalStdStream: Description: 'Enforces the use of `$stdout/$stderr/$stdin` instead of `STDOUT/STDERR/STDIN`.' StyleGuide: '#global-stdout' Enabled: pending VersionAdded: '0.89' SafeAutoCorrect: false 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/HashAsLastArrayItem: Description: >- Checks for presence or absence of braces around hash literal as a last array item depending on configuration. StyleGuide: '#hash-literal-as-last-array-item' Enabled: 'pending' VersionAdded: '0.88' EnforcedStyle: braces SupportedStyles: - braces - no_braces Style/HashEachMethods: Description: 'Use Hash#each_key and Hash#each_value.' StyleGuide: '#hash-each' Enabled: pending VersionAdded: '0.80' Safe: false Style/HashLikeCase: Description: >- Checks for places where `case-when` represents a simple 1:1 mapping and can be replaced with a hash lookup. Enabled: 'pending' VersionAdded: '0.88' # `MinBranchesCount` defines the number of branches `case` needs to have # to trigger this cop MinBranchesCount: 3 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/HashTransformKeys: Description: 'Prefer `transform_keys` over `each_with_object`, `map`, or `to_h`.' Enabled: 'pending' VersionAdded: '0.80' VersionChanged: '0.90' Safe: false Style/HashTransformValues: Description: 'Prefer `transform_values` over `each_with_object`, `map`, or `to_h`.' Enabled: 'pending' VersionAdded: '0.80' VersionChanged: '0.90' Safe: 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 AllowIfModifier: false 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' VersionChanged: '0.87' Style/IfWithSemicolon: Description: 'Do not use if x; .... Use the ternary operator instead.' StyleGuide: '#no-semicolon-ifs' Enabled: true VersionAdded: '0.9' VersionChanged: '0.83' 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' 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' VersionChanged: '0.91' # Allow addresses to be permitted AllowedAddresses: - "::" # :: is a valid IPv6 address, but could potentially be legitimately in code Exclude: - '**/*.gemfile' - '**/Gemfile' - '**/gems.rb' - '**/*.gemspec' Style/KeywordParametersOrder: Description: 'Enforces that optional keyword parameters are placed at the end of the parameters list.' StyleGuide: '#keyword-parameters-order' Enabled: pending VersionAdded: '0.90' 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' 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 SafeAutoCorrect: false VersionAdded: '0.18' VersionChanged: '0.64' 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: [] IgnoredPatterns: [] IncludedMacros: [] AllowParenthesesInMultilineCall: false AllowParenthesesInChaining: false AllowParenthesesInCamelCaseMethod: 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/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.65' EnforcedStyle: module_function SupportedStyles: - module_function - extend_self - forbidden Autocorrect: false SafeAutoCorrect: false 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' VersionChanged: '0.86' Style/MultilineWhenThen: Description: 'Do not use then for multi-line when statement.' StyleGuide: '#no-then' Enabled: true VersionAdded: '0.73' 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' VersionChanged: '0.65' EnforcedStyle: literals SupportedStyles: # literals: freeze literals assigned to constants # strict: freeze all constants # Strict mode is considered an experimental feature. It has not been updated # with an exhaustive list of all methods that will produce frozen objects so # there is a decent chance of getting some false positives. Luckily, there is # no harm in freezing an already frozen object. - literals - strict 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/NegatedUnless: Description: 'Favor if over unless for negative conditions.' StyleGuide: '#if-for-negatives' Enabled: true VersionAdded: '0.69' EnforcedStyle: both SupportedStyles: # both: prefix and postfix negated `unless` should both use `if` # prefix: only use `if` for negated `unless` statements positioned before the body of the statement # postfix: only use `if` for negated `unless` 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.77' AllowedMethods: - 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' VersionChanged: '0.86' 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 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 (?:) or multi-line constructs over single-line if/then/else/end constructs. StyleGuide: '#ternary-operator' Enabled: true AlwaysCorrectToMultiline: false VersionAdded: '0.9' VersionChanged: '0.90' 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 Safe: false VersionAdded: '0.33' VersionChanged: '0.83' Style/OptionalBooleanParameter: Description: 'Use keyword arguments when defining method with boolean argument.' StyleGuide: '#boolean-keyword-arguments' Enabled: pending Safe: false VersionAdded: '0.89' AllowedMethods: - respond_to_missing? 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 Safe: false VersionAdded: '0.41' VersionChanged: '0.70' 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/RedundantAssignment: Description: 'Checks for redundant assignment before returning.' Enabled: 'pending' VersionAdded: '0.87' 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/RedundantCapitalW: Description: 'Checks for %W when interpolation is not needed.' Enabled: true VersionAdded: '0.76' Style/RedundantCondition: Description: 'Checks for unnecessary conditional expressions.' Enabled: true VersionAdded: '0.76' 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/RedundantFetchBlock: Description: >- Use `fetch(key, value)` instead of `fetch(key) { value }` when value has Numeric, Rational, Complex, Symbol or String type, `false`, `true`, `nil` or is a constant. Reference: 'https://github.com/JuanitoFatas/fast-ruby#hashfetch-with-argument-vs-hashfetch--block-code' Enabled: 'pending' Safe: false # If enabled, this cop will autocorrect usages of # `fetch` being called with block returning a constant. # This can be dangerous since constants will not be defined at that moment. SafeForConstants: false VersionAdded: '0.86' Style/RedundantFileExtensionInRequire: Description: >- Checks for the presence of superfluous `.rb` extension in the filename provided to `require` and `require_relative`. StyleGuide: '#no-explicit-rb-to-require' Enabled: 'pending' VersionAdded: '0.88' Style/RedundantFreeze: Description: "Checks usages of Object#freeze on immutable objects." Enabled: true VersionAdded: '0.34' VersionChanged: '0.66' Style/RedundantInterpolation: Description: 'Checks for strings that are just an interpolated expression.' Enabled: true VersionAdded: '0.76' Style/RedundantParentheses: Description: "Checks for parentheses that seem not to serve any purpose." Enabled: true VersionAdded: '0.36' Style/RedundantPercentQ: Description: 'Checks for %q/%Q when single quotes or double quotes would do.' StyleGuide: '#percent-q' Enabled: true VersionAdded: '0.76' Style/RedundantRegexpCharacterClass: Description: 'Checks for unnecessary single-element Regexp character classes.' Enabled: pending VersionAdded: '0.85' Style/RedundantRegexpEscape: Description: 'Checks for redundant escapes in Regexps.' Enabled: pending VersionAdded: '0.85' 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/RedundantSelfAssignment: Description: 'Checks for places where redundant assignments are made for in place modification methods.' Enabled: pending Safe: false VersionAdded: '0.90' Style/RedundantSort: Description: >- Use `min` instead of `sort.first`, `max_by` instead of `sort_by...last`, etc. Enabled: true VersionAdded: '0.76' Style/RedundantSortBy: Description: 'Use `sort` instead of `sort_by { |x| x }`.' Enabled: true VersionAdded: '0.36' 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: false 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 (`&.`). Auto-correction is unsafe as it assumes the object will be `nil` or truthy, but never `false`. Enabled: true VersionAdded: '0.43' VersionChanged: '0.77' # Safe navigation may cause a statement to start returning `nil` in addition # to whatever it used to return. ConvertCodeThatCanStartToReturnNil: false AllowedMethods: - present? - blank? - presence - try - try! SafeAutoCorrect: false Style/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' 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/SingleArgumentDig: Description: 'Avoid using single argument dig method.' Enabled: pending VersionAdded: '0.89' Safe: false 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/SlicingWithRange: Description: 'Checks array slicing is done with endless ranges when suitable.' Enabled: pending VersionAdded: '0.83' Safe: false Style/SoleNestedConditional: Description: >- Finds sole nested conditional nodes which can be merged into outer conditional node. Enabled: pending VersionAdded: '0.89' AllowModifier: false 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/StringConcatenation: Description: 'Checks for places where string concatenation can be replaced with string interpolation.' StyleGuide: '#string-interpolation' Enabled: pending Safe: false VersionAdded: '0.89' Style/StringHashKeys: Description: 'Prefer symbols instead of strings as hash keys.' StyleGuide: '#symbols-as-keys' Enabled: false VersionAdded: '0.52' VersionChanged: '0.75' Safe: false 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: double_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/Strip: Description: 'Use `strip` instead of `lstrip.rstrip`.' Enabled: true VersionAdded: '0.36' Style/StructInheritance: Description: 'Checks for inheritance from Struct.new.' StyleGuide: '#no-extend-struct-new' Enabled: true VersionAdded: '0.29' VersionChanged: '0.86' Style/SymbolArray: Description: 'Use %i or %I for arrays of symbols.' StyleGuide: '#percent-i' Enabled: false 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 Safe: false VersionAdded: '0.26' VersionChanged: '0.64' # 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' # If `comma`, the cop requires a comma after the last item in an array, # 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, multiline array literals. EnforcedStyleForMultiline: no_comma SupportedStylesForMultiline: - comma - consistent_comma - no_comma Style/TrailingCommaInBlockArgs: Description: 'Checks for useless trailing commas in block arguments.' Enabled: false Safe: false VersionAdded: '0.81' 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, multiline 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.77' # 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 AllowedMethods: - 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/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}|\p{Word}-\p{Word}|\n|\t)+\z/' Style/YodaCondition: Description: 'Forbid or enforce yoda conditions.' Reference: 'https://en.wikipedia.org/wiki/Yoda_conditions' Enabled: true EnforcedStyle: forbid_for_all_comparison_operators SupportedStyles: # check all comparison operators - forbid_for_all_comparison_operators # check only equality operators: `!=` and `==` - forbid_for_equality_operators_only # enforce yoda for all comparison operators - require_for_all_comparison_operators # enforce yoda only for equality operators: `!=` and `==` - require_for_equality_operators_only Safe: false VersionAdded: '0.49' VersionChanged: '0.75' Style/ZeroLengthPredicate: Description: 'Use #empty? when testing for objects of length 0.' Enabled: true Safe: false VersionAdded: '0.37' VersionChanged: '0.39' babosa-2.0.0/Changelog.md000066400000000000000000000045601410162247400151570ustar00rootroot00000000000000# Babosa Changelog ## 2.0.0 This release contains no important changes. I had a week off from work and decided to refactor the code. However there are some small breaking changes so I have released it as 2.0.0. * Refactor internals for simplicity * Use built-in Ruby UTF-8 support in places of other gems. * Drop support for Ruby < 2.5.0. * `Babosa::Identifier#word_chars` no longer removes dashes * `Babosa::Identifier#to_ruby_method` default argument `allow_bangs` is now a keyword argument ## 1.0.4 * Fix nil being cast to frozen string (https://github.com/norman/babosa/pull/52) ## 1.0.3 * Fix Active Support 6 deprecations (https://github.com/norman/babosa/pull/50) ## 1.0.2 * Fix regression in ActiveSupport UTF8 proxy. ## 1.0.1 * Fix error with tidy_bytes on Rubinius. * Simplify Active Support UTF8 proxy. * Fix `allow_bangs` argument to to_ruby_method being silently ignored. * Raise error when generating an impossible Ruby method name. ## 1.0.0 * Adopt semantic versioning. * When using Active Support, require 3.2 or greater. * Require Ruby 2.0 or greater. * Fix Ruby warnings. * Improve support for Ukrainian. * Support some additional punctuation characters used by Chinese and others. * Add Polish spec. * Use native Unicode normalization on Ruby 2.2 in UTF8::DumbProxy. * Invoke Ruby-native upcase/downcase in UTF8::DumbProxy. * Proxy `tidy_bytes` method to Active Support when possible. * Remove SlugString constant. ## 0.3.11 * Add support for Vietnamese. ## 0.3.10 * Fix Macedonian "S/S". Don't `include JRuby` unnecessarily. ## 0.3.9 * Add missing Greek vowels with diaeresis. ## 0.3.8 * Correct and improve Macedonian support. ## 0.3.7 * Fix compatibility with Ruby 1.8.7. * Add Swedish support. ## 0.3.6 * Allow multiple transliterators. * Add Greek support. ## 0.3.5 * Don't strip underscores from identifiers. ## 0.3.4 * Add Romanian support. ## 0.3.3 * Add Norwegian support. ## 0.3.2 * Improve Macedonian support. ## 0.3.1 * Small fixes to Cyrillic. ## 0.3.0 * Cyrillic support. * Improve support for various Unicode spaces and dashes. ## 0.2.2 * Fix for "smart" quote handling. ## 0.2.1 * Implement #empty? for compatiblity with Active Support's #blank?. ## 0.2.0 * Add support for Danish. * Add method to generate Ruby identifiers. * Improve performance. ## 0.1.1 * Add support for Serbian. ## 0.1.0 * Initial extraction from FriendlyId. babosa-2.0.0/Gemfile000066400000000000000000000003661410162247400142410ustar00rootroot00000000000000# frozen_string_literal: true # Note that the Gemfile is here so you can run the coverage Rake task, and # easily install gems. However, Babosa does not use Bundler internally. source "https://rubygems.org" gemspec gem "racc", platform: :jruby babosa-2.0.0/MIT-LICENSE000066400000000000000000000020411410162247400143720ustar00rootroot00000000000000Copyright (c) 2010 Norman Clarke Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. babosa-2.0.0/README.md000066400000000000000000000160271410162247400142260ustar00rootroot00000000000000# Babosa [![Build Status](https://github.com/norman/babosa/actions/workflows/main.yml/badge.svg)](https://github.com/norman/babosa/actions) Babosa is a library for creating human-friendly identifiers, aka "slugs". It can also be useful for normalizing and sanitizing data. It is an extraction and improvement of the string code from [FriendlyId](http://github.com/norman/friendly_id). I have released this as a separate library to help developers who want to create libraries similar to FriendlyId. ## Features / Usage ### Transliterate UTF-8 characters to ASCII ```ruby "Gölcük, Turkey".to_slug.transliterate.to_s #=> "Golcuk, Turkey" ``` ### Locale sensitive transliteration, with support for many languages ```ruby "Jürgen Müller".to_slug.transliterate.to_s #=> "Jurgen Muller" "Jürgen Müller".to_slug.transliterate(:german).to_s #=> "Juergen Mueller" ``` Currently supported languages include: * Bulgarian * Danish * German * Greek * Hindi * Macedonian * Norwegian * Romanian * Russian * Serbian * Spanish * Swedish * Turkish * Ukrainian * Vietnamese Additionally there are generic transliterators for transliterating from the Cyrillic alphabet and Latin alphabet with diacritics. The Latin transliterator can be used, for example, with Czech. There is also a transliterator named "Hindi" which may be sufficient for other Indic languages using Devanagari, but I do not know enough to say whether the transliterations would make sense. I'll gladly accept contributions from fluent speakers to support more languages. ### Strip non-ASCII characters ```ruby "Gölcük, Turkey".to_slug.to_ascii.to_s #=> "Glck, Turkey" ``` ### Truncate by characters ```ruby "üüü".to_slug.truncate(2).to_s #=> "üü" ``` ### Truncate by bytes This can be useful to ensure the generated slug will fit in a database column whose length is limited by bytes rather than UTF-8 characters. ```ruby "üüü".to_slug.truncate_bytes(2).to_s #=> "ü" ``` ### Remove punctuation chars ```ruby "this is, um, **really** cool, huh?".to_slug.word_chars.to_s #=> "this is um really cool huh" ``` ### All-in-one ```ruby "Gölcük, Turkey".to_slug.normalize.to_s #=> "golcuk-turkey" ``` ### Other stuff #### Using Babosa With FriendlyId 4+ ```ruby require "babosa" class Person < ActiveRecord::Base friendly_id :name, use: :slugged def normalize_friendly_id(input) input.to_s.to_slug.normalize(transliterations: :russian).to_s end end ``` #### UTF-8 support Babosa normalizes all input strings [to NFC](https://en.wikipedia.org/wiki/Unicode_equivalence#Normal_forms). #### Ruby Method Names Babosa can generate strings for Ruby method names. (Yes, Ruby 1.9+ can use UTF-8 chars in method names, but you may not want to): ```ruby "this is a method".to_slug.to_ruby_method! #=> this_is_a_method "über cool stuff!".to_slug.to_ruby_method! #=> uber_cool_stuff! # You can also disallow trailing punctuation chars "über cool stuff!".to_slug.to_ruby_method(allow_bangs: false) #=> uber_cool_stuff ``` #### Easy to Extend You can add custom transliterators for your language with very little code. For example here's the transliterator for German: ```ruby module Babosa module Transliterator class German < Latin APPROXIMATIONS = { "ä" => "ae", "ö" => "oe", "ü" => "ue", "Ä" => "Ae", "Ö" => "Oe", "Ü" => "Ue" } end end end ``` And a spec (you can use this as a template): ```ruby require "spec_helper" describe Babosa::Transliterator::German do let(:t) { described_class.instance } it_behaves_like "a latin transliterator" it "should transliterate Eszett" do t.transliterate("ß").should eql("ss") end it "should transliterate vowels with umlauts" do t.transliterate("üöä").should eql("ueoeae") end end ``` ### Rails 3.x and higher Some of Babosa's functionality was added to Active Support 3.0.0. Babosa now differs from ActiveSupport primarily in that it supports non-Latin strings by default, and has per-locale ASCII transliterations already baked-in. If you are considering using Babosa with Rails, you may want to first take a look at Active Support's [transliterate](http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-transliterate) and [parameterize](http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-parameterize) to see if they suit your needs. Please see the [API docs](http://rubydoc.info/github/norman/babosa/master/frames) and source code for more info. ## Getting it Babosa can be installed via Rubygems: gem install babosa You can get the source code from its [Github repository](http://github.com/norman/babosa). ## Reporting bugs Please use Babosa's [Github issue tracker](http://github.com/norman/babosa/issues). ## Misc "Babosa" means "slug" in Spanish. ## Author [Norman Clarke](http://njclarke.com) ## Contributors Many thanks to the following people for their help: * [Dmitry A. Ilyashevich](https://github.com/dmitry-ilyashevich) - Deprecation fixes * [anhkind](https://github.com/anhkind) - Vietnamese support * [Martins Zakis](https://github.com/martins) - Bug fixes * [Vassilis Rodokanakis](https://github.com/vrodokanakis) - Greek support * [Peco Danajlovski](https://github.com/Vortex) - Macedonian support * [Philip Arndt](https://github.com/parndt) - Bug fixes * [Jonas Forsberg](https://github.com/himynameisjonas) - Swedish support * [Jaroslav Kalistsuk](https://github.com/jarosan) - Greek support * [Steven Heidel](https://github.com/stevenheidel) - Bug fixes * [Edgars Beigarts](https://github.com/ebeigarts) - Support for multiple transliterators * [Tiberiu C. Turbureanu](https://gitorious.org/~tct) - Romanian support * [Kim Joar Bekkelund](https://github.com/kjbekkelund) - Norwegian support * [Alexey Shkolnikov](https://github.com/grlm) - Russian support * [Martin Petrov](https://github.com/martin-petrov) - Bulgarian support * [Molte Emil Strange Andersen](https://github.com/molte) - Danish support * [Milan Dobrota](https://github.com/milandobrota) - Serbian support ## Copyright Copyright (c) 2010-2020 Norman Clarke Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. babosa-2.0.0/Rakefile000066400000000000000000000012211410162247400144020ustar00rootroot00000000000000# frozen_string_literal: true require "rubygems" require "rake/testtask" require "rake/clean" require "rubygems/package_task" require "rubocop/rake_task" task default: [:rubocop, :spec] task test: :spec CLEAN << "pkg" << "doc" << "coverage" << ".yardoc" begin require "yard" YARD::Rake::YardocTask.new do |t| t.options = ["--output-dir=doc"] end rescue LoadError puts "Yard not present" end begin desc "Run SimpleCov" task :coverage do ENV["COV"] = "true" Rake::Task["spec"].execute end rescue LoadError puts "SimpleCov not present" end require "rspec/core/rake_task" RSpec::Core::RakeTask.new(:spec) RuboCop::RakeTask.new babosa-2.0.0/babosa.gemspec000066400000000000000000000025011410162247400155330ustar00rootroot00000000000000# frozen_string_literal: true require_relative "lib/babosa/version" Gem::Specification.new do |s| s.name = "babosa" s.version = Babosa::Version::STRING s.author = "Norman Clarke" s.email = "norman@njclarke.com" s.homepage = "http://github.com/norman/babosa" s.required_ruby_version = ">= 2.5.0" s.license = "MIT" s.summary = "A library for creating slugs." s.description = <<-TEXT A library for creating slugs. Babosa an extraction and improvement of the string code from FriendlyId, intended to help developers create similar libraries or plugins. TEXT s.test_files = Dir.glob "test/**/*_test.rb" s.files = Dir["lib/**/*.rb", "lib/**/*.rake", "*.md", "MIT-LICENSE", "Rakefile", "init.rb", "generators/**/*.*", "spec/**/*.*", ".gemtest"] s.add_development_dependency "rake" s.add_development_dependency "rspec", ">= 3.7.0" s.add_development_dependency "rubocop", ">= 0.93.0" s.add_development_dependency "simplecov" s.cert_chain = [File.expand_path("certs/parndt.pem", __dir__)] if $PROGRAM_NAME.end_with?("gem") && ARGV.include?("build") && ARGV.include?(__FILE__) s.signing_key = File.expand_path("~/.ssh/gem-private_key.pem") end end babosa-2.0.0/bench.rb000066400000000000000000000011451410162247400143460ustar00rootroot00000000000000# frozen_string_literal: true require "benchmark" require "rubygems" require "bundler/setup" require "babosa" def sample "Ja, żołnierz Wojska Polskiego, przysięgam służyć wiernie Rzeczypospolitej Polskiej".to_slug end N = 1000 Benchmark.bmbm do |x| x.report "Truncate bytes" do N.times do sample.truncate_bytes(20) end end x.report "Truncate chars" do N.times do sample.truncate(20) end end x.report "Transliterate" do N.times do sample.transliterate end end x.report "Strip non-ASCII" do N.times do sample.to_ascii end end end babosa-2.0.0/certs/000077500000000000000000000000001410162247400140615ustar00rootroot00000000000000babosa-2.0.0/certs/parndt.pem000066400000000000000000000027551410162247400160650ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIEMjCCApqgAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMSEwHwYDVQQDDBhnZW1z L0RDPXAvREM9YXJuZHQvREM9aW8wHhcNMjEwNjIzMDkyNzU2WhcNMjIwNjIzMDky NzU2WjAjMSEwHwYDVQQDDBhnZW1zL0RDPXAvREM9YXJuZHQvREM9aW8wggGiMA0G CSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQD0CYnD37uLlJ3Urla2EnnUQ8S6s16k AGMpAzpmARo8YwSqtYMJVGyBzUeI7y93Fk9ncswhIFSH/hnh/Ouat/ki9flHlZ+w anv0M+9v3wCLyZSC5BQIWpoduFM/fuvLoDUJDWxL50RjwMS0qo2x2LvfQdHN8gn3 JdSIV5WLJKIvlmIl9S3pw0JO5KRUGn1PcBO7C0S0SlbhVjRHtlao1ycWUULsX109 hCh39MPGtnZpdCcxheh0TH/UA/jV0/du9/rQdoidkNHkaC24pPfBJ3nS+rAbWaHP WmP+0rjfk/XnGBu/HZpKvlnwQjP3QdK4UMtWl8zewqFMNcIiBRALQugnL/SfrP/4 CSlha9LwkiE6ByeY4WGnNjNqpi5J3IzjEkZRAxG7u9gCB3FzTaBTyXZYI6jplYNw TcCJIBHuoPaa+m9brpjb3Uv94nfM97ZP+OmpGYCCAMq4TT7OOV+t8wJc0w8bb0FO ROhmVNTxrBaNcl6MkZn88EMRCsGgoWklOG0CAwEAAaNxMG8wCQYDVR0TBAIwADAL BgNVHQ8EBAMCBLAwHQYDVR0OBBYEFGu7pbmeILyHnBmannuaNRfdN8MsMBoGA1Ud EQQTMBGBD2dlbXNAcC5hcm5kdC5pbzAaBgNVHRIEEzARgQ9nZW1zQHAuYXJuZHQu aW8wDQYJKoZIhvcNAQELBQADggGBANlxc4uAnkPC3zbztG7uZfBfn4HSuvv655Pa UaYZ6hNETFrqg78mGs3PkFe2Ru7cVWwckbmH46aq50QoNnx4ClxT03vr03n76Jg1 8WWHkf0+rcINFlbtIFcmcFrois5Ow3n7pH+xstDtzoWcbh41WwuZStNhrIYsnjAK /ovz8D5JlboxceOpVLB/0NiqNEWltK+EMQHmX25Sqf/r5o5rAL9zwEKPFp1Y5X+z t2jBjYt2ymr1eMWxux6e+N2uKZL4MblHawxvKlI8UHsIiV9xrc4BwlwlbitcvNIL ZykdSlpTJd0Guy92iYjCJMC09tMRUNxiVBwD3jRGSeW9YAPIZGXIcVlm6srIRDjJ o8wB6oOvHAkRXnntOo/4bBDH+ehmgvhh/O/mI+au6C0M430fv+ooH0w08LEXLx1k e17ZNASZffbQRP09MH2GZ2AOlkildTX6looWRforZEZi+qamognrozd3MI5QHi1W UAZUzHLrrFu7gnkFvLVpxOUf4ItOkA== -----END CERTIFICATE----- babosa-2.0.0/lib/000077500000000000000000000000001410162247400135075ustar00rootroot00000000000000babosa-2.0.0/lib/babosa.rb000066400000000000000000000003351410162247400152640ustar00rootroot00000000000000# frozen_string_literal: true module Babosa end class String def to_identifier Babosa::Identifier.new self end alias to_slug to_identifier end require "babosa/transliterator/base" require "babosa/identifier" babosa-2.0.0/lib/babosa/000077500000000000000000000000001410162247400147365ustar00rootroot00000000000000babosa-2.0.0/lib/babosa/identifier.rb000066400000000000000000000203001410162247400174000ustar00rootroot00000000000000# frozen_string_literal: true module Babosa # This class provides some string-manipulation methods specific to slugs. # # Note that this class includes many "bang methods" such as {#clean!} and # {#normalize!} that perform actions on the string in-place. Each of these # methods has a corresponding "bangless" method (i.e., +Identifier#clean!+ # and +Identifier#clean+) which does not appear in the documentation because # it is generated dynamically. # # All of the bang methods return an instance of String, while the bangless # versions return an instance of {Babosa::Identifier}, so that calls to methods # specific to this class can be chained: # # string = Identifier.new("hello world") # string.with_separators! # => "hello-world" # string.with_separators # => # # @see http://www.utf8-chartable.de/unicode-utf8-table.pl?utf8=dec Unicode character table class Identifier Error = Class.new(StandardError) attr_reader :wrapped_string alias to_s wrapped_string def method_missing(symbol, *args, &block) @wrapped_string.__send__(symbol, *args, &block) end def respond_to_missing?(name, include_all) @wrapped_string.respond_to?(name, include_all) end # @param string [#to_s] The string to use as the basis of the Identifier. def initialize(string) @wrapped_string = string.to_s.dup tidy_bytes! normalize_utf8! end def ==(other) to_s == other.to_s end def eql?(other) self == other end # Approximate an ASCII string. This works only for strings using characters # that are Roman-alphabet characters + diacritics. Non-letter characters # are left unmodified. # # string = Identifier.new "Łódź, Poland" # string.transliterate # => "Lodz, Poland" # string = Identifier.new "日本" # string.transliterate # => "日本" # # You can pass the names of any transliterator class as arguments. This # allows for contextual approximations. Various languages are supported, # you can see which ones by looking at the source of # {Babosa::Transliterator::Base}. # # string = Identifier.new "Jürgen Müller" # string.transliterate # => "Jurgen Muller" # string.transliterate :german # => "Juergen Mueller" # string = Identifier.new "¡Feliz año!" # string.transliterate # => "¡Feliz ano!" # string.transliterate :spanish # => "¡Feliz anio!" # # The approximations are an array, which you can modify if you choose: # # # Make Spanish use "nh" rather than "nn" # Babosa::Transliterator::Spanish::APPROXIMATIONS["ñ"] = "nh" # # Notice that this method does not simply convert to ASCII; if you want # to remove non-ASCII characters such as "¡" and "¿", use {#to_ascii!}: # # string.transliterate!(:spanish) # => "¡Feliz anio!" # string.to_ascii! # => "Feliz anio!" # # @param *args # @return String def transliterate!(*kinds) kinds.compact! kinds = [:latin] if kinds.empty? kinds.each do |kind| transliterator = Transliterator.get(kind).instance @wrapped_string = transliterator.transliterate(@wrapped_string) end to_s end # Converts dashes to spaces, removes leading and trailing spaces, and # replaces multiple whitespace characters with a single space. # # @return String def clean! gsub!(/[- ]+/, " ") strip! to_s end # Remove any non-word characters. For this library's purposes, this means # anything other than letters, numbers, spaces, underscores, dashes, # newlines, and linefeeds. # # @return String def word_chars! # `^\p{letter}` = Any non-Unicode letter # `&&` = add the following character class # `[^ _\n\r]` = Anything other than space, underscore, newline or linefeed gsub!(/[[^\p{letter}]&&[^ \d_\-\n\r]]/, "") to_s end # Normalize the string for use as a URL slug. Note that in this context, # +normalize+ means, strip, remove non-letters/numbers, downcasing, # truncating to 255 bytes and converting whitespace to dashes. # # @param options [Hash] # @return String def normalize!(options = {}) options = default_normalize_options.merge(options) if options[:transliterate] option = options[:transliterate] if option == true transliterate!(*options[:transliterations]) else transliterate!(*option) end end to_ascii! if options[:to_ascii] word_chars! clean! downcase! truncate_bytes!(options[:max_length]) with_separators!(options[:separator]) end # Normalize a string so that it can safely be used as a Ruby method name. # # @param allow_bangs [Boolean] # @return String def to_ruby_method!(allow_bangs: true) last_char = self[-1] transliterate! to_ascii! word_chars! strip_leading_digits! clean! @wrapped_string += last_char if allow_bangs && ["!", "?"].include?(last_char) raise Error, "Input generates impossible Ruby method name" if self == "" with_separators!("_") end # Delete any non-ascii characters. # # @return String def to_ascii! gsub!(/[^\x00-\x7f]/u, "") to_s end # Truncate the string to +max+ characters. # # @example # "üéøá".to_identifier.truncate(3) #=> "üéø" # # @param max [Integer] The maximum number of characters. # @return String def truncate!(max) @wrapped_string = slice(0, max) end # Truncate the string to +max+ bytes. This can be useful for ensuring that # a UTF-8 string will always fit into a database column with a certain max # byte length. The resulting string may be less than +max+ if the string must # be truncated at a multibyte character boundary. # # @example # "üéøá".to_identifier.truncate_bytes(3) #=> "ü" # # @param max [Integer] The maximum number of bytes. # @return String def truncate_bytes!(max) truncate!(max) chop! until bytesize <= max end # Replaces whitespace with dashes ("-"). # # @param char [String] the separator character to use. # @return String def with_separators!(char = "-") gsub!(/\s/u, char) to_s end # Perform Unicode composition on the wrapped string. # # @return String def normalize_utf8! unicode_normalize!(:nfc) to_s end # Strip any leading digits. # # @return String def strip_leading_digits! gsub!(/^\d+/, "") to_s end # Attempt to convert characters encoded using CP1252 and IS0-8859-1 to # UTF-8. # @return String def tidy_bytes! scrub! do |bad| bad.encode(Encoding::UTF_8, Encoding::Windows_1252, invalid: :replace, undef: :replace) end to_s end %w[clean downcase normalize normalize_utf8 strip_leading_digits tidy_bytes to_ascii transliterate truncate truncate_bytes upcase with_separators word_chars].each do |method| class_eval(<<-METHOD, __FILE__, __LINE__ + 1) def #{method}(*args) with_new_instance { |id| id.send(:#{method}!, *args) } end METHOD end def to_ruby_method(allow_bangs: true) with_new_instance { |id| id.to_ruby_method!(allow_bangs: allow_bangs) } end def to_identifier self end # The default options for {#normalize!}. Override to set your own defaults. def default_normalize_options {transliterate: :latin, max_length: 255, separator: "-"} end alias approximate_ascii transliterate alias approximate_ascii! transliterate! alias with_dashes with_separators alias with_dashes! with_separators! alias to_slug to_identifier private # Used as the basis of the non-mutating (bangless) methods. def with_new_instance Identifier.allocate.tap do |id| id.instance_variable_set :@wrapped_string, to_s yield id end end end end babosa-2.0.0/lib/babosa/transliterator/000077500000000000000000000000001410162247400200135ustar00rootroot00000000000000babosa-2.0.0/lib/babosa/transliterator/base.rb000066400000000000000000000060141410162247400212530ustar00rootroot00000000000000# frozen_string_literal: true require "singleton" module Babosa module Transliterator def self.get(symbol) class_name = symbol.to_s.split("_").map { |a| a.gsub(/\b('?[a-z])/) { Regexp.last_match(1).upcase } }.join const_get(class_name) end class Base include Singleton APPROXIMATIONS = { "×" => "x", "÷" => "/", "‐" => "-", "‑" => "-", "‒" => "-", "–" => "-", "—" => "-", "―" => "-", "‘" => "'", "‛" => "'", "“" => '"', "”" => '"', "„" => '"', "‟" => '"', "’" => "'", "," => ",", "。" => ".", "!" => "!", "?" => "?", "、" => ",", "(" => "(", ")" => ")", "【" => "[", "】" => "]", ";" => ";", ":" => ":", "《" => "<", "》" => ">" }.merge( { # various kinds of space characters "\xc2\xa0" => " ", "\xe2\x80\x80" => " ", "\xe2\x80\x81" => " ", "\xe2\x80\x82" => " ", "\xe2\x80\x83" => " ", "\xe2\x80\x84" => " ", "\xe2\x80\x85" => " ", "\xe2\x80\x86" => " ", "\xe2\x80\x87" => " ", "\xe2\x80\x88" => " ", "\xe2\x80\x89" => " ", "\xe2\x80\x8a" => " ", "\xe2\x81\x9f" => " ", "\xe3\x80\x80" => " " } ).freeze attr_reader :approximations def initialize if self.class < Base @approximations = self.class.superclass.instance.approximations.dup else @approximations = {} end self.class.const_get(:APPROXIMATIONS).inject(@approximations) do |memo, object| index = object[0].codepoints.shift value = object[1].codepoints memo[index] = value.length == 1 ? value[0] : value memo end @approximations.freeze end # Accepts a single UTF-8 codepoint and returns the ASCII character code # used as the transliteration value. def [](codepoint) @approximations[codepoint] end # Transliterates a string. def transliterate(string) string.codepoints.map { |char| self[char] || char }.flatten.pack("U*") end end end end require "babosa/transliterator/cyrillic" require "babosa/transliterator/latin" require "babosa/transliterator/bulgarian" require "babosa/transliterator/danish" require "babosa/transliterator/german" require "babosa/transliterator/hindi" require "babosa/transliterator/macedonian" require "babosa/transliterator/norwegian" require "babosa/transliterator/romanian" require "babosa/transliterator/russian" require "babosa/transliterator/serbian" require "babosa/transliterator/spanish" require "babosa/transliterator/swedish" require "babosa/transliterator/ukrainian" require "babosa/transliterator/greek" require "babosa/transliterator/vietnamese" require "babosa/transliterator/turkish" babosa-2.0.0/lib/babosa/transliterator/bulgarian.rb000066400000000000000000000010371410162247400223050ustar00rootroot00000000000000# frozen_string_literal: true module Babosa module Transliterator class Bulgarian < Cyrillic APPROXIMATIONS = { "Ж" => "J", "Й" => "I", "Х" => "H", "Ц" => "C", "Щ" => "Sht", "Ъ" => "U", "Ь" => "I", "Ю" => "Iu", "Я" => "Ia", "ж" => "j", "й" => "i", "х" => "h", "ц" => "c", "щ" => "sht", "ъ" => "u", "ь" => "i", "ю" => "iu", "я" => "ia" }.freeze end end end babosa-2.0.0/lib/babosa/transliterator/cyrillic.rb000066400000000000000000000044531410162247400221600ustar00rootroot00000000000000# frozen_string_literal: true module Babosa module Transliterator # Approximations are based on GOST 7.79, System B: # http://en.wikipedia.org/wiki/ISO_9#GOST_7.79 class Cyrillic < Base APPROXIMATIONS = { "Ё" => "Yo", "Ѓ" => "G", "Є" => "Ye", "Ї" => "Yi", "Љ" => "L", "Њ" => "N", "Ќ" => "K", "Ў" => "U", "Џ" => "Dh", "А" => "A", "Б" => "B", "В" => "V", "Г" => "G", "Д" => "D", "Е" => "E", "Ж" => "Zh", "З" => "Z", "И" => "I", "Й" => "J", "К" => "K", "Л" => "L", "М" => "M", "Н" => "N", "О" => "O", "П" => "P", "Р" => "R", "С" => "S", "Т" => "T", "У" => "U", "Ф" => "F", "Х" => "X", "Ц" => "Cz", "Ч" => "Ch", "Ш" => "Sh", "Щ" => "Shh", "Ъ" => "", "Ы" => "Y", "Ь" => "", "Э" => "E", "Ю" => "Yu", "Я" => "Ya", "а" => "a", "б" => "b", "в" => "v", "г" => "g", "д" => "d", "е" => "e", "ж" => "zh", "з" => "z", "и" => "i", "й" => "j", "к" => "k", "л" => "l", "м" => "m", "н" => "n", "о" => "o", "п" => "p", "р" => "r", "с" => "s", "т" => "t", "у" => "u", "ф" => "f", "х" => "x", "ц" => "cz", "ч" => "ch", "ш" => "sh", "щ" => "shh", "ъ" => "", "ы" => "y", "ь" => "", "э" => "e", "ю" => "yu", "я" => "ya", "ё" => "yo", "ѓ" => "g", "є" => "ye", "ї" => "yi", "љ" => "l", "њ" => "n", "ќ" => "k", "ў" => "u", "џ" => "dh", "Ѣ" => "Ye", "ѣ" => "ye", "Ѫ" => "O", "ѫ" => "o", "Ѳ" => "Fh", "ѳ" => "fh", "Ѵ" => "Yh", "ѵ" => "yh", "Ґ" => "G", "ґ" => "g" }.freeze def transliterate(string) super.gsub(/(c)z([ieyj])/) { "#{Regexp.last_match(1)}#{Regexp.last_match(2)}" } end end end end babosa-2.0.0/lib/babosa/transliterator/danish.rb000066400000000000000000000004051410162247400216050ustar00rootroot00000000000000# frozen_string_literal: true module Babosa module Transliterator class Danish < Latin APPROXIMATIONS = { "æ" => "ae", "ø" => "oe", "å" => "aa", "Ø" => "Oe", "Å" => "Aa" }.freeze end end end babosa-2.0.0/lib/babosa/transliterator/german.rb000066400000000000000000000004331410162247400216110ustar00rootroot00000000000000# frozen_string_literal: true module Babosa module Transliterator class German < Latin APPROXIMATIONS = { "ä" => "ae", "ö" => "oe", "ü" => "ue", "Ä" => "Ae", "Ö" => "Oe", "Ü" => "Ue" }.freeze end end end babosa-2.0.0/lib/babosa/transliterator/greek.rb000066400000000000000000000030601410162247400214340ustar00rootroot00000000000000# frozen_string_literal: true module Babosa module Transliterator class Greek < Base APPROXIMATIONS = { "Α" => "A", "Ά" => "A", "α" => "a", "ά" => "a", "Β" => "V", "β" => "v", "Γ" => "G", "γ" => "g", "Δ" => "D", "δ" => "d", "Ε" => "E", "Έ" => "E", "ε" => "e", "έ" => "e", "Ζ" => "Z", "ζ" => "z", "Η" => "I", "Ή" => "i", "η" => "i", "ή" => "i", "Θ" => "TH", "θ" => "th", "Ι" => "I", "Ί" => "Ι", "Î" => "I", "ι" => "i", "ί" => "i", "ϊ" => "i", "ΐ" => "i", "Κ" => "K", "κ" => "k", "Λ" => "L", "λ" => "l", "Μ" => "M", "μ" => "m", "Ν" => "N", "ν" => "n", "Ξ" => "KS", "ξ" => "ks", "Ο" => "O", "Ό" => "O", "ο" => "o", "ό" => "o", "Π" => "P", "π" => "p", "Ρ" => "R", "ρ" => "r", "Σ" => "S", "σ" => "s", "ς" => "s", "Τ" => "T", "τ" => "t", "Υ" => "Y", "Ύ" => "Y", "υ" => "y", "ύ" => "y", "ϋ" => "y", "ΰ" => "y", "Φ" => "F", "φ" => "f", "Χ" => "X", "χ" => "x", "Ψ" => "PS", "ψ" => "ps", "Ω" => "O", "Ώ" => "O", "ω" => "o", "ώ" => "o" }.freeze end end end babosa-2.0.0/lib/babosa/transliterator/hindi.rb000066400000000000000000000057341410162247400214440ustar00rootroot00000000000000# frozen_string_literal: true module Babosa module Transliterator class Hindi < Base APPROXIMATIONS = { "ऀ" => "n", "ँ" => "n", "ं" => "n", "ः" => "h", "ऄ" => "a", "अ" => "a", "आ" => "aa", "इ" => "i", "ई" => "ii", "उ" => "u", "ऊ" => "uu", "ऋ" => "ri", "ऌ" => "lri", "ऍ" => "e", "ऎ" => "e", "ए" => "e", "ऐ" => "ei", "ऑ" => "o", "ऒ" => "o", "ओ" => "o", "औ" => "ou", "क" => "k", "ख" => "kh", "ग" => "g", "घ" => "gh", "ङ" => "d", "च" => "ch", "छ" => "chh", "ज" => "j", "झ" => "jh", "ञ" => "ny", "ट" => "tt", "ठ" => "tth", "ड" => "dd", "ढ" => "ddh", "ण" => "nn", "त" => "t", "थ" => "th", "द" => "d", "ध" => "dh", "न" => "n", "ऩ" => "nnn", "प" => "p", "फ" => "ph", "ब" => "b", "भ" => "bh", "म" => "m", "य" => "y", "र" => "r", "ऱ" => "rr", "ल" => "l", "ळ" => "ll", "ऴ" => "ll", "व" => "v", "श" => "sh", "ष" => "ss", "स" => "s", "ह" => "h", "ऺ" => "oe", "ऻ" => "ooe", "़" => "", "ऽ" => "-", "ा" => "aa", "ि" => "i", "ी" => "ii", "ु" => "u", "ू" => "uu", "ृ" => "r", "ॄ" => "rr", "ॅ" => "e", "ॆ" => "e", "े" => "e", "ै" => "ai", "ॉ" => "o", "ॊ" => "o", "ो" => "o", "ौ" => "au", "्" => "", "ॎ" => "e", "ॏ" => "aw", "ॐ" => "om", "॑" => "", "॒" => "_", "॓" => "", "॔" => "", "ॕ" => "ee", "ॖ" => "ue", "ॗ" => "uue", "क़" => "q", "ख़" => "khh", "ग़" => "ghh", "ज़" => "za", "ड़" => "dddh", "ढ़" => "rh", "फ़" => "f", "य़" => "yy", "ॠ" => "rri", "ॡ" => "lr", "ॢ" => "l", "ॣ" => "l", "।" => ".", "॥" => "..", "०" => "0", "१" => "1", "२" => "2", "३" => "3", "४" => "4", "५" => "5", "६" => "6", "७" => "7", "८" => "8", "९" => "9", "॰" => ".", "ॱ" => ".", "ॲ" => "a", "ॳ" => "oe", "ॴ" => "ooe", "ॵ" => "aw", "ॶ" => "ue", "ॷ" => "uue", "ॸ" => "dd", "ॹ" => "zh", "ॺ" => "y", "ॻ" => "gg", "ॼ" => "jj", "ॽ" => "?", "ॾ" => "ddd", "ॿ" => "bb" }.freeze end end end babosa-2.0.0/lib/babosa/transliterator/latin.rb000066400000000000000000000100411410162247400214430ustar00rootroot00000000000000# frozen_string_literal: true module Babosa module Transliterator class Latin < Base APPROXIMATIONS = { "À" => "A", "Á" => "A", "Â" => "A", "Ã" => "A", "Ä" => "A", "Å" => "A", "Æ" => "Ae", "Ç" => "C", "È" => "E", "É" => "E", "Ê" => "E", "Ë" => "E", "Ì" => "I", "Í" => "I", "Î" => "I", "Ï" => "I", "Ð" => "D", "Ñ" => "N", "Ò" => "O", "Ó" => "O", "Ô" => "O", "Õ" => "O", "Ö" => "O", "Ø" => "O", "Ù" => "U", "Ú" => "U", "Û" => "U", "Ü" => "U", "Ý" => "Y", "Þ" => "Th", "ß" => "ss", "à" => "a", "á" => "a", "â" => "a", "ã" => "a", "ä" => "a", "å" => "a", "æ" => "ae", "ç" => "c", "è" => "e", "é" => "e", "ê" => "e", "ë" => "e", "ì" => "i", "í" => "i", "î" => "i", "ï" => "i", "ð" => "d", "ñ" => "n", "ò" => "o", "ó" => "o", "ô" => "o", "õ" => "o", "ö" => "o", "ø" => "o", "ù" => "u", "ú" => "u", "û" => "u", "ü" => "u", "ý" => "y", "þ" => "th", "ÿ" => "y", "Ā" => "A", "Ă" => "A", "Ą" => "A", "Ć" => "C", "Ĉ" => "C", "Ċ" => "C", "Č" => "C", "Ď" => "D", "Đ" => "D", "Ē" => "E", "Ĕ" => "E", "Ė" => "E", "Ę" => "E", "Ě" => "E", "Ĝ" => "G", "Ğ" => "G", "Ġ" => "G", "Ģ" => "G", "Ĥ" => "H", "Ħ" => "H", "Ĩ" => "I", "Ī" => "I", "Ĭ" => "I", "Į" => "I", "İ" => "I", "IJ" => "Ij", "Ĵ" => "J", "Ķ" => "K", "Ĺ" => "L", "Ļ" => "L", "Ľ" => "L", "Ŀ" => "L", "Ł" => "L", "Ń" => "N", "Ņ" => "N", "Ň" => "N", "Ŋ" => "Ng", "Ō" => "O", "Ŏ" => "O", "Ő" => "O", "Œ" => "OE", "Ŕ" => "R", "Ŗ" => "R", "Ř" => "R", "Ś" => "S", "Ŝ" => "S", "Ş" => "S", "Š" => "S", "Ţ" => "T", "Ť" => "T", "Ŧ" => "T", "Ũ" => "U", "Ū" => "U", "Ŭ" => "U", "Ů" => "U", "Ű" => "U", "Ų" => "U", "Ŵ" => "W", "Ŷ" => "Y", "Ÿ" => "Y", "Ź" => "Z", "Ż" => "Z", "Ž" => "Z", "ā" => "a", "ă" => "a", "ą" => "a", "ć" => "c", "ĉ" => "c", "ċ" => "c", "č" => "c", "ď" => "d", "đ" => "d", "ē" => "e", "ĕ" => "e", "ė" => "e", "ę" => "e", "ě" => "e", "ĝ" => "g", "ğ" => "g", "ġ" => "g", "ģ" => "g", "ĥ" => "h", "ħ" => "h", "ĩ" => "i", "ī" => "i", "ĭ" => "i", "į" => "i", "ı" => "i", "ij" => "ij", "ĵ" => "j", "ķ" => "k", "ĸ" => "k", "ĺ" => "l", "ļ" => "l", "ľ" => "l", "ŀ" => "l", "ł" => "l", "ń" => "n", "ņ" => "n", "ň" => "n", "ʼn" => "n", "ŋ" => "ng", "ō" => "o", "ŏ" => "o", "ő" => "o", "œ" => "oe", "ŕ" => "r", "ŗ" => "r", "ř" => "r", "ś" => "s", "ŝ" => "s", "ş" => "s", "š" => "s", "ţ" => "t", "ť" => "t", "ŧ" => "t", "ũ" => "u", "ū" => "u", "ŭ" => "u", "ů" => "u", "ű" => "u", "ų" => "u", "ŵ" => "w", "ŷ" => "y", "ž" => "z", "ź" => "z", "ż" => "z" }.freeze end end end babosa-2.0.0/lib/babosa/transliterator/macedonian.rb000066400000000000000000000011201410162247400224300ustar00rootroot00000000000000# frozen_string_literal: true module Babosa module Transliterator class Macedonian < Cyrillic APPROXIMATIONS = { "Ѓ" => "Gj", "Љ" => "Lj", "Њ" => "Nj", "Ќ" => "Kj", "Џ" => "Dzh", "Ж" => "Zh", "Ц" => "C", "Ѕ" => "Z", "Ј" => "J", "Х" => "H", "ѓ" => "gj", "љ" => "lj", "њ" => "nj", "ќ" => "kj", "џ" => "dzh", "ж" => "zh", "ц" => "c", "ѕ" => "z", "ј" => "j", "х" => "h" }.freeze end end end babosa-2.0.0/lib/babosa/transliterator/norwegian.rb000066400000000000000000000003621410162247400223320ustar00rootroot00000000000000# frozen_string_literal: true module Babosa module Transliterator class Norwegian < Latin APPROXIMATIONS = { "ø" => "oe", "å" => "aa", "Ø" => "Oe", "Å" => "Aa" }.freeze end end end babosa-2.0.0/lib/babosa/transliterator/romanian.rb000066400000000000000000000003551410162247400221470ustar00rootroot00000000000000# frozen_string_literal: true module Babosa module Transliterator class Romanian < Latin APPROXIMATIONS = { "ș" => "s", "ț" => "t", "Ș" => "S", "Ț" => "T" }.freeze end end end babosa-2.0.0/lib/babosa/transliterator/russian.rb000066400000000000000000000006641410162247400220320ustar00rootroot00000000000000# frozen_string_literal: true module Babosa module Transliterator class Russian < Cyrillic APPROXIMATIONS = { "Й" => "I", "М" => "M", "Х" => "H", "Ц" => "Ts", "Ш" => "Sh", "Щ" => "Sch", "Ю" => "U", "Я" => "Ya", "й" => "i", "х" => "h", "ц" => "ts", "щ" => "sch", "ю" => "u" }.freeze end end end babosa-2.0.0/lib/babosa/transliterator/serbian.rb000066400000000000000000000014061410162247400217640ustar00rootroot00000000000000# frozen_string_literal: true module Babosa module Transliterator class Serbian < Latin APPROXIMATIONS = Cyrillic.const_get(:APPROXIMATIONS).merge( { "Ð" => "Dj", "Č" => "Ch", "Š" => "Sh", "č" => "ch", "đ" => "dj", "š" => "sh", "Ћ" => "C", "Ц" => "C", "Ч" => "Ch", "Ђ" => "Dj", "Џ" => "Dz", "Х" => "H", "Ј" => "J", "Љ" => "Lj", "Њ" => "Nj", "ц" => "c", "ћ" => "c", "ч" => "ch", "ђ" => "dj", "џ" => "dz", "х" => "h", "ј" => "j", "љ" => "lj", "њ" => "nj" } ) end end end babosa-2.0.0/lib/babosa/transliterator/spanish.rb000066400000000000000000000002541410162247400220060ustar00rootroot00000000000000# frozen_string_literal: true module Babosa module Transliterator class Spanish < Latin APPROXIMATIONS = {"ñ" => "ni", "Ñ" => "Ni"}.freeze end end end babosa-2.0.0/lib/babosa/transliterator/swedish.rb000066400000000000000000000004341410162247400220070ustar00rootroot00000000000000# frozen_string_literal: true module Babosa module Transliterator class Swedish < Latin APPROXIMATIONS = { "å" => "aa", "ä" => "ae", "ö" => "oe", "Å" => "Aa", "Ä" => "Ae", "Ö" => "Oe" }.freeze end end end babosa-2.0.0/lib/babosa/transliterator/turkish.rb000066400000000000000000000001611410162247400220270ustar00rootroot00000000000000# frozen_string_literal: true module Babosa module Transliterator class Turkish < Latin end end end babosa-2.0.0/lib/babosa/transliterator/ukrainian.rb000066400000000000000000000011411410162247400223160ustar00rootroot00000000000000# frozen_string_literal: true module Babosa module Transliterator class Ukrainian < Cyrillic APPROXIMATIONS = { "Г" => "H", "г" => "h", "Ґ" => "G", "ґ" => "g", "є" => "ie", "И" => "Y", "и" => "y", "І" => "I", "і" => "i", "ї" => "i", "Й" => "Y", "й" => "i", "Х" => "Kh", "х" => "kh", "Ц" => "Ts", "ц" => "ts", "Щ" => "Shch", "щ" => "shch", "ю" => "iu", "я" => "ia", "'" => "" }.freeze end end end babosa-2.0.0/lib/babosa/transliterator/vietnamese.rb000066400000000000000000000057631410162247400225130ustar00rootroot00000000000000# frozen_string_literal: true module Babosa module Transliterator class Vietnamese < Latin APPROXIMATIONS = { "à" => "a", "á" => "a", "ạ" => "a", "ả" => "a", "ã" => "a", "â" => "a", "ầ" => "a", "ấ" => "a", "ậ" => "a", "ẩ" => "a", "ẫ" => "a", "ă" => "a", "ằ" => "a", "ắ" => "a", "ặ" => "a", "ẳ" => "a", "ẵ" => "a", "À" => "A", "Á" => "A", "Ạ" => "A", "Ả" => "A", "Ã" => "A", "Â" => "A", "Ầ" => "A", "Ấ" => "A", "Ậ" => "A", "Ẩ" => "A", "Ẫ" => "A", "Ă" => "A", "Ằ" => "A", "Ắ" => "A", "Ặ" => "A", "Ẳ" => "A", "Ẵ" => "A", "ì" => "i", "í" => "i", "ị" => "i", "ỉ" => "i", "ĩ" => "i", "Ì" => "I", "Í" => "I", "Ị" => "I", "Ỉ" => "I", "Ĩ" => "I", "ù" => "u", "ú" => "u", "ụ" => "u", "ủ" => "u", "ũ" => "u", "ư" => "u", "ừ" => "u", "ứ" => "u", "ự" => "u", "ử" => "u", "ữ" => "u", "Ù" => "U", "Ú" => "U", "Ụ" => "U", "Ủ" => "U", "Ũ" => "U", "Ư" => "U", "Ừ" => "U", "Ứ" => "U", "Ự" => "U", "Ử" => "U", "Ữ" => "U", "è" => "e", "é" => "e", "ẹ" => "e", "ẻ" => "e", "ẽ" => "e", "ê" => "e", "ề" => "e", "ế" => "e", "ệ" => "e", "ể" => "e", "ễ" => "e", "È" => "E", "É" => "E", "Ẹ" => "E", "Ẻ" => "E", "Ẽ" => "E", "Ê" => "E", "Ề" => "E", "Ế" => "E", "Ệ" => "E", "Ể" => "E", "Ễ" => "E", "ò" => "o", "ó" => "o", "ọ" => "o", "ỏ" => "o", "õ" => "o", "ô" => "o", "ồ" => "o", "ố" => "o", "ộ" => "o", "ổ" => "o", "ỗ" => "o", "ơ" => "o", "ờ" => "o", "ớ" => "o", "ợ" => "o", "ở" => "o", "ỡ" => "o", "Ò" => "O", "Ó" => "O", "Ọ" => "O", "Ỏ" => "O", "Õ" => "O", "Ô" => "O", "Ồ" => "O", "Ố" => "O", "Ộ" => "O", "Ổ" => "O", "Ỗ" => "O", "Ơ" => "O", "Ờ" => "O", "Ớ" => "O", "Ợ" => "O", "Ở" => "O", "Ỡ" => "O", "ỳ" => "y", "ý" => "y", "ỵ" => "y", "ỷ" => "y", "ỹ" => "y", "Ỳ" => "Y", "Ý" => "Y", "Ỵ" => "Y", "Ỷ" => "Y", "Ỹ" => "Y", "đ" => "d", "Đ" => "D" }.freeze end end end babosa-2.0.0/lib/babosa/version.rb000066400000000000000000000001351410162247400167470ustar00rootroot00000000000000# frozen_string_literal: true module Babosa module Version STRING = "2.0.0" end end babosa-2.0.0/spec/000077500000000000000000000000001410162247400136735ustar00rootroot00000000000000babosa-2.0.0/spec/identifier_spec.rb000066400000000000000000000122641410162247400173610ustar00rootroot00000000000000# frozen_string_literal: true require "spec_helper" describe Babosa::Identifier do it "should respond_to :empty?" do expect("".to_slug).to respond_to(:empty?) end %w[approximate_ascii clean downcase word_chars normalize to_ascii upcase with_dashes].each do |method| describe "##{method}" do it "should work with invalid UTF-8 strings" do expect { "\x93abc".to_slug.send method }.not_to raise_exception end end end describe "#word_chars" do it "word_chars! should leave only letters, numbers, and spaces" do string = "a*$%^$@!@b$%^&*()*!c 123" expect(string.to_slug.word_chars!).to eq "abc 123" end end describe "#transliterate" do it "should transliterate to ascii" do (0xC0..0x17E).to_a.each do |codepoint| ss = [codepoint].pack("U*").to_slug expect(ss.approximate_ascii!).to match(/[\x0-\x7f]/) end end it "should transliterate uncomposed utf8" do string = [117, 776].pack("U*") # "ü" as ASCII "u" plus COMBINING DIAERESIS expect(string.to_slug.approximate_ascii).to eql("u") end it "should transliterate using multiple transliterators" do string = "свободное režģis" expect(string.to_slug.approximate_ascii(:latin, :russian)).to eql("svobodnoe rezgis") end end describe "#downcase" do it "should lowercase strings" do expect("FELIZ AÑO".to_slug.downcase).to eql("feliz año") end end describe "#upcase" do it "should uppercase strings" do expect("feliz año".to_slug.upcase).to eql("FELIZ AÑO") end end describe "#normalize" do it "should allow passing locale as key for :transliterate" do expect("ö".to_slug.clean.normalize(transliterate: :german)).to eql("oe") end it "should replace whitespace with dashes" do expect("a b".to_slug.clean.normalize).to eql("a-b") end it "should replace multiple spaces with 1 dash" do expect("a b".to_slug.clean.normalize).to eql("a-b") end it "should replace multiple dashes with 1 dash" do expect("male - female".to_slug.normalize).to eql("male-female") end it "should strip trailing space" do expect("ab ".to_slug.normalize).to eql("ab") end it "should strip leading space" do expect(" ab".to_slug.normalize).to eql("ab") end it "should strip trailing slashes" do expect("ab-".to_slug.normalize).to eql("ab") end it "should strip leading slashes" do expect("-ab".to_slug.normalize).to eql("ab") end it "should not modify valid name strings" do expect("a-b-c-d".to_slug.normalize).to eql("a-b-c-d") end it "should not convert underscores" do expect("hello_world".to_slug.normalize).to eql("hello_world") end it "should work with non roman chars" do expect("検 索".to_slug.normalize).to eql("検-索") end context "with to_ascii option" do it "should approximate and strip non ascii" do ss = "カタカナ: katakana is über cool".to_slug expect(ss.normalize(to_ascii: true)).to eql("katakana-is-uber-cool") end end end describe "#truncate_bytes" do it "should by byte length" do expect("üa".to_slug.truncate_bytes(2)).to eql("ü") expect("üa".to_slug.truncate_bytes(1)).to eql("") expect("üa".to_slug.truncate_bytes(100)).to eql("üa") expect("üéøá".to_slug.truncate_bytes(3)).to eql("ü") end end describe "#truncate" do it "should truncate by char length" do expect("üa".to_slug.truncate(2)).to eql("üa") expect("üa".to_slug.truncate(1)).to eql("ü") expect("üa".to_slug.truncate(100)).to eql("üa") end end describe "#with_dashes" do it "should not change byte size when replacing spaces" do expect("".to_slug.with_dashes.bytesize).to eql(0) expect(" ".to_slug.with_dashes.bytesize).to eql(1) expect("-abc-".to_slug.with_dashes.bytesize).to eql(5) expect(" abc ".to_slug.with_dashes.bytesize).to eql(5) expect(" a bc ".to_slug.with_dashes.bytesize).to eql(7) end end describe "#to_ruby_method" do it "should get a string suitable for use as a ruby method" do expect("¿¿¿hello... world???".to_slug.to_ruby_method).to eql("hello_world?") expect("カタカナ: katakana is über cool".to_slug.to_ruby_method).to eql("katakana_is_uber_cool") expect("カタカナ: katakana is über cool!".to_slug.to_ruby_method).to eql("katakana_is_uber_cool!") expect("カタカナ: katakana is über cool".to_slug.to_ruby_method(allow_bangs: false)).to eql("katakana_is_uber_cool") expect("not 2 much 4 ruby".to_slug.to_ruby_method).to eql("not_2_much_4_ruby") end it "should optionally remove trailing punctuation" do expect("¿¿¿hello... world???".to_slug.to_ruby_method(allow_bangs: false)).to eql("hello_world") end it "should raise an error when it would generate an impossible method name" do expect { "1".to_identifier.to_ruby_method }.to raise_error(Babosa::Identifier::Error) end it "should raise Babosa::Error error when the string is nil" do expect { "".to_slug.to_ruby_method }.to raise_error(Babosa::Identifier::Error) end end end babosa-2.0.0/spec/spec_helper.rb000066400000000000000000000022251410162247400165120ustar00rootroot00000000000000# frozen_string_literal: true if ENV["COV"] require "simplecov" SimpleCov.start end require "bundler/setup" require "babosa" shared_examples_for "a latin transliterator" do let(:t) { described_class.instance } it "should transliterate latin characters" do string = (0xC0..0x17E).to_a.pack("U*") expect(t.transliterate(string)).to match(/[\x0-\x7f]/) end end shared_examples_for "a cyrillic transliterator" do let(:t) { described_class.instance } it "should transliterate cyrillic characters" do string = "Славься, Отечество наше свободное" expect(t.transliterate(string)).to match(/[\x0-\x7f]/) end end shared_examples_for "a greek transliterator" do let(:t) { described_class.instance } it "should transliterate greek characters" do string = "Γερμανία" expect(t.transliterate(string)).to match(/[\x0-\x7f]/) end end shared_examples_for "a hindi transliterator" do let(:t) { described_class.instance } it "should transliterate hindi characters" do string = "आदित्य तापड़िया" expect(t.transliterate(string)).to match(/[\x0-\x7f]/) end end babosa-2.0.0/spec/transliterators/000077500000000000000000000000001410162247400171335ustar00rootroot00000000000000babosa-2.0.0/spec/transliterators/base_spec.rb000066400000000000000000000005511410162247400214050ustar00rootroot00000000000000# frozen_string_literal: true require "spec_helper" describe Babosa::Transliterator::Base do let(:t) { Babosa::Transliterator::Base.instance } it "should transliterate 'smart' quotes" do expect(t.transliterate("’")).to eql("'") end it "should transliterate non-breaking spaces" do expect(t.transliterate("\xc2\xa0")).to eql(" ") end end babosa-2.0.0/spec/transliterators/bulgarian_spec.rb000066400000000000000000000010001410162247400224250ustar00rootroot00000000000000# frozen_string_literal: true require "spec_helper" describe Babosa::Transliterator::Bulgarian do let(:t) { described_class.instance } it_behaves_like "a cyrillic transliterator" it "should transliterate Cyrillic characters" do examples = { "Ютия" => "Iutiia", "Чушка" => "Chushka", "кьорав" => "kiorav", "Щъркел" => "Shturkel", "полицай" => "policai" } examples.each { |k, v| expect(t.transliterate(k)).to eql(v) } end end babosa-2.0.0/spec/transliterators/danish_spec.rb000066400000000000000000000006241410162247400217420ustar00rootroot00000000000000# frozen_string_literal: true require "spec_helper" describe Babosa::Transliterator::Danish do let(:t) { described_class.instance } it_behaves_like "a latin transliterator" it "should transliterate various characters" do examples = { "Ærøskøbing" => "Aeroeskoebing", "Årslev" => "Aarslev" } examples.each { |k, v| expect(t.transliterate(k)).to eql(v) } end end babosa-2.0.0/spec/transliterators/german_spec.rb000066400000000000000000000006041410162247400217430ustar00rootroot00000000000000# frozen_string_literal: true require "spec_helper" describe Babosa::Transliterator::German do let(:t) { described_class.instance } it_behaves_like "a latin transliterator" it "should transliterate Eszett" do expect(t.transliterate("ß")).to eql("ss") end it "should transliterate vowels with umlauts" do expect(t.transliterate("üöä")).to eql("ueoeae") end end babosa-2.0.0/spec/transliterators/greek_spec.rb000066400000000000000000000006711410162247400215730ustar00rootroot00000000000000# frozen_string_literal: true require "spec_helper" describe Babosa::Transliterator::Greek do let(:t) { described_class.instance } it_behaves_like "a greek transliterator" it "should transliterate various characters" do examples = { "Γερμανία" => "Germania", "Αυστρία" => "Aystria", "Ιταλία" => "Italia" } examples.each { |k, v| expect(t.transliterate(k)).to eql(v) } end end babosa-2.0.0/spec/transliterators/hindi_spec.rb000066400000000000000000000010531410162247400215640ustar00rootroot00000000000000# frozen_string_literal: true require "spec_helper" describe Babosa::Transliterator::Hindi do let(:t) { described_class.instance } it_behaves_like "a hindi transliterator" it "should transliterate hindi characters" do examples = { "आदित्य" => "aadity", "सबरीमाला करवाना पायसम" => "sbriimaalaa krvaanaa paaysm", "सक्रांति आँख" => "skraanti aankh" } examples.each { |k, v| expect(t.transliterate(k)).to eql(v) } end end babosa-2.0.0/spec/transliterators/latin_spec.rb000066400000000000000000000002661410162247400216050ustar00rootroot00000000000000# frozen_string_literal: true require "spec_helper" describe Babosa::Transliterator::Latin do let(:t) { described_class.instance } it_behaves_like "a latin transliterator" end babosa-2.0.0/spec/transliterators/macedonian_spec.rb000066400000000000000000000002761410162247400225750ustar00rootroot00000000000000# frozen_string_literal: true require "spec_helper" describe Babosa::Transliterator::Macedonian do let(:t) { described_class.instance } it_behaves_like "a cyrillic transliterator" end babosa-2.0.0/spec/transliterators/norwegian_spec.rb000066400000000000000000000006731410162247400224710ustar00rootroot00000000000000# frozen_string_literal: true require "spec_helper" describe Babosa::Transliterator::Norwegian do let(:t) { described_class.instance } it_behaves_like "a latin transliterator" it "should transliterate various characters" do examples = { "Øivind" => "Oeivind", "Bø" => "Boe", "Åre" => "Aare", "Håkon" => "Haakon" } examples.each { |k, v| expect(t.transliterate(k)).to eql(v) } end end babosa-2.0.0/spec/transliterators/polish_spec.rb000066400000000000000000000005231410162247400217700ustar00rootroot00000000000000# frozen_string_literal: true require "spec_helper" describe Babosa::Transliterator::Romanian do let(:t) { described_class.instance } it_behaves_like "a latin transliterator" it "should transliterate various characters" do expect(t.transliterate("ĄąĆćĘꣳŃńÓóŚśŹźŻż")).to eql("AaCcEeLlNnOoSsZzZz") end end babosa-2.0.0/spec/transliterators/romanian_spec.rb000066400000000000000000000007111410162247400222750ustar00rootroot00000000000000# frozen_string_literal: true require "spec_helper" describe Babosa::Transliterator::Romanian do let(:t) { described_class.instance } it_behaves_like "a latin transliterator" it "should transliterate various characters" do examples = { "Iași" => "Iasi", "Mehedinți" => "Mehedinti", "Țară" => "Tara", "Șanț" => "Sant" } examples.each { |k, v| expect(t.transliterate(k)).to eql(v) } end end babosa-2.0.0/spec/transliterators/russian_spec.rb000066400000000000000000000002731410162247400221600ustar00rootroot00000000000000# frozen_string_literal: true require "spec_helper" describe Babosa::Transliterator::Russian do let(:t) { described_class.instance } it_behaves_like "a cyrillic transliterator" end babosa-2.0.0/spec/transliterators/serbian_spec.rb000066400000000000000000000012161410162247400221150ustar00rootroot00000000000000# frozen_string_literal: true require "spec_helper" describe Babosa::Transliterator::Serbian do let(:t) { described_class.instance } it_behaves_like "a latin transliterator" it_behaves_like "a cyrillic transliterator" it "should transliterate Latin characters" do examples = { "Ðorđe" => "Djordje", "Inđija" => "Indjija", "Četiri" => "Chetiri", "četiri" => "chetiri", "Škola" => "Shkola", "škola" => "shkola", "Ђорђе" => "Djordje", "Инђија" => "Indjija", "Школа" => "Shkola" } examples.each { |k, v| expect(t.transliterate(k)).to eql(v) } end end babosa-2.0.0/spec/transliterators/spanish_spec.rb000066400000000000000000000004201410162247400221330ustar00rootroot00000000000000# frozen_string_literal: true require "spec_helper" describe Babosa::Transliterator::Spanish do let(:t) { described_class.instance } it_behaves_like "a latin transliterator" it "should transliterate ñ" do expect(t.transliterate("ñ")).to eql("ni") end end babosa-2.0.0/spec/transliterators/swedish_spec.rb000066400000000000000000000007231410162247400221420ustar00rootroot00000000000000# frozen_string_literal: true require "spec_helper" describe Babosa::Transliterator::Swedish do let(:t) { described_class.instance } it_behaves_like "a latin transliterator" it "should transliterate various characters" do examples = { "Räksmörgås" => "Raeksmoergaas", "Öre" => "Oere", "Åre" => "Aare", "Älskar" => "Aelskar" } examples.each { |k, v| expect(t.transliterate(k)).to eql(v) } end end babosa-2.0.0/spec/transliterators/turkish_spec.rb000066400000000000000000000013041410162247400221610ustar00rootroot00000000000000# frozen_string_literal: true require "spec_helper" describe Babosa::Transliterator::Turkish do let(:t) { described_class.instance } it_behaves_like "a latin transliterator" it "should transliterate various characters" do examples = { "Nâzım" => "Nazim", "sükûnet" => "sukunet", "millîleştirmek" => "millilestirmek", "mêmur" => "memur", "lôkman" => "lokman", "yoğurt" => "yogurt", "şair" => "sair", "İzmir" => "Izmir", "yığın" => "yigin", "çarşı" => "carsi" } examples.each { |k, v| expect(t.transliterate(k)).to eql(v) } end end babosa-2.0.0/spec/transliterators/ukrainian_spec.rb000066400000000000000000000065151410162247400224620ustar00rootroot00000000000000# frozen_string_literal: true require "spec_helper" describe Babosa::Transliterator::Ukrainian do let(:t) { described_class.instance } it_behaves_like "a cyrillic transliterator" it "should transliterate Cyrillic characters" do examples = { "Алушта" => "Alushta", "Андрій" => "Andrii", "Борщагівка" => "Borshchahivka", "Борисенко" => "Borysenko", "Вінниця" => "Vinnytsia", "Володимир" => "Volodymyr", "Гадяч" => "Hadiach", "Богдан" => "Bohdan", "Ґалаґан" => "Galagan", "Ґорґани" => "Gorgany", "Донецьк" => "Donetsk", "Дмитро" => "Dmytro", "Рівне" => "Rivne", "Олег" => "Oleh", "Есмань" => "Esman", "Єнакієве" => "Yenakiieve", "Гаєвич" => "Haievych", "Короп'є" => "Koropie", "Житомир" => "Zhytomyr", "Жанна" => "Zhanna", "Жежелів" => "Zhezheliv", "Закарпаття" => "Zakarpattia", "Казимирчук" => "Kazymyrchuk", "Медвин" => "Medvyn", "Михайленко" => "Mykhailenko", "Іванків" => "Ivankiv", "Іващенко" => "Ivashchenko", "Їжакевич" => "Yizhakevych", "Кадиївка" => "Kadyivka", "Мар'їне" => "Marine", "Йосипівка" => "Yosypivka", "Стрий" => "Stryi", "Олексій" => "Oleksii", "Київ" => "Kyiv", "Коваленко" => "Kovalenko", "Лебедин" => "Lebedyn", "Леонід" => "Leonid", "Миколаїв" => "Mykolaiv", "Маринич" => "Marynych", "Ніжин" => "Nizhyn", "Наталія" => "Nataliia", "Одеса" => "Odesa", "Онищенко" => "Onyshchenko", "Полтава" => "Poltava", "Петро" => "Petro", "Решетилівка" => "Reshetylivka", "Рибчинський" => "Rybchynskyi", "Суми" => "Sumy", "Соломія" => "Solomiia", "Тернопіль" => "Ternopil", "Троць" => "Trots", "Ужгород" => "Uzhhorod", "Уляна" => "Uliana", "Фастів" => "Fastiv", "Філіпчук" => "Filipchuk", "Харків" => "Kharkiv", "Христина" => "Khrystyna", "Біла Церква" => "Bila Tserkva", "Стеценко" => "Stetsenko", "Чернівці" => "Chernivtsi", "Шевченко" => "Shevchenko", "Шостка" => "Shostka", "Кишеньки" => "Kyshenky", "Щербухи" => "Shcherbukhy", "Гоща" => "Hoshcha", "Гаращенко" => "Harashchenko", "Юрій" => "Yurii", "Корюківка" => "Koriukivka", "Яготин" => "Yahotyn", "Ярошенко" => "Yaroshenko", "Костянтин" => "Kostiantyn", "Знам'янка" => "Znamianka", "Феодосія" => "Feodosiia" } examples.each { |k, v| expect(t.transliterate(k)).to eql(v) } end end babosa-2.0.0/spec/transliterators/vietnamese_spec.rb000066400000000000000000000007011410162247400226300ustar00rootroot00000000000000# frozen_string_literal: true require "spec_helper" describe Babosa::Transliterator::Vietnamese do let(:t) { described_class.instance } it_behaves_like "a latin transliterator" it "should transliterate various characters" do examples = { "làm" => "lam", "đàn ông" => "dan ong", "thật" => "that", "khổ" => "kho" } examples.each { |k, v| expect(t.transliterate(k)).to eql(v) } end end