UncountablePythonSDK 0.0.51__py3-none-any.whl → 0.0.53__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.

Potentially problematic release.


This version of UncountablePythonSDK might be problematic. Click here for more details.

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.51
3
+ Version: 0.0.53
4
4
  Summary: Uncountable SDK
5
5
  Project-URL: Homepage, https://github.com/uncountableinc/uncountable-python-sdk
6
6
  Project-URL: Repository, https://github.com/uncountableinc/uncountable-python-sdk.git
@@ -3,7 +3,7 @@ docs/conf.py,sha256=YF5J-9g_Wg8wXmyHsGaE8xYlDEzqocNl3UWUmP0CwBg,1702
3
3
  docs/index.md,sha256=eEdirX_Ds6ICTRtIS5iT4irCquHcQyKN7E4M5QP9T8A,257
4
4
  docs/justfile,sha256=cvNcpb-ByPOF2aCrFlg3DDZBoYMx5W8xGdr13m9HcnI,215
5
5
  docs/quickstart.md,sha256=3GuJ0MB1O5kjlsrgAmdSkDq0rYqATrYy-tzEHDy8H-c,422
6
- docs/requirements.txt,sha256=YDDAaHfuLxkdLhrjEUJeHDE-NSmD5chTgVTIO7BEeto,139
6
+ docs/requirements.txt,sha256=jD38J5O9MhuLHpA86cUgbFO8fVXouYupS3nGRAnh2x0,138
7
7
  docs/static/logo_blue.png,sha256=SyYpMTVhhBbhF5Wl8lWaVwz-_p1MIR6dW6bVhufQRME,46708
8
8
  docs/static/favicons/android-chrome-192x192.png,sha256=XoF-AhD55JlSBDGsEPJKfT_VeXT-awhwKyZnxLhrwvk,1369
9
9
  docs/static/favicons/android-chrome-512x512.png,sha256=1S4xwY9YtJQ5ifFsZ-DOzssoyBYs0t9uwdOUmYx0Xso,3888
@@ -28,7 +28,7 @@ pkgs/argument_parser/case_convert.py,sha256=NuJLJUJRbyVb6_Slen4uqaStEHbcOS1d-hBB
28
28
  pkgs/filesystem_utils/__init__.py,sha256=NSsQrUCoGISBCqCCyq6_583sYHTVEQeDjDO8hvZn3ag,1261
29
29
  pkgs/filesystem_utils/_gdrive_session.py,sha256=OZudNoP2HikolnpurVJhJdh5fgzqbaZQvn53ReGGXx4,11015
30
30
  pkgs/filesystem_utils/_local_session.py,sha256=xFEYhAvNqrOYqwt4jrEYOuYkjJn0zclZhTelW_Q1-rw,2325
31
- pkgs/filesystem_utils/_s3_session.py,sha256=q4q0MTWXWu5RNRVZ5ibv4M4UXXxWl_J6xCnitvngIMM,3957
31
+ pkgs/filesystem_utils/_s3_session.py,sha256=LtFGCs6nhIY6z8wWCC5mQYDg54qFIo4iFIBwCeXMcZU,3909
32
32
  pkgs/filesystem_utils/_sftp_session.py,sha256=gNoUD_b4MuVqWj31nU-FpfpXZlyWkwdEHtX1S8W6gpQ,4727
33
33
  pkgs/filesystem_utils/file_type_utils.py,sha256=Xd-mg35mAENUgNJVz5uK8nEfrUp-NQld_gnXFEq3K-8,1487
34
34
  pkgs/filesystem_utils/filesystem_session.py,sha256=BQ2Go8Mu9-GcnaWh2Pm4x7ugLVsres6XrOQ8RoiEpcE,1045
@@ -83,8 +83,8 @@ uncountable/integration/construct_client.py,sha256=e1uAMVp4FTbValCJ3gfaZFuObKxHb
83
83
  uncountable/integration/cron.py,sha256=e5456IYJF2ipiSsd1R2T334lfe7mtp-gwP7JpS645L0,1858
84
84
  uncountable/integration/entrypoint.py,sha256=9rk06gBTsCqytIs8Shsnlf6ir_4Uq5d5rfP1veiSLzc,1437
85
85
  uncountable/integration/job.py,sha256=UTzcMes2KrBBRLOM3u94imMKLLnv50glqOkNf8-JOZw,1022
86
- uncountable/integration/server.py,sha256=JlnbidtiSLCEod0DzLKIzTCxP1qgaHBIBolUvnihJn8,3980
87
- uncountable/integration/telemetry.py,sha256=H5XQnRTszDL6Nl_oQYuWRr_oNYMocDaCCpKlwll-qZI,5127
86
+ uncountable/integration/server.py,sha256=bmX-ukLiNDq0ThVB2lUyXl-vtID5HI4gqJHxhsVNG3w,4440
87
+ uncountable/integration/telemetry.py,sha256=wgQnaWZFmUM_4lwyghOmL4Pd8DU0qUJvxXcrgBekAKQ,5261
88
88
  uncountable/integration/db/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
89
89
  uncountable/integration/db/connect.py,sha256=YtQHJ1DBGPhxKFRCfiXqohOYUceKSxMVOJ88aPI48Ug,181
90
90
  uncountable/integration/executors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -92,8 +92,8 @@ uncountable/integration/executors/executors.py,sha256=v5ClGVUlvrZcMdmGQa8Ll668G_
92
92
  uncountable/integration/executors/generic_upload_executor.py,sha256=wafNY_gpbUiQhvkFPDw-GGiJLmDVtTRgH_5jwMLy2Z4,10283
93
93
  uncountable/integration/executors/script_executor.py,sha256=OmSBOtU48G3mqza9c2lCm84pGGyaDk-ZBJCx3RsdJXc,846
94
94
  uncountable/integration/secret_retrieval/__init__.py,sha256=3QXVj35w8rRMxVvmmsViFYDi3lcb3g70incfalOEm6o,87
95
- uncountable/integration/secret_retrieval/retrieve_secret.py,sha256=iDqLbYKKLv8Wl5hNSKl7b4hKJnDshFe6tgdAJmQgQyA,2205
96
- uncountable/types/__init__.py,sha256=95iOd3WXWoI_4a461IS2ieWRic3zRyNaCYzfTpX764o,8162
95
+ uncountable/integration/secret_retrieval/retrieve_secret.py,sha256=BS1dXVaChgpgBDKWkcLrl9hBDQIASRQMr3l41ytfbEc,3036
96
+ uncountable/types/__init__.py,sha256=UuLBpo8Uxv9k-UZS8DINg3y-LPrs2dC7Qg83BB8p2_k,8222
97
97
  uncountable/types/async_batch.py,sha256=ihCv5XWSTTPmuO-GMPn1EACGI2CBUIJTATZ3aPgsNBA,523
98
98
  uncountable/types/async_batch_processor.py,sha256=R--exgi4Gw0HWCnh8M-3_2PqG2ByTBtdyuSQ2eYtYn8,8671
99
99
  uncountable/types/async_batch_t.py,sha256=9jp9rOyetRdD5aQVyijzQggTyYU4021PBVGXk0ooBCQ,1911
@@ -130,6 +130,8 @@ uncountable/types/job_definition.py,sha256=Cgwop6iNcWEsEpfjMl1EtkRES_3-SVzpMe-w7
130
130
  uncountable/types/job_definition_t.py,sha256=pL-0YVyR0oz6-5wWXJsX1UyYo4R_FPwhOYFj9iMKgvo,7170
131
131
  uncountable/types/outputs.py,sha256=sUZx_X-TKCZtLm1YCEH8OISX9DdPlv9ZuUfM3-askCc,281
132
132
  uncountable/types/outputs_t.py,sha256=2aORUOr0ls1ZYo-ddkWax3D1ZndmQsWtHfJxpYozlhg,656
133
+ uncountable/types/overrides.py,sha256=Mv-smwK1B3pvbt48fNOiqkeQn9wMgYlBFJKUBOJqceE,431
134
+ uncountable/types/overrides_t.py,sha256=-DMuW3Iqxlf7pb3HmPN8cswYrhG9UrRstRUzM9wDVHo,960
133
135
  uncountable/types/permissions.py,sha256=1mRnSsmRgjuLgp6pylTwwACD_YRIcmlqxHkufwZtMns,297
134
136
  uncountable/types/permissions_t.py,sha256=i0vFwVvmmnInrA5qW8uuo0_tM6KYn3VYZ75d9084Vko,1625
135
137
  uncountable/types/phases.py,sha256=YCsU77DdjRJJWdLTwLuOZNG4e9ML82NIBI1xTWr3ggA,266
@@ -155,7 +157,7 @@ uncountable/types/recipes_t.py,sha256=04dh2wn_lIWB3KF36sxcdJxb_JDclkHp5g3AHbfoc-
155
157
  uncountable/types/response.py,sha256=WOlSgQYKK_fnnXk1i-h3Bwx2ZiYqpLj-lnt-hXhmbWs,274
156
158
  uncountable/types/response_t.py,sha256=jjTyB0bM-xEz7WjqPb6GUIkMgUvqXvM9trMdKdIcAZw,622
157
159
  uncountable/types/secret_retrieval.py,sha256=Jt_-sjYBKBwJytS4QgF1KnUVEEu9YAsCYI3NtYlbqa4,592
158
- uncountable/types/secret_retrieval_t.py,sha256=UQjkNUKMDMRG-44vXE28MxcD5HjHWQD9LTRMmMVx1EI,1864
160
+ uncountable/types/secret_retrieval_t.py,sha256=i9Aq1HoNvARYVgKmSjTjECUYp1AZtW4052hYJi9Jngo,1930
159
161
  uncountable/types/units.py,sha256=R_TBhxWCIWSSXK9J3S0Omtj3t5BZNK9C80MyqFjMO7k,275
160
162
  uncountable/types/units_t.py,sha256=w_k7SQ_J_-XTGY-BMcWC5sQi2z3uInqtrRUPHgniuew,559
161
163
  uncountable/types/users.py,sha256=YEk8v0vDOBFvmOQMQw7MAOicSGzMui8Hb9hdFX2Vw3E,275
@@ -240,7 +242,7 @@ uncountable/types/api/triggers/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr
240
242
  uncountable/types/api/triggers/run_trigger.py,sha256=_Rpha9nxXI3Xr17CrGDtofg4HZ81x2lt0rMZ6As0qfE,893
241
243
  uncountable/types/api/uploader/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
242
244
  uncountable/types/api/uploader/invoke_uploader.py,sha256=4zOcB_38uT73Jm3-XqkG40fBM1R5vpvPpGAg-U4lzxY,1059
243
- UncountablePythonSDK-0.0.51.dist-info/METADATA,sha256=AzvBprRKL--Fkabx8qrLx9P07XsCyTu1BqpTGl9AMFg,1934
244
- UncountablePythonSDK-0.0.51.dist-info/WHEEL,sha256=Mdi9PDNwEZptOjTlUcAth7XJDFtKrHYaQMPulZeBCiQ,91
245
- UncountablePythonSDK-0.0.51.dist-info/top_level.txt,sha256=1UVGjAU-6hJY9qw2iJ7nCBeEwZ793AEN5ZfKX9A1uj4,31
246
- UncountablePythonSDK-0.0.51.dist-info/RECORD,,
245
+ UncountablePythonSDK-0.0.53.dist-info/METADATA,sha256=grgR1LMtYrZy0VXQH5w99anOyuZr7qC26fCjfRJk7BE,1934
246
+ UncountablePythonSDK-0.0.53.dist-info/WHEEL,sha256=Mdi9PDNwEZptOjTlUcAth7XJDFtKrHYaQMPulZeBCiQ,91
247
+ UncountablePythonSDK-0.0.53.dist-info/top_level.txt,sha256=1UVGjAU-6hJY9qw2iJ7nCBeEwZ793AEN5ZfKX9A1uj4,31
248
+ UncountablePythonSDK-0.0.53.dist-info/RECORD,,
docs/requirements.txt CHANGED
@@ -1,7 +1,7 @@
1
- furo==2024.7.18
2
- myst-parser==3.0.1
1
+ furo==2024.8.6
2
+ myst-parser==4.0.0
3
3
  sphinx-autoapi==3.2.0
4
4
  sphinx-copybutton==0.5.2
5
5
  Sphinx==8.0.0
6
- sphinx_design==0.6.0
6
+ sphinx_design==0.6.1
7
7
  sphinx-favicon==1.0.1
@@ -85,7 +85,7 @@ class S3Session(FileSystemSession):
85
85
  or file_object.filename is None
86
86
  ):
87
87
  raise IncompatibleFileReference()
88
- s3_file_obj = self.bucket.Object(_add_slash(file_object.filepath))
88
+ s3_file_obj = self.bucket.Object(file_object.filepath)
89
89
  response = s3_file_obj.get()
90
90
  file_obj_bytes = response["Body"].read()
91
91
  downloaded_files.append(
@@ -107,10 +107,10 @@ class S3Session(FileSystemSession):
107
107
  dest_file, FileSystemFileReference
108
108
  ):
109
109
  raise IncompatibleFileReference()
110
- self.bucket.Object(_add_slash(dest_file.filepath)).copy_from(
110
+ self.bucket.Object(dest_file.filepath).copy_from(
111
111
  CopySource={
112
112
  "Bucket": self.bucket.name,
113
- "Key": _add_slash(src_file.filepath),
113
+ "Key": src_file.filepath,
114
114
  }
115
115
  )
116
- self.bucket.Object(_add_slash(src_file.filepath)).delete()
116
+ self.bucket.Object(src_file.filepath).delete()
@@ -5,6 +5,8 @@ import os
5
5
 
6
6
  import boto3
7
7
 
8
+ from pkgs.argument_parser import CachedParser
9
+ from uncountable.types import overrides_t
8
10
  from uncountable.types.job_definition_t import ProfileMetadata
9
11
  from uncountable.types.secret_retrieval_t import (
10
12
  SecretRetrieval,
@@ -46,9 +48,31 @@ def _get_aws_secret(*, secret_name: str, region_name: str, sub_key: str | None)
46
48
  return str(value)
47
49
 
48
50
 
51
+ @functools.cache
52
+ def _load_secret_overrides(profile_name: str) -> dict[SecretRetrieval, str]:
53
+ overrides_parser = CachedParser(overrides_t.Overrides)
54
+ profiles_module = os.environ["UNC_PROFILES_MODULE"]
55
+ try:
56
+ overrides = overrides_parser.parse_yaml_resource(
57
+ package=".".join([profiles_module, profile_name]),
58
+ resource="local_overrides.yaml",
59
+ )
60
+ return {
61
+ override.secret_retrieval: override.value for override in overrides.secrets
62
+ }
63
+ except FileNotFoundError:
64
+ return {}
65
+
66
+
49
67
  def retrieve_secret(
50
68
  secret_retrieval: SecretRetrieval, profile_metadata: ProfileMetadata
51
69
  ) -> str:
70
+ value_from_override = _load_secret_overrides(profile_metadata.name).get(
71
+ secret_retrieval
72
+ )
73
+ if value_from_override is not None:
74
+ return value_from_override
75
+
52
76
  match secret_retrieval:
53
77
  case SecretRetrievalEnv():
54
78
  env_name = (
@@ -11,6 +11,7 @@ from apscheduler.triggers.cron import CronTrigger
11
11
  from sqlalchemy.engine.base import Engine
12
12
 
13
13
  from uncountable.integration.cron import CronJobArgs, cron_job_executor
14
+ from uncountable.integration.telemetry import Logger
14
15
  from uncountable.types import base_t
15
16
  from uncountable.types.client_config_t import ClientConfigOptions
16
17
  from uncountable.types.job_definition_t import (
@@ -26,6 +27,7 @@ _MAX_APSCHEDULER_CONCURRENT_JOBS = 1
26
27
  class IntegrationServer:
27
28
  _scheduler: BaseScheduler
28
29
  _engine: Engine
30
+ _server_logger: Logger
29
31
 
30
32
  def __init__(self, engine: Engine) -> None:
31
33
  self._engine = engine
@@ -34,6 +36,7 @@ class IntegrationServer:
34
36
  jobstores={"default": SQLAlchemyJobStore(engine=engine)},
35
37
  executors={"default": ThreadPoolExecutor(_MAX_APSCHEDULER_CONCURRENT_JOBS)},
36
38
  )
39
+ self._server_logger = Logger()
37
40
 
38
41
  def register_profile(
39
42
  self,
@@ -59,7 +62,14 @@ class IntegrationServer:
59
62
  definition=job_defn, profile_metadata=profile_metadata
60
63
  )
61
64
  )
62
- existing_job = self._scheduler.get_job(job_defn.id)
65
+ try:
66
+ existing_job = self._scheduler.get_job(job_defn.id)
67
+ except ValueError as e:
68
+ self._server_logger.log_warning(
69
+ f"could not reconstitute job {job_defn.id}: {e}"
70
+ )
71
+ self._scheduler.remove_job(job_defn.id)
72
+ existing_job = None
63
73
  if existing_job is not None:
64
74
  existing_job.modify(
65
75
  name=job_defn.name,
@@ -49,10 +49,39 @@ class LogSeverity(StrEnum):
49
49
  ERROR = "Error"
50
50
 
51
51
 
52
- class JobLogger:
52
+ class Logger:
53
53
  current_span_id: int | None = None
54
54
  current_trace_id: int | None = None
55
55
 
56
+ def _patch_attributes(self, attributes: Attributes | None) -> Attributes:
57
+ return attributes or {}
58
+
59
+ def _emit_log(
60
+ self, message: str, *, severity: LogSeverity, attributes: Attributes | None
61
+ ) -> None:
62
+ log_record = LogRecord(
63
+ body=message,
64
+ severity_text=severity,
65
+ timestamp=time.time_ns(),
66
+ attributes=self._patch_attributes(attributes),
67
+ span_id=self.current_span_id,
68
+ trace_id=self.current_trace_id,
69
+ )
70
+ log_file: TextIO = sys.stderr if severity == LogSeverity.ERROR else sys.stdout
71
+ log_file.write(log_record.to_json())
72
+ log_file.flush()
73
+
74
+ def log_info(self, message: str, *, attributes: Attributes | None = None) -> None:
75
+ self._emit_log(message=message, severity=LogSeverity.INFO, attributes=attributes)
76
+
77
+ def log_warning(self, message: str, *, attributes: Attributes | None = None) -> None:
78
+ self._emit_log(message=message, severity=LogSeverity.WARN, attributes=attributes)
79
+
80
+ def log_error(self, message: str, *, attributes: Attributes | None = None) -> None:
81
+ self._emit_log(message=message, severity=LogSeverity.ERROR, attributes=attributes)
82
+
83
+
84
+ class JobLogger(Logger):
56
85
  def __init__(
57
86
  self,
58
87
  *,
@@ -104,27 +133,3 @@ class JobLogger:
104
133
  self.current_span_id = span.get_span_context().span_id
105
134
  self.current_trace_id = span.get_span_context().trace_id
106
135
  yield self
107
-
108
- def _emit_log(
109
- self, message: str, *, severity: LogSeverity, attributes: Attributes | None
110
- ) -> None:
111
- log_record = LogRecord(
112
- body=message,
113
- severity_text=severity,
114
- timestamp=time.time_ns(),
115
- attributes=self._patch_attributes(attributes),
116
- span_id=self.current_span_id,
117
- trace_id=self.current_trace_id,
118
- )
119
- log_file: TextIO = sys.stderr if severity == LogSeverity.ERROR else sys.stdout
120
- log_file.write(log_record.to_json())
121
- log_file.flush()
122
-
123
- def log_info(self, message: str, *, attributes: Attributes | None = None) -> None:
124
- self._emit_log(message=message, severity=LogSeverity.INFO, attributes=attributes)
125
-
126
- def log_warning(self, message: str, *, attributes: Attributes | None = None) -> None:
127
- self._emit_log(message=message, severity=LogSeverity.WARN, attributes=attributes)
128
-
129
- def log_error(self, message: str, *, attributes: Attributes | None = None) -> None:
130
- self._emit_log(message=message, severity=LogSeverity.ERROR, attributes=attributes)
@@ -58,6 +58,7 @@ from .api.entity import lock_entity as lock_entity_t
58
58
  from .api.recipes import lock_recipes as lock_recipes_t
59
59
  from .api.id_source import match_id_source as match_id_source_t
60
60
  from . import outputs_t as outputs_t
61
+ from . import overrides_t as overrides_t
61
62
  from . import permissions_t as permissions_t
62
63
  from . import phases_t as phases_t
63
64
  from . import post_base_t as post_base_t
@@ -154,6 +155,7 @@ __all__: list[str] = [
154
155
  "lock_recipes_t",
155
156
  "match_id_source_t",
156
157
  "outputs_t",
158
+ "overrides_t",
157
159
  "permissions_t",
158
160
  "phases_t",
159
161
  "post_base_t",
@@ -0,0 +1,10 @@
1
+ # flake8: noqa: F821
2
+ # ruff: noqa: E402 Q003
3
+ # fmt: off
4
+ # isort: skip_file
5
+ # DO NOT MODIFY -- This file is generated by type_spec
6
+ # Kept only for SDK backwards compatibility
7
+ from .overrides_t import SecretRetrievalOverride as SecretRetrievalOverride
8
+ from .overrides_t import SecretRetrievalOverrides as SecretRetrievalOverrides
9
+ from .overrides_t import Overrides as Overrides
10
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,36 @@
1
+ # DO NOT MODIFY -- This file is generated by type_spec
2
+ # flake8: noqa: F821
3
+ # ruff: noqa: E402 Q003
4
+ # fmt: off
5
+ # isort: skip_file
6
+ from __future__ import annotations
7
+ import typing # noqa: F401
8
+ import datetime # noqa: F401
9
+ from decimal import Decimal # noqa: F401
10
+ import dataclasses
11
+ from . import secret_retrieval_t
12
+
13
+ __all__: list[str] = [
14
+ "Overrides",
15
+ "SecretRetrievalOverride",
16
+ "SecretRetrievalOverrides",
17
+ ]
18
+
19
+
20
+ # DO NOT MODIFY -- This file is generated by type_spec
21
+ @dataclasses.dataclass(kw_only=True)
22
+ class SecretRetrievalOverride:
23
+ profile_name: str
24
+ secret_retrieval: secret_retrieval_t.SecretRetrieval
25
+ value: str
26
+
27
+
28
+ # DO NOT MODIFY -- This file is generated by type_spec
29
+ SecretRetrievalOverrides = list[SecretRetrievalOverride]
30
+
31
+
32
+ # DO NOT MODIFY -- This file is generated by type_spec
33
+ @dataclasses.dataclass(kw_only=True)
34
+ class Overrides:
35
+ secrets: SecretRetrievalOverrides
36
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -22,7 +22,7 @@ __all__: list[str] = [
22
22
 
23
23
 
24
24
  # DO NOT MODIFY -- This file is generated by type_spec
25
- @dataclasses.dataclass(kw_only=True)
25
+ @dataclasses.dataclass(kw_only=True, frozen=True, eq=True)
26
26
  class SecretRetrievalBase:
27
27
  type: SecretRetrievalType
28
28
 
@@ -37,7 +37,7 @@ class SecretRetrievalType(StrEnum):
37
37
  @serial_class(
38
38
  parse_require={"type"},
39
39
  )
40
- @dataclasses.dataclass(kw_only=True)
40
+ @dataclasses.dataclass(kw_only=True, frozen=True, eq=True)
41
41
  class SecretRetrievalEnv(SecretRetrievalBase):
42
42
  type: typing.Literal[SecretRetrievalType.ENV] = SecretRetrievalType.ENV
43
43
  env_key: str
@@ -47,7 +47,7 @@ class SecretRetrievalEnv(SecretRetrievalBase):
47
47
  @serial_class(
48
48
  parse_require={"type"},
49
49
  )
50
- @dataclasses.dataclass(kw_only=True)
50
+ @dataclasses.dataclass(kw_only=True, frozen=True, eq=True)
51
51
  class SecretRetrievalAWS(SecretRetrievalBase):
52
52
  type: typing.Literal[SecretRetrievalType.AWS] = SecretRetrievalType.AWS
53
53
  secret_name: str