Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
24ac5bc
pre-commit/ruff
commonism Aug 31, 2026
bbb0792
ruff - B008
commonism Aug 31, 2026
a5df05b
ruff - B009
commonism Aug 31, 2026
3022bb6
ruff - B015
commonism Aug 31, 2026
c84b2e6
ruff - B018
commonism Aug 31, 2026
9a2a27f
ruff - B020
commonism Aug 31, 2026
d8df3f7
ruff - C408
commonism Aug 31, 2026
2e04d3e
ruff - C408
commonism Aug 31, 2026
a3534d7
ruff - C417
commonism Sep 1, 2026
935382e
ruff - C419
commonism Sep 1, 2026
2533c4d
ruff - FURB167
commonism Sep 1, 2026
063b92c
ruff - I001
commonism Sep 1, 2026
f34f8eb
ruff - PERF102
commonism Sep 1, 2026
463db20
ruff - PIE790
commonism Sep 1, 2026
ce887ab
ruff - PIE804
commonism Sep 1, 2026
287356a
ruff - PIE808
commonism Sep 1, 2026
aadc1eb
ruff - PLC0208
commonism Sep 1, 2026
a258b40
ruff - PLR1708
commonism Sep 1, 2026
ba3c0aa
ruff - PLR1711
commonism Sep 1, 2026
09988e3
ruff - PLR2044
commonism Sep 1, 2026
4f32cc4
ruff - PLW0120
commonism Sep 1, 2026
8637690
ruff - PLW0602
commonism Sep 1, 2026
9868c00
ruff - PT031
commonism Sep 1, 2026
7e9291e
ruff - PYI055
commonism Sep 1, 2026
ff26ecb
ruff - RUF010
commonism Sep 1, 2026
7824abf
ruff - RUF012
commonism Sep 1, 2026
f2d6bcb
ruff - RUF013
commonism Sep 1, 2026
7ead199
ruff - RUF017
commonism Sep 1, 2026
fec5000
ruff - RUF022
commonism Sep 1, 2026
7bda35c
ruff - RUF046
commonism Sep 1, 2026
9c04f58
ruff - RUF059
commonism Sep 1, 2026
e18804f
ruff - RUF100
commonism Sep 1, 2026
9338e1d
ruff - SIM101
commonism Sep 1, 2026
a771d77
ruff - SIM102
commonism Sep 1, 2026
50c1082
ruff - SIM103
commonism Sep 1, 2026
6121fac
ruff - SIM118
commonism Sep 1, 2026
01043aa
ruff - SIM201
commonism Sep 1, 2026
d885064
ruff - SIM210
commonism Sep 1, 2026
6347ee6
ruff - SIM211
commonism Sep 1, 2026
fb58406
ruff - TC004
commonism Sep 1, 2026
45f8726
ruff - TC005
commonism Sep 1, 2026
8d8cc26
ruff - TRY004
commonism Sep 1, 2026
7027098
ruff - TRY201
commonism Sep 1, 2026
5757e4e
ruff - TRY203
commonism Sep 1, 2026
a451a35
ruff - TRY401
commonism Sep 1, 2026
323fb0f
ruff - UP031
commonism Sep 1, 2026
c2395f0
ruff - UP037
commonism Sep 1, 2026
d3801aa
ruff - UP045
commonism Sep 1, 2026
aaf0ea4
ruff - DTZ005
commonism Sep 1, 2026
ff2c59b
ruff - BLE001
commonism Sep 1, 2026
6dccdaa
ruff - S110
commonism Sep 1, 2026
b4e4c3f
ruff - RET501
commonism Sep 1, 2026
9854ace
ruff - UP018
commonism Sep 1, 2026
982bab9
ruff - C400
commonism Sep 1, 2026
b1c6680
ruff - E402
commonism Sep 1, 2026
1ec43b0
ruff - finish
commonism Sep 1, 2026
224e3a3
ruff - UP045
commonism Sep 1, 2026
c1ab2cd
ruff - UP007
commonism Sep 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ repos:
- id: pycln
- repo: https://github.com/astral-sh/ruff-pre-commit
# Ruff version.
rev: v0.15.13
rev: v0.16.5
hooks:
# Run the linter.
- id: ruff-check
Expand Down Expand Up @@ -62,7 +62,7 @@ repos:

- repo: https://github.com/astral-sh/uv-pre-commit
# uv version.
rev: 0.11.15
rev: 0.12.8
hooks:
# Update the uv lockfile
- id: uv-lock
Expand Down
7 changes: 4 additions & 3 deletions docs/source/_ext/aioai3.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
from sphinx.domains import Domain
from sphinx.roles import XRefRole
from typing import ClassVar

from docutils import nodes
from sphinx.domains import Domain
from sphinx.roles import XRefRole


def resolve_url(env, name):
Expand All @@ -15,7 +16,7 @@ class aiopenapi3Domain(Domain):
name = "aioai3"
label = "aiopenapi3 code linker"

roles = {
roles: ClassVar = {
"ref": XRefRole(),
}

Expand Down
9 changes: 4 additions & 5 deletions docs/source/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,12 @@
# -- Project information -----------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information

import os
import datetime
import importlib
import inspect
from pathlib import Path
import os
import sys
import datetime

from pathlib import Path

sys.path.append(str(p := (Path(".").absolute() / "_ext")))
assert p.exists(), f"{p} {os.getcwd()}"
Expand All @@ -26,7 +25,7 @@
"""

project = "aiopenapi3"
copyright = f"{datetime.datetime.now().date().year}, Markus Kötter"
copyright = f"{datetime.datetime.now().date().year}, Markus Kötter" # noqa: DTZ005
author = "Markus Kötter"

# -- General configuration ---------------------------------------------------
Expand Down
9 changes: 8 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,14 @@ indent-width = 4

[tool.ruff.lint]
fixable = ["ALL"]
ignore = ["E741","F841","E402"]
ignore = [
"E741", # ambiguous-variable-name
"F841", # unused-variable
]

[tool.ruff.lint.per-file-ignores]
"src/aiopenapi3/model.py" = ["UP007"] # https://github.com/astral-sh/ruff/issues/21347
"tests/parsing_test.py" = ["UP007"]

[tool.ruff.format]
quote-style = "double"
Expand Down
31 changes: 15 additions & 16 deletions src/aiopenapi3/__init__.py
Original file line number Diff line number Diff line change
@@ -1,30 +1,29 @@
from .version import __version__
from .openapi import OpenAPI
from .loader import FileSystemLoader
from .errors import (
SpecError,
ReferenceResolutionError,
ContentTypeError,
HTTPError,
ResponseError,
HTTPStatusError,
ContentTypeError,
ReferenceResolutionError,
RequestError,
ResponseDecodingError,
ResponseError,
ResponseSchemaError,
RequestError,
SpecError,
)

from .loader import FileSystemLoader
from .openapi import OpenAPI
from .version import __version__

__all__ = [
"__version__",
"OpenAPI",
"ContentTypeError",
"FileSystemLoader",
"SpecError",
"ReferenceResolutionError",
"HTTPError",
"ResponseError",
"HTTPStatusError",
"ContentTypeError",
"OpenAPI",
"ReferenceResolutionError",
"RequestError",
"ResponseDecodingError",
"ResponseError",
"ResponseSchemaError",
"RequestError",
"SpecError",
"__version__",
]
1 change: 1 addition & 0 deletions src/aiopenapi3/__main__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import sys

from .cli import main

if __name__ == "__main__":
Expand Down
100 changes: 46 additions & 54 deletions src/aiopenapi3/_types.py
Original file line number Diff line number Diff line change
@@ -1,87 +1,79 @@
import re
from typing import TYPE_CHECKING, Union, TypeAlias, Optional, Literal
from collections.abc import Sequence
from typing import Literal, TypeAlias

import yaml

from httpx._types import RequestContent, FileTypes, RequestFiles, AuthTypes # noqa
from httpx2._types import AuthTypes, FileTypes, RequestContent, RequestFiles
from pydantic import BaseModel


from . import v20, v30, v31, v32

if TYPE_CHECKING:
pass


RequestFileParameter = tuple[str, FileTypes]
RequestFilesParameter = Sequence[RequestFileParameter]

JSON: TypeAlias = Optional[Union[dict[str, "JSON"], list["JSON"], str, int, float, bool]]
JSON: TypeAlias = dict[str, "JSON"] | list["JSON"] | str | int | float | bool | None
"""
Define a JSON type
https://github.com/python/typing/issues/182#issuecomment-1320974824
"""

RequestData = Union[JSON, BaseModel, RequestFilesParameter]
RequestParameter = Union[str, BaseModel]
RequestData = JSON | BaseModel | RequestFilesParameter
RequestParameter = str | BaseModel
RequestParameters = dict[str, RequestParameter]

RootType = Union[v20.Root, v30.Root, v31.Root]
ServerType = Union[v30.Server, v31.Server]
ReferenceType = Union[v20.Reference, v30.Reference, v31.Reference]
SchemaType = Union[v20.Schema, v30.Schema, v31.Schema]
v3xSchemaType = Union[v30.Schema, v31.Schema]
DiscriminatorType = Union[v30.Discriminator, v31.Discriminator]
PathItemType = Union[v20.PathItem, v30.PathItem, v31.PathItem]
OperationType = Union[v20.Operation, v30.Operation, v31.Operation]
ParameterType = Union[v20.Parameter, v30.Parameter, v31.Parameter]
HeaderType = Union[v20.Header, v30.Header, v31.Header]
RequestType = Union[v20.Request, v30.Request]
AsyncRequestType = Union[v20.AsyncRequest, v30.AsyncRequest]
MediaTypeType = Union[v30.MediaType, v31.MediaType]
ExpectedType = Union[v20.Response, MediaTypeType]
ResponseHeadersType = dict[str, Union[str, BaseModel, list[BaseModel]]]
ResponseDataType = Union[BaseModel, bytes, str]
TagType = Union[v20.Tag, v30.Tag, v32.Tag]
RootType = v20.Root | v30.Root | v31.Root
ServerType = v30.Server | v31.Server
ReferenceType = v20.Reference | v30.Reference | v31.Reference
SchemaType = v20.Schema | v30.Schema | v31.Schema
v3xSchemaType = v30.Schema | v31.Schema
DiscriminatorType = v30.Discriminator | v31.Discriminator
PathItemType = v20.PathItem, v30.PathItem | v31.PathItem
OperationType = v20.Operation | v30.Operation | v31.Operation
ParameterType = v20.Parameter | v30.Parameter | v31.Parameter
HeaderType = v20.Header | v30.Header | v31.Header
RequestType = v20.Request | v30.Request
AsyncRequestType = v20.AsyncRequest | v30.AsyncRequest
MediaTypeType = v30.MediaType | v31.MediaType
ExpectedType = v20.Response | MediaTypeType
ResponseHeadersType = dict[str, str | BaseModel | list[BaseModel]]
ResponseDataType = BaseModel, bytes | str
TagType = v20.Tag | v30.Tag | v32.Tag

YAMLLoaderType = Union[type[yaml.Loader], type[yaml.CLoader], type[yaml.SafeLoader], type[yaml.CSafeLoader]]
YAMLLoaderType = type[yaml.Loader] | type[yaml.CLoader] | type[yaml.SafeLoader] | type[yaml.CSafeLoader]

PrimitiveTypes = Union[str, float, int, bool]
PrimitiveTypes = str | float | int | bool

HTTPMethodType = Literal["get", "put", "post", "delete", "options", "head", "patch", "trace"]
HTTPMethodMatchType = Union[re.Pattern, HTTPMethodType]
HTTPMethodMatchType = re.Pattern | HTTPMethodType

__all__: list[str] = [
"RootType",
"ServerType",
"SchemaType",
"v3xSchemaType",
"JSON",
"AuthTypes",
"DiscriminatorType",
"PathItemType",
"OperationType",
"ParameterType",
"HeaderType",
"RequestType",
"ExpectedType",
"HTTPMethodMatchType",
"HTTPMethodType",
"HeaderType",
"MediaTypeType",
"ResponseHeadersType",
"ResponseDataType",
"TagType",
"RequestData",
"RequestParameters",
"ReferenceType",
"OperationType",
"ParameterType",
"PathItemType",
"PrimitiveTypes",
#
"YAMLLoaderType",
"ReferenceType",
# httpx forwards
"RequestContent",
"RequestData",
"RequestFileParameter",
"RequestFiles",
"AuthTypes",
#
"JSON",
"RequestFilesParameter",
"RequestFileParameter",
"HTTPMethodType",
"HTTPMethodMatchType",
"RequestParameters",
"RequestType",
"ResponseDataType",
"ResponseHeadersType",
"RootType",
"SchemaType",
"ServerType",
"TagType",
"YAMLLoaderType",
"v3xSchemaType",
]
Loading
Loading