lutaml-model 0.3.21 → 0.3.23
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 +5 -5
- data/README.adoc +19 -16
- data/lib/lutaml/model/attribute.rb +5 -4
- data/lib/lutaml/model/serialize.rb +17 -13
- data/lib/lutaml/model/version.rb +1 -1
- data/lib/lutaml/model/xml_adapter/builder/nokogiri.rb +1 -1
- data/lib/lutaml/model/xml_adapter/nokogiri_adapter.rb +7 -3
- data/lib/lutaml/model/xml_adapter/xml_document.rb +18 -8
- data/lib/lutaml/model/xml_mapping.rb +6 -3
- data/lib/lutaml/model/xml_mapping_rule.rb +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e7e401ce23a01b4dc80f709b71326b598cb9b9024b81d2a94f501bebf8112a14
|
4
|
+
data.tar.gz: 30534172ee835a9170e4335029702ec87ec4225c52e9e09566cb694fbd9c258d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ce9d2be7aac031cba94181053fa59f19cb61ed6fafbdda177bec369a03fd92d53dcfc9caf43a34ebb439c7d69d2bf3f0db1a56a49e5cc34021a8fe4a0fc7fe25
|
7
|
+
data.tar.gz: 187168f579188ad1458013375fd5bacb6718dbb29d77994229c1c11fb14bcec5df8bae8bcfbe42dc3e57a5918c663741df7168338a2df36869562613aa06d149
|
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-11-03 22:29:56 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: 124
|
10
10
|
# This cop supports safe autocorrection (--autocorrect).
|
11
11
|
# Configuration parameters: Max, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns.
|
12
12
|
# URISchemes: http, https
|
@@ -46,7 +46,7 @@ Metrics/AbcSize:
|
|
46
46
|
- 'lib/lutaml/model/xml_adapter/xml_document.rb'
|
47
47
|
- 'lib/lutaml/model/xml_mapping_rule.rb'
|
48
48
|
|
49
|
-
# Offense count:
|
49
|
+
# Offense count: 6
|
50
50
|
# Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns, inherit_mode.
|
51
51
|
# AllowedMethods: refine
|
52
52
|
Metrics/BlockLength:
|
@@ -67,7 +67,7 @@ Metrics/CyclomaticComplexity:
|
|
67
67
|
# Offense count: 51
|
68
68
|
# Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns.
|
69
69
|
Metrics/MethodLength:
|
70
|
-
Max:
|
70
|
+
Max: 46
|
71
71
|
|
72
72
|
# Offense count: 7
|
73
73
|
# Configuration parameters: CountKeywordArgs, MaxOptionalParameters.
|
@@ -95,7 +95,7 @@ RSpec/ContextWording:
|
|
95
95
|
- 'spec/lutaml/model/xml_adapter/xml_namespace_spec.rb'
|
96
96
|
- 'spec/lutaml/model/xml_mapping_spec.rb'
|
97
97
|
|
98
|
-
# Offense count:
|
98
|
+
# Offense count: 110
|
99
99
|
# Configuration parameters: CountAsOne.
|
100
100
|
RSpec/ExampleLength:
|
101
101
|
Max: 54
|
data/README.adoc
CHANGED
@@ -157,22 +157,27 @@ Syntax:
|
|
157
157
|
attribute :name_of_attribute, {symbol | string | class}
|
158
158
|
----
|
159
159
|
|
160
|
+
.Mapping between Lutaml::Model::Type classes, Ruby equivalents and serialization format types
|
160
161
|
|===
|
161
|
-
|
|
162
|
-
|
163
|
-
| `String` |
|
164
|
-
| `Integer`
|
165
|
-
| `Float` |
|
166
|
-
| `
|
167
|
-
| `
|
168
|
-
| `
|
169
|
-
| `
|
170
|
-
| `
|
171
|
-
| `
|
172
|
-
| `Hash` |
|
162
|
+
| Lutaml::Model::Type | Ruby Class | XML | JSON | YAML | Example Value
|
163
|
+
|
164
|
+
| `:string` | `String` | `xs:string` | `string` | `string` | `"text"`
|
165
|
+
| `:integer` | `Integer` | `xs:integer` | `number` | `integer` | `42`
|
166
|
+
| `:float` | `Float` | `xs:decimal` | `number` | `float` | `3.14`
|
167
|
+
| `:boolean` | `TrueClass`/`FalseClass` | `xs:boolean` | `boolean` | `boolean` | `true/false`
|
168
|
+
| `:date` | `Date` | `xs:date` | `string` (ISO8601) | `date` | `"2024-01-01"`
|
169
|
+
| `:time_without_date` | `Time` | `xs:time` | `string` (ISO8601) | `time` | `"12:34:56"`
|
170
|
+
| `:date_time` | `DateTime` | `xs:dateTime` | `string` (ISO8601) | `timestamp` | `"2024-01-01T00:00:00Z"`
|
171
|
+
| `:time` | `Time` | `xs:dateTime` | `string` (ISO8601) | `timestamp` | `"2024-01-01T00:00:00Z"`
|
172
|
+
| `:decimal` (optional) | `BigDecimal` | `xs:decimal` | `number` | `float` | `123.45`
|
173
|
+
| `:hash` | `Hash` | complex element | `object` | `map` | `{key: "value"}`
|
174
|
+
| `class` | Custom Class | complex element | `object` | `map` | `CustomObject`
|
175
|
+
| `collection: true` | `Array` of Type | repeated elements | `array` | `sequence` | `[obj1, obj2]`
|
176
|
+
// | `any`
|
173
177
|
|
174
178
|
|===
|
175
179
|
|
180
|
+
|
176
181
|
.Defining attributes with supported types via symbol, string and class
|
177
182
|
[example]
|
178
183
|
====
|
@@ -538,8 +543,7 @@ For the following xml
|
|
538
543
|
@description="\n A <b>fictional person</b> commonly used as a <i>placeholder name</i>.\n ",
|
539
544
|
@element_order=["text", "name", "text", "description", "text"],
|
540
545
|
@name="John Doe",
|
541
|
-
@ordered=nil
|
542
|
-
@validate_on_set=false>
|
546
|
+
@ordered=nil>
|
543
547
|
----
|
544
548
|
====
|
545
549
|
|
@@ -1774,8 +1778,7 @@ end
|
|
1774
1778
|
@name="Masterpiece: Vase",
|
1775
1779
|
@ordered=nil,
|
1776
1780
|
@size=12,
|
1777
|
-
@description="A beautiful ceramic vase"
|
1778
|
-
@validate_on_set=false>
|
1781
|
+
@description="A beautiful ceramic vase">
|
1779
1782
|
> puts CustomCeramic.new(name: "Vase", size: 12, description: "A beautiful vase").to_xml
|
1780
1783
|
# <CustomCeramic Size="15">
|
1781
1784
|
# <Name>XML Masterpiece: Vase</Name>
|
@@ -200,11 +200,10 @@ module Lutaml
|
|
200
200
|
|
201
201
|
def cast(value, format, options = {})
|
202
202
|
value ||= [] if collection?
|
203
|
-
instance = options[:instance]
|
204
203
|
|
205
204
|
if value.is_a?(Array)
|
206
205
|
value.map do |v|
|
207
|
-
cast(v, format,
|
206
|
+
cast(v, format, options)
|
208
207
|
end
|
209
208
|
elsif type <= Serialize && value.is_a?(Hash)
|
210
209
|
type.apply_mappings(value, format, options)
|
@@ -217,7 +216,8 @@ module Lutaml
|
|
217
216
|
|
218
217
|
def validate_options!(options)
|
219
218
|
if (invalid_opts = options.keys - ALLOWED_OPTIONS).any?
|
220
|
-
raise StandardError,
|
219
|
+
raise StandardError,
|
220
|
+
"Invalid options given for `#{name}` #{invalid_opts}"
|
221
221
|
end
|
222
222
|
end
|
223
223
|
|
@@ -225,7 +225,8 @@ module Lutaml
|
|
225
225
|
return true if type.is_a?(Class)
|
226
226
|
return true if [Symbol, String].include?(type.class) && cast_type!(type)
|
227
227
|
|
228
|
-
raise ArgumentError,
|
228
|
+
raise ArgumentError,
|
229
|
+
"Invalid type: #{type}, must be a Symbol, String or a Class"
|
229
230
|
end
|
230
231
|
end
|
231
232
|
end
|
@@ -32,9 +32,10 @@ module Lutaml
|
|
32
32
|
@mappings ||= {}
|
33
33
|
@attributes ||= {}
|
34
34
|
|
35
|
-
subclass.instance_variable_set(:@attributes,
|
35
|
+
subclass.instance_variable_set(:@attributes,
|
36
|
+
Utils.deep_dup(@attributes))
|
36
37
|
subclass.instance_variable_set(:@mappings, Utils.deep_dup(@mappings))
|
37
|
-
subclass.instance_variable_set(:@model, subclass)
|
38
|
+
subclass.instance_variable_set(:@model, @model || subclass)
|
38
39
|
end
|
39
40
|
|
40
41
|
def model(klass = nil)
|
@@ -51,17 +52,20 @@ module Lutaml
|
|
51
52
|
Utils.add_boolean_accessor_if_not_defined(klass, :mixed)
|
52
53
|
Utils.add_accessor_if_not_defined(klass, :element_order)
|
53
54
|
|
54
|
-
Utils.add_method_if_not_defined(klass,
|
55
|
+
Utils.add_method_if_not_defined(klass,
|
56
|
+
:using_default_for) do |attribute_name|
|
55
57
|
@using_default ||= {}
|
56
58
|
@using_default[attribute_name] = true
|
57
59
|
end
|
58
60
|
|
59
|
-
Utils.add_method_if_not_defined(klass,
|
61
|
+
Utils.add_method_if_not_defined(klass,
|
62
|
+
:value_set_for) do |attribute_name|
|
60
63
|
@using_default ||= {}
|
61
64
|
@using_default[attribute_name] = false
|
62
65
|
end
|
63
66
|
|
64
|
-
Utils.add_method_if_not_defined(klass,
|
67
|
+
Utils.add_method_if_not_defined(klass,
|
68
|
+
:using_default?) do |attribute_name|
|
65
69
|
@using_default ||= {}
|
66
70
|
!!@using_default[attribute_name]
|
67
71
|
end
|
@@ -306,6 +310,7 @@ module Lutaml
|
|
306
310
|
def apply_xml_mapping(doc, instance, options = {})
|
307
311
|
return instance unless doc
|
308
312
|
|
313
|
+
options[:default_namespace] = mappings_for(:xml)&.namespace_uri if options[:default_namespace].nil?
|
309
314
|
mappings = mappings_for(:xml).mappings
|
310
315
|
|
311
316
|
if doc.is_a?(Array)
|
@@ -336,14 +341,14 @@ module Lutaml
|
|
336
341
|
doc.node.inner_xml
|
337
342
|
elsif rule.content_mapping?
|
338
343
|
doc["text"]
|
339
|
-
elsif doc.key_exist?(rule.namespaced_name)
|
340
|
-
doc.fetch(rule.namespaced_name)
|
344
|
+
elsif doc.key_exist?(rule.namespaced_name(options[:default_namespace]))
|
345
|
+
doc.fetch(rule.namespaced_name(options[:default_namespace]))
|
341
346
|
else
|
342
347
|
defaults_used << rule.to
|
343
348
|
rule.to_value_for(instance)
|
344
349
|
end
|
345
350
|
|
346
|
-
value = normalize_xml_value(value, rule)
|
351
|
+
value = normalize_xml_value(value, rule, options)
|
347
352
|
rule.deserialize(instance, value, attributes, self)
|
348
353
|
end
|
349
354
|
|
@@ -384,7 +389,7 @@ module Lutaml
|
|
384
389
|
instance
|
385
390
|
end
|
386
391
|
|
387
|
-
def normalize_xml_value(value, rule)
|
392
|
+
def normalize_xml_value(value, rule, options = {})
|
388
393
|
attr = attribute_for_rule(rule)
|
389
394
|
|
390
395
|
value = [value].compact if attr&.collection? && !value.is_a?(Array)
|
@@ -401,11 +406,11 @@ module Lutaml
|
|
401
406
|
|
402
407
|
return value unless cast_value?(attr, rule)
|
403
408
|
|
409
|
+
options.merge(caller_class: self, mixed_content: rule.mixed_content)
|
404
410
|
attr.cast(
|
405
411
|
value,
|
406
412
|
:xml,
|
407
|
-
|
408
|
-
mixed_content: rule.mixed_content,
|
413
|
+
options,
|
409
414
|
)
|
410
415
|
end
|
411
416
|
|
@@ -446,8 +451,7 @@ module Lutaml
|
|
446
451
|
attr_writer :ordered, :mixed
|
447
452
|
|
448
453
|
def initialize(attrs = {})
|
449
|
-
@
|
450
|
-
@using_default ||= {}
|
454
|
+
@using_default = {}
|
451
455
|
|
452
456
|
return unless self.class.attributes
|
453
457
|
|
data/lib/lutaml/model/version.rb
CHANGED
@@ -128,12 +128,15 @@ module Lutaml
|
|
128
128
|
)
|
129
129
|
end
|
130
130
|
|
131
|
-
|
131
|
+
if root_node.nil? && !node.namespace&.prefix
|
132
|
+
default_namespace = node.namespace&.href
|
133
|
+
end
|
132
134
|
|
133
135
|
super(
|
134
136
|
node,
|
135
137
|
attributes,
|
136
|
-
parse_all_children(node, root_node: root_node || self,
|
138
|
+
parse_all_children(node, root_node: root_node || self,
|
139
|
+
default_namespace: default_namespace),
|
137
140
|
node.text,
|
138
141
|
parent_document: root_node,
|
139
142
|
namespace_prefix: node.namespace&.prefix,
|
@@ -182,7 +185,8 @@ module Lutaml
|
|
182
185
|
|
183
186
|
def parse_all_children(node, root_node: nil, default_namespace: nil)
|
184
187
|
node.children.map do |child|
|
185
|
-
NokogiriElement.new(child, root_node: root_node,
|
188
|
+
NokogiriElement.new(child, root_node: root_node,
|
189
|
+
default_namespace: default_namespace)
|
186
190
|
end
|
187
191
|
end
|
188
192
|
|
@@ -77,7 +77,10 @@ module Lutaml
|
|
77
77
|
result.item_order = element.order
|
78
78
|
|
79
79
|
element.children.each_with_object(result) do |child, hash|
|
80
|
-
|
80
|
+
if klass&.<= Serialize
|
81
|
+
attr = klass.attribute_for_child(child.name,
|
82
|
+
format)
|
83
|
+
end
|
81
84
|
|
82
85
|
value = if child.text?
|
83
86
|
child.text
|
@@ -136,7 +139,8 @@ module Lutaml
|
|
136
139
|
rule = options[:rule]
|
137
140
|
|
138
141
|
if rule.custom_methods[:to]
|
139
|
-
options[:mapper_class].new.send(rule.custom_methods[:to], element,
|
142
|
+
options[:mapper_class].new.send(rule.custom_methods[:to], element,
|
143
|
+
xml.parent, xml)
|
140
144
|
return
|
141
145
|
end
|
142
146
|
|
@@ -203,7 +207,8 @@ module Lutaml
|
|
203
207
|
end
|
204
208
|
|
205
209
|
xml_mapping.attributes.each do |attribute_rule|
|
206
|
-
attribute_rule.serialize_attribute(element, prefixed_xml.parent,
|
210
|
+
attribute_rule.serialize_attribute(element, prefixed_xml.parent,
|
211
|
+
xml)
|
207
212
|
end
|
208
213
|
|
209
214
|
xml_mapping.elements.each do |element_rule|
|
@@ -223,11 +228,13 @@ module Lutaml
|
|
223
228
|
element,
|
224
229
|
element_rule.prefix,
|
225
230
|
value,
|
226
|
-
options.merge({ attribute: attribute_def, rule: element_rule,
|
231
|
+
options.merge({ attribute: attribute_def, rule: element_rule,
|
232
|
+
mapper_class: mapper_class }),
|
227
233
|
)
|
228
234
|
end
|
229
235
|
|
230
|
-
process_content_mapping(element, xml_mapping.content_mapping,
|
236
|
+
process_content_mapping(element, xml_mapping.content_mapping,
|
237
|
+
prefixed_xml)
|
231
238
|
|
232
239
|
process_raw_mapping(element, xml_mapping.raw_mapping, prefixed_xml)
|
233
240
|
end
|
@@ -318,7 +325,8 @@ module Lutaml
|
|
318
325
|
next unless type
|
319
326
|
|
320
327
|
if type <= Lutaml::Model::Serialize
|
321
|
-
attrs = attrs.merge(build_namespace_attributes(type, processed,
|
328
|
+
attrs = attrs.merge(build_namespace_attributes(type, processed,
|
329
|
+
{ caller_rule: mapping_rule }))
|
322
330
|
end
|
323
331
|
|
324
332
|
if mapping_rule.namespace && mapping_rule.prefix && mapping_rule.name != "lang"
|
@@ -348,8 +356,10 @@ module Lutaml
|
|
348
356
|
hash["xmlns:#{mapping_rule.prefix}"] = mapping_rule.namespace
|
349
357
|
end
|
350
358
|
|
351
|
-
if render_element?(mapping_rule, element,
|
352
|
-
|
359
|
+
if render_element?(mapping_rule, element,
|
360
|
+
mapping_rule.to_value_for(element))
|
361
|
+
hash[mapping_rule.prefixed_name] =
|
362
|
+
mapping_rule.to_value_for(element)
|
353
363
|
end
|
354
364
|
end
|
355
365
|
|
@@ -222,12 +222,15 @@ module Lutaml
|
|
222
222
|
|
223
223
|
def deep_dup
|
224
224
|
self.class.new.tap do |xml_mapping|
|
225
|
-
xml_mapping.root(@root_element.dup, mixed: @mixed_content,
|
225
|
+
xml_mapping.root(@root_element.dup, mixed: @mixed_content,
|
226
|
+
ordered: @ordered)
|
226
227
|
xml_mapping.namespace(@namespace_uri.dup, @namespace_prefix.dup)
|
227
228
|
|
228
|
-
xml_mapping.instance_variable_set(:@attributes,
|
229
|
+
xml_mapping.instance_variable_set(:@attributes,
|
230
|
+
dup_mappings(@attributes))
|
229
231
|
xml_mapping.instance_variable_set(:@elements, dup_mappings(@elements))
|
230
|
-
xml_mapping.instance_variable_set(:@content_mapping,
|
232
|
+
xml_mapping.instance_variable_set(:@content_mapping,
|
233
|
+
@content_mapping&.deep_dup)
|
231
234
|
end
|
232
235
|
end
|
233
236
|
|
@@ -73,7 +73,7 @@ module Lutaml
|
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
76
|
-
def namespaced_name
|
76
|
+
def namespaced_name(parent_namespace = nil)
|
77
77
|
if name == "lang"
|
78
78
|
"#{prefix}:#{name}"
|
79
79
|
elsif namespace_set? || @attribute
|
@@ -81,7 +81,7 @@ module Lutaml
|
|
81
81
|
elsif default_namespace
|
82
82
|
"#{default_namespace}:#{name}"
|
83
83
|
else
|
84
|
-
name
|
84
|
+
[parent_namespace, name].compact.join(":")
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lutaml-model
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.23
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ribose Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-11-
|
11
|
+
date: 2024-11-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|