Module: Xmi::Versioned

Included in:
V20110701, V20131001, V20161101
Defined in:
lib/xmi/versioned.rb

Overview

Base module for version-specific XMI model trees.

Each version module (V20110701, V20131001, V20161101) extends this and provides its own register and namespace bindings.

Examples:

module Xmi::V20131001
  extend Xmi::Versioned

  def self.register_id
    :xmi_20131001
  end

  def self.namespace_classes
    [Xmi::Namespace::Omg::Xmi20131001, Xmi::Namespace::Omg::Uml20131001]
  end

  def self.register_models!
    # Register version-specific models
  end
end

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.extended(base) ⇒ Object

Called when a module extends Versioned



29
30
31
32
33
34
# File 'lib/xmi/versioned.rb', line 29

def self.extended(base)
  base.class_eval do
    @version_register = nil
    @initialized = false
  end
end

Instance Method Details

#create_registerLutaml::Model::Register

Create and configure the register

Returns:

  • (Lutaml::Model::Register)


48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/xmi/versioned.rb', line 48

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

  # Register in GlobalRegister first
  Lutaml::Model::GlobalRegister.register(reg)

  # Bind to all namespaces this version handles
  namespace_classes.each do |ns_class|
    reg.bind_namespace(ns_class)
  end

  @version_register = reg
end

#fallback_registersArray<Symbol>

Get fallback register IDs for this version

Default: fall back to common, then default. Override for version chains (e.g., V20161101 falls back to V20131001).

Returns:

  • (Array<Symbol>)


115
116
117
# File 'lib/xmi/versioned.rb', line 115

def fallback_registers
  %i[xmi_common default]
end

#init_models!void

This method returns an undefined value.

Initialize this version’s model tree

This should be called after all version-specific models are defined. It registers all models in this version’s register.



70
71
72
73
74
75
76
77
# File 'lib/xmi/versioned.rb', line 70

def init_models!
  return if @initialized

  register
  register_models!

  @initialized = true
end

#initialized?Boolean

Check if this version has been initialized

Returns:

  • (Boolean)


141
142
143
# File 'lib/xmi/versioned.rb', line 141

def initialized?
  @initialized
end

#namespace_classesArray<Class>

Get namespace classes this version binds to

Returns:

  • (Array<Class>)

    Array of Lutaml::Xml::Namespace subclasses

Raises:

  • (NotImplementedError)


103
104
105
106
# File 'lib/xmi/versioned.rb', line 103

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

#registerLutaml::Model::Register

Get the register for this version

Returns:

  • (Lutaml::Model::Register)

    The version-specific register



40
41
42
# File 'lib/xmi/versioned.rb', line 40

def register
  @register ||= create_register
end

#register_idSymbol

Get the register ID for this version

Returns:

  • (Symbol)

Raises:

  • (NotImplementedError)


94
95
96
97
# File 'lib/xmi/versioned.rb', line 94

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

#register_models!void

This method returns an undefined value.

Register all models for this version

Override in each version module to register specific models.

Raises:

  • (NotImplementedError)


85
86
87
88
# File 'lib/xmi/versioned.rb', line 85

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

#uml_namespaceClass?

Get the UML namespace class for this version

Returns:

  • (Class, nil)


131
132
133
134
135
# File 'lib/xmi/versioned.rb', line 131

def uml_namespace
  namespace_classes.find do |ns|
    ns.uri.include?("/UML/") && !ns.uri.include?("UMLD")
  end
end

#xmi_namespaceClass?

Get the XMI namespace class for this version

Returns:

  • (Class, nil)


123
124
125
# File 'lib/xmi/versioned.rb', line 123

def xmi_namespace
  namespace_classes.find { |ns| ns.uri.include?("/XMI/") }
end