jbuilder-schema 2.6.2 → 2.6.3
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.
- checksums.yaml +4 -4
- data/lib/jbuilder/schema/template.rb +45 -4
- data/lib/jbuilder/schema/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3ece2220807094bf6da825da24512a4dabd0ce985aa935a16e9247c0e5d4c70e
|
4
|
+
data.tar.gz: f04dc67915f12690c7eca1efc2357f915351584061a6b0ece6598326606b0bbf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eb350992a61f92fbaee952b0167369caf119fd2d3f2695f647e1d774974e461e01e6a9cd1b7d5d4da2c19abe0658f8a74b601bedeff7d4e78de8365a6c61b02b
|
7
|
+
data.tar.gz: c9582ca4c80ba75106468c8b806cc443be3ee54a630afaa786524d249a4ef8d8bc5eeaef1f1beebb2b00c32e739cfe23be7734695cfff04a51f95de326a7fbd4
|
@@ -212,29 +212,70 @@ class Jbuilder::Schema
|
|
212
212
|
FORMATS = {::DateTime => "date-time", ::ActiveSupport::TimeWithZone => "date-time", ::Date => "date", ::Time => "time"}
|
213
213
|
|
214
214
|
def _schema(key, value, **options)
|
215
|
+
within_array = options.delete(:within_array)
|
215
216
|
options = @schema_overrides&.dig(key).to_h if options.empty?
|
216
217
|
|
217
218
|
unless options[:type]
|
218
219
|
options[:type] = _primitive_type value
|
219
220
|
|
220
|
-
if options[:type] == :array && (types = value.map { _primitive_type _1 }
|
221
|
+
if options[:type] == :array && (types = value.map { _primitive_type _1 }).any?
|
221
222
|
options[:minContains] = 0
|
222
|
-
|
223
|
+
|
224
|
+
# Merge all arrays in one so we have all possible array items in one place
|
225
|
+
if types.include?(:array) && types.count(:array) > 1
|
226
|
+
array_indices = types.each_index.select { |i| types[i] == :array }
|
227
|
+
merged_array = array_indices.each_with_object([]) { |i, arr| arr.concat(value[i]) }
|
228
|
+
array_indices.each { |i| value[i] = merged_array }
|
229
|
+
end
|
230
|
+
|
231
|
+
options[:contains] = if types.uniq { |type| (type == :object) ? type.object_id : type }.many?
|
232
|
+
any_of = types.map.with_index do |type, index|
|
233
|
+
_fill_contains(key, value[index], type)
|
234
|
+
end
|
235
|
+
|
236
|
+
{anyOf: any_of.uniq}
|
237
|
+
else
|
238
|
+
_fill_contains(key, value[0], types.first)
|
239
|
+
end
|
240
|
+
elsif options[:type] == :object
|
241
|
+
options[:properties] = _set_properties(key, value)
|
223
242
|
end
|
224
243
|
|
225
|
-
format = FORMATS[value.class] and options[:format] ||= format
|
244
|
+
(format = FORMATS[value.class]) and options[:format] ||= format
|
226
245
|
end
|
227
246
|
|
228
247
|
if (klass = @configuration.object&.class) && (defined_enum = klass.try(:defined_enums)&.dig(key.to_s))
|
229
248
|
options[:enum] = defined_enum.keys
|
230
249
|
end
|
231
250
|
|
232
|
-
_set_description key, options
|
251
|
+
_set_description key, options unless within_array
|
233
252
|
options
|
234
253
|
end
|
235
254
|
|
255
|
+
def _fill_contains(key, value, type)
|
256
|
+
case type
|
257
|
+
when :array
|
258
|
+
_schema(key, value, within_array: true)
|
259
|
+
when :object
|
260
|
+
value = value.attributes if value.is_a?(::ActiveRecord::Base)
|
261
|
+
{
|
262
|
+
type: type,
|
263
|
+
properties: _set_properties(key, value)
|
264
|
+
}
|
265
|
+
else
|
266
|
+
{type: type}
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
270
|
+
def _set_properties(key, value)
|
271
|
+
value.each_with_object({}) do |(attr_name, attr_value), properties|
|
272
|
+
properties[attr_name] = _schema("#{key}.#{attr_name}", attr_value)
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
236
276
|
def _primitive_type(value)
|
237
277
|
case value
|
278
|
+
when ::Hash, ::Struct, ::OpenStruct, ::ActiveRecord::Base then :object
|
238
279
|
when ::Array then :array
|
239
280
|
when ::Float, ::BigDecimal then :number
|
240
281
|
when true, false then :boolean
|
@@ -1,4 +1,4 @@
|
|
1
1
|
# We can't use the standard `Jbuilder::Schema::VERSION =` because
|
2
2
|
# `Jbuilder` isn't a regular module namespace, but a class …which also loads Active Support.
|
3
3
|
# So we use trickery, and assign the proper version once `jbuilder/schema.rb` is loaded.
|
4
|
-
JBUILDER_SCHEMA_VERSION = "2.6.
|
4
|
+
JBUILDER_SCHEMA_VERSION = "2.6.3"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jbuilder-schema
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.6.
|
4
|
+
version: 2.6.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yuri Sidorov
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-11-
|
11
|
+
date: 2023-11-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jbuilder
|