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.
- airbyte_cdk/sources/declarative/auth/token.py +3 -8
- airbyte_cdk/sources/declarative/concurrent_declarative_source.py +13 -2
- airbyte_cdk/sources/declarative/declarative_component_schema.yaml +15 -212
- airbyte_cdk/sources/declarative/incremental/datetime_based_cursor.py +7 -6
- airbyte_cdk/sources/declarative/manifest_declarative_source.py +0 -4
- airbyte_cdk/sources/declarative/models/declarative_component_schema.py +10 -169
- airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py +34 -171
- airbyte_cdk/sources/declarative/partition_routers/list_partition_router.py +4 -2
- airbyte_cdk/sources/declarative/partition_routers/substream_partition_router.py +26 -18
- airbyte_cdk/sources/declarative/requesters/http_requester.py +5 -4
- airbyte_cdk/sources/declarative/requesters/paginators/default_paginator.py +6 -5
- airbyte_cdk/sources/declarative/requesters/request_option.py +83 -4
- airbyte_cdk/sources/declarative/requesters/request_options/datetime_based_request_options_provider.py +7 -6
- airbyte_cdk/sources/declarative/retrievers/simple_retriever.py +4 -1
- airbyte_cdk/sources/streams/call_rate.py +71 -84
- airbyte_cdk/utils/mapping_helpers.py +86 -27
- {airbyte_cdk-6.33.0.dev0.dist-info → airbyte_cdk-6.33.1.dist-info}/METADATA +1 -1
- {airbyte_cdk-6.33.0.dev0.dist-info → airbyte_cdk-6.33.1.dist-info}/RECORD +22 -22
- {airbyte_cdk-6.33.0.dev0.dist-info → airbyte_cdk-6.33.1.dist-info}/LICENSE.txt +0 -0
- {airbyte_cdk-6.33.0.dev0.dist-info → airbyte_cdk-6.33.1.dist-info}/LICENSE_SHORT +0 -0
- {airbyte_cdk-6.33.0.dev0.dist-info → airbyte_cdk-6.33.1.dist-info}/WHEEL +0 -0
- {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
|
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
|
-
|
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
|
-
|
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
|
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
|
-
|
149
|
-
:
|
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
|
-
|
160
|
-
|
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
|
-
|
165
|
-
|
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
|
-
|
177
|
-
|
178
|
-
if not self.
|
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
|
-
|
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
|
-
|
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
|
-
|
442
|
-
|
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.
|
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.
|
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.
|
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.
|
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
|
-
|
523
|
-
|
524
|
-
|
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.
|
526
|
+
if response.headers.get(self._ratelimit_reset_header):
|
540
527
|
return datetime.datetime.fromtimestamp(
|
541
|
-
int(response.headers[self.
|
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.
|
547
|
-
return int(response.headers[self.
|
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.
|
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
|
-
|
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.
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
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
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
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
|
-
|
32
|
-
|
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
|
35
|
-
|
36
|
-
if
|
37
|
-
|
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
|
-
#
|
40
|
-
|
41
|
-
|
42
|
-
|
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
|
-
|
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
|
@@ -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=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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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.
|
355
|
-
airbyte_cdk-6.33.
|
356
|
-
airbyte_cdk-6.33.
|
357
|
-
airbyte_cdk-6.33.
|
358
|
-
airbyte_cdk-6.33.
|
359
|
-
airbyte_cdk-6.33.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|