lutaml 0.9.12 → 0.9.13
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/lib/lutaml/version.rb +1 -1
- data/lib/lutaml/xmi/liquid_drops/generalization_attribute_drop.rb +89 -0
- data/lib/lutaml/xmi/liquid_drops/generalization_drop.rb +107 -0
- data/lib/lutaml/xmi/liquid_drops/klass_drop.rb +6 -0
- data/lib/lutaml/xmi/parsers/xml.rb +57 -35
- metadata +4 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 05c32d8cfd15503c91aa70205b2cf130785f6fb5c2c14e6622b0131f530a74d9
|
|
4
|
+
data.tar.gz: 1aefef310bed4c0438bb37dfdbfac9cf2a9748744f779ae4ecb1eccc18941bb5
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 517a71b871804994c345e2676ec6f462efa698c4247bb77b7d3cbd62ce82025d53421a0f67ebf0645e0c47ebfbf9f4ae77629cceab3d4bf1af19548981e01f51
|
|
7
|
+
data.tar.gz: 4bdcc32531aae771bd148c57d4a41a391afe4eb35d74ff96c1276832ed4cb03c38c42c6407d543e8842240137819a04effd821473e2fd9d7b298ef04a926981e
|
data/lib/lutaml/version.rb
CHANGED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Lutaml
|
|
4
|
+
module XMI
|
|
5
|
+
class GeneralizationAttributeDrop < Liquid::Drop
|
|
6
|
+
LOWER_VALUE_MAPPINGS = {
|
|
7
|
+
"C" => "0",
|
|
8
|
+
"M" => "1",
|
|
9
|
+
}.freeze
|
|
10
|
+
|
|
11
|
+
def initialize(attr, upper_klass, gen_name) # rubocop:disable Lint/MissingSuper
|
|
12
|
+
@attr = attr
|
|
13
|
+
@upper_klass = upper_klass
|
|
14
|
+
@gen_name = gen_name
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def id
|
|
18
|
+
@attr[:id]
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def name
|
|
22
|
+
@attr[:name]
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def type
|
|
26
|
+
@attr[:type]
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def xmi_id
|
|
30
|
+
@attr[:xmi_id]
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def is_derived
|
|
34
|
+
@attr[:is_derived]
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def cardinality
|
|
38
|
+
min = @attr[:cardinality]["min"]
|
|
39
|
+
min = min.nil? ? nil : LOWER_VALUE_MAPPINGS[min]
|
|
40
|
+
|
|
41
|
+
"#{min}..#{@attr[:cardinality]['max']}"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def min_cardinality
|
|
45
|
+
@attr[:cardinality]["min"]
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def max_cardinality
|
|
49
|
+
@attr[:cardinality]["max"]
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def definition
|
|
53
|
+
@attr[:definition]
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def association
|
|
57
|
+
@attr[:association]
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def has_association?
|
|
61
|
+
!!@attr[:association]
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def type_ns
|
|
65
|
+
@attr[:type_ns]
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def upper_klass
|
|
69
|
+
@upper_klass
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def gen_name
|
|
73
|
+
@gen_name
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def name_ns
|
|
77
|
+
name_ns = case @attr[:type_ns]
|
|
78
|
+
when "core", "gml"
|
|
79
|
+
upper_klass
|
|
80
|
+
else
|
|
81
|
+
@attr[:type_ns]
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
name_ns = upper_klass if name_ns.nil?
|
|
85
|
+
name_ns
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Lutaml
|
|
4
|
+
module XMI
|
|
5
|
+
class GeneralizationDrop < Liquid::Drop
|
|
6
|
+
def initialize(gen) # rubocop:disable Lint/MissingSuper
|
|
7
|
+
@gen = gen
|
|
8
|
+
@looped_general_item = false
|
|
9
|
+
@inherited_props = []
|
|
10
|
+
@inherited_assoc_props = []
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def id
|
|
14
|
+
@gen[:general_id]
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def name
|
|
18
|
+
@gen[:general_name]
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def upper_klass
|
|
22
|
+
@gen[:general_upper_klass]
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def general
|
|
26
|
+
GeneralizationDrop.new(@gen[:general]) if @gen[:general]
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def has_general?
|
|
30
|
+
!!@gen[:general]
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def attributes
|
|
34
|
+
@gen[:general_attributes]
|
|
35
|
+
# @gen[:general_attributes].map do |attr|
|
|
36
|
+
# GeneralizationAttributeDrop.new(attr, upper_klass, name)
|
|
37
|
+
# end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def type
|
|
41
|
+
@gen[:type]
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def definition
|
|
45
|
+
@gen[:definition]
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def stereotype
|
|
49
|
+
@gen[:stereotype]
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# get attributes without association
|
|
53
|
+
def owned_props
|
|
54
|
+
attributes.select do |attr|
|
|
55
|
+
attr[:association].nil?
|
|
56
|
+
end.map do |attr|
|
|
57
|
+
GeneralizationAttributeDrop.new(attr, upper_klass, name)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# get attributes with association
|
|
62
|
+
def assoc_props
|
|
63
|
+
attributes.select do |attr|
|
|
64
|
+
attr[:association]
|
|
65
|
+
end.map do |attr|
|
|
66
|
+
GeneralizationAttributeDrop.new(attr, upper_klass, name)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# get items without association by looping through the generation
|
|
71
|
+
def inherited_props
|
|
72
|
+
loop_general_item unless @looped_general_item
|
|
73
|
+
|
|
74
|
+
@inherited_props.reverse
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# get items with association by looping through the generation
|
|
78
|
+
def inherited_assoc_props
|
|
79
|
+
loop_general_item unless @looped_general_item
|
|
80
|
+
|
|
81
|
+
@inherited_assoc_props.reverse
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def loop_general_item # rubocop:disable Metrics/MethodLength
|
|
85
|
+
general_item = general
|
|
86
|
+
while general_item.has_general?
|
|
87
|
+
gen_upper_klass = general_item.upper_klass
|
|
88
|
+
gen_name = general_item.name
|
|
89
|
+
# reverse the order to show super class first
|
|
90
|
+
general_item.attributes.reverse_each do |attr|
|
|
91
|
+
attr_drop = GeneralizationAttributeDrop.new(attr, gen_upper_klass,
|
|
92
|
+
gen_name)
|
|
93
|
+
if attr[:association]
|
|
94
|
+
@inherited_assoc_props << attr_drop
|
|
95
|
+
else
|
|
96
|
+
@inherited_props << attr_drop
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
general_item = general_item.general
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
@looped_general_item = true
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
@@ -26,10 +26,11 @@ module Lutaml
|
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
# @param xml [String] path to xml
|
|
29
|
+
# @param with_gen [Boolean]
|
|
29
30
|
# @return [Hash]
|
|
30
|
-
def serialize_xmi(xml)
|
|
31
|
+
def serialize_xmi(xml, with_gen: false)
|
|
31
32
|
xmi_model = get_xmi_model(xml)
|
|
32
|
-
new.serialize_xmi(xmi_model)
|
|
33
|
+
new.serialize_xmi(xmi_model, with_gen: with_gen)
|
|
33
34
|
end
|
|
34
35
|
|
|
35
36
|
# @param xml [String] path to xml
|
|
@@ -57,10 +58,15 @@ module Lutaml
|
|
|
57
58
|
end
|
|
58
59
|
|
|
59
60
|
# @param xmi_model [Shale::Mapper]
|
|
60
|
-
|
|
61
|
-
def parse(xmi_model)
|
|
61
|
+
def set_xmi_model(xmi_model)
|
|
62
62
|
@xmi_cache = {}
|
|
63
63
|
@xmi_root_model = xmi_model
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# @param xmi_model [Shale::Mapper]
|
|
67
|
+
# @return [Lutaml::Uml::Document]
|
|
68
|
+
def parse(xmi_model)
|
|
69
|
+
set_xmi_model(xmi_model)
|
|
64
70
|
serialized_hash = serialize_xmi(xmi_model)
|
|
65
71
|
|
|
66
72
|
::Lutaml::Uml::Document.new(serialized_hash)
|
|
@@ -68,18 +74,16 @@ module Lutaml
|
|
|
68
74
|
|
|
69
75
|
# @param xmi_model [Shale::Mapper]
|
|
70
76
|
# return [Hash]
|
|
71
|
-
def serialize_xmi(xmi_model)
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
serialize_to_hash(xmi_model)
|
|
77
|
+
def serialize_xmi(xmi_model, with_gen: false)
|
|
78
|
+
set_xmi_model(xmi_model)
|
|
79
|
+
serialize_to_hash(xmi_model, with_gen: with_gen)
|
|
75
80
|
end
|
|
76
81
|
|
|
77
82
|
# @param xmi_model [Shale::Mapper]
|
|
78
83
|
# return [Liquid::Drop]
|
|
79
84
|
def serialize_xmi_to_liquid(xmi_model)
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
serialized_hash = serialize_xmi(xmi_model)
|
|
85
|
+
set_xmi_model(xmi_model)
|
|
86
|
+
serialized_hash = serialize_xmi(xmi_model, with_gen: true)
|
|
83
87
|
|
|
84
88
|
::Lutaml::XMI::RootDrop.new(serialized_hash)
|
|
85
89
|
end
|
|
@@ -88,10 +92,11 @@ module Lutaml
|
|
|
88
92
|
# @param name [String]
|
|
89
93
|
# @return [Hash]
|
|
90
94
|
def serialize_generalization_by_name(xmi_model, name)
|
|
91
|
-
|
|
92
|
-
@xmi_root_model = xmi_model
|
|
95
|
+
set_xmi_model(xmi_model)
|
|
93
96
|
klass = find_klass_packaged_element_by_name(name)
|
|
94
|
-
serialize_generalization(klass)
|
|
97
|
+
serialized_hash = serialize_generalization(klass)
|
|
98
|
+
|
|
99
|
+
::Lutaml::XMI::GeneralizationDrop.new(serialized_hash)
|
|
95
100
|
end
|
|
96
101
|
|
|
97
102
|
private
|
|
@@ -99,29 +104,30 @@ module Lutaml
|
|
|
99
104
|
# @param xmi_model [Shale::Mapper]
|
|
100
105
|
# @return [Hash]
|
|
101
106
|
# @note xpath: //uml:Model[@xmi:type="uml:Model"]
|
|
102
|
-
def serialize_to_hash(xmi_model)
|
|
107
|
+
def serialize_to_hash(xmi_model, with_gen: false)
|
|
103
108
|
model = xmi_model.model
|
|
104
109
|
{
|
|
105
110
|
name: model.name,
|
|
106
|
-
packages: serialize_model_packages(model),
|
|
111
|
+
packages: serialize_model_packages(model, with_gen: with_gen),
|
|
107
112
|
}
|
|
108
113
|
end
|
|
109
114
|
|
|
110
115
|
# @param model [Shale::Mapper]
|
|
111
116
|
# @return [Array<Hash>]
|
|
112
117
|
# @note xpath ./packagedElement[@xmi:type="uml:Package"]
|
|
113
|
-
def serialize_model_packages(model)
|
|
118
|
+
def serialize_model_packages(model, with_gen: false)
|
|
114
119
|
model.packaged_element.select do |e|
|
|
115
120
|
e.type?("uml:Package")
|
|
116
121
|
end.map do |package|
|
|
117
122
|
{
|
|
118
123
|
xmi_id: package.id,
|
|
119
124
|
name: get_package_name(package),
|
|
120
|
-
classes: serialize_model_classes(package, model
|
|
125
|
+
classes: serialize_model_classes(package, model,
|
|
126
|
+
with_gen: with_gen),
|
|
121
127
|
enums: serialize_model_enums(package),
|
|
122
128
|
data_types: serialize_model_data_types(package),
|
|
123
129
|
diagrams: serialize_model_diagrams(package.id),
|
|
124
|
-
packages: serialize_model_packages(package),
|
|
130
|
+
packages: serialize_model_packages(package, with_gen: with_gen),
|
|
125
131
|
definition: doc_node_attribute_value(package.id, "documentation"),
|
|
126
132
|
stereotype: doc_node_attribute_value(package.id, "stereotype"),
|
|
127
133
|
}
|
|
@@ -145,25 +151,38 @@ module Lutaml
|
|
|
145
151
|
# @return [Array<Hash>]
|
|
146
152
|
# @note xpath ./packagedElement[@xmi:type="uml:Class" or
|
|
147
153
|
# @xmi:type="uml:AssociationClass"]
|
|
148
|
-
def serialize_model_classes(package, model)
|
|
154
|
+
def serialize_model_classes(package, model, with_gen: false)
|
|
149
155
|
package.packaged_element.select do |e|
|
|
150
156
|
e.type?("uml:Class") || e.type?("uml:AssociationClass") ||
|
|
151
157
|
e.type?("uml:Interface")
|
|
152
158
|
end.map do |klass|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
159
|
+
build_klass_hash(klass, model, with_gen: with_gen)
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
# @param klass [Shale::Mapper]
|
|
164
|
+
# @param model [Shale::Mapper]
|
|
165
|
+
# @return [Hash]
|
|
166
|
+
def build_klass_hash(klass, model, with_gen: false) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
|
|
167
|
+
klass_hash = {
|
|
168
|
+
xmi_id: klass.id,
|
|
169
|
+
name: klass.name,
|
|
170
|
+
package: model,
|
|
171
|
+
type: klass.type.split(":").last,
|
|
172
|
+
attributes: serialize_class_attributes(klass),
|
|
173
|
+
associations: serialize_model_associations(klass.id),
|
|
174
|
+
operations: serialize_class_operations(klass),
|
|
175
|
+
constraints: serialize_class_constraints(klass.id),
|
|
176
|
+
is_abstract: doc_node_attribute_value(klass.id, "isAbstract"),
|
|
177
|
+
definition: doc_node_attribute_value(klass.id, "documentation"),
|
|
178
|
+
stereotype: doc_node_attribute_value(klass.id, "stereotype"),
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if with_gen && klass.type?("uml:Class")
|
|
182
|
+
klass_hash[:generalization] = serialize_generalization(klass)
|
|
166
183
|
end
|
|
184
|
+
|
|
185
|
+
klass_hash
|
|
167
186
|
end
|
|
168
187
|
|
|
169
188
|
# @param klass [Shale::Mapper]
|
|
@@ -237,10 +256,9 @@ module Lutaml
|
|
|
237
256
|
# @param general_node [Shale::Mapper]
|
|
238
257
|
# # @return [Hash]
|
|
239
258
|
def get_general_attributes(general_node)
|
|
240
|
-
|
|
259
|
+
serialize_class_attributes(general_node, with_assoc: true)
|
|
241
260
|
# turn on sorting if necessary
|
|
242
261
|
# attrs.sort_by { |i| i[:name] }
|
|
243
|
-
attrs
|
|
244
262
|
end
|
|
245
263
|
|
|
246
264
|
# @param general_node [Shale::Mapper]
|
|
@@ -253,6 +271,8 @@ module Lutaml
|
|
|
253
271
|
# @return [Array<Hash>]
|
|
254
272
|
def get_general_hash(general_id)
|
|
255
273
|
general_node = get_general_node(general_id)
|
|
274
|
+
return [] unless general_node
|
|
275
|
+
|
|
256
276
|
general_node_attrs = get_general_attributes(general_node)
|
|
257
277
|
general_upper_klass = find_upper_level_packaged_element(general_id)
|
|
258
278
|
next_general_node_id = get_next_general_node_id(general_node)
|
|
@@ -716,6 +736,8 @@ module Lutaml
|
|
|
716
736
|
return unless type
|
|
717
737
|
|
|
718
738
|
p = find_klass_packaged_element_by_name(type)
|
|
739
|
+
return unless p
|
|
740
|
+
|
|
719
741
|
find_upper_level_packaged_element(p.id)
|
|
720
742
|
end
|
|
721
743
|
|
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.9.
|
|
4
|
+
version: 0.9.13
|
|
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-
|
|
11
|
+
date: 2024-10-03 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: liquid
|
|
@@ -376,6 +376,8 @@ files:
|
|
|
376
376
|
- lib/lutaml/xmi/liquid_drops/diagram_drop.rb
|
|
377
377
|
- lib/lutaml/xmi/liquid_drops/enum_drop.rb
|
|
378
378
|
- lib/lutaml/xmi/liquid_drops/enum_owned_literal_drop.rb
|
|
379
|
+
- lib/lutaml/xmi/liquid_drops/generalization_attribute_drop.rb
|
|
380
|
+
- lib/lutaml/xmi/liquid_drops/generalization_drop.rb
|
|
379
381
|
- lib/lutaml/xmi/liquid_drops/klass_drop.rb
|
|
380
382
|
- lib/lutaml/xmi/liquid_drops/operation_drop.rb
|
|
381
383
|
- lib/lutaml/xmi/liquid_drops/package_drop.rb
|