Class: Fontisan::Validation::Validator

Inherits:
Object
  • Object
show all
Defined in:
lib/fontisan/validation/validator.rb

Overview

Validator is the main orchestrator for font validation

This class coordinates all validation checks (tables, structure, consistency, checksums) and produces a comprehensive ValidationReport.

Single Responsibility: Orchestration of validation workflow

Examples:

Validating a font

validator = Validator.new(level: :standard)
report = validator.validate(font, font_path)
puts report.text_summary

Constant Summary collapse

LEVELS =

Validation levels

%i[strict standard lenient].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(level: :standard, rules_path: nil) ⇒ Validator

Initialize validator

Parameters:

  • level (Symbol) (defaults to: :standard)

    Validation level (:strict, :standard, :lenient)

  • rules_path (String, nil) (defaults to: nil)

    Path to custom rules file



31
32
33
34
35
36
37
38
39
40
# File 'lib/fontisan/validation/validator.rb', line 31

def initialize(level: :standard, rules_path: nil)
  @level = level
  validate_level!

  @rules = load_rules(rules_path)
  @table_validator = TableValidator.new(@rules)
  @structure_validator = StructureValidator.new(@rules)
  @consistency_validator = ConsistencyValidator.new(@rules)
  @checksum_validator = ChecksumValidator.new(@rules)
end

Instance Attribute Details

#levelSymbol (readonly)

Get the current validation level

Returns:

  • (Symbol)

    The validation level



97
98
99
# File 'lib/fontisan/validation/validator.rb', line 97

def level
  @level
end

Instance Method Details

#validate(font, font_path) ⇒ Models::ValidationReport

Validate a font

Parameters:

Returns:



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/fontisan/validation/validator.rb', line 47

def validate(font, font_path)
  report = Models::ValidationReport.new(
    font_path: font_path,
    valid: true,
  )

  begin
    # Run all validation checks
    all_issues = []

    # 1. Table validation
    all_issues.concat(@table_validator.validate(font))

    # 2. Structure validation
    all_issues.concat(@structure_validator.validate(font))

    # 3. Consistency validation
    all_issues.concat(@consistency_validator.validate(font))

    # 4. Checksum validation (requires file path)
    all_issues.concat(@checksum_validator.validate(font, font_path))

    # Add issues to report
    all_issues.each do |issue|
      case issue[:severity]
      when "error"
        report.add_error(issue[:category], issue[:message],
                         issue[:location])
      when "warning"
        report.add_warning(issue[:category], issue[:message],
                           issue[:location])
      when "info"
        report.add_info(issue[:category], issue[:message],
                        issue[:location])
      end
    end

    # Determine overall validity based on level
    report.valid = determine_validity(report)
  rescue StandardError => e
    report.add_error("validation", "Validation failed: #{e.message}", nil)
    report.valid = false
  end

  report
end