Skip to content

Commit

Permalink
[DOP-13337] Add Pydantic v2 compatibility
Browse files Browse the repository at this point in the history
  • Loading branch information
dolfinus committed Mar 5, 2024
1 parent 5eceb38 commit 9235bf7
Show file tree
Hide file tree
Showing 27 changed files with 139 additions and 39 deletions.
21 changes: 13 additions & 8 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,18 @@ env:

jobs:
tests:
name: Run tests (${{ matrix.python-version }} on ${{ matrix.os }})
name: Run tests (Python ${{ matrix.python-version }}, Pydantic ${{ matrix.pydantic-version }}, ${{ matrix.os }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
python-version: ['3.7', '3.11', '3.12']
os: [ubuntu-latest]
include:
- python-version: '3.7'
os: ubuntu-latest
pydantic-version: '1'
- python-version: '3.12'
os: ubuntu-latest
pydantic-version: '2'

steps:
- name: Checkout code
Expand All @@ -40,18 +45,18 @@ jobs:
uses: actions/cache@v4
with:
path: ~/.cache/pip
key: ${{ runner.os }}-python-${{ matrix.python-version }}-tests-${{ hashFiles('requirements*.txt') }}
key: ${{ runner.os }}-python-${{ matrix.python-version }}-pydantic-${{ matrix.pydantic-version }}-tests-${{ hashFiles('requirements*.txt') }}
restore-keys: |
${{ runner.os }}-python-${{ matrix.python-version }}-tests-${{ hashFiles('requirements*.txt') }}
${{ runner.os }}-python-${{ matrix.python-version }}-tests-
${{ runner.os }}-python-${{ matrix.python-version }}-pydantic-${{ matrix.pydantic-version }}-tests-${{ hashFiles('requirements*.txt') }}
${{ runner.os }}-python-${{ matrix.python-version }}-pydantic-${{ matrix.pydantic-version }}-tests-
${{ runner.os }}-python
${{ runner.os }}-
- name: Upgrade pip
run: python -m pip install --upgrade pip setuptools wheel

- name: Install dependencies
run: pip install -I -r requirements.txt -r requirements-test.txt
run: pip install -I -r requirements.txt -r requirements-test.txt "pydantic==${{ matrix.pydantic-version }}.*"

- name: Build package
run: |
Expand All @@ -67,7 +72,7 @@ jobs:
- name: Upload coverage results
uses: actions/upload-artifact@v4
with:
name: coverage-${{ matrix.python-version }}-os-${{ matrix.os }}
name: coverage-python-${{ matrix.python-version }}-pydantic-${{ matrix.pydantic-version }}-os-${{ matrix.os }}
path: reports/*

all_done:
Expand Down
1 change: 1 addition & 0 deletions docs/changelog/next_release/82.feature.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Allow using ``etl-entities`` with both Pydantic v1 and v2.
10 changes: 8 additions & 2 deletions etl_entities/entity.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,17 @@
# SPDX-FileCopyrightText: 2021-2024 MTS (Mobile Telesystems)
# SPDX-License-Identifier: Apache-2.0
# isort: skip_file

from __future__ import annotations

import json

from pydantic import BaseModel as PydanticBaseModel
from pydantic.generics import GenericModel as PydanticGenericModel
try:
from pydantic.v1 import BaseModel as PydanticBaseModel
from pydantic.v1.generics import GenericModel as PydanticGenericModel
except (ImportError, AttributeError):
from pydantic import BaseModel as PydanticBaseModel # type: ignore[no-redef, assignment]
from pydantic.generics import GenericModel as PydanticGenericModel # type: ignore[no-redef, assignment]


class BaseModel(PydanticBaseModel):
Expand Down
5 changes: 4 additions & 1 deletion etl_entities/hwm/column/column_hwm.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@

from typing import Generic, Optional, TypeVar

from pydantic import Field
try:
from pydantic.v1 import Field
except (ImportError, AttributeError):
from pydantic import Field # type: ignore[no-redef, assignment]

from etl_entities.entity import GenericModel
from etl_entities.hwm.hwm import HWM
Expand Down
8 changes: 6 additions & 2 deletions etl_entities/hwm/column/date_hwm.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,12 @@
from datetime import date
from typing import Optional

from pydantic import validator
from pydantic.validators import strict_str_validator
try:
from pydantic.v1 import validator
from pydantic.v1.validators import strict_str_validator
except (ImportError, AttributeError):
from pydantic import validator # type: ignore[no-redef, assignment]
from pydantic.validators import strict_str_validator # type: ignore[no-redef, assignment]

from etl_entities.hwm.column.column_hwm import ColumnHWM
from etl_entities.hwm.hwm_type_registry import register_hwm_type
Expand Down
8 changes: 6 additions & 2 deletions etl_entities/hwm/column/datetime_hwm.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,12 @@
from datetime import datetime
from typing import Optional

from pydantic import validator
from pydantic.validators import strict_str_validator
try:
from pydantic.v1 import validator
from pydantic.v1.validators import strict_str_validator
except (ImportError, AttributeError):
from pydantic import validator # type: ignore[no-redef, assignment]
from pydantic.validators import strict_str_validator # type: ignore[no-redef, assignment]

from etl_entities.hwm.column.column_hwm import ColumnHWM
from etl_entities.hwm.hwm_type_registry import register_hwm_type
Expand Down
5 changes: 4 additions & 1 deletion etl_entities/hwm/column/int_hwm.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@
from decimal import Decimal, InvalidOperation
from typing import Optional

from pydantic import StrictInt, validator
try:
from pydantic.v1 import StrictInt, validator
except (ImportError, AttributeError):
from pydantic import StrictInt, validator # type: ignore[no-redef, assignment]

from etl_entities.hwm.column.column_hwm import ColumnHWM
from etl_entities.hwm.hwm_type_registry import register_hwm_type
Expand Down
5 changes: 4 additions & 1 deletion etl_entities/hwm/file/file_hwm.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@
from abc import abstractmethod
from typing import Generic, Optional, TypeVar

from pydantic import Field, validator
try:
from pydantic.v1 import Field, validator
except (ImportError, AttributeError):
from pydantic import Field, validator # type: ignore[no-redef, assignment]

from etl_entities.entity import GenericModel
from etl_entities.hwm.hwm import HWM
Expand Down
5 changes: 4 additions & 1 deletion etl_entities/hwm/file/file_list_hwm.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@
import sys
from typing import FrozenSet, Iterable, TypeVar

from pydantic import Field, validator
try:
from pydantic.v1 import Field, validator
except (ImportError, AttributeError):
from pydantic import Field, validator # type: ignore[no-redef, assignment]

from etl_entities.hwm import FileHWM
from etl_entities.hwm.hwm_type_registry import register_hwm_type
Expand Down
5 changes: 4 additions & 1 deletion etl_entities/hwm/hwm.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@
from datetime import datetime
from typing import Any, Generic, TypeVar

from pydantic import Field, validate_model
try:
from pydantic.v1 import Field, validate_model
except (ImportError, AttributeError):
from pydantic import Field, validate_model # type: ignore[no-redef, assignment]

from etl_entities.entity import GenericModel
from etl_entities.hwm.hwm_type_registry import HWMTypeRegistry
Expand Down
6 changes: 5 additions & 1 deletion etl_entities/hwm/key_value/key_value_hwm.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,11 @@
from typing import Generic, Optional, TypeVar

from frozendict import frozendict
from pydantic import Field, validator

try:
from pydantic.v1 import Field, validator
except (ImportError, AttributeError):
from pydantic import Field, validator # type: ignore[no-redef, assignment]

from etl_entities.entity import GenericModel
from etl_entities.hwm.hwm import HWM
Expand Down
6 changes: 5 additions & 1 deletion etl_entities/hwm/key_value/key_value_int_hwm.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@
from __future__ import annotations

from frozendict import frozendict
from pydantic import Field, validator

try:
from pydantic.v1 import Field, validator
except (ImportError, AttributeError):
from pydantic import Field, validator # type: ignore[no-redef, assignment]

from etl_entities.hwm.hwm_type_registry import register_hwm_type
from etl_entities.hwm.key_value.key_value_hwm import KeyValueHWM
Expand Down
5 changes: 4 additions & 1 deletion etl_entities/hwm_store/memory_hwm_store.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@

from typing import Dict

from pydantic import PrivateAttr
try:
from pydantic.v1 import PrivateAttr
except (ImportError, AttributeError):
from pydantic import PrivateAttr # type: ignore[no-redef, assignment]

from etl_entities.hwm import HWM
from etl_entities.hwm.hwm_type_registry import HWMTypeRegistry
Expand Down
5 changes: 4 additions & 1 deletion etl_entities/instance/cluster/cluster.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@

import re

from pydantic import StrictStr
try:
from pydantic.v1 import StrictStr
except (ImportError, AttributeError):
from pydantic import StrictStr


class Cluster(StrictStr):
Expand Down
9 changes: 8 additions & 1 deletion etl_entities/instance/host/host.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,14 @@

from __future__ import annotations

from pydantic import AnyUrl, ConstrainedStr, parse_obj_as
try:
from pydantic.v1 import AnyUrl, ConstrainedStr, parse_obj_as
except (ImportError, AttributeError):
from pydantic import ( # type: ignore[no-redef, assignment]
AnyUrl,
ConstrainedStr,
parse_obj_as,
)


class Host(ConstrainedStr):
Expand Down
5 changes: 4 additions & 1 deletion etl_entities/instance/url/generic_url.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@

from typing import ClassVar, Tuple

from pydantic import AnyUrl
try:
from pydantic.v1 import AnyUrl
except (ImportError, AttributeError):
from pydantic import AnyUrl


class GenericURL(AnyUrl):
Expand Down
10 changes: 8 additions & 2 deletions etl_entities/old_hwm/date_hwm.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,14 @@
from typing import Optional

import typing_extensions
from pydantic import validator
from pydantic.validators import strict_str_validator

try:
from pydantic.v1 import validator
from pydantic.v1.validators import strict_str_validator
except (ImportError, AttributeError):
from pydantic import validator # type: ignore[no-redef, assignment]
from pydantic.validators import strict_str_validator # type: ignore[no-redef, assignment]


from etl_entities.hwm import ColumnDateHWM, register_hwm_type
from etl_entities.old_hwm.column_hwm import ColumnHWM
Expand Down
9 changes: 7 additions & 2 deletions etl_entities/old_hwm/datetime_hwm.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,13 @@
from typing import Optional

import typing_extensions
from pydantic import validator
from pydantic.validators import strict_str_validator

try:
from pydantic.v1 import validator
from pydantic.v1.validators import strict_str_validator
except (ImportError, AttributeError):
from pydantic import validator # type: ignore[no-redef, assignment]
from pydantic.validators import strict_str_validator # type: ignore[no-redef, assignment]

from etl_entities.hwm import ColumnDateTimeHWM, register_hwm_type
from etl_entities.old_hwm.column_hwm import ColumnHWM
Expand Down
6 changes: 5 additions & 1 deletion etl_entities/old_hwm/file_list_hwm.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,11 @@
from typing import FrozenSet, Iterable, List

import typing_extensions
from pydantic import Field, validator

try:
from pydantic.v1 import Field, validator
except (ImportError, AttributeError):
from pydantic import Field, validator # type: ignore[no-redef, assignment]

from etl_entities.hwm import FileListHWM as NewFileListHWM
from etl_entities.hwm import register_hwm_type
Expand Down
5 changes: 4 additions & 1 deletion etl_entities/old_hwm/hwm.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@
from datetime import datetime
from typing import Generic, TypeVar

from pydantic import Field, validate_model
try:
from pydantic.v1 import Field, validate_model
except (ImportError, AttributeError):
from pydantic import Field, validate_model # type: ignore[no-redef, assignment]

from etl_entities.entity import Entity, GenericModel
from etl_entities.hwm import HWMTypeRegistry
Expand Down
12 changes: 9 additions & 3 deletions etl_entities/old_hwm/int_hwm.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,15 @@
from typing import Optional

import typing_extensions
from pydantic import validator
from pydantic.types import StrictInt
from pydantic.validators import int_validator

try:
from pydantic.v1 import validator
from pydantic.v1.types import StrictInt
from pydantic.v1.validators import int_validator
except (ImportError, AttributeError):
from pydantic import validator # type: ignore[no-redef, assignment]
from pydantic.types import StrictInt # type: ignore[no-redef, assignment]
from pydantic.validators import int_validator # type: ignore[no-redef, assignment]

from etl_entities.hwm import ColumnIntHWM, register_hwm_type
from etl_entities.old_hwm.column_hwm import ColumnHWM
Expand Down
6 changes: 5 additions & 1 deletion etl_entities/process/process.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,11 @@

import psutil
import typing_extensions
from pydantic import ConstrainedStr, Field, validator

try:
from pydantic.v1 import ConstrainedStr, Field, validator
except (ImportError, AttributeError):
from pydantic import ConstrainedStr, Field, validator # type: ignore[no-redef, assignment]

from etl_entities.entity import BaseModel, Entity
from etl_entities.instance import Host
Expand Down
6 changes: 5 additions & 1 deletion etl_entities/source/db/column.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@
from typing import OrderedDict

import typing_extensions
from pydantic import ConstrainedStr, Field, validator

try:
from pydantic.v1 import ConstrainedStr, Field, validator
except (ImportError, AttributeError):
from pydantic import ConstrainedStr, Field, validator # type: ignore[no-redef, assignment]

from etl_entities.entity import BaseModel, Entity

Expand Down
6 changes: 5 additions & 1 deletion etl_entities/source/db/table.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@
from typing import Union

import typing_extensions
from pydantic import ConstrainedStr

try:
from pydantic.v1 import ConstrainedStr
except (ImportError, AttributeError):
from pydantic import ConstrainedStr # type: ignore[no-redef, assignment]

from etl_entities.entity import BaseModel, Entity
from etl_entities.instance import Cluster, GenericURL
Expand Down
6 changes: 5 additions & 1 deletion etl_entities/source/file/remote_folder.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@
from typing import Union

import typing_extensions
from pydantic import validator

try:
from pydantic.v1 import validator
except (ImportError, AttributeError):
from pydantic import validator # type: ignore[no-redef, assignment]

from etl_entities.entity import BaseModel, Entity
from etl_entities.instance import AbsolutePath, Cluster, GenericPath, GenericURL
Expand Down
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@ bidict
frozendict
importlib_metadata>=3.6.0
psutil
pydantic<2
pydantic<3
typing-extensions>=4.5.0
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ def parse_requirements(file: Path) -> list[str]:
"Development Status :: 3 - Alpha",
"Framework :: Pydantic",
"Framework :: Pydantic :: 1",
"Framework :: Pydantic :: 2",
"Intended Audience :: Developers",
"License :: OSI Approved :: Apache Software License",
"Operating System :: OS Independent",
Expand Down

0 comments on commit 9235bf7

Please sign in to comment.