shale 0.5.0 → 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.
@@ -11,40 +11,80 @@ module Shale
11
11
  # @api private
12
12
  class Complex < Value
13
13
  class << self
14
- %i[hash json yaml].each do |format|
14
+ %i[hash json yaml toml].each do |format|
15
15
  class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
16
- # Convert Hash to Object using Hash/JSON/YAML mapping
16
+ # Convert Hash to Object using Hash/JSON/YAML/TOML mapping
17
17
  #
18
18
  # @param [Hash] hash Hash to convert
19
+ # @param [Array<Symbol>] only
20
+ # @param [Array<Symbol>] except
21
+ # @param [any] context
19
22
  #
20
- # @return [Shale::Mapper]
23
+ # @return [model instance]
21
24
  #
22
25
  # @api public
23
- def of_#{format}(hash)
24
- instance = new
26
+ def of_#{format}(hash, only: nil, except: nil, context: nil)
27
+ instance = model.new
28
+
29
+ attributes
30
+ .values
31
+ .select { |attr| attr.default }
32
+ .each { |attr| instance.send(attr.setter, attr.default.call) }
25
33
 
26
34
  mapping_keys = #{format}_mapping.keys
27
35
 
36
+ only = to_partial_render_attributes(only)
37
+ except = to_partial_render_attributes(except)
38
+
28
39
  hash.each do |key, value|
29
40
  mapping = mapping_keys[key]
30
41
  next unless mapping
31
42
 
32
43
  if mapping.method_from
33
- instance.send(mapping.method_from, value)
44
+ mapper = new
45
+
46
+ if mapper.method(mapping.method_from).arity == 3
47
+ mapper.send(mapping.method_from, instance, value, context)
48
+ else
49
+ mapper.send(mapping.method_from, instance, value)
50
+ end
34
51
  else
35
52
  attribute = attributes[mapping.attribute]
36
53
  next unless attribute
37
54
 
55
+ if only
56
+ attribute_only = only[attribute.name]
57
+ next unless only.key?(attribute.name)
58
+ end
59
+
60
+ if except
61
+ attribute_except = except[attribute.name]
62
+ next if except.key?(attribute.name) && attribute_except.nil?
63
+ end
64
+
38
65
  if value.nil?
39
66
  instance.send(attribute.setter, nil)
40
67
  elsif attribute.collection?
41
68
  [*value].each do |val|
42
- val = val ? attribute.type.of_#{format}(val) : val
69
+ if val
70
+ val = attribute.type.of_#{format}(
71
+ val,
72
+ only: attribute_only,
73
+ except: attribute_except,
74
+ context: context
75
+ )
76
+ end
77
+
43
78
  instance.send(attribute.name) << attribute.type.cast(val)
44
79
  end
45
80
  else
46
- val = attribute.type.of_#{format}(value)
47
- instance.send(attribute.setter, val)
81
+ val = attribute.type.of_#{format}(
82
+ value,
83
+ only: attribute_only,
84
+ except: attribute_except,
85
+ context: context
86
+ )
87
+ instance.send(attribute.setter, attribute.type.cast(val))
48
88
  end
49
89
  end
50
90
  end
@@ -52,33 +92,76 @@ module Shale
52
92
  instance
53
93
  end
54
94
 
55
- # Convert Object to Hash using Hash/JSON/YAML mapping
95
+ # Convert Object to Hash using Hash/JSON/YAML/TOML mapping
56
96
  #
57
- # @param [Shale::Mapper] instance Object to convert
97
+ # @param [any] instance Object to convert
98
+ # @param [Array<Symbol>] only
99
+ # @param [Array<Symbol>] except
100
+ # @param [any] context
101
+ #
102
+ # @raise [IncorrectModelError]
58
103
  #
59
104
  # @return [Hash]
60
105
  #
61
106
  # @api public
62
- def as_#{format}(instance)
107
+ def as_#{format}(instance, only: nil, except: nil, context: nil)
108
+ unless instance.is_a?(model)
109
+ msg = "argument is a '\#{instance.class}' but should be a '\#{model}'"
110
+ raise IncorrectModelError, msg
111
+ end
112
+
63
113
  hash = {}
64
114
 
65
- instance.class.#{format}_mapping.keys.each_value do |mapping|
115
+ only = to_partial_render_attributes(only)
116
+ except = to_partial_render_attributes(except)
117
+
118
+ #{format}_mapping.keys.each_value do |mapping|
66
119
  if mapping.method_to
67
- hash[mapping.name] = instance.send(mapping.method_to)
120
+ mapper = new
121
+
122
+ if mapper.method(mapping.method_to).arity == 3
123
+ mapper.send(mapping.method_to, instance, hash, context)
124
+ else
125
+ mapper.send(mapping.method_to, instance, hash)
126
+ end
68
127
  else
69
- attribute = instance.class.attributes[mapping.attribute]
128
+ attribute = attributes[mapping.attribute]
70
129
  next unless attribute
71
130
 
131
+ if only
132
+ attribute_only = only[attribute.name]
133
+ next unless only.key?(attribute.name)
134
+ end
135
+
136
+ if except
137
+ attribute_except = except[attribute.name]
138
+ next if except.key?(attribute.name) && attribute_except.nil?
139
+ end
140
+
72
141
  value = instance.send(attribute.name)
73
142
 
74
143
  if value.nil?
75
- hash[mapping.name] = nil
144
+ hash[mapping.name] = nil if mapping.render_nil?
76
145
  elsif attribute.collection?
77
- hash[mapping.name] = [*value].map do |v|
78
- v ? attribute.type.as_#{format}(v) : v
146
+ hash[mapping.name] = [*value].map do |val|
147
+ if val
148
+ attribute.type.as_#{format}(
149
+ val,
150
+ only: attribute_only,
151
+ except: attribute_except,
152
+ context: context
153
+ )
154
+ else
155
+ val
156
+ end
79
157
  end
80
158
  else
81
- hash[mapping.name] = attribute.type.as_#{format}(value)
159
+ hash[mapping.name] = attribute.type.as_#{format}(
160
+ value,
161
+ only: attribute_only,
162
+ except: attribute_except,
163
+ context: context
164
+ )
82
165
  end
83
166
  end
84
167
  end
@@ -95,81 +178,187 @@ module Shale
95
178
  # Convert JSON to Object
96
179
  #
97
180
  # @param [String] json JSON to convert
181
+ # @param [Array<Symbol>] only
182
+ # @param [Array<Symbol>] except
183
+ # @param [any] context
98
184
  #
99
- # @return [Shale::Mapper]
185
+ # @return [model instance]
100
186
  #
101
187
  # @api public
102
- def from_json(json)
103
- of_json(Shale.json_adapter.load(json))
188
+ def from_json(json, only: nil, except: nil, context: nil)
189
+ of_json(
190
+ Shale.json_adapter.load(json),
191
+ only: only,
192
+ except: except,
193
+ context: context
194
+ )
104
195
  end
105
196
 
106
197
  # Convert Object to JSON
107
198
  #
108
- # @param [Shale::Mapper] instance Object to convert
109
- # @param [Array<Symbol>] options
199
+ # @param [model instance] instance Object to convert
200
+ # @param [Array<Symbol>] only
201
+ # @param [Array<Symbol>] except
202
+ # @param [any] context
203
+ # @param [true, false] pretty
110
204
  #
111
205
  # @return [String]
112
206
  #
113
207
  # @api public
114
- def to_json(instance, *options)
115
- Shale.json_adapter.dump(as_json(instance), *options)
208
+ def to_json(instance, only: nil, except: nil, context: nil, pretty: false)
209
+ Shale.json_adapter.dump(
210
+ as_json(instance, only: only, except: except, context: context),
211
+ pretty: pretty
212
+ )
116
213
  end
117
214
 
118
215
  # Convert YAML to Object
119
216
  #
120
217
  # @param [String] yaml YAML to convert
218
+ # @param [Array<Symbol>] only
219
+ # @param [Array<Symbol>] except
220
+ # @param [any] context
121
221
  #
122
- # @return [Shale::Mapper]
222
+ # @return [model instance]
123
223
  #
124
224
  # @api public
125
- def from_yaml(yaml)
126
- of_yaml(Shale.yaml_adapter.load(yaml))
225
+ def from_yaml(yaml, only: nil, except: nil, context: nil)
226
+ of_yaml(
227
+ Shale.yaml_adapter.load(yaml),
228
+ only: only,
229
+ except: except,
230
+ context: context
231
+ )
127
232
  end
128
233
 
129
234
  # Convert Object to YAML
130
235
  #
131
- # @param [Shale::Mapper] instance Object to convert
236
+ # @param [model instance] instance Object to convert
237
+ # @param [Array<Symbol>] only
238
+ # @param [Array<Symbol>] except
239
+ # @param [any] context
240
+ #
241
+ # @return [String]
242
+ #
243
+ # @api public
244
+ def to_yaml(instance, only: nil, except: nil, context: nil)
245
+ Shale.yaml_adapter.dump(
246
+ as_yaml(instance, only: only, except: except, context: context)
247
+ )
248
+ end
249
+
250
+ # Convert TOML to Object
251
+ #
252
+ # @param [String] toml TOML to convert
253
+ # @param [Array<Symbol>] only
254
+ # @param [Array<Symbol>] except
255
+ # @param [any] context
256
+ #
257
+ # @return [model instance]
258
+ #
259
+ # @api public
260
+ def from_toml(toml, only: nil, except: nil, context: nil)
261
+ validate_toml_adapter
262
+ of_toml(
263
+ Shale.toml_adapter.load(toml),
264
+ only: only,
265
+ except: except,
266
+ context: context
267
+ )
268
+ end
269
+
270
+ # Convert Object to TOML
271
+ #
272
+ # @param [model instance] instance Object to convert
273
+ # @param [Array<Symbol>] only
274
+ # @param [Array<Symbol>] except
275
+ # @param [any] context
132
276
  #
133
277
  # @return [String]
134
278
  #
135
279
  # @api public
136
- def to_yaml(instance)
137
- Shale.yaml_adapter.dump(as_yaml(instance))
280
+ def to_toml(instance, only: nil, except: nil, context: nil)
281
+ validate_toml_adapter
282
+ Shale.toml_adapter.dump(
283
+ as_toml(instance, only: only, except: except, context: context)
284
+ )
138
285
  end
139
286
 
140
287
  # Convert XML document to Object
141
288
  #
142
- # @param [Shale::Adapter::<XML adapter>::Node] xml XML to convert
289
+ # @param [Shale::Adapter::<XML adapter>::Node] element
290
+ # @param [Array<Symbol>] only
291
+ # @param [Array<Symbol>] except
292
+ # @param [any] context
143
293
  #
144
- # @return [Shale::Mapper]
294
+ # @return [model instance]
145
295
  #
146
296
  # @api public
147
- def of_xml(element)
148
- instance = new
297
+ def of_xml(element, only: nil, except: nil, context: nil)
298
+ instance = model.new
299
+
300
+ attributes
301
+ .values
302
+ .select { |attr| attr.default }
303
+ .each { |attr| instance.send(attr.setter, attr.default.call) }
304
+
305
+ only = to_partial_render_attributes(only)
306
+ except = to_partial_render_attributes(except)
149
307
 
150
308
  element.attributes.each do |key, value|
151
309
  mapping = xml_mapping.attributes[key.to_s]
152
310
  next unless mapping
153
311
 
154
312
  if mapping.method_from
155
- instance.send(mapping.method_from, value)
313
+ mapper = new
314
+
315
+ if mapper.method(mapping.method_from).arity == 3
316
+ mapper.send(mapping.method_from, instance, value, context)
317
+ else
318
+ mapper.send(mapping.method_from, instance, value)
319
+ end
156
320
  else
157
321
  attribute = attributes[mapping.attribute]
158
322
  next unless attribute
159
323
 
324
+ next if only && !only.key?(attribute.name)
325
+ next if except&.key?(attribute.name)
326
+
160
327
  if attribute.collection?
161
328
  instance.send(attribute.name) << attribute.type.cast(value)
162
329
  else
163
- instance.send(attribute.setter, value)
330
+ instance.send(attribute.setter, attribute.type.cast(value))
164
331
  end
165
332
  end
166
333
  end
167
334
 
168
- if xml_mapping.content
169
- attribute = attributes[xml_mapping.content]
335
+ content_mapping = xml_mapping.content
336
+
337
+ if content_mapping
338
+ if content_mapping.method_from
339
+ mapper = new
340
+
341
+ if mapper.method(content_mapping.method_from).arity == 3
342
+ mapper.send(content_mapping.method_from, instance, element, context)
343
+ else
344
+ mapper.send(content_mapping.method_from, instance, element)
345
+ end
346
+ else
347
+ attribute = attributes[content_mapping.attribute]
348
+
349
+ if attribute
350
+ skip = false
170
351
 
171
- if attribute
172
- instance.send(attribute.setter, attribute.type.of_xml(element))
352
+ # rubocop:disable Metrics/BlockNesting
353
+ skip = true if only && !only.key?(attribute.name)
354
+ skip = true if except&.key?(attribute.name)
355
+
356
+ unless skip
357
+ value = attribute.type.of_xml(element)
358
+ instance.send(attribute.setter, attribute.type.cast(value))
359
+ end
360
+ # rubocop:enable Metrics/BlockNesting
361
+ end
173
362
  end
174
363
  end
175
364
 
@@ -178,16 +367,38 @@ module Shale
178
367
  next unless mapping
179
368
 
180
369
  if mapping.method_from
181
- instance.send(mapping.method_from, node)
370
+ mapper = new
371
+
372
+ if mapper.method(mapping.method_from).arity == 3
373
+ mapper.send(mapping.method_from, instance, node, context)
374
+ else
375
+ mapper.send(mapping.method_from, instance, node)
376
+ end
182
377
  else
183
378
  attribute = attributes[mapping.attribute]
184
379
  next unless attribute
185
380
 
381
+ if only
382
+ attribute_only = only[attribute.name]
383
+ next unless only.key?(attribute.name)
384
+ end
385
+
386
+ if except
387
+ attribute_except = except[attribute.name]
388
+ next if except.key?(attribute.name) && attribute_except.nil?
389
+ end
390
+
391
+ value = attribute.type.of_xml(
392
+ node,
393
+ only: attribute_only,
394
+ except: attribute_except,
395
+ context: context
396
+ )
397
+
186
398
  if attribute.collection?
187
- value = attribute.type.of_xml(node)
188
399
  instance.send(attribute.name) << attribute.type.cast(value)
189
400
  else
190
- instance.send(attribute.setter, attribute.type.of_xml(node))
401
+ instance.send(attribute.setter, attribute.type.cast(value))
191
402
  end
192
403
  end
193
404
  end
@@ -198,79 +409,198 @@ module Shale
198
409
  # Convert XML to Object
199
410
  #
200
411
  # @param [String] xml XML to convert
412
+ # @param [Array<Symbol>] only
413
+ # @param [Array<Symbol>] except
414
+ # @param [any] context
201
415
  #
202
416
  # @raise [AdapterError]
203
417
  #
204
- # @return [Shale::Mapper]
418
+ # @return [model instance]
205
419
  #
206
420
  # @api public
207
- def from_xml(xml)
421
+ def from_xml(xml, only: nil, except: nil, context: nil)
208
422
  validate_xml_adapter
209
- of_xml(Shale.xml_adapter.load(xml))
423
+ of_xml(
424
+ Shale.xml_adapter.load(xml),
425
+ only: only,
426
+ except: except,
427
+ context: context
428
+ )
210
429
  end
211
430
 
212
431
  # Convert Object to XML document
213
432
  #
214
- # @param [Shale::Mapper] instance Object to convert
433
+ # @param [any] instance Object to convert
215
434
  # @param [String, nil] node_name XML node name
216
435
  # @param [Shale::Adapter::<xml adapter>::Document, nil] doc Object to convert
436
+ # @param [Array<Symbol>] only
437
+ # @param [Array<Symbol>] except
438
+ # @param [any] context
439
+ #
440
+ # @raise [IncorrectModelError]
217
441
  #
218
442
  # @return [::REXML::Document, ::Nokogiri::Document, ::Ox::Document]
219
443
  #
220
444
  # @api public
221
- def as_xml(instance, node_name = nil, doc = nil)
445
+ def as_xml(
446
+ instance,
447
+ node_name = nil,
448
+ doc = nil,
449
+ _cdata = nil,
450
+ only: nil,
451
+ except: nil,
452
+ context: nil
453
+ )
454
+ unless instance.is_a?(model)
455
+ msg = "argument is a '#{instance.class}' but should be a '#{model}'"
456
+ raise IncorrectModelError, msg
457
+ end
458
+
222
459
  unless doc
223
460
  doc = Shale.xml_adapter.create_document
224
- doc.add_element(doc.doc, as_xml(instance, xml_mapping.prefixed_root, doc))
461
+
462
+ element = as_xml(
463
+ instance,
464
+ xml_mapping.prefixed_root,
465
+ doc,
466
+ only: only,
467
+ except: except,
468
+ context: context
469
+ )
470
+ doc.add_element(doc.doc, element)
471
+
225
472
  return doc.doc
226
473
  end
227
474
 
228
475
  element = doc.create_element(node_name)
229
- doc.add_namespace(xml_mapping.default_namespace.prefix, xml_mapping.default_namespace.name)
476
+
477
+ doc.add_namespace(
478
+ xml_mapping.default_namespace.prefix,
479
+ xml_mapping.default_namespace.name
480
+ )
481
+
482
+ only = to_partial_render_attributes(only)
483
+ except = to_partial_render_attributes(except)
230
484
 
231
485
  xml_mapping.attributes.each_value do |mapping|
232
486
  if mapping.method_to
233
- instance.send(mapping.method_to, element, doc)
487
+ mapper = new
488
+
489
+ if mapper.method(mapping.method_to).arity == 4
490
+ mapper.send(mapping.method_to, instance, element, doc, context)
491
+ else
492
+ mapper.send(mapping.method_to, instance, element, doc)
493
+ end
234
494
  else
235
- attribute = instance.class.attributes[mapping.attribute]
495
+ attribute = attributes[mapping.attribute]
236
496
  next unless attribute
237
497
 
498
+ next if only && !only.key?(attribute.name)
499
+ next if except&.key?(attribute.name)
500
+
238
501
  value = instance.send(attribute.name)
239
- next if value.nil?
240
502
 
241
- doc.add_namespace(mapping.namespace.prefix, mapping.namespace.name)
242
- doc.add_attribute(element, mapping.prefixed_name, value)
503
+ if mapping.render_nil? || !value.nil?
504
+ doc.add_namespace(mapping.namespace.prefix, mapping.namespace.name)
505
+ doc.add_attribute(element, mapping.prefixed_name, value)
506
+ end
243
507
  end
244
508
  end
245
509
 
246
- if xml_mapping.content
247
- attribute = instance.class.attributes[xml_mapping.content]
510
+ content_mapping = xml_mapping.content
248
511
 
249
- if attribute
250
- value = instance.send(attribute.name)
251
- doc.add_text(element, value.to_s) if value
512
+ if content_mapping
513
+ if content_mapping.method_to
514
+ mapper = new
515
+
516
+ if mapper.method(content_mapping.method_to).arity == 4
517
+ mapper.send(content_mapping.method_to, instance, element, doc, context)
518
+ else
519
+ mapper.send(content_mapping.method_to, instance, element, doc)
520
+ end
521
+ else
522
+ attribute = attributes[content_mapping.attribute]
523
+
524
+ if attribute
525
+ skip = false
526
+
527
+ # rubocop:disable Metrics/BlockNesting
528
+ skip = true if only && !only.key?(attribute.name)
529
+ skip = true if except&.key?(attribute.name)
530
+
531
+ unless skip
532
+ value = instance.send(attribute.name)
533
+
534
+ if content_mapping.cdata
535
+ doc.create_cdata(value.to_s, element)
536
+ else
537
+ doc.add_text(element, value.to_s)
538
+ end
539
+ end
540
+ # rubocop:enable Metrics/BlockNesting
541
+ end
252
542
  end
253
543
  end
254
544
 
255
545
  xml_mapping.elements.each_value do |mapping|
256
546
  if mapping.method_to
257
- instance.send(mapping.method_to, element, doc)
547
+ mapper = new
548
+
549
+ if mapper.method(mapping.method_to).arity == 4
550
+ mapper.send(mapping.method_to, instance, element, doc, context)
551
+ else
552
+ mapper.send(mapping.method_to, instance, element, doc)
553
+ end
258
554
  else
259
- attribute = instance.class.attributes[mapping.attribute]
555
+ attribute = attributes[mapping.attribute]
260
556
  next unless attribute
261
557
 
558
+ if only
559
+ attribute_only = only[attribute.name]
560
+ next unless only.key?(attribute.name)
561
+ end
562
+
563
+ if except
564
+ attribute_except = except[attribute.name]
565
+ next if except.key?(attribute.name) && attribute_except.nil?
566
+ end
567
+
262
568
  value = instance.send(attribute.name)
263
- next if value.nil?
264
569
 
265
- doc.add_namespace(mapping.namespace.prefix, mapping.namespace.name)
570
+ if mapping.render_nil? || !value.nil?
571
+ doc.add_namespace(mapping.namespace.prefix, mapping.namespace.name)
572
+ end
266
573
 
267
- if attribute.collection?
574
+ if value.nil?
575
+ if mapping.render_nil?
576
+ child = doc.create_element(mapping.prefixed_name)
577
+ doc.add_element(element, child)
578
+ end
579
+ elsif attribute.collection?
268
580
  [*value].each do |v|
269
581
  next if v.nil?
270
- doc.add_element(element, attribute.type.as_xml(v, mapping.prefixed_name, doc))
582
+ child = attribute.type.as_xml(
583
+ v,
584
+ mapping.prefixed_name,
585
+ doc,
586
+ mapping.cdata,
587
+ only: attribute_only,
588
+ except: attribute_except,
589
+ context: context
590
+ )
591
+ doc.add_element(element, child)
271
592
  end
272
593
  else
273
- doc.add_element(element, attribute.type.as_xml(value, mapping.prefixed_name, doc))
594
+ child = attribute.type.as_xml(
595
+ value,
596
+ mapping.prefixed_name,
597
+ doc,
598
+ mapping.cdata,
599
+ only: attribute_only,
600
+ except: attribute_except,
601
+ context: context
602
+ )
603
+ doc.add_element(element, child)
274
604
  end
275
605
  end
276
606
  end
@@ -280,69 +610,153 @@ module Shale
280
610
 
281
611
  # Convert Object to XML
282
612
  #
283
- # @param [Shale::Mapper] instance Object to convert
284
- # @param [Array<Symbol>] options
613
+ # @param [model instance] instance Object to convert
614
+ # @param [Array<Symbol>] only
615
+ # @param [Array<Symbol>] except
616
+ # @param [any] context
617
+ # @param [true, false] pretty
618
+ # @param [true, false] declaration
285
619
  #
286
620
  # @raise [AdapterError]
287
621
  #
288
622
  # @return [String]
289
623
  #
290
624
  # @api public
291
- def to_xml(instance, *options)
625
+ def to_xml(
626
+ instance,
627
+ only: nil,
628
+ except: nil,
629
+ context: nil,
630
+ pretty: false,
631
+ declaration: false
632
+ )
292
633
  validate_xml_adapter
293
- Shale.xml_adapter.dump(as_xml(instance), *options)
634
+ Shale.xml_adapter.dump(
635
+ as_xml(instance, only: only, except: except, context: context),
636
+ pretty: pretty,
637
+ declaration: declaration
638
+ )
294
639
  end
295
640
 
296
641
  private
297
642
 
643
+ # Validate TOML adapter
644
+ #
645
+ # @raise [AdapterError]
646
+ #
647
+ # @api private
648
+ def validate_toml_adapter
649
+ raise AdapterError, TOML_ADAPTER_NOT_SET_MESSAGE unless Shale.toml_adapter
650
+ end
651
+
298
652
  # Validate XML adapter
299
653
  #
300
654
  # @raise [AdapterError]
301
655
  #
302
656
  # @api private
303
657
  def validate_xml_adapter
304
- raise AdapterError, ADAPTER_NOT_SET_MESSAGE unless Shale.xml_adapter
658
+ raise AdapterError, XML_ADAPTER_NOT_SET_MESSAGE unless Shale.xml_adapter
659
+ end
660
+
661
+ # Convert array with attributes to a hash
662
+ #
663
+ # @param [Array] ary
664
+ #
665
+ # @return [Hash, nil]
666
+ #
667
+ # @api private
668
+ def to_partial_render_attributes(ary)
669
+ return unless ary
670
+
671
+ ary.each_with_object([]) do |e, obj|
672
+ if e.is_a?(Hash)
673
+ obj.push(*e.to_a)
674
+ else
675
+ obj.push([e, nil])
676
+ end
677
+ end.to_h
305
678
  end
306
679
  end
307
680
 
308
681
  # Convert Object to Hash
309
682
  #
683
+ # @param [Array<Symbol>] only
684
+ # @param [Array<Symbol>] except
685
+ # @param [any] context
686
+ #
310
687
  # @return [Hash]
311
688
  #
312
689
  # @api public
313
- def to_hash
314
- self.class.to_hash(self)
690
+ def to_hash(only: nil, except: nil, context: nil)
691
+ self.class.to_hash(self, only: only, except: except, context: context)
315
692
  end
316
693
 
317
694
  # Convert Object to JSON
318
695
  #
319
- # @param [Array<Symbol>] options
696
+ # @param [Array<Symbol>] only
697
+ # @param [Array<Symbol>] except
698
+ # @param [any] context
699
+ # @param [true, false] pretty
320
700
  #
321
701
  # @return [String]
322
702
  #
323
703
  # @api public
324
- def to_json(*options)
325
- self.class.to_json(self, *options)
704
+ def to_json(only: nil, except: nil, context: nil, pretty: false)
705
+ self.class.to_json(
706
+ self,
707
+ only: only,
708
+ except: except,
709
+ context: context,
710
+ pretty: pretty
711
+ )
326
712
  end
327
713
 
328
714
  # Convert Object to YAML
329
715
  #
716
+ # @param [Array<Symbol>] only
717
+ # @param [Array<Symbol>] except
718
+ # @param [any] context
719
+ #
720
+ # @return [String]
721
+ #
722
+ # @api public
723
+ def to_yaml(only: nil, except: nil, context: nil)
724
+ self.class.to_yaml(self, only: only, except: except, context: context)
725
+ end
726
+
727
+ # Convert Object to TOML
728
+ #
729
+ # @param [Array<Symbol>] only
730
+ # @param [Array<Symbol>] except
731
+ # @param [any] context
732
+ #
330
733
  # @return [String]
331
734
  #
332
735
  # @api public
333
- def to_yaml
334
- self.class.to_yaml(self)
736
+ def to_toml(only: nil, except: nil, context: nil)
737
+ self.class.to_toml(self, only: only, except: except, context: context)
335
738
  end
336
739
 
337
740
  # Convert Object to XML
338
741
  #
339
- # @param [Array<Symbol>] options
742
+ # @param [Array<Symbol>] only
743
+ # @param [Array<Symbol>] except
744
+ # @param [any] context
745
+ # @param [true, false] pretty
746
+ # @param [true, false] declaration
340
747
  #
341
748
  # @return [String]
342
749
  #
343
750
  # @api public
344
- def to_xml(*options)
345
- self.class.to_xml(self, *options)
751
+ def to_xml(only: nil, except: nil, context: nil, pretty: false, declaration: false)
752
+ self.class.to_xml(
753
+ self,
754
+ only: only,
755
+ except: except,
756
+ context: context,
757
+ pretty: pretty,
758
+ declaration: declaration
759
+ )
346
760
  end
347
761
  end
348
762
  end