Sha256: 75f3c290530fa35c94b7b5333c295f56a92d6e8d85b78a17601dbddac52c05ac

Contents?: true

Size: 1.97 KB

Versions: 5

Compression:

Stored size: 1.97 KB

Contents

# frozen_string_literal: true

require_relative 'name_rule'
require_relative 'argument_rule'
require 'fast_ignore'

module Leftovers
  class Rule
    def self.wrap(rules)
      case rules
      when Array then rules.flat_map { |r| wrap(r) }
      when nil then [].freeze
      else new(**rules)
      end
    end

    attr_reader :skip
    alias_method :skip?, :skip

    def initialize( # rubocop:disable Metrics/ParameterLists, Metrics/PerceivedComplexity, Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/AbcSize
      name: nil,
      names: nil,
      calls: nil,
      call: nil,
      skip: false,
      defines: nil,
      define: nil,
      path: nil,
      paths: nil
    )
      raise ArgumentError, 'Only use one of name/names' if name && names
      raise ArgumentError, 'Only use one of path/paths' if path && paths
      raise ArgumentError, 'Only use one of call/calls' if call && calls
      raise ArgumentError, 'Only use one of define/defines' if define && defines
      if skip && (defines || calls)
        raise ArgumentError, "skip can't exist with defines or calls for #{name || names}"
      end

      @name_matcher = NameRule.new(name || names)
      @path = FastIgnore.new(include_rules: path || paths, gitignore: false) if path || paths
      @skip = skip

      begin
        @calls = ArgumentRule.wrap(calls)
      rescue ArgumentError => e
        raise e, "#{e.message} for calls for #{name}", e.backtrace
      end

      begin
        @defines = ArgumentRule.wrap(defines, definer: true)
      rescue ArgumentError => e
        raise e, "#{e.message} for defines for #{name}", e.backtrace
      end
    end

    def filename?(file)
      return true unless @path

      @path.allowed?(file)
    end

    def match?(name, name_s, file)
      @name_matcher.match?(name, name_s) && filename?(file)
    end

    def calls(node)
      @calls.flat_map { |m| m.matches(node) }
    end

    def definitions(node)
      @defines.flat_map { |m| m.matches(node) }
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
leftovers-0.2.3 lib/leftovers/rule.rb
leftovers-0.2.2 lib/leftovers/rule.rb
leftovers-0.2.1 lib/leftovers/rule.rb
leftovers-0.2.0 lib/leftovers/rule.rb
leftovers-0.1.0 lib/leftovers/rule.rb