airbyte-cdk 6.36.2__py3-none-any.whl → 6.36.3__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/declarative_component_schema.yaml +21 -3
- 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.2.dist-info → airbyte_cdk-6.36.3.dist-info}/METADATA +1 -1
- {airbyte_cdk-6.36.2.dist-info → airbyte_cdk-6.36.3.dist-info}/RECORD +12 -12
- {airbyte_cdk-6.36.2.dist-info → airbyte_cdk-6.36.3.dist-info}/LICENSE.txt +0 -0
- {airbyte_cdk-6.36.2.dist-info → airbyte_cdk-6.36.3.dist-info}/LICENSE_SHORT +0 -0
- {airbyte_cdk-6.36.2.dist-info → airbyte_cdk-6.36.3.dist-info}/WHEEL +0 -0
- {airbyte_cdk-6.36.2.dist-info → airbyte_cdk-6.36.3.dist-info}/entry_points.txt +0 -0
@@ -1779,6 +1779,9 @@ definitions:
|
|
1779
1779
|
- stream_interval
|
1780
1780
|
- stream_partition
|
1781
1781
|
- stream_slice
|
1782
|
+
- creation_response
|
1783
|
+
- polling_response
|
1784
|
+
- download_target
|
1782
1785
|
examples:
|
1783
1786
|
- "/products"
|
1784
1787
|
- "/quotes/{{ stream_partition['id'] }}/quote_line_groups"
|
@@ -3223,7 +3226,7 @@ definitions:
|
|
3223
3226
|
- polling_requester
|
3224
3227
|
- download_requester
|
3225
3228
|
- status_extractor
|
3226
|
-
-
|
3229
|
+
- download_target_extractor
|
3227
3230
|
properties:
|
3228
3231
|
type:
|
3229
3232
|
type: string
|
@@ -3240,7 +3243,7 @@ definitions:
|
|
3240
3243
|
anyOf:
|
3241
3244
|
- "$ref": "#/definitions/CustomRecordExtractor"
|
3242
3245
|
- "$ref": "#/definitions/DpathExtractor"
|
3243
|
-
|
3246
|
+
download_target_extractor:
|
3244
3247
|
description: Responsible for fetching the final result `urls` provided by the completed / finished / ready async job.
|
3245
3248
|
anyOf:
|
3246
3249
|
- "$ref": "#/definitions/CustomRecordExtractor"
|
@@ -3261,7 +3264,7 @@ definitions:
|
|
3261
3264
|
anyOf:
|
3262
3265
|
- "$ref": "#/definitions/CustomRequester"
|
3263
3266
|
- "$ref": "#/definitions/HttpRequester"
|
3264
|
-
|
3267
|
+
download_target_requester:
|
3265
3268
|
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
3269
|
anyOf:
|
3267
3270
|
- "$ref": "#/definitions/CustomRequester"
|
@@ -3667,6 +3670,21 @@ interpolation:
|
|
3667
3670
|
self: https://api.sendgrid.com/v3/marketing/lists?page_size=1&page_token=
|
3668
3671
|
next: https://api.sendgrid.com/v3/marketing/lists?page_size=1&page_token=0236d6d2
|
3669
3672
|
count: 82
|
3673
|
+
- title: creation_response
|
3674
|
+
description: The response received from the creation_requester in the AsyncRetriever component.
|
3675
|
+
type: object
|
3676
|
+
examples:
|
3677
|
+
- id: "1234"
|
3678
|
+
- title: polling_response
|
3679
|
+
description: The response received from the polling_requester in the AsyncRetriever component.
|
3680
|
+
type: object
|
3681
|
+
examples:
|
3682
|
+
- id: "1234"
|
3683
|
+
- title: download_target
|
3684
|
+
description: The `URL` received from the polling_requester in the AsyncRetriever with jobStatus as `COMPLETED`.
|
3685
|
+
type: string
|
3686
|
+
examples:
|
3687
|
+
- "https://api.sendgrid.com/v3/marketing/lists?page_size=1&page_token=0236d6d2&filename=xxx_yyy_zzz.csv"
|
3670
3688
|
- title: stream_interval
|
3671
3689
|
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
3690
|
type: object
|
@@ -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("/")
|
@@ -71,7 +71,7 @@ airbyte_cdk/sources/declarative/concurrent_declarative_source.py,sha256=KBF9wdPC
|
|
71
71
|
airbyte_cdk/sources/declarative/datetime/__init__.py,sha256=l9LG7Qm6e5r_qgqfVKnx3mXYtg1I9MmMjomVIPfU4XA,177
|
72
72
|
airbyte_cdk/sources/declarative/datetime/datetime_parser.py,sha256=SX9JjdesN1edN2WVUVMzU_ptqp2QB1OnsnjZ4mwcX7w,2579
|
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=ezTm6hN-IvM_0FSgcxc-Axv_9lJBqmJc_vAR_RgsrO4,145340
|
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
|
@@ -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.3.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
|
364
|
+
airbyte_cdk-6.36.3.dist-info/LICENSE_SHORT,sha256=aqF6D1NcESmpn-cqsxBtszTEnHKnlsp8L4x9wAh3Nxg,55
|
365
|
+
airbyte_cdk-6.36.3.dist-info/METADATA,sha256=hOSYqconZWZ42hn8s2vyw_43Ou2dMvbj6M6XoIFMPmo,6010
|
366
|
+
airbyte_cdk-6.36.3.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
367
|
+
airbyte_cdk-6.36.3.dist-info/entry_points.txt,sha256=fj-e3PAQvsxsQzyyq8UkG1k8spunWnD4BAH2AwlR6NM,95
|
368
|
+
airbyte_cdk-6.36.3.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|