airbyte-cdk 0.31.1__tar.gz → 0.33.0__tar.gz
Sign up to get free protection for your applications and to get access to all the features.
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/PKG-INFO +1 -1
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/connector_builder/message_grouper.py +13 -5
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/abstract_source.py +3 -7
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/declarative_component_schema.yaml +143 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/models/declarative_component_schema.py +83 -4
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py +6 -1
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/spec/spec.py +5 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk.egg-info/PKG-INFO +1 -1
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/setup.py +1 -1
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/parsers/test_model_to_component_factory.py +4 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/test_abstract_source.py +6 -8
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/LICENSE.txt +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/README.md +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/config_observation.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/connector.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/connector_builder/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/connector_builder/connector_builder_handler.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/connector_builder/main.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/connector_builder/models.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/destinations/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/destinations/destination.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/entrypoint.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/exception_handler.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/logger.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/models/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/models/airbyte_protocol.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/models/well_known_types.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/py.typed +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/config.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/connector_state_manager.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/auth/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/auth/declarative_authenticator.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/auth/oauth.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/auth/token.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/checks/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/checks/check_stream.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/checks/connection_checker.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/create_partial.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/datetime/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/datetime/datetime_parser.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/datetime/min_max_datetime.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/declarative_source.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/declarative_stream.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/decoders/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/decoders/decoder.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/decoders/json_decoder.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/exceptions.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/extractors/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/extractors/dpath_extractor.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/extractors/http_selector.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/extractors/record_extractor.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/extractors/record_filter.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/extractors/record_selector.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/incremental/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/incremental/datetime_based_cursor.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/interpolation/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/interpolation/filters.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_boolean.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_mapping.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_string.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/interpolation/interpolation.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/interpolation/jinja.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/interpolation/macros.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/manifest_declarative_source.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/models/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/parsers/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/parsers/class_types_registry.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/parsers/custom_exceptions.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/parsers/default_implementation_registry.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/parsers/manifest_component_transformer.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/parsers/manifest_reference_resolver.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/partition_routers/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/partition_routers/list_partition_router.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/partition_routers/single_partition_router.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/partition_routers/substream_partition_router.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/requesters/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/constant_backoff_strategy.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/exponential_backoff_strategy.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/header_helper.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/wait_time_from_header_backoff_strategy.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/wait_until_time_from_header_backoff_strategy.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategy.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/composite_error_handler.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/default_error_handler.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/error_handler.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/http_response_filter.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/response_action.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/response_status.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/requesters/http_requester.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/requesters/paginators/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/requesters/paginators/default_paginator.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/requesters/paginators/no_pagination.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/requesters/paginators/paginator.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/cursor_pagination_strategy.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/offset_increment.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/page_increment.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/pagination_strategy.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/requesters/request_option.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/requesters/request_options/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_input_provider.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_options_provider.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/requesters/request_options/request_options_provider.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/requesters/request_path.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/requesters/requester.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/retrievers/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/retrievers/retriever.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/retrievers/simple_retriever.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/schema/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/schema/default_schema_loader.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/schema/inline_schema_loader.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/schema/json_file_schema_loader.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/schema/schema_loader.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/spec/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/stream_slicers/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/stream_slicers/cartesian_product_stream_slicer.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/stream_slicers/stream_slicer.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/transformations/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/transformations/add_fields.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/transformations/remove_fields.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/transformations/transformation.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/types.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/yaml_declarative_source.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/deprecated/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/deprecated/base_source.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/deprecated/client.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/singer/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/singer/singer_helpers.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/singer/source.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/source.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/streams/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/streams/availability_strategy.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/streams/core.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/streams/http/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/streams/http/auth/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/streams/http/auth/core.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/streams/http/auth/oauth.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/streams/http/auth/token.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/streams/http/availability_strategy.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/streams/http/exceptions.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/streams/http/http.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/streams/http/rate_limiting.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/streams/http/requests_native_auth/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/streams/http/requests_native_auth/abstract_oauth.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/streams/http/requests_native_auth/abstract_token.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/streams/http/requests_native_auth/oauth.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/streams/http/requests_native_auth/token.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/streams/utils/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/streams/utils/stream_helper.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/utils/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/utils/casing.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/utils/catalog_helpers.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/utils/record_helper.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/utils/schema_helpers.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/utils/schema_models.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/utils/transform.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/utils/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/utils/airbyte_secrets_utils.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/utils/event_timing.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/utils/schema_inferrer.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/utils/traced_exception.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk.egg-info/SOURCES.txt +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk.egg-info/dependency_links.txt +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk.egg-info/requires.txt +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk.egg-info/top_level.txt +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/pyproject.toml +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/setup.cfg +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/source_declarative_manifest/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/source_declarative_manifest/main.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/connector_builder/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/connector_builder/test_connector_builder_handler.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/connector_builder/test_message_grouper.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/connector_builder/utils.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/destinations/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/destinations/test_destination.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/singer/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/singer/test_singer_helpers.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/singer/test_singer_source.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/auth/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/auth/test_oauth.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/auth/test_session_token_auth.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/auth/test_token_auth.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/checks/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/checks/test_check_stream.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/decoders/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/decoders/test_json_decoder.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/external_component.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/extractors/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/extractors/test_dpath_extractor.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/extractors/test_record_filter.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/extractors/test_record_selector.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/incremental/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/incremental/test_datetime_based_cursor.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/interpolation/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/interpolation/test_filters.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/interpolation/test_interpolated_boolean.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/interpolation/test_interpolated_mapping.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/interpolation/test_interpolated_string.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/interpolation/test_jinja.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/interpolation/test_macros.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/parsers/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/parsers/test_manifest_component_transformer.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/parsers/test_manifest_reference_resolver.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/parsers/testing_components.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/partition_routers/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/partition_routers/test_list_partition_router.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/partition_routers/test_single_partition_router.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/partition_routers/test_substream_partition_router.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/requesters/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/requesters/error_handlers/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/test_constant_backoff.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/test_exponential_backoff.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/test_header_helper.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/test_wait_time_from_header.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/test_wait_until_time_from_header.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/requesters/error_handlers/test_composite_error_handler.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/requesters/error_handlers/test_default_error_handler.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/requesters/error_handlers/test_http_response_filter.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/requesters/error_handlers/test_response_status.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/requesters/paginators/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/requesters/paginators/test_cursor_pagination_strategy.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/requesters/paginators/test_default_paginator.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/requesters/paginators/test_no_paginator.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/requesters/paginators/test_offset_increment.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/requesters/paginators/test_page_increment.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/requesters/paginators/test_request_option.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/requesters/request_options/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/requesters/request_options/test_interpolated_request_options_provider.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/requesters/test_http_requester.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/requesters/test_interpolated_request_input_provider.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/retrievers/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/retrievers/test_simple_retriever.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/schema/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/schema/source_test/SourceTest.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/schema/source_test/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/schema/test_default_schema_loader.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/schema/test_inline_schema_loader.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/schema/test_json_file_schema_loader.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/states/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/stream_slicers/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/stream_slicers/test_cartesian_product_stream_slicer.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/test_create_partial.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/test_declarative_stream.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/test_manifest_declarative_source.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/declarative/test_yaml_declarative_source.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/streams/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/streams/http/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/streams/http/auth/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/streams/http/auth/test_auth.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/streams/http/requests_native_auth/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/streams/http/requests_native_auth/test_requests_native_auth.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/streams/http/test_availability_strategy.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/streams/http/test_http.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/streams/test_availability_strategy.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/streams/test_streams_core.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/test_config.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/test_connector_state_manager.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/sources/test_source.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/utils/__init__.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/utils/test_schema_inferrer.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/utils/test_secret_utils.py +0 -0
- {airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/unit_tests/utils/test_traced_exception.py +0 -0
@@ -6,10 +6,18 @@ import json
|
|
6
6
|
import logging
|
7
7
|
from copy import deepcopy
|
8
8
|
from json import JSONDecodeError
|
9
|
-
from typing import Any, Iterable, Iterator, Mapping, Optional, Union
|
9
|
+
from typing import Any, Iterable, Iterator, List, Mapping, Optional, Union
|
10
10
|
from urllib.parse import parse_qs, urlparse
|
11
11
|
|
12
|
-
from airbyte_cdk.connector_builder.models import
|
12
|
+
from airbyte_cdk.connector_builder.models import (
|
13
|
+
HttpRequest,
|
14
|
+
HttpResponse,
|
15
|
+
LogMessage,
|
16
|
+
StreamRead,
|
17
|
+
StreamReadPages,
|
18
|
+
StreamReadSlices,
|
19
|
+
StreamReadSlicesInner,
|
20
|
+
)
|
13
21
|
from airbyte_cdk.sources.declarative.declarative_source import DeclarativeSource
|
14
22
|
from airbyte_cdk.utils import AirbyteTracedException
|
15
23
|
from airbyte_cdk.utils.schema_inferrer import SchemaInferrer
|
@@ -133,7 +141,7 @@ class MessageGrouper:
|
|
133
141
|
yield StreamReadSlices(pages=current_slice_pages)
|
134
142
|
|
135
143
|
@staticmethod
|
136
|
-
def _need_to_close_page(at_least_one_page_in_group, message) -> bool:
|
144
|
+
def _need_to_close_page(at_least_one_page_in_group: bool, message: AirbyteMessage) -> bool:
|
137
145
|
return (
|
138
146
|
at_least_one_page_in_group
|
139
147
|
and message.type == MessageType.LOG
|
@@ -155,7 +163,7 @@ class MessageGrouper:
|
|
155
163
|
)
|
156
164
|
current_page_records.clear()
|
157
165
|
|
158
|
-
def _read_stream(self, source, config, configured_catalog) -> Iterator[AirbyteMessage]:
|
166
|
+
def _read_stream(self, source: DeclarativeSource, config: Mapping[str, Any], configured_catalog: ConfiguredAirbyteCatalog) -> Iterator[AirbyteMessage]:
|
159
167
|
# the generator can raise an exception
|
160
168
|
# iterate over the generated messages. if next raise an exception, catch it and yield it as an AirbyteLogMessage
|
161
169
|
try:
|
@@ -198,7 +206,7 @@ class MessageGrouper:
|
|
198
206
|
self.logger.warning(f"Failed to parse log message into response object with error: {error}")
|
199
207
|
return None
|
200
208
|
|
201
|
-
def _has_reached_limit(self, slices):
|
209
|
+
def _has_reached_limit(self, slices: List[StreamReadSlicesInner]):
|
202
210
|
if len(slices) >= self._max_slices:
|
203
211
|
return True
|
204
212
|
|
@@ -79,13 +79,9 @@ class AbstractSource(Source, ABC):
|
|
79
79
|
"""Implements the Check Connection operation from the Airbyte Specification.
|
80
80
|
See https://docs.airbyte.com/understanding-airbyte/airbyte-protocol/#check.
|
81
81
|
"""
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
return AirbyteConnectionStatus(status=Status.FAILED, message=repr(error))
|
86
|
-
except Exception as e:
|
87
|
-
return AirbyteConnectionStatus(status=Status.FAILED, message=repr(e))
|
88
|
-
|
82
|
+
check_succeeded, error = self.check_connection(logger, config)
|
83
|
+
if not check_succeeded:
|
84
|
+
return AirbyteConnectionStatus(status=Status.FAILED, message=repr(error))
|
89
85
|
return AirbyteConnectionStatus(status=Status.SUCCEEDED)
|
90
86
|
|
91
87
|
def read(
|
@@ -1043,6 +1043,149 @@ definitions:
|
|
1043
1043
|
additionalProperties: true
|
1044
1044
|
documentation_url:
|
1045
1045
|
type: string
|
1046
|
+
advanced_auth:
|
1047
|
+
"$ref": "#/definitions/AuthFlow"
|
1048
|
+
AuthFlow:
|
1049
|
+
title: "Auth flow"
|
1050
|
+
type: object
|
1051
|
+
description: |-
|
1052
|
+
Additional and optional specification object to describe what an 'advanced' Auth flow would need to function.
|
1053
|
+
- A connector should be able to fully function with the configuration as described by the ConnectorSpecification in a 'basic' mode.
|
1054
|
+
- The 'advanced' mode provides easier UX for the user with UI improvements and automations. However, this requires further setup on the
|
1055
|
+
server side by instance or workspace admins beforehand. The trade-off is that the user does not have to provide as many technical
|
1056
|
+
inputs anymore and the auth process is faster and easier to complete.
|
1057
|
+
properties:
|
1058
|
+
auth_flow_type:
|
1059
|
+
title: "Auth flow type"
|
1060
|
+
description: "The type of auth to use"
|
1061
|
+
type: string
|
1062
|
+
enum: ["oauth2.0", "oauth1.0"] # Future auth types should be added here
|
1063
|
+
predicate_key:
|
1064
|
+
title: "Predicate key"
|
1065
|
+
description: Json Path to a field in the connectorSpecification that should exist for the advanced auth to be applicable.
|
1066
|
+
type: array
|
1067
|
+
items:
|
1068
|
+
type: string
|
1069
|
+
examples:
|
1070
|
+
- ["credentials", "auth_type"]
|
1071
|
+
predicate_value:
|
1072
|
+
title: "Predicate value"
|
1073
|
+
description: Value of the predicate_key fields for the advanced auth to be applicable.
|
1074
|
+
type: string
|
1075
|
+
examples:
|
1076
|
+
- "Oauth"
|
1077
|
+
oauth_config_specification:
|
1078
|
+
"$ref": "#/definitions/OAuthConfigSpecification"
|
1079
|
+
OAuthConfigSpecification:
|
1080
|
+
type: object
|
1081
|
+
additionalProperties: true
|
1082
|
+
properties:
|
1083
|
+
oauth_user_input_from_connector_config_specification:
|
1084
|
+
title: "OAuth user input"
|
1085
|
+
description: |-
|
1086
|
+
OAuth specific blob. This is a Json Schema used to validate Json configurations used as input to OAuth.
|
1087
|
+
Must be a valid non-nested JSON that refers to properties from ConnectorSpecification.connectionSpecification
|
1088
|
+
using special annotation 'path_in_connector_config'.
|
1089
|
+
These are input values the user is entering through the UI to authenticate to the connector, that might also shared
|
1090
|
+
as inputs for syncing data via the connector.
|
1091
|
+
Examples:
|
1092
|
+
if no connector values is shared during oauth flow, oauth_user_input_from_connector_config_specification=[]
|
1093
|
+
if connector values such as 'app_id' inside the top level are used to generate the API url for the oauth flow,
|
1094
|
+
oauth_user_input_from_connector_config_specification={
|
1095
|
+
app_id: {
|
1096
|
+
type: string
|
1097
|
+
path_in_connector_config: ['app_id']
|
1098
|
+
}
|
1099
|
+
}
|
1100
|
+
if connector values such as 'info.app_id' nested inside another object are used to generate the API url for the oauth flow,
|
1101
|
+
oauth_user_input_from_connector_config_specification={
|
1102
|
+
app_id: {
|
1103
|
+
type: string
|
1104
|
+
path_in_connector_config: ['info', 'app_id']
|
1105
|
+
}
|
1106
|
+
}
|
1107
|
+
type: object
|
1108
|
+
examples:
|
1109
|
+
- app_id:
|
1110
|
+
type: string
|
1111
|
+
path_in_connector_config: ["app_id"]
|
1112
|
+
- app_id:
|
1113
|
+
type: string
|
1114
|
+
path_in_connector_config: ["info", "app_id"]
|
1115
|
+
complete_oauth_output_specification:
|
1116
|
+
title: "OAuth output specification"
|
1117
|
+
description: |-
|
1118
|
+
OAuth specific blob. This is a Json Schema used to validate Json configurations produced by the OAuth flows as they are
|
1119
|
+
returned by the distant OAuth APIs.
|
1120
|
+
Must be a valid JSON describing the fields to merge back to `ConnectorSpecification.connectionSpecification`.
|
1121
|
+
For each field, a special annotation `path_in_connector_config` can be specified to determine where to merge it,
|
1122
|
+
Examples:
|
1123
|
+
complete_oauth_output_specification={
|
1124
|
+
refresh_token: {
|
1125
|
+
type: string,
|
1126
|
+
path_in_connector_config: ['credentials', 'refresh_token']
|
1127
|
+
}
|
1128
|
+
}
|
1129
|
+
type: object
|
1130
|
+
additionalProperties: true
|
1131
|
+
examples:
|
1132
|
+
- refresh_token:
|
1133
|
+
type: string,
|
1134
|
+
path_in_connector_config: ["credentials", "refresh_token"]
|
1135
|
+
complete_oauth_server_input_specification:
|
1136
|
+
title: "OAuth input specification"
|
1137
|
+
description: |-
|
1138
|
+
OAuth specific blob. This is a Json Schema used to validate Json configurations persisted as Airbyte Server configurations.
|
1139
|
+
Must be a valid non-nested JSON describing additional fields configured by the Airbyte Instance or Workspace Admins to be used by the
|
1140
|
+
server when completing an OAuth flow (typically exchanging an auth code for refresh token).
|
1141
|
+
Examples:
|
1142
|
+
complete_oauth_server_input_specification={
|
1143
|
+
client_id: {
|
1144
|
+
type: string
|
1145
|
+
},
|
1146
|
+
client_secret: {
|
1147
|
+
type: string
|
1148
|
+
}
|
1149
|
+
}
|
1150
|
+
type: object
|
1151
|
+
additionalProperties: true
|
1152
|
+
examples:
|
1153
|
+
- client_id:
|
1154
|
+
type: string
|
1155
|
+
client_secret:
|
1156
|
+
type: string
|
1157
|
+
complete_oauth_server_output_specification:
|
1158
|
+
title: "OAuth server output specification"
|
1159
|
+
description: |-
|
1160
|
+
OAuth specific blob. This is a Json Schema used to validate Json configurations persisted as Airbyte Server configurations that
|
1161
|
+
also need to be merged back into the connector configuration at runtime.
|
1162
|
+
This is a subset configuration of `complete_oauth_server_input_specification` that filters fields out to retain only the ones that
|
1163
|
+
are necessary for the connector to function with OAuth. (some fields could be used during oauth flows but not needed afterwards, therefore
|
1164
|
+
they would be listed in the `complete_oauth_server_input_specification` but not `complete_oauth_server_output_specification`)
|
1165
|
+
Must be a valid non-nested JSON describing additional fields configured by the Airbyte Instance or Workspace Admins to be used by the
|
1166
|
+
connector when using OAuth flow APIs.
|
1167
|
+
These fields are to be merged back to `ConnectorSpecification.connectionSpecification`.
|
1168
|
+
For each field, a special annotation `path_in_connector_config` can be specified to determine where to merge it,
|
1169
|
+
Examples:
|
1170
|
+
complete_oauth_server_output_specification={
|
1171
|
+
client_id: {
|
1172
|
+
type: string,
|
1173
|
+
path_in_connector_config: ['credentials', 'client_id']
|
1174
|
+
},
|
1175
|
+
client_secret: {
|
1176
|
+
type: string,
|
1177
|
+
path_in_connector_config: ['credentials', 'client_secret']
|
1178
|
+
}
|
1179
|
+
}
|
1180
|
+
type: object
|
1181
|
+
additionalProperties: true
|
1182
|
+
examples:
|
1183
|
+
- client_id:
|
1184
|
+
type: string,
|
1185
|
+
path_in_connector_config: ["credentials", "client_id"]
|
1186
|
+
client_secret:
|
1187
|
+
type: string,
|
1188
|
+
path_in_connector_config: ["credentials", "client_secret"]
|
1046
1189
|
SubstreamPartitionRouter:
|
1047
1190
|
description: Partition router that is used to retrieve records that have been partitioned according to records from the specified parent streams
|
1048
1191
|
type: object
|
@@ -309,10 +309,65 @@ class SessionTokenAuthenticator(BaseModel):
|
|
309
309
|
parameters: Optional[Dict[str, Any]] = Field(None, alias="$parameters")
|
310
310
|
|
311
311
|
|
312
|
-
class
|
313
|
-
|
314
|
-
|
315
|
-
|
312
|
+
class AuthFlowType(Enum):
|
313
|
+
oauth2_0 = "oauth2.0"
|
314
|
+
oauth1_0 = "oauth1.0"
|
315
|
+
|
316
|
+
|
317
|
+
class OAuthConfigSpecification(BaseModel):
|
318
|
+
class Config:
|
319
|
+
extra = Extra.allow
|
320
|
+
|
321
|
+
oauth_user_input_from_connector_config_specification: Optional[Dict[str, Any]] = Field(
|
322
|
+
None,
|
323
|
+
description="OAuth specific blob. This is a Json Schema used to validate Json configurations used as input to OAuth.\nMust be a valid non-nested JSON that refers to properties from ConnectorSpecification.connectionSpecification\nusing special annotation 'path_in_connector_config'.\nThese are input values the user is entering through the UI to authenticate to the connector, that might also shared\nas inputs for syncing data via the connector.\nExamples:\nif no connector values is shared during oauth flow, oauth_user_input_from_connector_config_specification=[]\nif connector values such as 'app_id' inside the top level are used to generate the API url for the oauth flow,\n oauth_user_input_from_connector_config_specification={\n app_id: {\n type: string\n path_in_connector_config: ['app_id']\n }\n }\nif connector values such as 'info.app_id' nested inside another object are used to generate the API url for the oauth flow,\n oauth_user_input_from_connector_config_specification={\n app_id: {\n type: string\n path_in_connector_config: ['info', 'app_id']\n }\n }",
|
324
|
+
examples=[
|
325
|
+
{"app_id": {"type": "string", "path_in_connector_config": ["app_id"]}},
|
326
|
+
{
|
327
|
+
"app_id": {
|
328
|
+
"type": "string",
|
329
|
+
"path_in_connector_config": ["info", "app_id"],
|
330
|
+
}
|
331
|
+
},
|
332
|
+
],
|
333
|
+
title="OAuth user input",
|
334
|
+
)
|
335
|
+
complete_oauth_output_specification: Optional[Dict[str, Any]] = Field(
|
336
|
+
None,
|
337
|
+
description="OAuth specific blob. This is a Json Schema used to validate Json configurations produced by the OAuth flows as they are\nreturned by the distant OAuth APIs.\nMust be a valid JSON describing the fields to merge back to `ConnectorSpecification.connectionSpecification`.\nFor each field, a special annotation `path_in_connector_config` can be specified to determine where to merge it,\nExamples:\n complete_oauth_output_specification={\n refresh_token: {\n type: string,\n path_in_connector_config: ['credentials', 'refresh_token']\n }\n }",
|
338
|
+
examples=[
|
339
|
+
{
|
340
|
+
"refresh_token": {
|
341
|
+
"type": "string,",
|
342
|
+
"path_in_connector_config": ["credentials", "refresh_token"],
|
343
|
+
}
|
344
|
+
}
|
345
|
+
],
|
346
|
+
title="OAuth output specification",
|
347
|
+
)
|
348
|
+
complete_oauth_server_input_specification: Optional[Dict[str, Any]] = Field(
|
349
|
+
None,
|
350
|
+
description="OAuth specific blob. This is a Json Schema used to validate Json configurations persisted as Airbyte Server configurations.\nMust be a valid non-nested JSON describing additional fields configured by the Airbyte Instance or Workspace Admins to be used by the\nserver when completing an OAuth flow (typically exchanging an auth code for refresh token).\nExamples:\n complete_oauth_server_input_specification={\n client_id: {\n type: string\n },\n client_secret: {\n type: string\n }\n }",
|
351
|
+
examples=[{"client_id": {"type": "string"}, "client_secret": {"type": "string"}}],
|
352
|
+
title="OAuth input specification",
|
353
|
+
)
|
354
|
+
complete_oauth_server_output_specification: Optional[Dict[str, Any]] = Field(
|
355
|
+
None,
|
356
|
+
description="OAuth specific blob. This is a Json Schema used to validate Json configurations persisted as Airbyte Server configurations that\nalso need to be merged back into the connector configuration at runtime.\nThis is a subset configuration of `complete_oauth_server_input_specification` that filters fields out to retain only the ones that\nare necessary for the connector to function with OAuth. (some fields could be used during oauth flows but not needed afterwards, therefore\nthey would be listed in the `complete_oauth_server_input_specification` but not `complete_oauth_server_output_specification`)\nMust be a valid non-nested JSON describing additional fields configured by the Airbyte Instance or Workspace Admins to be used by the\nconnector when using OAuth flow APIs.\nThese fields are to be merged back to `ConnectorSpecification.connectionSpecification`.\nFor each field, a special annotation `path_in_connector_config` can be specified to determine where to merge it,\nExamples:\n complete_oauth_server_output_specification={\n client_id: {\n type: string,\n path_in_connector_config: ['credentials', 'client_id']\n },\n client_secret: {\n type: string,\n path_in_connector_config: ['credentials', 'client_secret']\n }\n }",
|
357
|
+
examples=[
|
358
|
+
{
|
359
|
+
"client_id": {
|
360
|
+
"type": "string,",
|
361
|
+
"path_in_connector_config": ["credentials", "client_id"],
|
362
|
+
},
|
363
|
+
"client_secret": {
|
364
|
+
"type": "string,",
|
365
|
+
"path_in_connector_config": ["credentials", "client_secret"],
|
366
|
+
},
|
367
|
+
}
|
368
|
+
],
|
369
|
+
title="OAuth server output specification",
|
370
|
+
)
|
316
371
|
|
317
372
|
|
318
373
|
class WaitTimeFromHeader(BaseModel):
|
@@ -419,6 +474,23 @@ class RecordSelector(BaseModel):
|
|
419
474
|
parameters: Optional[Dict[str, Any]] = Field(None, alias="$parameters")
|
420
475
|
|
421
476
|
|
477
|
+
class AuthFlow(BaseModel):
|
478
|
+
auth_flow_type: Optional[AuthFlowType] = Field(None, description="The type of auth to use", title="Auth flow type")
|
479
|
+
predicate_key: Optional[List[str]] = Field(
|
480
|
+
None,
|
481
|
+
description="Json Path to a field in the connectorSpecification that should exist for the advanced auth to be applicable.",
|
482
|
+
examples=[["credentials", "auth_type"]],
|
483
|
+
title="Predicate key",
|
484
|
+
)
|
485
|
+
predicate_value: Optional[str] = Field(
|
486
|
+
None,
|
487
|
+
description="Value of the predicate_key fields for the advanced auth to be applicable.",
|
488
|
+
examples=["Oauth"],
|
489
|
+
title="Predicate value",
|
490
|
+
)
|
491
|
+
oauth_config_specification: Optional[OAuthConfigSpecification] = None
|
492
|
+
|
493
|
+
|
422
494
|
class CompositeErrorHandler(BaseModel):
|
423
495
|
type: Literal["CompositeErrorHandler"]
|
424
496
|
error_handlers: List[Union[CompositeErrorHandler, DefaultErrorHandler]]
|
@@ -469,6 +541,13 @@ class HttpRequester(BaseModel):
|
|
469
541
|
parameters: Optional[Dict[str, Any]] = Field(None, alias="$parameters")
|
470
542
|
|
471
543
|
|
544
|
+
class Spec(BaseModel):
|
545
|
+
type: Literal["Spec"]
|
546
|
+
connection_specification: Dict[str, Any]
|
547
|
+
documentation_url: Optional[str] = None
|
548
|
+
advanced_auth: Optional[AuthFlow] = None
|
549
|
+
|
550
|
+
|
472
551
|
class DeclarativeSource(BaseModel):
|
473
552
|
class Config:
|
474
553
|
extra = Extra.forbid
|
@@ -759,7 +759,12 @@ class ModelToComponentFactory:
|
|
759
759
|
|
760
760
|
@staticmethod
|
761
761
|
def create_spec(model: SpecModel, config: Config, **kwargs) -> Spec:
|
762
|
-
return Spec(
|
762
|
+
return Spec(
|
763
|
+
connection_specification=model.connection_specification,
|
764
|
+
documentation_url=model.documentation_url,
|
765
|
+
advanced_auth=model.advanced_auth,
|
766
|
+
parameters={},
|
767
|
+
)
|
763
768
|
|
764
769
|
def create_substream_partition_router(self, model: SubstreamPartitionRouterModel, config: Config, **kwargs) -> SubstreamPartitionRouter:
|
765
770
|
parent_stream_configs = []
|
@@ -6,6 +6,7 @@ from dataclasses import InitVar, dataclass
|
|
6
6
|
from typing import Any, Mapping, Optional
|
7
7
|
|
8
8
|
from airbyte_cdk.models.airbyte_protocol import ConnectorSpecification
|
9
|
+
from airbyte_cdk.sources.declarative.models.declarative_component_schema import AuthFlow
|
9
10
|
|
10
11
|
|
11
12
|
@dataclass
|
@@ -21,6 +22,7 @@ class Spec:
|
|
21
22
|
connection_specification: Mapping[str, Any]
|
22
23
|
parameters: InitVar[Mapping[str, Any]]
|
23
24
|
documentation_url: Optional[str] = None
|
25
|
+
advanced_auth: Optional[AuthFlow] = None
|
24
26
|
|
25
27
|
def generate_spec(self) -> ConnectorSpecification:
|
26
28
|
"""
|
@@ -31,6 +33,9 @@ class Spec:
|
|
31
33
|
|
32
34
|
if self.documentation_url:
|
33
35
|
obj["documentationUrl"] = self.documentation_url
|
36
|
+
if self.advanced_auth:
|
37
|
+
obj["advanced_auth"] = self.advanced_auth
|
38
|
+
obj["advanced_auth"].auth_flow_type = obj["advanced_auth"].auth_flow_type.value # Get enum value
|
34
39
|
|
35
40
|
# We remap these keys to camel case because that's the existing format expected by the rest of the platform
|
36
41
|
return ConnectorSpecification.parse_obj(obj)
|
@@ -17,7 +17,7 @@ setup(
|
|
17
17
|
name="airbyte-cdk",
|
18
18
|
# The version of the airbyte-cdk package is used at runtime to validate manifests. That validation must be
|
19
19
|
# updated if our semver format changes such as using release candidate versions.
|
20
|
-
version="0.
|
20
|
+
version="0.33.0",
|
21
21
|
description="A framework for writing Airbyte Connectors.",
|
22
22
|
long_description=README,
|
23
23
|
long_description_content_type="text/markdown",
|
@@ -172,6 +172,8 @@ spec:
|
|
172
172
|
title: API Key
|
173
173
|
description: Test API Key
|
174
174
|
order: 0
|
175
|
+
advanced_auth:
|
176
|
+
auth_flow_type: "oauth2.0"
|
175
177
|
"""
|
176
178
|
parsed_manifest = YamlDeclarativeSource._parse(content)
|
177
179
|
resolved_manifest = resolver.preprocess_manifest(parsed_manifest)
|
@@ -257,6 +259,8 @@ spec:
|
|
257
259
|
"description": "Test API Key",
|
258
260
|
"order": 0,
|
259
261
|
}
|
262
|
+
advanced_auth = spec.advanced_auth
|
263
|
+
assert advanced_auth.auth_flow_type.value == "oauth2.0"
|
260
264
|
|
261
265
|
|
262
266
|
def test_interpolate_config():
|
@@ -104,10 +104,11 @@ def test_failed_check():
|
|
104
104
|
assert expected == MockSource(check_lambda=lambda: (False, "womp womp")).check(logger, {})
|
105
105
|
|
106
106
|
|
107
|
-
def test_raising_check():
|
107
|
+
def test_raising_check(mocker):
|
108
108
|
"""Tests that if a source raises an unexpected exception the appropriate connectionStatus failure message is returned."""
|
109
|
-
|
110
|
-
|
109
|
+
check_lambda = mocker.Mock(side_effect=BaseException("this should fail"))
|
110
|
+
with pytest.raises(BaseException):
|
111
|
+
MockSource(check_lambda=check_lambda).check(logger, {})
|
111
112
|
|
112
113
|
|
113
114
|
class MockStream(Stream):
|
@@ -334,10 +335,7 @@ def test_valid_full_refresh_read_with_slices(mocker):
|
|
334
335
|
|
335
336
|
@pytest.mark.parametrize(
|
336
337
|
"slices",
|
337
|
-
[
|
338
|
-
[{"1": "1"}, {"2": "2"}],
|
339
|
-
[{"date": datetime.date(year=2023, month=1, day=1)}, {"date": datetime.date(year=2023, month=1, day=1)}]
|
340
|
-
]
|
338
|
+
[[{"1": "1"}, {"2": "2"}], [{"date": datetime.date(year=2023, month=1, day=1)}, {"date": datetime.date(year=2023, month=1, day=1)}]],
|
341
339
|
)
|
342
340
|
def test_read_full_refresh_with_slices_sends_slice_messages(mocker, slices):
|
343
341
|
"""Given the logger is debug and a full refresh, AirbyteMessages are sent for slices"""
|
@@ -369,7 +367,7 @@ def test_read_incremental_with_slices_sends_slice_messages(mocker):
|
|
369
367
|
debug_logger.setLevel(logging.DEBUG)
|
370
368
|
slices = [{"1": "1"}, {"2": "2"}]
|
371
369
|
stream = MockStream(
|
372
|
-
[({"sync_mode": SyncMode.incremental, "stream_slice": s,
|
370
|
+
[({"sync_mode": SyncMode.incremental, "stream_slice": s, "stream_state": {}}, [s]) for s in slices],
|
373
371
|
name="s1",
|
374
372
|
)
|
375
373
|
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/connector_builder/connector_builder_handler.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/checks/__init__.py
RENAMED
File without changes
|
{airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/checks/check_stream.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/datetime/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/declarative_source.py
RENAMED
File without changes
|
{airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/declarative_stream.py
RENAMED
File without changes
|
{airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/decoders/__init__.py
RENAMED
File without changes
|
{airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/decoders/decoder.py
RENAMED
File without changes
|
{airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/decoders/json_decoder.py
RENAMED
File without changes
|
File without changes
|
{airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/extractors/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/incremental/__init__.py
RENAMED
File without changes
|
File without changes
|
{airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/interpolation/__init__.py
RENAMED
File without changes
|
{airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/interpolation/filters.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/interpolation/jinja.py
RENAMED
File without changes
|
{airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/interpolation/macros.py
RENAMED
File without changes
|
File without changes
|
{airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/models/__init__.py
RENAMED
File without changes
|
{airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/parsers/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{airbyte-cdk-0.31.1 → airbyte-cdk-0.33.0}/airbyte_cdk/sources/declarative/requesters/__init__.py
RENAMED
File without changes
|
File without changes
|