123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- """Compatibility hacks and helpers."""
- import contextlib
- import sys
- @contextlib.contextmanager
- def pydantic_v1_patch():
- """A context manager that patches the Pydantic module to mimic v1 behaviour.
- Yields:
- None when the Pydantic module is patched.
- """
- patched_modules = [
- "pydantic",
- "pydantic.fields",
- "pydantic.errors",
- "pydantic.main",
- ]
- originals = {module: sys.modules.get(module) for module in patched_modules}
- try:
- import pydantic.v1 # type: ignore
- if pydantic.__version__.startswith("1."):
- # pydantic v1 is already installed
- yield
- return
- sys.modules["pydantic.fields"] = pydantic.v1.fields # type: ignore
- sys.modules["pydantic.main"] = pydantic.v1.main # type: ignore
- sys.modules["pydantic.errors"] = pydantic.v1.errors # type: ignore
- sys.modules["pydantic"] = pydantic.v1
- yield
- except (ImportError, AttributeError):
- # pydantic v1 is already installed
- yield
- finally:
- # Restore the original Pydantic module
- for k, original in originals.items():
- if k in sys.modules:
- if original:
- sys.modules[k] = original
- else:
- del sys.modules[k]
- with pydantic_v1_patch():
- import sqlmodel as sqlmodel
|