Sha256: 8f3fd82660c822c465314098a75bf94d2e3f87d39f89a8c2ae47d176302c680f

Contents?: true

Size: 1.96 KB

Versions: 13

Compression:

Stored size: 1.96 KB

Contents

# encoding: utf-8

module RuboCop
  module Cop
    module Style
      # This cop enforces the use of a single string formatting utility.
      # Valid options include Kernel#format, Kernel#sprintf and String#%.
      #
      # The detection of String#% cannot be implemented in a reliable
      # manner for all cases, so only two scenarios are considered -
      # if the first argument is a string literal and if the second
      # argument is an array literal.
      class FormatString < Cop
        include ConfigurableEnforcedStyle

        def on_send(node)
          add_offense(node, :selector) if offending_node?(node)
        end

        private

        def offending_node?(node)
          case style
          when :format
            sprintf?(node) || percent?(node)
          when :sprintf
            format?(node) || percent?(node)
          when :percent
            format?(node) || sprintf?(node)
          end
        end

        def format_method?(name, node)
          receiver, method_name, *args = *node

          # commands have no explicit receiver
          return false unless !receiver && method_name == name

          # we do an argument count check to reduce false positives
          args.size >= 2
        end

        def format?(node)
          format_method?(:format, node)
        end

        def sprintf?(node)
          format_method?(:sprintf, node)
        end

        def percent?(node)
          receiver_node, method_name, *arg_nodes = *node

          method_name == :% &&
            ([:str, :dstr].include?(receiver_node.type) ||
             arg_nodes[0].type == :array)
        end

        def message(node)
          _receiver_node, method_name, *_arg_nodes = *node

          preferred =
            if style == :percent
              'String#%'
            else
              style
            end

          method_name = 'String#%' if method_name == :%

          "Favor `#{preferred}` over `#{method_name}`."
        end
      end
    end
  end
end

Version data entries

13 entries across 13 versions & 1 rubygems

Version Path
rubocop-0.35.1 lib/rubocop/cop/style/format_string.rb
rubocop-0.35.0 lib/rubocop/cop/style/format_string.rb
rubocop-0.34.2 lib/rubocop/cop/style/format_string.rb
rubocop-0.34.1 lib/rubocop/cop/style/format_string.rb
rubocop-0.34.0 lib/rubocop/cop/style/format_string.rb
rubocop-0.33.0 lib/rubocop/cop/style/format_string.rb
rubocop-0.32.1 lib/rubocop/cop/style/format_string.rb
rubocop-0.32.0 lib/rubocop/cop/style/format_string.rb
rubocop-0.31.0 lib/rubocop/cop/style/format_string.rb
rubocop-0.30.1 lib/rubocop/cop/style/format_string.rb
rubocop-0.30.0 lib/rubocop/cop/style/format_string.rb
rubocop-0.29.1 lib/rubocop/cop/style/format_string.rb
rubocop-0.29.0 lib/rubocop/cop/style/format_string.rb