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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9906a661e00ac7afb79f61a10c4d73e07ee9103028aab33e7364d50e1e5a45c0
4
- data.tar.gz: eebdee0a0418f2de61317e2f320f7fc15a1ab79eb32200bccce98c2dc3b55cfd
3
+ metadata.gz: 39d7e65a03deeb293f5b6aa57d9d8f64615819434019b29749f5c7e248b5c09a
4
+ data.tar.gz: f48e6f72ec7a41414100f1897bbb4e3c1032934a1614f8f60ffe3b18fef4e8d9
5
5
  SHA512:
6
- metadata.gz: 07ad5d9a28f2e5dd7df6b836d810028f4bccfa194ae46dfa95a1d4f923e07707249a0b60f1e05ec80130fc4ecbb9ed626651a63599629deb4da23a68740631e8
7
- data.tar.gz: 9da4230858d7876cdd83d2748020e4400d14245ab26623d1d18e15422e03a0c7fdaf447ed70328310efd0b396e662027d766c3b832d8a13513812fca6af8c798
6
+ metadata.gz: 5735a788f2d4d41734a81596c70ecb02d38c3009d22b4dcc2ee7458bf44dd6e054d65094d3f3f07730c3d972efa0f350a437ac3530bf958a7e221840178fe937
7
+ data.tar.gz: 77ffdd102919ea98f92e87e0851c66cc71d1ae0306c062473b19b52d33e4f048cf7b78a38595b0a1d131afe1b59d8694984910b663896ed1726a25f50f917b1c
@@ -1,3 +1,3 @@
1
1
  module Lutaml
2
- VERSION = "0.9.29".freeze
2
+ VERSION = "0.9.30".freeze
3
3
  end
@@ -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
- all_packaged_elements.find { |e| e.id == id }
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
- upper_klass = all_packaged_elements.find do |e|
293
- e.packaged_element.find { |pe| pe.id == klass_id }
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
- attribute_node = nil
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
- if e.attributes&.attribute
863
- e.attributes.attribute.each do |a|
864
- attribute_node = a if a.idref == xmi_id
865
- end
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
- attribute_node
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
- attr_reader :xmi_cache, :xmi_root_model
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
- xmi_model = get_xmi_model(xml)
48
- new.serialize_generalization_by_name(xmi_model, name, guidance)
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.29
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-05 00:00:00.000000000 Z
11
+ date: 2025-03-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: expressir