airbyte-cdk 6.38.1__tar.gz → 6.38.2__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.38.1 → airbyte_cdk-6.38.2}/PKG-INFO +1 -1
- airbyte_cdk-6.38.2/airbyte_cdk/sources/declarative/decoders/composite_raw_decoder.py +218 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/decoders/decoder.py +3 -3
- airbyte_cdk-6.38.2/airbyte_cdk/sources/declarative/decoders/decoder_parser.py +30 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/decoders/zipfile_decoder.py +6 -9
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/extractors/response_to_file_extractor.py +0 -2
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py +36 -8
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/http_requester.py +33 -7
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/pyproject.toml +1 -1
- airbyte_cdk-6.38.1/airbyte_cdk/sources/declarative/decoders/composite_raw_decoder.py +0 -160
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/LICENSE.txt +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/LICENSE_SHORT +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/README.md +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/cli/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/cli/source_declarative_manifest/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/cli/source_declarative_manifest/_run.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/cli/source_declarative_manifest/spec.json +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/config_observation.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/connector.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/connector_builder/README.md +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/connector_builder/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/connector_builder/connector_builder_handler.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/connector_builder/main.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/connector_builder/models.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/connector_builder/test_reader/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/connector_builder/test_reader/helpers.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/connector_builder/test_reader/message_grouper.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/connector_builder/test_reader/reader.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/connector_builder/test_reader/types.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/destinations/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/destinations/destination.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/destinations/vector_db_based/README.md +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/destinations/vector_db_based/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/destinations/vector_db_based/config.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/destinations/vector_db_based/document_processor.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/destinations/vector_db_based/embedder.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/destinations/vector_db_based/indexer.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/destinations/vector_db_based/test_utils.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/destinations/vector_db_based/utils.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/destinations/vector_db_based/writer.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/entrypoint.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/exception_handler.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/logger.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/models/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/models/airbyte_protocol.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/models/airbyte_protocol_serializers.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/models/file_transfer_record_message.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/models/well_known_types.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/py.typed +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/abstract_source.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/concurrent_source/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/concurrent_source/concurrent_read_processor.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/concurrent_source/concurrent_source.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/concurrent_source/concurrent_source_adapter.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/concurrent_source/partition_generation_completed_sentinel.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/concurrent_source/stream_thread_exception.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/concurrent_source/thread_pool_manager.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/config.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/connector_state_manager.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/async_job/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/async_job/job.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/async_job/job_orchestrator.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/async_job/job_tracker.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/async_job/repository.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/async_job/status.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/async_job/timer.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/auth/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/auth/declarative_authenticator.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/auth/jwt.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/auth/oauth.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/auth/selective_authenticator.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/auth/token.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/auth/token_provider.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/checks/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/checks/check_dynamic_stream.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/checks/check_stream.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/checks/connection_checker.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/concurrency_level/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/concurrency_level/concurrency_level.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/concurrent_declarative_source.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/datetime/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/datetime/datetime_parser.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/datetime/min_max_datetime.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/declarative_component_schema.yaml +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/declarative_source.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/declarative_stream.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/decoders/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/decoders/json_decoder.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/decoders/noop_decoder.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/decoders/pagination_decoder_decorator.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/decoders/xml_decoder.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/exceptions.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/extractors/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/extractors/dpath_extractor.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/extractors/http_selector.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/extractors/record_extractor.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/extractors/record_filter.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/extractors/record_selector.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/extractors/type_transformer.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/incremental/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/incremental/concurrent_partition_cursor.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/incremental/datetime_based_cursor.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/incremental/declarative_cursor.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/incremental/global_substream_cursor.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/incremental/per_partition_cursor.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/incremental/per_partition_with_global.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/incremental/resumable_full_refresh_cursor.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/interpolation/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/interpolation/filters.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/interpolation/interpolated_boolean.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/interpolation/interpolated_mapping.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/interpolation/interpolated_nested_mapping.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/interpolation/interpolated_string.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/interpolation/interpolation.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/interpolation/jinja.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/interpolation/macros.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/manifest_declarative_source.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/migrations/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/migrations/legacy_to_per_partition_state_migration.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/migrations/state_migration.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/models/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/models/declarative_component_schema.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/parsers/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/parsers/custom_code_compiler.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/parsers/custom_exceptions.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/parsers/manifest_component_transformer.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/parsers/manifest_reference_resolver.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/partition_routers/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/partition_routers/async_job_partition_router.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/partition_routers/cartesian_product_stream_slicer.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/partition_routers/list_partition_router.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/partition_routers/partition_router.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/partition_routers/single_partition_router.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/partition_routers/substream_partition_router.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/README.md +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/error_handlers/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/constant_backoff_strategy.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/exponential_backoff_strategy.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/header_helper.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/wait_time_from_header_backoff_strategy.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/wait_until_time_from_header_backoff_strategy.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategy.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/error_handlers/composite_error_handler.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/error_handlers/default_error_handler.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/error_handlers/default_http_response_filter.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/error_handlers/error_handler.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/error_handlers/http_response_filter.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/http_job_repository.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/paginators/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/paginators/default_paginator.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/paginators/no_pagination.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/paginators/paginator.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/cursor_pagination_strategy.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/offset_increment.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/page_increment.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/pagination_strategy.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/stop_condition.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/request_option.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/request_options/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/request_options/datetime_based_request_options_provider.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/request_options/default_request_options_provider.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_nested_request_input_provider.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_input_provider.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_options_provider.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/request_options/request_options_provider.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/request_path.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/requesters/requester.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/resolvers/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/resolvers/components_resolver.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/resolvers/config_components_resolver.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/resolvers/http_components_resolver.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/retrievers/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/retrievers/async_retriever.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/retrievers/retriever.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/retrievers/simple_retriever.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/schema/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/schema/default_schema_loader.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/schema/dynamic_schema_loader.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/schema/inline_schema_loader.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/schema/json_file_schema_loader.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/schema/schema_loader.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/spec/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/spec/spec.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/stream_slicers/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/stream_slicers/declarative_partition_generator.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/stream_slicers/stream_slicer.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/transformations/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/transformations/add_fields.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/transformations/dpath_flatten_fields.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/transformations/flatten_fields.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/transformations/keys_replace_transformation.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/transformations/keys_to_lower_transformation.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/transformations/keys_to_snake_transformation.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/transformations/remove_fields.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/transformations/transformation.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/types.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/yaml_declarative_source.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/README.md +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/availability_strategy/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/availability_strategy/abstract_file_based_availability_strategy.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/availability_strategy/default_file_based_availability_strategy.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/config/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/config/abstract_file_based_spec.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/config/avro_format.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/config/csv_format.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/config/excel_format.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/config/file_based_stream_config.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/config/jsonl_format.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/config/parquet_format.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/config/unstructured_format.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/config/validate_config_transfer_modes.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/discovery_policy/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/discovery_policy/abstract_discovery_policy.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/discovery_policy/default_discovery_policy.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/exceptions.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/file_based_source.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/file_based_stream_reader.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/file_types/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/file_types/avro_parser.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/file_types/csv_parser.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/file_types/excel_parser.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/file_types/file_transfer.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/file_types/file_type_parser.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/file_types/jsonl_parser.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/file_types/parquet_parser.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/file_types/unstructured_parser.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/remote_file.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/schema_helpers.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/schema_validation_policies/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/schema_validation_policies/abstract_schema_validation_policy.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/schema_validation_policies/default_schema_validation_policies.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/stream/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/stream/abstract_file_based_stream.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/stream/concurrent/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/stream/concurrent/adapters.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/stream/concurrent/cursor/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/stream/concurrent/cursor/abstract_concurrent_file_based_cursor.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/stream/concurrent/cursor/file_based_concurrent_cursor.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/stream/concurrent/cursor/file_based_final_state_cursor.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/stream/cursor/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/stream/cursor/abstract_file_based_cursor.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/stream/cursor/default_file_based_cursor.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/stream/default_file_based_stream.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/stream/identities_stream.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/stream/permissions_file_based_stream.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/file_based/types.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/http_config.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/http_logger.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/message/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/message/repository.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/source.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/specs/transfer_modes.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/availability_strategy.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/call_rate.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/checkpoint/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/checkpoint/checkpoint_reader.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/checkpoint/cursor.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/checkpoint/per_partition_key_serializer.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/checkpoint/resumable_full_refresh_cursor.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/checkpoint/substream_resumable_full_refresh_cursor.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/concurrent/README.md +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/concurrent/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/concurrent/abstract_stream.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/concurrent/abstract_stream_facade.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/concurrent/adapters.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/concurrent/availability_strategy.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/concurrent/clamping.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/concurrent/cursor.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/concurrent/cursor_types.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/concurrent/default_stream.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/concurrent/exceptions.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/concurrent/helpers.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/concurrent/partition_enqueuer.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/concurrent/partition_reader.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/concurrent/partitions/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/concurrent/partitions/partition.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/concurrent/partitions/partition_generator.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/concurrent/partitions/stream_slicer.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/concurrent/partitions/types.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/concurrent/state_converters/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/concurrent/state_converters/abstract_stream_state_converter.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/concurrent/state_converters/datetime_stream_state_converter.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/concurrent/state_converters/incrementing_count_stream_state_converter.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/core.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/http/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/http/availability_strategy.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/http/error_handlers/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/http/error_handlers/backoff_strategy.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/http/error_handlers/default_backoff_strategy.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/http/error_handlers/default_error_mapping.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/http/error_handlers/error_handler.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/http/error_handlers/error_message_parser.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/http/error_handlers/http_status_error_handler.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/http/error_handlers/json_error_message_parser.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/http/error_handlers/response_models.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/http/exceptions.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/http/http.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/http/http_client.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/http/rate_limiting.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/http/requests_native_auth/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/http/requests_native_auth/abstract_oauth.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/http/requests_native_auth/abstract_token.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/http/requests_native_auth/oauth.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/http/requests_native_auth/token.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/permissions/identities_stream.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/streams/utils/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/types.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/utils/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/utils/casing.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/utils/record_helper.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/utils/schema_helpers.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/utils/slice_logger.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/utils/transform.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/utils/types.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sql/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sql/_util/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sql/_util/hashing.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sql/_util/name_normalizers.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sql/constants.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sql/exceptions.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sql/secrets.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sql/shared/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sql/shared/catalog_providers.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sql/shared/sql_processor.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sql/types.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/test/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/test/catalog_builder.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/test/entrypoint_wrapper.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/test/mock_http/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/test/mock_http/matcher.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/test/mock_http/mocker.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/test/mock_http/request.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/test/mock_http/response.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/test/mock_http/response_builder.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/test/state_builder.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/test/utils/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/test/utils/data.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/test/utils/http_mocking.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/test/utils/manifest_only_fixtures.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/test/utils/reading.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/utils/__init__.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/utils/airbyte_secrets_utils.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/utils/analytics_message.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/utils/constants.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/utils/datetime_format_inferrer.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/utils/datetime_helpers.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/utils/event_timing.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/utils/is_cloud_environment.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/utils/mapping_helpers.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/utils/message_utils.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/utils/oneof_option_config.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/utils/print_buffer.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/utils/schema_inferrer.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/utils/slice_hasher.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/utils/spec_schema_transformations.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/utils/stream_status_utils.py +0 -0
- {airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/utils/traced_exception.py +0 -0
@@ -0,0 +1,218 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
3
|
+
#
|
4
|
+
|
5
|
+
import csv
|
6
|
+
import gzip
|
7
|
+
import io
|
8
|
+
import json
|
9
|
+
import logging
|
10
|
+
from dataclasses import dataclass
|
11
|
+
from io import BufferedIOBase, TextIOWrapper
|
12
|
+
from typing import Any, Optional
|
13
|
+
|
14
|
+
import orjson
|
15
|
+
import requests
|
16
|
+
|
17
|
+
from airbyte_cdk.models import FailureType
|
18
|
+
from airbyte_cdk.sources.declarative.decoders.decoder import DECODER_OUTPUT_TYPE, Decoder
|
19
|
+
from airbyte_cdk.sources.declarative.decoders.decoder_parser import (
|
20
|
+
PARSER_OUTPUT_TYPE,
|
21
|
+
PARSERS_BY_HEADER_TYPE,
|
22
|
+
PARSERS_TYPE,
|
23
|
+
Parser,
|
24
|
+
)
|
25
|
+
from airbyte_cdk.utils import AirbyteTracedException
|
26
|
+
|
27
|
+
logger = logging.getLogger("airbyte")
|
28
|
+
|
29
|
+
|
30
|
+
@dataclass
|
31
|
+
class GzipParser(Parser):
|
32
|
+
inner_parser: Parser
|
33
|
+
|
34
|
+
def parse(self, data: BufferedIOBase) -> PARSER_OUTPUT_TYPE:
|
35
|
+
"""
|
36
|
+
Decompress gzipped bytes and pass decompressed data to the inner parser.
|
37
|
+
|
38
|
+
IMPORTANT:
|
39
|
+
- If the data is not gzipped, reset the pointer and pass the data to the inner parser as is.
|
40
|
+
|
41
|
+
Note:
|
42
|
+
- The data is not decoded by default.
|
43
|
+
"""
|
44
|
+
|
45
|
+
with gzip.GzipFile(fileobj=data, mode="rb") as gzipobj:
|
46
|
+
yield from self.inner_parser.parse(gzipobj)
|
47
|
+
|
48
|
+
|
49
|
+
@dataclass
|
50
|
+
class JsonParser(Parser):
|
51
|
+
encoding: str = "utf-8"
|
52
|
+
|
53
|
+
def parse(self, data: BufferedIOBase) -> PARSER_OUTPUT_TYPE:
|
54
|
+
"""
|
55
|
+
Attempts to deserialize data using orjson library. As an extra layer of safety we fallback on the json library to deserialize the data.
|
56
|
+
"""
|
57
|
+
raw_data = data.read()
|
58
|
+
body_json = self._parse_orjson(raw_data) or self._parse_json(raw_data)
|
59
|
+
|
60
|
+
if body_json is None:
|
61
|
+
raise AirbyteTracedException(
|
62
|
+
message="Response JSON data failed to be parsed. See logs for more information.",
|
63
|
+
internal_message=f"Response JSON data failed to be parsed.",
|
64
|
+
failure_type=FailureType.system_error,
|
65
|
+
)
|
66
|
+
|
67
|
+
if isinstance(body_json, list):
|
68
|
+
yield from body_json
|
69
|
+
else:
|
70
|
+
yield from [body_json]
|
71
|
+
|
72
|
+
def _parse_orjson(self, raw_data: bytes) -> Optional[Any]:
|
73
|
+
try:
|
74
|
+
return orjson.loads(raw_data.decode(self.encoding))
|
75
|
+
except Exception as exc:
|
76
|
+
logger.debug(
|
77
|
+
f"Failed to parse JSON data using orjson library. Falling back to json library. {exc}"
|
78
|
+
)
|
79
|
+
return None
|
80
|
+
|
81
|
+
def _parse_json(self, raw_data: bytes) -> Optional[Any]:
|
82
|
+
try:
|
83
|
+
return json.loads(raw_data.decode(self.encoding))
|
84
|
+
except Exception as exc:
|
85
|
+
logger.error(f"Failed to parse JSON data using json library. {exc}")
|
86
|
+
return None
|
87
|
+
|
88
|
+
|
89
|
+
@dataclass
|
90
|
+
class JsonLineParser(Parser):
|
91
|
+
encoding: Optional[str] = "utf-8"
|
92
|
+
|
93
|
+
def parse(self, data: BufferedIOBase) -> PARSER_OUTPUT_TYPE:
|
94
|
+
for line in data:
|
95
|
+
try:
|
96
|
+
yield json.loads(line.decode(encoding=self.encoding or "utf-8"))
|
97
|
+
except json.JSONDecodeError as e:
|
98
|
+
logger.warning(f"Cannot decode/parse line {line!r} as JSON, error: {e}")
|
99
|
+
|
100
|
+
|
101
|
+
@dataclass
|
102
|
+
class CsvParser(Parser):
|
103
|
+
# TODO: migrate implementation to re-use file-base classes
|
104
|
+
encoding: Optional[str] = "utf-8"
|
105
|
+
delimiter: Optional[str] = ","
|
106
|
+
|
107
|
+
def _get_delimiter(self) -> Optional[str]:
|
108
|
+
"""
|
109
|
+
Get delimiter from the configuration. Check for the escape character and decode it.
|
110
|
+
"""
|
111
|
+
if self.delimiter is not None:
|
112
|
+
if self.delimiter.startswith("\\"):
|
113
|
+
self.delimiter = self.delimiter.encode("utf-8").decode("unicode_escape")
|
114
|
+
|
115
|
+
return self.delimiter
|
116
|
+
|
117
|
+
def parse(self, data: BufferedIOBase) -> PARSER_OUTPUT_TYPE:
|
118
|
+
"""
|
119
|
+
Parse CSV data from decompressed bytes.
|
120
|
+
"""
|
121
|
+
text_data = TextIOWrapper(data, encoding=self.encoding) # type: ignore
|
122
|
+
reader = csv.DictReader(text_data, delimiter=self._get_delimiter() or ",")
|
123
|
+
for row in reader:
|
124
|
+
yield row
|
125
|
+
|
126
|
+
|
127
|
+
class CompositeRawDecoder(Decoder):
|
128
|
+
"""
|
129
|
+
Decoder strategy to transform a requests.Response into a PARSER_OUTPUT_TYPE
|
130
|
+
passed response.raw to parser(s).
|
131
|
+
|
132
|
+
Note: response.raw is not decoded/decompressed by default. Parsers should be instantiated recursively.
|
133
|
+
|
134
|
+
Example:
|
135
|
+
composite_raw_decoder = CompositeRawDecoder(
|
136
|
+
parser=GzipParser(
|
137
|
+
inner_parser=JsonLineParser(encoding="iso-8859-1")
|
138
|
+
)
|
139
|
+
)
|
140
|
+
"""
|
141
|
+
|
142
|
+
def __init__(
|
143
|
+
self,
|
144
|
+
parser: Parser,
|
145
|
+
stream_response: bool = True,
|
146
|
+
parsers_by_header: PARSERS_BY_HEADER_TYPE = None,
|
147
|
+
) -> None:
|
148
|
+
# since we moved from using `dataclass` to `__init__` method,
|
149
|
+
# we need to keep using the `parser` to be able to resolve the depenencies
|
150
|
+
# between the parsers correctly.
|
151
|
+
self.parser = parser
|
152
|
+
|
153
|
+
self._parsers_by_header = parsers_by_header if parsers_by_header else {}
|
154
|
+
self._stream_response = stream_response
|
155
|
+
|
156
|
+
@classmethod
|
157
|
+
def by_headers(
|
158
|
+
cls,
|
159
|
+
parsers: PARSERS_TYPE,
|
160
|
+
stream_response: bool,
|
161
|
+
fallback_parser: Parser,
|
162
|
+
) -> "CompositeRawDecoder":
|
163
|
+
"""
|
164
|
+
Create a CompositeRawDecoder instance based on header values.
|
165
|
+
|
166
|
+
Args:
|
167
|
+
parsers (PARSERS_TYPE): A list of tuples where each tuple contains headers, header values, and a parser.
|
168
|
+
stream_response (bool): A flag indicating whether the response should be streamed.
|
169
|
+
fallback_parser (Parser): A parser to use if no matching header is found.
|
170
|
+
|
171
|
+
Returns:
|
172
|
+
CompositeRawDecoder: An instance of CompositeRawDecoder configured with the provided parsers.
|
173
|
+
"""
|
174
|
+
parsers_by_header = {}
|
175
|
+
for headers, header_values, parser in parsers:
|
176
|
+
for header in headers:
|
177
|
+
parsers_by_header[header] = {header_value: parser for header_value in header_values}
|
178
|
+
return cls(fallback_parser, stream_response, parsers_by_header)
|
179
|
+
|
180
|
+
def is_stream_response(self) -> bool:
|
181
|
+
return self._stream_response
|
182
|
+
|
183
|
+
def decode(self, response: requests.Response) -> DECODER_OUTPUT_TYPE:
|
184
|
+
parser = self._select_parser(response)
|
185
|
+
if self.is_stream_response():
|
186
|
+
# urllib mentions that some interfaces don't play nice with auto_close
|
187
|
+
# More info here: https://urllib3.readthedocs.io/en/stable/user-guide.html#using-io-wrappers-with-response-content
|
188
|
+
# We have indeed observed some issues with CSV parsing.
|
189
|
+
# Hence, we will manage the closing of the file ourselves until we find a better solution.
|
190
|
+
response.raw.auto_close = False
|
191
|
+
yield from parser.parse(
|
192
|
+
data=response.raw, # type: ignore[arg-type]
|
193
|
+
)
|
194
|
+
response.raw.close()
|
195
|
+
else:
|
196
|
+
yield from parser.parse(data=io.BytesIO(response.content))
|
197
|
+
|
198
|
+
def _select_parser(self, response: requests.Response) -> Parser:
|
199
|
+
"""
|
200
|
+
Selects the appropriate parser based on the response headers.
|
201
|
+
|
202
|
+
This method iterates through the `_parsers_by_header` dictionary to find a matching parser
|
203
|
+
based on the headers in the response. If a matching header and header value are found,
|
204
|
+
the corresponding parser is returned. If no match is found, the default parser is returned.
|
205
|
+
|
206
|
+
Args:
|
207
|
+
response (requests.Response): The HTTP response object containing headers to check.
|
208
|
+
|
209
|
+
Returns:
|
210
|
+
Parser: The parser corresponding to the matched header value, or the default parser if no match is found.
|
211
|
+
"""
|
212
|
+
for header, parser_by_header_value in self._parsers_by_header.items():
|
213
|
+
if (
|
214
|
+
header in response.headers
|
215
|
+
and response.headers[header] in parser_by_header_value.keys()
|
216
|
+
):
|
217
|
+
return parser_by_header_value[response.headers[header]]
|
218
|
+
return self.parser
|
{airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/sources/declarative/decoders/decoder.py
RENAMED
@@ -8,6 +8,8 @@ from typing import Any, Generator, MutableMapping
|
|
8
8
|
|
9
9
|
import requests
|
10
10
|
|
11
|
+
DECODER_OUTPUT_TYPE = Generator[MutableMapping[str, Any], None, None]
|
12
|
+
|
11
13
|
|
12
14
|
@dataclass
|
13
15
|
class Decoder:
|
@@ -22,9 +24,7 @@ class Decoder:
|
|
22
24
|
"""
|
23
25
|
|
24
26
|
@abstractmethod
|
25
|
-
def decode(
|
26
|
-
self, response: requests.Response
|
27
|
-
) -> Generator[MutableMapping[str, Any], None, None]:
|
27
|
+
def decode(self, response: requests.Response) -> DECODER_OUTPUT_TYPE:
|
28
28
|
"""
|
29
29
|
Decodes a requests.Response into a Mapping[str, Any] or an array
|
30
30
|
:param response: the response to decode
|
@@ -0,0 +1,30 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
3
|
+
#
|
4
|
+
|
5
|
+
|
6
|
+
import logging
|
7
|
+
from abc import ABC, abstractmethod
|
8
|
+
from dataclasses import dataclass
|
9
|
+
from io import BufferedIOBase
|
10
|
+
from typing import Any, Dict, Generator, List, MutableMapping, Optional, Set, Tuple
|
11
|
+
|
12
|
+
logger = logging.getLogger("airbyte")
|
13
|
+
|
14
|
+
|
15
|
+
PARSER_OUTPUT_TYPE = Generator[MutableMapping[str, Any], None, None]
|
16
|
+
|
17
|
+
|
18
|
+
@dataclass
|
19
|
+
class Parser(ABC):
|
20
|
+
@abstractmethod
|
21
|
+
def parse(self, data: BufferedIOBase) -> PARSER_OUTPUT_TYPE:
|
22
|
+
"""
|
23
|
+
Parse data and yield dictionaries.
|
24
|
+
"""
|
25
|
+
pass
|
26
|
+
|
27
|
+
|
28
|
+
# reusable parser types
|
29
|
+
PARSERS_TYPE = List[Tuple[Set[str], Set[str], Parser]]
|
30
|
+
PARSERS_BY_HEADER_TYPE = Optional[Dict[str, Dict[str, Parser]]]
|
@@ -6,16 +6,13 @@ import logging
|
|
6
6
|
import zipfile
|
7
7
|
from dataclasses import dataclass
|
8
8
|
from io import BytesIO
|
9
|
-
from typing import Any, Generator, MutableMapping
|
10
9
|
|
11
|
-
import orjson
|
12
10
|
import requests
|
13
11
|
|
14
12
|
from airbyte_cdk.models import FailureType
|
15
13
|
from airbyte_cdk.sources.declarative.decoders import Decoder
|
16
|
-
from airbyte_cdk.sources.declarative.decoders.composite_raw_decoder import
|
17
|
-
|
18
|
-
)
|
14
|
+
from airbyte_cdk.sources.declarative.decoders.composite_raw_decoder import Parser
|
15
|
+
from airbyte_cdk.sources.declarative.decoders.decoder import DECODER_OUTPUT_TYPE
|
19
16
|
from airbyte_cdk.utils import AirbyteTracedException
|
20
17
|
|
21
18
|
logger = logging.getLogger("airbyte")
|
@@ -28,16 +25,16 @@ class ZipfileDecoder(Decoder):
|
|
28
25
|
def is_stream_response(self) -> bool:
|
29
26
|
return False
|
30
27
|
|
31
|
-
def decode(
|
32
|
-
self, response: requests.Response
|
33
|
-
) -> Generator[MutableMapping[str, Any], None, None]:
|
28
|
+
def decode(self, response: requests.Response) -> DECODER_OUTPUT_TYPE:
|
34
29
|
try:
|
35
30
|
with zipfile.ZipFile(BytesIO(response.content)) as zip_file:
|
36
31
|
for file_name in zip_file.namelist():
|
37
32
|
unzipped_content = zip_file.read(file_name)
|
38
33
|
buffered_content = BytesIO(unzipped_content)
|
39
34
|
try:
|
40
|
-
yield from self.parser.parse(
|
35
|
+
yield from self.parser.parse(
|
36
|
+
buffered_content,
|
37
|
+
)
|
41
38
|
except Exception as e:
|
42
39
|
logger.error(
|
43
40
|
f"Failed to parse file: {file_name} from zip file: {response.request.url} with exception {e}."
|
@@ -15,7 +15,6 @@ from numpy import nan
|
|
15
15
|
|
16
16
|
from airbyte_cdk.sources.declarative.extractors.record_extractor import RecordExtractor
|
17
17
|
|
18
|
-
EMPTY_STR: str = ""
|
19
18
|
DEFAULT_ENCODING: str = "utf-8"
|
20
19
|
DOWNLOAD_CHUNK_SIZE: int = 1024 * 10
|
21
20
|
|
@@ -136,7 +135,6 @@ class ResponseToFileExtractor(RecordExtractor):
|
|
136
135
|
"""
|
137
136
|
|
138
137
|
try:
|
139
|
-
# TODO: Add support for other file types, like `json`, with `pd.read_json()`
|
140
138
|
with open(path, "r", encoding=file_encoding) as data:
|
141
139
|
chunks = pd.read_csv(
|
142
140
|
data, chunksize=chunk_size, iterator=True, dialect="unix", dtype=object
|
@@ -2193,18 +2193,40 @@ class ModelToComponentFactory:
|
|
2193
2193
|
stream_response=False if self._emit_connector_builder_messages else True,
|
2194
2194
|
)
|
2195
2195
|
|
2196
|
-
|
2197
|
-
|
2196
|
+
def create_jsonl_decoder(
|
2197
|
+
self, model: JsonlDecoderModel, config: Config, **kwargs: Any
|
2198
|
+
) -> Decoder:
|
2198
2199
|
return CompositeRawDecoder(
|
2199
|
-
parser=ModelToComponentFactory._get_parser(model, config),
|
2200
|
+
parser=ModelToComponentFactory._get_parser(model, config),
|
2201
|
+
stream_response=False if self._emit_connector_builder_messages else True,
|
2200
2202
|
)
|
2201
2203
|
|
2202
2204
|
def create_gzip_decoder(
|
2203
2205
|
self, model: GzipDecoderModel, config: Config, **kwargs: Any
|
2204
2206
|
) -> Decoder:
|
2205
|
-
|
2206
|
-
|
2207
|
-
|
2207
|
+
_compressed_response_types = {
|
2208
|
+
"gzip",
|
2209
|
+
"x-gzip",
|
2210
|
+
"gzip, deflate",
|
2211
|
+
"x-gzip, deflate",
|
2212
|
+
"application/zip",
|
2213
|
+
"application/gzip",
|
2214
|
+
"application/x-gzip",
|
2215
|
+
"application/x-zip-compressed",
|
2216
|
+
}
|
2217
|
+
|
2218
|
+
gzip_parser: GzipParser = ModelToComponentFactory._get_parser(model, config) # type: ignore # based on the model, we know this will be a GzipParser
|
2219
|
+
|
2220
|
+
if self._emit_connector_builder_messages:
|
2221
|
+
# This is very surprising but if the response is not streamed,
|
2222
|
+
# CompositeRawDecoder calls response.content and the requests library actually uncompress the data as opposed to response.raw,
|
2223
|
+
# which uses urllib3 directly and does not uncompress the data.
|
2224
|
+
return CompositeRawDecoder(gzip_parser.inner_parser, False)
|
2225
|
+
|
2226
|
+
return CompositeRawDecoder.by_headers(
|
2227
|
+
[({"Content-Encoding", "Content-Type"}, _compressed_response_types, gzip_parser)],
|
2228
|
+
stream_response=True,
|
2229
|
+
fallback_parser=gzip_parser.inner_parser,
|
2208
2230
|
)
|
2209
2231
|
|
2210
2232
|
@staticmethod
|
@@ -2753,7 +2775,10 @@ class ModelToComponentFactory:
|
|
2753
2775
|
)
|
2754
2776
|
paginator = (
|
2755
2777
|
self._create_component_from_model(
|
2756
|
-
model=model.download_paginator,
|
2778
|
+
model=model.download_paginator,
|
2779
|
+
decoder=decoder,
|
2780
|
+
config=config,
|
2781
|
+
url_base="",
|
2757
2782
|
)
|
2758
2783
|
if model.download_paginator
|
2759
2784
|
else NoPagination(parameters={})
|
@@ -2870,7 +2895,10 @@ class ModelToComponentFactory:
|
|
2870
2895
|
model=model.status_extractor, decoder=decoder, config=config, name=name
|
2871
2896
|
)
|
2872
2897
|
download_target_extractor = self._create_component_from_model(
|
2873
|
-
model=model.download_target_extractor,
|
2898
|
+
model=model.download_target_extractor,
|
2899
|
+
decoder=decoder,
|
2900
|
+
config=config,
|
2901
|
+
name=name,
|
2874
2902
|
)
|
2875
2903
|
job_repository: AsyncJobRepository = AsyncHttpJobRepository(
|
2876
2904
|
creation_requester=creation_requester,
|
@@ -16,7 +16,9 @@ from airbyte_cdk.sources.declarative.auth.declarative_authenticator import (
|
|
16
16
|
)
|
17
17
|
from airbyte_cdk.sources.declarative.decoders import Decoder
|
18
18
|
from airbyte_cdk.sources.declarative.decoders.json_decoder import JsonDecoder
|
19
|
-
from airbyte_cdk.sources.declarative.interpolation.interpolated_string import
|
19
|
+
from airbyte_cdk.sources.declarative.interpolation.interpolated_string import (
|
20
|
+
InterpolatedString,
|
21
|
+
)
|
20
22
|
from airbyte_cdk.sources.declarative.requesters.request_options.interpolated_request_options_provider import (
|
21
23
|
InterpolatedRequestOptionsProvider,
|
22
24
|
)
|
@@ -26,7 +28,10 @@ from airbyte_cdk.sources.streams.call_rate import APIBudget
|
|
26
28
|
from airbyte_cdk.sources.streams.http import HttpClient
|
27
29
|
from airbyte_cdk.sources.streams.http.error_handlers import ErrorHandler
|
28
30
|
from airbyte_cdk.sources.types import Config, EmptyString, StreamSlice, StreamState
|
29
|
-
from airbyte_cdk.utils.mapping_helpers import
|
31
|
+
from airbyte_cdk.utils.mapping_helpers import (
|
32
|
+
combine_mappings,
|
33
|
+
get_interpolation_context,
|
34
|
+
)
|
30
35
|
|
31
36
|
|
32
37
|
@dataclass
|
@@ -155,7 +160,9 @@ class HttpRequester(Requester):
|
|
155
160
|
next_page_token: Optional[Mapping[str, Any]] = None,
|
156
161
|
) -> MutableMapping[str, Any]:
|
157
162
|
return self._request_options_provider.get_request_params(
|
158
|
-
stream_state=stream_state,
|
163
|
+
stream_state=stream_state,
|
164
|
+
stream_slice=stream_slice,
|
165
|
+
next_page_token=next_page_token,
|
159
166
|
)
|
160
167
|
|
161
168
|
def get_request_headers(
|
@@ -166,7 +173,9 @@ class HttpRequester(Requester):
|
|
166
173
|
next_page_token: Optional[Mapping[str, Any]] = None,
|
167
174
|
) -> Mapping[str, Any]:
|
168
175
|
return self._request_options_provider.get_request_headers(
|
169
|
-
stream_state=stream_state,
|
176
|
+
stream_state=stream_state,
|
177
|
+
stream_slice=stream_slice,
|
178
|
+
next_page_token=next_page_token,
|
170
179
|
)
|
171
180
|
|
172
181
|
# fixing request options provider types has a lot of dependencies
|
@@ -195,7 +204,9 @@ class HttpRequester(Requester):
|
|
195
204
|
next_page_token: Optional[Mapping[str, Any]] = None,
|
196
205
|
) -> Optional[Mapping[str, Any]]:
|
197
206
|
return self._request_options_provider.get_request_body_json(
|
198
|
-
stream_state=stream_state,
|
207
|
+
stream_state=stream_state,
|
208
|
+
stream_slice=stream_slice,
|
209
|
+
next_page_token=next_page_token,
|
199
210
|
)
|
200
211
|
|
201
212
|
@property
|
@@ -350,9 +361,24 @@ class HttpRequester(Requester):
|
|
350
361
|
path (str): The path to join with the base URL.
|
351
362
|
|
352
363
|
Returns:
|
353
|
-
str: The
|
364
|
+
str: The resulting joined URL.
|
365
|
+
|
366
|
+
Note:
|
367
|
+
Related issue: https://github.com/airbytehq/airbyte-internal-issues/issues/11869
|
368
|
+
- If the path is an empty string or None, the method returns the base URL with any trailing slash removed.
|
369
|
+
|
370
|
+
Example:
|
371
|
+
1) _join_url("https://example.com/api/", "endpoint") >> 'https://example.com/api/endpoint'
|
372
|
+
2) _join_url("https://example.com/api", "/endpoint") >> 'https://example.com/api/endpoint'
|
373
|
+
3) _join_url("https://example.com/api/", "") >> 'https://example.com/api'
|
374
|
+
4) _join_url("https://example.com/api", None) >> 'https://example.com/api'
|
354
375
|
"""
|
355
|
-
|
376
|
+
|
377
|
+
# return a full-url if provided directly from interpolation context
|
378
|
+
if path == EmptyString or path is None:
|
379
|
+
return url_base.rstrip("/")
|
380
|
+
|
381
|
+
return urljoin(url_base, path)
|
356
382
|
|
357
383
|
def send_request(
|
358
384
|
self,
|
@@ -23,7 +23,7 @@ classifiers = [
|
|
23
23
|
keywords = ["airbyte", "connector-development-kit", "cdk"]
|
24
24
|
|
25
25
|
# Python CDK uses dynamic versioning: https://github.com/mtkennerly/poetry-dynamic-versioning
|
26
|
-
version = "6.38.
|
26
|
+
version = "6.38.2" # Version will be calculated dynamically.
|
27
27
|
|
28
28
|
[tool.poetry-dynamic-versioning]
|
29
29
|
enable = false
|
@@ -1,160 +0,0 @@
|
|
1
|
-
import csv
|
2
|
-
import gzip
|
3
|
-
import io
|
4
|
-
import json
|
5
|
-
import logging
|
6
|
-
from abc import ABC, abstractmethod
|
7
|
-
from dataclasses import dataclass
|
8
|
-
from io import BufferedIOBase, TextIOWrapper
|
9
|
-
from typing import Any, Generator, MutableMapping, Optional
|
10
|
-
|
11
|
-
import orjson
|
12
|
-
import requests
|
13
|
-
|
14
|
-
from airbyte_cdk.models import FailureType
|
15
|
-
from airbyte_cdk.sources.declarative.decoders.decoder import Decoder
|
16
|
-
from airbyte_cdk.utils import AirbyteTracedException
|
17
|
-
|
18
|
-
logger = logging.getLogger("airbyte")
|
19
|
-
|
20
|
-
|
21
|
-
@dataclass
|
22
|
-
class Parser(ABC):
|
23
|
-
@abstractmethod
|
24
|
-
def parse(
|
25
|
-
self,
|
26
|
-
data: BufferedIOBase,
|
27
|
-
) -> Generator[MutableMapping[str, Any], None, None]:
|
28
|
-
"""
|
29
|
-
Parse data and yield dictionaries.
|
30
|
-
"""
|
31
|
-
pass
|
32
|
-
|
33
|
-
|
34
|
-
@dataclass
|
35
|
-
class GzipParser(Parser):
|
36
|
-
inner_parser: Parser
|
37
|
-
|
38
|
-
def parse(
|
39
|
-
self,
|
40
|
-
data: BufferedIOBase,
|
41
|
-
) -> Generator[MutableMapping[str, Any], None, None]:
|
42
|
-
"""
|
43
|
-
Decompress gzipped bytes and pass decompressed data to the inner parser.
|
44
|
-
"""
|
45
|
-
with gzip.GzipFile(fileobj=data, mode="rb") as gzipobj:
|
46
|
-
yield from self.inner_parser.parse(gzipobj)
|
47
|
-
|
48
|
-
|
49
|
-
@dataclass
|
50
|
-
class JsonParser(Parser):
|
51
|
-
encoding: str = "utf-8"
|
52
|
-
|
53
|
-
def parse(self, data: BufferedIOBase) -> Generator[MutableMapping[str, Any], None, None]:
|
54
|
-
"""
|
55
|
-
Attempts to deserialize data using orjson library. As an extra layer of safety we fallback on the json library to deserialize the data.
|
56
|
-
"""
|
57
|
-
raw_data = data.read()
|
58
|
-
body_json = self._parse_orjson(raw_data) or self._parse_json(raw_data)
|
59
|
-
|
60
|
-
if body_json is None:
|
61
|
-
raise AirbyteTracedException(
|
62
|
-
message="Response JSON data failed to be parsed. See logs for more information.",
|
63
|
-
internal_message=f"Response JSON data failed to be parsed.",
|
64
|
-
failure_type=FailureType.system_error,
|
65
|
-
)
|
66
|
-
|
67
|
-
if isinstance(body_json, list):
|
68
|
-
yield from body_json
|
69
|
-
else:
|
70
|
-
yield from [body_json]
|
71
|
-
|
72
|
-
def _parse_orjson(self, raw_data: bytes) -> Optional[Any]:
|
73
|
-
try:
|
74
|
-
return orjson.loads(raw_data.decode(self.encoding))
|
75
|
-
except Exception as exc:
|
76
|
-
logger.debug(
|
77
|
-
f"Failed to parse JSON data using orjson library. Falling back to json library. {exc}"
|
78
|
-
)
|
79
|
-
return None
|
80
|
-
|
81
|
-
def _parse_json(self, raw_data: bytes) -> Optional[Any]:
|
82
|
-
try:
|
83
|
-
return json.loads(raw_data.decode(self.encoding))
|
84
|
-
except Exception as exc:
|
85
|
-
logger.error(f"Failed to parse JSON data using json library. {exc}")
|
86
|
-
return None
|
87
|
-
|
88
|
-
|
89
|
-
@dataclass
|
90
|
-
class JsonLineParser(Parser):
|
91
|
-
encoding: Optional[str] = "utf-8"
|
92
|
-
|
93
|
-
def parse(
|
94
|
-
self,
|
95
|
-
data: BufferedIOBase,
|
96
|
-
) -> Generator[MutableMapping[str, Any], None, None]:
|
97
|
-
for line in data:
|
98
|
-
try:
|
99
|
-
yield json.loads(line.decode(encoding=self.encoding or "utf-8"))
|
100
|
-
except json.JSONDecodeError as e:
|
101
|
-
logger.warning(f"Cannot decode/parse line {line!r} as JSON, error: {e}")
|
102
|
-
|
103
|
-
|
104
|
-
@dataclass
|
105
|
-
class CsvParser(Parser):
|
106
|
-
# TODO: migrate implementation to re-use file-base classes
|
107
|
-
encoding: Optional[str] = "utf-8"
|
108
|
-
delimiter: Optional[str] = ","
|
109
|
-
|
110
|
-
def _get_delimiter(self) -> Optional[str]:
|
111
|
-
"""
|
112
|
-
Get delimiter from the configuration. Check for the escape character and decode it.
|
113
|
-
"""
|
114
|
-
if self.delimiter is not None:
|
115
|
-
if self.delimiter.startswith("\\"):
|
116
|
-
self.delimiter = self.delimiter.encode("utf-8").decode("unicode_escape")
|
117
|
-
|
118
|
-
return self.delimiter
|
119
|
-
|
120
|
-
def parse(
|
121
|
-
self,
|
122
|
-
data: BufferedIOBase,
|
123
|
-
) -> Generator[MutableMapping[str, Any], None, None]:
|
124
|
-
"""
|
125
|
-
Parse CSV data from decompressed bytes.
|
126
|
-
"""
|
127
|
-
text_data = TextIOWrapper(data, encoding=self.encoding) # type: ignore
|
128
|
-
reader = csv.DictReader(text_data, delimiter=self._get_delimiter() or ",")
|
129
|
-
for row in reader:
|
130
|
-
yield row
|
131
|
-
|
132
|
-
|
133
|
-
@dataclass
|
134
|
-
class CompositeRawDecoder(Decoder):
|
135
|
-
"""
|
136
|
-
Decoder strategy to transform a requests.Response into a Generator[MutableMapping[str, Any], None, None]
|
137
|
-
passed response.raw to parser(s).
|
138
|
-
Note: response.raw is not decoded/decompressed by default.
|
139
|
-
parsers should be instantiated recursively.
|
140
|
-
Example:
|
141
|
-
composite_raw_decoder = CompositeRawDecoder(parser=GzipParser(inner_parser=JsonLineParser(encoding="iso-8859-1")))
|
142
|
-
"""
|
143
|
-
|
144
|
-
parser: Parser
|
145
|
-
stream_response: bool = True
|
146
|
-
|
147
|
-
def is_stream_response(self) -> bool:
|
148
|
-
return self.stream_response
|
149
|
-
|
150
|
-
def decode(
|
151
|
-
self, response: requests.Response
|
152
|
-
) -> Generator[MutableMapping[str, Any], None, None]:
|
153
|
-
if self.is_stream_response():
|
154
|
-
# urllib mentions that some interfaces don't play nice with auto_close [here](https://urllib3.readthedocs.io/en/stable/user-guide.html#using-io-wrappers-with-response-content)
|
155
|
-
# We have indeed observed some issues with CSV parsing. Hence, we will manage the closing of the file ourselves until we find a better solution.
|
156
|
-
response.raw.auto_close = False
|
157
|
-
yield from self.parser.parse(data=response.raw) # type: ignore[arg-type]
|
158
|
-
response.raw.close()
|
159
|
-
else:
|
160
|
-
yield from self.parser.parse(data=io.BytesIO(response.content))
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/cli/source_declarative_manifest/__init__.py
RENAMED
File without changes
|
{airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/cli/source_declarative_manifest/_run.py
RENAMED
File without changes
|
{airbyte_cdk-6.38.1 → airbyte_cdk-6.38.2}/airbyte_cdk/cli/source_declarative_manifest/spec.json
RENAMED
File without changes
|
File without changes
|