1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
from __future__ import annotations
from typing import Any
# attempt the following imports only once,
# to be imported from itemadapter's submodules
_scrapy_item_classes: tuple
scrapy: Any
try:
import scrapy
except ImportError:
_scrapy_item_classes = ()
scrapy = None
else:
try:
# handle deprecated base classes
_base_item_cls = getattr(
scrapy.item,
"_BaseItem",
scrapy.item.BaseItem,
)
except AttributeError:
_scrapy_item_classes = (scrapy.item.Item,)
else:
_scrapy_item_classes = (scrapy.item.Item, _base_item_cls)
attr: Any
try:
import attr
except ImportError:
attr = None
pydantic_v1: Any = None
pydantic: Any = None
try:
import pydantic
except ImportError: # No pydantic
pass
else:
try:
import pydantic.v1 as pydantic_v1
except ImportError: # Pydantic <1.10.17
pydantic_v1 = pydantic
pydantic = None
else: # Pydantic 1.10.17+
if not hasattr(pydantic.BaseModel, "model_fields"): # Pydantic <2
pydantic_v1 = pydantic
pydantic = None
try:
from pydantic.v1.fields import Undefined as PydanticV1Undefined
from pydantic_core import PydanticUndefined
except ImportError: # < Pydantic 2.0
try:
from pydantic.fields import ( # type: ignore[attr-defined,no-redef]
Undefined as PydanticUndefined,
)
from pydantic.fields import ( # type: ignore[attr-defined,no-redef]
Undefined as PydanticV1Undefined,
)
except ImportError:
PydanticUndefined = PydanticV1Undefined = None # type: ignore[assignment]
|