json_model_rb 0.1.19 → 0.1.22

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 (96) 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 +41 -77
  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 -6
  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 +67 -26
  45. data/spec/schema_meta_spec.rb +0 -40
  46. data/spec/schema_spec.rb +43 -59
  47. metadata +84 -57
  48. data/lib/json_model/errors/invalid_ref_mode_error.rb +0 -12
  49. data/lib/json_model/errors/type_error.rb +0 -8
  50. data/lib/json_model/errors/unknown_attribute_error.rb +0 -13
  51. data/lib/json_model/properties.rb +0 -86
  52. data/lib/json_model/property.rb +0 -54
  53. data/lib/json_model/ref_mode.rb +0 -9
  54. data/lib/json_model/type_spec/array.rb +0 -72
  55. data/lib/json_model/type_spec/castable.rb +0 -34
  56. data/lib/json_model/type_spec/composition/all_of.rb +0 -29
  57. data/lib/json_model/type_spec/composition/any_of.rb +0 -34
  58. data/lib/json_model/type_spec/composition/one_of.rb +0 -38
  59. data/lib/json_model/type_spec/composition.rb +0 -79
  60. data/lib/json_model/type_spec/const.rb +0 -35
  61. data/lib/json_model/type_spec/enum.rb +0 -35
  62. data/lib/json_model/type_spec/object.rb +0 -32
  63. data/lib/json_model/type_spec/primitive/boolean.rb +0 -13
  64. data/lib/json_model/type_spec/primitive/integer.rb +0 -21
  65. data/lib/json_model/type_spec/primitive/null.rb +0 -13
  66. data/lib/json_model/type_spec/primitive/number.rb +0 -14
  67. data/lib/json_model/type_spec/primitive/numeric.rb +0 -85
  68. data/lib/json_model/type_spec/primitive/string.rb +0 -150
  69. data/lib/json_model/type_spec/primitive.rb +0 -40
  70. data/lib/json_model/type_spec.rb +0 -82
  71. data/lib/json_model/types/all_of.rb +0 -29
  72. data/lib/json_model/types/array.rb +0 -29
  73. data/lib/json_model/types/boolean.rb +0 -7
  74. data/lib/json_model/types/const.rb +0 -23
  75. data/lib/json_model/types/enum.rb +0 -23
  76. data/lib/json_model/types/integer.rb +0 -23
  77. data/lib/json_model/types/null.rb +0 -7
  78. data/lib/json_model/types/number.rb +0 -23
  79. data/lib/json_model/types/string.rb +0 -23
  80. data/spec/properties_spec.rb +0 -76
  81. data/spec/property_spec.rb +0 -86
  82. data/spec/type_spec/array_spec.rb +0 -206
  83. data/spec/type_spec/castable_spec.rb +0 -19
  84. data/spec/type_spec/composition/all_of_spec.rb +0 -57
  85. data/spec/type_spec/composition/any_of_spec.rb +0 -54
  86. data/spec/type_spec/composition/one_of_spec.rb +0 -59
  87. data/spec/type_spec/composition_spec.rb +0 -90
  88. data/spec/type_spec/const_spec.rb +0 -18
  89. data/spec/type_spec/enum_spec.rb +0 -84
  90. data/spec/type_spec/primitive/boolean_spec.rb +0 -12
  91. data/spec/type_spec/primitive/integer_spec.rb +0 -57
  92. data/spec/type_spec/primitive/null_spec.rb +0 -12
  93. data/spec/type_spec/primitive/number_spec.rb +0 -12
  94. data/spec/type_spec/primitive/numeric_spec.rb +0 -176
  95. data/spec/type_spec/primitive/string_spec.rb +0 -119
  96. data/spec/type_spec_spec.rb +0 -32
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module T
4
- class Number
5
- # @param [Hash] options
6
- def initialize(**options)
7
- @options = options
8
- end
9
-
10
- # @return [JsonModel::TypeSpec::Composition::Primitive::Number]
11
- def to_type_spec
12
- JsonModel::TypeSpec::Primitive::Number.new(**@options)
13
- end
14
-
15
- class << self
16
- # @param [Hash] options
17
- # @return [Number]
18
- def [](**options)
19
- Number.new(**options)
20
- end
21
- end
22
- end
23
- end
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module T
4
- class String
5
- # @param [Hash] options
6
- def initialize(**options)
7
- @options = options
8
- end
9
-
10
- # @return [JsonModel::TypeSpec::Composition::Primitive::String]
11
- def to_type_spec
12
- JsonModel::TypeSpec::Primitive::String.new(**@options)
13
- end
14
-
15
- class << self
16
- # @param [Hash] options
17
- # @return [T::String]
18
- def [](**options)
19
- String.new(**options)
20
- end
21
- end
22
- end
23
- end
@@ -1,76 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require('spec_helper')
4
-
5
- RSpec.describe(JsonModel::Properties) do
6
- describe('.property') do
7
- let(:klass) do
8
- Class.new do
9
- include(JsonModel::Properties)
10
- end
11
- end
12
-
13
- it('has no default properties') do
14
- expect(klass.properties)
15
- .to(eq({}))
16
- end
17
-
18
- it('adds a property by name') do
19
- klass.property(:foo, type: String)
20
-
21
- expect(klass.properties.keys)
22
- .to(eq(%i(foo)))
23
- expect(klass.properties[:foo])
24
- .to(be_a(JsonModel::Property))
25
- end
26
- end
27
-
28
- describe('getter and setter') do
29
- let(:klass) do
30
- Class.new do
31
- include(JsonModel::Properties)
32
-
33
- property(:foo, type: String)
34
- end
35
- end
36
-
37
- it('responds to the getter') do
38
- expect(klass.new)
39
- .to(respond_to(:foo))
40
- end
41
-
42
- it('responds to the setter') do
43
- expect(klass.new)
44
- .to(respond_to(:foo=))
45
- end
46
-
47
- it('allows updating the property') do
48
- instance = klass.new
49
-
50
- expect(instance.foo)
51
- .to(be_nil)
52
-
53
- instance.foo = 'bar'
54
-
55
- expect(instance.foo)
56
- .to(eq('bar'))
57
- end
58
-
59
- context('with a default value') do
60
- before { klass.property(:foo, type: String, default: 'bar') }
61
-
62
- it('returns the default value') do
63
- expect(klass.new.foo)
64
- .to(eq('bar'))
65
- end
66
-
67
- it('returns the updated value') do
68
- instance = klass.new
69
- instance.foo = 'foo'
70
-
71
- expect(instance.foo)
72
- .to(eq('foo'))
73
- end
74
- end
75
- end
76
- end
@@ -1,86 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require('spec_helper')
4
-
5
- RSpec.describe(JsonModel::Property) do
6
- describe('.register_validations') do
7
- let(:klass) do
8
- Class.new do
9
- include(ActiveModel::Validations)
10
-
11
- attr_accessor(:foo)
12
- end
13
- end
14
-
15
- context('for an optional property') do
16
- before do
17
- described_class
18
- .new(:foo, type: JsonModel::TypeSpec::Primitive::String.new, optional: true)
19
- .register_validations(klass)
20
- end
21
-
22
- it('does not fail the validation for missing values') do
23
- instance = klass.new
24
-
25
- expect(instance.valid?)
26
- .to(be(true))
27
- expect(instance.errors)
28
- .to(be_empty)
29
- end
30
-
31
- it('does not fail the validation for present values') do
32
- instance = klass.new.tap { |obj| obj.foo = 'bar' }
33
-
34
- expect(instance.valid?)
35
- .to(be(true))
36
- expect(instance.errors)
37
- .to(be_empty)
38
- end
39
- end
40
-
41
- context('for a non-optional property') do
42
- before do
43
- described_class
44
- .new(:foo, type: JsonModel::TypeSpec::Primitive::String.new)
45
- .register_validations(klass)
46
- end
47
-
48
- it('fails the validation for missing values') do
49
- instance = klass.new
50
-
51
- expect(instance.valid?)
52
- .to(be(false))
53
- expect(instance.errors.map(&:type))
54
- .to(eq(%i(blank)))
55
- end
56
-
57
- it('does not fail the validation for present values') do
58
- instance = klass.new.tap { |obj| obj.foo = 'bar' }
59
-
60
- expect(instance.valid?)
61
- .to(be(true))
62
- expect(instance.errors)
63
- .to(be_empty)
64
- end
65
- end
66
- end
67
-
68
- describe('#as_schema') do
69
- it('renders the property as a schema') do
70
- expect(described_class.new(:foo, type: JsonModel::TypeSpec::Primitive::String.new).as_schema)
71
- .to(eq({ foo: { type: 'string' } }))
72
- end
73
-
74
- it('respects the "as" option') do
75
- expect(described_class.new(:foo, type: JsonModel::TypeSpec::Primitive::String.new, as: :bar).as_schema)
76
- .to(eq({ bar: { type: 'string' } }))
77
- end
78
-
79
- it('falls back to the configured naming strategy') do
80
- JsonModel.configure { |config| config.property_naming_strategy = :camel_case }
81
-
82
- expect(described_class.new(:foo_bar, type: JsonModel::TypeSpec::Primitive::String.new).as_schema)
83
- .to(eq({ fooBar: { type: 'string' } }))
84
- end
85
- end
86
- end
@@ -1,206 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require('spec_helper')
4
-
5
- RSpec.describe(JsonModel::TypeSpec::Array) do
6
- describe('#as_schema') do
7
- it('returns an array schema of primitive types') do
8
- expect(
9
- described_class.new(JsonModel::TypeSpec::Primitive::String.new).as_schema,
10
- )
11
- .to(
12
- eq(
13
- {
14
- type: 'array',
15
- items: { type: 'string' },
16
- },
17
- ),
18
- )
19
- end
20
-
21
- it('returns an array schema of nested array types') do
22
- expect(
23
- described_class.new(described_class.new(JsonModel::TypeSpec::Primitive::String.new)).as_schema,
24
- )
25
- .to(
26
- eq(
27
- {
28
- type: 'array',
29
- items: { type: 'array', items: { type: 'string' } },
30
- },
31
- ),
32
- )
33
- end
34
-
35
- it('includes the minItems attribute') do
36
- expect(
37
- described_class.new(JsonModel::TypeSpec::Primitive::String.new, min_items: 10).as_schema,
38
- )
39
- .to(
40
- eq(
41
- {
42
- type: 'array',
43
- items: { type: 'string' },
44
- minItems: 10,
45
- },
46
- ),
47
- )
48
- end
49
-
50
- it('includes the maxItems attribute') do
51
- expect(
52
- described_class.new(JsonModel::TypeSpec::Primitive::String.new, max_items: 10).as_schema,
53
- )
54
- .to(
55
- eq(
56
- {
57
- type: 'array',
58
- items: { type: 'string' },
59
- maxItems: 10,
60
- },
61
- ),
62
- )
63
- end
64
-
65
- it('uses external references') do
66
- expect(
67
- described_class
68
- .new(
69
- Class.new do
70
- include(JsonModel::Schema)
71
-
72
- property(:foo, type: String)
73
- schema_id('https://example.com/schemas/foo.json')
74
- end,
75
- )
76
- .as_schema(ref_mode: JsonModel::RefMode::EXTERNAL),
77
- )
78
- .to(
79
- eq(
80
- {
81
- type: 'array',
82
- items: { '$ref': 'https://example.com/schemas/foo.json' },
83
- },
84
- ),
85
- )
86
- end
87
-
88
- it('uses local references') do
89
- expect(
90
- described_class
91
- .new(
92
- Class.new do
93
- include(JsonModel::Schema)
94
-
95
- property(:foo, type: String)
96
-
97
- def self.name
98
- 'Foo'
99
- end
100
- end,
101
- )
102
- .as_schema(ref_mode: JsonModel::RefMode::LOCAL),
103
- )
104
- .to(
105
- eq(
106
- {
107
- type: 'array',
108
- items: { '$ref': '#/$defs/Foo' },
109
- },
110
- ),
111
- )
112
- end
113
- end
114
-
115
- describe('.register_validations') do
116
- let(:klass) do
117
- Class.new do
118
- include(ActiveModel::Validations)
119
-
120
- attr_accessor(:foo)
121
-
122
- def initialize(foo:)
123
- @foo = foo
124
- end
125
- end
126
- end
127
-
128
- context('for min items') do
129
- before do
130
- described_class
131
- .new(JsonModel::TypeSpec::Primitive::String.new, min_items: 5)
132
- .register_validations(:foo, klass)
133
- end
134
-
135
- it('fails the validation for invalid values') do
136
- instance = klass.new(foo: ['a'] * 4)
137
-
138
- expect(instance.valid?)
139
- .to(be(false))
140
- expect(instance.errors.map(&:type))
141
- .to(eq(%i(too_short)))
142
- end
143
-
144
- it('succeeds the validation for valid values') do
145
- instance = klass.new(foo: ['a'] * 5)
146
-
147
- expect(instance.valid?)
148
- .to(be(true))
149
- expect(instance.errors)
150
- .to(be_empty)
151
- end
152
- end
153
-
154
- context('for max items') do
155
- before do
156
- described_class
157
- .new(JsonModel::TypeSpec::Primitive::String.new, max_items: 5)
158
- .register_validations(:foo, klass)
159
- end
160
-
161
- it('fails the validation for invalid values') do
162
- instance = klass.new(foo: ['a'] * 6)
163
-
164
- expect(instance.valid?)
165
- .to(be(false))
166
- expect(instance.errors.map(&:type))
167
- .to(eq(%i(too_long)))
168
- end
169
-
170
- it('succeeds the validation for valid values') do
171
- instance = klass.new(foo: ['a'] * 5)
172
-
173
- expect(instance.valid?)
174
- .to(be(true))
175
- expect(instance.errors)
176
- .to(be_empty)
177
- end
178
- end
179
-
180
- context('for unique items') do
181
- before do
182
- described_class
183
- .new(JsonModel::TypeSpec::Primitive::String.new, unique_items: true)
184
- .register_validations(:foo, klass)
185
- end
186
-
187
- it('fails the validation for invalid values') do
188
- instance = klass.new(foo: %w(a b a))
189
-
190
- expect(instance.valid?)
191
- .to(be(false))
192
- expect(instance.errors.map(&:type))
193
- .to(eq(%i(uniqueness)))
194
- end
195
-
196
- it('succeeds the validation for valid values') do
197
- instance = klass.new(foo: %w(a b c))
198
-
199
- expect(instance.valid?)
200
- .to(be(true))
201
- expect(instance.errors)
202
- .to(be_empty)
203
- end
204
- end
205
- end
206
- end
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require('spec_helper')
4
-
5
- RSpec.describe(JsonModel::TypeSpec::Castable) do
6
- describe('#as_schema') do
7
- it('returns a string schema') do
8
- expect(described_class.new(format: 'date') { |v| v }.as_schema)
9
- .to(eq({ type: 'string', format: 'date' }))
10
- end
11
- end
12
-
13
- describe('#cast') do
14
- it('casts a string') do
15
- expect(described_class.new(format: 'date') { |v| Date.parse(v) }.cast('2020-01-01'))
16
- .to(eq(Date.new(2020, 1, 1)))
17
- end
18
- end
19
- end
@@ -1,57 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require('spec_helper')
4
-
5
- RSpec.describe(JsonModel::TypeSpec::Composition::AllOf) do
6
- describe('#as_schema') do
7
- it('returns an all of schema') do
8
- expect(
9
- described_class.new(JsonModel::TypeSpec::Primitive::String.new).as_schema,
10
- )
11
- .to(
12
- eq(
13
- {
14
- allOf: [{ type: 'string' }],
15
- },
16
- ),
17
- )
18
- end
19
- end
20
-
21
- describe('#cast') do
22
- let(:foo) do
23
- Class.new do
24
- include(JsonModel::Schema)
25
-
26
- additional_properties(true)
27
- property(:foo, type: String)
28
- end
29
- end
30
-
31
- let(:bar) do
32
- Class.new do
33
- include(JsonModel::Schema)
34
-
35
- additional_properties(true)
36
- property(:bar, type: String)
37
- end
38
- end
39
-
40
- subject { described_class.new(JsonModel::TypeSpec::Object.new(foo), JsonModel::TypeSpec::Object.new(bar)) }
41
-
42
- it('raises if one of the types fails') do
43
- expect { subject.cast({ foo: 'foo' }) }
44
- .to(raise_error(JsonModel::Errors::TypeError))
45
- end
46
-
47
- it('returns the value if all types pass') do
48
- foo_instance, bar_instance = subject.cast({ foo: 'foo', bar: 'bar' })
49
-
50
- expect(foo_instance).to(be_instance_of(foo))
51
- expect(foo_instance.foo).to(eq('foo'))
52
-
53
- expect(bar_instance).to(be_instance_of(bar))
54
- expect(bar_instance.bar).to(eq('bar'))
55
- end
56
- end
57
- end
@@ -1,54 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require('spec_helper')
4
-
5
- RSpec.describe(JsonModel::TypeSpec::Composition::AnyOf) do
6
- describe('#as_schema') do
7
- it('returns an any of schema') do
8
- expect(
9
- described_class.new(JsonModel::TypeSpec::Primitive::String.new).as_schema,
10
- )
11
- .to(
12
- eq(
13
- {
14
- anyOf: [{ type: 'string' }],
15
- },
16
- ),
17
- )
18
- end
19
- end
20
-
21
- describe('#cast') do
22
- let(:foo) do
23
- Class.new do
24
- include(JsonModel::Schema)
25
-
26
- additional_properties(true)
27
- property(:foo, type: String)
28
- end
29
- end
30
-
31
- let(:bar) do
32
- Class.new do
33
- include(JsonModel::Schema)
34
-
35
- additional_properties(true)
36
- property(:bar, type: String)
37
- end
38
- end
39
-
40
- subject { described_class.new(JsonModel::TypeSpec::Object.new(foo), JsonModel::TypeSpec::Object.new(bar)) }
41
-
42
- it('raises if all of the types fail') do
43
- expect { subject.cast({ bam: 'bam' }) }
44
- .to(raise_error(JsonModel::Errors::TypeError))
45
- end
46
-
47
- it('returns the value if any type passes') do
48
- foo_instance = subject.cast({ foo: 'foo' })
49
-
50
- expect(foo_instance).to(be_instance_of(foo))
51
- expect(foo_instance.foo).to(eq('foo'))
52
- end
53
- end
54
- end
@@ -1,59 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require('spec_helper')
4
-
5
- RSpec.describe(JsonModel::TypeSpec::Composition::OneOf) do
6
- describe('#as_schema') do
7
- it('returns a one of schema') do
8
- expect(
9
- described_class.new(JsonModel::TypeSpec::Primitive::String.new).as_schema,
10
- )
11
- .to(
12
- eq(
13
- {
14
- oneOf: [{ type: 'string' }],
15
- },
16
- ),
17
- )
18
- end
19
- end
20
-
21
- describe('#cast') do
22
- let(:foo) do
23
- Class.new do
24
- include(JsonModel::Schema)
25
-
26
- additional_properties(true)
27
- property(:foo, type: String)
28
- end
29
- end
30
-
31
- let(:bar) do
32
- Class.new do
33
- include(JsonModel::Schema)
34
-
35
- additional_properties(true)
36
- property(:bar, type: String)
37
- end
38
- end
39
-
40
- subject { described_class.new(JsonModel::TypeSpec::Object.new(foo), JsonModel::TypeSpec::Object.new(bar)) }
41
-
42
- it('raises if all of the types fail') do
43
- expect { subject.cast({ bam: 'bam' }) }
44
- .to(raise_error(JsonModel::Errors::TypeError))
45
- end
46
-
47
- it('raises if more than one type passes') do
48
- expect { subject.cast({ foo: 'foo', bar: 'bar' }) }
49
- .to(raise_error(JsonModel::Errors::TypeError))
50
- end
51
-
52
- it('returns the value if one type passes') do
53
- foo_instance = subject.cast({ foo: 'foo' })
54
-
55
- expect(foo_instance).to(be_instance_of(foo))
56
- expect(foo_instance.foo).to(eq('foo'))
57
- end
58
- end
59
- end
@@ -1,90 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require('spec_helper')
4
-
5
- RSpec.describe(JsonModel::TypeSpec::Composition) do
6
- describe('#as_schema') do
7
- it('returns schema of complex types') do
8
- expect(
9
- described_class
10
- .new(
11
- :allOf,
12
- JsonModel::TypeSpec::Primitive::String.new,
13
- Class.new do
14
- include(JsonModel::Schema)
15
-
16
- property(:foo, type: String)
17
- end,
18
- )
19
- .as_schema,
20
- )
21
- .to(
22
- eq(
23
- {
24
- allOf: [
25
- { type: 'string' },
26
- {
27
- type: 'object',
28
- properties: { foo: { type: 'string' } },
29
- required: %i(foo),
30
- },
31
- ],
32
- },
33
- ),
34
- )
35
- end
36
-
37
- it('uses external references') do
38
- expect(
39
- described_class
40
- .new(
41
- :allOf,
42
- Class.new do
43
- include(JsonModel::Schema)
44
-
45
- property(:foo, type: String)
46
- schema_id('https://example.com/schemas/foo.json')
47
- end,
48
- )
49
- .as_schema(ref_mode: JsonModel::RefMode::EXTERNAL),
50
- )
51
- .to(
52
- eq(
53
- {
54
- allOf: [
55
- { '$ref': 'https://example.com/schemas/foo.json' },
56
- ],
57
- },
58
- ),
59
- )
60
- end
61
-
62
- it('uses local references') do
63
- expect(
64
- described_class
65
- .new(
66
- :allOf,
67
- Class.new do
68
- include(JsonModel::Schema)
69
-
70
- property(:foo, type: String)
71
-
72
- def self.name
73
- 'Foo'
74
- end
75
- end,
76
- )
77
- .as_schema(ref_mode: JsonModel::RefMode::LOCAL),
78
- )
79
- .to(
80
- eq(
81
- {
82
- allOf: [
83
- { '$ref': '#/$defs/Foo' },
84
- ],
85
- },
86
- ),
87
- )
88
- end
89
- end
90
- end