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.
@@ -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
@@ -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
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shale
4
+ # @api private
5
+ VERSION = '0.1.0'
6
+ 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: []