shale 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|