diff --git a/docs/docs/user/changelog.md b/docs/docs/user/changelog.md index 4d6909f1d..ac88d6bf6 100644 --- a/docs/docs/user/changelog.md +++ b/docs/docs/user/changelog.md @@ -1,4 +1,22 @@ # Changelog +## [6.1.0](https://github.com/bakdata/kpops/releases/tag/6.1.0) - Release Date: [2024-07-09] + +### 🚀 Features + +- Add image tag field to streams-bootstrap app values - [#499](https://github.com/bakdata/kpops/pull/499) + +- Delete ignored keys from diff - [#510](https://github.com/bakdata/kpops/pull/510) + + +### 🏭 Refactor + +- Improve dataclass instance check - [#507](https://github.com/bakdata/kpops/pull/507) + + + + + + ## [6.0.2](https://github.com/bakdata/kpops/releases/tag/6.0.2) - Release Date: [2024-07-04] ### 📝 Documentation diff --git a/kpops/components/base_components/base_defaults_component.py b/kpops/components/base_components/base_defaults_component.py index af8907c56..6951b502d 100644 --- a/kpops/components/base_components/base_defaults_component.py +++ b/kpops/components/base_components/base_defaults_component.py @@ -4,7 +4,7 @@ import logging from abc import ABC from collections.abc import Hashable, Sequence -from dataclasses import asdict, is_dataclass +from dataclasses import asdict from functools import cached_property from pathlib import Path from typing import Any, TypeVar @@ -22,6 +22,7 @@ from kpops.config import KpopsConfig, get_config from kpops.const.file_type import KpopsFileType from kpops.utils import cached_classproperty +from kpops.utils.dataclasses import is_dataclass_instance from kpops.utils.dict_ops import ( generate_substitution, update_nested, @@ -165,7 +166,7 @@ def extend_with_defaults(cls, **kwargs: Any) -> dict[str, Any]: for k, v in kwargs.items(): if isinstance(v, pydantic.BaseModel): kwargs[k] = v.model_dump(exclude_unset=True) - elif is_dataclass(v): + elif is_dataclass_instance(v): kwargs[k] = asdict(v) defaults_file_paths_ = get_defaults_file_paths( diff --git a/kpops/utils/dataclasses.py b/kpops/utils/dataclasses.py new file mode 100644 index 000000000..16db70d94 --- /dev/null +++ b/kpops/utils/dataclasses.py @@ -0,0 +1,5 @@ +from dataclasses import is_dataclass + + +def is_dataclass_instance(obj: object) -> bool: + return is_dataclass(obj) and not isinstance(obj, type) diff --git a/kpops/utils/dict_differ.py b/kpops/utils/dict_differ.py index 1c3dbdeb7..9f1ca97e2 100644 --- a/kpops/utils/dict_differ.py +++ b/kpops/utils/dict_differ.py @@ -1,10 +1,10 @@ from __future__ import annotations -from collections.abc import Mapping +from collections.abc import Mapping, MutableMapping from dataclasses import dataclass from difflib import Differ from enum import Enum -from typing import TYPE_CHECKING, Generic, TypeVar +from typing import TYPE_CHECKING, Any, Generic, TypeVar import typer import yaml @@ -79,8 +79,28 @@ def __find_changed_key(key_1: list[str] | str, key_2: str = "") -> str: return f"{key_1}.{key_2}" -def render_diff(d1: Mapping, d2: Mapping, ignore: set[str] | None = None) -> str | None: - differences = list(diff(d1, d2, ignore=ignore)) +def render_diff( + d1: MutableMapping[str, Any], + d2: MutableMapping[str, Any], + ignore: set[str] | None = None, +) -> str | None: + def del_ignored_keys(d: MutableMapping[str, Any]) -> None: + """Delete key to be ignored, dictionary is modified in-place.""" + if ignore: + for i in ignore: + key_path = i.split(".") + nested = d + try: + for key in key_path[:-1]: + nested = nested[key] + del nested[key_path[-1]] + except KeyError: + continue + + del_ignored_keys(d1) + del_ignored_keys(d2) + + differences = list(diff(d1, d2)) if not differences: return None diff --git a/pyproject.toml b/pyproject.toml index cd831c71b..1dac57a50 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "kpops" -version = "6.0.2" +version = "6.1.0" description = "KPOps is a tool to deploy Kafka pipelines to Kubernetes" authors = ["bakdata "] license = "MIT" diff --git a/tests/utils/test_diff.py b/tests/utils/test_diff.py index f2ffeac88..8a6e5f2b7 100644 --- a/tests/utils/test_diff.py +++ b/tests/utils/test_diff.py @@ -25,7 +25,6 @@ {"a": 1, "b": 2, "c": 3}, {"a": 2, "d": 1}, {"a"}, - " a: 1\n" "\x1b[32m+ d: 1\n" "\x1b[0m\x1b[31m- b: 2\n" "\x1b[0m\x1b[31m- c: 3\n" @@ -36,7 +35,6 @@ {"a": {"a": 9, "b": 8}, "d": 1}, {"a.a"}, " a:\n" - " a: 1\n" "\x1b[31m- b: 2\n" "\x1b[0m\x1b[33m? ^\n" "\x1b[0m\x1b[32m+ b: 8\n"