lib/key_vortex/constraint.rb in key-vortex-0.2.5 vs lib/key_vortex/constraint.rb in key-vortex-1.0.0

- old
+ new

@@ -4,20 +4,57 @@ require "key_vortex/constraint/length" require "key_vortex/constraint/maximum" require "key_vortex/constraint/minimum" class KeyVortex - class Constraint - def self.build(attribute, value) + # Constraints define a restriction on the values which can be used + # for {KeyVortex::Record} and {KeyVortex::Adapter}. Although they + # are somewhat varied, they do have some common properties. + # + # All constraints have some sort of attribute name and limit. In + # most situations, instead of the constructor, this pair will be + # used to specify the constraint. For example, you would typically + # specify a length like this: + # + # length: 10 + # + # All constraints will inherit from + # {KeyVortex::Constraint::Base}. Because of the common ancestor, + # along with the need to have a single file loading all constraints, + # {KeyVortex::Constraint} is a module instead of the base class to + # avoid a circular dependency. + # + # All constraints can determine if a value is valid for them. + # + # All constraints, when compared with other instances of themselves, + # it can always be determined if ones limitations fit within the + # others. More formally, given an instance x of a constraint, an + # instance y of the same constraint fits within x if and only if for + # all values v that are valid for y, v is also valid for x. + module Constraint + # Factory enabling the specification of constraints by attribute + # names instead of constructors. + # @param attribute [Symbol] + # @param limit [Object] + # @return [KeyVortex::Constraint::Base] Subclass specified by attribute + # @raise [KeyVortex::Error] If the attribute is unknown + def self.build(attribute, limit) case attribute when :length - KeyVortex::Constraint::Length.new(value) + KeyVortex::Constraint::Length.new(limit) when :maximum - KeyVortex::Constraint::Maximum.new(value) + KeyVortex::Constraint::Maximum.new(limit) when :minimum - KeyVortex::Constraint::Minimum.new(value) + KeyVortex::Constraint::Minimum.new(limit) else raise KeyVortex::Error, "Unexpected attribute: #{attribute}" end end end end + +# +# Adapters can also have constraints, though, and if a particular +# type is more constrained then the record KeyVortex will refuse to +# use that record. If you don't specify any constraints, for +# example, the adapter will throw an error unless it is also +# unconstrained on that type.