Sha256: afe960a5f863d60e6a80417adb66f7e5d7109c07cd7e9967d46535603b9136bf

Contents?: true

Size: 1.74 KB

Versions: 4

Compression:

Stored size: 1.74 KB

Contents

# frozen_string_literal: true

class Rage::OpenAPI::Parsers::Ext::ActiveRecord
  BLACKLISTED_ATTRIBUTES = %w(id created_at updated_at)

  def initialize(namespace: Object, **)
    @namespace = namespace
  end

  def known_definition?(str)
    _, str = Rage::OpenAPI.__try_parse_collection(str)
    defined?(ActiveRecord::Base) && @namespace.const_get(str).ancestors.include?(ActiveRecord::Base)
  rescue NameError
    false
  end

  def parse(klass_str)
    is_collection, klass_str = Rage::OpenAPI.__try_parse_collection(klass_str)
    klass = @namespace.const_get(klass_str)

    schema = {}

    klass.attribute_types.each do |attr_name, attr_type|
      next if BLACKLISTED_ATTRIBUTES.include?(attr_name) ||
              attr_name.end_with?("_id") ||
              attr_name == klass.inheritance_column ||
              klass.defined_enums.include?(attr_name)

      schema[attr_name] = case attr_type.type
      when :integer
        { "type" => "integer" }
      when :boolean
        { "type" => "boolean" }
      when :binary
        { "type" => "string", "format" => "binary" }
      when :date
        { "type" => "string", "format" => "date" }
      when :datetime, :time
        { "type" => "string", "format" => "date-time" }
      when :float
        { "type" => "number", "format" => "float" }
      when :decimal
        { "type" => "number" }
      when :json
        { "type" => "object" }
      else
        { "type" => "string" }
      end
    end

    klass.defined_enums.each do |attr_name, mapping|
      schema[attr_name] = { "type" => "string", "enum" => mapping.keys }
    end

    result = { "type" => "object" }
    result["properties"] = schema if schema.any?

    result = { "type" => "array", "items" => result } if is_collection

    result
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
rage-rb-1.14.0 lib/rage/openapi/parsers/ext/active_record.rb
rage-rb-1.13.0 lib/rage/openapi/parsers/ext/active_record.rb
rage-rb-1.12.0 lib/rage/openapi/parsers/ext/active_record.rb
rage-rb-1.11.0 lib/rage/openapi/parsers/ext/active_record.rb