module Solarwinds::Itsm::Api::Definitions

Constants

LIB_DIR
REDOC_DIR

Public Class Methods

base_schema() click to toggle source
# File lib/solarwinds/itsm/api/definitions.rb, line 11
def self.base_schema
  path = File.join(LIB_DIR, 'definitions/openapi.json')
  JSON.parse(File.open(path).read)
end
resolved_schema() click to toggle source
# File lib/solarwinds/itsm/api/definitions.rb, line 16
def self.resolved_schema
  recursive_resolve(base_schema, File.join(LIB_DIR, 'definitions'))
end
resolved_schema_path() click to toggle source
# File lib/solarwinds/itsm/api/definitions.rb, line 20
def self.resolved_schema_path
  File.join(REDOC_DIR, 'resolved_schema.json')
end
write_resolved_schema(path = REDOC_DIR, name = 'resolved_schema.json') click to toggle source
# File lib/solarwinds/itsm/api/definitions.rb, line 24
def self.write_resolved_schema(path = REDOC_DIR, name = 'resolved_schema.json')
  File.write(File.join(path, name), resolved_schema.to_json)
end

Private Class Methods

generate_xml_example(value, resolved_schema) click to toggle source
# File lib/solarwinds/itsm/api/definitions.rb, line 60
def self.generate_xml_example(value, resolved_schema)
  if value['schema']['type'] == 'array'
    items = resolved_schema['application/json']['schema']['items']
    properties = (items['allOf'] && items['allOf'][0]['properties']) || items['properties']
    return "<>\n\t#{recursive_xml_properties(properties, 1)}\n<>"
  end

  properties = resolved_schema['application/json']['schema']['properties']
  recursive_xml_properties(properties)
end
recursive_resolve(schema, base_uri) click to toggle source
# File lib/solarwinds/itsm/api/definitions.rb, line 30
def self.recursive_resolve(schema, base_uri)
  return schema unless schema.is_a?(Array) || schema.is_a?(Hash)

  schema.each_with_object({}) do |(key, value), resolved_schema|
    if key == 'application/xml'
      value['example'] = generate_xml_example(value, resolved_schema)
    end
    if key == '$ref'
      reference = [*value].each_with_object({}) do |referred_path, result|
        split_path = referred_path.split('#/')
        path_to_file = split_path.first
        path_to_nested_object = split_path.size > 1 ? split_path.last.split('/') : nil

        path_and_file_name = path_to_file.split(/\/(?!.*\/.*)/)
        new_base_uri = (path_and_file_name.size > 1) ? Pathname.new("#{base_uri}/#{path_and_file_name.first}").cleanpath.to_s : base_uri
        json = JSON.parse(File.open(File.join(new_base_uri, path_and_file_name.last)).read)
        internal_object = path_to_nested_object&.inject(json) { |obj, arg| obj[arg] } || json
        result.merge!(recursive_resolve(internal_object, new_base_uri))
      end
      resolved_schema.merge!(reference)
    elsif value.is_a?(Array)
      resolved_schema[key] = value.map { |v| recursive_resolve(v, base_uri) }
    elsif value.is_a?(Hash)
      resolved_schema[key] = recursive_resolve(value, base_uri)
    else
      resolved_schema[key] = value
    end
  end
end
recursive_xml_properties(properties, levels = 0) click to toggle source
# File lib/solarwinds/itsm/api/definitions.rb, line 71
def self.recursive_xml_properties(properties, levels = 0)
  return unless properties

  xml_example = ''
  tabs = tabs_count(levels)

  properties.each do |k, val|
    value_example = case val['type']
    when 'object'
      items = val['oneOf'] || val['anyOf']
      properties = items && items.first['properties'] || val['properties']
      "\n\t#{tabs}#{recursive_xml_properties(properties, levels + 1)}"
    when 'string'
      val['example'] || 'string example'
    when 'integer'
      val['example'] || '1'
    when 'boolean'
      val['example'] || 'true'
    else
      types_array = val['anyOf'] || val['oneOf']
      next unless types_array
      types_array.first['example'] || '1'
    end

    xml_example = "#{xml_example}<#{k}>#{value_example}</#{k}>\n#{tabs}"
  end
  xml_example.chop
end
tabs_count(levels) click to toggle source
# File lib/solarwinds/itsm/api/definitions.rb, line 100
def self.tabs_count(levels)
  tabs = ''
  levels.times { tabs = "#{tabs}\t" }
  tabs
end