airbyte-cdk 6.33.0.dev0__py3-none-any.whl → 6.33.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.
Files changed (22) hide show
  1. airbyte_cdk/sources/declarative/auth/token.py +3 -8
  2. airbyte_cdk/sources/declarative/concurrent_declarative_source.py +13 -2
  3. airbyte_cdk/sources/declarative/declarative_component_schema.yaml +15 -212
  4. airbyte_cdk/sources/declarative/incremental/datetime_based_cursor.py +7 -6
  5. airbyte_cdk/sources/declarative/manifest_declarative_source.py +0 -4
  6. airbyte_cdk/sources/declarative/models/declarative_component_schema.py +10 -169
  7. airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py +34 -171
  8. airbyte_cdk/sources/declarative/partition_routers/list_partition_router.py +4 -2
  9. airbyte_cdk/sources/declarative/partition_routers/substream_partition_router.py +26 -18
  10. airbyte_cdk/sources/declarative/requesters/http_requester.py +5 -4
  11. airbyte_cdk/sources/declarative/requesters/paginators/default_paginator.py +6 -5
  12. airbyte_cdk/sources/declarative/requesters/request_option.py +83 -4
  13. airbyte_cdk/sources/declarative/requesters/request_options/datetime_based_request_options_provider.py +7 -6
  14. airbyte_cdk/sources/declarative/retrievers/simple_retriever.py +4 -1
  15. airbyte_cdk/sources/streams/call_rate.py +71 -84
  16. airbyte_cdk/utils/mapping_helpers.py +86 -27
  17. {airbyte_cdk-6.33.0.dev0.dist-info → airbyte_cdk-6.33.1.dist-info}/METADATA +1 -1
  18. {airbyte_cdk-6.33.0.dev0.dist-info → airbyte_cdk-6.33.1.dist-info}/RECORD +22 -22
  19. {airbyte_cdk-6.33.0.dev0.dist-info → airbyte_cdk-6.33.1.dist-info}/LICENSE.txt +0 -0
  20. {airbyte_cdk-6.33.0.dev0.dist-info → airbyte_cdk-6.33.1.dist-info}/LICENSE_SHORT +0 -0
  21. {airbyte_cdk-6.33.0.dev0.dist-info → airbyte_cdk-6.33.1.dist-info}/WHEEL +0 -0
  22. {airbyte_cdk-6.33.0.dev0.dist-info → airbyte_cdk-6.33.1.dist-info}/entry_points.txt +0 -0
@@ -128,6 +128,9 @@ class SimpleRetriever(Retriever):
128
128
  Returned merged mapping otherwise
129
129
  """
130
130
  # FIXME we should eventually remove the usage of stream_state as part of the interpolation
131
+
132
+ is_body_json = paginator_method.__name__ == "get_request_body_json"
133
+
131
134
  mappings = [
132
135
  paginator_method(
133
136
  stream_state=stream_state,
@@ -143,7 +146,7 @@ class SimpleRetriever(Retriever):
143
146
  next_page_token=next_page_token,
144
147
  )
145
148
  )
146
- return combine_mappings(mappings)
149
+ return combine_mappings(mappings, allow_same_value_merge=is_body_json)
147
150
 
148
151
  def _request_headers(
149
152
  self,
@@ -6,12 +6,10 @@ import abc
6
6
  import dataclasses
7
7
  import datetime
8
8
  import logging
9
- import re
10
9
  import time
11
- from dataclasses import InitVar, dataclass, field
12
10
  from datetime import timedelta
13
11
  from threading import RLock
14
- from typing import TYPE_CHECKING, Any, Mapping, Optional, Union
12
+ from typing import TYPE_CHECKING, Any, Mapping, Optional
15
13
  from urllib import parse
16
14
 
17
15
  import requests
@@ -100,55 +98,43 @@ class RequestMatcher(abc.ABC):
100
98
 
101
99
 
102
100
  class HttpRequestMatcher(RequestMatcher):
103
- """
104
- Extended RequestMatcher for HTTP requests that supports matching on:
105
- - HTTP method (case-insensitive)
106
- - URL base (scheme + netloc) optionally
107
- - URL path pattern (a regex applied to the path portion of the URL)
108
- - Query parameters (must be present)
109
- - Headers (header names compared case-insensitively)
110
- """
101
+ """Simple implementation of RequestMatcher for http requests case"""
111
102
 
112
103
  def __init__(
113
104
  self,
114
105
  method: Optional[str] = None,
115
- url_base: Optional[str] = None,
116
- url_path_pattern: Optional[str] = None,
106
+ url: Optional[str] = None,
117
107
  params: Optional[Mapping[str, Any]] = None,
118
108
  headers: Optional[Mapping[str, Any]] = None,
119
109
  ):
120
- """
121
- :param method: HTTP method (e.g. "GET", "POST"); compared case-insensitively.
122
- :param url_base: Base URL (scheme://host) that must match.
123
- :param url_path_pattern: A regex pattern that will be applied to the path portion of the URL.
124
- :param params: Dictionary of query parameters that must be present in the request.
125
- :param headers: Dictionary of headers that must be present (header keys are compared case-insensitively).
126
- """
127
- self._method = method.upper() if method else None
128
-
129
- # Normalize the url_base if provided: remove trailing slash.
130
- self._url_base = url_base.rstrip("/") if url_base else None
131
-
132
- # Compile the URL path pattern if provided.
133
- self._url_path_pattern = re.compile(url_path_pattern) if url_path_pattern else None
110
+ """Constructor
134
111
 
135
- # Normalize query parameters to strings.
112
+ :param method:
113
+ :param url:
114
+ :param params:
115
+ :param headers:
116
+ """
117
+ self._method = method
118
+ self._url = url
136
119
  self._params = {str(k): str(v) for k, v in (params or {}).items()}
137
-
138
- # Normalize header keys to lowercase.
139
- self._headers = {str(k).lower(): str(v) for k, v in (headers or {}).items()}
120
+ self._headers = {str(k): str(v) for k, v in (headers or {}).items()}
140
121
 
141
122
  @staticmethod
142
123
  def _match_dict(obj: Mapping[str, Any], pattern: Mapping[str, Any]) -> bool:
143
- """Check that every key/value in the pattern exists in the object."""
124
+ """Check that all elements from pattern dict present and have the same values in obj dict
125
+
126
+ :param obj:
127
+ :param pattern:
128
+ :return:
129
+ """
144
130
  return pattern.items() <= obj.items()
145
131
 
146
132
  def __call__(self, request: Any) -> bool:
147
133
  """
148
- :param request: A requests.Request or requests.PreparedRequest instance.
149
- :return: True if the request matches all provided criteria; False otherwise.
134
+
135
+ :param request:
136
+ :return: True if matches the provided request object, False - otherwise
150
137
  """
151
- # Prepare the request (if needed) and extract the URL details.
152
138
  if isinstance(request, requests.Request):
153
139
  prepared_request = request.prepare()
154
140
  elif isinstance(request, requests.PreparedRequest):
@@ -156,40 +142,21 @@ class HttpRequestMatcher(RequestMatcher):
156
142
  else:
157
143
  return False
158
144
 
159
- # Check HTTP method.
160
- if self._method is not None and prepared_request.method is not None:
161
- if prepared_request.method.upper() != self._method:
145
+ if self._method is not None:
146
+ if prepared_request.method != self._method:
162
147
  return False
163
-
164
- # Parse the URL.
165
- parsed_url = parse.urlsplit(prepared_request.url)
166
- # Reconstruct the base: scheme://netloc
167
- request_url_base = f"{str(parsed_url.scheme)}://{str(parsed_url.netloc)}"
168
- # The path (without query parameters)
169
- request_path = str(parsed_url.path).rstrip("/")
170
-
171
- # If a base URL is provided, check that it matches.
172
- if self._url_base is not None:
173
- if request_url_base != self._url_base:
148
+ if self._url is not None and prepared_request.url is not None:
149
+ url_without_params = prepared_request.url.split("?")[0]
150
+ if url_without_params != self._url:
174
151
  return False
175
-
176
- # If a URL path pattern is provided, ensure the path matches the regex.
177
- if self._url_path_pattern is not None:
178
- if not self._url_path_pattern.search(request_path):
152
+ if self._params is not None:
153
+ parsed_url = parse.urlsplit(prepared_request.url)
154
+ params = dict(parse.parse_qsl(str(parsed_url.query)))
155
+ if not self._match_dict(params, self._params):
179
156
  return False
180
-
181
- # Check query parameters.
182
- if self._params:
183
- query_params = dict(parse.parse_qsl(str(parsed_url.query)))
184
- if not self._match_dict(query_params, self._params):
157
+ if self._headers is not None:
158
+ if not self._match_dict(prepared_request.headers, self._headers):
185
159
  return False
186
-
187
- # Check headers (normalize keys to lower-case).
188
- if self._headers:
189
- req_headers = {k.lower(): v for k, v in prepared_request.headers.items()}
190
- if not self._match_dict(req_headers, self._headers):
191
- return False
192
-
193
160
  return True
194
161
 
195
162
 
@@ -432,17 +399,24 @@ class AbstractAPIBudget(abc.ABC):
432
399
  """
433
400
 
434
401
 
435
- @dataclass
436
402
  class APIBudget(AbstractAPIBudget):
437
- """
438
- Default APIBudget implementation.
439
- """
403
+ """Default APIBudget implementation"""
404
+
405
+ def __init__(
406
+ self, policies: list[AbstractCallRatePolicy], maximum_attempts_to_acquire: int = 100000
407
+ ) -> None:
408
+ """Constructor
440
409
 
441
- policies: list[AbstractCallRatePolicy]
442
- maximum_attempts_to_acquire: int = 100000
410
+ :param policies: list of policies in this budget
411
+ :param maximum_attempts_to_acquire: number of attempts before throwing hit ratelimit exception, we put some big number here
412
+ to avoid situations when many threads compete with each other for a few lots over a significant amount of time
413
+ """
414
+
415
+ self._policies = policies
416
+ self._maximum_attempts_to_acquire = maximum_attempts_to_acquire
443
417
 
444
418
  def get_matching_policy(self, request: Any) -> Optional[AbstractCallRatePolicy]:
445
- for policy in self.policies:
419
+ for policy in self._policies:
446
420
  if policy.matches(request):
447
421
  return policy
448
422
  return None
@@ -463,7 +437,7 @@ class APIBudget(AbstractAPIBudget):
463
437
  policy = self.get_matching_policy(request)
464
438
  if policy:
465
439
  self._do_acquire(request=request, policy=policy, block=block, timeout=timeout)
466
- elif self.policies:
440
+ elif self._policies:
467
441
  logger.info("no policies matched with requests, allow call by default")
468
442
 
469
443
  def update_from_response(self, request: Any, response: Any) -> None:
@@ -486,7 +460,7 @@ class APIBudget(AbstractAPIBudget):
486
460
  """
487
461
  last_exception = None
488
462
  # sometimes we spend all budget before a second attempt, so we have few more here
489
- for attempt in range(1, self.maximum_attempts_to_acquire):
463
+ for attempt in range(1, self._maximum_attempts_to_acquire):
490
464
  try:
491
465
  policy.try_acquire(request, weight=1)
492
466
  return
@@ -510,18 +484,31 @@ class APIBudget(AbstractAPIBudget):
510
484
 
511
485
  if last_exception:
512
486
  logger.info(
513
- "we used all %s attempts to acquire and failed", self.maximum_attempts_to_acquire
487
+ "we used all %s attempts to acquire and failed", self._maximum_attempts_to_acquire
514
488
  )
515
489
  raise last_exception
516
490
 
517
491
 
518
- @dataclass
519
492
  class HttpAPIBudget(APIBudget):
520
493
  """Implementation of AbstractAPIBudget for HTTP"""
521
494
 
522
- ratelimit_reset_header: str = "ratelimit-reset"
523
- ratelimit_remaining_header: str = "ratelimit-remaining"
524
- status_codes_for_ratelimit_hit: Union[tuple[int], list[int]] = (429,)
495
+ def __init__(
496
+ self,
497
+ ratelimit_reset_header: str = "ratelimit-reset",
498
+ ratelimit_remaining_header: str = "ratelimit-remaining",
499
+ status_codes_for_ratelimit_hit: tuple[int] = (429,),
500
+ **kwargs: Any,
501
+ ):
502
+ """Constructor
503
+
504
+ :param ratelimit_reset_header: name of the header that has a timestamp of the next reset of call budget
505
+ :param ratelimit_remaining_header: name of the header that has the number of calls left
506
+ :param status_codes_for_ratelimit_hit: list of HTTP status codes that signal about rate limit being hit
507
+ """
508
+ self._ratelimit_reset_header = ratelimit_reset_header
509
+ self._ratelimit_remaining_header = ratelimit_remaining_header
510
+ self._status_codes_for_ratelimit_hit = status_codes_for_ratelimit_hit
511
+ super().__init__(**kwargs)
525
512
 
526
513
  def update_from_response(self, request: Any, response: Any) -> None:
527
514
  policy = self.get_matching_policy(request)
@@ -536,17 +523,17 @@ class HttpAPIBudget(APIBudget):
536
523
  def get_reset_ts_from_response(
537
524
  self, response: requests.Response
538
525
  ) -> Optional[datetime.datetime]:
539
- if response.headers.get(self.ratelimit_reset_header):
526
+ if response.headers.get(self._ratelimit_reset_header):
540
527
  return datetime.datetime.fromtimestamp(
541
- int(response.headers[self.ratelimit_reset_header])
528
+ int(response.headers[self._ratelimit_reset_header])
542
529
  )
543
530
  return None
544
531
 
545
532
  def get_calls_left_from_response(self, response: requests.Response) -> Optional[int]:
546
- if response.headers.get(self.ratelimit_remaining_header):
547
- return int(response.headers[self.ratelimit_remaining_header])
533
+ if response.headers.get(self._ratelimit_remaining_header):
534
+ return int(response.headers[self._ratelimit_remaining_header])
548
535
 
549
- if response.status_code in self.status_codes_for_ratelimit_hit:
536
+ if response.status_code in self._status_codes_for_ratelimit_hit:
550
537
  return 0
551
538
 
552
539
  return None
@@ -3,43 +3,102 @@
3
3
  #
4
4
 
5
5
 
6
- from typing import Any, List, Mapping, Optional, Set, Union
6
+ import copy
7
+ from typing import Any, Dict, List, Mapping, Optional, Union
8
+
9
+
10
+ def _merge_mappings(
11
+ target: Dict[str, Any],
12
+ source: Mapping[str, Any],
13
+ path: Optional[List[str]] = None,
14
+ allow_same_value_merge: bool = False,
15
+ ) -> None:
16
+ """
17
+ Recursively merge two dictionaries, raising an error if there are any conflicts.
18
+ For body_json requests (allow_same_value_merge=True), a conflict occurs only when the same path has different values.
19
+ For other request types (allow_same_value_merge=False), any duplicate key is a conflict, regardless of value.
20
+
21
+ Args:
22
+ target: The dictionary to merge into
23
+ source: The dictionary to merge from
24
+ path: The current path in the nested structure (for error messages)
25
+ allow_same_value_merge: Whether to allow merging the same value into the same key. Set to false by default, should only be true for body_json injections
26
+ """
27
+ path = path or []
28
+ for key, source_value in source.items():
29
+ current_path = path + [str(key)]
30
+
31
+ if key in target:
32
+ target_value = target[key]
33
+ if isinstance(target_value, dict) and isinstance(source_value, dict):
34
+ # Only body_json supports nested_structures
35
+ if not allow_same_value_merge:
36
+ raise ValueError(f"Duplicate keys found: {'.'.join(current_path)}")
37
+ # If both are dictionaries, recursively merge them
38
+ _merge_mappings(target_value, source_value, current_path, allow_same_value_merge)
39
+
40
+ elif not allow_same_value_merge or target_value != source_value:
41
+ # If same key has different values, that's a conflict
42
+ raise ValueError(f"Duplicate keys found: {'.'.join(current_path)}")
43
+ else:
44
+ # No conflict, just copy the value (using deepcopy for nested structures)
45
+ target[key] = copy.deepcopy(source_value)
7
46
 
8
47
 
9
48
  def combine_mappings(
10
49
  mappings: List[Optional[Union[Mapping[str, Any], str]]],
50
+ allow_same_value_merge: bool = False,
11
51
  ) -> Union[Mapping[str, Any], str]:
12
52
  """
13
- Combine multiple mappings into a single mapping. If any of the mappings are a string, return
14
- that string. Raise errors in the following cases:
15
- * If there are duplicate keys across mappings
16
- * If there are multiple string mappings
17
- * If there are multiple mappings containing keys and one of them is a string
53
+ Combine multiple mappings into a single mapping.
54
+
55
+ For body_json requests (allow_same_value_merge=True):
56
+ - Supports nested structures (e.g., {"data": {"user": {"id": 1}}})
57
+ - Allows duplicate keys if their values match
58
+ - Raises error if same path has different values
59
+
60
+ For other request types (allow_same_value_merge=False):
61
+ - Only supports flat structures
62
+ - Any duplicate key raises an error, regardless of value
63
+
64
+ Args:
65
+ mappings: List of mappings to combine
66
+ allow_same_value_merge: Whether to allow duplicate keys with matching values.
67
+ Should only be True for body_json requests.
68
+
69
+ Returns:
70
+ A single mapping combining all inputs, or a string if there is exactly one
71
+ string mapping and no other non-empty mappings.
72
+
73
+ Raises:
74
+ ValueError: If there are:
75
+ - Multiple string mappings
76
+ - Both a string mapping and non-empty dictionary mappings
77
+ - Conflicting keys/paths based on allow_same_value_merge setting
18
78
  """
19
- all_keys: List[Set[str]] = []
20
- for part in mappings:
21
- if part is None:
22
- continue
23
- keys = set(part.keys()) if not isinstance(part, str) else set()
24
- all_keys.append(keys)
25
-
26
- string_options = sum(isinstance(mapping, str) for mapping in mappings)
27
- # If more than one mapping is a string, raise a ValueError
79
+ if not mappings:
80
+ return {}
81
+
82
+ # Count how many string options we have, ignoring None values
83
+ string_options = sum(isinstance(mapping, str) for mapping in mappings if mapping is not None)
28
84
  if string_options > 1:
29
85
  raise ValueError("Cannot combine multiple string options")
30
86
 
31
- if string_options == 1 and sum(len(keys) for keys in all_keys) > 0:
32
- raise ValueError("Cannot combine multiple options if one is a string")
87
+ # Filter out None values and empty mappings
88
+ non_empty_mappings = [
89
+ m for m in mappings if m is not None and not (isinstance(m, Mapping) and not m)
90
+ ]
33
91
 
34
- # If any mapping is a string, return it
35
- for mapping in mappings:
36
- if isinstance(mapping, str):
37
- return mapping
92
+ # If there is only one string option and no other non-empty mappings, return it
93
+ if string_options == 1:
94
+ if len(non_empty_mappings) > 1:
95
+ raise ValueError("Cannot combine multiple options if one is a string")
96
+ return next(m for m in non_empty_mappings if isinstance(m, str))
38
97
 
39
- # If there are duplicate keys across mappings, raise a ValueError
40
- intersection = set().union(*all_keys)
41
- if len(intersection) < sum(len(keys) for keys in all_keys):
42
- raise ValueError(f"Duplicate keys found: {intersection}")
98
+ # Start with an empty result and merge each mapping into it
99
+ result: Dict[str, Any] = {}
100
+ for mapping in non_empty_mappings:
101
+ if mapping and isinstance(mapping, Mapping):
102
+ _merge_mappings(result, mapping, allow_same_value_merge=allow_same_value_merge)
43
103
 
44
- # Return the combined mappings
45
- return {key: value for mapping in mappings if mapping for key, value in mapping.items()} # type: ignore # mapping can't be string here
104
+ return result
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: airbyte-cdk
3
- Version: 6.33.0.dev0
3
+ Version: 6.33.1
4
4
  Summary: A framework for writing Airbyte Connectors.
5
5
  Home-page: https://airbyte.com
6
6
  License: MIT
@@ -55,7 +55,7 @@ airbyte_cdk/sources/declarative/auth/declarative_authenticator.py,sha256=nf-OmRU
55
55
  airbyte_cdk/sources/declarative/auth/jwt.py,sha256=SICqNsN2Cn_EgKadIgWuZpQxuMHyzrMZD_2-Uwy10rY,8539
56
56
  airbyte_cdk/sources/declarative/auth/oauth.py,sha256=fibXa-dqtM54jIUscWbz7DEA5uY6F2o1LfARjEeGRy0,13926
57
57
  airbyte_cdk/sources/declarative/auth/selective_authenticator.py,sha256=qGwC6YsCldr1bIeKG6Qo-A9a5cTdHw-vcOn3OtQrS4c,1540
58
- airbyte_cdk/sources/declarative/auth/token.py,sha256=r4u3WXyVa7WmiSZ9-eZXlrUI-pS0D4YWJnwjLzwV-Fk,11210
58
+ airbyte_cdk/sources/declarative/auth/token.py,sha256=2EnE78EhBOY9hbeZnQJ9AuFaM-G7dccU-oKo_LThRQk,11070
59
59
  airbyte_cdk/sources/declarative/auth/token_provider.py,sha256=9CuSsmOoHkvlc4k-oZ3Jx5luAgfTMm1I_5HOZxw7wMU,3075
60
60
  airbyte_cdk/sources/declarative/checks/__init__.py,sha256=nsVV5Bo0E_tBNd8A4Xdsdb-75PpcLo5RQu2RQ_Gv-ME,806
61
61
  airbyte_cdk/sources/declarative/checks/check_dynamic_stream.py,sha256=HUktywjI8pqOeED08UGqponUSwxs2TOAECTowlWlrRE,2138
@@ -63,11 +63,11 @@ airbyte_cdk/sources/declarative/checks/check_stream.py,sha256=dAA-UhmMj0WLXCkRQr
63
63
  airbyte_cdk/sources/declarative/checks/connection_checker.py,sha256=MBRJo6WJlZQHpIfOGaNOkkHUmgUl_4wDM6VPo41z5Ss,1383
64
64
  airbyte_cdk/sources/declarative/concurrency_level/__init__.py,sha256=5XUqrmlstYlMM0j6crktlKQwALek0uiz2D3WdM46MyA,191
65
65
  airbyte_cdk/sources/declarative/concurrency_level/concurrency_level.py,sha256=YIwCTCpOr_QSNW4ltQK0yUGWInI8PKNY216HOOegYLk,2101
66
- airbyte_cdk/sources/declarative/concurrent_declarative_source.py,sha256=x5a_Wv0chLAo2knBg-yQZoo5zUyfDsOuF4tEz3oHehc,27421
66
+ airbyte_cdk/sources/declarative/concurrent_declarative_source.py,sha256=7uqf_zQd2T08AYdMDJ80Zt0W1QHqZd-dvltXC-3g8W4,28136
67
67
  airbyte_cdk/sources/declarative/datetime/__init__.py,sha256=l9LG7Qm6e5r_qgqfVKnx3mXYtg1I9MmMjomVIPfU4XA,177
68
68
  airbyte_cdk/sources/declarative/datetime/datetime_parser.py,sha256=SX9JjdesN1edN2WVUVMzU_ptqp2QB1OnsnjZ4mwcX7w,2579
69
69
  airbyte_cdk/sources/declarative/datetime/min_max_datetime.py,sha256=0BHBtDNQZfvwM45-tY5pNlTcKAFSGGNxemoi0Jic-0E,5785
70
- airbyte_cdk/sources/declarative/declarative_component_schema.yaml,sha256=MOzhkZUsmcFiSP1ES_eEQyAta_ms5zG5IEA9XwooR8M,147035
70
+ airbyte_cdk/sources/declarative/declarative_component_schema.yaml,sha256=51R-WLE1Xhrk57DoiHFxWZSP8V9HtCEi1UE8_KtEOuM,140375
71
71
  airbyte_cdk/sources/declarative/declarative_source.py,sha256=nF7wBqFd3AQmEKAm4CnIo29CJoQL562cJGSCeL8U8bA,1531
72
72
  airbyte_cdk/sources/declarative/declarative_stream.py,sha256=venZjfpvtqr3oFSuvMBWtn4h9ayLhD4L65ACuXCDZ64,10445
73
73
  airbyte_cdk/sources/declarative/decoders/__init__.py,sha256=KSpQetKGqPCv-38QgcVJ5kzM5nzbFldTSsYDCS3Xf0Y,1035
@@ -89,7 +89,7 @@ airbyte_cdk/sources/declarative/extractors/response_to_file_extractor.py,sha256=
89
89
  airbyte_cdk/sources/declarative/extractors/type_transformer.py,sha256=d6Y2Rfg8pMVEEnHllfVksWZdNVOU55yk34O03dP9muY,1626
90
90
  airbyte_cdk/sources/declarative/incremental/__init__.py,sha256=U1oZKtBaEC6IACmvziY9Wzg7Z8EgF4ZuR7NwvjlB_Sk,1255
91
91
  airbyte_cdk/sources/declarative/incremental/concurrent_partition_cursor.py,sha256=5dbO47TFmC5Oz8TZ8DKXwXeZElz70xy2v2HJlZr5qVs,17751
92
- airbyte_cdk/sources/declarative/incremental/datetime_based_cursor.py,sha256=_UzUnSIUsDbRgbFTXgSyZEFb4ws-KdhdQPWO8mFbV7U,22028
92
+ airbyte_cdk/sources/declarative/incremental/datetime_based_cursor.py,sha256=5Bl_2EeA4as0e3J23Yxp8Q8BXzh0nJ2NcGSgj3V0h2o,21954
93
93
  airbyte_cdk/sources/declarative/incremental/declarative_cursor.py,sha256=5Bhw9VRPyIuCaD0wmmq_L3DZsa-rJgtKSEUzSd8YYD0,536
94
94
  airbyte_cdk/sources/declarative/incremental/global_substream_cursor.py,sha256=9HO-QbL9akvjq2NP7l498RwLA4iQZlBMQW1tZbt34I8,15943
95
95
  airbyte_cdk/sources/declarative/incremental/per_partition_cursor.py,sha256=9IAJTCiRUXvhFFz-IhZtYh_KfAjLHqthsYf2jErQRls,17728
@@ -104,25 +104,25 @@ airbyte_cdk/sources/declarative/interpolation/interpolated_string.py,sha256=LYEZ
104
104
  airbyte_cdk/sources/declarative/interpolation/interpolation.py,sha256=-V5UddGm69UKEB6o_O1EIES9kfY8FV_X4Ji8w1yOuSA,981
105
105
  airbyte_cdk/sources/declarative/interpolation/jinja.py,sha256=BtsY_jtT4MihFqeQgc05HXj3Ndt-e2ESQgGwbg3Sdxc,6430
106
106
  airbyte_cdk/sources/declarative/interpolation/macros.py,sha256=Y5AWYxbJTUtJ_Jm7DV9qrZDiymFR9LST7fBt4piT2-U,4585
107
- airbyte_cdk/sources/declarative/manifest_declarative_source.py,sha256=TN6GCgLXaWDONTaJwQ3A5ELqC-sxwKz-UYSraJYB-dI,17078
107
+ airbyte_cdk/sources/declarative/manifest_declarative_source.py,sha256=26qMXRugdPAd3zyYRH6YpNi--TorGZVOtxzY5O6muL0,16912
108
108
  airbyte_cdk/sources/declarative/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
109
109
  airbyte_cdk/sources/declarative/migrations/legacy_to_per_partition_state_migration.py,sha256=iemy3fKLczcU0-Aor7tx5jcT6DRedKMqyK7kCOp01hg,3924
110
110
  airbyte_cdk/sources/declarative/migrations/state_migration.py,sha256=KWPjealMLKSMtajXgkdGgKg7EmTLR-CqqD7UIh0-eDU,794
111
111
  airbyte_cdk/sources/declarative/models/__init__.py,sha256=nUFxNCiKeYRVXuZEKA7GD-lTHxsiKcQ8FitZjKhPIvE,100
112
- airbyte_cdk/sources/declarative/models/declarative_component_schema.py,sha256=gRRQoZ4VAuyxtBALvHQnGMF9rOLgPSLSBp0yzWW-w4Y,103695
112
+ airbyte_cdk/sources/declarative/models/declarative_component_schema.py,sha256=7qzq5ZV3V90uYRMa_-CGTbJ7aVv5jyPqGGjpJb9zdHk,98706
113
113
  airbyte_cdk/sources/declarative/parsers/__init__.py,sha256=ZnqYNxHsKCgO38IwB34RQyRMXTs4GTvlRi3ImKnIioo,61
114
114
  airbyte_cdk/sources/declarative/parsers/custom_code_compiler.py,sha256=958MMX6_ZOJUlDDdNr9Krosgi2bCKGx2Z765M2Woz18,5505
115
115
  airbyte_cdk/sources/declarative/parsers/custom_exceptions.py,sha256=Rir9_z3Kcd5Es0-LChrzk-0qubAsiK_RSEnLmK2OXm8,553
116
116
  airbyte_cdk/sources/declarative/parsers/manifest_component_transformer.py,sha256=CXwTfD3wSQq3okcqwigpprbHhSURUokh4GK2OmOyKC8,9132
117
117
  airbyte_cdk/sources/declarative/parsers/manifest_reference_resolver.py,sha256=IWUOdF03o-aQn0Occo1BJCxU0Pz-QILk5L67nzw2thw,6803
118
- airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py,sha256=ee3BYsYxpGH3D6fLb8BWpGG1HFHcAgFRsCJXUO98nbA,134255
118
+ airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py,sha256=_BXGXZ6RP3m9KYk3NxhBQgYzrqAwud1gWTie204dUhY,128424
119
119
  airbyte_cdk/sources/declarative/partition_routers/__init__.py,sha256=HJ-Syp3p7RpyR_OK0X_a2kSyISfu3W-PKrRI16iY0a8,957
120
120
  airbyte_cdk/sources/declarative/partition_routers/async_job_partition_router.py,sha256=VelO7zKqKtzMJ35jyFeg0ypJLQC0plqqIBNXoBW1G2E,3001
121
121
  airbyte_cdk/sources/declarative/partition_routers/cartesian_product_stream_slicer.py,sha256=c5cuVFM6NFkuQqG8Z5IwkBuwDrvXZN1CunUOM_L0ezg,6892
122
- airbyte_cdk/sources/declarative/partition_routers/list_partition_router.py,sha256=t7pRdFWfFWJtQQG19c9PVeMODyO2BknRTakpM5U9N-8,4844
122
+ airbyte_cdk/sources/declarative/partition_routers/list_partition_router.py,sha256=tmGGpMoOBmaMfhVZq53AEWxoHm2lmNVi6hA2_IVEnAA,4882
123
123
  airbyte_cdk/sources/declarative/partition_routers/partition_router.py,sha256=YyEIzdmLd1FjbVP3QbQ2VFCLW_P-OGbVh6VpZShp54k,2218
124
124
  airbyte_cdk/sources/declarative/partition_routers/single_partition_router.py,sha256=SKzKjSyfccq4dxGIh-J6ejrgkCHzaiTIazmbmeQiRD4,1942
125
- airbyte_cdk/sources/declarative/partition_routers/substream_partition_router.py,sha256=pEz-P6D5TGtP4isNfmtakgKD95PqMLo6fasCVLIguWk,16760
125
+ airbyte_cdk/sources/declarative/partition_routers/substream_partition_router.py,sha256=LlWj-Ofs-xfjlqmDzH8OYpyblP2Pb8bPDdR9g1UZyt0,17693
126
126
  airbyte_cdk/sources/declarative/requesters/README.md,sha256=eL1I4iLkxaw7hJi9S9d18_XcRl-R8lUSjqBVJJzvXmg,2656
127
127
  airbyte_cdk/sources/declarative/requesters/__init__.py,sha256=d7a3OoHbqaJDyyPli3nqqJ2yAW_SLX6XDaBAKOwvpxw,364
128
128
  airbyte_cdk/sources/declarative/requesters/error_handlers/__init__.py,sha256=SkEDcJxlT1683rNx93K9whoS0OyUukkuOfToGtgpF58,776
@@ -139,9 +139,9 @@ airbyte_cdk/sources/declarative/requesters/error_handlers/default_http_response_
139
139
  airbyte_cdk/sources/declarative/requesters/error_handlers/error_handler.py,sha256=Tan66odx8VHzfdyyXMQkXz2pJYksllGqvxmpoajgcK4,669
140
140
  airbyte_cdk/sources/declarative/requesters/error_handlers/http_response_filter.py,sha256=E-fQbt4ShfxZVoqfnmOx69C6FUPWZz8BIqI3DN9Kcjs,7935
141
141
  airbyte_cdk/sources/declarative/requesters/http_job_repository.py,sha256=3GtOefPH08evlSUxaILkiKLTHbIspFY4qd5B3ZqNE60,10063
142
- airbyte_cdk/sources/declarative/requesters/http_requester.py,sha256=F1lydK00pbImprvauxzsFiy_IpQI59iErqtuf2vES1Q,14866
142
+ airbyte_cdk/sources/declarative/requesters/http_requester.py,sha256=C6YT7t4UZMfarFeQ9fc362R5TbQ2jNSew8ESP-9yuZQ,14851
143
143
  airbyte_cdk/sources/declarative/requesters/paginators/__init__.py,sha256=uArbKs9JKNCt7t9tZoeWwjDpyI1HoPp29FNW0JzvaEM,644
144
- airbyte_cdk/sources/declarative/requesters/paginators/default_paginator.py,sha256=FnSl3qPvv5wD6ieAI2Ic5c4dqBk-3fRe4tCaWzq3YwM,11840
144
+ airbyte_cdk/sources/declarative/requesters/paginators/default_paginator.py,sha256=dSm_pKGOZjzvg-X_Vif-MjrnlUG23fCa69bocq8dVIs,11693
145
145
  airbyte_cdk/sources/declarative/requesters/paginators/no_pagination.py,sha256=j6j9QRPaTbKQ2N661RFVKthhkWiodEp6ut0tKeEd0Ng,2019
146
146
  airbyte_cdk/sources/declarative/requesters/paginators/paginator.py,sha256=OlN-y0PEOMzlUNUh3pzonoTpIJpGwkP4ibFengvpLVU,2230
147
147
  airbyte_cdk/sources/declarative/requesters/paginators/strategies/__init__.py,sha256=2gly8fuZpDNwtu1Qg6oE2jBLGqQRdzSLJdnpk_iDV6I,767
@@ -150,9 +150,9 @@ airbyte_cdk/sources/declarative/requesters/paginators/strategies/offset_incremen
150
150
  airbyte_cdk/sources/declarative/requesters/paginators/strategies/page_increment.py,sha256=Z2i6a-oKMmOTxHxsTVSnyaShkJ3u8xZw1xIJdx2yxss,2731
151
151
  airbyte_cdk/sources/declarative/requesters/paginators/strategies/pagination_strategy.py,sha256=ZBshGQNr5Bb_V8dqnWRISqdXFcjm1CKIXnlfbRhNl8g,1308
152
152
  airbyte_cdk/sources/declarative/requesters/paginators/strategies/stop_condition.py,sha256=LoKXdUbSgHEtSwtA8DFrnX6SpQbRVVwreY8NguTKTcI,2229
153
- airbyte_cdk/sources/declarative/requesters/request_option.py,sha256=_qmv8CLQQ3fERt6BuMZeRu6tZXscPoeARx1VJdWMQ_M,1055
153
+ airbyte_cdk/sources/declarative/requesters/request_option.py,sha256=Bl0gxGWudmwT3FXBozTN00WYle2jd6ry_S1YylCnwqM,4825
154
154
  airbyte_cdk/sources/declarative/requesters/request_options/__init__.py,sha256=WCwpKqM4wKqy-DHJaCHbKAlFqRVOqMi9K5qonxIfi_Y,809
155
- airbyte_cdk/sources/declarative/requesters/request_options/datetime_based_request_options_provider.py,sha256=FLkg0uzC9bc-zFnALWr0FLYpKsz8iK2xQsd4UOyeW08,3706
155
+ airbyte_cdk/sources/declarative/requesters/request_options/datetime_based_request_options_provider.py,sha256=31nG6_0igidJFQon37-WeQkTpG3g2A5ZmlluI3ilZdE,3632
156
156
  airbyte_cdk/sources/declarative/requesters/request_options/default_request_options_provider.py,sha256=SRROdPJZ5kuqHLOlkh115pWP9nDGfDxRYPgH9oD3hPo,1798
157
157
  airbyte_cdk/sources/declarative/requesters/request_options/interpolated_nested_request_input_provider.py,sha256=UW4cAtzkQ261AyLI1cmCL2WLdI3ZDYGUTmrqKB9W3u8,2422
158
158
  airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_input_provider.py,sha256=Vr2-qa8iHC0vJ4cCtPl7lAUlhrnl4lUuPLMSFrzxMIg,3024
@@ -167,7 +167,7 @@ airbyte_cdk/sources/declarative/resolvers/http_components_resolver.py,sha256=Aio
167
167
  airbyte_cdk/sources/declarative/retrievers/__init__.py,sha256=ix9m1dkR69DcXCXUKC5RK_ZZM7ojTLBQ4IkWQTfmfCk,456
168
168
  airbyte_cdk/sources/declarative/retrievers/async_retriever.py,sha256=2oQn_vo7uJKp4pdMnsF5CG5Iwc9rkPeEOLoAm_9bcus,3222
169
169
  airbyte_cdk/sources/declarative/retrievers/retriever.py,sha256=XPLs593Xv8c5cKMc37XzUAYmzlXd1a7eSsspM-CMuWA,1696
170
- airbyte_cdk/sources/declarative/retrievers/simple_retriever.py,sha256=kgnhVQxRlFqJs2-rDu2-QH-p-GzQU3nKmSp6_aq8u0s,24550
170
+ airbyte_cdk/sources/declarative/retrievers/simple_retriever.py,sha256=uvsBqSUimi85YfSjPuOUoAlewwtvaYwgsLg2EDcswLE,24665
171
171
  airbyte_cdk/sources/declarative/schema/__init__.py,sha256=xU45UvM5O4c1PSM13UHpCdh5hpW3HXy9vRRGEiAC1rg,795
172
172
  airbyte_cdk/sources/declarative/schema/default_schema_loader.py,sha256=KTACrIE23a83wsm3Rd9Eb4K6-20lrGqYxTHNp9yxsso,1820
173
173
  airbyte_cdk/sources/declarative/schema/dynamic_schema_loader.py,sha256=J8Q_iJYhcSQLWyt0bTZCbDAGpxt9G8FCc6Q9jtGsNzw,10703
@@ -249,7 +249,7 @@ airbyte_cdk/sources/message/repository.py,sha256=SG7avgti_-dj8FcRHTTrhgLLGJbElv1
249
249
  airbyte_cdk/sources/source.py,sha256=KIBBH5VLEb8BZ8B9aROlfaI6OLoJqKDPMJ10jkAR7nk,3611
250
250
  airbyte_cdk/sources/streams/__init__.py,sha256=8fzTKpRTnSx5PggXgQPKJzHNZUV2BCA40N-dI6JM1xI,256
251
251
  airbyte_cdk/sources/streams/availability_strategy.py,sha256=_RU4JITrxMEN36g1RDHMu0iSw0I_3yWGfo5N8_YRvOg,3247
252
- airbyte_cdk/sources/streams/call_rate.py,sha256=sf_AvWe6R_CqGkn1dnwQiDROBEvRESrPUv-zQeQ91Es,21779
252
+ airbyte_cdk/sources/streams/call_rate.py,sha256=Um_Ny8R7WZ2B0PWoxr-wrWPsgc5we7HrHalaMcozuVs,21052
253
253
  airbyte_cdk/sources/streams/checkpoint/__init__.py,sha256=3oy7Hd4ivVWTZlN6dKAf4Fv_G7U5iZrvhO9hT871UIo,712
254
254
  airbyte_cdk/sources/streams/checkpoint/checkpoint_reader.py,sha256=6HMT2NI-FQuaW0nt95NcyWrt5rZN4gF-Arx0sxdgbv4,15221
255
255
  airbyte_cdk/sources/streams/checkpoint/cursor.py,sha256=3e-3c-54k8U7Awno7DMmAD9ndbnl9OM48EnbEgeDUO0,3499
@@ -342,7 +342,7 @@ airbyte_cdk/utils/datetime_format_inferrer.py,sha256=Ne2cpk7Tx3eZDEW2Q3O7jnNOY9g
342
342
  airbyte_cdk/utils/datetime_helpers.py,sha256=8mqzZ67Or2PBp7tLtrhh6XFv4wFzYsjCL_DOQJRaftI,17751
343
343
  airbyte_cdk/utils/event_timing.py,sha256=aiuFmPU80buLlNdKq4fDTEqqhEIelHPF6AalFGwY8as,2557
344
344
  airbyte_cdk/utils/is_cloud_environment.py,sha256=DayV32Irh-SdnJ0MnjvstwCJ66_l5oEsd8l85rZtHoc,574
345
- airbyte_cdk/utils/mapping_helpers.py,sha256=H7BH-Yr8hSRG4W0zZcQ0ZzKOY5QFn8fNkGcEsE3xZN8,1736
345
+ airbyte_cdk/utils/mapping_helpers.py,sha256=4EOyUzNAGkq-M0QF5rPeBfT4v_eV7qBrEaAtsTH1k8Y,4309
346
346
  airbyte_cdk/utils/message_utils.py,sha256=OTzbkwN7AdMDA3iKYq1LKwfPFxpyEDfdgEF9BED3dkU,1366
347
347
  airbyte_cdk/utils/oneof_option_config.py,sha256=N8EmWdYdwt0FM7fuShh6H8nj_r4KEL9tb2DJJtwsPow,1180
348
348
  airbyte_cdk/utils/print_buffer.py,sha256=PhMOi0C4Z91kWKrSvCQXcp8qRh1uCimpIdvrg6voZIA,2810
@@ -351,9 +351,9 @@ airbyte_cdk/utils/slice_hasher.py,sha256=EDxgROHDbfG-QKQb59m7h_7crN1tRiawdf5uU7G
351
351
  airbyte_cdk/utils/spec_schema_transformations.py,sha256=-5HTuNsnDBAhj-oLeQXwpTGA0HdcjFOf2zTEMUTTg_Y,816
352
352
  airbyte_cdk/utils/stream_status_utils.py,sha256=ZmBoiy5HVbUEHAMrUONxZvxnvfV9CesmQJLDTAIWnWw,1171
353
353
  airbyte_cdk/utils/traced_exception.py,sha256=C8uIBuCL_E4WnBAOPSxBicD06JAldoN9fGsQDp463OY,6292
354
- airbyte_cdk-6.33.0.dev0.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
355
- airbyte_cdk-6.33.0.dev0.dist-info/LICENSE_SHORT,sha256=aqF6D1NcESmpn-cqsxBtszTEnHKnlsp8L4x9wAh3Nxg,55
356
- airbyte_cdk-6.33.0.dev0.dist-info/METADATA,sha256=U-Epy8I3SzZzuU46_xkRtIpomk90rBI5BSigUTU4Sa4,6015
357
- airbyte_cdk-6.33.0.dev0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
358
- airbyte_cdk-6.33.0.dev0.dist-info/entry_points.txt,sha256=fj-e3PAQvsxsQzyyq8UkG1k8spunWnD4BAH2AwlR6NM,95
359
- airbyte_cdk-6.33.0.dev0.dist-info/RECORD,,
354
+ airbyte_cdk-6.33.1.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
355
+ airbyte_cdk-6.33.1.dist-info/LICENSE_SHORT,sha256=aqF6D1NcESmpn-cqsxBtszTEnHKnlsp8L4x9wAh3Nxg,55
356
+ airbyte_cdk-6.33.1.dist-info/METADATA,sha256=OF2QwAsdOE8KWGY1XzCBoIA28Yu3GpJ41yNW-AlkNBE,6010
357
+ airbyte_cdk-6.33.1.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
358
+ airbyte_cdk-6.33.1.dist-info/entry_points.txt,sha256=fj-e3PAQvsxsQzyyq8UkG1k8spunWnD4BAH2AwlR6NM,95
359
+ airbyte_cdk-6.33.1.dist-info/RECORD,,