OpenAPI v3 parser that transforms specification documents into structured Python objects for programmatic access and manipulation
—
The operations and paths system defines API endpoints with their HTTP operations, parameters, request bodies, and responses. This includes path definitions, operation specifications, parameter handling, and content type management for complete API endpoint documentation.
Represents an API endpoint path with its operations and shared parameters.
@dataclass
class Path:
url: str
summary: Optional[str] = None
description: Optional[str] = None
operations: list[Operation] = field(default_factory=list)
parameters: list[Parameter] = field(default_factory=list)
extensions: Optional[dict] = field(default_factory=dict)Properties:
url: Path template string (e.g., "/users/{id}")summary: Brief summary of the pathdescription: Detailed description of the pathoperations: List of HTTP operations for this pathparameters: Path-level parameters shared by all operationsextensions: Custom path extensions (x-* properties)Represents an HTTP operation (GET, POST, etc.) with its complete specification.
@dataclass
class Operation:
method: OperationMethod
responses: list[Response]
summary: Optional[str] = None
description: Optional[str] = None
operation_id: Optional[str] = None
external_docs: Optional[ExternalDoc] = None
request_body: Optional[RequestBody] = None
deprecated: Optional[bool] = field(default=False)
parameters: list[Parameter] = field(default_factory=list)
tags: list[str] = field(default_factory=list)
security: list[dict[str, Any]] = field(default_factory=list)
extensions: Optional[dict] = field(default_factory=dict)Properties:
method: HTTP method from OperationMethod enumresponses: List of possible responsessummary: Brief operation summarydescription: Detailed operation descriptionoperation_id: Unique identifier for the operationexternal_docs: Link to external documentationrequest_body: Request body specificationdeprecated: Whether the operation is deprecatedparameters: Operation-specific parameterstags: Tags for grouping/categorizationsecurity: Security requirements for this operationextensions: Custom operation extensionsDefines input parameters for operations including query, path, header, and cookie parameters.
@dataclass
class Parameter:
name: str
location: ParameterLocation
schema: Optional[Schema] = None
content: Optional[list[Content]] = None
required: Optional[bool] = field(default=False)
description: Optional[str] = None
deprecated: Optional[bool] = field(default=False)
style: Optional[str] = None
explode: Optional[bool] = field(default=False)
extensions: Optional[dict] = field(default_factory=dict)Properties:
name: Parameter namelocation: Parameter location (header, query, path, cookie)schema: Parameter schema definitioncontent: Alternative content-based parameter definitionrequired: Whether the parameter is requireddescription: Parameter descriptiondeprecated: Whether the parameter is deprecatedstyle: Serialization style for the parameterexplode: Whether to explode array/object parametersextensions: Custom parameter extensionsDefines the request body content and requirements for operations.
@dataclass
class RequestBody:
content: list[Content]
description: Optional[str] = None
required: Optional[bool] = field(default=False)Properties:
content: List of supported content types and schemasdescription: Request body descriptionrequired: Whether the request body is requiredDefines operation responses including status codes, content, and headers.
@dataclass
class Response:
is_default: bool
description: str
code: Optional[int] = None
content: Optional[list[Content]] = None
headers: list[Header] = field(default_factory=list)Properties:
is_default: Whether this is the default responsedescription: Response description (required)code: HTTP status code (None for default responses)content: Response content types and schemasheaders: Response headersDefines content types and their associated schemas for requests and responses.
@dataclass
class Content:
type: Union[ContentType, LooseContentType]
schema: Schema
example: Optional[Any] = None
examples: dict[str, Any] = field(default_factory=dict)Properties:
type: MIME content type (application/json, text/xml, etc.)schema: Schema definition for the contentexample: Single example valueexamples: Named collection of example valuesDefines HTTP headers for responses.
@dataclass
class Header:
name: str
schema: Schema
description: Optional[str] = None
required: Optional[bool] = field(default=False)
deprecated: Optional[bool] = field(default=False)
extensions: Optional[dict] = field(default_factory=dict)Properties:
name: Header nameschema: Header value schemadescription: Header descriptionrequired: Whether the header is requireddeprecated: Whether the header is deprecatedextensions: Custom header extensionsAccess all paths and operations:
from openapi_parser import parse
spec = parse('api-spec.yml')
# List all paths and their operations
for path in spec.paths:
print(f"Path: {path.url}")
if path.summary:
print(f" Summary: {path.summary}")
# List operations for this path
for operation in path.operations:
print(f" {operation.method.value.upper()}: {operation.summary or 'No summary'}")
# Show operation ID if present
if operation.operation_id:
print(f" Operation ID: {operation.operation_id}")
# Show tags
if operation.tags:
print(f" Tags: {', '.join(operation.tags)}")Examine operation parameters:
# Find operations with parameters
for path in spec.paths:
for operation in path.operations:
all_params = path.parameters + operation.parameters
if all_params:
print(f"{operation.method.value.upper()} {path.url}")
for param in all_params:
location = param.location.value
required = "required" if param.required else "optional"
print(f" {param.name} ({location}, {required})")
if param.description:
print(f" Description: {param.description}")Examine request bodies and responses:
# Check operations with request bodies
for path in spec.paths:
for operation in path.operations:
if operation.request_body:
print(f"{operation.method.value.upper()} {path.url}")
print(f" Request body required: {operation.request_body.required}")
# Show supported content types
for content in operation.request_body.content:
print(f" Content-Type: {content.type}")
print(f" Schema: {content.schema.type.value}")
# Show responses
for response in operation.responses:
if response.code:
print(f" Response {response.code}: {response.description}")
else:
print(f" Default response: {response.description}")
# Show response content types
if response.content:
for content in response.content:
print(f" Content-Type: {content.type}")Working with content types:
# Find all content types used in the API
content_types = set()
for path in spec.paths:
for operation in path.operations:
# Request body content types
if operation.request_body:
for content in operation.request_body.content:
content_types.add(str(content.type))
# Response content types
for response in operation.responses:
if response.content:
for content in response.content:
content_types.add(str(content.type))
print("Used content types:")
for ct in sorted(content_types):
print(f" {ct}")Install with Tessl CLI
npx tessl i tessl/pypi-openapi3-parser