Skip to content

Commit b5185d4

Browse files
authored
feat: BI-6610 add dl_pydantic model diff (#1265)
1 parent 9bb98eb commit b5185d4

File tree

6 files changed

+99
-1
lines changed

6 files changed

+99
-1
lines changed

lib/dl_pydantic/dl_pydantic/base.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,23 @@
1+
import deepdiff
12
import pydantic
3+
from typing_extensions import Self
24

35

46
class BaseModel(pydantic.BaseModel):
57
model_config = pydantic.ConfigDict(
68
populate_by_name=True,
79
)
810

11+
def model_deepdiff(self, other: Self, exclude_paths: list[str] | None = None) -> deepdiff.DeepDiff:
12+
exclude_paths = exclude_paths or []
13+
14+
return deepdiff.DeepDiff(
15+
self,
16+
other,
17+
ignore_order=True,
18+
exclude_paths=exclude_paths,
19+
)
20+
921

1022
__all__ = [
1123
"BaseModel",
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import dl_pydantic
2+
3+
4+
def test_model_diff() -> None:
5+
class Model(dl_pydantic.BaseModel):
6+
a: int
7+
b: int
8+
9+
model_a = Model(a=1, b=2)
10+
model_b = Model(a=1, b=3)
11+
12+
diff = model_a.model_deepdiff(model_b)
13+
assert diff == {"values_changed": {"root.b": {"new_value": 3, "old_value": 2}}}
14+
15+
diff = model_a.model_deepdiff(model_a, exclude_paths=["b"])
16+
assert diff == {}
17+
18+
19+
def test_model_diff_with_nested_model() -> None:
20+
class Model(dl_pydantic.BaseModel):
21+
class Nested(dl_pydantic.BaseModel):
22+
c: int
23+
d: int
24+
25+
a: int
26+
b: int
27+
nested: Nested
28+
29+
model_a = Model(a=1, b=2, nested=Model.Nested(c=3, d=4))
30+
model_b = Model(a=1, b=2, nested=Model.Nested(c=3, d=5))
31+
32+
diff = model_a.model_deepdiff(model_b)
33+
assert diff == {"values_changed": {"root.nested.d": {"new_value": 5, "old_value": 4}}}

lib/dl_pydantic/pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ readme = "README.md"
88
version = "0.0.1"
99

1010
[tool.poetry.dependencies]
11+
deepdiff = "*"
1112
pydantic = "*"
1213
python = ">=3.10, <3.13"
1314
typing-extensions = "*"

metapkg/poetry.lock

Lines changed: 46 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

metapkg/pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ cffi = "==1.16.0"
2727
ciso8601 = "==2.2.0"
2828
clickhouse-driver = "==0.2.6"
2929
cryptography = "==43.0.1"
30+
deepdiff = "==8.6.1"
3031
dill = "==0.3.6"
3132
faust-cchardet = ">=2.1.19"
3233
flask = "==2.2.5"

tools/taskfiles/taskfile_dev.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,12 @@ tasks:
8585
vars:
8686
- VENV_PATH
8787

88+
poetry:
89+
desc: Run poetry command
90+
dir: "{{.USER_WORKING_DIR}}"
91+
cmds:
92+
- poetry --directory={{.PYPROJECT_TOML_PATH}} {{.CLI_ARGS}}
93+
8894
venv-python:
8995
desc: Run poetry command
9096
dir: "{{.USER_WORKING_DIR}}"

0 commit comments

Comments
 (0)