xmi 0.3.21 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/release.yml +13 -6
  3. data/.gitignore +2 -1
  4. data/.rubocop.yml +12 -13
  5. data/.rubocop_todo.yml +150 -13
  6. data/CHANGELOG.md +55 -0
  7. data/CODE_OF_CONDUCT.md +84 -0
  8. data/Gemfile +10 -0
  9. data/README.adoc +319 -6
  10. data/benchmark_parse.rb +60 -0
  11. data/docs/migration.md +141 -0
  12. data/docs/versioning.md +255 -0
  13. data/lib/xmi/add.rb +14 -38
  14. data/lib/xmi/{the_custom_profile.rb → custom_profile.rb} +25 -25
  15. data/lib/xmi/delete.rb +14 -38
  16. data/lib/xmi/difference.rb +14 -38
  17. data/lib/xmi/documentation.rb +16 -101
  18. data/lib/xmi/ea_root.rb +114 -33
  19. data/lib/xmi/extension.rb +6 -6
  20. data/lib/xmi/namespace/dynamic.rb +28 -0
  21. data/lib/xmi/namespace/omg.rb +81 -0
  22. data/lib/xmi/namespace/sparx.rb +39 -0
  23. data/lib/xmi/namespace.rb +9 -0
  24. data/lib/xmi/namespace_detector.rb +138 -0
  25. data/lib/xmi/namespace_registry.rb +119 -0
  26. data/lib/xmi/parsing.rb +113 -0
  27. data/lib/xmi/replace.rb +14 -38
  28. data/lib/xmi/root.rb +49 -213
  29. data/lib/xmi/sparx/connector.rb +241 -0
  30. data/lib/xmi/sparx/custom_profile.rb +19 -0
  31. data/lib/xmi/sparx/diagram.rb +97 -0
  32. data/lib/xmi/sparx/ea_stub.rb +20 -0
  33. data/lib/xmi/{extensions/eauml.rb → sparx/ea_uml.rb} +3 -2
  34. data/lib/xmi/sparx/element.rb +453 -0
  35. data/lib/xmi/sparx/extension.rb +43 -0
  36. data/lib/xmi/{extensions → sparx}/gml.rb +9 -3
  37. data/lib/xmi/sparx/mappings/base_mapping.rb +182 -0
  38. data/lib/xmi/sparx/mappings.rb +10 -0
  39. data/lib/xmi/sparx/primitive_type.rb +18 -0
  40. data/lib/xmi/sparx/root.rb +60 -0
  41. data/lib/xmi/sparx/sys_ph_s.rb +18 -0
  42. data/lib/xmi/sparx.rb +17 -1376
  43. data/lib/xmi/type.rb +37 -0
  44. data/lib/xmi/uml.rb +191 -469
  45. data/lib/xmi/v20110701.rb +81 -0
  46. data/lib/xmi/v20131001.rb +68 -0
  47. data/lib/xmi/v20161101.rb +61 -0
  48. data/lib/xmi/version.rb +1 -1
  49. data/lib/xmi/version_registry.rb +164 -0
  50. data/lib/xmi/versioned.rb +142 -0
  51. data/lib/xmi.rb +83 -11
  52. data/scripts-xmi-profile/profile_xmi_simple.rb +213 -0
  53. data/xmi.gemspec +3 -9
  54. metadata +38 -77
@@ -3,13 +3,13 @@
3
3
  require_relative "extension"
4
4
 
5
5
  module Xmi
6
- class Documentation < Lutaml::Model::Serializable # rubocop:disable Metrics/ClassLength
7
- attribute :id, :string
8
- attribute :label, :string
9
- attribute :uuid, :string
6
+ class Documentation < Lutaml::Model::Serializable
7
+ attribute :id, ::Xmi::Type::XmiId
8
+ attribute :label, ::Xmi::Type::XmiLabel
9
+ attribute :uuid, ::Xmi::Type::XmiUuid
10
10
  attribute :href, :string
11
- attribute :idref, :string
12
- attribute :type, :string
11
+ attribute :idref, ::Xmi::Type::XmiIdRef
12
+ attribute :type, ::Xmi::Type::XmiType
13
13
  attribute :contact, :string, collection: true
14
14
  attribute :exporter, :string
15
15
  attribute :exporter_version, :string
@@ -21,9 +21,9 @@ module Xmi
21
21
  attribute :timestamp, :time, collection: true
22
22
  attribute :extension, Extension, collection: true
23
23
 
24
- xml do # rubocop:disable Metrics/BlockLength
24
+ xml do
25
25
  root "Documentation"
26
- namespace "http://www.omg.org/spec/XMI/20131001", "xmi"
26
+ namespace ::Xmi::Namespace::Omg::Xmi
27
27
 
28
28
  map_attribute "id", to: :id
29
29
  map_attribute "label", to: :label
@@ -35,99 +35,14 @@ module Xmi
35
35
  map_attribute "exporterVersion", to: :exporter_version
36
36
  map_attribute "exporterID", to: :exporter_id
37
37
 
38
- map_element "contact", to: :contact, prefix: nil, namespace: nil,
39
- value_map: {
40
- from: {
41
- nil: :empty,
42
- empty: :empty,
43
- omitted: :empty
44
- },
45
- to: {
46
- nil: :empty,
47
- empty: :empty,
48
- omitted: :empty
49
- }
50
- }
51
- map_element "longDescription", to: :long_description, prefix: nil,
52
- namespace: nil,
53
- value_map: {
54
- from: {
55
- nil: :empty,
56
- empty: :empty,
57
- omitted: :empty
58
- },
59
- to: {
60
- nil: :empty,
61
- empty: :empty,
62
- omitted: :empty
63
- }
64
- }
65
- map_element "shortDescription", to: :short_description, prefix: nil,
66
- namespace: nil,
67
- value_map: {
68
- from: {
69
- nil: :empty,
70
- empty: :empty,
71
- omitted: :empty
72
- },
73
- to: {
74
- nil: :empty,
75
- empty: :empty,
76
- omitted: :empty
77
- }
78
- }
79
- map_element "notice", to: :notice, prefix: nil, namespace: nil,
80
- value_map: {
81
- from: {
82
- nil: :empty,
83
- empty: :empty,
84
- omitted: :empty
85
- },
86
- to: {
87
- nil: :empty,
88
- empty: :empty,
89
- omitted: :empty
90
- }
91
- }
92
- map_element "owner", to: :owner, prefix: nil, namespace: nil,
93
- value_map: {
94
- from: {
95
- nil: :empty,
96
- empty: :empty,
97
- omitted: :empty
98
- },
99
- to: {
100
- nil: :empty,
101
- empty: :empty,
102
- omitted: :empty
103
- }
104
- }
105
- map_element "timestamp", to: :timestamp, prefix: nil, namespace: nil,
106
- value_map: {
107
- from: {
108
- nil: :empty,
109
- empty: :empty,
110
- omitted: :empty
111
- },
112
- to: {
113
- nil: :empty,
114
- empty: :empty,
115
- omitted: :empty
116
- }
117
- }
118
- map_element "Extension", to: :extension,
119
- value_map: {
120
- from: {
121
- nil: :empty,
122
- empty: :empty,
123
- omitted: :empty
124
- },
125
- to: {
126
- nil: :empty,
127
- empty: :empty,
128
- omitted: :empty
129
- }
130
- }
38
+ map_element "contact", to: :contact, value_map: VALUE_MAP
39
+ map_element "longDescription", to: :long_description, value_map: VALUE_MAP
40
+ map_element "shortDescription", to: :short_description,
41
+ value_map: VALUE_MAP
42
+ map_element "notice", to: :notice, value_map: VALUE_MAP
43
+ map_element "owner", to: :owner, value_map: VALUE_MAP
44
+ map_element "timestamp", to: :timestamp, value_map: VALUE_MAP
45
+ map_element "Extension", to: :extension, value_map: VALUE_MAP
131
46
  end
132
47
  end
133
48
  end
data/lib/xmi/ea_root.rb CHANGED
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- Dir[File.join(__dir__, "extensions", "*.rb")].each { |file| require file }
4
-
5
3
  require "nokogiri"
6
4
 
7
5
  module Xmi
@@ -27,6 +25,7 @@ module Xmi
27
25
  XML_MAPPING = <<~TEXT
28
26
  xml do
29
27
  root "#ROOT_TAG#"
28
+ namespace #NAMESPACE_CLASS#
30
29
  #MAP_ATTRIBUTES#
31
30
  end
32
31
  TEXT
@@ -42,23 +41,64 @@ module Xmi
42
41
  MAP_ELEMENT = <<~TEXT
43
42
  map_element "#ELEMENT_NAME#",
44
43
  to: :#ELEMENT_METHOD#,
45
- namespace: "#NAMESPACE#",
46
- prefix: "#PREFIX#",
47
- value_map: {
48
- from: { nil: :empty, empty: :empty, omitted: :empty },
49
- to: { nil: :empty, empty: :empty, omitted: :empty }
50
- }
44
+ value_map: Xmi::VALUE_MAP
51
45
  TEXT
52
46
 
53
47
  class << self
48
+ # Load an EA extension from an XML file.
49
+ #
50
+ # @param xml_path [String] Path to the MDG extension XML file
51
+ # @return [void]
52
+ # @raise [ArgumentError] If the extension is already loaded
54
53
  def load_extension(xml_path)
55
54
  @content = gen_content(xml_path)
55
+ extension_id = @module_name
56
+
57
+ if loaded_extensions.key?(extension_id)
58
+ raise ArgumentError,
59
+ "Extension '#{extension_id}' is already loaded from " \
60
+ "'#{loaded_extensions[extension_id]}'. " \
61
+ "Call unload_extension('#{extension_id}') first if you want to reload it."
62
+ end
63
+
56
64
  Object.class_eval @content
57
- update_mappings(@module_name)
65
+ update_mappings(extension_id)
66
+ loaded_extensions[extension_id] = xml_path
67
+ end
68
+
69
+ # Unload an extension by removing its module and clearing tracking.
70
+ #
71
+ # This allows the extension to be loaded again, which is useful for
72
+ # testing scenarios that need to reload extensions.
73
+ #
74
+ # @param extension_id [String, Symbol] The extension module name (e.g., "Citygml")
75
+ # @return [void]
76
+ def unload_extension(extension_id)
77
+ extension_id = extension_id.to_s.capitalize
78
+
79
+ remove_const(extension_id) if const_defined?(extension_id)
80
+
81
+ loaded_extensions.delete(extension_id)
82
+ end
83
+
84
+ # Check if an extension is currently loaded.
85
+ #
86
+ # @param extension_id [String, Symbol] The extension module name
87
+ # @return [Boolean]
88
+ def extension_loaded?(extension_id)
89
+ extension_id = extension_id.to_s.capitalize
90
+ loaded_extensions.key?(extension_id)
91
+ end
92
+
93
+ # List all currently loaded extensions.
94
+ #
95
+ # @return [Hash<String, String>] Map of extension_id => xml_path
96
+ def loaded_extensions
97
+ @loaded_extensions ||= {}
58
98
  end
59
99
 
60
100
  def output_rb_file(output_rb_path)
61
- File.open(output_rb_path, "w") { |file| file.write(@content) }
101
+ File.write(output_rb_path, @content)
62
102
  end
63
103
 
64
104
  private
@@ -70,17 +110,17 @@ module Xmi
70
110
  update_model_xml_mappings(map_elements, Xmi::Sparx::SparxRoot)
71
111
  end
72
112
 
73
- def construct_xml_mappings(new_klasses, module_name) # rubocop:disable Metrics/MethodLength
113
+ def construct_xml_mappings(new_klasses, module_name)
74
114
  map_elements = []
75
115
  new_klasses.each do |klass|
76
116
  next unless Xmi::EaRoot.const_get(module_name).const_get(klass)
77
- .respond_to? :root_tag
117
+ .respond_to? :root_tag
78
118
 
79
119
  map_elements << MAP_ELEMENT
80
- .gsub("#ELEMENT_NAME#", Xmi::EaRoot.const_get(module_name).const_get(klass).root_tag)
81
- .gsub("#ELEMENT_METHOD#", Lutaml::Model::Utils.snake_case(klass.to_s))
82
- .gsub("#NAMESPACE#", @def_namespace[:uri])
83
- .gsub("#PREFIX#", @def_namespace[:name])
120
+ .gsub("#ELEMENT_NAME#", Xmi::EaRoot.const_get(module_name).const_get(klass).root_tag)
121
+ .gsub("#ELEMENT_METHOD#", Lutaml::Model::Utils.snake_case(klass.to_s))
122
+ .gsub("#NAMESPACE#", @def_namespace[:uri])
123
+ .gsub("#PREFIX#", @def_namespace[:name])
84
124
  end
85
125
 
86
126
  map_elements
@@ -92,23 +132,29 @@ module Xmi
92
132
  full_klass_name = "Xmi::EaRoot::#{module_name}::#{klass}"
93
133
  attr_line = "#{ATTRIBUTE_LINE.rstrip}, collection: true"
94
134
  attr_line = attr_line
95
- .gsub("#TAG_NAME#", method_name)
96
- .gsub("#ATTRIBUTE_TYPE#", full_klass_name)
135
+ .gsub("#TAG_NAME#", method_name)
136
+ .gsub("#ATTRIBUTE_TYPE#", full_klass_name)
97
137
 
98
138
  sparx_root.class_eval(attr_line)
99
139
  end
100
140
  end
101
141
 
142
+ # Add extension element mappings to SparxRoot.
143
+ #
144
+ # Only adds NEW mappings for the extension elements. Does NOT re-evaluate
145
+ # the base mappings, which avoids duplicate mapping accumulation.
146
+ #
147
+ # @param map_elements [Array<String>] Array of map_element code strings
148
+ # @param sparx_root [Class] The SparxRoot class to update
102
149
  def update_model_xml_mappings(map_elements, sparx_root)
103
- new_mapping = sparx_root.class_variable_get("@@default_mapping")
104
- new_mapping += map_elements.join("\n")
105
- sparx_root.class_variable_set("@@mapping", new_mapping) # rubocop:disable Style/ClassVars
150
+ return if map_elements.empty?
106
151
 
107
- new_mapping_block = proc do
108
- eval sparx_root.class_variable_get("@@mapping") # rubocop:disable Security/Eval
152
+ # Only add the NEW extension element mappings.
153
+ # Do NOT re-evaluate base mappings to avoid duplicates.
154
+ extension_block = proc do
155
+ map_elements.each { |element_code| instance_eval(element_code) }
109
156
  end
110
- new_mapping = proc { xml(&new_mapping_block) }
111
- sparx_root.class_eval(&new_mapping)
157
+ sparx_root.class_eval { xml(&extension_block) }
112
158
  end
113
159
 
114
160
  def all_new_klasses(module_name)
@@ -119,7 +165,7 @@ module Xmi
119
165
 
120
166
  def get_abstract_klass_node(xmi_doc)
121
167
  xmi_doc.at_xpath(
122
- "//UMLProfiles//Stereotypes//Stereotype[@isAbstract='true']"
168
+ "//UMLProfiles//Stereotypes//Stereotype[@isAbstract='true']",
123
169
  )
124
170
  end
125
171
 
@@ -134,8 +180,8 @@ module Xmi
134
180
  method_name = Lutaml::Model::Utils.snake_case(attr_method)
135
181
 
136
182
  map_attributes = MAP_ATTRIBUTES
137
- .gsub("#ATTRIBUTE_NAME#", attr_name)
138
- .gsub("#ATTRIBUTE_METHOD#", method_name)
183
+ .gsub("#ATTRIBUTE_NAME#", attr_name)
184
+ .gsub("#ATTRIBUTE_METHOD#", method_name)
139
185
 
140
186
  "#{space_before}#{map_attributes}"
141
187
  end
@@ -145,8 +191,8 @@ module Xmi
145
191
  space_before = " " * 8
146
192
 
147
193
  attribute_line = ATTRIBUTE_LINE
148
- .gsub("#TAG_NAME#", tag_name)
149
- .gsub("#ATTRIBUTE_TYPE#", attribute_type)
194
+ .gsub("#TAG_NAME#", tag_name)
195
+ .gsub("#ATTRIBUTE_TYPE#", attribute_type)
150
196
 
151
197
  "#{space_before}#{attribute_line}"
152
198
  end
@@ -168,7 +214,7 @@ module Xmi
168
214
  [attributes_lines, tags]
169
215
  end
170
216
 
171
- def gen_abstract_klass # rubocop:disable Metrics/MethodLength
217
+ def gen_abstract_klass
172
218
  unless @abstract_klass_node
173
219
  @abstract_tags = []
174
220
  return ""
@@ -201,7 +247,7 @@ module Xmi
201
247
  [apply_types_lines, apply_types_nodes]
202
248
  end
203
249
 
204
- def gen_generic_klass(node, from_klass = nil) # rubocop:disable Metrics/MethodLength
250
+ def gen_generic_klass(node, from_klass = nil)
205
251
  node_name = get_klass_name_from_node(node)
206
252
  attributes_lines, map_attributes_lines = gen_klass_tags(node)
207
253
  apply_types_lines, apply_types_nodes = gen_apply_types(node)
@@ -229,7 +275,8 @@ module Xmi
229
275
  map_attributes_lines
230
276
  end
231
277
 
232
- def gen_klass_apply_types(attributes_lines, map_attributes_lines, apply_types_lines, apply_types_nodes) # rubocop:disable Metrics/MethodLength
278
+ def gen_klass_apply_types(attributes_lines, map_attributes_lines,
279
+ apply_types_lines, apply_types_nodes)
233
280
  unless apply_types_nodes.empty?
234
281
  attributes_lines += apply_types_lines
235
282
  apply_types_nodes.each do |n|
@@ -260,12 +307,46 @@ module Xmi
260
307
  end
261
308
 
262
309
  def replace_xml_mapping(node_name, map_attributes_lines)
310
+ # Look up namespace class by URI, or generate a new one if not found
311
+ ns_class = find_or_create_namespace_class
312
+
263
313
  XML_MAPPING
264
314
  .gsub("#ROOT_TAG#", node_name)
315
+ .gsub("#NAMESPACE_CLASS#", ns_class)
265
316
  .gsub("#MAP_ATTRIBUTES#", "\n#{map_attributes_lines.rstrip}")
266
317
  .rstrip
267
318
  end
268
319
 
320
+ def find_or_create_namespace_class
321
+ uri = @def_namespace[:uri]
322
+ prefix = @def_namespace[:name]
323
+
324
+ # Try to find existing namespace class in registry
325
+ existing_class = NamespaceRegistry.resolve(uri)
326
+ return existing_class.name if existing_class
327
+
328
+ # Generate a new namespace class
329
+ # Format: Xmi::Namespace::Dynamic::{ModuleName}
330
+ module_name = @module_name
331
+ ns_class_name = "Xmi::Namespace::Dynamic::#{module_name}"
332
+
333
+ # Check if already defined
334
+ return ns_class_name if Object.const_defined?(ns_class_name)
335
+
336
+ # Create the namespace class
337
+ Namespace.ensure_dynamic_namespace_module_exists!
338
+ ns_class = Class.new(Lutaml::Xml::Namespace) do
339
+ define_singleton_method(:uri) { uri }
340
+ define_singleton_method(:prefix_default) { prefix }
341
+ end
342
+ Namespace::Dynamic.const_set(module_name, ns_class)
343
+
344
+ # Register in namespace registry
345
+ NamespaceRegistry.register(uri, ns_class)
346
+
347
+ ns_class_name
348
+ end
349
+
269
350
  def replace_klass_template(node_name, attributes_lines, xml_mapping,
270
351
  from_klass = nil)
271
352
  abstract_klass_name = get_klass_name_from_node(@abstract_klass_node)
data/lib/xmi/extension.rb CHANGED
@@ -2,18 +2,18 @@
2
2
 
3
3
  module Xmi
4
4
  class Extension < Lutaml::Model::Serializable
5
- attribute :id, :string
6
- attribute :label, :string
7
- attribute :uuid, :string
5
+ attribute :id, ::Xmi::Type::XmiId
6
+ attribute :label, ::Xmi::Type::XmiLabel
7
+ attribute :uuid, ::Xmi::Type::XmiUuid
8
8
  attribute :href, :string
9
- attribute :idref, :string
10
- attribute :type, :string
9
+ attribute :idref, ::Xmi::Type::XmiIdRef
10
+ attribute :type, ::Xmi::Type::XmiType
11
11
  attribute :extender, :string
12
12
  attribute :extender_id, :string
13
13
 
14
14
  xml do
15
15
  root "Extension"
16
- namespace "http://www.omg.org/spec/XMI/20131001", "xmi"
16
+ namespace ::Xmi::Namespace::Omg::Xmi
17
17
 
18
18
  map_attribute "id", to: :id
19
19
  map_attribute "label", to: :label
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Xmi
4
+ module Namespace
5
+ # Module for dynamically created namespace classes
6
+ # These are created when loading EA MDG extensions
7
+ module Dynamic
8
+ class << self
9
+ # Ensure the Dynamic namespace module exists
10
+ # This is a no-op since the module is already defined
11
+ def ensure_exists!
12
+ # Already defined by Ruby when this file is loaded
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ # Add convenience method to parent module
20
+ module Xmi
21
+ module Namespace
22
+ class << self
23
+ def ensure_dynamic_namespace_module_exists!
24
+ Dynamic.ensure_exists!
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Xmi
4
+ module Namespace
5
+ module Omg
6
+ class Xmi20110701 < Lutaml::Xml::Namespace
7
+ uri "http://www.omg.org/spec/XMI/20110701"
8
+ prefix_default "xmi"
9
+ end
10
+
11
+ class Xmi20131001 < Lutaml::Xml::Namespace
12
+ uri "http://www.omg.org/spec/XMI/20131001"
13
+ prefix_default "xmi"
14
+ end
15
+
16
+ class Xmi20161101 < Lutaml::Xml::Namespace
17
+ uri "http://www.omg.org/spec/XMI/20161101"
18
+ prefix_default "xmi"
19
+ end
20
+
21
+ class Uml20110701 < Lutaml::Xml::Namespace
22
+ uri "http://www.omg.org/spec/UML/20110701"
23
+ prefix_default "uml"
24
+ end
25
+
26
+ class Uml20131001 < Lutaml::Xml::Namespace
27
+ uri "http://www.omg.org/spec/UML/20131001"
28
+ prefix_default "uml"
29
+ end
30
+
31
+ class Uml20161101 < Lutaml::Xml::Namespace
32
+ uri "http://www.omg.org/spec/UML/20161101"
33
+ prefix_default "uml"
34
+ end
35
+
36
+ class UmlDi20131001 < Lutaml::Xml::Namespace
37
+ uri "http://www.omg.org/spec/UML/20131001/UMLDI"
38
+ prefix_default "umldi"
39
+ end
40
+
41
+ class UmlDi20161101 < Lutaml::Xml::Namespace
42
+ uri "http://www.omg.org/spec/UML/20161101/UMLDI"
43
+ prefix_default "umldi"
44
+ end
45
+
46
+ class UmlDc20131001 < Lutaml::Xml::Namespace
47
+ uri "http://www.omg.org/spec/UML/20131001/UMLDC"
48
+ prefix_default "dc"
49
+ end
50
+
51
+ class UmlDc20161101 < Lutaml::Xml::Namespace
52
+ uri "http://www.omg.org/spec/UML/20161101/UMLDC"
53
+ prefix_default "dc"
54
+ end
55
+
56
+ # Alias classes for version-agnostic reference
57
+ # These inherit from 20131001 (the normalized version used after replace_xmlns)
58
+ # NOTE: We need to explicitly set uri and prefix_default because Ruby class
59
+ # instance variables are not inherited
60
+ class Xmi < Lutaml::Xml::Namespace
61
+ uri "http://www.omg.org/spec/XMI/20131001"
62
+ prefix_default "xmi"
63
+ end
64
+
65
+ class Uml < Lutaml::Xml::Namespace
66
+ uri "http://www.omg.org/spec/UML/20131001"
67
+ prefix_default "uml"
68
+ end
69
+
70
+ class UmlDi < Lutaml::Xml::Namespace
71
+ uri "http://www.omg.org/spec/UML/20131001/UMLDI"
72
+ prefix_default "umldi"
73
+ end
74
+
75
+ class UmlDc < Lutaml::Xml::Namespace
76
+ uri "http://www.omg.org/spec/UML/20131001/UMLDC"
77
+ prefix_default "dc"
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Xmi
4
+ module Namespace
5
+ module Sparx
6
+ # Namespace for EA Extension elements (inside <xmi:Extension>)
7
+ # These are elements like <elements>, <connectors>, <diagrams>, etc.
8
+ class Extension < Lutaml::Xml::Namespace
9
+ uri "http://www.sparxsystems.com/extensions/ea"
10
+ prefix_default "ea"
11
+ end
12
+
13
+ class SysPhS < Lutaml::Xml::Namespace
14
+ uri "http://www.sparxsystems.com/profiles/SysPhS/1.0"
15
+ prefix_default "sysphs"
16
+ end
17
+
18
+ class Gml < Lutaml::Xml::Namespace
19
+ uri "http://www.sparxsystems.com/profiles/GML/1.0"
20
+ prefix_default "GML"
21
+ end
22
+
23
+ class EaUml < Lutaml::Xml::Namespace
24
+ uri "http://www.sparxsystems.com/profiles/EAUML/1.0"
25
+ prefix_default "EAUML"
26
+ end
27
+
28
+ class CustomProfile < Lutaml::Xml::Namespace
29
+ uri "http://www.sparxsystems.com/profiles/thecustomprofile/1.0"
30
+ prefix_default "thecustomprofile"
31
+ end
32
+
33
+ class CityGml < Lutaml::Xml::Namespace
34
+ uri "http://www.sparxsystems.com/profiles/CityGML/1.0"
35
+ prefix_default "CityGML"
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Xmi
4
+ module Namespace
5
+ end
6
+ end
7
+
8
+ require_relative "namespace/omg"
9
+ require_relative "namespace/sparx"