Module: Coradoc::Validation

Defined in:
lib/coradoc/validation.rb

Overview

Document validation framework for schema-based validation.

This module provides a flexible validation framework for ensuring documents conform to expected structures and rules.

Examples:

Creating a validation schema

schema = Coradoc::Validation::Schema.define do
  required :title, type: String, min_length: 1
  required :sections, type: Array, min_count: 1
  optional :author, type: String

  rule :check_references do |doc|
    refs = doc.query('xref')
    missing = refs.reject { |r| doc.resolve_reference(r) }
    missing.map { |r| "Unresolved reference: #{r.target}" }
  end
end

Validating a document

result = schema.validate(document)
if result.valid?
  puts "Document is valid"
else
  result.errors.each { |e| puts e.message }
end

Defined Under Namespace

Modules: Rules Classes: Error, Result, Rule, Schema, SchemaGenerator

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.default_schemaSchema

Get the default validation schema

Returns:



672
673
674
675
676
677
# File 'lib/coradoc/validation.rb', line 672

def default_schema
  @default_schema ||= Schema.define do
    optional :id, type: String
    optional :title, type: String
  end
end

Class Method Details

.auto_schema(model_class) ⇒ Schema

Generate a validation schema from a CoreModel class

Examples:

schema = Coradoc::Validation.auto_schema(Coradoc::CoreModel::Block)
result = schema.validate(document)

Parameters:

  • model_class (Class)

    The CoreModel class

  • options (Hash)

    Options passed to SchemaGenerator.generate

Returns:

  • (Schema)

    Generated validation schema



657
658
659
# File 'lib/coradoc/validation.rb', line 657

def auto_schema(model_class, **)
  SchemaGenerator.generate(model_class, **)
end

.define { ... } ⇒ Schema

Define a validation schema

Yields:

  • Schema definition block

Returns:

  • (Schema)

    The defined schema



643
644
645
# File 'lib/coradoc/validation.rb', line 643

def define(&)
  Schema.define(&)
end

.guard_unresolved_includes!(model, format_module) ⇒ Object

Serialization boundary check: formats that cannot represent an unresolved include edge (FormatModule::Interface #preserves_unresolved_includes? == false) must not silently drop the content — raise UnresolvedIncludesError instead, pointing at the hydration step (resolve_includes).



50
51
52
53
54
55
56
57
# File 'lib/coradoc/validation.rb', line 50

def guard_unresolved_includes!(model, format_module)
  return if format_module.preserves_unresolved_includes?

  targets = unresolved_include_targets(model)
  return if targets.empty?

  raise Coradoc::UnresolvedIncludesError, targets
end

.unresolved_include_targets(model) ⇒ Object

Targets of every unresolved include:: edge in the tree (deduplicated, in document order). A document is "unresolved" when it was parsed in graph mode and never went through Coradoc.resolve_includes.



37
38
39
40
41
42
43
# File 'lib/coradoc/validation.rb', line 37

def unresolved_include_targets(model)
  targets = []
  walk_nodes(model) do |node|
    targets << node.target if node.is_a?(Coradoc::CoreModel::Include)
  end
  targets.uniq
end

.validate(document) ⇒ Result

Validate a document with default schema

Parameters:

  • document (Object)

    Document to validate

Returns:

  • (Result)

    Validation result



665
666
667
# File 'lib/coradoc/validation.rb', line 665

def validate(document)
  default_schema.validate(document)
end

.walk_nodes(node) {|node| ... } ⇒ Object

Yields:

  • (node)


59
60
61
62
63
64
65
66
67
68
69
# File 'lib/coradoc/validation.rb', line 59

def walk_nodes(node, &block)
  return unless node.is_a?(Coradoc::CoreModel::Base)

  yield node
  return unless node.is_a?(Coradoc::CoreModel::HasChildren)

  children = node.children
  return unless children

  children.each { |child| walk_nodes(child, &block) }
end