Module: Oscal::VersionRegistry

Defined in:
lib/oscal/version_registry.rb

Overview

Registry for OSCAL version-specific model trees.

Manages the mapping between OSCAL version strings and their modules. Version detection is based on the <oscal-version> element in the document’s metadata, not on XML namespace (all OSCAL versions share the same namespace: csrc.nist.gov/ns/oscal/1.0).

Examples:

# Get register for OSCAL 1.2.1
register = Oscal::VersionRegistry.register_for_version("1.2.1")
# Detect version from an OSCAL document
version = Oscal::VersionRegistry.detect_version(xml_string)

Class Method Summary collapse

Class Method Details

.available_versionsArray<String>

All registered version strings, sorted.

Returns:

  • (Array<String>)


75
76
77
# File 'lib/oscal/version_registry.rb', line 75

def available_versions
  @versions.keys.sort
end

.detect_model_type(content) ⇒ Symbol?

Detect the root model type from a document.

Parameters:

  • content (String)

    Document content

Returns:

  • (Symbol, nil)

    Model type (:catalog, :profile, etc.)



103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/oscal/version_registry.rb', line 103

def detect_model_type(content)
  return nil if content.nil? || content.strip.empty?

  if content.lstrip.start_with?("<")
    detect_model_type_xml(content)
  elsif content.lstrip.start_with?("{")
    detect_model_type_json(content)
  else
    detect_model_type_yaml(content)
  end
rescue StandardError
  nil
end

.detect_version(content) ⇒ String?

Detect OSCAL version from a document string (XML, JSON, or YAML).

Looks for the “oscal-version” field in the document’s metadata.

Parameters:

  • content (String)

    Document content

Returns:

  • (String, nil)

    Detected version string



85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/oscal/version_registry.rb', line 85

def detect_version(content)
  return nil if content.nil? || content.strip.empty?

  if content.lstrip.start_with?("<")
    detect_version_xml(content)
  elsif content.lstrip.start_with?("{")
    detect_version_json(content)
  else
    detect_version_yaml(content)
  end
rescue StandardError
  nil
end

.latest_moduleModule?

Get the latest registered version module.

Returns:

  • (Module, nil)


55
56
57
58
59
# File 'lib/oscal/version_registry.rb', line 55

def latest_module
  return nil if @versions.empty?

  @versions.values.last
end

.latest_registerLutaml::Model::Register?

Get the latest register (initializes if needed).

Returns:

  • (Lutaml::Model::Register, nil)


64
65
66
67
68
69
70
# File 'lib/oscal/version_registry.rb', line 64

def latest_register
  mod = latest_module
  return nil unless mod

  mod.init_models! unless mod.initialized?
  mod.register
end

.register_for_version(version) ⇒ Lutaml::Model::Register?

Get the register for a specific OSCAL version.

Parameters:

  • version (String)

    OSCAL version string

Returns:

  • (Lutaml::Model::Register, nil)


44
45
46
47
48
49
50
# File 'lib/oscal/version_registry.rb', line 44

def register_for_version(version)
  mod = @versions[version]
  return nil unless mod

  mod.init_models! unless mod.initialized?
  mod.register
end

.register_version(version, mod) ⇒ Object

Register a version module.

Parameters:

  • version (String)

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

  • mod (Module)

    The version module (e.g., Oscal::V1_2_1)



28
29
30
# File 'lib/oscal/version_registry.rb', line 28

def register_version(version, mod)
  @versions = @versions.merge(version => mod)
end

.version_module(version) ⇒ Module?

Get the version module for a version string.

Parameters:

  • version (String)

    OSCAL version string

Returns:

  • (Module, nil)


36
37
38
# File 'lib/oscal/version_registry.rb', line 36

def version_module(version)
  @versions[version]
end