__init__.py 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. from __future__ import annotations
  2. import sys
  3. from collections.abc import Iterator
  4. from typing import Any, Protocol
  5. if sys.version_info >= (3, 10): # pragma: no cover
  6. from typing import ParamSpec
  7. else: # pragma: no cover
  8. from typing_extensions import ParamSpec
  9. from starlette.types import ASGIApp
  10. P = ParamSpec("P")
  11. class _MiddlewareFactory(Protocol[P]):
  12. def __call__(self, app: ASGIApp, /, *args: P.args, **kwargs: P.kwargs) -> ASGIApp: ... # pragma: no cover
  13. class Middleware:
  14. def __init__(
  15. self,
  16. cls: _MiddlewareFactory[P],
  17. *args: P.args,
  18. **kwargs: P.kwargs,
  19. ) -> None:
  20. self.cls = cls
  21. self.args = args
  22. self.kwargs = kwargs
  23. def __iter__(self) -> Iterator[Any]:
  24. as_tuple = (self.cls, self.args, self.kwargs)
  25. return iter(as_tuple)
  26. def __repr__(self) -> str:
  27. class_name = self.__class__.__name__
  28. args_strings = [f"{value!r}" for value in self.args]
  29. option_strings = [f"{key}={value!r}" for key, value in self.kwargs.items()]
  30. name = getattr(self.cls, "__name__", "")
  31. args_repr = ", ".join([name] + args_strings + option_strings)
  32. return f"{class_name}({args_repr})"