lutaml-model 0.5.4 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +58 -21
  3. data/Gemfile +1 -0
  4. data/README.adoc +1112 -264
  5. data/lib/lutaml/model/attribute.rb +33 -10
  6. data/lib/lutaml/model/choice.rb +56 -0
  7. data/lib/lutaml/model/config.rb +1 -0
  8. data/lib/lutaml/model/error/choice_lower_bound_error.rb +9 -0
  9. data/lib/lutaml/model/error/choice_upper_bound_error.rb +9 -0
  10. data/lib/lutaml/model/error/import_model_with_root_error.rb +9 -0
  11. data/lib/lutaml/model/error/incorrect_sequence_error.rb +9 -0
  12. data/lib/lutaml/model/error/invalid_choice_range_error.rb +20 -0
  13. data/lib/lutaml/model/error/no_root_mapping_error.rb +9 -0
  14. data/lib/lutaml/model/error/no_root_namespace_error.rb +9 -0
  15. data/lib/lutaml/model/error/unknown_sequence_mapping_error.rb +9 -0
  16. data/lib/lutaml/model/error.rb +8 -0
  17. data/lib/lutaml/model/json_adapter/standard_json_adapter.rb +6 -1
  18. data/lib/lutaml/model/key_value_mapping.rb +3 -1
  19. data/lib/lutaml/model/key_value_mapping_rule.rb +4 -2
  20. data/lib/lutaml/model/liquefiable.rb +59 -0
  21. data/lib/lutaml/model/mapping_hash.rb +1 -1
  22. data/lib/lutaml/model/mapping_rule.rb +15 -2
  23. data/lib/lutaml/model/schema/xml_compiler.rb +68 -26
  24. data/lib/lutaml/model/schema_location.rb +7 -0
  25. data/lib/lutaml/model/sequence.rb +71 -0
  26. data/lib/lutaml/model/serialize.rb +125 -35
  27. data/lib/lutaml/model/type/decimal.rb +0 -4
  28. data/lib/lutaml/model/type/time.rb +3 -3
  29. data/lib/lutaml/model/utils.rb +19 -15
  30. data/lib/lutaml/model/validation.rb +12 -1
  31. data/lib/lutaml/model/version.rb +1 -1
  32. data/lib/lutaml/model/xml_adapter/builder/oga.rb +10 -7
  33. data/lib/lutaml/model/xml_adapter/builder/ox.rb +20 -13
  34. data/lib/lutaml/model/xml_adapter/element.rb +32 -0
  35. data/lib/lutaml/model/xml_adapter/nokogiri_adapter.rb +8 -8
  36. data/lib/lutaml/model/xml_adapter/oga/element.rb +14 -13
  37. data/lib/lutaml/model/xml_adapter/oga_adapter.rb +86 -19
  38. data/lib/lutaml/model/xml_adapter/ox_adapter.rb +19 -15
  39. data/lib/lutaml/model/xml_adapter/xml_document.rb +74 -13
  40. data/lib/lutaml/model/xml_adapter/xml_element.rb +57 -3
  41. data/lib/lutaml/model/xml_mapping.rb +49 -7
  42. data/lib/lutaml/model/xml_mapping_rule.rb +8 -3
  43. data/lib/lutaml/model.rb +1 -0
  44. data/lutaml-model.gemspec +5 -0
  45. data/spec/benchmarks/xml_parsing_benchmark_spec.rb +75 -0
  46. data/spec/ceramic_spec.rb +39 -0
  47. data/spec/fixtures/ceramic.rb +23 -0
  48. data/spec/fixtures/xml/address_example_260.xsd +9 -0
  49. data/spec/fixtures/xml/user.xsd +10 -0
  50. data/spec/lutaml/model/cdata_spec.rb +4 -5
  51. data/spec/lutaml/model/choice_spec.rb +168 -0
  52. data/spec/lutaml/model/collection_spec.rb +1 -1
  53. data/spec/lutaml/model/custom_model_spec.rb +6 -7
  54. data/spec/lutaml/model/custom_serialization_spec.rb +74 -2
  55. data/spec/lutaml/model/defaults_spec.rb +3 -1
  56. data/spec/lutaml/model/delegation_spec.rb +7 -5
  57. data/spec/lutaml/model/enum_spec.rb +35 -0
  58. data/spec/lutaml/model/group_spec.rb +160 -0
  59. data/spec/lutaml/model/inheritance_spec.rb +25 -0
  60. data/spec/lutaml/model/liquefiable_spec.rb +121 -0
  61. data/spec/lutaml/model/mixed_content_spec.rb +80 -41
  62. data/spec/lutaml/model/multiple_mapping_spec.rb +22 -10
  63. data/spec/lutaml/model/schema/xml_compiler_spec.rb +218 -25
  64. data/spec/lutaml/model/sequence_spec.rb +216 -0
  65. data/spec/lutaml/model/transformation_spec.rb +230 -0
  66. data/spec/lutaml/model/type_spec.rb +138 -31
  67. data/spec/lutaml/model/utils_spec.rb +32 -0
  68. data/spec/lutaml/model/xml_adapter/oga_adapter_spec.rb +11 -7
  69. data/spec/lutaml/model/xml_mapping_rule_spec.rb +51 -0
  70. data/spec/lutaml/model/xml_mapping_spec.rb +143 -112
  71. metadata +67 -2
@@ -226,7 +226,8 @@ module XmlMapping
226
226
  xml do
227
227
  root "MapAllWithCustomMethod"
228
228
 
229
- map_all_content to: :all_content, with: { to: :content_to_xml, from: :content_from_xml }
229
+ map_all_content to: :all_content,
230
+ with: { to: :content_to_xml, from: :content_from_xml }
230
231
  end
231
232
 
232
233
  def content_to_xml(model, parent, doc)
@@ -344,6 +345,7 @@ RSpec.describe Lutaml::Model::XmlMapping do
344
345
 
345
346
  it "checks the attribute with and without namespace" do
346
347
  parsed = XmlMapping::AttributeNamespace.from_xml(input_xml)
348
+
347
349
  expect(parsed.alpha).to eq("hello")
348
350
  expect(parsed.beta).to eq("bye")
349
351
  expect(parsed.to_xml).to be_equivalent_to(input_xml)
@@ -382,12 +384,12 @@ RSpec.describe Lutaml::Model::XmlMapping do
382
384
  end
383
385
 
384
386
  let(:oga_expected_xml) do
385
- "<OverrideDefaultNamespacePrefix xmlns:abc=\"http://www.omg.org/spec/XMI/20131001\">" +
386
- "<abc:SameElementName App=\"hello\" xmlns:GML=\"http://www.sparxsystems.com/profiles/GML/1.0\" xmlns:CityGML=\"http://www.sparxsystems.com/profiles/CityGML/1.0\">" +
387
- "<GML:ApplicationSchema>GML App</GML:ApplicationSchema>" +
388
- "<CityGML:ApplicationSchema>CityGML App</CityGML:ApplicationSchema>" +
389
- "<abc:ApplicationSchema>App</abc:ApplicationSchema>" +
390
- "</abc:SameElementName>" +
387
+ "<OverrideDefaultNamespacePrefix xmlns:abc=\"http://www.omg.org/spec/XMI/20131001\">" \
388
+ "<abc:SameElementName App=\"hello\" xmlns:GML=\"http://www.sparxsystems.com/profiles/GML/1.0\" xmlns:CityGML=\"http://www.sparxsystems.com/profiles/CityGML/1.0\">" \
389
+ "<GML:ApplicationSchema>GML App</GML:ApplicationSchema>" \
390
+ "<CityGML:ApplicationSchema>CityGML App</CityGML:ApplicationSchema>" \
391
+ "<abc:ApplicationSchema>App</abc:ApplicationSchema>" \
392
+ "</abc:SameElementName>" \
391
393
  "</OverrideDefaultNamespacePrefix>"
392
394
  end
393
395
 
@@ -477,34 +479,38 @@ RSpec.describe Lutaml::Model::XmlMapping do
477
479
  end
478
480
 
479
481
  let(:expected_order) do
482
+ nokogiri_pattern = create_pattern_mapping([
483
+ ["Text", "text"],
484
+ ["Element", "ApplicationSchema"],
485
+ ["Text", "text"],
486
+ ["Element", "ApplicationSchema"],
487
+ ["Text", "text"],
488
+ ["Element", "ApplicationSchema"],
489
+ ["Text", "text"],
490
+ ])
491
+
492
+ oga_ox_pattern = create_pattern_mapping([
493
+ ["Element", "ApplicationSchema"],
494
+ ["Element", "ApplicationSchema"],
495
+ ["Element", "ApplicationSchema"],
496
+ ])
497
+
480
498
  {
481
- Lutaml::Model::XmlAdapter::NokogiriAdapter => [
482
- "text",
483
- "ApplicationSchema",
484
- "text",
485
- "ApplicationSchema",
486
- "text",
487
- "ApplicationSchema",
488
- "text",
489
- ],
490
- Lutaml::Model::XmlAdapter::OxAdapter => [
491
- "ApplicationSchema",
492
- "ApplicationSchema",
493
- "ApplicationSchema",
494
- ],
495
- Lutaml::Model::XmlAdapter::OgaAdapter => [
496
- "text",
497
- "ApplicationSchema",
498
- "text",
499
- "ApplicationSchema",
500
- "text",
501
- "ApplicationSchema",
502
- "text",
503
- ],
499
+ Lutaml::Model::XmlAdapter::NokogiriAdapter => nokogiri_pattern,
500
+ Lutaml::Model::XmlAdapter::OxAdapter => oga_ox_pattern,
501
+ Lutaml::Model::XmlAdapter::OgaAdapter => oga_ox_pattern,
504
502
  }
505
503
  end
506
504
 
507
- let(:parsed) { XmlMapping::SameNameDifferentNamespace.from_xml(input_xml) }
505
+ let(:parsed) do
506
+ XmlMapping::SameNameDifferentNamespace.from_xml(input_xml)
507
+ end
508
+
509
+ def create_pattern_mapping(array)
510
+ array.map do |type, text|
511
+ Lutaml::Model::XmlAdapter::Element.new(type, text)
512
+ end
513
+ end
508
514
 
509
515
  it "citygml_application_schema should be correct" do
510
516
  expect(parsed.citygml_application_schema).to eq("CityGML App")
@@ -652,7 +658,8 @@ RSpec.describe Lutaml::Model::XmlMapping do
652
658
 
653
659
  it "sets the namespace for individual elements" do
654
660
  expect(mapping.elements.size).to eq(3)
655
- expect(mapping.elements[0].namespace).to eq("https://example.com/ceramic/1.2")
661
+ expect(mapping.elements[0].namespace)
662
+ .to eq("https://example.com/ceramic/1.2")
656
663
  expect(mapping.elements[0].prefix).to eq("cera")
657
664
  expect(mapping.elements[1].delegate).to eq(:glaze)
658
665
  end
@@ -674,7 +681,8 @@ RSpec.describe Lutaml::Model::XmlMapping do
674
681
 
675
682
  it "sets the namespace for individual attributes" do
676
683
  expect(mapping.attributes.size).to eq(1)
677
- expect(mapping.attributes[0].namespace).to eq("https://example.com/ceramic/1.2")
684
+ expect(mapping.attributes[0].namespace)
685
+ .to eq("https://example.com/ceramic/1.2")
678
686
  expect(mapping.attributes[0].prefix).to eq("cera")
679
687
  end
680
688
  end
@@ -727,7 +735,7 @@ RSpec.describe Lutaml::Model::XmlMapping do
727
735
  error_regex = /\[Lutaml::Model\] WARN: `schemaLocation` is handled by default\. No need to explecitly define at `xml_mapping_spec.rb:\d+`/
728
736
 
729
737
  expect do
730
- Lutaml::Model::XmlMapping.new.map_attribute("schemaLocation", to: :schema_location)
738
+ mapping.map_attribute("schemaLocation", to: :schema_location)
731
739
  end.to output(error_regex).to_stderr
732
740
  end
733
741
  end
@@ -745,13 +753,32 @@ RSpec.describe Lutaml::Model::XmlMapping do
745
753
  XML
746
754
  end
747
755
 
756
+ let(:generated_xml) do
757
+ XmlMapping::SchemaLocationOrdered.from_xml(xml).to_xml
758
+ end
759
+
748
760
  it "contain schemaLocation attributes" do
749
- expect(XmlMapping::SchemaLocationOrdered.from_xml(xml).to_xml).to be_equivalent_to(xml)
761
+ expect(generated_xml).to be_equivalent_to(xml)
750
762
  end
751
763
  end
752
764
  end
753
765
 
754
766
  context "with multiple schemaLocations" do
767
+ let(:nested_schema_location) do
768
+ Lutaml::Model::SchemaLocation.new(
769
+ schema_location: "http://www.opengis.net/gml/3.7 http://schemas.opengis.net/gml/3.7.1/gml.xsd http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20070417/gmd/gmd.xsd",
770
+ prefix: "xsi",
771
+ namespace: "http://another-instance",
772
+ )
773
+ end
774
+
775
+ let(:schema_location) do
776
+ Lutaml::Model::SchemaLocation.new(
777
+ schema_location: "http://www.opengis.net/gml/3.2 http://schemas.opengis.net/gml/3.2.1/gml.xsd http://www.w3.org/1999/xlink http://www.w3.org/1999/xlink.xsd",
778
+ prefix: "xsi",
779
+ )
780
+ end
781
+
755
782
  let(:xml) do
756
783
  <<~XML
757
784
  <p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
@@ -764,60 +791,39 @@ RSpec.describe Lutaml::Model::XmlMapping do
764
791
  XML
765
792
  end
766
793
 
767
- it "parses and serializes multiple schemaLocation attributes" do
768
- parsed = Paragraph.from_xml(xml)
769
- expect(parsed.schema_location.size).to eq(2)
770
- expect(parsed.schema_location[0].namespace).to eq("http://www.opengis.net/gml/3.2")
771
- expect(parsed.schema_location[0].location).to eq("http://schemas.opengis.net/gml/3.2.1/gml.xsd")
772
- expect(parsed.schema_location[1].namespace).to eq("http://www.w3.org/1999/xlink")
773
- expect(parsed.schema_location[1].location).to eq("http://www.w3.org/1999/xlink.xsd")
794
+ context "when deserializing" do
795
+ let(:parsed) { Paragraph.from_xml(xml) }
774
796
 
775
- serialized = parsed.to_xml
776
- expect(serialized).to be_equivalent_to(xml)
777
- expect(serialized).to include('xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
778
- expect(serialized).to include('xsi:schemaLocation="http://www.opengis.net/gml/3.2 http://schemas.opengis.net/gml/3.2.1/gml.xsd http://www.w3.org/1999/xlink http://www.w3.org/1999/xlink.xsd"')
779
- end
797
+ it "parses correctly" do
798
+ expect(parsed.schema_location.size).to eq(2)
799
+ expect(parsed.schema_location[0]).to eq(schema_location[0])
800
+ expect(parsed.schema_location[1]).to eq(schema_location[1])
801
+ end
780
802
 
781
- it "handles nested elements with different schemaLocations" do
782
- parsed = Paragraph.from_xml(xml)
783
- nested_p = parsed.paragraph
803
+ it "parses nested correctly" do
804
+ nested_p = parsed.paragraph
784
805
 
785
- expect(nested_p).to be_a(Paragraph)
786
- expect(nested_p.schema_location.size).to eq(2)
787
- expect(nested_p.schema_location[0].namespace).to eq("http://www.opengis.net/gml/3.7")
788
- expect(nested_p.schema_location[0].location).to eq("http://schemas.opengis.net/gml/3.7.1/gml.xsd")
789
- expect(nested_p.schema_location[1].namespace).to eq("http://www.isotc211.org/2005/gmd")
790
- expect(nested_p.schema_location[1].location).to eq("http://schemas.opengis.net/iso/19139/20070417/gmd/gmd.xsd")
806
+ expect(nested_p.schema_location.size).to eq(2)
807
+ expect(nested_p.schema_location[0]).to eq(nested_schema_location[0])
808
+ expect(nested_p.schema_location[1]).to eq(nested_schema_location[1])
809
+ end
810
+ end
791
811
 
792
- serialized = parsed.to_xml
793
- expect(serialized).to include('xmlns:xsi="http://another-instance"')
794
- expect(serialized).to include('xsi:schemaLocation="http://www.opengis.net/gml/3.7 http://schemas.opengis.net/gml/3.7.1/gml.xsd http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20070417/gmd/gmd.xsd"')
795
- end
796
-
797
- it "creates XML with multiple schemaLocations" do
798
- paragraph = Paragraph.new(
799
- schema_location: Lutaml::Model::SchemaLocation.new(
800
- schema_location: {
801
- "http://www.opengis.net/gml/3.2" => "http://schemas.opengis.net/gml/3.2.1/gml.xsd",
802
- "http://www.w3.org/1999/xlink" => "http://www.w3.org/1999/xlink.xsd",
803
- },
804
- prefix: "xsi",
805
- ),
806
- paragraph: Paragraph.new(
807
- schema_location: Lutaml::Model::SchemaLocation.new(
808
- schema_location: {
809
- "http://www.opengis.net/gml/3.7" => "http://schemas.opengis.net/gml/3.7.1/gml.xsd",
810
- "http://www.isotc211.org/2005/gmd" => "http://schemas.opengis.net/iso/19139/20070417/gmd/gmd.xsd",
811
- },
812
- prefix: "xsi",
813
- namespace: "http://another-instance",
812
+ context "when serializing" do
813
+ let(:paragraph) do
814
+ Paragraph.new(
815
+ schema_location: schema_location,
816
+ paragraph: Paragraph.new(
817
+ schema_location: nested_schema_location,
818
+ text: ["Some text inside paragraph"],
814
819
  ),
815
- text: ["Some text inside paragraph"],
816
- ),
817
- )
820
+ )
821
+ end
818
822
 
819
- serialized = paragraph.to_xml
820
- expect(serialized).to be_equivalent_to(xml)
823
+ it "creates XML with multiple schemaLocations" do
824
+ serialized = paragraph.to_xml
825
+ expect(serialized).to be_equivalent_to(xml)
826
+ end
821
827
  end
822
828
  end
823
829
 
@@ -838,10 +844,10 @@ RSpec.describe Lutaml::Model::XmlMapping do
838
844
  end
839
845
 
840
846
  let(:expected_street) do
841
- if Lutaml::Model::Config.xml_adapter == Lutaml::Model::XmlAdapter::OxAdapter
842
- "<a>N</a>\n<p>adf</p>\n"
843
- else
847
+ if Lutaml::Model::Config.xml_adapter == Lutaml::Model::XmlAdapter::NokogiriAdapter
844
848
  "\n <a>N</a>\n <p>adf</p>\n "
849
+ else
850
+ "<a>N</a><p>adf</p>"
845
851
  end
846
852
  end
847
853
 
@@ -891,6 +897,16 @@ RSpec.describe Lutaml::Model::XmlMapping do
891
897
  orig_mappings.deep_dup
892
898
  end
893
899
 
900
+ XmlMapping::WithMapAll.mappings_for(:xml).instance_variables.each do |var|
901
+ it "duplicates #{var} correctly" do
902
+ orig_mapping = XmlMapping::WithMapAll.mappings_for(:xml)
903
+ dup_mappings = orig_mapping.deep_dup
904
+
905
+ expect(orig_mapping.instance_variable_get(var))
906
+ .to eq(dup_mappings.instance_variable_get(var))
907
+ end
908
+ end
909
+
894
910
  it "duplicates root_element" do
895
911
  orig_root = orig_mappings.root_element
896
912
  dup_root = dup_mappings.root_element
@@ -904,7 +920,8 @@ RSpec.describe Lutaml::Model::XmlMapping do
904
920
  dup_namespace_uri = dup_mappings.namespace_uri
905
921
 
906
922
  expect(orig_namespace_uri).to eq(dup_namespace_uri)
907
- expect(orig_namespace_uri.object_id).not_to eq(dup_namespace_uri.object_id)
923
+ expect(orig_namespace_uri.object_id)
924
+ .not_to eq(dup_namespace_uri.object_id)
908
925
  end
909
926
 
910
927
  it "duplicates namespace_prefix" do
@@ -912,7 +929,8 @@ RSpec.describe Lutaml::Model::XmlMapping do
912
929
  dup_namespace_prefix = dup_mappings.namespace_prefix
913
930
 
914
931
  expect(orig_namespace_prefix).to eq(dup_namespace_prefix)
915
- expect(orig_namespace_prefix.object_id).not_to eq(dup_namespace_prefix.object_id)
932
+ expect(orig_namespace_prefix.object_id)
933
+ .not_to eq(dup_namespace_prefix.object_id)
916
934
  end
917
935
 
918
936
  context "when duplicating mapping" do
@@ -924,7 +942,8 @@ RSpec.describe Lutaml::Model::XmlMapping do
924
942
  dup_custom_methods = dup_mapping.custom_methods
925
943
 
926
944
  expect(orig_custom_methods).to eq(dup_custom_methods)
927
- expect(orig_custom_methods.object_id).not_to eq(dup_custom_methods.object_id)
945
+ expect(orig_custom_methods.object_id)
946
+ .not_to eq(dup_custom_methods.object_id)
928
947
  end
929
948
 
930
949
  it "duplicates default_namespace" do
@@ -932,7 +951,8 @@ RSpec.describe Lutaml::Model::XmlMapping do
932
951
  dup_default_namespace = dup_mapping.default_namespace
933
952
 
934
953
  expect(orig_default_namespace).to eq(dup_default_namespace)
935
- expect(orig_default_namespace.object_id).not_to eq(dup_default_namespace.object_id)
954
+ expect(orig_default_namespace.object_id)
955
+ .not_to eq(dup_default_namespace.object_id)
936
956
  end
937
957
 
938
958
  it "duplicates delegate" do
@@ -1064,7 +1084,11 @@ RSpec.describe Lutaml::Model::XmlMapping do
1064
1084
  end
1065
1085
 
1066
1086
  it "maps all the content including tags" do
1067
- inner_xml = "Str<sub>2</sub>text<sup>1</sup>123"
1087
+ inner_xml = if adapter_class.type == "ox"
1088
+ "Str<sub>2</sub> text<sup>1</sup> 123"
1089
+ else
1090
+ "Str<sub>2</sub>text<sup>1</sup>123"
1091
+ end
1068
1092
  xml = "<WithMapAll>#{inner_xml}</WithMapAll>"
1069
1093
 
1070
1094
  parsed = XmlMapping::WithMapAll.from_xml(xml)
@@ -1085,12 +1109,6 @@ RSpec.describe Lutaml::Model::XmlMapping do
1085
1109
  DESCRIPTION
1086
1110
  end
1087
1111
 
1088
- let(:expected_description) do
1089
- <<~DESCRIPTION
1090
- I'm a <b>web developer</b> with <strong>years</strong> of <i>experience</i> in many programing languages.
1091
- DESCRIPTION
1092
- end
1093
-
1094
1112
  let(:xml) do
1095
1113
  <<~XML
1096
1114
  <WithNestedMapAll age="23">
@@ -1102,17 +1120,6 @@ RSpec.describe Lutaml::Model::XmlMapping do
1102
1120
  XML
1103
1121
  end
1104
1122
 
1105
- let(:expected_xml) do
1106
- <<~XML
1107
- <WithNestedMapAll age="23">
1108
- <name>John Doe</name>
1109
- <description>
1110
- #{expected_description}
1111
- </description>
1112
- </WithNestedMapAll>
1113
- XML
1114
- end
1115
-
1116
1123
  let(:parsed) do
1117
1124
  XmlMapping::WithNestedMapAll.from_xml(xml)
1118
1125
  end
@@ -1130,7 +1137,7 @@ RSpec.describe Lutaml::Model::XmlMapping do
1130
1137
  end
1131
1138
 
1132
1139
  it "round-trips xml" do
1133
- expect(parsed.to_xml).to be_equivalent_to(expected_xml)
1140
+ expect(parsed.to_xml).to be_equivalent_to(xml)
1134
1141
  end
1135
1142
  end
1136
1143
 
@@ -1157,6 +1164,16 @@ RSpec.describe Lutaml::Model::XmlMapping do
1157
1164
  XML
1158
1165
  end
1159
1166
 
1167
+ let(:expected_oga_xml) do
1168
+ <<~XML.strip
1169
+ <SpecialCharContentWithMapAll>
1170
+ B <p>R&amp;C</p>
1171
+ C <p>J—C</p>
1172
+ O <p>A &amp; B </p>
1173
+ F <p>Z © </p></SpecialCharContentWithMapAll>
1174
+ XML
1175
+ end
1176
+
1160
1177
  let(:expected_ox_xml) do
1161
1178
  "<SpecialCharContentWithMapAll> " \
1162
1179
  "B <p>R&amp;C</p> " \
@@ -1166,9 +1183,19 @@ RSpec.describe Lutaml::Model::XmlMapping do
1166
1183
  "</SpecialCharContentWithMapAll>\n"
1167
1184
  end
1168
1185
 
1186
+ let(:expected_xml) do
1187
+ if adapter_class.type == "ox"
1188
+ expected_ox_xml
1189
+ elsif adapter_class.type == "oga"
1190
+ expected_oga_xml
1191
+ else
1192
+ expected_nokogiri_xml
1193
+ end
1194
+ end
1195
+
1169
1196
  it "round-trips xml" do
1170
- expected_xml = adapter_class.type == "ox" ? expected_ox_xml : expected_nokogiri_xml
1171
- expect(XmlMapping::SpecialCharContentWithMapAll.from_xml(xml).to_xml).to eq(expected_xml)
1197
+ parsed = XmlMapping::SpecialCharContentWithMapAll.from_xml(xml)
1198
+ expect(parsed.to_xml).to eq(expected_xml)
1172
1199
  end
1173
1200
  end
1174
1201
 
@@ -1181,8 +1208,12 @@ RSpec.describe Lutaml::Model::XmlMapping do
1181
1208
  XML
1182
1209
  end
1183
1210
 
1211
+ let(:generated_xml) do
1212
+ XmlMapping::Schema.from_xml(xml).to_xml
1213
+ end
1214
+
1184
1215
  it "round-trips xml" do
1185
- expect(XmlMapping::Schema.from_xml(xml).to_xml).to be_equivalent_to(xml)
1216
+ expect(generated_xml).to be_equivalent_to(xml)
1186
1217
  end
1187
1218
  end
1188
1219
  end
metadata CHANGED
@@ -1,15 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lutaml-model
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.4
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-01-24 00:00:00.000000000 Z
11
+ date: 2025-02-10 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: base64
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: liquid
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '5'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '5'
41
+ - !ruby/object:Gem::Dependency
42
+ name: moxml
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 0.1.2
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 0.1.2
13
55
  - !ruby/object:Gem::Dependency
14
56
  name: thor
15
57
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +94,7 @@ files:
52
94
  - exe/lutaml-model
53
95
  - lib/lutaml/model.rb
54
96
  - lib/lutaml/model/attribute.rb
97
+ - lib/lutaml/model/choice.rb
55
98
  - lib/lutaml/model/cli.rb
56
99
  - lib/lutaml/model/comparable_model.rb
57
100
  - lib/lutaml/model/comparable_nil.rb
@@ -59,16 +102,24 @@ files:
59
102
  - lib/lutaml/model/config.rb
60
103
  - lib/lutaml/model/constants.rb
61
104
  - lib/lutaml/model/error.rb
105
+ - lib/lutaml/model/error/choice_lower_bound_error.rb
106
+ - lib/lutaml/model/error/choice_upper_bound_error.rb
62
107
  - lib/lutaml/model/error/collection_count_out_of_range_error.rb
63
108
  - lib/lutaml/model/error/collection_true_missing_error.rb
109
+ - lib/lutaml/model/error/import_model_with_root_error.rb
64
110
  - lib/lutaml/model/error/incorrect_mapping_argument_error.rb
111
+ - lib/lutaml/model/error/incorrect_sequence_error.rb
112
+ - lib/lutaml/model/error/invalid_choice_range_error.rb
65
113
  - lib/lutaml/model/error/invalid_value_error.rb
66
114
  - lib/lutaml/model/error/multiple_mappings_error.rb
115
+ - lib/lutaml/model/error/no_root_mapping_error.rb
116
+ - lib/lutaml/model/error/no_root_namespace_error.rb
67
117
  - lib/lutaml/model/error/pattern_not_matched_error.rb
68
118
  - lib/lutaml/model/error/type/invalid_value_error.rb
69
119
  - lib/lutaml/model/error/type_error.rb
70
120
  - lib/lutaml/model/error/type_not_enabled_error.rb
71
121
  - lib/lutaml/model/error/unknown_adapter_type_error.rb
122
+ - lib/lutaml/model/error/unknown_sequence_mapping_error.rb
72
123
  - lib/lutaml/model/error/unknown_type_error.rb
73
124
  - lib/lutaml/model/error/validation_error.rb
74
125
  - lib/lutaml/model/json_adapter.rb
@@ -78,6 +129,7 @@ files:
78
129
  - lib/lutaml/model/json_adapter/standard_json_adapter.rb
79
130
  - lib/lutaml/model/key_value_mapping.rb
80
131
  - lib/lutaml/model/key_value_mapping_rule.rb
132
+ - lib/lutaml/model/liquefiable.rb
81
133
  - lib/lutaml/model/loggable.rb
82
134
  - lib/lutaml/model/mapping_hash.rb
83
135
  - lib/lutaml/model/mapping_rule.rb
@@ -90,6 +142,7 @@ files:
90
142
  - lib/lutaml/model/schema/xsd_schema.rb
91
143
  - lib/lutaml/model/schema/yaml_schema.rb
92
144
  - lib/lutaml/model/schema_location.rb
145
+ - lib/lutaml/model/sequence.rb
93
146
  - lib/lutaml/model/serializable.rb
94
147
  - lib/lutaml/model/serialize.rb
95
148
  - lib/lutaml/model/toml_adapter.rb
@@ -116,6 +169,7 @@ files:
116
169
  - lib/lutaml/model/xml_adapter/builder/nokogiri.rb
117
170
  - lib/lutaml/model/xml_adapter/builder/oga.rb
118
171
  - lib/lutaml/model/xml_adapter/builder/ox.rb
172
+ - lib/lutaml/model/xml_adapter/element.rb
119
173
  - lib/lutaml/model/xml_adapter/nokogiri_adapter.rb
120
174
  - lib/lutaml/model/xml_adapter/oga/document.rb
121
175
  - lib/lutaml/model/xml_adapter/oga/element.rb
@@ -134,19 +188,25 @@ files:
134
188
  - lutaml-model.gemspec
135
189
  - sig/lutaml/model.rbs
136
190
  - spec/address_spec.rb
191
+ - spec/benchmarks/xml_parsing_benchmark_spec.rb
192
+ - spec/ceramic_spec.rb
137
193
  - spec/fixtures/address.rb
194
+ - spec/fixtures/ceramic.rb
138
195
  - spec/fixtures/person.rb
139
196
  - spec/fixtures/sample_model.rb
140
197
  - spec/fixtures/vase.rb
198
+ - spec/fixtures/xml/address_example_260.xsd
141
199
  - spec/fixtures/xml/invalid_math_document.xml
142
200
  - spec/fixtures/xml/latin_encoding.xml
143
201
  - spec/fixtures/xml/math_document_schema.xsd
144
202
  - spec/fixtures/xml/shift_jis.xml
145
203
  - spec/fixtures/xml/special_char.xml
146
204
  - spec/fixtures/xml/test_schema.xsd
205
+ - spec/fixtures/xml/user.xsd
147
206
  - spec/fixtures/xml/valid_math_document.xml
148
207
  - spec/lutaml/model/attribute_spec.rb
149
208
  - spec/lutaml/model/cdata_spec.rb
209
+ - spec/lutaml/model/choice_spec.rb
150
210
  - spec/lutaml/model/collection_spec.rb
151
211
  - spec/lutaml/model/comparable_model_spec.rb
152
212
  - spec/lutaml/model/custom_model_spec.rb
@@ -154,10 +214,12 @@ files:
154
214
  - spec/lutaml/model/defaults_spec.rb
155
215
  - spec/lutaml/model/delegation_spec.rb
156
216
  - spec/lutaml/model/enum_spec.rb
217
+ - spec/lutaml/model/group_spec.rb
157
218
  - spec/lutaml/model/included_spec.rb
158
219
  - spec/lutaml/model/inheritance_spec.rb
159
220
  - spec/lutaml/model/json_adapter_spec.rb
160
221
  - spec/lutaml/model/key_value_mapping_spec.rb
222
+ - spec/lutaml/model/liquefiable_spec.rb
161
223
  - spec/lutaml/model/map_all_spec.rb
162
224
  - spec/lutaml/model/map_content_spec.rb
163
225
  - spec/lutaml/model/mixed_content_spec.rb
@@ -171,10 +233,12 @@ files:
171
233
  - spec/lutaml/model/schema/xml_compiler_spec.rb
172
234
  - spec/lutaml/model/schema/xsd_schema_spec.rb
173
235
  - spec/lutaml/model/schema/yaml_schema_spec.rb
236
+ - spec/lutaml/model/sequence_spec.rb
174
237
  - spec/lutaml/model/serializable_spec.rb
175
238
  - spec/lutaml/model/serializable_validation_spec.rb
176
239
  - spec/lutaml/model/simple_model_spec.rb
177
240
  - spec/lutaml/model/toml_adapter_spec.rb
241
+ - spec/lutaml/model/transformation_spec.rb
178
242
  - spec/lutaml/model/type/boolean_spec.rb
179
243
  - spec/lutaml/model/type/date_spec.rb
180
244
  - spec/lutaml/model/type/date_time_spec.rb
@@ -194,6 +258,7 @@ files:
194
258
  - spec/lutaml/model/xml_adapter/ox_adapter_spec.rb
195
259
  - spec/lutaml/model/xml_adapter/xml_namespace_spec.rb
196
260
  - spec/lutaml/model/xml_adapter_spec.rb
261
+ - spec/lutaml/model/xml_mapping_rule_spec.rb
197
262
  - spec/lutaml/model/xml_mapping_spec.rb
198
263
  - spec/lutaml/model/yaml_adapter_spec.rb
199
264
  - spec/lutaml/model_spec.rb