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 element in the document's metadata, not on XML namespace (all OSCAL versions share the same namespace: http://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.



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.



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.



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.



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).



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.



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.



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.



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

def version_module(version)
  @versions[version]
end