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.
- checksums.yaml +4 -4
- data/.github/workflows/release.yml +13 -6
- data/.gitignore +2 -1
- data/.rubocop.yml +12 -13
- data/.rubocop_todo.yml +150 -13
- data/CHANGELOG.md +55 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/Gemfile +10 -0
- data/README.adoc +319 -6
- data/benchmark_parse.rb +60 -0
- data/docs/migration.md +141 -0
- data/docs/versioning.md +255 -0
- data/lib/xmi/add.rb +14 -38
- data/lib/xmi/{the_custom_profile.rb → custom_profile.rb} +25 -25
- data/lib/xmi/delete.rb +14 -38
- data/lib/xmi/difference.rb +14 -38
- data/lib/xmi/documentation.rb +16 -101
- data/lib/xmi/ea_root.rb +114 -33
- data/lib/xmi/extension.rb +6 -6
- data/lib/xmi/namespace/dynamic.rb +28 -0
- data/lib/xmi/namespace/omg.rb +81 -0
- data/lib/xmi/namespace/sparx.rb +39 -0
- data/lib/xmi/namespace.rb +9 -0
- data/lib/xmi/namespace_detector.rb +138 -0
- data/lib/xmi/namespace_registry.rb +119 -0
- data/lib/xmi/parsing.rb +113 -0
- data/lib/xmi/replace.rb +14 -38
- data/lib/xmi/root.rb +49 -213
- data/lib/xmi/sparx/connector.rb +241 -0
- data/lib/xmi/sparx/custom_profile.rb +19 -0
- data/lib/xmi/sparx/diagram.rb +97 -0
- data/lib/xmi/sparx/ea_stub.rb +20 -0
- data/lib/xmi/{extensions/eauml.rb → sparx/ea_uml.rb} +3 -2
- data/lib/xmi/sparx/element.rb +453 -0
- data/lib/xmi/sparx/extension.rb +43 -0
- data/lib/xmi/{extensions → sparx}/gml.rb +9 -3
- data/lib/xmi/sparx/mappings/base_mapping.rb +182 -0
- data/lib/xmi/sparx/mappings.rb +10 -0
- data/lib/xmi/sparx/primitive_type.rb +18 -0
- data/lib/xmi/sparx/root.rb +60 -0
- data/lib/xmi/sparx/sys_ph_s.rb +18 -0
- data/lib/xmi/sparx.rb +17 -1376
- data/lib/xmi/type.rb +37 -0
- data/lib/xmi/uml.rb +191 -469
- data/lib/xmi/v20110701.rb +81 -0
- data/lib/xmi/v20131001.rb +68 -0
- data/lib/xmi/v20161101.rb +61 -0
- data/lib/xmi/version.rb +1 -1
- data/lib/xmi/version_registry.rb +164 -0
- data/lib/xmi/versioned.rb +142 -0
- data/lib/xmi.rb +83 -11
- data/scripts-xmi-profile/profile_xmi_simple.rb +213 -0
- data/xmi.gemspec +3 -9
- metadata +38 -77
data/lib/xmi/documentation.rb
CHANGED
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
require_relative "extension"
|
|
4
4
|
|
|
5
5
|
module Xmi
|
|
6
|
-
class Documentation < Lutaml::Model::Serializable
|
|
7
|
-
attribute :id,
|
|
8
|
-
attribute :label,
|
|
9
|
-
attribute :uuid,
|
|
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,
|
|
12
|
-
attribute :type,
|
|
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
|
|
24
|
+
xml do
|
|
25
25
|
root "Documentation"
|
|
26
|
-
namespace
|
|
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,
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
-
|
|
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(
|
|
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.
|
|
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)
|
|
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
|
-
|
|
117
|
+
.respond_to? :root_tag
|
|
78
118
|
|
|
79
119
|
map_elements << MAP_ELEMENT
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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
|
-
|
|
96
|
-
|
|
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
|
-
|
|
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
|
-
|
|
108
|
-
|
|
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
|
-
|
|
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
|
-
|
|
138
|
-
|
|
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
|
-
|
|
149
|
-
|
|
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
|
|
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)
|
|
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,
|
|
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,
|
|
6
|
-
attribute :label,
|
|
7
|
-
attribute :uuid,
|
|
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,
|
|
10
|
-
attribute :type,
|
|
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
|
|
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
|