lutaml 0.9.29 → 0.9.30
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/parsers/xmi_base.rb +37 -13
- data/lib/lutaml/xmi/parsers/xml.rb +32 -5
- 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: 39d7e65a03deeb293f5b6aa57d9d8f64615819434019b29749f5c7e248b5c09a
|
4
|
+
data.tar.gz: f48e6f72ec7a41414100f1897bbb4e3c1032934a1614f8f60ffe3b18fef4e8d9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5735a788f2d4d41734a81596c70ecb02d38c3009d22b4dcc2ee7458bf44dd6e054d65094d3f3f07730c3d972efa0f350a437ac3530bf958a7e221840178fe937
|
7
|
+
data.tar.gz: 77ffdd102919ea98f92e87e0851c66cc71d1ae0306c062473b19b52d33e4f048cf7b78a38595b0a1d131afe1b59d8694984910b663896ed1726a25f50f917b1c
|
data/lib/lutaml/version.rb
CHANGED
@@ -4,6 +4,7 @@ require "lutaml/uml/has_attributes"
|
|
4
4
|
require "lutaml/uml/document"
|
5
5
|
require "lutaml/xmi"
|
6
6
|
require "xmi"
|
7
|
+
require 'digest'
|
7
8
|
|
8
9
|
module Lutaml
|
9
10
|
module XMI
|
@@ -24,10 +25,10 @@ module Lutaml
|
|
24
25
|
end
|
25
26
|
|
26
27
|
# @param xmi_model [Lutaml::Model::Serializable]
|
27
|
-
def set_xmi_model(xmi_model)
|
28
|
-
@xmi_cache = {}
|
28
|
+
def set_xmi_model(xmi_model, xmi_cache = nil)
|
29
|
+
@xmi_cache = xmi_cache ? xmi_cache : {}
|
29
30
|
@xmi_root_model = xmi_model
|
30
|
-
map_id_name(@xmi_cache, @xmi_root_model)
|
31
|
+
map_id_name(@xmi_cache, @xmi_root_model) if @xmi_cache.empty?
|
31
32
|
end
|
32
33
|
|
33
34
|
# @param yaml [String]
|
@@ -280,19 +281,34 @@ module Lutaml
|
|
280
281
|
]
|
281
282
|
end
|
282
283
|
|
284
|
+
# Build a cache for packaged elements by ID
|
285
|
+
def build_packaged_element_cache
|
286
|
+
@packaged_element_cache = all_packaged_elements.to_h { |e| [e.id, e] }
|
287
|
+
end
|
288
|
+
|
283
289
|
# @param id [String]
|
284
290
|
# @return [Lutaml::Model::Serializable]
|
285
291
|
def find_packaged_element_by_id(id)
|
286
|
-
|
292
|
+
build_packaged_element_cache unless @packaged_element_cache
|
293
|
+
@packaged_element_cache[id]
|
287
294
|
end
|
288
295
|
|
289
296
|
# @param id [String]
|
290
297
|
# @return [Lutaml::Model::Serializable]
|
291
298
|
def find_upper_level_packaged_element(klass_id)
|
292
|
-
|
293
|
-
|
299
|
+
build_upper_level_cache unless @upper_level_cache
|
300
|
+
@upper_level_cache[klass_id]
|
301
|
+
end
|
302
|
+
|
303
|
+
# Build cache once for all packaged elements
|
304
|
+
def build_upper_level_cache
|
305
|
+
@upper_level_cache = {}
|
306
|
+
|
307
|
+
all_packaged_elements.each do |e|
|
308
|
+
e.packaged_element.each do |pe|
|
309
|
+
@upper_level_cache[pe.id] = e.name
|
310
|
+
end
|
294
311
|
end
|
295
|
-
upper_klass&.name
|
296
312
|
end
|
297
313
|
|
298
314
|
# @param path [String]
|
@@ -857,15 +873,20 @@ module Lutaml
|
|
857
873
|
# @return [Lutaml::Model::Serializable]
|
858
874
|
# @note xpath %(//attribute[@xmi:idref="#{xmi_id}"])
|
859
875
|
def fetch_attribute_node(xmi_id)
|
860
|
-
|
876
|
+
@attribute_cache ||= build_attribute_cache
|
877
|
+
@attribute_cache[xmi_id]
|
878
|
+
end
|
879
|
+
|
880
|
+
def build_attribute_cache
|
881
|
+
cache = {}
|
861
882
|
@xmi_root_model.extension.elements.element.each do |e|
|
862
|
-
|
863
|
-
|
864
|
-
|
865
|
-
|
883
|
+
next unless e.attributes&.attribute
|
884
|
+
|
885
|
+
e.attributes.attribute.each do |a|
|
886
|
+
cache[a.idref] = a # Store in hash for quick lookup
|
866
887
|
end
|
867
888
|
end
|
868
|
-
|
889
|
+
cache
|
869
890
|
end
|
870
891
|
|
871
892
|
# @param xmi_id [String]
|
@@ -955,6 +976,8 @@ module Lutaml
|
|
955
976
|
|
956
977
|
# @return [Array<Xmi::Uml::PackagedElement>]
|
957
978
|
def all_packaged_elements
|
979
|
+
return @all_packaged_elements_cache if @all_packaged_elements_cache
|
980
|
+
|
958
981
|
all_elements = []
|
959
982
|
packaged_element_roots = @xmi_root_model.model.packaged_element +
|
960
983
|
@xmi_root_model.extension.primitive_types.packaged_element +
|
@@ -964,6 +987,7 @@ module Lutaml
|
|
964
987
|
select_all_packaged_elements(all_elements, e, nil)
|
965
988
|
end
|
966
989
|
|
990
|
+
@all_packaged_elements_cache = all_elements
|
967
991
|
all_elements
|
968
992
|
end
|
969
993
|
|
@@ -11,7 +11,10 @@ module Lutaml
|
|
11
11
|
module Parsers
|
12
12
|
# Class for parsing .xmi schema files into ::Lutaml::Uml::Document
|
13
13
|
class XML
|
14
|
-
|
14
|
+
@xmi_cache_static = {}
|
15
|
+
@xmi_root_model_cache_static = {}
|
16
|
+
|
17
|
+
attr_reader :xmi_cache, :xmi_root_model, :all_packaged_elements_cache
|
15
18
|
|
16
19
|
include XMIBase
|
17
20
|
|
@@ -44,8 +47,32 @@ module Lutaml
|
|
44
47
|
# @param guidance [String]
|
45
48
|
# @return [Hash]
|
46
49
|
def serialize_generalization_by_name(xml, name, guidance = nil)
|
47
|
-
|
48
|
-
|
50
|
+
# puts "#{xml}, #{name}, #{guidance}"
|
51
|
+
|
52
|
+
# Load from cache or file
|
53
|
+
xml_cache_key = (Digest::SHA256.file xml).hexdigest
|
54
|
+
xmi_model = deep_clone(@xmi_root_model_cache_static[xml_cache_key])
|
55
|
+
xmi_model_to_cache = nil
|
56
|
+
if xmi_model == nil
|
57
|
+
xmi_model = get_xmi_model(xml)
|
58
|
+
xmi_model_to_cache = deep_clone(xmi_model)
|
59
|
+
end
|
60
|
+
xmi_cache = @xmi_cache_static[xml_cache_key]
|
61
|
+
|
62
|
+
instance = new
|
63
|
+
ret_val = instance.serialize_generalization_by_name(xmi_model, name, guidance, xmi_cache)
|
64
|
+
|
65
|
+
# Put to cache
|
66
|
+
@xmi_cache_static[xml_cache_key] = instance.xmi_cache if guidance == nil
|
67
|
+
@xmi_root_model_cache_static[xml_cache_key] = xmi_model_to_cache if xmi_model_to_cache
|
68
|
+
|
69
|
+
ret_val
|
70
|
+
end
|
71
|
+
|
72
|
+
def deep_clone(obj)
|
73
|
+
# TODO: we need this if xmi_model is being modified in serialize_generalization_by_name
|
74
|
+
#Marshal.load(Marshal.dump(obj)) if obj != nil
|
75
|
+
obj
|
49
76
|
end
|
50
77
|
end
|
51
78
|
|
@@ -92,8 +119,8 @@ module Lutaml
|
|
92
119
|
# @param guidance_yaml [String]
|
93
120
|
# @return [Hash]
|
94
121
|
def serialize_generalization_by_name(xmi_model, name, # rubocop:disable Metrics/MethodLength
|
95
|
-
guidance_yaml = nil)
|
96
|
-
set_xmi_model(xmi_model)
|
122
|
+
guidance_yaml = nil, xmi_cache = nil)
|
123
|
+
set_xmi_model(xmi_model, xmi_cache)
|
97
124
|
klass = find_klass_packaged_element(name)
|
98
125
|
guidance = get_guidance(guidance_yaml)
|
99
126
|
options = {
|
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.30
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ribose Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-03-
|
11
|
+
date: 2025-03-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: expressir
|