1
0
mirror of synced 2026-01-23 13:01:50 -05:00
Files
airbyte/airbyte-cdk/python/airbyte_cdk/sources/declarative/interpolation/interpolated_string.py

65 lines
2.4 KiB
Python

#
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
#
from dataclasses import InitVar, dataclass
from typing import Any, Mapping, Optional, Union
from airbyte_cdk.sources.declarative.interpolation.jinja import JinjaInterpolation
from airbyte_cdk.sources.types import Config
@dataclass
class InterpolatedString:
"""
Wrapper around a raw string to be interpolated with the Jinja2 templating engine
Attributes:
string (str): The string to evalute
default (Optional[str]): The default value to return if the evaluation returns an empty string
parameters (Mapping[str, Any]): Additional runtime parameters to be used for string interpolation
"""
string: str
parameters: InitVar[Mapping[str, Any]]
default: Optional[str] = None
def __post_init__(self, parameters: Mapping[str, Any]) -> None:
self.default = self.default or self.string
self._interpolation = JinjaInterpolation()
self._parameters = parameters
def eval(self, config: Config, **kwargs: Any) -> Any:
"""
Interpolates the input string using the config and other optional arguments passed as parameter.
:param config: The user-provided configuration as specified by the source's spec
:param kwargs: Optional parameters used for interpolation
:return: The interpolated string
"""
return self._interpolation.eval(self.string, config, self.default, parameters=self._parameters, **kwargs)
def __eq__(self, other: Any) -> bool:
if not isinstance(other, InterpolatedString):
return False
return self.string == other.string and self.default == other.default
@classmethod
def create(
cls,
string_or_interpolated: Union["InterpolatedString", str],
*,
parameters: Mapping[str, Any],
) -> "InterpolatedString":
"""
Helper function to obtain an InterpolatedString from either a raw string or an InterpolatedString.
:param string_or_interpolated: either a raw string or an InterpolatedString.
:param parameters: parameters propagated from parent component
:return: InterpolatedString representing the input string.
"""
if isinstance(string_or_interpolated, str):
return InterpolatedString(string=string_or_interpolated, parameters=parameters)
else:
return string_or_interpolated