Sha256: e26c02591d0fd56ec972d0464a27a93c13d2804b134f63d9e25e54c0f123b735

Contents?: true

Size: 1.86 KB

Versions: 2

Compression:

Stored size: 1.86 KB

Contents

# frozen_string_literal: true

module Marameters
  # Provides information on a method's parameters.
  class Probe
    CATEGORIES = {
      positionals: %i[req opt],
      keywords: %i[keyreq key],
      splats: %i[rest keyrest]
    }.freeze

    def self.of klass, name, collection: []
      method = klass.instance_method name
      collection << new(method.parameters)
      super_method = method.super_method
      of super_method.owner, super_method.name, collection:
    rescue NameError
      collection
    end

    attr_reader :keywords, :positionals, :splats

    def initialize parameters, categories: CATEGORIES
      @parameters = parameters
      categories.each { |category, kinds| define_variable category, kinds }
    end

    def block = parameters.find { |kind, name| break name if kind == :block }

    def block? = (parameters in [*, [:block, *]])

    def empty? = parameters.empty?

    def keyword_slice collection, keys:
      collection.select { |key| !keys.include?(key) || keywords.include?(key) }
    end

    def keywords? = keywords.any?

    def kind?(value) = parameters.any? { |kind, _name| kind == value }

    def kinds = parameters.map { |kind, _name| kind }

    def name?(value) = parameters.any? { |_kind, name| name == value }

    def names = parameters.map { |_kind, name| name }

    def only_bare_splats? = (parameters in [[:rest]] | [[:keyrest]] | [[:rest], [:keyrest]])

    def only_double_splats? = (parameters in [[:keyrest, *]])

    def only_single_splats? = (parameters in [[:rest, *]])

    def positionals? = positionals.any?

    def splats? = splats.any?

    def to_a = parameters

    private

    attr_reader :parameters

    def define_variable category, kinds
      parameters.filter_map { |kind, name| next name if kinds.include? kind }
                .then { |collection| instance_variable_set "@#{category}", collection }
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
marameters-0.10.0 lib/marameters/probe.rb
marameters-0.9.0 lib/marameters/probe.rb