Class: Expressir::Manifest::Validator
- Inherits:
-
Object
- Object
- Expressir::Manifest::Validator
- Defined in:
- lib/expressir/manifest/validator.rb
Overview
Validates schema manifests for completeness and integrity Performs three types of validation:
-
File existence - checks if schema files exist
-
Path completeness - warns about missing paths
-
Referential integrity - validates USE/REFERENCE FROM resolution
Instance Attribute Summary collapse
-
#manifest ⇒ Object
readonly
Returns the value of attribute manifest.
-
#options ⇒ Object
readonly
Returns the value of attribute options.
Instance Method Summary collapse
-
#initialize(manifest, options = {}) ⇒ Validator
constructor
Initialize validator.
-
#validate_file_existence ⇒ Array<Hash>
Validate that all schema files exist on disk.
-
#validate_path_completeness ⇒ Array<Hash>
Validate that all schemas have paths specified.
-
#validate_referential_integrity ⇒ Array<Hash>
Validate referential integrity using DependencyResolver Checks that all USE FROM and REFERENCE FROM interfaces can be resolved.
-
#validate_schema_names ⇒ Array<Hash>
Validate that manifest IDs match actual schema names in files.
Constructor Details
#initialize(manifest, options = {}) ⇒ Validator
Initialize validator
17 18 19 20 21 |
# File 'lib/expressir/manifest/validator.rb', line 17 def initialize(manifest, = {}) @manifest = manifest @options = @base_dirs = extract_base_dirs_from_manifest end |
Instance Attribute Details
#manifest ⇒ Object (readonly)
Returns the value of attribute manifest.
11 12 13 |
# File 'lib/expressir/manifest/validator.rb', line 11 def manifest @manifest end |
#options ⇒ Object (readonly)
Returns the value of attribute options.
11 12 13 |
# File 'lib/expressir/manifest/validator.rb', line 11 def @options end |
Instance Method Details
#validate_file_existence ⇒ Array<Hash>
Validate that all schema files exist on disk
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
# File 'lib/expressir/manifest/validator.rb', line 25 def validate_file_existence errors = [] manifest.schemas.each do |schema_entry| next if schema_entry.path.nil? || schema_entry.path.empty? unless File.exist?(schema_entry.path) errors << { schema: schema_entry.id, path: schema_entry.path, message: "Schema file not found: #{schema_entry.path} (#{schema_entry.id})", } end end errors end |
#validate_path_completeness ⇒ Array<Hash>
Validate that all schemas have paths specified
43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/expressir/manifest/validator.rb', line 43 def validate_path_completeness warnings = [] manifest.schemas.each do |schema_entry| if schema_entry.path.nil? || schema_entry.path.empty? warnings << { schema: schema_entry.id, message: "Schema '#{schema_entry.id}' has no path specified - please provide path", } end end warnings end |
#validate_referential_integrity ⇒ Array<Hash>
Validate referential integrity using DependencyResolver Checks that all USE FROM and REFERENCE FROM interfaces can be resolved
85 86 87 88 89 90 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 116 117 118 119 120 121 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 149 150 151 152 |
# File 'lib/expressir/manifest/validator.rb', line 85 def validate_referential_integrity errors = [] # Filter schemas to validate schemas_to_validate = manifest.schemas.select do |s| !s.path.nil? && !s.path.empty? && File.exist?(s.path) end # Show header if verbose if @options[:verbose] puts "Validating referential integrity for #{schemas_to_validate.size} schemas..." puts "" end # Create resolver ONCE for all schemas (efficiency) # Share verbose output behavior with manifest create command (DRY) resolver = Model::DependencyResolver.new( base_dirs: @base_dirs, schema_registry: build_schema_registry, verbose: @options[:verbose], # Let resolver show detailed interface resolution ) schemas_to_validate.each do |schema_entry| # Extract interfaces from this schema begin interfaces = resolver.extract_interfaces(schema_entry.path) rescue StandardError => e errors << { schema: schema_entry.id, path: schema_entry.path, message: "Failed to parse schema: #{e.}", } next end # Check each interface can be resolved # The resolver will print verbose output for each resolution when verbose=true interfaces.each do |interface| # Print schema name context if verbose (matches create command style) if @options[:verbose] print " #{interface[:kind]} FROM #{interface[:schema_name]} (in #{schema_entry.id}): " end resolved_path = resolver.resolve_schema_location( interface[:schema_name], interface[:kind], schema_entry.path, ) if resolved_path.nil? puts "\e[31m✗ not found\e[0m" if @options[:verbose] errors << { schema: schema_entry.id, path: schema_entry.path, interface_kind: interface[:kind], referenced_schema: interface[:schema_name], message: "Cannot resolve #{interface[:kind]} FROM #{interface[:schema_name]} in #{schema_entry.id}", } elsif @options[:verbose] relative_path = File.basename(resolved_path) puts "\e[32m✓\e[0m #{relative_path}" end end end errors end |
#validate_schema_names ⇒ Array<Hash>
Validate that manifest IDs match actual schema names in files
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/expressir/manifest/validator.rb', line 58 def validate_schema_names errors = [] manifest.schemas.each do |schema_entry| next if schema_entry.path.nil? || schema_entry.path.empty? next unless File.exist?(schema_entry.path) begin actual_name = extract_schema_name(schema_entry.path) if actual_name != schema_entry.id errors << { schema: schema_entry.id, path: schema_entry.path, actual_name: actual_name, message: "Schema ID mismatch: manifest has '#{schema_entry.id}' but file declares '#{actual_name}'", } end rescue StandardError # Skip validation if we can't parse the file next end end errors end |