lutaml-model 0.6.7 → 0.7.1

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.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/dependent-repos-todo.json +7 -0
  3. data/.github/workflows/dependent-repos.json +17 -9
  4. data/.rubocop_todo.yml +18 -33
  5. data/README.adoc +4380 -2557
  6. data/lib/lutaml/model/attribute.rb +94 -15
  7. data/lib/lutaml/model/choice.rb +7 -0
  8. data/lib/lutaml/model/comparable_model.rb +48 -9
  9. data/lib/lutaml/model/error/collection_count_out_of_range_error.rb +1 -1
  10. data/lib/lutaml/model/error/polymorphic_error.rb +9 -0
  11. data/lib/lutaml/model/error.rb +1 -0
  12. data/lib/lutaml/model/mapping/json_mapping.rb +17 -0
  13. data/lib/lutaml/model/{key_value_mapping.rb → mapping/key_value_mapping.rb} +58 -14
  14. data/lib/lutaml/model/{key_value_mapping_rule.rb → mapping/key_value_mapping_rule.rb} +18 -2
  15. data/lib/lutaml/model/mapping/mapping_rule.rb +299 -0
  16. data/lib/lutaml/model/mapping/toml_mapping.rb +25 -0
  17. data/lib/lutaml/model/{xml_mapping.rb → mapping/xml_mapping.rb} +97 -15
  18. data/lib/lutaml/model/{xml_mapping_rule.rb → mapping/xml_mapping_rule.rb} +20 -3
  19. data/lib/lutaml/model/mapping/yaml_mapping.rb +17 -0
  20. data/lib/lutaml/model/mapping.rb +14 -0
  21. data/lib/lutaml/model/schema/xml_compiler.rb +15 -15
  22. data/lib/lutaml/model/sequence.rb +2 -2
  23. data/lib/lutaml/model/serialize.rb +247 -97
  24. data/lib/lutaml/model/type/date.rb +1 -1
  25. data/lib/lutaml/model/type/date_time.rb +2 -2
  26. data/lib/lutaml/model/type/hash.rb +1 -1
  27. data/lib/lutaml/model/type/time.rb +2 -2
  28. data/lib/lutaml/model/type/time_without_date.rb +2 -2
  29. data/lib/lutaml/model/uninitialized_class.rb +64 -0
  30. data/lib/lutaml/model/utils.rb +14 -0
  31. data/lib/lutaml/model/validation.rb +1 -0
  32. data/lib/lutaml/model/version.rb +1 -1
  33. data/lib/lutaml/model/xml_adapter/nokogiri_adapter.rb +1 -1
  34. data/lib/lutaml/model/xml_adapter/oga_adapter.rb +1 -1
  35. data/lib/lutaml/model/xml_adapter/ox_adapter.rb +1 -1
  36. data/lib/lutaml/model/xml_adapter/xml_document.rb +38 -17
  37. data/lib/lutaml/model/xml_adapter/xml_element.rb +17 -7
  38. data/lib/lutaml/model.rb +1 -0
  39. data/spec/benchmarks/xml_parsing_benchmark_spec.rb +3 -3
  40. data/spec/fixtures/person.rb +5 -5
  41. data/spec/lutaml/model/attribute_spec.rb +37 -1
  42. data/spec/lutaml/model/cdata_spec.rb +2 -2
  43. data/spec/lutaml/model/collection_spec.rb +50 -2
  44. data/spec/lutaml/model/comparable_model_spec.rb +92 -27
  45. data/spec/lutaml/model/defaults_spec.rb +1 -1
  46. data/spec/lutaml/model/enum_spec.rb +1 -1
  47. data/spec/lutaml/model/group_spec.rb +316 -14
  48. data/spec/lutaml/model/key_value_mapping_spec.rb +41 -3
  49. data/spec/lutaml/model/polymorphic_spec.rb +348 -0
  50. data/spec/lutaml/model/render_empty_spec.rb +194 -0
  51. data/spec/lutaml/model/render_nil_spec.rb +206 -22
  52. data/spec/lutaml/model/simple_model_spec.rb +9 -9
  53. data/spec/lutaml/model/value_map_spec.rb +240 -0
  54. data/spec/lutaml/model/xml/namespace/nested_with_explicit_namespace_spec.rb +85 -0
  55. data/spec/lutaml/model/xml/xml_element_spec.rb +93 -0
  56. data/spec/lutaml/model/xml_mapping_rule_spec.rb +102 -2
  57. data/spec/lutaml/model/xml_mapping_spec.rb +45 -3
  58. data/spec/sample_model_spec.rb +3 -3
  59. metadata +20 -8
  60. data/lib/lutaml/model/mapping_rule.rb +0 -109
@@ -0,0 +1,299 @@
1
+ module Lutaml
2
+ module Model
3
+ class MappingRule
4
+ attr_reader :name,
5
+ :to,
6
+ :render_nil,
7
+ :render_default,
8
+ :render_empty,
9
+ :treat_nil,
10
+ :treat_empty,
11
+ :treat_omitted,
12
+ :attribute,
13
+ :custom_methods,
14
+ :delegate,
15
+ :polymorphic,
16
+ :polymorphic_map,
17
+ :transform,
18
+ :format
19
+
20
+ ALLOWED_OPTIONS = {
21
+ render_nil: %i[
22
+ omit
23
+ as_nil
24
+ as_blank
25
+ as_empty
26
+ ],
27
+ render_empty: %i[
28
+ omit
29
+ as_empty
30
+ as_blank
31
+ as_nil
32
+ ],
33
+ }.freeze
34
+
35
+ ALLOWED_OPTIONS.each do |key, values|
36
+ attribute_name = key.to_s
37
+ values.each do |value|
38
+ define_method(:"#{attribute_name}_#{value}?") do
39
+ send(attribute_name) == value
40
+ end
41
+ end
42
+ end
43
+
44
+ def initialize(
45
+ name,
46
+ to:,
47
+ render_nil: false,
48
+ render_default: false,
49
+ render_empty: false,
50
+ treat_nil: :nil,
51
+ treat_empty: :empty,
52
+ treat_omitted: :nil,
53
+ with: {},
54
+ attribute: false,
55
+ delegate: nil,
56
+ root_mappings: nil,
57
+ polymorphic: {},
58
+ polymorphic_map: {},
59
+ transform: {},
60
+ value_map: {}
61
+ )
62
+ @name = name
63
+ @to = to
64
+ @render_nil = render_nil
65
+ @render_default = render_default
66
+ @render_empty = render_empty
67
+ @treat_nil = treat_nil
68
+ @treat_empty = treat_empty
69
+ @treat_omitted = treat_omitted
70
+ @custom_methods = with
71
+ @attribute = attribute
72
+ @delegate = delegate
73
+ @root_mappings = root_mappings
74
+ @polymorphic = polymorphic
75
+ @polymorphic_map = polymorphic_map
76
+ @transform = transform
77
+
78
+ @value_map = default_value_map
79
+ @value_map[:from].merge!(value_map[:from] || {})
80
+ @value_map[:to].merge!(value_map[:to] || {})
81
+ end
82
+
83
+ def default_value_map(options = {})
84
+ render_nil_as = render_as(:render_nil, :omitted, options)
85
+ render_empty_as = render_as(:render_empty, :empty, options)
86
+
87
+ treat_nil_as = treat_as(:treat_nil, :nil, options)
88
+ treat_empty_as = treat_as(:treat_empty, :empty, options)
89
+ treat_omitted_as = treat_as(:treat_omitted, :nil, options)
90
+
91
+ {
92
+ from: { omitted: treat_omitted_as, nil: treat_nil_as, empty: treat_empty_as },
93
+ to: { omitted: :omitted, nil: render_nil_as, empty: render_empty_as },
94
+ }
95
+ end
96
+
97
+ def render_as(key, default_value, options = {})
98
+ value = public_send(key)
99
+ value = options[key] if value.nil?
100
+
101
+ if value == true
102
+ key.to_s.split("_").last.to_sym
103
+ elsif value == false
104
+ :omitted
105
+ elsif value
106
+ {
107
+ as_empty: :empty,
108
+ as_blank: :empty,
109
+ as_nil: :nil,
110
+ omit: :omitted,
111
+ }[value]
112
+ else
113
+ default_value
114
+ end
115
+ end
116
+
117
+ def treat_as(key, default_value, options = {})
118
+ public_send(key) || options[key] || default_value
119
+ end
120
+
121
+ alias from name
122
+ alias render_default? render_default
123
+ alias attribute? attribute
124
+
125
+ def render?(value, instance = nil, options = {})
126
+ if invalid_value?(value, options)
127
+ false
128
+ elsif instance.respond_to?(:using_default?) && instance.using_default?(to)
129
+ render_default?
130
+ else
131
+ true
132
+ end
133
+ end
134
+
135
+ def treat?(value)
136
+ (treat_nil? || !value.nil?) &&
137
+ (treat_empty? || !Utils.empty?(value)) &&
138
+ (treat_omitted? || Utils.initialized?(value))
139
+ end
140
+
141
+ def render_value_for(value)
142
+ if value.nil?
143
+ value_for_option(value_map(:to)[:nil])
144
+ elsif Utils.empty?(value)
145
+ value_for_option(value_map(:to)[:empty], value)
146
+ elsif Utils.uninitialized?(value)
147
+ value_for_option(value_map(:to)[:omitted])
148
+ else
149
+ value
150
+ end
151
+ end
152
+
153
+ def value_for_option(option, empty_value = nil)
154
+ return nil if option == :nil
155
+ return empty_value || "" if option == :empty
156
+
157
+ Lutaml::Model::UninitializedClass.instance
158
+ end
159
+
160
+ def render_nil?(options = {})
161
+ value_map(:to, options)[:nil] != :omitted
162
+ end
163
+
164
+ def render_empty?(options = {})
165
+ value_map(:to, options)[:empty] != :omitted
166
+ end
167
+
168
+ def render_omitted?(options = {})
169
+ value_map(:to, options)[:omitted] != :omitted
170
+ end
171
+
172
+ def treat_nil?(options = {})
173
+ value_map(:from, options)[:nil] != :omitted
174
+ end
175
+
176
+ def treat_empty?(options = {})
177
+ value_map(:from, options)[:empty] != :omitted
178
+ end
179
+
180
+ def treat_omitted?(options = {})
181
+ value_map(:from, options)[:omitted] != :omitted
182
+ end
183
+
184
+ def polymorphic_mapping?
185
+ polymorphic_map && !polymorphic_map.empty?
186
+ end
187
+
188
+ def serialize_attribute(model, element, doc)
189
+ if custom_methods[:to]
190
+ model.send(custom_methods[:to], model, element, doc)
191
+ end
192
+ end
193
+
194
+ def to_value_for(model)
195
+ if delegate
196
+ model.public_send(delegate).public_send(to)
197
+ else
198
+ return if to.nil?
199
+
200
+ model.public_send(to)
201
+ end
202
+ end
203
+
204
+ def serialize(model, parent = nil, doc = nil)
205
+ if custom_methods[:to]
206
+ model.send(custom_methods[:to], model, parent, doc)
207
+ else
208
+ to_value_for(model)
209
+ end
210
+ end
211
+
212
+ def deserialize(model, value, attributes, mapper_class = nil)
213
+ handle_custom_method(model, value, mapper_class) ||
214
+ handle_delegate(model, value, attributes) ||
215
+ handle_transform_method(model, value, attributes) ||
216
+ assign_value(model, value)
217
+ end
218
+
219
+ def using_custom_methods?
220
+ !custom_methods.empty?
221
+ end
222
+
223
+ def multiple_mappings?
224
+ name.is_a?(Array)
225
+ end
226
+
227
+ def raw_mapping?
228
+ name == Constants::RAW_MAPPING_KEY
229
+ end
230
+
231
+ def eql?(other)
232
+ other.class == self.class &&
233
+ instance_variables.all? do |var|
234
+ instance_variable_get(var) == other.instance_variable_get(var)
235
+ end
236
+ end
237
+ alias == eql?
238
+
239
+ def deep_dup
240
+ raise NotImplementedError, "Subclasses must implement `deep_dup`."
241
+ end
242
+
243
+ def value_map(key, options = {})
244
+ options = {
245
+ nil: options[:nil],
246
+ empty: options[:empty],
247
+ omitted: options[:omitted],
248
+ }.compact
249
+
250
+ @value_map[key].merge(options)
251
+ end
252
+
253
+ private
254
+
255
+ # if value is nil and render nil is false, will not render
256
+ # if value is empty and render empty is false, will not render
257
+ # if value is uninitialized and render omitted is false, will not render
258
+ def invalid_value?(value, options)
259
+ (!render_nil?(options) && value.nil?) ||
260
+ (!render_empty?(options) && Utils.empty?(value)) ||
261
+ (!render_omitted?(options) && Utils.uninitialized?(value))
262
+ end
263
+
264
+ def handle_custom_method(model, value, mapper_class)
265
+ return if !custom_methods[:from] || value.nil?
266
+
267
+ mapper_class.new.send(custom_methods[:from], model, value)
268
+ true
269
+ end
270
+
271
+ def handle_delegate(model, value, attributes)
272
+ return unless delegate
273
+
274
+ handle_nil_or_uninitialized(model, attributes)
275
+ assign_value(model.public_send(delegate), value)
276
+ true
277
+ end
278
+
279
+ def handle_nil_or_uninitialized(model, attributes)
280
+ delegate_value = model.public_send(delegate)
281
+ return if Utils.initialized?(delegate_value) && !delegate_value.nil?
282
+
283
+ model.public_send(:"#{delegate}=", attributes[delegate].type.new)
284
+ end
285
+
286
+ def handle_transform_method(model, value, attributes)
287
+ transform_method = transform[:import] || attributes[to].transform_import_method
288
+ return unless transform_method
289
+
290
+ assign_value(model, transform_method.call(value))
291
+ true
292
+ end
293
+
294
+ def assign_value(model, value)
295
+ model.public_send(:"#{to}=", value)
296
+ end
297
+ end
298
+ end
299
+ end
@@ -0,0 +1,25 @@
1
+ require_relative "key_value_mapping"
2
+
3
+ module Lutaml
4
+ module Model
5
+ class TomlMapping < KeyValueMapping
6
+ def initialize
7
+ super(:toml)
8
+ end
9
+
10
+ def deep_dup
11
+ self.class.new.tap do |new_mapping|
12
+ new_mapping.instance_variable_set(:@mappings, duplicate_mappings)
13
+ end
14
+ end
15
+
16
+ def validate!(key, to, with, render_nil, render_empty)
17
+ super
18
+
19
+ if [true, :as_nil].include?(render_nil) || render_empty == :as_nil
20
+ raise IncorrectMappingArgumentsError, "nil values are not supported in toml format"
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -26,6 +26,7 @@ module Lutaml
26
26
  @content_mapping = nil
27
27
  @raw_mapping = nil
28
28
  @mixed_content = false
29
+ @format = :xml
29
30
  end
30
31
 
31
32
  alias mixed_content? mixed_content
@@ -70,31 +71,45 @@ module Lutaml
70
71
  to: nil,
71
72
  render_nil: false,
72
73
  render_default: false,
74
+ render_empty: false,
75
+ treat_nil: :nil,
76
+ treat_empty: :empty,
77
+ treat_omitted: :nil,
73
78
  with: {},
74
79
  delegate: nil,
75
80
  cdata: false,
81
+ polymorphic: {},
76
82
  namespace: (namespace_set = false
77
83
  nil),
78
84
  prefix: (prefix_set = false
79
85
  nil),
80
- transform: {}
86
+ transform: {},
87
+ value_map: {}
81
88
  )
82
- validate!(name, to, with, type: TYPES[:element])
89
+ validate!(
90
+ name, to, with, render_nil, render_empty, type: TYPES[:element]
91
+ )
83
92
 
84
93
  rule = XmlMappingRule.new(
85
94
  name,
86
95
  to: to,
87
96
  render_nil: render_nil,
88
97
  render_default: render_default,
98
+ render_empty: render_empty,
99
+ treat_nil: treat_nil,
100
+ treat_empty: treat_empty,
101
+ treat_omitted: treat_omitted,
89
102
  with: with,
90
103
  delegate: delegate,
91
104
  cdata: cdata,
92
105
  namespace: namespace,
93
106
  default_namespace: namespace_uri,
94
107
  prefix: prefix,
108
+ polymorphic: polymorphic,
95
109
  namespace_set: namespace_set != false,
96
110
  prefix_set: prefix_set != false,
97
111
  transform: transform,
112
+ value_map: value_map,
98
113
  )
99
114
  @elements[rule.namespaced_name] = rule
100
115
  end
@@ -104,14 +119,20 @@ module Lutaml
104
119
  to: nil,
105
120
  render_nil: false,
106
121
  render_default: false,
122
+ render_empty: false,
107
123
  with: {},
108
124
  delegate: nil,
125
+ polymorphic_map: {},
109
126
  namespace: (namespace_set = false
110
127
  nil),
111
128
  prefix: (prefix_set = false
112
- nil)
129
+ nil),
130
+ value_map: {}
113
131
  )
114
- validate!(name, to, with, type: TYPES[:attribute])
132
+ validate!(
133
+ name, to, with, render_nil, render_empty, type: TYPES[:attribute]
134
+ )
135
+
115
136
  warn_auto_handling(name) if name == "schemaLocation"
116
137
 
117
138
  rule = XmlMappingRule.new(
@@ -124,9 +145,11 @@ module Lutaml
124
145
  namespace: namespace,
125
146
  prefix: prefix,
126
147
  attribute: true,
148
+ polymorphic_map: polymorphic_map,
127
149
  default_namespace: namespace_uri,
128
150
  namespace_set: namespace_set != false,
129
151
  prefix_set: prefix_set != false,
152
+ value_map: value_map,
130
153
  )
131
154
  @attributes[rule.namespaced_name] = rule
132
155
  end
@@ -137,22 +160,28 @@ module Lutaml
137
160
  to: nil,
138
161
  render_nil: false,
139
162
  render_default: false,
163
+ render_empty: false,
140
164
  with: {},
141
165
  delegate: nil,
142
166
  mixed: false,
143
- cdata: false
167
+ cdata: false,
168
+ value_map: {}
144
169
  )
145
- validate!("content", to, with, type: TYPES[:content])
170
+ validate!(
171
+ "content", to, with, render_nil, render_empty, type: TYPES[:content]
172
+ )
146
173
 
147
174
  @content_mapping = XmlMappingRule.new(
148
175
  nil,
149
176
  to: to,
150
177
  render_nil: render_nil,
151
178
  render_default: render_default,
179
+ render_empty: render_empty,
152
180
  with: with,
153
181
  delegate: delegate,
154
182
  mixed_content: mixed,
155
183
  cdata: cdata,
184
+ value_map: value_map,
156
185
  )
157
186
  end
158
187
 
@@ -165,9 +194,17 @@ module Lutaml
165
194
  namespace: (namespace_set = false
166
195
  nil),
167
196
  prefix: (prefix_set = false
168
- nil)
197
+ nil),
198
+ render_empty: false
169
199
  )
170
- validate!(Constants::RAW_MAPPING_KEY, to, with, type: TYPES[:all_content])
200
+ validate!(
201
+ Constants::RAW_MAPPING_KEY,
202
+ to,
203
+ with,
204
+ render_nil,
205
+ render_empty,
206
+ type: TYPES[:all_content],
207
+ )
171
208
 
172
209
  rule = XmlMappingRule.new(
173
210
  Constants::RAW_MAPPING_KEY,
@@ -203,21 +240,36 @@ module Lutaml
203
240
  (@element_sequence << mappings.element_sequence).flatten!
204
241
  end
205
242
 
206
- def validate!(key, to, with, type: nil)
207
- validate_mappings!(type)
243
+ def validate!(key, to, with, render_nil, render_empty, type: nil)
244
+ validate_raw_mappings!(type)
245
+ validate_to_and_with_arguments!(key, to, with)
208
246
 
247
+ if render_nil == :as_empty || render_empty == :as_empty
248
+ raise IncorrectMappingArgumentsError.new(
249
+ ":as_empty is not supported for XML mappings",
250
+ )
251
+ end
252
+ end
253
+
254
+ def validate_to_and_with_arguments!(key, to, with)
209
255
  if to.nil? && with.empty?
210
- msg = ":to or :with argument is required for mapping '#{key}'"
211
- raise IncorrectMappingArgumentsError.new(msg)
256
+ raise IncorrectMappingArgumentsError.new(
257
+ ":to or :with argument is required for mapping '#{key}'",
258
+ )
212
259
  end
213
260
 
261
+ validate_with_options!(key, with)
262
+ end
263
+
264
+ def validate_with_options!(key, with)
214
265
  if !with.empty? && (with[:from].nil? || with[:to].nil?)
215
- msg = ":with argument for mapping '#{key}' requires :to and :from keys"
216
- raise IncorrectMappingArgumentsError.new(msg)
266
+ raise IncorrectMappingArgumentsError.new(
267
+ ":with argument for mapping '#{key}' requires :to and :from keys",
268
+ )
217
269
  end
218
270
  end
219
271
 
220
- def validate_mappings!(type)
272
+ def validate_raw_mappings!(type)
221
273
  if !@raw_mapping.nil? && type != TYPES[:attribute]
222
274
  raise StandardError, "#{type} is not allowed, only #{TYPES[:attribute]} " \
223
275
  "is allowed with #{TYPES[:all_content]}"
@@ -270,6 +322,32 @@ module Lutaml
270
322
  end
271
323
  end
272
324
 
325
+ def mapping_attributes_hash
326
+ @attributes
327
+ end
328
+
329
+ def mapping_elements_hash
330
+ @elements
331
+ end
332
+
333
+ def merge_mapping_attributes(mapping)
334
+ mapping_attributes_hash.merge!(mapping.mapping_attributes_hash)
335
+ end
336
+
337
+ def merge_mapping_elements(mapping)
338
+ mapping_elements_hash.merge!(mapping.mapping_elements_hash)
339
+ end
340
+
341
+ def merge_elements_sequence(mapping)
342
+ mapping.element_sequence.each do |sequence|
343
+ element_sequence << Lutaml::Model::Sequence.new(self).tap do |instance|
344
+ sequence.attributes.each do |attr|
345
+ instance.attributes << attr.deep_dup
346
+ end
347
+ end
348
+ end
349
+ end
350
+
273
351
  def deep_dup
274
352
  self.class.new.tap do |xml_mapping|
275
353
  xml_mapping.root(@root_element.dup, mixed: @mixed_content,
@@ -283,6 +361,10 @@ module Lutaml
283
361
  end
284
362
  end
285
363
 
364
+ def polymorphic_mapping
365
+ mappings.find(&:polymorphic_mapping?)
366
+ end
367
+
286
368
  def attributes_to_dup
287
369
  @attributes_to_dup ||= %i[
288
370
  @content_mapping
@@ -10,6 +10,10 @@ module Lutaml
10
10
  to:,
11
11
  render_nil: false,
12
12
  render_default: false,
13
+ render_empty: false,
14
+ treat_nil: nil,
15
+ treat_empty: nil,
16
+ treat_omitted: nil,
13
17
  with: {},
14
18
  delegate: nil,
15
19
  namespace: nil,
@@ -20,17 +24,27 @@ module Lutaml
20
24
  prefix_set: false,
21
25
  attribute: false,
22
26
  default_namespace: nil,
23
- transform: {}
27
+ polymorphic: {},
28
+ polymorphic_map: {},
29
+ transform: {},
30
+ value_map: {}
24
31
  )
25
32
  super(
26
33
  name,
27
34
  to: to,
28
35
  render_nil: render_nil,
29
36
  render_default: render_default,
37
+ render_empty: render_empty,
38
+ treat_nil: treat_nil,
39
+ treat_empty: treat_empty,
40
+ treat_omitted: treat_omitted,
30
41
  with: with,
31
42
  delegate: delegate,
32
43
  attribute: attribute,
33
- transform: transform
44
+ polymorphic: polymorphic,
45
+ polymorphic_map: polymorphic_map,
46
+ transform: transform,
47
+ value_map: value_map,
34
48
  )
35
49
 
36
50
  @namespace = if namespace.to_s == "inherit"
@@ -87,7 +101,7 @@ module Lutaml
87
101
  end
88
102
 
89
103
  def namespaced_name(parent_namespace = nil, name = self.name)
90
- if name == "lang"
104
+ if name.to_s == "lang"
91
105
  "#{prefix}:#{name}"
92
106
  elsif namespace_set? || @attribute
93
107
  [namespace, name].compact.join(":")
@@ -113,8 +127,11 @@ module Lutaml
113
127
  namespace_set: namespace_set?,
114
128
  prefix_set: prefix_set?,
115
129
  attribute: attribute,
130
+ polymorphic: polymorphic.dup,
116
131
  default_namespace: default_namespace.dup,
117
132
  transform: transform.dup,
133
+ render_empty: render_empty.dup,
134
+ value_map: Utils.deep_dup(@value_map),
118
135
  )
119
136
  end
120
137
  end
@@ -0,0 +1,17 @@
1
+ require_relative "key_value_mapping"
2
+
3
+ module Lutaml
4
+ module Model
5
+ class YamlMapping < KeyValueMapping
6
+ def initialize
7
+ super(:yaml)
8
+ end
9
+
10
+ def deep_dup
11
+ self.class.new.tap do |new_mapping|
12
+ new_mapping.instance_variable_set(:@mappings, duplicate_mappings)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,14 @@
1
+ module Lutaml
2
+ module Model
3
+ module Mapping
4
+ end
5
+ end
6
+ end
7
+
8
+ require_relative "mapping/mapping_rule"
9
+ require_relative "mapping/yaml_mapping"
10
+ require_relative "mapping/json_mapping"
11
+ require_relative "mapping/toml_mapping"
12
+ require_relative "mapping/key_value_mapping_rule"
13
+ require_relative "mapping/xml_mapping"
14
+ require_relative "mapping/xml_mapping_rule"