airbyte-cdk 7.0.5__py3-none-any.whl → 7.1.1__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.
@@ -49,8 +49,9 @@ class CheckDynamicStream(ConnectionChecker):
49
49
  for stream in streams[: min(self.stream_count, len(streams))]:
50
50
  stream_is_available, reason = evaluate_availability(stream, logger)
51
51
  if not stream_is_available:
52
- logger.warning(f"Stream {stream.name} is not available: {reason}")
53
- return False, reason
52
+ message = f"Stream {stream.name} is not available: {reason}"
53
+ logger.warning(message)
54
+ return False, message
54
55
  except Exception as error:
55
56
  error_message = (
56
57
  f"Encountered an error trying to connect to stream {stream.name}. Error: {error}"
@@ -1264,22 +1264,12 @@ class ModelToComponentFactory:
1264
1264
  component_definition: ComponentDefinition,
1265
1265
  stream_name: str,
1266
1266
  stream_namespace: Optional[str],
1267
+ stream_state: MutableMapping[str, Any],
1267
1268
  config: Config,
1268
1269
  message_repository: Optional[MessageRepository] = None,
1269
1270
  runtime_lookback_window: Optional[datetime.timedelta] = None,
1270
- stream_state_migrations: Optional[List[Any]] = None,
1271
1271
  **kwargs: Any,
1272
1272
  ) -> ConcurrentCursor:
1273
- # Per-partition incremental streams can dynamically create child cursors which will pass their current
1274
- # state via the stream_state keyword argument. Incremental syncs without parent streams use the
1275
- # incoming state and connector_state_manager that is initialized when the component factory is created
1276
- stream_state = (
1277
- self._connector_state_manager.get_stream_state(stream_name, stream_namespace)
1278
- if "stream_state" not in kwargs
1279
- else kwargs["stream_state"]
1280
- )
1281
- stream_state = self.apply_stream_state_migrations(stream_state_migrations, stream_state)
1282
-
1283
1273
  component_type = component_definition.get("type")
1284
1274
  if component_definition.get("type") != model_type.__name__:
1285
1275
  raise ValueError(
@@ -1498,21 +1488,11 @@ class ModelToComponentFactory:
1498
1488
  component_definition: ComponentDefinition,
1499
1489
  stream_name: str,
1500
1490
  stream_namespace: Optional[str],
1491
+ stream_state: MutableMapping[str, Any],
1501
1492
  config: Config,
1502
1493
  message_repository: Optional[MessageRepository] = None,
1503
- stream_state_migrations: Optional[List[Any]] = None,
1504
1494
  **kwargs: Any,
1505
1495
  ) -> ConcurrentCursor:
1506
- # Per-partition incremental streams can dynamically create child cursors which will pass their current
1507
- # state via the stream_state keyword argument. Incremental syncs without parent streams use the
1508
- # incoming state and connector_state_manager that is initialized when the component factory is created
1509
- stream_state = (
1510
- self._connector_state_manager.get_stream_state(stream_name, stream_namespace)
1511
- if "stream_state" not in kwargs
1512
- else kwargs["stream_state"]
1513
- )
1514
- stream_state = self.apply_stream_state_migrations(stream_state_migrations, stream_state)
1515
-
1516
1496
  component_type = component_definition.get("type")
1517
1497
  if component_definition.get("type") != model_type.__name__:
1518
1498
  raise ValueError(
@@ -1587,7 +1567,6 @@ class ModelToComponentFactory:
1587
1567
  config: Config,
1588
1568
  stream_state: MutableMapping[str, Any],
1589
1569
  partition_router: PartitionRouter,
1590
- stream_state_migrations: Optional[List[Any]] = None,
1591
1570
  attempt_to_create_cursor_if_not_provided: bool = False,
1592
1571
  **kwargs: Any,
1593
1572
  ) -> ConcurrentPerPartitionCursor:
@@ -1647,11 +1626,9 @@ class ModelToComponentFactory:
1647
1626
  stream_namespace=stream_namespace,
1648
1627
  config=config,
1649
1628
  message_repository=NoopMessageRepository(),
1650
- # stream_state_migrations=stream_state_migrations, # FIXME is it expected to run migration on per partition state too?
1651
1629
  )
1652
1630
  )
1653
1631
 
1654
- stream_state = self.apply_stream_state_migrations(stream_state_migrations, stream_state)
1655
1632
  # Per-partition state doesn't make sense for GroupingPartitionRouter, so force the global state
1656
1633
  use_global_cursor = isinstance(
1657
1634
  partition_router, GroupingPartitionRouter
@@ -1974,6 +1951,7 @@ class ModelToComponentFactory:
1974
1951
  self, model: DeclarativeStreamModel, config: Config, is_parent: bool = False, **kwargs: Any
1975
1952
  ) -> AbstractStream:
1976
1953
  primary_key = model.primary_key.__root__ if model.primary_key else None
1954
+ self._migrate_state(model, config)
1977
1955
 
1978
1956
  partition_router = self._build_stream_slicer_from_partition_router(
1979
1957
  model.retriever,
@@ -2135,6 +2113,23 @@ class ModelToComponentFactory:
2135
2113
  supports_file_transfer=hasattr(model, "file_uploader") and bool(model.file_uploader),
2136
2114
  )
2137
2115
 
2116
+ def _migrate_state(self, model: DeclarativeStreamModel, config: Config) -> None:
2117
+ stream_name = model.name or ""
2118
+ stream_state = self._connector_state_manager.get_stream_state(
2119
+ stream_name=stream_name, namespace=None
2120
+ )
2121
+ if model.state_migrations:
2122
+ state_transformations = [
2123
+ self._create_component_from_model(state_migration, config, declarative_stream=model)
2124
+ for state_migration in model.state_migrations
2125
+ ]
2126
+ else:
2127
+ state_transformations = []
2128
+ stream_state = self.apply_stream_state_migrations(state_transformations, stream_state)
2129
+ self._connector_state_manager.update_state_for_stream(
2130
+ stream_name=stream_name, namespace=None, value=stream_state
2131
+ )
2132
+
2138
2133
  def _is_stop_condition_on_cursor(self, model: DeclarativeStreamModel) -> bool:
2139
2134
  return bool(
2140
2135
  model.incremental_sync
@@ -2206,17 +2201,7 @@ class ModelToComponentFactory:
2206
2201
  config: Config,
2207
2202
  ) -> Cursor:
2208
2203
  stream_name = model.name or ""
2209
- stream_state = self._connector_state_manager.get_stream_state(
2210
- stream_name=stream_name, namespace=None
2211
- )
2212
-
2213
- if model.state_migrations:
2214
- state_transformations = [
2215
- self._create_component_from_model(state_migration, config, declarative_stream=model)
2216
- for state_migration in model.state_migrations
2217
- ]
2218
- else:
2219
- state_transformations = []
2204
+ stream_state = self._connector_state_manager.get_stream_state(stream_name, None)
2220
2205
 
2221
2206
  if (
2222
2207
  model.incremental_sync
@@ -2228,10 +2213,9 @@ class ModelToComponentFactory:
2228
2213
  model_type=DatetimeBasedCursorModel,
2229
2214
  component_definition=model.incremental_sync.__dict__,
2230
2215
  stream_name=stream_name,
2216
+ stream_state=stream_state,
2231
2217
  stream_namespace=None,
2232
2218
  config=config or {},
2233
- stream_state=stream_state,
2234
- stream_state_migrations=state_transformations,
2235
2219
  partition_router=stream_slicer,
2236
2220
  attempt_to_create_cursor_if_not_provided=True, # FIXME can we remove that now?
2237
2221
  )
@@ -2242,8 +2226,8 @@ class ModelToComponentFactory:
2242
2226
  component_definition=model.incremental_sync.__dict__,
2243
2227
  stream_name=stream_name,
2244
2228
  stream_namespace=None,
2229
+ stream_state=stream_state,
2245
2230
  config=config or {},
2246
- stream_state_migrations=state_transformations,
2247
2231
  )
2248
2232
  elif type(model.incremental_sync) == DatetimeBasedCursorModel:
2249
2233
  return self.create_concurrent_cursor_from_datetime_based_cursor( # type: ignore # This is a known issue that we are creating and returning a ConcurrentCursor which does not technically implement the (low-code) StreamSlicer. However, (low-code) StreamSlicer and ConcurrentCursor both implement StreamSlicer.stream_slices() which is the primary method needed for checkpointing
@@ -2251,8 +2235,8 @@ class ModelToComponentFactory:
2251
2235
  component_definition=model.incremental_sync.__dict__,
2252
2236
  stream_name=stream_name,
2253
2237
  stream_namespace=None,
2238
+ stream_state=stream_state,
2254
2239
  config=config or {},
2255
- stream_state_migrations=state_transformations,
2256
2240
  attempt_to_create_cursor_if_not_provided=True,
2257
2241
  )
2258
2242
  else:
@@ -31,56 +31,56 @@ DEFAULT_ERROR_MAPPING: Mapping[Union[int, str, Type[Exception]], ErrorResolution
31
31
  400: ErrorResolution(
32
32
  response_action=ResponseAction.FAIL,
33
33
  failure_type=FailureType.system_error,
34
- error_message="Bad request. Please check your request parameters.",
34
+ error_message="HTTP Status Code: 400. Error: Bad request. Please check your request parameters.",
35
35
  ),
36
36
  401: ErrorResolution(
37
37
  response_action=ResponseAction.FAIL,
38
38
  failure_type=FailureType.config_error,
39
- error_message="Unauthorized. Please ensure you are authenticated correctly.",
39
+ error_message="HTTP Status Code: 401. Error: Unauthorized. Please ensure you are authenticated correctly.",
40
40
  ),
41
41
  403: ErrorResolution(
42
42
  response_action=ResponseAction.FAIL,
43
43
  failure_type=FailureType.config_error,
44
- error_message="Forbidden. You don't have permission to access this resource.",
44
+ error_message="HTTP Status Code: 403. Error: Forbidden. You don't have permission to access this resource.",
45
45
  ),
46
46
  404: ErrorResolution(
47
47
  response_action=ResponseAction.FAIL,
48
48
  failure_type=FailureType.system_error,
49
- error_message="Not found. The requested resource was not found on the server.",
49
+ error_message="HTTP Status Code: 404. Error: Not found. The requested resource was not found on the server.",
50
50
  ),
51
51
  405: ErrorResolution(
52
52
  response_action=ResponseAction.FAIL,
53
53
  failure_type=FailureType.system_error,
54
- error_message="Method not allowed. Please check your request method.",
54
+ error_message="HTTP Status Code: 405. Error: Method not allowed. Please check your request method.",
55
55
  ),
56
56
  408: ErrorResolution(
57
57
  response_action=ResponseAction.RETRY,
58
58
  failure_type=FailureType.transient_error,
59
- error_message="Request timeout.",
59
+ error_message="HTTP Status Code: 408. Error: Request timeout.",
60
60
  ),
61
61
  429: ErrorResolution(
62
62
  response_action=ResponseAction.RATE_LIMITED,
63
63
  failure_type=FailureType.transient_error,
64
- error_message="Too many requests.",
64
+ error_message="HTTP Status Code: 429. Error: Too many requests.",
65
65
  ),
66
66
  500: ErrorResolution(
67
67
  response_action=ResponseAction.RETRY,
68
68
  failure_type=FailureType.transient_error,
69
- error_message="Internal server error.",
69
+ error_message="HTTP Status Code: 500. Error: Internal server error.",
70
70
  ),
71
71
  502: ErrorResolution(
72
72
  response_action=ResponseAction.RETRY,
73
73
  failure_type=FailureType.transient_error,
74
- error_message="Bad gateway.",
74
+ error_message="HTTP Status Code: 502. Error: Bad gateway.",
75
75
  ),
76
76
  503: ErrorResolution(
77
77
  response_action=ResponseAction.RETRY,
78
78
  failure_type=FailureType.transient_error,
79
- error_message="Service unavailable.",
79
+ error_message="HTTP Status Code: 503. Error: Service unavailable.",
80
80
  ),
81
81
  504: ErrorResolution(
82
82
  response_action=ResponseAction.RETRY,
83
83
  failure_type=FailureType.transient_error,
84
- error_message="Gateway timeout.",
84
+ error_message="HTTP Status Code: 504. Error: Gateway timeout.",
85
85
  ),
86
86
  }
@@ -7,6 +7,8 @@ from typing import Optional, Union
7
7
 
8
8
  import requests
9
9
 
10
+ from airbyte_cdk.models import FailureType
11
+
10
12
 
11
13
  class BaseBackoffException(requests.exceptions.HTTPError):
12
14
  def __init__(
@@ -14,7 +16,9 @@ class BaseBackoffException(requests.exceptions.HTTPError):
14
16
  request: requests.PreparedRequest,
15
17
  response: Optional[Union[requests.Response, Exception]],
16
18
  error_message: str = "",
19
+ failure_type: Optional[FailureType] = None,
17
20
  ):
21
+ self.failure_type = failure_type
18
22
  if isinstance(response, requests.Response):
19
23
  error_message = (
20
24
  error_message
@@ -43,6 +47,7 @@ class UserDefinedBackoffException(BaseBackoffException):
43
47
  request: requests.PreparedRequest,
44
48
  response: Optional[Union[requests.Response, Exception]],
45
49
  error_message: str = "",
50
+ failure_type: Optional[FailureType] = None,
46
51
  ):
47
52
  """
48
53
  :param backoff: how long to backoff in seconds
@@ -50,7 +55,12 @@ class UserDefinedBackoffException(BaseBackoffException):
50
55
  :param response: the response that triggered the backoff exception
51
56
  """
52
57
  self.backoff = backoff
53
- super().__init__(request=request, response=response, error_message=error_message)
58
+ super().__init__(
59
+ request=request,
60
+ response=response,
61
+ error_message=error_message,
62
+ failure_type=failure_type,
63
+ )
54
64
 
55
65
 
56
66
  class DefaultBackoffException(BaseBackoffException):
@@ -18,6 +18,7 @@ from airbyte_cdk.models import (
18
18
  AirbyteStreamStatus,
19
19
  AirbyteStreamStatusReason,
20
20
  AirbyteStreamStatusReasonType,
21
+ FailureType,
21
22
  Level,
22
23
  StreamDescriptor,
23
24
  )
@@ -35,6 +36,7 @@ from airbyte_cdk.sources.streams.http.error_handlers import (
35
36
  ResponseAction,
36
37
  )
37
38
  from airbyte_cdk.sources.streams.http.exceptions import (
39
+ BaseBackoffException,
38
40
  DefaultBackoffException,
39
41
  RateLimitBackoffException,
40
42
  RequestBodyException,
@@ -290,15 +292,25 @@ class HttpClient:
290
292
  backoff_handler = http_client_default_backoff_handler(
291
293
  max_tries=max_tries, max_time=max_time
292
294
  )
293
- # backoff handlers wrap _send, so it will always return a response
294
- response = backoff_handler(rate_limit_backoff_handler(user_backoff_handler))(
295
- request,
296
- request_kwargs,
297
- log_formatter=log_formatter,
298
- exit_on_rate_limit=exit_on_rate_limit,
299
- ) # type: ignore # mypy can't infer that backoff_handler wraps _send
300
-
301
- return response
295
+ # backoff handlers wrap _send, so it will always return a response -- except when all retries are exhausted
296
+ try:
297
+ response = backoff_handler(rate_limit_backoff_handler(user_backoff_handler))(
298
+ request,
299
+ request_kwargs,
300
+ log_formatter=log_formatter,
301
+ exit_on_rate_limit=exit_on_rate_limit,
302
+ ) # type: ignore # mypy can't infer that backoff_handler wraps _send
303
+
304
+ return response
305
+ except BaseBackoffException as e:
306
+ self._logger.error(f"Retries exhausted with backoff exception.", exc_info=True)
307
+ raise MessageRepresentationAirbyteTracedErrors(
308
+ internal_message=f"Exhausted available request attempts. Exception: {e}",
309
+ message=f"Exhausted available request attempts. Please see logs for more details. Exception: {e}",
310
+ failure_type=e.failure_type or FailureType.system_error,
311
+ exception=e,
312
+ stream_descriptor=StreamDescriptor(name=self._name),
313
+ )
302
314
 
303
315
  def _send(
304
316
  self,
@@ -492,6 +504,7 @@ class HttpClient:
492
504
  request=request,
493
505
  response=(response if response is not None else exc),
494
506
  error_message=error_message,
507
+ failure_type=error_resolution.failure_type,
495
508
  )
496
509
 
497
510
  elif retry_endlessly:
@@ -499,12 +512,14 @@ class HttpClient:
499
512
  request=request,
500
513
  response=(response if response is not None else exc),
501
514
  error_message=error_message,
515
+ failure_type=error_resolution.failure_type,
502
516
  )
503
517
 
504
518
  raise DefaultBackoffException(
505
519
  request=request,
506
520
  response=(response if response is not None else exc),
507
521
  error_message=error_message,
522
+ failure_type=error_resolution.failure_type,
508
523
  )
509
524
 
510
525
  elif response:
@@ -545,6 +560,15 @@ class HttpClient:
545
560
  data=data,
546
561
  )
547
562
 
563
+ env_settings = self._session.merge_environment_settings(
564
+ url=request.url,
565
+ proxies=request_kwargs.get("proxies"),
566
+ stream=request_kwargs.get("stream"),
567
+ verify=request_kwargs.get("verify"),
568
+ cert=request_kwargs.get("cert"),
569
+ )
570
+ request_kwargs = {**request_kwargs, **env_settings}
571
+
548
572
  response: requests.Response = self._send_with_retry(
549
573
  request=request,
550
574
  request_kwargs=request_kwargs,
@@ -240,7 +240,11 @@ class AbstractOauth2Authenticator(AuthBase):
240
240
  except requests.exceptions.RequestException as e:
241
241
  if e.response is not None:
242
242
  if e.response.status_code == 429 or e.response.status_code >= 500:
243
- raise DefaultBackoffException(request=e.response.request, response=e.response)
243
+ raise DefaultBackoffException(
244
+ request=e.response.request,
245
+ response=e.response,
246
+ failure_type=FailureType.transient_error,
247
+ )
244
248
  if self._wrap_refresh_token_exception(e):
245
249
  message = "Refresh token is invalid or expired. Please re-authenticate from Sources/<your source>/Settings."
246
250
  raise AirbyteTracedException(
@@ -8,6 +8,7 @@ from enum import Flag, auto
8
8
  from typing import TYPE_CHECKING, Any, Callable, Dict, Generator, Mapping, Optional, cast
9
9
 
10
10
  from jsonschema import Draft7Validator, ValidationError, validators
11
+ from jsonschema.protocols import Validator
11
12
  from referencing import Registry, Resource
12
13
  from referencing._core import Resolver
13
14
  from referencing.exceptions import Unresolvable
@@ -17,12 +18,6 @@ from airbyte_cdk.sources.utils.schema_helpers import expand_refs
17
18
 
18
19
  from .schema_helpers import get_ref_resolver_registry
19
20
 
20
- try:
21
- from jsonschema.validators import Validator
22
- except:
23
- from jsonschema import Validator
24
-
25
-
26
21
  MAX_NESTING_DEPTH = 3
27
22
  json_to_python_simple = {
28
23
  "string": str,
@@ -82,11 +82,10 @@ assert not ab_datetime_try_parse("foo") # Invalid: not parsab
82
82
  """
83
83
 
84
84
  from datetime import datetime, timedelta, timezone
85
- from typing import Any, Optional, Union, overload
85
+ from typing import Any, Union, overload
86
86
 
87
87
  from dateutil import parser
88
- from typing_extensions import Never
89
- from whenever import Instant, LocalDateTime, ZonedDateTime
88
+ from whenever import Instant
90
89
 
91
90
 
92
91
  class AirbyteDateTime(datetime):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: airbyte-cdk
3
- Version: 7.0.5
3
+ Version: 7.1.1
4
4
  Summary: A framework for writing Airbyte Connectors.
5
5
  Home-page: https://airbyte.com
6
6
  License: MIT
@@ -84,7 +84,7 @@ Requires-Dist: unstructured.pytesseract (>=0.3.12) ; extra == "file-based"
84
84
  Requires-Dist: unstructured[docx,pptx] (==0.10.27) ; extra == "file-based"
85
85
  Requires-Dist: uvicorn (>=0.35.0) ; extra == "manifest-server"
86
86
  Requires-Dist: wcmatch (==10.0)
87
- Requires-Dist: whenever (>=0.6.16,<0.7.0)
87
+ Requires-Dist: whenever (>=0.7.3,<0.9.0)
88
88
  Requires-Dist: xmltodict (>=0.13,<0.15)
89
89
  Project-URL: Documentation, https://docs.airbyte.io/
90
90
  Project-URL: Repository, https://github.com/airbytehq/airbyte-python-cdk
@@ -121,7 +121,7 @@ airbyte_cdk/sources/declarative/auth/selective_authenticator.py,sha256=qGwC6YsCl
121
121
  airbyte_cdk/sources/declarative/auth/token.py,sha256=2EnE78EhBOY9hbeZnQJ9AuFaM-G7dccU-oKo_LThRQk,11070
122
122
  airbyte_cdk/sources/declarative/auth/token_provider.py,sha256=Jzuxlmt1_-_aFC_n0OmP8L1nDOacLzbEVVx3kjdX_W8,3104
123
123
  airbyte_cdk/sources/declarative/checks/__init__.py,sha256=cpoBwEbRNcMi7Rmi5pD63ppUvAOZsAWzasmc57ob9rc,873
124
- airbyte_cdk/sources/declarative/checks/check_dynamic_stream.py,sha256=BhPAOalZuA4sdi8DS2n42UMzj4PJ0udtRZ95a2T4ZOI,2302
124
+ airbyte_cdk/sources/declarative/checks/check_dynamic_stream.py,sha256=72d3oafXAX31dEeneFLBjRMS_3a8B8QISjlFcOlfeoY,2341
125
125
  airbyte_cdk/sources/declarative/checks/check_stream.py,sha256=G7VBOwDdybbpZstFG0hgdy20CJZkgBKILLkQBQzjZ9A,7997
126
126
  airbyte_cdk/sources/declarative/checks/connection_checker.py,sha256=HQHK3gO5xXeWYdxDjiXO3xzz5MBOYcQn0Dd6IRW7Vx8,1400
127
127
  airbyte_cdk/sources/declarative/concurrency_level/__init__.py,sha256=5XUqrmlstYlMM0j6crktlKQwALek0uiz2D3WdM46MyA,191
@@ -172,7 +172,7 @@ airbyte_cdk/sources/declarative/parsers/custom_exceptions.py,sha256=wnRUP0Xeru9R
172
172
  airbyte_cdk/sources/declarative/parsers/manifest_component_transformer.py,sha256=la9Ulpc0lQewiBLKJ0FpsWxyU5XISv-ulmFRHJLJ1Pc,11292
173
173
  airbyte_cdk/sources/declarative/parsers/manifest_normalizer.py,sha256=EtKjS9c94yNp3AwQC8KUCQaAYW5T3zvFYxoWYjc_buI,19729
174
174
  airbyte_cdk/sources/declarative/parsers/manifest_reference_resolver.py,sha256=pJmg78vqE5VfUrF_KJnWjucQ4k9IWFULeAxHCowrHXE,6806
175
- airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py,sha256=X8qIjanJCog3GflyEoZ-5ECID-xqcfFQgW3E6AzyFNU,184572
175
+ airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py,sha256=HetH_V7m96aoeuat55UVKcWQhHLNWYKicr1zqH49mIY,183379
176
176
  airbyte_cdk/sources/declarative/partition_routers/__init__.py,sha256=TBC9AkGaUqHm2IKHMPN6punBIcY5tWGULowcLoAVkfw,1109
177
177
  airbyte_cdk/sources/declarative/partition_routers/async_job_partition_router.py,sha256=VelO7zKqKtzMJ35jyFeg0ypJLQC0plqqIBNXoBW1G2E,3001
178
178
  airbyte_cdk/sources/declarative/partition_routers/cartesian_product_stream_slicer.py,sha256=ocm4hZ4k-tEGs5HLrtI8ecWSK0hGqNH0Rvz2byx_HZk,6927
@@ -374,18 +374,18 @@ airbyte_cdk/sources/streams/http/availability_strategy.py,sha256=sovoGFThZr-doMN
374
374
  airbyte_cdk/sources/streams/http/error_handlers/__init__.py,sha256=nNO0bnD0ogDlR4AQrI-YmpcM911vWe83b7RJYgvjSYs,666
375
375
  airbyte_cdk/sources/streams/http/error_handlers/backoff_strategy.py,sha256=7fIkF00wD6bqIXtiG2QAgbje_xiQ5JTs99ibwR8LLXY,1030
376
376
  airbyte_cdk/sources/streams/http/error_handlers/default_backoff_strategy.py,sha256=1_1Gi2ImwTbh4SgIKCRh2P4kPaVeAeHc1ib6IrBfqKA,411
377
- airbyte_cdk/sources/streams/http/error_handlers/default_error_mapping.py,sha256=drMniPygapMfOigh_ShJQvX6oqJaN4UA3cbRMkOgZJ4,3402
377
+ airbyte_cdk/sources/streams/http/error_handlers/default_error_mapping.py,sha256=-gn0YPkoxpQMZuirzUevqNcaLkyILPA04TLtA7W0H18,3732
378
378
  airbyte_cdk/sources/streams/http/error_handlers/error_handler.py,sha256=GuqP7U1eC9RPaiD4y4Mkf17vKcOXo2ENnMB-CUBLsbo,1164
379
379
  airbyte_cdk/sources/streams/http/error_handlers/error_message_parser.py,sha256=xC93uB5BJd3iOnAXCrYLJTitWeGZlqzwe55VtsZqNnE,456
380
380
  airbyte_cdk/sources/streams/http/error_handlers/http_status_error_handler.py,sha256=2gqececTxxUqO6aIkVNNXADg48Px5EHUwnXHL9KiPT8,4188
381
381
  airbyte_cdk/sources/streams/http/error_handlers/json_error_message_parser.py,sha256=GW5rkBQLLTj7MEaDdbpG7DHxTQVRrDOg1ehLLxjqiM4,1828
382
382
  airbyte_cdk/sources/streams/http/error_handlers/response_models.py,sha256=xGIVELBFY0TmH9aUq1ikoqJz8oHLr6di2JLvKWVEO-s,2236
383
- airbyte_cdk/sources/streams/http/exceptions.py,sha256=njC7MlMJoFYcSGz4mIp6-bqLFTr6vC8ej25X0oSeyjE,1824
383
+ airbyte_cdk/sources/streams/http/exceptions.py,sha256=TTUpWq_qLPtdvXqYPpMhtYbFVQ7dGtajDVfjb6KQ8z8,2099
384
384
  airbyte_cdk/sources/streams/http/http.py,sha256=0uariNq8OFnlX7iqOHwBhecxA-Hfd5hSY8_XCEgn3jI,28499
385
- airbyte_cdk/sources/streams/http/http_client.py,sha256=8E8RBDzkBUgvDqFA5OgVBEvCjGbcUeuQPiCkDLHg31U,24182
385
+ airbyte_cdk/sources/streams/http/http_client.py,sha256=Ys-9qCA-jFu1oQNbehCwb3K2GaJcTJp1gtoa1qujK1M,25438
386
386
  airbyte_cdk/sources/streams/http/rate_limiting.py,sha256=IwdjrHKUnU97XO4qONgYRv4YYW51xQ8SJm4WLafXDB8,6351
387
387
  airbyte_cdk/sources/streams/http/requests_native_auth/__init__.py,sha256=RN0D3nOX1xLgwEwKWu6pkGy3XqBFzKSNZ8Lf6umU2eY,413
388
- airbyte_cdk/sources/streams/http/requests_native_auth/abstract_oauth.py,sha256=0WfnxuxDwRYeq-PIwdUjJujDnxuJPhNfHlX_8aNHtYU,19663
388
+ airbyte_cdk/sources/streams/http/requests_native_auth/abstract_oauth.py,sha256=aWrBmJ8AhUtvtHhHq5JGVZFXjDa7jG8DZePG4gEs9VY,19800
389
389
  airbyte_cdk/sources/streams/http/requests_native_auth/abstract_token.py,sha256=Y3n7J-sk5yGjv_OxtY6Z6k0PEsFZmtIRi-x0KCbaHdA,1010
390
390
  airbyte_cdk/sources/streams/http/requests_native_auth/oauth.py,sha256=gVLo7nU-ORJd413TZHMJQV4m_vaGnRqhoXGGWehFjDA,19253
391
391
  airbyte_cdk/sources/streams/http/requests_native_auth/token.py,sha256=h5PTzcdH-RQLeCg7xZ45w_484OPUDSwNWl_iMJQmZoI,2526
@@ -398,7 +398,7 @@ airbyte_cdk/sources/utils/files_directory.py,sha256=z8Dmr-wkL1sAqdwCST4MBUFAyMHP
398
398
  airbyte_cdk/sources/utils/record_helper.py,sha256=7wL-pDYrBpcmZHa8ORtiSOqBZJEZI5hdl2dA1RYiatk,2029
399
399
  airbyte_cdk/sources/utils/schema_helpers.py,sha256=_SCOPalKoMW3SX9J-zK6UsAO0oHsfCyW-F2wQlPJ3PU,9145
400
400
  airbyte_cdk/sources/utils/slice_logger.py,sha256=M1TvcYGMftXR841XdJmeEpKpQqrdOD5X-qsspfAMKMs,2168
401
- airbyte_cdk/sources/utils/transform.py,sha256=49xcU97dZAO7FTQItrpN0mZ4qjz5d6huftF4DYbze6c,11971
401
+ airbyte_cdk/sources/utils/transform.py,sha256=b45WBpkdhsRDJZa95DnwfTcc5eJHmBBSs1CWP6CHJt8,11914
402
402
  airbyte_cdk/sources/utils/types.py,sha256=41ZQR681t5TUnOScij58d088sb99klH_ZENFcaYro_g,175
403
403
  airbyte_cdk/sql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
404
404
  airbyte_cdk/sql/_util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -444,7 +444,7 @@ airbyte_cdk/utils/analytics_message.py,sha256=bi3uugQ2NjecnwTnz63iD5D1M8ZR8mXPbd
444
444
  airbyte_cdk/utils/connector_paths.py,sha256=MXj0RBi3HpuvQTWH6-vc62BZZ3XguHMq0CVIkjhS3qs,8779
445
445
  airbyte_cdk/utils/constants.py,sha256=QzCi7j5SqpI5I06uRvQ8FC73JVJi7rXaRnR3E_gro5c,108
446
446
  airbyte_cdk/utils/datetime_format_inferrer.py,sha256=Ne2cpk7Tx3eZDEW2Q3O7jnNOY9g-w-AUMt3Ltvwg1tY,3989
447
- airbyte_cdk/utils/datetime_helpers.py,sha256=8mqzZ67Or2PBp7tLtrhh6XFv4wFzYsjCL_DOQJRaftI,17751
447
+ airbyte_cdk/utils/datetime_helpers.py,sha256=b3jKNpz4HPwWXCeBoyYKVbuqFvnp4in1Vy1bMK8R9dI,17675
448
448
  airbyte_cdk/utils/docker.py,sha256=ub6xurQHw6qIhzgDO3V9sXOG1jkZyDGbOSSDjcazEHo,17989
449
449
  airbyte_cdk/utils/event_timing.py,sha256=aiuFmPU80buLlNdKq4fDTEqqhEIelHPF6AalFGwY8as,2557
450
450
  airbyte_cdk/utils/is_cloud_environment.py,sha256=DayV32Irh-SdnJ0MnjvstwCJ66_l5oEsd8l85rZtHoc,574
@@ -457,9 +457,9 @@ airbyte_cdk/utils/slice_hasher.py,sha256=EDxgROHDbfG-QKQb59m7h_7crN1tRiawdf5uU7G
457
457
  airbyte_cdk/utils/spec_schema_transformations.py,sha256=9YDJmnIGFsT51CVQf2tSSvTapGimITjEFGbUTSZAGTI,963
458
458
  airbyte_cdk/utils/stream_status_utils.py,sha256=ZmBoiy5HVbUEHAMrUONxZvxnvfV9CesmQJLDTAIWnWw,1171
459
459
  airbyte_cdk/utils/traced_exception.py,sha256=C8uIBuCL_E4WnBAOPSxBicD06JAldoN9fGsQDp463OY,6292
460
- airbyte_cdk-7.0.5.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
461
- airbyte_cdk-7.0.5.dist-info/LICENSE_SHORT,sha256=aqF6D1NcESmpn-cqsxBtszTEnHKnlsp8L4x9wAh3Nxg,55
462
- airbyte_cdk-7.0.5.dist-info/METADATA,sha256=nrc8uO7WlpGl_0Tbd1fLkZjPNmxtV8VEbEBnEDelFgQ,6799
463
- airbyte_cdk-7.0.5.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
464
- airbyte_cdk-7.0.5.dist-info/entry_points.txt,sha256=eLZ2UYvJZGm1s07Pplcs--1Gim60YhZWTb53j_dghwU,195
465
- airbyte_cdk-7.0.5.dist-info/RECORD,,
460
+ airbyte_cdk-7.1.1.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
461
+ airbyte_cdk-7.1.1.dist-info/LICENSE_SHORT,sha256=aqF6D1NcESmpn-cqsxBtszTEnHKnlsp8L4x9wAh3Nxg,55
462
+ airbyte_cdk-7.1.1.dist-info/METADATA,sha256=FxrlxkaByiz849DzrEFOO9EhoNR3jgKBc2E56cQUQ68,6798
463
+ airbyte_cdk-7.1.1.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
464
+ airbyte_cdk-7.1.1.dist-info/entry_points.txt,sha256=eLZ2UYvJZGm1s07Pplcs--1Gim60YhZWTb53j_dghwU,195
465
+ airbyte_cdk-7.1.1.dist-info/RECORD,,