airbyte-cdk 6.20.2.dev0__py3-none-any.whl → 6.21.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- airbyte_cdk/sources/declarative/auth/oauth.py +34 -0
- airbyte_cdk/sources/declarative/checks/__init__.py +18 -2
- airbyte_cdk/sources/declarative/checks/check_dynamic_stream.py +51 -0
- airbyte_cdk/sources/declarative/concurrent_declarative_source.py +16 -80
- airbyte_cdk/sources/declarative/declarative_component_schema.yaml +123 -21
- airbyte_cdk/sources/declarative/decoders/__init__.py +9 -1
- airbyte_cdk/sources/declarative/decoders/composite_raw_decoder.py +43 -0
- airbyte_cdk/sources/declarative/decoders/zipfile_decoder.py +59 -0
- airbyte_cdk/sources/declarative/extractors/record_filter.py +5 -3
- airbyte_cdk/sources/declarative/incremental/__init__.py +0 -6
- airbyte_cdk/sources/declarative/incremental/global_substream_cursor.py +0 -3
- airbyte_cdk/sources/declarative/incremental/per_partition_cursor.py +0 -15
- airbyte_cdk/sources/declarative/manifest_declarative_source.py +2 -1
- airbyte_cdk/sources/declarative/models/declarative_component_schema.py +112 -27
- airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py +127 -106
- airbyte_cdk/sources/declarative/requesters/README.md +56 -0
- airbyte_cdk/sources/declarative/requesters/http_job_repository.py +33 -4
- airbyte_cdk/sources/declarative/retrievers/simple_retriever.py +1 -1
- airbyte_cdk/sources/declarative/schema/dynamic_schema_loader.py +13 -3
- airbyte_cdk/sources/file_based/config/abstract_file_based_spec.py +11 -0
- airbyte_cdk/sources/file_based/exceptions.py +34 -0
- airbyte_cdk/sources/file_based/file_based_source.py +28 -5
- airbyte_cdk/sources/file_based/file_based_stream_reader.py +18 -4
- airbyte_cdk/sources/file_based/file_types/unstructured_parser.py +25 -2
- airbyte_cdk/sources/file_based/stream/default_file_based_stream.py +30 -2
- airbyte_cdk/sources/streams/concurrent/cursor.py +21 -30
- airbyte_cdk/sources/streams/http/requests_native_auth/abstract_oauth.py +33 -4
- airbyte_cdk/sources/streams/http/requests_native_auth/oauth.py +42 -4
- airbyte_cdk/sources/types.py +3 -0
- airbyte_cdk/sources/utils/transform.py +29 -3
- {airbyte_cdk-6.20.2.dev0.dist-info → airbyte_cdk-6.21.0.dist-info}/METADATA +1 -1
- {airbyte_cdk-6.20.2.dev0.dist-info → airbyte_cdk-6.21.0.dist-info}/RECORD +35 -33
- airbyte_cdk/sources/declarative/incremental/concurrent_partition_cursor.py +0 -331
- {airbyte_cdk-6.20.2.dev0.dist-info → airbyte_cdk-6.21.0.dist-info}/LICENSE.txt +0 -0
- {airbyte_cdk-6.20.2.dev0.dist-info → airbyte_cdk-6.21.0.dist-info}/WHEEL +0 -0
- {airbyte_cdk-6.20.2.dev0.dist-info → airbyte_cdk-6.21.0.dist-info}/entry_points.txt +0 -0
| @@ -39,6 +39,7 @@ class DeclarativeOauth2Authenticator(AbstractOauth2Authenticator, DeclarativeAut | |
| 39 39 | 
             
                    token_expiry_date_format str: format of the datetime; provide it if expires_in is returned in datetime instead of seconds
         | 
| 40 40 | 
             
                    token_expiry_is_time_of_expiration bool: set True it if expires_in is returned as time of expiration instead of the number seconds until expiration
         | 
| 41 41 | 
             
                    refresh_request_body (Optional[Mapping[str, Any]]): The request body to send in the refresh request
         | 
| 42 | 
            +
                    refresh_request_headers (Optional[Mapping[str, Any]]): The request headers to send in the refresh request
         | 
| 42 43 | 
             
                    grant_type: The grant_type to request for access_token. If set to refresh_token, the refresh_token parameter has to be provided
         | 
| 43 44 | 
             
                    message_repository (MessageRepository): the message repository used to emit logs on HTTP requests
         | 
| 44 45 | 
             
                """
         | 
| @@ -56,8 +57,13 @@ class DeclarativeOauth2Authenticator(AbstractOauth2Authenticator, DeclarativeAut | |
| 56 57 | 
             
                token_expiry_is_time_of_expiration: bool = False
         | 
| 57 58 | 
             
                access_token_name: Union[InterpolatedString, str] = "access_token"
         | 
| 58 59 | 
             
                access_token_value: Optional[Union[InterpolatedString, str]] = None
         | 
| 60 | 
            +
                client_id_name: Union[InterpolatedString, str] = "client_id"
         | 
| 61 | 
            +
                client_secret_name: Union[InterpolatedString, str] = "client_secret"
         | 
| 59 62 | 
             
                expires_in_name: Union[InterpolatedString, str] = "expires_in"
         | 
| 63 | 
            +
                refresh_token_name: Union[InterpolatedString, str] = "refresh_token"
         | 
| 60 64 | 
             
                refresh_request_body: Optional[Mapping[str, Any]] = None
         | 
| 65 | 
            +
                refresh_request_headers: Optional[Mapping[str, Any]] = None
         | 
| 66 | 
            +
                grant_type_name: Union[InterpolatedString, str] = "grant_type"
         | 
| 61 67 | 
             
                grant_type: Union[InterpolatedString, str] = "refresh_token"
         | 
| 62 68 | 
             
                message_repository: MessageRepository = NoopMessageRepository()
         | 
| 63 69 |  | 
| @@ -69,8 +75,15 @@ class DeclarativeOauth2Authenticator(AbstractOauth2Authenticator, DeclarativeAut | |
| 69 75 | 
             
                        )
         | 
| 70 76 | 
             
                    else:
         | 
| 71 77 | 
             
                        self._token_refresh_endpoint = None
         | 
| 78 | 
            +
                    self._client_id_name = InterpolatedString.create(self.client_id_name, parameters=parameters)
         | 
| 72 79 | 
             
                    self._client_id = InterpolatedString.create(self.client_id, parameters=parameters)
         | 
| 80 | 
            +
                    self._client_secret_name = InterpolatedString.create(
         | 
| 81 | 
            +
                        self.client_secret_name, parameters=parameters
         | 
| 82 | 
            +
                    )
         | 
| 73 83 | 
             
                    self._client_secret = InterpolatedString.create(self.client_secret, parameters=parameters)
         | 
| 84 | 
            +
                    self._refresh_token_name = InterpolatedString.create(
         | 
| 85 | 
            +
                        self.refresh_token_name, parameters=parameters
         | 
| 86 | 
            +
                    )
         | 
| 74 87 | 
             
                    if self.refresh_token is not None:
         | 
| 75 88 | 
             
                        self._refresh_token: Optional[InterpolatedString] = InterpolatedString.create(
         | 
| 76 89 | 
             
                            self.refresh_token, parameters=parameters
         | 
| @@ -83,10 +96,16 @@ class DeclarativeOauth2Authenticator(AbstractOauth2Authenticator, DeclarativeAut | |
| 83 96 | 
             
                    self.expires_in_name = InterpolatedString.create(
         | 
| 84 97 | 
             
                        self.expires_in_name, parameters=parameters
         | 
| 85 98 | 
             
                    )
         | 
| 99 | 
            +
                    self.grant_type_name = InterpolatedString.create(
         | 
| 100 | 
            +
                        self.grant_type_name, parameters=parameters
         | 
| 101 | 
            +
                    )
         | 
| 86 102 | 
             
                    self.grant_type = InterpolatedString.create(self.grant_type, parameters=parameters)
         | 
| 87 103 | 
             
                    self._refresh_request_body = InterpolatedMapping(
         | 
| 88 104 | 
             
                        self.refresh_request_body or {}, parameters=parameters
         | 
| 89 105 | 
             
                    )
         | 
| 106 | 
            +
                    self._refresh_request_headers = InterpolatedMapping(
         | 
| 107 | 
            +
                        self.refresh_request_headers or {}, parameters=parameters
         | 
| 108 | 
            +
                    )
         | 
| 90 109 | 
             
                    self._token_expiry_date: pendulum.DateTime = (
         | 
| 91 110 | 
             
                        pendulum.parse(
         | 
| 92 111 | 
             
                            InterpolatedString.create(self.token_expiry_date, parameters=parameters).eval(
         | 
| @@ -122,18 +141,27 @@ class DeclarativeOauth2Authenticator(AbstractOauth2Authenticator, DeclarativeAut | |
| 122 141 | 
             
                        return refresh_token_endpoint
         | 
| 123 142 | 
             
                    return None
         | 
| 124 143 |  | 
| 144 | 
            +
                def get_client_id_name(self) -> str:
         | 
| 145 | 
            +
                    return self._client_id_name.eval(self.config)  # type: ignore # eval returns a string in this context
         | 
| 146 | 
            +
             | 
| 125 147 | 
             
                def get_client_id(self) -> str:
         | 
| 126 148 | 
             
                    client_id: str = self._client_id.eval(self.config)
         | 
| 127 149 | 
             
                    if not client_id:
         | 
| 128 150 | 
             
                        raise ValueError("OAuthAuthenticator was unable to evaluate client_id parameter")
         | 
| 129 151 | 
             
                    return client_id
         | 
| 130 152 |  | 
| 153 | 
            +
                def get_client_secret_name(self) -> str:
         | 
| 154 | 
            +
                    return self._client_secret_name.eval(self.config)  # type: ignore # eval returns a string in this context
         | 
| 155 | 
            +
             | 
| 131 156 | 
             
                def get_client_secret(self) -> str:
         | 
| 132 157 | 
             
                    client_secret: str = self._client_secret.eval(self.config)
         | 
| 133 158 | 
             
                    if not client_secret:
         | 
| 134 159 | 
             
                        raise ValueError("OAuthAuthenticator was unable to evaluate client_secret parameter")
         | 
| 135 160 | 
             
                    return client_secret
         | 
| 136 161 |  | 
| 162 | 
            +
                def get_refresh_token_name(self) -> str:
         | 
| 163 | 
            +
                    return self._refresh_token_name.eval(self.config)  # type: ignore # eval returns a string in this context
         | 
| 164 | 
            +
             | 
| 137 165 | 
             
                def get_refresh_token(self) -> Optional[str]:
         | 
| 138 166 | 
             
                    return None if self._refresh_token is None else str(self._refresh_token.eval(self.config))
         | 
| 139 167 |  | 
| @@ -146,12 +174,18 @@ class DeclarativeOauth2Authenticator(AbstractOauth2Authenticator, DeclarativeAut | |
| 146 174 | 
             
                def get_expires_in_name(self) -> str:
         | 
| 147 175 | 
             
                    return self.expires_in_name.eval(self.config)  # type: ignore # eval returns a string in this context
         | 
| 148 176 |  | 
| 177 | 
            +
                def get_grant_type_name(self) -> str:
         | 
| 178 | 
            +
                    return self.grant_type_name.eval(self.config)  # type: ignore # eval returns a string in this context
         | 
| 179 | 
            +
             | 
| 149 180 | 
             
                def get_grant_type(self) -> str:
         | 
| 150 181 | 
             
                    return self.grant_type.eval(self.config)  # type: ignore # eval returns a string in this context
         | 
| 151 182 |  | 
| 152 183 | 
             
                def get_refresh_request_body(self) -> Mapping[str, Any]:
         | 
| 153 184 | 
             
                    return self._refresh_request_body.eval(self.config)
         | 
| 154 185 |  | 
| 186 | 
            +
                def get_refresh_request_headers(self) -> Mapping[str, Any]:
         | 
| 187 | 
            +
                    return self._refresh_request_headers.eval(self.config)
         | 
| 188 | 
            +
             | 
| 155 189 | 
             
                def get_token_expiry_date(self) -> pendulum.DateTime:
         | 
| 156 190 | 
             
                    return self._token_expiry_date  # type: ignore # _token_expiry_date is a pendulum.DateTime. It is never None despite what mypy thinks
         | 
| 157 191 |  | 
| @@ -1,8 +1,24 @@ | |
| 1 1 | 
             
            #
         | 
| 2 | 
            -
            # Copyright (c)  | 
| 2 | 
            +
            # Copyright (c) 2025 Airbyte, Inc., all rights reserved.
         | 
| 3 3 | 
             
            #
         | 
| 4 4 |  | 
| 5 | 
            +
            from typing import Mapping
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            from pydantic.v1 import BaseModel
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            from airbyte_cdk.sources.declarative.checks.check_dynamic_stream import CheckDynamicStream
         | 
| 5 10 | 
             
            from airbyte_cdk.sources.declarative.checks.check_stream import CheckStream
         | 
| 6 11 | 
             
            from airbyte_cdk.sources.declarative.checks.connection_checker import ConnectionChecker
         | 
| 12 | 
            +
            from airbyte_cdk.sources.declarative.models import (
         | 
| 13 | 
            +
                CheckDynamicStream as CheckDynamicStreamModel,
         | 
| 14 | 
            +
            )
         | 
| 15 | 
            +
            from airbyte_cdk.sources.declarative.models import (
         | 
| 16 | 
            +
                CheckStream as CheckStreamModel,
         | 
| 17 | 
            +
            )
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            COMPONENTS_CHECKER_TYPE_MAPPING: Mapping[str, type[BaseModel]] = {
         | 
| 20 | 
            +
                "CheckStream": CheckStreamModel,
         | 
| 21 | 
            +
                "CheckDynamicStream": CheckDynamicStreamModel,
         | 
| 22 | 
            +
            }
         | 
| 7 23 |  | 
| 8 | 
            -
            __all__ = ["CheckStream", "ConnectionChecker"]
         | 
| 24 | 
            +
            __all__ = ["CheckStream", "CheckDynamicStream", "ConnectionChecker"]
         | 
| @@ -0,0 +1,51 @@ | |
| 1 | 
            +
            #
         | 
| 2 | 
            +
            # Copyright (c) 2025 Airbyte, Inc., all rights reserved.
         | 
| 3 | 
            +
            #
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            import logging
         | 
| 6 | 
            +
            import traceback
         | 
| 7 | 
            +
            from dataclasses import InitVar, dataclass
         | 
| 8 | 
            +
            from typing import Any, List, Mapping, Tuple
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            from airbyte_cdk import AbstractSource
         | 
| 11 | 
            +
            from airbyte_cdk.sources.declarative.checks.connection_checker import ConnectionChecker
         | 
| 12 | 
            +
            from airbyte_cdk.sources.streams.http.availability_strategy import HttpAvailabilityStrategy
         | 
| 13 | 
            +
             | 
| 14 | 
            +
             | 
| 15 | 
            +
            @dataclass
         | 
| 16 | 
            +
            class CheckDynamicStream(ConnectionChecker):
         | 
| 17 | 
            +
                """
         | 
| 18 | 
            +
                Checks the connections by checking availability of one or many dynamic streams
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                Attributes:
         | 
| 21 | 
            +
                    stream_count (int): numbers of streams to check
         | 
| 22 | 
            +
                """
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                stream_count: int
         | 
| 25 | 
            +
                parameters: InitVar[Mapping[str, Any]]
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                def __post_init__(self, parameters: Mapping[str, Any]) -> None:
         | 
| 28 | 
            +
                    self._parameters = parameters
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                def check_connection(
         | 
| 31 | 
            +
                    self, source: AbstractSource, logger: logging.Logger, config: Mapping[str, Any]
         | 
| 32 | 
            +
                ) -> Tuple[bool, Any]:
         | 
| 33 | 
            +
                    streams = source.streams(config=config)
         | 
| 34 | 
            +
                    if len(streams) == 0:
         | 
| 35 | 
            +
                        return False, f"No streams to connect to from source {source}"
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                    for stream_index in range(min(self.stream_count, len(streams))):
         | 
| 38 | 
            +
                        stream = streams[stream_index]
         | 
| 39 | 
            +
                        availability_strategy = HttpAvailabilityStrategy()
         | 
| 40 | 
            +
                        try:
         | 
| 41 | 
            +
                            stream_is_available, reason = availability_strategy.check_availability(
         | 
| 42 | 
            +
                                stream, logger
         | 
| 43 | 
            +
                            )
         | 
| 44 | 
            +
                            if not stream_is_available:
         | 
| 45 | 
            +
                                return False, reason
         | 
| 46 | 
            +
                        except Exception as error:
         | 
| 47 | 
            +
                            logger.error(
         | 
| 48 | 
            +
                                f"Encountered an error trying to connect to stream {stream.name}. Error: \n {traceback.format_exc()}"
         | 
| 49 | 
            +
                            )
         | 
| 50 | 
            +
                            return False, f"Unable to connect to stream {stream.name} - {error}"
         | 
| 51 | 
            +
                    return True, None
         | 
| @@ -20,9 +20,6 @@ from airbyte_cdk.sources.declarative.extractors.record_filter import ( | |
| 20 20 | 
             
                ClientSideIncrementalRecordFilterDecorator,
         | 
| 21 21 | 
             
            )
         | 
| 22 22 | 
             
            from airbyte_cdk.sources.declarative.incremental.datetime_based_cursor import DatetimeBasedCursor
         | 
| 23 | 
            -
            from airbyte_cdk.sources.declarative.incremental.per_partition_with_global import (
         | 
| 24 | 
            -
                PerPartitionWithGlobalCursor,
         | 
| 25 | 
            -
            )
         | 
| 26 23 | 
             
            from airbyte_cdk.sources.declarative.interpolation import InterpolatedString
         | 
| 27 24 | 
             
            from airbyte_cdk.sources.declarative.manifest_declarative_source import ManifestDeclarativeSource
         | 
| 28 25 | 
             
            from airbyte_cdk.sources.declarative.models.declarative_component_schema import (
         | 
| @@ -35,7 +32,7 @@ from airbyte_cdk.sources.declarative.parsers.model_to_component_factory import ( | |
| 35 32 | 
             
                ModelToComponentFactory,
         | 
| 36 33 | 
             
            )
         | 
| 37 34 | 
             
            from airbyte_cdk.sources.declarative.requesters import HttpRequester
         | 
| 38 | 
            -
            from airbyte_cdk.sources.declarative.retrievers import  | 
| 35 | 
            +
            from airbyte_cdk.sources.declarative.retrievers import SimpleRetriever
         | 
| 39 36 | 
             
            from airbyte_cdk.sources.declarative.stream_slicers.declarative_partition_generator import (
         | 
| 40 37 | 
             
                DeclarativePartitionFactory,
         | 
| 41 38 | 
             
                StreamSlicerPartitionGenerator,
         | 
| @@ -233,7 +230,21 @@ class ConcurrentDeclarativeSource(ManifestDeclarativeSource, Generic[TState]): | |
| 233 230 | 
             
                                    stream_state=stream_state,
         | 
| 234 231 | 
             
                                )
         | 
| 235 232 |  | 
| 236 | 
            -
                                retriever =  | 
| 233 | 
            +
                                retriever = declarative_stream.retriever
         | 
| 234 | 
            +
             | 
| 235 | 
            +
                                # This is an optimization so that we don't invoke any cursor or state management flows within the
         | 
| 236 | 
            +
                                # low-code framework because state management is handled through the ConcurrentCursor.
         | 
| 237 | 
            +
                                if declarative_stream and isinstance(retriever, SimpleRetriever):
         | 
| 238 | 
            +
                                    # Also a temporary hack. In the legacy Stream implementation, as part of the read,
         | 
| 239 | 
            +
                                    # set_initial_state() is called to instantiate incoming state on the cursor. Although we no
         | 
| 240 | 
            +
                                    # longer rely on the legacy low-code cursor for concurrent checkpointing, low-code components
         | 
| 241 | 
            +
                                    # like StopConditionPaginationStrategyDecorator and ClientSideIncrementalRecordFilterDecorator
         | 
| 242 | 
            +
                                    # still rely on a DatetimeBasedCursor that is properly initialized with state.
         | 
| 243 | 
            +
                                    if retriever.cursor:
         | 
| 244 | 
            +
                                        retriever.cursor.set_initial_state(stream_state=stream_state)
         | 
| 245 | 
            +
                                    # We zero it out here, but since this is a cursor reference, the state is still properly
         | 
| 246 | 
            +
                                    # instantiated for the other components that reference it
         | 
| 247 | 
            +
                                    retriever.cursor = None
         | 
| 237 248 |  | 
| 238 249 | 
             
                                partition_generator = StreamSlicerPartitionGenerator(
         | 
| 239 250 | 
             
                                    DeclarativePartitionFactory(
         | 
| @@ -293,60 +304,6 @@ class ConcurrentDeclarativeSource(ManifestDeclarativeSource, Generic[TState]): | |
| 293 304 | 
             
                                        cursor=final_state_cursor,
         | 
| 294 305 | 
             
                                    )
         | 
| 295 306 | 
             
                                )
         | 
| 296 | 
            -
                            elif (
         | 
| 297 | 
            -
                                incremental_sync_component_definition
         | 
| 298 | 
            -
                                and incremental_sync_component_definition.get("type", "")
         | 
| 299 | 
            -
                                == DatetimeBasedCursorModel.__name__
         | 
| 300 | 
            -
                                and self._stream_supports_concurrent_partition_processing(
         | 
| 301 | 
            -
                                    declarative_stream=declarative_stream
         | 
| 302 | 
            -
                                )
         | 
| 303 | 
            -
                                and hasattr(declarative_stream.retriever, "stream_slicer")
         | 
| 304 | 
            -
                                and isinstance(
         | 
| 305 | 
            -
                                    declarative_stream.retriever.stream_slicer, PerPartitionWithGlobalCursor
         | 
| 306 | 
            -
                                )
         | 
| 307 | 
            -
                            ):
         | 
| 308 | 
            -
                                stream_state = state_manager.get_stream_state(
         | 
| 309 | 
            -
                                    stream_name=declarative_stream.name, namespace=declarative_stream.namespace
         | 
| 310 | 
            -
                                )
         | 
| 311 | 
            -
                                partition_router = declarative_stream.retriever.stream_slicer._partition_router
         | 
| 312 | 
            -
             | 
| 313 | 
            -
                                perpartition_cursor = (
         | 
| 314 | 
            -
                                    self._constructor.create_concurrent_cursor_from_perpartition_cursor(
         | 
| 315 | 
            -
                                        state_manager=state_manager,
         | 
| 316 | 
            -
                                        model_type=DatetimeBasedCursorModel,
         | 
| 317 | 
            -
                                        component_definition=incremental_sync_component_definition,
         | 
| 318 | 
            -
                                        stream_name=declarative_stream.name,
         | 
| 319 | 
            -
                                        stream_namespace=declarative_stream.namespace,
         | 
| 320 | 
            -
                                        config=config or {},
         | 
| 321 | 
            -
                                        stream_state=stream_state,
         | 
| 322 | 
            -
                                        partition_router=partition_router,
         | 
| 323 | 
            -
                                    )
         | 
| 324 | 
            -
                                )
         | 
| 325 | 
            -
             | 
| 326 | 
            -
                                retriever = self._get_retriever(declarative_stream, stream_state)
         | 
| 327 | 
            -
             | 
| 328 | 
            -
                                partition_generator = StreamSlicerPartitionGenerator(
         | 
| 329 | 
            -
                                    DeclarativePartitionFactory(
         | 
| 330 | 
            -
                                        declarative_stream.name,
         | 
| 331 | 
            -
                                        declarative_stream.get_json_schema(),
         | 
| 332 | 
            -
                                        retriever,
         | 
| 333 | 
            -
                                        self.message_repository,
         | 
| 334 | 
            -
                                    ),
         | 
| 335 | 
            -
                                    perpartition_cursor,
         | 
| 336 | 
            -
                                )
         | 
| 337 | 
            -
             | 
| 338 | 
            -
                                concurrent_streams.append(
         | 
| 339 | 
            -
                                    DefaultStream(
         | 
| 340 | 
            -
                                        partition_generator=partition_generator,
         | 
| 341 | 
            -
                                        name=declarative_stream.name,
         | 
| 342 | 
            -
                                        json_schema=declarative_stream.get_json_schema(),
         | 
| 343 | 
            -
                                        availability_strategy=AlwaysAvailableAvailabilityStrategy(),
         | 
| 344 | 
            -
                                        primary_key=get_primary_key_from_stream(declarative_stream.primary_key),
         | 
| 345 | 
            -
                                        cursor_field=perpartition_cursor.cursor_field.cursor_field_key,
         | 
| 346 | 
            -
                                        logger=self.logger,
         | 
| 347 | 
            -
                                        cursor=perpartition_cursor,
         | 
| 348 | 
            -
                                    )
         | 
| 349 | 
            -
                                )
         | 
| 350 307 | 
             
                            else:
         | 
| 351 308 | 
             
                                synchronous_streams.append(declarative_stream)
         | 
| 352 309 | 
             
                        else:
         | 
| @@ -437,27 +394,6 @@ class ConcurrentDeclarativeSource(ManifestDeclarativeSource, Generic[TState]): | |
| 437 394 | 
             
                                        return False
         | 
| 438 395 | 
             
                    return True
         | 
| 439 396 |  | 
| 440 | 
            -
                def _get_retriever(
         | 
| 441 | 
            -
                    self, declarative_stream: DeclarativeStream, stream_state: Mapping[str, Any]
         | 
| 442 | 
            -
                ) -> Retriever:
         | 
| 443 | 
            -
                    retriever = declarative_stream.retriever
         | 
| 444 | 
            -
             | 
| 445 | 
            -
                    # This is an optimization so that we don't invoke any cursor or state management flows within the
         | 
| 446 | 
            -
                    # low-code framework because state management is handled through the ConcurrentCursor.
         | 
| 447 | 
            -
                    if declarative_stream and isinstance(retriever, SimpleRetriever):
         | 
| 448 | 
            -
                        # Also a temporary hack. In the legacy Stream implementation, as part of the read,
         | 
| 449 | 
            -
                        # set_initial_state() is called to instantiate incoming state on the cursor. Although we no
         | 
| 450 | 
            -
                        # longer rely on the legacy low-code cursor for concurrent checkpointing, low-code components
         | 
| 451 | 
            -
                        # like StopConditionPaginationStrategyDecorator and ClientSideIncrementalRecordFilterDecorator
         | 
| 452 | 
            -
                        # still rely on a DatetimeBasedCursor that is properly initialized with state.
         | 
| 453 | 
            -
                        if retriever.cursor:
         | 
| 454 | 
            -
                            retriever.cursor.set_initial_state(stream_state=stream_state)
         | 
| 455 | 
            -
                        # We zero it out here, but since this is a cursor reference, the state is still properly
         | 
| 456 | 
            -
                        # instantiated for the other components that reference it
         | 
| 457 | 
            -
                        retriever.cursor = None
         | 
| 458 | 
            -
             | 
| 459 | 
            -
                    return retriever
         | 
| 460 | 
            -
             | 
| 461 397 | 
             
                @staticmethod
         | 
| 462 398 | 
             
                def _select_streams(
         | 
| 463 399 | 
             
                    streams: List[AbstractStream], configured_catalog: ConfiguredAirbyteCatalog
         | 
| @@ -18,7 +18,9 @@ properties: | |
| 18 18 | 
             
                type: string
         | 
| 19 19 | 
             
                enum: [DeclarativeSource]
         | 
| 20 20 | 
             
              check:
         | 
| 21 | 
            -
                 | 
| 21 | 
            +
                anyOf:
         | 
| 22 | 
            +
                  - "$ref": "#/definitions/CheckStream"
         | 
| 23 | 
            +
                  - "$ref": "#/definitions/CheckDynamicStream"
         | 
| 22 24 | 
             
              streams:
         | 
| 23 25 | 
             
                type: array
         | 
| 24 26 | 
             
                items:
         | 
| @@ -303,6 +305,21 @@ definitions: | |
| 303 305 | 
             
                    examples:
         | 
| 304 306 | 
             
                      - ["users"]
         | 
| 305 307 | 
             
                      - ["users", "contacts"]
         | 
| 308 | 
            +
              CheckDynamicStream:
         | 
| 309 | 
            +
                title: Dynamic Streams to Check
         | 
| 310 | 
            +
                description: (This component is experimental. Use at your own risk.) Defines the dynamic streams to try reading when running a check operation.
         | 
| 311 | 
            +
                type: object
         | 
| 312 | 
            +
                required:
         | 
| 313 | 
            +
                  - type
         | 
| 314 | 
            +
                  - stream_count
         | 
| 315 | 
            +
                properties:
         | 
| 316 | 
            +
                  type:
         | 
| 317 | 
            +
                    type: string
         | 
| 318 | 
            +
                    enum: [CheckDynamicStream]
         | 
| 319 | 
            +
                  stream_count:
         | 
| 320 | 
            +
                    title: Stream Count
         | 
| 321 | 
            +
                    description: Numbers of the streams to try reading from when running a check operation.
         | 
| 322 | 
            +
                    type: integer
         | 
| 306 323 | 
             
              CompositeErrorHandler:
         | 
| 307 324 | 
             
                title: Composite Error Handler
         | 
| 308 325 | 
             
                description: Error handler that sequentially iterates over a list of error handlers.
         | 
| @@ -678,7 +695,7 @@ definitions: | |
| 678 695 | 
             
                properties:
         | 
| 679 696 | 
             
                  type:
         | 
| 680 697 | 
             
                    type: string
         | 
| 681 | 
            -
                    enum: [ | 
| 698 | 
            +
                    enum: [CustomSchemaNormalization]
         | 
| 682 699 | 
             
                  class_name:
         | 
| 683 700 | 
             
                    title: Class Name
         | 
| 684 701 | 
             
                    description: Fully-qualified name of the class that will be implementing the custom normalization. The format is `source_<name>.<package>.<class_name>`.
         | 
| @@ -1047,6 +1064,13 @@ definitions: | |
| 1047 1064 | 
             
                  type:
         | 
| 1048 1065 | 
             
                    type: string
         | 
| 1049 1066 | 
             
                    enum: [OAuthAuthenticator]
         | 
| 1067 | 
            +
                  client_id_name:
         | 
| 1068 | 
            +
                    title: Client ID Property Name
         | 
| 1069 | 
            +
                    description: The name of the property to use to refresh the `access_token`.
         | 
| 1070 | 
            +
                    type: string
         | 
| 1071 | 
            +
                    default: "client_id"
         | 
| 1072 | 
            +
                    examples:
         | 
| 1073 | 
            +
                      - custom_app_id
         | 
| 1050 1074 | 
             
                  client_id:
         | 
| 1051 1075 | 
             
                    title: Client ID
         | 
| 1052 1076 | 
             
                    description: The OAuth client ID. Fill it in the user inputs.
         | 
| @@ -1054,6 +1078,13 @@ definitions: | |
| 1054 1078 | 
             
                    examples:
         | 
| 1055 1079 | 
             
                      - "{{ config['client_id }}"
         | 
| 1056 1080 | 
             
                      - "{{ config['credentials']['client_id }}"
         | 
| 1081 | 
            +
                  client_secret_name:
         | 
| 1082 | 
            +
                    title: Client Secret Property Name
         | 
| 1083 | 
            +
                    description: The name of the property to use to refresh the `access_token`.
         | 
| 1084 | 
            +
                    type: string
         | 
| 1085 | 
            +
                    default: "client_secret"
         | 
| 1086 | 
            +
                    examples:
         | 
| 1087 | 
            +
                      - custom_app_secret
         | 
| 1057 1088 | 
             
                  client_secret:
         | 
| 1058 1089 | 
             
                    title: Client Secret
         | 
| 1059 1090 | 
             
                    description: The OAuth client secret. Fill it in the user inputs.
         | 
| @@ -1061,6 +1092,13 @@ definitions: | |
| 1061 1092 | 
             
                    examples:
         | 
| 1062 1093 | 
             
                      - "{{ config['client_secret }}"
         | 
| 1063 1094 | 
             
                      - "{{ config['credentials']['client_secret }}"
         | 
| 1095 | 
            +
                  refresh_token_name:
         | 
| 1096 | 
            +
                    title: Refresh Token Property Name
         | 
| 1097 | 
            +
                    description: The name of the property to use to refresh the `access_token`.
         | 
| 1098 | 
            +
                    type: string
         | 
| 1099 | 
            +
                    default: "refresh_token"
         | 
| 1100 | 
            +
                    examples:
         | 
| 1101 | 
            +
                      - custom_app_refresh_value
         | 
| 1064 1102 | 
             
                  refresh_token:
         | 
| 1065 1103 | 
             
                    title: Refresh Token
         | 
| 1066 1104 | 
             
                    description: Credential artifact used to get a new access token.
         | 
| @@ -1094,6 +1132,13 @@ definitions: | |
| 1094 1132 | 
             
                    default: "expires_in"
         | 
| 1095 1133 | 
             
                    examples:
         | 
| 1096 1134 | 
             
                      - expires_in
         | 
| 1135 | 
            +
                  grant_type_name:
         | 
| 1136 | 
            +
                    title: Grant Type Property Name
         | 
| 1137 | 
            +
                    description: The name of the property to use to refresh the `access_token`.
         | 
| 1138 | 
            +
                    type: string
         | 
| 1139 | 
            +
                    default: "grant_type"
         | 
| 1140 | 
            +
                    examples:
         | 
| 1141 | 
            +
                      - custom_grant_type
         | 
| 1097 1142 | 
             
                  grant_type:
         | 
| 1098 1143 | 
             
                    title: Grant Type
         | 
| 1099 1144 | 
             
                    description: Specifies the OAuth2 grant type. If set to refresh_token, the refresh_token needs to be provided as well. For client_credentials, only client id and secret are required. Other grant types are not officially supported.
         | 
| @@ -1111,6 +1156,14 @@ definitions: | |
| 1111 1156 | 
             
                      - applicationId: "{{ config['application_id'] }}"
         | 
| 1112 1157 | 
             
                        applicationSecret: "{{ config['application_secret'] }}"
         | 
| 1113 1158 | 
             
                        token: "{{ config['token'] }}"
         | 
| 1159 | 
            +
                  refresh_request_headers:
         | 
| 1160 | 
            +
                    title: Refresh Request Headers
         | 
| 1161 | 
            +
                    description: Headers of the request sent to get a new access token.
         | 
| 1162 | 
            +
                    type: object
         | 
| 1163 | 
            +
                    additionalProperties: true
         | 
| 1164 | 
            +
                    examples:
         | 
| 1165 | 
            +
                      - Authorization: "<AUTH_TOKEN>"
         | 
| 1166 | 
            +
                        Content-Type: "application/x-www-form-urlencoded"
         | 
| 1114 1167 | 
             
                  scopes:
         | 
| 1115 1168 | 
             
                    title: Scopes
         | 
| 1116 1169 | 
             
                    description: List of scopes that should be granted to the access token.
         | 
| @@ -1460,6 +1513,7 @@ definitions: | |
| 1460 1513 | 
             
                    anyOf:
         | 
| 1461 1514 | 
             
                      - "$ref": "#/definitions/JsonDecoder"
         | 
| 1462 1515 | 
             
                      - "$ref": "#/definitions/XmlDecoder"
         | 
| 1516 | 
            +
                      - "$ref": "#/definitions/CompositeRawDecoder"
         | 
| 1463 1517 | 
             
                  $parameters:
         | 
| 1464 1518 | 
             
                    type: object
         | 
| 1465 1519 | 
             
                    additionalProperties: true
         | 
| @@ -1735,6 +1789,10 @@ definitions: | |
| 1735 1789 | 
             
                      - type: array
         | 
| 1736 1790 | 
             
                        items:
         | 
| 1737 1791 | 
             
                          type: string
         | 
| 1792 | 
            +
                  condition:
         | 
| 1793 | 
            +
                    type: string
         | 
| 1794 | 
            +
                    interpolation_context:
         | 
| 1795 | 
            +
                      - raw_schema
         | 
| 1738 1796 | 
             
              SchemaTypeIdentifier:
         | 
| 1739 1797 | 
             
                title: Schema Type Identifier
         | 
| 1740 1798 | 
             
                description: (This component is experimental. Use at your own risk.) Identifies schema details for dynamic schema extraction and processing.
         | 
| @@ -2014,6 +2072,26 @@ definitions: | |
| 2014 2072 | 
             
                  $parameters:
         | 
| 2015 2073 | 
             
                    type: object
         | 
| 2016 2074 | 
             
                    additionalProperties: true
         | 
| 2075 | 
            +
              ZipfileDecoder:
         | 
| 2076 | 
            +
                title: Zipfile Decoder
         | 
| 2077 | 
            +
                description: Decoder for response data that is returned as zipfile(s).
         | 
| 2078 | 
            +
                type: object
         | 
| 2079 | 
            +
                additionalProperties: true
         | 
| 2080 | 
            +
                required:
         | 
| 2081 | 
            +
                  - type
         | 
| 2082 | 
            +
                  - parser
         | 
| 2083 | 
            +
                properties:
         | 
| 2084 | 
            +
                  type:
         | 
| 2085 | 
            +
                    type: string
         | 
| 2086 | 
            +
                    enum: [ZipfileDecoder]
         | 
| 2087 | 
            +
                  parser:
         | 
| 2088 | 
            +
                    title: Parser
         | 
| 2089 | 
            +
                    description: Parser to parse the decompressed data from the zipfile(s).
         | 
| 2090 | 
            +
                    anyOf:
         | 
| 2091 | 
            +
                      - "$ref": "#/definitions/GzipParser"
         | 
| 2092 | 
            +
                      - "$ref": "#/definitions/JsonParser"
         | 
| 2093 | 
            +
                      - "$ref": "#/definitions/JsonLineParser"
         | 
| 2094 | 
            +
                      - "$ref": "#/definitions/CsvParser"
         | 
| 2017 2095 | 
             
              ListPartitionRouter:
         | 
| 2018 2096 | 
             
                title: List Partition Router
         | 
| 2019 2097 | 
             
                description: A Partition router that specifies a list of attributes where each attribute describes a portion of the complete data set for a stream. During a sync, each value is iterated over and can be used as input to outbound API requests.
         | 
| @@ -2204,15 +2282,15 @@ definitions: | |
| 2204 2282 | 
             
                      Pertains to the fields defined by the connector relating to the OAuth flow.
         | 
| 2205 2283 |  | 
| 2206 2284 | 
             
                      Interpolation capabilities:
         | 
| 2207 | 
            -
                      - The variables placeholders are declared as `{my_var}`.
         | 
| 2208 | 
            -
                      - The nested resolution variables like `{{my_nested_var}}` is allowed as well.
         | 
| 2285 | 
            +
                      - The variables placeholders are declared as `{{my_var}}`.
         | 
| 2286 | 
            +
                      - The nested resolution variables like `{{ {{my_nested_var}} }}` is allowed as well.
         | 
| 2209 2287 |  | 
| 2210 2288 | 
             
                      - The allowed interpolation context is:
         | 
| 2211 | 
            -
                        + base64Encoder - encode to `base64`, { | 
| 2212 | 
            -
                        + base64Decorer - decode from `base64` encoded string, { | 
| 2213 | 
            -
                        + urlEncoder - encode the input string to URL-like format, { | 
| 2214 | 
            -
                        + urlDecorer - decode the input url-encoded string into text format, {urlDecoder:https%3A%2F%2Fairbyte.io}
         | 
| 2215 | 
            -
                        + codeChallengeS256 - get the `codeChallenge` encoded value to provide additional data-provider specific authorisation values, { | 
| 2289 | 
            +
                        + base64Encoder - encode to `base64`, {{ {{my_var_a}}:{{my_var_b}} | base64Encoder }}
         | 
| 2290 | 
            +
                        + base64Decorer - decode from `base64` encoded string, {{ {{my_string_variable_or_string_value}} | base64Decoder }}
         | 
| 2291 | 
            +
                        + urlEncoder - encode the input string to URL-like format, {{ https://test.host.com/endpoint | urlEncoder}}
         | 
| 2292 | 
            +
                        + urlDecorer - decode the input url-encoded string into text format, {{ urlDecoder:https%3A%2F%2Fairbyte.io | urlDecoder}}
         | 
| 2293 | 
            +
                        + codeChallengeS256 - get the `codeChallenge` encoded value to provide additional data-provider specific authorisation values, {{ {{state_value}} | codeChallengeS256 }}
         | 
| 2216 2294 |  | 
| 2217 2295 | 
             
                      Examples:
         | 
| 2218 2296 | 
             
                        - The TikTok Marketing DeclarativeOAuth spec:
         | 
| @@ -2221,12 +2299,12 @@ definitions: | |
| 2221 2299 | 
             
                            "type": "object",
         | 
| 2222 2300 | 
             
                            "additionalProperties": false,
         | 
| 2223 2301 | 
             
                            "properties": {
         | 
| 2224 | 
            -
                                "consent_url": "https://ads.tiktok.com/marketing_api/auth?{client_id_key}={{ | 
| 2302 | 
            +
                                "consent_url": "https://ads.tiktok.com/marketing_api/auth?{{client_id_key}}={{client_id_value}}&{{redirect_uri_key}}={{ {{redirect_uri_value}} | urlEncoder}}&{{state_key}}={{state_value}}",
         | 
| 2225 2303 | 
             
                                "access_token_url": "https://business-api.tiktok.com/open_api/v1.3/oauth2/access_token/",
         | 
| 2226 2304 | 
             
                                "access_token_params": {
         | 
| 2227 | 
            -
                                    "{auth_code_key}": "{{ | 
| 2228 | 
            -
                                    "{client_id_key}": "{{ | 
| 2229 | 
            -
                                    "{client_secret_key}": "{{ | 
| 2305 | 
            +
                                    "{{ auth_code_key }}": "{{ auth_code_value }}",
         | 
| 2306 | 
            +
                                    "{{ client_id_key }}": "{{ client_id_value }}",
         | 
| 2307 | 
            +
                                    "{{ client_secret_key }}": "{{ client_secret_value }}"
         | 
| 2230 2308 | 
             
                                },
         | 
| 2231 2309 | 
             
                                "access_token_headers": {
         | 
| 2232 2310 | 
             
                                    "Content-Type": "application/json",
         | 
| @@ -2244,7 +2322,6 @@ definitions: | |
| 2244 2322 | 
             
                    required:
         | 
| 2245 2323 | 
             
                      - consent_url
         | 
| 2246 2324 | 
             
                      - access_token_url
         | 
| 2247 | 
            -
                      - extract_output
         | 
| 2248 2325 | 
             
                    properties:
         | 
| 2249 2326 | 
             
                      consent_url:
         | 
| 2250 2327 | 
             
                        title: Consent URL
         | 
| @@ -2253,8 +2330,8 @@ definitions: | |
| 2253 2330 | 
             
                          The DeclarativeOAuth Specific string URL string template to initiate the authentication.
         | 
| 2254 2331 | 
             
                          The placeholders are replaced during the processing to provide neccessary values.
         | 
| 2255 2332 | 
             
                        examples:
         | 
| 2256 | 
            -
                          - https://domain.host.com/marketing_api/auth?{client_id_key}={{ | 
| 2257 | 
            -
                          - https://endpoint.host.com/oauth2/authorize?{client_id_key}={{ | 
| 2333 | 
            +
                          - https://domain.host.com/marketing_api/auth?{{client_id_key}}={{client_id_value}}&{{redirect_uri_key}}={{{{redirect_uri_value}} | urlEncoder}}&{{state_key}}={{state_value}}
         | 
| 2334 | 
            +
                          - https://endpoint.host.com/oauth2/authorize?{{client_id_key}}={{client_id_value}}&{{redirect_uri_key}}={{{{redirect_uri_value}} | urlEncoder}}&{{scope_key}}={{{{scope_value}} | urlEncoder}}&{{state_key}}={{state_value}}&subdomain={{subdomain}}
         | 
| 2258 2335 | 
             
                      scope:
         | 
| 2259 2336 | 
             
                        title: Scopes
         | 
| 2260 2337 | 
             
                        type: string
         | 
| @@ -2269,7 +2346,7 @@ definitions: | |
| 2269 2346 | 
             
                          The DeclarativeOAuth Specific URL templated string to obtain the `access_token`, `refresh_token` etc.
         | 
| 2270 2347 | 
             
                          The placeholders are replaced during the processing to provide neccessary values.
         | 
| 2271 2348 | 
             
                        examples:
         | 
| 2272 | 
            -
                          - https://auth.host.com/oauth2/token?{client_id_key}={{ | 
| 2349 | 
            +
                          - https://auth.host.com/oauth2/token?{{client_id_key}}={{client_id_value}}&{{client_secret_key}}={{client_secret_value}}&{{auth_code_key}}={{auth_code_value}}&{{redirect_uri_key}}={{{{redirect_uri_value}} | urlEncoder}}
         | 
| 2273 2350 | 
             
                      access_token_headers:
         | 
| 2274 2351 | 
             
                        title: Access Token Headers
         | 
| 2275 2352 | 
             
                        type: object
         | 
| @@ -2278,7 +2355,7 @@ definitions: | |
| 2278 2355 | 
             
                          The DeclarativeOAuth Specific optional headers to inject while exchanging the `auth_code` to `access_token` during `completeOAuthFlow` step.
         | 
| 2279 2356 | 
             
                        examples:
         | 
| 2280 2357 | 
             
                          - {
         | 
| 2281 | 
            -
                              "Authorization": "Basic { | 
| 2358 | 
            +
                              "Authorization": "Basic {{ {{ client_id_value }}:{{ client_secret_value }} | base64Encoder }}",
         | 
| 2282 2359 | 
             
                            }
         | 
| 2283 2360 | 
             
                      access_token_params:
         | 
| 2284 2361 | 
             
                        title: Access Token Query Params (Json Encoded)
         | 
| @@ -2289,9 +2366,9 @@ definitions: | |
| 2289 2366 | 
             
                          When this property is provided, the query params will be encoded as `Json` and included in the outgoing API request.
         | 
| 2290 2367 | 
             
                        examples:
         | 
| 2291 2368 | 
             
                          - {
         | 
| 2292 | 
            -
                              "{auth_code_key}": "{{ | 
| 2293 | 
            -
                              "{client_id_key}": "{{ | 
| 2294 | 
            -
                              "{client_secret_key}": "{{ | 
| 2369 | 
            +
                              "{{ auth_code_key }}": "{{ auth_code_value }}",
         | 
| 2370 | 
            +
                              "{{ client_id_key }}": "{{ client_id_value }}",
         | 
| 2371 | 
            +
                              "{{ client_secret_key }}": "{{ client_secret_value }}",
         | 
| 2295 2372 | 
             
                            }
         | 
| 2296 2373 | 
             
                      extract_output:
         | 
| 2297 2374 | 
             
                        title: Extract Output
         | 
| @@ -2843,6 +2920,7 @@ definitions: | |
| 2843 2920 | 
             
                      - "$ref": "#/definitions/XmlDecoder"
         | 
| 2844 2921 | 
             
                      - "$ref": "#/definitions/GzipJsonDecoder"
         | 
| 2845 2922 | 
             
                      - "$ref": "#/definitions/CompositeRawDecoder"
         | 
| 2923 | 
            +
                      - "$ref": "#/definitions/ZipfileDecoder"
         | 
| 2846 2924 | 
             
                  $parameters:
         | 
| 2847 2925 | 
             
                    type: object
         | 
| 2848 2926 | 
             
                    additionalProperties: true
         | 
| @@ -2859,6 +2937,7 @@ definitions: | |
| 2859 2937 | 
             
                  parser:
         | 
| 2860 2938 | 
             
                    anyOf:
         | 
| 2861 2939 | 
             
                      - "$ref": "#/definitions/GzipParser"
         | 
| 2940 | 
            +
                      - "$ref": "#/definitions/JsonParser"
         | 
| 2862 2941 | 
             
                      - "$ref": "#/definitions/JsonLineParser"
         | 
| 2863 2942 | 
             
                      - "$ref": "#/definitions/CsvParser"
         | 
| 2864 2943 | 
             
              #    PARSERS
         | 
| @@ -2875,6 +2954,20 @@ definitions: | |
| 2875 2954 | 
             
                    anyOf:
         | 
| 2876 2955 | 
             
                      - "$ref": "#/definitions/JsonLineParser"
         | 
| 2877 2956 | 
             
                      - "$ref": "#/definitions/CsvParser"
         | 
| 2957 | 
            +
                      - "$ref": "#/definitions/JsonParser"
         | 
| 2958 | 
            +
              JsonParser:
         | 
| 2959 | 
            +
                title: JsonParser
         | 
| 2960 | 
            +
                description: Parser used for parsing str, bytes, or bytearray data and returning data in a dictionary format.
         | 
| 2961 | 
            +
                type: object
         | 
| 2962 | 
            +
                required:
         | 
| 2963 | 
            +
                  - type
         | 
| 2964 | 
            +
                properties:
         | 
| 2965 | 
            +
                  type:
         | 
| 2966 | 
            +
                    type: string
         | 
| 2967 | 
            +
                    enum: [JsonParser]
         | 
| 2968 | 
            +
                  encoding:
         | 
| 2969 | 
            +
                    type: string
         | 
| 2970 | 
            +
                    default: utf-8
         | 
| 2878 2971 | 
             
              JsonLineParser:
         | 
| 2879 2972 | 
             
                type: object
         | 
| 2880 2973 | 
             
                required:
         | 
| @@ -2977,6 +3070,11 @@ definitions: | |
| 2977 3070 | 
             
                    anyOf:
         | 
| 2978 3071 | 
             
                      - "$ref": "#/definitions/CustomRequester"
         | 
| 2979 3072 | 
             
                      - "$ref": "#/definitions/HttpRequester"
         | 
| 3073 | 
            +
                  url_requester:
         | 
| 3074 | 
            +
                    description: Requester component that describes how to prepare HTTP requests to send to the source API to extract the url from polling response by the completed async job.
         | 
| 3075 | 
            +
                    anyOf:
         | 
| 3076 | 
            +
                      - "$ref": "#/definitions/CustomRequester"
         | 
| 3077 | 
            +
                      - "$ref": "#/definitions/HttpRequester"
         | 
| 2980 3078 | 
             
                  download_requester:
         | 
| 2981 3079 | 
             
                    description: Requester component that describes how to prepare HTTP requests to send to the source API to download the data provided by the completed async job.
         | 
| 2982 3080 | 
             
                    anyOf:
         | 
| @@ -3021,6 +3119,8 @@ definitions: | |
| 3021 3119 | 
             
                      - "$ref": "#/definitions/IterableDecoder"
         | 
| 3022 3120 | 
             
                      - "$ref": "#/definitions/XmlDecoder"
         | 
| 3023 3121 | 
             
                      - "$ref": "#/definitions/GzipJsonDecoder"
         | 
| 3122 | 
            +
                      - "$ref": "#/definitions/CompositeRawDecoder"
         | 
| 3123 | 
            +
                      - "$ref": "#/definitions/ZipfileDecoder"
         | 
| 3024 3124 | 
             
                  download_decoder:
         | 
| 3025 3125 | 
             
                    title: Download Decoder
         | 
| 3026 3126 | 
             
                    description: Component decoding the download response so records can be extracted.
         | 
| @@ -3031,6 +3131,8 @@ definitions: | |
| 3031 3131 | 
             
                      - "$ref": "#/definitions/IterableDecoder"
         | 
| 3032 3132 | 
             
                      - "$ref": "#/definitions/XmlDecoder"
         | 
| 3033 3133 | 
             
                      - "$ref": "#/definitions/GzipJsonDecoder"
         | 
| 3134 | 
            +
                      - "$ref": "#/definitions/CompositeRawDecoder"
         | 
| 3135 | 
            +
                      - "$ref": "#/definitions/ZipfileDecoder"
         | 
| 3034 3136 | 
             
                  $parameters:
         | 
| 3035 3137 | 
             
                    type: object
         | 
| 3036 3138 | 
             
                    additionalProperties: true
         | 
| @@ -2,7 +2,12 @@ | |
| 2 2 | 
             
            # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
         | 
| 3 3 | 
             
            #
         | 
| 4 4 |  | 
| 5 | 
            -
            from airbyte_cdk.sources.declarative.decoders.composite_raw_decoder import  | 
| 5 | 
            +
            from airbyte_cdk.sources.declarative.decoders.composite_raw_decoder import (
         | 
| 6 | 
            +
                CompositeRawDecoder,
         | 
| 7 | 
            +
                GzipParser,
         | 
| 8 | 
            +
                JsonParser,
         | 
| 9 | 
            +
                Parser,
         | 
| 10 | 
            +
            )
         | 
| 6 11 | 
             
            from airbyte_cdk.sources.declarative.decoders.decoder import Decoder
         | 
| 7 12 | 
             
            from airbyte_cdk.sources.declarative.decoders.json_decoder import (
         | 
| 8 13 | 
             
                GzipJsonDecoder,
         | 
| @@ -15,15 +20,18 @@ from airbyte_cdk.sources.declarative.decoders.pagination_decoder_decorator impor | |
| 15 20 | 
             
                PaginationDecoderDecorator,
         | 
| 16 21 | 
             
            )
         | 
| 17 22 | 
             
            from airbyte_cdk.sources.declarative.decoders.xml_decoder import XmlDecoder
         | 
| 23 | 
            +
            from airbyte_cdk.sources.declarative.decoders.zipfile_decoder import ZipfileDecoder
         | 
| 18 24 |  | 
| 19 25 | 
             
            __all__ = [
         | 
| 20 26 | 
             
                "Decoder",
         | 
| 21 27 | 
             
                "CompositeRawDecoder",
         | 
| 22 28 | 
             
                "JsonDecoder",
         | 
| 29 | 
            +
                "JsonParser",
         | 
| 23 30 | 
             
                "JsonlDecoder",
         | 
| 24 31 | 
             
                "IterableDecoder",
         | 
| 25 32 | 
             
                "GzipJsonDecoder",
         | 
| 26 33 | 
             
                "NoopDecoder",
         | 
| 27 34 | 
             
                "PaginationDecoderDecorator",
         | 
| 28 35 | 
             
                "XmlDecoder",
         | 
| 36 | 
            +
                "ZipfileDecoder",
         | 
| 29 37 | 
             
            ]
         |