airbyte-cdk 6.7.0rc3__py3-none-any.whl → 6.7.1.dev0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. airbyte_cdk/cli/source_declarative_manifest/_run.py +2 -1
  2. airbyte_cdk/config_observation.py +2 -1
  3. airbyte_cdk/connector.py +1 -0
  4. airbyte_cdk/connector_builder/connector_builder_handler.py +1 -1
  5. airbyte_cdk/connector_builder/main.py +2 -1
  6. airbyte_cdk/destinations/destination.py +2 -1
  7. airbyte_cdk/destinations/vector_db_based/config.py +2 -1
  8. airbyte_cdk/destinations/vector_db_based/document_processor.py +4 -3
  9. airbyte_cdk/destinations/vector_db_based/embedder.py +5 -4
  10. airbyte_cdk/entrypoint.py +3 -2
  11. airbyte_cdk/logger.py +2 -1
  12. airbyte_cdk/models/__init__.py +2 -0
  13. airbyte_cdk/models/airbyte_protocol.py +2 -1
  14. airbyte_cdk/sources/concurrent_source/concurrent_read_processor.py +3 -3
  15. airbyte_cdk/sources/concurrent_source/concurrent_source.py +1 -1
  16. airbyte_cdk/sources/config.py +2 -1
  17. airbyte_cdk/sources/declarative/auth/jwt.py +1 -0
  18. airbyte_cdk/sources/declarative/auth/oauth.py +1 -0
  19. airbyte_cdk/sources/declarative/auth/selective_authenticator.py +1 -0
  20. airbyte_cdk/sources/declarative/auth/token.py +2 -1
  21. airbyte_cdk/sources/declarative/auth/token_provider.py +3 -2
  22. airbyte_cdk/sources/declarative/concurrent_declarative_source.py +78 -52
  23. airbyte_cdk/sources/declarative/declarative_component_schema.yaml +167 -0
  24. airbyte_cdk/sources/declarative/decoders/json_decoder.py +3 -2
  25. airbyte_cdk/sources/declarative/decoders/noop_decoder.py +1 -0
  26. airbyte_cdk/sources/declarative/decoders/pagination_decoder_decorator.py +1 -0
  27. airbyte_cdk/sources/declarative/decoders/xml_decoder.py +1 -0
  28. airbyte_cdk/sources/declarative/extractors/dpath_extractor.py +1 -0
  29. airbyte_cdk/sources/declarative/extractors/http_selector.py +1 -0
  30. airbyte_cdk/sources/declarative/extractors/record_filter.py +6 -48
  31. airbyte_cdk/sources/declarative/extractors/record_selector.py +32 -4
  32. airbyte_cdk/sources/declarative/extractors/response_to_file_extractor.py +2 -1
  33. airbyte_cdk/sources/declarative/incremental/datetime_based_cursor.py +2 -1
  34. airbyte_cdk/sources/declarative/incremental/global_substream_cursor.py +5 -2
  35. airbyte_cdk/sources/declarative/incremental/per_partition_cursor.py +5 -2
  36. airbyte_cdk/sources/declarative/incremental/per_partition_with_global.py +1 -3
  37. airbyte_cdk/sources/declarative/interpolation/jinja.py +5 -4
  38. airbyte_cdk/sources/declarative/manifest_declarative_source.py +4 -3
  39. airbyte_cdk/sources/declarative/migrations/legacy_to_per_partition_state_migration.py +1 -1
  40. airbyte_cdk/sources/declarative/models/declarative_component_schema.py +122 -0
  41. airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py +30 -17
  42. airbyte_cdk/sources/declarative/partition_routers/substream_partition_router.py +1 -0
  43. airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/constant_backoff_strategy.py +1 -0
  44. airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/exponential_backoff_strategy.py +1 -0
  45. airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/wait_time_from_header_backoff_strategy.py +1 -0
  46. airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/wait_until_time_from_header_backoff_strategy.py +1 -0
  47. airbyte_cdk/sources/declarative/requesters/error_handlers/composite_error_handler.py +1 -0
  48. airbyte_cdk/sources/declarative/requesters/error_handlers/default_error_handler.py +1 -0
  49. airbyte_cdk/sources/declarative/requesters/error_handlers/default_http_response_filter.py +1 -0
  50. airbyte_cdk/sources/declarative/requesters/error_handlers/http_response_filter.py +1 -0
  51. airbyte_cdk/sources/declarative/requesters/http_job_repository.py +2 -1
  52. airbyte_cdk/sources/declarative/requesters/http_requester.py +1 -0
  53. airbyte_cdk/sources/declarative/requesters/paginators/default_paginator.py +1 -0
  54. airbyte_cdk/sources/declarative/requesters/paginators/no_pagination.py +1 -0
  55. airbyte_cdk/sources/declarative/requesters/paginators/paginator.py +1 -0
  56. airbyte_cdk/sources/declarative/requesters/paginators/strategies/cursor_pagination_strategy.py +1 -0
  57. airbyte_cdk/sources/declarative/requesters/paginators/strategies/offset_increment.py +1 -0
  58. airbyte_cdk/sources/declarative/requesters/paginators/strategies/page_increment.py +1 -0
  59. airbyte_cdk/sources/declarative/requesters/paginators/strategies/pagination_strategy.py +1 -0
  60. airbyte_cdk/sources/declarative/requesters/paginators/strategies/stop_condition.py +9 -3
  61. airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_options_provider.py +2 -1
  62. airbyte_cdk/sources/declarative/requesters/requester.py +1 -0
  63. airbyte_cdk/sources/declarative/retrievers/async_retriever.py +2 -1
  64. airbyte_cdk/sources/declarative/retrievers/simple_retriever.py +12 -4
  65. airbyte_cdk/sources/declarative/stream_slicers/declarative_partition_generator.py +7 -4
  66. airbyte_cdk/sources/declarative/transformations/add_fields.py +1 -0
  67. airbyte_cdk/sources/declarative/transformations/remove_fields.py +1 -0
  68. airbyte_cdk/sources/declarative/yaml_declarative_source.py +1 -0
  69. airbyte_cdk/sources/embedded/tools.py +1 -0
  70. airbyte_cdk/sources/file_based/config/abstract_file_based_spec.py +2 -1
  71. airbyte_cdk/sources/file_based/config/avro_format.py +2 -1
  72. airbyte_cdk/sources/file_based/config/csv_format.py +2 -1
  73. airbyte_cdk/sources/file_based/config/excel_format.py +2 -1
  74. airbyte_cdk/sources/file_based/config/file_based_stream_config.py +2 -1
  75. airbyte_cdk/sources/file_based/config/jsonl_format.py +2 -1
  76. airbyte_cdk/sources/file_based/config/parquet_format.py +2 -1
  77. airbyte_cdk/sources/file_based/config/unstructured_format.py +2 -1
  78. airbyte_cdk/sources/file_based/file_based_source.py +2 -1
  79. airbyte_cdk/sources/file_based/file_based_stream_reader.py +2 -1
  80. airbyte_cdk/sources/file_based/file_types/avro_parser.py +1 -0
  81. airbyte_cdk/sources/file_based/file_types/csv_parser.py +2 -1
  82. airbyte_cdk/sources/file_based/file_types/excel_parser.py +5 -5
  83. airbyte_cdk/sources/file_based/file_types/jsonl_parser.py +2 -1
  84. airbyte_cdk/sources/file_based/file_types/parquet_parser.py +2 -1
  85. airbyte_cdk/sources/file_based/file_types/unstructured_parser.py +9 -8
  86. airbyte_cdk/sources/file_based/stream/abstract_file_based_stream.py +2 -1
  87. airbyte_cdk/sources/file_based/stream/concurrent/adapters.py +5 -4
  88. airbyte_cdk/sources/file_based/stream/concurrent/cursor/abstract_concurrent_file_based_cursor.py +1 -1
  89. airbyte_cdk/sources/file_based/stream/concurrent/cursor/file_based_concurrent_cursor.py +1 -1
  90. airbyte_cdk/sources/file_based/stream/concurrent/cursor/file_based_final_state_cursor.py +1 -1
  91. airbyte_cdk/sources/http_logger.py +1 -0
  92. airbyte_cdk/sources/streams/call_rate.py +1 -2
  93. airbyte_cdk/sources/streams/concurrent/abstract_stream.py +2 -1
  94. airbyte_cdk/sources/streams/concurrent/adapters.py +8 -4
  95. airbyte_cdk/sources/streams/concurrent/availability_strategy.py +2 -1
  96. airbyte_cdk/sources/streams/concurrent/cursor.py +30 -6
  97. airbyte_cdk/sources/streams/concurrent/default_stream.py +1 -0
  98. airbyte_cdk/sources/streams/concurrent/partitions/partition.py +1 -1
  99. airbyte_cdk/sources/streams/concurrent/partitions/types.py +1 -1
  100. airbyte_cdk/sources/streams/concurrent/state_converters/datetime_stream_state_converter.py +1 -1
  101. airbyte_cdk/sources/streams/core.py +2 -1
  102. airbyte_cdk/sources/streams/http/error_handlers/default_error_mapping.py +2 -1
  103. airbyte_cdk/sources/streams/http/error_handlers/http_status_error_handler.py +1 -0
  104. airbyte_cdk/sources/streams/http/error_handlers/json_error_message_parser.py +1 -0
  105. airbyte_cdk/sources/streams/http/error_handlers/response_models.py +2 -1
  106. airbyte_cdk/sources/streams/http/http.py +3 -2
  107. airbyte_cdk/sources/streams/http/http_client.py +49 -2
  108. airbyte_cdk/sources/streams/http/requests_native_auth/abstract_oauth.py +2 -1
  109. airbyte_cdk/sources/streams/http/requests_native_auth/oauth.py +1 -0
  110. airbyte_cdk/sources/types.py +14 -1
  111. airbyte_cdk/sources/utils/schema_helpers.py +3 -2
  112. airbyte_cdk/sql/secrets.py +2 -1
  113. airbyte_cdk/sql/shared/sql_processor.py +8 -6
  114. airbyte_cdk/test/entrypoint_wrapper.py +4 -3
  115. airbyte_cdk/test/mock_http/mocker.py +1 -0
  116. airbyte_cdk/utils/schema_inferrer.py +2 -1
  117. airbyte_cdk/utils/slice_hasher.py +1 -1
  118. airbyte_cdk/utils/traced_exception.py +2 -1
  119. {airbyte_cdk-6.7.0rc3.dist-info → airbyte_cdk-6.7.1.dev0.dist-info}/METADATA +9 -2
  120. {airbyte_cdk-6.7.0rc3.dist-info → airbyte_cdk-6.7.1.dev0.dist-info}/RECORD +123 -124
  121. airbyte_cdk/sources/streams/concurrent/partitions/record.py +0 -35
  122. {airbyte_cdk-6.7.0rc3.dist-info → airbyte_cdk-6.7.1.dev0.dist-info}/LICENSE.txt +0 -0
  123. {airbyte_cdk-6.7.0rc3.dist-info → airbyte_cdk-6.7.1.dev0.dist-info}/WHEEL +0 -0
  124. {airbyte_cdk-6.7.0rc3.dist-info → airbyte_cdk-6.7.1.dev0.dist-info}/entry_points.txt +0 -0
@@ -748,6 +748,123 @@ class NoPagination(BaseModel):
748
748
  type: Literal["NoPagination"]
749
749
 
750
750
 
751
+ class State(BaseModel):
752
+ class Config:
753
+ extra = Extra.allow
754
+
755
+ min: int
756
+ max: int
757
+
758
+
759
+ class OauthConnectorInputSpecification(BaseModel):
760
+ class Config:
761
+ extra = Extra.allow
762
+
763
+ consent_url: str = Field(
764
+ ...,
765
+ description="The DeclarativeOAuth Specific string URL string template to initiate the authentication.\nThe placeholders are replaced during the processing to provide neccessary values.",
766
+ examples=[
767
+ {
768
+ "consent_url": "https://domain.host.com/marketing_api/auth?{client_id_key}={{client_id_key}}&{redirect_uri_key}={urlEncoder:{{redirect_uri_key}}}&{state_key}={{state_key}}"
769
+ },
770
+ {
771
+ "consent_url": "https://endpoint.host.com/oauth2/authorize?{client_id_key}={{client_id_key}}&{redirect_uri_key}={urlEncoder:{{redirect_uri_key}}}&{scope_key}={urlEncoder:{{scope_key}}}&{state_key}={{state_key}}&subdomain={subdomain}"
772
+ },
773
+ ],
774
+ title="DeclarativeOAuth Consent URL",
775
+ )
776
+ scope: Optional[str] = Field(
777
+ None,
778
+ description="The DeclarativeOAuth Specific string of the scopes needed to be grant for authenticated user.",
779
+ examples=[{"scope": "user:read user:read_orders workspaces:read"}],
780
+ title="(Optional) DeclarativeOAuth Scope",
781
+ )
782
+ access_token_url: str = Field(
783
+ ...,
784
+ description="The DeclarativeOAuth Specific URL templated string to obtain the `access_token`, `refresh_token` etc.\nThe placeholders are replaced during the processing to provide neccessary values.",
785
+ examples=[
786
+ {
787
+ "access_token_url": "https://auth.host.com/oauth2/token?{client_id_key}={{client_id_key}}&{client_secret_key}={{client_secret_key}}&{auth_code_key}={{auth_code_key}}&{redirect_uri_key}={urlEncoder:{{redirect_uri_key}}}"
788
+ }
789
+ ],
790
+ title="DeclarativeOAuth Access Token URL",
791
+ )
792
+ access_token_headers: Optional[Dict[str, Any]] = Field(
793
+ None,
794
+ description="The DeclarativeOAuth Specific optional headers to inject while exchanging the `auth_code` to `access_token` during `completeOAuthFlow` step.",
795
+ examples=[
796
+ {
797
+ "access_token_headers": {
798
+ "Authorization": "Basic {base64Encoder:{client_id}:{client_secret}}"
799
+ }
800
+ }
801
+ ],
802
+ title="(Optional) DeclarativeOAuth Access Token Headers",
803
+ )
804
+ access_token_params: Optional[Dict[str, Any]] = Field(
805
+ None,
806
+ description="The DeclarativeOAuth Specific optional query parameters to inject while exchanging the `auth_code` to `access_token` during `completeOAuthFlow` step.\nWhen this property is provided, the query params will be encoded as `Json` and included in the outgoing API request.",
807
+ examples=[
808
+ {
809
+ "access_token_params": {
810
+ "{auth_code_key}": "{{auth_code_key}}",
811
+ "{client_id_key}": "{{client_id_key}}",
812
+ "{client_secret_key}": "{{client_secret_key}}",
813
+ }
814
+ }
815
+ ],
816
+ title="(Optional) DeclarativeOAuth Access Token Query Params (Json Encoded)",
817
+ )
818
+ extract_output: List[str] = Field(
819
+ ...,
820
+ description="The DeclarativeOAuth Specific list of strings to indicate which keys should be extracted and returned back to the input config. ",
821
+ examples=[{"extract_output": ["access_token", "refresh_token", "other_field"]}],
822
+ title="DeclarativeOAuth Extract Output",
823
+ )
824
+ state: Optional[State] = Field(
825
+ None,
826
+ description="The DeclarativeOAuth Specific object to provide the criteria of how the `state` query param should be constructed,\nincluding length and complexity. ",
827
+ examples=[{"state": {"min": 7, "max": 128}}],
828
+ title="(Optional) DeclarativeOAuth Configurable State Query Param",
829
+ )
830
+ client_id_key: Optional[str] = Field(
831
+ None,
832
+ description="The DeclarativeOAuth Specific optional override to provide the custom `client_id` key name, if required by data-provider.",
833
+ examples=[{"client_id_key": "my_custom_client_id_key_name"}],
834
+ title="(Optional) DeclarativeOAuth Client ID Key Override",
835
+ )
836
+ client_secret_key: Optional[str] = Field(
837
+ None,
838
+ description="The DeclarativeOAuth Specific optional override to provide the custom `client_secret` key name, if required by data-provider.",
839
+ examples=[{"client_secret_key": "my_custom_client_secret_key_name"}],
840
+ title="(Optional) DeclarativeOAuth Client Secret Key Override",
841
+ )
842
+ scope_key: Optional[str] = Field(
843
+ None,
844
+ description="The DeclarativeOAuth Specific optional override to provide the custom `scope` key name, if required by data-provider.",
845
+ examples=[{"scope_key": "my_custom_scope_key_key_name"}],
846
+ title="(Optional) DeclarativeOAuth Scope Key Override",
847
+ )
848
+ state_key: Optional[str] = Field(
849
+ None,
850
+ description="The DeclarativeOAuth Specific optional override to provide the custom `state` key name, if required by data-provider. ",
851
+ examples=[{"state_key": "my_custom_state_key_key_name"}],
852
+ title="(Optional) DeclarativeOAuth State Key Override",
853
+ )
854
+ auth_code_key: Optional[str] = Field(
855
+ None,
856
+ description="The DeclarativeOAuth Specific optional override to provide the custom `code` key name to something like `auth_code` or `custom_auth_code`, if required by data-provider. ",
857
+ examples=[{"auth_code_key": "my_custom_auth_code_key_name"}],
858
+ title="(Optional) DeclarativeOAuth Auth Code Key Override",
859
+ )
860
+ redirect_uri_key: Optional[str] = Field(
861
+ None,
862
+ description="The DeclarativeOAuth Specific optional override to provide the custom `redirect_uri` key name to something like `callback_uri`, if required by data-provider.",
863
+ examples=[{"redirect_uri_key": "my_custom_redirect_uri_key_name"}],
864
+ title="(Optional) DeclarativeOAuth Redirect URI Key Override",
865
+ )
866
+
867
+
751
868
  class OAuthConfigSpecification(BaseModel):
752
869
  class Config:
753
870
  extra = Extra.allow
@@ -766,6 +883,11 @@ class OAuthConfigSpecification(BaseModel):
766
883
  ],
767
884
  title="OAuth user input",
768
885
  )
886
+ oauth_connector_input_specification: Optional[OauthConnectorInputSpecification] = Field(
887
+ None,
888
+ description='The DeclarativeOAuth specific blob.\nPertains to the fields defined by the connector relating to the OAuth flow.\n\nInterpolation capabilities:\n- The variables placeholders are declared as `{my_var}`.\n- The nested resolution variables like `{{my_nested_var}}` is allowed as well.\n\n- The allowed interpolation context is:\n + base64Encoder - encode to `base64`, {base64Encoder:{my_var_a}:{my_var_b}}\n + base64Decorer - decode from `base64` encoded string, {base64Decoder:{my_string_variable_or_string_value}}\n + urlEncoder - encode the input string to URL-like format, {urlEncoder:https://test.host.com/endpoint}\n + urlDecorer - decode the input url-encoded string into text format, {urlDecoder:https%3A%2F%2Fairbyte.io}\n + codeChallengeS256 - get the `codeChallenge` encoded value to provide additional data-provider specific authorisation values, {codeChallengeS256:{state_value}}\n\nExamples:\n - The TikTok Marketing DeclarativeOAuth spec:\n {\n "oauth_connector_input_specification": {\n "type": "object",\n "additionalProperties": false,\n "properties": {\n "consent_url": "https://ads.tiktok.com/marketing_api/auth?{client_id_key}={{client_id_key}}&{redirect_uri_key}={urlEncoder:{{redirect_uri_key}}}&{state_key}={{state_key}}",\n "access_token_url": "https://business-api.tiktok.com/open_api/v1.3/oauth2/access_token/",\n "access_token_params": {\n "{auth_code_key}": "{{auth_code_key}}",\n "{client_id_key}": "{{client_id_key}}",\n "{client_secret_key}": "{{client_secret_key}}"\n },\n "access_token_headers": {\n "Content-Type": "application/json",\n "Accept": "application/json"\n },\n "extract_output": ["data.access_token"],\n "client_id_key": "app_id",\n "client_secret_key": "secret",\n "auth_code_key": "auth_code"\n }\n }\n }',
889
+ title="DeclarativeOAuth Connector Specification",
890
+ )
769
891
  complete_oauth_output_specification: Optional[Dict[str, Any]] = Field(
770
892
  None,
771
893
  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 }",
@@ -17,6 +17,7 @@ from typing import (
17
17
  Mapping,
18
18
  MutableMapping,
19
19
  Optional,
20
+ Tuple,
20
21
  Type,
21
22
  Union,
22
23
  get_args,
@@ -24,6 +25,9 @@ from typing import (
24
25
  get_type_hints,
25
26
  )
26
27
 
28
+ from isodate import parse_duration
29
+ from pydantic.v1 import BaseModel
30
+
27
31
  from airbyte_cdk.models import FailureType, Level
28
32
  from airbyte_cdk.sources.connector_state_manager import ConnectorStateManager
29
33
  from airbyte_cdk.sources.declarative.async_job.job_orchestrator import AsyncJobOrchestrator
@@ -366,8 +370,6 @@ from airbyte_cdk.sources.streams.concurrent.state_converters.datetime_stream_sta
366
370
  from airbyte_cdk.sources.streams.http.error_handlers.response_models import ResponseAction
367
371
  from airbyte_cdk.sources.types import Config
368
372
  from airbyte_cdk.sources.utils.transform import TransformConfig, TypeTransformer
369
- from isodate import parse_duration
370
- from pydantic.v1 import BaseModel
371
373
 
372
374
  ComponentDefinition = Mapping[str, Any]
373
375
 
@@ -382,6 +384,7 @@ class ModelToComponentFactory:
382
384
  emit_connector_builder_messages: bool = False,
383
385
  disable_retries: bool = False,
384
386
  disable_cache: bool = False,
387
+ disable_resumable_full_refresh: bool = False,
385
388
  message_repository: Optional[MessageRepository] = None,
386
389
  ):
387
390
  self._init_mappings()
@@ -390,6 +393,7 @@ class ModelToComponentFactory:
390
393
  self._emit_connector_builder_messages = emit_connector_builder_messages
391
394
  self._disable_retries = disable_retries
392
395
  self._disable_cache = disable_cache
396
+ self._disable_resumable_full_refresh = disable_resumable_full_refresh
393
397
  self._message_repository = message_repository or InMemoryMessageRepository( # type: ignore
394
398
  self._evaluate_log_level(emit_connector_builder_messages)
395
399
  )
@@ -752,7 +756,7 @@ class ModelToComponentFactory:
752
756
  config: Config,
753
757
  stream_state: MutableMapping[str, Any],
754
758
  **kwargs: Any,
755
- ) -> ConcurrentCursor:
759
+ ) -> Tuple[ConcurrentCursor, DateTimeStreamStateConverter]:
756
760
  component_type = component_definition.get("type")
757
761
  if component_definition.get("type") != model_type.__name__:
758
762
  raise ValueError(
@@ -883,20 +887,23 @@ class ModelToComponentFactory:
883
887
  if evaluated_step:
884
888
  step_length = parse_duration(evaluated_step)
885
889
 
886
- return ConcurrentCursor(
887
- stream_name=stream_name,
888
- stream_namespace=stream_namespace,
889
- stream_state=stream_state,
890
- message_repository=self._message_repository, # type: ignore # message_repository is always instantiated with a value by factory
891
- connector_state_manager=state_manager,
892
- connector_state_converter=connector_state_converter,
893
- cursor_field=cursor_field,
894
- slice_boundary_fields=slice_boundary_fields,
895
- start=start_date, # type: ignore # Having issues w/ inspection for GapType and CursorValueType as shown in existing tests. Confirmed functionality is working in practice
896
- end_provider=end_date_provider, # type: ignore # Having issues w/ inspection for GapType and CursorValueType as shown in existing tests. Confirmed functionality is working in practice
897
- lookback_window=lookback_window,
898
- slice_range=step_length,
899
- cursor_granularity=cursor_granularity,
890
+ return (
891
+ ConcurrentCursor(
892
+ stream_name=stream_name,
893
+ stream_namespace=stream_namespace,
894
+ stream_state=stream_state,
895
+ message_repository=self._message_repository, # type: ignore # message_repository is always instantiated with a value by factory
896
+ connector_state_manager=state_manager,
897
+ connector_state_converter=connector_state_converter,
898
+ cursor_field=cursor_field,
899
+ slice_boundary_fields=slice_boundary_fields,
900
+ start=start_date, # type: ignore # Having issues w/ inspection for GapType and CursorValueType as shown in existing tests. Confirmed functionality is working in practice
901
+ end_provider=end_date_provider, # type: ignore # Having issues w/ inspection for GapType and CursorValueType as shown in existing tests. Confirmed functionality is working in practice
902
+ lookback_window=lookback_window,
903
+ slice_range=step_length,
904
+ cursor_granularity=cursor_granularity,
905
+ ),
906
+ connector_state_converter,
900
907
  )
901
908
 
902
909
  @staticmethod
@@ -1330,6 +1337,8 @@ class ModelToComponentFactory:
1330
1337
  if model.incremental_sync
1331
1338
  else None
1332
1339
  )
1340
+ elif self._disable_resumable_full_refresh:
1341
+ return stream_slicer
1333
1342
  elif stream_slicer:
1334
1343
  # For the Full-Refresh sub-streams, we use the nested `ChildPartitionResumableFullRefreshCursor`
1335
1344
  return PerPartitionCursor(
@@ -1776,6 +1785,7 @@ class ModelToComponentFactory:
1776
1785
  self,
1777
1786
  model: RecordSelectorModel,
1778
1787
  config: Config,
1788
+ name: str,
1779
1789
  *,
1780
1790
  transformations: List[RecordTransformation],
1781
1791
  decoder: Optional[Decoder] = None,
@@ -1806,6 +1816,7 @@ class ModelToComponentFactory:
1806
1816
 
1807
1817
  return RecordSelector(
1808
1818
  extractor=extractor,
1819
+ name=name,
1809
1820
  config=config,
1810
1821
  record_filter=record_filter,
1811
1822
  transformations=transformations,
@@ -1876,6 +1887,7 @@ class ModelToComponentFactory:
1876
1887
  )
1877
1888
  record_selector = self._create_component_from_model(
1878
1889
  model=model.record_selector,
1890
+ name=name,
1879
1891
  config=config,
1880
1892
  decoder=decoder,
1881
1893
  transformations=transformations,
@@ -2030,6 +2042,7 @@ class ModelToComponentFactory:
2030
2042
  requester=download_requester,
2031
2043
  record_selector=RecordSelector(
2032
2044
  extractor=ResponseToFileExtractor(),
2045
+ name=name,
2033
2046
  record_filter=None,
2034
2047
  transformations=[],
2035
2048
  schema_normalization=TypeTransformer(TransformConfig.NoTransform),
@@ -7,6 +7,7 @@ from dataclasses import InitVar, dataclass
7
7
  from typing import TYPE_CHECKING, Any, Iterable, List, Mapping, Optional, Union
8
8
 
9
9
  import dpath
10
+
10
11
  from airbyte_cdk.models import AirbyteMessage
11
12
  from airbyte_cdk.models import Type as MessageType
12
13
  from airbyte_cdk.sources.declarative.interpolation.interpolated_string import InterpolatedString
@@ -6,6 +6,7 @@ from dataclasses import InitVar, dataclass
6
6
  from typing import Any, Mapping, Optional, Union
7
7
 
8
8
  import requests
9
+
9
10
  from airbyte_cdk.sources.declarative.interpolation.interpolated_string import InterpolatedString
10
11
  from airbyte_cdk.sources.streams.http.error_handlers import BackoffStrategy
11
12
  from airbyte_cdk.sources.types import Config
@@ -6,6 +6,7 @@ from dataclasses import InitVar, dataclass
6
6
  from typing import Any, Mapping, Optional, Union
7
7
 
8
8
  import requests
9
+
9
10
  from airbyte_cdk.sources.declarative.interpolation.interpolated_string import InterpolatedString
10
11
  from airbyte_cdk.sources.streams.http.error_handlers import BackoffStrategy
11
12
  from airbyte_cdk.sources.types import Config
@@ -7,6 +7,7 @@ from dataclasses import InitVar, dataclass
7
7
  from typing import Any, Mapping, Optional, Union
8
8
 
9
9
  import requests
10
+
10
11
  from airbyte_cdk.models import FailureType
11
12
  from airbyte_cdk.sources.declarative.interpolation.interpolated_string import InterpolatedString
12
13
  from airbyte_cdk.sources.declarative.requesters.error_handlers.backoff_strategies.header_helper import (
@@ -9,6 +9,7 @@ from dataclasses import InitVar, dataclass
9
9
  from typing import Any, Mapping, Optional, Union
10
10
 
11
11
  import requests
12
+
12
13
  from airbyte_cdk.sources.declarative.interpolation.interpolated_string import InterpolatedString
13
14
  from airbyte_cdk.sources.declarative.requesters.error_handlers.backoff_strategies.header_helper import (
14
15
  get_numeric_value_from_header,
@@ -6,6 +6,7 @@ from dataclasses import InitVar, dataclass
6
6
  from typing import Any, List, Mapping, Optional, Union
7
7
 
8
8
  import requests
9
+
9
10
  from airbyte_cdk.sources.streams.http.error_handlers import ErrorHandler
10
11
  from airbyte_cdk.sources.streams.http.error_handlers.response_models import (
11
12
  ErrorResolution,
@@ -6,6 +6,7 @@ from dataclasses import InitVar, dataclass, field
6
6
  from typing import Any, List, Mapping, MutableMapping, Optional, Union
7
7
 
8
8
  import requests
9
+
9
10
  from airbyte_cdk.sources.declarative.requesters.error_handlers.default_http_response_filter import (
10
11
  DefaultHttpResponseFilter,
11
12
  )
@@ -5,6 +5,7 @@
5
5
  from typing import Optional, Union
6
6
 
7
7
  import requests
8
+
8
9
  from airbyte_cdk.sources.declarative.requesters.error_handlers.http_response_filter import (
9
10
  HttpResponseFilter,
10
11
  )
@@ -6,6 +6,7 @@ from dataclasses import InitVar, dataclass
6
6
  from typing import Any, Mapping, Optional, Set, Union
7
7
 
8
8
  import requests
9
+
9
10
  from airbyte_cdk.models import FailureType
10
11
  from airbyte_cdk.sources.declarative.interpolation import InterpolatedString
11
12
  from airbyte_cdk.sources.declarative.interpolation.interpolated_boolean import InterpolatedBoolean
@@ -6,6 +6,8 @@ from datetime import timedelta
6
6
  from typing import Any, Dict, Iterable, Mapping, Optional
7
7
 
8
8
  import requests
9
+ from requests import Response
10
+
9
11
  from airbyte_cdk import AirbyteMessage
10
12
  from airbyte_cdk.logger import lazy_log
11
13
  from airbyte_cdk.models import FailureType, Type
@@ -23,7 +25,6 @@ from airbyte_cdk.sources.declarative.requesters.requester import Requester
23
25
  from airbyte_cdk.sources.declarative.retrievers.simple_retriever import SimpleRetriever
24
26
  from airbyte_cdk.sources.types import Record, StreamSlice
25
27
  from airbyte_cdk.utils import AirbyteTracedException
26
- from requests import Response
27
28
 
28
29
  LOGGER = logging.getLogger("airbyte")
29
30
 
@@ -9,6 +9,7 @@ from typing import Any, Callable, Mapping, MutableMapping, Optional, Union
9
9
  from urllib.parse import urljoin
10
10
 
11
11
  import requests
12
+
12
13
  from airbyte_cdk.sources.declarative.auth.declarative_authenticator import (
13
14
  DeclarativeAuthenticator,
14
15
  NoAuth,
@@ -6,6 +6,7 @@ from dataclasses import InitVar, dataclass, field
6
6
  from typing import Any, Mapping, MutableMapping, Optional, Union
7
7
 
8
8
  import requests
9
+
9
10
  from airbyte_cdk.sources.declarative.decoders import (
10
11
  Decoder,
11
12
  JsonDecoder,
@@ -6,6 +6,7 @@ from dataclasses import InitVar, dataclass
6
6
  from typing import Any, Mapping, MutableMapping, Optional, Union
7
7
 
8
8
  import requests
9
+
9
10
  from airbyte_cdk.sources.declarative.requesters.paginators.paginator import Paginator
10
11
  from airbyte_cdk.sources.types import Record, StreamSlice, StreamState
11
12
 
@@ -7,6 +7,7 @@ from dataclasses import dataclass
7
7
  from typing import Any, Mapping, Optional
8
8
 
9
9
  import requests
10
+
10
11
  from airbyte_cdk.sources.declarative.requesters.request_options.request_options_provider import (
11
12
  RequestOptionsProvider,
12
13
  )
@@ -6,6 +6,7 @@ from dataclasses import InitVar, dataclass, field
6
6
  from typing import Any, Dict, Mapping, Optional, Union
7
7
 
8
8
  import requests
9
+
9
10
  from airbyte_cdk.sources.declarative.decoders import (
10
11
  Decoder,
11
12
  JsonDecoder,
@@ -6,6 +6,7 @@ from dataclasses import InitVar, dataclass, field
6
6
  from typing import Any, Mapping, Optional, Union
7
7
 
8
8
  import requests
9
+
9
10
  from airbyte_cdk.sources.declarative.decoders import (
10
11
  Decoder,
11
12
  JsonDecoder,
@@ -6,6 +6,7 @@ from dataclasses import InitVar, dataclass
6
6
  from typing import Any, Mapping, Optional, Union
7
7
 
8
8
  import requests
9
+
9
10
  from airbyte_cdk.sources.declarative.interpolation import InterpolatedString
10
11
  from airbyte_cdk.sources.declarative.requesters.paginators.strategies.pagination_strategy import (
11
12
  PaginationStrategy,
@@ -7,6 +7,7 @@ from dataclasses import dataclass
7
7
  from typing import Any, Optional
8
8
 
9
9
  import requests
10
+
10
11
  from airbyte_cdk.sources.types import Record
11
12
 
12
13
 
@@ -6,10 +6,12 @@ from abc import ABC, abstractmethod
6
6
  from typing import Any, Optional
7
7
 
8
8
  import requests
9
+
9
10
  from airbyte_cdk.sources.declarative.incremental.declarative_cursor import DeclarativeCursor
10
11
  from airbyte_cdk.sources.declarative.requesters.paginators.strategies.pagination_strategy import (
11
12
  PaginationStrategy,
12
13
  )
14
+ from airbyte_cdk.sources.streams.concurrent.cursor import ConcurrentCursor
13
15
  from airbyte_cdk.sources.types import Record
14
16
 
15
17
 
@@ -25,7 +27,11 @@ class PaginationStopCondition(ABC):
25
27
 
26
28
 
27
29
  class CursorStopCondition(PaginationStopCondition):
28
- def __init__(self, cursor: DeclarativeCursor):
30
+ def __init__(
31
+ self,
32
+ cursor: DeclarativeCursor
33
+ | ConcurrentCursor, # migrate to use both old and concurrent versions
34
+ ):
29
35
  self._cursor = cursor
30
36
 
31
37
  def is_met(self, record: Record) -> bool:
@@ -46,8 +52,8 @@ class StopConditionPaginationStrategyDecorator(PaginationStrategy):
46
52
  return None
47
53
  return self._delegate.next_page_token(response, last_page_size, last_record)
48
54
 
49
- def reset(self) -> None:
50
- self._delegate.reset()
55
+ def reset(self, reset_value: Optional[Any] = None) -> None:
56
+ self._delegate.reset(reset_value)
51
57
 
52
58
  def get_page_size(self) -> Optional[int]:
53
59
  return self._delegate.get_page_size()
@@ -5,6 +5,8 @@
5
5
  from dataclasses import InitVar, dataclass, field
6
6
  from typing import Any, Mapping, MutableMapping, Optional, Union
7
7
 
8
+ from deprecated import deprecated
9
+
8
10
  from airbyte_cdk.sources.declarative.interpolation.interpolated_nested_mapping import NestedMapping
9
11
  from airbyte_cdk.sources.declarative.requesters.request_options.interpolated_nested_request_input_provider import (
10
12
  InterpolatedNestedRequestInputProvider,
@@ -17,7 +19,6 @@ from airbyte_cdk.sources.declarative.requesters.request_options.request_options_
17
19
  )
18
20
  from airbyte_cdk.sources.source import ExperimentalClassWarning
19
21
  from airbyte_cdk.sources.types import Config, StreamSlice, StreamState
20
- from deprecated import deprecated
21
22
 
22
23
  RequestInput = Union[str, Mapping[str, str]]
23
24
  ValidRequestTypes = (str, list)
@@ -7,6 +7,7 @@ from enum import Enum
7
7
  from typing import Any, Callable, Mapping, MutableMapping, Optional, Union
8
8
 
9
9
  import requests
10
+
10
11
  from airbyte_cdk.sources.declarative.auth.declarative_authenticator import DeclarativeAuthenticator
11
12
  from airbyte_cdk.sources.declarative.requesters.request_options.request_options_provider import (
12
13
  RequestOptionsProvider,
@@ -4,6 +4,8 @@
4
4
  from dataclasses import InitVar, dataclass, field
5
5
  from typing import Any, Callable, Iterable, Mapping, Optional
6
6
 
7
+ from deprecated.classic import deprecated
8
+
7
9
  from airbyte_cdk.models import FailureType
8
10
  from airbyte_cdk.sources.declarative.async_job.job_orchestrator import (
9
11
  AsyncJobOrchestrator,
@@ -17,7 +19,6 @@ from airbyte_cdk.sources.source import ExperimentalClassWarning
17
19
  from airbyte_cdk.sources.streams.core import StreamData
18
20
  from airbyte_cdk.sources.types import Config, StreamSlice, StreamState
19
21
  from airbyte_cdk.utils.traced_exception import AirbyteTracedException
20
- from deprecated.classic import deprecated
21
22
 
22
23
 
23
24
  @deprecated("This class is experimental. Use at your own risk.", category=ExperimentalClassWarning)
@@ -20,6 +20,7 @@ from typing import (
20
20
  )
21
21
 
22
22
  import requests
23
+
23
24
  from airbyte_cdk.models import AirbyteMessage
24
25
  from airbyte_cdk.sources.declarative.extractors.http_selector import HttpSelector
25
26
  from airbyte_cdk.sources.declarative.incremental import ResumableFullRefreshCursor
@@ -467,8 +468,9 @@ class SimpleRetriever(Retriever):
467
468
  else:
468
469
  return None
469
470
 
470
- @staticmethod
471
- def _extract_record(stream_data: StreamData, stream_slice: StreamSlice) -> Optional[Record]:
471
+ def _extract_record(
472
+ self, stream_data: StreamData, stream_slice: StreamSlice
473
+ ) -> Optional[Record]:
472
474
  """
473
475
  As we allow the output of _read_pages to be StreamData, it can be multiple things. Therefore, we need to filter out and normalize
474
476
  to data to streamline the rest of the process.
@@ -477,9 +479,15 @@ class SimpleRetriever(Retriever):
477
479
  # Record is not part of `StreamData` but is the most common implementation of `Mapping[str, Any]` which is part of `StreamData`
478
480
  return stream_data
479
481
  elif isinstance(stream_data, (dict, Mapping)):
480
- return Record(dict(stream_data), stream_slice)
482
+ return Record(
483
+ data=dict(stream_data), associated_slice=stream_slice, stream_name=self.name
484
+ )
481
485
  elif isinstance(stream_data, AirbyteMessage) and stream_data.record:
482
- return Record(stream_data.record.data, stream_slice)
486
+ return Record(
487
+ data=stream_data.record.data, # type:ignore # AirbyteMessage always has record.data
488
+ associated_slice=stream_slice,
489
+ stream_name=self.name,
490
+ )
483
491
  return None
484
492
 
485
493
  # stream_slices is defined with arguments on http stream and fixing this has a long tail of dependencies. Will be resolved by the decoupling of http stream and simple retriever
@@ -1,14 +1,13 @@
1
1
  # Copyright (c) 2024 Airbyte, Inc., all rights reserved.
2
2
 
3
- from typing import Iterable, Optional, Mapping, Any, Callable
3
+ from typing import Any, Callable, Iterable, Mapping, Optional
4
4
 
5
5
  from airbyte_cdk.sources.declarative.retrievers import Retriever
6
6
  from airbyte_cdk.sources.message import MessageRepository
7
7
  from airbyte_cdk.sources.streams.concurrent.partitions.partition import Partition
8
8
  from airbyte_cdk.sources.streams.concurrent.partitions.partition_generator import PartitionGenerator
9
- from airbyte_cdk.sources.streams.concurrent.partitions.record import Record
10
9
  from airbyte_cdk.sources.streams.concurrent.partitions.stream_slicer import StreamSlicer
11
- from airbyte_cdk.sources.types import StreamSlice
10
+ from airbyte_cdk.sources.types import Record, StreamSlice
12
11
  from airbyte_cdk.utils.slice_hasher import SliceHasher
13
12
 
14
13
 
@@ -59,7 +58,11 @@ class DeclarativePartition(Partition):
59
58
  def read(self) -> Iterable[Record]:
60
59
  for stream_data in self._retriever.read_records(self._json_schema, self._stream_slice):
61
60
  if isinstance(stream_data, Mapping):
62
- yield Record(stream_data, self)
61
+ yield Record(
62
+ data=stream_data,
63
+ stream_name=self.stream_name(),
64
+ associated_slice=self._stream_slice,
65
+ )
63
66
  else:
64
67
  self._message_repository.emit_message(stream_data)
65
68
 
@@ -6,6 +6,7 @@ from dataclasses import InitVar, dataclass, field
6
6
  from typing import Any, Dict, List, Mapping, Optional, Type, Union
7
7
 
8
8
  import dpath
9
+
9
10
  from airbyte_cdk.sources.declarative.interpolation.interpolated_string import InterpolatedString
10
11
  from airbyte_cdk.sources.declarative.transformations import RecordTransformation
11
12
  from airbyte_cdk.sources.types import Config, FieldPointer, StreamSlice, StreamState
@@ -7,6 +7,7 @@ from typing import Any, Dict, List, Mapping, Optional
7
7
 
8
8
  import dpath
9
9
  import dpath.exceptions
10
+
10
11
  from airbyte_cdk.sources.declarative.interpolation.interpolated_boolean import InterpolatedBoolean
11
12
  from airbyte_cdk.sources.declarative.transformations import RecordTransformation
12
13
  from airbyte_cdk.sources.types import Config, FieldPointer, StreamSlice, StreamState
@@ -6,6 +6,7 @@ import pkgutil
6
6
  from typing import Any, List, Mapping, Optional
7
7
 
8
8
  import yaml
9
+
9
10
  from airbyte_cdk.models import AirbyteStateMessage, ConfiguredAirbyteCatalog
10
11
  from airbyte_cdk.sources.declarative.concurrent_declarative_source import (
11
12
  ConcurrentDeclarativeSource,
@@ -5,6 +5,7 @@
5
5
  from typing import Any, Callable, Dict, Iterable, Optional
6
6
 
7
7
  import dpath
8
+
8
9
  from airbyte_cdk.models import AirbyteStream
9
10
 
10
11
 
@@ -7,10 +7,11 @@ from abc import abstractmethod
7
7
  from typing import Any, Dict, List, Literal, Optional, Union
8
8
 
9
9
  import dpath
10
+ from pydantic.v1 import AnyUrl, BaseModel, Field
11
+
10
12
  from airbyte_cdk import OneOfOptionConfig
11
13
  from airbyte_cdk.sources.file_based.config.file_based_stream_config import FileBasedStreamConfig
12
14
  from airbyte_cdk.sources.utils import schema_helpers
13
- from pydantic.v1 import AnyUrl, BaseModel, Field
14
15
 
15
16
 
16
17
  class DeliverRecords(BaseModel):