airbyte-cdk 0.72.0__py3-none-any.whl → 6.13.1.dev4106__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- airbyte_cdk/__init__.py +355 -6
- 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 +230 -0
- airbyte_cdk/cli/source_declarative_manifest/spec.json +17 -0
- airbyte_cdk/config_observation.py +29 -10
- airbyte_cdk/connector.py +24 -24
- airbyte_cdk/connector_builder/README.md +53 -0
- airbyte_cdk/connector_builder/connector_builder_handler.py +37 -11
- airbyte_cdk/connector_builder/main.py +45 -13
- airbyte_cdk/connector_builder/message_grouper.py +189 -50
- airbyte_cdk/connector_builder/models.py +3 -2
- airbyte_cdk/destinations/__init__.py +4 -3
- airbyte_cdk/destinations/destination.py +54 -20
- airbyte_cdk/destinations/vector_db_based/README.md +37 -0
- airbyte_cdk/destinations/vector_db_based/config.py +40 -17
- airbyte_cdk/destinations/vector_db_based/document_processor.py +56 -17
- airbyte_cdk/destinations/vector_db_based/embedder.py +57 -15
- airbyte_cdk/destinations/vector_db_based/test_utils.py +14 -4
- airbyte_cdk/destinations/vector_db_based/utils.py +8 -2
- airbyte_cdk/destinations/vector_db_based/writer.py +24 -5
- airbyte_cdk/entrypoint.py +153 -44
- airbyte_cdk/exception_handler.py +21 -3
- airbyte_cdk/logger.py +30 -44
- airbyte_cdk/models/__init__.py +13 -2
- airbyte_cdk/models/airbyte_protocol.py +86 -1
- airbyte_cdk/models/airbyte_protocol_serializers.py +44 -0
- airbyte_cdk/models/file_transfer_record_message.py +13 -0
- airbyte_cdk/models/well_known_types.py +1 -1
- airbyte_cdk/sources/__init__.py +5 -1
- airbyte_cdk/sources/abstract_source.py +125 -79
- airbyte_cdk/sources/concurrent_source/__init__.py +7 -2
- airbyte_cdk/sources/concurrent_source/concurrent_read_processor.py +102 -36
- airbyte_cdk/sources/concurrent_source/concurrent_source.py +29 -36
- airbyte_cdk/sources/concurrent_source/concurrent_source_adapter.py +94 -10
- airbyte_cdk/sources/concurrent_source/stream_thread_exception.py +25 -0
- airbyte_cdk/sources/concurrent_source/thread_pool_manager.py +20 -14
- airbyte_cdk/sources/config.py +3 -2
- airbyte_cdk/sources/connector_state_manager.py +49 -83
- airbyte_cdk/sources/declarative/async_job/job.py +52 -0
- airbyte_cdk/sources/declarative/async_job/job_orchestrator.py +497 -0
- airbyte_cdk/sources/declarative/async_job/job_tracker.py +75 -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 +2 -3
- airbyte_cdk/sources/declarative/auth/declarative_authenticator.py +3 -1
- airbyte_cdk/sources/declarative/auth/jwt.py +191 -0
- airbyte_cdk/sources/declarative/auth/oauth.py +60 -20
- airbyte_cdk/sources/declarative/auth/selective_authenticator.py +10 -2
- airbyte_cdk/sources/declarative/auth/token.py +28 -10
- airbyte_cdk/sources/declarative/auth/token_provider.py +9 -8
- airbyte_cdk/sources/declarative/checks/check_stream.py +16 -8
- airbyte_cdk/sources/declarative/checks/connection_checker.py +4 -2
- 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 +421 -0
- airbyte_cdk/sources/declarative/datetime/datetime_parser.py +4 -0
- airbyte_cdk/sources/declarative/datetime/min_max_datetime.py +26 -6
- airbyte_cdk/sources/declarative/declarative_component_schema.yaml +1213 -88
- airbyte_cdk/sources/declarative/declarative_source.py +5 -2
- airbyte_cdk/sources/declarative/declarative_stream.py +95 -9
- airbyte_cdk/sources/declarative/decoders/__init__.py +23 -2
- airbyte_cdk/sources/declarative/decoders/composite_raw_decoder.py +97 -0
- airbyte_cdk/sources/declarative/decoders/decoder.py +11 -4
- airbyte_cdk/sources/declarative/decoders/json_decoder.py +92 -5
- 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/extractors/__init__.py +12 -1
- airbyte_cdk/sources/declarative/extractors/dpath_extractor.py +29 -24
- airbyte_cdk/sources/declarative/extractors/http_selector.py +4 -5
- airbyte_cdk/sources/declarative/extractors/record_extractor.py +2 -3
- airbyte_cdk/sources/declarative/extractors/record_filter.py +65 -8
- airbyte_cdk/sources/declarative/extractors/record_selector.py +85 -26
- airbyte_cdk/sources/declarative/extractors/response_to_file_extractor.py +177 -0
- airbyte_cdk/sources/declarative/extractors/type_transformer.py +55 -0
- airbyte_cdk/sources/declarative/incremental/__init__.py +25 -3
- airbyte_cdk/sources/declarative/incremental/datetime_based_cursor.py +156 -48
- airbyte_cdk/sources/declarative/incremental/declarative_cursor.py +13 -0
- airbyte_cdk/sources/declarative/incremental/global_substream_cursor.py +350 -0
- airbyte_cdk/sources/declarative/incremental/per_partition_cursor.py +159 -74
- 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/filters.py +27 -1
- airbyte_cdk/sources/declarative/interpolation/interpolated_boolean.py +23 -5
- airbyte_cdk/sources/declarative/interpolation/interpolated_mapping.py +12 -8
- airbyte_cdk/sources/declarative/interpolation/interpolated_nested_mapping.py +13 -6
- airbyte_cdk/sources/declarative/interpolation/interpolated_string.py +21 -6
- airbyte_cdk/sources/declarative/interpolation/interpolation.py +9 -3
- airbyte_cdk/sources/declarative/interpolation/jinja.py +72 -37
- airbyte_cdk/sources/declarative/interpolation/macros.py +72 -17
- airbyte_cdk/sources/declarative/manifest_declarative_source.py +193 -52
- 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 +1 -1
- airbyte_cdk/sources/declarative/models/declarative_component_schema.py +1329 -595
- airbyte_cdk/sources/declarative/parsers/custom_exceptions.py +2 -2
- airbyte_cdk/sources/declarative/parsers/manifest_component_transformer.py +26 -4
- airbyte_cdk/sources/declarative/parsers/manifest_reference_resolver.py +26 -15
- airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py +1699 -226
- airbyte_cdk/sources/declarative/partition_routers/__init__.py +24 -4
- 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 +39 -9
- airbyte_cdk/sources/declarative/partition_routers/partition_router.py +62 -0
- airbyte_cdk/sources/declarative/partition_routers/single_partition_router.py +15 -3
- airbyte_cdk/sources/declarative/partition_routers/substream_partition_router.py +222 -39
- airbyte_cdk/sources/declarative/requesters/error_handlers/__init__.py +19 -5
- airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/__init__.py +3 -1
- airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/constant_backoff_strategy.py +19 -7
- airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/exponential_backoff_strategy.py +19 -7
- airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/header_helper.py +4 -2
- airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/wait_time_from_header_backoff_strategy.py +41 -9
- airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/wait_until_time_from_header_backoff_strategy.py +29 -14
- airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategy.py +5 -13
- airbyte_cdk/sources/declarative/requesters/error_handlers/composite_error_handler.py +32 -16
- airbyte_cdk/sources/declarative/requesters/error_handlers/default_error_handler.py +46 -56
- airbyte_cdk/sources/declarative/requesters/error_handlers/default_http_response_filter.py +40 -0
- airbyte_cdk/sources/declarative/requesters/error_handlers/error_handler.py +6 -32
- airbyte_cdk/sources/declarative/requesters/error_handlers/http_response_filter.py +119 -41
- airbyte_cdk/sources/declarative/requesters/http_job_repository.py +228 -0
- airbyte_cdk/sources/declarative/requesters/http_requester.py +98 -344
- airbyte_cdk/sources/declarative/requesters/paginators/__init__.py +14 -3
- airbyte_cdk/sources/declarative/requesters/paginators/default_paginator.py +105 -46
- airbyte_cdk/sources/declarative/requesters/paginators/no_pagination.py +14 -8
- airbyte_cdk/sources/declarative/requesters/paginators/paginator.py +19 -8
- airbyte_cdk/sources/declarative/requesters/paginators/strategies/__init__.py +9 -3
- airbyte_cdk/sources/declarative/requesters/paginators/strategies/cursor_pagination_strategy.py +53 -21
- airbyte_cdk/sources/declarative/requesters/paginators/strategies/offset_increment.py +42 -19
- airbyte_cdk/sources/declarative/requesters/paginators/strategies/page_increment.py +25 -12
- airbyte_cdk/sources/declarative/requesters/paginators/strategies/pagination_strategy.py +13 -10
- airbyte_cdk/sources/declarative/requesters/paginators/strategies/stop_condition.py +26 -13
- airbyte_cdk/sources/declarative/requesters/request_options/__init__.py +15 -2
- airbyte_cdk/sources/declarative/requesters/request_options/datetime_based_request_options_provider.py +91 -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 +31 -14
- airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_input_provider.py +27 -15
- airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_options_provider.py +63 -10
- airbyte_cdk/sources/declarative/requesters/request_options/request_options_provider.py +1 -1
- airbyte_cdk/sources/declarative/requesters/requester.py +9 -17
- 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 +6 -2
- airbyte_cdk/sources/declarative/retrievers/async_retriever.py +100 -0
- airbyte_cdk/sources/declarative/retrievers/retriever.py +1 -3
- airbyte_cdk/sources/declarative/retrievers/simple_retriever.py +228 -72
- airbyte_cdk/sources/declarative/schema/__init__.py +14 -1
- airbyte_cdk/sources/declarative/schema/default_schema_loader.py +5 -3
- airbyte_cdk/sources/declarative/schema/dynamic_schema_loader.py +236 -0
- airbyte_cdk/sources/declarative/schema/json_file_schema_loader.py +8 -8
- airbyte_cdk/sources/declarative/spec/spec.py +12 -5
- airbyte_cdk/sources/declarative/stream_slicers/__init__.py +1 -2
- airbyte_cdk/sources/declarative/stream_slicers/declarative_partition_generator.py +88 -0
- airbyte_cdk/sources/declarative/stream_slicers/stream_slicer.py +9 -14
- airbyte_cdk/sources/declarative/transformations/add_fields.py +19 -11
- 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 +13 -10
- airbyte_cdk/sources/declarative/transformations/transformation.py +5 -5
- airbyte_cdk/sources/declarative/types.py +19 -110
- airbyte_cdk/sources/declarative/yaml_declarative_source.py +31 -10
- airbyte_cdk/sources/embedded/base_integration.py +16 -5
- airbyte_cdk/sources/embedded/catalog.py +16 -4
- airbyte_cdk/sources/embedded/runner.py +19 -3
- airbyte_cdk/sources/embedded/tools.py +5 -2
- 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 +9 -2
- airbyte_cdk/sources/file_based/availability_strategy/abstract_file_based_availability_strategy.py +22 -6
- airbyte_cdk/sources/file_based/availability_strategy/default_file_based_availability_strategy.py +46 -10
- airbyte_cdk/sources/file_based/config/abstract_file_based_spec.py +58 -10
- airbyte_cdk/sources/file_based/config/avro_format.py +2 -1
- airbyte_cdk/sources/file_based/config/csv_format.py +29 -10
- airbyte_cdk/sources/file_based/config/excel_format.py +18 -0
- airbyte_cdk/sources/file_based/config/file_based_stream_config.py +16 -4
- airbyte_cdk/sources/file_based/config/jsonl_format.py +2 -1
- airbyte_cdk/sources/file_based/config/parquet_format.py +2 -1
- airbyte_cdk/sources/file_based/config/unstructured_format.py +13 -5
- airbyte_cdk/sources/file_based/discovery_policy/__init__.py +6 -2
- airbyte_cdk/sources/file_based/discovery_policy/abstract_discovery_policy.py +2 -4
- airbyte_cdk/sources/file_based/discovery_policy/default_discovery_policy.py +7 -2
- airbyte_cdk/sources/file_based/exceptions.py +52 -15
- airbyte_cdk/sources/file_based/file_based_source.py +163 -33
- airbyte_cdk/sources/file_based/file_based_stream_reader.py +83 -5
- airbyte_cdk/sources/file_based/file_types/__init__.py +14 -1
- airbyte_cdk/sources/file_based/file_types/avro_parser.py +75 -24
- airbyte_cdk/sources/file_based/file_types/csv_parser.py +116 -34
- airbyte_cdk/sources/file_based/file_types/excel_parser.py +196 -0
- airbyte_cdk/sources/file_based/file_types/file_transfer.py +37 -0
- airbyte_cdk/sources/file_based/file_types/file_type_parser.py +4 -1
- airbyte_cdk/sources/file_based/file_types/jsonl_parser.py +24 -8
- airbyte_cdk/sources/file_based/file_types/parquet_parser.py +60 -18
- airbyte_cdk/sources/file_based/file_types/unstructured_parser.py +145 -41
- airbyte_cdk/sources/file_based/remote_file.py +1 -1
- airbyte_cdk/sources/file_based/schema_helpers.py +38 -10
- airbyte_cdk/sources/file_based/schema_validation_policies/__init__.py +3 -1
- airbyte_cdk/sources/file_based/schema_validation_policies/abstract_schema_validation_policy.py +3 -1
- airbyte_cdk/sources/file_based/schema_validation_policies/default_schema_validation_policies.py +16 -5
- airbyte_cdk/sources/file_based/stream/abstract_file_based_stream.py +50 -13
- airbyte_cdk/sources/file_based/stream/concurrent/adapters.py +67 -27
- airbyte_cdk/sources/file_based/stream/concurrent/cursor/__init__.py +5 -1
- airbyte_cdk/sources/file_based/stream/concurrent/cursor/abstract_concurrent_file_based_cursor.py +14 -23
- airbyte_cdk/sources/file_based/stream/concurrent/cursor/file_based_concurrent_cursor.py +54 -18
- airbyte_cdk/sources/file_based/stream/concurrent/cursor/file_based_final_state_cursor.py +21 -9
- airbyte_cdk/sources/file_based/stream/cursor/abstract_file_based_cursor.py +3 -1
- airbyte_cdk/sources/file_based/stream/cursor/default_file_based_cursor.py +27 -10
- airbyte_cdk/sources/file_based/stream/default_file_based_stream.py +175 -45
- airbyte_cdk/sources/http_logger.py +8 -3
- airbyte_cdk/sources/message/__init__.py +7 -1
- airbyte_cdk/sources/message/repository.py +18 -4
- airbyte_cdk/sources/source.py +42 -38
- airbyte_cdk/sources/streams/__init__.py +2 -2
- airbyte_cdk/sources/streams/availability_strategy.py +54 -3
- airbyte_cdk/sources/streams/call_rate.py +64 -21
- airbyte_cdk/sources/streams/checkpoint/__init__.py +26 -0
- airbyte_cdk/sources/streams/checkpoint/checkpoint_reader.py +335 -0
- airbyte_cdk/sources/{declarative/incremental → streams/checkpoint}/cursor.py +17 -14
- 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/abstract_stream.py +7 -2
- airbyte_cdk/sources/streams/concurrent/adapters.py +84 -75
- airbyte_cdk/sources/streams/concurrent/availability_strategy.py +30 -2
- airbyte_cdk/sources/streams/concurrent/cursor.py +298 -42
- airbyte_cdk/sources/streams/concurrent/default_stream.py +12 -3
- airbyte_cdk/sources/streams/concurrent/exceptions.py +3 -0
- airbyte_cdk/sources/streams/concurrent/helpers.py +14 -3
- airbyte_cdk/sources/streams/concurrent/partition_enqueuer.py +12 -3
- airbyte_cdk/sources/streams/concurrent/partition_reader.py +10 -3
- airbyte_cdk/sources/streams/concurrent/partitions/partition.py +1 -16
- airbyte_cdk/sources/streams/concurrent/partitions/stream_slicer.py +21 -0
- airbyte_cdk/sources/streams/concurrent/partitions/types.py +15 -5
- airbyte_cdk/sources/streams/concurrent/state_converters/abstract_stream_state_converter.py +109 -17
- airbyte_cdk/sources/streams/concurrent/state_converters/datetime_stream_state_converter.py +90 -72
- airbyte_cdk/sources/streams/core.py +412 -87
- airbyte_cdk/sources/streams/http/__init__.py +2 -1
- airbyte_cdk/sources/streams/http/availability_strategy.py +12 -101
- 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 +27 -7
- airbyte_cdk/sources/streams/http/http.py +369 -246
- airbyte_cdk/sources/streams/http/http_client.py +531 -0
- airbyte_cdk/sources/streams/http/rate_limiting.py +76 -12
- airbyte_cdk/sources/streams/http/requests_native_auth/abstract_oauth.py +28 -9
- airbyte_cdk/sources/streams/http/requests_native_auth/abstract_token.py +2 -1
- airbyte_cdk/sources/streams/http/requests_native_auth/oauth.py +90 -35
- airbyte_cdk/sources/streams/http/requests_native_auth/token.py +13 -3
- airbyte_cdk/sources/types.py +154 -0
- airbyte_cdk/sources/utils/record_helper.py +36 -21
- airbyte_cdk/sources/utils/schema_helpers.py +13 -6
- airbyte_cdk/sources/utils/slice_logger.py +4 -1
- airbyte_cdk/sources/utils/transform.py +54 -20
- 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/catalog_builder.py +70 -18
- airbyte_cdk/test/entrypoint_wrapper.py +117 -42
- airbyte_cdk/test/mock_http/__init__.py +1 -1
- airbyte_cdk/test/mock_http/matcher.py +6 -0
- airbyte_cdk/test/mock_http/mocker.py +57 -10
- airbyte_cdk/test/mock_http/request.py +19 -3
- airbyte_cdk/test/mock_http/response.py +3 -1
- airbyte_cdk/test/mock_http/response_builder.py +32 -16
- airbyte_cdk/test/state_builder.py +18 -10
- 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 +60 -0
- airbyte_cdk/test/utils/reading.py +26 -0
- airbyte_cdk/utils/__init__.py +2 -1
- airbyte_cdk/utils/airbyte_secrets_utils.py +5 -3
- airbyte_cdk/utils/analytics_message.py +10 -2
- airbyte_cdk/utils/datetime_format_inferrer.py +4 -1
- airbyte_cdk/utils/event_timing.py +10 -10
- airbyte_cdk/utils/mapping_helpers.py +3 -1
- airbyte_cdk/utils/message_utils.py +20 -11
- airbyte_cdk/utils/print_buffer.py +75 -0
- airbyte_cdk/utils/schema_inferrer.py +198 -28
- airbyte_cdk/utils/slice_hasher.py +30 -0
- airbyte_cdk/utils/spec_schema_transformations.py +6 -3
- airbyte_cdk/utils/stream_status_utils.py +8 -1
- airbyte_cdk/utils/traced_exception.py +61 -21
- airbyte_cdk-6.13.1.dev4106.dist-info/METADATA +109 -0
- airbyte_cdk-6.13.1.dev4106.dist-info/RECORD +349 -0
- {airbyte_cdk-0.72.0.dist-info → airbyte_cdk-6.13.1.dev4106.dist-info}/WHEEL +1 -2
- airbyte_cdk-6.13.1.dev4106.dist-info/entry_points.txt +3 -0
- airbyte_cdk/sources/declarative/create_partial.py +0 -92
- airbyte_cdk/sources/declarative/parsers/class_types_registry.py +0 -102
- airbyte_cdk/sources/declarative/parsers/default_implementation_registry.py +0 -64
- airbyte_cdk/sources/declarative/requesters/error_handlers/response_action.py +0 -16
- airbyte_cdk/sources/declarative/requesters/error_handlers/response_status.py +0 -68
- airbyte_cdk/sources/declarative/stream_slicers/cartesian_product_stream_slicer.py +0 -114
- airbyte_cdk/sources/deprecated/base_source.py +0 -94
- airbyte_cdk/sources/deprecated/client.py +0 -99
- airbyte_cdk/sources/singer/__init__.py +0 -8
- airbyte_cdk/sources/singer/singer_helpers.py +0 -304
- airbyte_cdk/sources/singer/source.py +0 -186
- airbyte_cdk/sources/streams/concurrent/partitions/record.py +0 -23
- airbyte_cdk/sources/streams/http/auth/__init__.py +0 -17
- airbyte_cdk/sources/streams/http/auth/core.py +0 -29
- airbyte_cdk/sources/streams/http/auth/oauth.py +0 -113
- airbyte_cdk/sources/streams/http/auth/token.py +0 -47
- airbyte_cdk/sources/streams/utils/stream_helper.py +0 -40
- airbyte_cdk/sources/utils/catalog_helpers.py +0 -22
- airbyte_cdk/sources/utils/schema_models.py +0 -84
- airbyte_cdk-0.72.0.dist-info/METADATA +0 -243
- airbyte_cdk-0.72.0.dist-info/RECORD +0 -466
- airbyte_cdk-0.72.0.dist-info/top_level.txt +0 -3
- source_declarative_manifest/main.py +0 -29
- unit_tests/connector_builder/__init__.py +0 -3
- unit_tests/connector_builder/test_connector_builder_handler.py +0 -871
- unit_tests/connector_builder/test_message_grouper.py +0 -713
- unit_tests/connector_builder/utils.py +0 -27
- unit_tests/destinations/test_destination.py +0 -243
- unit_tests/singer/test_singer_helpers.py +0 -56
- unit_tests/singer/test_singer_source.py +0 -112
- unit_tests/sources/__init__.py +0 -0
- unit_tests/sources/concurrent_source/__init__.py +0 -3
- unit_tests/sources/concurrent_source/test_concurrent_source_adapter.py +0 -106
- unit_tests/sources/declarative/__init__.py +0 -3
- unit_tests/sources/declarative/auth/__init__.py +0 -3
- unit_tests/sources/declarative/auth/test_oauth.py +0 -331
- unit_tests/sources/declarative/auth/test_selective_authenticator.py +0 -39
- unit_tests/sources/declarative/auth/test_session_token_auth.py +0 -182
- unit_tests/sources/declarative/auth/test_token_auth.py +0 -200
- unit_tests/sources/declarative/auth/test_token_provider.py +0 -73
- unit_tests/sources/declarative/checks/__init__.py +0 -3
- unit_tests/sources/declarative/checks/test_check_stream.py +0 -146
- unit_tests/sources/declarative/decoders/__init__.py +0 -0
- unit_tests/sources/declarative/decoders/test_json_decoder.py +0 -16
- unit_tests/sources/declarative/external_component.py +0 -13
- unit_tests/sources/declarative/extractors/__init__.py +0 -3
- unit_tests/sources/declarative/extractors/test_dpath_extractor.py +0 -55
- unit_tests/sources/declarative/extractors/test_record_filter.py +0 -55
- unit_tests/sources/declarative/extractors/test_record_selector.py +0 -179
- unit_tests/sources/declarative/incremental/__init__.py +0 -0
- unit_tests/sources/declarative/incremental/test_datetime_based_cursor.py +0 -860
- unit_tests/sources/declarative/incremental/test_per_partition_cursor.py +0 -406
- unit_tests/sources/declarative/incremental/test_per_partition_cursor_integration.py +0 -332
- unit_tests/sources/declarative/interpolation/__init__.py +0 -3
- unit_tests/sources/declarative/interpolation/test_filters.py +0 -80
- unit_tests/sources/declarative/interpolation/test_interpolated_boolean.py +0 -40
- unit_tests/sources/declarative/interpolation/test_interpolated_mapping.py +0 -35
- unit_tests/sources/declarative/interpolation/test_interpolated_nested_mapping.py +0 -45
- unit_tests/sources/declarative/interpolation/test_interpolated_string.py +0 -25
- unit_tests/sources/declarative/interpolation/test_jinja.py +0 -240
- unit_tests/sources/declarative/interpolation/test_macros.py +0 -73
- unit_tests/sources/declarative/parsers/__init__.py +0 -3
- unit_tests/sources/declarative/parsers/test_manifest_component_transformer.py +0 -406
- unit_tests/sources/declarative/parsers/test_manifest_reference_resolver.py +0 -139
- unit_tests/sources/declarative/parsers/test_model_to_component_factory.py +0 -1841
- unit_tests/sources/declarative/parsers/testing_components.py +0 -36
- unit_tests/sources/declarative/partition_routers/__init__.py +0 -3
- unit_tests/sources/declarative/partition_routers/test_list_partition_router.py +0 -155
- unit_tests/sources/declarative/partition_routers/test_single_partition_router.py +0 -14
- unit_tests/sources/declarative/partition_routers/test_substream_partition_router.py +0 -404
- unit_tests/sources/declarative/requesters/__init__.py +0 -3
- unit_tests/sources/declarative/requesters/error_handlers/__init__.py +0 -3
- unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/__init__.py +0 -3
- unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/test_constant_backoff.py +0 -34
- unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/test_exponential_backoff.py +0 -36
- unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/test_header_helper.py +0 -38
- unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/test_wait_time_from_header.py +0 -35
- unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/test_wait_until_time_from_header.py +0 -64
- unit_tests/sources/declarative/requesters/error_handlers/test_composite_error_handler.py +0 -213
- unit_tests/sources/declarative/requesters/error_handlers/test_default_error_handler.py +0 -178
- unit_tests/sources/declarative/requesters/error_handlers/test_http_response_filter.py +0 -121
- unit_tests/sources/declarative/requesters/error_handlers/test_response_status.py +0 -44
- unit_tests/sources/declarative/requesters/paginators/__init__.py +0 -3
- unit_tests/sources/declarative/requesters/paginators/test_cursor_pagination_strategy.py +0 -64
- unit_tests/sources/declarative/requesters/paginators/test_default_paginator.py +0 -313
- unit_tests/sources/declarative/requesters/paginators/test_no_paginator.py +0 -12
- unit_tests/sources/declarative/requesters/paginators/test_offset_increment.py +0 -58
- unit_tests/sources/declarative/requesters/paginators/test_page_increment.py +0 -70
- unit_tests/sources/declarative/requesters/paginators/test_request_option.py +0 -43
- unit_tests/sources/declarative/requesters/paginators/test_stop_condition.py +0 -105
- unit_tests/sources/declarative/requesters/request_options/__init__.py +0 -3
- unit_tests/sources/declarative/requesters/request_options/test_interpolated_request_options_provider.py +0 -101
- unit_tests/sources/declarative/requesters/test_http_requester.py +0 -974
- unit_tests/sources/declarative/requesters/test_interpolated_request_input_provider.py +0 -32
- unit_tests/sources/declarative/retrievers/__init__.py +0 -3
- unit_tests/sources/declarative/retrievers/test_simple_retriever.py +0 -542
- unit_tests/sources/declarative/schema/__init__.py +0 -6
- unit_tests/sources/declarative/schema/source_test/SourceTest.py +0 -8
- unit_tests/sources/declarative/schema/source_test/__init__.py +0 -3
- unit_tests/sources/declarative/schema/test_default_schema_loader.py +0 -32
- unit_tests/sources/declarative/schema/test_inline_schema_loader.py +0 -19
- unit_tests/sources/declarative/schema/test_json_file_schema_loader.py +0 -26
- unit_tests/sources/declarative/states/__init__.py +0 -3
- unit_tests/sources/declarative/stream_slicers/__init__.py +0 -3
- unit_tests/sources/declarative/stream_slicers/test_cartesian_product_stream_slicer.py +0 -225
- unit_tests/sources/declarative/test_create_partial.py +0 -83
- unit_tests/sources/declarative/test_declarative_stream.py +0 -103
- unit_tests/sources/declarative/test_manifest_declarative_source.py +0 -1260
- unit_tests/sources/declarative/test_types.py +0 -39
- unit_tests/sources/declarative/test_yaml_declarative_source.py +0 -148
- unit_tests/sources/file_based/__init__.py +0 -0
- unit_tests/sources/file_based/availability_strategy/__init__.py +0 -0
- unit_tests/sources/file_based/availability_strategy/test_default_file_based_availability_strategy.py +0 -100
- unit_tests/sources/file_based/config/__init__.py +0 -0
- unit_tests/sources/file_based/config/test_abstract_file_based_spec.py +0 -28
- unit_tests/sources/file_based/config/test_csv_format.py +0 -34
- unit_tests/sources/file_based/config/test_file_based_stream_config.py +0 -84
- unit_tests/sources/file_based/discovery_policy/__init__.py +0 -0
- unit_tests/sources/file_based/discovery_policy/test_default_discovery_policy.py +0 -31
- unit_tests/sources/file_based/file_types/__init__.py +0 -0
- unit_tests/sources/file_based/file_types/test_avro_parser.py +0 -243
- unit_tests/sources/file_based/file_types/test_csv_parser.py +0 -546
- unit_tests/sources/file_based/file_types/test_jsonl_parser.py +0 -158
- unit_tests/sources/file_based/file_types/test_parquet_parser.py +0 -274
- unit_tests/sources/file_based/file_types/test_unstructured_parser.py +0 -593
- unit_tests/sources/file_based/helpers.py +0 -70
- unit_tests/sources/file_based/in_memory_files_source.py +0 -211
- unit_tests/sources/file_based/scenarios/__init__.py +0 -0
- unit_tests/sources/file_based/scenarios/avro_scenarios.py +0 -744
- unit_tests/sources/file_based/scenarios/check_scenarios.py +0 -220
- unit_tests/sources/file_based/scenarios/concurrent_incremental_scenarios.py +0 -2844
- unit_tests/sources/file_based/scenarios/csv_scenarios.py +0 -3105
- unit_tests/sources/file_based/scenarios/file_based_source_builder.py +0 -91
- unit_tests/sources/file_based/scenarios/incremental_scenarios.py +0 -1926
- unit_tests/sources/file_based/scenarios/jsonl_scenarios.py +0 -930
- unit_tests/sources/file_based/scenarios/parquet_scenarios.py +0 -754
- unit_tests/sources/file_based/scenarios/scenario_builder.py +0 -234
- unit_tests/sources/file_based/scenarios/unstructured_scenarios.py +0 -608
- unit_tests/sources/file_based/scenarios/user_input_schema_scenarios.py +0 -746
- unit_tests/sources/file_based/scenarios/validation_policy_scenarios.py +0 -726
- unit_tests/sources/file_based/stream/__init__.py +0 -0
- unit_tests/sources/file_based/stream/concurrent/__init__.py +0 -0
- unit_tests/sources/file_based/stream/concurrent/test_adapters.py +0 -362
- unit_tests/sources/file_based/stream/concurrent/test_file_based_concurrent_cursor.py +0 -458
- unit_tests/sources/file_based/stream/test_default_file_based_cursor.py +0 -310
- unit_tests/sources/file_based/stream/test_default_file_based_stream.py +0 -244
- unit_tests/sources/file_based/test_file_based_scenarios.py +0 -320
- unit_tests/sources/file_based/test_file_based_stream_reader.py +0 -272
- unit_tests/sources/file_based/test_scenarios.py +0 -253
- unit_tests/sources/file_based/test_schema_helpers.py +0 -346
- unit_tests/sources/fixtures/__init__.py +0 -3
- unit_tests/sources/fixtures/source_test_fixture.py +0 -153
- unit_tests/sources/message/__init__.py +0 -0
- unit_tests/sources/message/test_repository.py +0 -153
- unit_tests/sources/streams/__init__.py +0 -0
- unit_tests/sources/streams/concurrent/__init__.py +0 -3
- unit_tests/sources/streams/concurrent/scenarios/__init__.py +0 -3
- unit_tests/sources/streams/concurrent/scenarios/incremental_scenarios.py +0 -250
- unit_tests/sources/streams/concurrent/scenarios/stream_facade_builder.py +0 -140
- unit_tests/sources/streams/concurrent/scenarios/stream_facade_scenarios.py +0 -452
- unit_tests/sources/streams/concurrent/scenarios/test_concurrent_scenarios.py +0 -76
- unit_tests/sources/streams/concurrent/scenarios/thread_based_concurrent_stream_scenarios.py +0 -418
- unit_tests/sources/streams/concurrent/scenarios/thread_based_concurrent_stream_source_builder.py +0 -142
- unit_tests/sources/streams/concurrent/scenarios/utils.py +0 -55
- unit_tests/sources/streams/concurrent/test_adapters.py +0 -380
- unit_tests/sources/streams/concurrent/test_concurrent_read_processor.py +0 -684
- unit_tests/sources/streams/concurrent/test_cursor.py +0 -139
- unit_tests/sources/streams/concurrent/test_datetime_state_converter.py +0 -369
- unit_tests/sources/streams/concurrent/test_default_stream.py +0 -197
- unit_tests/sources/streams/concurrent/test_partition_enqueuer.py +0 -90
- unit_tests/sources/streams/concurrent/test_partition_reader.py +0 -67
- unit_tests/sources/streams/concurrent/test_thread_pool_manager.py +0 -106
- unit_tests/sources/streams/http/__init__.py +0 -0
- unit_tests/sources/streams/http/auth/__init__.py +0 -0
- unit_tests/sources/streams/http/auth/test_auth.py +0 -173
- unit_tests/sources/streams/http/requests_native_auth/__init__.py +0 -0
- unit_tests/sources/streams/http/requests_native_auth/test_requests_native_auth.py +0 -423
- unit_tests/sources/streams/http/test_availability_strategy.py +0 -180
- unit_tests/sources/streams/http/test_http.py +0 -635
- unit_tests/sources/streams/test_availability_strategy.py +0 -70
- unit_tests/sources/streams/test_call_rate.py +0 -300
- unit_tests/sources/streams/test_stream_read.py +0 -405
- unit_tests/sources/streams/test_streams_core.py +0 -184
- unit_tests/sources/test_abstract_source.py +0 -1442
- unit_tests/sources/test_concurrent_source.py +0 -112
- unit_tests/sources/test_config.py +0 -92
- unit_tests/sources/test_connector_state_manager.py +0 -482
- unit_tests/sources/test_http_logger.py +0 -252
- unit_tests/sources/test_integration_source.py +0 -86
- unit_tests/sources/test_source.py +0 -684
- unit_tests/sources/test_source_read.py +0 -460
- unit_tests/test/__init__.py +0 -0
- unit_tests/test/mock_http/__init__.py +0 -0
- unit_tests/test/mock_http/test_matcher.py +0 -53
- unit_tests/test/mock_http/test_mocker.py +0 -214
- unit_tests/test/mock_http/test_request.py +0 -117
- unit_tests/test/mock_http/test_response_builder.py +0 -177
- unit_tests/test/test_entrypoint_wrapper.py +0 -240
- unit_tests/utils/__init__.py +0 -0
- unit_tests/utils/test_datetime_format_inferrer.py +0 -60
- unit_tests/utils/test_mapping_helpers.py +0 -54
- unit_tests/utils/test_message_utils.py +0 -91
- unit_tests/utils/test_rate_limiting.py +0 -26
- unit_tests/utils/test_schema_inferrer.py +0 -202
- unit_tests/utils/test_secret_utils.py +0 -135
- unit_tests/utils/test_stream_status_utils.py +0 -61
- unit_tests/utils/test_traced_exception.py +0 -107
- /airbyte_cdk/sources/{deprecated → declarative/async_job}/__init__.py +0 -0
- {source_declarative_manifest → airbyte_cdk/sources/declarative/migrations}/__init__.py +0 -0
- {unit_tests/destinations → airbyte_cdk/sql}/__init__.py +0 -0
- {unit_tests/singer → airbyte_cdk/sql/_util}/__init__.py +0 -0
- {airbyte_cdk-0.72.0.dist-info → airbyte_cdk-6.13.1.dev4106.dist-info}/LICENSE.txt +0 -0
@@ -1,64 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
3
|
-
#
|
4
|
-
|
5
|
-
from typing import Mapping, Type
|
6
|
-
|
7
|
-
from airbyte_cdk.sources.declarative.checks.check_stream import CheckStream
|
8
|
-
from airbyte_cdk.sources.declarative.checks.connection_checker import ConnectionChecker
|
9
|
-
from airbyte_cdk.sources.declarative.datetime.min_max_datetime import MinMaxDatetime
|
10
|
-
from airbyte_cdk.sources.declarative.declarative_stream import DeclarativeStream
|
11
|
-
from airbyte_cdk.sources.declarative.decoders.decoder import Decoder
|
12
|
-
from airbyte_cdk.sources.declarative.decoders.json_decoder import JsonDecoder
|
13
|
-
from airbyte_cdk.sources.declarative.extractors.dpath_extractor import DpathExtractor
|
14
|
-
from airbyte_cdk.sources.declarative.extractors.http_selector import HttpSelector
|
15
|
-
from airbyte_cdk.sources.declarative.extractors.record_extractor import RecordExtractor
|
16
|
-
from airbyte_cdk.sources.declarative.extractors.record_selector import RecordSelector
|
17
|
-
from airbyte_cdk.sources.declarative.interpolation.interpolated_boolean import InterpolatedBoolean
|
18
|
-
from airbyte_cdk.sources.declarative.interpolation.interpolated_string import InterpolatedString
|
19
|
-
from airbyte_cdk.sources.declarative.partition_routers.single_partition_router import SinglePartitionRouter
|
20
|
-
from airbyte_cdk.sources.declarative.requesters.error_handlers.default_error_handler import DefaultErrorHandler
|
21
|
-
from airbyte_cdk.sources.declarative.requesters.error_handlers.error_handler import ErrorHandler
|
22
|
-
from airbyte_cdk.sources.declarative.requesters.error_handlers.http_response_filter import HttpResponseFilter
|
23
|
-
from airbyte_cdk.sources.declarative.requesters.http_requester import HttpRequester
|
24
|
-
from airbyte_cdk.sources.declarative.requesters.paginators.default_paginator import RequestOption
|
25
|
-
from airbyte_cdk.sources.declarative.requesters.paginators.no_pagination import NoPagination
|
26
|
-
from airbyte_cdk.sources.declarative.requesters.paginators.paginator import Paginator
|
27
|
-
from airbyte_cdk.sources.declarative.requesters.request_options.interpolated_request_options_provider import (
|
28
|
-
InterpolatedRequestOptionsProvider,
|
29
|
-
)
|
30
|
-
from airbyte_cdk.sources.declarative.requesters.request_options.request_options_provider import RequestOptionsProvider
|
31
|
-
from airbyte_cdk.sources.declarative.requesters.requester import Requester
|
32
|
-
from airbyte_cdk.sources.declarative.retrievers.retriever import Retriever
|
33
|
-
from airbyte_cdk.sources.declarative.retrievers.simple_retriever import SimpleRetriever
|
34
|
-
from airbyte_cdk.sources.declarative.schema import DefaultSchemaLoader
|
35
|
-
from airbyte_cdk.sources.declarative.schema.schema_loader import SchemaLoader
|
36
|
-
from airbyte_cdk.sources.declarative.stream_slicers.stream_slicer import StreamSlicer
|
37
|
-
from airbyte_cdk.sources.declarative.stream_slicers.substream_slicer import ParentStreamConfig
|
38
|
-
from airbyte_cdk.sources.streams.core import Stream
|
39
|
-
|
40
|
-
"""
|
41
|
-
DEFAULT_IMPLEMENTATIONS_REGISTRY contains a mapping of interface -> subclass
|
42
|
-
enabling the factory to instantiate a reasonable default class when no type or classname is specified
|
43
|
-
"""
|
44
|
-
DEFAULT_IMPLEMENTATIONS_REGISTRY: Mapping[Type, Type] = {
|
45
|
-
ConnectionChecker: CheckStream,
|
46
|
-
Decoder: JsonDecoder,
|
47
|
-
ErrorHandler: DefaultErrorHandler,
|
48
|
-
HttpResponseFilter: HttpResponseFilter,
|
49
|
-
HttpSelector: RecordSelector,
|
50
|
-
InterpolatedBoolean: InterpolatedBoolean,
|
51
|
-
InterpolatedRequestOptionsProvider: InterpolatedRequestOptionsProvider,
|
52
|
-
InterpolatedString: InterpolatedString,
|
53
|
-
MinMaxDatetime: MinMaxDatetime,
|
54
|
-
Paginator: NoPagination,
|
55
|
-
ParentStreamConfig: ParentStreamConfig,
|
56
|
-
RecordExtractor: DpathExtractor,
|
57
|
-
RequestOption: RequestOption,
|
58
|
-
RequestOptionsProvider: InterpolatedRequestOptionsProvider,
|
59
|
-
Requester: HttpRequester,
|
60
|
-
Retriever: SimpleRetriever,
|
61
|
-
SchemaLoader: DefaultSchemaLoader,
|
62
|
-
Stream: DeclarativeStream,
|
63
|
-
StreamSlicer: SinglePartitionRouter,
|
64
|
-
}
|
@@ -1,16 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
3
|
-
#
|
4
|
-
|
5
|
-
from enum import Enum
|
6
|
-
|
7
|
-
|
8
|
-
class ResponseAction(Enum):
|
9
|
-
"""
|
10
|
-
Response statuses for non retriable responses
|
11
|
-
"""
|
12
|
-
|
13
|
-
SUCCESS = "SUCCESS" # "Request was successful"
|
14
|
-
FAIL = "FAIL" # "Request failed unexpectedly"
|
15
|
-
IGNORE = "IGNORE" # "Request failed but can be ignored"
|
16
|
-
RETRY = "RETRY" # Request failed and should be retried
|
@@ -1,68 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
3
|
-
#
|
4
|
-
|
5
|
-
from typing import Final, Optional, Union
|
6
|
-
|
7
|
-
from airbyte_cdk.sources.declarative.requesters.error_handlers.response_action import ResponseAction
|
8
|
-
|
9
|
-
|
10
|
-
class ResponseStatus:
|
11
|
-
"""
|
12
|
-
ResponseAction amended with backoff time if an action is RETRY
|
13
|
-
"""
|
14
|
-
|
15
|
-
def __init__(self, response_action: Union[ResponseAction, str], retry_in: Optional[float] = None, error_message: str = ""):
|
16
|
-
"""
|
17
|
-
:param response_action: response action to execute
|
18
|
-
:param retry_in: backoff time (if action is RETRY)
|
19
|
-
:param error_message: the error to be displayed back to the customer
|
20
|
-
"""
|
21
|
-
if isinstance(response_action, str):
|
22
|
-
response_action = ResponseAction[response_action]
|
23
|
-
if retry_in and response_action != ResponseAction.RETRY:
|
24
|
-
raise ValueError(f"Unexpected backoff time ({retry_in} for non-retryable response action {response_action}")
|
25
|
-
self._retry_in = retry_in
|
26
|
-
self._action = response_action
|
27
|
-
self._error_message = error_message
|
28
|
-
|
29
|
-
@property
|
30
|
-
def action(self):
|
31
|
-
"""The ResponseAction to execute when a response matches the filter"""
|
32
|
-
return self._action
|
33
|
-
|
34
|
-
@property
|
35
|
-
def retry_in(self) -> Optional[float]:
|
36
|
-
"""How long to backoff before retrying a response. None if no wait required."""
|
37
|
-
return self._retry_in
|
38
|
-
|
39
|
-
@property
|
40
|
-
def error_message(self) -> str:
|
41
|
-
"""The message to be displayed when an error response is received"""
|
42
|
-
return self._error_message
|
43
|
-
|
44
|
-
@classmethod
|
45
|
-
def retry(cls, retry_in: Optional[float]) -> "ResponseStatus":
|
46
|
-
"""
|
47
|
-
Returns a ResponseStatus defining how long to backoff before retrying
|
48
|
-
|
49
|
-
:param retry_in: how long to backoff before retrying. None if no wait required
|
50
|
-
:return: A response status defining how long to backoff before retrying
|
51
|
-
"""
|
52
|
-
return ResponseStatus(ResponseAction.RETRY, retry_in)
|
53
|
-
|
54
|
-
def __eq__(self, other):
|
55
|
-
if not other:
|
56
|
-
return not self
|
57
|
-
return self.action == other.action and self.retry_in == other.retry_in
|
58
|
-
|
59
|
-
def __hash__(self):
|
60
|
-
return hash([self.action, self.retry_in])
|
61
|
-
|
62
|
-
|
63
|
-
"""Response is successful. No need to retry"""
|
64
|
-
SUCCESS: Final[ResponseStatus] = ResponseStatus(ResponseAction.SUCCESS)
|
65
|
-
"""Response is unsuccessful. The failure needs to be handled"""
|
66
|
-
FAIL: Final[ResponseStatus] = ResponseStatus(ResponseAction.FAIL)
|
67
|
-
"""Response is unsuccessful, but can be ignored. No need to retry"""
|
68
|
-
IGNORE: Final[ResponseStatus] = ResponseStatus(ResponseAction.IGNORE)
|
@@ -1,114 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
3
|
-
#
|
4
|
-
|
5
|
-
import itertools
|
6
|
-
from collections import ChainMap
|
7
|
-
from dataclasses import InitVar, dataclass
|
8
|
-
from typing import Any, Iterable, List, Mapping, Optional
|
9
|
-
|
10
|
-
from airbyte_cdk.sources.declarative.stream_slicers.stream_slicer import StreamSlicer
|
11
|
-
from airbyte_cdk.sources.declarative.types import StreamSlice, StreamState
|
12
|
-
|
13
|
-
|
14
|
-
@dataclass
|
15
|
-
class CartesianProductStreamSlicer(StreamSlicer):
|
16
|
-
"""
|
17
|
-
Stream slicers that iterates over the cartesian product of input stream slicers
|
18
|
-
Given 2 stream slicers with the following slices:
|
19
|
-
A: [{"i": 0}, {"i": 1}, {"i": 2}]
|
20
|
-
B: [{"s": "hello"}, {"s": "world"}]
|
21
|
-
the resulting stream slices are
|
22
|
-
[
|
23
|
-
{"i": 0, "s": "hello"},
|
24
|
-
{"i": 0, "s": "world"},
|
25
|
-
{"i": 1, "s": "hello"},
|
26
|
-
{"i": 1, "s": "world"},
|
27
|
-
{"i": 2, "s": "hello"},
|
28
|
-
{"i": 2, "s": "world"},
|
29
|
-
]
|
30
|
-
|
31
|
-
Attributes:
|
32
|
-
stream_slicers (List[StreamSlicer]): Underlying stream slicers. The RequestOptions (e.g: Request headers, parameters, etc..) returned by this slicer are the combination of the RequestOptions of its input slicers. If there are conflicts e.g: two slicers define the same header or request param, the conflict is resolved by taking the value from the first slicer, where ordering is determined by the order in which slicers were input to this composite slicer.
|
33
|
-
"""
|
34
|
-
|
35
|
-
stream_slicers: List[StreamSlicer]
|
36
|
-
parameters: InitVar[Mapping[str, Any]]
|
37
|
-
|
38
|
-
def get_request_params(
|
39
|
-
self,
|
40
|
-
*,
|
41
|
-
stream_state: Optional[StreamState] = None,
|
42
|
-
stream_slice: Optional[StreamSlice] = None,
|
43
|
-
next_page_token: Optional[Mapping[str, Any]] = None,
|
44
|
-
) -> Mapping[str, Any]:
|
45
|
-
return dict(
|
46
|
-
ChainMap(
|
47
|
-
*[ # type: ignore # ChainMap expects a MutableMapping[Never, Never] for reasons
|
48
|
-
s.get_request_params(stream_state=stream_state, stream_slice=stream_slice, next_page_token=next_page_token)
|
49
|
-
for s in self.stream_slicers
|
50
|
-
]
|
51
|
-
)
|
52
|
-
)
|
53
|
-
|
54
|
-
def get_request_headers(
|
55
|
-
self,
|
56
|
-
*,
|
57
|
-
stream_state: Optional[StreamState] = None,
|
58
|
-
stream_slice: Optional[StreamSlice] = None,
|
59
|
-
next_page_token: Optional[Mapping[str, Any]] = None,
|
60
|
-
) -> Mapping[str, Any]:
|
61
|
-
return dict(
|
62
|
-
ChainMap(
|
63
|
-
*[ # type: ignore # ChainMap expects a MutableMapping[Never, Never] for reasons
|
64
|
-
s.get_request_headers(stream_state=stream_state, stream_slice=stream_slice, next_page_token=next_page_token)
|
65
|
-
for s in self.stream_slicers
|
66
|
-
]
|
67
|
-
)
|
68
|
-
)
|
69
|
-
|
70
|
-
def get_request_body_data(
|
71
|
-
self,
|
72
|
-
*,
|
73
|
-
stream_state: Optional[StreamState] = None,
|
74
|
-
stream_slice: Optional[StreamSlice] = None,
|
75
|
-
next_page_token: Optional[Mapping[str, Any]] = None,
|
76
|
-
) -> Mapping[str, Any]:
|
77
|
-
return dict(
|
78
|
-
ChainMap(
|
79
|
-
*[ # type: ignore # ChainMap expects a MutableMapping[Never, Never] for reasons
|
80
|
-
s.get_request_body_data(stream_state=stream_state, stream_slice=stream_slice, next_page_token=next_page_token)
|
81
|
-
for s in self.stream_slicers
|
82
|
-
]
|
83
|
-
)
|
84
|
-
)
|
85
|
-
|
86
|
-
def get_request_body_json(
|
87
|
-
self,
|
88
|
-
*,
|
89
|
-
stream_state: Optional[StreamState] = None,
|
90
|
-
stream_slice: Optional[StreamSlice] = None,
|
91
|
-
next_page_token: Optional[Mapping[str, Any]] = None,
|
92
|
-
) -> Mapping[str, Any]:
|
93
|
-
return dict(
|
94
|
-
ChainMap(
|
95
|
-
*[ # type: ignore # ChainMap expects a MutableMapping[Never, Never] for reasons
|
96
|
-
s.get_request_body_json(stream_state=stream_state, stream_slice=stream_slice, next_page_token=next_page_token)
|
97
|
-
for s in self.stream_slicers
|
98
|
-
]
|
99
|
-
)
|
100
|
-
)
|
101
|
-
|
102
|
-
def stream_slices(self) -> Iterable[StreamSlice]:
|
103
|
-
sub_slices = (s.stream_slices() for s in self.stream_slicers)
|
104
|
-
product = itertools.product(*sub_slices)
|
105
|
-
for stream_slice_tuple in product:
|
106
|
-
partition = dict(ChainMap(*[s.partition for s in stream_slice_tuple]))
|
107
|
-
cursor_slices = [s.cursor_slice for s in stream_slice_tuple if s.cursor_slice]
|
108
|
-
if len(cursor_slices) > 1:
|
109
|
-
raise ValueError(f"There should only be a single cursor slice. Found {cursor_slices}")
|
110
|
-
if cursor_slices:
|
111
|
-
cursor_slice = cursor_slices[0]
|
112
|
-
else:
|
113
|
-
cursor_slice = {}
|
114
|
-
yield StreamSlice(partition=partition, cursor_slice=cursor_slice)
|
@@ -1,94 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
3
|
-
#
|
4
|
-
|
5
|
-
|
6
|
-
import copy
|
7
|
-
import logging
|
8
|
-
from datetime import datetime
|
9
|
-
from typing import Any, Iterable, Mapping, MutableMapping, Type
|
10
|
-
|
11
|
-
from airbyte_cdk.models import (
|
12
|
-
AirbyteCatalog,
|
13
|
-
AirbyteConnectionStatus,
|
14
|
-
AirbyteMessage,
|
15
|
-
AirbyteRecordMessage,
|
16
|
-
AirbyteStateMessage,
|
17
|
-
ConfiguredAirbyteCatalog,
|
18
|
-
ConfiguredAirbyteStream,
|
19
|
-
Status,
|
20
|
-
SyncMode,
|
21
|
-
)
|
22
|
-
from airbyte_cdk.models import Type as MessageType
|
23
|
-
from airbyte_cdk.sources.source import Source
|
24
|
-
|
25
|
-
from .client import BaseClient
|
26
|
-
|
27
|
-
|
28
|
-
class BaseSource(Source):
|
29
|
-
"""Base source that designed to work with clients derived from BaseClient"""
|
30
|
-
|
31
|
-
client_class: Type[BaseClient]
|
32
|
-
|
33
|
-
@property
|
34
|
-
def name(self) -> str:
|
35
|
-
"""Source name"""
|
36
|
-
return self.__class__.__name__
|
37
|
-
|
38
|
-
def _get_client(self, config: Mapping):
|
39
|
-
"""Construct client"""
|
40
|
-
return self.client_class(**config)
|
41
|
-
|
42
|
-
def discover(self, logger: logging.Logger, config: Mapping[str, Any]) -> AirbyteCatalog:
|
43
|
-
"""Discover streams"""
|
44
|
-
client = self._get_client(config)
|
45
|
-
|
46
|
-
return AirbyteCatalog(streams=[stream for stream in client.streams])
|
47
|
-
|
48
|
-
def check(self, logger: logging.Logger, config: Mapping[str, Any]) -> AirbyteConnectionStatus:
|
49
|
-
"""Check connection"""
|
50
|
-
client = self._get_client(config)
|
51
|
-
alive, error = client.health_check()
|
52
|
-
if not alive:
|
53
|
-
return AirbyteConnectionStatus(status=Status.FAILED, message=str(error))
|
54
|
-
|
55
|
-
return AirbyteConnectionStatus(status=Status.SUCCEEDED)
|
56
|
-
|
57
|
-
def read(
|
58
|
-
self, logger: logging.Logger, config: Mapping[str, Any], catalog: ConfiguredAirbyteCatalog, state: MutableMapping[str, Any] = None
|
59
|
-
) -> Iterable[AirbyteMessage]:
|
60
|
-
state = state or {}
|
61
|
-
client = self._get_client(config)
|
62
|
-
|
63
|
-
logger.info(f"Starting syncing {self.name}")
|
64
|
-
total_state = copy.deepcopy(state)
|
65
|
-
for configured_stream in catalog.streams:
|
66
|
-
try:
|
67
|
-
yield from self._read_stream(logger=logger, client=client, configured_stream=configured_stream, state=total_state)
|
68
|
-
|
69
|
-
except Exception:
|
70
|
-
logger.exception(f"Encountered an exception while reading stream {self.name}")
|
71
|
-
raise
|
72
|
-
|
73
|
-
logger.info(f"Finished syncing {self.name}")
|
74
|
-
|
75
|
-
def _read_stream(
|
76
|
-
self, logger: logging.Logger, client: BaseClient, configured_stream: ConfiguredAirbyteStream, state: MutableMapping[str, Any]
|
77
|
-
):
|
78
|
-
stream_name = configured_stream.stream.name
|
79
|
-
use_incremental = configured_stream.sync_mode == SyncMode.incremental and client.stream_has_state(stream_name)
|
80
|
-
|
81
|
-
if use_incremental and state.get(stream_name):
|
82
|
-
logger.info(f"Set state of {stream_name} stream to {state.get(stream_name)}")
|
83
|
-
client.set_stream_state(stream_name, state.get(stream_name))
|
84
|
-
|
85
|
-
logger.info(f"Syncing {stream_name} stream")
|
86
|
-
for record in client.read_stream(configured_stream.stream):
|
87
|
-
now = int(datetime.now().timestamp()) * 1000
|
88
|
-
message = AirbyteRecordMessage(stream=stream_name, data=record, emitted_at=now)
|
89
|
-
yield AirbyteMessage(type=MessageType.RECORD, record=message)
|
90
|
-
|
91
|
-
if use_incremental and client.get_stream_state(stream_name):
|
92
|
-
state[stream_name] = client.get_stream_state(stream_name)
|
93
|
-
# output state object only together with other stream states
|
94
|
-
yield AirbyteMessage(type=MessageType.STATE, state=AirbyteStateMessage(data=state))
|
@@ -1,99 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
3
|
-
#
|
4
|
-
|
5
|
-
|
6
|
-
import inspect
|
7
|
-
from abc import ABC, abstractmethod
|
8
|
-
from typing import Any, Callable, Dict, Generator, List, Mapping, Tuple
|
9
|
-
|
10
|
-
from airbyte_cdk.models import AirbyteStream, ConfiguredAirbyteCatalog, ConfiguredAirbyteStream, SyncMode
|
11
|
-
from airbyte_cdk.sources.utils.schema_helpers import ResourceSchemaLoader
|
12
|
-
|
13
|
-
|
14
|
-
def package_name_from_class(cls: object) -> str:
|
15
|
-
"""Find the package name given a class name"""
|
16
|
-
module: Any = inspect.getmodule(cls)
|
17
|
-
return module.__name__.split(".")[0]
|
18
|
-
|
19
|
-
|
20
|
-
class StreamStateMixin:
|
21
|
-
def get_stream_state(self, name: str) -> Any:
|
22
|
-
"""Get state of stream with corresponding name"""
|
23
|
-
raise NotImplementedError
|
24
|
-
|
25
|
-
def set_stream_state(self, name: str, state: Any):
|
26
|
-
"""Set state of stream with corresponding name"""
|
27
|
-
raise NotImplementedError
|
28
|
-
|
29
|
-
def stream_has_state(self, name: str) -> bool:
|
30
|
-
"""Tell if stream supports incremental sync"""
|
31
|
-
return False
|
32
|
-
|
33
|
-
|
34
|
-
class BaseClient(StreamStateMixin, ABC):
|
35
|
-
"""Base client for API"""
|
36
|
-
|
37
|
-
schema_loader_class = ResourceSchemaLoader
|
38
|
-
|
39
|
-
def __init__(self, **kwargs):
|
40
|
-
package_name = package_name_from_class(self.__class__)
|
41
|
-
self._schema_loader = self.schema_loader_class(package_name)
|
42
|
-
self._stream_methods = self._enumerate_methods()
|
43
|
-
|
44
|
-
def _enumerate_methods(self) -> Mapping[str, Callable]:
|
45
|
-
"""Detect available streams and return mapping"""
|
46
|
-
prefix = "stream__"
|
47
|
-
mapping = {}
|
48
|
-
methods = inspect.getmembers(self.__class__, predicate=inspect.isfunction)
|
49
|
-
for name, method in methods:
|
50
|
-
if name.startswith(prefix):
|
51
|
-
mapping[name[len(prefix) :]] = getattr(self, name)
|
52
|
-
|
53
|
-
return mapping
|
54
|
-
|
55
|
-
@staticmethod
|
56
|
-
def _get_fields_from_stream(stream: AirbyteStream) -> List[str]:
|
57
|
-
return list(stream.json_schema.get("properties", {}).keys())
|
58
|
-
|
59
|
-
def _get_stream_method(self, name: str) -> Callable:
|
60
|
-
method = self._stream_methods.get(name)
|
61
|
-
if not method:
|
62
|
-
raise ValueError(f"Client does not know how to read stream `{name}`")
|
63
|
-
return method
|
64
|
-
|
65
|
-
def read_stream(self, stream: AirbyteStream) -> Generator[Dict[str, Any], None, None]:
|
66
|
-
"""Yield records from stream"""
|
67
|
-
method = self._get_stream_method(stream.name)
|
68
|
-
fields = self._get_fields_from_stream(stream)
|
69
|
-
|
70
|
-
for message in method(fields=fields):
|
71
|
-
yield dict(message)
|
72
|
-
|
73
|
-
@property
|
74
|
-
def streams(self) -> Generator[AirbyteStream, None, None]:
|
75
|
-
"""List of available streams"""
|
76
|
-
for name, method in self._stream_methods.items():
|
77
|
-
supported_sync_modes = [SyncMode.full_refresh]
|
78
|
-
source_defined_cursor = False
|
79
|
-
if self.stream_has_state(name):
|
80
|
-
supported_sync_modes += [SyncMode.incremental]
|
81
|
-
source_defined_cursor = True
|
82
|
-
|
83
|
-
yield AirbyteStream(
|
84
|
-
name=name,
|
85
|
-
json_schema=self._schema_loader.get_schema(name),
|
86
|
-
supported_sync_modes=supported_sync_modes,
|
87
|
-
source_defined_cursor=source_defined_cursor,
|
88
|
-
)
|
89
|
-
|
90
|
-
@abstractmethod
|
91
|
-
def health_check(self) -> Tuple[bool, str]:
|
92
|
-
"""Check if service is up and running"""
|
93
|
-
|
94
|
-
|
95
|
-
def configured_catalog_from_client(client: BaseClient) -> ConfiguredAirbyteCatalog:
|
96
|
-
"""Helper to generate configured catalog for testing"""
|
97
|
-
catalog = ConfiguredAirbyteCatalog(streams=[ConfiguredAirbyteStream(stream=stream) for stream in client.streams])
|
98
|
-
|
99
|
-
return catalog
|