shale 0.1.0

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