class KWAttr

Constants

RUBY_ENGINE
VERSION

Public Class Methods

keywords_for_error(keywords) click to toggle source
# File lib/kwattr.rb, line 64
def keywords_for_error(keywords)
  keywords.map(&:inspect)
end
new() click to toggle source
# File lib/kwattr.rb, line 4
def initialize
  @required = []
  @defaults = {}
end

Public Instance Methods

initializer(attrs, opts) click to toggle source
Calls superclass method
# File lib/kwattr.rb, line 9
def initializer(attrs, opts)
  required_attrs = @required
  defaults = @defaults
  required_attrs.concat(attrs).uniq!
  defaults.merge!(opts)
  iv_cache = Hash.new { |h, k| h[k] = :"@#{k}" }

  verbose, $VERBOSE = $VERBOSE, false
  define_method :initialize do |*args, **kwargs, &block|
    required = required_attrs.dup

    defaults.merge(kwargs).each_pair do |key, value|
      next unless required.delete(key) || defaults.key?(key)
      kwargs.delete(key)
      instance_variable_set iv_cache[key], value
    end

    unless required.empty?
      super_required = []
      initialize = method(:initialize)
      initialize.super_method.parameters.each do |type, name|
        super_required << name if type == :keyreq && !kwargs.key?(name)
      end
      required.unshift(*super_required)
      raise ArgumentError,
        "missing keyword#{'s' if required.size > 1}: #{KWAttr.keywords_for_error(required).join(', ')}"
    end


    begin


      if kwargs.empty?
        super(*args, &block) else super(*args, **kwargs, &block)
      end

    rescue ArgumentError
      arity = method(:initialize).super_method.arity
      if !kwargs.empty? && arity != -1 && arity == args.size
        raise ArgumentError,
          "unknown keyword#{'s' if kwargs.size > 1}: #{KWAttr.keywords_for_error(kwargs.keys).join(', ')}"
      end
      raise
    end
  end
  $VERBOSE = verbose
end
inspect() click to toggle source
# File lib/kwattr.rb, line 57
def inspect
  "<KWAttr:#{'%#016x'%(object_id<<1)} @required=#{@required.inspect}, @defaults=#{@defaults.inspect}>"
end