airbyte-cdk 6.24.0.dev1__py3-none-any.whl → 6.25.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.
@@ -3,11 +3,12 @@
3
3
  #
4
4
 
5
5
  from dataclasses import InitVar, dataclass, field
6
- from typing import Any, List, Mapping, Optional, Union
6
+ from typing import Any, List, Mapping, MutableMapping, Optional, Union
7
7
 
8
8
  import pendulum
9
9
 
10
10
  from airbyte_cdk.sources.declarative.auth.declarative_authenticator import DeclarativeAuthenticator
11
+ from airbyte_cdk.sources.declarative.interpolation.interpolated_boolean import InterpolatedBoolean
11
12
  from airbyte_cdk.sources.declarative.interpolation.interpolated_mapping import InterpolatedMapping
12
13
  from airbyte_cdk.sources.declarative.interpolation.interpolated_string import InterpolatedString
13
14
  from airbyte_cdk.sources.message import MessageRepository, NoopMessageRepository
@@ -44,10 +45,10 @@ class DeclarativeOauth2Authenticator(AbstractOauth2Authenticator, DeclarativeAut
44
45
  message_repository (MessageRepository): the message repository used to emit logs on HTTP requests
45
46
  """
46
47
 
47
- client_id: Union[InterpolatedString, str]
48
- client_secret: Union[InterpolatedString, str]
49
48
  config: Mapping[str, Any]
50
49
  parameters: InitVar[Mapping[str, Any]]
50
+ client_id: Optional[Union[InterpolatedString, str]] = None
51
+ client_secret: Optional[Union[InterpolatedString, str]] = None
51
52
  token_refresh_endpoint: Optional[Union[InterpolatedString, str]] = None
52
53
  refresh_token: Optional[Union[InterpolatedString, str]] = None
53
54
  scopes: Optional[List[str]] = None
@@ -66,6 +67,8 @@ class DeclarativeOauth2Authenticator(AbstractOauth2Authenticator, DeclarativeAut
66
67
  grant_type_name: Union[InterpolatedString, str] = "grant_type"
67
68
  grant_type: Union[InterpolatedString, str] = "refresh_token"
68
69
  message_repository: MessageRepository = NoopMessageRepository()
70
+ profile_assertion: Optional[DeclarativeAuthenticator] = None
71
+ use_profile_assertion: Optional[Union[InterpolatedBoolean, str, bool]] = False
69
72
 
70
73
  def __post_init__(self, parameters: Mapping[str, Any]) -> None:
71
74
  super().__init__()
@@ -76,11 +79,19 @@ class DeclarativeOauth2Authenticator(AbstractOauth2Authenticator, DeclarativeAut
76
79
  else:
77
80
  self._token_refresh_endpoint = None
78
81
  self._client_id_name = InterpolatedString.create(self.client_id_name, parameters=parameters)
79
- self._client_id = InterpolatedString.create(self.client_id, parameters=parameters)
82
+ self._client_id = (
83
+ InterpolatedString.create(self.client_id, parameters=parameters)
84
+ if self.client_id
85
+ else self.client_id
86
+ )
80
87
  self._client_secret_name = InterpolatedString.create(
81
88
  self.client_secret_name, parameters=parameters
82
89
  )
83
- self._client_secret = InterpolatedString.create(self.client_secret, parameters=parameters)
90
+ self._client_secret = (
91
+ InterpolatedString.create(self.client_secret, parameters=parameters)
92
+ if self.client_secret
93
+ else self.client_secret
94
+ )
84
95
  self._refresh_token_name = InterpolatedString.create(
85
96
  self.refresh_token_name, parameters=parameters
86
97
  )
@@ -99,7 +110,12 @@ class DeclarativeOauth2Authenticator(AbstractOauth2Authenticator, DeclarativeAut
99
110
  self.grant_type_name = InterpolatedString.create(
100
111
  self.grant_type_name, parameters=parameters
101
112
  )
102
- self.grant_type = InterpolatedString.create(self.grant_type, parameters=parameters)
113
+ self.grant_type = InterpolatedString.create(
114
+ "urn:ietf:params:oauth:grant-type:jwt-bearer"
115
+ if self.use_profile_assertion
116
+ else self.grant_type,
117
+ parameters=parameters,
118
+ )
103
119
  self._refresh_request_body = InterpolatedMapping(
104
120
  self.refresh_request_body or {}, parameters=parameters
105
121
  )
@@ -115,6 +131,13 @@ class DeclarativeOauth2Authenticator(AbstractOauth2Authenticator, DeclarativeAut
115
131
  if self.token_expiry_date
116
132
  else pendulum.now().subtract(days=1) # type: ignore # substract does not have type hints
117
133
  )
134
+ self.use_profile_assertion = (
135
+ InterpolatedBoolean(self.use_profile_assertion, parameters=parameters)
136
+ if isinstance(self.use_profile_assertion, str)
137
+ else self.use_profile_assertion
138
+ )
139
+ self.assertion_name = "assertion"
140
+
118
141
  if self.access_token_value is not None:
119
142
  self._access_token_value = InterpolatedString.create(
120
143
  self.access_token_value, parameters=parameters
@@ -126,9 +149,20 @@ class DeclarativeOauth2Authenticator(AbstractOauth2Authenticator, DeclarativeAut
126
149
  self._access_token_value if self.access_token_value else None
127
150
  )
128
151
 
152
+ if not self.use_profile_assertion and any(
153
+ client_creds is None for client_creds in [self.client_id, self.client_secret]
154
+ ):
155
+ raise ValueError(
156
+ "OAuthAuthenticator configuration error: Both 'client_id' and 'client_secret' are required for the "
157
+ "basic OAuth flow."
158
+ )
159
+ if self.profile_assertion is None and self.use_profile_assertion:
160
+ raise ValueError(
161
+ "OAuthAuthenticator configuration error: 'profile_assertion' is required when using the profile assertion flow."
162
+ )
129
163
  if self.get_grant_type() == "refresh_token" and self._refresh_token is None:
130
164
  raise ValueError(
131
- "OAuthAuthenticator needs a refresh_token parameter if grant_type is set to `refresh_token`"
165
+ "OAuthAuthenticator configuration error: A 'refresh_token' is required when the 'grant_type' is set to 'refresh_token'."
132
166
  )
133
167
 
134
168
  def get_token_refresh_endpoint(self) -> Optional[str]:
@@ -145,19 +179,21 @@ class DeclarativeOauth2Authenticator(AbstractOauth2Authenticator, DeclarativeAut
145
179
  return self._client_id_name.eval(self.config) # type: ignore # eval returns a string in this context
146
180
 
147
181
  def get_client_id(self) -> str:
148
- client_id: str = self._client_id.eval(self.config)
182
+ client_id = self._client_id.eval(self.config) if self._client_id else self._client_id
149
183
  if not client_id:
150
184
  raise ValueError("OAuthAuthenticator was unable to evaluate client_id parameter")
151
- return client_id
185
+ return client_id # type: ignore # value will be returned as a string, or an error will be raised
152
186
 
153
187
  def get_client_secret_name(self) -> str:
154
188
  return self._client_secret_name.eval(self.config) # type: ignore # eval returns a string in this context
155
189
 
156
190
  def get_client_secret(self) -> str:
157
- client_secret: str = self._client_secret.eval(self.config)
191
+ client_secret = (
192
+ self._client_secret.eval(self.config) if self._client_secret else self._client_secret
193
+ )
158
194
  if not client_secret:
159
195
  raise ValueError("OAuthAuthenticator was unable to evaluate client_secret parameter")
160
- return client_secret
196
+ return client_secret # type: ignore # value will be returned as a string, or an error will be raised
161
197
 
162
198
  def get_refresh_token_name(self) -> str:
163
199
  return self._refresh_token_name.eval(self.config) # type: ignore # eval returns a string in this context
@@ -192,6 +228,27 @@ class DeclarativeOauth2Authenticator(AbstractOauth2Authenticator, DeclarativeAut
192
228
  def set_token_expiry_date(self, value: Union[str, int]) -> None:
193
229
  self._token_expiry_date = self._parse_token_expiration_date(value)
194
230
 
231
+ def get_assertion_name(self) -> str:
232
+ return self.assertion_name
233
+
234
+ def get_assertion(self) -> str:
235
+ if self.profile_assertion is None:
236
+ raise ValueError("profile_assertion is not set")
237
+ return self.profile_assertion.token
238
+
239
+ def build_refresh_request_body(self) -> Mapping[str, Any]:
240
+ """
241
+ Returns the request body to set on the refresh request
242
+
243
+ Override to define additional parameters
244
+ """
245
+ if self.use_profile_assertion:
246
+ return {
247
+ self.get_grant_type_name(): self.get_grant_type(),
248
+ self.get_assertion_name(): self.get_assertion(),
249
+ }
250
+ return super().build_refresh_request_body()
251
+
195
252
  @property
196
253
  def access_token(self) -> str:
197
254
  if self._access_token is None:
@@ -1081,8 +1081,6 @@ definitions:
1081
1081
  type: object
1082
1082
  required:
1083
1083
  - type
1084
- - client_id
1085
- - client_secret
1086
1084
  properties:
1087
1085
  type:
1088
1086
  type: string
@@ -1277,6 +1275,15 @@ definitions:
1277
1275
  default: []
1278
1276
  examples:
1279
1277
  - ["invalid_grant", "invalid_permissions"]
1278
+ profile_assertion:
1279
+ title: Profile Assertion
1280
+ description: The authenticator being used to authenticate the client authenticator.
1281
+ "$ref": "#/definitions/JwtAuthenticator"
1282
+ use_profile_assertion:
1283
+ title: Use Profile Assertion
1284
+ description: Enable using profile assertion as a flow for OAuth authorization.
1285
+ type: boolean
1286
+ default: false
1280
1287
  $parameters:
1281
1288
  type: object
1282
1289
  additionalProperties: true
@@ -223,7 +223,7 @@ class PerPartitionCursor(DeclarativeCursor):
223
223
  ) -> Mapping[str, Any]:
224
224
  if stream_slice:
225
225
  if self._to_partition_key(stream_slice.partition) not in self._cursor_per_partition:
226
- self.create_cursor_for_partition(self._to_partition_key(stream_slice.partition))
226
+ self._create_cursor_for_partition(self._to_partition_key(stream_slice.partition))
227
227
  return self._partition_router.get_request_params( # type: ignore # this always returns a mapping
228
228
  stream_state=stream_state,
229
229
  stream_slice=StreamSlice(partition=stream_slice.partition, cursor_slice={}),
@@ -247,7 +247,7 @@ class PerPartitionCursor(DeclarativeCursor):
247
247
  ) -> Mapping[str, Any]:
248
248
  if stream_slice:
249
249
  if self._to_partition_key(stream_slice.partition) not in self._cursor_per_partition:
250
- self.create_cursor_for_partition(self._to_partition_key(stream_slice.partition))
250
+ self._create_cursor_for_partition(self._to_partition_key(stream_slice.partition))
251
251
  return self._partition_router.get_request_headers( # type: ignore # this always returns a mapping
252
252
  stream_state=stream_state,
253
253
  stream_slice=StreamSlice(partition=stream_slice.partition, cursor_slice={}),
@@ -271,7 +271,7 @@ class PerPartitionCursor(DeclarativeCursor):
271
271
  ) -> Union[Mapping[str, Any], str]:
272
272
  if stream_slice:
273
273
  if self._to_partition_key(stream_slice.partition) not in self._cursor_per_partition:
274
- self.create_cursor_for_partition(self._to_partition_key(stream_slice.partition))
274
+ self._create_cursor_for_partition(self._to_partition_key(stream_slice.partition))
275
275
  return self._partition_router.get_request_body_data( # type: ignore # this always returns a mapping
276
276
  stream_state=stream_state,
277
277
  stream_slice=StreamSlice(partition=stream_slice.partition, cursor_slice={}),
@@ -295,7 +295,7 @@ class PerPartitionCursor(DeclarativeCursor):
295
295
  ) -> Mapping[str, Any]:
296
296
  if stream_slice:
297
297
  if self._to_partition_key(stream_slice.partition) not in self._cursor_per_partition:
298
- self.create_cursor_for_partition(self._to_partition_key(stream_slice.partition))
298
+ self._create_cursor_for_partition(self._to_partition_key(stream_slice.partition))
299
299
  return self._partition_router.get_request_body_json( # type: ignore # this always returns a mapping
300
300
  stream_state=stream_state,
301
301
  stream_slice=StreamSlice(partition=stream_slice.partition, cursor_slice={}),
@@ -349,11 +349,29 @@ class PerPartitionCursor(DeclarativeCursor):
349
349
  )
350
350
  partition_key = self._to_partition_key(record.associated_slice.partition)
351
351
  if partition_key not in self._cursor_per_partition:
352
- self.create_cursor_for_partition(partition_key)
352
+ self._create_cursor_for_partition(partition_key)
353
353
  cursor = self._cursor_per_partition[partition_key]
354
354
  return cursor
355
355
 
356
- def create_cursor_for_partition(self, partition_key: str) -> None:
356
+ def _create_cursor_for_partition(self, partition_key: str) -> None:
357
+ """
358
+ Dynamically creates and initializes a cursor for the specified partition.
359
+
360
+ This method is required for `ConcurrentPerPartitionCursor`. For concurrent cursors,
361
+ stream_slices is executed only for the concurrent cursor, so cursors per partition
362
+ are not created for the declarative cursor. This method ensures that a cursor is available
363
+ to create requests for the specified partition. The cursor is initialized
364
+ with the per-partition state if present in the initial state, or with the global state
365
+ adjusted by the lookback window, or with the state to migrate from.
366
+
367
+ Note:
368
+ This is a temporary workaround and should be removed once the declarative cursor
369
+ is decoupled from the concurrent cursor implementation.
370
+
371
+ Args:
372
+ partition_key (str): The unique identifier for the partition for which the cursor
373
+ needs to be created.
374
+ """
357
375
  partition_state = (
358
376
  self._state_to_migrate_from if self._state_to_migrate_from else self._NO_CURSOR_STATE
359
377
  )
@@ -506,8 +506,8 @@ class OAuthAuthenticator(BaseModel):
506
506
  examples=["custom_app_id"],
507
507
  title="Client ID Property Name",
508
508
  )
509
- client_id: str = Field(
510
- ...,
509
+ client_id: Optional[str] = Field(
510
+ None,
511
511
  description="The OAuth client ID. Fill it in the user inputs.",
512
512
  examples=["{{ config['client_id }}", "{{ config['credentials']['client_id }}"],
513
513
  title="Client ID",
@@ -518,8 +518,8 @@ class OAuthAuthenticator(BaseModel):
518
518
  examples=["custom_app_secret"],
519
519
  title="Client Secret Property Name",
520
520
  )
521
- client_secret: str = Field(
522
- ...,
521
+ client_secret: Optional[str] = Field(
522
+ None,
523
523
  description="The OAuth client secret. Fill it in the user inputs.",
524
524
  examples=[
525
525
  "{{ config['client_secret }}",
@@ -624,6 +624,16 @@ class OAuthAuthenticator(BaseModel):
624
624
  description="When the token updater is defined, new refresh tokens, access tokens and the access token expiry date are written back from the authentication response to the config object. This is important if the refresh token can only used once.",
625
625
  title="Token Updater",
626
626
  )
627
+ profile_assertion: Optional[JwtAuthenticator] = Field(
628
+ None,
629
+ description="The authenticator being used to authenticate the client authenticator.",
630
+ title="Profile Assertion",
631
+ )
632
+ use_profile_assertion: Optional[bool] = Field(
633
+ False,
634
+ description="Enable using profile assertion as a flow for OAuth authorization.",
635
+ title="Use Profile Assertion",
636
+ )
627
637
  parameters: Optional[Dict[str, Any]] = Field(None, alias="$parameters")
628
638
 
629
639
 
@@ -2100,6 +2100,12 @@ class ModelToComponentFactory:
2100
2100
  def create_oauth_authenticator(
2101
2101
  self, model: OAuthAuthenticatorModel, config: Config, **kwargs: Any
2102
2102
  ) -> DeclarativeOauth2Authenticator:
2103
+ profile_assertion = (
2104
+ self._create_component_from_model(model.profile_assertion, config=config)
2105
+ if model.profile_assertion
2106
+ else None
2107
+ )
2108
+
2103
2109
  if model.refresh_token_updater:
2104
2110
  # ignore type error because fixing it would have a lot of dependencies, revisit later
2105
2111
  return DeclarativeSingleUseRefreshTokenOauth2Authenticator( # type: ignore
@@ -2120,13 +2126,17 @@ class ModelToComponentFactory:
2120
2126
  ).eval(config),
2121
2127
  client_id=InterpolatedString.create(
2122
2128
  model.client_id, parameters=model.parameters or {}
2123
- ).eval(config),
2129
+ ).eval(config)
2130
+ if model.client_id
2131
+ else model.client_id,
2124
2132
  client_secret_name=InterpolatedString.create(
2125
2133
  model.client_secret_name or "client_secret", parameters=model.parameters or {}
2126
2134
  ).eval(config),
2127
2135
  client_secret=InterpolatedString.create(
2128
2136
  model.client_secret, parameters=model.parameters or {}
2129
- ).eval(config),
2137
+ ).eval(config)
2138
+ if model.client_secret
2139
+ else model.client_secret,
2130
2140
  access_token_config_path=model.refresh_token_updater.access_token_config_path,
2131
2141
  refresh_token_config_path=model.refresh_token_updater.refresh_token_config_path,
2132
2142
  token_expiry_date_config_path=model.refresh_token_updater.token_expiry_date_config_path,
@@ -2172,6 +2182,8 @@ class ModelToComponentFactory:
2172
2182
  config=config,
2173
2183
  parameters=model.parameters or {},
2174
2184
  message_repository=self._message_repository,
2185
+ profile_assertion=profile_assertion,
2186
+ use_profile_assertion=model.use_profile_assertion,
2175
2187
  )
2176
2188
 
2177
2189
  def create_offset_increment(
@@ -45,7 +45,7 @@ def format_http_message(
45
45
  log_message["http"]["is_auxiliary"] = is_auxiliary # type: ignore [index]
46
46
  if stream_name:
47
47
  log_message["airbyte_cdk"] = {"stream": {"name": stream_name}}
48
- return log_message # type: ignore [return-value] # got "dict[str, object]", expected "dict[str, JsonType]"
48
+ return log_message # type: ignore[return-value] # got "dict[str, object]", expected "dict[str, JsonType]"
49
49
 
50
50
 
51
51
  def _normalize_body_string(body_str: Optional[Union[str, bytes]]) -> Optional[str]:
@@ -95,16 +95,16 @@ class Oauth2Authenticator(AbstractOauth2Authenticator):
95
95
  return self._access_token_name
96
96
 
97
97
  def get_scopes(self) -> list[str]:
98
- return self._scopes # type: ignore [return-value]
98
+ return self._scopes # type: ignore[return-value]
99
99
 
100
100
  def get_expires_in_name(self) -> str:
101
101
  return self._expires_in_name
102
102
 
103
103
  def get_refresh_request_body(self) -> Mapping[str, Any]:
104
- return self._refresh_request_body # type: ignore [return-value]
104
+ return self._refresh_request_body # type: ignore[return-value]
105
105
 
106
106
  def get_refresh_request_headers(self) -> Mapping[str, Any]:
107
- return self._refresh_request_headers # type: ignore [return-value]
107
+ return self._refresh_request_headers # type: ignore[return-value]
108
108
 
109
109
  def get_grant_type_name(self) -> str:
110
110
  return self._grant_type_name
@@ -128,11 +128,11 @@ class Oauth2Authenticator(AbstractOauth2Authenticator):
128
128
 
129
129
  @property
130
130
  def access_token(self) -> str:
131
- return self._access_token # type: ignore [return-value]
131
+ return self._access_token # type: ignore[return-value]
132
132
 
133
133
  @access_token.setter
134
134
  def access_token(self, value: str) -> None:
135
- self._access_token = value # type: ignore [assignment] # Incorrect type for assignment
135
+ self._access_token = value # type: ignore[assignment] # Incorrect type for assignment
136
136
 
137
137
 
138
138
  class SingleUseRefreshTokenOauth2Authenticator(Oauth2Authenticator):
@@ -192,15 +192,15 @@ class SingleUseRefreshTokenOauth2Authenticator(Oauth2Authenticator):
192
192
  message_repository (MessageRepository): the message repository used to emit logs on HTTP requests and control message on config update
193
193
  """
194
194
  self._client_id = (
195
- client_id # type: ignore [assignment] # Incorrect type for assignment
195
+ client_id # type: ignore[assignment] # Incorrect type for assignment
196
196
  if client_id is not None
197
- else dpath.get(connector_config, ("credentials", "client_id")) # type: ignore [arg-type]
197
+ else dpath.get(connector_config, ("credentials", "client_id")) # type: ignore[arg-type]
198
198
  )
199
199
  self._client_secret = (
200
- client_secret # type: ignore [assignment] # Incorrect type for assignment
200
+ client_secret # type: ignore[assignment] # Incorrect type for assignment
201
201
  if client_secret is not None
202
202
  else dpath.get(
203
- connector_config, # type: ignore [arg-type]
203
+ connector_config, # type: ignore[arg-type]
204
204
  ("credentials", "client_secret"),
205
205
  )
206
206
  )
@@ -248,8 +248,8 @@ class SingleUseRefreshTokenOauth2Authenticator(Oauth2Authenticator):
248
248
 
249
249
  @property
250
250
  def access_token(self) -> str:
251
- return dpath.get( # type: ignore [return-value]
252
- self._connector_config, # type: ignore [arg-type]
251
+ return dpath.get( # type: ignore[return-value]
252
+ self._connector_config, # type: ignore[arg-type]
253
253
  self._access_token_config_path,
254
254
  default="",
255
255
  )
@@ -257,39 +257,39 @@ class SingleUseRefreshTokenOauth2Authenticator(Oauth2Authenticator):
257
257
  @access_token.setter
258
258
  def access_token(self, new_access_token: str) -> None:
259
259
  dpath.new(
260
- self._connector_config, # type: ignore [arg-type]
260
+ self._connector_config, # type: ignore[arg-type]
261
261
  self._access_token_config_path,
262
262
  new_access_token,
263
263
  )
264
264
 
265
265
  def get_refresh_token(self) -> str:
266
- return dpath.get( # type: ignore [return-value]
267
- self._connector_config, # type: ignore [arg-type]
266
+ return dpath.get( # type: ignore[return-value]
267
+ self._connector_config, # type: ignore[arg-type]
268
268
  self._refresh_token_config_path,
269
269
  default="",
270
270
  )
271
271
 
272
272
  def set_refresh_token(self, new_refresh_token: str) -> None:
273
273
  dpath.new(
274
- self._connector_config, # type: ignore [arg-type]
274
+ self._connector_config, # type: ignore[arg-type]
275
275
  self._refresh_token_config_path,
276
276
  new_refresh_token,
277
277
  )
278
278
 
279
279
  def get_token_expiry_date(self) -> pendulum.DateTime:
280
280
  expiry_date = dpath.get(
281
- self._connector_config, # type: ignore [arg-type]
281
+ self._connector_config, # type: ignore[arg-type]
282
282
  self._token_expiry_date_config_path,
283
283
  default="",
284
284
  )
285
- return pendulum.now().subtract(days=1) if expiry_date == "" else pendulum.parse(expiry_date) # type: ignore [arg-type, return-value, no-untyped-call]
285
+ return pendulum.now().subtract(days=1) if expiry_date == "" else pendulum.parse(expiry_date) # type: ignore[arg-type, return-value, no-untyped-call]
286
286
 
287
287
  def set_token_expiry_date( # type: ignore[override]
288
288
  self,
289
289
  new_token_expiry_date: pendulum.DateTime,
290
290
  ) -> None:
291
291
  dpath.new(
292
- self._connector_config, # type: ignore [arg-type]
292
+ self._connector_config, # type: ignore[arg-type]
293
293
  self._token_expiry_date_config_path,
294
294
  str(new_token_expiry_date),
295
295
  )
@@ -329,10 +329,10 @@ class SingleUseRefreshTokenOauth2Authenticator(Oauth2Authenticator):
329
329
  # message directly in the console, this is needed
330
330
  if not isinstance(self._message_repository, NoopMessageRepository):
331
331
  self._message_repository.emit_message(
332
- create_connector_config_control_message(self._connector_config) # type: ignore [arg-type]
332
+ create_connector_config_control_message(self._connector_config) # type: ignore[arg-type]
333
333
  )
334
334
  else:
335
- emit_configuration_as_airbyte_control_message(self._connector_config) # type: ignore [arg-type]
335
+ emit_configuration_as_airbyte_control_message(self._connector_config) # type: ignore[arg-type]
336
336
  return self.access_token
337
337
 
338
338
  def refresh_access_token( # type: ignore[override] # Signature doesn't match base class
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: airbyte-cdk
3
- Version: 6.24.0.dev1
3
+ Version: 6.25.1
4
4
  Summary: A framework for writing Airbyte Connectors.
5
5
  License: MIT
6
6
  Keywords: airbyte,connector-development-kit,cdk
@@ -53,7 +53,7 @@ airbyte_cdk/sources/declarative/async_job/timer.py,sha256=Fb8P72CQ7jIzJyzMSSNuBf
53
53
  airbyte_cdk/sources/declarative/auth/__init__.py,sha256=e2CRrcBWGhz3sQu3Oh34d1riEIwXipGS8hrSB1pu0Oo,284
54
54
  airbyte_cdk/sources/declarative/auth/declarative_authenticator.py,sha256=nf-OmRUHYG4ORBwyb5CANzuHEssE-oNmL-Lccn41Td8,1099
55
55
  airbyte_cdk/sources/declarative/auth/jwt.py,sha256=7r5q1zOekjw8kEmEk1oUyovzVt3cbD6BuFnRILeLZi8,8250
56
- airbyte_cdk/sources/declarative/auth/oauth.py,sha256=GhXWheC5GkKV7req3jBCY0aTbFwCuQ5RRSfZi3jFphM,11002
56
+ airbyte_cdk/sources/declarative/auth/oauth.py,sha256=EoSPxwe40A6VT5K4N7n7TnrGr7wQD4eMltfOBVeuMMQ,13506
57
57
  airbyte_cdk/sources/declarative/auth/selective_authenticator.py,sha256=qGwC6YsCldr1bIeKG6Qo-A9a5cTdHw-vcOn3OtQrS4c,1540
58
58
  airbyte_cdk/sources/declarative/auth/token.py,sha256=r4u3WXyVa7WmiSZ9-eZXlrUI-pS0D4YWJnwjLzwV-Fk,11210
59
59
  airbyte_cdk/sources/declarative/auth/token_provider.py,sha256=9oq3dcBPAPwXSfkISjhA05dMhIzxaDQTmwOydBrnsMk,3028
@@ -67,7 +67,7 @@ airbyte_cdk/sources/declarative/concurrent_declarative_source.py,sha256=wbfk5udu
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=TDpCeMw4_8X_omCEvgqhYoHD5mKfJGUoswdfHFqPio8,138886
70
+ airbyte_cdk/sources/declarative/declarative_component_schema.yaml,sha256=40Ts1-r0UnF3AhAj9pXE2pf6Y8WBqRAksjTaBiCuxq0,139243
71
71
  airbyte_cdk/sources/declarative/declarative_source.py,sha256=nF7wBqFd3AQmEKAm4CnIo29CJoQL562cJGSCeL8U8bA,1531
72
72
  airbyte_cdk/sources/declarative/declarative_stream.py,sha256=JRyNeOIpsFu4ztVZsN6sncqUEIqIE-bUkD2TPgbMgk0,10375
73
73
  airbyte_cdk/sources/declarative/decoders/__init__.py,sha256=KSpQetKGqPCv-38QgcVJ5kzM5nzbFldTSsYDCS3Xf0Y,1035
@@ -92,7 +92,7 @@ airbyte_cdk/sources/declarative/incremental/concurrent_partition_cursor.py,sha25
92
92
  airbyte_cdk/sources/declarative/incremental/datetime_based_cursor.py,sha256=_UzUnSIUsDbRgbFTXgSyZEFb4ws-KdhdQPWO8mFbV7U,22028
93
93
  airbyte_cdk/sources/declarative/incremental/declarative_cursor.py,sha256=5Bhw9VRPyIuCaD0wmmq_L3DZsa-rJgtKSEUzSd8YYD0,536
94
94
  airbyte_cdk/sources/declarative/incremental/global_substream_cursor.py,sha256=9HO-QbL9akvjq2NP7l498RwLA4iQZlBMQW1tZbt34I8,15943
95
- airbyte_cdk/sources/declarative/incremental/per_partition_cursor.py,sha256=KmL5M5Y7Cwwxb8h8JgTRnWqCy7IONTBimzb2v-3QzYU,16762
95
+ airbyte_cdk/sources/declarative/incremental/per_partition_cursor.py,sha256=9IAJTCiRUXvhFFz-IhZtYh_KfAjLHqthsYf2jErQRls,17728
96
96
  airbyte_cdk/sources/declarative/incremental/per_partition_with_global.py,sha256=2YBOA2NnwAeIKlIhSwUB_W-FaGnPcmrG_liY7b4mV2Y,8365
97
97
  airbyte_cdk/sources/declarative/incremental/resumable_full_refresh_cursor.py,sha256=10LFv1QPM-agVKl6eaANmEBOfd7gZgBrkoTcMggsieQ,4809
98
98
  airbyte_cdk/sources/declarative/interpolation/__init__.py,sha256=tjUJkn3B-iZ-p7RP2c3dVZejrGiQeooGmS5ibWTuUL4,437
@@ -109,13 +109,13 @@ airbyte_cdk/sources/declarative/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW
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=gyG17G9wExCx2E5H5D5N1IySKBbaqZPhOzP1iMwgU0Q,97458
112
+ airbyte_cdk/sources/declarative/models/declarative_component_schema.py,sha256=9SHqGpoMDIysyFLzkZoAehbsroHQKYPctIwXmSqO4Zw,97888
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=SdQojVgs-LmhqCemtngS3XqtzXZj2gSqAoPdRCZFEs8,121612
118
+ airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py,sha256=a96vNwEc3J8S99KGtSt2G147leh8GADfkTrejVCBXzs,122064
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=n82J15S8bjeMZ5uROu--P3hnbQoxkY5v7RPHYx7g7ro,2929
121
121
  airbyte_cdk/sources/declarative/partition_routers/cartesian_product_stream_slicer.py,sha256=c5cuVFM6NFkuQqG8Z5IwkBuwDrvXZN1CunUOM_L0ezg,6892
@@ -243,7 +243,7 @@ airbyte_cdk/sources/file_based/stream/cursor/default_file_based_cursor.py,sha256
243
243
  airbyte_cdk/sources/file_based/stream/default_file_based_stream.py,sha256=XLU5cNqQ-5mj243gNzMyXtm_oCtg1ORyoqbCsUo9Dn4,18044
244
244
  airbyte_cdk/sources/file_based/types.py,sha256=INxG7OPnkdUP69oYNKMAbwhvV1AGvLRHs1J6pIia2FI,218
245
245
  airbyte_cdk/sources/http_config.py,sha256=OBZeuyFilm6NlDlBhFQvHhTWabEvZww6OHDIlZujIS0,730
246
- airbyte_cdk/sources/http_logger.py,sha256=TyBmtRA6D9g0XDkKGvdM415b36RXDjgfkwRewDsH8-0,1576
246
+ airbyte_cdk/sources/http_logger.py,sha256=l_1fk5YwdonZ1wvAsTwjj6d36fj2WrVraIAMj5jTQdM,1575
247
247
  airbyte_cdk/sources/message/__init__.py,sha256=y98fzHsQBwXwp2zEa4K5mxGFqjnx9lDn9O0pTk-VS4U,395
248
248
  airbyte_cdk/sources/message/repository.py,sha256=SG7avgti_-dj8FcRHTTrhgLLGJbElv14_zIB0SH8AIc,4763
249
249
  airbyte_cdk/sources/source.py,sha256=KIBBH5VLEb8BZ8B9aROlfaI6OLoJqKDPMJ10jkAR7nk,3611
@@ -297,7 +297,7 @@ airbyte_cdk/sources/streams/http/rate_limiting.py,sha256=IwdjrHKUnU97XO4qONgYRv4
297
297
  airbyte_cdk/sources/streams/http/requests_native_auth/__init__.py,sha256=RN0D3nOX1xLgwEwKWu6pkGy3XqBFzKSNZ8Lf6umU2eY,413
298
298
  airbyte_cdk/sources/streams/http/requests_native_auth/abstract_oauth.py,sha256=-GDNyqccdutOftFpqCvvk81NwkskHhDZ8QcsUKzNjRQ,11660
299
299
  airbyte_cdk/sources/streams/http/requests_native_auth/abstract_token.py,sha256=Y3n7J-sk5yGjv_OxtY6Z6k0PEsFZmtIRi-x0KCbaHdA,1010
300
- airbyte_cdk/sources/streams/http/requests_native_auth/oauth.py,sha256=OCNokL0GypjN8PUVJk1UFJVE5THkHAbNDmB984_F7W0,16718
300
+ airbyte_cdk/sources/streams/http/requests_native_auth/oauth.py,sha256=Zse4ve1MvPJBx-7CDtTBTmPuT6b9koGLMGpmd5188Y8,16698
301
301
  airbyte_cdk/sources/streams/http/requests_native_auth/token.py,sha256=h5PTzcdH-RQLeCg7xZ45w_484OPUDSwNWl_iMJQmZoI,2526
302
302
  airbyte_cdk/sources/streams/utils/__init__.py,sha256=4Hw-PX1-VgESLF16cDdvuYCzGJtHntThLF4qIiULWeo,61
303
303
  airbyte_cdk/sources/types.py,sha256=nLPkTpyfGV4E6e99qcBWX4r8C3fE4I8Fvgx2EjvT9ic,5005
@@ -350,8 +350,8 @@ airbyte_cdk/utils/slice_hasher.py,sha256=-pHexlNYoWYPnXNH-M7HEbjmeJe9Zk7SJijdQ7d
350
350
  airbyte_cdk/utils/spec_schema_transformations.py,sha256=-5HTuNsnDBAhj-oLeQXwpTGA0HdcjFOf2zTEMUTTg_Y,816
351
351
  airbyte_cdk/utils/stream_status_utils.py,sha256=ZmBoiy5HVbUEHAMrUONxZvxnvfV9CesmQJLDTAIWnWw,1171
352
352
  airbyte_cdk/utils/traced_exception.py,sha256=C8uIBuCL_E4WnBAOPSxBicD06JAldoN9fGsQDp463OY,6292
353
- airbyte_cdk-6.24.0.dev1.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
354
- airbyte_cdk-6.24.0.dev1.dist-info/METADATA,sha256=RKRE4RKnlXguLIvre6rfpJl24E2r-mLjoAFClAzSfFU,6001
355
- airbyte_cdk-6.24.0.dev1.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
356
- airbyte_cdk-6.24.0.dev1.dist-info/entry_points.txt,sha256=fj-e3PAQvsxsQzyyq8UkG1k8spunWnD4BAH2AwlR6NM,95
357
- airbyte_cdk-6.24.0.dev1.dist-info/RECORD,,
353
+ airbyte_cdk-6.25.1.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
354
+ airbyte_cdk-6.25.1.dist-info/METADATA,sha256=-GwhDgrPHloQoypcXxNAkh2QV5cPejFe7MEGiYd9w6w,5996
355
+ airbyte_cdk-6.25.1.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
356
+ airbyte_cdk-6.25.1.dist-info/entry_points.txt,sha256=fj-e3PAQvsxsQzyyq8UkG1k8spunWnD4BAH2AwlR6NM,95
357
+ airbyte_cdk-6.25.1.dist-info/RECORD,,