airbyte-cdk 6.36.3.dev0__py3-none-any.whl → 6.36.4__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/datetime/datetime_parser.py +7 -1
- airbyte_cdk/sources/declarative/declarative_component_schema.yaml +23 -3
- airbyte_cdk/sources/declarative/decoders/composite_raw_decoder.py +2 -5
- airbyte_cdk/sources/declarative/models/declarative_component_schema.py +2 -2
- airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py +7 -7
- airbyte_cdk/sources/declarative/requesters/README.md +5 -5
- airbyte_cdk/sources/declarative/requesters/http_job_repository.py +18 -13
- airbyte_cdk/sources/declarative/requesters/http_requester.py +7 -1
- {airbyte_cdk-6.36.3.dev0.dist-info → airbyte_cdk-6.36.4.dist-info}/METADATA +1 -1
- {airbyte_cdk-6.36.3.dev0.dist-info → airbyte_cdk-6.36.4.dist-info}/RECORD +14 -14
- {airbyte_cdk-6.36.3.dev0.dist-info → airbyte_cdk-6.36.4.dist-info}/LICENSE.txt +0 -0
- {airbyte_cdk-6.36.3.dev0.dist-info → airbyte_cdk-6.36.4.dist-info}/LICENSE_SHORT +0 -0
- {airbyte_cdk-6.36.3.dev0.dist-info → airbyte_cdk-6.36.4.dist-info}/WHEEL +0 -0
- {airbyte_cdk-6.36.3.dev0.dist-info → airbyte_cdk-6.36.4.dist-info}/entry_points.txt +0 -0
@@ -31,7 +31,8 @@ class DatetimeParser:
|
|
31
31
|
return datetime.datetime.fromtimestamp(float(date), tz=datetime.timezone.utc)
|
32
32
|
elif format == "%ms":
|
33
33
|
return self._UNIX_EPOCH + datetime.timedelta(milliseconds=int(date))
|
34
|
-
|
34
|
+
elif "%_ms" in format:
|
35
|
+
format = format.replace("%_ms", "%f")
|
35
36
|
parsed_datetime = datetime.datetime.strptime(str(date), format)
|
36
37
|
if self._is_naive(parsed_datetime):
|
37
38
|
return parsed_datetime.replace(tzinfo=datetime.timezone.utc)
|
@@ -48,6 +49,11 @@ class DatetimeParser:
|
|
48
49
|
if format == "%ms":
|
49
50
|
# timstamp() returns a float representing the number of seconds since the unix epoch
|
50
51
|
return str(int(dt.timestamp() * 1000))
|
52
|
+
if "%_ms" in format:
|
53
|
+
_format = format.replace("%_ms", "%f")
|
54
|
+
milliseconds = int(dt.microsecond / 1000)
|
55
|
+
formatted_dt = dt.strftime(_format).replace(dt.strftime("%f"), "%03d" % milliseconds)
|
56
|
+
return formatted_dt
|
51
57
|
else:
|
52
58
|
return dt.strftime(format)
|
53
59
|
|
@@ -844,6 +844,7 @@ definitions:
|
|
844
844
|
* **%M**: Minute (zero-padded) - `00`, `01`, ..., `59`
|
845
845
|
* **%S**: Second (zero-padded) - `00`, `01`, ..., `59`
|
846
846
|
* **%f**: Microsecond (zero-padded to 6 digits) - `000000`
|
847
|
+
* **%_ms**: Millisecond (zero-padded to 3 digits) - `000`
|
847
848
|
* **%z**: UTC offset - `(empty)`, `+0000`, `-04:00`
|
848
849
|
* **%Z**: Time zone name - `(empty)`, `UTC`, `GMT`
|
849
850
|
* **%j**: Day of the year (zero-padded) - `001`, `002`, ..., `366`
|
@@ -1779,6 +1780,9 @@ definitions:
|
|
1779
1780
|
- stream_interval
|
1780
1781
|
- stream_partition
|
1781
1782
|
- stream_slice
|
1783
|
+
- creation_response
|
1784
|
+
- polling_response
|
1785
|
+
- download_target
|
1782
1786
|
examples:
|
1783
1787
|
- "/products"
|
1784
1788
|
- "/quotes/{{ stream_partition['id'] }}/quote_line_groups"
|
@@ -2398,6 +2402,7 @@ definitions:
|
|
2398
2402
|
* **%M**: Minute (zero-padded) - `00`, `01`, ..., `59`
|
2399
2403
|
* **%S**: Second (zero-padded) - `00`, `01`, ..., `59`
|
2400
2404
|
* **%f**: Microsecond (zero-padded to 6 digits) - `000000`, `000001`, ..., `999999`
|
2405
|
+
* **%_ms**: Millisecond (zero-padded to 3 digits) - `000`, `001`, ..., `999`
|
2401
2406
|
* **%z**: UTC offset - `(empty)`, `+0000`, `-04:00`
|
2402
2407
|
* **%Z**: Time zone name - `(empty)`, `UTC`, `GMT`
|
2403
2408
|
* **%j**: Day of the year (zero-padded) - `001`, `002`, ..., `366`
|
@@ -3223,7 +3228,7 @@ definitions:
|
|
3223
3228
|
- polling_requester
|
3224
3229
|
- download_requester
|
3225
3230
|
- status_extractor
|
3226
|
-
-
|
3231
|
+
- download_target_extractor
|
3227
3232
|
properties:
|
3228
3233
|
type:
|
3229
3234
|
type: string
|
@@ -3240,7 +3245,7 @@ definitions:
|
|
3240
3245
|
anyOf:
|
3241
3246
|
- "$ref": "#/definitions/CustomRecordExtractor"
|
3242
3247
|
- "$ref": "#/definitions/DpathExtractor"
|
3243
|
-
|
3248
|
+
download_target_extractor:
|
3244
3249
|
description: Responsible for fetching the final result `urls` provided by the completed / finished / ready async job.
|
3245
3250
|
anyOf:
|
3246
3251
|
- "$ref": "#/definitions/CustomRecordExtractor"
|
@@ -3261,7 +3266,7 @@ definitions:
|
|
3261
3266
|
anyOf:
|
3262
3267
|
- "$ref": "#/definitions/CustomRequester"
|
3263
3268
|
- "$ref": "#/definitions/HttpRequester"
|
3264
|
-
|
3269
|
+
download_target_requester:
|
3265
3270
|
description: Requester component that describes how to prepare HTTP requests to send to the source API to extract the url from polling response by the completed async job.
|
3266
3271
|
anyOf:
|
3267
3272
|
- "$ref": "#/definitions/CustomRequester"
|
@@ -3667,6 +3672,21 @@ interpolation:
|
|
3667
3672
|
self: https://api.sendgrid.com/v3/marketing/lists?page_size=1&page_token=
|
3668
3673
|
next: https://api.sendgrid.com/v3/marketing/lists?page_size=1&page_token=0236d6d2
|
3669
3674
|
count: 82
|
3675
|
+
- title: creation_response
|
3676
|
+
description: The response received from the creation_requester in the AsyncRetriever component.
|
3677
|
+
type: object
|
3678
|
+
examples:
|
3679
|
+
- id: "1234"
|
3680
|
+
- title: polling_response
|
3681
|
+
description: The response received from the polling_requester in the AsyncRetriever component.
|
3682
|
+
type: object
|
3683
|
+
examples:
|
3684
|
+
- id: "1234"
|
3685
|
+
- title: download_target
|
3686
|
+
description: The `URL` received from the polling_requester in the AsyncRetriever with jobStatus as `COMPLETED`.
|
3687
|
+
type: string
|
3688
|
+
examples:
|
3689
|
+
- "https://api.sendgrid.com/v3/marketing/lists?page_size=1&page_token=0236d6d2&filename=xxx_yyy_zzz.csv"
|
3670
3690
|
- title: stream_interval
|
3671
3691
|
description: The current stream interval being processed. The keys are defined by the incremental sync component. Default keys are `start_time` and `end_time`.
|
3672
3692
|
type: object
|
@@ -5,7 +5,7 @@ import json
|
|
5
5
|
import logging
|
6
6
|
from abc import ABC, abstractmethod
|
7
7
|
from dataclasses import dataclass
|
8
|
-
from io import BufferedIOBase,
|
8
|
+
from io import BufferedIOBase, TextIOWrapper
|
9
9
|
from typing import Any, Generator, MutableMapping, Optional
|
10
10
|
|
11
11
|
import orjson
|
@@ -124,8 +124,7 @@ class CsvParser(Parser):
|
|
124
124
|
"""
|
125
125
|
Parse CSV data from decompressed bytes.
|
126
126
|
"""
|
127
|
-
|
128
|
-
text_data = TextIOWrapper(bytes_data, encoding=self.encoding) # type: ignore
|
127
|
+
text_data = TextIOWrapper(data, encoding=self.encoding) # type: ignore
|
129
128
|
reader = csv.DictReader(text_data, delimiter=self._get_delimiter() or ",")
|
130
129
|
for row in reader:
|
131
130
|
yield row
|
@@ -152,8 +151,6 @@ class CompositeRawDecoder(Decoder):
|
|
152
151
|
self, response: requests.Response
|
153
152
|
) -> Generator[MutableMapping[str, Any], None, None]:
|
154
153
|
if self.is_stream_response():
|
155
|
-
response.raw.auto_close = False
|
156
154
|
yield from self.parser.parse(data=response.raw) # type: ignore[arg-type]
|
157
|
-
response.raw.close()
|
158
155
|
else:
|
159
156
|
yield from self.parser.parse(data=io.BytesIO(response.content))
|
@@ -2263,7 +2263,7 @@ class AsyncRetriever(BaseModel):
|
|
2263
2263
|
status_extractor: Union[CustomRecordExtractor, DpathExtractor] = Field(
|
2264
2264
|
..., description="Responsible for fetching the actual status of the async job."
|
2265
2265
|
)
|
2266
|
-
|
2266
|
+
download_target_extractor: Union[CustomRecordExtractor, DpathExtractor] = Field(
|
2267
2267
|
...,
|
2268
2268
|
description="Responsible for fetching the final result `urls` provided by the completed / finished / ready async job.",
|
2269
2269
|
)
|
@@ -2278,7 +2278,7 @@ class AsyncRetriever(BaseModel):
|
|
2278
2278
|
...,
|
2279
2279
|
description="Requester component that describes how to prepare HTTP requests to send to the source API to fetch the status of the running async job.",
|
2280
2280
|
)
|
2281
|
-
|
2281
|
+
download_target_requester: Optional[Union[CustomRequester, HttpRequester]] = Field(
|
2282
2282
|
None,
|
2283
2283
|
description="Requester component that describes how to prepare HTTP requests to send to the source API to extract the url from polling response by the completed async job.",
|
2284
2284
|
)
|
@@ -2744,32 +2744,32 @@ class ModelToComponentFactory:
|
|
2744
2744
|
if model.delete_requester
|
2745
2745
|
else None
|
2746
2746
|
)
|
2747
|
-
|
2747
|
+
download_target_requester = (
|
2748
2748
|
self._create_component_from_model(
|
2749
|
-
model=model.
|
2749
|
+
model=model.download_target_requester,
|
2750
2750
|
decoder=decoder,
|
2751
2751
|
config=config,
|
2752
2752
|
name=f"job extract_url - {name}",
|
2753
2753
|
)
|
2754
|
-
if model.
|
2754
|
+
if model.download_target_requester
|
2755
2755
|
else None
|
2756
2756
|
)
|
2757
2757
|
status_extractor = self._create_component_from_model(
|
2758
2758
|
model=model.status_extractor, decoder=decoder, config=config, name=name
|
2759
2759
|
)
|
2760
|
-
|
2761
|
-
model=model.
|
2760
|
+
download_target_extractor = self._create_component_from_model(
|
2761
|
+
model=model.download_target_extractor, decoder=decoder, config=config, name=name
|
2762
2762
|
)
|
2763
2763
|
job_repository: AsyncJobRepository = AsyncHttpJobRepository(
|
2764
2764
|
creation_requester=creation_requester,
|
2765
2765
|
polling_requester=polling_requester,
|
2766
2766
|
download_retriever=download_retriever,
|
2767
|
-
|
2767
|
+
download_target_requester=download_target_requester,
|
2768
2768
|
abort_requester=abort_requester,
|
2769
2769
|
delete_requester=delete_requester,
|
2770
2770
|
status_extractor=status_extractor,
|
2771
2771
|
status_mapping=self._create_async_job_status_mapping(model.status_mapping, config),
|
2772
|
-
|
2772
|
+
download_target_extractor=download_target_extractor,
|
2773
2773
|
)
|
2774
2774
|
|
2775
2775
|
async_job_partition_router = AsyncJobPartitionRouter(
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# AsyncHttpJobRepository sequence diagram
|
2
2
|
|
3
3
|
- Components marked as optional are not required and can be ignored.
|
4
|
-
- if `
|
5
|
-
- interpolation_context, e.g. `
|
4
|
+
- if `download_target_requester` is not provided, `download_target_extractor` will get urls from the `polling_response`
|
5
|
+
- interpolation_context, e.g. `creation_response` or `polling_response` can be obtained from stream_slice
|
6
6
|
|
7
7
|
```mermaid
|
8
8
|
---
|
@@ -12,7 +12,7 @@ sequenceDiagram
|
|
12
12
|
participant AsyncHttpJobRepository as AsyncOrchestrator
|
13
13
|
participant CreationRequester as creation_requester
|
14
14
|
participant PollingRequester as polling_requester
|
15
|
-
participant UrlRequester as
|
15
|
+
participant UrlRequester as download_target_requester (Optional)
|
16
16
|
participant DownloadRetriever as download_retriever
|
17
17
|
participant AbortRequester as abort_requester (Optional)
|
18
18
|
participant DeleteRequester as delete_requester (Optional)
|
@@ -25,14 +25,14 @@ sequenceDiagram
|
|
25
25
|
|
26
26
|
loop Poll for job status
|
27
27
|
AsyncHttpJobRepository ->> PollingRequester: Check job status
|
28
|
-
PollingRequester ->> Reporting Server: Status request (interpolation_context: `
|
28
|
+
PollingRequester ->> Reporting Server: Status request (interpolation_context: `creation_response`)
|
29
29
|
Reporting Server -->> PollingRequester: Status response
|
30
30
|
PollingRequester -->> AsyncHttpJobRepository: Job status
|
31
31
|
end
|
32
32
|
|
33
33
|
alt Status: Ready
|
34
34
|
AsyncHttpJobRepository ->> UrlRequester: Request download URLs (if applicable)
|
35
|
-
UrlRequester ->> Reporting Server: URL request (interpolation_context: `
|
35
|
+
UrlRequester ->> Reporting Server: URL request (interpolation_context: `polling_response`)
|
36
36
|
Reporting Server -->> UrlRequester: Download URLs
|
37
37
|
UrlRequester -->> AsyncHttpJobRepository: Download URLs
|
38
38
|
|
@@ -43,13 +43,13 @@ class AsyncHttpJobRepository(AsyncJobRepository):
|
|
43
43
|
delete_requester: Optional[Requester]
|
44
44
|
status_extractor: DpathExtractor
|
45
45
|
status_mapping: Mapping[str, AsyncJobStatus]
|
46
|
-
|
46
|
+
download_target_extractor: DpathExtractor
|
47
47
|
|
48
48
|
job_timeout: Optional[timedelta] = None
|
49
49
|
record_extractor: RecordExtractor = field(
|
50
50
|
init=False, repr=False, default_factory=lambda: ResponseToFileExtractor({})
|
51
51
|
)
|
52
|
-
|
52
|
+
download_target_requester: Optional[Requester] = (
|
53
53
|
None # use it in case polling_requester provides some <id> and extra request is needed to obtain list of urls to download from
|
54
54
|
)
|
55
55
|
|
@@ -211,12 +211,15 @@ class AsyncHttpJobRepository(AsyncJobRepository):
|
|
211
211
|
|
212
212
|
"""
|
213
213
|
|
214
|
-
for
|
214
|
+
for target_url in self._get_download_targets(job):
|
215
215
|
job_slice = job.job_parameters()
|
216
216
|
stream_slice = StreamSlice(
|
217
217
|
partition=job_slice.partition,
|
218
218
|
cursor_slice=job_slice.cursor_slice,
|
219
|
-
extra_fields={
|
219
|
+
extra_fields={
|
220
|
+
**job_slice.extra_fields,
|
221
|
+
"download_target": target_url,
|
222
|
+
},
|
220
223
|
)
|
221
224
|
for message in self.download_retriever.read_records({}, stream_slice):
|
222
225
|
if isinstance(message, Record):
|
@@ -269,27 +272,29 @@ class AsyncHttpJobRepository(AsyncJobRepository):
|
|
269
272
|
del self._polling_job_response_by_id[job_id]
|
270
273
|
|
271
274
|
def _get_create_job_stream_slice(self, job: AsyncJob) -> StreamSlice:
|
275
|
+
creation_response = self._create_job_response_by_id[job.api_job_id()].json()
|
272
276
|
stream_slice = StreamSlice(
|
273
|
-
partition={
|
277
|
+
partition={},
|
274
278
|
cursor_slice={},
|
279
|
+
extra_fields={"creation_response": creation_response},
|
275
280
|
)
|
276
281
|
return stream_slice
|
277
282
|
|
278
|
-
def
|
279
|
-
if not self.
|
283
|
+
def _get_download_targets(self, job: AsyncJob) -> Iterable[str]:
|
284
|
+
if not self.download_target_requester:
|
280
285
|
url_response = self._polling_job_response_by_id[job.api_job_id()]
|
281
286
|
else:
|
287
|
+
polling_response = self._polling_job_response_by_id[job.api_job_id()].json()
|
282
288
|
stream_slice: StreamSlice = StreamSlice(
|
283
|
-
partition={
|
284
|
-
"polling_job_response": self._polling_job_response_by_id[job.api_job_id()]
|
285
|
-
},
|
289
|
+
partition={},
|
286
290
|
cursor_slice={},
|
291
|
+
extra_fields={"polling_response": polling_response},
|
287
292
|
)
|
288
|
-
url_response = self.
|
293
|
+
url_response = self.download_target_requester.send_request(stream_slice=stream_slice) # type: ignore # we expect download_target_requester to always be presented, otherwise raise an exception as we cannot proceed with the report
|
289
294
|
if not url_response:
|
290
295
|
raise AirbyteTracedException(
|
291
|
-
internal_message="Always expect a response or an exception from
|
296
|
+
internal_message="Always expect a response or an exception from download_target_requester",
|
292
297
|
failure_type=FailureType.system_error,
|
293
298
|
)
|
294
299
|
|
295
|
-
yield from self.
|
300
|
+
yield from self.download_target_extractor.extract_records(url_response) # type: ignore # we expect download_target_extractor to always return list of strings
|
@@ -85,7 +85,7 @@ class HttpRequester(Requester):
|
|
85
85
|
self._parameters = parameters
|
86
86
|
|
87
87
|
if self.error_handler is not None and hasattr(self.error_handler, "backoff_strategies"):
|
88
|
-
backoff_strategies = self.error_handler.backoff_strategies
|
88
|
+
backoff_strategies = self.error_handler.backoff_strategies # type: ignore
|
89
89
|
else:
|
90
90
|
backoff_strategies = None
|
91
91
|
|
@@ -125,6 +125,12 @@ class HttpRequester(Requester):
|
|
125
125
|
kwargs = {
|
126
126
|
"stream_slice": stream_slice,
|
127
127
|
"next_page_token": next_page_token,
|
128
|
+
# update the interpolation context with extra fields, if passed.
|
129
|
+
**(
|
130
|
+
stream_slice.extra_fields
|
131
|
+
if stream_slice is not None and hasattr(stream_slice, "extra_fields")
|
132
|
+
else {}
|
133
|
+
),
|
128
134
|
}
|
129
135
|
path = str(self._path.eval(self.config, **kwargs))
|
130
136
|
return path.lstrip("/")
|
@@ -69,13 +69,13 @@ airbyte_cdk/sources/declarative/concurrency_level/__init__.py,sha256=5XUqrmlstYl
|
|
69
69
|
airbyte_cdk/sources/declarative/concurrency_level/concurrency_level.py,sha256=YIwCTCpOr_QSNW4ltQK0yUGWInI8PKNY216HOOegYLk,2101
|
70
70
|
airbyte_cdk/sources/declarative/concurrent_declarative_source.py,sha256=KBF9wdPC5KauFwg9dv4pFHLz01ZMwbMvN5ZCcZgiBEE,25424
|
71
71
|
airbyte_cdk/sources/declarative/datetime/__init__.py,sha256=l9LG7Qm6e5r_qgqfVKnx3mXYtg1I9MmMjomVIPfU4XA,177
|
72
|
-
airbyte_cdk/sources/declarative/datetime/datetime_parser.py,sha256=
|
72
|
+
airbyte_cdk/sources/declarative/datetime/datetime_parser.py,sha256=0qs4hhmh_XOy2B4MHCn2qVMM79C6MizIBqnvpZj1aSE,2923
|
73
73
|
airbyte_cdk/sources/declarative/datetime/min_max_datetime.py,sha256=0BHBtDNQZfvwM45-tY5pNlTcKAFSGGNxemoi0Jic-0E,5785
|
74
|
-
airbyte_cdk/sources/declarative/declarative_component_schema.yaml,sha256=
|
74
|
+
airbyte_cdk/sources/declarative/declarative_component_schema.yaml,sha256=OVRQ19uAhIvUOzn0SnNmOpszLUULpCoSsrcGVVY6Bd0,145499
|
75
75
|
airbyte_cdk/sources/declarative/declarative_source.py,sha256=nF7wBqFd3AQmEKAm4CnIo29CJoQL562cJGSCeL8U8bA,1531
|
76
76
|
airbyte_cdk/sources/declarative/declarative_stream.py,sha256=venZjfpvtqr3oFSuvMBWtn4h9ayLhD4L65ACuXCDZ64,10445
|
77
77
|
airbyte_cdk/sources/declarative/decoders/__init__.py,sha256=JHb_0d3SE6kNY10mxA5YBEKPeSbsWYjByq1gUQxepoE,953
|
78
|
-
airbyte_cdk/sources/declarative/decoders/composite_raw_decoder.py,sha256=
|
78
|
+
airbyte_cdk/sources/declarative/decoders/composite_raw_decoder.py,sha256=DJbWaaJ5LHCBpyWz-4bEw8rqtJYqabEYZtxnfRtWFE0,4946
|
79
79
|
airbyte_cdk/sources/declarative/decoders/decoder.py,sha256=sl-Gt8lXi7yD2Q-sD8je5QS2PbgrgsYjxRLWsay7DMc,826
|
80
80
|
airbyte_cdk/sources/declarative/decoders/json_decoder.py,sha256=BdWpXXPhEGf_zknggJmhojLosmxuw51RBVTS0jvdCPc,2080
|
81
81
|
airbyte_cdk/sources/declarative/decoders/noop_decoder.py,sha256=iZh0yKY_JzgBnJWiubEusf5c0o6Khd-8EWFWT-8EgFo,542
|
@@ -113,13 +113,13 @@ airbyte_cdk/sources/declarative/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW
|
|
113
113
|
airbyte_cdk/sources/declarative/migrations/legacy_to_per_partition_state_migration.py,sha256=iemy3fKLczcU0-Aor7tx5jcT6DRedKMqyK7kCOp01hg,3924
|
114
114
|
airbyte_cdk/sources/declarative/migrations/state_migration.py,sha256=KWPjealMLKSMtajXgkdGgKg7EmTLR-CqqD7UIh0-eDU,794
|
115
115
|
airbyte_cdk/sources/declarative/models/__init__.py,sha256=nUFxNCiKeYRVXuZEKA7GD-lTHxsiKcQ8FitZjKhPIvE,100
|
116
|
-
airbyte_cdk/sources/declarative/models/declarative_component_schema.py,sha256=
|
116
|
+
airbyte_cdk/sources/declarative/models/declarative_component_schema.py,sha256=N9zrGClmsg0st7YKWL6KHE0-haYVVeUF_MZc3NJ6j5Q,101981
|
117
117
|
airbyte_cdk/sources/declarative/parsers/__init__.py,sha256=ZnqYNxHsKCgO38IwB34RQyRMXTs4GTvlRi3ImKnIioo,61
|
118
118
|
airbyte_cdk/sources/declarative/parsers/custom_code_compiler.py,sha256=958MMX6_ZOJUlDDdNr9Krosgi2bCKGx2Z765M2Woz18,5505
|
119
119
|
airbyte_cdk/sources/declarative/parsers/custom_exceptions.py,sha256=Rir9_z3Kcd5Es0-LChrzk-0qubAsiK_RSEnLmK2OXm8,553
|
120
120
|
airbyte_cdk/sources/declarative/parsers/manifest_component_transformer.py,sha256=CXwTfD3wSQq3okcqwigpprbHhSURUokh4GK2OmOyKC8,9132
|
121
121
|
airbyte_cdk/sources/declarative/parsers/manifest_reference_resolver.py,sha256=IWUOdF03o-aQn0Occo1BJCxU0Pz-QILk5L67nzw2thw,6803
|
122
|
-
airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py,sha256=
|
122
|
+
airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py,sha256=8gjOsCS8VdkH2-lImilDq8M8-dmGKtWpWyzd5ajzNok,134955
|
123
123
|
airbyte_cdk/sources/declarative/partition_routers/__init__.py,sha256=HJ-Syp3p7RpyR_OK0X_a2kSyISfu3W-PKrRI16iY0a8,957
|
124
124
|
airbyte_cdk/sources/declarative/partition_routers/async_job_partition_router.py,sha256=VelO7zKqKtzMJ35jyFeg0ypJLQC0plqqIBNXoBW1G2E,3001
|
125
125
|
airbyte_cdk/sources/declarative/partition_routers/cartesian_product_stream_slicer.py,sha256=c5cuVFM6NFkuQqG8Z5IwkBuwDrvXZN1CunUOM_L0ezg,6892
|
@@ -127,7 +127,7 @@ airbyte_cdk/sources/declarative/partition_routers/list_partition_router.py,sha25
|
|
127
127
|
airbyte_cdk/sources/declarative/partition_routers/partition_router.py,sha256=YyEIzdmLd1FjbVP3QbQ2VFCLW_P-OGbVh6VpZShp54k,2218
|
128
128
|
airbyte_cdk/sources/declarative/partition_routers/single_partition_router.py,sha256=SKzKjSyfccq4dxGIh-J6ejrgkCHzaiTIazmbmeQiRD4,1942
|
129
129
|
airbyte_cdk/sources/declarative/partition_routers/substream_partition_router.py,sha256=LlWj-Ofs-xfjlqmDzH8OYpyblP2Pb8bPDdR9g1UZyt0,17693
|
130
|
-
airbyte_cdk/sources/declarative/requesters/README.md,sha256=
|
130
|
+
airbyte_cdk/sources/declarative/requesters/README.md,sha256=DQll2qsIzzTiiP35kJp16ONpr7cFeUQNgPfhl5krB24,2675
|
131
131
|
airbyte_cdk/sources/declarative/requesters/__init__.py,sha256=d7a3OoHbqaJDyyPli3nqqJ2yAW_SLX6XDaBAKOwvpxw,364
|
132
132
|
airbyte_cdk/sources/declarative/requesters/error_handlers/__init__.py,sha256=SkEDcJxlT1683rNx93K9whoS0OyUukkuOfToGtgpF58,776
|
133
133
|
airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/__init__.py,sha256=1WZdpFmWL6W_Dko0qjflTaKIWeqt8jHT-D6HcujIp3s,884
|
@@ -142,8 +142,8 @@ airbyte_cdk/sources/declarative/requesters/error_handlers/default_error_handler.
|
|
142
142
|
airbyte_cdk/sources/declarative/requesters/error_handlers/default_http_response_filter.py,sha256=q0YkeYUUWO6iErUy0vjqiOkhg8_9d5YcCmtlpXAJJ9E,1314
|
143
143
|
airbyte_cdk/sources/declarative/requesters/error_handlers/error_handler.py,sha256=Tan66odx8VHzfdyyXMQkXz2pJYksllGqvxmpoajgcK4,669
|
144
144
|
airbyte_cdk/sources/declarative/requesters/error_handlers/http_response_filter.py,sha256=E-fQbt4ShfxZVoqfnmOx69C6FUPWZz8BIqI3DN9Kcjs,7935
|
145
|
-
airbyte_cdk/sources/declarative/requesters/http_job_repository.py,sha256=
|
146
|
-
airbyte_cdk/sources/declarative/requesters/http_requester.py,sha256=
|
145
|
+
airbyte_cdk/sources/declarative/requesters/http_job_repository.py,sha256=4wpP0ZNTMLugi-Rc1OFdFaxWfRZSl45nzhHqMFCE8SQ,11924
|
146
|
+
airbyte_cdk/sources/declarative/requesters/http_requester.py,sha256=Sie8IyntFu66UoJASwpWV0WrRDBr9lpHWSOws7vZfM0,15228
|
147
147
|
airbyte_cdk/sources/declarative/requesters/paginators/__init__.py,sha256=uArbKs9JKNCt7t9tZoeWwjDpyI1HoPp29FNW0JzvaEM,644
|
148
148
|
airbyte_cdk/sources/declarative/requesters/paginators/default_paginator.py,sha256=ZW4lwWNAzb4zL0jKc-HjowP5-y0Zg9xi0YlK6tkx_XY,12057
|
149
149
|
airbyte_cdk/sources/declarative/requesters/paginators/no_pagination.py,sha256=j6j9QRPaTbKQ2N661RFVKthhkWiodEp6ut0tKeEd0Ng,2019
|
@@ -360,9 +360,9 @@ airbyte_cdk/utils/slice_hasher.py,sha256=EDxgROHDbfG-QKQb59m7h_7crN1tRiawdf5uU7G
|
|
360
360
|
airbyte_cdk/utils/spec_schema_transformations.py,sha256=-5HTuNsnDBAhj-oLeQXwpTGA0HdcjFOf2zTEMUTTg_Y,816
|
361
361
|
airbyte_cdk/utils/stream_status_utils.py,sha256=ZmBoiy5HVbUEHAMrUONxZvxnvfV9CesmQJLDTAIWnWw,1171
|
362
362
|
airbyte_cdk/utils/traced_exception.py,sha256=C8uIBuCL_E4WnBAOPSxBicD06JAldoN9fGsQDp463OY,6292
|
363
|
-
airbyte_cdk-6.36.
|
364
|
-
airbyte_cdk-6.36.
|
365
|
-
airbyte_cdk-6.36.
|
366
|
-
airbyte_cdk-6.36.
|
367
|
-
airbyte_cdk-6.36.
|
368
|
-
airbyte_cdk-6.36.
|
363
|
+
airbyte_cdk-6.36.4.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
|
364
|
+
airbyte_cdk-6.36.4.dist-info/LICENSE_SHORT,sha256=aqF6D1NcESmpn-cqsxBtszTEnHKnlsp8L4x9wAh3Nxg,55
|
365
|
+
airbyte_cdk-6.36.4.dist-info/METADATA,sha256=GA6LdYLCN0e8BOIqchm7f1Zk-kA6saHnzIEGxGlQns8,6010
|
366
|
+
airbyte_cdk-6.36.4.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
367
|
+
airbyte_cdk-6.36.4.dist-info/entry_points.txt,sha256=fj-e3PAQvsxsQzyyq8UkG1k8spunWnD4BAH2AwlR6NM,95
|
368
|
+
airbyte_cdk-6.36.4.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|