airbyte-cdk 6.27.1__tar.gz → 6.28.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.28.0/LICENSE_SHORT +1 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/PKG-INFO +5 -5
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/cli/source_declarative_manifest/_run.py +3 -3
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/connector_builder/connector_builder_handler.py +2 -2
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/auth/oauth.py +22 -13
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/auth/token_provider.py +4 -5
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/state_converters/datetime_stream_state_converter.py +22 -13
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/core.py +6 -6
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/requests_native_auth/abstract_oauth.py +17 -6
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/requests_native_auth/oauth.py +24 -12
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/utils/transform.py +23 -2
- airbyte_cdk-6.28.0/airbyte_cdk/utils/datetime_helpers.py +517 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/pyproject.toml +5 -5
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/LICENSE.txt +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/README.md +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/cli/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/cli/source_declarative_manifest/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/cli/source_declarative_manifest/spec.json +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/config_observation.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/connector.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/connector_builder/README.md +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/connector_builder/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/connector_builder/main.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/connector_builder/message_grouper.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/connector_builder/models.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/destinations/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/destinations/destination.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/destinations/vector_db_based/README.md +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/destinations/vector_db_based/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/destinations/vector_db_based/config.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/destinations/vector_db_based/document_processor.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/destinations/vector_db_based/embedder.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/destinations/vector_db_based/indexer.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/destinations/vector_db_based/test_utils.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/destinations/vector_db_based/utils.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/destinations/vector_db_based/writer.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/entrypoint.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/exception_handler.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/logger.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/models/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/models/airbyte_protocol.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/models/airbyte_protocol_serializers.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/models/file_transfer_record_message.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/models/well_known_types.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/py.typed +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/abstract_source.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/concurrent_source/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/concurrent_source/concurrent_read_processor.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/concurrent_source/concurrent_source.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/concurrent_source/concurrent_source_adapter.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/concurrent_source/partition_generation_completed_sentinel.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/concurrent_source/stream_thread_exception.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/concurrent_source/thread_pool_manager.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/config.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/connector_state_manager.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/async_job/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/async_job/job.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/async_job/job_orchestrator.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/async_job/job_tracker.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/async_job/repository.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/async_job/status.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/async_job/timer.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/auth/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/auth/declarative_authenticator.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/auth/jwt.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/auth/selective_authenticator.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/auth/token.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/checks/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/checks/check_dynamic_stream.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/checks/check_stream.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/checks/connection_checker.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/concurrency_level/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/concurrency_level/concurrency_level.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/concurrent_declarative_source.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/datetime/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/datetime/datetime_parser.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/datetime/min_max_datetime.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/declarative_component_schema.yaml +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/declarative_source.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/declarative_stream.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/decoders/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/decoders/composite_raw_decoder.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/decoders/decoder.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/decoders/json_decoder.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/decoders/noop_decoder.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/decoders/pagination_decoder_decorator.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/decoders/xml_decoder.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/decoders/zipfile_decoder.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/exceptions.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/extractors/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/extractors/dpath_extractor.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/extractors/http_selector.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/extractors/record_extractor.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/extractors/record_filter.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/extractors/record_selector.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/extractors/response_to_file_extractor.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/extractors/type_transformer.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/incremental/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/incremental/concurrent_partition_cursor.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/incremental/datetime_based_cursor.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/incremental/declarative_cursor.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/incremental/global_substream_cursor.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/incremental/per_partition_cursor.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/incremental/per_partition_with_global.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/incremental/resumable_full_refresh_cursor.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/interpolation/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/interpolation/filters.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_boolean.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_mapping.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_nested_mapping.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_string.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/interpolation/interpolation.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/interpolation/jinja.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/interpolation/macros.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/manifest_declarative_source.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/migrations/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/migrations/legacy_to_per_partition_state_migration.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/migrations/state_migration.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/models/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/models/declarative_component_schema.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/parsers/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/parsers/custom_code_compiler.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/parsers/custom_exceptions.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/parsers/manifest_component_transformer.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/parsers/manifest_reference_resolver.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/partition_routers/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/partition_routers/async_job_partition_router.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/partition_routers/cartesian_product_stream_slicer.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/partition_routers/list_partition_router.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/partition_routers/partition_router.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/partition_routers/single_partition_router.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/partition_routers/substream_partition_router.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/README.md +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/constant_backoff_strategy.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/exponential_backoff_strategy.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/header_helper.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/wait_time_from_header_backoff_strategy.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/wait_until_time_from_header_backoff_strategy.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategy.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/composite_error_handler.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/default_error_handler.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/default_http_response_filter.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/error_handler.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/http_response_filter.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/http_job_repository.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/http_requester.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/paginators/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/paginators/default_paginator.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/paginators/no_pagination.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/paginators/paginator.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/cursor_pagination_strategy.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/offset_increment.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/page_increment.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/pagination_strategy.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/stop_condition.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/request_option.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/request_options/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/request_options/datetime_based_request_options_provider.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/request_options/default_request_options_provider.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_nested_request_input_provider.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_input_provider.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_options_provider.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/request_options/request_options_provider.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/request_path.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/requester.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/resolvers/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/resolvers/components_resolver.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/resolvers/config_components_resolver.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/resolvers/http_components_resolver.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/retrievers/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/retrievers/async_retriever.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/retrievers/retriever.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/retrievers/simple_retriever.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/schema/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/schema/default_schema_loader.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/schema/dynamic_schema_loader.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/schema/inline_schema_loader.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/schema/json_file_schema_loader.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/schema/schema_loader.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/spec/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/spec/spec.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/stream_slicers/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/stream_slicers/declarative_partition_generator.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/stream_slicers/stream_slicer.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/transformations/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/transformations/add_fields.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/transformations/dpath_flatten_fields.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/transformations/flatten_fields.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/transformations/keys_replace_transformation.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/transformations/keys_to_lower_transformation.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/transformations/keys_to_snake_transformation.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/transformations/remove_fields.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/transformations/transformation.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/types.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/yaml_declarative_source.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/embedded/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/embedded/base_integration.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/embedded/catalog.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/embedded/runner.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/embedded/tools.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/README.md +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/availability_strategy/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/availability_strategy/abstract_file_based_availability_strategy.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/availability_strategy/default_file_based_availability_strategy.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/config/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/config/abstract_file_based_spec.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/config/avro_format.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/config/csv_format.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/config/excel_format.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/config/file_based_stream_config.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/config/jsonl_format.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/config/parquet_format.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/config/unstructured_format.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/discovery_policy/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/discovery_policy/abstract_discovery_policy.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/discovery_policy/default_discovery_policy.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/exceptions.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/file_based_source.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/file_based_stream_reader.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/file_types/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/file_types/avro_parser.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/file_types/csv_parser.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/file_types/excel_parser.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/file_types/file_transfer.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/file_types/file_type_parser.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/file_types/jsonl_parser.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/file_types/parquet_parser.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/file_types/unstructured_parser.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/remote_file.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/schema_helpers.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/schema_validation_policies/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/schema_validation_policies/abstract_schema_validation_policy.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/schema_validation_policies/default_schema_validation_policies.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/stream/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/stream/abstract_file_based_stream.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/stream/concurrent/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/stream/concurrent/adapters.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/stream/concurrent/cursor/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/stream/concurrent/cursor/abstract_concurrent_file_based_cursor.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/stream/concurrent/cursor/file_based_concurrent_cursor.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/stream/concurrent/cursor/file_based_final_state_cursor.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/stream/cursor/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/stream/cursor/abstract_file_based_cursor.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/stream/cursor/default_file_based_cursor.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/stream/default_file_based_stream.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/types.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/http_config.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/http_logger.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/message/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/message/repository.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/source.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/availability_strategy.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/call_rate.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/checkpoint/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/checkpoint/checkpoint_reader.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/checkpoint/cursor.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/checkpoint/per_partition_key_serializer.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/checkpoint/resumable_full_refresh_cursor.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/checkpoint/substream_resumable_full_refresh_cursor.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/README.md +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/abstract_stream.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/abstract_stream_facade.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/adapters.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/availability_strategy.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/clamping.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/cursor.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/cursor_types.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/default_stream.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/exceptions.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/helpers.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/partition_enqueuer.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/partition_reader.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/partitions/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/partitions/partition.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/partitions/partition_generator.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/partitions/stream_slicer.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/partitions/types.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/state_converters/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/state_converters/abstract_stream_state_converter.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/availability_strategy.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/error_handlers/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/error_handlers/backoff_strategy.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/error_handlers/default_backoff_strategy.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/error_handlers/default_error_mapping.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/error_handlers/error_handler.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/error_handlers/error_message_parser.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/error_handlers/http_status_error_handler.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/error_handlers/json_error_message_parser.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/error_handlers/response_models.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/exceptions.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/http.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/http_client.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/rate_limiting.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/requests_native_auth/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/requests_native_auth/abstract_token.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/requests_native_auth/token.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/utils/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/types.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/utils/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/utils/casing.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/utils/record_helper.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/utils/schema_helpers.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/utils/slice_logger.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/utils/types.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sql/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sql/_util/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sql/_util/hashing.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sql/_util/name_normalizers.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sql/constants.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sql/exceptions.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sql/secrets.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sql/shared/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sql/shared/catalog_providers.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sql/shared/sql_processor.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sql/types.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/test/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/test/catalog_builder.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/test/entrypoint_wrapper.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/test/mock_http/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/test/mock_http/matcher.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/test/mock_http/mocker.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/test/mock_http/request.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/test/mock_http/response.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/test/mock_http/response_builder.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/test/state_builder.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/test/utils/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/test/utils/data.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/test/utils/http_mocking.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/test/utils/manifest_only_fixtures.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/test/utils/reading.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/utils/__init__.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/utils/airbyte_secrets_utils.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/utils/analytics_message.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/utils/constants.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/utils/datetime_format_inferrer.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/utils/event_timing.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/utils/is_cloud_environment.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/utils/mapping_helpers.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/utils/message_utils.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/utils/oneof_option_config.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/utils/print_buffer.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/utils/schema_inferrer.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/utils/slice_hasher.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/utils/spec_schema_transformations.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/utils/stream_status_utils.py +0 -0
- {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/utils/traced_exception.py +0 -0
@@ -0,0 +1 @@
|
|
1
|
+
Copyright (c) 2025 Airbyte, Inc., all rights reserved.
|
@@ -1,7 +1,8 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.1
|
2
2
|
Name: airbyte-cdk
|
3
|
-
Version: 6.
|
3
|
+
Version: 6.28.0
|
4
4
|
Summary: A framework for writing Airbyte Connectors.
|
5
|
+
Home-page: https://airbyte.com
|
5
6
|
License: MIT
|
6
7
|
Keywords: airbyte,connector-development-kit,cdk
|
7
8
|
Author: Airbyte
|
@@ -45,7 +46,6 @@ Requires-Dist: orjson (>=3.10.7,<4.0.0)
|
|
45
46
|
Requires-Dist: pandas (==2.2.2)
|
46
47
|
Requires-Dist: pdf2image (==1.16.3) ; extra == "file-based"
|
47
48
|
Requires-Dist: pdfminer.six (==20221105) ; extra == "file-based"
|
48
|
-
Requires-Dist: pendulum (<3.0.0)
|
49
49
|
Requires-Dist: psutil (==6.1.0)
|
50
50
|
Requires-Dist: pyarrow (>=15.0.0,<15.1.0) ; extra == "file-based"
|
51
51
|
Requires-Dist: pydantic (>=2.7,<3.0)
|
@@ -53,7 +53,7 @@ Requires-Dist: pyjwt (>=2.8.0,<3.0.0)
|
|
53
53
|
Requires-Dist: pyrate-limiter (>=3.1.0,<3.2.0)
|
54
54
|
Requires-Dist: pytesseract (==0.3.10) ; extra == "file-based"
|
55
55
|
Requires-Dist: python-calamine (==0.2.3) ; extra == "file-based"
|
56
|
-
Requires-Dist: python-dateutil
|
56
|
+
Requires-Dist: python-dateutil (>=2.9.0,<3.0.0)
|
57
57
|
Requires-Dist: python-snappy (==0.7.3) ; extra == "file-based"
|
58
58
|
Requires-Dist: python-ulid (>=3.0.0,<4.0.0)
|
59
59
|
Requires-Dist: pytz (==2024.2)
|
@@ -66,9 +66,9 @@ Requires-Dist: tiktoken (==0.8.0) ; extra == "vector-db-based"
|
|
66
66
|
Requires-Dist: unstructured.pytesseract (>=0.3.12) ; extra == "file-based"
|
67
67
|
Requires-Dist: unstructured[docx,pptx] (==0.10.27) ; extra == "file-based"
|
68
68
|
Requires-Dist: wcmatch (==10.0)
|
69
|
+
Requires-Dist: whenever (>=0.6.16,<0.7.0)
|
69
70
|
Requires-Dist: xmltodict (>=0.13,<0.15)
|
70
71
|
Project-URL: Documentation, https://docs.airbyte.io/
|
71
|
-
Project-URL: Homepage, https://airbyte.com
|
72
72
|
Project-URL: Repository, https://github.com/airbytehq/airbyte-python-cdk
|
73
73
|
Description-Content-Type: text/markdown
|
74
74
|
|
{airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/cli/source_declarative_manifest/_run.py
RENAMED
@@ -21,7 +21,6 @@ import pkgutil
|
|
21
21
|
import sys
|
22
22
|
import traceback
|
23
23
|
from collections.abc import Mapping
|
24
|
-
from datetime import datetime
|
25
24
|
from pathlib import Path
|
26
25
|
from typing import Any, cast
|
27
26
|
|
@@ -44,6 +43,7 @@ from airbyte_cdk.sources.declarative.concurrent_declarative_source import (
|
|
44
43
|
)
|
45
44
|
from airbyte_cdk.sources.declarative.yaml_declarative_source import YamlDeclarativeSource
|
46
45
|
from airbyte_cdk.sources.source import TState
|
46
|
+
from airbyte_cdk.utils.datetime_helpers import ab_datetime_now
|
47
47
|
|
48
48
|
|
49
49
|
class SourceLocalYaml(YamlDeclarativeSource):
|
@@ -101,7 +101,7 @@ def _get_local_yaml_source(args: list[str]) -> SourceLocalYaml:
|
|
101
101
|
type=Type.TRACE,
|
102
102
|
trace=AirbyteTraceMessage(
|
103
103
|
type=TraceType.ERROR,
|
104
|
-
emitted_at=
|
104
|
+
emitted_at=ab_datetime_now().to_epoch_millis(),
|
105
105
|
error=AirbyteErrorTraceMessage(
|
106
106
|
message=f"Error starting the sync. This could be due to an invalid configuration or catalog. Please contact Support for assistance. Error: {error}",
|
107
107
|
stack_trace=traceback.format_exc(),
|
@@ -191,7 +191,7 @@ def create_declarative_source(
|
|
191
191
|
type=Type.TRACE,
|
192
192
|
trace=AirbyteTraceMessage(
|
193
193
|
type=TraceType.ERROR,
|
194
|
-
emitted_at=
|
194
|
+
emitted_at=ab_datetime_now().to_epoch_millis(),
|
195
195
|
error=AirbyteErrorTraceMessage(
|
196
196
|
message=f"Error starting the sync. This could be due to an invalid configuration or catalog. Please contact Support for assistance. Error: {error}",
|
197
197
|
stack_trace=traceback.format_exc(),
|
{airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/connector_builder/connector_builder_handler.py
RENAMED
@@ -3,7 +3,6 @@
|
|
3
3
|
#
|
4
4
|
|
5
5
|
import dataclasses
|
6
|
-
from datetime import datetime
|
7
6
|
from typing import Any, List, Mapping
|
8
7
|
|
9
8
|
from airbyte_cdk.connector_builder.message_grouper import MessageGrouper
|
@@ -21,6 +20,7 @@ from airbyte_cdk.sources.declarative.parsers.model_to_component_factory import (
|
|
21
20
|
ModelToComponentFactory,
|
22
21
|
)
|
23
22
|
from airbyte_cdk.utils.airbyte_secrets_utils import filter_secrets
|
23
|
+
from airbyte_cdk.utils.datetime_helpers import ab_datetime_now
|
24
24
|
from airbyte_cdk.utils.traced_exception import AirbyteTracedException
|
25
25
|
|
26
26
|
DEFAULT_MAXIMUM_NUMBER_OF_PAGES_PER_SLICE = 5
|
@@ -114,4 +114,4 @@ def resolve_manifest(source: ManifestDeclarativeSource) -> AirbyteMessage:
|
|
114
114
|
|
115
115
|
|
116
116
|
def _emitted_at() -> int:
|
117
|
-
return
|
117
|
+
return ab_datetime_now().to_epoch_millis()
|
@@ -3,10 +3,9 @@
|
|
3
3
|
#
|
4
4
|
|
5
5
|
from dataclasses import InitVar, dataclass, field
|
6
|
+
from datetime import timedelta
|
6
7
|
from typing import Any, List, Mapping, MutableMapping, Optional, Union
|
7
8
|
|
8
|
-
import pendulum
|
9
|
-
|
10
9
|
from airbyte_cdk.sources.declarative.auth.declarative_authenticator import DeclarativeAuthenticator
|
11
10
|
from airbyte_cdk.sources.declarative.interpolation.interpolated_boolean import InterpolatedBoolean
|
12
11
|
from airbyte_cdk.sources.declarative.interpolation.interpolated_mapping import InterpolatedMapping
|
@@ -18,6 +17,7 @@ from airbyte_cdk.sources.streams.http.requests_native_auth.abstract_oauth import
|
|
18
17
|
from airbyte_cdk.sources.streams.http.requests_native_auth.oauth import (
|
19
18
|
SingleUseRefreshTokenOauth2Authenticator,
|
20
19
|
)
|
20
|
+
from airbyte_cdk.utils.datetime_helpers import AirbyteDateTime, ab_datetime_now, ab_datetime_parse
|
21
21
|
|
22
22
|
|
23
23
|
@dataclass
|
@@ -53,7 +53,7 @@ class DeclarativeOauth2Authenticator(AbstractOauth2Authenticator, DeclarativeAut
|
|
53
53
|
refresh_token: Optional[Union[InterpolatedString, str]] = None
|
54
54
|
scopes: Optional[List[str]] = None
|
55
55
|
token_expiry_date: Optional[Union[InterpolatedString, str]] = None
|
56
|
-
_token_expiry_date: Optional[
|
56
|
+
_token_expiry_date: Optional[AirbyteDateTime] = field(init=False, repr=False, default=None)
|
57
57
|
token_expiry_date_format: Optional[str] = None
|
58
58
|
token_expiry_is_time_of_expiration: bool = False
|
59
59
|
access_token_name: Union[InterpolatedString, str] = "access_token"
|
@@ -122,15 +122,24 @@ class DeclarativeOauth2Authenticator(AbstractOauth2Authenticator, DeclarativeAut
|
|
122
122
|
self._refresh_request_headers = InterpolatedMapping(
|
123
123
|
self.refresh_request_headers or {}, parameters=parameters
|
124
124
|
)
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
125
|
+
try:
|
126
|
+
if (
|
127
|
+
isinstance(self.token_expiry_date, (int, str))
|
128
|
+
and str(self.token_expiry_date).isdigit()
|
129
|
+
):
|
130
|
+
self._token_expiry_date = ab_datetime_parse(self.token_expiry_date)
|
131
|
+
else:
|
132
|
+
self._token_expiry_date = (
|
133
|
+
ab_datetime_parse(
|
134
|
+
InterpolatedString.create(
|
135
|
+
self.token_expiry_date, parameters=parameters
|
136
|
+
).eval(self.config)
|
137
|
+
)
|
138
|
+
if self.token_expiry_date
|
139
|
+
else ab_datetime_now() - timedelta(days=1)
|
129
140
|
)
|
130
|
-
|
131
|
-
|
132
|
-
else pendulum.now().subtract(days=1) # type: ignore # substract does not have type hints
|
133
|
-
)
|
141
|
+
except ValueError as e:
|
142
|
+
raise ValueError(f"Invalid token expiry date format: {e}")
|
134
143
|
self.use_profile_assertion = (
|
135
144
|
InterpolatedBoolean(self.use_profile_assertion, parameters=parameters)
|
136
145
|
if isinstance(self.use_profile_assertion, str)
|
@@ -222,8 +231,8 @@ class DeclarativeOauth2Authenticator(AbstractOauth2Authenticator, DeclarativeAut
|
|
222
231
|
def get_refresh_request_headers(self) -> Mapping[str, Any]:
|
223
232
|
return self._refresh_request_headers.eval(self.config)
|
224
233
|
|
225
|
-
def get_token_expiry_date(self) ->
|
226
|
-
return self._token_expiry_date # type: ignore # _token_expiry_date is
|
234
|
+
def get_token_expiry_date(self) -> AirbyteDateTime:
|
235
|
+
return self._token_expiry_date # type: ignore # _token_expiry_date is an AirbyteDateTime. It is never None despite what mypy thinks
|
227
236
|
|
228
237
|
def set_token_expiry_date(self, value: Union[str, int]) -> None:
|
229
238
|
self._token_expiry_date = self._parse_token_expiration_date(value)
|
{airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/auth/token_provider.py
RENAMED
@@ -9,9 +9,7 @@ from dataclasses import InitVar, dataclass, field
|
|
9
9
|
from typing import Any, List, Mapping, Optional, Union
|
10
10
|
|
11
11
|
import dpath
|
12
|
-
import pendulum
|
13
12
|
from isodate import Duration
|
14
|
-
from pendulum import DateTime
|
15
13
|
|
16
14
|
from airbyte_cdk.sources.declarative.decoders.decoder import Decoder
|
17
15
|
from airbyte_cdk.sources.declarative.decoders.json_decoder import JsonDecoder
|
@@ -21,6 +19,7 @@ from airbyte_cdk.sources.declarative.requesters.requester import Requester
|
|
21
19
|
from airbyte_cdk.sources.http_logger import format_http_message
|
22
20
|
from airbyte_cdk.sources.message import MessageRepository, NoopMessageRepository
|
23
21
|
from airbyte_cdk.sources.types import Config
|
22
|
+
from airbyte_cdk.utils.datetime_helpers import AirbyteDateTime, ab_datetime_now
|
24
23
|
|
25
24
|
|
26
25
|
class TokenProvider:
|
@@ -38,7 +37,7 @@ class SessionTokenProvider(TokenProvider):
|
|
38
37
|
message_repository: MessageRepository = NoopMessageRepository()
|
39
38
|
decoder: Decoder = field(default_factory=lambda: JsonDecoder(parameters={}))
|
40
39
|
|
41
|
-
_next_expiration_time: Optional[
|
40
|
+
_next_expiration_time: Optional[AirbyteDateTime] = None
|
42
41
|
_token: Optional[str] = None
|
43
42
|
|
44
43
|
def get_token(self) -> str:
|
@@ -48,7 +47,7 @@ class SessionTokenProvider(TokenProvider):
|
|
48
47
|
return self._token
|
49
48
|
|
50
49
|
def _refresh_if_necessary(self) -> None:
|
51
|
-
if self._next_expiration_time is None or self._next_expiration_time <
|
50
|
+
if self._next_expiration_time is None or self._next_expiration_time < ab_datetime_now():
|
52
51
|
self._refresh()
|
53
52
|
|
54
53
|
def _refresh(self) -> None:
|
@@ -65,7 +64,7 @@ class SessionTokenProvider(TokenProvider):
|
|
65
64
|
raise ReadException("Failed to get session token, response got ignored by requester")
|
66
65
|
session_token = dpath.get(next(self.decoder.decode(response)), self.session_token_path)
|
67
66
|
if self.expiration_duration is not None:
|
68
|
-
self._next_expiration_time =
|
67
|
+
self._next_expiration_time = ab_datetime_now() + self.expiration_duration
|
69
68
|
self._token = session_token # type: ignore # Returned decoded response will be Mapping and therefore session_token will be str or None
|
70
69
|
|
71
70
|
|
@@ -6,9 +6,6 @@ from abc import abstractmethod
|
|
6
6
|
from datetime import datetime, timedelta, timezone
|
7
7
|
from typing import Any, Callable, List, MutableMapping, Optional, Tuple
|
8
8
|
|
9
|
-
import pendulum
|
10
|
-
from pendulum.datetime import DateTime
|
11
|
-
|
12
9
|
# FIXME We would eventually like the Concurrent package do be agnostic of the declarative package. However, this is a breaking change and
|
13
10
|
# the goal in the short term is only to fix the issue we are seeing for source-declarative-manifest.
|
14
11
|
from airbyte_cdk.sources.declarative.datetime.datetime_parser import DatetimeParser
|
@@ -17,6 +14,7 @@ from airbyte_cdk.sources.streams.concurrent.state_converters.abstract_stream_sta
|
|
17
14
|
AbstractStreamStateConverter,
|
18
15
|
ConcurrencyCompatibleStateType,
|
19
16
|
)
|
17
|
+
from airbyte_cdk.utils.datetime_helpers import AirbyteDateTime, ab_datetime_now, ab_datetime_parse
|
20
18
|
|
21
19
|
|
22
20
|
class DateTimeStreamStateConverter(AbstractStreamStateConverter):
|
@@ -36,7 +34,7 @@ class DateTimeStreamStateConverter(AbstractStreamStateConverter):
|
|
36
34
|
|
37
35
|
@classmethod
|
38
36
|
def get_end_provider(cls) -> Callable[[], datetime]:
|
39
|
-
return
|
37
|
+
return ab_datetime_now
|
40
38
|
|
41
39
|
@abstractmethod
|
42
40
|
def increment(self, timestamp: datetime) -> datetime: ...
|
@@ -136,10 +134,10 @@ class EpochValueConcurrentStreamStateConverter(DateTimeStreamStateConverter):
|
|
136
134
|
return int(timestamp.timestamp())
|
137
135
|
|
138
136
|
def parse_timestamp(self, timestamp: int) -> datetime:
|
139
|
-
dt_object =
|
140
|
-
if not isinstance(dt_object,
|
137
|
+
dt_object = AirbyteDateTime.fromtimestamp(timestamp, timezone.utc)
|
138
|
+
if not isinstance(dt_object, AirbyteDateTime):
|
141
139
|
raise ValueError(
|
142
|
-
f"
|
140
|
+
f"AirbyteDateTime object was expected but got {type(dt_object)} from AirbyteDateTime.fromtimestamp({timestamp})"
|
143
141
|
)
|
144
142
|
return dt_object
|
145
143
|
|
@@ -169,14 +167,25 @@ class IsoMillisConcurrentStreamStateConverter(DateTimeStreamStateConverter):
|
|
169
167
|
def increment(self, timestamp: datetime) -> datetime:
|
170
168
|
return timestamp + self._cursor_granularity
|
171
169
|
|
172
|
-
def output_format(self, timestamp: datetime) ->
|
173
|
-
|
170
|
+
def output_format(self, timestamp: datetime) -> str:
|
171
|
+
"""Format datetime with milliseconds always included.
|
172
|
+
|
173
|
+
Args:
|
174
|
+
timestamp: The datetime to format.
|
175
|
+
|
176
|
+
Returns:
|
177
|
+
str: ISO8601/RFC3339 formatted string with milliseconds.
|
178
|
+
"""
|
179
|
+
dt = AirbyteDateTime.from_datetime(timestamp)
|
180
|
+
# Always include milliseconds, even if zero
|
181
|
+
millis = dt.microsecond // 1000 if dt.microsecond else 0
|
182
|
+
return f"{dt.year:04d}-{dt.month:02d}-{dt.day:02d}T{dt.hour:02d}:{dt.minute:02d}:{dt.second:02d}.{millis:03d}Z"
|
174
183
|
|
175
184
|
def parse_timestamp(self, timestamp: str) -> datetime:
|
176
|
-
dt_object =
|
177
|
-
if not isinstance(dt_object,
|
185
|
+
dt_object = ab_datetime_parse(timestamp)
|
186
|
+
if not isinstance(dt_object, AirbyteDateTime):
|
178
187
|
raise ValueError(
|
179
|
-
f"
|
188
|
+
f"AirbyteDateTime object was expected but got {type(dt_object)} from parse({timestamp})"
|
180
189
|
)
|
181
190
|
return dt_object
|
182
191
|
|
@@ -184,7 +193,7 @@ class IsoMillisConcurrentStreamStateConverter(DateTimeStreamStateConverter):
|
|
184
193
|
class CustomFormatConcurrentStreamStateConverter(IsoMillisConcurrentStreamStateConverter):
|
185
194
|
"""
|
186
195
|
Datetime State converter that emits state according to the supplied datetime format. The converter supports reading
|
187
|
-
incoming state in any valid datetime format
|
196
|
+
incoming state in any valid datetime format using AirbyteDateTime parsing utilities.
|
188
197
|
"""
|
189
198
|
|
190
199
|
def __init__(
|
@@ -223,17 +223,17 @@ class Stream(ABC):
|
|
223
223
|
record_counter += 1
|
224
224
|
|
225
225
|
checkpoint_interval = self.state_checkpoint_interval
|
226
|
-
checkpoint = checkpoint_reader.get_checkpoint()
|
227
226
|
if (
|
228
227
|
should_checkpoint
|
229
228
|
and checkpoint_interval
|
230
229
|
and record_counter % checkpoint_interval == 0
|
231
|
-
and checkpoint is not None
|
232
230
|
):
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
231
|
+
checkpoint = checkpoint_reader.get_checkpoint()
|
232
|
+
if checkpoint:
|
233
|
+
airbyte_state_message = self._checkpoint_state(
|
234
|
+
checkpoint, state_manager=state_manager
|
235
|
+
)
|
236
|
+
yield airbyte_state_message
|
237
237
|
|
238
238
|
if internal_config.is_limit_reached(record_counter):
|
239
239
|
break
|
@@ -4,11 +4,11 @@
|
|
4
4
|
|
5
5
|
import logging
|
6
6
|
from abc import abstractmethod
|
7
|
+
from datetime import timedelta
|
7
8
|
from json import JSONDecodeError
|
8
9
|
from typing import Any, List, Mapping, MutableMapping, Optional, Tuple, Union
|
9
10
|
|
10
11
|
import backoff
|
11
|
-
import pendulum
|
12
12
|
import requests
|
13
13
|
from requests.auth import AuthBase
|
14
14
|
|
@@ -17,6 +17,7 @@ from airbyte_cdk.sources.http_logger import format_http_message
|
|
17
17
|
from airbyte_cdk.sources.message import MessageRepository, NoopMessageRepository
|
18
18
|
from airbyte_cdk.utils import AirbyteTracedException
|
19
19
|
from airbyte_cdk.utils.airbyte_secrets_utils import add_to_secrets
|
20
|
+
from airbyte_cdk.utils.datetime_helpers import AirbyteDateTime, ab_datetime_now, ab_datetime_parse
|
20
21
|
|
21
22
|
from ..exceptions import DefaultBackoffException
|
22
23
|
|
@@ -72,7 +73,7 @@ class AbstractOauth2Authenticator(AuthBase):
|
|
72
73
|
|
73
74
|
def token_has_expired(self) -> bool:
|
74
75
|
"""Returns True if the token is expired"""
|
75
|
-
return
|
76
|
+
return ab_datetime_now() > self.get_token_expiry_date()
|
76
77
|
|
77
78
|
def build_refresh_request_body(self) -> Mapping[str, Any]:
|
78
79
|
"""
|
@@ -179,7 +180,7 @@ class AbstractOauth2Authenticator(AuthBase):
|
|
179
180
|
self.get_expires_in_name()
|
180
181
|
]
|
181
182
|
|
182
|
-
def _parse_token_expiration_date(self, value: Union[str, int]) ->
|
183
|
+
def _parse_token_expiration_date(self, value: Union[str, int]) -> AirbyteDateTime:
|
183
184
|
"""
|
184
185
|
Return the expiration datetime of the refresh token
|
185
186
|
|
@@ -191,9 +192,19 @@ class AbstractOauth2Authenticator(AuthBase):
|
|
191
192
|
raise ValueError(
|
192
193
|
f"Invalid token expiry date format {self.token_expiry_date_format}; a string representing the format is required."
|
193
194
|
)
|
194
|
-
|
195
|
+
try:
|
196
|
+
return ab_datetime_parse(str(value))
|
197
|
+
except ValueError as e:
|
198
|
+
raise ValueError(f"Invalid token expiry date format: {e}")
|
195
199
|
else:
|
196
|
-
|
200
|
+
try:
|
201
|
+
# Only accept numeric values (as int/float/string) when no format specified
|
202
|
+
seconds = int(float(str(value)))
|
203
|
+
return ab_datetime_now() + timedelta(seconds=seconds)
|
204
|
+
except (ValueError, TypeError):
|
205
|
+
raise ValueError(
|
206
|
+
f"Invalid expires_in value: {value}. Expected number of seconds when no format specified."
|
207
|
+
)
|
197
208
|
|
198
209
|
@property
|
199
210
|
def token_expiry_is_time_of_expiration(self) -> bool:
|
@@ -244,7 +255,7 @@ class AbstractOauth2Authenticator(AuthBase):
|
|
244
255
|
"""List of requested scopes"""
|
245
256
|
|
246
257
|
@abstractmethod
|
247
|
-
def get_token_expiry_date(self) ->
|
258
|
+
def get_token_expiry_date(self) -> AirbyteDateTime:
|
248
259
|
"""Expiration date of the access token"""
|
249
260
|
|
250
261
|
@abstractmethod
|
@@ -2,10 +2,10 @@
|
|
2
2
|
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
3
3
|
#
|
4
4
|
|
5
|
+
from datetime import timedelta
|
5
6
|
from typing import Any, List, Mapping, Optional, Sequence, Tuple, Union
|
6
7
|
|
7
8
|
import dpath
|
8
|
-
import pendulum
|
9
9
|
|
10
10
|
from airbyte_cdk.config_observation import (
|
11
11
|
create_connector_config_control_message,
|
@@ -15,6 +15,11 @@ from airbyte_cdk.sources.message import MessageRepository, NoopMessageRepository
|
|
15
15
|
from airbyte_cdk.sources.streams.http.requests_native_auth.abstract_oauth import (
|
16
16
|
AbstractOauth2Authenticator,
|
17
17
|
)
|
18
|
+
from airbyte_cdk.utils.datetime_helpers import (
|
19
|
+
AirbyteDateTime,
|
20
|
+
ab_datetime_now,
|
21
|
+
ab_datetime_parse,
|
22
|
+
)
|
18
23
|
|
19
24
|
|
20
25
|
class Oauth2Authenticator(AbstractOauth2Authenticator):
|
@@ -34,7 +39,7 @@ class Oauth2Authenticator(AbstractOauth2Authenticator):
|
|
34
39
|
client_secret_name: str = "client_secret",
|
35
40
|
refresh_token_name: str = "refresh_token",
|
36
41
|
scopes: List[str] | None = None,
|
37
|
-
token_expiry_date:
|
42
|
+
token_expiry_date: AirbyteDateTime | None = None,
|
38
43
|
token_expiry_date_format: str | None = None,
|
39
44
|
access_token_name: str = "access_token",
|
40
45
|
expires_in_name: str = "expires_in",
|
@@ -62,7 +67,7 @@ class Oauth2Authenticator(AbstractOauth2Authenticator):
|
|
62
67
|
self._grant_type_name = grant_type_name
|
63
68
|
self._grant_type = grant_type
|
64
69
|
|
65
|
-
self._token_expiry_date = token_expiry_date or
|
70
|
+
self._token_expiry_date = token_expiry_date or (ab_datetime_now() - timedelta(days=1))
|
66
71
|
self._token_expiry_date_format = token_expiry_date_format
|
67
72
|
self._token_expiry_is_time_of_expiration = token_expiry_is_time_of_expiration
|
68
73
|
self._access_token = None
|
@@ -112,7 +117,7 @@ class Oauth2Authenticator(AbstractOauth2Authenticator):
|
|
112
117
|
def get_grant_type(self) -> str:
|
113
118
|
return self._grant_type
|
114
119
|
|
115
|
-
def get_token_expiry_date(self) ->
|
120
|
+
def get_token_expiry_date(self) -> AirbyteDateTime:
|
116
121
|
return self._token_expiry_date
|
117
122
|
|
118
123
|
def set_token_expiry_date(self, value: Union[str, int]) -> None:
|
@@ -276,17 +281,24 @@ class SingleUseRefreshTokenOauth2Authenticator(Oauth2Authenticator):
|
|
276
281
|
new_refresh_token,
|
277
282
|
)
|
278
283
|
|
279
|
-
def get_token_expiry_date(self) ->
|
284
|
+
def get_token_expiry_date(self) -> AirbyteDateTime:
|
280
285
|
expiry_date = dpath.get(
|
281
286
|
self._connector_config, # type: ignore[arg-type]
|
282
287
|
self._token_expiry_date_config_path,
|
283
288
|
default="",
|
284
289
|
)
|
285
|
-
|
290
|
+
result = (
|
291
|
+
ab_datetime_now() - timedelta(days=1)
|
292
|
+
if expiry_date == ""
|
293
|
+
else ab_datetime_parse(str(expiry_date))
|
294
|
+
)
|
295
|
+
if isinstance(result, AirbyteDateTime):
|
296
|
+
return result
|
297
|
+
raise TypeError("Invalid datetime conversion")
|
286
298
|
|
287
299
|
def set_token_expiry_date( # type: ignore[override]
|
288
300
|
self,
|
289
|
-
new_token_expiry_date:
|
301
|
+
new_token_expiry_date: AirbyteDateTime,
|
290
302
|
) -> None:
|
291
303
|
dpath.new(
|
292
304
|
self._connector_config, # type: ignore[arg-type]
|
@@ -296,17 +308,17 @@ class SingleUseRefreshTokenOauth2Authenticator(Oauth2Authenticator):
|
|
296
308
|
|
297
309
|
def token_has_expired(self) -> bool:
|
298
310
|
"""Returns True if the token is expired"""
|
299
|
-
return
|
311
|
+
return ab_datetime_now() > self.get_token_expiry_date()
|
300
312
|
|
301
313
|
@staticmethod
|
302
314
|
def get_new_token_expiry_date(
|
303
315
|
access_token_expires_in: str,
|
304
316
|
token_expiry_date_format: str | None = None,
|
305
|
-
) ->
|
317
|
+
) -> AirbyteDateTime:
|
306
318
|
if token_expiry_date_format:
|
307
|
-
return
|
319
|
+
return ab_datetime_parse(access_token_expires_in)
|
308
320
|
else:
|
309
|
-
return
|
321
|
+
return ab_datetime_now() + timedelta(seconds=int(access_token_expires_in))
|
310
322
|
|
311
323
|
def get_access_token(self) -> str:
|
312
324
|
"""Retrieve new access and refresh token if the access token has expired.
|
@@ -318,7 +330,7 @@ class SingleUseRefreshTokenOauth2Authenticator(Oauth2Authenticator):
|
|
318
330
|
new_access_token, access_token_expires_in, new_refresh_token = (
|
319
331
|
self.refresh_access_token()
|
320
332
|
)
|
321
|
-
new_token_expiry_date:
|
333
|
+
new_token_expiry_date: AirbyteDateTime = self.get_new_token_expiry_date(
|
322
334
|
access_token_expires_in, self._token_expiry_date_format
|
323
335
|
)
|
324
336
|
self.access_token = new_access_token
|
@@ -3,7 +3,6 @@
|
|
3
3
|
#
|
4
4
|
|
5
5
|
import logging
|
6
|
-
from distutils.util import strtobool
|
7
6
|
from enum import Flag, auto
|
8
7
|
from typing import Any, Callable, Dict, Generator, Mapping, Optional, cast
|
9
8
|
|
@@ -22,6 +21,28 @@ python_to_json = {v: k for k, v in json_to_python.items()}
|
|
22
21
|
|
23
22
|
logger = logging.getLogger("airbyte")
|
24
23
|
|
24
|
+
_TRUTHY_STRINGS = ("y", "yes", "t", "true", "on", "1")
|
25
|
+
_FALSEY_STRINGS = ("n", "no", "f", "false", "off", "0")
|
26
|
+
|
27
|
+
|
28
|
+
def _strtobool(value: str, /) -> int:
|
29
|
+
"""Mimic the behavior of distutils.util.strtobool.
|
30
|
+
|
31
|
+
From: https://docs.python.org/2/distutils/apiref.html#distutils.util.strtobool
|
32
|
+
|
33
|
+
> Convert a string representation of truth to true (1) or false (0).
|
34
|
+
> True values are y, yes, t, true, on and 1; false values are n, no, f, false, off and 0. Raises
|
35
|
+
> `ValueError` if val is anything else.
|
36
|
+
"""
|
37
|
+
normalized_str = value.lower().strip()
|
38
|
+
if normalized_str in _TRUTHY_STRINGS:
|
39
|
+
return 1
|
40
|
+
|
41
|
+
if normalized_str in _FALSEY_STRINGS:
|
42
|
+
return 0
|
43
|
+
|
44
|
+
raise ValueError(f"Invalid boolean value: {normalized_str}")
|
45
|
+
|
25
46
|
|
26
47
|
class TransformConfig(Flag):
|
27
48
|
"""
|
@@ -129,7 +150,7 @@ class TypeTransformer:
|
|
129
150
|
return int(original_item)
|
130
151
|
elif target_type == "boolean":
|
131
152
|
if isinstance(original_item, str):
|
132
|
-
return
|
153
|
+
return _strtobool(original_item) == 1
|
133
154
|
return bool(original_item)
|
134
155
|
elif target_type == "array":
|
135
156
|
item_types = set(subschema.get("items", {}).get("type", set()))
|