shale 0.1.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 +7 -0
- data/CHANGELOG.md +3 -0
- data/LICENSE.txt +21 -0
- data/README.md +392 -0
- data/lib/shale/adapter/json.rb +34 -0
- data/lib/shale/adapter/nokogiri.rb +176 -0
- data/lib/shale/adapter/ox.rb +162 -0
- data/lib/shale/adapter/rexml.rb +163 -0
- data/lib/shale/attribute.rb +47 -0
- data/lib/shale/error.rb +33 -0
- data/lib/shale/mapper.rb +292 -0
- data/lib/shale/mapping/key_value.rb +40 -0
- data/lib/shale/mapping/xml.rb +87 -0
- data/lib/shale/type/base.rb +118 -0
- data/lib/shale/type/boolean.rb +33 -0
- data/lib/shale/type/complex.rb +427 -0
- data/lib/shale/type/date.rb +29 -0
- data/lib/shale/type/float.rb +29 -0
- data/lib/shale/type/integer.rb +21 -0
- data/lib/shale/type/string.rb +21 -0
- data/lib/shale/type/time.rb +29 -0
- data/lib/shale/utils.rb +25 -0
- data/lib/shale/version.rb +6 -0
- data/lib/shale.rb +127 -0
- data/shale.gemspec +26 -0
- metadata +72 -0
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'date'
|
4
|
+
require_relative 'base'
|
5
|
+
|
6
|
+
module Shale
|
7
|
+
module Type
|
8
|
+
# Cast value to Date
|
9
|
+
#
|
10
|
+
# @api public
|
11
|
+
class Date < Base
|
12
|
+
# @param [any] value Value to cast
|
13
|
+
#
|
14
|
+
# @return [Date, nil]
|
15
|
+
#
|
16
|
+
# @api private
|
17
|
+
def self.cast(value)
|
18
|
+
if value.is_a?(::String)
|
19
|
+
return if value.empty?
|
20
|
+
::Date.parse(value)
|
21
|
+
elsif value.respond_to?(:to_date)
|
22
|
+
value.to_date
|
23
|
+
else
|
24
|
+
value
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'base'
|
4
|
+
|
5
|
+
module Shale
|
6
|
+
module Type
|
7
|
+
# Cast value to Float
|
8
|
+
#
|
9
|
+
# @api public
|
10
|
+
class Float < Base
|
11
|
+
# @param [#to_f, String, nil] value Value to cast
|
12
|
+
#
|
13
|
+
# @return [Float, nil]
|
14
|
+
#
|
15
|
+
# @api private
|
16
|
+
def self.cast(value)
|
17
|
+
return if value.nil?
|
18
|
+
|
19
|
+
case value
|
20
|
+
when ::Float then value
|
21
|
+
when 'Infinity' then ::Float::INFINITY
|
22
|
+
when '-Infinity' then -::Float::INFINITY
|
23
|
+
when 'NaN' then ::Float::NAN
|
24
|
+
else value.to_f
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'base'
|
4
|
+
|
5
|
+
module Shale
|
6
|
+
module Type
|
7
|
+
# Cast value to Integer
|
8
|
+
#
|
9
|
+
# @api public
|
10
|
+
class Integer < Base
|
11
|
+
# @param [#to_i, nil] value Value to cast
|
12
|
+
#
|
13
|
+
# @return [Integer, nil]
|
14
|
+
#
|
15
|
+
# @api private
|
16
|
+
def self.cast(value)
|
17
|
+
value&.to_i
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'base'
|
4
|
+
|
5
|
+
module Shale
|
6
|
+
module Type
|
7
|
+
# Cast value to String
|
8
|
+
#
|
9
|
+
# @api public
|
10
|
+
class String < Base
|
11
|
+
# @param [#to_s, nil] value Value to cast
|
12
|
+
#
|
13
|
+
# @return [String, nil]
|
14
|
+
#
|
15
|
+
# @api private
|
16
|
+
def self.cast(value)
|
17
|
+
value&.to_s
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'time'
|
4
|
+
require_relative 'base'
|
5
|
+
|
6
|
+
module Shale
|
7
|
+
module Type
|
8
|
+
# Cast value to Time
|
9
|
+
#
|
10
|
+
# @api public
|
11
|
+
class Time < Base
|
12
|
+
# @param [any] value Value to cast
|
13
|
+
#
|
14
|
+
# @return [Time, nil]
|
15
|
+
#
|
16
|
+
# @api private
|
17
|
+
def self.cast(value)
|
18
|
+
if value.is_a?(::String)
|
19
|
+
return if value.empty?
|
20
|
+
::Time.parse(value)
|
21
|
+
elsif value.respond_to?(:to_time)
|
22
|
+
value.to_time
|
23
|
+
else
|
24
|
+
value
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/shale/utils.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Shale
|
4
|
+
# Utitlity functions
|
5
|
+
#
|
6
|
+
# @api private
|
7
|
+
module Utils
|
8
|
+
# Convert word to under score
|
9
|
+
#
|
10
|
+
# @param [String] word
|
11
|
+
#
|
12
|
+
# @example
|
13
|
+
# Shale::Utils.underscore('FooBar') # => foo_bar
|
14
|
+
# Shale::Utils.underscore('Namespace::FooBar') # => namespace:foo_bar
|
15
|
+
#
|
16
|
+
# @api private
|
17
|
+
def self.underscore(word)
|
18
|
+
word
|
19
|
+
.gsub('::', ':')
|
20
|
+
.gsub(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2')
|
21
|
+
.gsub(/([a-z\d])([A-Z])/, '\1_\2')
|
22
|
+
.downcase
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/shale.rb
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
require 'shale/mapper'
|
6
|
+
require 'shale/adapter/json'
|
7
|
+
require 'shale/adapter/rexml'
|
8
|
+
require 'shale/type/boolean'
|
9
|
+
require 'shale/type/date'
|
10
|
+
require 'shale/type/float'
|
11
|
+
require 'shale/type/integer'
|
12
|
+
require 'shale/type/string'
|
13
|
+
require 'shale/type/time'
|
14
|
+
require 'shale/version'
|
15
|
+
|
16
|
+
# Main library namespace
|
17
|
+
#
|
18
|
+
# Shale uses adapters for parsing and serializing documents.
|
19
|
+
# For handling JSON and YAML, adapter must implement .load and .dump methods, so
|
20
|
+
# e.g for handling JSON, MultiJson works out of the box.
|
21
|
+
#
|
22
|
+
# Adapters for XML handling are more complicated and must conform to [@see shale/adapter/rexml]
|
23
|
+
# Shale provides adaters for most popular XML parsing libraries:
|
24
|
+
# Shale::Adapter::REXML, Shale::Adapter::Nokogiri and Shale::Adapter::Ox
|
25
|
+
#
|
26
|
+
# By default Shale::Adapter::REXML is used so no external dependencies are needed, but it's
|
27
|
+
# not as performant as Nokogiri or Ox, so you may want to change it.
|
28
|
+
#
|
29
|
+
# @example setting MultiJSON for handling JSON documents
|
30
|
+
# Shale.json_adapter = MultiJson
|
31
|
+
# Shale.json_adapter # => MultiJson
|
32
|
+
#
|
33
|
+
# @example setting YAML adapter for handling YAML documents
|
34
|
+
# Shale.yaml_adapter = MultiJson
|
35
|
+
# Shale.yaml_adapter # => MultiJson
|
36
|
+
#
|
37
|
+
# @example setting REXML adapter for handling XML documents
|
38
|
+
# Shale.xml_adapter = Shale::Adapter::REXML
|
39
|
+
# Shale.xml_adapter # => Shale::Adapter::REXML
|
40
|
+
#
|
41
|
+
# @example setting Nokogiri adapter for handling XML documents
|
42
|
+
# require 'shale/adapter/nokogiri'
|
43
|
+
#
|
44
|
+
# Shale.xml_adapter = Shale::Adapter::Nokogir
|
45
|
+
# Shale.xml_adapter # => Shale::Adapter::Nokogir
|
46
|
+
#
|
47
|
+
# @example setting Ox adapter for handling XML documents
|
48
|
+
# require 'shale/adapter/ox'
|
49
|
+
#
|
50
|
+
# Shale.xml_adapter = Shale::Adapter::Ox
|
51
|
+
# Shale.xml_adapter # => Shale::Adapter::Ox
|
52
|
+
#
|
53
|
+
# @api public
|
54
|
+
module Shale
|
55
|
+
class << self
|
56
|
+
# Set JSON adapter
|
57
|
+
#
|
58
|
+
# @param [.load, .dump] adapter
|
59
|
+
#
|
60
|
+
# @example
|
61
|
+
# Shale.json_adapter = Shale::Adapter::JSON
|
62
|
+
#
|
63
|
+
# @api public
|
64
|
+
attr_writer :json_adapter
|
65
|
+
|
66
|
+
# Set YAML adapter
|
67
|
+
#
|
68
|
+
# @param [.load, .dump] adapter
|
69
|
+
#
|
70
|
+
# @example
|
71
|
+
# Shale.yaml_adapter = YAML
|
72
|
+
#
|
73
|
+
# @api public
|
74
|
+
attr_writer :yaml_adapter
|
75
|
+
|
76
|
+
# Set XML adapter
|
77
|
+
#
|
78
|
+
# @param [@see Shale::Adapter::REXML] adapter
|
79
|
+
#
|
80
|
+
# @example
|
81
|
+
# Shale.xml_adapter = Shale::Adapter::REXML
|
82
|
+
#
|
83
|
+
# @api public
|
84
|
+
attr_writer :xml_adapter
|
85
|
+
|
86
|
+
# Return JSON adapter. By default Shale::Adapter::JSON is used
|
87
|
+
#
|
88
|
+
# @return [.load, .dump]
|
89
|
+
#
|
90
|
+
# @example
|
91
|
+
# Shale.json_adapter
|
92
|
+
# # => Shale::Adapter::JSON
|
93
|
+
#
|
94
|
+
# @api public
|
95
|
+
def json_adapter
|
96
|
+
@json_adapter || Adapter::JSON
|
97
|
+
end
|
98
|
+
|
99
|
+
# Return YAML adapter. By default YAML is used
|
100
|
+
#
|
101
|
+
# @return [.load, .dump]
|
102
|
+
#
|
103
|
+
# @example
|
104
|
+
# Shale.yaml_adapter
|
105
|
+
# # => YAML
|
106
|
+
#
|
107
|
+
# @api public
|
108
|
+
def yaml_adapter
|
109
|
+
@yaml_adapter || YAML
|
110
|
+
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
|
+
end
|
127
|
+
end
|
data/shale.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'lib/shale/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = 'shale'
|
7
|
+
spec.version = Shale::VERSION
|
8
|
+
spec.authors = ['Kamil Giszczak']
|
9
|
+
spec.email = ['beerkg@gmail.com']
|
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.'
|
13
|
+
spec.homepage = 'https://github.com/kgiszczak/shale'
|
14
|
+
spec.license = 'MIT'
|
15
|
+
|
16
|
+
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
17
|
+
|
18
|
+
spec.metadata['homepage_uri'] = 'https://github.com/kgiszczak/shale'
|
19
|
+
spec.metadata['source_code_uri'] = 'https://github.com/kgiszczak/shale'
|
20
|
+
spec.metadata['changelog_uri'] = 'https://github.com/kgiszczak/shale/blob/master/CHANGELOG.md'
|
21
|
+
spec.metadata['bug_tracker_uri'] = 'https://github.com/kgiszczak/shale/issues'
|
22
|
+
|
23
|
+
spec.files = Dir['CHANGELOG.md', 'LICENSE.txt', 'README.md', 'shale.gemspec', 'lib/**/*']
|
24
|
+
spec.require_paths = ['lib']
|
25
|
+
spec.required_ruby_version = '>= 2.6.0'
|
26
|
+
end
|
metadata
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: shale
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Kamil Giszczak
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-11-30 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Ruby object mapper and serializer for XML, JSON and YAML.
|
14
|
+
email:
|
15
|
+
- beerkg@gmail.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- CHANGELOG.md
|
21
|
+
- LICENSE.txt
|
22
|
+
- README.md
|
23
|
+
- lib/shale.rb
|
24
|
+
- lib/shale/adapter/json.rb
|
25
|
+
- lib/shale/adapter/nokogiri.rb
|
26
|
+
- lib/shale/adapter/ox.rb
|
27
|
+
- lib/shale/adapter/rexml.rb
|
28
|
+
- lib/shale/attribute.rb
|
29
|
+
- lib/shale/error.rb
|
30
|
+
- lib/shale/mapper.rb
|
31
|
+
- lib/shale/mapping/key_value.rb
|
32
|
+
- lib/shale/mapping/xml.rb
|
33
|
+
- lib/shale/type/base.rb
|
34
|
+
- lib/shale/type/boolean.rb
|
35
|
+
- lib/shale/type/complex.rb
|
36
|
+
- lib/shale/type/date.rb
|
37
|
+
- lib/shale/type/float.rb
|
38
|
+
- lib/shale/type/integer.rb
|
39
|
+
- lib/shale/type/string.rb
|
40
|
+
- lib/shale/type/time.rb
|
41
|
+
- lib/shale/utils.rb
|
42
|
+
- lib/shale/version.rb
|
43
|
+
- shale.gemspec
|
44
|
+
homepage: https://github.com/kgiszczak/shale
|
45
|
+
licenses:
|
46
|
+
- MIT
|
47
|
+
metadata:
|
48
|
+
allowed_push_host: https://rubygems.org
|
49
|
+
homepage_uri: https://github.com/kgiszczak/shale
|
50
|
+
source_code_uri: https://github.com/kgiszczak/shale
|
51
|
+
changelog_uri: https://github.com/kgiszczak/shale/blob/master/CHANGELOG.md
|
52
|
+
bug_tracker_uri: https://github.com/kgiszczak/shale/issues
|
53
|
+
post_install_message:
|
54
|
+
rdoc_options: []
|
55
|
+
require_paths:
|
56
|
+
- lib
|
57
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 2.6.0
|
62
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '0'
|
67
|
+
requirements: []
|
68
|
+
rubygems_version: 3.1.2
|
69
|
+
signing_key:
|
70
|
+
specification_version: 4
|
71
|
+
summary: Ruby object mapper and serializer for XML, JSON and YAML.
|
72
|
+
test_files: []
|