lutaml 0.9.26 → 0.9.28
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/README.adoc +36 -35
- data/lib/lutaml/parser.rb +3 -31
- data/lib/lutaml/version.rb +1 -1
- data/lib/lutaml/xmi/parsers/xml.rb +51 -49
- data/lib/lutaml/xml/parsers/xml.rb +4 -17
- data/lib/lutaml/xml.rb +0 -8
- data/lutaml.gemspec +3 -1
- metadata +32 -10
- data/lib/lutaml/express/lutaml_path/document_wrapper.rb +0 -22
- data/lib/lutaml/express/lutaml_path/formatter.rb +0 -14
- data/lib/lutaml/lutaml_path/document_wrapper.rb +0 -51
- data/lib/lutaml/uml/lutaml_path/document_wrapper.rb +0 -15
- data/lib/lutaml/xml/lutaml_path/document_wrapper.rb +0 -45
- data/lib/lutaml/xml/mapper.rb +0 -448
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c3d4343125b51531e1c2cab816a8a9e85ada1764ecaef15c1598038124167ba6
|
4
|
+
data.tar.gz: 0bb4810dfe1e8d1cc363379d5f5cfbee8e778bf2ccb6dda67bcaf2360d625034
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: af85cb2b8f1e4ae8ab8e2fb7831c4ef995b39899150ed35debada9e22f5211032ad1249bd1e45a35bb13708c1355d5a2d2a13df5821bd6ed5cc16e1bccbb8c8e
|
7
|
+
data.tar.gz: '019cd5694d0a1a91ec72116680728bb848ba184693af97f096d2d929ffda1b64fdf2d0bc0ba71d2e1b3fec0d060e1e2aeab122ab9683ee85bbc582b6d0000233'
|
data/README.adoc
CHANGED
@@ -31,52 +31,53 @@ $ gem install lutaml
|
|
31
31
|
=== Parsing
|
32
32
|
|
33
33
|
The `Lutaml::Parser.parse` method provides a single point of entry for parsing
|
34
|
-
data model files
|
34
|
+
data model files, such as:
|
35
35
|
|
36
|
-
|
37
|
-
|
36
|
+
* EXPRESS files with `.exp` extension
|
37
|
+
* YAML Compressed EXPRESS CACHE files
|
38
|
+
* XMI files with `.xmi` extension
|
39
|
+
* XML files with `.xml` extension
|
40
|
+
* LutaML files with `.lutaml` extension
|
41
|
+
* LutaML YAML files with `.yml` extension
|
42
|
+
|
43
|
+
Depending on the input file type, `Lutaml::Parser.parse` returns:
|
44
|
+
|
45
|
+
* `Expressir::Express::Model::Repository` for EXPRESS files
|
46
|
+
* `Expressir::Express::Cache` for EXPRESS CACHE files
|
47
|
+
* `Lutaml::Uml::Document` for XMI files
|
48
|
+
* `Lutaml::Uml::Document` for XML files
|
49
|
+
* `Lutaml::Uml::Document` for LutaML files
|
50
|
+
* `Lutaml::Uml::Document` for LutaML YAML files
|
51
|
+
|
52
|
+
Examples to use the `Lutaml::Parser.parse`:
|
38
53
|
|
39
54
|
[source,ruby]
|
40
55
|
----
|
56
|
+
require "lutaml"
|
57
|
+
|
41
58
|
# example.exp is an EXPRESS schema file
|
42
|
-
|
43
|
-
# => returns
|
44
|
-
wrapper.original_document
|
45
|
-
# => returns the original Expressir::Repository object
|
46
|
-
----
|
59
|
+
model = Lutaml::Parser.parse([File.new("example.exp")])
|
60
|
+
# => returns Expressir::Express::Model::Repository model
|
47
61
|
|
48
|
-
[source,ruby]
|
49
|
-
----
|
50
62
|
# example.exp.yaml is an EXPRESS cache file created with Expressir
|
51
|
-
|
52
|
-
# => returns
|
53
|
-
----
|
54
|
-
|
63
|
+
model = Lutaml::Parser.parse([File.new("example.exp.yaml")], ::Lutaml::Parser::EXPRESS_CACHE_PARSE_TYPE)
|
64
|
+
# => returns Expressir::Express::Cache model
|
55
65
|
|
56
|
-
|
66
|
+
# example.xmi is an XMI file
|
67
|
+
model = Lutaml::Parser.parse([File.new("example.xmi")])
|
68
|
+
# => returns Lutaml::Uml::Document model
|
57
69
|
|
58
|
-
|
59
|
-
|
60
|
-
|
70
|
+
# example.xml is an XML file
|
71
|
+
model = Lutaml::Parser.parse([File.new("example.xml")])
|
72
|
+
# => returns Lutaml::Uml::Document model
|
61
73
|
|
62
|
-
|
74
|
+
# example.lutaml is an LutaML file
|
75
|
+
model = Lutaml::Parser.parse([File.new("example.lutaml")])
|
76
|
+
# => returns Lutaml::Uml::Document model
|
63
77
|
|
64
|
-
|
65
|
-
|
66
|
-
#
|
67
|
-
filtered_schemas = ["action_schema", "date_time_schema"]
|
68
|
-
|
69
|
-
# Sets the Proc
|
70
|
-
wrapper.select_proc = Proc.new do |value|
|
71
|
-
if value.is_a?(Expressir::Model::Declarations::Schema)
|
72
|
-
filtered_schemas.include?(value.id)
|
73
|
-
else
|
74
|
-
true
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
serialized = wrapper.to_liquid
|
79
|
-
# => returns the filtered to_hash method
|
78
|
+
# example.yaml is an LutaML YAML file
|
79
|
+
model = Lutaml::Parser.parse([File.new("example.yaml")])
|
80
|
+
# => returns Lutaml::Uml::Document model
|
80
81
|
----
|
81
82
|
|
82
83
|
|
data/lib/lutaml/parser.rb
CHANGED
@@ -2,8 +2,6 @@ require "lutaml/express"
|
|
2
2
|
require "lutaml/uml"
|
3
3
|
require "lutaml/xmi"
|
4
4
|
require "lutaml/xml"
|
5
|
-
require "lutaml/uml/lutaml_path/document_wrapper"
|
6
|
-
require "lutaml/express/lutaml_path/document_wrapper"
|
7
5
|
require "expressir/express/cache"
|
8
6
|
|
9
7
|
module Lutaml
|
@@ -14,14 +12,10 @@ module Lutaml
|
|
14
12
|
|
15
13
|
class << self
|
16
14
|
def parse(file_list, input_type = nil)
|
17
|
-
file_list = file_list.is_a?(Array)
|
18
|
-
new(Array(file_list), input_type).parse
|
19
|
-
end
|
20
|
-
|
21
|
-
def parse_into_document(file_list, input_type = nil)
|
22
|
-
file_list = file_list.is_a?(Array) ? file_list : [file_list]
|
15
|
+
file_list = [file_list] unless file_list.is_a?(Array)
|
23
16
|
new(Array(file_list), input_type).parse_into_document
|
24
17
|
end
|
18
|
+
alias_method :parse_into_document, :parse
|
25
19
|
end
|
26
20
|
|
27
21
|
def initialize(file_list, input_type)
|
@@ -29,15 +23,7 @@ module Lutaml
|
|
29
23
|
@file_list = file_list
|
30
24
|
end
|
31
25
|
|
32
|
-
def
|
33
|
-
documents = parse_into_document
|
34
|
-
return document_wrapper(documents) if ["exp",
|
35
|
-
EXPRESS_CACHE_PARSE_TYPE].include?(parse_type)
|
36
|
-
|
37
|
-
documents.map { |doc| document_wrapper(doc) }
|
38
|
-
end
|
39
|
-
|
40
|
-
def parse_into_document
|
26
|
+
def parse_into_document # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
|
41
27
|
case parse_type
|
42
28
|
when "exp"
|
43
29
|
Expressir::Express::Parser.from_files(file_list.map(&:path))
|
@@ -55,19 +41,5 @@ module Lutaml
|
|
55
41
|
raise ArgumentError, "Unsupported file format"
|
56
42
|
end
|
57
43
|
end
|
58
|
-
|
59
|
-
private
|
60
|
-
|
61
|
-
def document_wrapper(document)
|
62
|
-
if ["exp", EXPRESS_CACHE_PARSE_TYPE].include?(parse_type)
|
63
|
-
return Lutaml::Express::LutamlPath::DocumentWrapper.new(document)
|
64
|
-
end
|
65
|
-
|
66
|
-
if parse_type == "xml"
|
67
|
-
return Lutaml::Xml::LutamlPath::DocumentWrapper.new(document)
|
68
|
-
end
|
69
|
-
|
70
|
-
Lutaml::Uml::LutamlPath::DocumentWrapper.new(document)
|
71
|
-
end
|
72
44
|
end
|
73
45
|
end
|
data/lib/lutaml/version.rb
CHANGED
@@ -48,19 +48,19 @@ module Lutaml
|
|
48
48
|
private
|
49
49
|
|
50
50
|
# @param xml [String]
|
51
|
-
# @return [
|
51
|
+
# @return [Lutaml::Model::Serializable]
|
52
52
|
def get_xmi_model(xml)
|
53
53
|
Xmi::Sparx::SparxRoot.parse_xml(File.read(xml))
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
-
# @param xmi_model [
|
57
|
+
# @param xmi_model [Lutaml::Model::Serializable]
|
58
58
|
def set_xmi_model(xmi_model)
|
59
59
|
@xmi_cache = {}
|
60
60
|
@xmi_root_model = xmi_model
|
61
61
|
end
|
62
62
|
|
63
|
-
# @param xmi_model [
|
63
|
+
# @param xmi_model [Lutaml::Model::Serializable]
|
64
64
|
# @return [Lutaml::Uml::Document]
|
65
65
|
def parse(xmi_model)
|
66
66
|
set_xmi_model(xmi_model)
|
@@ -69,7 +69,7 @@ module Lutaml
|
|
69
69
|
::Lutaml::Uml::Document.new(serialized_hash)
|
70
70
|
end
|
71
71
|
|
72
|
-
# @param xmi_model [
|
72
|
+
# @param xmi_model [Lutaml::Model::Serializable]
|
73
73
|
# @param with_gen: [Boolean]
|
74
74
|
# @param with_absolute_path: [Boolean]
|
75
75
|
# return [Hash]
|
@@ -82,7 +82,7 @@ module Lutaml
|
|
82
82
|
)
|
83
83
|
end
|
84
84
|
|
85
|
-
# @param xmi_model [
|
85
|
+
# @param xmi_model [Lutaml::Model::Serializable]
|
86
86
|
# @param guidance_yaml [String]
|
87
87
|
# return [Liquid::Drop]
|
88
88
|
def serialize_xmi_to_liquid(xmi_model, guidance_yaml = nil)
|
@@ -104,7 +104,7 @@ module Lutaml
|
|
104
104
|
YAML.safe_load(File.read(yaml, encoding: "UTF-8"))
|
105
105
|
end
|
106
106
|
|
107
|
-
# @param xmi_model [
|
107
|
+
# @param xmi_model [Lutaml::Model::Serializable]
|
108
108
|
# @param name [String]
|
109
109
|
# @param guidance_yaml [String]
|
110
110
|
# @return [Hash]
|
@@ -120,7 +120,7 @@ module Lutaml
|
|
120
120
|
|
121
121
|
private
|
122
122
|
|
123
|
-
# @param xmi_model [
|
123
|
+
# @param xmi_model [Lutaml::Model::Serializable]
|
124
124
|
# @param with_gen: [Boolean]
|
125
125
|
# @param with_absolute_path: [Boolean]
|
126
126
|
# @return [Hash]
|
@@ -138,7 +138,7 @@ module Lutaml
|
|
138
138
|
}
|
139
139
|
end
|
140
140
|
|
141
|
-
# @param model [
|
141
|
+
# @param model [Lutaml::Model::Serializable]
|
142
142
|
# @param with_gen: [Boolean]
|
143
143
|
# @param with_absolute_path: [Boolean]
|
144
144
|
# @param absolute_path: [String]
|
@@ -188,7 +188,7 @@ module Lutaml
|
|
188
188
|
end
|
189
189
|
end
|
190
190
|
|
191
|
-
# @param package [
|
191
|
+
# @param package [Lutaml::Model::Serializable]
|
192
192
|
# @return [String]
|
193
193
|
def get_package_name(package) # rubocop:disable Metrics/AbcSize
|
194
194
|
return package.name unless package.name.nil?
|
@@ -202,8 +202,8 @@ module Lutaml
|
|
202
202
|
"unnamed"
|
203
203
|
end
|
204
204
|
|
205
|
-
# @param package [
|
206
|
-
# @param model [
|
205
|
+
# @param package [Lutaml::Model::Serializable]
|
206
|
+
# @param model [Lutaml::Model::Serializable]
|
207
207
|
# @param with_gen: [Boolean]
|
208
208
|
# @param with_absolute_path: [Boolean]
|
209
209
|
# @return [Array<Hash>]
|
@@ -228,8 +228,8 @@ module Lutaml
|
|
228
228
|
end
|
229
229
|
end
|
230
230
|
|
231
|
-
# @param klass [
|
232
|
-
# @param model [
|
231
|
+
# @param klass [Lutaml::Model::Serializable]
|
232
|
+
# @param model [Lutaml::Model::Serializable]
|
233
233
|
# @param with_gen: [Boolean]
|
234
234
|
# @param with_absolute_path: [Boolean]
|
235
235
|
# @return [Hash]
|
@@ -258,7 +258,7 @@ module Lutaml
|
|
258
258
|
klass_hash
|
259
259
|
end
|
260
260
|
|
261
|
-
# @param klass [
|
261
|
+
# @param klass [Lutaml::Model::Serializable]
|
262
262
|
# # @return [Hash]
|
263
263
|
def serialize_generalization(klass)
|
264
264
|
general_hash, next_general_node_id = get_top_level_general_hash(klass)
|
@@ -271,7 +271,7 @@ module Lutaml
|
|
271
271
|
general_hash
|
272
272
|
end
|
273
273
|
|
274
|
-
# @param klass [
|
274
|
+
# @param klass [Lutaml::Model::Serializable]
|
275
275
|
# @return [Array<Hash>]
|
276
276
|
def get_top_level_general_hash(klass) # rubocop:disable Metrics/AbcSize
|
277
277
|
general_hash, next_general_node_id = get_general_hash(klass.id)
|
@@ -305,7 +305,7 @@ module Lutaml
|
|
305
305
|
end
|
306
306
|
|
307
307
|
# @param xmi_id [String]
|
308
|
-
# @param model [
|
308
|
+
# @param model [Lutaml::Model::Serializable]
|
309
309
|
# @return [Array<Hash>]
|
310
310
|
# @note get generalization node and its owned attributes
|
311
311
|
def serialize_generalization_attributes(general_id)
|
@@ -321,18 +321,18 @@ module Lutaml
|
|
321
321
|
end
|
322
322
|
|
323
323
|
# @param xmi_id [String]
|
324
|
-
# @return [
|
324
|
+
# @return [Lutaml::Model::Serializable]
|
325
325
|
def get_general_node(xmi_id)
|
326
326
|
find_packaged_element_by_id(xmi_id)
|
327
327
|
end
|
328
328
|
|
329
|
-
# @param general_node [
|
329
|
+
# @param general_node [Lutaml::Model::Serializable]
|
330
330
|
# @return [Hash]
|
331
331
|
def get_general_attributes(general_node)
|
332
332
|
serialize_class_attributes(general_node, with_assoc: true)
|
333
333
|
end
|
334
334
|
|
335
|
-
# @param general_node [
|
335
|
+
# @param general_node [Lutaml::Model::Serializable]
|
336
336
|
# @return [String]
|
337
337
|
def get_next_general_node_id(general_node)
|
338
338
|
general_node.generalization.first&.general
|
@@ -361,13 +361,13 @@ module Lutaml
|
|
361
361
|
end
|
362
362
|
|
363
363
|
# @param id [String]
|
364
|
-
# @return [
|
364
|
+
# @return [Lutaml::Model::Serializable]
|
365
365
|
def find_packaged_element_by_id(id)
|
366
366
|
all_packaged_elements.find { |e| e.id == id }
|
367
367
|
end
|
368
368
|
|
369
369
|
# @param id [String]
|
370
|
-
# @return [
|
370
|
+
# @return [Lutaml::Model::Serializable]
|
371
371
|
def find_upper_level_packaged_element(klass_id)
|
372
372
|
upper_klass = all_packaged_elements.find do |e|
|
373
373
|
e.packaged_element.find { |pe| pe.id == klass_id }
|
@@ -376,7 +376,7 @@ module Lutaml
|
|
376
376
|
end
|
377
377
|
|
378
378
|
# @param path [String]
|
379
|
-
# @return [
|
379
|
+
# @return [Lutaml::Model::Serializable]
|
380
380
|
def find_klass_packaged_element(path)
|
381
381
|
lutaml_path = Lutaml::Path.parse(path)
|
382
382
|
if lutaml_path.segments.count == 1
|
@@ -387,7 +387,7 @@ module Lutaml
|
|
387
387
|
end
|
388
388
|
|
389
389
|
# @param path [Lutaml::Path::ElementPath]
|
390
|
-
# @return [
|
390
|
+
# @return [Lutaml::Model::Serializable]
|
391
391
|
def find_klass_packaged_element_by_path(path)
|
392
392
|
if path.absolute?
|
393
393
|
iterate_packaged_element(
|
@@ -399,7 +399,7 @@ module Lutaml
|
|
399
399
|
end
|
400
400
|
|
401
401
|
# @param name_array [Array<String>]
|
402
|
-
# @return [
|
402
|
+
# @return [Lutaml::Model::Serializable]
|
403
403
|
def iterate_relative_packaged_element(name_array)
|
404
404
|
# match the first element in the name_array
|
405
405
|
matched_elements = all_packaged_elements.select do |e|
|
@@ -414,11 +414,11 @@ module Lutaml
|
|
414
414
|
result.compact.first
|
415
415
|
end
|
416
416
|
|
417
|
-
# @param model [
|
417
|
+
# @param model [Lutaml::Model::Serializable]
|
418
418
|
# @param name_array [Array<String>]
|
419
419
|
# @param index: [Integer]
|
420
420
|
# @param type: [String]
|
421
|
-
# @return [
|
421
|
+
# @return [Lutaml::Model::Serializable]
|
422
422
|
def iterate_packaged_element(model, name_array,
|
423
423
|
index: 1, type: "uml:Package")
|
424
424
|
return model if index == name_array.count
|
@@ -435,7 +435,7 @@ module Lutaml
|
|
435
435
|
end
|
436
436
|
|
437
437
|
# @param name [String]
|
438
|
-
# @return [
|
438
|
+
# @return [Lutaml::Model::Serializable]
|
439
439
|
def find_klass_packaged_element_by_name(name)
|
440
440
|
all_packaged_elements.find do |e|
|
441
441
|
e.type?("uml:Class") && e.name == name
|
@@ -443,14 +443,14 @@ module Lutaml
|
|
443
443
|
end
|
444
444
|
|
445
445
|
# @param name [String]
|
446
|
-
# @return [
|
446
|
+
# @return [Lutaml::Model::Serializable]
|
447
447
|
def find_packaged_element_by_name(name)
|
448
448
|
all_packaged_elements.find do |e|
|
449
449
|
e.name == name
|
450
450
|
end
|
451
451
|
end
|
452
452
|
|
453
|
-
# @param package [
|
453
|
+
# @param package [Lutaml::Model::Serializable]
|
454
454
|
# @return [Array<Hash>]
|
455
455
|
# @note xpath ./packagedElement[@xmi:type="uml:Enumeration"]
|
456
456
|
def serialize_model_enums(package)
|
@@ -466,7 +466,7 @@ module Lutaml
|
|
466
466
|
end
|
467
467
|
end
|
468
468
|
|
469
|
-
# @param model [
|
469
|
+
# @param model [Lutaml::Model::Serializable]
|
470
470
|
# @return [Hash]
|
471
471
|
# @note xpath .//ownedLiteral[@xmi:type="uml:EnumerationLiteral"]
|
472
472
|
def serialize_enum_owned_literal(enum)
|
@@ -486,7 +486,7 @@ module Lutaml
|
|
486
486
|
end
|
487
487
|
end
|
488
488
|
|
489
|
-
# @param model [
|
489
|
+
# @param model [Lutaml::Model::Serializable]
|
490
490
|
# @return [Array<Hash>]
|
491
491
|
# @note xpath ./packagedElement[@xmi:type="uml:DataType"]
|
492
492
|
def serialize_model_data_types(model)
|
@@ -576,7 +576,7 @@ module Lutaml
|
|
576
576
|
end
|
577
577
|
|
578
578
|
# @param link_id [String]
|
579
|
-
# @return [
|
579
|
+
# @return [Lutaml::Model::Serializable]
|
580
580
|
# @note xpath %(//connector[@xmi:idref="#{link_id}"])
|
581
581
|
def fetch_connector(link_id)
|
582
582
|
@xmi_root_model.extension.connectors.connector.find do |con|
|
@@ -594,7 +594,7 @@ module Lutaml
|
|
594
594
|
connector_node.send(node_name.to_sym).documentation
|
595
595
|
end
|
596
596
|
|
597
|
-
# @param klass [
|
597
|
+
# @param klass [Lutaml::Model::Serializable]
|
598
598
|
# @return [Array<Hash>]
|
599
599
|
# @note xpath .//ownedOperation
|
600
600
|
def serialize_class_operations(klass)
|
@@ -638,7 +638,7 @@ module Lutaml
|
|
638
638
|
end
|
639
639
|
|
640
640
|
# @param owner_xmi_id [String]
|
641
|
-
# @param link [
|
641
|
+
# @param link [Lutaml::Model::Serializable]
|
642
642
|
# @param link_member_name [String]
|
643
643
|
# @return [String]
|
644
644
|
def serialize_owned_type(owner_xmi_id, link, linke_owner_name)
|
@@ -665,7 +665,7 @@ module Lutaml
|
|
665
665
|
end
|
666
666
|
|
667
667
|
# @param owner_xmi_id [String]
|
668
|
-
# @param link [
|
668
|
+
# @param link [Lutaml::Model::Serializable]
|
669
669
|
# @return [Array<String, String>]
|
670
670
|
def serialize_member_end(owner_xmi_id, link)
|
671
671
|
case link.name
|
@@ -706,7 +706,7 @@ module Lutaml
|
|
706
706
|
end
|
707
707
|
|
708
708
|
# @param owner_xmi_id [String]
|
709
|
-
# @param link [
|
709
|
+
# @param link [Lutaml::Model::Serializable]
|
710
710
|
# @param link_member_name [String]
|
711
711
|
# @return [Array<String, String, Hash, String, String>]
|
712
712
|
def serialize_member_type(owner_xmi_id, link, link_member_name)
|
@@ -750,7 +750,7 @@ module Lutaml
|
|
750
750
|
end
|
751
751
|
|
752
752
|
# @param owner_xmi_id [String]
|
753
|
-
# @param link [
|
753
|
+
# @param link [Lutaml::Model::Serializable]
|
754
754
|
# @return [Array<String, String, Hash, String, String>]
|
755
755
|
# @note match return value of serialize_member_type
|
756
756
|
def generalization_association(owner_xmi_id, link)
|
@@ -796,7 +796,7 @@ module Lutaml
|
|
796
796
|
end
|
797
797
|
|
798
798
|
# @param klass_id [String]
|
799
|
-
# @return [
|
799
|
+
# @return [Lutaml::Model::Serializable]
|
800
800
|
# @note xpath %(//element[@xmi:idref="#{klass['xmi:id']}"])
|
801
801
|
def fetch_element(klass_id)
|
802
802
|
@xmi_root_model.extension.elements.element.find do |e|
|
@@ -804,7 +804,7 @@ module Lutaml
|
|
804
804
|
end
|
805
805
|
end
|
806
806
|
|
807
|
-
# @param klass [
|
807
|
+
# @param klass [Lutaml::Model::Serializable]
|
808
808
|
# @param with_assoc [Boolean]
|
809
809
|
# @return [Array<Hash>]
|
810
810
|
# @note xpath .//ownedAttribute[@xmi:type="uml:Property"]
|
@@ -920,7 +920,7 @@ module Lutaml
|
|
920
920
|
}
|
921
921
|
end
|
922
922
|
|
923
|
-
# @node [
|
923
|
+
# @node [Lutaml::Model::Serializable]
|
924
924
|
# @attr_name [String]
|
925
925
|
# @return [String]
|
926
926
|
# @note xpath %(//element[@xmi:idref="#{xmi_id}"]/properties)
|
@@ -928,11 +928,13 @@ module Lutaml
|
|
928
928
|
doc_node = fetch_element(node_id)
|
929
929
|
return unless doc_node
|
930
930
|
|
931
|
-
doc_node.properties&.send(
|
931
|
+
doc_node.properties&.send(
|
932
|
+
Lutaml::Model::Utils.snake_case(attr_name).to_sym,
|
933
|
+
)
|
932
934
|
end
|
933
935
|
|
934
936
|
# @param xmi_id [String]
|
935
|
-
# @return [
|
937
|
+
# @return [Lutaml::Model::Serializable]
|
936
938
|
# @note xpath %(//attribute[@xmi:idref="#{xmi_id}"])
|
937
939
|
def fetch_attribute_node(xmi_id)
|
938
940
|
attribute_node = nil
|
@@ -1045,15 +1047,15 @@ module Lutaml
|
|
1045
1047
|
all_elements
|
1046
1048
|
end
|
1047
1049
|
|
1048
|
-
# @param items [Array<
|
1049
|
-
# @param model [
|
1050
|
+
# @param items [Array<Lutaml::Model::Serializable>]
|
1051
|
+
# @param model [Lutaml::Model::Serializable]
|
1050
1052
|
# @param type [String] nil for any
|
1051
1053
|
def select_all_items(items, model, type, method)
|
1052
1054
|
iterate_tree(items, model, type, method.to_sym)
|
1053
1055
|
end
|
1054
1056
|
|
1055
|
-
# @param all_elements [Array<
|
1056
|
-
# @param model [
|
1057
|
+
# @param all_elements [Array<Lutaml::Model::Serializable>]
|
1058
|
+
# @param model [Lutaml::Model::Serializable]
|
1057
1059
|
# @param type [String] nil for any
|
1058
1060
|
# @note xpath ./packagedElement[@xmi:type="#{type}"]
|
1059
1061
|
def select_all_packaged_elements(all_elements, model, type)
|
@@ -1063,8 +1065,8 @@ module Lutaml
|
|
1063
1065
|
end
|
1064
1066
|
end
|
1065
1067
|
|
1066
|
-
# @param result [Array<
|
1067
|
-
# @param node [
|
1068
|
+
# @param result [Array<Lutaml::Model::Serializable>]
|
1069
|
+
# @param node [Lutaml::Model::Serializable]
|
1068
1070
|
# @param type [String] nil for any
|
1069
1071
|
# @param children_method [String] method to determine children exist
|
1070
1072
|
def iterate_tree(result, node, type, children_method)
|
@@ -1081,7 +1083,7 @@ module Lutaml
|
|
1081
1083
|
end
|
1082
1084
|
|
1083
1085
|
# @param result [Hash]
|
1084
|
-
# @param node [
|
1086
|
+
# @param node [Lutaml::Model::Serializable]
|
1085
1087
|
# @note set id as key and name as value into result
|
1086
1088
|
# if id and name are found
|
1087
1089
|
def map_id_name(result, node)
|
@@ -2,8 +2,9 @@ require "nokogiri"
|
|
2
2
|
require "htmlentities"
|
3
3
|
require "lutaml/uml/has_attributes"
|
4
4
|
require "lutaml/uml/document"
|
5
|
-
|
6
|
-
require "
|
5
|
+
require "lutaml/xsd"
|
6
|
+
require "lutaml/model"
|
7
|
+
require "lutaml/model/schema"
|
7
8
|
|
8
9
|
module Lutaml
|
9
10
|
module Xml
|
@@ -11,12 +12,10 @@ module Lutaml
|
|
11
12
|
# Class for parsing .xml schema files into ::Lutaml::Uml::Document
|
12
13
|
class Xml
|
13
14
|
def self.load_schema(schema, root_schema)
|
14
|
-
result =
|
15
|
+
result = Lutaml::Model::Schema.from_xml(schema)
|
15
16
|
|
16
17
|
result.values.each do |klass|
|
17
|
-
# Temporary solution will update in the parser
|
18
18
|
klass = klass.gsub(/^require.*?\n/, "")
|
19
|
-
klass = klass.gsub(/< Shale::Mapper/, "< Lutaml::Xml::Mapper")
|
20
19
|
|
21
20
|
eval(klass, TOPLEVEL_BINDING)
|
22
21
|
end
|
@@ -39,18 +38,6 @@ module Lutaml
|
|
39
38
|
|
40
39
|
@root_class.from_xml(doc)
|
41
40
|
end
|
42
|
-
|
43
|
-
private
|
44
|
-
|
45
|
-
def load_schema(schema)
|
46
|
-
result = Shale::Schema.from_xml([schema])
|
47
|
-
|
48
|
-
result.values.each do |klass|
|
49
|
-
klass = klass.gsub(/^require.*?\n/, "")
|
50
|
-
|
51
|
-
eval(klass, TOPLEVEL_BINDING)
|
52
|
-
end
|
53
|
-
end
|
54
41
|
end
|
55
42
|
end
|
56
43
|
end
|
data/lib/lutaml/xml.rb
CHANGED
data/lutaml.gemspec
CHANGED
@@ -33,12 +33,14 @@ Gem::Specification.new do |spec|
|
|
33
33
|
spec.add_dependency "hashie", "~> 4.1.0"
|
34
34
|
spec.add_dependency "htmlentities"
|
35
35
|
spec.add_dependency "liquid"
|
36
|
+
spec.add_dependency "lutaml-model"
|
36
37
|
spec.add_dependency "lutaml-path"
|
38
|
+
spec.add_dependency "lutaml-xsd"
|
37
39
|
spec.add_dependency "nokogiri", "~> 1.10"
|
38
40
|
spec.add_dependency "parslet", "~> 2.0.0"
|
39
41
|
spec.add_dependency "ruby-graphviz", "~> 1.2"
|
40
42
|
spec.add_dependency "thor", "~> 1.0"
|
41
|
-
spec.add_dependency "xmi", "~> 0.3.
|
43
|
+
spec.add_dependency "xmi", "~> 0.3.12"
|
42
44
|
|
43
45
|
spec.add_development_dependency "byebug"
|
44
46
|
spec.add_development_dependency "equivalent-xml", "~> 0.6.0"
|
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.28
|
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-
|
11
|
+
date: 2025-02-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: expressir
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: lutaml-model
|
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: lutaml-path
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,6 +94,20 @@ dependencies:
|
|
80
94
|
- - ">="
|
81
95
|
- !ruby/object:Gem::Version
|
82
96
|
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: lutaml-xsd
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
83
111
|
- !ruby/object:Gem::Dependency
|
84
112
|
name: nokogiri
|
85
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -142,14 +170,14 @@ dependencies:
|
|
142
170
|
requirements:
|
143
171
|
- - "~>"
|
144
172
|
- !ruby/object:Gem::Version
|
145
|
-
version: 0.3.
|
173
|
+
version: 0.3.12
|
146
174
|
type: :runtime
|
147
175
|
prerelease: false
|
148
176
|
version_requirements: !ruby/object:Gem::Requirement
|
149
177
|
requirements:
|
150
178
|
- - "~>"
|
151
179
|
- !ruby/object:Gem::Version
|
152
|
-
version: 0.3.
|
180
|
+
version: 0.3.12
|
153
181
|
- !ruby/object:Gem::Dependency
|
154
182
|
name: byebug
|
155
183
|
requirement: !ruby/object:Gem::Requirement
|
@@ -284,8 +312,6 @@ files:
|
|
284
312
|
- lib/lutaml/command_line.rb
|
285
313
|
- lib/lutaml/express.rb
|
286
314
|
- lib/lutaml/express/README.adoc
|
287
|
-
- lib/lutaml/express/lutaml_path/document_wrapper.rb
|
288
|
-
- lib/lutaml/express/lutaml_path/formatter.rb
|
289
315
|
- lib/lutaml/express/parsers/exp.rb
|
290
316
|
- lib/lutaml/express/version.rb
|
291
317
|
- lib/lutaml/formatter.rb
|
@@ -293,7 +319,6 @@ files:
|
|
293
319
|
- lib/lutaml/formatter/graphviz.rb
|
294
320
|
- lib/lutaml/layout/engine.rb
|
295
321
|
- lib/lutaml/layout/graph_viz_engine.rb
|
296
|
-
- lib/lutaml/lutaml_path/document_wrapper.rb
|
297
322
|
- lib/lutaml/parser.rb
|
298
323
|
- lib/lutaml/sysml.rb
|
299
324
|
- lib/lutaml/sysml/README.md
|
@@ -339,7 +364,6 @@ files:
|
|
339
364
|
- lib/lutaml/uml/has_attributes.rb
|
340
365
|
- lib/lutaml/uml/has_members.rb
|
341
366
|
- lib/lutaml/uml/instance.rb
|
342
|
-
- lib/lutaml/uml/lutaml_path/document_wrapper.rb
|
343
367
|
- lib/lutaml/uml/model.rb
|
344
368
|
- lib/lutaml/uml/node/base.rb
|
345
369
|
- lib/lutaml/uml/node/class_node.rb
|
@@ -399,8 +423,6 @@ files:
|
|
399
423
|
- lib/lutaml/xmi/parsers/xml.rb
|
400
424
|
- lib/lutaml/xmi/version.rb
|
401
425
|
- lib/lutaml/xml.rb
|
402
|
-
- lib/lutaml/xml/lutaml_path/document_wrapper.rb
|
403
|
-
- lib/lutaml/xml/mapper.rb
|
404
426
|
- lib/lutaml/xml/parsers/xml.rb
|
405
427
|
- lutaml.gemspec
|
406
428
|
homepage: https://github.com/lutaml/lutaml
|
@@ -1,22 +0,0 @@
|
|
1
|
-
require "lutaml/lutaml_path/document_wrapper"
|
2
|
-
require "lutaml/express/lutaml_path/formatter"
|
3
|
-
|
4
|
-
module Lutaml
|
5
|
-
module Express
|
6
|
-
module LutamlPath
|
7
|
-
class DocumentWrapper < ::Lutaml::LutamlPath::DocumentWrapper
|
8
|
-
attr_accessor :select_proc
|
9
|
-
|
10
|
-
protected
|
11
|
-
|
12
|
-
def serialize_document(repository)
|
13
|
-
repository.to_hash(
|
14
|
-
formatter: Formatter,
|
15
|
-
include_empty: true,
|
16
|
-
select_proc: select_proc,
|
17
|
-
)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
require "expressir/express/formatter"
|
2
|
-
require "expressir/express/schema_head_formatter"
|
3
|
-
require "expressir/express/hyperlink_formatter"
|
4
|
-
|
5
|
-
module Lutaml
|
6
|
-
module Express
|
7
|
-
module LutamlPath
|
8
|
-
class Formatter < Expressir::Express::Formatter
|
9
|
-
include Expressir::Express::SchemaHeadFormatter
|
10
|
-
include Expressir::Express::HyperlinkFormatter
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
@@ -1,51 +0,0 @@
|
|
1
|
-
module Lutaml
|
2
|
-
module LutamlPath
|
3
|
-
class DocumentWrapper
|
4
|
-
attr_reader :serialized_document, :original_document
|
5
|
-
|
6
|
-
def initialize(document)
|
7
|
-
@original_document = document
|
8
|
-
end
|
9
|
-
|
10
|
-
def to_liquid
|
11
|
-
serialized_document
|
12
|
-
end
|
13
|
-
|
14
|
-
def serialized_document
|
15
|
-
@serialized_document ||= serialize_document(@original_document)
|
16
|
-
end
|
17
|
-
|
18
|
-
protected
|
19
|
-
|
20
|
-
def serialize_document(_path)
|
21
|
-
raise ArgumentError, "implement #serialize_document!"
|
22
|
-
end
|
23
|
-
|
24
|
-
def serialize_value(attr_value)
|
25
|
-
if attr_value.is_a?(Array)
|
26
|
-
return attr_value.map(&method(:serialize_to_hash))
|
27
|
-
end
|
28
|
-
|
29
|
-
serialize_to_hash(attr_value)
|
30
|
-
end
|
31
|
-
|
32
|
-
BASE_OBJECTS = [String, Integer, Float, FalseClass, TrueClass, Symbol, NilClass, Hash]
|
33
|
-
def serialize_to_hash(object)
|
34
|
-
return object if BASE_OBJECTS.include?(object.class)
|
35
|
-
|
36
|
-
object.instance_variables.each_with_object({}) do |var, res|
|
37
|
-
variable = object.instance_variable_get(var)
|
38
|
-
res[var.to_s.gsub("@", "")] = if variable.is_a?(Array)
|
39
|
-
variable.map do |n|
|
40
|
-
serialize_to_hash(n)
|
41
|
-
end
|
42
|
-
elsif BASE_OBJECTS.include?(variable.class) || var == :@parent
|
43
|
-
variable
|
44
|
-
else
|
45
|
-
serialize_to_hash(variable)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
require "lutaml/lutaml_path/document_wrapper"
|
2
|
-
|
3
|
-
module Lutaml
|
4
|
-
module Uml
|
5
|
-
module LutamlPath
|
6
|
-
class DocumentWrapper < ::Lutaml::LutamlPath::DocumentWrapper
|
7
|
-
protected
|
8
|
-
|
9
|
-
def serialize_document(document)
|
10
|
-
serialize_to_hash(document)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,45 +0,0 @@
|
|
1
|
-
require "lutaml/lutaml_path/document_wrapper"
|
2
|
-
|
3
|
-
module Lutaml
|
4
|
-
module Xml
|
5
|
-
module LutamlPath
|
6
|
-
class DocumentWrapper < ::Lutaml::LutamlPath::DocumentWrapper
|
7
|
-
protected
|
8
|
-
|
9
|
-
def serialize_document(document)
|
10
|
-
serialize_to_hash(document)
|
11
|
-
end
|
12
|
-
|
13
|
-
def serialize_to_hash(object)
|
14
|
-
hash = {}
|
15
|
-
attribute_name = nil
|
16
|
-
|
17
|
-
object.all_content.each do |mapping, content|
|
18
|
-
if mapping == "content"
|
19
|
-
attribute_name = object.class.xml_mapping.content.attribute.to_s
|
20
|
-
hash[attribute_name] ||= []
|
21
|
-
hash[attribute_name] << content.strip unless content.strip&.empty?
|
22
|
-
elsif content.is_a?(String)
|
23
|
-
if object.class.attributes[mapping.attribute].collection?
|
24
|
-
hash[mapping.name] ||= []
|
25
|
-
hash[mapping.name] << content.strip
|
26
|
-
else
|
27
|
-
hash[mapping.name] = content.strip
|
28
|
-
end
|
29
|
-
else
|
30
|
-
if object.class.attributes[mapping.attribute].collection?
|
31
|
-
hash[mapping.name] ||= []
|
32
|
-
hash[mapping.name] << serialize_to_hash(content)
|
33
|
-
else
|
34
|
-
hash[mapping.name] = serialize_to_hash(content)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
hash[attribute_name] = hash[attribute_name].compact if attribute_name
|
40
|
-
hash
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
data/lib/lutaml/xml/mapper.rb
DELETED
@@ -1,448 +0,0 @@
|
|
1
|
-
require "shale"
|
2
|
-
|
3
|
-
module Lutaml
|
4
|
-
module Xml
|
5
|
-
class Mapper < Shale::Mapper
|
6
|
-
# rubocop:disable Metrics/AbcSize
|
7
|
-
# rubocop:disable Metrics/MethodLength
|
8
|
-
# rubocop:disable Metrics/BlockLength
|
9
|
-
# rubocop:disable Metrics/CyclomaticComplexity
|
10
|
-
# rubocop:disable Metrics/PerceivedComplexity
|
11
|
-
class << self
|
12
|
-
# Convert XML document to Object
|
13
|
-
#
|
14
|
-
# @param [Shale::Adapter::<XML adapter>::Node] element
|
15
|
-
# @param [Array<Symbol>] only
|
16
|
-
# @param [Array<Symbol>] except
|
17
|
-
# @param [any] context
|
18
|
-
#
|
19
|
-
# @return [model instance]
|
20
|
-
#
|
21
|
-
# @api public
|
22
|
-
def of_xml(element, only: nil, except: nil, context: nil)
|
23
|
-
instance = model.new
|
24
|
-
|
25
|
-
attributes
|
26
|
-
.values
|
27
|
-
.select(&:default)
|
28
|
-
.each { |attr| instance.send(attr.setter, attr.default.call) }
|
29
|
-
|
30
|
-
grouping = Shale::Mapping::Group::XmlGrouping.new
|
31
|
-
delegates = Shale::Mapping::Delegates.new
|
32
|
-
|
33
|
-
only = to_partial_render_attributes(only)
|
34
|
-
except = to_partial_render_attributes(except)
|
35
|
-
|
36
|
-
element.attributes.each do |key, value|
|
37
|
-
mapping = xml_mapping.attributes[key.to_s]
|
38
|
-
next unless mapping
|
39
|
-
|
40
|
-
if mapping.group
|
41
|
-
grouping.add(mapping, :attribute, value)
|
42
|
-
elsif mapping.method_from
|
43
|
-
mapper = new
|
44
|
-
|
45
|
-
if mapper.method(mapping.method_from).arity == 3
|
46
|
-
mapper.send(mapping.method_from, instance, value, context)
|
47
|
-
else
|
48
|
-
mapper.send(mapping.method_from, instance, value)
|
49
|
-
end
|
50
|
-
else
|
51
|
-
receiver_attributes = get_receiver_attributes(mapping)
|
52
|
-
attribute = receiver_attributes[mapping.attribute]
|
53
|
-
next unless attribute
|
54
|
-
|
55
|
-
next if only && !only.key?(attribute.name)
|
56
|
-
next if except&.key?(attribute.name)
|
57
|
-
|
58
|
-
casted_value = attribute.type.cast(value)
|
59
|
-
|
60
|
-
if attribute.collection?
|
61
|
-
if mapping.receiver
|
62
|
-
delegates.add_collection(
|
63
|
-
attributes[mapping.receiver],
|
64
|
-
attribute.setter,
|
65
|
-
casted_value,
|
66
|
-
)
|
67
|
-
else
|
68
|
-
instance.send(attribute.name) << casted_value
|
69
|
-
end
|
70
|
-
elsif mapping.receiver
|
71
|
-
delegates.add(attributes[mapping.receiver], attribute.setter,
|
72
|
-
casted_value)
|
73
|
-
else
|
74
|
-
instance.send(attribute.setter, casted_value)
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
content_mapping = xml_mapping.content
|
80
|
-
|
81
|
-
if content_mapping
|
82
|
-
if content_mapping.group
|
83
|
-
grouping.add(content_mapping, :content, element)
|
84
|
-
elsif content_mapping.method_from
|
85
|
-
mapper = new
|
86
|
-
|
87
|
-
if mapper.method(content_mapping.method_from).arity == 3
|
88
|
-
mapper.send(content_mapping.method_from, instance, element,
|
89
|
-
context)
|
90
|
-
else
|
91
|
-
mapper.send(content_mapping.method_from, instance, element)
|
92
|
-
end
|
93
|
-
else
|
94
|
-
get_content_value(content_mapping, element, only, except,
|
95
|
-
delegates, instance)
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
# rubocop:disable Metrics/BlockNesting
|
100
|
-
element.instance_variable_get(:@node)&.children&.each do |nokogiri_node|
|
101
|
-
if nokogiri_node.name == "text"
|
102
|
-
content_value = get_content_value(content_mapping, nokogiri_node,
|
103
|
-
only, except, delegates, instance)
|
104
|
-
instance.all_content << ["content", content_value]
|
105
|
-
next
|
106
|
-
elsif nokogiri_node.name == "comment"
|
107
|
-
instance.all_content << ["comment", nokogiri_node.text]
|
108
|
-
next
|
109
|
-
end
|
110
|
-
|
111
|
-
node = element.class.new(nokogiri_node)
|
112
|
-
mapping = xml_mapping.elements[node.name]
|
113
|
-
|
114
|
-
next unless mapping
|
115
|
-
|
116
|
-
if mapping.group
|
117
|
-
grouping.add(mapping, :element, node)
|
118
|
-
elsif mapping.method_from
|
119
|
-
mapper = new
|
120
|
-
|
121
|
-
if mapper.method(mapping.method_from).arity == 3
|
122
|
-
mapper.send(mapping.method_from, instance, node, context)
|
123
|
-
else
|
124
|
-
mapper.send(mapping.method_from, instance, node)
|
125
|
-
end
|
126
|
-
else
|
127
|
-
receiver_attributes = get_receiver_attributes(mapping)
|
128
|
-
attribute = receiver_attributes[mapping.attribute]
|
129
|
-
next unless attribute
|
130
|
-
|
131
|
-
if only
|
132
|
-
attribute_only = only[attribute.name]
|
133
|
-
next unless only.key?(attribute.name)
|
134
|
-
end
|
135
|
-
|
136
|
-
if except
|
137
|
-
attribute_except = except[attribute.name]
|
138
|
-
next if except.key?(attribute.name) && attribute_except.nil?
|
139
|
-
end
|
140
|
-
|
141
|
-
value = attribute.type.of_xml(
|
142
|
-
node,
|
143
|
-
only: attribute_only,
|
144
|
-
except: attribute_except,
|
145
|
-
context: context,
|
146
|
-
)
|
147
|
-
|
148
|
-
casted_value = attribute.type.cast(value)
|
149
|
-
instance.all_content << [mapping, casted_value]
|
150
|
-
|
151
|
-
if attribute.collection?
|
152
|
-
if mapping.receiver
|
153
|
-
delegates.add_collection(
|
154
|
-
attributes[mapping.receiver],
|
155
|
-
attribute.setter,
|
156
|
-
casted_value,
|
157
|
-
)
|
158
|
-
else
|
159
|
-
instance.send(attribute.name) << casted_value
|
160
|
-
end
|
161
|
-
elsif mapping.receiver
|
162
|
-
delegates.add(attributes[mapping.receiver], attribute.setter,
|
163
|
-
casted_value)
|
164
|
-
else
|
165
|
-
instance.send(attribute.setter, casted_value)
|
166
|
-
end
|
167
|
-
end
|
168
|
-
end
|
169
|
-
# rubocop:enable Metrics/BlockNesting
|
170
|
-
|
171
|
-
delegates.each do |delegate|
|
172
|
-
receiver = get_receiver(instance, delegate.receiver_attribute)
|
173
|
-
receiver.send(delegate.setter, delegate.value)
|
174
|
-
end
|
175
|
-
|
176
|
-
grouping.each do |group|
|
177
|
-
mapper = new
|
178
|
-
|
179
|
-
if mapper.method(group.method_from).arity == 3
|
180
|
-
mapper.send(group.method_from, instance, group.dict, context)
|
181
|
-
else
|
182
|
-
mapper.send(group.method_from, instance, group.dict)
|
183
|
-
end
|
184
|
-
end
|
185
|
-
|
186
|
-
instance
|
187
|
-
end
|
188
|
-
|
189
|
-
# Convert Object to XML document
|
190
|
-
#
|
191
|
-
# @param [any] instance Object to convert
|
192
|
-
# @param [String, nil] node_name XML node name
|
193
|
-
# @param [Shale::Adapter::<xml adapter>::Document, nil]
|
194
|
-
# doc Object to convert
|
195
|
-
# @param [Array<Symbol>] only
|
196
|
-
# @param [Array<Symbol>] except
|
197
|
-
# @param [any] context
|
198
|
-
#
|
199
|
-
# @raise [IncorrectModelError]
|
200
|
-
#
|
201
|
-
# @return [::REXML::Document, ::Nokogiri::Document, ::Ox::Document]
|
202
|
-
#
|
203
|
-
# @api public
|
204
|
-
def as_xml(
|
205
|
-
instance,
|
206
|
-
node_name = nil,
|
207
|
-
doc = nil,
|
208
|
-
_cdata = nil,
|
209
|
-
only: nil,
|
210
|
-
except: nil,
|
211
|
-
context: nil,
|
212
|
-
version: nil
|
213
|
-
)
|
214
|
-
unless instance.is_a?(model)
|
215
|
-
msg = "argument is a '#{instance.class}' but should be a '#{model}'"
|
216
|
-
raise IncorrectModelError, msg
|
217
|
-
end
|
218
|
-
|
219
|
-
unless doc
|
220
|
-
doc = Shale.xml_adapter.create_document(version)
|
221
|
-
|
222
|
-
element = as_xml(
|
223
|
-
instance,
|
224
|
-
xml_mapping.prefixed_root,
|
225
|
-
doc,
|
226
|
-
only: only,
|
227
|
-
except: except,
|
228
|
-
context: context,
|
229
|
-
)
|
230
|
-
doc.add_element(doc.doc, element)
|
231
|
-
|
232
|
-
return doc.doc
|
233
|
-
end
|
234
|
-
|
235
|
-
element = doc.create_element(node_name)
|
236
|
-
|
237
|
-
doc.add_namespace(
|
238
|
-
xml_mapping.default_namespace.prefix,
|
239
|
-
xml_mapping.default_namespace.name,
|
240
|
-
)
|
241
|
-
|
242
|
-
grouping = Shale::Mapping::Group::XmlGrouping.new
|
243
|
-
|
244
|
-
only = to_partial_render_attributes(only)
|
245
|
-
except = to_partial_render_attributes(except)
|
246
|
-
|
247
|
-
# rubocop:disable Metrics/BlockNesting
|
248
|
-
xml_mapping.attributes.each_value do |mapping|
|
249
|
-
if mapping.group
|
250
|
-
grouping.add(mapping, :attribute, nil)
|
251
|
-
elsif mapping.method_to
|
252
|
-
mapper = new
|
253
|
-
|
254
|
-
if mapper.method(mapping.method_to).arity == 4
|
255
|
-
mapper.send(mapping.method_to, instance, element, doc, context)
|
256
|
-
else
|
257
|
-
mapper.send(mapping.method_to, instance, element, doc)
|
258
|
-
end
|
259
|
-
else
|
260
|
-
receiver = if mapping.receiver
|
261
|
-
instance.send(mapping.receiver)
|
262
|
-
else
|
263
|
-
instance
|
264
|
-
end
|
265
|
-
|
266
|
-
receiver_attributes = get_receiver_attributes(mapping)
|
267
|
-
attribute = receiver_attributes[mapping.attribute]
|
268
|
-
next unless attribute
|
269
|
-
|
270
|
-
next if only && !only.key?(attribute.name)
|
271
|
-
next if except&.key?(attribute.name)
|
272
|
-
|
273
|
-
value = receiver.send(attribute.name) if receiver
|
274
|
-
|
275
|
-
if mapping.render_nil? || !value.nil?
|
276
|
-
doc.add_namespace(mapping.namespace.prefix,
|
277
|
-
mapping.namespace.name)
|
278
|
-
doc.add_attribute(element, mapping.prefixed_name, value)
|
279
|
-
end
|
280
|
-
end
|
281
|
-
end
|
282
|
-
# rubocop:enable Metrics/BlockNesting
|
283
|
-
|
284
|
-
# rubocop:disable Metrics/BlockNesting
|
285
|
-
instance.all_content.each do |mapping, content|
|
286
|
-
if mapping == "comment"
|
287
|
-
comment = Nokogiri::XML::Comment.new(doc.doc, content)
|
288
|
-
doc.add_element(element, comment)
|
289
|
-
elsif mapping == "content"
|
290
|
-
content_mapping = xml_mapping.content
|
291
|
-
if content_mapping
|
292
|
-
if content_mapping.group
|
293
|
-
grouping.add(content_mapping, :content, nil)
|
294
|
-
elsif content_mapping.method_to
|
295
|
-
mapper = new
|
296
|
-
|
297
|
-
if mapper.method(content_mapping.method_to).arity == 4
|
298
|
-
mapper.send(content_mapping.method_to, instance, element,
|
299
|
-
doc, context)
|
300
|
-
else
|
301
|
-
mapper.send(content_mapping.method_to, instance, element, doc)
|
302
|
-
end
|
303
|
-
else
|
304
|
-
receiver_attributes = get_receiver_attributes(content_mapping)
|
305
|
-
attribute = receiver_attributes[content_mapping.attribute]
|
306
|
-
|
307
|
-
if attribute
|
308
|
-
skip = false
|
309
|
-
|
310
|
-
skip = true if only && !only.key?(attribute.name)
|
311
|
-
skip = true if except&.key?(attribute.name)
|
312
|
-
|
313
|
-
unless skip
|
314
|
-
# value = receiver.send(attribute.name) if receiver
|
315
|
-
value = content
|
316
|
-
|
317
|
-
if content_mapping.cdata
|
318
|
-
doc.create_cdata(value, element)
|
319
|
-
else
|
320
|
-
a = Nokogiri::XML::Text.new(value, doc.doc)
|
321
|
-
doc.add_element(element, a)
|
322
|
-
end
|
323
|
-
end
|
324
|
-
end
|
325
|
-
end
|
326
|
-
end
|
327
|
-
elsif mapping.group
|
328
|
-
grouping.add(mapping, :element, nil)
|
329
|
-
elsif mapping.method_to
|
330
|
-
mapper = new
|
331
|
-
|
332
|
-
if mapper.method(mapping.method_to).arity == 4
|
333
|
-
mapper.send(mapping.method_to, instance, element, doc, context)
|
334
|
-
else
|
335
|
-
mapper.send(mapping.method_to, instance, element, doc)
|
336
|
-
end
|
337
|
-
else
|
338
|
-
receiver_attributes = get_receiver_attributes(mapping)
|
339
|
-
attribute = receiver_attributes[mapping.attribute]
|
340
|
-
next unless attribute
|
341
|
-
|
342
|
-
if only
|
343
|
-
attribute_only = only[attribute.name]
|
344
|
-
next unless only.key?(attribute.name)
|
345
|
-
end
|
346
|
-
|
347
|
-
if except
|
348
|
-
attribute_except = except[attribute.name]
|
349
|
-
next if except.key?(attribute.name) && attribute_except.nil?
|
350
|
-
end
|
351
|
-
|
352
|
-
value = content
|
353
|
-
|
354
|
-
if mapping.render_nil? || !value.nil?
|
355
|
-
doc.add_namespace(mapping.namespace.prefix,
|
356
|
-
mapping.namespace.name)
|
357
|
-
end
|
358
|
-
|
359
|
-
if value.nil?
|
360
|
-
if mapping.render_nil?
|
361
|
-
child = doc.create_element(mapping.prefixed_name)
|
362
|
-
doc.add_element(element, child)
|
363
|
-
end
|
364
|
-
elsif attribute.collection?
|
365
|
-
[*value].each do |v|
|
366
|
-
next if v.nil?
|
367
|
-
|
368
|
-
child = attribute.type.as_xml(
|
369
|
-
v,
|
370
|
-
mapping.prefixed_name,
|
371
|
-
doc,
|
372
|
-
mapping.cdata,
|
373
|
-
only: attribute_only,
|
374
|
-
except: attribute_except,
|
375
|
-
context: context,
|
376
|
-
)
|
377
|
-
doc.add_element(element, child)
|
378
|
-
end
|
379
|
-
else
|
380
|
-
child = attribute.type.as_xml(
|
381
|
-
value,
|
382
|
-
mapping.prefixed_name,
|
383
|
-
doc,
|
384
|
-
mapping.cdata,
|
385
|
-
only: attribute_only,
|
386
|
-
except: attribute_except,
|
387
|
-
context: context,
|
388
|
-
)
|
389
|
-
doc.add_element(element, child)
|
390
|
-
end
|
391
|
-
end
|
392
|
-
end
|
393
|
-
# rubocop:enable Metrics/BlockNesting
|
394
|
-
|
395
|
-
grouping.each do |group|
|
396
|
-
mapper = new
|
397
|
-
|
398
|
-
if mapper.method(group.method_to).arity == 4
|
399
|
-
mapper.send(group.method_to, instance, element, doc, context)
|
400
|
-
else
|
401
|
-
mapper.send(group.method_to, instance, element, doc)
|
402
|
-
end
|
403
|
-
end
|
404
|
-
|
405
|
-
element
|
406
|
-
end
|
407
|
-
|
408
|
-
def get_content_value(content_mapping, element, only, except, delegates, instance)
|
409
|
-
receiver_attributes = get_receiver_attributes(content_mapping)
|
410
|
-
attribute = receiver_attributes[content_mapping.attribute]
|
411
|
-
|
412
|
-
if attribute
|
413
|
-
skip = false
|
414
|
-
|
415
|
-
# rubocop:disable Metrics/BlockNesting
|
416
|
-
skip = true if only && !only.key?(attribute.name)
|
417
|
-
skip = true if except&.key?(attribute.name)
|
418
|
-
|
419
|
-
unless skip
|
420
|
-
value = attribute.type.cast(attribute.type.of_xml(element))
|
421
|
-
|
422
|
-
if content_mapping.receiver
|
423
|
-
delegates.add(attributes[content_mapping.receiver],
|
424
|
-
attribute.setter, value)
|
425
|
-
else
|
426
|
-
instance.send(attribute.setter, value)
|
427
|
-
end
|
428
|
-
end
|
429
|
-
# rubocop:enable Metrics/BlockNesting
|
430
|
-
end
|
431
|
-
end
|
432
|
-
end
|
433
|
-
# rubocop:enable Metrics/AbcSize
|
434
|
-
# rubocop:enable Metrics/MethodLength
|
435
|
-
# rubocop:enable Metrics/BlockLength
|
436
|
-
# rubocop:enable Metrics/CyclomaticComplexity
|
437
|
-
# rubocop:enable Metrics/PerceivedComplexity
|
438
|
-
|
439
|
-
attr_accessor :all_content
|
440
|
-
|
441
|
-
def initialize(*args)
|
442
|
-
@all_content = []
|
443
|
-
|
444
|
-
super
|
445
|
-
end
|
446
|
-
end
|
447
|
-
end
|
448
|
-
end
|