1
0
mirror of synced 2026-01-02 03:02:26 -05:00
Files
airbyte/airbyte-cdk/python/airbyte_cdk/sources/declarative/interpolation/interpolated_mapping.py
Brian Lai bd31100774 initial first pass converting every component to dataclasses (#15189)
* initial first pass converting every component to dataclasses

* replace the hackier options pass through

* get rid of the hackier way

* fix issues w/ type hints by making options required and lots of fixes to the language to fix compatability for dataclasses

* add dataclasses-jsonschema to setup

* fix oauth authenticator to avoid dataclass name collisions

* fix spacing for CI tests

* remove property from oauth and fix a interpolation bug

* pr feedback and cleaning up the code a bit, attempt at avoiding renaming

* fix templates and bugs surfaced during greenhouse spec testing

* fix tests

* fix missing options in some declarative components

* fix tests related to pulling latest master

* fix issue w/ passing state, slice, and token to subcomponents

* switch name back to get_access_token() since no name collision anymore
2022-08-05 17:39:27 -04:00

53 lines
1.8 KiB
Python

#
# Copyright (c) 2022 Airbyte, Inc., all rights reserved.
#
from dataclasses import InitVar, dataclass
from typing import Any, Mapping, Optional
from airbyte_cdk.sources.declarative.interpolation.jinja import JinjaInterpolation
from airbyte_cdk.sources.declarative.types import Config
from dataclasses_jsonschema import JsonSchemaMixin
@dataclass
class InterpolatedMapping(JsonSchemaMixin):
"""
Wrapper around a Mapping[str, str] where both the keys and values are to be interpolated.
Attributes:
mapping (Mapping[str, str]): to be evaluated
"""
mapping: Mapping[str, str]
options: InitVar[Mapping[str, Any]]
def __post_init__(self, options: Optional[Mapping[str, Any]]):
self._interpolation = JinjaInterpolation()
self._options = options
def eval(self, config: Config, **additional_options):
"""
Wrapper around a Mapping[str, str] that allows for both keys and values to be interpolated.
:param config: The user-provided configuration as specified by the source's spec
:param additional_options: Optional parameters used for interpolation
:return: The interpolated string
"""
interpolated_values = {
self._interpolation.eval(name, config, options=self._options, **additional_options): self._eval(
value, config, **additional_options
)
for name, value in self.mapping.items()
}
return interpolated_values
def _eval(self, value, config, **kwargs):
# The values in self._mapping can be of Any type
# We only want to interpolate them if they are strings
if type(value) == str:
return self._interpolation.eval(value, config, options=self._options, **kwargs)
else:
return value