__init__.py 1.2 KB

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