Class: Assertion::Base

Inherits:
Object
  • Object
show all
Extended by:
DSL::Attributes, DSL::Caller, DSL::Inversion
Defined in:
lib/assertion/base.rb

Overview

The base class for assertions about some attributes

Every assertion should define a list of attributes to be checked and the [#check] method to apply the assertion to those attributes

The assertion ‘call` method provides the object, describing the state of the assertion applied to its attributes. The provided state carries the result of the checkup and a corresponding <error> message. Later it can be composed with other states to provide complex validation.

The class DSL also defines shortcuts:

  • .[]

    can be used to initialize the assertion for given attributes and

    then apply it immediately with creation of the corresponding state.

  • .not

    can be used to provide the assertion opposite to the initial one.

Examples:

class IsAdult < Assertion::Base
  attribute :name, :age

  def check
    age >= 18
  end
end

child = IsAdult.not

jane = { name: "Jane", age: 12 }
IsAdult[jane].valid? # => false
child[jane].valid? # => true

Direct Known Subclasses

Inversion

Instance Attribute Summary collapse

Class Method Summary collapse

Methods included from DSL::Attributes

attribute, extended

Methods included from DSL::Inversion

not

Methods included from DSL::Caller

[]

Instance Attribute Details

#attributesHash (readonly)

Returns The hash of the allowed attributes having been initialized.

Examples:

IsAdult = Assertion.about :name, :age do
  age >= 18
end

adult = IsAdult[name: "Joe", age: 15, gender: :male]
adult.attributes # => { name: "Joe", age: 15 }

Returns:

  • (Hash)

    The hash of the allowed attributes having been initialized



63
64
65
# File 'lib/assertion/base.rb', line 63

def attributes
  @attributes
end

Class Method Details

.callAssertion::State

Calls the assertion checkup and returns the resulting state

The state is a unified composable object, unaware of the structure and attributes of the specific assertion.

Returns:

  • (Assertion::State)

    The state of the assertion being applied to its attributes



98
99
100
# File 'lib/assertion/base.rb', line 98

def call
  State.new check, message
end

.initialize(args = {}) ⇒ Object



74
75
76
77
78
# File 'lib/assertion/base.rb', line 74

def initialize(args = {})
  keys = self.class.attributes
  @attributes = Hash[keys.zip(args.values_at(*keys))]
  freeze
end

.message(state = nil) ⇒ String

Returns the message describing the current state

Parameters:

  • state (Boolean) (defaults to: nil)

    The state to describe

Returns:

  • (String)


86
87
88
# File 'lib/assertion/base.rb', line 86

def message(state = nil)
  self.class.translator.call(state, attributes)
end

.new(args = {}) ⇒ Assertion::Base

Initializes an assertion for the current object

Parameters:

  • args (Hash) (defaults to: {})

    The arguments to check

Returns:



# File 'lib/assertion/base.rb', line 65

.translatorAssertion::Translator

The translator of states for the current class



46
47
48
# File 'lib/assertion/base.rb', line 46

def self.translator
  @translator ||= Translator.new(self)
end