shale 0.2.1 → 0.3.1

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.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +24 -0
  3. data/README.md +274 -7
  4. data/exe/shaleb +75 -0
  5. data/lib/shale/adapter/json.rb +7 -2
  6. data/lib/shale/adapter/nokogiri.rb +48 -12
  7. data/lib/shale/adapter/ox.rb +28 -4
  8. data/lib/shale/adapter/rexml.rb +56 -13
  9. data/lib/shale/attribute.rb +1 -1
  10. data/lib/shale/error.rb +6 -0
  11. data/lib/shale/mapper.rb +11 -11
  12. data/lib/shale/mapping/descriptor/dict.rb +57 -0
  13. data/lib/shale/mapping/descriptor/xml.rb +43 -0
  14. data/lib/shale/mapping/descriptor/xml_namespace.rb +37 -0
  15. data/lib/shale/mapping/{key_value.rb → dict.rb} +8 -6
  16. data/lib/shale/mapping/validator.rb +51 -0
  17. data/lib/shale/mapping/xml.rb +86 -15
  18. data/lib/shale/schema/json/base.rb +41 -0
  19. data/lib/shale/schema/json/boolean.rb +23 -0
  20. data/lib/shale/schema/json/collection.rb +39 -0
  21. data/lib/shale/schema/json/date.rb +23 -0
  22. data/lib/shale/schema/json/float.rb +23 -0
  23. data/lib/shale/schema/json/integer.rb +23 -0
  24. data/lib/shale/schema/json/object.rb +37 -0
  25. data/lib/shale/schema/json/ref.rb +28 -0
  26. data/lib/shale/schema/json/schema.rb +57 -0
  27. data/lib/shale/schema/json/string.rb +23 -0
  28. data/lib/shale/schema/json/time.rb +23 -0
  29. data/lib/shale/schema/json.rb +165 -0
  30. data/lib/shale/schema/xml/attribute.rb +41 -0
  31. data/lib/shale/schema/xml/complex_type.rb +67 -0
  32. data/lib/shale/schema/xml/element.rb +55 -0
  33. data/lib/shale/schema/xml/import.rb +46 -0
  34. data/lib/shale/schema/xml/ref_attribute.rb +37 -0
  35. data/lib/shale/schema/xml/ref_element.rb +39 -0
  36. data/lib/shale/schema/xml/schema.rb +121 -0
  37. data/lib/shale/schema/xml/typed_attribute.rb +46 -0
  38. data/lib/shale/schema/xml/typed_element.rb +46 -0
  39. data/lib/shale/schema/xml.rb +316 -0
  40. data/lib/shale/schema.rb +47 -0
  41. data/lib/shale/type/boolean.rb +2 -2
  42. data/lib/shale/type/composite.rb +67 -56
  43. data/lib/shale/type/date.rb +35 -2
  44. data/lib/shale/type/float.rb +2 -2
  45. data/lib/shale/type/integer.rb +2 -2
  46. data/lib/shale/type/string.rb +2 -2
  47. data/lib/shale/type/time.rb +35 -2
  48. data/lib/shale/type/{base.rb → value.rb} +18 -7
  49. data/lib/shale/utils.rb +18 -2
  50. data/lib/shale/version.rb +1 -1
  51. data/lib/shale.rb +10 -10
  52. data/shale.gemspec +6 -2
  53. metadata +41 -13
  54. data/lib/shale/mapping/base.rb +0 -32
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'rexml/document'
4
+ require_relative '../utils'
4
5
 
5
6
  module Shale
6
7
  module Adapter
@@ -23,12 +24,27 @@ module Shale
23
24
  # Serialize REXML document into XML
24
25
  #
25
26
  # @param [::REXML::Document] doc REXML document
27
+ # @param [Array<Symbol>] options
26
28
  #
27
29
  # @return [String]
28
30
  #
29
31
  # @api private
30
- def self.dump(doc)
31
- doc.to_s
32
+ def self.dump(doc, *options)
33
+ if options.include?(:declaration)
34
+ doc.add(::REXML::XMLDecl.new)
35
+ end
36
+
37
+ io = StringIO.new
38
+
39
+ if options.include?(:pretty)
40
+ formatter = ::REXML::Formatters::Pretty.new
41
+ formatter.compact = true
42
+ else
43
+ formatter = ::REXML::Formatters::Default.new
44
+ end
45
+
46
+ formatter.write(doc, io)
47
+ io.string
32
48
  end
33
49
 
34
50
  # Create Shale::Adapter::REXML::Document instance
@@ -42,18 +58,28 @@ module Shale
42
58
  #
43
59
  # @api private
44
60
  class Document
61
+ # Initialize object
62
+ #
63
+ # @api private
64
+ def initialize
65
+ context = { attribute_quote: :quote, prologue_quote: :quote }
66
+ @doc = ::REXML::Document.new(nil, context)
67
+ @namespaces = {}
68
+ end
69
+
45
70
  # Return REXML document
46
71
  #
47
72
  # @return [::REXML::Document]
48
73
  #
49
74
  # @api private
50
- attr_reader :doc
75
+ def doc
76
+ if @doc.root
77
+ @namespaces.each do |prefix, namespace|
78
+ @doc.root.add_namespace(prefix, namespace)
79
+ end
80
+ end
51
81
 
52
- # Initialize object
53
- #
54
- # @api private
55
- def initialize
56
- @doc = ::REXML::Document.new
82
+ @doc
57
83
  end
58
84
 
59
85
  # Create REXML element
@@ -64,7 +90,17 @@ module Shale
64
90
  #
65
91
  # @api private
66
92
  def create_element(name)
67
- ::REXML::Element.new(name)
93
+ ::REXML::Element.new(name, nil, attribute_quote: :quote)
94
+ end
95
+
96
+ # Add XML namespace to document
97
+ #
98
+ # @param [String] prefix
99
+ # @param [String] namespace
100
+ #
101
+ # @api private
102
+ def add_namespace(prefix, namespace)
103
+ @namespaces[prefix] = namespace if prefix && namespace
68
104
  end
69
105
 
70
106
  # Add attribute to REXML element
@@ -112,7 +148,7 @@ module Shale
112
148
  @node = node
113
149
  end
114
150
 
115
- # Return fully qualified name of the node in the format of
151
+ # Return name of the node in the format of
116
152
  # namespace:name when the node is namespaced or just name when it's not
117
153
  #
118
154
  # @return [String]
@@ -121,11 +157,11 @@ module Shale
121
157
  # node.name # => Bar
122
158
  #
123
159
  # @example with namespace
124
- # node.name # => foo:Bar
160
+ # node.name # => http://foo:Bar
125
161
  #
126
162
  # @api private
127
163
  def name
128
- @node.expanded_name
164
+ [Utils.presence(@node.namespace), @node.name].compact.join(':')
129
165
  end
130
166
 
131
167
  # Return all attributes associated with the node
@@ -134,7 +170,14 @@ module Shale
134
170
  #
135
171
  # @api private
136
172
  def attributes
137
- @node.attributes
173
+ attributes = @node.attributes.values.map do |attribute|
174
+ attribute.is_a?(Hash) ? attribute.values : attribute
175
+ end.flatten
176
+
177
+ attributes.each_with_object({}) do |attribute, hash|
178
+ name = [Utils.presence(attribute.namespace), attribute.name].compact.join(':')
179
+ hash[name] = attribute.value
180
+ end
138
181
  end
139
182
 
140
183
  # Return node's element children
@@ -23,7 +23,7 @@ module Shale
23
23
  # Initialize Attribute object
24
24
  #
25
25
  # @param [Symbol] name Name of the attribute
26
- # @param [Shale::Type::Base] type Type of the attribute
26
+ # @param [Shale::Type::Value] type Type of the attribute
27
27
  # @param [Boolean] collection Is this attribute a collection
28
28
  # @param [Proc] default Default value
29
29
  #
data/lib/shale/error.rb CHANGED
@@ -36,4 +36,10 @@ module Shale
36
36
  # @api private
37
37
  class IncorrectMappingArgumentsError < StandardError
38
38
  end
39
+
40
+ # Error for passing incorrect arguments to schema generation function
41
+ #
42
+ # @api private
43
+ class NotAShaleMapperError < StandardError
44
+ end
39
45
  end
data/lib/shale/mapper.rb CHANGED
@@ -3,7 +3,7 @@
3
3
  require_relative 'attribute'
4
4
  require_relative 'error'
5
5
  require_relative 'utils'
6
- require_relative 'mapping/key_value'
6
+ require_relative 'mapping/dict'
7
7
  require_relative 'mapping/xml'
8
8
  require_relative 'type/composite'
9
9
 
@@ -44,9 +44,9 @@ module Shale
44
44
  # @api public
45
45
  class Mapper < Type::Composite
46
46
  @attributes = {}
47
- @hash_mapping = Mapping::KeyValue.new
48
- @json_mapping = Mapping::KeyValue.new
49
- @yaml_mapping = Mapping::KeyValue.new
47
+ @hash_mapping = Mapping::Dict.new
48
+ @json_mapping = Mapping::Dict.new
49
+ @yaml_mapping = Mapping::Dict.new
50
50
  @xml_mapping = Mapping::Xml.new
51
51
 
52
52
  class << self
@@ -59,21 +59,21 @@ module Shale
59
59
 
60
60
  # Return Hash mapping object
61
61
  #
62
- # @return [Shale::Mapping::KeyValue]
62
+ # @return [Shale::Mapping::Dict]
63
63
  #
64
64
  # @api public
65
65
  attr_reader :hash_mapping
66
66
 
67
67
  # Return JSON mapping object
68
68
  #
69
- # @return [Shale::Mapping::KeyValue]
69
+ # @return [Shale::Mapping::Dict]
70
70
  #
71
71
  # @api public
72
72
  attr_reader :json_mapping
73
73
 
74
74
  # Return YAML mapping object
75
75
  #
76
- # @return [Shale::Mapping::KeyValue]
76
+ # @return [Shale::Mapping::Dict]
77
77
  #
78
78
  # @api public
79
79
  attr_reader :yaml_mapping
@@ -108,7 +108,7 @@ module Shale
108
108
  # Define attribute on class
109
109
  #
110
110
  # @param [Symbol] name Name of the attribute
111
- # @param [Shale::Type::Base] type Type of the attribute
111
+ # @param [Shale::Type::Value] type Type of the attribute
112
112
  # @param [Boolean] collection Is the attribute a collection
113
113
  # @param [Proc] default Default value for the attribute
114
114
  #
@@ -167,7 +167,7 @@ module Shale
167
167
  # attribute :last_name, Shale::Type::String
168
168
  # attribute :age, Shale::Type::Integer
169
169
  #
170
- # yaml do
170
+ # hsh do
171
171
  # map 'firatName', to: :first_name
172
172
  # map 'lastName', to: :last_name
173
173
  # map 'age', to: :age
@@ -175,7 +175,7 @@ module Shale
175
175
  # end
176
176
  #
177
177
  # @api public
178
- def hash(&block)
178
+ def hsh(&block)
179
179
  @hash_mapping = @__hash_mapping_init.dup
180
180
  @hash_mapping.instance_eval(&block)
181
181
  end
@@ -190,7 +190,7 @@ module Shale
190
190
  # attribute :last_name, Shale::Type::String
191
191
  # attribute :age, Shale::Type::Integer
192
192
  #
193
- # yaml do
193
+ # json do
194
194
  # map 'firatName', to: :first_name
195
195
  # map 'lastName', to: :last_name
196
196
  # map 'age', to: :age
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shale
4
+ module Mapping
5
+ module Descriptor
6
+ # Class representing attribute mapping
7
+ #
8
+ # @api private
9
+ class Dict
10
+ # Return mapping name
11
+ #
12
+ # @return [String]
13
+ #
14
+ # @api private
15
+ attr_reader :name
16
+
17
+ # Return attribute name
18
+ #
19
+ # @return [Symbol]
20
+ #
21
+ # @api private
22
+ attr_reader :attribute
23
+
24
+ # Return method symbol
25
+ #
26
+ # @return [Symbol]
27
+ #
28
+ # @api private
29
+ attr_reader :method_from
30
+
31
+ # Return method symbol
32
+ #
33
+ # @return [Symbol]
34
+ #
35
+ # @api private
36
+ attr_reader :method_to
37
+
38
+ # Initialize instance
39
+ #
40
+ # @param [String] name
41
+ # @param [Symbol, nil] attribute
42
+ # @param [Hash, nil] methods
43
+ #
44
+ # @api private
45
+ def initialize(name:, attribute:, methods:)
46
+ @name = name
47
+ @attribute = attribute
48
+
49
+ if methods
50
+ @method_from = methods[:from]
51
+ @method_to = methods[:to]
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'dict'
4
+
5
+ module Shale
6
+ module Mapping
7
+ module Descriptor
8
+ # Class representing XML attribute mapping
9
+ #
10
+ # @api private
11
+ class Xml < Dict
12
+ # Return namespace
13
+ #
14
+ # @return [String]
15
+ #
16
+ # @api private
17
+ attr_reader :namespace
18
+
19
+ # Initialize instance
20
+ #
21
+ # @param [String] name
22
+ # @param [Symbol, String] attribute
23
+ # @param [Hash, nil] methods
24
+ # @param [Shale::Mapping::XmlNamespace] namespace
25
+ #
26
+ # @api private
27
+ def initialize(name:, attribute:, methods:, namespace:)
28
+ super(name: name, attribute: attribute, methods: methods)
29
+ @namespace = namespace
30
+ end
31
+
32
+ # Return name with XML prefix
33
+ #
34
+ # @return [String]
35
+ #
36
+ # @api private
37
+ def prefixed_name
38
+ [namespace.prefix, name].compact.join(':')
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shale
4
+ module Mapping
5
+ module Descriptor
6
+ # Class representing XML namespace
7
+ #
8
+ # @api private
9
+ class XmlNamespace
10
+ # Return name
11
+ #
12
+ # @return [String]
13
+ #
14
+ # @api private
15
+ attr_accessor :name
16
+
17
+ # Return prefix
18
+ #
19
+ # @return [String]
20
+ #
21
+ # @api private
22
+ attr_accessor :prefix
23
+
24
+ # Initialize instance
25
+ #
26
+ # @param [String, nil] name
27
+ # @param [String, nil] prefix
28
+ #
29
+ # @api private
30
+ def initialize(name = nil, prefix = nil)
31
+ @name = name
32
+ @prefix = prefix
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -1,13 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'base'
3
+ require_relative 'descriptor/dict'
4
+ require_relative 'validator'
4
5
 
5
6
  module Shale
6
7
  module Mapping
7
- # Mapping for key/value serialization formats (Hash/JSON/YAML)
8
+ # Mapping for dictionary serialization formats (Hash/JSON/YAML)
8
9
  #
9
10
  # @api private
10
- class KeyValue < Base
11
+ class Dict
11
12
  # Return keys mapping hash
12
13
  #
13
14
  # @return [Hash]
@@ -26,14 +27,15 @@ module Shale
26
27
  # Map key to attribute
27
28
  #
28
29
  # @param [String] key Document's key
29
- # @param [Symbol] to Object's attribute
30
+ # @param [Symbol, nil] to Object's attribute
31
+ # @param [Hash, nil] using
30
32
  #
31
33
  # @raise [IncorrectMappingArgumentsError] when arguments are incorrect
32
34
  #
33
35
  # @api private
34
36
  def map(key, to: nil, using: nil)
35
- validate_arguments(key, to, using)
36
- @keys[key] = to || using
37
+ Validator.validate_arguments(key, to, using)
38
+ @keys[key] = Descriptor::Dict.new(name: key, attribute: to, methods: using)
37
39
  end
38
40
 
39
41
  # @api private
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../error'
4
+
5
+ module Shale
6
+ module Mapping
7
+ module Validator
8
+ # Validate correctness of argument passed to map functions
9
+ #
10
+ # @param [String] key
11
+ # @param [Symbol] to
12
+ # @param [Hash] using
13
+ #
14
+ # @raise [IncorrectMappingArgumentsError] when arguments are incorrect
15
+ #
16
+ # @api private
17
+ def self.validate_arguments(key, to, using)
18
+ if to.nil? && using.nil?
19
+ msg = ":to or :using argument is required for mapping '#{key}'"
20
+ raise IncorrectMappingArgumentsError, msg
21
+ end
22
+
23
+ if !using.nil? && (using[:from].nil? || using[:to].nil?)
24
+ msg = ":using argument for mapping '#{key}' requires :to and :from keys"
25
+ raise IncorrectMappingArgumentsError, msg
26
+ end
27
+ end
28
+
29
+ # Validate correctness of namespace arguments
30
+ #
31
+ # @param [String] key
32
+ # @param [String, Symbol, nil] namespace
33
+ # @param [String, Symbol, nil] prefix
34
+ #
35
+ # @raise [IncorrectMappingArgumentsError] when arguments are incorrect
36
+ #
37
+ # @api private
38
+ def self.validate_namespace(key, namespace, prefix)
39
+ return if namespace == :undefined && prefix == :undefined
40
+
41
+ nsp = namespace == :undefined ? nil : namespace
42
+ pfx = prefix == :undefined ? nil : prefix
43
+
44
+ if (nsp && !pfx) || (!nsp && pfx)
45
+ msg = "both :namespace and :prefix arguments are required for mapping '#{key}'"
46
+ raise IncorrectMappingArgumentsError, msg
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -1,10 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'base'
3
+ require_relative 'descriptor/xml'
4
+ require_relative 'descriptor/xml_namespace'
5
+ require_relative 'validator'
4
6
 
5
7
  module Shale
6
8
  module Mapping
7
- class Xml < Base
9
+ class Xml
8
10
  # Return elements mapping hash
9
11
  #
10
12
  # @return [Hash]
@@ -26,6 +28,31 @@ module Shale
26
28
  # @api private
27
29
  attr_reader :content
28
30
 
31
+ # Return default namespace
32
+ #
33
+ # @return [Shale::Mapping::Descriptor::XmlNamespace]
34
+ #
35
+ # @api private
36
+ attr_reader :default_namespace
37
+
38
+ # Return unprefixed root
39
+ #
40
+ # @return [String]
41
+ #
42
+ # @api private
43
+ def unprefixed_root
44
+ @root
45
+ end
46
+
47
+ # Return prefixed root
48
+ #
49
+ # @return [String]
50
+ #
51
+ # @api private
52
+ def prefixed_root
53
+ [default_namespace.prefix, @root].compact.join(':')
54
+ end
55
+
29
56
  # Initialize instance
30
57
  #
31
58
  # @api private
@@ -35,32 +62,65 @@ module Shale
35
62
  @attributes = {}
36
63
  @content = nil
37
64
  @root = ''
65
+ @default_namespace = Descriptor::XmlNamespace.new
38
66
  end
39
67
 
40
68
  # Map element to attribute
41
69
  #
42
70
  # @param [String] element Document's element
43
- # @param [Symbol] to Object's attribute
71
+ # @param [Symbol, nil] to Object's attribute
72
+ # @param [Hash, nil] using
73
+ # @param [String, nil] namespace
74
+ # @param [String, nil] prefix
44
75
  #
45
76
  # @raise [IncorrectMappingArgumentsError] when arguments are incorrect
46
77
  #
47
78
  # @api private
48
- def map_element(element, to: nil, using: nil)
49
- validate_arguments(element, to, using)
50
- @elements[element] = to || using
79
+ def map_element(element, to: nil, using: nil, namespace: :undefined, prefix: :undefined)
80
+ Validator.validate_arguments(element, to, using)
81
+ Validator.validate_namespace(element, namespace, prefix)
82
+
83
+ if namespace == :undefined && prefix == :undefined
84
+ nsp = default_namespace.name
85
+ pfx = default_namespace.prefix
86
+ else
87
+ nsp = namespace
88
+ pfx = prefix
89
+ end
90
+
91
+ namespaced_element = [nsp, element].compact.join(':')
92
+
93
+ @elements[namespaced_element] = Descriptor::Xml.new(
94
+ name: element,
95
+ attribute: to,
96
+ methods: using,
97
+ namespace: Descriptor::XmlNamespace.new(nsp, pfx)
98
+ )
51
99
  end
52
100
 
53
101
  # Map document's attribute to object's attribute
54
102
  #
55
103
  # @param [String] attribute Document's attribute
56
- # @param [Symbol] to Object's attribute
104
+ # @param [Symbol, nil] to Object's attribute
105
+ # @param [Hash, nil] using
106
+ # @param [String, nil] namespace
107
+ # @param [String, nil] prefix
57
108
  #
58
109
  # @raise [IncorrectMappingArgumentsError] when arguments are incorrect
59
110
  #
60
111
  # @api private
61
- def map_attribute(attribute, to: nil, using: nil)
62
- validate_arguments(attribute, to, using)
63
- @attributes[attribute] = to || using
112
+ def map_attribute(attribute, to: nil, using: nil, namespace: nil, prefix: nil)
113
+ Validator.validate_arguments(attribute, to, using)
114
+ Validator.validate_namespace(attribute, namespace, prefix)
115
+
116
+ namespaced_attribute = [namespace, attribute].compact.join(':')
117
+
118
+ @attributes[namespaced_attribute] = Descriptor::Xml.new(
119
+ name: attribute,
120
+ attribute: to,
121
+ methods: using,
122
+ namespace: Descriptor::XmlNamespace.new(namespace, prefix)
123
+ )
64
124
  end
65
125
 
66
126
  # Map document's content to object's attribute
@@ -72,15 +132,24 @@ module Shale
72
132
  @content = to
73
133
  end
74
134
 
75
- # Name document's element
135
+ # Set the name for root element
136
+ #
137
+ # @param [String] value root's name
76
138
  #
77
- # @param [String, nil] value Document's element name
139
+ # @api private
140
+ def root(value)
141
+ @root = value
142
+ end
143
+
144
+ # Set default namespace for root element
78
145
  #
79
- # @return [Stirng, nil]
146
+ # @param [String] name
147
+ # @param [String] prefix
80
148
  #
81
149
  # @api private
82
- def root(value = nil)
83
- value.nil? ? @root : @root = value
150
+ def namespace(name, prefix)
151
+ @default_namespace.name = name
152
+ @default_namespace.prefix = prefix
84
153
  end
85
154
 
86
155
  # @api private
@@ -89,6 +158,8 @@ module Shale
89
158
  @attributes = other.instance_variable_get('@attributes').dup
90
159
  @content = other.instance_variable_get('@content').dup
91
160
  @root = other.instance_variable_get('@root').dup
161
+ @default_namespace = other.instance_variable_get('@default_namespace').dup
162
+
92
163
  super
93
164
  end
94
165
  end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shale
4
+ module Schema
5
+ class JSON
6
+ # Base class for JSON Schema types
7
+ #
8
+ # @api private
9
+ class Base
10
+ # Return name
11
+ #
12
+ # @api private
13
+ attr_reader :name
14
+
15
+ # Return nullable
16
+ #
17
+ # @api private
18
+ attr_writer :nullable
19
+
20
+ def initialize(name, default: nil)
21
+ @name = name.gsub('::', '_')
22
+ @default = default
23
+ @nullable = true
24
+ end
25
+
26
+ # Return JSON Schema fragment as Ruby Hash
27
+ #
28
+ # @return [Hash]
29
+ #
30
+ # @api private
31
+ def as_json
32
+ type = as_type
33
+ type['type'] = [type['type'], 'null'] if type['type'] && @nullable
34
+ type['default'] = @default unless @default.nil?
35
+
36
+ type
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Shale
6
+ module Schema
7
+ class JSON
8
+ # Class representing JSON Schema boolean type
9
+ #
10
+ # @api private
11
+ class Boolean < Base
12
+ # Return JSON Schema fragment as Ruby Hash
13
+ #
14
+ # @return [Hash]
15
+ #
16
+ # @api private
17
+ def as_type
18
+ { 'type' => 'boolean' }
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end