shale 0.3.1 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +37 -0
  3. data/README.md +398 -41
  4. data/exe/shaleb +108 -36
  5. data/lib/shale/adapter/nokogiri/document.rb +97 -0
  6. data/lib/shale/adapter/nokogiri/node.rb +100 -0
  7. data/lib/shale/adapter/nokogiri.rb +11 -151
  8. data/lib/shale/adapter/ox/document.rb +90 -0
  9. data/lib/shale/adapter/ox/node.rb +97 -0
  10. data/lib/shale/adapter/ox.rb +9 -134
  11. data/lib/shale/adapter/rexml/document.rb +98 -0
  12. data/lib/shale/adapter/rexml/node.rb +99 -0
  13. data/lib/shale/adapter/rexml.rb +9 -150
  14. data/lib/shale/adapter/toml_rb.rb +34 -0
  15. data/lib/shale/attribute.rb +6 -0
  16. data/lib/shale/error.rb +56 -0
  17. data/lib/shale/mapper.rb +67 -13
  18. data/lib/shale/mapping/descriptor/xml.rb +10 -1
  19. data/lib/shale/mapping/dict.rb +18 -0
  20. data/lib/shale/mapping/xml.rb +40 -5
  21. data/lib/shale/schema/compiler/boolean.rb +21 -0
  22. data/lib/shale/schema/compiler/complex.rb +88 -0
  23. data/lib/shale/schema/compiler/date.rb +21 -0
  24. data/lib/shale/schema/compiler/float.rb +21 -0
  25. data/lib/shale/schema/compiler/integer.rb +21 -0
  26. data/lib/shale/schema/compiler/property.rb +70 -0
  27. data/lib/shale/schema/compiler/string.rb +21 -0
  28. data/lib/shale/schema/compiler/time.rb +21 -0
  29. data/lib/shale/schema/compiler/value.rb +21 -0
  30. data/lib/shale/schema/compiler/xml_complex.rb +50 -0
  31. data/lib/shale/schema/compiler/xml_property.rb +73 -0
  32. data/lib/shale/schema/json_compiler.rb +331 -0
  33. data/lib/shale/schema/{json → json_generator}/base.rb +2 -2
  34. data/lib/shale/schema/{json → json_generator}/boolean.rb +1 -1
  35. data/lib/shale/schema/{json → json_generator}/collection.rb +2 -2
  36. data/lib/shale/schema/{json → json_generator}/date.rb +1 -1
  37. data/lib/shale/schema/{json → json_generator}/float.rb +1 -1
  38. data/lib/shale/schema/{json → json_generator}/integer.rb +1 -1
  39. data/lib/shale/schema/{json → json_generator}/object.rb +5 -2
  40. data/lib/shale/schema/{json → json_generator}/ref.rb +1 -1
  41. data/lib/shale/schema/{json → json_generator}/schema.rb +6 -4
  42. data/lib/shale/schema/{json → json_generator}/string.rb +1 -1
  43. data/lib/shale/schema/{json → json_generator}/time.rb +1 -1
  44. data/lib/shale/schema/json_generator/value.rb +23 -0
  45. data/lib/shale/schema/{json.rb → json_generator.rb} +36 -36
  46. data/lib/shale/schema/xml_compiler.rb +919 -0
  47. data/lib/shale/schema/{xml → xml_generator}/attribute.rb +1 -1
  48. data/lib/shale/schema/{xml → xml_generator}/complex_type.rb +5 -2
  49. data/lib/shale/schema/{xml → xml_generator}/element.rb +1 -1
  50. data/lib/shale/schema/{xml → xml_generator}/import.rb +1 -1
  51. data/lib/shale/schema/{xml → xml_generator}/ref_attribute.rb +1 -1
  52. data/lib/shale/schema/{xml → xml_generator}/ref_element.rb +1 -1
  53. data/lib/shale/schema/{xml → xml_generator}/schema.rb +5 -5
  54. data/lib/shale/schema/{xml → xml_generator}/typed_attribute.rb +1 -1
  55. data/lib/shale/schema/{xml → xml_generator}/typed_element.rb +1 -1
  56. data/lib/shale/schema/{xml.rb → xml_generator.rb} +25 -26
  57. data/lib/shale/schema.rb +44 -5
  58. data/lib/shale/type/{composite.rb → complex.rb} +156 -51
  59. data/lib/shale/type/value.rb +31 -2
  60. data/lib/shale/utils.rb +42 -7
  61. data/lib/shale/version.rb +1 -1
  62. data/lib/shale.rb +22 -19
  63. data/shale.gemspec +3 -3
  64. metadata +50 -29
@@ -1,18 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../error'
3
4
  require_relative 'value'
4
5
 
5
6
  module Shale
6
7
  module Type
7
- # Build composite object. Don't use it directly.
8
+ # Build complex object. Don't use it directly.
8
9
  # It serves as a base type class for @see Shale::Mapper
9
10
  #
10
11
  # @api private
11
- class Composite < Value
12
+ class Complex < Value
12
13
  class << self
13
- %i[hash json yaml].each do |format|
14
+ %i[hash json yaml toml].each do |format|
14
15
  class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
15
- # Convert Hash to Object using Hash/JSON/YAML mapping
16
+ # Convert Hash to Object using Hash/JSON/YAML/TOML mapping
16
17
  #
17
18
  # @param [Hash] hash Hash to convert
18
19
  #
@@ -20,7 +21,12 @@ module Shale
20
21
  #
21
22
  # @api public
22
23
  def of_#{format}(hash)
23
- instance = new
24
+ instance = model.new
25
+
26
+ attributes
27
+ .values
28
+ .select { |attr| attr.default }
29
+ .each { |attr| instance.send(attr.setter, attr.default.call) }
24
30
 
25
31
  mapping_keys = #{format}_mapping.keys
26
32
 
@@ -29,24 +35,21 @@ module Shale
29
35
  next unless mapping
30
36
 
31
37
  if mapping.method_from
32
- instance.send(mapping.method_from, value)
38
+ new.send(mapping.method_from, instance, value)
33
39
  else
34
40
  attribute = attributes[mapping.attribute]
35
41
  next unless attribute
36
42
 
37
43
  if value.nil?
38
- instance.public_send("\#{attribute.name}=", nil)
39
- next
40
- end
41
-
42
- if attribute.collection?
44
+ instance.send(attribute.setter, nil)
45
+ elsif attribute.collection?
43
46
  [*value].each do |val|
44
47
  val = val ? attribute.type.of_#{format}(val) : val
45
- instance.public_send(attribute.name) << attribute.type.cast(val)
48
+ instance.send(attribute.name) << attribute.type.cast(val)
46
49
  end
47
50
  else
48
51
  val = attribute.type.of_#{format}(value)
49
- instance.public_send("\#{attribute.name}=", val)
52
+ instance.send(attribute.setter, attribute.type.cast(val))
50
53
  end
51
54
  end
52
55
  end
@@ -54,31 +57,35 @@ module Shale
54
57
  instance
55
58
  end
56
59
 
57
- # Convert Object to Hash using Hash/JSON/YAML mapping
60
+ # Convert Object to Hash using Hash/JSON/YAML/TOML mapping
61
+ #
62
+ # @param [any] instance Object to convert
58
63
  #
59
- # @param [Shale::Mapper] instance Object to convert
64
+ # @raise [IncorrectModelError]
60
65
  #
61
66
  # @return [Hash]
62
67
  #
63
68
  # @api public
64
69
  def as_#{format}(instance)
70
+ unless instance.is_a?(model)
71
+ msg = "argument is a '\#{instance.class}' but should be a '\#{model}'"
72
+ raise IncorrectModelError, msg
73
+ end
74
+
65
75
  hash = {}
66
76
 
67
- instance.class.#{format}_mapping.keys.each_value do |mapping|
77
+ #{format}_mapping.keys.each_value do |mapping|
68
78
  if mapping.method_to
69
- hash[mapping.name] = instance.send(mapping.method_to)
79
+ hash[mapping.name] = new.send(mapping.method_to, instance)
70
80
  else
71
- attribute = instance.class.attributes[mapping.attribute]
81
+ attribute = attributes[mapping.attribute]
72
82
  next unless attribute
73
83
 
74
- value = instance.public_send(attribute.name)
84
+ value = instance.send(attribute.name)
75
85
 
76
86
  if value.nil?
77
87
  hash[mapping.name] = nil
78
- next
79
- end
80
-
81
- if attribute.collection?
88
+ elsif attribute.collection?
82
89
  hash[mapping.name] = [*value].map do |v|
83
90
  v ? attribute.type.as_#{format}(v) : v
84
91
  end
@@ -142,6 +149,30 @@ module Shale
142
149
  Shale.yaml_adapter.dump(as_yaml(instance))
143
150
  end
144
151
 
152
+ # Convert TOML to Object
153
+ #
154
+ # @param [String] toml TOML to convert
155
+ #
156
+ # @return [Shale::Mapper]
157
+ #
158
+ # @api public
159
+ def from_toml(toml)
160
+ validate_toml_adapter
161
+ of_toml(Shale.toml_adapter.load(toml))
162
+ end
163
+
164
+ # Convert Object to TOML
165
+ #
166
+ # @param [Shale::Mapper] instance Object to convert
167
+ #
168
+ # @return [String]
169
+ #
170
+ # @api public
171
+ def to_toml(instance)
172
+ validate_toml_adapter
173
+ Shale.toml_adapter.dump(as_toml(instance))
174
+ end
175
+
145
176
  # Convert XML document to Object
146
177
  #
147
178
  # @param [Shale::Adapter::<XML adapter>::Node] xml XML to convert
@@ -150,31 +181,43 @@ module Shale
150
181
  #
151
182
  # @api public
152
183
  def of_xml(element)
153
- instance = new
184
+ instance = model.new
185
+
186
+ attributes
187
+ .values
188
+ .select { |attr| attr.default }
189
+ .each { |attr| instance.send(attr.setter, attr.default.call) }
154
190
 
155
191
  element.attributes.each do |key, value|
156
192
  mapping = xml_mapping.attributes[key.to_s]
157
193
  next unless mapping
158
194
 
159
195
  if mapping.method_from
160
- instance.send(mapping.method_from, value)
196
+ new.send(mapping.method_from, instance, value)
161
197
  else
162
198
  attribute = attributes[mapping.attribute]
163
199
  next unless attribute
164
200
 
165
201
  if attribute.collection?
166
- instance.public_send(attribute.name) << attribute.type.cast(value)
202
+ instance.send(attribute.name) << attribute.type.cast(value)
167
203
  else
168
- instance.public_send("#{attribute.name}=", value)
204
+ instance.send(attribute.setter, attribute.type.cast(value))
169
205
  end
170
206
  end
171
207
  end
172
208
 
173
- if xml_mapping.content
174
- attribute = attributes[xml_mapping.content]
209
+ content_mapping = xml_mapping.content
210
+
211
+ if content_mapping
212
+ if content_mapping.method_from
213
+ new.send(content_mapping.method_from, instance, element)
214
+ else
215
+ attribute = attributes[content_mapping.attribute]
175
216
 
176
- if attribute
177
- instance.public_send("#{attribute.name}=", attribute.type.of_xml(element))
217
+ if attribute
218
+ value = attribute.type.of_xml(element)
219
+ instance.send(attribute.setter, attribute.type.cast(value))
220
+ end
178
221
  end
179
222
  end
180
223
 
@@ -183,16 +226,17 @@ module Shale
183
226
  next unless mapping
184
227
 
185
228
  if mapping.method_from
186
- instance.send(mapping.method_from, node)
229
+ new.send(mapping.method_from, instance, node)
187
230
  else
188
231
  attribute = attributes[mapping.attribute]
189
232
  next unless attribute
190
233
 
234
+ value = attribute.type.of_xml(node)
235
+
191
236
  if attribute.collection?
192
- value = attribute.type.of_xml(node)
193
- instance.public_send(attribute.name) << attribute.type.cast(value)
237
+ instance.send(attribute.name) << attribute.type.cast(value)
194
238
  else
195
- instance.public_send("#{attribute.name}=", attribute.type.of_xml(node))
239
+ instance.send(attribute.setter, attribute.type.cast(value))
196
240
  end
197
241
  end
198
242
  end
@@ -204,23 +248,33 @@ module Shale
204
248
  #
205
249
  # @param [String] xml XML to convert
206
250
  #
251
+ # @raise [AdapterError]
252
+ #
207
253
  # @return [Shale::Mapper]
208
254
  #
209
255
  # @api public
210
256
  def from_xml(xml)
257
+ validate_xml_adapter
211
258
  of_xml(Shale.xml_adapter.load(xml))
212
259
  end
213
260
 
214
261
  # Convert Object to XML document
215
262
  #
216
- # @param [Shale::Mapper] instance Object to convert
263
+ # @param [any] instance Object to convert
217
264
  # @param [String, nil] node_name XML node name
218
265
  # @param [Shale::Adapter::<xml adapter>::Document, nil] doc Object to convert
219
266
  #
267
+ # @raise [IncorrectModelError]
268
+ #
220
269
  # @return [::REXML::Document, ::Nokogiri::Document, ::Ox::Document]
221
270
  #
222
271
  # @api public
223
- def as_xml(instance, node_name = nil, doc = nil)
272
+ def as_xml(instance, node_name = nil, doc = nil, _cdata = nil)
273
+ unless instance.is_a?(model)
274
+ msg = "argument is a '#{instance.class}' but should be a '#{model}'"
275
+ raise IncorrectModelError, msg
276
+ end
277
+
224
278
  unless doc
225
279
  doc = Shale.xml_adapter.create_document
226
280
  doc.add_element(doc.doc, as_xml(instance, xml_mapping.prefixed_root, doc))
@@ -228,16 +282,20 @@ module Shale
228
282
  end
229
283
 
230
284
  element = doc.create_element(node_name)
231
- doc.add_namespace(xml_mapping.default_namespace.prefix, xml_mapping.default_namespace.name)
285
+
286
+ doc.add_namespace(
287
+ xml_mapping.default_namespace.prefix,
288
+ xml_mapping.default_namespace.name
289
+ )
232
290
 
233
291
  xml_mapping.attributes.each_value do |mapping|
234
292
  if mapping.method_to
235
- instance.send(mapping.method_to, element, doc)
293
+ new.send(mapping.method_to, instance, element, doc)
236
294
  else
237
- attribute = instance.class.attributes[mapping.attribute]
295
+ attribute = attributes[mapping.attribute]
238
296
  next unless attribute
239
297
 
240
- value = instance.public_send(attribute.name)
298
+ value = instance.send(attribute.name)
241
299
  next if value.nil?
242
300
 
243
301
  doc.add_namespace(mapping.namespace.prefix, mapping.namespace.name)
@@ -245,23 +303,36 @@ module Shale
245
303
  end
246
304
  end
247
305
 
248
- if xml_mapping.content
249
- attribute = instance.class.attributes[xml_mapping.content]
306
+ content_mapping = xml_mapping.content
307
+
308
+ if content_mapping
309
+ if content_mapping.method_to
310
+ new.send(content_mapping.method_to, instance, element, doc)
311
+ else
312
+ attribute = attributes[content_mapping.attribute]
250
313
 
251
- if attribute
252
- value = instance.public_send(attribute.name)
253
- doc.add_text(element, value.to_s) if value
314
+ if attribute
315
+ value = instance.send(attribute.name)
316
+
317
+ # rubocop:disable Metrics/BlockNesting
318
+ if content_mapping.cdata
319
+ doc.create_cdata(value.to_s, element)
320
+ else
321
+ doc.add_text(element, value.to_s)
322
+ end
323
+ # rubocop:enable Metrics/BlockNesting
324
+ end
254
325
  end
255
326
  end
256
327
 
257
328
  xml_mapping.elements.each_value do |mapping|
258
329
  if mapping.method_to
259
- instance.send(mapping.method_to, element, doc)
330
+ new.send(mapping.method_to, instance, element, doc)
260
331
  else
261
- attribute = instance.class.attributes[mapping.attribute]
332
+ attribute = attributes[mapping.attribute]
262
333
  next unless attribute
263
334
 
264
- value = instance.public_send(attribute.name)
335
+ value = instance.send(attribute.name)
265
336
  next if value.nil?
266
337
 
267
338
  doc.add_namespace(mapping.namespace.prefix, mapping.namespace.name)
@@ -269,10 +340,12 @@ module Shale
269
340
  if attribute.collection?
270
341
  [*value].each do |v|
271
342
  next if v.nil?
272
- doc.add_element(element, attribute.type.as_xml(v, mapping.prefixed_name, doc))
343
+ child = attribute.type.as_xml(v, mapping.prefixed_name, doc, mapping.cdata)
344
+ doc.add_element(element, child)
273
345
  end
274
346
  else
275
- doc.add_element(element, attribute.type.as_xml(value, mapping.prefixed_name, doc))
347
+ child = attribute.type.as_xml(value, mapping.prefixed_name, doc, mapping.cdata)
348
+ doc.add_element(element, child)
276
349
  end
277
350
  end
278
351
  end
@@ -285,12 +358,35 @@ module Shale
285
358
  # @param [Shale::Mapper] instance Object to convert
286
359
  # @param [Array<Symbol>] options
287
360
  #
361
+ # @raise [AdapterError]
362
+ #
288
363
  # @return [String]
289
364
  #
290
365
  # @api public
291
366
  def to_xml(instance, *options)
367
+ validate_xml_adapter
292
368
  Shale.xml_adapter.dump(as_xml(instance), *options)
293
369
  end
370
+
371
+ private
372
+
373
+ # Validate TOML adapter
374
+ #
375
+ # @raise [AdapterError]
376
+ #
377
+ # @api private
378
+ def validate_toml_adapter
379
+ raise AdapterError, TOML_ADAPTER_NOT_SET_MESSAGE unless Shale.toml_adapter
380
+ end
381
+
382
+ # Validate XML adapter
383
+ #
384
+ # @raise [AdapterError]
385
+ #
386
+ # @api private
387
+ def validate_xml_adapter
388
+ raise AdapterError, XML_ADAPTER_NOT_SET_MESSAGE unless Shale.xml_adapter
389
+ end
294
390
  end
295
391
 
296
392
  # Convert Object to Hash
@@ -322,6 +418,15 @@ module Shale
322
418
  self.class.to_yaml(self)
323
419
  end
324
420
 
421
+ # Convert Object to TOML
422
+ #
423
+ # @return [String]
424
+ #
425
+ # @api public
426
+ def to_toml
427
+ self.class.to_toml(self)
428
+ end
429
+
325
430
  # Convert Object to XML
326
431
  #
327
432
  # @param [Array<Symbol>] options
@@ -89,6 +89,28 @@ module Shale
89
89
  value
90
90
  end
91
91
 
92
+ # Extract value from TOML document
93
+ #
94
+ # @param [any] value
95
+ #
96
+ # @return [any]
97
+ #
98
+ # @api private
99
+ def of_toml(value)
100
+ value
101
+ end
102
+
103
+ # Convert value to form accepted by TOML document
104
+ #
105
+ # @param [any] value
106
+ #
107
+ # @return [any]
108
+ #
109
+ # @api private
110
+ def as_toml(value)
111
+ value
112
+ end
113
+
92
114
  # Extract value from XML document
93
115
  #
94
116
  # @param [Shale::Adapter::<XML adapter>::Node] value
@@ -116,11 +138,18 @@ module Shale
116
138
  # @param [#to_s] value Value to convert to XML
117
139
  # @param [String] name Name of the element
118
140
  # @param [Shale::Adapter::<XML adapter>::Document] doc Document
141
+ # @param [true, false] cdata
119
142
  #
120
143
  # @api private
121
- def as_xml(value, name, doc)
144
+ def as_xml(value, name, doc, cdata = false)
122
145
  element = doc.create_element(name)
123
- doc.add_text(element, as_xml_value(value))
146
+
147
+ if cdata
148
+ doc.create_cdata(as_xml_value(value), element)
149
+ else
150
+ doc.add_text(element, as_xml_value(value))
151
+ end
152
+
124
153
  element
125
154
  end
126
155
  end
data/lib/shale/utils.rb CHANGED
@@ -5,6 +5,46 @@ module Shale
5
5
  #
6
6
  # @api private
7
7
  module Utils
8
+ # Convert string to Ruby's class naming convention
9
+ #
10
+ # @param [String] val
11
+ #
12
+ # @example
13
+ # Shale::Utils.classify('foobar')
14
+ # # => 'Foobar'
15
+ #
16
+ # @api private
17
+ def self.classify(str)
18
+ str = str.to_s.sub(/.*\./, '')
19
+
20
+ str = str.sub(/^[a-z\d]*/) { |match| match.capitalize || match }
21
+
22
+ str.gsub(%r{(?:_|-|(/))([a-z\d]*)}i) do
23
+ word = Regexp.last_match(2)
24
+ substituted = word.capitalize || word
25
+ Regexp.last_match(1) ? "::#{substituted}" : substituted
26
+ end
27
+ end
28
+
29
+ # Convert string to snake case
30
+ #
31
+ # @param [String] val
32
+ #
33
+ # @example
34
+ # Shale::Utils.snake_case('FooBar')
35
+ # # => 'foo_bar'
36
+ #
37
+ # @api private
38
+ def self.snake_case(str)
39
+ return str.to_s unless /[A-Z-]|::/.match?(str)
40
+ word = str.to_s.gsub('::', '/')
41
+ word = word.gsub(/([A-Z]+)(?=[A-Z][a-z])|([a-z\d])(?=[A-Z])/) do
42
+ "#{Regexp.last_match(1) || Regexp.last_match(2)}_"
43
+ end
44
+ word = word.tr('-', '_')
45
+ word.downcase
46
+ end
47
+
8
48
  # Convert word to under score
9
49
  #
10
50
  # @param [String] word
@@ -14,13 +54,8 @@ module Shale
14
54
  # Shale::Utils.underscore('Namespace::FooBar') # => foo_bar
15
55
  #
16
56
  # @api private
17
- def self.underscore(word)
18
- word
19
- .split('::')
20
- .last
21
- .gsub(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2')
22
- .gsub(/([a-z\d])([A-Z])/, '\1_\2')
23
- .downcase
57
+ def self.underscore(str)
58
+ snake_case(str).split('/').last
24
59
  end
25
60
 
26
61
  # Return value or nil if value is empty
data/lib/shale/version.rb CHANGED
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Shale
4
4
  # @api private
5
- VERSION = '0.3.1'
5
+ VERSION = '0.6.0'
6
6
  end
data/lib/shale.rb CHANGED
@@ -4,7 +4,6 @@ require 'yaml'
4
4
 
5
5
  require_relative 'shale/mapper'
6
6
  require_relative 'shale/adapter/json'
7
- require_relative 'shale/adapter/rexml'
8
7
  require_relative 'shale/type/boolean'
9
8
  require_relative 'shale/type/date'
10
9
  require_relative 'shale/type/float'
@@ -73,15 +72,34 @@ module Shale
73
72
  # @api public
74
73
  attr_writer :yaml_adapter
75
74
 
76
- # Set XML adapter
75
+ # TOML adapter accessor.
76
+ #
77
+ # @param [@see Shale::Adapter::TomlRB] adapter
78
+ #
79
+ # @example setting adapter
80
+ # Shale.toml_adapter = Shale::Adapter::TomlRB
81
+ #
82
+ # @example getting adapter
83
+ # Shale.toml_adapter
84
+ # # => Shale::Adapter::TomlRB
85
+ #
86
+ # @api public
87
+ attr_accessor :toml_adapter
88
+
89
+ # XML adapter accessor. Available adapters are Shale::Adapter::REXML,
90
+ # Shale::Adapter::Nokogiri and Shale::Adapter::Ox
77
91
  #
78
92
  # @param [@see Shale::Adapter::REXML] adapter
79
93
  #
80
- # @example
94
+ # @example setting adapter
81
95
  # Shale.xml_adapter = Shale::Adapter::REXML
82
96
  #
97
+ # @example getting adapter
98
+ # Shale.xml_adapter
99
+ # # => Shale::Adapter::REXML
100
+ #
83
101
  # @api public
84
- attr_writer :xml_adapter
102
+ attr_accessor :xml_adapter
85
103
 
86
104
  # Return JSON adapter. By default Shale::Adapter::JSON is used
87
105
  #
@@ -108,20 +126,5 @@ module Shale
108
126
  def yaml_adapter
109
127
  @yaml_adapter || YAML
110
128
  end
111
-
112
- # Return XML adapter. By default Shale::Adapter::REXML is used.
113
- # Available adapters are Shale::Adapter::REXML,
114
- # Shale::Adapter::Nokogiri and Shale::Adapter::Ox
115
- #
116
- # @return [@see Shale::Adapter::REXML]
117
- #
118
- # @example
119
- # Shale.xml_adapter
120
- # # => Shale::Adapter::REXML
121
- #
122
- # @api public
123
- def xml_adapter
124
- @xml_adapter || Adapter::REXML
125
- end
126
129
  end
127
130
  end
data/shale.gemspec CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
8
8
  spec.authors = ['Kamil Giszczak']
9
9
  spec.email = ['beerkg@gmail.com']
10
10
 
11
- spec.summary = 'Ruby object mapper and serializer for XML, JSON and YAML.'
12
- spec.description = 'Ruby object mapper and serializer for XML, JSON and YAML.'
11
+ spec.summary = 'Ruby object mapper and serializer for XML, JSON, TOML and YAML.'
12
+ spec.description = 'Ruby object mapper and serializer for XML, JSON, TOML and YAML.'
13
13
  spec.homepage = 'https://shalerb.org'
14
14
  spec.license = 'MIT'
15
15
 
@@ -26,5 +26,5 @@ Gem::Specification.new do |spec|
26
26
  spec.bindir = 'exe'
27
27
  spec.executables = 'shaleb'
28
28
 
29
- spec.required_ruby_version = '>= 2.6.0'
29
+ spec.required_ruby_version = '>= 2.7.0'
30
30
  end