lutaml-model 0.3.10 → 0.3.14
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/.rubocop_todo.yml +25 -23
- data/Gemfile +1 -0
- data/LICENSE.md +33 -0
- data/README.adoc +200 -15
- data/lib/lutaml/model/attribute.rb +28 -3
- data/lib/lutaml/model/error/incorrect_mapping_argument_error.rb +6 -0
- data/lib/lutaml/model/error/type_not_enabled_error.rb +9 -0
- data/lib/lutaml/model/error.rb +2 -0
- data/lib/lutaml/model/json_adapter/standard_json_adapter.rb +1 -2
- data/lib/lutaml/model/key_value_mapping.rb +25 -1
- data/lib/lutaml/model/key_value_mapping_rule.rb +31 -1
- data/lib/lutaml/model/mapping_hash.rb +22 -0
- data/lib/lutaml/model/mapping_rule.rb +28 -22
- data/lib/lutaml/model/serialize.rb +120 -64
- data/lib/lutaml/model/type.rb +10 -0
- data/lib/lutaml/model/utils.rb +34 -0
- data/lib/lutaml/model/version.rb +1 -1
- data/lib/lutaml/model/xml_adapter/builder/nokogiri.rb +14 -6
- data/lib/lutaml/model/xml_adapter/builder/ox.rb +4 -0
- data/lib/lutaml/model/xml_adapter/nokogiri_adapter.rb +20 -9
- data/lib/lutaml/model/xml_adapter/ox_adapter.rb +9 -1
- data/lib/lutaml/model/xml_adapter/xml_attribute.rb +10 -0
- data/lib/lutaml/model/xml_adapter/xml_document.rb +86 -35
- data/lib/lutaml/model/xml_adapter/xml_element.rb +13 -3
- data/lib/lutaml/model/xml_adapter/xml_namespace.rb +1 -1
- data/lib/lutaml/model/xml_mapping.rb +60 -9
- data/lib/lutaml/model/xml_mapping_rule.rb +64 -4
- data/lib/lutaml/model/yaml_adapter/standard_yaml_adapter.rb +10 -5
- data/lutaml-model.gemspec +0 -1
- metadata +5 -16
@@ -3,7 +3,37 @@ require_relative "mapping_rule"
|
|
3
3
|
module Lutaml
|
4
4
|
module Model
|
5
5
|
class KeyValueMappingRule < MappingRule
|
6
|
-
|
6
|
+
attr_reader :child_mappings
|
7
|
+
|
8
|
+
def initialize(
|
9
|
+
name,
|
10
|
+
to:,
|
11
|
+
render_nil: false,
|
12
|
+
with: {},
|
13
|
+
delegate: nil,
|
14
|
+
child_mappings: nil
|
15
|
+
)
|
16
|
+
super(
|
17
|
+
name,
|
18
|
+
to: to,
|
19
|
+
render_nil: render_nil,
|
20
|
+
with: with,
|
21
|
+
delegate: delegate,
|
22
|
+
)
|
23
|
+
|
24
|
+
@child_mappings = child_mappings
|
25
|
+
end
|
26
|
+
|
27
|
+
def deep_dup
|
28
|
+
self.class.new(
|
29
|
+
name.dup,
|
30
|
+
to: to.dup,
|
31
|
+
render_nil: render_nil.dup,
|
32
|
+
with: Utils.deep_dup(custom_methods),
|
33
|
+
delegate: delegate,
|
34
|
+
child_mappings: Utils.deep_dup(child_mappings),
|
35
|
+
)
|
36
|
+
end
|
7
37
|
end
|
8
38
|
end
|
9
39
|
end
|
@@ -14,6 +14,14 @@ module Lutaml
|
|
14
14
|
@item_order&.map { |key| normalize(key) } || keys
|
15
15
|
end
|
16
16
|
|
17
|
+
def fetch(key)
|
18
|
+
self[key.to_s] || self[key.to_sym]
|
19
|
+
end
|
20
|
+
|
21
|
+
def key_exist?(key)
|
22
|
+
key?(key.to_s) || key?(key.to_sym)
|
23
|
+
end
|
24
|
+
|
17
25
|
def item_order=(order)
|
18
26
|
raise "`item order` must be an array" unless order.is_a?(Array)
|
19
27
|
|
@@ -24,6 +32,20 @@ module Lutaml
|
|
24
32
|
@ordered
|
25
33
|
end
|
26
34
|
|
35
|
+
def method_missing(method_name, *args)
|
36
|
+
value = self[method_name] || self[method_name.to_s]
|
37
|
+
return value if value
|
38
|
+
|
39
|
+
super
|
40
|
+
end
|
41
|
+
|
42
|
+
def respond_to_missing?(method_name, include_private = false)
|
43
|
+
key_present = key?(method_name) || key?(method_name.to_s)
|
44
|
+
return true if key_present
|
45
|
+
|
46
|
+
super
|
47
|
+
end
|
48
|
+
|
27
49
|
private
|
28
50
|
|
29
51
|
def normalize(key)
|
@@ -5,59 +5,65 @@ module Lutaml
|
|
5
5
|
:to,
|
6
6
|
:render_nil,
|
7
7
|
:custom_methods,
|
8
|
-
:delegate
|
9
|
-
:mixed_content,
|
10
|
-
:child_mappings
|
8
|
+
:delegate
|
11
9
|
|
12
10
|
def initialize(
|
13
11
|
name,
|
14
12
|
to:,
|
15
13
|
render_nil: false,
|
16
14
|
with: {},
|
17
|
-
|
18
|
-
|
19
|
-
namespace_set: false,
|
20
|
-
child_mappings: nil
|
15
|
+
attribute: false,
|
16
|
+
delegate: nil
|
21
17
|
)
|
22
18
|
@name = name
|
23
19
|
@to = to
|
24
20
|
@render_nil = render_nil
|
25
21
|
@custom_methods = with
|
22
|
+
@attribute = attribute
|
26
23
|
@delegate = delegate
|
27
|
-
@mixed_content = mixed_content
|
28
|
-
@namespace_set = namespace_set
|
29
|
-
@child_mappings = child_mappings
|
30
24
|
end
|
31
25
|
|
32
26
|
alias from name
|
33
27
|
alias render_nil? render_nil
|
34
28
|
|
35
|
-
def
|
36
|
-
if
|
37
|
-
|
29
|
+
def serialize_attribute(model, element, doc)
|
30
|
+
if custom_methods[:to]
|
31
|
+
model.send(custom_methods[:to], model, element, doc)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def to_value_for(model)
|
36
|
+
if delegate
|
37
|
+
model.public_send(delegate).public_send(to)
|
38
38
|
else
|
39
|
-
|
39
|
+
model.public_send(to)
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
-
def serialize(model,
|
43
|
+
def serialize(model, parent = nil, doc = nil)
|
44
44
|
if custom_methods[:to]
|
45
|
-
model.send(custom_methods[:to], model,
|
45
|
+
model.send(custom_methods[:to], model, parent, doc)
|
46
46
|
else
|
47
|
-
|
47
|
+
to_value_for(model)
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
|
-
def deserialize(model,
|
51
|
+
def deserialize(model, value, attributes, mapper_class = nil)
|
52
52
|
if custom_methods[:from]
|
53
|
-
|
53
|
+
mapper_class.new.send(custom_methods[:from], model, value)
|
54
|
+
elsif delegate
|
55
|
+
if model.public_send(delegate).nil?
|
56
|
+
model.public_send(:"#{delegate}=", attributes[delegate].type.new)
|
57
|
+
end
|
58
|
+
|
59
|
+
model.public_send(delegate).public_send(:"#{to}=", value)
|
54
60
|
else
|
55
|
-
|
61
|
+
model.public_send(:"#{to}=", value)
|
56
62
|
end
|
57
63
|
end
|
58
64
|
|
59
|
-
def
|
60
|
-
|
65
|
+
def deep_dup
|
66
|
+
raise NotImplementedError, "Subclasses must implement `deep_dup`."
|
61
67
|
end
|
62
68
|
end
|
63
69
|
end
|
@@ -11,6 +11,7 @@ require_relative "json_adapter"
|
|
11
11
|
require_relative "comparable_model"
|
12
12
|
require_relative "schema_location"
|
13
13
|
require_relative "validation"
|
14
|
+
require_relative "error"
|
14
15
|
|
15
16
|
module Lutaml
|
16
17
|
module Model
|
@@ -31,19 +32,50 @@ module Lutaml
|
|
31
32
|
@mappings ||= {}
|
32
33
|
@attributes ||= {}
|
33
34
|
|
34
|
-
subclass.instance_variable_set(:@attributes, @attributes
|
35
|
-
subclass.instance_variable_set(:@mappings, @mappings
|
35
|
+
subclass.instance_variable_set(:@attributes, Utils.deep_dup(@attributes))
|
36
|
+
subclass.instance_variable_set(:@mappings, Utils.deep_dup(@mappings))
|
36
37
|
subclass.instance_variable_set(:@model, subclass)
|
37
38
|
end
|
38
39
|
|
39
40
|
def model(klass = nil)
|
40
41
|
if klass
|
41
42
|
@model = klass
|
43
|
+
add_order_handling_methods_to_model(klass)
|
42
44
|
else
|
43
45
|
@model
|
44
46
|
end
|
45
47
|
end
|
46
48
|
|
49
|
+
def add_order_handling_methods_to_model(klass)
|
50
|
+
Utils.add_method_if_not_defined(klass, :ordered=) do |ordered|
|
51
|
+
@ordered = ordered
|
52
|
+
end
|
53
|
+
|
54
|
+
Utils.add_method_if_not_defined(klass, :ordered?) do
|
55
|
+
!!@ordered
|
56
|
+
end
|
57
|
+
|
58
|
+
Utils.add_method_if_not_defined(klass, :mixed=) do |mixed|
|
59
|
+
@mixed = mixed
|
60
|
+
end
|
61
|
+
|
62
|
+
Utils.add_method_if_not_defined(klass, :mixed?) do
|
63
|
+
!!@mixed
|
64
|
+
end
|
65
|
+
|
66
|
+
Utils.add_method_if_not_defined(klass, :element_order=) do |order|
|
67
|
+
@element_order = order
|
68
|
+
end
|
69
|
+
|
70
|
+
Utils.add_method_if_not_defined(klass, :element_order) do
|
71
|
+
@element_order
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def cast(value)
|
76
|
+
value
|
77
|
+
end
|
78
|
+
|
47
79
|
# Define an attribute for the model
|
48
80
|
def attribute(name, type, options = {})
|
49
81
|
attr = Attribute.new(name, type, options)
|
@@ -54,15 +86,14 @@ module Lutaml
|
|
54
86
|
end
|
55
87
|
|
56
88
|
define_method(:"#{name}=") do |value|
|
57
|
-
instance_variable_set(:"@#{name}", value)
|
58
|
-
# validate!(name)
|
89
|
+
instance_variable_set(:"@#{name}", attr.cast_value(value))
|
59
90
|
end
|
60
91
|
end
|
61
92
|
|
62
93
|
Lutaml::Model::Config::AVAILABLE_FORMATS.each do |format|
|
63
94
|
define_method(format) do |&block|
|
64
95
|
klass = format == :xml ? XmlMapping : KeyValueMapping
|
65
|
-
mappings[format]
|
96
|
+
mappings[format] ||= klass.new
|
66
97
|
mappings[format].instance_eval(&block)
|
67
98
|
|
68
99
|
if format == :xml && !mappings[format].root_element
|
@@ -74,17 +105,22 @@ module Lutaml
|
|
74
105
|
adapter = Lutaml::Model::Config.send(:"#{format}_adapter")
|
75
106
|
|
76
107
|
doc = adapter.parse(data)
|
77
|
-
public_send(:"of_#{format}", doc
|
108
|
+
public_send(:"of_#{format}", doc)
|
78
109
|
end
|
79
110
|
|
80
|
-
define_method(:"of_#{format}") do |
|
81
|
-
if
|
82
|
-
return
|
83
|
-
|
111
|
+
define_method(:"of_#{format}") do |doc|
|
112
|
+
if doc.is_a?(Array)
|
113
|
+
return doc.map do |item|
|
114
|
+
send(:"of_#{format}", item)
|
84
115
|
end
|
85
116
|
end
|
86
117
|
|
87
|
-
|
118
|
+
if format == :xml
|
119
|
+
doc_hash = doc.parse_element(doc.root, self, :xml)
|
120
|
+
apply_mappings(doc_hash, format)
|
121
|
+
else
|
122
|
+
apply_mappings(doc.to_h, format)
|
123
|
+
end
|
88
124
|
end
|
89
125
|
|
90
126
|
define_method(:"to_#{format}") do |instance|
|
@@ -185,6 +221,7 @@ module Lutaml
|
|
185
221
|
|
186
222
|
def default_mappings(format)
|
187
223
|
klass = format == :xml ? XmlMapping : KeyValueMapping
|
224
|
+
|
188
225
|
klass.new.tap do |mapping|
|
189
226
|
attributes&.each do |name, attr|
|
190
227
|
mapping.map_element(
|
@@ -193,6 +230,8 @@ module Lutaml
|
|
193
230
|
render_nil: attr.render_nil?,
|
194
231
|
)
|
195
232
|
end
|
233
|
+
|
234
|
+
mapping.root(to_s.split("::").last) if format == :xml
|
196
235
|
end
|
197
236
|
end
|
198
237
|
|
@@ -242,20 +281,34 @@ module Lutaml
|
|
242
281
|
hash
|
243
282
|
end
|
244
283
|
|
284
|
+
def valid_rule?(rule)
|
285
|
+
attribute = attribute_for_rule(rule)
|
286
|
+
|
287
|
+
!!attribute || rule.custom_methods[:from]
|
288
|
+
end
|
289
|
+
|
290
|
+
def attribute_for_rule(rule)
|
291
|
+
return attributes[rule.to] unless rule.delegate
|
292
|
+
|
293
|
+
attributes[rule.delegate].type.attributes[rule.to]
|
294
|
+
end
|
295
|
+
|
296
|
+
def attribute_for_child(child_name, format)
|
297
|
+
mapping_rule = mappings_for(format).find_by_name(child_name)
|
298
|
+
|
299
|
+
attribute_for_rule(mapping_rule) if mapping_rule
|
300
|
+
end
|
301
|
+
|
245
302
|
def apply_mappings(doc, format, options = {})
|
246
303
|
instance = options[:instance] || model.new
|
247
|
-
return instance if
|
304
|
+
return instance if Utils.blank?(doc)
|
248
305
|
return apply_xml_mapping(doc, instance, options) if format == :xml
|
249
306
|
|
250
307
|
mappings = mappings_for(format).mappings
|
251
308
|
mappings.each do |rule|
|
252
|
-
|
253
|
-
attributes[rule.delegate].type.attributes[rule.to]
|
254
|
-
else
|
255
|
-
attributes[rule.to]
|
256
|
-
end
|
309
|
+
raise "Attribute '#{rule.to}' not found in #{self}" unless valid_rule?(rule)
|
257
310
|
|
258
|
-
|
311
|
+
attr = attribute_for_rule(rule)
|
259
312
|
|
260
313
|
value = if doc.key?(rule.name) || doc.key?(rule.name.to_sym)
|
261
314
|
doc[rule.name] || doc[rule.name.to_sym]
|
@@ -264,26 +317,17 @@ module Lutaml
|
|
264
317
|
end
|
265
318
|
|
266
319
|
if rule.custom_methods[:from]
|
267
|
-
if
|
268
|
-
value = new.send(rule.custom_methods[:from], instance,
|
269
|
-
value)
|
320
|
+
if Utils.present?(value)
|
321
|
+
value = new.send(rule.custom_methods[:from], instance, value)
|
270
322
|
end
|
323
|
+
|
271
324
|
next
|
272
325
|
end
|
273
326
|
|
274
327
|
value = apply_child_mappings(value, rule.child_mappings)
|
275
328
|
value = attr.cast(value, format)
|
276
329
|
|
277
|
-
|
278
|
-
if instance.public_send(rule.delegate).nil?
|
279
|
-
instance.public_send(:"#{rule.delegate}=",
|
280
|
-
attributes[rule.delegate].type.new)
|
281
|
-
end
|
282
|
-
instance.public_send(rule.delegate).public_send(:"#{rule.to}=",
|
283
|
-
value)
|
284
|
-
else
|
285
|
-
instance.public_send(:"#{rule.to}=", value)
|
286
|
-
end
|
330
|
+
rule.deserialize(instance, value, attributes, self)
|
287
331
|
end
|
288
332
|
|
289
333
|
instance
|
@@ -301,7 +345,8 @@ module Lutaml
|
|
301
345
|
|
302
346
|
if instance.respond_to?(:ordered=) && doc.is_a?(Lutaml::Model::MappingHash)
|
303
347
|
instance.element_order = doc.item_order
|
304
|
-
instance.ordered = mappings_for(:xml).
|
348
|
+
instance.ordered = mappings_for(:xml).ordered? || options[:ordered]
|
349
|
+
instance.mixed = mappings_for(:xml).mixed_content? || options[:mixed_content]
|
305
350
|
end
|
306
351
|
|
307
352
|
if doc["__schema_location"]
|
@@ -313,44 +358,55 @@ module Lutaml
|
|
313
358
|
end
|
314
359
|
|
315
360
|
mappings.each do |rule|
|
316
|
-
|
317
|
-
raise "Attribute '#{rule.to}' not found in #{self}" unless attr
|
318
|
-
|
319
|
-
is_content_mapping = rule.name.nil?
|
361
|
+
raise "Attribute '#{rule.to}' not found in #{self}" unless valid_rule?(rule)
|
320
362
|
|
321
|
-
value = if
|
363
|
+
value = if rule.content_mapping?
|
322
364
|
doc["text"]
|
365
|
+
elsif doc.key_exist?(rule.namespaced_name)
|
366
|
+
doc.fetch(rule.namespaced_name)
|
323
367
|
else
|
324
|
-
|
368
|
+
rule.to_value_for(instance)
|
325
369
|
end
|
326
370
|
|
327
|
-
value =
|
371
|
+
value = normalize_xml_value(value, rule)
|
372
|
+
rule.deserialize(instance, value, attributes, self)
|
373
|
+
end
|
328
374
|
|
329
|
-
|
330
|
-
|
331
|
-
v.is_a?(Hash) && !(attr.type <= Serialize) ? v["text"] : v
|
332
|
-
end
|
333
|
-
elsif !(attr.type <= Serialize) && value.is_a?(Hash) && attr.type != Lutaml::Model::Type::Hash
|
334
|
-
value = value["text"]
|
335
|
-
end
|
375
|
+
instance
|
376
|
+
end
|
336
377
|
|
337
|
-
|
338
|
-
|
339
|
-
value,
|
340
|
-
:xml,
|
341
|
-
caller_class: self,
|
342
|
-
mixed_content: rule.mixed_content,
|
343
|
-
)
|
344
|
-
end
|
378
|
+
def normalize_xml_value(value, rule)
|
379
|
+
attr = attribute_for_rule(rule)
|
345
380
|
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
381
|
+
value = [value].compact if attr&.collection? && !value.is_a?(Array)
|
382
|
+
|
383
|
+
value = if value.is_a?(Array)
|
384
|
+
value.map do |v|
|
385
|
+
text_hash?(attr, v) ? v["text"] : v
|
386
|
+
end
|
387
|
+
elsif text_hash?(attr, value)
|
388
|
+
value["text"]
|
389
|
+
else
|
390
|
+
value
|
391
|
+
end
|
392
|
+
|
393
|
+
if attr && !rule.content_mapping?
|
394
|
+
value = attr.cast(
|
395
|
+
value,
|
396
|
+
:xml,
|
397
|
+
caller_class: self,
|
398
|
+
mixed_content: rule.mixed_content,
|
399
|
+
)
|
351
400
|
end
|
352
401
|
|
353
|
-
|
402
|
+
value
|
403
|
+
end
|
404
|
+
|
405
|
+
def text_hash?(attr, value)
|
406
|
+
return false unless value.is_a?(Hash)
|
407
|
+
return value.keys == ["text"] unless attr
|
408
|
+
|
409
|
+
!(attr.type <= Serialize) && attr.type != Lutaml::Model::Type::Hash
|
354
410
|
end
|
355
411
|
|
356
412
|
def ensure_utf8(value)
|
@@ -373,6 +429,7 @@ module Lutaml
|
|
373
429
|
end
|
374
430
|
|
375
431
|
attr_accessor :element_order, :schema_location
|
432
|
+
attr_writer :ordered, :mixed
|
376
433
|
|
377
434
|
def initialize(attrs = {})
|
378
435
|
@validate_on_set = attrs.delete(:validate_on_set) || false
|
@@ -422,11 +479,11 @@ module Lutaml
|
|
422
479
|
end
|
423
480
|
|
424
481
|
def ordered?
|
425
|
-
|
482
|
+
!!@ordered
|
426
483
|
end
|
427
484
|
|
428
|
-
def
|
429
|
-
|
485
|
+
def mixed?
|
486
|
+
!!@mixed
|
430
487
|
end
|
431
488
|
|
432
489
|
def key_exist?(hash, key)
|
@@ -439,7 +496,6 @@ module Lutaml
|
|
439
496
|
|
440
497
|
Lutaml::Model::Config::AVAILABLE_FORMATS.each do |format|
|
441
498
|
define_method(:"to_#{format}") do |options = {}|
|
442
|
-
validate!
|
443
499
|
adapter = Lutaml::Model::Config.public_send(:"#{format}_adapter")
|
444
500
|
representation = if format == :xml
|
445
501
|
self
|
data/lib/lutaml/model/type.rb
CHANGED
@@ -62,6 +62,10 @@ module Lutaml
|
|
62
62
|
when "Boolean"
|
63
63
|
to_boolean(value)
|
64
64
|
when "Decimal"
|
65
|
+
unless defined?(BigDecimal)
|
66
|
+
raise Lutaml::Model::TypeNotEnabledError.new("Decimal", value)
|
67
|
+
end
|
68
|
+
|
65
69
|
BigDecimal(value.to_s)
|
66
70
|
when "Hash"
|
67
71
|
normalize_hash(Hash(value))
|
@@ -85,6 +89,10 @@ module Lutaml
|
|
85
89
|
when "Boolean"
|
86
90
|
to_boolean(value)
|
87
91
|
when "Decimal"
|
92
|
+
unless defined?(BigDecimal)
|
93
|
+
raise Lutaml::Model::TypeNotEnabledError.new("Decimal", value)
|
94
|
+
end
|
95
|
+
|
88
96
|
value.to_s("F")
|
89
97
|
when "Hash"
|
90
98
|
Hash(value)
|
@@ -108,6 +116,8 @@ module Lutaml
|
|
108
116
|
def self.normalize_hash(hash)
|
109
117
|
return hash["text"] if hash.keys == ["text"]
|
110
118
|
|
119
|
+
hash = hash.to_h if hash.is_a?(Lutaml::Model::MappingHash)
|
120
|
+
|
111
121
|
hash.filter_map do |key, value|
|
112
122
|
next if key == "text"
|
113
123
|
|
data/lib/lutaml/model/utils.rb
CHANGED
@@ -34,6 +34,40 @@ module Lutaml
|
|
34
34
|
.downcase
|
35
35
|
end
|
36
36
|
|
37
|
+
def present?(value)
|
38
|
+
!blank?(value)
|
39
|
+
end
|
40
|
+
|
41
|
+
def blank?(value)
|
42
|
+
value.respond_to?(:empty?) ? value.empty? : !value
|
43
|
+
end
|
44
|
+
|
45
|
+
def add_method_if_not_defined(klass, method_name, &block)
|
46
|
+
unless klass.method_defined?(method_name)
|
47
|
+
klass.class_eval do
|
48
|
+
define_method(method_name, &block)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def deep_dup(hash)
|
54
|
+
return hash if hash.nil?
|
55
|
+
|
56
|
+
new_hash = {}
|
57
|
+
|
58
|
+
hash.each do |key, value|
|
59
|
+
new_hash[key] = if value.is_a?(Hash)
|
60
|
+
deep_dup(value)
|
61
|
+
elsif value.respond_to?(:deep_dup)
|
62
|
+
value.deep_dup
|
63
|
+
else
|
64
|
+
value.dup
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
new_hash
|
69
|
+
end
|
70
|
+
|
37
71
|
private
|
38
72
|
|
39
73
|
def camelize_part(part)
|
data/lib/lutaml/model/version.rb
CHANGED
@@ -27,11 +27,21 @@ module Lutaml
|
|
27
27
|
element.add_child(child)
|
28
28
|
end
|
29
29
|
|
30
|
-
def
|
31
|
-
|
30
|
+
def add_attribute(element, name, value)
|
31
|
+
element[name] = value
|
32
|
+
end
|
33
|
+
|
34
|
+
def create_and_add_element(
|
35
|
+
element_name,
|
36
|
+
prefix: (prefix_unset = true
|
37
|
+
nil),
|
38
|
+
attributes: {}
|
39
|
+
)
|
40
|
+
add_namespace_prefix(prefix)
|
32
41
|
|
33
42
|
if block_given?
|
34
43
|
public_send(element_name, attributes) do
|
44
|
+
xml.parent.namespace = nil if prefix.nil? && !prefix_unset
|
35
45
|
yield(self)
|
36
46
|
end
|
37
47
|
else
|
@@ -53,11 +63,9 @@ module Lutaml
|
|
53
63
|
self
|
54
64
|
end
|
55
65
|
|
56
|
-
def method_missing(method_name, *args)
|
66
|
+
def method_missing(method_name, *args, &block)
|
57
67
|
if block_given?
|
58
|
-
xml.public_send(method_name, *args)
|
59
|
-
yield(xml)
|
60
|
-
end
|
68
|
+
xml.public_send(method_name, *args, &block)
|
61
69
|
else
|
62
70
|
xml.public_send(method_name, *args)
|
63
71
|
end
|