Class: Toys::Middleware::Spec

Inherits:
Object
  • Object
show all
Defined in:
lib/toys/middleware.rb

Overview

A middleware specification, including the middleware class and the arguments to pass to the constructor.

Use spec to create a middleware spec.

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#argsArray? (readonly)

Returns:

  • (Array)

    the positional arguments to be passed to a middleware class constructor, or the empty array if there are no positional arguments

  • (nil)

    if this spec wraps a middleware object



248
249
250
# File 'lib/toys/middleware.rb', line 248

def args
  @args
end

#blockProc? (readonly)

Returns:

  • (Proc)

    if there is a block argument to be passed to a middleware class constructor

  • (nil)

    if there is no block argument, or this spec wraps a middleware object



263
264
265
# File 'lib/toys/middleware.rb', line 263

def block
  @block
end

#kwargsHash? (readonly)

Returns:

  • (Hash)

    the keyword arguments to be passed to a middleware class constructor, or the empty hash if there are no keyword arguments

  • (nil)

    if this spec wraps a middleware object



255
256
257
# File 'lib/toys/middleware.rb', line 255

def kwargs
  @kwargs
end

#nameString, ... (readonly)

Returns:

  • (String, Symbol)

    if this spec represents a middleware name

  • (Class)

    if this spec represents a middleware class

  • (nil)

    if this spec wraps a middleware object



240
241
242
# File 'lib/toys/middleware.rb', line 240

def name
  @name
end

#objectToys::Middleware? (readonly)

Returns:

  • (Toys::Middleware)

    if this spec wraps a middleware object

  • (nil)

    if this spec represents a class to instantiate



233
234
235
# File 'lib/toys/middleware.rb', line 233

def object
  @object
end

Instance Method Details

#build(lookup) ⇒ Toys::Middleware

Builds a middleware for this spec, given a ModuleLookup for middleware.

If this spec wraps an existing middleware object, returns that object. Otherwise, constructs a middleware object from the spec.

Parameters:

Returns:



211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
# File 'lib/toys/middleware.rb', line 211

def build(lookup)
  return @object unless @object.nil?
  if @name.is_a?(::String) || @name.is_a?(::Symbol)
    klass = lookup&.lookup(@name)
    raise ::NameError, "Unknown middleware name #{@name.inspect}" if klass.nil?
  else
    klass = @name
  end  # Due to a bug in Ruby < 2.7, passing an empty **kwargs splat to
  # initialize will fail if there are no formal keyword args.

  formals = klass.instance_method(:initialize).parameters
  if @kwargs.empty? && formals.all? { |arg| arg.first != :key && arg.first != :keyrest }
    klass.new(*@args, &@block)
  else
    klass.new(*@args, **@kwargs, &@block)
  end
end