airbyte-cdk 6.12.2__py3-none-any.whl → 6.12.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.
@@ -43,11 +43,11 @@ class DeclarativeOauth2Authenticator(AbstractOauth2Authenticator, DeclarativeAut
43
43
  message_repository (MessageRepository): the message repository used to emit logs on HTTP requests
44
44
  """
45
45
 
46
- token_refresh_endpoint: Union[InterpolatedString, str]
47
46
  client_id: Union[InterpolatedString, str]
48
47
  client_secret: Union[InterpolatedString, str]
49
48
  config: Mapping[str, Any]
50
49
  parameters: InitVar[Mapping[str, Any]]
50
+ token_refresh_endpoint: Optional[Union[InterpolatedString, str]] = None
51
51
  refresh_token: Optional[Union[InterpolatedString, str]] = None
52
52
  scopes: Optional[List[str]] = None
53
53
  token_expiry_date: Optional[Union[InterpolatedString, str]] = None
@@ -55,6 +55,7 @@ class DeclarativeOauth2Authenticator(AbstractOauth2Authenticator, DeclarativeAut
55
55
  token_expiry_date_format: Optional[str] = None
56
56
  token_expiry_is_time_of_expiration: bool = False
57
57
  access_token_name: Union[InterpolatedString, str] = "access_token"
58
+ access_token_value: Optional[Union[InterpolatedString, str]] = None
58
59
  expires_in_name: Union[InterpolatedString, str] = "expires_in"
59
60
  refresh_request_body: Optional[Mapping[str, Any]] = None
60
61
  grant_type: Union[InterpolatedString, str] = "refresh_token"
@@ -62,9 +63,12 @@ class DeclarativeOauth2Authenticator(AbstractOauth2Authenticator, DeclarativeAut
62
63
 
63
64
  def __post_init__(self, parameters: Mapping[str, Any]) -> None:
64
65
  super().__init__()
65
- self._token_refresh_endpoint = InterpolatedString.create(
66
- self.token_refresh_endpoint, parameters=parameters
67
- )
66
+ if self.token_refresh_endpoint is not None:
67
+ self._token_refresh_endpoint: Optional[InterpolatedString] = InterpolatedString.create(
68
+ self.token_refresh_endpoint, parameters=parameters
69
+ )
70
+ else:
71
+ self._token_refresh_endpoint = None
68
72
  self._client_id = InterpolatedString.create(self.client_id, parameters=parameters)
69
73
  self._client_secret = InterpolatedString.create(self.client_secret, parameters=parameters)
70
74
  if self.refresh_token is not None:
@@ -92,20 +96,31 @@ class DeclarativeOauth2Authenticator(AbstractOauth2Authenticator, DeclarativeAut
92
96
  if self.token_expiry_date
93
97
  else pendulum.now().subtract(days=1) # type: ignore # substract does not have type hints
94
98
  )
95
- self._access_token: Optional[str] = None # access_token is initialized by a setter
99
+ if self.access_token_value is not None:
100
+ self._access_token_value = InterpolatedString.create(
101
+ self.access_token_value, parameters=parameters
102
+ ).eval(self.config)
103
+ else:
104
+ self._access_token_value = None
105
+
106
+ self._access_token: Optional[str] = (
107
+ self._access_token_value if self.access_token_value else None
108
+ )
96
109
 
97
110
  if self.get_grant_type() == "refresh_token" and self._refresh_token is None:
98
111
  raise ValueError(
99
112
  "OAuthAuthenticator needs a refresh_token parameter if grant_type is set to `refresh_token`"
100
113
  )
101
114
 
102
- def get_token_refresh_endpoint(self) -> str:
103
- refresh_token: str = self._token_refresh_endpoint.eval(self.config)
104
- if not refresh_token:
105
- raise ValueError(
106
- "OAuthAuthenticator was unable to evaluate token_refresh_endpoint parameter"
107
- )
108
- return refresh_token
115
+ def get_token_refresh_endpoint(self) -> Optional[str]:
116
+ if self._token_refresh_endpoint is not None:
117
+ refresh_token_endpoint: str = self._token_refresh_endpoint.eval(self.config)
118
+ if not refresh_token_endpoint:
119
+ raise ValueError(
120
+ "OAuthAuthenticator was unable to evaluate token_refresh_endpoint parameter"
121
+ )
122
+ return refresh_token_endpoint
123
+ return None
109
124
 
110
125
  def get_client_id(self) -> str:
111
126
  client_id: str = self._client_id.eval(self.config)
@@ -1021,7 +1021,6 @@ definitions:
1021
1021
  - type
1022
1022
  - client_id
1023
1023
  - client_secret
1024
- - token_refresh_endpoint
1025
1024
  properties:
1026
1025
  type:
1027
1026
  type: string
@@ -1060,6 +1059,12 @@ definitions:
1060
1059
  default: "access_token"
1061
1060
  examples:
1062
1061
  - access_token
1062
+ access_token_value:
1063
+ title: Access Token Value
1064
+ description: The value of the access_token to bypass the token refreshing using `refresh_token`.
1065
+ type: string
1066
+ examples:
1067
+ - secret_access_token_value
1063
1068
  expires_in_name:
1064
1069
  title: Token Expiry Property Name
1065
1070
  description: The name of the property which contains the expiry date in the response from the token refresh endpoint.
@@ -489,8 +489,8 @@ class OAuthAuthenticator(BaseModel):
489
489
  ],
490
490
  title="Refresh Token",
491
491
  )
492
- token_refresh_endpoint: str = Field(
493
- ...,
492
+ token_refresh_endpoint: Optional[str] = Field(
493
+ None,
494
494
  description="The full URL to call to obtain a new access token.",
495
495
  examples=["https://connect.squareup.com/oauth2/token"],
496
496
  title="Token Refresh Endpoint",
@@ -501,6 +501,12 @@ class OAuthAuthenticator(BaseModel):
501
501
  examples=["access_token"],
502
502
  title="Access Token Property Name",
503
503
  )
504
+ access_token_value: Optional[str] = Field(
505
+ None,
506
+ description="The value of the access_token to bypass the token refreshing using `refresh_token`.",
507
+ examples=["secret_access_token_value"],
508
+ title="Access Token Value",
509
+ )
504
510
  expires_in_name: Optional[str] = Field(
505
511
  "expires_in",
506
512
  description="The name of the property which contains the expiry date in the response from the token refresh endpoint.",
@@ -1800,7 +1800,8 @@ class ModelToComponentFactory:
1800
1800
  return DeclarativeSingleUseRefreshTokenOauth2Authenticator( # type: ignore
1801
1801
  config,
1802
1802
  InterpolatedString.create(
1803
- model.token_refresh_endpoint, parameters=model.parameters or {}
1803
+ model.token_refresh_endpoint, # type: ignore
1804
+ parameters=model.parameters or {},
1804
1805
  ).eval(config),
1805
1806
  access_token_name=InterpolatedString.create(
1806
1807
  model.access_token_name or "access_token", parameters=model.parameters or {}
@@ -1834,6 +1835,7 @@ class ModelToComponentFactory:
1834
1835
  # ignore type error because fixing it would have a lot of dependencies, revisit later
1835
1836
  return DeclarativeOauth2Authenticator( # type: ignore
1836
1837
  access_token_name=model.access_token_name or "access_token",
1838
+ access_token_value=model.access_token_value,
1837
1839
  client_id=model.client_id,
1838
1840
  client_secret=model.client_secret,
1839
1841
  expires_in_name=model.expires_in_name or "expires_in",
@@ -54,7 +54,12 @@ class AbstractOauth2Authenticator(AuthBase):
54
54
 
55
55
  def get_auth_header(self) -> Mapping[str, Any]:
56
56
  """HTTP header to set on the requests"""
57
- return {"Authorization": f"Bearer {self.get_access_token()}"}
57
+ token = self.access_token if self._is_access_token_flow else self.get_access_token()
58
+ return {"Authorization": f"Bearer {token}"}
59
+
60
+ @property
61
+ def _is_access_token_flow(self) -> bool:
62
+ return self.get_token_refresh_endpoint() is None and self.access_token is not None
58
63
 
59
64
  def get_access_token(self) -> str:
60
65
  """Returns the access token"""
@@ -121,7 +126,7 @@ class AbstractOauth2Authenticator(AuthBase):
121
126
  try:
122
127
  response = requests.request(
123
128
  method="POST",
124
- url=self.get_token_refresh_endpoint(),
129
+ url=self.get_token_refresh_endpoint(), # type: ignore # returns None, if not provided, but str | bytes is expected.
125
130
  data=self.build_refresh_request_body(),
126
131
  )
127
132
  if response.ok:
@@ -198,7 +203,7 @@ class AbstractOauth2Authenticator(AuthBase):
198
203
  return None
199
204
 
200
205
  @abstractmethod
201
- def get_token_refresh_endpoint(self) -> str:
206
+ def get_token_refresh_endpoint(self) -> Optional[str]:
202
207
  """Returns the endpoint to refresh the access token"""
203
208
 
204
209
  @abstractmethod
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: airbyte-cdk
3
- Version: 6.12.2
3
+ Version: 6.12.4
4
4
  Summary: A framework for writing Airbyte Connectors.
5
5
  Home-page: https://airbyte.com
6
6
  License: MIT
@@ -53,7 +53,7 @@ airbyte_cdk/sources/declarative/async_job/timer.py,sha256=Fb8P72CQ7jIzJyzMSSNuBf
53
53
  airbyte_cdk/sources/declarative/auth/__init__.py,sha256=hhiJV3kU5_fja7hQYWqbYjjtJPpaJdS2NiJpJLrG2uw,294
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=_4Kaa8ZfmvMzUyLeaWm03Aux9uVBh1ia-sSlUxVB24I,8480
56
+ airbyte_cdk/sources/declarative/auth/oauth.py,sha256=Yr0ljFjln9FIWudQohXARyKEo6-4ACG840pZoi6JVrE,9165
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
@@ -66,7 +66,7 @@ airbyte_cdk/sources/declarative/concurrent_declarative_source.py,sha256=PxP4p268
66
66
  airbyte_cdk/sources/declarative/datetime/__init__.py,sha256=l9LG7Qm6e5r_qgqfVKnx3mXYtg1I9MmMjomVIPfU4XA,177
67
67
  airbyte_cdk/sources/declarative/datetime/datetime_parser.py,sha256=SX9JjdesN1edN2WVUVMzU_ptqp2QB1OnsnjZ4mwcX7w,2579
68
68
  airbyte_cdk/sources/declarative/datetime/min_max_datetime.py,sha256=0BHBtDNQZfvwM45-tY5pNlTcKAFSGGNxemoi0Jic-0E,5785
69
- airbyte_cdk/sources/declarative/declarative_component_schema.yaml,sha256=wnrMdGjgTS_i-ikm4NNgFgTubtSafytAvkBMHqL94Ao,129417
69
+ airbyte_cdk/sources/declarative/declarative_component_schema.yaml,sha256=11mRmSliG_WNgMNoLSwTuwtV8-ebT7ar2vaMJH-6SCI,129628
70
70
  airbyte_cdk/sources/declarative/declarative_source.py,sha256=nF7wBqFd3AQmEKAm4CnIo29CJoQL562cJGSCeL8U8bA,1531
71
71
  airbyte_cdk/sources/declarative/declarative_stream.py,sha256=JRyNeOIpsFu4ztVZsN6sncqUEIqIE-bUkD2TPgbMgk0,10375
72
72
  airbyte_cdk/sources/declarative/decoders/__init__.py,sha256=hNlhaB5FjNC6IfJyglj5ZJWkYD2nEAukMDmzRz5PC6o,671
@@ -104,12 +104,12 @@ airbyte_cdk/sources/declarative/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW
104
104
  airbyte_cdk/sources/declarative/migrations/legacy_to_per_partition_state_migration.py,sha256=iemy3fKLczcU0-Aor7tx5jcT6DRedKMqyK7kCOp01hg,3924
105
105
  airbyte_cdk/sources/declarative/migrations/state_migration.py,sha256=KWPjealMLKSMtajXgkdGgKg7EmTLR-CqqD7UIh0-eDU,794
106
106
  airbyte_cdk/sources/declarative/models/__init__.py,sha256=nUFxNCiKeYRVXuZEKA7GD-lTHxsiKcQ8FitZjKhPIvE,100
107
- airbyte_cdk/sources/declarative/models/declarative_component_schema.py,sha256=kESlZ8F2i2q3BMZfEhwEk0XEzxr7SWtJti6AoPsthg0,90831
107
+ airbyte_cdk/sources/declarative/models/declarative_component_schema.py,sha256=R52aqtbZs81CQvo9gappzLr9eu2_TJmuT7NSfMDdhXI,91100
108
108
  airbyte_cdk/sources/declarative/parsers/__init__.py,sha256=ZnqYNxHsKCgO38IwB34RQyRMXTs4GTvlRi3ImKnIioo,61
109
109
  airbyte_cdk/sources/declarative/parsers/custom_exceptions.py,sha256=Rir9_z3Kcd5Es0-LChrzk-0qubAsiK_RSEnLmK2OXm8,553
110
110
  airbyte_cdk/sources/declarative/parsers/manifest_component_transformer.py,sha256=CXwTfD3wSQq3okcqwigpprbHhSURUokh4GK2OmOyKC8,9132
111
111
  airbyte_cdk/sources/declarative/parsers/manifest_reference_resolver.py,sha256=IWUOdF03o-aQn0Occo1BJCxU0Pz-QILk5L67nzw2thw,6803
112
- airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py,sha256=-9l95OSRfoH2AsCqK0Ub_OE_e504wUYVmhHuVUPfuj0,106067
112
+ airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py,sha256=aSJwsGHHjRUGbQNgqf53fVkZ-3PsTeIEcvzTw-s-KP0,106161
113
113
  airbyte_cdk/sources/declarative/partition_routers/__init__.py,sha256=974SY1RFwitUCiiDHuFHDGmSNu1D72z3bSTpvlBwAho,911
114
114
  airbyte_cdk/sources/declarative/partition_routers/async_job_partition_router.py,sha256=n82J15S8bjeMZ5uROu--P3hnbQoxkY5v7RPHYx7g7ro,2929
115
115
  airbyte_cdk/sources/declarative/partition_routers/cartesian_product_stream_slicer.py,sha256=c5cuVFM6NFkuQqG8Z5IwkBuwDrvXZN1CunUOM_L0ezg,6892
@@ -284,7 +284,7 @@ airbyte_cdk/sources/streams/http/http.py,sha256=JAMpiTdS9HFNOlwayWNvQdxoqs2rpW9w
284
284
  airbyte_cdk/sources/streams/http/http_client.py,sha256=tDE0ROtxjGMVphvsw8INvGMtZ97hIF-v47pZ3jIyiwc,23011
285
285
  airbyte_cdk/sources/streams/http/rate_limiting.py,sha256=IwdjrHKUnU97XO4qONgYRv4YYW51xQ8SJm4WLafXDB8,6351
286
286
  airbyte_cdk/sources/streams/http/requests_native_auth/__init__.py,sha256=RN0D3nOX1xLgwEwKWu6pkGy3XqBFzKSNZ8Lf6umU2eY,413
287
- airbyte_cdk/sources/streams/http/requests_native_auth/abstract_oauth.py,sha256=nxI94yJ3bGfpDO8RR3QvOJ-PSW0n9CElSAkgl5ae80Y,10321
287
+ airbyte_cdk/sources/streams/http/requests_native_auth/abstract_oauth.py,sha256=sxmrQKAvN8piamssL3xh8KXevTwdaXuLs2O0hNEA5aQ,10635
288
288
  airbyte_cdk/sources/streams/http/requests_native_auth/abstract_token.py,sha256=Y3n7J-sk5yGjv_OxtY6Z6k0PEsFZmtIRi-x0KCbaHdA,1010
289
289
  airbyte_cdk/sources/streams/http/requests_native_auth/oauth.py,sha256=ka-bBRWvIv09LmZNYl49p2lK9nd_Tvi2g0lIp3OkU40,14872
290
290
  airbyte_cdk/sources/streams/http/requests_native_auth/token.py,sha256=h5PTzcdH-RQLeCg7xZ45w_484OPUDSwNWl_iMJQmZoI,2526
@@ -339,8 +339,8 @@ airbyte_cdk/utils/slice_hasher.py,sha256=-pHexlNYoWYPnXNH-M7HEbjmeJe9Zk7SJijdQ7d
339
339
  airbyte_cdk/utils/spec_schema_transformations.py,sha256=-5HTuNsnDBAhj-oLeQXwpTGA0HdcjFOf2zTEMUTTg_Y,816
340
340
  airbyte_cdk/utils/stream_status_utils.py,sha256=ZmBoiy5HVbUEHAMrUONxZvxnvfV9CesmQJLDTAIWnWw,1171
341
341
  airbyte_cdk/utils/traced_exception.py,sha256=C8uIBuCL_E4WnBAOPSxBicD06JAldoN9fGsQDp463OY,6292
342
- airbyte_cdk-6.12.2.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
343
- airbyte_cdk-6.12.2.dist-info/METADATA,sha256=NscmIGw1p7Qbi33_lKCZ01teTeqBPAX057dVpDDYwmE,5988
344
- airbyte_cdk-6.12.2.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
345
- airbyte_cdk-6.12.2.dist-info/entry_points.txt,sha256=fj-e3PAQvsxsQzyyq8UkG1k8spunWnD4BAH2AwlR6NM,95
346
- airbyte_cdk-6.12.2.dist-info/RECORD,,
342
+ airbyte_cdk-6.12.4.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
343
+ airbyte_cdk-6.12.4.dist-info/METADATA,sha256=D834aeGVbK09HrQAPdzr5CQpYGyIbDiimRO10ltuF2Q,5988
344
+ airbyte_cdk-6.12.4.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
345
+ airbyte_cdk-6.12.4.dist-info/entry_points.txt,sha256=fj-e3PAQvsxsQzyyq8UkG1k8spunWnD4BAH2AwlR6NM,95
346
+ airbyte_cdk-6.12.4.dist-info/RECORD,,