lutaml-model 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +34 -18
  3. data/README.adoc +166 -8
  4. data/lib/lutaml/model/key_value_mapping.rb +0 -1
  5. data/lib/lutaml/model/key_value_mapping_rule.rb +3 -1
  6. data/lib/lutaml/model/mapping_rule.rb +14 -2
  7. data/lib/lutaml/model/serialize.rb +67 -52
  8. data/lib/lutaml/model/type/decimal.rb +5 -0
  9. data/lib/lutaml/model/version.rb +1 -1
  10. data/lib/lutaml/model/xml_adapter/builder/nokogiri.rb +1 -0
  11. data/lib/lutaml/model/xml_adapter/builder/oga.rb +180 -0
  12. data/lib/lutaml/model/xml_adapter/builder/ox.rb +1 -0
  13. data/lib/lutaml/model/xml_adapter/oga/document.rb +20 -0
  14. data/lib/lutaml/model/xml_adapter/oga/element.rb +117 -0
  15. data/lib/lutaml/model/xml_adapter/oga_adapter.rb +77 -44
  16. data/lib/lutaml/model/xml_adapter/xml_document.rb +11 -9
  17. data/lib/lutaml/model/xml_mapping.rb +0 -1
  18. data/lib/lutaml/model/xml_mapping_rule.rb +16 -4
  19. data/spec/address_spec.rb +1 -0
  20. data/spec/fixtures/sample_model.rb +7 -0
  21. data/spec/lutaml/model/custom_model_spec.rb +47 -1
  22. data/spec/lutaml/model/included_spec.rb +192 -0
  23. data/spec/lutaml/model/mixed_content_spec.rb +48 -32
  24. data/spec/lutaml/model/multiple_mapping_spec.rb +329 -0
  25. data/spec/lutaml/model/ordered_content_spec.rb +1 -1
  26. data/spec/lutaml/model/render_nil_spec.rb +3 -0
  27. data/spec/lutaml/model/serializable_spec.rb +1 -1
  28. data/spec/lutaml/model/type/boolean_spec.rb +62 -0
  29. data/spec/lutaml/model/xml_adapter/oga_adapter_spec.rb +11 -11
  30. data/spec/lutaml/model/xml_adapter/xml_namespace_spec.rb +1 -1
  31. data/spec/lutaml/model/xml_adapter_spec.rb +2 -2
  32. data/spec/lutaml/model/xml_mapping_spec.rb +24 -9
  33. data/spec/sample_model_spec.rb +114 -0
  34. metadata +8 -2
@@ -0,0 +1,329 @@
1
+ require "spec_helper"
2
+ require "lutaml/model"
3
+
4
+ module MultipleMapping
5
+ class Product < Lutaml::Model::Serializable
6
+ attribute :name, Lutaml::Model::Type::String
7
+ attribute :localized_name, Lutaml::Model::Type::String
8
+ attribute :description, Lutaml::Model::Type::String
9
+ attribute :status, Lutaml::Model::Type::String
10
+ attribute :content, Lutaml::Model::Type::String
11
+
12
+ yaml do
13
+ map ["name", "product_name"], to: :name
14
+ map ["desc", "description"], to: :description
15
+ end
16
+
17
+ json do
18
+ map ["name", "product_name"], to: :name
19
+ map ["desc", "description"], to: :description
20
+ end
21
+
22
+ toml do
23
+ map ["name", "product_name"], to: :name
24
+ map ["desc", "description"], to: :description
25
+ end
26
+
27
+ xml do
28
+ root "product"
29
+ map_element ["name", "product-name"], to: :name
30
+ map_element ["localized-name", "localized_name"], to: :localized_name
31
+ map_element ["desc", "description"], to: :description
32
+ map_attribute ["status", "product-status"], to: :status
33
+ map_content to: :content
34
+ end
35
+ end
36
+
37
+ class CustomModel < Lutaml::Model::Serializable
38
+ attribute :id, Lutaml::Model::Type::String
39
+ attribute :full_name, Lutaml::Model::Type::String
40
+ attribute :size, Lutaml::Model::Type::Integer
41
+ attribute :color, Lutaml::Model::Type::String
42
+ attribute :description, Lutaml::Model::Type::String
43
+
44
+ json do
45
+ map ["name", "custom_name"], with: { to: :name_to_json, from: :name_from_json }
46
+ map ["color", "shade"], with: { to: :color_to_json, from: :color_from_json }
47
+ map ["size", "dimension"], with: { to: :size_to_json, from: :size_from_json }
48
+ map ["desc", "description"], with: { to: :desc_to_json, from: :desc_from_json }
49
+ end
50
+
51
+ xml do
52
+ root "CustomModel"
53
+ map_attribute ["id", "identifier"], with: { to: :id_to_xml, from: :id_from_xml }
54
+ map_element ["name", "custom-name"], with: { to: :name_to_xml, from: :name_from_xml }
55
+ map_element ["color", "shade"], with: { to: :color_to_xml, from: :color_from_xml }
56
+ map_element ["size", "dimension"], with: { to: :size_to_xml, from: :size_from_xml }
57
+ map_element ["desc", "description"], with: { to: :desc_to_xml, from: :desc_from_xml }
58
+ end
59
+
60
+ # Custom methods for JSON
61
+ def name_to_json(model, doc)
62
+ doc["name"] = "JSON Model: #{model.full_name}"
63
+ end
64
+
65
+ def name_from_json(model, value)
66
+ model.full_name = value&.sub(/^JSON Model: /, "")
67
+ end
68
+
69
+ def color_to_json(model, doc)
70
+ doc["color"] = model.color.upcase
71
+ end
72
+
73
+ def color_from_json(model, value)
74
+ model.color = value&.downcase
75
+ end
76
+
77
+ def size_to_json(model, doc)
78
+ doc["size"] = model.size + 10
79
+ end
80
+
81
+ def size_from_json(model, value)
82
+ model.size = value - 10
83
+ end
84
+
85
+ def desc_to_json(model, doc)
86
+ doc["desc"] = "JSON Description: #{model.description}"
87
+ end
88
+
89
+ def desc_from_json(model, value)
90
+ model.description = value&.sub(/^JSON Description: /, "")
91
+ end
92
+
93
+ # Custom methods for XML
94
+ def id_to_xml(model, parent, doc)
95
+ doc.add_attribute(parent, "id", "XML-#{model.id}")
96
+ end
97
+
98
+ def id_from_xml(model, value)
99
+ model.id = value&.sub(/^XML-/, "")
100
+ end
101
+
102
+ def name_to_xml(model, parent, doc)
103
+ el = doc.create_element("name")
104
+ doc.add_text(el, "XML Model: #{model.full_name}")
105
+ doc.add_element(parent, el)
106
+ end
107
+
108
+ def name_from_xml(model, value)
109
+ model.full_name = value.sub(/^XML Model: /, "")
110
+ end
111
+
112
+ def color_to_xml(model, parent, doc)
113
+ el = doc.create_element("color")
114
+ doc.add_text(el, model.color.upcase)
115
+ doc.add_element(parent, el)
116
+ end
117
+
118
+ def color_from_xml(model, value)
119
+ model.color = value.downcase
120
+ end
121
+
122
+ def size_to_xml(model, parent, doc)
123
+ el = doc.create_element("size")
124
+ doc.add_text(el, (model.size + 10).to_s)
125
+ doc.add_element(parent, el)
126
+ end
127
+
128
+ def size_from_xml(model, value)
129
+ model.size = (value.to_i || 0) - 10
130
+ end
131
+
132
+ def desc_to_xml(model, parent, doc)
133
+ el = doc.create_element("desc")
134
+ doc.add_text(el, "XML Description: #{model.description}")
135
+ doc.add_element(parent, el)
136
+ end
137
+
138
+ def desc_from_xml(model, value)
139
+ model.description = value.sub(/^XML Description: /, "")
140
+ end
141
+ end
142
+ end
143
+
144
+ RSpec.describe MultipleMapping do
145
+ context "with key-value formats" do
146
+ context "with YAML format" do
147
+ let(:yaml_with_name) { "product_name: Coffee Maker\ndescription: Premium coffee maker" }
148
+ let(:yaml_with_desc) { "---\nname: Coffee Maker\ndesc: Premium coffee maker\n" }
149
+
150
+ it "handles bidirectional conversion" do
151
+ product1 = MultipleMapping::Product.from_yaml(yaml_with_name)
152
+ product2 = MultipleMapping::Product.from_yaml(yaml_with_desc)
153
+
154
+ # keys for name and description are :name and :desc respectively since
155
+ # they are first element in their respective mapping array
156
+
157
+ expected_yaml = "---\nname: Coffee Maker\ndesc: Premium coffee maker\n"
158
+ expect(product1.to_yaml).to eq(expected_yaml)
159
+ expect(product2.to_yaml).to eq(yaml_with_desc)
160
+ end
161
+ end
162
+
163
+ context "with JSON format" do
164
+ let(:json_with_name) { '{"product_name":"Coffee Maker","description":"Premium coffee maker"}' }
165
+ let(:json_with_desc) { '{"name":"Coffee Maker","desc":"Premium coffee maker"}' }
166
+
167
+ it "handles bidirectional conversion" do
168
+ product1 = MultipleMapping::Product.from_json(json_with_name)
169
+ product2 = MultipleMapping::Product.from_json(json_with_desc)
170
+
171
+ # keys for name and description are :name and :desc respectively since
172
+ # they are first element in their respective mapping array
173
+ expected_json = '{"name":"Coffee Maker","desc":"Premium coffee maker"}'
174
+
175
+ expect(product1.to_json).to eq(expected_json)
176
+ expect(product2.to_json).to eq(json_with_desc)
177
+ end
178
+ end
179
+ end
180
+
181
+ context "with XML format" do
182
+ shared_examples "xml adapter with multiple mappings" do |adapter_class|
183
+ before do
184
+ Lutaml::Model::Config.xml_adapter = adapter_class
185
+ end
186
+
187
+ around do |example|
188
+ old_adapter = Lutaml::Model::Config.xml_adapter
189
+ Lutaml::Model::Config.xml_adapter = adapter_class
190
+
191
+ example.run
192
+ ensure
193
+ Lutaml::Model::Config.xml_adapter = old_adapter
194
+ end
195
+
196
+ let(:xml_with_attributes) do
197
+ <<~XML
198
+ <product status="active">
199
+ Some content here
200
+ <name>Coffee Maker</name>
201
+ <description>Premium coffee maker</description>
202
+ </product>
203
+ XML
204
+ end
205
+
206
+ let(:xml_with_alternate_attributes) do
207
+ <<~XML
208
+ <product product-status="in-stock">
209
+ Different content
210
+ <product-name>Coffee Maker</product-name>
211
+ <desc>Premium coffee maker</desc>
212
+ </product>
213
+ XML
214
+ end
215
+
216
+ it "handles bidirectional conversion with attributes and content" do
217
+ product1 = MultipleMapping::Product.from_xml(xml_with_attributes)
218
+ product2 = MultipleMapping::Product.from_xml(xml_with_alternate_attributes)
219
+
220
+ # Key for element name is :name since it is first element in mapping array and same for status attribute
221
+ expected_xml_product1 = <<~XML
222
+ <product status="active">
223
+ <name>Coffee Maker</name>
224
+ <desc>Premium coffee maker</desc>
225
+ Some content here
226
+ </product>
227
+ XML
228
+
229
+ expected_xml_product2 = <<~XML
230
+ <product status="in-stock">
231
+ <name>Coffee Maker</name>
232
+ <desc>Premium coffee maker</desc>
233
+ Different content
234
+ </product>
235
+ XML
236
+
237
+ expect(product1.name).to eq("Coffee Maker")
238
+ expect(product1.status).to eq("active")
239
+ expect(product2.status).to eq("in-stock")
240
+
241
+ expect(product1.to_xml).to be_equivalent_to(expected_xml_product1)
242
+ expect(product2.to_xml).to be_equivalent_to(expected_xml_product2)
243
+ end
244
+ end
245
+
246
+ context "with Nokogiri adapter" do
247
+ it_behaves_like "xml adapter with multiple mappings", Lutaml::Model::XmlAdapter::NokogiriAdapter
248
+ end
249
+
250
+ context "with Ox adapter" do
251
+ it_behaves_like "xml adapter with multiple mappings", Lutaml::Model::XmlAdapter::OxAdapter
252
+ end
253
+ end
254
+
255
+ context "with CustomModel" do
256
+ context "with JSON format" do
257
+ let(:json_with_alternate) { '{"custom_name":"JSON Model: Vase","shade":"BLUE","dimension":22,"description":"JSON Description: A beautiful ceramic vase"}' }
258
+ let(:json_with_standard) { '{"name":"JSON Model: Vase","color":"BLUE","size":22,"desc":"JSON Description: A beautiful ceramic vase"}' }
259
+
260
+ it "handles bidirectional conversion with custom methods" do
261
+ model1 = MultipleMapping::CustomModel.from_json(json_with_alternate)
262
+ model2 = MultipleMapping::CustomModel.from_json(json_with_standard)
263
+
264
+ # keys are 'name', 'color', 'size', 'desc' respectively since
265
+ # they are first element in their respective mapping array
266
+ expected_json = '{"name":"JSON Model: Vase","color":"BLUE","size":22,"desc":"JSON Description: A beautiful ceramic vase"}'
267
+
268
+ expect(model1.to_json).to eq(expected_json)
269
+ expect(model2.to_json).to eq(expected_json)
270
+ end
271
+ end
272
+
273
+ context "with XML format" do
274
+ shared_examples "xml adapter with custom methods" do |_adapter_class|
275
+ before do
276
+ Lutaml::Model::Config.xml_adapter = Lutaml::Model::XmlAdapter::NokogiriAdapter
277
+ end
278
+
279
+ let(:xml_with_alternate) do
280
+ <<~XML
281
+ <CustomModel identifier="123">
282
+ <custom-name>XML Model: Vase</custom-name>
283
+ <shade>BLUE</shade>
284
+ <dimension>22</dimension>
285
+ <description>XML Description: A beautiful ceramic vase</description>
286
+ </CustomModel>
287
+ XML
288
+ end
289
+
290
+ let(:xml_with_standard) do
291
+ <<~XML
292
+ <CustomModel identifier="123">
293
+ <name>XML Model: Vase</name>
294
+ <color>BLUE</color>
295
+ <size>22</size>
296
+ <desc>XML Description: A beautiful ceramic vase</desc>
297
+ </CustomModel>
298
+ XML
299
+ end
300
+
301
+ it "handles bidirectional conversion with custom methods" do
302
+ model1 = MultipleMapping::CustomModel.from_xml(xml_with_alternate)
303
+ model2 = MultipleMapping::CustomModel.from_xml(xml_with_standard)
304
+
305
+ # Element names are 'name', 'color', 'size', 'desc' respectively since
306
+ # they are first element in their respective mapping array
307
+ expected_xml = <<~XML
308
+ <CustomModel id="XML-123">
309
+ <name>XML Model: Vase</name>
310
+ <color>BLUE</color>
311
+ <size>22</size>
312
+ <desc>XML Description: A beautiful ceramic vase</desc>
313
+ </CustomModel>
314
+ XML
315
+ expect(model1.to_xml).to be_equivalent_to(expected_xml)
316
+ expect(model2.to_xml).to be_equivalent_to(expected_xml)
317
+ end
318
+ end
319
+
320
+ context "with Nokogiri adapter" do
321
+ it_behaves_like "xml adapter with custom methods", Lutaml::Model::XmlAdapter::NokogiriAdapter
322
+ end
323
+
324
+ context "with Ox adapter" do
325
+ it_behaves_like "xml adapter with custom methods", Lutaml::Model::XmlAdapter::OxAdapter
326
+ end
327
+ end
328
+ end
329
+ end
@@ -77,7 +77,7 @@ RSpec.describe "OrderedContent" do
77
77
  it_behaves_like "ordered content behavior", described_class
78
78
  end
79
79
 
80
- describe Lutaml::Model::XmlAdapter::OgaAdapter, skip: "Not implemented yet" do
80
+ describe Lutaml::Model::XmlAdapter::OgaAdapter do
81
81
  it_behaves_like "ordered content behavior", described_class
82
82
  end
83
83
  end
@@ -42,6 +42,7 @@ class RenderNil < Lutaml::Model::Serializable
42
42
  map "clay_type", to: :clay_type, render_nil: false
43
43
  map "glaze", to: :glaze, render_nil: true
44
44
  map "dimensions", to: :dimensions, render_nil: false
45
+ map "render_nil_nested", to: :render_nil_nested, render_nil: false
45
46
  end
46
47
 
47
48
  toml do
@@ -59,8 +60,10 @@ RSpec.describe RenderNil do
59
60
  clay_type: nil,
60
61
  glaze: nil,
61
62
  dimensions: nil,
63
+ render_nil_nested: RenderNilNested.new,
62
64
  }
63
65
  end
66
+
64
67
  let(:model) { described_class.new(attributes) }
65
68
 
66
69
  it "serializes to JSON with render_nil option" do
@@ -87,7 +87,7 @@ RSpec.describe Lutaml::Model::Serializable do
87
87
  end.to change(
88
88
  described_class, :model
89
89
  )
90
- .from(nil)
90
+ .from(described_class)
91
91
  .to(SerializeableSpec::TestModel)
92
92
  end
93
93
  end
@@ -1,5 +1,23 @@
1
1
  require "spec_helper"
2
2
 
3
+ module BooleanSpec
4
+ class Employee < Lutaml::Model::Serializable
5
+ attribute :name, :string
6
+ attribute :full_time, :boolean
7
+ attribute :on_leave, :boolean
8
+ attribute :remote, :boolean
9
+ attribute :active, :boolean
10
+
11
+ key_value do
12
+ map "name", to: :name
13
+ map "full_time", to: :full_time
14
+ map "on_leave", to: :on_leave
15
+ map "remote", to: :remote, render_nil: true
16
+ map "active", to: :active, render_nil: false
17
+ end
18
+ end
19
+ end
20
+
3
21
  RSpec.describe Lutaml::Model::Type::Boolean do
4
22
  describe ".cast" do
5
23
  let(:truthy_values) { [true, "true", "t", "yes", "y", "1"] }
@@ -51,4 +69,48 @@ RSpec.describe Lutaml::Model::Type::Boolean do
51
69
  expect(described_class.serialize(true)).to be true
52
70
  end
53
71
  end
72
+
73
+ context "with key-value serialization" do
74
+ let(:yaml) do
75
+ {
76
+ "name" => "John Smith",
77
+ "full_time" => true,
78
+ "on_leave" => false,
79
+ "remote" => nil,
80
+ "active" => nil,
81
+ }.to_yaml
82
+ end
83
+
84
+ let(:expected_yaml) do
85
+ {
86
+ "name" => "John Smith",
87
+ "full_time" => true,
88
+ "on_leave" => false,
89
+ "remote" => nil,
90
+ }.to_yaml
91
+ end
92
+
93
+ it "deserializes boolean values correctly" do
94
+ employee = BooleanSpec::Employee.from_yaml(yaml)
95
+
96
+ expect(employee.name).to eq("John Smith")
97
+ expect(employee.full_time).to be true
98
+ expect(employee.on_leave).to be false
99
+ expect(employee.remote).to be_nil
100
+ expect(employee.active).to be_nil
101
+ end
102
+
103
+ it "serializes boolean values correctly" do
104
+ employee = BooleanSpec::Employee.new(
105
+ name: "John Smith",
106
+ full_time: true,
107
+ on_leave: false,
108
+ remote: nil,
109
+ active: nil,
110
+ )
111
+
112
+ yaml_output = employee.to_yaml
113
+ expect(yaml_output).to eq(expected_yaml)
114
+ end
115
+ end
54
116
  end
@@ -2,7 +2,7 @@ require "spec_helper"
2
2
  require "oga"
3
3
  require_relative "../../../../lib/lutaml/model/xml_adapter/oga_adapter"
4
4
 
5
- RSpec.xdescribe Lutaml::Model::XmlAdapter::OgaAdapter do
5
+ RSpec.describe Lutaml::Model::XmlAdapter::OgaAdapter do
6
6
  let(:xml_string) do
7
7
  <<~XML
8
8
  <root xmlns="http://example.com/default" xmlns:prefix="http://example.com/prefixed">
@@ -14,21 +14,21 @@ RSpec.xdescribe Lutaml::Model::XmlAdapter::OgaAdapter do
14
14
  let(:document) { described_class.parse(xml_string) }
15
15
 
16
16
  context "parsing XML with namespaces" do
17
+ let(:child) { document.root.children[1] }
18
+
17
19
  it "parses the root element with default namespace" do
18
20
  expect(document.root.name).to eq("root")
19
- expect(document.root.namespace).to eq("http://example.com/default")
20
- expect(document.root.namespace_prefix).to be_nil
21
+ expect(document.root.namespace.uri).to eq("http://example.com/default")
22
+ expect(document.root.namespace.prefix).to be_nil
21
23
  end
22
24
 
23
25
  it "parses child element with prefixed namespace" do
24
- child = document.root.children.first
25
- expect(child.name).to eq("child")
26
- expect(child.namespace).to eq("http://example.com/prefixed")
27
- expect(child.namespace_prefix).to eq("prefix")
26
+ expect(child.name).to eq("prefix:child")
27
+ expect(child.namespace.uri).to eq("http://example.com/prefixed")
28
+ expect(child.namespace.prefix).to eq("prefix")
28
29
  end
29
30
 
30
31
  it "parses attributes with and without namespaces" do
31
- child = document.root.children.first
32
32
  expect(child.attributes["attr"].value).to eq("value")
33
33
  expect(child.attributes["attr"].namespace).to be_nil
34
34
  expect(child.attributes["prefix:attr"].value).to eq("prefixed_value")
@@ -42,12 +42,12 @@ RSpec.xdescribe Lutaml::Model::XmlAdapter::OgaAdapter do
42
42
  xml_output = document.to_xml
43
43
  parsed_output = Oga.parse_xml(xml_output)
44
44
 
45
- root = parsed_output.root
45
+ root = parsed_output.children.first
46
46
  expect(root.name).to eq("root")
47
47
  expect(root.namespace.uri).to eq("http://example.com/default")
48
48
 
49
- child = root.children.first
50
- expect(child.name).to eq("child")
49
+ child = root.children[1]
50
+ expect(child.expanded_name).to eq("prefix:child")
51
51
  expect(child.namespace.uri).to eq("http://example.com/prefixed")
52
52
  expect(child.get("attr")).to eq("value")
53
53
  expect(child.get("prefix:attr")).to eq("prefixed_value")
@@ -246,6 +246,6 @@ RSpec.describe Lutaml::Model::XmlAdapter::OxAdapter do
246
246
  it_behaves_like "an XML namespace parser", described_class
247
247
  end
248
248
 
249
- RSpec.xdescribe Lutaml::Model::XmlAdapter::OgaAdapter do
249
+ RSpec.describe Lutaml::Model::XmlAdapter::OgaAdapter do
250
250
  it_behaves_like "an XML namespace parser", described_class
251
251
  end
@@ -119,7 +119,7 @@ RSpec.shared_examples "an XML adapter" do |adapter_class|
119
119
 
120
120
  parsed = XmlAdapterSpec::Maths.from_xml(input_xml)
121
121
 
122
- expect(parsed.to_xml.strip).to eq(output_xml.strip)
122
+ expect(parsed.to_xml.strip).to be_equivalent_to(output_xml.strip)
123
123
  end
124
124
  end
125
125
 
@@ -173,6 +173,6 @@ RSpec.describe Lutaml::Model::XmlAdapter::OxAdapter do
173
173
  it_behaves_like "an XML adapter", described_class
174
174
  end
175
175
 
176
- RSpec.xdescribe Lutaml::Model::XmlAdapter::OgaAdapter do
176
+ RSpec.describe Lutaml::Model::XmlAdapter::OgaAdapter do
177
177
  it_behaves_like "an XML adapter", described_class
178
178
  end
@@ -325,7 +325,7 @@ RSpec.describe Lutaml::Model::XmlMapping do
325
325
  end
326
326
 
327
327
  # Skipping for OX because it does not handle namespaces
328
- context "overriding child namespace prefix", skip: adapter_class != Lutaml::Model::XmlAdapter::NokogiriAdapter do
328
+ context "overriding child namespace prefix", skip: adapter_class == Lutaml::Model::XmlAdapter::OxAdapter do
329
329
  let(:input_xml) do
330
330
  <<~XML
331
331
  <OverrideDefaultNamespacePrefix
@@ -342,9 +342,20 @@ RSpec.describe Lutaml::Model::XmlMapping do
342
342
  XML
343
343
  end
344
344
 
345
+ let(:oga_expected_xml) do
346
+ "<OverrideDefaultNamespacePrefix xmlns:abc=\"http://www.omg.org/spec/XMI/20131001\">" +
347
+ "<abc:SameElementName App=\"hello\" xmlns:GML=\"http://www.sparxsystems.com/profiles/GML/1.0\" xmlns:CityGML=\"http://www.sparxsystems.com/profiles/CityGML/1.0\">" +
348
+ "<GML:ApplicationSchema>GML App</GML:ApplicationSchema>" +
349
+ "<CityGML:ApplicationSchema>CityGML App</CityGML:ApplicationSchema>" +
350
+ "<abc:ApplicationSchema>App</abc:ApplicationSchema>" +
351
+ "</abc:SameElementName>" +
352
+ "</OverrideDefaultNamespacePrefix>"
353
+ end
354
+
345
355
  it "expect to round-trips" do
346
356
  parsed = XmlMapping::OverrideDefaultNamespacePrefix.from_xml(input_xml)
347
- expect(parsed.to_xml).to be_equivalent_to(input_xml)
357
+ expected_xml = adapter_class.type == "oga" ? oga_expected_xml : input_xml
358
+ expect(parsed.to_xml).to be_equivalent_to(expected_xml)
348
359
  end
349
360
  end
350
361
 
@@ -379,6 +390,15 @@ RSpec.describe Lutaml::Model::XmlMapping do
379
390
  "ApplicationSchema",
380
391
  "ApplicationSchema",
381
392
  ],
393
+ Lutaml::Model::XmlAdapter::OgaAdapter => [
394
+ "text",
395
+ "ApplicationSchema",
396
+ "text",
397
+ "ApplicationSchema",
398
+ "text",
399
+ "ApplicationSchema",
400
+ "text",
401
+ ],
382
402
  }
383
403
  end
384
404
 
@@ -1032,12 +1052,7 @@ RSpec.describe Lutaml::Model::XmlMapping do
1032
1052
  end
1033
1053
 
1034
1054
  it "round-trips xml" do
1035
- expected_xml = if adapter_class == Lutaml::Model::XmlAdapter::NokogiriAdapter
1036
- expected_nokogiri_xml
1037
- else
1038
- expected_ox_xml
1039
- end
1040
-
1055
+ expected_xml = adapter_class.type == "ox" ? expected_ox_xml : expected_nokogiri_xml
1041
1056
  expect(XmlMapping::SpecialCharContentWithMapAll.from_xml(xml).to_xml).to eq(expected_xml)
1042
1057
  end
1043
1058
  end
@@ -1066,7 +1081,7 @@ RSpec.describe Lutaml::Model::XmlMapping do
1066
1081
  it_behaves_like "having XML Mappings", described_class
1067
1082
  end
1068
1083
 
1069
- describe Lutaml::Model::XmlAdapter::OgaAdapter, skip: "Not implemented yet" do
1084
+ describe Lutaml::Model::XmlAdapter::OgaAdapter do
1070
1085
  it_behaves_like "having XML Mappings", described_class
1071
1086
  end
1072
1087
  end