Module: Oscal::Versioned

Included in:
V1_2_1
Defined in:
lib/oscal/versioned.rb

Overview

Base module for version-specific OSCAL model trees.

Each version module (V1_2_1, V1_3_0, etc.) extends this and provides its own register.

Unlike XMI which uses namespace-based version detection, OSCAL uses schema-version-based detection (the <oscal-version> element in metadata). All OSCAL versions share the same XML namespace.

Examples:

module Oscal::V1_2_1
  extend Oscal::Versioned

  def self.register_id
    :oscal_1_2_1
  end

  def self.oscal_version
    "1.2.1"
  end

  def self.fallback_registers
    %i[oscal_common default]
  end

  def self.register_models!
    # Load pre-generated or runtime-generated classes
  end
end

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.extended(base) ⇒ Object



34
35
36
37
38
39
# File 'lib/oscal/versioned.rb', line 34

def self.extended(base)
  base.instance_eval do
    @register = nil
    @initialized = false
  end
end

Instance Method Details

#create_registerObject

Create and configure the register with fallback chain.



47
48
49
50
51
52
# File 'lib/oscal/versioned.rb', line 47

def create_register
  reg = Lutaml::Model::Register.new(register_id,
                                    fallback: fallback_registers)
  Lutaml::Model::GlobalRegister.register(reg)
  reg
end

#fallback_registersObject

Override: fallback register IDs for type resolution. Default chain: common types, then global default.



80
81
82
# File 'lib/oscal/versioned.rb', line 80

def fallback_registers
  %i[oscal_common default]
end

#init_models!Object

Initialize this version’s model tree. Safe to call multiple times.



55
56
57
58
59
60
61
# File 'lib/oscal/versioned.rb', line 55

def init_models!
  return if @initialized

  register
  register_models!
  @initialized = true
end

#initialized?Boolean

Returns:

  • (Boolean)


84
85
86
# File 'lib/oscal/versioned.rb', line 84

def initialized?
  @initialized
end

#oscal_versionObject

Override: the OSCAL version string (e.g., “1.2.1”).

Raises:

  • (NotImplementedError)


74
75
76
# File 'lib/oscal/versioned.rb', line 74

def oscal_version
  raise NotImplementedError, "Each version must implement #oscal_version"
end

#registerObject

The version-specific register for type resolution.



42
43
44
# File 'lib/oscal/versioned.rb', line 42

def register
  @register ||= create_register
end

#register_idObject

Override: the register ID symbol for this version.

Raises:

  • (NotImplementedError)


69
70
71
# File 'lib/oscal/versioned.rb', line 69

def register_id
  raise NotImplementedError, "Each version must implement #register_id"
end

#register_models!Object

Override in each version module to load/register model classes.

Raises:

  • (NotImplementedError)


64
65
66
# File 'lib/oscal/versioned.rb', line 64

def register_models!
  raise NotImplementedError, "Each version must implement #register_models!"
end