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.
- airbyte_cdk/sources/declarative/auth/token.py +8 -3
- airbyte_cdk/sources/declarative/concurrent_declarative_source.py +2 -13
- airbyte_cdk/sources/declarative/declarative_component_schema.yaml +212 -15
- airbyte_cdk/sources/declarative/incremental/datetime_based_cursor.py +6 -7
- airbyte_cdk/sources/declarative/manifest_declarative_source.py +4 -0
- airbyte_cdk/sources/declarative/models/declarative_component_schema.py +169 -10
- airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py +171 -34
- airbyte_cdk/sources/declarative/partition_routers/list_partition_router.py +2 -4
- airbyte_cdk/sources/declarative/partition_routers/substream_partition_router.py +9 -3
- airbyte_cdk/sources/declarative/requesters/http_requester.py +4 -5
- airbyte_cdk/sources/declarative/requesters/paginators/default_paginator.py +5 -6
- airbyte_cdk/sources/declarative/requesters/request_option.py +4 -83
- airbyte_cdk/sources/declarative/requesters/request_options/datetime_based_request_options_provider.py +6 -7
- airbyte_cdk/sources/declarative/retrievers/simple_retriever.py +1 -4
- airbyte_cdk/sources/streams/call_rate.py +84 -71
- airbyte_cdk/utils/mapping_helpers.py +27 -86
- {airbyte_cdk-6.33.0.dist-info → airbyte_cdk-6.33.0.dev0.dist-info}/METADATA +1 -1
- {airbyte_cdk-6.33.0.dist-info → airbyte_cdk-6.33.0.dev0.dist-info}/RECORD +22 -22
- {airbyte_cdk-6.33.0.dist-info → airbyte_cdk-6.33.0.dev0.dist-info}/LICENSE.txt +0 -0
- {airbyte_cdk-6.33.0.dist-info → airbyte_cdk-6.33.0.dev0.dist-info}/LICENSE_SHORT +0 -0
- {airbyte_cdk-6.33.0.dist-info → airbyte_cdk-6.33.0.dev0.dist-info}/WHEEL +0 -0
- {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
|
-
"""
|
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
|
-
|
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
|
-
|
118
|
-
|
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
|
-
|
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
|
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
|
-
:
|
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
|
-
|
146
|
-
|
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
|
-
|
149
|
-
|
150
|
-
|
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
|
-
|
153
|
-
|
154
|
-
|
155
|
-
if not self.
|
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
|
-
|
158
|
-
|
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
|
-
"""
|
404
|
-
|
405
|
-
|
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
|
-
|
416
|
-
|
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.
|
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.
|
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.
|
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.
|
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
|
-
|
496
|
-
|
497
|
-
|
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.
|
539
|
+
if response.headers.get(self.ratelimit_reset_header):
|
527
540
|
return datetime.datetime.fromtimestamp(
|
528
|
-
int(response.headers[self.
|
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.
|
534
|
-
return int(response.headers[self.
|
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.
|
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
|
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
|
-
|
56
|
-
|
57
|
-
|
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
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
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
|
-
|
88
|
-
|
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
|
93
|
-
|
94
|
-
if
|
95
|
-
|
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
|
-
#
|
99
|
-
|
100
|
-
for
|
101
|
-
|
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
|
-
|
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
|
@@ -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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|