airbyte-cdk 0.59.1__tar.gz → 0.60.0__tar.gz
Sign up to get free protection for your applications and to get access to all the features.
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/PKG-INFO +1 -1
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/entrypoint.py +3 -1
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/concurrent_source/concurrent_source_adapter.py +3 -3
- airbyte-cdk-0.60.0/airbyte_cdk/sources/file_based/availability_strategy/__init__.py +7 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/availability_strategy/abstract_file_based_availability_strategy.py +20 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/file_based_source.py +79 -9
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/file_types/csv_parser.py +5 -2
- airbyte-cdk-0.60.0/airbyte_cdk/sources/file_based/stream/concurrent/adapters.py +322 -0
- airbyte-cdk-0.60.0/airbyte_cdk/sources/file_based/stream/concurrent/cursor.py +87 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/stream/default_file_based_stream.py +6 -2
- airbyte-cdk-0.60.0/airbyte_cdk/sources/streams/concurrent/abstract_stream_facade.py +37 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/concurrent/adapters.py +10 -52
- airbyte-cdk-0.60.0/airbyte_cdk/sources/streams/concurrent/helpers.py +31 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk.egg-info/PKG-INFO +1 -1
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk.egg-info/SOURCES.txt +5 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/setup.py +1 -1
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/file_types/test_csv_parser.py +12 -6
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/in_memory_files_source.py +12 -2
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/scenarios/csv_scenarios.py +5 -25
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/scenarios/file_based_source_builder.py +6 -1
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/scenarios/jsonl_scenarios.py +2 -6
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/scenarios/parquet_scenarios.py +1 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/scenarios/scenario_builder.py +8 -5
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/scenarios/validation_policy_scenarios.py +2 -73
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/test_scenarios.py +20 -4
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/scenarios/stream_facade_builder.py +3 -2
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/scenarios/thread_based_concurrent_stream_source_builder.py +1 -1
- airbyte-cdk-0.60.0/unit_tests/utils/__init__.py +0 -0
- airbyte-cdk-0.59.1/airbyte_cdk/sources/file_based/availability_strategy/__init__.py +0 -4
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/LICENSE.txt +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/README.md +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/config_observation.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/connector.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/connector_builder/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/connector_builder/connector_builder_handler.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/connector_builder/main.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/connector_builder/message_grouper.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/connector_builder/models.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/destinations/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/destinations/destination.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/destinations/vector_db_based/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/destinations/vector_db_based/config.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/destinations/vector_db_based/document_processor.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/destinations/vector_db_based/embedder.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/destinations/vector_db_based/indexer.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/destinations/vector_db_based/test_utils.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/destinations/vector_db_based/utils.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/destinations/vector_db_based/writer.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/exception_handler.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/logger.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/models/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/models/airbyte_protocol.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/models/well_known_types.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/py.typed +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/abstract_source.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/concurrent_source/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/concurrent_source/concurrent_read_processor.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/concurrent_source/concurrent_source.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/concurrent_source/partition_generation_completed_sentinel.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/concurrent_source/thread_pool_manager.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/config.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/connector_state_manager.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/auth/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/auth/declarative_authenticator.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/auth/oauth.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/auth/selective_authenticator.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/auth/token.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/auth/token_provider.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/checks/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/checks/check_stream.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/checks/connection_checker.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/create_partial.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/datetime/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/datetime/datetime_parser.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/datetime/min_max_datetime.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/declarative_component_schema.yaml +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/declarative_source.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/declarative_stream.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/decoders/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/decoders/decoder.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/decoders/json_decoder.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/exceptions.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/extractors/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/extractors/dpath_extractor.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/extractors/http_selector.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/extractors/record_extractor.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/extractors/record_filter.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/extractors/record_selector.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/incremental/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/incremental/cursor.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/incremental/datetime_based_cursor.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/incremental/per_partition_cursor.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/interpolation/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/interpolation/filters.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_boolean.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_mapping.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_nested_mapping.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_string.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/interpolation/interpolation.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/interpolation/jinja.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/interpolation/macros.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/manifest_declarative_source.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/models/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/models/declarative_component_schema.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/parsers/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/parsers/class_types_registry.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/parsers/custom_exceptions.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/parsers/default_implementation_registry.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/parsers/manifest_component_transformer.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/parsers/manifest_reference_resolver.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/partition_routers/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/partition_routers/list_partition_router.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/partition_routers/single_partition_router.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/partition_routers/substream_partition_router.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/constant_backoff_strategy.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/exponential_backoff_strategy.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/header_helper.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/wait_time_from_header_backoff_strategy.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/wait_until_time_from_header_backoff_strategy.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategy.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/composite_error_handler.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/default_error_handler.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/error_handler.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/http_response_filter.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/response_action.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/response_status.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/http_requester.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/paginators/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/paginators/default_paginator.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/paginators/no_pagination.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/paginators/paginator.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/cursor_pagination_strategy.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/offset_increment.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/page_increment.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/pagination_strategy.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/stop_condition.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/request_option.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/request_options/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_nested_request_input_provider.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_input_provider.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_options_provider.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/request_options/request_options_provider.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/request_path.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/requester.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/retrievers/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/retrievers/retriever.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/retrievers/simple_retriever.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/schema/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/schema/default_schema_loader.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/schema/inline_schema_loader.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/schema/json_file_schema_loader.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/schema/schema_loader.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/spec/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/spec/spec.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/stream_slicers/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/stream_slicers/cartesian_product_stream_slicer.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/stream_slicers/stream_slicer.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/transformations/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/transformations/add_fields.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/transformations/remove_fields.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/transformations/transformation.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/types.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/yaml_declarative_source.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/deprecated/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/deprecated/base_source.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/deprecated/client.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/embedded/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/embedded/base_integration.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/embedded/catalog.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/embedded/runner.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/embedded/tools.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/availability_strategy/default_file_based_availability_strategy.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/config/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/config/abstract_file_based_spec.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/config/avro_format.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/config/csv_format.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/config/file_based_stream_config.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/config/jsonl_format.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/config/parquet_format.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/config/unstructured_format.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/discovery_policy/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/discovery_policy/abstract_discovery_policy.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/discovery_policy/default_discovery_policy.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/exceptions.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/file_based_stream_reader.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/file_types/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/file_types/avro_parser.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/file_types/file_type_parser.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/file_types/jsonl_parser.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/file_types/parquet_parser.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/file_types/unstructured_parser.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/remote_file.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/schema_helpers.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/schema_validation_policies/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/schema_validation_policies/abstract_schema_validation_policy.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/schema_validation_policies/default_schema_validation_policies.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/stream/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/stream/abstract_file_based_stream.py +0 -0
- {airbyte-cdk-0.59.1/airbyte_cdk/sources/streams/concurrent/state_converters → airbyte-cdk-0.60.0/airbyte_cdk/sources/file_based/stream/concurrent}/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/stream/cursor/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/stream/cursor/abstract_file_based_cursor.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/stream/cursor/default_file_based_cursor.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/types.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/http_config.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/http_logger.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/message/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/message/repository.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/singer/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/singer/singer_helpers.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/singer/source.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/source.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/availability_strategy.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/call_rate.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/concurrent/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/concurrent/abstract_stream.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/concurrent/availability_strategy.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/concurrent/cursor.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/concurrent/default_stream.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/concurrent/exceptions.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/concurrent/partition_enqueuer.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/concurrent/partition_reader.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/concurrent/partitions/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/concurrent/partitions/partition.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/concurrent/partitions/partition_generator.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/concurrent/partitions/record.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/concurrent/partitions/types.py +0 -0
- {airbyte-cdk-0.59.1/source_declarative_manifest → airbyte-cdk-0.60.0/airbyte_cdk/sources/streams/concurrent/state_converters}/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/concurrent/state_converters/abstract_stream_state_converter.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/concurrent/state_converters/datetime_stream_state_converter.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/core.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/http/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/http/auth/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/http/auth/core.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/http/auth/oauth.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/http/auth/token.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/http/availability_strategy.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/http/exceptions.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/http/http.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/http/rate_limiting.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/http/requests_native_auth/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/http/requests_native_auth/abstract_oauth.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/http/requests_native_auth/abstract_token.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/http/requests_native_auth/oauth.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/http/requests_native_auth/token.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/utils/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/utils/stream_helper.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/utils/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/utils/casing.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/utils/catalog_helpers.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/utils/record_helper.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/utils/schema_helpers.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/utils/schema_models.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/utils/slice_logger.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/utils/transform.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/utils/types.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/test/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/test/catalog_builder.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/test/entrypoint_wrapper.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/test/mock_http/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/test/mock_http/matcher.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/test/mock_http/mocker.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/test/mock_http/request.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/test/mock_http/response.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/test/mock_http/response_builder.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/test/state_builder.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/utils/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/utils/airbyte_secrets_utils.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/utils/analytics_message.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/utils/constants.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/utils/datetime_format_inferrer.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/utils/event_timing.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/utils/is_cloud_environment.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/utils/mapping_helpers.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/utils/oneof_option_config.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/utils/schema_inferrer.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/utils/spec_schema_transformations.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/utils/stream_status_utils.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/utils/traced_exception.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk.egg-info/dependency_links.txt +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk.egg-info/requires.txt +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk.egg-info/top_level.txt +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/pyproject.toml +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/setup.cfg +0 -0
- {airbyte-cdk-0.59.1/unit_tests/destinations → airbyte-cdk-0.60.0/source_declarative_manifest}/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/source_declarative_manifest/main.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/connector_builder/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/connector_builder/test_connector_builder_handler.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/connector_builder/test_message_grouper.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/connector_builder/utils.py +0 -0
- {airbyte-cdk-0.59.1/unit_tests/singer → airbyte-cdk-0.60.0/unit_tests/destinations}/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/destinations/test_destination.py +0 -0
- {airbyte-cdk-0.59.1/unit_tests/sources → airbyte-cdk-0.60.0/unit_tests/singer}/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/singer/test_singer_helpers.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/singer/test_singer_source.py +0 -0
- {airbyte-cdk-0.59.1/unit_tests/sources/declarative/decoders → airbyte-cdk-0.60.0/unit_tests/sources}/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/concurrent_source/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/concurrent_source/test_concurrent_source_adapter.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/auth/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/auth/test_oauth.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/auth/test_selective_authenticator.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/auth/test_session_token_auth.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/auth/test_token_auth.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/auth/test_token_provider.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/checks/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/checks/test_check_stream.py +0 -0
- {airbyte-cdk-0.59.1/unit_tests/sources/declarative/incremental → airbyte-cdk-0.60.0/unit_tests/sources/declarative/decoders}/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/decoders/test_json_decoder.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/external_component.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/extractors/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/extractors/test_dpath_extractor.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/extractors/test_record_filter.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/extractors/test_record_selector.py +0 -0
- {airbyte-cdk-0.59.1/unit_tests/sources/file_based → airbyte-cdk-0.60.0/unit_tests/sources/declarative/incremental}/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/incremental/test_datetime_based_cursor.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/incremental/test_per_partition_cursor.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/incremental/test_per_partition_cursor_integration.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/interpolation/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/interpolation/test_filters.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/interpolation/test_interpolated_boolean.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/interpolation/test_interpolated_mapping.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/interpolation/test_interpolated_nested_mapping.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/interpolation/test_interpolated_string.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/interpolation/test_jinja.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/interpolation/test_macros.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/parsers/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/parsers/test_manifest_component_transformer.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/parsers/test_manifest_reference_resolver.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/parsers/test_model_to_component_factory.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/parsers/testing_components.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/partition_routers/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/partition_routers/test_list_partition_router.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/partition_routers/test_single_partition_router.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/partition_routers/test_substream_partition_router.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/error_handlers/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/test_constant_backoff.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/test_exponential_backoff.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/test_header_helper.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/test_wait_time_from_header.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/test_wait_until_time_from_header.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/error_handlers/test_composite_error_handler.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/error_handlers/test_default_error_handler.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/error_handlers/test_http_response_filter.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/error_handlers/test_response_status.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/paginators/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/paginators/test_cursor_pagination_strategy.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/paginators/test_default_paginator.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/paginators/test_no_paginator.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/paginators/test_offset_increment.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/paginators/test_page_increment.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/paginators/test_request_option.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/paginators/test_stop_condition.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/request_options/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/request_options/test_interpolated_request_options_provider.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/test_http_requester.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/test_interpolated_request_input_provider.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/retrievers/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/retrievers/test_simple_retriever.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/schema/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/schema/source_test/SourceTest.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/schema/source_test/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/schema/test_default_schema_loader.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/schema/test_inline_schema_loader.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/schema/test_json_file_schema_loader.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/states/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/stream_slicers/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/stream_slicers/test_cartesian_product_stream_slicer.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/test_create_partial.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/test_declarative_stream.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/test_manifest_declarative_source.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/test_yaml_declarative_source.py +0 -0
- {airbyte-cdk-0.59.1/unit_tests/sources/file_based/availability_strategy → airbyte-cdk-0.60.0/unit_tests/sources/file_based}/__init__.py +0 -0
- {airbyte-cdk-0.59.1/unit_tests/sources/file_based/config → airbyte-cdk-0.60.0/unit_tests/sources/file_based/availability_strategy}/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/availability_strategy/test_default_file_based_availability_strategy.py +0 -0
- {airbyte-cdk-0.59.1/unit_tests/sources/file_based/discovery_policy → airbyte-cdk-0.60.0/unit_tests/sources/file_based/config}/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/config/test_abstract_file_based_spec.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/config/test_csv_format.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/config/test_file_based_stream_config.py +0 -0
- {airbyte-cdk-0.59.1/unit_tests/sources/file_based/file_types → airbyte-cdk-0.60.0/unit_tests/sources/file_based/discovery_policy}/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/discovery_policy/test_default_discovery_policy.py +0 -0
- {airbyte-cdk-0.59.1/unit_tests/sources/file_based/scenarios → airbyte-cdk-0.60.0/unit_tests/sources/file_based/file_types}/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/file_types/test_avro_parser.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/file_types/test_jsonl_parser.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/file_types/test_parquet_parser.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/file_types/test_unstructured_parser.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/helpers.py +0 -0
- {airbyte-cdk-0.59.1/unit_tests/sources/file_based/stream → airbyte-cdk-0.60.0/unit_tests/sources/file_based/scenarios}/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/scenarios/avro_scenarios.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/scenarios/check_scenarios.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/scenarios/incremental_scenarios.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/scenarios/unstructured_scenarios.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/scenarios/user_input_schema_scenarios.py +0 -0
- {airbyte-cdk-0.59.1/unit_tests/sources/message → airbyte-cdk-0.60.0/unit_tests/sources/file_based/stream}/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/stream/test_default_file_based_cursor.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/stream/test_default_file_based_stream.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/test_file_based_scenarios.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/test_file_based_stream_reader.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/test_schema_helpers.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/fixtures/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/fixtures/source_test_fixture.py +0 -0
- {airbyte-cdk-0.59.1/unit_tests/sources/streams → airbyte-cdk-0.60.0/unit_tests/sources/message}/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/message/test_repository.py +0 -0
- {airbyte-cdk-0.59.1/unit_tests/sources/streams/http → airbyte-cdk-0.60.0/unit_tests/sources/streams}/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/scenarios/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/scenarios/incremental_scenarios.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/scenarios/stream_facade_scenarios.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/scenarios/test_concurrent_scenarios.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/scenarios/thread_based_concurrent_stream_scenarios.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/scenarios/utils.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/test_adapters.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/test_concurrent_read_processor.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/test_cursor.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/test_datetime_state_converter.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/test_default_stream.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/test_partition_enqueuer.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/test_partition_reader.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/test_thread_pool_manager.py +0 -0
- {airbyte-cdk-0.59.1/unit_tests/sources/streams/http/auth → airbyte-cdk-0.60.0/unit_tests/sources/streams/http}/__init__.py +0 -0
- {airbyte-cdk-0.59.1/unit_tests/sources/streams/http/requests_native_auth → airbyte-cdk-0.60.0/unit_tests/sources/streams/http/auth}/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/http/auth/test_auth.py +0 -0
- {airbyte-cdk-0.59.1/unit_tests/test → airbyte-cdk-0.60.0/unit_tests/sources/streams/http/requests_native_auth}/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/http/requests_native_auth/test_requests_native_auth.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/http/test_availability_strategy.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/http/test_http.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/test_availability_strategy.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/test_call_rate.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/test_stream_read.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/test_streams_core.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/test_abstract_source.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/test_concurrent_source.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/test_config.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/test_connector_state_manager.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/test_http_logger.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/test_integration_source.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/test_source.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/test_source_read.py +0 -0
- {airbyte-cdk-0.59.1/unit_tests/test/mock_http → airbyte-cdk-0.60.0/unit_tests/test}/__init__.py +0 -0
- {airbyte-cdk-0.59.1/unit_tests/utils → airbyte-cdk-0.60.0/unit_tests/test/mock_http}/__init__.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/test/mock_http/test_matcher.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/test/mock_http/test_mocker.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/test/mock_http/test_request.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/test/mock_http/test_response_builder.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/test/test_entrypoint_wrapper.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/utils/test_datetime_format_inferrer.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/utils/test_mapping_helpers.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/utils/test_rate_limiting.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/utils/test_schema_inferrer.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/utils/test_secret_utils.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/utils/test_stream_status_utils.py +0 -0
- {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/utils/test_traced_exception.py +0 -0
@@ -212,7 +212,9 @@ def launch(source: Source, args: List[str]) -> None:
|
|
212
212
|
source_entrypoint = AirbyteEntrypoint(source)
|
213
213
|
parsed_args = source_entrypoint.parse_args(args)
|
214
214
|
for message in source_entrypoint.run(parsed_args):
|
215
|
-
print
|
215
|
+
# simply printing is creating issues for concurrent CDK as Python uses different two instructions to print: one for the message and
|
216
|
+
# the other for the break line. Adding `\n` to the message ensure that both are printed at the same time
|
217
|
+
print(f"{message}\n", end="")
|
216
218
|
|
217
219
|
|
218
220
|
def _init_internal_request_filter() -> None:
|
@@ -10,7 +10,7 @@ from airbyte_cdk.sources import AbstractSource
|
|
10
10
|
from airbyte_cdk.sources.concurrent_source.concurrent_source import ConcurrentSource
|
11
11
|
from airbyte_cdk.sources.streams import Stream
|
12
12
|
from airbyte_cdk.sources.streams.concurrent.abstract_stream import AbstractStream
|
13
|
-
from airbyte_cdk.sources.streams.concurrent.
|
13
|
+
from airbyte_cdk.sources.streams.concurrent.abstract_stream_facade import AbstractStreamFacade
|
14
14
|
|
15
15
|
|
16
16
|
class ConcurrentSourceAdapter(AbstractSource, ABC):
|
@@ -58,6 +58,6 @@ class ConcurrentSourceAdapter(AbstractSource, ABC):
|
|
58
58
|
f"The stream {configured_stream.stream.name} no longer exists in the configuration. "
|
59
59
|
f"Refresh the schema in replication settings and remove this stream from future sync attempts."
|
60
60
|
)
|
61
|
-
if isinstance(stream_instance,
|
62
|
-
abstract_streams.append(stream_instance.
|
61
|
+
if isinstance(stream_instance, AbstractStreamFacade):
|
62
|
+
abstract_streams.append(stream_instance.get_underlying_stream())
|
63
63
|
return abstract_streams
|
@@ -0,0 +1,7 @@
|
|
1
|
+
from .abstract_file_based_availability_strategy import (
|
2
|
+
AbstractFileBasedAvailabilityStrategy,
|
3
|
+
AbstractFileBasedAvailabilityStrategyWrapper,
|
4
|
+
)
|
5
|
+
from .default_file_based_availability_strategy import DefaultFileBasedAvailabilityStrategy
|
6
|
+
|
7
|
+
__all__ = ["AbstractFileBasedAvailabilityStrategy", "AbstractFileBasedAvailabilityStrategyWrapper", "DefaultFileBasedAvailabilityStrategy"]
|
@@ -8,6 +8,12 @@ from typing import TYPE_CHECKING, Optional, Tuple
|
|
8
8
|
|
9
9
|
from airbyte_cdk.sources import Source
|
10
10
|
from airbyte_cdk.sources.streams.availability_strategy import AvailabilityStrategy
|
11
|
+
from airbyte_cdk.sources.streams.concurrent.availability_strategy import (
|
12
|
+
AbstractAvailabilityStrategy,
|
13
|
+
StreamAvailability,
|
14
|
+
StreamAvailable,
|
15
|
+
StreamUnavailable,
|
16
|
+
)
|
11
17
|
from airbyte_cdk.sources.streams.core import Stream
|
12
18
|
|
13
19
|
if TYPE_CHECKING:
|
@@ -35,3 +41,17 @@ class AbstractFileBasedAvailabilityStrategy(AvailabilityStrategy):
|
|
35
41
|
Returns (True, None) if successful, otherwise (False, <error message>).
|
36
42
|
"""
|
37
43
|
...
|
44
|
+
|
45
|
+
|
46
|
+
class AbstractFileBasedAvailabilityStrategyWrapper(AbstractAvailabilityStrategy):
|
47
|
+
def __init__(self, stream: "AbstractFileBasedStream"):
|
48
|
+
self.stream = stream
|
49
|
+
|
50
|
+
def check_availability(self, logger: logging.Logger) -> StreamAvailability:
|
51
|
+
is_available, reason = self.stream.availability_strategy.check_availability(self.stream, logger, None)
|
52
|
+
if is_available:
|
53
|
+
return StreamAvailable()
|
54
|
+
return StreamUnavailable(reason or "")
|
55
|
+
|
56
|
+
def check_availability_and_parsability(self, logger: logging.Logger) -> Tuple[bool, Optional[str]]:
|
57
|
+
return self.stream.availability_strategy.check_availability_and_parsability(self.stream, logger, None)
|
{airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/file_based_source.py
RENAMED
@@ -8,8 +8,18 @@ from abc import ABC
|
|
8
8
|
from collections import Counter
|
9
9
|
from typing import Any, Iterator, List, Mapping, MutableMapping, Optional, Tuple, Type, Union
|
10
10
|
|
11
|
-
from airbyte_cdk.
|
12
|
-
from airbyte_cdk.
|
11
|
+
from airbyte_cdk.logger import AirbyteLogFormatter, init_logger
|
12
|
+
from airbyte_cdk.models import (
|
13
|
+
AirbyteMessage,
|
14
|
+
AirbyteStateMessage,
|
15
|
+
ConfiguredAirbyteCatalog,
|
16
|
+
ConnectorSpecification,
|
17
|
+
FailureType,
|
18
|
+
Level,
|
19
|
+
SyncMode,
|
20
|
+
)
|
21
|
+
from airbyte_cdk.sources.concurrent_source.concurrent_source import ConcurrentSource
|
22
|
+
from airbyte_cdk.sources.concurrent_source.concurrent_source_adapter import ConcurrentSourceAdapter
|
13
23
|
from airbyte_cdk.sources.file_based.availability_strategy import AbstractFileBasedAvailabilityStrategy, DefaultFileBasedAvailabilityStrategy
|
14
24
|
from airbyte_cdk.sources.file_based.config.abstract_file_based_spec import AbstractFileBasedSpec
|
15
25
|
from airbyte_cdk.sources.file_based.config.file_based_stream_config import FileBasedStreamConfig, ValidationPolicy
|
@@ -20,19 +30,33 @@ from airbyte_cdk.sources.file_based.file_types import default_parsers
|
|
20
30
|
from airbyte_cdk.sources.file_based.file_types.file_type_parser import FileTypeParser
|
21
31
|
from airbyte_cdk.sources.file_based.schema_validation_policies import DEFAULT_SCHEMA_VALIDATION_POLICIES, AbstractSchemaValidationPolicy
|
22
32
|
from airbyte_cdk.sources.file_based.stream import AbstractFileBasedStream, DefaultFileBasedStream
|
33
|
+
from airbyte_cdk.sources.file_based.stream.concurrent.adapters import FileBasedStreamFacade
|
34
|
+
from airbyte_cdk.sources.file_based.stream.concurrent.cursor import FileBasedNoopCursor
|
23
35
|
from airbyte_cdk.sources.file_based.stream.cursor import AbstractFileBasedCursor
|
24
36
|
from airbyte_cdk.sources.file_based.stream.cursor.default_file_based_cursor import DefaultFileBasedCursor
|
37
|
+
from airbyte_cdk.sources.message.repository import InMemoryMessageRepository, MessageRepository
|
38
|
+
from airbyte_cdk.sources.source import TState
|
25
39
|
from airbyte_cdk.sources.streams import Stream
|
26
40
|
from airbyte_cdk.utils.analytics_message import create_analytics_message
|
41
|
+
from airbyte_cdk.utils.traced_exception import AirbyteTracedException
|
27
42
|
from pydantic.error_wrappers import ValidationError
|
28
43
|
|
44
|
+
DEFAULT_CONCURRENCY = 100
|
45
|
+
MAX_CONCURRENCY = 100
|
46
|
+
INITIAL_N_PARTITIONS = MAX_CONCURRENCY // 2
|
47
|
+
|
48
|
+
|
49
|
+
class FileBasedSource(ConcurrentSourceAdapter, ABC):
|
50
|
+
# We make each source override the concurrency level to give control over when they are upgraded.
|
51
|
+
_concurrency_level = None
|
29
52
|
|
30
|
-
class FileBasedSource(AbstractSource, ABC):
|
31
53
|
def __init__(
|
32
54
|
self,
|
33
55
|
stream_reader: AbstractFileBasedStreamReader,
|
34
56
|
spec_class: Type[AbstractFileBasedSpec],
|
35
|
-
|
57
|
+
catalog: Optional[ConfiguredAirbyteCatalog],
|
58
|
+
config: Optional[Mapping[str, Any]],
|
59
|
+
state: Optional[TState],
|
36
60
|
availability_strategy: Optional[AbstractFileBasedAvailabilityStrategy] = None,
|
37
61
|
discovery_policy: AbstractDiscoveryPolicy = DefaultDiscoveryPolicy(),
|
38
62
|
parsers: Mapping[Type[Any], FileTypeParser] = default_parsers,
|
@@ -41,15 +65,29 @@ class FileBasedSource(AbstractSource, ABC):
|
|
41
65
|
):
|
42
66
|
self.stream_reader = stream_reader
|
43
67
|
self.spec_class = spec_class
|
68
|
+
self.config = config
|
69
|
+
self.catalog = catalog
|
70
|
+
self.state = state
|
44
71
|
self.availability_strategy = availability_strategy or DefaultFileBasedAvailabilityStrategy(stream_reader)
|
45
72
|
self.discovery_policy = discovery_policy
|
46
73
|
self.parsers = parsers
|
47
74
|
self.validation_policies = validation_policies
|
48
|
-
catalog = self.read_catalog(catalog_path) if catalog_path else None
|
49
75
|
self.stream_schemas = {s.stream.name: s.stream.json_schema for s in catalog.streams} if catalog else {}
|
50
76
|
self.cursor_cls = cursor_cls
|
51
|
-
self.logger =
|
77
|
+
self.logger = init_logger(f"airbyte.{self.name}")
|
52
78
|
self.errors_collector: FileBasedErrorsCollector = FileBasedErrorsCollector()
|
79
|
+
self._message_repository: Optional[MessageRepository] = None
|
80
|
+
concurrent_source = ConcurrentSource.create(
|
81
|
+
MAX_CONCURRENCY, INITIAL_N_PARTITIONS, self.logger, self._slice_logger, self.message_repository
|
82
|
+
)
|
83
|
+
self._state = None
|
84
|
+
super().__init__(concurrent_source)
|
85
|
+
|
86
|
+
@property
|
87
|
+
def message_repository(self) -> MessageRepository:
|
88
|
+
if self._message_repository is None:
|
89
|
+
self._message_repository = InMemoryMessageRepository(Level(AirbyteLogFormatter.level_mapping[self.logger.level]))
|
90
|
+
return self._message_repository
|
53
91
|
|
54
92
|
def check_connection(self, logger: logging.Logger, config: Mapping[str, Any]) -> Tuple[bool, Optional[Any]]:
|
55
93
|
"""
|
@@ -61,7 +99,15 @@ class FileBasedSource(AbstractSource, ABC):
|
|
61
99
|
|
62
100
|
Otherwise, the "error" object should describe what went wrong.
|
63
101
|
"""
|
64
|
-
|
102
|
+
try:
|
103
|
+
streams = self.streams(config)
|
104
|
+
except Exception as config_exception:
|
105
|
+
raise AirbyteTracedException(
|
106
|
+
internal_message="Please check the logged errors for more information.",
|
107
|
+
message=FileBasedSourceError.CONFIG_VALIDATION_ERROR.value,
|
108
|
+
exception=AirbyteTracedException(exception=config_exception),
|
109
|
+
failure_type=FailureType.config_error,
|
110
|
+
)
|
65
111
|
if len(streams) == 0:
|
66
112
|
return (
|
67
113
|
False,
|
@@ -80,7 +126,7 @@ class FileBasedSource(AbstractSource, ABC):
|
|
80
126
|
reason,
|
81
127
|
) = stream.availability_strategy.check_availability_and_parsability(stream, logger, self)
|
82
128
|
except Exception:
|
83
|
-
errors.append(f"Unable to connect to stream {stream} - {''.join(traceback.format_exc())}")
|
129
|
+
errors.append(f"Unable to connect to stream {stream.name} - {''.join(traceback.format_exc())}")
|
84
130
|
else:
|
85
131
|
if not stream_is_available and reason:
|
86
132
|
errors.append(reason)
|
@@ -91,10 +137,26 @@ class FileBasedSource(AbstractSource, ABC):
|
|
91
137
|
"""
|
92
138
|
Return a list of this source's streams.
|
93
139
|
"""
|
140
|
+
file_based_streams = self._get_file_based_streams(config)
|
141
|
+
|
142
|
+
configured_streams: List[Stream] = []
|
143
|
+
|
144
|
+
for stream in file_based_streams:
|
145
|
+
sync_mode = self._get_sync_mode_from_catalog(stream)
|
146
|
+
if sync_mode == SyncMode.full_refresh and hasattr(self, "_concurrency_level") and self._concurrency_level is not None:
|
147
|
+
configured_streams.append(
|
148
|
+
FileBasedStreamFacade.create_from_stream(stream, self, self.logger, None, FileBasedNoopCursor(stream.config))
|
149
|
+
)
|
150
|
+
else:
|
151
|
+
configured_streams.append(stream)
|
152
|
+
|
153
|
+
return configured_streams
|
154
|
+
|
155
|
+
def _get_file_based_streams(self, config: Mapping[str, Any]) -> List[AbstractFileBasedStream]:
|
94
156
|
try:
|
95
157
|
parsed_config = self._get_parsed_config(config)
|
96
158
|
self.stream_reader.config = parsed_config
|
97
|
-
streams: List[
|
159
|
+
streams: List[AbstractFileBasedStream] = []
|
98
160
|
for stream_config in parsed_config.streams:
|
99
161
|
self._validate_input_schema(stream_config)
|
100
162
|
streams.append(
|
@@ -115,6 +177,14 @@ class FileBasedSource(AbstractSource, ABC):
|
|
115
177
|
except ValidationError as exc:
|
116
178
|
raise ConfigValidationError(FileBasedSourceError.CONFIG_VALIDATION_ERROR) from exc
|
117
179
|
|
180
|
+
def _get_sync_mode_from_catalog(self, stream: Stream) -> Optional[SyncMode]:
|
181
|
+
if self.catalog:
|
182
|
+
for catalog_stream in self.catalog.streams:
|
183
|
+
if stream.name == catalog_stream.stream.name:
|
184
|
+
return catalog_stream.sync_mode
|
185
|
+
raise RuntimeError(f"No sync mode was found for {stream.name}.")
|
186
|
+
return None
|
187
|
+
|
118
188
|
def read(
|
119
189
|
self,
|
120
190
|
logger: logging.Logger,
|
{airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/file_types/csv_parser.py
RENAMED
@@ -10,6 +10,7 @@ from collections import defaultdict
|
|
10
10
|
from functools import partial
|
11
11
|
from io import IOBase
|
12
12
|
from typing import Any, Callable, Dict, Generator, Iterable, List, Mapping, Optional, Set, Tuple
|
13
|
+
from uuid import uuid4
|
13
14
|
|
14
15
|
from airbyte_cdk.models import FailureType
|
15
16
|
from airbyte_cdk.sources.file_based.config.csv_format import CsvFormat, CsvHeaderAutogenerated, CsvHeaderUserProvided, InferenceType
|
@@ -38,8 +39,10 @@ class _CsvReader:
|
|
38
39
|
|
39
40
|
# Formats are configured individually per-stream so a unique dialect should be registered for each stream.
|
40
41
|
# We don't unregister the dialect because we are lazily parsing each csv file to generate records
|
41
|
-
#
|
42
|
-
|
42
|
+
# Give each stream's dialect a unique name; otherwise, when we are doing a concurrent sync we can end up
|
43
|
+
# with a race condition where a thread attempts to use a dialect before a separate thread has finished
|
44
|
+
# registering it.
|
45
|
+
dialect_name = f"{config.name}_{str(uuid4())}_{DIALECT_NAME}"
|
43
46
|
csv.register_dialect(
|
44
47
|
dialect_name,
|
45
48
|
delimiter=config_format.delimiter,
|
@@ -0,0 +1,322 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2024 Airbyte, Inc., all rights reserved.
|
3
|
+
#
|
4
|
+
|
5
|
+
import copy
|
6
|
+
import logging
|
7
|
+
from functools import lru_cache
|
8
|
+
from typing import Any, Iterable, List, Mapping, MutableMapping, Optional, Union
|
9
|
+
|
10
|
+
from airbyte_cdk.models import AirbyteLogMessage, AirbyteMessage, Level, SyncMode, Type
|
11
|
+
from airbyte_cdk.sources import AbstractSource
|
12
|
+
from airbyte_cdk.sources.connector_state_manager import ConnectorStateManager
|
13
|
+
from airbyte_cdk.sources.file_based.availability_strategy import (
|
14
|
+
AbstractFileBasedAvailabilityStrategy,
|
15
|
+
AbstractFileBasedAvailabilityStrategyWrapper,
|
16
|
+
)
|
17
|
+
from airbyte_cdk.sources.file_based.config.file_based_stream_config import PrimaryKeyType
|
18
|
+
from airbyte_cdk.sources.file_based.file_types.file_type_parser import FileTypeParser
|
19
|
+
from airbyte_cdk.sources.file_based.remote_file import RemoteFile
|
20
|
+
from airbyte_cdk.sources.file_based.stream import AbstractFileBasedStream
|
21
|
+
from airbyte_cdk.sources.file_based.stream.concurrent.cursor import FileBasedNoopCursor
|
22
|
+
from airbyte_cdk.sources.file_based.types import StreamSlice
|
23
|
+
from airbyte_cdk.sources.message import MessageRepository
|
24
|
+
from airbyte_cdk.sources.streams.concurrent.abstract_stream_facade import AbstractStreamFacade
|
25
|
+
from airbyte_cdk.sources.streams.concurrent.default_stream import DefaultStream
|
26
|
+
from airbyte_cdk.sources.streams.concurrent.exceptions import ExceptionWithDisplayMessage
|
27
|
+
from airbyte_cdk.sources.streams.concurrent.helpers import get_cursor_field_from_stream, get_primary_key_from_stream
|
28
|
+
from airbyte_cdk.sources.streams.concurrent.partitions.partition import Partition
|
29
|
+
from airbyte_cdk.sources.streams.concurrent.partitions.partition_generator import PartitionGenerator
|
30
|
+
from airbyte_cdk.sources.streams.concurrent.partitions.record import Record
|
31
|
+
from airbyte_cdk.sources.streams.core import StreamData
|
32
|
+
from airbyte_cdk.sources.utils.schema_helpers import InternalConfig
|
33
|
+
from airbyte_cdk.sources.utils.slice_logger import SliceLogger
|
34
|
+
from deprecated.classic import deprecated
|
35
|
+
|
36
|
+
"""
|
37
|
+
This module contains adapters to help enabling concurrency on File-based Stream objects without needing to migrate to AbstractStream
|
38
|
+
"""
|
39
|
+
|
40
|
+
|
41
|
+
@deprecated("This class is experimental. Use at your own risk.")
|
42
|
+
class FileBasedStreamFacade(AbstractStreamFacade[DefaultStream], AbstractFileBasedStream):
|
43
|
+
@classmethod
|
44
|
+
def create_from_stream(
|
45
|
+
cls,
|
46
|
+
stream: AbstractFileBasedStream,
|
47
|
+
source: AbstractSource,
|
48
|
+
logger: logging.Logger,
|
49
|
+
state: Optional[MutableMapping[str, Any]],
|
50
|
+
cursor: FileBasedNoopCursor,
|
51
|
+
) -> "FileBasedStreamFacade":
|
52
|
+
"""
|
53
|
+
Create a ConcurrentStream from a FileBasedStream object.
|
54
|
+
"""
|
55
|
+
pk = get_primary_key_from_stream(stream.primary_key)
|
56
|
+
cursor_field = get_cursor_field_from_stream(stream)
|
57
|
+
|
58
|
+
if not source.message_repository:
|
59
|
+
raise ValueError(
|
60
|
+
"A message repository is required to emit non-record messages. Please set the message repository on the source."
|
61
|
+
)
|
62
|
+
|
63
|
+
message_repository = source.message_repository
|
64
|
+
return FileBasedStreamFacade(
|
65
|
+
DefaultStream( # type: ignore
|
66
|
+
partition_generator=FileBasedStreamPartitionGenerator(
|
67
|
+
stream,
|
68
|
+
message_repository,
|
69
|
+
SyncMode.full_refresh if isinstance(cursor, FileBasedNoopCursor) else SyncMode.incremental,
|
70
|
+
[cursor_field] if cursor_field is not None else None,
|
71
|
+
state,
|
72
|
+
cursor,
|
73
|
+
),
|
74
|
+
name=stream.name,
|
75
|
+
json_schema=stream.get_json_schema(),
|
76
|
+
availability_strategy=AbstractFileBasedAvailabilityStrategyWrapper(stream),
|
77
|
+
primary_key=pk,
|
78
|
+
cursor_field=cursor_field,
|
79
|
+
logger=logger,
|
80
|
+
namespace=stream.namespace,
|
81
|
+
),
|
82
|
+
stream,
|
83
|
+
cursor,
|
84
|
+
logger=logger,
|
85
|
+
slice_logger=source._slice_logger,
|
86
|
+
)
|
87
|
+
|
88
|
+
def __init__(
|
89
|
+
self,
|
90
|
+
stream: DefaultStream,
|
91
|
+
legacy_stream: AbstractFileBasedStream,
|
92
|
+
cursor: FileBasedNoopCursor,
|
93
|
+
slice_logger: SliceLogger,
|
94
|
+
logger: logging.Logger,
|
95
|
+
):
|
96
|
+
"""
|
97
|
+
:param stream: The underlying AbstractStream
|
98
|
+
"""
|
99
|
+
# super().__init__(stream, legacy_stream, cursor, slice_logger, logger)
|
100
|
+
self._abstract_stream = stream
|
101
|
+
self._legacy_stream = legacy_stream
|
102
|
+
self._cursor = cursor
|
103
|
+
self._slice_logger = slice_logger
|
104
|
+
self._logger = logger
|
105
|
+
self.catalog_schema = legacy_stream.catalog_schema
|
106
|
+
self.config = legacy_stream.config
|
107
|
+
self.validation_policy = legacy_stream.validation_policy
|
108
|
+
|
109
|
+
@property
|
110
|
+
def cursor_field(self) -> Union[str, List[str]]:
|
111
|
+
if self._abstract_stream.cursor_field is None:
|
112
|
+
return []
|
113
|
+
else:
|
114
|
+
return self._abstract_stream.cursor_field
|
115
|
+
|
116
|
+
@property
|
117
|
+
def name(self) -> str:
|
118
|
+
return self._abstract_stream.name
|
119
|
+
|
120
|
+
@property
|
121
|
+
def supports_incremental(self) -> bool:
|
122
|
+
return self._legacy_stream.supports_incremental
|
123
|
+
|
124
|
+
@property
|
125
|
+
def availability_strategy(self) -> AbstractFileBasedAvailabilityStrategy:
|
126
|
+
return self._legacy_stream.availability_strategy
|
127
|
+
|
128
|
+
@lru_cache(maxsize=None)
|
129
|
+
def get_json_schema(self) -> Mapping[str, Any]:
|
130
|
+
return self._abstract_stream.get_json_schema()
|
131
|
+
|
132
|
+
@property
|
133
|
+
def primary_key(self) -> PrimaryKeyType:
|
134
|
+
return self._legacy_stream.config.primary_key or self.get_parser().get_parser_defined_primary_key(self._legacy_stream.config)
|
135
|
+
|
136
|
+
def get_parser(self) -> FileTypeParser:
|
137
|
+
return self._legacy_stream.get_parser()
|
138
|
+
|
139
|
+
def get_files(self) -> Iterable[RemoteFile]:
|
140
|
+
return self._legacy_stream.get_files()
|
141
|
+
|
142
|
+
def read_records_from_slice(self, stream_slice: StreamSlice) -> Iterable[Mapping[str, Any]]:
|
143
|
+
yield from self._legacy_stream.read_records_from_slice(stream_slice)
|
144
|
+
|
145
|
+
def compute_slices(self) -> Iterable[Optional[StreamSlice]]:
|
146
|
+
return self._legacy_stream.compute_slices()
|
147
|
+
|
148
|
+
def infer_schema(self, files: List[RemoteFile]) -> Mapping[str, Any]:
|
149
|
+
return self._legacy_stream.infer_schema(files)
|
150
|
+
|
151
|
+
def get_underlying_stream(self) -> DefaultStream:
|
152
|
+
return self._abstract_stream
|
153
|
+
|
154
|
+
def read_full_refresh(
|
155
|
+
self,
|
156
|
+
cursor_field: Optional[List[str]],
|
157
|
+
logger: logging.Logger,
|
158
|
+
slice_logger: SliceLogger,
|
159
|
+
) -> Iterable[StreamData]:
|
160
|
+
"""
|
161
|
+
Read full refresh. Delegate to the underlying AbstractStream, ignoring all the parameters
|
162
|
+
:param cursor_field: (ignored)
|
163
|
+
:param logger: (ignored)
|
164
|
+
:param slice_logger: (ignored)
|
165
|
+
:return: Iterable of StreamData
|
166
|
+
"""
|
167
|
+
yield from self._read_records()
|
168
|
+
|
169
|
+
def read_incremental(
|
170
|
+
self,
|
171
|
+
cursor_field: Optional[List[str]],
|
172
|
+
logger: logging.Logger,
|
173
|
+
slice_logger: SliceLogger,
|
174
|
+
stream_state: MutableMapping[str, Any],
|
175
|
+
state_manager: ConnectorStateManager,
|
176
|
+
per_stream_state_enabled: bool,
|
177
|
+
internal_config: InternalConfig,
|
178
|
+
) -> Iterable[StreamData]:
|
179
|
+
yield from self._read_records()
|
180
|
+
|
181
|
+
def read_records(
|
182
|
+
self,
|
183
|
+
sync_mode: SyncMode,
|
184
|
+
cursor_field: Optional[List[str]] = None,
|
185
|
+
stream_slice: Optional[Mapping[str, Any]] = None,
|
186
|
+
stream_state: Optional[Mapping[str, Any]] = None,
|
187
|
+
) -> Iterable[StreamData]:
|
188
|
+
try:
|
189
|
+
yield from self._read_records()
|
190
|
+
except Exception as exc:
|
191
|
+
if hasattr(self._cursor, "state"):
|
192
|
+
state = str(self._cursor.state)
|
193
|
+
else:
|
194
|
+
# This shouldn't happen if the ConcurrentCursor was used
|
195
|
+
state = "unknown; no state attribute was available on the cursor"
|
196
|
+
yield AirbyteMessage(
|
197
|
+
type=Type.LOG, log=AirbyteLogMessage(level=Level.ERROR, message=f"Cursor State at time of exception: {state}")
|
198
|
+
)
|
199
|
+
raise exc
|
200
|
+
|
201
|
+
def _read_records(self) -> Iterable[StreamData]:
|
202
|
+
for partition in self._abstract_stream.generate_partitions():
|
203
|
+
if self._slice_logger.should_log_slice_message(self._logger):
|
204
|
+
yield self._slice_logger.create_slice_log_message(partition.to_slice())
|
205
|
+
for record in partition.read():
|
206
|
+
yield record.data
|
207
|
+
|
208
|
+
|
209
|
+
class FileBasedStreamPartition(Partition):
|
210
|
+
def __init__(
|
211
|
+
self,
|
212
|
+
stream: AbstractFileBasedStream,
|
213
|
+
_slice: Optional[Mapping[str, Any]],
|
214
|
+
message_repository: MessageRepository,
|
215
|
+
sync_mode: SyncMode,
|
216
|
+
cursor_field: Optional[List[str]],
|
217
|
+
state: Optional[MutableMapping[str, Any]],
|
218
|
+
cursor: FileBasedNoopCursor,
|
219
|
+
):
|
220
|
+
self._stream = stream
|
221
|
+
self._slice = _slice
|
222
|
+
self._message_repository = message_repository
|
223
|
+
self._sync_mode = sync_mode
|
224
|
+
self._cursor_field = cursor_field
|
225
|
+
self._state = state
|
226
|
+
self._cursor = cursor
|
227
|
+
self._is_closed = False
|
228
|
+
|
229
|
+
def read(self) -> Iterable[Record]:
|
230
|
+
try:
|
231
|
+
for record_data in self._stream.read_records(
|
232
|
+
cursor_field=self._cursor_field,
|
233
|
+
sync_mode=SyncMode.full_refresh,
|
234
|
+
stream_slice=copy.deepcopy(self._slice),
|
235
|
+
stream_state=self._state,
|
236
|
+
):
|
237
|
+
if isinstance(record_data, Mapping):
|
238
|
+
data_to_return = dict(record_data)
|
239
|
+
self._stream.transformer.transform(data_to_return, self._stream.get_json_schema())
|
240
|
+
yield Record(data_to_return, self.stream_name())
|
241
|
+
else:
|
242
|
+
self._message_repository.emit_message(record_data)
|
243
|
+
except Exception as e:
|
244
|
+
display_message = self._stream.get_error_display_message(e)
|
245
|
+
if display_message:
|
246
|
+
raise ExceptionWithDisplayMessage(display_message) from e
|
247
|
+
else:
|
248
|
+
raise e
|
249
|
+
|
250
|
+
def to_slice(self) -> Optional[Mapping[str, Any]]:
|
251
|
+
if self._slice is None:
|
252
|
+
return None
|
253
|
+
assert (
|
254
|
+
len(self._slice["files"]) == 1
|
255
|
+
), f"Expected 1 file per partition but got {len(self._slice['files'])} for stream {self.stream_name()}"
|
256
|
+
file = self._slice["files"][0]
|
257
|
+
return {"files": [file]}
|
258
|
+
|
259
|
+
def close(self) -> None:
|
260
|
+
self._cursor.close_partition(self)
|
261
|
+
self._is_closed = True
|
262
|
+
|
263
|
+
def is_closed(self) -> bool:
|
264
|
+
return self._is_closed
|
265
|
+
|
266
|
+
def __hash__(self) -> int:
|
267
|
+
if self._slice:
|
268
|
+
# Convert the slice to a string so that it can be hashed
|
269
|
+
if len(self._slice["files"]) != 1:
|
270
|
+
raise ValueError(
|
271
|
+
f"Slices for file-based streams should be of length 1, but got {len(self._slice['files'])}. This is unexpected. Please contact Support."
|
272
|
+
)
|
273
|
+
else:
|
274
|
+
s = f"{self._slice['files'][0].last_modified.strftime('%Y-%m-%dT%H:%M:%S.%fZ')}_{self._slice['files'][0].uri}"
|
275
|
+
return hash((self._stream.name, s))
|
276
|
+
else:
|
277
|
+
return hash(self._stream.name)
|
278
|
+
|
279
|
+
def stream_name(self) -> str:
|
280
|
+
return self._stream.name
|
281
|
+
|
282
|
+
def __repr__(self) -> str:
|
283
|
+
return f"FileBasedStreamPartition({self._stream.name}, {self._slice})"
|
284
|
+
|
285
|
+
|
286
|
+
class FileBasedStreamPartitionGenerator(PartitionGenerator):
|
287
|
+
def __init__(
|
288
|
+
self,
|
289
|
+
stream: AbstractFileBasedStream,
|
290
|
+
message_repository: MessageRepository,
|
291
|
+
sync_mode: SyncMode,
|
292
|
+
cursor_field: Optional[List[str]],
|
293
|
+
state: Optional[MutableMapping[str, Any]],
|
294
|
+
cursor: FileBasedNoopCursor,
|
295
|
+
):
|
296
|
+
self._stream = stream
|
297
|
+
self._message_repository = message_repository
|
298
|
+
self._sync_mode = sync_mode
|
299
|
+
self._cursor_field = cursor_field
|
300
|
+
self._state = state
|
301
|
+
self._cursor = cursor
|
302
|
+
|
303
|
+
def generate(self) -> Iterable[FileBasedStreamPartition]:
|
304
|
+
pending_partitions = []
|
305
|
+
for _slice in self._stream.stream_slices(sync_mode=self._sync_mode, cursor_field=self._cursor_field, stream_state=self._state):
|
306
|
+
if _slice is not None:
|
307
|
+
pending_partitions.extend(
|
308
|
+
[
|
309
|
+
FileBasedStreamPartition(
|
310
|
+
self._stream,
|
311
|
+
{"files": [copy.deepcopy(f)]},
|
312
|
+
self._message_repository,
|
313
|
+
self._sync_mode,
|
314
|
+
self._cursor_field,
|
315
|
+
self._state,
|
316
|
+
self._cursor,
|
317
|
+
)
|
318
|
+
for f in _slice.get("files", [])
|
319
|
+
]
|
320
|
+
)
|
321
|
+
self._cursor.set_pending_partitions(pending_partitions)
|
322
|
+
yield from pending_partitions
|
@@ -0,0 +1,87 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
3
|
+
#
|
4
|
+
import logging
|
5
|
+
from abc import abstractmethod
|
6
|
+
from datetime import datetime
|
7
|
+
from typing import Any, Iterable, MutableMapping
|
8
|
+
|
9
|
+
from airbyte_cdk.sources.file_based.config.file_based_stream_config import FileBasedStreamConfig
|
10
|
+
from airbyte_cdk.sources.file_based.remote_file import RemoteFile
|
11
|
+
from airbyte_cdk.sources.file_based.stream.cursor import AbstractFileBasedCursor
|
12
|
+
from airbyte_cdk.sources.file_based.types import StreamState
|
13
|
+
from airbyte_cdk.sources.streams.concurrent.cursor import Cursor
|
14
|
+
from airbyte_cdk.sources.streams.concurrent.partitions.partition import Partition
|
15
|
+
from airbyte_cdk.sources.streams.concurrent.partitions.record import Record
|
16
|
+
|
17
|
+
|
18
|
+
class AbstractFileBasedConcurrentCursor(Cursor, AbstractFileBasedCursor):
|
19
|
+
@property
|
20
|
+
@abstractmethod
|
21
|
+
def state(self) -> MutableMapping[str, Any]:
|
22
|
+
...
|
23
|
+
|
24
|
+
@abstractmethod
|
25
|
+
def add_file(self, file: RemoteFile) -> None:
|
26
|
+
...
|
27
|
+
|
28
|
+
@abstractmethod
|
29
|
+
def set_initial_state(self, value: StreamState) -> None:
|
30
|
+
...
|
31
|
+
|
32
|
+
@abstractmethod
|
33
|
+
def get_state(self) -> MutableMapping[str, Any]:
|
34
|
+
...
|
35
|
+
|
36
|
+
@abstractmethod
|
37
|
+
def get_start_time(self) -> datetime:
|
38
|
+
...
|
39
|
+
|
40
|
+
@abstractmethod
|
41
|
+
def get_files_to_sync(self, all_files: Iterable[RemoteFile], logger: logging.Logger) -> Iterable[RemoteFile]:
|
42
|
+
...
|
43
|
+
|
44
|
+
@abstractmethod
|
45
|
+
def observe(self, record: Record) -> None:
|
46
|
+
...
|
47
|
+
|
48
|
+
@abstractmethod
|
49
|
+
def close_partition(self, partition: Partition) -> None:
|
50
|
+
...
|
51
|
+
|
52
|
+
@abstractmethod
|
53
|
+
def set_pending_partitions(self, partitions: Iterable[Partition]) -> None:
|
54
|
+
...
|
55
|
+
|
56
|
+
|
57
|
+
class FileBasedNoopCursor(AbstractFileBasedConcurrentCursor):
|
58
|
+
def __init__(self, stream_config: FileBasedStreamConfig, **kwargs: Any):
|
59
|
+
pass
|
60
|
+
|
61
|
+
@property
|
62
|
+
def state(self) -> MutableMapping[str, Any]:
|
63
|
+
return {}
|
64
|
+
|
65
|
+
def add_file(self, file: RemoteFile) -> None:
|
66
|
+
return None
|
67
|
+
|
68
|
+
def set_initial_state(self, value: StreamState) -> None:
|
69
|
+
return None
|
70
|
+
|
71
|
+
def get_state(self) -> MutableMapping[str, Any]:
|
72
|
+
return {}
|
73
|
+
|
74
|
+
def get_start_time(self) -> datetime:
|
75
|
+
return datetime.min
|
76
|
+
|
77
|
+
def get_files_to_sync(self, all_files: Iterable[RemoteFile], logger: logging.Logger) -> Iterable[RemoteFile]:
|
78
|
+
return []
|
79
|
+
|
80
|
+
def observe(self, record: Record) -> None:
|
81
|
+
return None
|
82
|
+
|
83
|
+
def close_partition(self, partition: Partition) -> None:
|
84
|
+
return None
|
85
|
+
|
86
|
+
def set_pending_partitions(self, partitions: Iterable[Partition]) -> None:
|
87
|
+
return None
|