airbyte-cdk 0.0.0.dev0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- airbyte_cdk/__init__.py +358 -0
- airbyte_cdk/cli/__init__.py +1 -0
- airbyte_cdk/cli/source_declarative_manifest/__init__.py +5 -0
- airbyte_cdk/cli/source_declarative_manifest/_run.py +236 -0
- airbyte_cdk/cli/source_declarative_manifest/spec.json +17 -0
- airbyte_cdk/config_observation.py +104 -0
- airbyte_cdk/connector.py +123 -0
- airbyte_cdk/connector_builder/README.md +53 -0
- airbyte_cdk/connector_builder/__init__.py +3 -0
- airbyte_cdk/connector_builder/connector_builder_handler.py +121 -0
- airbyte_cdk/connector_builder/main.py +107 -0
- airbyte_cdk/connector_builder/models.py +73 -0
- airbyte_cdk/connector_builder/test_reader/__init__.py +7 -0
- airbyte_cdk/connector_builder/test_reader/helpers.py +689 -0
- airbyte_cdk/connector_builder/test_reader/message_grouper.py +173 -0
- airbyte_cdk/connector_builder/test_reader/reader.py +441 -0
- airbyte_cdk/connector_builder/test_reader/types.py +83 -0
- airbyte_cdk/destinations/__init__.py +8 -0
- airbyte_cdk/destinations/destination.py +154 -0
- airbyte_cdk/destinations/vector_db_based/README.md +37 -0
- airbyte_cdk/destinations/vector_db_based/__init__.py +38 -0
- airbyte_cdk/destinations/vector_db_based/config.py +298 -0
- airbyte_cdk/destinations/vector_db_based/document_processor.py +223 -0
- airbyte_cdk/destinations/vector_db_based/embedder.py +303 -0
- airbyte_cdk/destinations/vector_db_based/indexer.py +78 -0
- airbyte_cdk/destinations/vector_db_based/test_utils.py +63 -0
- airbyte_cdk/destinations/vector_db_based/utils.py +35 -0
- airbyte_cdk/destinations/vector_db_based/writer.py +104 -0
- airbyte_cdk/entrypoint.py +414 -0
- airbyte_cdk/exception_handler.py +56 -0
- airbyte_cdk/logger.py +109 -0
- airbyte_cdk/models/__init__.py +72 -0
- airbyte_cdk/models/airbyte_protocol.py +88 -0
- airbyte_cdk/models/airbyte_protocol_serializers.py +44 -0
- airbyte_cdk/models/well_known_types.py +5 -0
- airbyte_cdk/py.typed +0 -0
- airbyte_cdk/sources/__init__.py +26 -0
- airbyte_cdk/sources/abstract_source.py +326 -0
- airbyte_cdk/sources/concurrent_source/__init__.py +8 -0
- airbyte_cdk/sources/concurrent_source/concurrent_read_processor.py +255 -0
- airbyte_cdk/sources/concurrent_source/concurrent_source.py +165 -0
- airbyte_cdk/sources/concurrent_source/concurrent_source_adapter.py +147 -0
- airbyte_cdk/sources/concurrent_source/partition_generation_completed_sentinel.py +24 -0
- airbyte_cdk/sources/concurrent_source/stream_thread_exception.py +25 -0
- airbyte_cdk/sources/concurrent_source/thread_pool_manager.py +115 -0
- airbyte_cdk/sources/config.py +27 -0
- airbyte_cdk/sources/connector_state_manager.py +161 -0
- airbyte_cdk/sources/declarative/__init__.py +3 -0
- airbyte_cdk/sources/declarative/async_job/__init__.py +0 -0
- airbyte_cdk/sources/declarative/async_job/job.py +52 -0
- airbyte_cdk/sources/declarative/async_job/job_orchestrator.py +525 -0
- airbyte_cdk/sources/declarative/async_job/job_tracker.py +79 -0
- airbyte_cdk/sources/declarative/async_job/repository.py +35 -0
- airbyte_cdk/sources/declarative/async_job/status.py +24 -0
- airbyte_cdk/sources/declarative/async_job/timer.py +39 -0
- airbyte_cdk/sources/declarative/auth/__init__.py +8 -0
- airbyte_cdk/sources/declarative/auth/declarative_authenticator.py +42 -0
- airbyte_cdk/sources/declarative/auth/jwt.py +197 -0
- airbyte_cdk/sources/declarative/auth/oauth.py +293 -0
- airbyte_cdk/sources/declarative/auth/selective_authenticator.py +45 -0
- airbyte_cdk/sources/declarative/auth/token.py +267 -0
- airbyte_cdk/sources/declarative/auth/token_provider.py +82 -0
- airbyte_cdk/sources/declarative/checks/__init__.py +24 -0
- airbyte_cdk/sources/declarative/checks/check_dynamic_stream.py +61 -0
- airbyte_cdk/sources/declarative/checks/check_stream.py +56 -0
- airbyte_cdk/sources/declarative/checks/connection_checker.py +35 -0
- airbyte_cdk/sources/declarative/concurrency_level/__init__.py +7 -0
- airbyte_cdk/sources/declarative/concurrency_level/concurrency_level.py +50 -0
- airbyte_cdk/sources/declarative/concurrent_declarative_source.py +526 -0
- airbyte_cdk/sources/declarative/datetime/__init__.py +3 -0
- airbyte_cdk/sources/declarative/datetime/datetime_parser.py +65 -0
- airbyte_cdk/sources/declarative/datetime/min_max_datetime.py +118 -0
- airbyte_cdk/sources/declarative/declarative_component_schema.yaml +3975 -0
- airbyte_cdk/sources/declarative/declarative_source.py +36 -0
- airbyte_cdk/sources/declarative/declarative_stream.py +241 -0
- airbyte_cdk/sources/declarative/decoders/__init__.py +33 -0
- airbyte_cdk/sources/declarative/decoders/composite_raw_decoder.py +218 -0
- airbyte_cdk/sources/declarative/decoders/decoder.py +32 -0
- airbyte_cdk/sources/declarative/decoders/decoder_parser.py +30 -0
- airbyte_cdk/sources/declarative/decoders/json_decoder.py +65 -0
- airbyte_cdk/sources/declarative/decoders/noop_decoder.py +21 -0
- airbyte_cdk/sources/declarative/decoders/pagination_decoder_decorator.py +39 -0
- airbyte_cdk/sources/declarative/decoders/xml_decoder.py +98 -0
- airbyte_cdk/sources/declarative/decoders/zipfile_decoder.py +56 -0
- airbyte_cdk/sources/declarative/exceptions.py +9 -0
- airbyte_cdk/sources/declarative/extractors/__init__.py +21 -0
- airbyte_cdk/sources/declarative/extractors/dpath_extractor.py +86 -0
- airbyte_cdk/sources/declarative/extractors/http_selector.py +37 -0
- airbyte_cdk/sources/declarative/extractors/record_extractor.py +27 -0
- airbyte_cdk/sources/declarative/extractors/record_filter.py +91 -0
- airbyte_cdk/sources/declarative/extractors/record_selector.py +170 -0
- airbyte_cdk/sources/declarative/extractors/response_to_file_extractor.py +176 -0
- airbyte_cdk/sources/declarative/extractors/type_transformer.py +55 -0
- airbyte_cdk/sources/declarative/incremental/__init__.py +37 -0
- airbyte_cdk/sources/declarative/incremental/concurrent_partition_cursor.py +497 -0
- airbyte_cdk/sources/declarative/incremental/datetime_based_cursor.py +459 -0
- airbyte_cdk/sources/declarative/incremental/declarative_cursor.py +13 -0
- airbyte_cdk/sources/declarative/incremental/global_substream_cursor.py +357 -0
- airbyte_cdk/sources/declarative/incremental/per_partition_cursor.py +380 -0
- airbyte_cdk/sources/declarative/incremental/per_partition_with_global.py +200 -0
- airbyte_cdk/sources/declarative/incremental/resumable_full_refresh_cursor.py +122 -0
- airbyte_cdk/sources/declarative/interpolation/__init__.py +9 -0
- airbyte_cdk/sources/declarative/interpolation/filters.py +139 -0
- airbyte_cdk/sources/declarative/interpolation/interpolated_boolean.py +66 -0
- airbyte_cdk/sources/declarative/interpolation/interpolated_mapping.py +56 -0
- airbyte_cdk/sources/declarative/interpolation/interpolated_nested_mapping.py +52 -0
- airbyte_cdk/sources/declarative/interpolation/interpolated_string.py +79 -0
- airbyte_cdk/sources/declarative/interpolation/interpolation.py +34 -0
- airbyte_cdk/sources/declarative/interpolation/jinja.py +161 -0
- airbyte_cdk/sources/declarative/interpolation/macros.py +191 -0
- airbyte_cdk/sources/declarative/manifest_declarative_source.py +421 -0
- airbyte_cdk/sources/declarative/migrations/__init__.py +0 -0
- airbyte_cdk/sources/declarative/migrations/legacy_to_per_partition_state_migration.py +98 -0
- airbyte_cdk/sources/declarative/migrations/state_migration.py +24 -0
- airbyte_cdk/sources/declarative/models/__init__.py +2 -0
- airbyte_cdk/sources/declarative/models/declarative_component_schema.py +2503 -0
- airbyte_cdk/sources/declarative/parsers/__init__.py +3 -0
- airbyte_cdk/sources/declarative/parsers/custom_code_compiler.py +157 -0
- airbyte_cdk/sources/declarative/parsers/custom_exceptions.py +21 -0
- airbyte_cdk/sources/declarative/parsers/manifest_component_transformer.py +172 -0
- airbyte_cdk/sources/declarative/parsers/manifest_reference_resolver.py +213 -0
- airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py +3407 -0
- airbyte_cdk/sources/declarative/partition_routers/__init__.py +29 -0
- airbyte_cdk/sources/declarative/partition_routers/async_job_partition_router.py +65 -0
- airbyte_cdk/sources/declarative/partition_routers/cartesian_product_stream_slicer.py +176 -0
- airbyte_cdk/sources/declarative/partition_routers/list_partition_router.py +121 -0
- airbyte_cdk/sources/declarative/partition_routers/partition_router.py +62 -0
- airbyte_cdk/sources/declarative/partition_routers/single_partition_router.py +63 -0
- airbyte_cdk/sources/declarative/partition_routers/substream_partition_router.py +437 -0
- airbyte_cdk/sources/declarative/requesters/README.md +56 -0
- airbyte_cdk/sources/declarative/requesters/__init__.py +9 -0
- airbyte_cdk/sources/declarative/requesters/error_handlers/__init__.py +25 -0
- airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/__init__.py +23 -0
- airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/constant_backoff_strategy.py +45 -0
- airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/exponential_backoff_strategy.py +45 -0
- airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/header_helper.py +41 -0
- airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/wait_time_from_header_backoff_strategy.py +70 -0
- airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/wait_until_time_from_header_backoff_strategy.py +77 -0
- airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategy.py +17 -0
- airbyte_cdk/sources/declarative/requesters/error_handlers/composite_error_handler.py +101 -0
- airbyte_cdk/sources/declarative/requesters/error_handlers/default_error_handler.py +147 -0
- airbyte_cdk/sources/declarative/requesters/error_handlers/default_http_response_filter.py +40 -0
- airbyte_cdk/sources/declarative/requesters/error_handlers/error_handler.py +17 -0
- airbyte_cdk/sources/declarative/requesters/error_handlers/http_response_filter.py +179 -0
- airbyte_cdk/sources/declarative/requesters/http_job_repository.py +350 -0
- airbyte_cdk/sources/declarative/requesters/http_requester.py +433 -0
- airbyte_cdk/sources/declarative/requesters/paginators/__init__.py +21 -0
- airbyte_cdk/sources/declarative/requesters/paginators/default_paginator.py +327 -0
- airbyte_cdk/sources/declarative/requesters/paginators/no_pagination.py +76 -0
- airbyte_cdk/sources/declarative/requesters/paginators/paginator.py +65 -0
- airbyte_cdk/sources/declarative/requesters/paginators/strategies/__init__.py +25 -0
- airbyte_cdk/sources/declarative/requesters/paginators/strategies/cursor_pagination_strategy.py +98 -0
- airbyte_cdk/sources/declarative/requesters/paginators/strategies/offset_increment.py +102 -0
- airbyte_cdk/sources/declarative/requesters/paginators/strategies/page_increment.py +71 -0
- airbyte_cdk/sources/declarative/requesters/paginators/strategies/pagination_strategy.py +48 -0
- airbyte_cdk/sources/declarative/requesters/paginators/strategies/stop_condition.py +66 -0
- airbyte_cdk/sources/declarative/requesters/request_option.py +117 -0
- airbyte_cdk/sources/declarative/requesters/request_options/__init__.py +23 -0
- airbyte_cdk/sources/declarative/requesters/request_options/datetime_based_request_options_provider.py +92 -0
- airbyte_cdk/sources/declarative/requesters/request_options/default_request_options_provider.py +60 -0
- airbyte_cdk/sources/declarative/requesters/request_options/interpolated_nested_request_input_provider.py +59 -0
- airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_input_provider.py +68 -0
- airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_options_provider.py +119 -0
- airbyte_cdk/sources/declarative/requesters/request_options/request_options_provider.py +79 -0
- airbyte_cdk/sources/declarative/requesters/request_path.py +15 -0
- airbyte_cdk/sources/declarative/requesters/requester.py +144 -0
- airbyte_cdk/sources/declarative/resolvers/__init__.py +41 -0
- airbyte_cdk/sources/declarative/resolvers/components_resolver.py +55 -0
- airbyte_cdk/sources/declarative/resolvers/config_components_resolver.py +136 -0
- airbyte_cdk/sources/declarative/resolvers/http_components_resolver.py +112 -0
- airbyte_cdk/sources/declarative/retrievers/__init__.py +19 -0
- airbyte_cdk/sources/declarative/retrievers/async_retriever.py +124 -0
- airbyte_cdk/sources/declarative/retrievers/file_uploader.py +89 -0
- airbyte_cdk/sources/declarative/retrievers/retriever.py +54 -0
- airbyte_cdk/sources/declarative/retrievers/simple_retriever.py +702 -0
- airbyte_cdk/sources/declarative/schema/__init__.py +25 -0
- airbyte_cdk/sources/declarative/schema/default_schema_loader.py +47 -0
- airbyte_cdk/sources/declarative/schema/dynamic_schema_loader.py +285 -0
- airbyte_cdk/sources/declarative/schema/inline_schema_loader.py +19 -0
- airbyte_cdk/sources/declarative/schema/json_file_schema_loader.py +92 -0
- airbyte_cdk/sources/declarative/schema/schema_loader.py +17 -0
- airbyte_cdk/sources/declarative/spec/__init__.py +7 -0
- airbyte_cdk/sources/declarative/spec/spec.py +48 -0
- airbyte_cdk/sources/declarative/stream_slicers/__init__.py +7 -0
- airbyte_cdk/sources/declarative/stream_slicers/declarative_partition_generator.py +93 -0
- airbyte_cdk/sources/declarative/stream_slicers/stream_slicer.py +25 -0
- airbyte_cdk/sources/declarative/transformations/__init__.py +17 -0
- airbyte_cdk/sources/declarative/transformations/add_fields.py +146 -0
- airbyte_cdk/sources/declarative/transformations/dpath_flatten_fields.py +61 -0
- airbyte_cdk/sources/declarative/transformations/flatten_fields.py +52 -0
- airbyte_cdk/sources/declarative/transformations/keys_replace_transformation.py +61 -0
- airbyte_cdk/sources/declarative/transformations/keys_to_lower_transformation.py +22 -0
- airbyte_cdk/sources/declarative/transformations/keys_to_snake_transformation.py +68 -0
- airbyte_cdk/sources/declarative/transformations/remove_fields.py +75 -0
- airbyte_cdk/sources/declarative/transformations/transformation.py +37 -0
- airbyte_cdk/sources/declarative/types.py +25 -0
- airbyte_cdk/sources/declarative/yaml_declarative_source.py +67 -0
- airbyte_cdk/sources/file_based/README.md +152 -0
- airbyte_cdk/sources/file_based/__init__.py +24 -0
- airbyte_cdk/sources/file_based/availability_strategy/__init__.py +11 -0
- airbyte_cdk/sources/file_based/availability_strategy/abstract_file_based_availability_strategy.py +73 -0
- airbyte_cdk/sources/file_based/availability_strategy/default_file_based_availability_strategy.py +149 -0
- airbyte_cdk/sources/file_based/config/__init__.py +0 -0
- airbyte_cdk/sources/file_based/config/abstract_file_based_spec.py +153 -0
- airbyte_cdk/sources/file_based/config/avro_format.py +25 -0
- airbyte_cdk/sources/file_based/config/csv_format.py +210 -0
- airbyte_cdk/sources/file_based/config/excel_format.py +18 -0
- airbyte_cdk/sources/file_based/config/file_based_stream_config.py +99 -0
- airbyte_cdk/sources/file_based/config/jsonl_format.py +18 -0
- airbyte_cdk/sources/file_based/config/parquet_format.py +25 -0
- airbyte_cdk/sources/file_based/config/unstructured_format.py +102 -0
- airbyte_cdk/sources/file_based/config/validate_config_transfer_modes.py +81 -0
- airbyte_cdk/sources/file_based/discovery_policy/__init__.py +8 -0
- airbyte_cdk/sources/file_based/discovery_policy/abstract_discovery_policy.py +21 -0
- airbyte_cdk/sources/file_based/discovery_policy/default_discovery_policy.py +33 -0
- airbyte_cdk/sources/file_based/exceptions.py +159 -0
- airbyte_cdk/sources/file_based/file_based_source.py +466 -0
- airbyte_cdk/sources/file_based/file_based_stream_permissions_reader.py +123 -0
- airbyte_cdk/sources/file_based/file_based_stream_reader.py +209 -0
- airbyte_cdk/sources/file_based/file_record_data.py +22 -0
- airbyte_cdk/sources/file_based/file_types/__init__.py +37 -0
- airbyte_cdk/sources/file_based/file_types/avro_parser.py +233 -0
- airbyte_cdk/sources/file_based/file_types/csv_parser.py +527 -0
- airbyte_cdk/sources/file_based/file_types/excel_parser.py +196 -0
- airbyte_cdk/sources/file_based/file_types/file_transfer.py +30 -0
- airbyte_cdk/sources/file_based/file_types/file_type_parser.py +86 -0
- airbyte_cdk/sources/file_based/file_types/jsonl_parser.py +145 -0
- airbyte_cdk/sources/file_based/file_types/parquet_parser.py +275 -0
- airbyte_cdk/sources/file_based/file_types/unstructured_parser.py +480 -0
- airbyte_cdk/sources/file_based/remote_file.py +18 -0
- airbyte_cdk/sources/file_based/schema_helpers.py +281 -0
- airbyte_cdk/sources/file_based/schema_validation_policies/__init__.py +17 -0
- airbyte_cdk/sources/file_based/schema_validation_policies/abstract_schema_validation_policy.py +20 -0
- airbyte_cdk/sources/file_based/schema_validation_policies/default_schema_validation_policies.py +52 -0
- airbyte_cdk/sources/file_based/stream/__init__.py +13 -0
- airbyte_cdk/sources/file_based/stream/abstract_file_based_stream.py +197 -0
- airbyte_cdk/sources/file_based/stream/concurrent/__init__.py +0 -0
- airbyte_cdk/sources/file_based/stream/concurrent/adapters.py +343 -0
- airbyte_cdk/sources/file_based/stream/concurrent/cursor/__init__.py +9 -0
- airbyte_cdk/sources/file_based/stream/concurrent/cursor/abstract_concurrent_file_based_cursor.py +59 -0
- airbyte_cdk/sources/file_based/stream/concurrent/cursor/file_based_concurrent_cursor.py +313 -0
- airbyte_cdk/sources/file_based/stream/concurrent/cursor/file_based_final_state_cursor.py +83 -0
- airbyte_cdk/sources/file_based/stream/cursor/__init__.py +4 -0
- airbyte_cdk/sources/file_based/stream/cursor/abstract_file_based_cursor.py +66 -0
- airbyte_cdk/sources/file_based/stream/cursor/default_file_based_cursor.py +149 -0
- airbyte_cdk/sources/file_based/stream/default_file_based_stream.py +396 -0
- airbyte_cdk/sources/file_based/stream/identities_stream.py +49 -0
- airbyte_cdk/sources/file_based/stream/permissions_file_based_stream.py +92 -0
- airbyte_cdk/sources/file_based/types.py +10 -0
- airbyte_cdk/sources/http_config.py +10 -0
- airbyte_cdk/sources/http_logger.py +55 -0
- airbyte_cdk/sources/message/__init__.py +19 -0
- airbyte_cdk/sources/message/repository.py +137 -0
- airbyte_cdk/sources/source.py +95 -0
- airbyte_cdk/sources/specs/transfer_modes.py +26 -0
- airbyte_cdk/sources/streams/__init__.py +8 -0
- airbyte_cdk/sources/streams/availability_strategy.py +84 -0
- airbyte_cdk/sources/streams/call_rate.py +704 -0
- airbyte_cdk/sources/streams/checkpoint/__init__.py +26 -0
- airbyte_cdk/sources/streams/checkpoint/checkpoint_reader.py +335 -0
- airbyte_cdk/sources/streams/checkpoint/cursor.py +77 -0
- airbyte_cdk/sources/streams/checkpoint/per_partition_key_serializer.py +22 -0
- airbyte_cdk/sources/streams/checkpoint/resumable_full_refresh_cursor.py +51 -0
- airbyte_cdk/sources/streams/checkpoint/substream_resumable_full_refresh_cursor.py +110 -0
- airbyte_cdk/sources/streams/concurrent/README.md +7 -0
- airbyte_cdk/sources/streams/concurrent/__init__.py +3 -0
- airbyte_cdk/sources/streams/concurrent/abstract_stream.py +96 -0
- airbyte_cdk/sources/streams/concurrent/abstract_stream_facade.py +37 -0
- airbyte_cdk/sources/streams/concurrent/adapters.py +397 -0
- airbyte_cdk/sources/streams/concurrent/availability_strategy.py +94 -0
- airbyte_cdk/sources/streams/concurrent/clamping.py +99 -0
- airbyte_cdk/sources/streams/concurrent/cursor.py +481 -0
- airbyte_cdk/sources/streams/concurrent/cursor_types.py +32 -0
- airbyte_cdk/sources/streams/concurrent/default_stream.py +102 -0
- airbyte_cdk/sources/streams/concurrent/exceptions.py +18 -0
- airbyte_cdk/sources/streams/concurrent/helpers.py +42 -0
- airbyte_cdk/sources/streams/concurrent/partition_enqueuer.py +64 -0
- airbyte_cdk/sources/streams/concurrent/partition_reader.py +45 -0
- airbyte_cdk/sources/streams/concurrent/partitions/__init__.py +3 -0
- airbyte_cdk/sources/streams/concurrent/partitions/partition.py +48 -0
- airbyte_cdk/sources/streams/concurrent/partitions/partition_generator.py +18 -0
- airbyte_cdk/sources/streams/concurrent/partitions/stream_slicer.py +21 -0
- airbyte_cdk/sources/streams/concurrent/partitions/types.py +38 -0
- airbyte_cdk/sources/streams/concurrent/state_converters/__init__.py +0 -0
- airbyte_cdk/sources/streams/concurrent/state_converters/abstract_stream_state_converter.py +182 -0
- airbyte_cdk/sources/streams/concurrent/state_converters/datetime_stream_state_converter.py +223 -0
- airbyte_cdk/sources/streams/concurrent/state_converters/incrementing_count_stream_state_converter.py +92 -0
- airbyte_cdk/sources/streams/core.py +703 -0
- airbyte_cdk/sources/streams/http/__init__.py +10 -0
- airbyte_cdk/sources/streams/http/availability_strategy.py +54 -0
- airbyte_cdk/sources/streams/http/error_handlers/__init__.py +22 -0
- airbyte_cdk/sources/streams/http/error_handlers/backoff_strategy.py +28 -0
- airbyte_cdk/sources/streams/http/error_handlers/default_backoff_strategy.py +17 -0
- airbyte_cdk/sources/streams/http/error_handlers/default_error_mapping.py +86 -0
- airbyte_cdk/sources/streams/http/error_handlers/error_handler.py +42 -0
- airbyte_cdk/sources/streams/http/error_handlers/error_message_parser.py +19 -0
- airbyte_cdk/sources/streams/http/error_handlers/http_status_error_handler.py +110 -0
- airbyte_cdk/sources/streams/http/error_handlers/json_error_message_parser.py +52 -0
- airbyte_cdk/sources/streams/http/error_handlers/response_models.py +65 -0
- airbyte_cdk/sources/streams/http/exceptions.py +61 -0
- airbyte_cdk/sources/streams/http/http.py +673 -0
- airbyte_cdk/sources/streams/http/http_client.py +531 -0
- airbyte_cdk/sources/streams/http/rate_limiting.py +158 -0
- airbyte_cdk/sources/streams/http/requests_native_auth/__init__.py +14 -0
- airbyte_cdk/sources/streams/http/requests_native_auth/abstract_oauth.py +479 -0
- airbyte_cdk/sources/streams/http/requests_native_auth/abstract_token.py +34 -0
- airbyte_cdk/sources/streams/http/requests_native_auth/oauth.py +436 -0
- airbyte_cdk/sources/streams/http/requests_native_auth/token.py +83 -0
- airbyte_cdk/sources/streams/permissions/identities_stream.py +75 -0
- airbyte_cdk/sources/streams/utils/__init__.py +3 -0
- airbyte_cdk/sources/types.py +169 -0
- airbyte_cdk/sources/utils/__init__.py +7 -0
- airbyte_cdk/sources/utils/casing.py +12 -0
- airbyte_cdk/sources/utils/files_directory.py +15 -0
- airbyte_cdk/sources/utils/record_helper.py +53 -0
- airbyte_cdk/sources/utils/schema_helpers.py +230 -0
- airbyte_cdk/sources/utils/slice_logger.py +57 -0
- airbyte_cdk/sources/utils/transform.py +277 -0
- airbyte_cdk/sources/utils/types.py +7 -0
- airbyte_cdk/sql/__init__.py +0 -0
- airbyte_cdk/sql/_util/__init__.py +0 -0
- airbyte_cdk/sql/_util/hashing.py +34 -0
- airbyte_cdk/sql/_util/name_normalizers.py +92 -0
- airbyte_cdk/sql/constants.py +32 -0
- airbyte_cdk/sql/exceptions.py +235 -0
- airbyte_cdk/sql/secrets.py +123 -0
- airbyte_cdk/sql/shared/__init__.py +15 -0
- airbyte_cdk/sql/shared/catalog_providers.py +145 -0
- airbyte_cdk/sql/shared/sql_processor.py +786 -0
- airbyte_cdk/sql/types.py +160 -0
- airbyte_cdk/test/__init__.py +7 -0
- airbyte_cdk/test/catalog_builder.py +81 -0
- airbyte_cdk/test/entrypoint_wrapper.py +250 -0
- airbyte_cdk/test/mock_http/__init__.py +6 -0
- airbyte_cdk/test/mock_http/matcher.py +41 -0
- airbyte_cdk/test/mock_http/mocker.py +185 -0
- airbyte_cdk/test/mock_http/request.py +103 -0
- airbyte_cdk/test/mock_http/response.py +28 -0
- airbyte_cdk/test/mock_http/response_builder.py +237 -0
- airbyte_cdk/test/state_builder.py +33 -0
- airbyte_cdk/test/utils/__init__.py +1 -0
- airbyte_cdk/test/utils/data.py +24 -0
- airbyte_cdk/test/utils/http_mocking.py +16 -0
- airbyte_cdk/test/utils/manifest_only_fixtures.py +59 -0
- airbyte_cdk/test/utils/reading.py +26 -0
- airbyte_cdk/utils/__init__.py +10 -0
- airbyte_cdk/utils/airbyte_secrets_utils.py +80 -0
- airbyte_cdk/utils/analytics_message.py +25 -0
- airbyte_cdk/utils/constants.py +5 -0
- airbyte_cdk/utils/datetime_format_inferrer.py +94 -0
- airbyte_cdk/utils/datetime_helpers.py +499 -0
- airbyte_cdk/utils/event_timing.py +85 -0
- airbyte_cdk/utils/is_cloud_environment.py +18 -0
- airbyte_cdk/utils/mapping_helpers.py +162 -0
- airbyte_cdk/utils/message_utils.py +26 -0
- airbyte_cdk/utils/oneof_option_config.py +33 -0
- airbyte_cdk/utils/print_buffer.py +75 -0
- airbyte_cdk/utils/schema_inferrer.py +270 -0
- airbyte_cdk/utils/slice_hasher.py +37 -0
- airbyte_cdk/utils/spec_schema_transformations.py +26 -0
- airbyte_cdk/utils/stream_status_utils.py +43 -0
- airbyte_cdk/utils/traced_exception.py +145 -0
- airbyte_cdk-0.0.0.dev0.dist-info/LICENSE.txt +19 -0
- airbyte_cdk-0.0.0.dev0.dist-info/LICENSE_SHORT +1 -0
- airbyte_cdk-0.0.0.dev0.dist-info/METADATA +111 -0
- airbyte_cdk-0.0.0.dev0.dist-info/RECORD +368 -0
- airbyte_cdk-0.0.0.dev0.dist-info/WHEEL +4 -0
- airbyte_cdk-0.0.0.dev0.dist-info/entry_points.txt +3 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
|
3
|
+
#
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import logging
|
|
7
|
+
from abc import ABC, abstractmethod
|
|
8
|
+
from collections import deque
|
|
9
|
+
from typing import Callable, Deque, Iterable, List, Optional
|
|
10
|
+
|
|
11
|
+
from airbyte_cdk.models import AirbyteLogMessage, AirbyteMessage, Level, Type
|
|
12
|
+
from airbyte_cdk.sources.utils.types import JsonType
|
|
13
|
+
from airbyte_cdk.utils.airbyte_secrets_utils import filter_secrets
|
|
14
|
+
|
|
15
|
+
_LOGGER = logging.getLogger("MessageRepository")
|
|
16
|
+
_SUPPORTED_MESSAGE_TYPES = {Type.CONTROL, Type.LOG}
|
|
17
|
+
LogMessage = dict[str, JsonType]
|
|
18
|
+
|
|
19
|
+
_SEVERITY_BY_LOG_LEVEL = {
|
|
20
|
+
Level.FATAL: 1,
|
|
21
|
+
Level.ERROR: 2,
|
|
22
|
+
Level.WARN: 3,
|
|
23
|
+
Level.INFO: 4,
|
|
24
|
+
Level.DEBUG: 5,
|
|
25
|
+
Level.TRACE: 5,
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _is_severe_enough(threshold: Level, level: Level) -> bool:
|
|
30
|
+
if threshold not in _SEVERITY_BY_LOG_LEVEL:
|
|
31
|
+
_LOGGER.warning(
|
|
32
|
+
f"Log level {threshold} for threshold is not supported. This is probably a CDK bug. Please contact Airbyte."
|
|
33
|
+
)
|
|
34
|
+
return True
|
|
35
|
+
|
|
36
|
+
if level not in _SEVERITY_BY_LOG_LEVEL:
|
|
37
|
+
_LOGGER.warning(
|
|
38
|
+
f"Log level {level} is not supported. This is probably a source bug. Please contact the owner of the source or Airbyte."
|
|
39
|
+
)
|
|
40
|
+
return True
|
|
41
|
+
|
|
42
|
+
return _SEVERITY_BY_LOG_LEVEL[threshold] >= _SEVERITY_BY_LOG_LEVEL[level]
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class MessageRepository(ABC):
|
|
46
|
+
@abstractmethod
|
|
47
|
+
def emit_message(self, message: AirbyteMessage) -> None:
|
|
48
|
+
raise NotImplementedError()
|
|
49
|
+
|
|
50
|
+
@abstractmethod
|
|
51
|
+
def log_message(self, level: Level, message_provider: Callable[[], LogMessage]) -> None:
|
|
52
|
+
"""
|
|
53
|
+
Computing messages can be resource consuming. This method is specialized for logging because we want to allow for lazy evaluation if
|
|
54
|
+
the log level is less severe than what is configured
|
|
55
|
+
"""
|
|
56
|
+
raise NotImplementedError()
|
|
57
|
+
|
|
58
|
+
@abstractmethod
|
|
59
|
+
def consume_queue(self) -> Iterable[AirbyteMessage]:
|
|
60
|
+
raise NotImplementedError()
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class NoopMessageRepository(MessageRepository):
|
|
64
|
+
def emit_message(self, message: AirbyteMessage) -> None:
|
|
65
|
+
pass
|
|
66
|
+
|
|
67
|
+
def log_message(self, level: Level, message_provider: Callable[[], LogMessage]) -> None:
|
|
68
|
+
pass
|
|
69
|
+
|
|
70
|
+
def consume_queue(self) -> Iterable[AirbyteMessage]:
|
|
71
|
+
return []
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class InMemoryMessageRepository(MessageRepository):
|
|
75
|
+
def __init__(self, log_level: Level = Level.INFO) -> None:
|
|
76
|
+
self._message_queue: Deque[AirbyteMessage] = deque()
|
|
77
|
+
self._log_level = log_level
|
|
78
|
+
|
|
79
|
+
def emit_message(self, message: AirbyteMessage) -> None:
|
|
80
|
+
self._message_queue.append(message)
|
|
81
|
+
|
|
82
|
+
def log_message(self, level: Level, message_provider: Callable[[], LogMessage]) -> None:
|
|
83
|
+
if _is_severe_enough(self._log_level, level):
|
|
84
|
+
self.emit_message(
|
|
85
|
+
AirbyteMessage(
|
|
86
|
+
type=Type.LOG,
|
|
87
|
+
log=AirbyteLogMessage(
|
|
88
|
+
level=level, message=filter_secrets(json.dumps(message_provider()))
|
|
89
|
+
),
|
|
90
|
+
)
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
def consume_queue(self) -> Iterable[AirbyteMessage]:
|
|
94
|
+
while self._message_queue:
|
|
95
|
+
yield self._message_queue.popleft()
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
class LogAppenderMessageRepositoryDecorator(MessageRepository):
|
|
99
|
+
def __init__(
|
|
100
|
+
self,
|
|
101
|
+
dict_to_append: LogMessage,
|
|
102
|
+
decorated: MessageRepository,
|
|
103
|
+
log_level: Level = Level.INFO,
|
|
104
|
+
):
|
|
105
|
+
self._dict_to_append = dict_to_append
|
|
106
|
+
self._decorated = decorated
|
|
107
|
+
self._log_level = log_level
|
|
108
|
+
|
|
109
|
+
def emit_message(self, message: AirbyteMessage) -> None:
|
|
110
|
+
self._decorated.emit_message(message)
|
|
111
|
+
|
|
112
|
+
def log_message(self, level: Level, message_provider: Callable[[], LogMessage]) -> None:
|
|
113
|
+
if _is_severe_enough(self._log_level, level):
|
|
114
|
+
message = message_provider()
|
|
115
|
+
self._append_second_to_first(message, self._dict_to_append)
|
|
116
|
+
self._decorated.log_message(level, lambda: message)
|
|
117
|
+
|
|
118
|
+
def consume_queue(self) -> Iterable[AirbyteMessage]:
|
|
119
|
+
return self._decorated.consume_queue()
|
|
120
|
+
|
|
121
|
+
def _append_second_to_first(
|
|
122
|
+
self, first: LogMessage, second: LogMessage, path: Optional[List[str]] = None
|
|
123
|
+
) -> LogMessage:
|
|
124
|
+
if path is None:
|
|
125
|
+
path = []
|
|
126
|
+
|
|
127
|
+
for key in second:
|
|
128
|
+
if key in first:
|
|
129
|
+
if isinstance(first[key], dict) and isinstance(second[key], dict):
|
|
130
|
+
self._append_second_to_first(first[key], second[key], path + [str(key)]) # type: ignore # type is verified above
|
|
131
|
+
else:
|
|
132
|
+
if first[key] != second[key]:
|
|
133
|
+
_LOGGER.warning("Conflict at %s" % ".".join(path + [str(key)]))
|
|
134
|
+
first[key] = second[key]
|
|
135
|
+
else:
|
|
136
|
+
first[key] = second[key]
|
|
137
|
+
return first
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
|
3
|
+
#
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
import logging
|
|
7
|
+
from abc import ABC, abstractmethod
|
|
8
|
+
from typing import Any, Generic, Iterable, List, Mapping, Optional, TypeVar
|
|
9
|
+
|
|
10
|
+
from airbyte_cdk.connector import BaseConnector, DefaultConnectorMixin, TConfig
|
|
11
|
+
from airbyte_cdk.models import (
|
|
12
|
+
AirbyteCatalog,
|
|
13
|
+
AirbyteMessage,
|
|
14
|
+
AirbyteStateMessage,
|
|
15
|
+
AirbyteStateMessageSerializer,
|
|
16
|
+
ConfiguredAirbyteCatalog,
|
|
17
|
+
ConfiguredAirbyteCatalogSerializer,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
TState = TypeVar("TState")
|
|
21
|
+
TCatalog = TypeVar("TCatalog")
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class ExperimentalClassWarning(DeprecationWarning):
|
|
25
|
+
pass
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class BaseSource(BaseConnector[TConfig], ABC, Generic[TConfig, TState, TCatalog]):
|
|
29
|
+
@abstractmethod
|
|
30
|
+
def read_state(self, state_path: str) -> TState: ...
|
|
31
|
+
|
|
32
|
+
@abstractmethod
|
|
33
|
+
def read_catalog(self, catalog_path: str) -> TCatalog: ...
|
|
34
|
+
|
|
35
|
+
@abstractmethod
|
|
36
|
+
def read(
|
|
37
|
+
self,
|
|
38
|
+
logger: logging.Logger,
|
|
39
|
+
config: TConfig,
|
|
40
|
+
catalog: TCatalog,
|
|
41
|
+
state: Optional[TState] = None,
|
|
42
|
+
) -> Iterable[AirbyteMessage]:
|
|
43
|
+
"""
|
|
44
|
+
Returns a generator of the AirbyteMessages generated by reading the source with the given configuration, catalog, and state.
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
@abstractmethod
|
|
48
|
+
def discover(self, logger: logging.Logger, config: TConfig) -> AirbyteCatalog:
|
|
49
|
+
"""
|
|
50
|
+
Returns an AirbyteCatalog representing the available streams and fields in this integration. For example, given valid credentials to a
|
|
51
|
+
Postgres database, returns an Airbyte catalog where each postgres table is a stream, and each table column is a field.
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class Source(
|
|
56
|
+
DefaultConnectorMixin,
|
|
57
|
+
BaseSource[Mapping[str, Any], List[AirbyteStateMessage], ConfiguredAirbyteCatalog],
|
|
58
|
+
ABC,
|
|
59
|
+
):
|
|
60
|
+
# can be overridden to change an input state.
|
|
61
|
+
@classmethod
|
|
62
|
+
def read_state(cls, state_path: str) -> List[AirbyteStateMessage]:
|
|
63
|
+
"""
|
|
64
|
+
Retrieves the input state of a sync by reading from the specified JSON file. Incoming state can be deserialized into either
|
|
65
|
+
a JSON object for legacy state input or as a list of AirbyteStateMessages for the per-stream state format. Regardless of the
|
|
66
|
+
incoming input type, it will always be transformed and output as a list of AirbyteStateMessage(s).
|
|
67
|
+
:param state_path: The filepath to where the stream states are located
|
|
68
|
+
:return: The complete stream state based on the connector's previous sync
|
|
69
|
+
"""
|
|
70
|
+
parsed_state_messages = []
|
|
71
|
+
if state_path:
|
|
72
|
+
state_obj = BaseConnector._read_json_file(state_path)
|
|
73
|
+
if state_obj:
|
|
74
|
+
for state in state_obj: # type: ignore # `isinstance(state_obj, List)` ensures that this is a list
|
|
75
|
+
parsed_message = AirbyteStateMessageSerializer.load(state)
|
|
76
|
+
if (
|
|
77
|
+
not parsed_message.stream
|
|
78
|
+
and not parsed_message.data
|
|
79
|
+
and not parsed_message.global_
|
|
80
|
+
):
|
|
81
|
+
raise ValueError(
|
|
82
|
+
"AirbyteStateMessage should contain either a stream, global, or state field"
|
|
83
|
+
)
|
|
84
|
+
parsed_state_messages.append(parsed_message)
|
|
85
|
+
return parsed_state_messages
|
|
86
|
+
|
|
87
|
+
# can be overridden to change an input catalog
|
|
88
|
+
@classmethod
|
|
89
|
+
def read_catalog(cls, catalog_path: str) -> ConfiguredAirbyteCatalog:
|
|
90
|
+
return ConfiguredAirbyteCatalogSerializer.load(cls._read_json_file(catalog_path))
|
|
91
|
+
|
|
92
|
+
@property
|
|
93
|
+
def name(self) -> str:
|
|
94
|
+
"""Source name"""
|
|
95
|
+
return self.__class__.__name__
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (c) 2025 Airbyte, Inc., all rights reserved.
|
|
3
|
+
#
|
|
4
|
+
|
|
5
|
+
from typing import Literal
|
|
6
|
+
|
|
7
|
+
from pydantic.v1 import AnyUrl, BaseModel, Field
|
|
8
|
+
|
|
9
|
+
from airbyte_cdk import OneOfOptionConfig
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class DeliverPermissions(BaseModel):
|
|
13
|
+
class Config(OneOfOptionConfig):
|
|
14
|
+
title = "Replicate Permissions ACL"
|
|
15
|
+
description = "Sends one identity stream and one for more permissions (ACL) streams to the destination. This data can be used in downstream systems to recreate permission restrictions mirroring the original source."
|
|
16
|
+
discriminator = "delivery_type"
|
|
17
|
+
|
|
18
|
+
delivery_type: Literal["use_permissions_transfer"] = Field(
|
|
19
|
+
"use_permissions_transfer", const=True
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
include_identities_stream: bool = Field(
|
|
23
|
+
title="Include Identity Stream",
|
|
24
|
+
description="This data can be used in downstream systems to recreate permission restrictions mirroring the original source",
|
|
25
|
+
default=True,
|
|
26
|
+
)
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
|
3
|
+
#
|
|
4
|
+
|
|
5
|
+
# Initialize Streams Package
|
|
6
|
+
from .core import NO_CURSOR_STATE_KEY, CheckpointMixin, IncrementalMixin, Stream
|
|
7
|
+
|
|
8
|
+
__all__ = ["NO_CURSOR_STATE_KEY", "IncrementalMixin", "CheckpointMixin", "Stream"]
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
|
3
|
+
#
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
import typing
|
|
7
|
+
from abc import ABC, abstractmethod
|
|
8
|
+
from typing import Any, Mapping, Optional, Tuple
|
|
9
|
+
|
|
10
|
+
from airbyte_cdk.models import SyncMode
|
|
11
|
+
from airbyte_cdk.sources.streams.core import Stream, StreamData
|
|
12
|
+
|
|
13
|
+
if typing.TYPE_CHECKING:
|
|
14
|
+
from airbyte_cdk.sources import Source
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class AvailabilityStrategy(ABC):
|
|
18
|
+
"""
|
|
19
|
+
Abstract base class for checking stream availability.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
@abstractmethod
|
|
23
|
+
def check_availability(
|
|
24
|
+
self, stream: Stream, logger: logging.Logger, source: Optional["Source"] = None
|
|
25
|
+
) -> Tuple[bool, Optional[str]]:
|
|
26
|
+
"""
|
|
27
|
+
Checks stream availability.
|
|
28
|
+
|
|
29
|
+
:param stream: stream
|
|
30
|
+
:param logger: source logger
|
|
31
|
+
:param source: (optional) source
|
|
32
|
+
:return: A tuple of (boolean, str). If boolean is true, then the stream
|
|
33
|
+
is available, and no str is required. Otherwise, the stream is unavailable
|
|
34
|
+
for some reason and the str should describe what went wrong and how to
|
|
35
|
+
resolve the unavailability, if possible.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
@staticmethod
|
|
39
|
+
def get_first_stream_slice(stream: Stream) -> Optional[Mapping[str, Any]]:
|
|
40
|
+
"""
|
|
41
|
+
Gets the first stream_slice from a given stream's stream_slices.
|
|
42
|
+
:param stream: stream
|
|
43
|
+
:raises StopIteration: if there is no first slice to return (the stream_slices generator is empty)
|
|
44
|
+
:return: first stream slice from 'stream_slices' generator (`None` is a valid stream slice)
|
|
45
|
+
"""
|
|
46
|
+
# We wrap the return output of stream_slices() because some implementations return types that are iterable,
|
|
47
|
+
# but not iterators such as lists or tuples
|
|
48
|
+
slices = iter(
|
|
49
|
+
stream.stream_slices(
|
|
50
|
+
cursor_field=stream.cursor_field, # type: ignore[arg-type]
|
|
51
|
+
sync_mode=SyncMode.full_refresh,
|
|
52
|
+
)
|
|
53
|
+
)
|
|
54
|
+
return next(slices)
|
|
55
|
+
|
|
56
|
+
@staticmethod
|
|
57
|
+
def get_first_record_for_slice(
|
|
58
|
+
stream: Stream, stream_slice: Optional[Mapping[str, Any]]
|
|
59
|
+
) -> StreamData:
|
|
60
|
+
"""
|
|
61
|
+
Gets the first record for a stream_slice of a stream.
|
|
62
|
+
|
|
63
|
+
:param stream: stream instance from which to read records
|
|
64
|
+
:param stream_slice: stream_slice parameters for slicing the stream
|
|
65
|
+
:raises StopIteration: if there is no first record to return (the read_records generator is empty)
|
|
66
|
+
:return: StreamData containing the first record in the slice
|
|
67
|
+
"""
|
|
68
|
+
# Store the original value of exit_on_rate_limit
|
|
69
|
+
original_exit_on_rate_limit = stream.exit_on_rate_limit
|
|
70
|
+
|
|
71
|
+
try:
|
|
72
|
+
# Ensure exit_on_rate_limit is safely set to True if possible
|
|
73
|
+
stream.exit_on_rate_limit = True
|
|
74
|
+
|
|
75
|
+
# We wrap the return output of read_records() because some implementations return types that are iterable,
|
|
76
|
+
# but not iterators such as lists or tuples
|
|
77
|
+
records_for_slice = iter(
|
|
78
|
+
stream.read_records(sync_mode=SyncMode.full_refresh, stream_slice=stream_slice)
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
return next(records_for_slice)
|
|
82
|
+
finally:
|
|
83
|
+
# Restore the original exit_on_rate_limit value
|
|
84
|
+
stream.exit_on_rate_limit = original_exit_on_rate_limit
|