shale 1.0.0 → 1.2.0
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/CHANGELOG.md +20 -0
- data/README.md +263 -69
- data/lib/shale/adapter/json.rb +10 -7
- data/lib/shale/adapter/nokogiri.rb +1 -1
- data/lib/shale/adapter/ox.rb +2 -1
- data/lib/shale/adapter/toml_rb.rb +5 -3
- data/lib/shale/adapter/tomlib.rb +36 -0
- data/lib/shale/error.rb +26 -1
- data/lib/shale/mapper.rb +36 -30
- data/lib/shale/mapping/descriptor/dict.rb +10 -1
- data/lib/shale/mapping/dict.rb +4 -3
- data/lib/shale/mapping/dict_base.rb +29 -2
- data/lib/shale/schema/json_generator/base.rb +9 -3
- data/lib/shale/schema/json_generator/boolean.rb +2 -1
- data/lib/shale/schema/json_generator/collection.rb +18 -2
- data/lib/shale/schema/json_generator/date.rb +3 -1
- data/lib/shale/schema/json_generator/float.rb +7 -1
- data/lib/shale/schema/json_generator/integer.rb +7 -1
- data/lib/shale/schema/json_generator/object.rb +12 -2
- data/lib/shale/schema/json_generator/string.rb +6 -1
- data/lib/shale/schema/json_generator/time.rb +3 -1
- data/lib/shale/schema/json_generator/value.rb +2 -1
- data/lib/shale/schema/json_generator.rb +7 -3
- data/lib/shale/schema/xml_compiler.rb +12 -12
- data/lib/shale/type/boolean.rb +2 -0
- data/lib/shale/type/complex.rb +43 -18
- data/lib/shale/type/date.rb +2 -0
- data/lib/shale/type/float.rb +2 -0
- data/lib/shale/type/integer.rb +2 -0
- data/lib/shale/type/string.rb +2 -0
- data/lib/shale/type/time.rb +2 -0
- data/lib/shale/type.rb +56 -0
- data/lib/shale/utils.rb +1 -1
- data/lib/shale/version.rb +1 -1
- data/lib/shale.rb +18 -20
- data/shale.gemspec +3 -1
- metadata +21 -5
data/lib/shale/type/complex.rb
CHANGED
@@ -257,13 +257,14 @@ module Shale
|
|
257
257
|
# @param [Array<Symbol>] only
|
258
258
|
# @param [Array<Symbol>] except
|
259
259
|
# @param [any] context
|
260
|
+
# @param [Hash] json_options
|
260
261
|
#
|
261
262
|
# @return [model instance]
|
262
263
|
#
|
263
264
|
# @api public
|
264
|
-
def from_json(json, only: nil, except: nil, context: nil)
|
265
|
+
def from_json(json, only: nil, except: nil, context: nil, **json_options)
|
265
266
|
of_json(
|
266
|
-
Shale.json_adapter.load(json),
|
267
|
+
Shale.json_adapter.load(json, **json_options),
|
267
268
|
only: only,
|
268
269
|
except: except,
|
269
270
|
context: context
|
@@ -277,14 +278,15 @@ module Shale
|
|
277
278
|
# @param [Array<Symbol>] except
|
278
279
|
# @param [any] context
|
279
280
|
# @param [true, false] pretty
|
281
|
+
# @param [Hash] json_options
|
280
282
|
#
|
281
283
|
# @return [String]
|
282
284
|
#
|
283
285
|
# @api public
|
284
|
-
def to_json(instance, only: nil, except: nil, context: nil, pretty: false)
|
286
|
+
def to_json(instance, only: nil, except: nil, context: nil, pretty: false, **json_options)
|
285
287
|
Shale.json_adapter.dump(
|
286
288
|
as_json(instance, only: only, except: except, context: context),
|
287
|
-
pretty: pretty
|
289
|
+
**json_options.merge(pretty: pretty)
|
288
290
|
)
|
289
291
|
end
|
290
292
|
|
@@ -294,13 +296,14 @@ module Shale
|
|
294
296
|
# @param [Array<Symbol>] only
|
295
297
|
# @param [Array<Symbol>] except
|
296
298
|
# @param [any] context
|
299
|
+
# @param [Hash] yaml_options
|
297
300
|
#
|
298
301
|
# @return [model instance]
|
299
302
|
#
|
300
303
|
# @api public
|
301
|
-
def from_yaml(yaml, only: nil, except: nil, context: nil)
|
304
|
+
def from_yaml(yaml, only: nil, except: nil, context: nil, **yaml_options)
|
302
305
|
of_yaml(
|
303
|
-
Shale.yaml_adapter.load(yaml),
|
306
|
+
Shale.yaml_adapter.load(yaml, **yaml_options),
|
304
307
|
only: only,
|
305
308
|
except: except,
|
306
309
|
context: context
|
@@ -313,13 +316,15 @@ module Shale
|
|
313
316
|
# @param [Array<Symbol>] only
|
314
317
|
# @param [Array<Symbol>] except
|
315
318
|
# @param [any] context
|
319
|
+
# @param [Hash] yaml_options
|
316
320
|
#
|
317
321
|
# @return [String]
|
318
322
|
#
|
319
323
|
# @api public
|
320
|
-
def to_yaml(instance, only: nil, except: nil, context: nil)
|
324
|
+
def to_yaml(instance, only: nil, except: nil, context: nil, **yaml_options)
|
321
325
|
Shale.yaml_adapter.dump(
|
322
|
-
as_yaml(instance, only: only, except: except, context: context)
|
326
|
+
as_yaml(instance, only: only, except: except, context: context),
|
327
|
+
**yaml_options
|
323
328
|
)
|
324
329
|
end
|
325
330
|
|
@@ -329,14 +334,15 @@ module Shale
|
|
329
334
|
# @param [Array<Symbol>] only
|
330
335
|
# @param [Array<Symbol>] except
|
331
336
|
# @param [any] context
|
337
|
+
# @param [Hash] toml_options
|
332
338
|
#
|
333
339
|
# @return [model instance]
|
334
340
|
#
|
335
341
|
# @api public
|
336
|
-
def from_toml(toml, only: nil, except: nil, context: nil)
|
342
|
+
def from_toml(toml, only: nil, except: nil, context: nil, **toml_options)
|
337
343
|
validate_toml_adapter
|
338
344
|
of_toml(
|
339
|
-
Shale.toml_adapter.load(toml),
|
345
|
+
Shale.toml_adapter.load(toml, **toml_options),
|
340
346
|
only: only,
|
341
347
|
except: except,
|
342
348
|
context: context
|
@@ -349,14 +355,16 @@ module Shale
|
|
349
355
|
# @param [Array<Symbol>] only
|
350
356
|
# @param [Array<Symbol>] except
|
351
357
|
# @param [any] context
|
358
|
+
# @param [Hash] toml_options
|
352
359
|
#
|
353
360
|
# @return [String]
|
354
361
|
#
|
355
362
|
# @api public
|
356
|
-
def to_toml(instance, only: nil, except: nil, context: nil)
|
363
|
+
def to_toml(instance, only: nil, except: nil, context: nil, **toml_options)
|
357
364
|
validate_toml_adapter
|
358
365
|
Shale.toml_adapter.dump(
|
359
|
-
as_toml(instance, only: only, except: except, context: context)
|
366
|
+
as_toml(instance, only: only, except: except, context: context),
|
367
|
+
**toml_options
|
360
368
|
)
|
361
369
|
end
|
362
370
|
|
@@ -373,6 +381,7 @@ module Shale
|
|
373
381
|
#
|
374
382
|
# @api public
|
375
383
|
def from_csv(csv, only: nil, except: nil, context: nil, headers: false, **csv_options)
|
384
|
+
validate_csv_adapter
|
376
385
|
data = Shale.csv_adapter.load(csv, **csv_options.merge(headers: csv_mapping.keys.keys))
|
377
386
|
|
378
387
|
data.shift if headers
|
@@ -398,6 +407,7 @@ module Shale
|
|
398
407
|
#
|
399
408
|
# @api public
|
400
409
|
def to_csv(instance, only: nil, except: nil, context: nil, headers: false, **csv_options)
|
410
|
+
validate_csv_adapter
|
401
411
|
data = as_csv([*instance], only: only, except: except, context: context)
|
402
412
|
|
403
413
|
cols = csv_mapping.keys.values
|
@@ -892,6 +902,15 @@ module Shale
|
|
892
902
|
raise AdapterError, XML_ADAPTER_NOT_SET_MESSAGE unless Shale.xml_adapter
|
893
903
|
end
|
894
904
|
|
905
|
+
# Validate CSV adapter
|
906
|
+
#
|
907
|
+
# @raise [AdapterError]
|
908
|
+
#
|
909
|
+
# @api private
|
910
|
+
def validate_csv_adapter
|
911
|
+
raise AdapterError, CSV_ADAPTER_NOT_SET_MESSAGE unless Shale.csv_adapter
|
912
|
+
end
|
913
|
+
|
895
914
|
# Convert array with attributes to a hash
|
896
915
|
#
|
897
916
|
# @param [Array] ary
|
@@ -989,17 +1008,19 @@ module Shale
|
|
989
1008
|
# @param [Array<Symbol>] except
|
990
1009
|
# @param [any] context
|
991
1010
|
# @param [true, false] pretty
|
1011
|
+
# @param [Hash] json_options
|
992
1012
|
#
|
993
1013
|
# @return [String]
|
994
1014
|
#
|
995
1015
|
# @api public
|
996
|
-
def to_json(only: nil, except: nil, context: nil, pretty: false)
|
1016
|
+
def to_json(only: nil, except: nil, context: nil, pretty: false, **json_options)
|
997
1017
|
self.class.to_json(
|
998
1018
|
self,
|
999
1019
|
only: only,
|
1000
1020
|
except: except,
|
1001
1021
|
context: context,
|
1002
|
-
pretty: pretty
|
1022
|
+
pretty: pretty,
|
1023
|
+
**json_options
|
1003
1024
|
)
|
1004
1025
|
end
|
1005
1026
|
|
@@ -1008,12 +1029,13 @@ module Shale
|
|
1008
1029
|
# @param [Array<Symbol>] only
|
1009
1030
|
# @param [Array<Symbol>] except
|
1010
1031
|
# @param [any] context
|
1032
|
+
# @param [Hash] yaml_options
|
1011
1033
|
#
|
1012
1034
|
# @return [String]
|
1013
1035
|
#
|
1014
1036
|
# @api public
|
1015
|
-
def to_yaml(only: nil, except: nil, context: nil)
|
1016
|
-
self.class.to_yaml(self, only: only, except: except, context: context)
|
1037
|
+
def to_yaml(only: nil, except: nil, context: nil, **yaml_options)
|
1038
|
+
self.class.to_yaml(self, only: only, except: except, context: context, **yaml_options)
|
1017
1039
|
end
|
1018
1040
|
|
1019
1041
|
# Convert Object to TOML
|
@@ -1021,12 +1043,13 @@ module Shale
|
|
1021
1043
|
# @param [Array<Symbol>] only
|
1022
1044
|
# @param [Array<Symbol>] except
|
1023
1045
|
# @param [any] context
|
1046
|
+
# @param [Hash] toml_options
|
1024
1047
|
#
|
1025
1048
|
# @return [String]
|
1026
1049
|
#
|
1027
1050
|
# @api public
|
1028
|
-
def to_toml(only: nil, except: nil, context: nil)
|
1029
|
-
self.class.to_toml(self, only: only, except: except, context: context)
|
1051
|
+
def to_toml(only: nil, except: nil, context: nil, **toml_options)
|
1052
|
+
self.class.to_toml(self, only: only, except: except, context: context, **toml_options)
|
1030
1053
|
end
|
1031
1054
|
|
1032
1055
|
# Convert Object to CSV
|
@@ -1034,6 +1057,8 @@ module Shale
|
|
1034
1057
|
# @param [Array<Symbol>] only
|
1035
1058
|
# @param [Array<Symbol>] except
|
1036
1059
|
# @param [any] context
|
1060
|
+
# @param [true, false] headers
|
1061
|
+
# @param [Hash] csv_options
|
1037
1062
|
#
|
1038
1063
|
# @return [String]
|
1039
1064
|
#
|
data/lib/shale/type/date.rb
CHANGED
data/lib/shale/type/float.rb
CHANGED
data/lib/shale/type/integer.rb
CHANGED
data/lib/shale/type/string.rb
CHANGED
data/lib/shale/type/time.rb
CHANGED
data/lib/shale/type.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Shale
|
4
|
+
module Type
|
5
|
+
class << self
|
6
|
+
# Register a symbol alias for a Shale::Type::Value class
|
7
|
+
#
|
8
|
+
# @param [Symbol] type Short type alias
|
9
|
+
# @param [Shale::Type::Value] klass Class to register
|
10
|
+
#
|
11
|
+
# @raise [NotATypeValueError] when klass is not a Shale::Type::Value
|
12
|
+
#
|
13
|
+
# @example
|
14
|
+
# class UnixTimestamp < Shale::Type::Value
|
15
|
+
# def self.cast(value)
|
16
|
+
# Time.at(value.to_i)
|
17
|
+
# end
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# Shale::Type.register(:unix_timestamp, UnixTimestamp)
|
21
|
+
#
|
22
|
+
# @api public
|
23
|
+
def register(type, klass)
|
24
|
+
@registry ||= {}
|
25
|
+
|
26
|
+
unless klass < Value
|
27
|
+
raise NotATypeValueError, "class '#{klass}' is not a valid Shale::Type::Value"
|
28
|
+
end
|
29
|
+
|
30
|
+
@registry[type] = klass
|
31
|
+
end
|
32
|
+
|
33
|
+
# Lookup a Shale::Type::Value class by type alias
|
34
|
+
#
|
35
|
+
# @param [Symbol] type Type alias
|
36
|
+
#
|
37
|
+
# @raise [UnknownTypeError] when type is not registered
|
38
|
+
#
|
39
|
+
# @return [Shale::Type::Value] Class registered for type
|
40
|
+
#
|
41
|
+
# @example
|
42
|
+
#
|
43
|
+
# Shale::Type.lookup(:unix_timestamp)
|
44
|
+
# # => UnixTimestamp
|
45
|
+
#
|
46
|
+
# @api public
|
47
|
+
def lookup(type)
|
48
|
+
klass = @registry[type]
|
49
|
+
|
50
|
+
raise UnknownTypeError, "unknown type '#{type}'" unless klass
|
51
|
+
|
52
|
+
klass
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
data/lib/shale/utils.rb
CHANGED
@@ -31,7 +31,7 @@ module Shale
|
|
31
31
|
# @api private
|
32
32
|
def self.classify(str)
|
33
33
|
# names may include a period, which will need to be stripped out
|
34
|
-
str = str.to_s.gsub(
|
34
|
+
str = str.to_s.gsub('.', '')
|
35
35
|
|
36
36
|
str = str.sub(/^[a-z\d]*/) { |match| upcase_first(match) || match }
|
37
37
|
|
data/lib/shale/version.rb
CHANGED
data/lib/shale.rb
CHANGED
@@ -3,8 +3,8 @@
|
|
3
3
|
require 'yaml'
|
4
4
|
|
5
5
|
require_relative 'shale/mapper'
|
6
|
-
require_relative 'shale/adapter/csv'
|
7
6
|
require_relative 'shale/adapter/json'
|
7
|
+
require_relative 'shale/type'
|
8
8
|
require_relative 'shale/type/boolean'
|
9
9
|
require_relative 'shale/type/date'
|
10
10
|
require_relative 'shale/type/float'
|
@@ -52,6 +52,12 @@ require_relative 'shale/version'
|
|
52
52
|
# Shale.xml_adapter = Shale::Adapter::Ox
|
53
53
|
# Shale.xml_adapter # => Shale::Adapter::Ox
|
54
54
|
#
|
55
|
+
# @example setting CSV adapter for handling CSV documents
|
56
|
+
# require 'shale/adapter/csv'
|
57
|
+
#
|
58
|
+
# Shale.csv_adapter = Shale::Adapter::CSV
|
59
|
+
# Shale.csv_adapter # => Shale::Adapter::CSV
|
60
|
+
#
|
55
61
|
# @api public
|
56
62
|
module Shale
|
57
63
|
class << self
|
@@ -75,16 +81,17 @@ module Shale
|
|
75
81
|
# @api public
|
76
82
|
attr_writer :yaml_adapter
|
77
83
|
|
78
|
-
# TOML adapter accessor.
|
84
|
+
# TOML adapter accessor. Available adapters are Shale::Adapter::Tomlib
|
85
|
+
# and Shale::Adapter::TomRB
|
79
86
|
#
|
80
|
-
# @param [@see Shale::Adapter::
|
87
|
+
# @param [@see Shale::Adapter::Tomlib] adapter
|
81
88
|
#
|
82
89
|
# @example setting adapter
|
83
|
-
# Shale.toml_adapter = Shale::Adapter::
|
90
|
+
# Shale.toml_adapter = Shale::Adapter::Tomlib
|
84
91
|
#
|
85
92
|
# @example getting adapter
|
86
93
|
# Shale.toml_adapter
|
87
|
-
# # => Shale::Adapter::
|
94
|
+
# # => Shale::Adapter::Tomlib
|
88
95
|
#
|
89
96
|
# @api public
|
90
97
|
attr_accessor :toml_adapter
|
@@ -93,11 +100,15 @@ module Shale
|
|
93
100
|
#
|
94
101
|
# @param [.load, .dump] adapter
|
95
102
|
#
|
96
|
-
# @example
|
103
|
+
# @example setting adapter
|
97
104
|
# Shale.csv_adapter = Shale::Adapter::CSV
|
98
105
|
#
|
106
|
+
# @example getting adapter
|
107
|
+
# Shale.csv_adapter
|
108
|
+
# # => Shale::Adapter::CSV
|
109
|
+
#
|
99
110
|
# @api public
|
100
|
-
|
111
|
+
attr_accessor :csv_adapter
|
101
112
|
|
102
113
|
# XML adapter accessor. Available adapters are Shale::Adapter::REXML,
|
103
114
|
# Shale::Adapter::Nokogiri and Shale::Adapter::Ox
|
@@ -139,18 +150,5 @@ module Shale
|
|
139
150
|
def yaml_adapter
|
140
151
|
@yaml_adapter || YAML
|
141
152
|
end
|
142
|
-
|
143
|
-
# Return CSV adapter. By default CSV is used
|
144
|
-
#
|
145
|
-
# @return [.load, .dump]
|
146
|
-
#
|
147
|
-
# @example
|
148
|
-
# Shale.csv_adapter
|
149
|
-
# # => Shale::Adapter::CSV
|
150
|
-
#
|
151
|
-
# @api public
|
152
|
-
def csv_adapter
|
153
|
-
@csv_adapter || Adapter::CSV
|
154
|
-
end
|
155
153
|
end
|
156
154
|
end
|
data/shale.gemspec
CHANGED
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shale
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kamil Giszczak
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
11
|
+
date: 2024-10-31 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bigdecimal
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
description: Ruby object mapper and serializer for XML, JSON, TOML, CSV and YAML.
|
14
28
|
email:
|
15
29
|
- beerkg@gmail.com
|
@@ -35,6 +49,7 @@ files:
|
|
35
49
|
- lib/shale/adapter/rexml/document.rb
|
36
50
|
- lib/shale/adapter/rexml/node.rb
|
37
51
|
- lib/shale/adapter/toml_rb.rb
|
52
|
+
- lib/shale/adapter/tomlib.rb
|
38
53
|
- lib/shale/attribute.rb
|
39
54
|
- lib/shale/error.rb
|
40
55
|
- lib/shale/mapper.rb
|
@@ -90,6 +105,7 @@ files:
|
|
90
105
|
- lib/shale/schema/xml_generator/schema.rb
|
91
106
|
- lib/shale/schema/xml_generator/typed_attribute.rb
|
92
107
|
- lib/shale/schema/xml_generator/typed_element.rb
|
108
|
+
- lib/shale/type.rb
|
93
109
|
- lib/shale/type/boolean.rb
|
94
110
|
- lib/shale/type/complex.rb
|
95
111
|
- lib/shale/type/date.rb
|
@@ -118,14 +134,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
118
134
|
requirements:
|
119
135
|
- - ">="
|
120
136
|
- !ruby/object:Gem::Version
|
121
|
-
version:
|
137
|
+
version: 3.0.0
|
122
138
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
123
139
|
requirements:
|
124
140
|
- - ">="
|
125
141
|
- !ruby/object:Gem::Version
|
126
142
|
version: '0'
|
127
143
|
requirements: []
|
128
|
-
rubygems_version: 3.
|
144
|
+
rubygems_version: 3.5.3
|
129
145
|
signing_key:
|
130
146
|
specification_version: 4
|
131
147
|
summary: Ruby object mapper and serializer for XML, JSON, TOML, CSV and YAML.
|