for testing and deploying your application
for finding and fixing issues
for empowering human code reviews
module Koine
module Attributes
module Adapter
class Base
attr_accessor :attribute_name
def initialize
@attribute_name = 'AnonymousAttribute'
end
def coerce(value)
return coerce_nil if value.nil?
coerce_not_nil(value)
def default_value
@default_value.respond_to?(:call) &&
@default_value.call ||
@default_value
def with_nil_value(value = nil, &block)
@nil_value_set = true
@nil_value = value
@nil_value = block if block
self
def with_default_value(value = nil, &block)
@default_value = value
@default_value = block if block
private
def coerce_nil
if @nil_value_set
return @nil_value.respond_to?(:call) ? @nil_value.call : @nil_value
raise ArgumentError, 'Cannot be nil', attribute_name
def coerce_not_nil(_value)
raise NotImplementedError
# duplicates if possible and freezes object
def secure
value = yield
unless value.is_a?(::Symbol)
value = value.dup if value.respond_to?(:dup)
value.freeze
def wrap_errors
yield
rescue StandardError => error
raise Koine::Attributes::ArgumentError.new(error, attribute_name)