lib/modern/doc_generator/open_api3/schemas.rb in modern-0.4.4 vs lib/modern/doc_generator/open_api3/schemas.rb in modern-0.4.5

- old
+ new

@@ -29,16 +29,23 @@ # Only Dry::Struct def _struct_schemas(descriptor) ret = {} name_to_class = {} - descriptor.root_schemas \ - .select { |type_or_structclass| type_or_structclass.is_a?(Class) } \ - .each do |structclass| + schema_entries = + descriptor.root_schemas.partition do |type_or_structclass| + type_or_structclass.is_a?(Class) + end + + schema_entries.first.each do |structclass| _build_struct(ret, name_to_class, structclass) end + schema_entries.last.each do |dt| + _build_schema_value(ret, name_to_class, dt) + end + ret end def _build_struct(ret, name_to_class, structclass) # TODO: allow overriding the name of the struct in #/components/schemas @@ -82,15 +89,21 @@ registered_type = @type_registry[entry] if !registered_type.nil? registered_type elsif entry.is_a?(Class) && entry < Dry::Struct + _build_struct(ret, name_to_class, entry) _struct_ref(entry) - elsif entry.is_a?(Dry::Types::Sum::Constrained) + elsif entry.is_a?(Dry::Types::Array::Member) && entry.options.key?(:member) + _build_schema_value(ret, name_to_class, entry.options[:member]) + elsif entry.is_a?(Dry::Types::Sum) if entry.left.type.primitive == NilClass # it's a nullable field _build_schema_value(ret, name_to_class, entry.right).merge(nullable: true) + elsif entry.right.type.primitive == NilClass + # it's a backwards nullable field + _build_schema_value(ret, name_to_class, entry.left).merge(nullable: true) else { anyOf: _flatten_any_of( [ _build_schema_value(ret, name_to_class, entry.left), @@ -106,10 +119,12 @@ _build_schema_value(ret, name_to_class, entry.type) elsif entry.is_a?(Dry::Types::Default) || entry.is_a?(Dry::Struct::Constructor) || entry.is_a?(Dry::Types::Constructor) # this just unwraps the underlying value _build_schema_value(ret, name_to_class, entry.type) + elsif entry.is_a?(Dry::Types::Enum) + _build_schema_value(ret, name_to_class, entry.type).merge(enum: entry.values) elsif entry.is_a?(Dry::Types::Definition) primitive = entry.primitive if primitive < Dry::Struct # TODO: make sure I'm understanding this correctly @@ -120,12 +135,12 @@ { oneOf: [ _struct_ref(primitive) ] } - elsif primitive < Hash + elsif primitive <= Hash _build_object_from_schema(ret, name_to_class, entry.member_types) - elsif primitive < Array + elsif primitive <= Array { type: "array", items: _build_schema_value(ret, name_to_class, entry.member) } else