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.
@@ -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
- - urls_extractor
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
- urls_extractor:
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
- url_requester:
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, BytesIO, TextIOWrapper
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
- bytes_data = BytesIO(data.read())
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
- urls_extractor: Union[CustomRecordExtractor, DpathExtractor] = Field(
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
- url_requester: Optional[Union[CustomRequester, HttpRequester]] = Field(
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
- url_requester = (
2747
+ download_target_requester = (
2748
2748
  self._create_component_from_model(
2749
- model=model.url_requester,
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.url_requester
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
- urls_extractor = self._create_component_from_model(
2761
- model=model.urls_extractor, decoder=decoder, config=config, name=name
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
- url_requester=url_requester,
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
- urls_extractor=urls_extractor,
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 `url_requester` is not provided, `urls_extractor` will get urls from the `polling_job_response`
5
- - interpolation_context, e.g. `create_job_response` or `polling_job_response` can be obtained from stream_slice
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 url_requester (Optional)
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: `create_job_response`)
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: `polling_job_response`)
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
- urls_extractor: DpathExtractor
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
- url_requester: Optional[Requester] = (
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 url in self._get_download_url(job):
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={**job_slice.extra_fields, "url": url},
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={"create_job_response": self._create_job_response_by_id[job.api_job_id()]},
277
+ partition={},
274
278
  cursor_slice={},
279
+ extra_fields={"creation_response": creation_response},
275
280
  )
276
281
  return stream_slice
277
282
 
278
- def _get_download_url(self, job: AsyncJob) -> Iterable[str]:
279
- if not self.url_requester:
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.url_requester.send_request(stream_slice=stream_slice) # type: ignore # we expect url_requester to always be presented, otherwise raise an exception as we cannot proceed with the report
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 url_requester",
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.urls_extractor.extract_records(url_response) # type: ignore # we expect urls_extractor to always return list of strings
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("/")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: airbyte-cdk
3
- Version: 6.36.3.dev0
3
+ Version: 6.36.4
4
4
  Summary: A framework for writing Airbyte Connectors.
5
5
  Home-page: https://airbyte.com
6
6
  License: MIT
@@ -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=SX9JjdesN1edN2WVUVMzU_ptqp2QB1OnsnjZ4mwcX7w,2579
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=5o5GsltzbVL2jyXvjWzUoV_r5xpwG_YdLSVUuG_d_34,144548
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=54ag8xx_BcZcXuhVp1VkC2AE-KdY2cUgLVUORWaP-ig,5080
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=gNL9DqajD2A8UBnKAz7F7YQuYH7frQyHiPQPIMGq2xo,101958
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=dj7b3s8jaDV7Tb7EXVSzkvC8QY-mxyOf48rxkSMws6A,134851
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=eL1I4iLkxaw7hJi9S9d18_XcRl-R8lUSjqBVJJzvXmg,2656
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=Wjh5ARW1kcuRfihfFEloQ_l1N6yY1NN_4qFZJiqlH4o,11612
146
- airbyte_cdk/sources/declarative/requesters/http_requester.py,sha256=pR2uR5b9eGyvYIOYwus3mz3OaqRu1ozwja_ys1SE7hc,14952
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.3.dev0.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
364
- airbyte_cdk-6.36.3.dev0.dist-info/LICENSE_SHORT,sha256=aqF6D1NcESmpn-cqsxBtszTEnHKnlsp8L4x9wAh3Nxg,55
365
- airbyte_cdk-6.36.3.dev0.dist-info/METADATA,sha256=IvkvzmBsCDO9JoaNx-h-185jaiJA7VWpfnKB6cgw-W0,6015
366
- airbyte_cdk-6.36.3.dev0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
367
- airbyte_cdk-6.36.3.dev0.dist-info/entry_points.txt,sha256=fj-e3PAQvsxsQzyyq8UkG1k8spunWnD4BAH2AwlR6NM,95
368
- airbyte_cdk-6.36.3.dev0.dist-info/RECORD,,
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,,