class Builder

Builds configurations using the application DSL.

Definitions

def initialize(root = Dir.pwd)

Signature

parameter root String

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 path String

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 name Symbol | 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 name Symbol | 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 value Integer

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 value Integer

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