Skip to content

Commit

Permalink
[Low Code CDK] Add type annotations and cleanup usage of visited set (
Browse files Browse the repository at this point in the history
#21268)

* [Low Code CDK] Add type annotations and cleanup usage of `visited` set

* 🤖 Bump minor version of Airbyte CDK
  • Loading branch information
clnoll committed Jan 12, 2023
1 parent 3d98c41 commit f675c6f
Show file tree
Hide file tree
Showing 4 changed files with 11 additions and 10 deletions.
2 changes: 1 addition & 1 deletion airbyte-cdk/python/.bumpversion.cfg
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[bumpversion]
current_version = 0.18.1
current_version = 0.19.0
commit = False

[bumpversion:file:setup.py]
3 changes: 3 additions & 0 deletions airbyte-cdk/python/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion airbyte-cdk/python/setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down

0 comments on commit f675c6f

Please sign in to comment.