module Rack::Swagger::RoutesToModels

Public Instance Methods

generate_models(json, root_name, debug=false) click to toggle source
# File lib/rack/swagger/routes_to_models.rb, line 67
def generate_models(json, root_name, debug=false)
  models = {}

  traverse('root', json) do |parent, obj_name, obj_type|
    if ['FalseClass', 'TrueClass'].include? obj_type
      obj_type = "Boolean"
    end

    if debug
      puts sprintf("parent: %30s obj_name: %20s obj_type: %20s", parent, obj_name, obj_type.to_s[0...20])
    end

    if obj_type == "NilClass"
      # skip

    elsif parent.match(/^Model_/)
      parent_wo_model = parent.gsub(/^Model_/, "")

      unless models[parent_wo_model]
        models[parent_wo_model] = new_model(parent_wo_model)
      end

      models[parent_wo_model][:properties][obj_name] = new_property(obj_type)
    elsif !parent.match(/^Model_/) && !obj_name.match(/^Model_/)
      c_parent = to_model_name(parent).gsub(/^Model_/, "")

      unless models[c_parent]
        models[c_parent] = new_model(c_parent)
      end

      models[c_parent][:properties][obj_name] = new_property(obj_type)
    end
  end

  root = models["Root"]
  models.delete("Root")
  root[:properties].delete("root")
  root[:id] = root_name

  models[root_name] = root
  models
end
get_json(url) click to toggle source
# File lib/rack/swagger/routes_to_models.rb, line 16
def get_json(url)
  raw  = `curl "#{url}"`
  json = JSON.parse raw
rescue
  puts "#{__FILE__}:#{__LINE__}: URL not parsable."
  {}
end
new_model(name) click to toggle source
# File lib/rack/swagger/routes_to_models.rb, line 46
def new_model(name)
  {id: name, properties: {}}
end
new_property(ruby_type) click to toggle source
# File lib/rack/swagger/routes_to_models.rb, line 50
def new_property(ruby_type)
  case ruby_type
  when "String"
    {type: "string"}
  when "Boolean"
    {type: "boolean", format: "boolean"}
  when "Float"
    {type: "number", format: "float"}
  when "Fixnum"
    {type: "integer", format: "int64"}
  when /\[(.+)\]/
    {type: "array", items: new_property($1) }
  else
    { "$ref" => ruby_type.gsub(/^Model_/, "") }
  end
end
to_model_name(str, singularize: false) click to toggle source
# File lib/rack/swagger/routes_to_models.rb, line 39
def to_model_name(str, singularize: false)
  str2 = ActiveSupport::Inflector.camelize(str)
  str2 = ActiveSupport::Inflector.singularize(str2) if singularize
  "Model_#{str2}"
end
traverse(gp='root', parent='root', obj, &blk) click to toggle source
# File lib/rack/swagger/routes_to_models.rb, line 24
def traverse(gp='root', parent='root', obj, &blk)
  case obj
  when Hash
    type = to_model_name(parent)
    blk.call(gp, parent, type)
    obj.each {|k,v| traverse(parent, k, v, &blk) }
  when Array
    type = to_model_name(parent, singularize: true)
    blk.call(gp, parent, "[#{type}]")
    obj.each {|v| traverse(parent, "#{type}", v, &blk) }
  else
    blk.call(gp, parent, "#{obj.class}")
  end
end