lutaml 0.9.21 → 0.9.23

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: aa2001799c50e05bc06d6f3f916a58ebb637c0ec5f2179b93d32b9983018c2f3
4
- data.tar.gz: 482a18f5e8b462b23621d05e8790b1d6f650f2ac8ac3169f40915f2f88e8212a
3
+ metadata.gz: bc862e1c9607a9696f2104ebcd0b3fc32fabe504c910612013be0e3e6a9a1e69
4
+ data.tar.gz: 41613d1428429a6e629406d1d755745146f0f34ca78af7373a967bec3338ebbd
5
5
  SHA512:
6
- metadata.gz: 91e3ded5751df8d330c86fb909c3124ddc386c2f4a1fadd9e3f0a0ecfd4f60276c3e98d67f09e4819e585bf65c401c0a6173ad406b3227d9ebec4726f00103fd
7
- data.tar.gz: 36668d33ab9be1528af87c4433e51ca73ce9f137bce9dd58c511aaf0ec3b3e410556097c2df5d0f35d34db970809b3c625a413c931dd01cb845b34ecf2f963c9
6
+ metadata.gz: 9ea914bab620f52b038b5c0c7778eac2b257e3fafceb1b4ca5d75d198c3f53d763943f808a22d5d0561874d059fe1f1b4a819ec614c23a873f01685049b0362a
7
+ data.tar.gz: 4b0f439ac81fbdc1239833dd92288cc213ce7b78f53050acabf443b4e87bc4e795ca89cbc56cac8b783bb037de8fc3afa2f10aede1a03069328d4b9530dd91b8
@@ -1,3 +1,3 @@
1
1
  module Lutaml
2
- VERSION = "0.9.21".freeze
2
+ VERSION = "0.9.23".freeze
3
3
  end
@@ -7,11 +7,9 @@ module Lutaml
7
7
  @model = model
8
8
  @guidance = guidance
9
9
 
10
- if guidance && guidance["classes"].map do |c|
11
- c["name"]
12
- end.include?(@model[:name])
10
+ if guidance
13
11
  @klass_guidance = guidance["classes"].find do |klass|
14
- klass["name"] == @model[:name]
12
+ klass["name"] == name || klass["name"] == absolute_path
15
13
  end
16
14
  end
17
15
  end
@@ -24,6 +22,10 @@ module Lutaml
24
22
  @model[:name]
25
23
  end
26
24
 
25
+ def absolute_path
26
+ "#{@model[:absolute_path]}::#{name}"
27
+ end
28
+
27
29
  def package
28
30
  ::Lutaml::XMI::PackageDrop.new(@model[:package], @guidance)
29
31
  end
@@ -6,6 +6,7 @@ module Lutaml
6
6
  def initialize(model, guidance = nil) # rubocop:disable Lint/MissingSuper
7
7
  @model = model
8
8
  @guidance = guidance
9
+
9
10
  @children_packages ||= packages.map do |pkg|
10
11
  [pkg, pkg.packages, pkg.packages.map(&:children_packages)]
11
12
  end.flatten.uniq
@@ -19,6 +20,10 @@ module Lutaml
19
20
  @model[:name]
20
21
  end
21
22
 
23
+ def absolute_path
24
+ @model[:absolute_path]
25
+ end
26
+
22
27
  def klasses
23
28
  @model[:classes].map do |klass|
24
29
  ::Lutaml::XMI::KlassDrop.new(klass, @guidance)
@@ -38,6 +38,7 @@ module Lutaml
38
38
 
39
39
  # @param xml [String] path to xml
40
40
  # @param name [String]
41
+ # @param guidance [String]
41
42
  # @return [Hash]
42
43
  def serialize_generalization_by_name(xml, name, guidance = nil)
43
44
  xmi_model = get_xmi_model(xml)
@@ -69,17 +70,28 @@ module Lutaml
69
70
  end
70
71
 
71
72
  # @param xmi_model [Shale::Mapper]
73
+ # @param with_gen: [Boolean]
74
+ # @param with_absolute_path: [Boolean]
72
75
  # return [Hash]
73
- def serialize_xmi(xmi_model, with_gen: false)
76
+ def serialize_xmi(xmi_model, with_gen: false, with_absolute_path: false)
74
77
  set_xmi_model(xmi_model)
75
- serialize_to_hash(xmi_model, with_gen: with_gen)
78
+ serialize_to_hash(
79
+ xmi_model,
80
+ with_gen: with_gen,
81
+ with_absolute_path: with_absolute_path,
82
+ )
76
83
  end
77
84
 
78
85
  # @param xmi_model [Shale::Mapper]
86
+ # @param guidance_yaml [String]
79
87
  # return [Liquid::Drop]
80
88
  def serialize_xmi_to_liquid(xmi_model, guidance_yaml = nil)
81
89
  set_xmi_model(xmi_model)
82
- serialized_hash = serialize_xmi(xmi_model, with_gen: true)
90
+ serialized_hash = serialize_xmi(
91
+ xmi_model,
92
+ with_gen: true,
93
+ with_absolute_path: true,
94
+ )
83
95
  guidance = get_guidance(guidance_yaml)
84
96
  ::Lutaml::XMI::RootDrop.new(serialized_hash, guidance)
85
97
  end
@@ -94,12 +106,13 @@ module Lutaml
94
106
 
95
107
  # @param xmi_model [Shale::Mapper]
96
108
  # @param name [String]
109
+ # @param guidance_yaml [String]
97
110
  # @return [Hash]
98
111
  def serialize_generalization_by_name(xmi_model, name,
99
112
  guidance_yaml = nil)
100
113
  set_xmi_model(xmi_model)
101
114
  model = xmi_model.model
102
- klass = find_klass_packaged_element_by_name(name)
115
+ klass = find_klass_packaged_element(name)
103
116
  serialized_hash = build_klass_hash(klass, model, with_gen: true)
104
117
  guidance = get_guidance(guidance_yaml)
105
118
  ::Lutaml::XMI::KlassDrop.new(serialized_hash, guidance)
@@ -108,39 +121,73 @@ module Lutaml
108
121
  private
109
122
 
110
123
  # @param xmi_model [Shale::Mapper]
124
+ # @param with_gen: [Boolean]
125
+ # @param with_absolute_path: [Boolean]
111
126
  # @return [Hash]
112
127
  # @note xpath: //uml:Model[@xmi:type="uml:Model"]
113
- def serialize_to_hash(xmi_model, with_gen: false)
128
+ def serialize_to_hash(xmi_model,
129
+ with_gen: false, with_absolute_path: false)
114
130
  model = xmi_model.model
115
131
  {
116
132
  name: model.name,
117
- packages: serialize_model_packages(model, with_gen: with_gen),
133
+ packages: serialize_model_packages(
134
+ model,
135
+ with_gen: with_gen,
136
+ with_absolute_path: with_absolute_path,
137
+ ),
118
138
  }
119
139
  end
120
140
 
121
141
  # @param model [Shale::Mapper]
142
+ # @param with_gen: [Boolean]
143
+ # @param with_absolute_path: [Boolean]
144
+ # @param absolute_path: [String]
122
145
  # @return [Array<Hash>]
123
146
  # @note xpath ./packagedElement[@xmi:type="uml:Package"]
124
- def serialize_model_packages(model, with_gen: false)
125
- model.packaged_element.select do |e|
147
+ def serialize_model_packages(model, # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
148
+ with_gen: false, with_absolute_path: false, absolute_path: "")
149
+ packages = model.packaged_element.select do |e|
126
150
  e.type?("uml:Package")
127
- end.map do |package|
128
- {
151
+ end
152
+
153
+ if with_absolute_path
154
+ absolute_path = "#{absolute_path}::#{model.name}"
155
+ end
156
+
157
+ packages.map do |package|
158
+ h = {
129
159
  xmi_id: package.id,
130
160
  name: get_package_name(package),
131
- classes: serialize_model_classes(package, model,
132
- with_gen: with_gen),
161
+ classes: serialize_model_classes(
162
+ package, model,
163
+ with_gen: with_gen,
164
+ with_absolute_path: with_absolute_path,
165
+ absolute_path: "#{absolute_path}::#{package.name}"
166
+ ),
133
167
  enums: serialize_model_enums(package),
134
168
  data_types: serialize_model_data_types(package),
135
169
  diagrams: serialize_model_diagrams(package.id),
136
- packages: serialize_model_packages(package, with_gen: with_gen),
170
+ packages: serialize_model_packages(
171
+ package,
172
+ with_gen: with_gen,
173
+ with_absolute_path: with_absolute_path,
174
+ absolute_path: absolute_path,
175
+ ),
137
176
  definition: doc_node_attribute_value(package.id, "documentation"),
138
177
  stereotype: doc_node_attribute_value(package.id, "stereotype"),
139
178
  }
179
+
180
+ if with_absolute_path
181
+ h[:absolute_path] = "#{absolute_path}::#{package.name}"
182
+ end
183
+
184
+ h
140
185
  end
141
186
  end
142
187
 
143
- def get_package_name(package)
188
+ # @param package [Shale::Mapper]
189
+ # @return [String]
190
+ def get_package_name(package) # rubocop:disable Metrics/AbcSize
144
191
  return package.name unless package.name.nil?
145
192
 
146
193
  connector = fetch_connector(package.id)
@@ -154,22 +201,37 @@ module Lutaml
154
201
 
155
202
  # @param package [Shale::Mapper]
156
203
  # @param model [Shale::Mapper]
204
+ # @param with_gen: [Boolean]
205
+ # @param with_absolute_path: [Boolean]
157
206
  # @return [Array<Hash>]
158
207
  # @note xpath ./packagedElement[@xmi:type="uml:Class" or
159
208
  # @xmi:type="uml:AssociationClass"]
160
- def serialize_model_classes(package, model, with_gen: false)
161
- package.packaged_element.select do |e|
209
+ def serialize_model_classes(package, model, # rubocop:disable Metrics/MethodLength
210
+ with_gen: false, with_absolute_path: false, absolute_path: "")
211
+ klasses = package.packaged_element.select do |e|
162
212
  e.type?("uml:Class") || e.type?("uml:AssociationClass") ||
163
213
  e.type?("uml:Interface")
164
- end.map do |klass|
165
- build_klass_hash(klass, model, with_gen: with_gen)
214
+ end
215
+
216
+ klasses.map do |klass|
217
+ h = build_klass_hash(
218
+ klass, model,
219
+ with_gen: with_gen
220
+ )
221
+
222
+ h[:absolute_path] = absolute_path if with_absolute_path
223
+
224
+ h
166
225
  end
167
226
  end
168
227
 
169
228
  # @param klass [Shale::Mapper]
170
229
  # @param model [Shale::Mapper]
230
+ # @param with_gen: [Boolean]
231
+ # @param with_absolute_path: [Boolean]
171
232
  # @return [Hash]
172
- def build_klass_hash(klass, model, with_gen: false) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
233
+ def build_klass_hash(klass, model, # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
234
+ with_gen: false, with_absolute_path: false, absolute_path: "")
173
235
  klass_hash = {
174
236
  xmi_id: klass.id,
175
237
  name: klass.name,
@@ -184,6 +246,8 @@ module Lutaml
184
246
  stereotype: doc_node_attribute_value(klass.id, "stereotype"),
185
247
  }
186
248
 
249
+ klass_hash[:absolute_path] = absolute_path if with_absolute_path
250
+
187
251
  if with_gen && klass.type?("uml:Class")
188
252
  klass_hash[:generalization] = serialize_generalization(klass)
189
253
  end
@@ -308,6 +372,65 @@ module Lutaml
308
372
  upper_klass&.name
309
373
  end
310
374
 
375
+ # @param path [String]
376
+ # @return [Shale::Mapper]
377
+ def find_klass_packaged_element(path)
378
+ lutaml_path = Lutaml::Path.parse(path)
379
+ if lutaml_path.segments.count == 1
380
+ return find_klass_packaged_element_by_name(path)
381
+ end
382
+
383
+ find_klass_packaged_element_by_path(lutaml_path)
384
+ end
385
+
386
+ # @param path [Lutaml::Path::ElementPath]
387
+ # @return [Shale::Mapper]
388
+ def find_klass_packaged_element_by_path(path)
389
+ if path.absolute?
390
+ iterate_packaged_element(
391
+ @xmi_root_model.model, path.segments.map(&:name)
392
+ )
393
+ else
394
+ iterate_relative_packaged_element(path.segments.map(&:name))
395
+ end
396
+ end
397
+
398
+ # @param name_array [Array<String>]
399
+ # @return [Shale::Mapper]
400
+ def iterate_relative_packaged_element(name_array)
401
+ # match the first element in the name_array
402
+ matched_elements = all_packaged_elements.select do |e|
403
+ e.type?("uml:Package") && e.name == name_array[0]
404
+ end
405
+
406
+ # match the rest elements in the name_array
407
+ result = matched_elements.map do |e|
408
+ iterate_packaged_element(e, name_array, type: "uml:Class")
409
+ end
410
+
411
+ result.compact.first
412
+ end
413
+
414
+ # @param model [Shale::Mapper]
415
+ # @param name_array [Array<String>]
416
+ # @param index: [Integer]
417
+ # @param type: [String]
418
+ # @return [Shale::Mapper]
419
+ def iterate_packaged_element(model, name_array,
420
+ index: 1, type: "uml:Package")
421
+ return model if index == name_array.count
422
+
423
+ model = model.packaged_element.find do |p|
424
+ p.name == name_array[index] && p.type?(type)
425
+ end
426
+
427
+ return nil if model.nil?
428
+
429
+ index += 1
430
+ type = index == name_array.count - 1 ? "uml:Class" : "uml:Package"
431
+ iterate_packaged_element(model, name_array, index: index, type: type)
432
+ end
433
+
311
434
  # @param name [String]
312
435
  # @return [Shale::Mapper]
313
436
  def find_klass_packaged_element_by_name(name)
data/lib/lutaml/xmi.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require "lutaml/xmi/version"
2
2
  require "lutaml/xmi/parsers/xml"
3
3
  require "liquid"
4
+ require "lutaml/path"
4
5
 
5
6
  Dir["#{File.dirname(__FILE__)}/xmi/liquid_drops/**/*.rb"].sort.each do |f|
6
7
  require f
data/lutaml.gemspec CHANGED
@@ -29,15 +29,16 @@ Gem::Specification.new do |spec|
29
29
 
30
30
  spec.required_ruby_version = ">= 2.7.0"
31
31
 
32
- spec.add_runtime_dependency "liquid"
33
- spec.add_runtime_dependency "expressir", "~> 1.3"
34
- spec.add_runtime_dependency "hashie", "~> 4.1.0"
35
- spec.add_runtime_dependency "htmlentities"
36
- spec.add_runtime_dependency "nokogiri", "~> 1.10"
37
- spec.add_runtime_dependency "parslet", "~> 2.0.0"
38
- spec.add_runtime_dependency "ruby-graphviz", "~> 1.2"
39
- spec.add_runtime_dependency "thor", "~> 1.0"
40
- spec.add_runtime_dependency "xmi", "~> 0.3.10"
32
+ spec.add_dependency "expressir", "~> 1.3"
33
+ spec.add_dependency "hashie", "~> 4.1.0"
34
+ spec.add_dependency "htmlentities"
35
+ spec.add_dependency "liquid"
36
+ spec.add_dependency "lutaml-path"
37
+ spec.add_dependency "nokogiri", "~> 1.10"
38
+ spec.add_dependency "parslet", "~> 2.0.0"
39
+ spec.add_dependency "ruby-graphviz", "~> 1.2"
40
+ spec.add_dependency "thor", "~> 1.0"
41
+ spec.add_dependency "xmi", "~> 0.3.10"
41
42
 
42
43
  spec.add_development_dependency "byebug"
43
44
  spec.add_development_dependency "equivalent-xml", "~> 0.6.0"
@@ -46,4 +47,5 @@ Gem::Specification.new do |spec|
46
47
  spec.add_development_dependency "rspec", "~> 3.11"
47
48
  spec.add_development_dependency "rubocop", "~> 1.58"
48
49
  spec.add_development_dependency "rubocop-performance", "~> 1.19"
49
- end
50
+ spec.metadata["rubygems_mfa_required"] = "true"
51
+ end
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lutaml
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.21
4
+ version: 0.9.23
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-04 00:00:00.000000000 Z
11
+ date: 2024-11-15 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: liquid
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: expressir
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +52,34 @@ dependencies:
66
52
  - - ">="
67
53
  - !ruby/object:Gem::Version
68
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: liquid
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: lutaml-path
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: nokogiri
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -396,6 +410,7 @@ metadata:
396
410
  homepage_uri: https://github.com/lutaml/lutaml
397
411
  source_code_uri: https://github.com/lutaml/lutaml
398
412
  changelog_uri: https://github.com/lutaml/lutaml/releases
413
+ rubygems_mfa_required: 'true'
399
414
  post_install_message:
400
415
  rdoc_options: []
401
416
  require_paths: