Class: Coradoc::CoreModel::Base

Inherits:
Lutaml::Model::Serializable
  • Object
show all
Defined in:
lib/coradoc/core_model/base.rb

Overview

Base class for all core models

Provides common functionality for schema-agnostic document models. This class establishes the foundational structure for all CoreModel classes, including semantic equivalence comparison and common attributes.

Examples:

Creating a base model

model = CoreModel::Base.new(
  id: "example-1",
  title: "Example Title",
  element_attributes: [
    CoreModel::ElementAttribute.new(name: "role", value: "note")
  ]
)

Semantic comparison

model1 = CoreModel::Base.new(id: "test", title: "Test")
model2 = CoreModel::Base.new(id: "test", title: "Test")
model1.semantically_equivalent?(model2) # => true

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#element_attributesArray<ElementAttribute>

Returns collection of element attributes.

Returns:



38
# File 'lib/coradoc/core_model/base.rb', line 38

attribute :element_attributes, ElementAttribute, collection: true

#idString?

Returns unique identifier for the element.

Returns:

  • (String, nil)

    unique identifier for the element



30
# File 'lib/coradoc/core_model/base.rb', line 30

attribute :id, :string

#metadata_entriesArray<MetadataEntry>

Returns additional metadata entries.

Returns:



42
# File 'lib/coradoc/core_model/base.rb', line 42

attribute :metadata_entries, MetadataEntry, collection: true

#titleString?

Returns title of the element.

Returns:

  • (String, nil)

    title of the element



34
# File 'lib/coradoc/core_model/base.rb', line 34

attribute :title, :string

Instance Method Details

#accept(visitor) ⇒ void

This method returns an undefined value.

Accept a visitor to traverse this element

Implements the visitor pattern for document traversal. The visitor’s visit method will be called with this element.

Parameters:



127
128
129
# File 'lib/coradoc/core_model/base.rb', line 127

def accept(visitor)
  visitor.visit(self)
end

#attrHash #attr(name) ⇒ String?

Get all element attributes as a hash, or a specific attribute value by name

Overloads:

  • #attrHash

    Returns All attributes as key-value pairs.

    Returns:

    • (Hash)

      All attributes as key-value pairs

  • #attr(name) ⇒ String?

    Returns The value or nil.

    Parameters:

    • name (String)

      The attribute name

    Returns:

    • (String, nil)

      The value or nil



80
81
82
83
84
85
86
87
88
89
# File 'lib/coradoc/core_model/base.rb', line 80

def attr(name = nil)
  attrs = element_attributes || []
  if name.nil?
    # Return all attributes as hash
    attrs.each_with_object({}) { |a, h| h[a.name] = a.value }
  else
    # Return specific value
    attrs.find { |a| a.name == name }&.value
  end
end

#metadataHash #metadata(key) ⇒ String?

Get all metadata as a hash, or a specific metadata value by key

Overloads:

  • #metadataHash

    Returns All metadata as key-value pairs.

    Returns:

    • (Hash)

      All metadata as key-value pairs

  • #metadata(key) ⇒ String?

    Returns The value or nil.

    Parameters:

    • key (String)

      The metadata key

    Returns:

    • (String, nil)

      The value or nil



50
51
52
53
54
55
56
57
58
59
# File 'lib/coradoc/core_model/base.rb', line 50

def (key = nil)
  entries =  || []
  if key.nil?
    # Return all metadata as hash
    entries.each_with_object({}) { |e, h| h[e.key] = e.value }
  else
    # Return specific value
    entries.find { |e| e.key == key }&.value
  end
end

#semantically_equivalent?(other) ⇒ Boolean

Compare this model with another for semantic equivalence

Semantic equivalence means the models represent the same semantic content, even if their exact structure differs. This is different from equality, which requires exact matching.

Parameters:

  • other (Object)

    the object to compare with

Returns:

  • (Boolean)

    true if semantically equivalent, false otherwise



112
113
114
115
116
117
118
# File 'lib/coradoc/core_model/base.rb', line 112

def semantically_equivalent?(other)
  return false unless other.is_a?(self.class)

  comparable_attributes.all? do |attr|
    compare_attribute(attr, other)
  end
end

#set_attr(name, value) ⇒ Object

Set attribute value

Parameters:

  • name (String)

    The attribute name

  • value (String)

    The value to set



94
95
96
97
98
99
100
101
102
# File 'lib/coradoc/core_model/base.rb', line 94

def set_attr(name, value)
  self.element_attributes ||= []
  existing = element_attributes.find { |a| a.name == name }
  if existing
    existing.value = value
  else
    element_attributes << ElementAttribute.new(name: name, value: value)
  end
end

#set_metadata(key, value) ⇒ Object

Convenience method to set metadata

Parameters:

  • key (String)

    The metadata key

  • value (String)

    The value to set



64
65
66
67
68
69
70
71
72
# File 'lib/coradoc/core_model/base.rb', line 64

def (key, value)
  self. ||= []
  existing = .find { |e| e.key == key }
  if existing
    existing.value = value
  else
     << MetadataEntry.new(key: key, value: value)
  end
end