lutaml-model 0.3.28 → 0.3.30
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 +23 -16
- data/README.adoc +1 -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 +16 -14
- 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/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/xml_mapping.rb +19 -11
- 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/defaults_spec.rb +74 -0
- data/spec/lutaml/model/mixed_content_spec.rb +190 -7
- data/spec/lutaml/model/xml_mapping_spec.rb +679 -538
- metadata +6 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: cca2f0b92a3e71807ed2201909e02ea5877dc1468c34c62d887d523962e63968
|
|
4
|
+
data.tar.gz: 56fe25dc8f9229d2bcabe1315c88f0f7d8fb3a3ca5f01b78b0e6494fb65ebc75
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a6d19950a00e397146f8a8cfc8eeeb0e3c965f9fb7f5cb3bb5518cf636505f31ec72750552385b533d410eec51c6e325d0d57070fca52189ff00a48c8380c156
|
|
7
|
+
data.tar.gz: b7d55249da057ffe7f222c997ae4f628c7dd5acdeee9d7a1a5919f7f6d034ac5342b961696797029233dcd931a7db82be67f00f89a5b78463c3a7c101fbc3e4f
|
|
@@ -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
|
|
@@ -26,13 +26,12 @@ Lint/ConstantDefinitionInBlock:
|
|
|
26
26
|
- 'spec/lutaml/model/validation_spec.rb'
|
|
27
27
|
- 'spec/lutaml/model/xml_adapter/xml_namespace_spec.rb'
|
|
28
28
|
|
|
29
|
-
# Offense count:
|
|
29
|
+
# Offense count: 1
|
|
30
30
|
Lint/DuplicateMethods:
|
|
31
31
|
Exclude:
|
|
32
|
-
- 'lib/lutaml/model/attribute.rb'
|
|
33
32
|
- 'lib/lutaml/model/type/float.rb'
|
|
34
33
|
|
|
35
|
-
# Offense count:
|
|
34
|
+
# Offense count: 37
|
|
36
35
|
# Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes, Max.
|
|
37
36
|
Metrics/AbcSize:
|
|
38
37
|
Exclude:
|
|
@@ -45,15 +44,16 @@ Metrics/AbcSize:
|
|
|
45
44
|
- 'lib/lutaml/model/xml_adapter/nokogiri_adapter.rb'
|
|
46
45
|
- 'lib/lutaml/model/xml_adapter/ox_adapter.rb'
|
|
47
46
|
- 'lib/lutaml/model/xml_adapter/xml_document.rb'
|
|
47
|
+
- 'lib/lutaml/model/xml_mapping.rb'
|
|
48
48
|
- 'lib/lutaml/model/xml_mapping_rule.rb'
|
|
49
49
|
|
|
50
50
|
# Offense count: 6
|
|
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
|
-
# Offense count:
|
|
56
|
+
# Offense count: 28
|
|
57
57
|
# Configuration parameters: AllowedMethods, AllowedPatterns, Max.
|
|
58
58
|
Metrics/CyclomaticComplexity:
|
|
59
59
|
Exclude:
|
|
@@ -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
|
|
@@ -75,7 +75,7 @@ Metrics/MethodLength:
|
|
|
75
75
|
Metrics/ParameterLists:
|
|
76
76
|
Max: 14
|
|
77
77
|
|
|
78
|
-
# Offense count:
|
|
78
|
+
# Offense count: 25
|
|
79
79
|
# Configuration parameters: AllowedMethods, AllowedPatterns, Max.
|
|
80
80
|
Metrics/PerceivedComplexity:
|
|
81
81
|
Exclude:
|
|
@@ -87,7 +87,7 @@ Metrics/PerceivedComplexity:
|
|
|
87
87
|
- 'lib/lutaml/model/xml_adapter/ox_adapter.rb'
|
|
88
88
|
- 'lib/lutaml/model/xml_adapter/xml_document.rb'
|
|
89
89
|
|
|
90
|
-
# Offense count:
|
|
90
|
+
# Offense count: 8
|
|
91
91
|
# Configuration parameters: Prefixes, AllowedPatterns.
|
|
92
92
|
# Prefixes: when, with, without
|
|
93
93
|
RSpec/ContextWording:
|
|
@@ -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,16 +135,16 @@ 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
|
|
|
134
|
-
# Offense count:
|
|
142
|
+
# Offense count: 24
|
|
135
143
|
# Configuration parameters: AllowSubject.
|
|
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
|
|
@@ -154,10 +162,9 @@ RSpec/PendingWithoutReason:
|
|
|
154
162
|
- 'spec/lutaml/model/xml_adapter/xml_namespace_spec.rb'
|
|
155
163
|
- 'spec/lutaml/model/xml_adapter_spec.rb'
|
|
156
164
|
|
|
157
|
-
# Offense count:
|
|
165
|
+
# Offense count: 1
|
|
158
166
|
RSpec/RemoveConst:
|
|
159
167
|
Exclude:
|
|
160
|
-
- 'spec/lutaml/model/type/decimal_spec.rb'
|
|
161
168
|
- 'spec/lutaml/model/type_spec.rb'
|
|
162
169
|
|
|
163
170
|
# Offense count: 2
|
data/README.adoc
CHANGED
|
@@ -938,8 +938,7 @@ This includes:
|
|
|
938
938
|
* attributes
|
|
939
939
|
* text nodes
|
|
940
940
|
|
|
941
|
-
The `map_all` tag is **exclusive** and cannot be combined with other mappings
|
|
942
|
-
(`map_element`, `map_attribute`, `map_content`) for the same element, ensuring
|
|
941
|
+
The `map_all` tag is **exclusive** and cannot be combined with other mappings (`map_element`, `map_content`) except for `map_attribute` for the same element, ensuring
|
|
943
942
|
it captures the entire inner XML content.
|
|
944
943
|
|
|
945
944
|
NOTE: An error is raised if `map_all` is defined alongside any other mapping in
|
|
@@ -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|
|
|
@@ -101,23 +102,22 @@ module Lutaml
|
|
|
101
102
|
end
|
|
102
103
|
end
|
|
103
104
|
|
|
104
|
-
define_method(:"from_#{format}") do |data|
|
|
105
|
+
define_method(:"from_#{format}") do |data, options = {}|
|
|
105
106
|
adapter = Lutaml::Model::Config.send(:"#{format}_adapter")
|
|
106
107
|
|
|
107
|
-
doc = adapter.parse(data)
|
|
108
|
-
public_send(:"of_#{format}", doc)
|
|
108
|
+
doc = adapter.parse(data, options)
|
|
109
|
+
public_send(:"of_#{format}", doc, options)
|
|
109
110
|
end
|
|
110
111
|
|
|
111
|
-
define_method(:"of_#{format}") do |doc|
|
|
112
|
+
define_method(:"of_#{format}") do |doc, options = {}|
|
|
112
113
|
if doc.is_a?(Array)
|
|
113
|
-
return doc.map
|
|
114
|
-
send(:"of_#{format}", item)
|
|
115
|
-
end
|
|
114
|
+
return doc.map { |item| send(:"of_#{format}", item) }
|
|
116
115
|
end
|
|
117
116
|
|
|
118
117
|
if format == :xml
|
|
119
118
|
doc_hash = doc.parse_element(doc.root, self, :xml)
|
|
120
|
-
|
|
119
|
+
options[:encoding] = doc.encoding
|
|
120
|
+
apply_mappings(doc_hash, format, options)
|
|
121
121
|
else
|
|
122
122
|
apply_mappings(doc.to_h, format)
|
|
123
123
|
end
|
|
@@ -315,6 +315,7 @@ module Lutaml
|
|
|
315
315
|
end
|
|
316
316
|
|
|
317
317
|
def apply_xml_mapping(doc, instance, options = {})
|
|
318
|
+
instance.encoding = options[:encoding]
|
|
318
319
|
return instance unless doc
|
|
319
320
|
|
|
320
321
|
if options[:default_namespace].nil?
|
|
@@ -347,6 +348,8 @@ module Lutaml
|
|
|
347
348
|
mappings.each do |rule|
|
|
348
349
|
raise "Attribute '#{rule.to}' not found in #{self}" unless valid_rule?(rule)
|
|
349
350
|
|
|
351
|
+
attr = attribute_for_rule(rule)
|
|
352
|
+
|
|
350
353
|
value = if rule.raw_mapping?
|
|
351
354
|
doc.node.inner_xml
|
|
352
355
|
elsif rule.content_mapping?
|
|
@@ -355,10 +358,10 @@ module Lutaml
|
|
|
355
358
|
doc.fetch(rule.namespaced_name(options[:default_namespace]))
|
|
356
359
|
else
|
|
357
360
|
defaults_used << rule.to
|
|
358
|
-
rule.to_value_for(instance)
|
|
361
|
+
attr&.default || rule.to_value_for(instance)
|
|
359
362
|
end
|
|
360
363
|
|
|
361
|
-
value = normalize_xml_value(value, rule, options)
|
|
364
|
+
value = normalize_xml_value(value, rule, attr, options)
|
|
362
365
|
rule.deserialize(instance, value, attributes, self)
|
|
363
366
|
end
|
|
364
367
|
|
|
@@ -399,9 +402,7 @@ module Lutaml
|
|
|
399
402
|
instance
|
|
400
403
|
end
|
|
401
404
|
|
|
402
|
-
def normalize_xml_value(value, rule, options = {})
|
|
403
|
-
attr = attribute_for_rule(rule)
|
|
404
|
-
|
|
405
|
+
def normalize_xml_value(value, rule, attr, options = {})
|
|
405
406
|
value = [value].compact if attr&.collection? && !value.is_a?(Array)
|
|
406
407
|
|
|
407
408
|
value = if value.is_a?(Array)
|
|
@@ -459,7 +460,7 @@ module Lutaml
|
|
|
459
460
|
end
|
|
460
461
|
end
|
|
461
462
|
|
|
462
|
-
attr_accessor :element_order, :schema_location
|
|
463
|
+
attr_accessor :element_order, :schema_location, :encoding
|
|
463
464
|
attr_writer :ordered, :mixed
|
|
464
465
|
|
|
465
466
|
def initialize(attrs = {})
|
|
@@ -548,6 +549,7 @@ module Lutaml
|
|
|
548
549
|
options)
|
|
549
550
|
end
|
|
550
551
|
|
|
552
|
+
options[:parse_encoding] = encoding if encoding
|
|
551
553
|
adapter.new(representation).public_send(:"to_#{format}", options)
|
|
552
554
|
end
|
|
553
555
|
end
|
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
|
|
@@ -6,23 +6,28 @@ module Lutaml
|
|
|
6
6
|
module Model
|
|
7
7
|
module XmlAdapter
|
|
8
8
|
class OxAdapter < XmlDocument
|
|
9
|
-
def self.parse(xml)
|
|
9
|
+
def self.parse(xml, options = {})
|
|
10
|
+
Ox.default_options = Ox.default_options.merge(encoding: options[:encoding] || "UTF-8")
|
|
11
|
+
|
|
10
12
|
parsed = Ox.parse(xml)
|
|
11
13
|
root = OxElement.new(parsed)
|
|
12
|
-
new(root)
|
|
14
|
+
new(root, Ox.default_options[:encoding])
|
|
13
15
|
end
|
|
14
16
|
|
|
15
17
|
def to_xml(options = {})
|
|
16
|
-
builder = Builder::Ox.build
|
|
17
18
|
builder_options = { version: options[:version] }
|
|
18
19
|
|
|
19
|
-
if options.key?(:encoding)
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
builder_options[:encoding] = if options.key?(:encoding)
|
|
21
|
+
options[:encoding]
|
|
22
|
+
elsif options.key?(:parse_encoding)
|
|
23
|
+
options[:parse_encoding]
|
|
24
|
+
else
|
|
25
|
+
"UTF-8"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
builder = Builder::Ox.build
|
|
29
|
+
builder.xml.instruct(:xml, encoding: options[:parse_encoding])
|
|
24
30
|
|
|
25
|
-
builder.xml.instruct(:xml, builder_options)
|
|
26
31
|
if @root.is_a?(Lutaml::Model::XmlAdapter::OxElement)
|
|
27
32
|
@root.build_xml(builder)
|
|
28
33
|
elsif ordered?(@root, options)
|
|
@@ -34,7 +39,12 @@ module Lutaml
|
|
|
34
39
|
end
|
|
35
40
|
|
|
36
41
|
xml_data = builder.xml.to_s
|
|
37
|
-
|
|
42
|
+
if builder_options[:encoding] && xml_data.valid_encoding?
|
|
43
|
+
xml_data = xml_data.encode(builder_options[:encoding])
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
stripped_data = xml_data.lines.drop(1).join
|
|
47
|
+
options[:declaration] ? declaration(options) + stripped_data : stripped_data
|
|
38
48
|
end
|
|
39
49
|
|
|
40
50
|
private
|
|
@@ -145,6 +155,11 @@ module Lutaml
|
|
|
145
155
|
build_xml.xml.to_s
|
|
146
156
|
end
|
|
147
157
|
|
|
158
|
+
def inner_xml
|
|
159
|
+
# Ox builder by default, adds a newline at the end, so `chomp` is used
|
|
160
|
+
children.map { |child| child.to_xml.chomp }.join
|
|
161
|
+
end
|
|
162
|
+
|
|
148
163
|
def build_xml(builder = nil)
|
|
149
164
|
builder ||= Builder::Ox.build
|
|
150
165
|
attrs = build_attributes(self)
|
|
@@ -7,13 +7,14 @@ module Lutaml
|
|
|
7
7
|
module Model
|
|
8
8
|
module XmlAdapter
|
|
9
9
|
class XmlDocument
|
|
10
|
-
attr_reader :root
|
|
10
|
+
attr_reader :root, :encoding
|
|
11
11
|
|
|
12
|
-
def initialize(root)
|
|
12
|
+
def initialize(root, encoding = nil)
|
|
13
13
|
@root = root
|
|
14
|
+
@encoding = encoding
|
|
14
15
|
end
|
|
15
16
|
|
|
16
|
-
def self.parse(xml)
|
|
17
|
+
def self.parse(xml, _options = {})
|
|
17
18
|
raise NotImplementedError, "Subclasses must implement `parse`."
|
|
18
19
|
end
|
|
19
20
|
|
|
@@ -150,6 +151,8 @@ module Lutaml
|
|
|
150
151
|
value,
|
|
151
152
|
options.merge({ rule: rule, attribute: attribute }),
|
|
152
153
|
)
|
|
154
|
+
elsif rule.raw_mapping?
|
|
155
|
+
xml.add_xml_fragment(xml, value)
|
|
153
156
|
elsif rule.prefix_set?
|
|
154
157
|
xml.create_and_add_element(rule.name, prefix: prefix) do
|
|
155
158
|
add_value(xml, value, attribute, cdata: rule.cdata)
|
|
@@ -186,10 +189,6 @@ module Lutaml
|
|
|
186
189
|
attributes = build_attributes(element,
|
|
187
190
|
xml_mapping, options).merge(attributes)&.compact
|
|
188
191
|
|
|
189
|
-
if element.respond_to?(:schema_location) && element.schema_location
|
|
190
|
-
attributes.merge!(element.schema_location.to_xml_attributes)
|
|
191
|
-
end
|
|
192
|
-
|
|
193
192
|
prefix = if options.key?(:namespace_prefix)
|
|
194
193
|
options[:namespace_prefix]
|
|
195
194
|
elsif xml_mapping.namespace_prefix
|
|
@@ -210,7 +209,8 @@ module Lutaml
|
|
|
210
209
|
xml)
|
|
211
210
|
end
|
|
212
211
|
|
|
213
|
-
xml_mapping.elements
|
|
212
|
+
mappings = xml_mapping.elements + [xml_mapping.raw_mapping].compact
|
|
213
|
+
mappings.each do |element_rule|
|
|
214
214
|
attribute_def = attribute_definition_for(element, element_rule,
|
|
215
215
|
mapper_class: mapper_class)
|
|
216
216
|
|
|
@@ -234,20 +234,9 @@ module Lutaml
|
|
|
234
234
|
|
|
235
235
|
process_content_mapping(element, xml_mapping.content_mapping,
|
|
236
236
|
prefixed_xml)
|
|
237
|
-
|
|
238
|
-
process_raw_mapping(element, xml_mapping.raw_mapping, prefixed_xml)
|
|
239
237
|
end
|
|
240
238
|
end
|
|
241
239
|
|
|
242
|
-
def process_raw_mapping(element, rule, xml)
|
|
243
|
-
return unless rule
|
|
244
|
-
|
|
245
|
-
value = attribute_value_for(element, rule)
|
|
246
|
-
return unless render_element?(rule, element, value)
|
|
247
|
-
|
|
248
|
-
xml.add_text(xml, value, cdata: rule.cdata)
|
|
249
|
-
end
|
|
250
|
-
|
|
251
240
|
def process_content_mapping(element, content_rule, xml)
|
|
252
241
|
return unless content_rule
|
|
253
242
|
|
|
@@ -343,7 +332,7 @@ module Lutaml
|
|
|
343
332
|
{}
|
|
344
333
|
end
|
|
345
334
|
|
|
346
|
-
if element.respond_to?(:schema_location) && element.schema_location
|
|
335
|
+
if element.respond_to?(:schema_location) && element.schema_location && !options[:except]&.include?(:schema_location)
|
|
347
336
|
attrs.merge!(element.schema_location.to_xml_attributes)
|
|
348
337
|
end
|
|
349
338
|
|
|
@@ -355,10 +344,9 @@ module Lutaml
|
|
|
355
344
|
hash["xmlns:#{mapping_rule.prefix}"] = mapping_rule.namespace
|
|
356
345
|
end
|
|
357
346
|
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
hash[mapping_rule.prefixed_name] =
|
|
361
|
-
mapping_rule.to_value_for(element)
|
|
347
|
+
value = mapping_rule.to_value_for(element)
|
|
348
|
+
if render_element?(mapping_rule, element, value)
|
|
349
|
+
hash[mapping_rule.prefixed_name] = value ? value.to_s : value
|
|
362
350
|
end
|
|
363
351
|
end
|
|
364
352
|
|
|
@@ -3,6 +3,13 @@ require_relative "xml_mapping_rule"
|
|
|
3
3
|
module Lutaml
|
|
4
4
|
module Model
|
|
5
5
|
class XmlMapping
|
|
6
|
+
TYPES = {
|
|
7
|
+
attribute: :map_attribute,
|
|
8
|
+
element: :map_element,
|
|
9
|
+
content: :map_content,
|
|
10
|
+
all_content: :map_all,
|
|
11
|
+
}.freeze
|
|
12
|
+
|
|
6
13
|
attr_reader :root_element,
|
|
7
14
|
:namespace_uri,
|
|
8
15
|
:namespace_prefix,
|
|
@@ -53,7 +60,7 @@ module Lutaml
|
|
|
53
60
|
prefix: (prefix_set = false
|
|
54
61
|
nil)
|
|
55
62
|
)
|
|
56
|
-
validate!(name, to, with)
|
|
63
|
+
validate!(name, to, with, type: TYPES[:element])
|
|
57
64
|
|
|
58
65
|
rule = XmlMappingRule.new(
|
|
59
66
|
name,
|
|
@@ -84,7 +91,7 @@ module Lutaml
|
|
|
84
91
|
prefix: (prefix_set = false
|
|
85
92
|
nil)
|
|
86
93
|
)
|
|
87
|
-
validate!(name, to, with)
|
|
94
|
+
validate!(name, to, with, type: TYPES[:attribute])
|
|
88
95
|
|
|
89
96
|
rule = XmlMappingRule.new(
|
|
90
97
|
name,
|
|
@@ -114,7 +121,7 @@ module Lutaml
|
|
|
114
121
|
mixed: false,
|
|
115
122
|
cdata: false
|
|
116
123
|
)
|
|
117
|
-
validate!("content", to, with)
|
|
124
|
+
validate!("content", to, with, type: TYPES[:content])
|
|
118
125
|
|
|
119
126
|
@content_mapping = XmlMappingRule.new(
|
|
120
127
|
nil,
|
|
@@ -139,7 +146,7 @@ module Lutaml
|
|
|
139
146
|
prefix: (prefix_set = false
|
|
140
147
|
nil)
|
|
141
148
|
)
|
|
142
|
-
validate!("__raw_mapping", to, with)
|
|
149
|
+
validate!("__raw_mapping", to, with, type: TYPES[:all_content])
|
|
143
150
|
|
|
144
151
|
rule = XmlMappingRule.new(
|
|
145
152
|
"__raw_mapping",
|
|
@@ -158,8 +165,8 @@ module Lutaml
|
|
|
158
165
|
@raw_mapping = rule
|
|
159
166
|
end
|
|
160
167
|
|
|
161
|
-
def validate!(key, to, with)
|
|
162
|
-
validate_mappings!(
|
|
168
|
+
def validate!(key, to, with, type: nil)
|
|
169
|
+
validate_mappings!(type)
|
|
163
170
|
|
|
164
171
|
if to.nil? && with.empty?
|
|
165
172
|
msg = ":to or :with argument is required for mapping '#{key}'"
|
|
@@ -172,13 +179,14 @@ module Lutaml
|
|
|
172
179
|
end
|
|
173
180
|
end
|
|
174
181
|
|
|
175
|
-
def validate_mappings!(
|
|
176
|
-
|
|
177
|
-
raise StandardError, "
|
|
182
|
+
def validate_mappings!(type)
|
|
183
|
+
if !@raw_mapping.nil? && type != TYPES[:attribute]
|
|
184
|
+
raise StandardError, "#{type} is not allowed, only #{TYPES[:attribute]} " \
|
|
185
|
+
"is allowed with #{TYPES[:all_content]}"
|
|
178
186
|
end
|
|
179
187
|
|
|
180
|
-
if !
|
|
181
|
-
raise StandardError, "
|
|
188
|
+
if !(elements.empty? && content_mapping.nil?) && type == TYPES[:all_content]
|
|
189
|
+
raise StandardError, "#{TYPES[:all_content]} is not allowed with other mappings"
|
|
182
190
|
end
|
|
183
191
|
end
|
|
184
192
|
|