compat.py 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  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. sys.modules["pydantic.fields"] = pydantic.v1.fields # type: ignore
  20. sys.modules["pydantic.main"] = pydantic.v1.main # type: ignore
  21. sys.modules["pydantic.errors"] = pydantic.v1.errors # type: ignore
  22. sys.modules["pydantic"] = pydantic.v1
  23. yield
  24. except (ImportError, AttributeError):
  25. # pydantic v1 is already installed
  26. yield
  27. finally:
  28. # Restore the original Pydantic module
  29. for k, original in originals.items():
  30. if k in sys.modules:
  31. if original:
  32. sys.modules[k] = original
  33. else:
  34. del sys.modules[k]
  35. with pydantic_v1_patch():
  36. import sqlmodel as sqlmodel