lutaml-model 0.3.2 → 0.3.4
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 +49 -9
- data/README.adoc +331 -55
- data/exe/lutaml-model +7 -0
- data/lib/lutaml/model/cli.rb +131 -0
- data/lib/lutaml/model/comparable_model.rb +528 -0
- data/lib/lutaml/model/comparable_nil.rb +11 -0
- data/lib/lutaml/model/comparison.rb +15 -0
- data/lib/lutaml/model/schema/json_schema.rb +23 -7
- data/lib/lutaml/model/schema/json_schema_parser.rb +91 -0
- data/lib/lutaml/model/schema/relaxng_schema.rb +42 -12
- data/lib/lutaml/model/schema/xsd_schema.rb +29 -11
- data/lib/lutaml/model/schema/yaml_schema.rb +21 -6
- data/lib/lutaml/model/serializable.rb +2 -0
- data/lib/lutaml/model/serialize.rb +23 -7
- data/lib/lutaml/model/type.rb +0 -8
- data/lib/lutaml/model/version.rb +1 -1
- data/lib/lutaml/model/xml_adapter/nokogiri_adapter.rb +4 -2
- data/lib/lutaml/model/xml_adapter/ox_adapter.rb +6 -4
- data/lib/lutaml/model/xml_adapter/xml_document.rb +1 -0
- data/lib/lutaml/model/xml_mapping.rb +6 -6
- data/lutaml-model.gemspec +2 -5
- metadata +26 -5
data/README.adoc
CHANGED
@@ -69,16 +69,18 @@ Or install it yourself as:
|
|
69
69
|
gem install lutaml-model
|
70
70
|
----
|
71
71
|
|
72
|
-
==
|
72
|
+
== Data model class
|
73
73
|
|
74
|
-
===
|
74
|
+
=== Definition
|
75
|
+
|
76
|
+
==== General
|
75
77
|
|
76
78
|
There are two ways to define a data model in Lutaml::Model:
|
77
79
|
|
78
80
|
* Inheriting from the `Lutaml::Model::Serializable` class
|
79
81
|
* Including the `Lutaml::Model::Serialize` module
|
80
82
|
|
81
|
-
|
83
|
+
==== Definition through inheritance
|
82
84
|
|
83
85
|
The simplest way to define a model is to create a class that inherits from
|
84
86
|
`Lutaml::Model::Serializable`.
|
@@ -90,13 +92,13 @@ The `attribute` class method is used to define attributes.
|
|
90
92
|
require 'lutaml/model'
|
91
93
|
|
92
94
|
class Kiln < Lutaml::Model::Serializable
|
93
|
-
attribute :brand,
|
94
|
-
attribute :capacity,
|
95
|
-
attribute :temperature,
|
95
|
+
attribute :brand, :string
|
96
|
+
attribute :capacity, :integer
|
97
|
+
attribute :temperature, :integer
|
96
98
|
end
|
97
99
|
----
|
98
100
|
|
99
|
-
|
101
|
+
==== Definition through inclusion
|
100
102
|
|
101
103
|
If the model class already has a super class that it inherits from, the model
|
102
104
|
can be extended using the `Lutaml::Model::Serialize` module.
|
@@ -108,12 +110,38 @@ require 'lutaml/model'
|
|
108
110
|
class Kiln < SomeSuperClass
|
109
111
|
include Lutaml::Model::Serialize
|
110
112
|
|
111
|
-
attribute :brand,
|
112
|
-
attribute :capacity,
|
113
|
-
attribute :temperature,
|
113
|
+
attribute :brand, :string
|
114
|
+
attribute :capacity, :integer
|
115
|
+
attribute :temperature, :integer
|
114
116
|
end
|
115
117
|
----
|
116
118
|
|
119
|
+
|
120
|
+
=== Comparison
|
121
|
+
|
122
|
+
A `Serialize` / `Serializable` object can be compared with another object of the
|
123
|
+
same class using the `==` operator. This is implemented through the
|
124
|
+
`ComparableModel` module.
|
125
|
+
|
126
|
+
Two objects are considered equal if they have the same class and all their
|
127
|
+
attributes are equal. This behavior differs from the typical Ruby behavior,
|
128
|
+
where two objects are considered equal only if they have the same object ID.
|
129
|
+
|
130
|
+
NOTE: Two `Serialize` objects will have the same `hash` value if they have the
|
131
|
+
same class and all their attributes are equal.
|
132
|
+
|
133
|
+
[source,ruby]
|
134
|
+
----
|
135
|
+
> a = Kiln.new(brand: 'Kiln 1', capacity: 100, temperature: 1050)
|
136
|
+
> b = Kiln.new(brand: 'Kiln 1', capacity: 100, temperature: 1050)
|
137
|
+
> a == b
|
138
|
+
> # true
|
139
|
+
> a.hash == b.hash
|
140
|
+
> # true
|
141
|
+
----
|
142
|
+
|
143
|
+
|
144
|
+
|
117
145
|
== Defining attributes
|
118
146
|
|
119
147
|
=== Supported attribute value types
|
@@ -160,7 +188,7 @@ class Studio < Lutaml::Model::Serializable
|
|
160
188
|
# The following are equivalent
|
161
189
|
attribute :location, :string
|
162
190
|
attribute :potter, "String"
|
163
|
-
attribute :kiln,
|
191
|
+
attribute :kiln, :string
|
164
192
|
end
|
165
193
|
----
|
166
194
|
|
@@ -196,8 +224,8 @@ attribute :name_of_attribute, Type, collection: true
|
|
196
224
|
[source,ruby]
|
197
225
|
----
|
198
226
|
class Studio < Lutaml::Model::Serializable
|
199
|
-
attribute :location,
|
200
|
-
attribute :potters,
|
227
|
+
attribute :location, :string
|
228
|
+
attribute :potters, :string, collection: true
|
201
229
|
end
|
202
230
|
----
|
203
231
|
|
@@ -224,25 +252,85 @@ Syntax:
|
|
224
252
|
attribute :name_of_attribute, Type, values: [value1, value2, ...]
|
225
253
|
----
|
226
254
|
|
227
|
-
|
255
|
+
The values set inside the `values:` option can be of any type, but they must
|
256
|
+
match the type of the attribute. The values are compared using the `==` operator,
|
257
|
+
so the type must implement the `==` method.
|
258
|
+
|
259
|
+
.Using the `values` directive to define acceptable values for an attribute (basic types)
|
260
|
+
[example]
|
261
|
+
====
|
262
|
+
[source,ruby]
|
263
|
+
----
|
264
|
+
class GlazeTechnique < Lutaml::Model::Serializable
|
265
|
+
attribute :name, :string, values: ["Celadon", "Raku", "Majolica"]
|
266
|
+
end
|
267
|
+
----
|
268
|
+
|
269
|
+
[source,ruby]
|
270
|
+
----
|
271
|
+
> GlazeTechnique.new(name: "Celadon").name
|
272
|
+
> # "Celadon"
|
273
|
+
> GlazeTechnique.new(name: "Raku").name
|
274
|
+
> # "Raku"
|
275
|
+
> GlazeTechnique.new(name: "Majolica").name
|
276
|
+
> # "Majolica"
|
277
|
+
> GlazeTechnique.new(name: "Earthenware").name
|
278
|
+
> # Lutaml::Model::InvalidValueError: Invalid value for attribute 'name'
|
279
|
+
----
|
280
|
+
====
|
281
|
+
|
282
|
+
The values can be Serialize objects, which are compared using the `==`
|
283
|
+
and the `hash` methods through the Lutaml::Model::ComparableModel module.
|
284
|
+
|
285
|
+
|
286
|
+
.Using the `values` directive to define acceptable values for an attribute (Serializable objects)
|
228
287
|
[example]
|
229
288
|
====
|
230
289
|
[source,ruby]
|
231
290
|
----
|
232
291
|
class Ceramic < Lutaml::Model::Serializable
|
233
|
-
attribute :type,
|
234
|
-
|
292
|
+
attribute :type, :string
|
293
|
+
attribute :firing_temperature, :integer
|
294
|
+
end
|
295
|
+
|
296
|
+
class CeramicCollection < Lutaml::Model::Serializable
|
297
|
+
attribute :featured_piece,
|
298
|
+
Ceramic,
|
299
|
+
values: [
|
300
|
+
Ceramic.new(type: "Porcelain", firing_temperature: 1300),
|
301
|
+
Ceramic.new(type: "Stoneware", firing_temperature: 1200),
|
302
|
+
Ceramic.new(type: "Earthenware", firing_temperature: 1000),
|
303
|
+
]
|
235
304
|
end
|
236
305
|
----
|
237
306
|
|
238
307
|
[source,ruby]
|
239
308
|
----
|
240
|
-
> Ceramic.new(type:
|
241
|
-
> # "Porcelain"
|
242
|
-
> Ceramic.new(type:
|
243
|
-
> #
|
244
|
-
|
245
|
-
|
309
|
+
> CeramicCollection.new(featured_piece: Ceramic.new(type: "Porcelain", firing_temperature: 1300)).featured_piece
|
310
|
+
> # Ceramic:0x0000000104ac7240 @type="Porcelain", @firing_temperature=1300
|
311
|
+
> CeramicCollection.new(featured_piece: Ceramic.new(type: "Bone China", firing_temperature: 1300)).featured_piece
|
312
|
+
> # Lutaml::Model::InvalidValueError: Invalid value for attribute 'featured_piece'
|
313
|
+
----
|
314
|
+
====
|
315
|
+
|
316
|
+
Serialize provides a `validate` method that checks if all its attributes have
|
317
|
+
valid values. This is necessary for the case when a value is valid at the
|
318
|
+
component level, but not accepted at the aggregation level.
|
319
|
+
|
320
|
+
If a change has been made at the component level (a nested attribute has
|
321
|
+
changed), the aggregation level needs to call the `validate` method to verify
|
322
|
+
acceptance of the newly updated component.
|
323
|
+
|
324
|
+
.Using the `validate` method to check if all attributes have valid values
|
325
|
+
[example]
|
326
|
+
====
|
327
|
+
[source,ruby]
|
328
|
+
----
|
329
|
+
> collection = CeramicCollection.new(featured_piece: Ceramic.new(type: "Porcelain", firing_temperature: 1300))
|
330
|
+
> collection.featured_piece.firing_temperature = 1400
|
331
|
+
> # No error raised in changed nested attribute
|
332
|
+
> collection.validate
|
333
|
+
> # Lutaml::Model::InvalidValueError: Invalid value for attribute 'featured_piece'
|
246
334
|
----
|
247
335
|
====
|
248
336
|
|
@@ -266,8 +354,8 @@ attribute :name_of_attribute, Type, default: -> { value }
|
|
266
354
|
[source,ruby]
|
267
355
|
----
|
268
356
|
class Glaze < Lutaml::Model::Serializable
|
269
|
-
attribute :color,
|
270
|
-
attribute :temperature,
|
357
|
+
attribute :color, :string, default: -> { 'Clear' }
|
358
|
+
attribute :temperature, :integer, default: -> { 1050 }
|
271
359
|
end
|
272
360
|
----
|
273
361
|
|
@@ -378,7 +466,7 @@ end
|
|
378
466
|
[source,ruby]
|
379
467
|
----
|
380
468
|
class Example < Lutaml::Model::Serializable
|
381
|
-
attribute :name,
|
469
|
+
attribute :name, :string
|
382
470
|
|
383
471
|
xml do
|
384
472
|
root 'example'
|
@@ -401,6 +489,42 @@ end
|
|
401
489
|
----
|
402
490
|
====
|
403
491
|
|
492
|
+
If an element is mapped to a model object with the XML `root` tag name set, the
|
493
|
+
mapped tag name will be used as the root name, overriding the root name.
|
494
|
+
|
495
|
+
.The mapped tag name is used as the root name
|
496
|
+
[example]
|
497
|
+
====
|
498
|
+
[source,ruby]
|
499
|
+
----
|
500
|
+
class RecordDate < Lutaml::Model::Serializable
|
501
|
+
attribute :content, :string
|
502
|
+
|
503
|
+
xml do
|
504
|
+
root "recordDate"
|
505
|
+
map_content to: :content
|
506
|
+
end
|
507
|
+
end
|
508
|
+
|
509
|
+
class OriginInfo < Lutaml::Model::Serializable
|
510
|
+
attribute :date_issued, RecordDate, collection: true
|
511
|
+
|
512
|
+
xml do
|
513
|
+
root "originInfo"
|
514
|
+
map_element "dateIssued", to: :date_issued
|
515
|
+
end
|
516
|
+
end
|
517
|
+
----
|
518
|
+
|
519
|
+
[source,ruby]
|
520
|
+
----
|
521
|
+
> RecordDate.new(date: "2021-01-01").to_xml
|
522
|
+
> #<recordDate>2021-01-01</recordDate>
|
523
|
+
> OriginInfo.new(date_issued: [RecordDate.new(date: "2021-01-01")]).to_xml
|
524
|
+
> #<originInfo><dateIssued>2021-01-01</dateIssued></originInfo>
|
525
|
+
----
|
526
|
+
====
|
527
|
+
|
404
528
|
==== Mapping attributes
|
405
529
|
|
406
530
|
The `map_attribute` method maps an XML attribute to a data model attribute.
|
@@ -422,7 +546,7 @@ The following class will parse the XML snippet below:
|
|
422
546
|
[source,ruby]
|
423
547
|
----
|
424
548
|
class Example < Lutaml::Model::Serializable
|
425
|
-
attribute :value,
|
549
|
+
attribute :value, :integer
|
426
550
|
|
427
551
|
xml do
|
428
552
|
root 'example'
|
@@ -470,7 +594,7 @@ The following class will parse the XML snippet below:
|
|
470
594
|
[source,ruby]
|
471
595
|
----
|
472
596
|
class Example < Lutaml::Model::Serializable
|
473
|
-
attribute :description,
|
597
|
+
attribute :description, :string
|
474
598
|
|
475
599
|
xml do
|
476
600
|
root 'example'
|
@@ -504,9 +628,9 @@ The following class will parse the XML snippet below:
|
|
504
628
|
[source,ruby]
|
505
629
|
----
|
506
630
|
class Example < Lutaml::Model::Serializable
|
507
|
-
attribute :name,
|
508
|
-
attribute :description,
|
509
|
-
attribute :value,
|
631
|
+
attribute :name, :string
|
632
|
+
attribute :description, :string
|
633
|
+
attribute :value, :integer
|
510
634
|
|
511
635
|
xml do
|
512
636
|
root 'example'
|
@@ -554,8 +678,8 @@ end
|
|
554
678
|
[source,ruby]
|
555
679
|
----
|
556
680
|
class Ceramic < Lutaml::Model::Serializable
|
557
|
-
attribute :type,
|
558
|
-
attribute :glaze,
|
681
|
+
attribute :type, :string
|
682
|
+
attribute :glaze, :string
|
559
683
|
|
560
684
|
xml do
|
561
685
|
root 'Ceramic'
|
@@ -608,8 +732,8 @@ In this example, `glz` will be used for `Glaze` if it is added inside the
|
|
608
732
|
[source,ruby]
|
609
733
|
----
|
610
734
|
class Glaze < Lutaml::Model::Serializable
|
611
|
-
attribute :color,
|
612
|
-
attribute :temperature,
|
735
|
+
attribute :color, :string
|
736
|
+
attribute :temperature, :integer
|
613
737
|
|
614
738
|
xml do
|
615
739
|
root 'Glaze'
|
@@ -621,7 +745,7 @@ class Glaze < Lutaml::Model::Serializable
|
|
621
745
|
end
|
622
746
|
|
623
747
|
class Ceramic < Lutaml::Model::Serializable
|
624
|
-
attribute :type,
|
748
|
+
attribute :type, :string
|
625
749
|
attribute :glaze, Glaze
|
626
750
|
|
627
751
|
xml do
|
@@ -675,9 +799,9 @@ In this example, the `Type` element will inherit the namespace from the root.
|
|
675
799
|
[source,ruby]
|
676
800
|
----
|
677
801
|
class Ceramic < Lutaml::Model::Serializable
|
678
|
-
attribute :type,
|
679
|
-
attribute :glaze,
|
680
|
-
attribute :color,
|
802
|
+
attribute :type, :string
|
803
|
+
attribute :glaze, :string
|
804
|
+
attribute :color, :string
|
681
805
|
|
682
806
|
xml do
|
683
807
|
root 'Ceramic'
|
@@ -755,8 +879,8 @@ end
|
|
755
879
|
[source,ruby]
|
756
880
|
----
|
757
881
|
class Paragraph < Lutaml::Model::Serializable
|
758
|
-
attribute :bold,
|
759
|
-
attribute :italic,
|
882
|
+
attribute :bold, :string
|
883
|
+
attribute :italic, :string
|
760
884
|
|
761
885
|
xml do
|
762
886
|
root 'p', mixed: true
|
@@ -799,8 +923,8 @@ end
|
|
799
923
|
[source,ruby]
|
800
924
|
----
|
801
925
|
class Paragraph < Lutaml::Model::Serializable
|
802
|
-
attribute :bold,
|
803
|
-
attribute :italic,
|
926
|
+
attribute :bold, :string
|
927
|
+
attribute :italic, :string
|
804
928
|
|
805
929
|
xml do
|
806
930
|
root 'p'
|
@@ -859,8 +983,8 @@ end
|
|
859
983
|
[source,ruby]
|
860
984
|
----
|
861
985
|
class Example < Lutaml::Model::Serializable
|
862
|
-
attribute :name,
|
863
|
-
attribute :value,
|
986
|
+
attribute :name, :string
|
987
|
+
attribute :value, :integer
|
864
988
|
|
865
989
|
json do
|
866
990
|
map 'name', to: :name
|
@@ -907,8 +1031,8 @@ by referring to a Lutaml::Model class as an attribute class.
|
|
907
1031
|
[source,ruby]
|
908
1032
|
----
|
909
1033
|
class Glaze < Lutaml::Model::Serializable
|
910
|
-
attribute :color,
|
911
|
-
attribute :temperature,
|
1034
|
+
attribute :color, :string
|
1035
|
+
attribute :temperature, :integer
|
912
1036
|
|
913
1037
|
json do
|
914
1038
|
map 'color', to: :color
|
@@ -917,7 +1041,7 @@ class Glaze < Lutaml::Model::Serializable
|
|
917
1041
|
end
|
918
1042
|
|
919
1043
|
class Ceramic < Lutaml::Model::Serializable
|
920
|
-
attribute :type,
|
1044
|
+
attribute :type, :string
|
921
1045
|
attribute :glaze, Glaze
|
922
1046
|
|
923
1047
|
json do
|
@@ -947,6 +1071,158 @@ end
|
|
947
1071
|
----
|
948
1072
|
====
|
949
1073
|
|
1074
|
+
|
1075
|
+
=== Separate serialization model
|
1076
|
+
|
1077
|
+
The `Serialize` module can be used to define only serialization mappings for a
|
1078
|
+
separately defined model (a Ruby class).
|
1079
|
+
|
1080
|
+
Syntax:
|
1081
|
+
|
1082
|
+
[source,ruby]
|
1083
|
+
----
|
1084
|
+
class Foo < Lutaml::Model::Serializable
|
1085
|
+
model {DataModelClass}
|
1086
|
+
|
1087
|
+
# ...
|
1088
|
+
end
|
1089
|
+
----
|
1090
|
+
|
1091
|
+
[example]
|
1092
|
+
.Using the `model` method to define serialization mappings for a separate model
|
1093
|
+
====
|
1094
|
+
[source,ruby]
|
1095
|
+
----
|
1096
|
+
class Ceramic
|
1097
|
+
attr_accessor :type, :glaze
|
1098
|
+
|
1099
|
+
def name
|
1100
|
+
"#{type} with #{glaze}"
|
1101
|
+
end
|
1102
|
+
end
|
1103
|
+
|
1104
|
+
class CeramicSerialization < Lutaml::Model::Serializable
|
1105
|
+
model Ceramic
|
1106
|
+
|
1107
|
+
xml do
|
1108
|
+
map_element 'type', to: :type
|
1109
|
+
map_element 'glaze', to: :glaze
|
1110
|
+
end
|
1111
|
+
end
|
1112
|
+
----
|
1113
|
+
|
1114
|
+
[source,ruby]
|
1115
|
+
----
|
1116
|
+
> Ceramic.new(type: "Porcelain", glaze: "Clear").name
|
1117
|
+
> # "Porcelain with Clear"
|
1118
|
+
> CeramicSerialization.from_xml(xml)
|
1119
|
+
> #<Ceramic:0x0000000104ac7240 @type="Porcelain", @glaze="Clear">
|
1120
|
+
> Ceramic.new(type: "Porcelain", glaze: "Clear").to_xml
|
1121
|
+
> #<Ceramic><type>Porcelain</type><glaze>Clear</glaze></Ceramic>
|
1122
|
+
----
|
1123
|
+
====
|
1124
|
+
|
1125
|
+
|
1126
|
+
=== Rendering empty attributes and collections
|
1127
|
+
|
1128
|
+
By default, empty attributes and collections are not rendered in the output.
|
1129
|
+
|
1130
|
+
To render empty attributes and collections, use the `render_nil` option.
|
1131
|
+
|
1132
|
+
Syntax:
|
1133
|
+
|
1134
|
+
[source,ruby]
|
1135
|
+
----
|
1136
|
+
xml do
|
1137
|
+
map_element 'key_value_model_attribute_name', to: :name_of_attribute, render_nil: true
|
1138
|
+
end
|
1139
|
+
----
|
1140
|
+
|
1141
|
+
[source,ruby]
|
1142
|
+
----
|
1143
|
+
json | yaml | toml do
|
1144
|
+
map 'key_value_model_attribute_name', to: :name_of_attribute, render_nil: true
|
1145
|
+
end
|
1146
|
+
----
|
1147
|
+
|
1148
|
+
.Using the `render_nil` option to render empty attributes
|
1149
|
+
[example]
|
1150
|
+
====
|
1151
|
+
[source,ruby]
|
1152
|
+
----
|
1153
|
+
class Ceramic < Lutaml::Model::Serializable
|
1154
|
+
attribute :type, :string
|
1155
|
+
attribute :glaze, :string
|
1156
|
+
|
1157
|
+
xml do
|
1158
|
+
map_element 'type', to: :type, render_nil: true
|
1159
|
+
map_element 'glaze', to: :glaze
|
1160
|
+
end
|
1161
|
+
|
1162
|
+
json do
|
1163
|
+
map 'type', to: :type, render_nil: true
|
1164
|
+
map 'glaze', to: :glaze
|
1165
|
+
end
|
1166
|
+
end
|
1167
|
+
----
|
1168
|
+
|
1169
|
+
[source,ruby]
|
1170
|
+
----
|
1171
|
+
> Ceramic.new.to_json
|
1172
|
+
> # { 'type': null }
|
1173
|
+
> Ceramic.new(type: "Porcelain", glaze: "Clear").to_json
|
1174
|
+
> # { 'type': 'Porcelain', 'glaze': 'Clear' }
|
1175
|
+
----
|
1176
|
+
|
1177
|
+
[source,ruby]
|
1178
|
+
----
|
1179
|
+
> Ceramic.new.to_xml
|
1180
|
+
> # <Ceramic><type></type></Ceramic>
|
1181
|
+
> Ceramic.new(type: "Porcelain", glaze: "Clear").to_xml
|
1182
|
+
> # <Ceramic><type>Porcelain</type><glaze>Clear</glaze></Ceramic>
|
1183
|
+
----
|
1184
|
+
====
|
1185
|
+
|
1186
|
+
.Using the `render_nil` option to render empty attribute collections
|
1187
|
+
[example]
|
1188
|
+
====
|
1189
|
+
[source,ruby]
|
1190
|
+
----
|
1191
|
+
class Ceramic < Lutaml::Model::Serializable
|
1192
|
+
attribute :type, :string
|
1193
|
+
attribute :glazes, :string, collection: true
|
1194
|
+
|
1195
|
+
xml do
|
1196
|
+
map_element 'type', to: :type, render_nil: true
|
1197
|
+
map_element 'glazes', to: :glazes, render_nil: true
|
1198
|
+
end
|
1199
|
+
|
1200
|
+
json do
|
1201
|
+
map 'type', to: :type, render_nil: true
|
1202
|
+
map 'glazes', to: :glazes, render_nil: true
|
1203
|
+
end
|
1204
|
+
end
|
1205
|
+
----
|
1206
|
+
|
1207
|
+
[source,ruby]
|
1208
|
+
----
|
1209
|
+
> Ceramic.new.to_json
|
1210
|
+
> # { 'type': null, 'glazes': [] }
|
1211
|
+
> Ceramic.new(type: "Porcelain", glazes: ["Clear"]).to_json
|
1212
|
+
> # { 'type': 'Porcelain', 'glazes': ['Clear'] }
|
1213
|
+
----
|
1214
|
+
|
1215
|
+
[source,ruby]
|
1216
|
+
----
|
1217
|
+
> Ceramic.new.to_xml
|
1218
|
+
> # <Ceramic><type></type><glazes></glazes></Ceramic>
|
1219
|
+
> Ceramic.new(type: "Porcelain", glazes: ["Clear"]).to_xml
|
1220
|
+
> # <Ceramic><type>Porcelain</type><glazes>Clear</glazes></Ceramic>
|
1221
|
+
----
|
1222
|
+
====
|
1223
|
+
|
1224
|
+
|
1225
|
+
|
950
1226
|
=== Advanced attribute mapping
|
951
1227
|
|
952
1228
|
==== Attribute mapping delegation
|
@@ -970,8 +1246,8 @@ The following class will parse the JSON snippet below:
|
|
970
1246
|
[source,ruby]
|
971
1247
|
----
|
972
1248
|
class Glaze < Lutaml::Model::Serializable
|
973
|
-
attribute :color,
|
974
|
-
attribute :temperature,
|
1249
|
+
attribute :color, :string
|
1250
|
+
attribute :temperature, :integer
|
975
1251
|
|
976
1252
|
json do
|
977
1253
|
map 'color', to: :color
|
@@ -980,7 +1256,7 @@ class Glaze < Lutaml::Model::Serializable
|
|
980
1256
|
end
|
981
1257
|
|
982
1258
|
class Ceramic < Lutaml::Model::Serializable
|
983
|
-
attribute :type,
|
1259
|
+
attribute :type, :string
|
984
1260
|
attribute :glaze, Glaze
|
985
1261
|
|
986
1262
|
json do
|
@@ -1033,8 +1309,8 @@ The following class will parse the JSON snippet below:
|
|
1033
1309
|
[source,ruby]
|
1034
1310
|
----
|
1035
1311
|
class CustomCeramic < Lutaml::Model::Serializable
|
1036
|
-
attribute :name,
|
1037
|
-
attribute :size,
|
1312
|
+
attribute :name, :string
|
1313
|
+
attribute :size, :integer
|
1038
1314
|
|
1039
1315
|
json do
|
1040
1316
|
map 'name', to: :name, with: { to: :name_to_json, from: :name_from_json }
|
@@ -1214,9 +1490,9 @@ A model can be defined for this JSON as follows:
|
|
1214
1490
|
[source,ruby]
|
1215
1491
|
----
|
1216
1492
|
class Schema < Lutaml::Model::Serializable
|
1217
|
-
attribute :id,
|
1218
|
-
attribute :link,
|
1219
|
-
attribute :name,
|
1493
|
+
attribute :id, :string
|
1494
|
+
attribute :link, :string
|
1495
|
+
attribute :name, :string
|
1220
1496
|
end
|
1221
1497
|
|
1222
1498
|
class ChildMappingClass < Lutaml::Model::Serializable
|