lutaml 0.8.0 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/rake.yml +0 -2
- data/lib/lutaml/version.rb +1 -1
- data/lib/lutaml/xmi/parsers/xml.rb +66 -64
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b4a5e17292ce48ecab9f02dfbc1ba4630fd8ccc8abbeef241830dba6751b21e3
|
4
|
+
data.tar.gz: 82da115e0396750610178e711864546b19212f55a6a5119ce12464c0337a45a6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d07503ca2cdf8d33fb64f17dccf2eb0fefccbdc0853887713a8f62df1248799589b4cf5b017defbff2611f92563107bbc24f3a6a269d44775cad68a01e843c03
|
7
|
+
data.tar.gz: '00392dc2b1a84f56343486d677c1494564d7ef46d26fc2d63eebc92ae29b0861488b812726a529a4d6f0b371e2bad72c1163912d6f0ea3752d6f0c26f02c9762'
|
data/.github/workflows/rake.yml
CHANGED
data/lib/lutaml/version.rb
CHANGED
@@ -20,8 +20,15 @@ module Lutaml
|
|
20
20
|
# @param options [Hash] options for parsing
|
21
21
|
# @return [Lutaml::Uml::Document]
|
22
22
|
def self.parse(xml, _options = {})
|
23
|
+
sparx_root = Xmi::Sparx::SparxRoot
|
24
|
+
xmi_doc = Nokogiri::XML(File.read(xml))
|
25
|
+
namespace = xmi_doc.at_xpath("//xmi:XMI").namespaces
|
26
|
+
if namespace["xmlns:uml"].split("/").last == "20131001"
|
27
|
+
sparx_root = Xmi::Sparx::SparxRoot2013
|
28
|
+
end
|
29
|
+
|
23
30
|
xml_content = File.read(xml)
|
24
|
-
xmi_model =
|
31
|
+
xmi_model = sparx_root.from_xml(xml_content)
|
25
32
|
new.parse(xmi_model)
|
26
33
|
end
|
27
34
|
|
@@ -42,7 +49,7 @@ module Lutaml
|
|
42
49
|
model = xmi_model.model
|
43
50
|
{
|
44
51
|
name: model.name,
|
45
|
-
packages: serialize_model_packages(model)
|
52
|
+
packages: serialize_model_packages(model),
|
46
53
|
}
|
47
54
|
end
|
48
55
|
|
@@ -60,7 +67,7 @@ module Lutaml
|
|
60
67
|
diagrams: serialize_model_diagrams(package.id),
|
61
68
|
packages: serialize_model_packages(package),
|
62
69
|
definition: doc_node_attribute_value(package.id, "documentation"),
|
63
|
-
stereotype: doc_node_attribute_value(package.id, "stereotype")
|
70
|
+
stereotype: doc_node_attribute_value(package.id, "stereotype"),
|
64
71
|
}
|
65
72
|
end
|
66
73
|
end
|
@@ -71,9 +78,10 @@ module Lutaml
|
|
71
78
|
# @note xpath ./packagedElement[@xmi:type="uml:Class" or
|
72
79
|
# @xmi:type="uml:AssociationClass"]
|
73
80
|
def serialize_model_classes(package, model)
|
74
|
-
package.packaged_element.select
|
75
|
-
e.type?("uml:Class") || e.type?("uml:AssociationClass")
|
76
|
-
|
81
|
+
package.packaged_element.select do |e|
|
82
|
+
e.type?("uml:Class") || e.type?("uml:AssociationClass") ||
|
83
|
+
e.type?("uml:Interface")
|
84
|
+
end.map do |klass|
|
77
85
|
{
|
78
86
|
xmi_id: klass.id,
|
79
87
|
name: klass.name,
|
@@ -84,7 +92,7 @@ module Lutaml
|
|
84
92
|
constraints: serialize_class_constraints(klass.id),
|
85
93
|
is_abstract: doc_node_attribute_value(klass.id, "isAbstract"),
|
86
94
|
definition: doc_node_attribute_value(klass.id, "documentation"),
|
87
|
-
stereotype: doc_node_attribute_value(klass.id, "stereotype")
|
95
|
+
stereotype: doc_node_attribute_value(klass.id, "stereotype"),
|
88
96
|
}
|
89
97
|
end
|
90
98
|
end
|
@@ -93,12 +101,12 @@ module Lutaml
|
|
93
101
|
# @return [Array<Hash>]
|
94
102
|
# @note xpath ./packagedElement[@xmi:type="uml:Enumeration"]
|
95
103
|
def serialize_model_enums(package)
|
96
|
-
package.packaged_element
|
97
|
-
.
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
104
|
+
package.packaged_element.select { |e| e.type?("uml:Enumeration") }
|
105
|
+
.map do |enum|
|
106
|
+
# xpath .//ownedLiteral[@xmi:type="uml:EnumerationLiteral"]
|
107
|
+
owned_literals = enum.owned_literal.map do |owned_literal|
|
108
|
+
owned_literal.to_hash.transform_keys(&:to_sym)
|
109
|
+
end
|
102
110
|
|
103
111
|
{
|
104
112
|
xmi_id: enum.id,
|
@@ -116,7 +124,7 @@ module Lutaml
|
|
116
124
|
def serialize_model_data_types(model)
|
117
125
|
all_data_type_elements = []
|
118
126
|
select_all_packaged_elements(all_data_type_elements, model,
|
119
|
-
|
127
|
+
"uml:DataType")
|
120
128
|
all_data_type_elements.map do |klass|
|
121
129
|
{
|
122
130
|
xmi_id: klass.id,
|
@@ -144,7 +152,7 @@ module Lutaml
|
|
144
152
|
{
|
145
153
|
xmi_id: diagram.id,
|
146
154
|
name: diagram.properties.name,
|
147
|
-
definition: diagram.properties.documentation
|
155
|
+
definition: diagram.properties.documentation,
|
148
156
|
}
|
149
157
|
end
|
150
158
|
end
|
@@ -160,22 +168,20 @@ module Lutaml
|
|
160
168
|
matched_element.links.association.empty?
|
161
169
|
|
162
170
|
matched_element.links.association.map do |assoc|
|
163
|
-
|
164
|
-
linke_owner_name =
|
171
|
+
link_member = assoc.start == xmi_id ? "end" : "start"
|
172
|
+
linke_owner_name = link_member == "start" ? "end" : "start"
|
165
173
|
|
166
174
|
member_end, member_end_type, member_end_cardinality,
|
167
175
|
member_end_attribute_name, member_end_xmi_id =
|
168
|
-
serialize_member_type(xmi_id, assoc,
|
176
|
+
serialize_member_type(xmi_id, assoc, link_member)
|
169
177
|
|
170
178
|
owner_end = serialize_owned_type(xmi_id, assoc, linke_owner_name)
|
171
179
|
|
172
|
-
if member_end && ((member_end_type !=
|
173
|
-
(member_end_type ==
|
180
|
+
if member_end && ((member_end_type != "aggregation") ||
|
181
|
+
(member_end_type == "aggregation" && member_end_attribute_name))
|
174
182
|
|
175
|
-
doc_node_name = (
|
176
|
-
|
177
|
-
definition = fetch_definition_node_value(assoc.id,
|
178
|
-
doc_node_name)
|
183
|
+
doc_node_name = (link_member == "start" ? "source" : "target")
|
184
|
+
definition = fetch_definition_node_value(assoc.id, doc_node_name)
|
179
185
|
|
180
186
|
{
|
181
187
|
xmi_id: assoc.id,
|
@@ -186,7 +192,7 @@ module Lutaml
|
|
186
192
|
member_end_xmi_id: member_end_xmi_id,
|
187
193
|
owner_end: owner_end,
|
188
194
|
owner_end_xmi_id: xmi_id,
|
189
|
-
definition: definition
|
195
|
+
definition: definition,
|
190
196
|
}
|
191
197
|
end
|
192
198
|
end
|
@@ -239,7 +245,7 @@ module Lutaml
|
|
239
245
|
if connector_node
|
240
246
|
# In ea-xmi-2.5.1, constraints are moved to source/target under
|
241
247
|
# connectors
|
242
|
-
constraints = [
|
248
|
+
constraints = %i[source target].map do |st|
|
243
249
|
connector_node.send(st).constraints.constraint
|
244
250
|
end.flatten
|
245
251
|
|
@@ -267,8 +273,7 @@ module Lutaml
|
|
267
273
|
end
|
268
274
|
|
269
275
|
xmi_id = link.send(linke_owner_name.to_sym)
|
270
|
-
|
271
|
-
connector_source_name(xmi_id)
|
276
|
+
lookup_entity_name(xmi_id) || connector_source_name(xmi_id)
|
272
277
|
|
273
278
|
# not necessary
|
274
279
|
# if link.name == "Association"
|
@@ -279,14 +284,13 @@ module Lutaml
|
|
279
284
|
# fetch_owned_attribute_node(xmi_id)
|
280
285
|
# end
|
281
286
|
# [owner_end, owned_cardinality, owned_attribute_name]
|
282
|
-
owner_end
|
287
|
+
# owner_end
|
283
288
|
end
|
284
289
|
|
285
290
|
# @param owner_xmi_id [String]
|
286
291
|
# @param link [Shale::Mapper]
|
287
|
-
# @param link_member_name [String]
|
288
292
|
# @return [Array<String, String>]
|
289
|
-
def serialize_member_end(owner_xmi_id, link
|
293
|
+
def serialize_member_end(owner_xmi_id, link)
|
290
294
|
case link.name
|
291
295
|
when "NoteLink"
|
292
296
|
return
|
@@ -313,8 +317,7 @@ module Lutaml
|
|
313
317
|
# @param link_member_name [String]
|
314
318
|
# @return [Array<String, String, Hash, String, String>]
|
315
319
|
def serialize_member_type(owner_xmi_id, link, link_member_name)
|
316
|
-
member_end, xmi_id = serialize_member_end(
|
317
|
-
owner_xmi_id, link, link_member_name)
|
320
|
+
member_end, xmi_id = serialize_member_end(owner_xmi_id, link)
|
318
321
|
|
319
322
|
if link.name == "Association"
|
320
323
|
connector_type = link_member_name == "start" ? "source" : "target"
|
@@ -326,7 +329,7 @@ module Lutaml
|
|
326
329
|
end
|
327
330
|
|
328
331
|
[member_end, "aggregation", member_end_cardinality,
|
329
|
-
|
332
|
+
member_end_attribute_name, xmi_id]
|
330
333
|
end
|
331
334
|
|
332
335
|
# @param link_id [String]
|
@@ -338,9 +341,9 @@ module Lutaml
|
|
338
341
|
|
339
342
|
if assoc_connector
|
340
343
|
assoc_connector_type = assoc_connector.type
|
341
|
-
if assoc_connector_type
|
342
|
-
cardinality = assoc_connector_type.multiplicity.split(
|
343
|
-
cardinality.unshift(
|
344
|
+
if assoc_connector_type&.multiplicity
|
345
|
+
cardinality = assoc_connector_type.multiplicity.split("..")
|
346
|
+
cardinality.unshift("1") if cardinality.length == 1
|
344
347
|
min, max = cardinality
|
345
348
|
end
|
346
349
|
assoc_connector_role = assoc_connector.role
|
@@ -385,15 +388,14 @@ module Lutaml
|
|
385
388
|
def fetch_owned_attribute_node(xmi_id)
|
386
389
|
all_elements = all_packaged_elements
|
387
390
|
|
388
|
-
owned_attributes = all_elements.map
|
391
|
+
owned_attributes = all_elements.map(&:owned_attribute).flatten
|
389
392
|
oa = owned_attributes.select do |a|
|
390
393
|
!!a.association && a.uml_type && a.uml_type.idref == xmi_id
|
391
394
|
end.first
|
392
395
|
|
393
396
|
if oa
|
394
397
|
cardinality = cardinality_min_max_value(
|
395
|
-
oa.lower_value&.value,
|
396
|
-
oa.upper_value&.value
|
398
|
+
oa.lower_value&.value, oa.upper_value&.value
|
397
399
|
)
|
398
400
|
oa_name = oa.name
|
399
401
|
end
|
@@ -416,22 +418,23 @@ module Lutaml
|
|
416
418
|
def serialize_class_attributes(klass)
|
417
419
|
klass.owned_attribute.select { |attr| attr.type?("uml:Property") }
|
418
420
|
.map do |oa|
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
421
|
+
uml_type = oa.uml_type
|
422
|
+
uml_type_idref = uml_type.idref if uml_type
|
423
|
+
|
424
|
+
if oa.association.nil?
|
425
|
+
{
|
426
|
+
id: oa.id,
|
427
|
+
name: oa.name,
|
428
|
+
type: lookup_entity_name(uml_type_idref) || uml_type_idref,
|
429
|
+
xmi_id: uml_type_idref,
|
430
|
+
is_derived: oa.is_derived,
|
431
|
+
cardinality: cardinality_min_max_value(
|
432
|
+
oa.lower_value&.value,
|
433
|
+
oa.upper_value&.value,
|
434
|
+
),
|
435
|
+
definition: lookup_attribute_documentation(oa.id),
|
436
|
+
}
|
437
|
+
end
|
435
438
|
end.compact
|
436
439
|
end
|
437
440
|
|
@@ -441,7 +444,7 @@ module Lutaml
|
|
441
444
|
def cardinality_min_max_value(min, max)
|
442
445
|
{
|
443
446
|
"min" => cardinality_value(min, true),
|
444
|
-
"max" => cardinality_value(max, false)
|
447
|
+
"max" => cardinality_value(max, false),
|
445
448
|
}
|
446
449
|
end
|
447
450
|
|
@@ -451,7 +454,7 @@ module Lutaml
|
|
451
454
|
def cardinality_value(value, is_min = false)
|
452
455
|
return unless value
|
453
456
|
|
454
|
-
is_min ? LOWER_VALUE_MAPPINGS[value] : value
|
457
|
+
is_min ? LOWER_VALUE_MAPPINGS[value.to_s] : value
|
455
458
|
end
|
456
459
|
|
457
460
|
# @node [Shale::Mapper]
|
@@ -523,12 +526,11 @@ module Lutaml
|
|
523
526
|
# @return [Array<Xmi::Uml::PackagedElement>]
|
524
527
|
def all_packaged_elements
|
525
528
|
all_elements = []
|
526
|
-
|
527
|
-
@xmi_root_model.model.packaged_element +
|
529
|
+
packaged_element_roots = @xmi_root_model.model.packaged_element +
|
528
530
|
@xmi_root_model.extension.primitive_types.packaged_element +
|
529
|
-
@xmi_root_model.extension.profiles.profile
|
530
|
-
|
531
|
-
|
531
|
+
@xmi_root_model.extension.profiles.profile.map(&:packaged_element)
|
532
|
+
|
533
|
+
packaged_element_roots.flatten.each do |e|
|
532
534
|
select_all_packaged_elements(all_elements, e, nil)
|
533
535
|
end
|
534
536
|
|
@@ -589,7 +591,7 @@ module Lutaml
|
|
589
591
|
result[node.id] = node.name
|
590
592
|
end
|
591
593
|
|
592
|
-
attrs.each_pair do |k,
|
594
|
+
attrs.each_pair do |k, _v|
|
593
595
|
map_id_name(result, node.send(k))
|
594
596
|
end
|
595
597
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lutaml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ribose Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-06-
|
11
|
+
date: 2024-06-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: expressir
|