lutaml-model 0.3.29 → 0.4.0
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/.github/workflows/dependent-repos.json +15 -0
- data/.github/workflows/dependent-tests.yml +14 -0
- data/.rubocop_todo.yml +15 -7
- data/README.adoc +6 -0
- data/lib/lutaml/model/attribute.rb +6 -2
- data/lib/lutaml/model/json_adapter/json_document.rb +1 -1
- data/lib/lutaml/model/json_adapter/multi_json_adapter.rb +1 -1
- data/lib/lutaml/model/json_adapter/standard_json_adapter.rb +1 -1
- data/lib/lutaml/model/serialize.rb +133 -33
- data/lib/lutaml/model/toml_adapter/toml_document.rb +1 -1
- data/lib/lutaml/model/toml_adapter/toml_rb_adapter.rb +1 -1
- data/lib/lutaml/model/toml_adapter/tomlib_adapter.rb +1 -1
- data/lib/lutaml/model/type/time.rb +4 -4
- data/lib/lutaml/model/utils.rb +1 -1
- data/lib/lutaml/model/validation.rb +6 -2
- data/lib/lutaml/model/version.rb +1 -1
- data/lib/lutaml/model/xml_adapter/builder/nokogiri.rb +10 -0
- data/lib/lutaml/model/xml_adapter/builder/ox.rb +5 -1
- data/lib/lutaml/model/xml_adapter/nokogiri_adapter.rb +5 -3
- data/lib/lutaml/model/xml_adapter/oga_adapter.rb +1 -1
- data/lib/lutaml/model/xml_adapter/ox_adapter.rb +25 -10
- data/lib/lutaml/model/xml_adapter/xml_document.rb +12 -24
- data/lib/lutaml/model/yaml_adapter/standard_yaml_adapter.rb +1 -1
- data/lib/lutaml/model/yaml_adapter/yaml_document.rb +1 -1
- data/spec/fixtures/xml/latin_encoding.xml +5 -0
- data/spec/fixtures/xml/shift_jis.xml +4 -0
- data/spec/lutaml/model/custom_serialization_spec.rb +16 -0
- data/spec/lutaml/model/defaults_spec.rb +74 -0
- data/spec/lutaml/model/enum_spec.rb +131 -0
- data/spec/lutaml/model/mixed_content_spec.rb +190 -7
- data/spec/lutaml/model/render_nil_spec.rb +0 -2
- data/spec/lutaml/model/serializable_spec.rb +2 -2
- data/spec/lutaml/model/xml_mapping_spec.rb +679 -543
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fa60d5495804e6bfc0203ba1a237f38b89b9626d036beeb2be8ca7aebb22426f
|
4
|
+
data.tar.gz: 63d8d18127bee85cfaa73973f57554bc56385805dfeea1dad343c552277089d6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 322a29941e7685a6e118d083f1b6e11ce6b8abc1cacb5508dd501f874c5ea3f2dc6f0e6719ce4895deb31c877319a3afe0e20d0820a81b8fd60d9fe59c408472
|
7
|
+
data.tar.gz: ce087acefc221ed41180658b8c40d4cff5c0196c208647b9d1c5d0d39799849860abf80b981fe753b30a1176ca8633ed696440beeddef5a4493c1e829340f250
|
@@ -0,0 +1,15 @@
|
|
1
|
+
{
|
2
|
+
"repo": [
|
3
|
+
"lutaml/genericode",
|
4
|
+
"lutaml/ogc-gml",
|
5
|
+
"metanorma/modspec-ruby",
|
6
|
+
"metanorma/rfcxml",
|
7
|
+
"metanorma/niso-jats",
|
8
|
+
"metanorma/sts-ruby",
|
9
|
+
"lutaml/metaschema",
|
10
|
+
"glossarist/termium",
|
11
|
+
"lutaml/oasis-etm",
|
12
|
+
"lutaml/ali",
|
13
|
+
"lutaml/reqif"
|
14
|
+
]
|
15
|
+
}
|
data/.rubocop_todo.yml
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
# This configuration was generated by
|
2
2
|
# `rubocop --auto-gen-config`
|
3
|
-
# on 2024-
|
3
|
+
# on 2024-12-03 11:13:42 UTC using RuboCop version 1.66.1.
|
4
4
|
# The point is for the user to remove these configuration records
|
5
5
|
# one by one as the offenses are removed from the code base.
|
6
6
|
# Note that changes in the inspected code, or installation of new
|
7
7
|
# versions of RuboCop, may require this file to be generated again.
|
8
8
|
|
9
|
-
# Offense count:
|
9
|
+
# Offense count: 224
|
10
10
|
# This cop supports safe autocorrection (--autocorrect).
|
11
11
|
# Configuration parameters: Max, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns.
|
12
12
|
# URISchemes: http, https
|
@@ -51,7 +51,7 @@ Metrics/AbcSize:
|
|
51
51
|
# Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns, inherit_mode.
|
52
52
|
# AllowedMethods: refine
|
53
53
|
Metrics/BlockLength:
|
54
|
-
Max:
|
54
|
+
Max: 46
|
55
55
|
|
56
56
|
# Offense count: 28
|
57
57
|
# Configuration parameters: AllowedMethods, AllowedPatterns, Max.
|
@@ -65,7 +65,7 @@ Metrics/CyclomaticComplexity:
|
|
65
65
|
- 'lib/lutaml/model/xml_adapter/ox_adapter.rb'
|
66
66
|
- 'lib/lutaml/model/xml_adapter/xml_document.rb'
|
67
67
|
|
68
|
-
# Offense count:
|
68
|
+
# Offense count: 54
|
69
69
|
# Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns.
|
70
70
|
Metrics/MethodLength:
|
71
71
|
Max: 46
|
@@ -97,7 +97,15 @@ RSpec/ContextWording:
|
|
97
97
|
- 'spec/lutaml/model/xml_adapter/xml_namespace_spec.rb'
|
98
98
|
- 'spec/lutaml/model/xml_mapping_spec.rb'
|
99
99
|
|
100
|
-
# Offense count:
|
100
|
+
# Offense count: 1
|
101
|
+
# This cop supports unsafe autocorrection (--autocorrect-all).
|
102
|
+
# Configuration parameters: SkipBlocks, EnforcedStyle, OnlyStaticConstants.
|
103
|
+
# SupportedStyles: described_class, explicit
|
104
|
+
RSpec/DescribedClass:
|
105
|
+
Exclude:
|
106
|
+
- 'spec/lutaml/model/xml_mapping_spec.rb'
|
107
|
+
|
108
|
+
# Offense count: 133
|
101
109
|
# Configuration parameters: CountAsOne.
|
102
110
|
RSpec/ExampleLength:
|
103
111
|
Max: 54
|
@@ -127,7 +135,7 @@ RSpec/MultipleDescribes:
|
|
127
135
|
- 'spec/lutaml/model/xml_adapter/xml_namespace_spec.rb'
|
128
136
|
- 'spec/lutaml/model/xml_adapter_spec.rb'
|
129
137
|
|
130
|
-
# Offense count:
|
138
|
+
# Offense count: 157
|
131
139
|
RSpec/MultipleExpectations:
|
132
140
|
Max: 14
|
133
141
|
|
@@ -136,7 +144,7 @@ RSpec/MultipleExpectations:
|
|
136
144
|
RSpec/MultipleMemoizedHelpers:
|
137
145
|
Max: 9
|
138
146
|
|
139
|
-
# Offense count:
|
147
|
+
# Offense count: 15
|
140
148
|
# Configuration parameters: AllowedGroups.
|
141
149
|
RSpec/NestedGroups:
|
142
150
|
Max: 4
|
data/README.adoc
CHANGED
@@ -569,6 +569,12 @@ The values set inside the `values:` option can be of any type, but they must
|
|
569
569
|
match the type of the attribute. The values are compared using the `==` operator,
|
570
570
|
so the type must implement the `==` method.
|
571
571
|
|
572
|
+
Also, If all the elements in `values` directive are strings then `lutaml-model` add some enum convenience methods, for each of the value the following three methods are added
|
573
|
+
|
574
|
+
* `value1`: will return value if set
|
575
|
+
* `value1?`: will return true if value is set, false otherwise
|
576
|
+
* `value1=`: will set the value of `name_of_attribute` equal to `value1` if truthy value is given, and remove it otherwise.
|
577
|
+
|
572
578
|
.Using the `values` directive to define acceptable values for an attribute (basic types)
|
573
579
|
[example]
|
574
580
|
====
|
@@ -76,6 +76,10 @@ module Lutaml
|
|
76
76
|
@raw
|
77
77
|
end
|
78
78
|
|
79
|
+
def enum?
|
80
|
+
!enum_values.empty?
|
81
|
+
end
|
82
|
+
|
79
83
|
def default
|
80
84
|
value = if delegate
|
81
85
|
type.attributes[to].default
|
@@ -98,7 +102,7 @@ module Lutaml
|
|
98
102
|
|
99
103
|
def valid_value!(value)
|
100
104
|
return true if value.nil? && !collection?
|
101
|
-
return true
|
105
|
+
return true unless enum?
|
102
106
|
|
103
107
|
unless valid_value?(value)
|
104
108
|
raise Lutaml::Model::InvalidValueError.new(name, value, enum_values)
|
@@ -208,7 +212,7 @@ module Lutaml
|
|
208
212
|
serialize(v, format, options)
|
209
213
|
end
|
210
214
|
elsif type <= Serialize
|
211
|
-
type.
|
215
|
+
type.public_send(:"as_#{format}", value, options)
|
212
216
|
else
|
213
217
|
# Convert to Value instance if not already
|
214
218
|
value = type.new(value) unless value.is_a?(Type::Value)
|
@@ -51,6 +51,7 @@ module Lutaml
|
|
51
51
|
Utils.add_boolean_accessor_if_not_defined(klass, :ordered)
|
52
52
|
Utils.add_boolean_accessor_if_not_defined(klass, :mixed)
|
53
53
|
Utils.add_accessor_if_not_defined(klass, :element_order)
|
54
|
+
Utils.add_accessor_if_not_defined(klass, :encoding)
|
54
55
|
|
55
56
|
Utils.add_method_if_not_defined(klass,
|
56
57
|
:using_default_for) do |attribute_name|
|
@@ -80,16 +81,104 @@ module Lutaml
|
|
80
81
|
attr = Attribute.new(name, type, options)
|
81
82
|
attributes[name] = attr
|
82
83
|
|
83
|
-
|
84
|
-
|
84
|
+
if attr.enum?
|
85
|
+
add_enum_methods_to_model(
|
86
|
+
model,
|
87
|
+
name,
|
88
|
+
options[:values],
|
89
|
+
collection: options[:collection],
|
90
|
+
)
|
91
|
+
else
|
92
|
+
define_method(name) do
|
93
|
+
instance_variable_get(:"@#{name}")
|
94
|
+
end
|
95
|
+
|
96
|
+
define_method(:"#{name}=") do |value|
|
97
|
+
value_set_for(name)
|
98
|
+
instance_variable_set(:"@#{name}", attr.cast_value(value))
|
99
|
+
end
|
85
100
|
end
|
101
|
+
end
|
86
102
|
|
87
|
-
|
88
|
-
|
89
|
-
|
103
|
+
def add_enum_methods_to_model(klass, enum_name, values, collection: false)
|
104
|
+
add_enum_getter_if_not_defined(klass, enum_name, collection)
|
105
|
+
add_enum_setter_if_not_defined(klass, enum_name, values, collection)
|
106
|
+
|
107
|
+
return unless values.all?(::String)
|
108
|
+
|
109
|
+
values.each do |value|
|
110
|
+
Utils.add_method_if_not_defined(klass, "#{value}?") do
|
111
|
+
curr_value = public_send(:"#{enum_name}")
|
112
|
+
|
113
|
+
if collection
|
114
|
+
curr_value.include?(value)
|
115
|
+
else
|
116
|
+
curr_value == value
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
Utils.add_method_if_not_defined(klass, value.to_s) do
|
121
|
+
public_send(:"#{value}?")
|
122
|
+
end
|
123
|
+
|
124
|
+
Utils.add_method_if_not_defined(klass, "#{value}=") do |val|
|
125
|
+
value_set_for(enum_name)
|
126
|
+
enum_vals = public_send(:"#{enum_name}")
|
127
|
+
|
128
|
+
enum_vals = if !!val
|
129
|
+
if collection
|
130
|
+
enum_vals << value
|
131
|
+
else
|
132
|
+
[value]
|
133
|
+
end
|
134
|
+
elsif collection
|
135
|
+
enum_vals.delete(value)
|
136
|
+
enum_vals
|
137
|
+
else
|
138
|
+
[]
|
139
|
+
end
|
140
|
+
|
141
|
+
instance_variable_set(:"@#{enum_name}", enum_vals)
|
142
|
+
end
|
143
|
+
|
144
|
+
Utils.add_method_if_not_defined(klass, "#{value}!") do
|
145
|
+
public_send(:"#{value}=", true)
|
146
|
+
end
|
90
147
|
end
|
91
148
|
end
|
92
149
|
|
150
|
+
def add_enum_getter_if_not_defined(klass, enum_name, collection)
|
151
|
+
Utils.add_method_if_not_defined(klass, enum_name) do
|
152
|
+
i = instance_variable_get(:"@#{enum_name}") || []
|
153
|
+
|
154
|
+
if !collection && i.is_a?(Array)
|
155
|
+
i.first
|
156
|
+
else
|
157
|
+
i.uniq
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
def add_enum_setter_if_not_defined(klass, enum_name, _values, collection)
|
163
|
+
Utils.add_method_if_not_defined(klass, "#{enum_name}=") do |value|
|
164
|
+
value = [value] unless value.is_a?(Array)
|
165
|
+
|
166
|
+
value_set_for(enum_name)
|
167
|
+
|
168
|
+
if collection
|
169
|
+
curr_value = public_send(:"#{enum_name}")
|
170
|
+
|
171
|
+
instance_variable_set(:"@#{enum_name}", curr_value + value)
|
172
|
+
else
|
173
|
+
instance_variable_set(:"@#{enum_name}", value)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
def enums
|
179
|
+
attributes.select { |_, attr| attr.enum? }
|
180
|
+
end
|
181
|
+
|
93
182
|
Lutaml::Model::Config::AVAILABLE_FORMATS.each do |format|
|
94
183
|
define_method(format) do |&block|
|
95
184
|
klass = format == :xml ? XmlMapping : KeyValueMapping
|
@@ -101,23 +190,22 @@ module Lutaml
|
|
101
190
|
end
|
102
191
|
end
|
103
192
|
|
104
|
-
define_method(:"from_#{format}") do |data|
|
193
|
+
define_method(:"from_#{format}") do |data, options = {}|
|
105
194
|
adapter = Lutaml::Model::Config.send(:"#{format}_adapter")
|
106
195
|
|
107
|
-
doc = adapter.parse(data)
|
108
|
-
public_send(:"of_#{format}", doc)
|
196
|
+
doc = adapter.parse(data, options)
|
197
|
+
public_send(:"of_#{format}", doc, options)
|
109
198
|
end
|
110
199
|
|
111
|
-
define_method(:"of_#{format}") do |doc|
|
200
|
+
define_method(:"of_#{format}") do |doc, options = {}|
|
112
201
|
if doc.is_a?(Array)
|
113
|
-
return doc.map
|
114
|
-
send(:"of_#{format}", item)
|
115
|
-
end
|
202
|
+
return doc.map { |item| send(:"of_#{format}", item) }
|
116
203
|
end
|
117
204
|
|
118
205
|
if format == :xml
|
119
206
|
doc_hash = doc.parse_element(doc.root, self, :xml)
|
120
|
-
|
207
|
+
options[:encoding] = doc.encoding
|
208
|
+
apply_mappings(doc_hash, format, options)
|
121
209
|
else
|
122
210
|
apply_mappings(doc.to_h, format)
|
123
211
|
end
|
@@ -135,7 +223,7 @@ module Lutaml
|
|
135
223
|
end
|
136
224
|
end
|
137
225
|
|
138
|
-
define_method(:"as_#{format}") do |instance|
|
226
|
+
define_method(:"as_#{format}") do |instance, options = {}|
|
139
227
|
if instance.is_a?(Array)
|
140
228
|
return instance.map { |item| public_send(:"as_#{format}", item) }
|
141
229
|
end
|
@@ -147,7 +235,7 @@ module Lutaml
|
|
147
235
|
|
148
236
|
return instance if format == :xml
|
149
237
|
|
150
|
-
hash_representation(instance, format)
|
238
|
+
hash_representation(instance, format, options)
|
151
239
|
end
|
152
240
|
end
|
153
241
|
|
@@ -166,7 +254,7 @@ module Lutaml
|
|
166
254
|
mappings.each_with_object({}) do |rule, hash|
|
167
255
|
name = rule.to
|
168
256
|
next if except&.include?(name) || (only && !only.include?(name))
|
169
|
-
next if !rule.render_default? && instance.using_default?(rule.to)
|
257
|
+
next if !rule.custom_methods[:to] && (!rule.render_default? && instance.using_default?(rule.to))
|
170
258
|
|
171
259
|
next handle_delegate(instance, rule, hash, format) if rule.delegate
|
172
260
|
|
@@ -176,15 +264,15 @@ module Lutaml
|
|
176
264
|
|
177
265
|
value = instance.send(name)
|
178
266
|
|
179
|
-
next if
|
267
|
+
next if Utils.blank?(value) && !rule.render_nil
|
180
268
|
|
181
269
|
attribute = attributes[name]
|
182
270
|
|
183
|
-
hash[rule.from] = if rule.child_mappings
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
271
|
+
hash[rule.from.to_s] = if rule.child_mappings
|
272
|
+
generate_hash_from_child_mappings(value, rule.child_mappings)
|
273
|
+
else
|
274
|
+
attribute.serialize(value, format, options)
|
275
|
+
end
|
188
276
|
end
|
189
277
|
end
|
190
278
|
|
@@ -194,7 +282,7 @@ module Lutaml
|
|
194
282
|
return if value.nil? && !rule.render_nil
|
195
283
|
|
196
284
|
attribute = instance.send(rule.delegate).class.attributes[name]
|
197
|
-
hash[rule.from] = attribute.serialize(value, format)
|
285
|
+
hash[rule.from.to_s] = attribute.serialize(value, format)
|
198
286
|
end
|
199
287
|
|
200
288
|
def mappings_for(format)
|
@@ -315,6 +403,7 @@ module Lutaml
|
|
315
403
|
end
|
316
404
|
|
317
405
|
def apply_xml_mapping(doc, instance, options = {})
|
406
|
+
instance.encoding = options[:encoding]
|
318
407
|
return instance unless doc
|
319
408
|
|
320
409
|
if options[:default_namespace].nil?
|
@@ -347,6 +436,8 @@ module Lutaml
|
|
347
436
|
mappings.each do |rule|
|
348
437
|
raise "Attribute '#{rule.to}' not found in #{self}" unless valid_rule?(rule)
|
349
438
|
|
439
|
+
attr = attribute_for_rule(rule)
|
440
|
+
|
350
441
|
value = if rule.raw_mapping?
|
351
442
|
doc.node.inner_xml
|
352
443
|
elsif rule.content_mapping?
|
@@ -355,10 +446,10 @@ module Lutaml
|
|
355
446
|
doc.fetch(rule.namespaced_name(options[:default_namespace]))
|
356
447
|
else
|
357
448
|
defaults_used << rule.to
|
358
|
-
rule.to_value_for(instance)
|
449
|
+
attr&.default || rule.to_value_for(instance)
|
359
450
|
end
|
360
451
|
|
361
|
-
value = normalize_xml_value(value, rule, options)
|
452
|
+
value = normalize_xml_value(value, rule, attr, options)
|
362
453
|
rule.deserialize(instance, value, attributes, self)
|
363
454
|
end
|
364
455
|
|
@@ -376,10 +467,10 @@ module Lutaml
|
|
376
467
|
|
377
468
|
attr = attribute_for_rule(rule)
|
378
469
|
|
379
|
-
value = if doc.key?(rule.name) || doc.key?(rule.name.to_sym)
|
380
|
-
doc[rule.name] || doc[rule.name.to_sym]
|
470
|
+
value = if doc.key?(rule.name.to_s) || doc.key?(rule.name.to_sym)
|
471
|
+
doc[rule.name.to_s] || doc[rule.name.to_sym]
|
381
472
|
else
|
382
|
-
attr
|
473
|
+
attr&.default
|
383
474
|
end
|
384
475
|
|
385
476
|
if rule.custom_methods[:from]
|
@@ -399,9 +490,7 @@ module Lutaml
|
|
399
490
|
instance
|
400
491
|
end
|
401
492
|
|
402
|
-
def normalize_xml_value(value, rule, options = {})
|
403
|
-
attr = attribute_for_rule(rule)
|
404
|
-
|
493
|
+
def normalize_xml_value(value, rule, attr, options = {})
|
405
494
|
value = [value].compact if attr&.collection? && !value.is_a?(Array)
|
406
495
|
|
407
496
|
value = if value.is_a?(Array)
|
@@ -459,7 +548,7 @@ module Lutaml
|
|
459
548
|
end
|
460
549
|
end
|
461
550
|
|
462
|
-
attr_accessor :element_order, :schema_location
|
551
|
+
attr_accessor :element_order, :schema_location, :encoding
|
463
552
|
attr_writer :ordered, :mixed
|
464
553
|
|
465
554
|
def initialize(attrs = {})
|
@@ -489,7 +578,9 @@ module Lutaml
|
|
489
578
|
value = []
|
490
579
|
end
|
491
580
|
|
492
|
-
|
581
|
+
default = using_default?(name)
|
582
|
+
public_send(:"#{name}=", self.class.ensure_utf8(value))
|
583
|
+
using_default_for(name) if default
|
493
584
|
end
|
494
585
|
end
|
495
586
|
|
@@ -538,6 +629,14 @@ module Lutaml
|
|
538
629
|
hash[key.to_sym] || hash[key.to_s]
|
539
630
|
end
|
540
631
|
|
632
|
+
def pretty_print_instance_variables
|
633
|
+
(instance_variables - %i[@using_default]).sort
|
634
|
+
end
|
635
|
+
|
636
|
+
def to_yaml_hash
|
637
|
+
self.class.as_yaml(self)
|
638
|
+
end
|
639
|
+
|
541
640
|
Lutaml::Model::Config::AVAILABLE_FORMATS.each do |format|
|
542
641
|
define_method(:"to_#{format}") do |options = {}|
|
543
642
|
adapter = Lutaml::Model::Config.public_send(:"#{format}_adapter")
|
@@ -548,6 +647,7 @@ module Lutaml
|
|
548
647
|
options)
|
549
648
|
end
|
550
649
|
|
650
|
+
options[:parse_encoding] = encoding if encoding
|
551
651
|
adapter.new(representation).public_send(:"to_#{format}", options)
|
552
652
|
end
|
553
653
|
end
|
@@ -34,10 +34,10 @@ module Lutaml
|
|
34
34
|
# value&.iso8601
|
35
35
|
# end
|
36
36
|
|
37
|
-
#
|
38
|
-
|
39
|
-
|
40
|
-
|
37
|
+
# YAML timestamp format (native)
|
38
|
+
def to_yaml
|
39
|
+
value&.iso8601
|
40
|
+
end
|
41
41
|
|
42
42
|
# # TOML time format (HH:MM:SS.mmm)
|
43
43
|
# def to_toml
|
data/lib/lutaml/model/utils.rb
CHANGED
@@ -4,9 +4,13 @@ module Lutaml
|
|
4
4
|
def validate
|
5
5
|
errors = []
|
6
6
|
self.class.attributes.each do |name, attr|
|
7
|
-
value =
|
7
|
+
value = public_send(:"#{name}")
|
8
8
|
begin
|
9
|
-
|
9
|
+
if value.respond_to?(:validate!)
|
10
|
+
value.validate!
|
11
|
+
else
|
12
|
+
attr.validate_value!(value)
|
13
|
+
end
|
10
14
|
rescue Lutaml::Model::InvalidValueError,
|
11
15
|
Lutaml::Model::CollectionCountOutOfRangeError,
|
12
16
|
PatternNotMatchedError => e
|
data/lib/lutaml/model/version.rb
CHANGED
@@ -51,6 +51,16 @@ module Lutaml
|
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
54
|
+
def add_xml_fragment(element, content)
|
55
|
+
if element.is_a?(self.class)
|
56
|
+
element = element.xml.parent
|
57
|
+
end
|
58
|
+
|
59
|
+
fragment = ::Nokogiri::XML::DocumentFragment.parse(content)
|
60
|
+
|
61
|
+
element.add_child(fragment)
|
62
|
+
end
|
63
|
+
|
54
64
|
def add_text(element, text, cdata: false)
|
55
65
|
return add_cdata(element, text) if cdata
|
56
66
|
|
@@ -66,10 +66,14 @@ module Lutaml
|
|
66
66
|
xml.text(text)
|
67
67
|
end
|
68
68
|
|
69
|
+
def add_xml_fragment(element, content)
|
70
|
+
element.raw(content)
|
71
|
+
end
|
72
|
+
|
69
73
|
def add_text(element, text, cdata: false)
|
70
74
|
return element.cdata(text) if cdata
|
71
75
|
|
72
|
-
element
|
76
|
+
element.text(text)
|
73
77
|
end
|
74
78
|
|
75
79
|
def add_cdata(element, value)
|
@@ -6,10 +6,10 @@ module Lutaml
|
|
6
6
|
module Model
|
7
7
|
module XmlAdapter
|
8
8
|
class NokogiriAdapter < XmlDocument
|
9
|
-
def self.parse(xml)
|
10
|
-
parsed = Nokogiri::XML(xml)
|
9
|
+
def self.parse(xml, options = {})
|
10
|
+
parsed = Nokogiri::XML(xml, nil, options[:encoding])
|
11
11
|
root = NokogiriElement.new(parsed.root)
|
12
|
-
new(root)
|
12
|
+
new(root, parsed.encoding)
|
13
13
|
end
|
14
14
|
|
15
15
|
def to_xml(options = {})
|
@@ -17,6 +17,8 @@ module Lutaml
|
|
17
17
|
|
18
18
|
if options.key?(:encoding)
|
19
19
|
builder_options[:encoding] = options[:encoding] unless options[:encoding].nil?
|
20
|
+
elsif options.key?(:parse_encoding)
|
21
|
+
builder_options[:encoding] = options[:parse_encoding]
|
20
22
|
else
|
21
23
|
builder_options[:encoding] = "UTF-8"
|
22
24
|
end
|