diff --git a/airbyte-cdk/python/.bumpversion.cfg b/airbyte-cdk/python/.bumpversion.cfg index b5ad088ed8032..49a00e29f9ccb 100644 --- a/airbyte-cdk/python/.bumpversion.cfg +++ b/airbyte-cdk/python/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.18.1 +current_version = 0.19.0 commit = False [bumpversion:file:setup.py] diff --git a/airbyte-cdk/python/CHANGELOG.md b/airbyte-cdk/python/CHANGELOG.md index 7a03b7252509a..b8a48367d4f80 100644 --- a/airbyte-cdk/python/CHANGELOG.md +++ b/airbyte-cdk/python/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +## 0.19.0 +Low-Code: Handle forward references in manifest + ## 0.18.1 Allow for CustomRequester to be defined within declarative manifests diff --git a/airbyte-cdk/python/airbyte_cdk/sources/declarative/parsers/manifest_reference_resolver.py b/airbyte-cdk/python/airbyte_cdk/sources/declarative/parsers/manifest_reference_resolver.py index 7cb54edcf075b..53dbde714557b 100644 --- a/airbyte-cdk/python/airbyte_cdk/sources/declarative/parsers/manifest_reference_resolver.py +++ b/airbyte-cdk/python/airbyte_cdk/sources/declarative/parsers/manifest_reference_resolver.py @@ -96,19 +96,19 @@ class ManifestReferenceResolver: ref_tag = "$ref" - def preprocess_manifest(self, manifest): + def preprocess_manifest(self, manifest: Mapping[str, Any]) -> Mapping[str, Any]: """ :param manifest: incoming manifest that could have references to previously defined components :return: """ - return self._evaluate_node(manifest, manifest) + return self._evaluate_node(manifest, manifest, set()) - def _evaluate_node(self, node: Any, manifest: Mapping[str, Any], visited: Set = None): + def _evaluate_node(self, node: Any, manifest: Mapping[str, Any], visited: Set): if isinstance(node, dict): - evaluated_dict = {k: self._evaluate_node(v, manifest) for k, v in node.items() if not self._is_ref_key(k)} + evaluated_dict = {k: self._evaluate_node(v, manifest, visited) for k, v in node.items() if not self._is_ref_key(k)} if self.ref_tag in node: # The node includes a $ref key, so we splat the referenced value(s) into the evaluated dict - evaluated_ref = self._evaluate_node(node[self.ref_tag], manifest) + evaluated_ref = self._evaluate_node(node[self.ref_tag], manifest, visited) if not isinstance(evaluated_ref, dict): return evaluated_ref else: @@ -117,10 +117,8 @@ def _evaluate_node(self, node: Any, manifest: Mapping[str, Any], visited: Set = else: return evaluated_dict elif isinstance(node, list): - return [self._evaluate_node(v, manifest) for v in node] + return [self._evaluate_node(v, manifest, visited) for v in node] elif isinstance(node, str) and node.startswith("*ref("): - if visited is None: - visited = set() if node in visited: raise CircularReferenceException(node) visited.add(node) diff --git a/airbyte-cdk/python/setup.py b/airbyte-cdk/python/setup.py index 6d19757c91f28..ff6346769aec0 100644 --- a/airbyte-cdk/python/setup.py +++ b/airbyte-cdk/python/setup.py @@ -15,7 +15,7 @@ setup( name="airbyte-cdk", - version="0.18.1", + version="0.19.0", description="A framework for writing Airbyte Connectors.", long_description=README, long_description_content_type="text/markdown",