Sha256: 9c44a2a1878a76983197b945816b371a55162031e222dd88e551864acc40aba3

Contents?: true

Size: 1.58 KB

Versions: 1

Compression:

Stored size: 1.58 KB

Contents

module SwaggerYard
  #
  # Carries id (the class name) and properties for a referenced
  #   complex model object as defined by swagger schema
  #
  class Model
    attr_reader :id

    def self.from_yard_objects(yard_objects)
      from_yard_object(yard_objects.detect {|o| o.type == :class })
    end

    def self.from_yard_object(yard_object)
      from_tags(yard_object.tags) if yard_object
    end

    def self.from_tags(tags)
      new.tap do |model|
        model.parse_tags(tags)
      end
    end

    def initialize
      @properties = []
    end

    def valid?
      !id.nil?
    end

    def parse_tags(tags)
      tags.each do |tag|
        case tag.tag_name
        when "model"
          @id = tag.text
        when "property"
          @properties << Property.from_tag(tag)
        end
      end

      self
    end

    def properties_model_names
      @properties.map(&:model_name).compact
    end

    def recursive_properties_model_names(model_list)
      properties_model_names + properties_model_names.map do |model_name|
        child_model = model_from_model_list(model_list, model_name)
        child_model.recursive_properties_model_names(model_list) if child_model
      end.compact
    end

    def model_from_model_list(model_list, model_name)
      model_list.find{|model| model.id == model_name}
    end

    def to_h
      raise "Model is missing @model tag" if id.nil?

      {
        "id" => id,
        "properties" => Hash[@properties.map {|property| [property.name, property.to_h]}],
        "required" => @properties.select(&:required?).map(&:name)
      }
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
swagger_yard-0.1.0 lib/swagger_yard/model.rb