Class: Lutaml::Qea::Validation::ValidationEngine

Inherits:
Object
  • Object
show all
Defined in:
lib/lutaml/qea/validation/validation_engine.rb

Overview

Main orchestrator for the validation system Coordinates all validators and consolidates results

Examples:

Basic usage

engine = ValidationEngine.new(document, database: db)
result = engine.validate
puts result.summary

With specific validators

engine = ValidationEngine.new(document, database: db)
result = engine.validate(validators: [:package, :class])

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(document, database: nil, **options) ⇒ ValidationEngine

Creates a new validation engine

Parameters:

  • document (Object)

    The document to validate

  • database (Lutaml::Qea::Database) (defaults to: nil)

    Database connection

  • options (Hash)

    Validation options

Options Hash (**options):

  • :strict (Boolean)

    Fail on errors

  • :verbose (Boolean)

    Detailed output

  • :min_severity (Symbol)

    Minimum severity to report

  • :categories (Array<Symbol>)

    Categories to check



43
44
45
46
47
48
49
# File 'lib/lutaml/qea/validation/validation_engine.rb', line 43

def initialize(document, database: nil, **options)
  @document = document
  @database = database
  @options = options
  @registry = ValidatorRegistry.new
  setup_default_validators
end

Instance Attribute Details

#databaseObject (readonly)

Returns the value of attribute database.



32
33
34
# File 'lib/lutaml/qea/validation/validation_engine.rb', line 32

def database
  @database
end

#documentObject (readonly)

Returns the value of attribute document.



32
33
34
# File 'lib/lutaml/qea/validation/validation_engine.rb', line 32

def document
  @document
end

#optionsObject (readonly)

Returns the value of attribute options.



32
33
34
# File 'lib/lutaml/qea/validation/validation_engine.rb', line 32

def options
  @options
end

#registryObject (readonly)

Returns the value of attribute registry.



32
33
34
# File 'lib/lutaml/qea/validation/validation_engine.rb', line 32

def registry
  @registry
end

Instance Method Details

#register_validator(name, validator_class) ⇒ void

This method returns an undefined value.

Registers a custom validator

Parameters:

  • name (Symbol)

    Validator name

  • validator_class (Class)

    Validator class



166
167
168
# File 'lib/lutaml/qea/validation/validation_engine.rb', line 166

def register_validator(name, validator_class)
  @registry.register(name, validator_class)
end

#valid?(validators: nil) ⇒ Boolean

Checks if validation passed (no errors)

Parameters:

  • validators (Array<Symbol>, nil) (defaults to: nil)

    List of validators to run

Returns:

  • (Boolean)


174
175
176
177
# File 'lib/lutaml/qea/validation/validation_engine.rb', line 174

def valid?(validators: nil)
  result = validate(validators: validators)
  !result.has_errors?
end

#validate(validators: nil) ⇒ ValidationResult

Runs validation using two-phase architecture

Phase 1: QEA Database Integrity Validation

  • Validates EA database schema constraints

  • Checks referential integrity

  • Detects orphaned records

  • Finds circular references

Phase 2: UML Tree Structure Validation

  • Validates transformed UML document tree

  • Checks proper nesting

  • Validates duplicate names

  • Verifies type references

Parameters:

  • validators (Array<Symbol>, nil) (defaults to: nil)

    List of validators to run, or nil to run all

Returns:



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/lutaml/qea/validation/validation_engine.rb', line 68

def validate(validators: nil) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
  result = ValidationResult.new
  context = build_context
  context[:result] = result

  # Phase 1: QEA Database Validation
  phase1_result = validate_qea_database(context, validators)

  # Phase 2: UML Tree Validation
  phase2_result = validate_uml_tree(context, validators)

  # Merge results
  phase1_result.messages.each { |msg| result.messages << msg }
  phase2_result.messages.each { |msg| result.messages << msg }

  filter_result(result)
end

#validate_and_display(validators: nil, formatter: :text) ⇒ ValidationResult

Validates and displays the result

Parameters:

  • validators (Array<Symbol>, nil) (defaults to: nil)

    List of validators to run

  • formatter (Symbol) (defaults to: :text)

    Output format (:text, :json, :html)

Returns:



155
156
157
158
159
# File 'lib/lutaml/qea/validation/validation_engine.rb', line 155

def validate_and_display(validators: nil, formatter: :text)
  result = validate(validators: validators)
  display_result(result, formatter)
  result
end

#validate_qea_database(context, validators = nil) ⇒ ValidationResult

Validates QEA database integrity

Parameters:

  • context (Hash)

    Validation context

  • validators (Array<Symbol>, nil) (defaults to: nil)

    Optional validator filter

Returns:



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/lutaml/qea/validation/validation_engine.rb', line 91

def validate_qea_database(context, validators = nil) # rubocop:disable Metrics/MethodLength
  result = ValidationResult.new
  db_context = context.merge(result: result)

  database_validators = %i[
    referential_integrity
    orphan
    circular_reference
    package
  ]

  validator_names = if validators
                      (database_validators & validators)
                    else
                      database_validators
                    end

  validator_names.each do |name|
    next unless @registry.registered?(name)

    @registry.validate(name, db_context)
  end

  result
end

#validate_uml_tree(context, validators = nil) ⇒ ValidationResult

Validates UML document tree structure

Parameters:

  • context (Hash)

    Validation context

  • validators (Array<Symbol>, nil) (defaults to: nil)

    Optional validator filter

Returns:



122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# File 'lib/lutaml/qea/validation/validation_engine.rb', line 122

def validate_uml_tree(context, validators = nil) # rubocop:disable Metrics/MethodLength
  result = ValidationResult.new
  uml_context = context.merge(result: result)

  uml_validators = %i[
    document_structure
    class
    attribute
    operation
    association
    diagram
  ]

  validator_names = if validators
                      (uml_validators & validators)
                    else
                      uml_validators
                    end

  validator_names.each do |name|
    next unless @registry.registered?(name)

    @registry.validate(name, uml_context)
  end

  result
end