lutaml 0.9.27 → 0.9.28
Sign up to get free protection for your applications and to get access to all the features.
- 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 +2 -1
- metadata +30 -22
- 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,11 +33,12 @@ 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
|
-
spec.add_dependency "shale"
|
41
42
|
spec.add_dependency "thor", "~> 1.0"
|
42
43
|
spec.add_dependency "xmi", "~> 0.3.12"
|
43
44
|
|
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
|
@@ -122,20 +150,6 @@ dependencies:
|
|
122
150
|
- - "~>"
|
123
151
|
- !ruby/object:Gem::Version
|
124
152
|
version: '1.2'
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: shale
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
128
|
-
requirements:
|
129
|
-
- - ">="
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
version: '0'
|
132
|
-
type: :runtime
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - ">="
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
version: '0'
|
139
153
|
- !ruby/object:Gem::Dependency
|
140
154
|
name: thor
|
141
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -298,8 +312,6 @@ files:
|
|
298
312
|
- lib/lutaml/command_line.rb
|
299
313
|
- lib/lutaml/express.rb
|
300
314
|
- lib/lutaml/express/README.adoc
|
301
|
-
- lib/lutaml/express/lutaml_path/document_wrapper.rb
|
302
|
-
- lib/lutaml/express/lutaml_path/formatter.rb
|
303
315
|
- lib/lutaml/express/parsers/exp.rb
|
304
316
|
- lib/lutaml/express/version.rb
|
305
317
|
- lib/lutaml/formatter.rb
|
@@ -307,7 +319,6 @@ files:
|
|
307
319
|
- lib/lutaml/formatter/graphviz.rb
|
308
320
|
- lib/lutaml/layout/engine.rb
|
309
321
|
- lib/lutaml/layout/graph_viz_engine.rb
|
310
|
-
- lib/lutaml/lutaml_path/document_wrapper.rb
|
311
322
|
- lib/lutaml/parser.rb
|
312
323
|
- lib/lutaml/sysml.rb
|
313
324
|
- lib/lutaml/sysml/README.md
|
@@ -353,7 +364,6 @@ files:
|
|
353
364
|
- lib/lutaml/uml/has_attributes.rb
|
354
365
|
- lib/lutaml/uml/has_members.rb
|
355
366
|
- lib/lutaml/uml/instance.rb
|
356
|
-
- lib/lutaml/uml/lutaml_path/document_wrapper.rb
|
357
367
|
- lib/lutaml/uml/model.rb
|
358
368
|
- lib/lutaml/uml/node/base.rb
|
359
369
|
- lib/lutaml/uml/node/class_node.rb
|
@@ -413,8 +423,6 @@ files:
|
|
413
423
|
- lib/lutaml/xmi/parsers/xml.rb
|
414
424
|
- lib/lutaml/xmi/version.rb
|
415
425
|
- lib/lutaml/xml.rb
|
416
|
-
- lib/lutaml/xml/lutaml_path/document_wrapper.rb
|
417
|
-
- lib/lutaml/xml/mapper.rb
|
418
426
|
- lib/lutaml/xml/parsers/xml.rb
|
419
427
|
- lutaml.gemspec
|
420
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
|