Sha256: 1f0e98c07debe8e36b566ce721517995008070e267db2c2d3f7eb58f7963141d

Contents?: true

Size: 1.9 KB

Versions: 1

Compression:

Stored size: 1.9 KB

Contents

# encoding: utf-8

module Rubocop
  module Cop
    module Style
      # This cop checks for big numeric literals without _ between groups
      # of digits in them.
      class NumericLiterals < Cop
        # The parameter is called MinDigits (meaning the minimum number of
        # digits for which an offense can be registered), but essentially it's
        # a Max parameter (the maximum number of something that's allowed).
        include ConfigurableMax

        MSG = 'Separate every 3 digits in the integer portion of a number ' \
              'with underscores(_).'

        def on_int(node)
          check(node)
        end

        def on_fload(node)
          check(node)
        end

        private

        def parameter_name
          'MinDigits'
        end

        def check(node)
          int = integer_part(node)

          # TODO: handle non-decimal literals as well
          return if int.start_with?('0')

          if int.size >= min_digits
            case int
            when /^\d+$/
              add_offense(node, :expression) { self.max = int.size + 1 }
            when /\d{4}/, /_\d{1,2}_/
              add_offense(node, :expression) do
                self.config_to_allow_offenses = { 'Enabled' => false }
              end
            end
          end
        end

        def autocorrect(node)
          @corrections << lambda do |corrector|
            int = node.loc.expression.source.to_i
            formatted_int = int
              .abs
              .to_s
              .reverse
              .gsub(/...(?=.)/, '\&_')
              .reverse
            formatted_int.insert(0, '-') if int < 0
            corrector.replace(node.loc.expression, formatted_int)
          end
        end

        def integer_part(node)
          node.loc.expression.source.sub(/^[+-]/, '').split('.').first
        end

        def min_digits
          cop_config['MinDigits']
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rubocop-0.19.1 lib/rubocop/cop/style/numeric_literals.rb