airbyte-cdk 6.37.2.dev1__tar.gz → 6.38.0__tar.gz
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-6.37.2.dev1 → airbyte_cdk-6.38.0}/PKG-INFO +4 -4
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/concurrent_declarative_source.py +28 -7
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/datetime/datetime_parser.py +11 -1
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/declarative_component_schema.yaml +72 -5
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/decoders/composite_raw_decoder.py +2 -3
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/interpolation/macros.py +3 -3
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/models/declarative_component_schema.py +34 -8
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/parsers/custom_code_compiler.py +18 -4
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py +120 -8
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/README.md +5 -5
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/http_job_repository.py +18 -13
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/http_requester.py +49 -17
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/paginators/default_paginator.py +25 -4
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/paginators/no_pagination.py +6 -1
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/paginators/paginator.py +7 -2
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/requester.py +7 -1
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/retrievers/simple_retriever.py +21 -4
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/transformations/keys_to_snake_transformation.py +2 -2
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/yaml_declarative_source.py +0 -1
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/concurrent/state_converters/abstract_stream_state_converter.py +2 -1
- airbyte_cdk-6.38.0/airbyte_cdk/sources/streams/concurrent/state_converters/incrementing_count_stream_state_converter.py +92 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/http/error_handlers/default_error_mapping.py +3 -3
- airbyte_cdk-6.38.0/airbyte_cdk/sources/streams/utils/__init__.py +3 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/types.py +1 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/utils/mapping_helpers.py +18 -1
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/pyproject.toml +4 -4
- airbyte_cdk-6.37.2.dev1/airbyte_cdk/sources/declarative/datetime/__init__.py +0 -7
- airbyte_cdk-6.37.2.dev1/airbyte_cdk/sources/embedded/__init__.py +0 -3
- airbyte_cdk-6.37.2.dev1/airbyte_cdk/sources/embedded/base_integration.py +0 -61
- airbyte_cdk-6.37.2.dev1/airbyte_cdk/sources/embedded/catalog.py +0 -57
- airbyte_cdk-6.37.2.dev1/airbyte_cdk/sources/embedded/runner.py +0 -57
- airbyte_cdk-6.37.2.dev1/airbyte_cdk/sources/embedded/tools.py +0 -27
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/LICENSE.txt +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/LICENSE_SHORT +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/README.md +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/cli/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/cli/source_declarative_manifest/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/cli/source_declarative_manifest/_run.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/cli/source_declarative_manifest/spec.json +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/config_observation.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/connector.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/connector_builder/README.md +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/connector_builder/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/connector_builder/connector_builder_handler.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/connector_builder/main.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/connector_builder/models.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/connector_builder/test_reader/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/connector_builder/test_reader/helpers.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/connector_builder/test_reader/message_grouper.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/connector_builder/test_reader/reader.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/connector_builder/test_reader/types.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/destinations/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/destinations/destination.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/destinations/vector_db_based/README.md +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/destinations/vector_db_based/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/destinations/vector_db_based/config.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/destinations/vector_db_based/document_processor.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/destinations/vector_db_based/embedder.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/destinations/vector_db_based/indexer.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/destinations/vector_db_based/test_utils.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/destinations/vector_db_based/utils.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/destinations/vector_db_based/writer.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/entrypoint.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/exception_handler.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/logger.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/models/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/models/airbyte_protocol.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/models/airbyte_protocol_serializers.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/models/file_transfer_record_message.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/models/well_known_types.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/py.typed +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/abstract_source.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/concurrent_source/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/concurrent_source/concurrent_read_processor.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/concurrent_source/concurrent_source.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/concurrent_source/concurrent_source_adapter.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/concurrent_source/partition_generation_completed_sentinel.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/concurrent_source/stream_thread_exception.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/concurrent_source/thread_pool_manager.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/config.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/connector_state_manager.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/async_job/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/async_job/job.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/async_job/job_orchestrator.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/async_job/job_tracker.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/async_job/repository.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/async_job/status.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/async_job/timer.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/auth/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/auth/declarative_authenticator.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/auth/jwt.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/auth/oauth.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/auth/selective_authenticator.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/auth/token.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/auth/token_provider.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/checks/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/checks/check_dynamic_stream.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/checks/check_stream.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/checks/connection_checker.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/concurrency_level/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/concurrency_level/concurrency_level.py +0 -0
- {airbyte_cdk-6.37.2.dev1/airbyte_cdk/sources/streams/concurrent → airbyte_cdk-6.38.0/airbyte_cdk/sources/declarative/datetime}/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/datetime/min_max_datetime.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/declarative_source.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/declarative_stream.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/decoders/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/decoders/decoder.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/decoders/json_decoder.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/decoders/noop_decoder.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/decoders/pagination_decoder_decorator.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/decoders/xml_decoder.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/decoders/zipfile_decoder.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/exceptions.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/extractors/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/extractors/dpath_extractor.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/extractors/http_selector.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/extractors/record_extractor.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/extractors/record_filter.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/extractors/record_selector.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/extractors/response_to_file_extractor.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/extractors/type_transformer.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/incremental/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/incremental/concurrent_partition_cursor.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/incremental/datetime_based_cursor.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/incremental/declarative_cursor.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/incremental/global_substream_cursor.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/incremental/per_partition_cursor.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/incremental/per_partition_with_global.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/incremental/resumable_full_refresh_cursor.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/interpolation/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/interpolation/filters.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_boolean.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_mapping.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_nested_mapping.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_string.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/interpolation/interpolation.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/interpolation/jinja.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/manifest_declarative_source.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/migrations/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/migrations/legacy_to_per_partition_state_migration.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/migrations/state_migration.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/models/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/parsers/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/parsers/custom_exceptions.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/parsers/manifest_component_transformer.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/parsers/manifest_reference_resolver.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/partition_routers/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/partition_routers/async_job_partition_router.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/partition_routers/cartesian_product_stream_slicer.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/partition_routers/list_partition_router.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/partition_routers/partition_router.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/partition_routers/single_partition_router.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/partition_routers/substream_partition_router.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/constant_backoff_strategy.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/exponential_backoff_strategy.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/header_helper.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/wait_time_from_header_backoff_strategy.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/wait_until_time_from_header_backoff_strategy.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategy.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/composite_error_handler.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/default_error_handler.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/default_http_response_filter.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/error_handler.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/http_response_filter.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/paginators/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/cursor_pagination_strategy.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/offset_increment.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/page_increment.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/pagination_strategy.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/stop_condition.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/request_option.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/request_options/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/request_options/datetime_based_request_options_provider.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/request_options/default_request_options_provider.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_nested_request_input_provider.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_input_provider.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_options_provider.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/request_options/request_options_provider.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/requesters/request_path.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/resolvers/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/resolvers/components_resolver.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/resolvers/config_components_resolver.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/resolvers/http_components_resolver.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/retrievers/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/retrievers/async_retriever.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/retrievers/retriever.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/schema/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/schema/default_schema_loader.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/schema/dynamic_schema_loader.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/schema/inline_schema_loader.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/schema/json_file_schema_loader.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/schema/schema_loader.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/spec/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/spec/spec.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/stream_slicers/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/stream_slicers/declarative_partition_generator.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/stream_slicers/stream_slicer.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/transformations/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/transformations/add_fields.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/transformations/dpath_flatten_fields.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/transformations/flatten_fields.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/transformations/keys_replace_transformation.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/transformations/keys_to_lower_transformation.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/transformations/remove_fields.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/transformations/transformation.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/declarative/types.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/README.md +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/availability_strategy/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/availability_strategy/abstract_file_based_availability_strategy.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/availability_strategy/default_file_based_availability_strategy.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/config/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/config/abstract_file_based_spec.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/config/avro_format.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/config/csv_format.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/config/excel_format.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/config/file_based_stream_config.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/config/jsonl_format.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/config/parquet_format.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/config/unstructured_format.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/config/validate_config_transfer_modes.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/discovery_policy/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/discovery_policy/abstract_discovery_policy.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/discovery_policy/default_discovery_policy.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/exceptions.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/file_based_source.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/file_based_stream_reader.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/file_types/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/file_types/avro_parser.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/file_types/csv_parser.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/file_types/excel_parser.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/file_types/file_transfer.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/file_types/file_type_parser.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/file_types/jsonl_parser.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/file_types/parquet_parser.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/file_types/unstructured_parser.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/remote_file.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/schema_helpers.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/schema_validation_policies/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/schema_validation_policies/abstract_schema_validation_policy.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/schema_validation_policies/default_schema_validation_policies.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/stream/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/stream/abstract_file_based_stream.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/stream/concurrent/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/stream/concurrent/adapters.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/stream/concurrent/cursor/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/stream/concurrent/cursor/abstract_concurrent_file_based_cursor.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/stream/concurrent/cursor/file_based_concurrent_cursor.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/stream/concurrent/cursor/file_based_final_state_cursor.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/stream/cursor/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/stream/cursor/abstract_file_based_cursor.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/stream/cursor/default_file_based_cursor.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/stream/default_file_based_stream.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/stream/identities_stream.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/stream/permissions_file_based_stream.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/file_based/types.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/http_config.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/http_logger.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/message/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/message/repository.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/source.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/specs/transfer_modes.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/availability_strategy.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/call_rate.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/checkpoint/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/checkpoint/checkpoint_reader.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/checkpoint/cursor.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/checkpoint/per_partition_key_serializer.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/checkpoint/resumable_full_refresh_cursor.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/checkpoint/substream_resumable_full_refresh_cursor.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/concurrent/README.md +0 -0
- {airbyte_cdk-6.37.2.dev1/airbyte_cdk/sources/streams/concurrent/partitions → airbyte_cdk-6.38.0/airbyte_cdk/sources/streams/concurrent}/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/concurrent/abstract_stream.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/concurrent/abstract_stream_facade.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/concurrent/adapters.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/concurrent/availability_strategy.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/concurrent/clamping.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/concurrent/cursor.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/concurrent/cursor_types.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/concurrent/default_stream.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/concurrent/exceptions.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/concurrent/helpers.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/concurrent/partition_enqueuer.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/concurrent/partition_reader.py +0 -0
- {airbyte_cdk-6.37.2.dev1/airbyte_cdk/sources/streams/utils → airbyte_cdk-6.38.0/airbyte_cdk/sources/streams/concurrent/partitions}/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/concurrent/partitions/partition.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/concurrent/partitions/partition_generator.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/concurrent/partitions/stream_slicer.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/concurrent/partitions/types.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/concurrent/state_converters/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/concurrent/state_converters/datetime_stream_state_converter.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/core.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/http/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/http/availability_strategy.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/http/error_handlers/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/http/error_handlers/backoff_strategy.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/http/error_handlers/default_backoff_strategy.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/http/error_handlers/error_handler.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/http/error_handlers/error_message_parser.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/http/error_handlers/http_status_error_handler.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/http/error_handlers/json_error_message_parser.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/http/error_handlers/response_models.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/http/exceptions.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/http/http.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/http/http_client.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/http/rate_limiting.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/http/requests_native_auth/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/http/requests_native_auth/abstract_oauth.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/http/requests_native_auth/abstract_token.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/http/requests_native_auth/oauth.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/http/requests_native_auth/token.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/streams/permissions/identities_stream.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/utils/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/utils/casing.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/utils/record_helper.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/utils/schema_helpers.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/utils/slice_logger.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/utils/transform.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sources/utils/types.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sql/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sql/_util/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sql/_util/hashing.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sql/_util/name_normalizers.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sql/constants.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sql/exceptions.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sql/secrets.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sql/shared/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sql/shared/catalog_providers.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sql/shared/sql_processor.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/sql/types.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/test/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/test/catalog_builder.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/test/entrypoint_wrapper.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/test/mock_http/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/test/mock_http/matcher.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/test/mock_http/mocker.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/test/mock_http/request.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/test/mock_http/response.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/test/mock_http/response_builder.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/test/state_builder.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/test/utils/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/test/utils/data.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/test/utils/http_mocking.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/test/utils/manifest_only_fixtures.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/test/utils/reading.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/utils/__init__.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/utils/airbyte_secrets_utils.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/utils/analytics_message.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/utils/constants.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/utils/datetime_format_inferrer.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/utils/datetime_helpers.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/utils/event_timing.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/utils/is_cloud_environment.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/utils/message_utils.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/utils/oneof_option_config.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/utils/print_buffer.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/utils/schema_inferrer.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/utils/slice_hasher.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/utils/spec_schema_transformations.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/utils/stream_status_utils.py +0 -0
- {airbyte_cdk-6.37.2.dev1 → airbyte_cdk-6.38.0}/airbyte_cdk/utils/traced_exception.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: airbyte-cdk
|
3
|
-
Version: 6.
|
3
|
+
Version: 6.38.0
|
4
4
|
Summary: A framework for writing Airbyte Connectors.
|
5
5
|
Home-page: https://airbyte.com
|
6
6
|
License: MIT
|
@@ -22,13 +22,13 @@ Provides-Extra: sql
|
|
22
22
|
Provides-Extra: vector-db-based
|
23
23
|
Requires-Dist: Jinja2 (>=3.1.2,<3.2.0)
|
24
24
|
Requires-Dist: PyYAML (>=6.0.1,<7.0.0)
|
25
|
-
Requires-Dist: Unidecode (>=1.3,<2.0)
|
26
25
|
Requires-Dist: airbyte-protocol-models-dataclasses (>=0.14,<0.15)
|
26
|
+
Requires-Dist: anyascii (>=0.3.2,<0.4.0)
|
27
27
|
Requires-Dist: avro (>=1.11.2,<1.13.0) ; extra == "file-based"
|
28
28
|
Requires-Dist: backoff
|
29
29
|
Requires-Dist: cachetools
|
30
30
|
Requires-Dist: cohere (==4.21) ; extra == "vector-db-based"
|
31
|
-
Requires-Dist: cryptography (>=
|
31
|
+
Requires-Dist: cryptography (>=44.0.0,<45.0.0)
|
32
32
|
Requires-Dist: dpath (>=2.1.6,<3.0.0)
|
33
33
|
Requires-Dist: dunamai (>=1.22.0,<2.0.0)
|
34
34
|
Requires-Dist: fastavro (>=1.8.0,<1.9.0) ; extra == "file-based"
|
@@ -47,7 +47,7 @@ Requires-Dist: pandas (==2.2.2)
|
|
47
47
|
Requires-Dist: pdf2image (==1.16.3) ; extra == "file-based"
|
48
48
|
Requires-Dist: pdfminer.six (==20221105) ; extra == "file-based"
|
49
49
|
Requires-Dist: psutil (==6.1.0)
|
50
|
-
Requires-Dist: pyarrow (>=
|
50
|
+
Requires-Dist: pyarrow (>=19.0.0,<20.0.0) ; extra == "file-based"
|
51
51
|
Requires-Dist: pydantic (>=2.7,<3.0)
|
52
52
|
Requires-Dist: pyjwt (>=2.8.0,<3.0.0)
|
53
53
|
Requires-Dist: pyrate-limiter (>=3.1.0,<3.2.0)
|
@@ -31,6 +31,9 @@ from airbyte_cdk.sources.declarative.models.declarative_component_schema import
|
|
31
31
|
from airbyte_cdk.sources.declarative.models.declarative_component_schema import (
|
32
32
|
DatetimeBasedCursor as DatetimeBasedCursorModel,
|
33
33
|
)
|
34
|
+
from airbyte_cdk.sources.declarative.models.declarative_component_schema import (
|
35
|
+
IncrementingCountCursor as IncrementingCountCursorModel,
|
36
|
+
)
|
34
37
|
from airbyte_cdk.sources.declarative.parsers.model_to_component_factory import (
|
35
38
|
ModelToComponentFactory,
|
36
39
|
)
|
@@ -222,7 +225,7 @@ class ConcurrentDeclarativeSource(ManifestDeclarativeSource, Generic[TState]):
|
|
222
225
|
and not incremental_sync_component_definition
|
223
226
|
)
|
224
227
|
|
225
|
-
if self.
|
228
|
+
if self._is_concurrent_cursor_incremental_without_partition_routing(
|
226
229
|
declarative_stream, incremental_sync_component_definition
|
227
230
|
):
|
228
231
|
stream_state = self._connector_state_manager.get_stream_state(
|
@@ -254,15 +257,26 @@ class ConcurrentDeclarativeSource(ManifestDeclarativeSource, Generic[TState]):
|
|
254
257
|
stream_slicer=declarative_stream.retriever.stream_slicer,
|
255
258
|
)
|
256
259
|
else:
|
257
|
-
|
258
|
-
|
260
|
+
if (
|
261
|
+
incremental_sync_component_definition
|
262
|
+
and incremental_sync_component_definition.get("type")
|
263
|
+
== IncrementingCountCursorModel.__name__
|
264
|
+
):
|
265
|
+
cursor = self._constructor.create_concurrent_cursor_from_incrementing_count_cursor(
|
266
|
+
model_type=IncrementingCountCursorModel,
|
267
|
+
component_definition=incremental_sync_component_definition, # type: ignore # Not None because of the if condition above
|
268
|
+
stream_name=declarative_stream.name,
|
269
|
+
stream_namespace=declarative_stream.namespace,
|
270
|
+
config=config or {},
|
271
|
+
)
|
272
|
+
else:
|
273
|
+
cursor = self._constructor.create_concurrent_cursor_from_datetime_based_cursor(
|
259
274
|
model_type=DatetimeBasedCursorModel,
|
260
275
|
component_definition=incremental_sync_component_definition, # type: ignore # Not None because of the if condition above
|
261
276
|
stream_name=declarative_stream.name,
|
262
277
|
stream_namespace=declarative_stream.namespace,
|
263
278
|
config=config or {},
|
264
279
|
)
|
265
|
-
)
|
266
280
|
partition_generator = StreamSlicerPartitionGenerator(
|
267
281
|
partition_factory=DeclarativePartitionFactory(
|
268
282
|
declarative_stream.name,
|
@@ -389,7 +403,7 @@ class ConcurrentDeclarativeSource(ManifestDeclarativeSource, Generic[TState]):
|
|
389
403
|
|
390
404
|
return concurrent_streams, synchronous_streams
|
391
405
|
|
392
|
-
def
|
406
|
+
def _is_concurrent_cursor_incremental_without_partition_routing(
|
393
407
|
self,
|
394
408
|
declarative_stream: DeclarativeStream,
|
395
409
|
incremental_sync_component_definition: Mapping[str, Any] | None,
|
@@ -397,11 +411,18 @@ class ConcurrentDeclarativeSource(ManifestDeclarativeSource, Generic[TState]):
|
|
397
411
|
return (
|
398
412
|
incremental_sync_component_definition is not None
|
399
413
|
and bool(incremental_sync_component_definition)
|
400
|
-
and
|
401
|
-
|
414
|
+
and (
|
415
|
+
incremental_sync_component_definition.get("type", "")
|
416
|
+
in (DatetimeBasedCursorModel.__name__, IncrementingCountCursorModel.__name__)
|
417
|
+
)
|
402
418
|
and hasattr(declarative_stream.retriever, "stream_slicer")
|
403
419
|
and (
|
404
420
|
isinstance(declarative_stream.retriever.stream_slicer, DatetimeBasedCursor)
|
421
|
+
# IncrementingCountCursorModel is hardcoded to be of type DatetimeBasedCursor
|
422
|
+
# add isintance check here if we want to create a Declarative IncrementingCountCursor
|
423
|
+
# or isinstance(
|
424
|
+
# declarative_stream.retriever.stream_slicer, IncrementingCountCursor
|
425
|
+
# )
|
405
426
|
or isinstance(declarative_stream.retriever.stream_slicer, AsyncJobPartitionRouter)
|
406
427
|
)
|
407
428
|
)
|
@@ -29,9 +29,12 @@ class DatetimeParser:
|
|
29
29
|
return datetime.datetime.fromtimestamp(int(date), tz=datetime.timezone.utc)
|
30
30
|
elif format == "%s_as_float":
|
31
31
|
return datetime.datetime.fromtimestamp(float(date), tz=datetime.timezone.utc)
|
32
|
+
elif format == "%epoch_microseconds":
|
33
|
+
return self._UNIX_EPOCH + datetime.timedelta(microseconds=int(date))
|
32
34
|
elif format == "%ms":
|
33
35
|
return self._UNIX_EPOCH + datetime.timedelta(milliseconds=int(date))
|
34
|
-
|
36
|
+
elif "%_ms" in format:
|
37
|
+
format = format.replace("%_ms", "%f")
|
35
38
|
parsed_datetime = datetime.datetime.strptime(str(date), format)
|
36
39
|
if self._is_naive(parsed_datetime):
|
37
40
|
return parsed_datetime.replace(tzinfo=datetime.timezone.utc)
|
@@ -45,9 +48,16 @@ class DatetimeParser:
|
|
45
48
|
return str(int(dt.timestamp()))
|
46
49
|
if format == "%s_as_float":
|
47
50
|
return str(float(dt.timestamp()))
|
51
|
+
if format == "%epoch_microseconds":
|
52
|
+
return str(int(dt.timestamp() * 1_000_000))
|
48
53
|
if format == "%ms":
|
49
54
|
# timstamp() returns a float representing the number of seconds since the unix epoch
|
50
55
|
return str(int(dt.timestamp() * 1000))
|
56
|
+
if "%_ms" in format:
|
57
|
+
_format = format.replace("%_ms", "%f")
|
58
|
+
milliseconds = int(dt.microsecond / 1000)
|
59
|
+
formatted_dt = dt.strftime(_format).replace(dt.strftime("%f"), "%03d" % milliseconds)
|
60
|
+
return formatted_dt
|
51
61
|
else:
|
52
62
|
return dt.strftime(format)
|
53
63
|
|
@@ -777,6 +777,44 @@ definitions:
|
|
777
777
|
type:
|
778
778
|
type: string
|
779
779
|
enum: [LegacyToPerPartitionStateMigration]
|
780
|
+
IncrementingCountCursor:
|
781
|
+
title: Incrementing Count Cursor
|
782
|
+
description: Cursor that allows for incremental sync according to a continuously increasing integer.
|
783
|
+
type: object
|
784
|
+
required:
|
785
|
+
- type
|
786
|
+
- cursor_field
|
787
|
+
properties:
|
788
|
+
type:
|
789
|
+
type: string
|
790
|
+
enum: [IncrementingCountCursor]
|
791
|
+
cursor_field:
|
792
|
+
title: Cursor Field
|
793
|
+
description: The location of the value on a record that will be used as a bookmark during sync. To ensure no data loss, the API must return records in ascending order based on the cursor field. Nested fields are not supported, so the field must be at the top level of the record. You can use a combination of Add Field and Remove Field transformations to move the nested field to the top.
|
794
|
+
type: string
|
795
|
+
interpolation_context:
|
796
|
+
- config
|
797
|
+
examples:
|
798
|
+
- "created_at"
|
799
|
+
- "{{ config['record_cursor'] }}"
|
800
|
+
start_value:
|
801
|
+
title: Start Value
|
802
|
+
description: The value that determines the earliest record that should be synced.
|
803
|
+
anyOf:
|
804
|
+
- type: string
|
805
|
+
- type: integer
|
806
|
+
interpolation_context:
|
807
|
+
- config
|
808
|
+
examples:
|
809
|
+
- 0
|
810
|
+
- "{{ config['start_value'] }}"
|
811
|
+
start_value_option:
|
812
|
+
title: Inject Start Value Into Outgoing HTTP Request
|
813
|
+
description: Optionally configures how the start value will be sent in requests to the source API.
|
814
|
+
"$ref": "#/definitions/RequestOption"
|
815
|
+
$parameters:
|
816
|
+
type: object
|
817
|
+
additionalProperties: true
|
780
818
|
DatetimeBasedCursor:
|
781
819
|
title: Datetime Based Cursor
|
782
820
|
description: Cursor to provide incremental capabilities over datetime.
|
@@ -844,6 +882,7 @@ definitions:
|
|
844
882
|
* **%M**: Minute (zero-padded) - `00`, `01`, ..., `59`
|
845
883
|
* **%S**: Second (zero-padded) - `00`, `01`, ..., `59`
|
846
884
|
* **%f**: Microsecond (zero-padded to 6 digits) - `000000`
|
885
|
+
* **%_ms**: Millisecond (zero-padded to 3 digits) - `000`
|
847
886
|
* **%z**: UTC offset - `(empty)`, `+0000`, `-04:00`
|
848
887
|
* **%Z**: Time zone name - `(empty)`, `UTC`, `GMT`
|
849
888
|
* **%j**: Day of the year (zero-padded) - `001`, `002`, ..., `366`
|
@@ -1318,6 +1357,7 @@ definitions:
|
|
1318
1357
|
anyOf:
|
1319
1358
|
- "$ref": "#/definitions/CustomIncrementalSync"
|
1320
1359
|
- "$ref": "#/definitions/DatetimeBasedCursor"
|
1360
|
+
- "$ref": "#/definitions/IncrementingCountCursor"
|
1321
1361
|
name:
|
1322
1362
|
title: Name
|
1323
1363
|
description: The stream name.
|
@@ -1754,7 +1794,6 @@ definitions:
|
|
1754
1794
|
type: object
|
1755
1795
|
required:
|
1756
1796
|
- type
|
1757
|
-
- path
|
1758
1797
|
- url_base
|
1759
1798
|
properties:
|
1760
1799
|
type:
|
@@ -1766,9 +1805,18 @@ definitions:
|
|
1766
1805
|
type: string
|
1767
1806
|
interpolation_context:
|
1768
1807
|
- config
|
1808
|
+
- next_page_token
|
1809
|
+
- stream_interval
|
1810
|
+
- stream_partition
|
1811
|
+
- stream_slice
|
1812
|
+
- creation_response
|
1813
|
+
- polling_response
|
1814
|
+
- download_target
|
1769
1815
|
examples:
|
1770
1816
|
- "https://connect.squareup.com/v2"
|
1771
|
-
- "{{ config['base_url'] or 'https://app.posthog.com'}}/api
|
1817
|
+
- "{{ config['base_url'] or 'https://app.posthog.com'}}/api"
|
1818
|
+
- "https://connect.squareup.com/v2/quotes/{{ stream_partition['id'] }}/quote_line_groups"
|
1819
|
+
- "https://example.com/api/v1/resource/{{ next_page_token['id'] }}"
|
1772
1820
|
path:
|
1773
1821
|
title: URL Path
|
1774
1822
|
description: Path the specific API endpoint that this stream represents. Do not put sensitive information (e.g. API tokens) into this field - Use the Authentication component for this.
|
@@ -1779,6 +1827,9 @@ definitions:
|
|
1779
1827
|
- stream_interval
|
1780
1828
|
- stream_partition
|
1781
1829
|
- stream_slice
|
1830
|
+
- creation_response
|
1831
|
+
- polling_response
|
1832
|
+
- download_target
|
1782
1833
|
examples:
|
1783
1834
|
- "/products"
|
1784
1835
|
- "/quotes/{{ stream_partition['id'] }}/quote_line_groups"
|
@@ -2398,6 +2449,7 @@ definitions:
|
|
2398
2449
|
* **%M**: Minute (zero-padded) - `00`, `01`, ..., `59`
|
2399
2450
|
* **%S**: Second (zero-padded) - `00`, `01`, ..., `59`
|
2400
2451
|
* **%f**: Microsecond (zero-padded to 6 digits) - `000000`, `000001`, ..., `999999`
|
2452
|
+
* **%_ms**: Millisecond (zero-padded to 3 digits) - `000`, `001`, ..., `999`
|
2401
2453
|
* **%z**: UTC offset - `(empty)`, `+0000`, `-04:00`
|
2402
2454
|
* **%Z**: Time zone name - `(empty)`, `UTC`, `GMT`
|
2403
2455
|
* **%j**: Day of the year (zero-padded) - `001`, `002`, ..., `366`
|
@@ -3223,7 +3275,7 @@ definitions:
|
|
3223
3275
|
- polling_requester
|
3224
3276
|
- download_requester
|
3225
3277
|
- status_extractor
|
3226
|
-
-
|
3278
|
+
- download_target_extractor
|
3227
3279
|
properties:
|
3228
3280
|
type:
|
3229
3281
|
type: string
|
@@ -3240,7 +3292,7 @@ definitions:
|
|
3240
3292
|
anyOf:
|
3241
3293
|
- "$ref": "#/definitions/CustomRecordExtractor"
|
3242
3294
|
- "$ref": "#/definitions/DpathExtractor"
|
3243
|
-
|
3295
|
+
download_target_extractor:
|
3244
3296
|
description: Responsible for fetching the final result `urls` provided by the completed / finished / ready async job.
|
3245
3297
|
anyOf:
|
3246
3298
|
- "$ref": "#/definitions/CustomRecordExtractor"
|
@@ -3261,7 +3313,7 @@ definitions:
|
|
3261
3313
|
anyOf:
|
3262
3314
|
- "$ref": "#/definitions/CustomRequester"
|
3263
3315
|
- "$ref": "#/definitions/HttpRequester"
|
3264
|
-
|
3316
|
+
download_target_requester:
|
3265
3317
|
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.
|
3266
3318
|
anyOf:
|
3267
3319
|
- "$ref": "#/definitions/CustomRequester"
|
@@ -3667,6 +3719,21 @@ interpolation:
|
|
3667
3719
|
self: https://api.sendgrid.com/v3/marketing/lists?page_size=1&page_token=
|
3668
3720
|
next: https://api.sendgrid.com/v3/marketing/lists?page_size=1&page_token=0236d6d2
|
3669
3721
|
count: 82
|
3722
|
+
- title: creation_response
|
3723
|
+
description: The response received from the creation_requester in the AsyncRetriever component.
|
3724
|
+
type: object
|
3725
|
+
examples:
|
3726
|
+
- id: "1234"
|
3727
|
+
- title: polling_response
|
3728
|
+
description: The response received from the polling_requester in the AsyncRetriever component.
|
3729
|
+
type: object
|
3730
|
+
examples:
|
3731
|
+
- id: "1234"
|
3732
|
+
- title: download_target
|
3733
|
+
description: The `URL` received from the polling_requester in the AsyncRetriever with jobStatus as `COMPLETED`.
|
3734
|
+
type: string
|
3735
|
+
examples:
|
3736
|
+
- "https://api.sendgrid.com/v3/marketing/lists?page_size=1&page_token=0236d6d2&filename=xxx_yyy_zzz.csv"
|
3670
3737
|
- title: stream_interval
|
3671
3738
|
description: The current stream interval being processed. The keys are defined by the incremental sync component. Default keys are `start_time` and `end_time`.
|
3672
3739
|
type: object
|
@@ -5,7 +5,7 @@ import json
|
|
5
5
|
import logging
|
6
6
|
from abc import ABC, abstractmethod
|
7
7
|
from dataclasses import dataclass
|
8
|
-
from io import BufferedIOBase,
|
8
|
+
from io import BufferedIOBase, TextIOWrapper
|
9
9
|
from typing import Any, Generator, MutableMapping, Optional
|
10
10
|
|
11
11
|
import orjson
|
@@ -124,8 +124,7 @@ class CsvParser(Parser):
|
|
124
124
|
"""
|
125
125
|
Parse CSV data from decompressed bytes.
|
126
126
|
"""
|
127
|
-
|
128
|
-
text_data = TextIOWrapper(bytes_data, encoding=self.encoding) # type: ignore
|
127
|
+
text_data = TextIOWrapper(data, encoding=self.encoding) # type: ignore
|
129
128
|
reader = csv.DictReader(text_data, delimiter=self._get_delimiter() or ",")
|
130
129
|
for row in reader:
|
131
130
|
yield row
|
@@ -12,6 +12,8 @@ import pytz
|
|
12
12
|
from dateutil import parser
|
13
13
|
from isodate import parse_duration
|
14
14
|
|
15
|
+
from airbyte_cdk.sources.declarative.datetime.datetime_parser import DatetimeParser
|
16
|
+
|
15
17
|
"""
|
16
18
|
This file contains macros that can be evaluated by a `JinjaInterpolation` object
|
17
19
|
"""
|
@@ -171,9 +173,7 @@ def format_datetime(
|
|
171
173
|
dt_datetime = (
|
172
174
|
datetime.datetime.strptime(dt, input_format) if input_format else str_to_datetime(dt)
|
173
175
|
)
|
174
|
-
|
175
|
-
return str(int(dt_datetime.timestamp()))
|
176
|
-
return dt_datetime.strftime(format)
|
176
|
+
return DatetimeParser().format(dt=dt_datetime, format=format)
|
177
177
|
|
178
178
|
|
179
179
|
_macros_list = [
|
@@ -939,7 +939,7 @@ class MinMaxDatetime(BaseModel):
|
|
939
939
|
)
|
940
940
|
datetime_format: Optional[str] = Field(
|
941
941
|
"",
|
942
|
-
description='Format of the datetime value. Defaults to "%Y-%m-%dT%H:%M:%S.%f%z" if left empty. Use placeholders starting with "%" to describe the format the API is using. The following placeholders are available:\n * **%s**: Epoch unix timestamp - `1686218963`\n * **%s_as_float**: Epoch unix timestamp in seconds as float with microsecond precision - `1686218963.123456`\n * **%ms**: Epoch unix timestamp - `1686218963123`\n * **%a**: Weekday (abbreviated) - `Sun`\n * **%A**: Weekday (full) - `Sunday`\n * **%w**: Weekday (decimal) - `0` (Sunday), `6` (Saturday)\n * **%d**: Day of the month (zero-padded) - `01`, `02`, ..., `31`\n * **%b**: Month (abbreviated) - `Jan`\n * **%B**: Month (full) - `January`\n * **%m**: Month (zero-padded) - `01`, `02`, ..., `12`\n * **%y**: Year (without century, zero-padded) - `00`, `01`, ..., `99`\n * **%Y**: Year (with century) - `0001`, `0002`, ..., `9999`\n * **%H**: Hour (24-hour, zero-padded) - `00`, `01`, ..., `23`\n * **%I**: Hour (12-hour, zero-padded) - `01`, `02`, ..., `12`\n * **%p**: AM/PM indicator\n * **%M**: Minute (zero-padded) - `00`, `01`, ..., `59`\n * **%S**: Second (zero-padded) - `00`, `01`, ..., `59`\n * **%f**: Microsecond (zero-padded to 6 digits) - `000000`, `000001`, ..., `999999`\n * **%z**: UTC offset - `(empty)`, `+0000`, `-04:00`\n * **%Z**: Time zone name - `(empty)`, `UTC`, `GMT`\n * **%j**: Day of the year (zero-padded) - `001`, `002`, ..., `366`\n * **%U**: Week number of the year (Sunday as first day) - `00`, `01`, ..., `53`\n * **%W**: Week number of the year (Monday as first day) - `00`, `01`, ..., `53`\n * **%c**: Date and time representation - `Tue Aug 16 21:30:00 1988`\n * **%x**: Date representation - `08/16/1988`\n * **%X**: Time representation - `21:30:00`\n * **%%**: Literal \'%\' character\n\n Some placeholders depend on the locale of the underlying system - in most cases this locale is configured as en/US. For more information see the [Python documentation](https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes).\n',
|
942
|
+
description='Format of the datetime value. Defaults to "%Y-%m-%dT%H:%M:%S.%f%z" if left empty. Use placeholders starting with "%" to describe the format the API is using. The following placeholders are available:\n * **%s**: Epoch unix timestamp - `1686218963`\n * **%s_as_float**: Epoch unix timestamp in seconds as float with microsecond precision - `1686218963.123456`\n * **%ms**: Epoch unix timestamp - `1686218963123`\n * **%a**: Weekday (abbreviated) - `Sun`\n * **%A**: Weekday (full) - `Sunday`\n * **%w**: Weekday (decimal) - `0` (Sunday), `6` (Saturday)\n * **%d**: Day of the month (zero-padded) - `01`, `02`, ..., `31`\n * **%b**: Month (abbreviated) - `Jan`\n * **%B**: Month (full) - `January`\n * **%m**: Month (zero-padded) - `01`, `02`, ..., `12`\n * **%y**: Year (without century, zero-padded) - `00`, `01`, ..., `99`\n * **%Y**: Year (with century) - `0001`, `0002`, ..., `9999`\n * **%H**: Hour (24-hour, zero-padded) - `00`, `01`, ..., `23`\n * **%I**: Hour (12-hour, zero-padded) - `01`, `02`, ..., `12`\n * **%p**: AM/PM indicator\n * **%M**: Minute (zero-padded) - `00`, `01`, ..., `59`\n * **%S**: Second (zero-padded) - `00`, `01`, ..., `59`\n * **%f**: Microsecond (zero-padded to 6 digits) - `000000`, `000001`, ..., `999999`\n * **%_ms**: Millisecond (zero-padded to 3 digits) - `000`, `001`, ..., `999`\n * **%z**: UTC offset - `(empty)`, `+0000`, `-04:00`\n * **%Z**: Time zone name - `(empty)`, `UTC`, `GMT`\n * **%j**: Day of the year (zero-padded) - `001`, `002`, ..., `366`\n * **%U**: Week number of the year (Sunday as first day) - `00`, `01`, ..., `53`\n * **%W**: Week number of the year (Monday as first day) - `00`, `01`, ..., `53`\n * **%c**: Date and time representation - `Tue Aug 16 21:30:00 1988`\n * **%x**: Date representation - `08/16/1988`\n * **%X**: Time representation - `21:30:00`\n * **%%**: Literal \'%\' character\n\n Some placeholders depend on the locale of the underlying system - in most cases this locale is configured as en/US. For more information see the [Python documentation](https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes).\n',
|
943
943
|
examples=["%Y-%m-%dT%H:%M:%S.%f%z", "%Y-%m-%d", "%s"],
|
944
944
|
title="Datetime Format",
|
945
945
|
)
|
@@ -1508,6 +1508,28 @@ class AuthFlow(BaseModel):
|
|
1508
1508
|
oauth_config_specification: Optional[OAuthConfigSpecification] = None
|
1509
1509
|
|
1510
1510
|
|
1511
|
+
class IncrementingCountCursor(BaseModel):
|
1512
|
+
type: Literal["IncrementingCountCursor"]
|
1513
|
+
cursor_field: str = Field(
|
1514
|
+
...,
|
1515
|
+
description="The location of the value on a record that will be used as a bookmark during sync. To ensure no data loss, the API must return records in ascending order based on the cursor field. Nested fields are not supported, so the field must be at the top level of the record. You can use a combination of Add Field and Remove Field transformations to move the nested field to the top.",
|
1516
|
+
examples=["created_at", "{{ config['record_cursor'] }}"],
|
1517
|
+
title="Cursor Field",
|
1518
|
+
)
|
1519
|
+
start_value: Optional[Union[str, int]] = Field(
|
1520
|
+
None,
|
1521
|
+
description="The value that determines the earliest record that should be synced.",
|
1522
|
+
examples=[0, "{{ config['start_value'] }}"],
|
1523
|
+
title="Start Value",
|
1524
|
+
)
|
1525
|
+
start_value_option: Optional[RequestOption] = Field(
|
1526
|
+
None,
|
1527
|
+
description="Optionally configures how the start value will be sent in requests to the source API.",
|
1528
|
+
title="Inject Start Value Into Outgoing HTTP Request",
|
1529
|
+
)
|
1530
|
+
parameters: Optional[Dict[str, Any]] = Field(None, alias="$parameters")
|
1531
|
+
|
1532
|
+
|
1511
1533
|
class DatetimeBasedCursor(BaseModel):
|
1512
1534
|
type: Literal["DatetimeBasedCursor"]
|
1513
1535
|
clamping: Optional[Clamping] = Field(
|
@@ -1523,7 +1545,7 @@ class DatetimeBasedCursor(BaseModel):
|
|
1523
1545
|
)
|
1524
1546
|
datetime_format: str = Field(
|
1525
1547
|
...,
|
1526
|
-
description="The datetime format used to format the datetime values that are sent in outgoing requests to the API. Use placeholders starting with \"%\" to describe the format the API is using. The following placeholders are available:\n * **%s**: Epoch unix timestamp - `1686218963`\n * **%s_as_float**: Epoch unix timestamp in seconds as float with microsecond precision - `1686218963.123456`\n * **%ms**: Epoch unix timestamp (milliseconds) - `1686218963123`\n * **%a**: Weekday (abbreviated) - `Sun`\n * **%A**: Weekday (full) - `Sunday`\n * **%w**: Weekday (decimal) - `0` (Sunday), `6` (Saturday)\n * **%d**: Day of the month (zero-padded) - `01`, `02`, ..., `31`\n * **%b**: Month (abbreviated) - `Jan`\n * **%B**: Month (full) - `January`\n * **%m**: Month (zero-padded) - `01`, `02`, ..., `12`\n * **%y**: Year (without century, zero-padded) - `00`, `01`, ..., `99`\n * **%Y**: Year (with century) - `0001`, `0002`, ..., `9999`\n * **%H**: Hour (24-hour, zero-padded) - `00`, `01`, ..., `23`\n * **%I**: Hour (12-hour, zero-padded) - `01`, `02`, ..., `12`\n * **%p**: AM/PM indicator\n * **%M**: Minute (zero-padded) - `00`, `01`, ..., `59`\n * **%S**: Second (zero-padded) - `00`, `01`, ..., `59`\n * **%f**: Microsecond (zero-padded to 6 digits) - `000000`\n * **%z**: UTC offset - `(empty)`, `+0000`, `-04:00`\n * **%Z**: Time zone name - `(empty)`, `UTC`, `GMT`\n * **%j**: Day of the year (zero-padded) - `001`, `002`, ..., `366`\n * **%U**: Week number of the year (starting Sunday) - `00`, ..., `53`\n * **%W**: Week number of the year (starting Monday) - `00`, ..., `53`\n * **%c**: Date and time - `Tue Aug 16 21:30:00 1988`\n * **%x**: Date standard format - `08/16/1988`\n * **%X**: Time standard format - `21:30:00`\n * **%%**: Literal '%' character\n\n Some placeholders depend on the locale of the underlying system - in most cases this locale is configured as en/US. For more information see the [Python documentation](https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes).\n",
|
1548
|
+
description="The datetime format used to format the datetime values that are sent in outgoing requests to the API. Use placeholders starting with \"%\" to describe the format the API is using. The following placeholders are available:\n * **%s**: Epoch unix timestamp - `1686218963`\n * **%s_as_float**: Epoch unix timestamp in seconds as float with microsecond precision - `1686218963.123456`\n * **%ms**: Epoch unix timestamp (milliseconds) - `1686218963123`\n * **%a**: Weekday (abbreviated) - `Sun`\n * **%A**: Weekday (full) - `Sunday`\n * **%w**: Weekday (decimal) - `0` (Sunday), `6` (Saturday)\n * **%d**: Day of the month (zero-padded) - `01`, `02`, ..., `31`\n * **%b**: Month (abbreviated) - `Jan`\n * **%B**: Month (full) - `January`\n * **%m**: Month (zero-padded) - `01`, `02`, ..., `12`\n * **%y**: Year (without century, zero-padded) - `00`, `01`, ..., `99`\n * **%Y**: Year (with century) - `0001`, `0002`, ..., `9999`\n * **%H**: Hour (24-hour, zero-padded) - `00`, `01`, ..., `23`\n * **%I**: Hour (12-hour, zero-padded) - `01`, `02`, ..., `12`\n * **%p**: AM/PM indicator\n * **%M**: Minute (zero-padded) - `00`, `01`, ..., `59`\n * **%S**: Second (zero-padded) - `00`, `01`, ..., `59`\n * **%f**: Microsecond (zero-padded to 6 digits) - `000000`\n * **%_ms**: Millisecond (zero-padded to 3 digits) - `000`\n * **%z**: UTC offset - `(empty)`, `+0000`, `-04:00`\n * **%Z**: Time zone name - `(empty)`, `UTC`, `GMT`\n * **%j**: Day of the year (zero-padded) - `001`, `002`, ..., `366`\n * **%U**: Week number of the year (starting Sunday) - `00`, ..., `53`\n * **%W**: Week number of the year (starting Monday) - `00`, ..., `53`\n * **%c**: Date and time - `Tue Aug 16 21:30:00 1988`\n * **%x**: Date standard format - `08/16/1988`\n * **%X**: Time standard format - `21:30:00`\n * **%%**: Literal '%' character\n\n Some placeholders depend on the locale of the underlying system - in most cases this locale is configured as en/US. For more information see the [Python documentation](https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes).\n",
|
1527
1549
|
examples=["%Y-%m-%dT%H:%M:%S.%f%z", "%Y-%m-%d", "%s", "%ms", "%s_as_float"],
|
1528
1550
|
title="Outgoing Datetime Format",
|
1529
1551
|
)
|
@@ -1948,7 +1970,9 @@ class DeclarativeStream(BaseModel):
|
|
1948
1970
|
description="Component used to coordinate how records are extracted across stream slices and request pages.",
|
1949
1971
|
title="Retriever",
|
1950
1972
|
)
|
1951
|
-
incremental_sync: Optional[
|
1973
|
+
incremental_sync: Optional[
|
1974
|
+
Union[CustomIncrementalSync, DatetimeBasedCursor, IncrementingCountCursor]
|
1975
|
+
] = Field(
|
1952
1976
|
None,
|
1953
1977
|
description="Component used to fetch data incrementally based on a time field in the data.",
|
1954
1978
|
title="Incremental Sync",
|
@@ -2048,12 +2072,14 @@ class HttpRequester(BaseModel):
|
|
2048
2072
|
description="Base URL of the API source. Do not put sensitive information (e.g. API tokens) into this field - Use the Authentication component for this.",
|
2049
2073
|
examples=[
|
2050
2074
|
"https://connect.squareup.com/v2",
|
2051
|
-
"{{ config['base_url'] or 'https://app.posthog.com'}}/api
|
2075
|
+
"{{ config['base_url'] or 'https://app.posthog.com'}}/api",
|
2076
|
+
"https://connect.squareup.com/v2/quotes/{{ stream_partition['id'] }}/quote_line_groups",
|
2077
|
+
"https://example.com/api/v1/resource/{{ next_page_token['id'] }}",
|
2052
2078
|
],
|
2053
2079
|
title="API Base URL",
|
2054
2080
|
)
|
2055
|
-
path: str = Field(
|
2056
|
-
|
2081
|
+
path: Optional[str] = Field(
|
2082
|
+
None,
|
2057
2083
|
description="Path the specific API endpoint that this stream represents. Do not put sensitive information (e.g. API tokens) into this field - Use the Authentication component for this.",
|
2058
2084
|
examples=[
|
2059
2085
|
"/products",
|
@@ -2263,7 +2289,7 @@ class AsyncRetriever(BaseModel):
|
|
2263
2289
|
status_extractor: Union[CustomRecordExtractor, DpathExtractor] = Field(
|
2264
2290
|
..., description="Responsible for fetching the actual status of the async job."
|
2265
2291
|
)
|
2266
|
-
|
2292
|
+
download_target_extractor: Union[CustomRecordExtractor, DpathExtractor] = Field(
|
2267
2293
|
...,
|
2268
2294
|
description="Responsible for fetching the final result `urls` provided by the completed / finished / ready async job.",
|
2269
2295
|
)
|
@@ -2278,7 +2304,7 @@ class AsyncRetriever(BaseModel):
|
|
2278
2304
|
...,
|
2279
2305
|
description="Requester component that describes how to prepare HTTP requests to send to the source API to fetch the status of the running async job.",
|
2280
2306
|
)
|
2281
|
-
|
2307
|
+
download_target_requester: Optional[Union[CustomRequester, HttpRequester]] = Field(
|
2282
2308
|
None,
|
2283
2309
|
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.",
|
2284
2310
|
)
|
@@ -45,7 +45,7 @@ class AirbyteCustomCodeNotPermittedError(Exception):
|
|
45
45
|
def _hash_text(input_text: str, hash_type: str = "md5") -> str:
|
46
46
|
"""Return the hash of the input text using the specified hash type."""
|
47
47
|
if not input_text:
|
48
|
-
raise ValueError("
|
48
|
+
raise ValueError("Hash input text cannot be empty.")
|
49
49
|
|
50
50
|
hash_object = CHECKSUM_FUNCTIONS[hash_type]()
|
51
51
|
hash_object.update(input_text.encode())
|
@@ -68,6 +68,10 @@ def validate_python_code(
|
|
68
68
|
|
69
69
|
Currently we fail if no checksums are provided, although this may change in the future.
|
70
70
|
"""
|
71
|
+
if not code_text:
|
72
|
+
# No code provided, nothing to validate.
|
73
|
+
return
|
74
|
+
|
71
75
|
if not checksums:
|
72
76
|
raise ValueError(f"A checksum is required to validate the code. Received: {checksums}")
|
73
77
|
|
@@ -77,8 +81,18 @@ def validate_python_code(
|
|
77
81
|
f"Unsupported checksum type: {checksum_type}. Supported checksum types are: {CHECKSUM_FUNCTIONS.keys()}"
|
78
82
|
)
|
79
83
|
|
80
|
-
|
81
|
-
|
84
|
+
calculated_checksum = _hash_text(code_text, checksum_type)
|
85
|
+
if calculated_checksum != checksum:
|
86
|
+
raise AirbyteCodeTamperedError(
|
87
|
+
f"{checksum_type} checksum does not match."
|
88
|
+
+ str(
|
89
|
+
{
|
90
|
+
"expected_checksum": checksum,
|
91
|
+
"actual_checksum": calculated_checksum,
|
92
|
+
"code_text": code_text,
|
93
|
+
}
|
94
|
+
),
|
95
|
+
)
|
82
96
|
|
83
97
|
|
84
98
|
def get_registered_components_module(
|
@@ -94,7 +108,7 @@ def get_registered_components_module(
|
|
94
108
|
|
95
109
|
Returns `None` if no components is provided and the `components` module is not found.
|
96
110
|
"""
|
97
|
-
if config and INJECTED_COMPONENTS_PY
|
111
|
+
if config and config.get(INJECTED_COMPONENTS_PY, None):
|
98
112
|
if not custom_code_execution_permitted():
|
99
113
|
raise AirbyteCustomCodeNotPermittedError
|
100
114
|
|