Class: PgSerializable::Visitors::Validation

Inherits:
Base
  • Object
show all
Defined in:
lib/pg_serializable/visitors/validation.rb

Instance Method Summary collapse

Methods inherited from Base

#visit, #visit_method_for, #visit_other, #visit_record, #visit_scope

Instance Method Details

#visit_association_node(subject, **kwargs) ⇒ Object



37
38
39
40
41
42
43
44
45
46
# File 'lib/pg_serializable/visitors/validation.rb', line 37

def visit_association_node(subject, **kwargs)
  klass = subject.klass
  name = subject.name
  if klass.reflect_on_association(name).nil?
    raise PgSerializable::AssociationError.new("association `#{name.to_s}` doesn't exist for class #{klass}")
  end
  if subject.target.trait_manager.get_trait(subject.trait).nil?
    raise PgSerializable::AssociationError.new("trait `#{subject.trait}` doesn't exist for class #{subject.target}")
  end
end

#visit_attribute_node(subject, **kwargs) ⇒ Object



29
30
31
32
33
34
35
# File 'lib/pg_serializable/visitors/validation.rb', line 29

def visit_attribute_node(subject, **kwargs)
  klass = subject.klass
  column_name = subject.column_name
  unless klass.column_names.include? column_name.to_s
    raise PgSerializable::AttributeError.new("column `#{column_name}` doesn't exist for class #{klass}")
  end
end

#visit_class(subject, **kwargs) ⇒ Object



4
5
6
# File 'lib/pg_serializable/visitors/validation.rb', line 4

def visit_class(subject, **kwargs)
  visit subject.trait_manager
end

#visit_node(subject, **kwargs) ⇒ Object



19
20
21
22
23
24
25
26
27
# File 'lib/pg_serializable/visitors/validation.rb', line 19

def visit_node(subject, **kwargs)
  if subject.is_a? PgSerializable::Nodes::Attribute
    visit_attribute_node(subject, **kwargs)
  elsif subject.is_a? PgSerializable::Nodes::Association
    visit_association_node(subject, **kwargs)
  else
    raise UnknownAttributeError.new('validation visitor called with unknow node type')
  end
end

#visit_trait(subject, **kwargs) ⇒ Object



14
15
16
17
# File 'lib/pg_serializable/visitors/validation.rb', line 14

def visit_trait(subject, **kwargs)
  subject.attribute_nodes.each { |attribute_node| visit attribute_node }
  ensure_no_cycles!(subject)
end

#visit_trait_manager(subject, **kwargs) ⇒ Object



8
9
10
11
12
# File 'lib/pg_serializable/visitors/validation.rb', line 8

def visit_trait_manager(subject, **kwargs)
  subject.traits.each do |_, value|
    visit value
  end
end