airbyte-cdk 6.33.0__py3-none-any.whl → 6.33.0.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 (22) hide show
  1. airbyte_cdk/sources/declarative/auth/token.py +8 -3
  2. airbyte_cdk/sources/declarative/concurrent_declarative_source.py +2 -13
  3. airbyte_cdk/sources/declarative/declarative_component_schema.yaml +212 -15
  4. airbyte_cdk/sources/declarative/incremental/datetime_based_cursor.py +6 -7
  5. airbyte_cdk/sources/declarative/manifest_declarative_source.py +4 -0
  6. airbyte_cdk/sources/declarative/models/declarative_component_schema.py +169 -10
  7. airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py +171 -34
  8. airbyte_cdk/sources/declarative/partition_routers/list_partition_router.py +2 -4
  9. airbyte_cdk/sources/declarative/partition_routers/substream_partition_router.py +9 -3
  10. airbyte_cdk/sources/declarative/requesters/http_requester.py +4 -5
  11. airbyte_cdk/sources/declarative/requesters/paginators/default_paginator.py +5 -6
  12. airbyte_cdk/sources/declarative/requesters/request_option.py +4 -83
  13. airbyte_cdk/sources/declarative/requesters/request_options/datetime_based_request_options_provider.py +6 -7
  14. airbyte_cdk/sources/declarative/retrievers/simple_retriever.py +1 -4
  15. airbyte_cdk/sources/streams/call_rate.py +84 -71
  16. airbyte_cdk/utils/mapping_helpers.py +27 -86
  17. {airbyte_cdk-6.33.0.dist-info → airbyte_cdk-6.33.0.dev0.dist-info}/METADATA +1 -1
  18. {airbyte_cdk-6.33.0.dist-info → airbyte_cdk-6.33.0.dev0.dist-info}/RECORD +22 -22
  19. {airbyte_cdk-6.33.0.dist-info → airbyte_cdk-6.33.0.dev0.dist-info}/LICENSE.txt +0 -0
  20. {airbyte_cdk-6.33.0.dist-info → airbyte_cdk-6.33.0.dev0.dist-info}/LICENSE_SHORT +0 -0
  21. {airbyte_cdk-6.33.0.dist-info → airbyte_cdk-6.33.0.dev0.dist-info}/WHEEL +0 -0
  22. {airbyte_cdk-6.33.0.dist-info → airbyte_cdk-6.33.0.dev0.dist-info}/entry_points.txt +0 -0
@@ -6,10 +6,12 @@ import abc
6
6
  import dataclasses
7
7
  import datetime
8
8
  import logging
9
+ import re
9
10
  import time
11
+ from dataclasses import InitVar, dataclass, field
10
12
  from datetime import timedelta
11
13
  from threading import RLock
12
- from typing import TYPE_CHECKING, Any, Mapping, Optional
14
+ from typing import TYPE_CHECKING, Any, Mapping, Optional, Union
13
15
  from urllib import parse
14
16
 
15
17
  import requests
@@ -98,43 +100,55 @@ class RequestMatcher(abc.ABC):
98
100
 
99
101
 
100
102
  class HttpRequestMatcher(RequestMatcher):
101
- """Simple implementation of RequestMatcher for http requests case"""
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
+ """
102
111
 
103
112
  def __init__(
104
113
  self,
105
114
  method: Optional[str] = None,
106
- url: Optional[str] = None,
115
+ url_base: Optional[str] = None,
116
+ url_path_pattern: Optional[str] = None,
107
117
  params: Optional[Mapping[str, Any]] = None,
108
118
  headers: Optional[Mapping[str, Any]] = None,
109
119
  ):
110
- """Constructor
111
-
112
- :param method:
113
- :param url:
114
- :param params:
115
- :param headers:
116
120
  """
117
- self._method = method
118
- self._url = url
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
134
+
135
+ # Normalize query parameters to strings.
119
136
  self._params = {str(k): str(v) for k, v in (params or {}).items()}
120
- self._headers = {str(k): str(v) for k, v in (headers or {}).items()}
137
+
138
+ # Normalize header keys to lowercase.
139
+ self._headers = {str(k).lower(): str(v) for k, v in (headers or {}).items()}
121
140
 
122
141
  @staticmethod
123
142
  def _match_dict(obj: Mapping[str, Any], pattern: Mapping[str, Any]) -> bool:
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
- """
143
+ """Check that every key/value in the pattern exists in the object."""
130
144
  return pattern.items() <= obj.items()
131
145
 
132
146
  def __call__(self, request: Any) -> bool:
133
147
  """
134
-
135
- :param request:
136
- :return: True if matches the provided request object, False - otherwise
148
+ :param request: A requests.Request or requests.PreparedRequest instance.
149
+ :return: True if the request matches all provided criteria; False otherwise.
137
150
  """
151
+ # Prepare the request (if needed) and extract the URL details.
138
152
  if isinstance(request, requests.Request):
139
153
  prepared_request = request.prepare()
140
154
  elif isinstance(request, requests.PreparedRequest):
@@ -142,21 +156,40 @@ class HttpRequestMatcher(RequestMatcher):
142
156
  else:
143
157
  return False
144
158
 
145
- if self._method is not None:
146
- if prepared_request.method != self._method:
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:
147
162
  return False
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:
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:
151
174
  return False
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):
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):
156
179
  return False
157
- if self._headers is not None:
158
- if not self._match_dict(prepared_request.headers, self._headers):
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):
159
185
  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
+
160
193
  return True
161
194
 
162
195
 
@@ -399,24 +432,17 @@ class AbstractAPIBudget(abc.ABC):
399
432
  """
400
433
 
401
434
 
435
+ @dataclass
402
436
  class APIBudget(AbstractAPIBudget):
403
- """Default APIBudget implementation"""
404
-
405
- def __init__(
406
- self, policies: list[AbstractCallRatePolicy], maximum_attempts_to_acquire: int = 100000
407
- ) -> None:
408
- """Constructor
409
-
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
- """
437
+ """
438
+ Default APIBudget implementation.
439
+ """
414
440
 
415
- self._policies = policies
416
- self._maximum_attempts_to_acquire = maximum_attempts_to_acquire
441
+ policies: list[AbstractCallRatePolicy]
442
+ maximum_attempts_to_acquire: int = 100000
417
443
 
418
444
  def get_matching_policy(self, request: Any) -> Optional[AbstractCallRatePolicy]:
419
- for policy in self._policies:
445
+ for policy in self.policies:
420
446
  if policy.matches(request):
421
447
  return policy
422
448
  return None
@@ -437,7 +463,7 @@ class APIBudget(AbstractAPIBudget):
437
463
  policy = self.get_matching_policy(request)
438
464
  if policy:
439
465
  self._do_acquire(request=request, policy=policy, block=block, timeout=timeout)
440
- elif self._policies:
466
+ elif self.policies:
441
467
  logger.info("no policies matched with requests, allow call by default")
442
468
 
443
469
  def update_from_response(self, request: Any, response: Any) -> None:
@@ -460,7 +486,7 @@ class APIBudget(AbstractAPIBudget):
460
486
  """
461
487
  last_exception = None
462
488
  # sometimes we spend all budget before a second attempt, so we have few more here
463
- for attempt in range(1, self._maximum_attempts_to_acquire):
489
+ for attempt in range(1, self.maximum_attempts_to_acquire):
464
490
  try:
465
491
  policy.try_acquire(request, weight=1)
466
492
  return
@@ -484,31 +510,18 @@ class APIBudget(AbstractAPIBudget):
484
510
 
485
511
  if last_exception:
486
512
  logger.info(
487
- "we used all %s attempts to acquire and failed", self._maximum_attempts_to_acquire
513
+ "we used all %s attempts to acquire and failed", self.maximum_attempts_to_acquire
488
514
  )
489
515
  raise last_exception
490
516
 
491
517
 
518
+ @dataclass
492
519
  class HttpAPIBudget(APIBudget):
493
520
  """Implementation of AbstractAPIBudget for HTTP"""
494
521
 
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)
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,)
512
525
 
513
526
  def update_from_response(self, request: Any, response: Any) -> None:
514
527
  policy = self.get_matching_policy(request)
@@ -523,17 +536,17 @@ class HttpAPIBudget(APIBudget):
523
536
  def get_reset_ts_from_response(
524
537
  self, response: requests.Response
525
538
  ) -> Optional[datetime.datetime]:
526
- if response.headers.get(self._ratelimit_reset_header):
539
+ if response.headers.get(self.ratelimit_reset_header):
527
540
  return datetime.datetime.fromtimestamp(
528
- int(response.headers[self._ratelimit_reset_header])
541
+ int(response.headers[self.ratelimit_reset_header])
529
542
  )
530
543
  return None
531
544
 
532
545
  def get_calls_left_from_response(self, response: requests.Response) -> Optional[int]:
533
- if response.headers.get(self._ratelimit_remaining_header):
534
- return int(response.headers[self._ratelimit_remaining_header])
546
+ if response.headers.get(self.ratelimit_remaining_header):
547
+ return int(response.headers[self.ratelimit_remaining_header])
535
548
 
536
- if response.status_code in self._status_codes_for_ratelimit_hit:
549
+ if response.status_code in self.status_codes_for_ratelimit_hit:
537
550
  return 0
538
551
 
539
552
  return None
@@ -3,102 +3,43 @@
3
3
  #
4
4
 
5
5
 
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)
6
+ from typing import Any, List, Mapping, Optional, Set, Union
46
7
 
47
8
 
48
9
  def combine_mappings(
49
10
  mappings: List[Optional[Union[Mapping[str, Any], str]]],
50
- allow_same_value_merge: bool = False,
51
11
  ) -> Union[Mapping[str, Any], str]:
52
12
  """
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
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
78
18
  """
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)
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
84
28
  if string_options > 1:
85
29
  raise ValueError("Cannot combine multiple string options")
86
30
 
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
- ]
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")
91
33
 
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))
34
+ # If any mapping is a string, return it
35
+ for mapping in mappings:
36
+ if isinstance(mapping, str):
37
+ return mapping
97
38
 
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)
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}")
103
43
 
104
- return result
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: airbyte-cdk
3
- Version: 6.33.0
3
+ Version: 6.33.0.dev0
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=2EnE78EhBOY9hbeZnQJ9AuFaM-G7dccU-oKo_LThRQk,11070
58
+ airbyte_cdk/sources/declarative/auth/token.py,sha256=r4u3WXyVa7WmiSZ9-eZXlrUI-pS0D4YWJnwjLzwV-Fk,11210
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=7uqf_zQd2T08AYdMDJ80Zt0W1QHqZd-dvltXC-3g8W4,28136
66
+ airbyte_cdk/sources/declarative/concurrent_declarative_source.py,sha256=x5a_Wv0chLAo2knBg-yQZoo5zUyfDsOuF4tEz3oHehc,27421
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=51R-WLE1Xhrk57DoiHFxWZSP8V9HtCEi1UE8_KtEOuM,140375
70
+ airbyte_cdk/sources/declarative/declarative_component_schema.yaml,sha256=MOzhkZUsmcFiSP1ES_eEQyAta_ms5zG5IEA9XwooR8M,147035
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=5Bl_2EeA4as0e3J23Yxp8Q8BXzh0nJ2NcGSgj3V0h2o,21954
92
+ airbyte_cdk/sources/declarative/incremental/datetime_based_cursor.py,sha256=_UzUnSIUsDbRgbFTXgSyZEFb4ws-KdhdQPWO8mFbV7U,22028
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=26qMXRugdPAd3zyYRH6YpNi--TorGZVOtxzY5O6muL0,16912
107
+ airbyte_cdk/sources/declarative/manifest_declarative_source.py,sha256=TN6GCgLXaWDONTaJwQ3A5ELqC-sxwKz-UYSraJYB-dI,17078
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=7qzq5ZV3V90uYRMa_-CGTbJ7aVv5jyPqGGjpJb9zdHk,98706
112
+ airbyte_cdk/sources/declarative/models/declarative_component_schema.py,sha256=gRRQoZ4VAuyxtBALvHQnGMF9rOLgPSLSBp0yzWW-w4Y,103695
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=_BXGXZ6RP3m9KYk3NxhBQgYzrqAwud1gWTie204dUhY,128424
118
+ airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py,sha256=ee3BYsYxpGH3D6fLb8BWpGG1HFHcAgFRsCJXUO98nbA,134255
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=tmGGpMoOBmaMfhVZq53AEWxoHm2lmNVi6hA2_IVEnAA,4882
122
+ airbyte_cdk/sources/declarative/partition_routers/list_partition_router.py,sha256=t7pRdFWfFWJtQQG19c9PVeMODyO2BknRTakpM5U9N-8,4844
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=sqNF8hPdDn7EUCB2-Y-8xtZFPO1ncVNrCsdPljdczJ8,16575
125
+ airbyte_cdk/sources/declarative/partition_routers/substream_partition_router.py,sha256=pEz-P6D5TGtP4isNfmtakgKD95PqMLo6fasCVLIguWk,16760
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=C6YT7t4UZMfarFeQ9fc362R5TbQ2jNSew8ESP-9yuZQ,14851
142
+ airbyte_cdk/sources/declarative/requesters/http_requester.py,sha256=F1lydK00pbImprvauxzsFiy_IpQI59iErqtuf2vES1Q,14866
143
143
  airbyte_cdk/sources/declarative/requesters/paginators/__init__.py,sha256=uArbKs9JKNCt7t9tZoeWwjDpyI1HoPp29FNW0JzvaEM,644
144
- airbyte_cdk/sources/declarative/requesters/paginators/default_paginator.py,sha256=dSm_pKGOZjzvg-X_Vif-MjrnlUG23fCa69bocq8dVIs,11693
144
+ airbyte_cdk/sources/declarative/requesters/paginators/default_paginator.py,sha256=FnSl3qPvv5wD6ieAI2Ic5c4dqBk-3fRe4tCaWzq3YwM,11840
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=Bl0gxGWudmwT3FXBozTN00WYle2jd6ry_S1YylCnwqM,4825
153
+ airbyte_cdk/sources/declarative/requesters/request_option.py,sha256=_qmv8CLQQ3fERt6BuMZeRu6tZXscPoeARx1VJdWMQ_M,1055
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=31nG6_0igidJFQon37-WeQkTpG3g2A5ZmlluI3ilZdE,3632
155
+ airbyte_cdk/sources/declarative/requesters/request_options/datetime_based_request_options_provider.py,sha256=FLkg0uzC9bc-zFnALWr0FLYpKsz8iK2xQsd4UOyeW08,3706
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=uvsBqSUimi85YfSjPuOUoAlewwtvaYwgsLg2EDcswLE,24665
170
+ airbyte_cdk/sources/declarative/retrievers/simple_retriever.py,sha256=kgnhVQxRlFqJs2-rDu2-QH-p-GzQU3nKmSp6_aq8u0s,24550
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=Um_Ny8R7WZ2B0PWoxr-wrWPsgc5we7HrHalaMcozuVs,21052
252
+ airbyte_cdk/sources/streams/call_rate.py,sha256=sf_AvWe6R_CqGkn1dnwQiDROBEvRESrPUv-zQeQ91Es,21779
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=4EOyUzNAGkq-M0QF5rPeBfT4v_eV7qBrEaAtsTH1k8Y,4309
345
+ airbyte_cdk/utils/mapping_helpers.py,sha256=H7BH-Yr8hSRG4W0zZcQ0ZzKOY5QFn8fNkGcEsE3xZN8,1736
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.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
355
- airbyte_cdk-6.33.0.dist-info/LICENSE_SHORT,sha256=aqF6D1NcESmpn-cqsxBtszTEnHKnlsp8L4x9wAh3Nxg,55
356
- airbyte_cdk-6.33.0.dist-info/METADATA,sha256=zem-s1VWtFeGuvTO6ohvvi687MVXqmQ_QrcRWM6KnAM,6010
357
- airbyte_cdk-6.33.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
358
- airbyte_cdk-6.33.0.dist-info/entry_points.txt,sha256=fj-e3PAQvsxsQzyyq8UkG1k8spunWnD4BAH2AwlR6NM,95
359
- airbyte_cdk-6.33.0.dist-info/RECORD,,
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,,