lutaml-model 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.rubocop.yml +7 -0
- data/.rubocop_todo.yml +207 -0
- data/Gemfile +6 -2
- data/README.adoc +74 -3
- data/lib/lutaml/model/attribute.rb +4 -0
- data/lib/lutaml/model/mapping_hash.rb +42 -0
- data/lib/lutaml/model/mapping_rule.rb +21 -2
- data/lib/lutaml/model/serialize.rb +89 -78
- data/lib/lutaml/model/type.rb +19 -13
- data/lib/lutaml/model/version.rb +1 -1
- data/lib/lutaml/model/xml_adapter/nokogiri_adapter.rb +94 -99
- data/lib/lutaml/model/xml_adapter/ox_adapter.rb +116 -84
- data/lib/lutaml/model/xml_adapter.rb +119 -7
- data/lib/lutaml/model/xml_mapping.rb +36 -6
- data/lib/lutaml/model/xml_mapping_rule.rb +6 -6
- metadata +4 -2
@@ -1,14 +1,11 @@
|
|
1
1
|
# lib/lutaml/model/serialize.rb
|
2
|
-
require_relative "json_adapter/standard"
|
3
|
-
require_relative "json_adapter/multi_json"
|
4
2
|
require_relative "yaml_adapter"
|
5
3
|
require_relative "xml_adapter"
|
6
|
-
require_relative "toml_adapter/toml_rb_adapter"
|
7
|
-
require_relative "toml_adapter/tomlib_adapter"
|
8
4
|
require_relative "config"
|
9
5
|
require_relative "type"
|
10
6
|
require_relative "attribute"
|
11
7
|
require_relative "mapping_rule"
|
8
|
+
require_relative "mapping_hash"
|
12
9
|
require_relative "xml_mapping"
|
13
10
|
require_relative "key_value_mapping"
|
14
11
|
require_relative "json_adapter"
|
@@ -22,14 +19,15 @@ module Lutaml
|
|
22
19
|
base.extend(ClassMethods)
|
23
20
|
end
|
24
21
|
|
25
|
-
# rubocop:disable Metrics/MethodLength
|
26
|
-
# rubocop:disable Metrics/BlockLength
|
27
|
-
# rubocop:disable Metrics/AbcSize
|
28
|
-
# rubocop:disable Metrics/CyclomaticComplexity
|
29
|
-
# rubocop:disable Metrics/PerceivedComplexity
|
30
22
|
module ClassMethods
|
31
23
|
attr_accessor :attributes, :mappings
|
32
24
|
|
25
|
+
def inherited(subclass)
|
26
|
+
super
|
27
|
+
|
28
|
+
subclass.instance_variable_set(:@attributes, @attributes.dup)
|
29
|
+
end
|
30
|
+
|
33
31
|
def attribute(name, type, options = {})
|
34
32
|
self.attributes ||= {}
|
35
33
|
attr = Attribute.new(name, type, options)
|
@@ -50,13 +48,17 @@ module Lutaml
|
|
50
48
|
klass = format == :xml ? XmlMapping : KeyValueMapping
|
51
49
|
self.mappings[format] = klass.new
|
52
50
|
self.mappings[format].instance_eval(&block)
|
51
|
+
|
52
|
+
if format == :xml && !self.mappings[format].root_element
|
53
|
+
self.mappings[format].root(to_s)
|
54
|
+
end
|
53
55
|
end
|
54
56
|
|
55
57
|
define_method(:"from_#{format}") do |data|
|
56
58
|
adapter = Lutaml::Model::Config.send(:"#{format}_adapter")
|
57
59
|
doc = adapter.parse(data)
|
58
60
|
mapped_attrs = apply_mappings(doc.to_h, format)
|
59
|
-
apply_content_mapping(doc, mapped_attrs) if format == :xml
|
61
|
+
# apply_content_mapping(doc, mapped_attrs) if format == :xml
|
60
62
|
new(mapped_attrs)
|
61
63
|
end
|
62
64
|
end
|
@@ -79,7 +81,7 @@ module Lutaml
|
|
79
81
|
return apply_xml_mapping(doc) if format == :xml
|
80
82
|
|
81
83
|
mappings = mappings_for(format).mappings
|
82
|
-
mappings.each_with_object(
|
84
|
+
mappings.each_with_object(Lutaml::Model::MappingHash.new) do |rule, hash|
|
83
85
|
attr = if rule.delegate
|
84
86
|
attributes[rule.delegate].type.attributes[rule.to]
|
85
87
|
else
|
@@ -95,15 +97,6 @@ module Lutaml
|
|
95
97
|
else
|
96
98
|
attr.default
|
97
99
|
end
|
98
|
-
# if attr.collection?
|
99
|
-
# value = (value || []).map do |v|
|
100
|
-
# attr.type <= Serialize ? attr.type.new(v) : v
|
101
|
-
# end
|
102
|
-
# elsif value.is_a?(Hash) && attr.type <= Serialize
|
103
|
-
# value = attr.type.new(value)
|
104
|
-
# else
|
105
|
-
# value = attr.type.cast(value)
|
106
|
-
# end
|
107
100
|
|
108
101
|
if attr.collection?
|
109
102
|
value = (value || []).map do |v|
|
@@ -122,93 +115,116 @@ module Lutaml
|
|
122
115
|
end
|
123
116
|
end
|
124
117
|
|
125
|
-
def apply_xml_mapping(doc)
|
118
|
+
def apply_xml_mapping(doc, caller_class: nil, mixed_content: false)
|
119
|
+
return unless doc
|
120
|
+
|
126
121
|
mappings = mappings_for(:xml).mappings
|
127
122
|
|
128
|
-
|
123
|
+
if doc.is_a?(Array)
|
124
|
+
raise "May be `collection: true` is" \
|
125
|
+
"missing for #{self} in #{caller_class}"
|
126
|
+
end
|
127
|
+
|
128
|
+
mapping_hash = Lutaml::Model::MappingHash.new
|
129
|
+
mapping_hash.item_order = doc.item_order
|
130
|
+
mapping_hash.ordered = mappings_for(:xml).mixed_content? || mixed_content
|
131
|
+
|
132
|
+
mappings.each_with_object(mapping_hash) do |rule, hash|
|
129
133
|
attr = attributes[rule.to]
|
130
134
|
raise "Attribute '#{rule.to}' not found in #{self}" unless attr
|
131
135
|
|
132
|
-
|
133
|
-
|
134
|
-
else
|
136
|
+
is_content_mapping = rule.name.nil?
|
137
|
+
value = if is_content_mapping
|
135
138
|
doc["text"]
|
139
|
+
else
|
140
|
+
doc[rule.name.to_s] || doc[rule.name.to_sym]
|
136
141
|
end
|
137
142
|
|
138
|
-
# if attr.collection?
|
139
|
-
# value = (value || []).map do |v|
|
140
|
-
# attr.type <= Serialize ? attr.type.from_hash(v) : v
|
141
|
-
# end
|
142
|
-
# elsif value.is_a?(Hash) && attr.type <= Serialize
|
143
|
-
# value = attr.type.cast(value)
|
144
|
-
# elsif value.is_a?(Array)
|
145
|
-
# value = attr.type.cast(value.first["text"]&.first)
|
146
|
-
# end
|
147
|
-
|
148
143
|
if attr.collection?
|
144
|
+
if value && !value.is_a?(Array)
|
145
|
+
value = [value]
|
146
|
+
end
|
147
|
+
|
149
148
|
value = (value || []).map do |v|
|
150
149
|
if attr.type <= Serialize
|
151
|
-
attr.type.apply_xml_mapping(v)
|
152
|
-
|
150
|
+
attr.type.apply_xml_mapping(v, caller_class: self, mixed_content: rule.mixed_content)
|
151
|
+
elsif v.is_a?(Hash)
|
153
152
|
v["text"]
|
153
|
+
else
|
154
|
+
v
|
154
155
|
end
|
155
156
|
end
|
156
157
|
elsif attr.type <= Serialize
|
157
|
-
value = attr.type.apply_xml_mapping(value
|
158
|
+
value = attr.type.apply_xml_mapping(value, caller_class: self, mixed_content: rule.mixed_content)
|
158
159
|
else
|
159
160
|
if value.is_a?(Hash) && attr.type != Lutaml::Model::Type::Hash
|
160
161
|
value = value["text"]
|
161
162
|
end
|
162
163
|
|
163
|
-
value = attr.type.cast(value)
|
164
|
+
value = attr.type.cast(value) unless is_content_mapping
|
164
165
|
end
|
166
|
+
|
165
167
|
hash[rule.to] = value
|
166
168
|
end
|
167
169
|
end
|
168
|
-
|
169
|
-
def apply_content_mapping(doc, mapped_attrs)
|
170
|
-
content_mapping = mappings_for(:xml).content_mapping
|
171
|
-
return unless content_mapping
|
172
|
-
|
173
|
-
content = doc.root.children.select(&:text?).map(&:text)
|
174
|
-
mapped_attrs[content_mapping.to] = content
|
175
|
-
end
|
176
170
|
end
|
177
171
|
|
178
|
-
|
172
|
+
attr_reader :element_order
|
173
|
+
|
179
174
|
def initialize(attrs = {})
|
180
175
|
return unless self.class.attributes
|
181
176
|
|
177
|
+
if attrs.is_a?(Lutaml::Model::MappingHash)
|
178
|
+
@ordered = attrs.ordered?
|
179
|
+
@element_order = attrs.item_order
|
180
|
+
end
|
181
|
+
|
182
182
|
self.class.attributes.each do |name, attr|
|
183
|
-
value =
|
184
|
-
attrs[name]
|
185
|
-
elsif attrs.key?(name.to_sym)
|
186
|
-
attrs[name.to_sym]
|
187
|
-
elsif attrs.key?(name.to_s)
|
188
|
-
attrs[name.to_s]
|
189
|
-
else
|
190
|
-
attr.default
|
191
|
-
end
|
183
|
+
value = attr_value(attrs, name, attr)
|
192
184
|
|
193
|
-
value = if attr.collection?
|
194
|
-
(value || []).map do |v|
|
195
|
-
if v.is_a?(Hash)
|
196
|
-
attr.type.new(v)
|
197
|
-
else
|
198
|
-
Lutaml::Model::Type.cast(
|
199
|
-
v, attr.type
|
200
|
-
)
|
201
|
-
end
|
202
|
-
end
|
203
|
-
elsif value.is_a?(Hash) && attr.type != Lutaml::Model::Type::Hash
|
204
|
-
attr.type.new(value)
|
205
|
-
else
|
206
|
-
Lutaml::Model::Type.cast(value, attr.type)
|
207
|
-
end
|
208
185
|
send(:"#{name}=", ensure_utf8(value))
|
209
186
|
end
|
210
187
|
end
|
211
|
-
|
188
|
+
|
189
|
+
def attr_value(attrs, name, attr_rule)
|
190
|
+
value = if attrs.key?(name)
|
191
|
+
attrs[name]
|
192
|
+
elsif attrs.key?(name.to_sym)
|
193
|
+
attrs[name.to_sym]
|
194
|
+
elsif attrs.key?(name.to_s)
|
195
|
+
attrs[name.to_s]
|
196
|
+
else
|
197
|
+
attr_rule.default
|
198
|
+
end
|
199
|
+
|
200
|
+
if attr_rule.collection? || value.is_a?(Array)
|
201
|
+
(value || []).map do |v|
|
202
|
+
if v.is_a?(Hash)
|
203
|
+
attr_rule.type.new(v)
|
204
|
+
else
|
205
|
+
Lutaml::Model::Type.cast(
|
206
|
+
v, attr_rule.type
|
207
|
+
)
|
208
|
+
end
|
209
|
+
end
|
210
|
+
elsif value.is_a?(Hash) && attr_rule.type != Lutaml::Model::Type::Hash
|
211
|
+
attr_rule.type.new(value)
|
212
|
+
else
|
213
|
+
Lutaml::Model::Type.cast(value, attr_rule.type)
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
def ordered?
|
218
|
+
@ordered
|
219
|
+
end
|
220
|
+
|
221
|
+
def key_exist?(hash, key)
|
222
|
+
hash.key?(key) || hash.key?(key.to_sym) || hash.key?(key.to_s)
|
223
|
+
end
|
224
|
+
|
225
|
+
def key_value(hash, key)
|
226
|
+
hash[key] || hash[key.to_sym] || hash[key.to_s]
|
227
|
+
end
|
212
228
|
|
213
229
|
# TODO: Make this work
|
214
230
|
# FORMATS.each do |format|
|
@@ -325,11 +341,6 @@ module Lutaml
|
|
325
341
|
value
|
326
342
|
end
|
327
343
|
end
|
328
|
-
# rubocop:enable Metrics/MethodLength
|
329
|
-
# rubocop:enable Metrics/BlockLength
|
330
|
-
# rubocop:enable Metrics/AbcSize
|
331
|
-
# rubocop:enable Metrics/CyclomaticComplexity
|
332
|
-
# rubocop:enable Metrics/PerceivedComplexity
|
333
344
|
end
|
334
345
|
end
|
335
346
|
end
|
data/lib/lutaml/model/type.rb
CHANGED
@@ -74,6 +74,24 @@ module Lutaml
|
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
77
|
+
class TextWithTags
|
78
|
+
attr_reader :content
|
79
|
+
|
80
|
+
def initialize(ordered_text_with_tags)
|
81
|
+
@content = ordered_text_with_tags
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.cast(value)
|
85
|
+
return value if value.is_a?(self)
|
86
|
+
|
87
|
+
new(value)
|
88
|
+
end
|
89
|
+
|
90
|
+
def self.serialize(value)
|
91
|
+
value.content.join
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
77
95
|
class JSON
|
78
96
|
attr_reader :value
|
79
97
|
|
@@ -94,7 +112,7 @@ module Lutaml
|
|
94
112
|
end
|
95
113
|
|
96
114
|
def self.cast(value)
|
97
|
-
return value if value.is_a?(self)
|
115
|
+
return value if value.is_a?(self) || value.nil?
|
98
116
|
|
99
117
|
new(::JSON.parse(value))
|
100
118
|
end
|
@@ -104,15 +122,8 @@ module Lutaml
|
|
104
122
|
end
|
105
123
|
end
|
106
124
|
|
107
|
-
# rubocop:disable Layout/LineLength
|
108
125
|
UUID_REGEX = /\A[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\z/
|
109
|
-
# rubocop:enable Layout/LineLength
|
110
126
|
|
111
|
-
# rubocop:disable Metrics/MethodLength
|
112
|
-
# rubocop:disable Layout/LineLength
|
113
|
-
# rubocop:disable Metrics/AbcSize
|
114
|
-
# rubocop:disable Metrics/CyclomaticComplexity
|
115
|
-
# rubocop:disable Metrics/PerceivedComplexity
|
116
127
|
def self.cast(value, type)
|
117
128
|
return if value.nil?
|
118
129
|
|
@@ -203,11 +214,6 @@ module Lutaml
|
|
203
214
|
end
|
204
215
|
end.to_h
|
205
216
|
end
|
206
|
-
# rubocop:enable Metrics/MethodLength
|
207
|
-
# rubocop:enable Layout/LineLength
|
208
|
-
# rubocop:enable Metrics/AbcSize
|
209
|
-
# rubocop:enable Metrics/CyclomaticComplexity
|
210
|
-
# rubocop:enable Metrics/PerceivedComplexity
|
211
217
|
end
|
212
218
|
end
|
213
219
|
end
|
data/lib/lutaml/model/version.rb
CHANGED
@@ -12,14 +12,14 @@ module Lutaml
|
|
12
12
|
new(root)
|
13
13
|
end
|
14
14
|
|
15
|
-
def to_h
|
16
|
-
# { @root.name => parse_element(@root) }
|
17
|
-
parse_element(@root)
|
18
|
-
end
|
19
|
-
|
20
15
|
def to_xml(options = {})
|
21
16
|
builder = Nokogiri::XML::Builder.new do |xml|
|
22
|
-
|
17
|
+
if root.is_a?(Lutaml::Model::XmlAdapter::NokogiriElement)
|
18
|
+
root.to_xml(xml)
|
19
|
+
else
|
20
|
+
options[:xml_attributes] = build_namespace_attributes(@root.class)
|
21
|
+
build_element(xml, @root, options)
|
22
|
+
end
|
23
23
|
end
|
24
24
|
|
25
25
|
xml_options = {}
|
@@ -31,123 +31,122 @@ module Lutaml
|
|
31
31
|
|
32
32
|
private
|
33
33
|
|
34
|
-
|
35
|
-
# rubocop:disable Metrics/BlockLength
|
36
|
-
# rubocop:disable Metrics/AbcSize
|
37
|
-
# rubocop:disable Metrics/CyclomaticComplexity
|
38
|
-
# rubocop:disable Metrics/PerceivedComplexity
|
39
|
-
def build_element(xml, element, _options = {})
|
40
|
-
if element.is_a?(Lutaml::Model::XmlAdapter::NokogiriElement)
|
41
|
-
return element.to_xml(xml)
|
42
|
-
end
|
43
|
-
|
34
|
+
def build_unordered_element(xml, element, options = {})
|
44
35
|
xml_mapping = element.class.mappings_for(:xml)
|
45
36
|
return xml unless xml_mapping
|
46
37
|
|
47
|
-
attributes =
|
38
|
+
attributes = options[:xml_attributes] ||= {}
|
39
|
+
attributes = build_attributes(element,
|
40
|
+
xml_mapping).merge(attributes)&.compact
|
48
41
|
|
49
|
-
prefixed_xml = if
|
42
|
+
prefixed_xml = if options.key?(:namespace_prefix)
|
43
|
+
options[:namespace_prefix] ? xml[options[:namespace_prefix]] : xml
|
44
|
+
elsif xml_mapping.namespace_prefix
|
50
45
|
xml[xml_mapping.namespace_prefix]
|
51
46
|
else
|
52
47
|
xml
|
53
48
|
end
|
54
49
|
|
55
|
-
prefixed_xml.
|
50
|
+
prefixed_xml.public_send(xml_mapping.root_element, attributes) do
|
51
|
+
if options.key?(:namespace_prefix) && !options[:namespace_prefix]
|
52
|
+
xml.parent.namespace = nil
|
53
|
+
end
|
54
|
+
|
56
55
|
xml_mapping.elements.each do |element_rule|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
.class
|
62
|
-
.attributes[element_rule.to]
|
63
|
-
|
64
|
-
value =
|
65
|
-
element
|
66
|
-
.send(element_rule.delegate)
|
67
|
-
.send(element_rule.to)
|
68
|
-
else
|
69
|
-
attribute_def = element.class.attributes[element_rule.to]
|
70
|
-
value = element.send(element_rule.to)
|
71
|
-
end
|
56
|
+
attribute_def = attribute_definition_for(element, element_rule)
|
57
|
+
value = attribute_value_for(element, element_rule)
|
58
|
+
|
59
|
+
next if value.nil? && !element_rule.render_nil?
|
72
60
|
|
73
61
|
nsp_xml = element_rule.prefix ? xml[element_rule.prefix] : xml
|
74
62
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
[value]
|
79
|
-
else
|
80
|
-
[]
|
81
|
-
end
|
82
|
-
|
83
|
-
val.each do |v|
|
84
|
-
if attribute_def&.type&.<= Lutaml::Model::Serialize
|
85
|
-
handle_nested_elements(xml, element_rule, v)
|
86
|
-
else
|
87
|
-
nsp_xml.send(element_rule.name) do
|
88
|
-
if !v.nil?
|
89
|
-
serialized_value = attribute_def.type.serialize(v)
|
90
|
-
|
91
|
-
if attribute_def.type == Lutaml::Model::Type::Hash
|
92
|
-
serialized_value.each do |key, val|
|
93
|
-
xml.send(key) { xml.text val }
|
94
|
-
end
|
95
|
-
else
|
96
|
-
xml.text(serialized_value)
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
63
|
+
if attribute_def.collection?
|
64
|
+
value.each do |v|
|
65
|
+
add_to_xml(nsp_xml, v, attribute_def, element_rule)
|
100
66
|
end
|
67
|
+
elsif !value.nil? || element_rule.render_nil?
|
68
|
+
add_to_xml(nsp_xml, value, attribute_def, element_rule)
|
101
69
|
end
|
102
70
|
end
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
# rubocop:enable Metrics/PerceivedComplexity
|
111
|
-
|
112
|
-
def handle_nested_elements(xml, _element_rule, value)
|
113
|
-
case value
|
114
|
-
when Array
|
115
|
-
value.each { |val| build_element(xml, val) }
|
116
|
-
else
|
117
|
-
build_element(xml, value)
|
71
|
+
|
72
|
+
if xml_mapping.content_mapping
|
73
|
+
text = element.send(xml_mapping.content_mapping.to)
|
74
|
+
text = text.join if text.is_a?(Array)
|
75
|
+
|
76
|
+
prefixed_xml.text text
|
77
|
+
end
|
118
78
|
end
|
119
79
|
end
|
120
80
|
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
result = element.children.each_with_object({}) do |child, hash|
|
125
|
-
value = child.text? ? child.text : parse_element(child)
|
81
|
+
def build_ordered_element(xml, element, options = {})
|
82
|
+
xml_mapping = element.class.mappings_for(:xml)
|
83
|
+
return xml unless xml_mapping
|
126
84
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
85
|
+
attributes = build_attributes(element, xml_mapping)&.compact
|
86
|
+
|
87
|
+
prefixed_xml = if options.key?(:namespace_prefix)
|
88
|
+
options[:namespace_prefix] ? xml[options[:namespace_prefix]] : xml
|
89
|
+
elsif xml_mapping.namespace_prefix
|
90
|
+
xml[xml_mapping.namespace_prefix]
|
91
|
+
else
|
92
|
+
xml
|
93
|
+
end
|
94
|
+
|
95
|
+
prefixed_xml.public_send(xml_mapping.root_element, attributes) do
|
96
|
+
if options.key?(:namespace_prefix) && !options[:namespace_prefix]
|
97
|
+
xml.parent.namespace = nil
|
132
98
|
end
|
133
|
-
end
|
134
99
|
|
135
|
-
|
136
|
-
|
100
|
+
index_hash = {}
|
101
|
+
|
102
|
+
element.element_order.each do |name|
|
103
|
+
index_hash[name] ||= -1
|
104
|
+
curr_index = index_hash[name] += 1
|
105
|
+
|
106
|
+
element_rule = xml_mapping.find_by_name(name)
|
107
|
+
next if element_rule.nil?
|
108
|
+
|
109
|
+
attribute_def = attribute_definition_for(element, element_rule)
|
110
|
+
value = attribute_value_for(element, element_rule)
|
111
|
+
nsp_xml = element_rule.prefix ? xml[element_rule.prefix] : xml
|
112
|
+
|
113
|
+
if element_rule == xml_mapping.content_mapping
|
114
|
+
text = element.send(xml_mapping.content_mapping.to)
|
115
|
+
text = text[curr_index] if text.is_a?(Array)
|
116
|
+
|
117
|
+
prefixed_xml.text text
|
118
|
+
elsif attribute_def.collection?
|
119
|
+
add_to_xml(nsp_xml, value[curr_index], attribute_def,
|
120
|
+
element_rule)
|
121
|
+
elsif !value.nil? || element_rule.render_nil?
|
122
|
+
add_to_xml(nsp_xml, value, attribute_def, element_rule)
|
123
|
+
end
|
124
|
+
end
|
137
125
|
end
|
126
|
+
end
|
138
127
|
|
139
|
-
|
140
|
-
|
128
|
+
def add_to_xml(xml, value, attribute, rule)
|
129
|
+
if value && (attribute&.type&.<= Lutaml::Model::Serialize)
|
130
|
+
handle_nested_elements(xml, value, rule)
|
131
|
+
else
|
132
|
+
xml.public_send(rule.name) do
|
133
|
+
if !value.nil?
|
134
|
+
serialized_value = attribute.type.serialize(value)
|
135
|
+
|
136
|
+
if attribute.type == Lutaml::Model::Type::Hash
|
137
|
+
serialized_value.each do |key, val|
|
138
|
+
xml.public_send(key) { xml.text val }
|
139
|
+
end
|
140
|
+
else
|
141
|
+
xml.text(serialized_value)
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
141
146
|
end
|
142
|
-
# rubocop:enable Metrics/AbcSize
|
143
|
-
# rubocop:enable Metrics/MethodLength
|
144
147
|
end
|
145
148
|
|
146
149
|
class NokogiriElement < Element
|
147
|
-
# rubocop:disable Metrics/MethodLength
|
148
|
-
# rubocop:disable Metrics/AbcSize
|
149
|
-
# rubocop:disable Metrics/CyclomaticComplexity
|
150
|
-
# rubocop:disable Metrics/PerceivedComplexity
|
151
150
|
def initialize(node, root_node: nil)
|
152
151
|
if root_node
|
153
152
|
node.namespaces.each do |prefix, name|
|
@@ -182,10 +181,6 @@ module Lutaml
|
|
182
181
|
namespace_prefix: node.namespace&.prefix,
|
183
182
|
)
|
184
183
|
end
|
185
|
-
# rubocop:enable Metrics/MethodLength
|
186
|
-
# rubocop:enable Metrics/AbcSize
|
187
|
-
# rubocop:enable Metrics/CyclomaticComplexity
|
188
|
-
# rubocop:enable Metrics/PerceivedComplexity
|
189
184
|
|
190
185
|
def text?
|
191
186
|
# false
|