lutaml-model 0.3.26 → 0.3.27
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/README.adoc +63 -0
- data/lib/lutaml/model/version.rb +1 -1
- data/lib/lutaml/model/xml_adapter/nokogiri_adapter.rb +11 -4
- data/lib/lutaml/model/xml_adapter/ox_adapter.rb +8 -1
- data/lib/lutaml/model/xml_adapter/xml_document.rb +4 -3
- data/spec/lutaml/model/delegation_spec.rb +2 -2
- data/spec/lutaml/model/mixed_content_spec.rb +68 -1
- data/spec/lutaml/model/xml_mapping_spec.rb +68 -0
- 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: e00c3fab326d719d8341687a8411797d60ccaf54820380ba7a2dacead6a89792
|
4
|
+
data.tar.gz: e46c1dd3d50f6b2bea7da738d94ace488655205deb049170057490f6d1526bf8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ab260d59203839c5fd9b1aa670501c1953c741fe75f0f7ab7261795c54cd19ed6de9807f9b8252c83ce9eee8cf2e6a9116087066e464ca1f35b8b46e29082351
|
7
|
+
data.tar.gz: c579a87612ce8e249edcca0c79f0ee2550d40af899e31ee2405ffdd48509e584df449c19bb3489a6871cdf4dfc08c4bc51f482422ea9a7d91f02d706d653cac6
|
data/README.adoc
CHANGED
@@ -1302,6 +1302,69 @@ end
|
|
1302
1302
|
====
|
1303
1303
|
|
1304
1304
|
|
1305
|
+
==== Encoding Options in XmlAdapter
|
1306
|
+
|
1307
|
+
XmlAdapter supports the encoding in the following ways:
|
1308
|
+
|
1309
|
+
. When encoding is not passed in to_xml:
|
1310
|
+
** Default encoding is UTF-8.
|
1311
|
+
|
1312
|
+
. When encoding is explicitly passed nil:
|
1313
|
+
** Encoding will be nil, show the HexCode(Nokogiri) or ASCII-8bit(Ox).
|
1314
|
+
|
1315
|
+
. When encoding is passed with some option:
|
1316
|
+
** Encoding option will be selected as passed.
|
1317
|
+
|
1318
|
+
|
1319
|
+
Syntax:
|
1320
|
+
|
1321
|
+
[source,ruby]
|
1322
|
+
----
|
1323
|
+
Example.new(description: " ∑ is my ∏ moniker µ.").to_xml
|
1324
|
+
Example.new(description: " ∑ is my ∏ moniker µ.").to_xml(encoding: nil)
|
1325
|
+
Example.new(description: " ∑ is my ∏ moniker µ.").to_xml(encoding: "ASCII")
|
1326
|
+
----
|
1327
|
+
|
1328
|
+
[example]
|
1329
|
+
====
|
1330
|
+
The following class will parse the XML snippet below:
|
1331
|
+
|
1332
|
+
[source,ruby]
|
1333
|
+
----
|
1334
|
+
class Example < Lutaml::Model::Serializable
|
1335
|
+
attribute :name, :string
|
1336
|
+
attribute :description, :string
|
1337
|
+
attribute :value, :integer
|
1338
|
+
|
1339
|
+
xml do
|
1340
|
+
root 'example'
|
1341
|
+
map_element 'name', to: :name
|
1342
|
+
map_content to: :description
|
1343
|
+
end
|
1344
|
+
end
|
1345
|
+
----
|
1346
|
+
|
1347
|
+
[source,xml]
|
1348
|
+
----
|
1349
|
+
<example><name>John & Doe</name> ∑ is my ∏ moniker µ.</example>
|
1350
|
+
----
|
1351
|
+
|
1352
|
+
[source,ruby]
|
1353
|
+
----
|
1354
|
+
> Example.from_xml(xml)
|
1355
|
+
> #<Example:0x0000000104ac7240 @name="John & Doe", @description=" ∑ is my ∏ moniker µ.">
|
1356
|
+
> Example.new(name: "John & Doe", description: " ∑ is my ∏ moniker µ.").to_xml
|
1357
|
+
> #<example><name>John & Doe</name> ∑ is my ∏ moniker µ.</example>
|
1358
|
+
|
1359
|
+
> Example.new(name: "John & Doe", description: " ∑ is my ∏ moniker µ.").to_xml(encoding: nil)
|
1360
|
+
> #<example><name>John & Doe</name> ∑ is my ∏ moniker µ.</example>
|
1361
|
+
|
1362
|
+
> Example.new(name: "John & Doe", description: " ∑ is my ∏ moniker µ.").to_xml(encoding: "ASCII")
|
1363
|
+
> #<example><name>John & Doe</name> ∑ is my ∏ moniker µ.</example>
|
1364
|
+
----
|
1365
|
+
====
|
1366
|
+
|
1367
|
+
|
1305
1368
|
==== Namespaces
|
1306
1369
|
|
1307
1370
|
[[root-namespace]]
|
data/lib/lutaml/model/version.rb
CHANGED
@@ -13,7 +13,15 @@ module Lutaml
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def to_xml(options = {})
|
16
|
-
|
16
|
+
builder_options = {}
|
17
|
+
|
18
|
+
if options.key?(:encoding)
|
19
|
+
builder_options[:encoding] = options[:encoding] unless options[:encoding].nil?
|
20
|
+
else
|
21
|
+
builder_options[:encoding] = "UTF-8"
|
22
|
+
end
|
23
|
+
|
24
|
+
builder = Builder::Nokogiri.build(builder_options) do |xml|
|
17
25
|
if root.is_a?(Lutaml::Model::XmlAdapter::NokogiriElement)
|
18
26
|
root.build_xml(xml)
|
19
27
|
else
|
@@ -35,12 +43,11 @@ module Lutaml
|
|
35
43
|
|
36
44
|
def prefix_xml(xml, mapping, options)
|
37
45
|
if options.key?(:namespace_prefix)
|
38
|
-
options[:namespace_prefix]
|
46
|
+
xml[options[:namespace_prefix]] if options[:namespace_prefix]
|
39
47
|
elsif mapping.namespace_prefix
|
40
48
|
xml[mapping.namespace_prefix]
|
41
|
-
else
|
42
|
-
xml
|
43
49
|
end
|
50
|
+
xml
|
44
51
|
end
|
45
52
|
|
46
53
|
def build_ordered_element(xml, element, options = {})
|
@@ -14,8 +14,15 @@ module Lutaml
|
|
14
14
|
|
15
15
|
def to_xml(options = {})
|
16
16
|
builder = Builder::Ox.build
|
17
|
-
|
17
|
+
builder_options = { version: options[:version] }
|
18
18
|
|
19
|
+
if options.key?(:encoding)
|
20
|
+
builder_options[:encoding] = options[:encoding] unless options[:encoding].nil?
|
21
|
+
else
|
22
|
+
builder_options[:encoding] = "UTF-8"
|
23
|
+
end
|
24
|
+
|
25
|
+
builder.xml.instruct(:xml, builder_options)
|
19
26
|
if @root.is_a?(Lutaml::Model::XmlAdapter::OxElement)
|
20
27
|
@root.build_xml(builder)
|
21
28
|
elsif ordered?(@root, options)
|
@@ -66,7 +66,7 @@ module Lutaml
|
|
66
66
|
options[:tag_name] = rule.name
|
67
67
|
|
68
68
|
options[:mapper_class] = attribute&.type if attribute
|
69
|
-
options[:
|
69
|
+
options[:set_namespace] = set_namespace?(rule)
|
70
70
|
|
71
71
|
options
|
72
72
|
end
|
@@ -185,6 +185,7 @@ module Lutaml
|
|
185
185
|
attributes = options[:xml_attributes] ||= {}
|
186
186
|
attributes = build_attributes(element,
|
187
187
|
xml_mapping, options).merge(attributes)&.compact
|
188
|
+
|
188
189
|
if element.respond_to?(:schema_location) && element.schema_location
|
189
190
|
attributes.merge!(element.schema_location.to_xml_attributes)
|
190
191
|
end
|
@@ -275,7 +276,7 @@ module Lutaml
|
|
275
276
|
end
|
276
277
|
|
277
278
|
def set_namespace?(rule)
|
278
|
-
rule.nil? || !rule.namespace_set?
|
279
|
+
rule.nil? || !rule.namespace_set?
|
279
280
|
end
|
280
281
|
|
281
282
|
def render_element?(rule, element, value)
|
@@ -336,7 +337,7 @@ module Lutaml
|
|
336
337
|
end
|
337
338
|
|
338
339
|
def build_attributes(element, xml_mapping, options = {})
|
339
|
-
attrs = if options.fetch(:
|
340
|
+
attrs = if options.fetch(:set_namespace, true)
|
340
341
|
namespace_attributes(xml_mapping)
|
341
342
|
else
|
342
343
|
{}
|
@@ -148,11 +148,11 @@ RSpec.describe Delegation do
|
|
148
148
|
end
|
149
149
|
|
150
150
|
it "provides XML declaration with UTF-8 encoding" \
|
151
|
-
"if encoding:
|
151
|
+
"if encoding: 'UTF-8' option provided" do
|
152
152
|
xml_data = delegation.to_xml(
|
153
153
|
pretty: true,
|
154
154
|
declaration: true,
|
155
|
-
encoding:
|
155
|
+
encoding: "UTF-8",
|
156
156
|
)
|
157
157
|
expect(xml_data).to include('<?xml version="1.0" encoding="UTF-8"?>')
|
158
158
|
end
|
@@ -170,6 +170,15 @@ module MixedContentSpec
|
|
170
170
|
map_element :value, to: :value
|
171
171
|
end
|
172
172
|
end
|
173
|
+
|
174
|
+
class HexCode < Lutaml::Model::Serializable
|
175
|
+
attribute :content, :string
|
176
|
+
|
177
|
+
xml do
|
178
|
+
root "HexCode"
|
179
|
+
map_content to: :content
|
180
|
+
end
|
181
|
+
end
|
173
182
|
end
|
174
183
|
|
175
184
|
RSpec.describe "MixedContent" do
|
@@ -449,7 +458,7 @@ RSpec.describe "MixedContent" do
|
|
449
458
|
|
450
459
|
it "serializes special char mixed content correctly" do
|
451
460
|
parsed = MixedContentSpec::SpecialCharContentWithMixedTrue.from_xml(xml)
|
452
|
-
serialized = parsed.to_xml
|
461
|
+
serialized = parsed.to_xml(encoding: "UTF-8")
|
453
462
|
|
454
463
|
expect(serialized).to include(expected_xml)
|
455
464
|
end
|
@@ -608,10 +617,68 @@ RSpec.describe "MixedContent" do
|
|
608
617
|
end
|
609
618
|
end
|
610
619
|
end
|
620
|
+
|
621
|
+
context "when special char used as full entities, it persist as entities if no encoding provided" do
|
622
|
+
let(:xml) do
|
623
|
+
<<~XML
|
624
|
+
<HexCode>
|
625
|
+
∑computer security∏ type of ​ operation specified µ by an access right
|
626
|
+
</HexCode>
|
627
|
+
XML
|
628
|
+
end
|
629
|
+
|
630
|
+
describe ".from_xml" do
|
631
|
+
let(:expected_content) { "∑computer security∏ type of operation specified µ by an access right" }
|
632
|
+
|
633
|
+
it "deserializes special char mixed content correctly" do
|
634
|
+
parsed = MixedContentSpec::HexCode.from_xml(xml)
|
635
|
+
|
636
|
+
expect(parsed.content.strip).to eq(expected_content)
|
637
|
+
end
|
638
|
+
end
|
639
|
+
|
640
|
+
describe ".to_xml" do
|
641
|
+
context "when default encoding xml" do
|
642
|
+
let(:expected_default_encoding_xml) { "∑computer security∏ type of operation specified µ by an access right" }
|
643
|
+
|
644
|
+
it "serializes special char mixed content correctly with default encoding: UTF-8" do
|
645
|
+
parsed = MixedContentSpec::HexCode.from_xml(xml)
|
646
|
+
serialized = parsed.to_xml
|
647
|
+
|
648
|
+
expect(serialized.strip).to include(expected_default_encoding_xml)
|
649
|
+
end
|
650
|
+
end
|
651
|
+
|
652
|
+
context "when encoding: nil xml" do
|
653
|
+
let(:expected_encoding_nil_nokogiri_xml) { "∑computer security∏ type of ​ operation specified µ by an access right" }
|
654
|
+
let(:expected_encoding_nil_ox_xml) { "\xE2\x88\x91computer security\xE2\x88\x8F type of \xE2\x80\x8B operation specified \xC2\xB5 by an access right" }
|
655
|
+
|
656
|
+
it "serializes special char mixed content correctly with encoding: nil to get hexcode" do
|
657
|
+
parsed = MixedContentSpec::HexCode.from_xml(xml)
|
658
|
+
serialized = parsed.to_xml(encoding: nil)
|
659
|
+
|
660
|
+
if adapter_class == Lutaml::Model::XmlAdapter::OxAdapter
|
661
|
+
expected_output = expected_encoding_nil_ox_xml
|
662
|
+
expected_output.force_encoding("ASCII-8BIT")
|
663
|
+
else
|
664
|
+
expected_output = expected_encoding_nil_nokogiri_xml
|
665
|
+
end
|
666
|
+
|
667
|
+
expect(serialized.strip).to include(expected_output)
|
668
|
+
end
|
669
|
+
end
|
670
|
+
end
|
671
|
+
end
|
611
672
|
end
|
612
673
|
|
613
674
|
describe Lutaml::Model::XmlAdapter::NokogiriAdapter do
|
614
675
|
it_behaves_like "mixed content behavior", described_class
|
676
|
+
|
677
|
+
it "raises error when serializes special char content with false encoding: 'ABC'" do
|
678
|
+
parsed = MixedContentSpec::HexCode.from_xml("<HexCode>∑computer security</HexCode>")
|
679
|
+
|
680
|
+
expect { parsed.to_xml(encoding: "ABC") }.to raise_error(StandardError, "unknown encoding name - ABC")
|
681
|
+
end
|
615
682
|
end
|
616
683
|
|
617
684
|
describe Lutaml::Model::XmlAdapter::OxAdapter do
|
@@ -127,6 +127,17 @@ module XmlMapping
|
|
127
127
|
end
|
128
128
|
end
|
129
129
|
|
130
|
+
class OverrideDefaultNamespacePrefix < Lutaml::Model::Serializable
|
131
|
+
attribute :same_element_name, SameNameDifferentNamespace
|
132
|
+
|
133
|
+
xml do
|
134
|
+
root "OverrideDefaultNamespacePrefix"
|
135
|
+
map_element :SameElementName, to: :same_element_name,
|
136
|
+
namespace: "http://www.omg.org/spec/XMI/20131001",
|
137
|
+
prefix: "abc"
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
130
141
|
class SchemaLocationOrdered < Lutaml::Model::Serializable
|
131
142
|
attribute :content, :string
|
132
143
|
attribute :second, SchemaLocationOrdered
|
@@ -220,6 +231,30 @@ module XmlMapping
|
|
220
231
|
prefix: nil
|
221
232
|
end
|
222
233
|
end
|
234
|
+
|
235
|
+
class Documentation < Lutaml::Model::Serializable
|
236
|
+
attribute :content, :string
|
237
|
+
|
238
|
+
xml do
|
239
|
+
root "documentation", mixed: true
|
240
|
+
namespace "http://www.w3.org/2001/XMLSchema", "xsd"
|
241
|
+
|
242
|
+
map_content to: :content
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
class Schema < Lutaml::Model::Serializable
|
247
|
+
attribute :documentation, Documentation, collection: true
|
248
|
+
|
249
|
+
xml do
|
250
|
+
root "schema"
|
251
|
+
namespace "http://www.w3.org/2001/XMLSchema", "xsd"
|
252
|
+
|
253
|
+
map_element :documentation, to: :documentation,
|
254
|
+
namespace: "http://www.w3.org/2001/XMLSchema",
|
255
|
+
prefix: "xsd"
|
256
|
+
end
|
257
|
+
end
|
223
258
|
end
|
224
259
|
|
225
260
|
RSpec.describe Lutaml::Model::XmlMapping do
|
@@ -245,6 +280,25 @@ RSpec.describe Lutaml::Model::XmlMapping do
|
|
245
280
|
end
|
246
281
|
end
|
247
282
|
|
283
|
+
context "overriding child namespace prefix" do
|
284
|
+
let(:input_xml) do
|
285
|
+
<<~XML
|
286
|
+
<OverrideDefaultNamespacePrefix xmlns:abc="http://www.omg.org/spec/XMI/20131001" xmlns:GML="http://www.sparxsystems.com/profiles/GML/1.0" xmlns:CityGML="http://www.sparxsystems.com/profiles/CityGML/1.0">
|
287
|
+
<abc:SameElementName App="hello">
|
288
|
+
<GML:ApplicationSchema>GML App</GML:ApplicationSchema>
|
289
|
+
<CityGML:ApplicationSchema>CityGML App</CityGML:ApplicationSchema>
|
290
|
+
<abc:ApplicationSchema>App</abc:ApplicationSchema>
|
291
|
+
</abc:SameElementName>
|
292
|
+
</OverrideDefaultNamespacePrefix>
|
293
|
+
XML
|
294
|
+
end
|
295
|
+
|
296
|
+
it "expect to round-trips" do
|
297
|
+
parsed = XmlMapping::OverrideDefaultNamespacePrefix.from_xml(input_xml)
|
298
|
+
expect(parsed.to_xml).to be_equivalent_to(input_xml)
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
248
302
|
context "with same name elements" do
|
249
303
|
let(:input_xml) do
|
250
304
|
<<~XML
|
@@ -859,5 +913,19 @@ RSpec.describe Lutaml::Model::XmlMapping do
|
|
859
913
|
expect(XmlMapping::SpecialCharContentWithMapAll.from_xml(xml).to_xml).to eq(expected_xml)
|
860
914
|
end
|
861
915
|
end
|
916
|
+
|
917
|
+
context "when mixed content is true and child is content_mapping" do
|
918
|
+
let(:xml) do
|
919
|
+
<<~XML
|
920
|
+
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
921
|
+
<xsd:documentation>asdf</xsd:documentation>
|
922
|
+
</xsd:schema>
|
923
|
+
XML
|
924
|
+
end
|
925
|
+
|
926
|
+
it "round-trips xml" do
|
927
|
+
expect(XmlMapping::Schema.from_xml(xml).to_xml).to be_equivalent_to(xml)
|
928
|
+
end
|
929
|
+
end
|
862
930
|
end
|
863
931
|
end
|
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.27
|
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-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|