compat.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. """Compatibility hacks and helpers."""
  2. import contextlib
  3. import sys
  4. @contextlib.contextmanager
  5. def pydantic_v1_patch():
  6. """A context manager that patches the Pydantic module to mimic v1 behaviour.
  7. Yields:
  8. None when the Pydantic module is patched.
  9. """
  10. patched_modules = [
  11. "pydantic",
  12. "pydantic.fields",
  13. "pydantic.errors",
  14. "pydantic.main",
  15. ]
  16. originals = {module: sys.modules.get(module) for module in patched_modules}
  17. try:
  18. import pydantic.v1 # type: ignore
  19. if pydantic.__version__.startswith("1."):
  20. # pydantic v1 is already installed
  21. yield
  22. return
  23. sys.modules["pydantic.fields"] = pydantic.v1.fields # type: ignore
  24. sys.modules["pydantic.main"] = pydantic.v1.main # type: ignore
  25. sys.modules["pydantic.errors"] = pydantic.v1.errors # type: ignore
  26. sys.modules["pydantic"] = pydantic.v1
  27. yield
  28. except (ImportError, AttributeError):
  29. # pydantic v1 is already installed
  30. yield
  31. finally:
  32. # Restore the original Pydantic module
  33. for k, original in originals.items():
  34. if k in sys.modules:
  35. if original:
  36. sys.modules[k] = original
  37. else:
  38. del sys.modules[k]
  39. with pydantic_v1_patch():
  40. import sqlmodel as sqlmodel