Module: JSONSchemer::OpenAPI30::Document

Defined in:
lib/json_schemer/openapi30/document.rb

Constant Summary collapse

SCHEMA =
{
  'id' => 'https://spec.openapis.org/oas/3.0/schema/2021-09-28',
  '$schema' => 'http://json-schema.org/draft-04/schema#',
  'description' => 'The description of OpenAPI v3.0.x documents, as defined by https://spec.openapis.org/oas/v3.0.3',
  'type' => 'object',
  'required' => [
    'openapi',
    'info',
    'paths'
  ],
  'properties' => {
    'openapi' => {
      'type' => 'string',
      'pattern' => '^3\.0\.\d(-.+)?$'
    },
    'info' => {
      '$ref' => '#/definitions/Info'
    },
    'externalDocs' => {
      '$ref' => '#/definitions/ExternalDocumentation'
    },
    'servers' => {
      'type' => 'array',
      'items' => {
        '$ref' => '#/definitions/Server'
      }
    },
    'security' => {
      'type' => 'array',
      'items' => {
        '$ref' => '#/definitions/SecurityRequirement'
      }
    },
    'tags' => {
      'type' => 'array',
      'items' => {
        '$ref' => '#/definitions/Tag'
      },
      'uniqueItems' => true
    },
    'paths' => {
      '$ref' => '#/definitions/Paths'
    },
    'components' => {
      '$ref' => '#/definitions/Components'
    }
  },
  'patternProperties' => {
    '^x-' => {
    }
  },
  'additionalProperties' => false,
  'definitions' => {
    'Reference' => {
      'type' => 'object',
      'required' => [
        '$ref'
      ],
      'patternProperties' => {
        '^\$ref$' => {
          'type' => 'string',
          'format' => 'uri-reference'
        }
      }
    },
    'Info' => {
      'type' => 'object',
      'required' => [
        'title',
        'version'
      ],
      'properties' => {
        'title' => {
          'type' => 'string'
        },
        'description' => {
          'type' => 'string'
        },
        'termsOfService' => {
          'type' => 'string',
          'format' => 'uri-reference'
        },
        'contact' => {
          '$ref' => '#/definitions/Contact'
        },
        'license' => {
          '$ref' => '#/definitions/License'
        },
        'version' => {
          'type' => 'string'
        }
      },
      'patternProperties' => {
        '^x-' => {
        }
      },
      'additionalProperties' => false
    },
    'Contact' => {
      'type' => 'object',
      'properties' => {
        'name' => {
          'type' => 'string'
        },
        'url' => {
          'type' => 'string',
          'format' => 'uri-reference'
        },
        'email' => {
          'type' => 'string',
          'format' => 'email'
        }
      },
      'patternProperties' => {
        '^x-' => {
        }
      },
      'additionalProperties' => false
    },
    'License' => {
      'type' => 'object',
      'required' => [
        'name'
      ],
      'properties' => {
        'name' => {
          'type' => 'string'
        },
        'url' => {
          'type' => 'string',
          'format' => 'uri-reference'
        }
      },
      'patternProperties' => {
        '^x-' => {
        }
      },
      'additionalProperties' => false
    },
    'Server' => {
      'type' => 'object',
      'required' => [
        'url'
      ],
      'properties' => {
        'url' => {
          'type' => 'string'
        },
        'description' => {
          'type' => 'string'
        },
        'variables' => {
          'type' => 'object',
          'additionalProperties' => {
            '$ref' => '#/definitions/ServerVariable'
          }
        }
      },
      'patternProperties' => {
        '^x-' => {
        }
      },
      'additionalProperties' => false
    },
    'ServerVariable' => {
      'type' => 'object',
      'required' => [
        'default'
      ],
      'properties' => {
        'enum' => {
          'type' => 'array',
          'items' => {
            'type' => 'string'
          }
        },
        'default' => {
          'type' => 'string'
        },
        'description' => {
          'type' => 'string'
        }
      },
      'patternProperties' => {
        '^x-' => {
        }
      },
      'additionalProperties' => false
    },
    'Components' => {
      'type' => 'object',
      'properties' => {
        'schemas' => {
          'type' => 'object',
          'patternProperties' => {
            '^[a-zA-Z0-9\.\-_]+$' => {
              'oneOf' => [
                {
                  '$ref' => '#/definitions/Schema'
                },
                {
                  '$ref' => '#/definitions/Reference'
                }
              ]
            }
          }
        },
        'responses' => {
          'type' => 'object',
          'patternProperties' => {
            '^[a-zA-Z0-9\.\-_]+$' => {
              'oneOf' => [
                {
                  '$ref' => '#/definitions/Reference'
                },
                {
                  '$ref' => '#/definitions/Response'
                }
              ]
            }
          }
        },
        'parameters' => {
          'type' => 'object',
          'patternProperties' => {
            '^[a-zA-Z0-9\.\-_]+$' => {
              'oneOf' => [
                {
                  '$ref' => '#/definitions/Reference'
                },
                {
                  '$ref' => '#/definitions/Parameter'
                }
              ]
            }
          }
        },
        'examples' => {
          'type' => 'object',
          'patternProperties' => {
            '^[a-zA-Z0-9\.\-_]+$' => {
              'oneOf' => [
                {
                  '$ref' => '#/definitions/Reference'
                },
                {
                  '$ref' => '#/definitions/Example'
                }
              ]
            }
          }
        },
        'requestBodies' => {
          'type' => 'object',
          'patternProperties' => {
            '^[a-zA-Z0-9\.\-_]+$' => {
              'oneOf' => [
                {
                  '$ref' => '#/definitions/Reference'
                },
                {
                  '$ref' => '#/definitions/RequestBody'
                }
              ]
            }
          }
        },
        'headers' => {
          'type' => 'object',
          'patternProperties' => {
            '^[a-zA-Z0-9\.\-_]+$' => {
              'oneOf' => [
                {
                  '$ref' => '#/definitions/Reference'
                },
                {
                  '$ref' => '#/definitions/Header'
                }
              ]
            }
          }
        },
        'securitySchemes' => {
          'type' => 'object',
          'patternProperties' => {
            '^[a-zA-Z0-9\.\-_]+$' => {
              'oneOf' => [
                {
                  '$ref' => '#/definitions/Reference'
                },
                {
                  '$ref' => '#/definitions/SecurityScheme'
                }
              ]
            }
          }
        },
        'links' => {
          'type' => 'object',
          'patternProperties' => {
            '^[a-zA-Z0-9\.\-_]+$' => {
              'oneOf' => [
                {
                  '$ref' => '#/definitions/Reference'
                },
                {
                  '$ref' => '#/definitions/Link'
                }
              ]
            }
          }
        },
        'callbacks' => {
          'type' => 'object',
          'patternProperties' => {
            '^[a-zA-Z0-9\.\-_]+$' => {
              'oneOf' => [
                {
                  '$ref' => '#/definitions/Reference'
                },
                {
                  '$ref' => '#/definitions/Callback'
                }
              ]
            }
          }
        }
      },
      'patternProperties' => {
        '^x-' => {
        }
      },
      'additionalProperties' => false
    },
    'Schema' => {
      'type' => 'object',
      'properties' => {
        'title' => {
          'type' => 'string'
        },
        'multipleOf' => {
          'type' => 'number',
          'minimum' => 0,
          'exclusiveMinimum' => true
        },
        'maximum' => {
          'type' => 'number'
        },
        'exclusiveMaximum' => {
          'type' => 'boolean',
          'default' => false
        },
        'minimum' => {
          'type' => 'number'
        },
        'exclusiveMinimum' => {
          'type' => 'boolean',
          'default' => false
        },
        'maxLength' => {
          'type' => 'integer',
          'minimum' => 0
        },
        'minLength' => {
          'type' => 'integer',
          'minimum' => 0,
          'default' => 0
        },
        'pattern' => {
          'type' => 'string',
          'format' => 'regex'
        },
        'maxItems' => {
          'type' => 'integer',
          'minimum' => 0
        },
        'minItems' => {
          'type' => 'integer',
          'minimum' => 0,
          'default' => 0
        },
        'uniqueItems' => {
          'type' => 'boolean',
          'default' => false
        },
        'maxProperties' => {
          'type' => 'integer',
          'minimum' => 0
        },
        'minProperties' => {
          'type' => 'integer',
          'minimum' => 0,
          'default' => 0
        },
        'required' => {
          'type' => 'array',
          'items' => {
            'type' => 'string'
          },
          'minItems' => 1,
          'uniqueItems' => true
        },
        'enum' => {
          'type' => 'array',
          'items' => {
          },
          'minItems' => 1,
          'uniqueItems' => false
        },
        'type' => {
          'type' => 'string',
          'enum' => [
            'array',
            'boolean',
            'integer',
            'number',
            'object',
            'string'
          ]
        },
        'not' => {
          'oneOf' => [
            {
              '$ref' => '#/definitions/Schema'
            },
            {
              '$ref' => '#/definitions/Reference'
            }
          ]
        },
        'allOf' => {
          'type' => 'array',
          'items' => {
            'oneOf' => [
              {
                '$ref' => '#/definitions/Schema'
              },
              {
                '$ref' => '#/definitions/Reference'
              }
            ]
          }
        },
        'oneOf' => {
          'type' => 'array',
          'items' => {
            'oneOf' => [
              {
                '$ref' => '#/definitions/Schema'
              },
              {
                '$ref' => '#/definitions/Reference'
              }
            ]
          }
        },
        'anyOf' => {
          'type' => 'array',
          'items' => {
            'oneOf' => [
              {
                '$ref' => '#/definitions/Schema'
              },
              {
                '$ref' => '#/definitions/Reference'
              }
            ]
          }
        },
        'items' => {
          'oneOf' => [
            {
              '$ref' => '#/definitions/Schema'
            },
            {
              '$ref' => '#/definitions/Reference'
            }
          ]
        },
        'properties' => {
          'type' => 'object',
          'additionalProperties' => {
            'oneOf' => [
              {
                '$ref' => '#/definitions/Schema'
              },
              {
                '$ref' => '#/definitions/Reference'
              }
            ]
          }
        },
        'additionalProperties' => {
          'oneOf' => [
            {
              '$ref' => '#/definitions/Schema'
            },
            {
              '$ref' => '#/definitions/Reference'
            },
            {
              'type' => 'boolean'
            }
          ],
          'default' => true
        },
        'description' => {
          'type' => 'string'
        },
        'format' => {
          'type' => 'string'
        },
        'default' => {
        },
        'nullable' => {
          'type' => 'boolean',
          'default' => false
        },
        'discriminator' => {
          '$ref' => '#/definitions/Discriminator'
        },
        'readOnly' => {
          'type' => 'boolean',
          'default' => false
        },
        'writeOnly' => {
          'type' => 'boolean',
          'default' => false
        },
        'example' => {
        },
        'externalDocs' => {
          '$ref' => '#/definitions/ExternalDocumentation'
        },
        'deprecated' => {
          'type' => 'boolean',
          'default' => false
        },
        'xml' => {
          '$ref' => '#/definitions/XML'
        }
      },
      'patternProperties' => {
        '^x-' => {
        }
      },
      'additionalProperties' => false
    },
    'Discriminator' => {
      'type' => 'object',
      'required' => [
        'propertyName'
      ],
      'properties' => {
        'propertyName' => {
          'type' => 'string'
        },
        'mapping' => {
          'type' => 'object',
          'additionalProperties' => {
            'type' => 'string'
          }
        }
      }
    },
    'XML' => {
      'type' => 'object',
      'properties' => {
        'name' => {
          'type' => 'string'
        },
        'namespace' => {
          'type' => 'string',
          'format' => 'uri'
        },
        'prefix' => {
          'type' => 'string'
        },
        'attribute' => {
          'type' => 'boolean',
          'default' => false
        },
        'wrapped' => {
          'type' => 'boolean',
          'default' => false
        }
      },
      'patternProperties' => {
        '^x-' => {
        }
      },
      'additionalProperties' => false
    },
    'Response' => {
      'type' => 'object',
      'required' => [
        'description'
      ],
      'properties' => {
        'description' => {
          'type' => 'string'
        },
        'headers' => {
          'type' => 'object',
          'additionalProperties' => {
            'oneOf' => [
              {
                '$ref' => '#/definitions/Header'
              },
              {
                '$ref' => '#/definitions/Reference'
              }
            ]
          }
        },
        'content' => {
          'type' => 'object',
          'additionalProperties' => {
            '$ref' => '#/definitions/MediaType'
          }
        },
        'links' => {
          'type' => 'object',
          'additionalProperties' => {
            'oneOf' => [
              {
                '$ref' => '#/definitions/Link'
              },
              {
                '$ref' => '#/definitions/Reference'
              }
            ]
          }
        }
      },
      'patternProperties' => {
        '^x-' => {
        }
      },
      'additionalProperties' => false
    },
    'MediaType' => {
      'type' => 'object',
      'properties' => {
        'schema' => {
          'oneOf' => [
            {
              '$ref' => '#/definitions/Schema'
            },
            {
              '$ref' => '#/definitions/Reference'
            }
          ]
        },
        'example' => {
        },
        'examples' => {
          'type' => 'object',
          'additionalProperties' => {
            'oneOf' => [
              {
                '$ref' => '#/definitions/Example'
              },
              {
                '$ref' => '#/definitions/Reference'
              }
            ]
          }
        },
        'encoding' => {
          'type' => 'object',
          'additionalProperties' => {
            '$ref' => '#/definitions/Encoding'
          }
        }
      },
      'patternProperties' => {
        '^x-' => {
        }
      },
      'additionalProperties' => false,
      'allOf' => [
        {
          '$ref' => '#/definitions/ExampleXORExamples'
        }
      ]
    },
    'Example' => {
      'type' => 'object',
      'properties' => {
        'summary' => {
          'type' => 'string'
        },
        'description' => {
          'type' => 'string'
        },
        'value' => {
        },
        'externalValue' => {
          'type' => 'string',
          'format' => 'uri-reference'
        }
      },
      'patternProperties' => {
        '^x-' => {
        }
      },
      'additionalProperties' => false
    },
    'Header' => {
      'type' => 'object',
      'properties' => {
        'description' => {
          'type' => 'string'
        },
        'required' => {
          'type' => 'boolean',
          'default' => false
        },
        'deprecated' => {
          'type' => 'boolean',
          'default' => false
        },
        'allowEmptyValue' => {
          'type' => 'boolean',
          'default' => false
        },
        'style' => {
          'type' => 'string',
          'enum' => [
            'simple'
          ],
          'default' => 'simple'
        },
        'explode' => {
          'type' => 'boolean'
        },
        'allowReserved' => {
          'type' => 'boolean',
          'default' => false
        },
        'schema' => {
          'oneOf' => [
            {
              '$ref' => '#/definitions/Schema'
            },
            {
              '$ref' => '#/definitions/Reference'
            }
          ]
        },
        'content' => {
          'type' => 'object',
          'additionalProperties' => {
            '$ref' => '#/definitions/MediaType'
          },
          'minProperties' => 1,
          'maxProperties' => 1
        },
        'example' => {
        },
        'examples' => {
          'type' => 'object',
          'additionalProperties' => {
            'oneOf' => [
              {
                '$ref' => '#/definitions/Example'
              },
              {
                '$ref' => '#/definitions/Reference'
              }
            ]
          }
        }
      },
      'patternProperties' => {
        '^x-' => {
        }
      },
      'additionalProperties' => false,
      'allOf' => [
        {
          '$ref' => '#/definitions/ExampleXORExamples'
        },
        {
          '$ref' => '#/definitions/SchemaXORContent'
        }
      ]
    },
    'Paths' => {
      'type' => 'object',
      'patternProperties' => {
        '^\/' => {
          '$ref' => '#/definitions/PathItem'
        },
        '^x-' => {
        }
      },
      'additionalProperties' => false
    },
    'PathItem' => {
      'type' => 'object',
      'properties' => {
        '$ref' => {
          'type' => 'string'
        },
        'summary' => {
          'type' => 'string'
        },
        'description' => {
          'type' => 'string'
        },
        'servers' => {
          'type' => 'array',
          'items' => {
            '$ref' => '#/definitions/Server'
          }
        },
        'parameters' => {
          'type' => 'array',
          'items' => {
            'oneOf' => [
              {
                '$ref' => '#/definitions/Parameter'
              },
              {
                '$ref' => '#/definitions/Reference'
              }
            ]
          },
          'uniqueItems' => true
        }
      },
      'patternProperties' => {
        '^(get|put|post|delete|options|head|patch|trace)$' => {
          '$ref' => '#/definitions/Operation'
        },
        '^x-' => {
        }
      },
      'additionalProperties' => false
    },
    'Operation' => {
      'type' => 'object',
      'required' => [
        'responses'
      ],
      'properties' => {
        'tags' => {
          'type' => 'array',
          'items' => {
            'type' => 'string'
          }
        },
        'summary' => {
          'type' => 'string'
        },
        'description' => {
          'type' => 'string'
        },
        'externalDocs' => {
          '$ref' => '#/definitions/ExternalDocumentation'
        },
        'operationId' => {
          'type' => 'string'
        },
        'parameters' => {
          'type' => 'array',
          'items' => {
            'oneOf' => [
              {
                '$ref' => '#/definitions/Parameter'
              },
              {
                '$ref' => '#/definitions/Reference'
              }
            ]
          },
          'uniqueItems' => true
        },
        'requestBody' => {
          'oneOf' => [
            {
              '$ref' => '#/definitions/RequestBody'
            },
            {
              '$ref' => '#/definitions/Reference'
            }
          ]
        },
        'responses' => {
          '$ref' => '#/definitions/Responses'
        },
        'callbacks' => {
          'type' => 'object',
          'additionalProperties' => {
            'oneOf' => [
              {
                '$ref' => '#/definitions/Callback'
              },
              {
                '$ref' => '#/definitions/Reference'
              }
            ]
          }
        },
        'deprecated' => {
          'type' => 'boolean',
          'default' => false
        },
        'security' => {
          'type' => 'array',
          'items' => {
            '$ref' => '#/definitions/SecurityRequirement'
          }
        },
        'servers' => {
          'type' => 'array',
          'items' => {
            '$ref' => '#/definitions/Server'
          }
        }
      },
      'patternProperties' => {
        '^x-' => {
        }
      },
      'additionalProperties' => false
    },
    'Responses' => {
      'type' => 'object',
      'properties' => {
        'default' => {
          'oneOf' => [
            {
              '$ref' => '#/definitions/Response'
            },
            {
              '$ref' => '#/definitions/Reference'
            }
          ]
        }
      },
      'patternProperties' => {
        '^[1-5](?:\d{2}|XX)$' => {
          'oneOf' => [
            {
              '$ref' => '#/definitions/Response'
            },
            {
              '$ref' => '#/definitions/Reference'
            }
          ]
        },
        '^x-' => {
        }
      },
      'minProperties' => 1,
      'additionalProperties' => false
    },
    'SecurityRequirement' => {
      'type' => 'object',
      'additionalProperties' => {
        'type' => 'array',
        'items' => {
          'type' => 'string'
        }
      }
    },
    'Tag' => {
      'type' => 'object',
      'required' => [
        'name'
      ],
      'properties' => {
        'name' => {
          'type' => 'string'
        },
        'description' => {
          'type' => 'string'
        },
        'externalDocs' => {
          '$ref' => '#/definitions/ExternalDocumentation'
        }
      },
      'patternProperties' => {
        '^x-' => {
        }
      },
      'additionalProperties' => false
    },
    'ExternalDocumentation' => {
      'type' => 'object',
      'required' => [
        'url'
      ],
      'properties' => {
        'description' => {
          'type' => 'string'
        },
        'url' => {
          'type' => 'string',
          'format' => 'uri-reference'
        }
      },
      'patternProperties' => {
        '^x-' => {
        }
      },
      'additionalProperties' => false
    },
    'ExampleXORExamples' => {
      'description' => 'Example and examples are mutually exclusive',
      'not' => {
        'required' => [
          'example',
          'examples'
        ]
      }
    },
    'SchemaXORContent' => {
      'description' => 'Schema and content are mutually exclusive, at least one is required',
      'not' => {
        'required' => [
          'schema',
          'content'
        ]
      },
      'oneOf' => [
        {
          'required' => [
            'schema'
          ]
        },
        {
          'required' => [
            'content'
          ],
          'description' => 'Some properties are not allowed if content is present',
          'allOf' => [
            {
              'not' => {
                'required' => [
                  'style'
                ]
              }
            },
            {
              'not' => {
                'required' => [
                  'explode'
                ]
              }
            },
            {
              'not' => {
                'required' => [
                  'allowReserved'
                ]
              }
            },
            {
              'not' => {
                'required' => [
                  'example'
                ]
              }
            },
            {
              'not' => {
                'required' => [
                  'examples'
                ]
              }
            }
          ]
        }
      ]
    },
    'Parameter' => {
      'type' => 'object',
      'properties' => {
        'name' => {
          'type' => 'string'
        },
        'in' => {
          'type' => 'string'
        },
        'description' => {
          'type' => 'string'
        },
        'required' => {
          'type' => 'boolean',
          'default' => false
        },
        'deprecated' => {
          'type' => 'boolean',
          'default' => false
        },
        'allowEmptyValue' => {
          'type' => 'boolean',
          'default' => false
        },
        'style' => {
          'type' => 'string'
        },
        'explode' => {
          'type' => 'boolean'
        },
        'allowReserved' => {
          'type' => 'boolean',
          'default' => false
        },
        'schema' => {
          'oneOf' => [
            {
              '$ref' => '#/definitions/Schema'
            },
            {
              '$ref' => '#/definitions/Reference'
            }
          ]
        },
        'content' => {
          'type' => 'object',
          'additionalProperties' => {
            '$ref' => '#/definitions/MediaType'
          },
          'minProperties' => 1,
          'maxProperties' => 1
        },
        'example' => {
        },
        'examples' => {
          'type' => 'object',
          'additionalProperties' => {
            'oneOf' => [
              {
                '$ref' => '#/definitions/Example'
              },
              {
                '$ref' => '#/definitions/Reference'
              }
            ]
          }
        }
      },
      'patternProperties' => {
        '^x-' => {
        }
      },
      'additionalProperties' => false,
      'required' => [
        'name',
        'in'
      ],
      'allOf' => [
        {
          '$ref' => '#/definitions/ExampleXORExamples'
        },
        {
          '$ref' => '#/definitions/SchemaXORContent'
        },
        {
          '$ref' => '#/definitions/ParameterLocation'
        }
      ]
    },
    'ParameterLocation' => {
      'description' => 'Parameter location',
      'oneOf' => [
        {
          'description' => 'Parameter in path',
          'required' => [
            'required'
          ],
          'properties' => {
            'in' => {
              'enum' => [
                'path'
              ]
            },
            'style' => {
              'enum' => [
                'matrix',
                'label',
                'simple'
              ],
              'default' => 'simple'
            },
            'required' => {
              'enum' => [
                true
              ]
            }
          }
        },
        {
          'description' => 'Parameter in query',
          'properties' => {
            'in' => {
              'enum' => [
                'query'
              ]
            },
            'style' => {
              'enum' => [
                'form',
                'spaceDelimited',
                'pipeDelimited',
                'deepObject'
              ],
              'default' => 'form'
            }
          }
        },
        {
          'description' => 'Parameter in header',
          'properties' => {
            'in' => {
              'enum' => [
                'header'
              ]
            },
            'style' => {
              'enum' => [
                'simple'
              ],
              'default' => 'simple'
            }
          }
        },
        {
          'description' => 'Parameter in cookie',
          'properties' => {
            'in' => {
              'enum' => [
                'cookie'
              ]
            },
            'style' => {
              'enum' => [
                'form'
              ],
              'default' => 'form'
            }
          }
        }
      ]
    },
    'RequestBody' => {
      'type' => 'object',
      'required' => [
        'content'
      ],
      'properties' => {
        'description' => {
          'type' => 'string'
        },
        'content' => {
          'type' => 'object',
          'additionalProperties' => {
            '$ref' => '#/definitions/MediaType'
          }
        },
        'required' => {
          'type' => 'boolean',
          'default' => false
        }
      },
      'patternProperties' => {
        '^x-' => {
        }
      },
      'additionalProperties' => false
    },
    'SecurityScheme' => {
      'oneOf' => [
        {
          '$ref' => '#/definitions/APIKeySecurityScheme'
        },
        {
          '$ref' => '#/definitions/HTTPSecurityScheme'
        },
        {
          '$ref' => '#/definitions/OAuth2SecurityScheme'
        },
        {
          '$ref' => '#/definitions/OpenIdConnectSecurityScheme'
        }
      ]
    },
    'APIKeySecurityScheme' => {
      'type' => 'object',
      'required' => [
        'type',
        'name',
        'in'
      ],
      'properties' => {
        'type' => {
          'type' => 'string',
          'enum' => [
            'apiKey'
          ]
        },
        'name' => {
          'type' => 'string'
        },
        'in' => {
          'type' => 'string',
          'enum' => [
            'header',
            'query',
            'cookie'
          ]
        },
        'description' => {
          'type' => 'string'
        }
      },
      'patternProperties' => {
        '^x-' => {
        }
      },
      'additionalProperties' => false
    },
    'HTTPSecurityScheme' => {
      'type' => 'object',
      'required' => [
        'scheme',
        'type'
      ],
      'properties' => {
        'scheme' => {
          'type' => 'string'
        },
        'bearerFormat' => {
          'type' => 'string'
        },
        'description' => {
          'type' => 'string'
        },
        'type' => {
          'type' => 'string',
          'enum' => [
            'http'
          ]
        }
      },
      'patternProperties' => {
        '^x-' => {
        }
      },
      'additionalProperties' => false,
      'oneOf' => [
        {
          'description' => 'Bearer',
          'properties' => {
            'scheme' => {
              'type' => 'string',
              'pattern' => '^[Bb][Ee][Aa][Rr][Ee][Rr]$'
            }
          }
        },
        {
          'description' => 'Non Bearer',
          'not' => {
            'required' => [
              'bearerFormat'
            ]
          },
          'properties' => {
            'scheme' => {
              'not' => {
                'type' => 'string',
                'pattern' => '^[Bb][Ee][Aa][Rr][Ee][Rr]$'
              }
            }
          }
        }
      ]
    },
    'OAuth2SecurityScheme' => {
      'type' => 'object',
      'required' => [
        'type',
        'flows'
      ],
      'properties' => {
        'type' => {
          'type' => 'string',
          'enum' => [
            'oauth2'
          ]
        },
        'flows' => {
          '$ref' => '#/definitions/OAuthFlows'
        },
        'description' => {
          'type' => 'string'
        }
      },
      'patternProperties' => {
        '^x-' => {
        }
      },
      'additionalProperties' => false
    },
    'OpenIdConnectSecurityScheme' => {
      'type' => 'object',
      'required' => [
        'type',
        'openIdConnectUrl'
      ],
      'properties' => {
        'type' => {
          'type' => 'string',
          'enum' => [
            'openIdConnect'
          ]
        },
        'openIdConnectUrl' => {
          'type' => 'string',
          'format' => 'uri-reference'
        },
        'description' => {
          'type' => 'string'
        }
      },
      'patternProperties' => {
        '^x-' => {
        }
      },
      'additionalProperties' => false
    },
    'OAuthFlows' => {
      'type' => 'object',
      'properties' => {
        'implicit' => {
          '$ref' => '#/definitions/ImplicitOAuthFlow'
        },
        'password' => {
          '$ref' => '#/definitions/PasswordOAuthFlow'
        },
        'clientCredentials' => {
          '$ref' => '#/definitions/ClientCredentialsFlow'
        },
        'authorizationCode' => {
          '$ref' => '#/definitions/AuthorizationCodeOAuthFlow'
        }
      },
      'patternProperties' => {
        '^x-' => {
        }
      },
      'additionalProperties' => false
    },
    'ImplicitOAuthFlow' => {
      'type' => 'object',
      'required' => [
        'authorizationUrl',
        'scopes'
      ],
      'properties' => {
        'authorizationUrl' => {
          'type' => 'string',
          'format' => 'uri-reference'
        },
        'refreshUrl' => {
          'type' => 'string',
          'format' => 'uri-reference'
        },
        'scopes' => {
          'type' => 'object',
          'additionalProperties' => {
            'type' => 'string'
          }
        }
      },
      'patternProperties' => {
        '^x-' => {
        }
      },
      'additionalProperties' => false
    },
    'PasswordOAuthFlow' => {
      'type' => 'object',
      'required' => [
        'tokenUrl',
        'scopes'
      ],
      'properties' => {
        'tokenUrl' => {
          'type' => 'string',
          'format' => 'uri-reference'
        },
        'refreshUrl' => {
          'type' => 'string',
          'format' => 'uri-reference'
        },
        'scopes' => {
          'type' => 'object',
          'additionalProperties' => {
            'type' => 'string'
          }
        }
      },
      'patternProperties' => {
        '^x-' => {
        }
      },
      'additionalProperties' => false
    },
    'ClientCredentialsFlow' => {
      'type' => 'object',
      'required' => [
        'tokenUrl',
        'scopes'
      ],
      'properties' => {
        'tokenUrl' => {
          'type' => 'string',
          'format' => 'uri-reference'
        },
        'refreshUrl' => {
          'type' => 'string',
          'format' => 'uri-reference'
        },
        'scopes' => {
          'type' => 'object',
          'additionalProperties' => {
            'type' => 'string'
          }
        }
      },
      'patternProperties' => {
        '^x-' => {
        }
      },
      'additionalProperties' => false
    },
    'AuthorizationCodeOAuthFlow' => {
      'type' => 'object',
      'required' => [
        'authorizationUrl',
        'tokenUrl',
        'scopes'
      ],
      'properties' => {
        'authorizationUrl' => {
          'type' => 'string',
          'format' => 'uri-reference'
        },
        'tokenUrl' => {
          'type' => 'string',
          'format' => 'uri-reference'
        },
        'refreshUrl' => {
          'type' => 'string',
          'format' => 'uri-reference'
        },
        'scopes' => {
          'type' => 'object',
          'additionalProperties' => {
            'type' => 'string'
          }
        }
      },
      'patternProperties' => {
        '^x-' => {
        }
      },
      'additionalProperties' => false
    },
    'Link' => {
      'type' => 'object',
      'properties' => {
        'operationId' => {
          'type' => 'string'
        },
        'operationRef' => {
          'type' => 'string'
        },
        'parameters' => {
          'type' => 'object',
          'additionalProperties' => {
          }
        },
        'requestBody' => {
        },
        'description' => {
          'type' => 'string'
        },
        'server' => {
          '$ref' => '#/definitions/Server'
        }
      },
      'patternProperties' => {
        '^x-' => {
        }
      },
      'additionalProperties' => false,
      'not' => {
        'description' => 'Operation Id and Operation Ref are mutually exclusive',
        'required' => [
          'operationId',
          'operationRef'
        ]
      }
    },
    'Callback' => {
      'type' => 'object',
      'additionalProperties' => {
        '$ref' => '#/definitions/PathItem'
      },
      'patternProperties' => {
        '^x-' => {
        }
      }
    },
    'Encoding' => {
      'type' => 'object',
      'properties' => {
        'contentType' => {
          'type' => 'string'
        },
        'headers' => {
          'type' => 'object',
          'additionalProperties' => {
            'oneOf' => [
              {
                '$ref' => '#/definitions/Header'
              },
              {
                '$ref' => '#/definitions/Reference'
              }
            ]
          }
        },
        'style' => {
          'type' => 'string',
          'enum' => [
            'form',
            'spaceDelimited',
            'pipeDelimited',
            'deepObject'
          ]
        },
        'explode' => {
          'type' => 'boolean'
        },
        'allowReserved' => {
          'type' => 'boolean',
          'default' => false
        }
      },
      'additionalProperties' => false
    }
  }
}
SCHEMAS =
{
  Draft4::BASE_URI.dup.tap { |uri| uri.fragment = nil } => Draft4::SCHEMA
}