Class: SvgConform::References::ReferenceManifest

Inherits:
Lutaml::Model::Serializable
  • Object
show all
Defined in:
lib/svg_conform/references/reference_manifest.rb

Overview

Comprehensive manifest of all IDs and references in the document Provides complete context for consumer validation decisions

Instance Method Summary collapse

Constructor Details

#initialize(source_document: nil) ⇒ ReferenceManifest

Returns a new instance of ReferenceManifest.



37
38
39
40
41
42
43
# File 'lib/svg_conform/references/reference_manifest.rb', line 37

def initialize(source_document: nil)
  super()
  @source_document = source_document
  @available_ids = []
  @internal_references = []
  @external_references = []
end

Instance Method Details

#id_defined?(id_value) ⇒ Boolean

Check if an ID is defined

Returns:

  • (Boolean)


66
67
68
# File 'lib/svg_conform/references/reference_manifest.rb', line 66

def id_defined?(id_value)
  @available_ids.any? { |id_def| id_def.id_value == id_value }
end

#references_by_typeObject

Get all references grouped by type



79
80
81
82
# File 'lib/svg_conform/references/reference_manifest.rb', line 79

def references_by_type
  all_refs = @internal_references + @external_references
  all_refs.group_by { |ref| ref.class.name.split("::").last }
end

#references_to_id(id_value) ⇒ Object

Get references targeting a specific ID



71
72
73
74
75
76
# File 'lib/svg_conform/references/reference_manifest.rb', line 71

def references_to_id(id_value)
  @internal_references.select do |ref|
    ref.is_a?(InternalFragmentReference) &&
      ref.target_id == id_value
  end
end

#register_id(id_value, element_name:, line_number: nil, column_number: nil) ⇒ Object

Register an ID definition



46
47
48
49
50
51
52
53
54
# File 'lib/svg_conform/references/reference_manifest.rb', line 46

def register_id(id_value, element_name:, line_number: nil,
column_number: nil)
  @available_ids << IdDefinition.new(
    id_value: id_value,
    element_name: element_name,
    line_number: line_number,
    column_number: column_number,
  )
end

#register_reference(reference) ⇒ Object

Register a reference



57
58
59
60
61
62
63
# File 'lib/svg_conform/references/reference_manifest.rb', line 57

def register_reference(reference)
  if reference.internally_validatable?
    @internal_references << reference
  elsif reference.requires_consumer_validation?
    @external_references << reference
  end
end

#statisticsObject

Get statistics



94
95
96
97
98
99
100
101
102
103
# File 'lib/svg_conform/references/reference_manifest.rb', line 94

def statistics
  {
    total_ids: @available_ids.size,
    total_references: @internal_references.size + @external_references.size,
    internal_references: @internal_references.size,
    external_references: @external_references.size,
    unresolved_internal: unresolved_internal_references.size,
    references_by_type: references_by_type.transform_values(&:size),
  }
end

#to_hObject

Export manifest for consumer processing



106
107
108
109
110
111
112
113
114
# File 'lib/svg_conform/references/reference_manifest.rb', line 106

def to_h
  {
    source_document: @source_document,
    available_ids: @available_ids.map(&:to_h),
    internal_references: @internal_references.map(&:to_h),
    external_references: @external_references.map(&:to_h),
    statistics: statistics,
  }
end

#to_json(*_args) ⇒ Object

Export as JSON for programmatic processing



123
124
125
126
# File 'lib/svg_conform/references/reference_manifest.rb', line 123

def to_json(*_args)
  require "json"
  JSON.pretty_generate(to_h)
end

#to_yamlObject

Export as YAML for easy inspection



117
118
119
120
# File 'lib/svg_conform/references/reference_manifest.rb', line 117

def to_yaml
  require "yaml"
  to_h.to_yaml
end

#unresolved_internal_referencesObject

Get unresolved internal references (references to non-existent IDs)



85
86
87
88
89
90
91
# File 'lib/svg_conform/references/reference_manifest.rb', line 85

def unresolved_internal_references
  @internal_references.select do |ref|
    next unless ref.is_a?(InternalFragmentReference)

    !id_defined?(ref.target_id)
  end
end