free_mutant/lib/mutant/matcher/config.rb
2015-07-12 22:36:24 +00:00

88 lines
2.1 KiB
Ruby

module Mutant
class Matcher
# Subject matcher configuration
class Config
include Adamantium, Anima::Update, Anima.new(
:match_expressions,
:ignore_expressions,
:subject_filters
)
INSPECT_FORMAT = "#<#{self} %s>".freeze
ATTRIBUTE_DELIMITER = ' '.freeze
ATTRIBUTE_FORMAT = '%s: [%s]'.freeze
ENUM_DELIMITER = ','.freeze
EMPTY_ATTRIBUTES = 'empty'.freeze
PRESENTATIONS = IceNine.deep_freeze(
match_expressions: :syntax,
ignore_expressions: :syntax,
subject_filters: :inspect
)
private_constant(*constants(false))
DEFAULT = new(Hash[anima.attribute_names.map { |name| [name, []] }])
# Inspection string
#
# @return [String]
#
# @api private
def inspect
INSPECT_FORMAT % inspect_attributes
end
memoize :inspect
# Add value to configurable collection
#
# @param [Symbol] attribute
# @param [Object] value
#
# @return [Config]
#
# @api private
def add(attribute, value)
update(attribute => public_send(attribute).dup << value)
end
private
# Present attributes
#
# @return [Array<Symbol>]
#
# @api private
def present_attributes
to_h.reject { |_key, value| value.empty? }.keys
end
# Formatted attributes
#
# @return [String]
#
# @api private
def inspect_attributes
attributes = present_attributes
.map(&method(:format_attribute))
.join(ATTRIBUTE_DELIMITER)
attributes.empty? ? EMPTY_ATTRIBUTES : attributes
end
# Format attribute
#
# @param [Symbol] attribute_name
#
# @return [String]
def format_attribute(attribute_name)
ATTRIBUTE_FORMAT %
[
attribute_name,
public_send(attribute_name)
.map(&PRESENTATIONS.fetch(attribute_name))
.join(ENUM_DELIMITER)
]
end
end # Config
end # Matcher
end # Mutant