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.
- checksums.yaml +4 -4
- data/.github/workflows/dependent-repos-todo.json +7 -0
- data/.github/workflows/dependent-repos.json +17 -9
- data/.rubocop_todo.yml +18 -33
- data/README.adoc +4380 -2557
- data/lib/lutaml/model/attribute.rb +94 -15
- data/lib/lutaml/model/choice.rb +7 -0
- data/lib/lutaml/model/comparable_model.rb +48 -9
- data/lib/lutaml/model/error/collection_count_out_of_range_error.rb +1 -1
- data/lib/lutaml/model/error/polymorphic_error.rb +9 -0
- data/lib/lutaml/model/error.rb +1 -0
- data/lib/lutaml/model/mapping/json_mapping.rb +17 -0
- data/lib/lutaml/model/{key_value_mapping.rb → mapping/key_value_mapping.rb} +58 -14
- data/lib/lutaml/model/{key_value_mapping_rule.rb → mapping/key_value_mapping_rule.rb} +18 -2
- data/lib/lutaml/model/mapping/mapping_rule.rb +299 -0
- data/lib/lutaml/model/mapping/toml_mapping.rb +25 -0
- data/lib/lutaml/model/{xml_mapping.rb → mapping/xml_mapping.rb} +97 -15
- data/lib/lutaml/model/{xml_mapping_rule.rb → mapping/xml_mapping_rule.rb} +20 -3
- data/lib/lutaml/model/mapping/yaml_mapping.rb +17 -0
- data/lib/lutaml/model/mapping.rb +14 -0
- data/lib/lutaml/model/schema/xml_compiler.rb +15 -15
- data/lib/lutaml/model/sequence.rb +2 -2
- data/lib/lutaml/model/serialize.rb +247 -97
- data/lib/lutaml/model/type/date.rb +1 -1
- data/lib/lutaml/model/type/date_time.rb +2 -2
- data/lib/lutaml/model/type/hash.rb +1 -1
- data/lib/lutaml/model/type/time.rb +2 -2
- data/lib/lutaml/model/type/time_without_date.rb +2 -2
- data/lib/lutaml/model/uninitialized_class.rb +64 -0
- data/lib/lutaml/model/utils.rb +14 -0
- data/lib/lutaml/model/validation.rb +1 -0
- data/lib/lutaml/model/version.rb +1 -1
- data/lib/lutaml/model/xml_adapter/nokogiri_adapter.rb +1 -1
- data/lib/lutaml/model/xml_adapter/oga_adapter.rb +1 -1
- data/lib/lutaml/model/xml_adapter/ox_adapter.rb +1 -1
- data/lib/lutaml/model/xml_adapter/xml_document.rb +38 -17
- data/lib/lutaml/model/xml_adapter/xml_element.rb +17 -7
- data/lib/lutaml/model.rb +1 -0
- data/spec/benchmarks/xml_parsing_benchmark_spec.rb +3 -3
- data/spec/fixtures/person.rb +5 -5
- data/spec/lutaml/model/attribute_spec.rb +37 -1
- data/spec/lutaml/model/cdata_spec.rb +2 -2
- data/spec/lutaml/model/collection_spec.rb +50 -2
- data/spec/lutaml/model/comparable_model_spec.rb +92 -27
- data/spec/lutaml/model/defaults_spec.rb +1 -1
- data/spec/lutaml/model/enum_spec.rb +1 -1
- data/spec/lutaml/model/group_spec.rb +316 -14
- data/spec/lutaml/model/key_value_mapping_spec.rb +41 -3
- data/spec/lutaml/model/polymorphic_spec.rb +348 -0
- data/spec/lutaml/model/render_empty_spec.rb +194 -0
- data/spec/lutaml/model/render_nil_spec.rb +206 -22
- data/spec/lutaml/model/simple_model_spec.rb +9 -9
- data/spec/lutaml/model/value_map_spec.rb +240 -0
- data/spec/lutaml/model/xml/namespace/nested_with_explicit_namespace_spec.rb +85 -0
- data/spec/lutaml/model/xml/xml_element_spec.rb +93 -0
- data/spec/lutaml/model/xml_mapping_rule_spec.rb +102 -2
- data/spec/lutaml/model/xml_mapping_spec.rb +45 -3
- data/spec/sample_model_spec.rb +3 -3
- metadata +20 -8
- 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!(
|
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!(
|
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!(
|
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!(
|
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
|
-
|
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
|
-
|
211
|
-
|
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
|
-
|
216
|
-
|
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
|
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
|
-
|
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
|
-
|
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"
|