json_model_rb 0.1.20 → 0.1.23

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 (97) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +156 -572
  3. data/lib/json_model/builder/alias_builder.rb +10 -0
  4. data/lib/json_model/builder/array_builder.rb +24 -0
  5. data/lib/json_model/builder/base_builder.rb +24 -0
  6. data/lib/json_model/builder/composition/any_of_builder.rb +16 -0
  7. data/lib/json_model/builder/composition/builder.rb +47 -0
  8. data/lib/json_model/builder/composition/intersection_builder.rb +16 -0
  9. data/lib/json_model/builder/composition/one_of_builder.rb +16 -0
  10. data/lib/json_model/builder/composition/sum_builder.rb +16 -0
  11. data/lib/json_model/builder/composition.rb +6 -0
  12. data/lib/json_model/builder/constrained_builder.rb +83 -0
  13. data/lib/json_model/builder/default_builder.rb +14 -0
  14. data/lib/json_model/builder/enum_builder.rb +16 -0
  15. data/lib/json_model/builder/format_builder.rb +47 -0
  16. data/lib/json_model/builder/key_builder.rb +30 -0
  17. data/lib/json_model/builder/nested_builder.rb +31 -0
  18. data/lib/json_model/builder/primitive/boolean_builder.rb +16 -0
  19. data/lib/json_model/builder/primitive/builder.rb +25 -0
  20. data/lib/json_model/builder/primitive/integer_builder.rb +16 -0
  21. data/lib/json_model/builder/primitive/null_builder.rb +16 -0
  22. data/lib/json_model/builder/primitive/number_builder.rb +16 -0
  23. data/lib/json_model/builder/primitive/string_builder.rb +16 -0
  24. data/lib/json_model/builder/primitive.rb +7 -0
  25. data/lib/json_model/builder/ref_builder.rb +35 -0
  26. data/lib/json_model/builder/schema_builder.rb +14 -0
  27. data/lib/json_model/builder.rb +65 -0
  28. data/lib/json_model/config/options.rb +5 -2
  29. data/lib/json_model/config.rb +0 -2
  30. data/lib/json_model/errors.rb +0 -3
  31. data/lib/json_model/logic/predicates/methods.rb +17 -0
  32. data/lib/json_model/predicates.rb +3 -0
  33. data/lib/json_model/schema.rb +54 -78
  34. data/lib/json_model/schema_meta.rb +7 -28
  35. data/lib/json_model/types/alias.rb +33 -0
  36. data/lib/json_model/types/any_of.rb +51 -20
  37. data/lib/json_model/types/one_of.rb +51 -20
  38. data/lib/json_model/types/ref.rb +32 -0
  39. data/lib/json_model/types.rb +47 -9
  40. data/lib/json_model/version.rb +1 -1
  41. data/lib/json_model.rb +3 -7
  42. data/spec/config_spec.rb +0 -14
  43. data/spec/examples/file_system_spec.rb +71 -31
  44. data/spec/examples/user_spec.rb +69 -40
  45. data/spec/schema_meta_spec.rb +0 -40
  46. data/spec/schema_spec.rb +43 -59
  47. metadata +84 -58
  48. data/lib/json_model/composeable.rb +0 -35
  49. data/lib/json_model/errors/invalid_ref_mode_error.rb +0 -12
  50. data/lib/json_model/errors/type_error.rb +0 -8
  51. data/lib/json_model/errors/unknown_attribute_error.rb +0 -13
  52. data/lib/json_model/properties.rb +0 -86
  53. data/lib/json_model/property.rb +0 -54
  54. data/lib/json_model/ref_mode.rb +0 -9
  55. data/lib/json_model/type_spec/array.rb +0 -72
  56. data/lib/json_model/type_spec/castable.rb +0 -34
  57. data/lib/json_model/type_spec/composition/all_of.rb +0 -29
  58. data/lib/json_model/type_spec/composition/any_of.rb +0 -34
  59. data/lib/json_model/type_spec/composition/one_of.rb +0 -38
  60. data/lib/json_model/type_spec/composition.rb +0 -79
  61. data/lib/json_model/type_spec/const.rb +0 -35
  62. data/lib/json_model/type_spec/enum.rb +0 -35
  63. data/lib/json_model/type_spec/object.rb +0 -32
  64. data/lib/json_model/type_spec/primitive/boolean.rb +0 -13
  65. data/lib/json_model/type_spec/primitive/integer.rb +0 -21
  66. data/lib/json_model/type_spec/primitive/null.rb +0 -13
  67. data/lib/json_model/type_spec/primitive/number.rb +0 -14
  68. data/lib/json_model/type_spec/primitive/numeric.rb +0 -85
  69. data/lib/json_model/type_spec/primitive/string.rb +0 -150
  70. data/lib/json_model/type_spec/primitive.rb +0 -40
  71. data/lib/json_model/type_spec.rb +0 -82
  72. data/lib/json_model/types/all_of.rb +0 -29
  73. data/lib/json_model/types/array.rb +0 -29
  74. data/lib/json_model/types/boolean.rb +0 -7
  75. data/lib/json_model/types/const.rb +0 -23
  76. data/lib/json_model/types/enum.rb +0 -23
  77. data/lib/json_model/types/integer.rb +0 -23
  78. data/lib/json_model/types/null.rb +0 -7
  79. data/lib/json_model/types/number.rb +0 -23
  80. data/lib/json_model/types/string.rb +0 -23
  81. data/spec/properties_spec.rb +0 -76
  82. data/spec/property_spec.rb +0 -86
  83. data/spec/type_spec/array_spec.rb +0 -206
  84. data/spec/type_spec/castable_spec.rb +0 -19
  85. data/spec/type_spec/composition/all_of_spec.rb +0 -57
  86. data/spec/type_spec/composition/any_of_spec.rb +0 -54
  87. data/spec/type_spec/composition/one_of_spec.rb +0 -59
  88. data/spec/type_spec/composition_spec.rb +0 -90
  89. data/spec/type_spec/const_spec.rb +0 -18
  90. data/spec/type_spec/enum_spec.rb +0 -84
  91. data/spec/type_spec/primitive/boolean_spec.rb +0 -12
  92. data/spec/type_spec/primitive/integer_spec.rb +0 -57
  93. data/spec/type_spec/primitive/null_spec.rb +0 -12
  94. data/spec/type_spec/primitive/number_spec.rb +0 -12
  95. data/spec/type_spec/primitive/numeric_spec.rb +0 -176
  96. data/spec/type_spec/primitive/string_spec.rb +0 -119
  97. data/spec/type_spec_spec.rb +0 -32
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json_model_rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.20
4
+ version: 0.1.23
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Gillesberger
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2026-01-19 00:00:00.000000000 Z
10
+ date: 2026-01-30 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: rake
@@ -66,7 +66,7 @@ dependencies:
66
66
  - !ruby/object:Gem::Version
67
67
  version: '3.8'
68
68
  - !ruby/object:Gem::Dependency
69
- name: activemodel
69
+ name: activesupport
70
70
  requirement: !ruby/object:Gem::Requirement
71
71
  requirements:
72
72
  - - ">="
@@ -80,20 +80,67 @@ dependencies:
80
80
  - !ruby/object:Gem::Version
81
81
  version: '6.0'
82
82
  - !ruby/object:Gem::Dependency
83
- name: activesupport
83
+ name: dry-struct
84
84
  requirement: !ruby/object:Gem::Requirement
85
85
  requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '1.6'
86
89
  - - ">="
87
90
  - !ruby/object:Gem::Version
88
- version: '6.0'
91
+ version: 1.6.0
89
92
  type: :runtime
90
93
  prerelease: false
91
94
  version_requirements: !ruby/object:Gem::Requirement
92
95
  requirements:
96
+ - - "~>"
97
+ - !ruby/object:Gem::Version
98
+ version: '1.6'
93
99
  - - ">="
94
100
  - !ruby/object:Gem::Version
95
- version: '6.0'
96
- description: Define JSON schemas as Ruby modules using a DSL
101
+ version: 1.6.0
102
+ - !ruby/object:Gem::Dependency
103
+ name: dry-types
104
+ requirement: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: '1.7'
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: 1.7.1
112
+ type: :runtime
113
+ prerelease: false
114
+ version_requirements: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - "~>"
117
+ - !ruby/object:Gem::Version
118
+ version: '1.7'
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: 1.7.1
122
+ - !ruby/object:Gem::Dependency
123
+ name: dry-validation
124
+ requirement: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - "~>"
127
+ - !ruby/object:Gem::Version
128
+ version: '1.8'
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: 1.8.0
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '1.8'
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ version: 1.8.0
142
+ description: A gem that extends Dry::Struct with JSON Schema generation capabilities,supporting
143
+ standard types, constraints, and polymorphic models.
97
144
  email:
98
145
  - paulgillesberger@live.com
99
146
  executables: []
@@ -103,73 +150,52 @@ files:
103
150
  - LICENSE
104
151
  - README.md
105
152
  - lib/json_model.rb
106
- - lib/json_model/composeable.rb
153
+ - lib/json_model/builder.rb
154
+ - lib/json_model/builder/alias_builder.rb
155
+ - lib/json_model/builder/array_builder.rb
156
+ - lib/json_model/builder/base_builder.rb
157
+ - lib/json_model/builder/composition.rb
158
+ - lib/json_model/builder/composition/any_of_builder.rb
159
+ - lib/json_model/builder/composition/builder.rb
160
+ - lib/json_model/builder/composition/intersection_builder.rb
161
+ - lib/json_model/builder/composition/one_of_builder.rb
162
+ - lib/json_model/builder/composition/sum_builder.rb
163
+ - lib/json_model/builder/constrained_builder.rb
164
+ - lib/json_model/builder/default_builder.rb
165
+ - lib/json_model/builder/enum_builder.rb
166
+ - lib/json_model/builder/format_builder.rb
167
+ - lib/json_model/builder/key_builder.rb
168
+ - lib/json_model/builder/nested_builder.rb
169
+ - lib/json_model/builder/primitive.rb
170
+ - lib/json_model/builder/primitive/boolean_builder.rb
171
+ - lib/json_model/builder/primitive/builder.rb
172
+ - lib/json_model/builder/primitive/integer_builder.rb
173
+ - lib/json_model/builder/primitive/null_builder.rb
174
+ - lib/json_model/builder/primitive/number_builder.rb
175
+ - lib/json_model/builder/primitive/string_builder.rb
176
+ - lib/json_model/builder/ref_builder.rb
177
+ - lib/json_model/builder/schema_builder.rb
107
178
  - lib/json_model/config.rb
108
179
  - lib/json_model/config/options.rb
109
180
  - lib/json_model/errors.rb
110
181
  - lib/json_model/errors/error.rb
111
- - lib/json_model/errors/invalid_ref_mode_error.rb
112
- - lib/json_model/errors/type_error.rb
113
- - lib/json_model/errors/unknown_attribute_error.rb
114
- - lib/json_model/properties.rb
115
- - lib/json_model/property.rb
116
- - lib/json_model/ref_mode.rb
182
+ - lib/json_model/logic/predicates/methods.rb
183
+ - lib/json_model/predicates.rb
117
184
  - lib/json_model/schema.rb
118
185
  - lib/json_model/schema_meta.rb
119
- - lib/json_model/type_spec.rb
120
- - lib/json_model/type_spec/array.rb
121
- - lib/json_model/type_spec/castable.rb
122
- - lib/json_model/type_spec/composition.rb
123
- - lib/json_model/type_spec/composition/all_of.rb
124
- - lib/json_model/type_spec/composition/any_of.rb
125
- - lib/json_model/type_spec/composition/one_of.rb
126
- - lib/json_model/type_spec/const.rb
127
- - lib/json_model/type_spec/enum.rb
128
- - lib/json_model/type_spec/object.rb
129
- - lib/json_model/type_spec/primitive.rb
130
- - lib/json_model/type_spec/primitive/boolean.rb
131
- - lib/json_model/type_spec/primitive/integer.rb
132
- - lib/json_model/type_spec/primitive/null.rb
133
- - lib/json_model/type_spec/primitive/number.rb
134
- - lib/json_model/type_spec/primitive/numeric.rb
135
- - lib/json_model/type_spec/primitive/string.rb
136
186
  - lib/json_model/types.rb
137
- - lib/json_model/types/all_of.rb
187
+ - lib/json_model/types/alias.rb
138
188
  - lib/json_model/types/any_of.rb
139
- - lib/json_model/types/array.rb
140
- - lib/json_model/types/boolean.rb
141
- - lib/json_model/types/const.rb
142
- - lib/json_model/types/enum.rb
143
- - lib/json_model/types/integer.rb
144
- - lib/json_model/types/null.rb
145
- - lib/json_model/types/number.rb
146
189
  - lib/json_model/types/one_of.rb
147
- - lib/json_model/types/string.rb
190
+ - lib/json_model/types/ref.rb
148
191
  - lib/json_model/version.rb
149
192
  - spec/config_spec.rb
150
193
  - spec/examples/file_system_spec.rb
151
194
  - spec/examples/user_spec.rb
152
195
  - spec/json_model_spec.rb
153
- - spec/properties_spec.rb
154
- - spec/property_spec.rb
155
196
  - spec/schema_meta_spec.rb
156
197
  - spec/schema_spec.rb
157
198
  - spec/spec_helper.rb
158
- - spec/type_spec/array_spec.rb
159
- - spec/type_spec/castable_spec.rb
160
- - spec/type_spec/composition/all_of_spec.rb
161
- - spec/type_spec/composition/any_of_spec.rb
162
- - spec/type_spec/composition/one_of_spec.rb
163
- - spec/type_spec/composition_spec.rb
164
- - spec/type_spec/const_spec.rb
165
- - spec/type_spec/enum_spec.rb
166
- - spec/type_spec/primitive/boolean_spec.rb
167
- - spec/type_spec/primitive/integer_spec.rb
168
- - spec/type_spec/primitive/null_spec.rb
169
- - spec/type_spec/primitive/number_spec.rb
170
- - spec/type_spec/primitive/numeric_spec.rb
171
- - spec/type_spec/primitive/string_spec.rb
172
- - spec/type_spec_spec.rb
173
199
  homepage: https://github.com/gillesbergerp/json_model
174
200
  licenses:
175
201
  - MIT
@@ -192,5 +218,5 @@ required_rubygems_version: !ruby/object:Gem::Requirement
192
218
  requirements: []
193
219
  rubygems_version: 3.6.3
194
220
  specification_version: 4
195
- summary: Declarative JSON Schema DSL with Sorbet and ActiveModel integration
221
+ summary: Generate JSON Schema from Dry::Struct models
196
222
  test_files: []
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module JsonModel
4
- module Composeable
5
- extend(ActiveSupport::Concern)
6
-
7
- class_methods do
8
- # @return [Array]
9
- def composed_types
10
- @composed_types ||= []
11
- end
12
-
13
- # @param [Object] type
14
- # @param [Symbol] ref_mode
15
- def compose(type, ref_mode: RefMode::LOCAL)
16
- composed_types << {
17
- type: TypeSpec.resolve(type),
18
- ref_mode: ref_mode,
19
- }
20
- end
21
-
22
- # @return [Array<JsonModel::TypeSpec::Composition>]
23
- def composed_type_defs
24
- composed_types.select { |type| type[:ref_mode] == RefMode::LOCAL }.flat_map { |it| it[:type].referenced_schemas }
25
- end
26
-
27
- # @return [Array<Hash>]
28
- def composed_types_as_schema
29
- composed_types.each_with_object({}) do |it, agg|
30
- agg.deep_merge!(it[:type].as_schema(ref_mode: it[:ref_mode]))
31
- end
32
- end
33
- end
34
- end
35
- end
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module JsonModel
4
- module Errors
5
- class InvalidRefModeError < Error
6
- # @param [Symbol] ref_mode
7
- def initialize(ref_mode)
8
- super("Invalid ref_mode: #{ref_mode}.")
9
- end
10
- end
11
- end
12
- end
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module JsonModel
4
- module Errors
5
- class TypeError < Error
6
- end
7
- end
8
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module JsonModel
4
- module Errors
5
- class UnknownAttributeError < Error
6
- # @param [Class] klass
7
- # @param [Symbol] name
8
- def initialize(klass, name)
9
- super("Unknown attribute '#{name}' for '#{klass}'.")
10
- end
11
- end
12
- end
13
- end
@@ -1,86 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module JsonModel
4
- module Properties
5
- extend(ActiveSupport::Concern)
6
-
7
- included do
8
- extend(ActiveSupport::DescendantsTracker)
9
- include(ActiveModel::Validations)
10
- end
11
-
12
- # @return [Hash]
13
- def attributes
14
- @attributes ||= {}
15
- end
16
-
17
- class_methods do
18
- # @return [Hash]
19
- def properties
20
- @properties ||= {}
21
- end
22
-
23
- # @return [Hash]
24
- def aliased_properties
25
- @aliased_properties ||= {}
26
- end
27
-
28
- # @param [Symbol] name
29
- # @return [Symbol, nil]
30
- def invert_alias(name)
31
- aliased_properties[name]&.name || superclass&.invert_alias(name)
32
- rescue NoMethodError
33
- nil
34
- end
35
-
36
- # @param [Symbol] name
37
- # @param [Object, Class] type
38
- # @param [Hash] options
39
- def property(name, type:, **options)
40
- resolved_type = TypeSpec.resolve(type)
41
- add_property(name, type: resolved_type, **options)
42
- descendants.each { |subclass| subclass.add_property(name, type: resolved_type, **options) }
43
- end
44
-
45
- protected
46
-
47
- # @param [Symbol] name
48
- # @param [TypeSpec] type
49
- # @param [Hash] options
50
- def add_property(name, type:, **options)
51
- property = Property.new(name, type: type, **options)
52
- properties[name] = property
53
- aliased_properties[property.alias] = property
54
- define_accessors(property)
55
- define_validations(property)
56
- end
57
-
58
- # @param [Property] property
59
- def define_accessors(property)
60
- define_getter(property)
61
- define_setter(property)
62
- end
63
-
64
- # @param [Property] property
65
- def define_getter(property)
66
- define_method(property.name) do
67
- if attributes.key?(property.name)
68
- attributes[property.name]
69
- else
70
- property.default
71
- end
72
- end
73
- end
74
-
75
- # @param [Property] property
76
- def define_setter(property)
77
- define_method("#{property.name}=") { |value| attributes[property.name] = property.type.cast(value) }
78
- end
79
-
80
- # @param [Property] property
81
- def define_validations(property)
82
- property.register_validations(self)
83
- end
84
- end
85
- end
86
- end
@@ -1,54 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module JsonModel
4
- class Property
5
- attr_reader(:name, :default, :type, :optional, :alias)
6
-
7
- # @param [Symbol] name
8
- # @param [TypeSpec] type
9
- # @param [Object, nil] default
10
- # @param [Boolean] optional
11
- # @param [Symbol] ref_mode
12
- # @param [Symbol, nil] as
13
- def initialize(name, type:, default: nil, optional: false, ref_mode: RefMode::INLINE, as: nil)
14
- @name = name
15
- @type = type
16
- @default = default
17
- @optional = optional
18
- @ref_mode = ref_mode
19
- @alias = as || JsonModel.config.property_naming_strategy.call(name).to_sym
20
- end
21
-
22
- # @param [Hash] options
23
- # @return [Hash]
24
- def as_schema(**options)
25
- {
26
- self.alias => type
27
- .as_schema(**options, ref_mode: @ref_mode)
28
- .merge({ default: default }.compact),
29
- }
30
- end
31
-
32
- # @param [ActiveModel::Validations]
33
- def register_validations(klass)
34
- if required?
35
- klass.validates(name, presence: true)
36
- end
37
- type.register_validations(name, klass)
38
- end
39
-
40
- # @return [Boolean]
41
- def required?
42
- !optional
43
- end
44
-
45
- # @return [Array]
46
- def referenced_schemas
47
- if @ref_mode == RefMode::LOCAL
48
- type.referenced_schemas
49
- else
50
- []
51
- end
52
- end
53
- end
54
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module JsonModel
4
- module RefMode
5
- EXTERNAL = :external
6
- INLINE = :inline
7
- LOCAL = :local
8
- end
9
- end
@@ -1,72 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module JsonModel
4
- class TypeSpec
5
- class Array < TypeSpec
6
- # @param [TypeSpec] type
7
- # @param [Integer, nil] min_items
8
- # @param [Integer, nil] max_items
9
- # @param [Boolean, nil] unique_items
10
- def initialize(type, min_items: nil, max_items: nil, unique_items: nil)
11
- super()
12
- @type = type
13
- @min_items = min_items
14
- @max_items = max_items
15
- @unique_items = unique_items
16
- end
17
-
18
- # @param [Hash] options
19
- # @return [Hash]
20
- def as_schema(**options)
21
- {
22
- type: 'array',
23
- items: @type.as_schema(**options),
24
- minItems: @min_items,
25
- maxItems: @max_items,
26
- uniqueItems: @unique_items,
27
- }.compact
28
- end
29
-
30
- # @param [Symbol] name
31
- # @param [ActiveModel::Validations] klass
32
- def register_validations(name, klass)
33
- super
34
-
35
- if @min_items || @max_items
36
- klass.validates(name, length: { minimum: @min_items, maximum: @max_items }.compact, allow_nil: true)
37
- end
38
- if @unique_items
39
- register_uniqueness_validation(name, klass)
40
- end
41
- end
42
-
43
- # @return [Array<TypeSpec>]
44
- def referenced_schemas
45
- @type.referenced_schemas
46
- end
47
-
48
- # @param [::Object] json
49
- # @return [::Object, nil]
50
- def cast(json)
51
- if json.is_a?(Enumerable)
52
- json.map { |item| @type.cast(item) }
53
- else
54
- raise(Errors::TypeError, "Expected an array, got #{json.class} (#{json.inspect})")
55
- end
56
- end
57
-
58
- private
59
-
60
- # @param [Symbol] name
61
- # @param [ActiveModel::Validations] klass
62
- def register_uniqueness_validation(name, klass)
63
- klass.validate do |record|
64
- duplicates = record.send(name)&.group_by(&:itself)&.select { |_k, v| v.size > 1 }&.keys
65
- if !duplicates.nil? && duplicates.any?
66
- record.errors.add(:tags, :uniqueness, message: "contains duplicates: #{duplicates.join(', ')}")
67
- end
68
- end
69
- end
70
- end
71
- end
72
- end
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module JsonModel
4
- class TypeSpec
5
- class Castable < TypeSpec
6
- # @param [String] format
7
- # @param [Proc] cast_block
8
- def initialize(format:, &cast_block)
9
- super()
10
- @format = format
11
- @cast_block = cast_block
12
- end
13
-
14
- # @param [Hash] _options
15
- # @return [Hash]
16
- def as_schema(**_options)
17
- {
18
- type: 'string',
19
- format: @format,
20
- }
21
- end
22
-
23
- # @param [::Object] json
24
- # @return [::Object, nil]
25
- def cast(json)
26
- if json.nil?
27
- nil
28
- else
29
- @cast_block.call(json)
30
- end
31
- end
32
- end
33
- end
34
- end
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module JsonModel
4
- class TypeSpec
5
- class Composition
6
- class AllOf < Composition
7
- # @param [TypeSpec] types
8
- # @param [Hash] options
9
- def initialize(*types, **options)
10
- super(:allOf, *types, **options)
11
- end
12
-
13
- # @param [::Object] json
14
- # @return [::Object, nil]
15
- def cast(json)
16
- if json.nil?
17
- return nil
18
- end
19
-
20
- types_for(json).map do |type|
21
- type.cast(json)
22
- rescue StandardError
23
- raise(Errors::TypeError, "Value #{json.inspect} cannot be cast to allOf type #{self}")
24
- end
25
- end
26
- end
27
- end
28
- end
29
- end
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module JsonModel
4
- class TypeSpec
5
- class Composition
6
- class AnyOf < Composition
7
- # @param [TypeSpec] types
8
- # @param [Hash] options
9
- def initialize(*types, **options)
10
- super(:anyOf, *types, **options)
11
- end
12
-
13
- # @param [::Object] json
14
- # @return [::Object, nil]
15
- def cast(json)
16
- if json.nil?
17
- return nil
18
- end
19
-
20
- type = types_for(json).detect do |type|
21
- type.cast(json)
22
- rescue StandardError
23
- false
24
- end
25
- if type.nil?
26
- raise(Errors::TypeError, "No matching type found in AnyOf for value: #{json.inspect}")
27
- else
28
- type.cast(json)
29
- end
30
- end
31
- end
32
- end
33
- end
34
- end
@@ -1,38 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module JsonModel
4
- class TypeSpec
5
- class Composition
6
- class OneOf < Composition
7
- # @param [TypeSpec] types
8
- # @param [Hash] options
9
- def initialize(*types, **options)
10
- super(:oneOf, *types, **options)
11
- end
12
-
13
- # @param [::Object] json
14
- # @return [::Object, nil]
15
- def cast(json)
16
- if json.nil?
17
- return nil
18
- end
19
-
20
- types = types_for(json).select do |type|
21
- type.cast(json)
22
- rescue StandardError
23
- false
24
- end
25
-
26
- case types.size
27
- when 0
28
- raise(Errors::TypeError, "No matching type found in OneOf for value: #{json.inspect}")
29
- when 1
30
- types.first.cast(json)
31
- else
32
- raise(Errors::TypeError, "Multiple matching types found in OneOf for value: #{json.inspect}")
33
- end
34
- end
35
- end
36
- end
37
- end
38
- end