class Builder
Builds configurations using the application DSL.
Definitions
def initialize(root = Dir.pwd)
Signature
-
parameter
rootString The root for relative configuration files.
Implementation
def initialize(root = Dir.pwd)
@root = File.expand_path(root)
@queues = {}
@default_queue_name = nil
@pending_limit = nil
@permit_limit = 1
end
attr :root
Signature
-
attribute
String The root for relative configuration files.
def load_file(path)
Evaluate a trusted configuration file using this builder.
Signature
-
parameter
pathString The relative or absolute configuration path.
Implementation
def load_file(path)
realpath = File.realpath(File.expand_path(path, @root))
root = @root
@root = File.dirname(realpath)
instance_eval(File.read(realpath), realpath)
ensure
@root = root if root
end
def queue(name, &block)
Define a named request queue. Matchers are evaluated in definition order.
Signature
-
parameter
nameSymbol | String The stable queue name.
-
yields
{|queue| ...} The queue builder, or evaluates the block as its DSL.
-
returns
Queue The configured queue.
Implementation
def queue(name, &block)
name = name.to_sym
raise ArgumentError, "Queue #{name.inspect} is already defined!" if @queues.key?(name)
builder = Queue::Builder.new(name)
if block
if block.arity.zero?
builder.instance_eval(&block)
else
block.call(builder)
end
end
@queues[name] = builder.build
end
def default_queue(name)
Select the fallback queue for unmatched requests.
Signature
-
parameter
nameSymbol | String A defined queue name.
Implementation
def default_queue(name)
@default_queue_name = name.to_sym
end
def pending_limit(value)
Set the global pending request limit.
Signature
-
parameter
valueInteger The maximum number of pending requests.
Implementation
def pending_limit(value)
value = Integer(value)
raise ArgumentError, "Pending limit must not be negative!" if value.negative?
@pending_limit = value
end
def permit_limit(value)
Set the number of processing permits provided by each worker.
Signature
-
parameter
valueInteger The number of permits per worker.
Implementation
def permit_limit(value)
value = Integer(value)
raise ArgumentError, "Permit limit must be positive!" unless value.positive?
@permit_limit = value
end
def build
Validate and build the immutable configuration.
Signature
-
returns
Configuration The configured request queues.
Implementation
def build
raise ArgumentError, "At least one queue must be defined!" if @queues.empty?
default_queue_name = @default_queue_name || @queues.keys.first
raise ArgumentError, "Default queue #{default_queue_name.inspect} is not defined!" unless @queues.key?(default_queue_name)
Configuration.new(
queues: @queues.dup.freeze,
default_queue_name: default_queue_name,
pending_limit: @pending_limit,
permit_limit: @permit_limit,
).freeze
end