diff --git a/dlt/common/normalizers/json/relational.py b/dlt/common/normalizers/json/relational.py index d89cd59224..d2255512bc 100644 --- a/dlt/common/normalizers/json/relational.py +++ b/dlt/common/normalizers/json/relational.py @@ -1,4 +1,5 @@ from functools import lru_cache, partial +from importlib import import_module from typing import ( ClassVar, Dict, @@ -37,6 +38,7 @@ ) from dlt.common.utils import update_dict_nested from dlt.common.normalizers.json import ( + SupportsDataItemNormalizer, TNormalizedRowIterator, wrap_in_dict, DataItemNormalizer as DataItemNormalizerBase, @@ -332,7 +334,7 @@ def extend_schema(self, extend_tables: bool = True) -> None: RelationalNormalizerConfig, self.schema._normalizers_config["json"].get("config") or {}, ) - DataItemNormalizer._validate_normalizer_config(self.schema, config) + self._validate_normalizer_config(self.schema, config) # add hints, do not compile. self.schema._merge_hints( @@ -433,7 +435,8 @@ def normalize_data_item( def ensure_this_normalizer(cls, norm_config: TJSONNormalizer) -> None: # make sure schema has right normalizer present_normalizer = norm_config["module"] - if present_normalizer != cls.__module__: + module = cast(SupportsDataItemNormalizer, import_module(present_normalizer)) + if not issubclass(module.DataItemNormalizer, cls): raise InvalidJsonNormalizer(cls.__module__, present_normalizer) @classmethod diff --git a/dlt/common/schema/normalizers.py b/dlt/common/schema/normalizers.py index 7552c6931e..296cbfd784 100644 --- a/dlt/common/schema/normalizers.py +++ b/dlt/common/schema/normalizers.py @@ -8,8 +8,8 @@ from dlt.common import known_env from dlt.common.configuration.inject import with_config from dlt.common.configuration.specs import known_sections -from dlt.common.schema.configuration import SchemaConfiguration from dlt.common.normalizers.exceptions import InvalidJsonNormalizer +from dlt.common.schema.configuration import SchemaConfiguration from dlt.common.normalizers.json import SupportsDataItemNormalizer, DataItemNormalizer from dlt.common.normalizers.naming import NamingConvention from dlt.common.normalizers.naming.exceptions import ( @@ -114,12 +114,13 @@ def import_normalizers( try: DataItemNormalizer.ensure_this_normalizer(item_normalizer) + item_normalizer.setdefault("config", {}) item_normalizer["config"]["max_nesting"] = destination_capabilities.max_table_nesting # type: ignore[index] except InvalidJsonNormalizer: # not a right normalizer logger.warning(f"JSON Normalizer {item_normalizer} does not support max_nesting") - pass + json_module = cast(SupportsDataItemNormalizer, import_module(json_module_name)) explicit_normalizers["json"] = item_normalizer return (