pyxecm 1.6__py3-none-any.whl → 2.0.0__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 pyxecm might be problematic. Click here for more details.

Files changed (56) hide show
  1. pyxecm/__init__.py +6 -4
  2. pyxecm/avts.py +673 -246
  3. pyxecm/coreshare.py +686 -467
  4. pyxecm/customizer/__init__.py +16 -4
  5. pyxecm/customizer/__main__.py +58 -0
  6. pyxecm/customizer/api/__init__.py +5 -0
  7. pyxecm/customizer/api/__main__.py +6 -0
  8. pyxecm/customizer/api/app.py +914 -0
  9. pyxecm/customizer/api/auth.py +154 -0
  10. pyxecm/customizer/api/metrics.py +92 -0
  11. pyxecm/customizer/api/models.py +13 -0
  12. pyxecm/customizer/api/payload_list.py +865 -0
  13. pyxecm/customizer/api/settings.py +103 -0
  14. pyxecm/customizer/browser_automation.py +332 -139
  15. pyxecm/customizer/customizer.py +1007 -1130
  16. pyxecm/customizer/exceptions.py +35 -0
  17. pyxecm/customizer/guidewire.py +322 -0
  18. pyxecm/customizer/k8s.py +713 -378
  19. pyxecm/customizer/log.py +107 -0
  20. pyxecm/customizer/m365.py +2867 -909
  21. pyxecm/customizer/nhc.py +1169 -0
  22. pyxecm/customizer/openapi.py +258 -0
  23. pyxecm/customizer/payload.py +16817 -7467
  24. pyxecm/customizer/pht.py +699 -285
  25. pyxecm/customizer/salesforce.py +516 -342
  26. pyxecm/customizer/sap.py +58 -41
  27. pyxecm/customizer/servicenow.py +593 -371
  28. pyxecm/customizer/settings.py +442 -0
  29. pyxecm/customizer/successfactors.py +408 -346
  30. pyxecm/customizer/translate.py +83 -48
  31. pyxecm/helper/__init__.py +5 -2
  32. pyxecm/helper/assoc.py +83 -43
  33. pyxecm/helper/data.py +2406 -870
  34. pyxecm/helper/logadapter.py +27 -0
  35. pyxecm/helper/web.py +229 -101
  36. pyxecm/helper/xml.py +527 -171
  37. pyxecm/maintenance_page/__init__.py +5 -0
  38. pyxecm/maintenance_page/__main__.py +6 -0
  39. pyxecm/maintenance_page/app.py +51 -0
  40. pyxecm/maintenance_page/settings.py +28 -0
  41. pyxecm/maintenance_page/static/favicon.avif +0 -0
  42. pyxecm/maintenance_page/templates/maintenance.html +165 -0
  43. pyxecm/otac.py +234 -140
  44. pyxecm/otawp.py +1436 -557
  45. pyxecm/otcs.py +7716 -3161
  46. pyxecm/otds.py +2150 -919
  47. pyxecm/otiv.py +36 -21
  48. pyxecm/otmm.py +1272 -325
  49. pyxecm/otpd.py +231 -127
  50. pyxecm-2.0.0.dist-info/METADATA +145 -0
  51. pyxecm-2.0.0.dist-info/RECORD +54 -0
  52. {pyxecm-1.6.dist-info → pyxecm-2.0.0.dist-info}/WHEEL +1 -1
  53. pyxecm-1.6.dist-info/METADATA +0 -53
  54. pyxecm-1.6.dist-info/RECORD +0 -32
  55. {pyxecm-1.6.dist-info → pyxecm-2.0.0.dist-info/licenses}/LICENSE +0 -0
  56. {pyxecm-1.6.dist-info → pyxecm-2.0.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,442 @@
1
+ """Settings for Customizer execution."""
2
+
3
+ import os
4
+ import tempfile
5
+ from typing import Self
6
+
7
+ from pydantic import AliasChoices, BaseModel, Field, HttpUrl, SecretStr, model_validator
8
+ from pydantic_settings import (
9
+ BaseSettings,
10
+ PydanticBaseSettingsSource,
11
+ SettingsConfigDict,
12
+ TomlConfigSettingsSource,
13
+ )
14
+
15
+
16
+ class CustomizerSettingsOTDS(BaseModel):
17
+ """Class for OTDS related settings."""
18
+
19
+ username: str = Field(default="admin", description="Username for the OTDS admin user")
20
+ password: SecretStr = Field(default=None, description="Password for the OTDS admin user")
21
+ ticket: str | None = Field(None, description="Ticket for the OTDS admin user")
22
+ admin_partition: str = Field(default="otds.admin", description="Name of the default Partition in OTDS")
23
+ enable_audit: bool = Field(default=True, description="Enable the OTDS Audit")
24
+ disable_password_policy: bool = Field(
25
+ default=True,
26
+ description="Switch to disable the default OTDS password policy",
27
+ )
28
+
29
+ url: HttpUrl | None = Field(default=None, description="URL of the OTDS service")
30
+ url_internal: HttpUrl | None = Field(default=None, description="Internal URL of the OTDS service")
31
+
32
+ bind_password: SecretStr = Field(default=None, description="Password for the OTDS bind user to LDAP")
33
+
34
+ @model_validator(mode="after")
35
+ def fallback(self) -> Self:
36
+ """Fallback implementation to read the URL from the environment."""
37
+
38
+ if not self.url:
39
+ self.url = HttpUrl(
40
+ os.environ.get("OTDS_PUBLIC_PROTOCOL", "http") + "://" + os.environ.get("OTDS_PUBLIC_URL", "otds"),
41
+ )
42
+
43
+ # Set url_internal to the same value as url if only that one is set
44
+ elif not self.url_internal:
45
+ self.url_internal = self.url
46
+
47
+ if not self.url_internal:
48
+ self.url_internal = HttpUrl(
49
+ os.environ.get("OTDS_PUBLIC_PROTOCOL", "http")
50
+ + "://"
51
+ + os.environ.get("OTDS_HOSTNAME", "otds")
52
+ + ":"
53
+ + os.environ.get("OTDS_SERVICE_PORT", "80"),
54
+ )
55
+
56
+ self.password = SecretStr(os.environ.get("OTDS_PASSWORD")) if self.password is None else self.password
57
+ self.bind_password = (
58
+ SecretStr(os.environ.get("BIND_PASSWORD")) if self.bind_password is None else self.bind_password
59
+ )
60
+
61
+ return self
62
+
63
+
64
+ class CustomizerSettingsOTCS(BaseModel):
65
+ """Class for OTCS related settings."""
66
+
67
+ # Content Server Endpoints:
68
+ username: str = Field(default="admin", description="Username for the OTCS admin user")
69
+ password: SecretStr = Field(default=None, description="Password for the OTCS admin user")
70
+ base_path: str = Field(default="/cs/cs", description="Base path of the OTCS installation")
71
+ url: HttpUrl | None = Field(default=None, description="URL of the OTCS service")
72
+ url_frontend: HttpUrl | None = Field(
73
+ default=None,
74
+ description="URL of the OTCS frontend service, if not specified, it will be set to the same value as url",
75
+ )
76
+ url_backend: HttpUrl | None = Field(
77
+ default=None,
78
+ description="URL of the OTCS backend service, if not specified, it will be set to the same value as url",
79
+ )
80
+
81
+ partition: str = Field(default="Content Server Members", description="Name of the default Partition in OTDS")
82
+ resource_name: str = Field(default="cs", description="Name of the OTCS resource in OTDS")
83
+
84
+ maintenance_mode: bool = Field(
85
+ default=False,
86
+ description="Enable/Disable maintenance mode during payload processing.",
87
+ )
88
+ license_feature: str = Field(default="X3", description="Default license feature to be added to Users in OTDS")
89
+ download_dir: str = Field(
90
+ default=tempfile.gettempdir(),
91
+ description="temporary download directory for payload processing",
92
+ )
93
+
94
+ # FEME endpoint for additional indexing supporting Content Aviator:
95
+ feme_uri: str = Field(default="ws://feme:4242", description="URL of the FEME endpoint")
96
+
97
+ # Add configuration options for Customizer behaviour
98
+ update_admin_user: bool = Field(
99
+ default=True,
100
+ description="Update the OTCS Admin user and rename to Terrarium Admin.",
101
+ )
102
+ upload_config_files: bool = Field(
103
+ default=True,
104
+ description="Upload the configuration files of the payload to OTCS.",
105
+ )
106
+ upload_status_files: bool = Field(default=True, description="Upload the status files of the payload to OTCS.")
107
+ upload_log_file: bool = Field(default=True, description="Upload the log file of the payload to OTCS.")
108
+
109
+ @model_validator(mode="after")
110
+ def fallback(self) -> Self:
111
+ """Fallback implementation to read the URL from the environment."""
112
+
113
+ if not self.url:
114
+ self.url = HttpUrl(
115
+ os.environ.get("OTCS_PUBLIC_PROTOCOL", "https")
116
+ + "://"
117
+ + os.environ.get("OTCS_PUBLIC_URL", "otcs.public-url.undefined")
118
+ + ":"
119
+ + os.environ.get("OTCS_SERVICE_PORT_OTCS", "8080"),
120
+ )
121
+ else:
122
+ if not self.url_frontend:
123
+ self.url_frontend = self.url
124
+
125
+ if not self.url_backend:
126
+ self.url_backend = self.url
127
+
128
+ if not self.url_frontend:
129
+ self.url_frontend = HttpUrl(
130
+ os.environ.get("OTCS_PROTOCOL", "http")
131
+ + "://"
132
+ + os.environ.get("OTCS_HOSTNAME_FRONTEND", "otcs-frontend"),
133
+ )
134
+
135
+ if not self.url_backend:
136
+ self.url_backend = HttpUrl(
137
+ os.environ.get("OTCS_PROTOCOL", "http")
138
+ + "://"
139
+ + os.environ.get("OTCS_HOSTNAME", "otcs-admin-0")
140
+ + ":"
141
+ + os.environ.get("OTCS_SERVICE_PORT_OTCS", "8080"),
142
+ )
143
+
144
+ self.password = SecretStr(os.environ.get("OTCS_PASSWORD", "")) if self.password is None else self.password
145
+
146
+ return self
147
+
148
+
149
+ class CustomizerSettingsOTAC(BaseModel):
150
+ """Class for OTAC related settings."""
151
+
152
+ enabled: bool = Field(
153
+ default=False,
154
+ description="Enable/Disable OTAC integration",
155
+ )
156
+ username: str = Field(
157
+ default="dsadmin",
158
+ description="Admin account for OTAC",
159
+ )
160
+ password: SecretStr | None = Field(default=None, description="Password of the Admin Account")
161
+ url: HttpUrl | None = Field(default=None, description="URL of the OTAC service")
162
+ url_internal: HttpUrl | None = Field(default=None, description="Internal URL of the OTAC service")
163
+
164
+ known_server: str = Field(default="", description="Known OTAC servers to add to OTAC")
165
+
166
+ @model_validator(mode="after")
167
+ def fallback(self) -> Self:
168
+ """Fallback implementation to read the URL from the environment."""
169
+
170
+ if not self.url:
171
+ self.url = HttpUrl(
172
+ os.environ.get("OTAC_PROTOCOL", "https")
173
+ + "://"
174
+ + os.environ.get("OTAC_PUBLIC_URL", "otac-0")
175
+ + ":"
176
+ + os.environ.get("OTAC_SERVICE_PORT", "443"),
177
+ )
178
+
179
+ if not self.url_internal:
180
+ self.url_internal = HttpUrl(
181
+ os.environ.get("OTAC_PROTOCOL", "http")
182
+ + "://"
183
+ + os.environ.get("OTAC_SERVICE_HOST", "otac-0")
184
+ + ":"
185
+ + os.environ.get("OTAC_SERVICE_PORT", "8080"),
186
+ )
187
+
188
+ self.password = SecretStr(os.environ.get("OTAC_PASSWORD", "")) if self.password is None else self.password
189
+
190
+ return self
191
+
192
+
193
+ class CustomizerSettingsOTPD(BaseModel):
194
+ """Class for OTPD related settings."""
195
+
196
+ enabled: bool = Field(default=False, description="Enable/Disable the OTPD integration")
197
+ username: str = Field(
198
+ default="powerdocsapiuser",
199
+ description="Username of the API user to configure OTPD",
200
+ validation_alias=AliasChoices("username", "user"),
201
+ )
202
+ password: str = Field(default="", description="Password of the API user to configure OTPD")
203
+ url: HttpUrl | None = Field(default=None, description="URL of the OTPD service")
204
+
205
+ db_importfile: str = Field(default="", description="Path to the OTPD import file")
206
+ tenant: str = Field(default="Successfactors")
207
+
208
+ @model_validator(mode="after")
209
+ def fallback(self) -> Self:
210
+ """Fallback implementation to read the URL from the environment."""
211
+
212
+ if not self.url:
213
+ self.url = HttpUrl(
214
+ os.environ.get("OTPD_PROTOCOL", "http")
215
+ + "://"
216
+ + os.environ.get("OTPD_SERVICE_HOST", "otpd-0")
217
+ + ":"
218
+ + os.environ.get("OTPD_SERVICE_PORT", "8080"),
219
+ )
220
+
221
+ return self
222
+
223
+
224
+ class CustomizerSettingsOTIV(BaseModel):
225
+ """Class for OTIV related settings."""
226
+
227
+ enabled: bool = Field(default=False, description="Enable/Disable the OTIV integration")
228
+ license_file: str = Field(default="/payload/otiv-license.lic", description="Path to the OTIV license file.")
229
+ license_feature: str = Field(default="FULLTIME_USERS_REGULAR", description="Name of the license feature.")
230
+ product_name: str = Field(default="Viewing", description="Name of the product for the license.")
231
+ product_description: str = Field(
232
+ default="OpenText Intelligent Viewing",
233
+ description="Description of the product for the license.",
234
+ )
235
+ resource_name: str = Field(default="iv", description="Name of the resource for OTIV")
236
+
237
+
238
+ class CustomizerSettingsOTMM(BaseModel):
239
+ """Class for OTMM related settings."""
240
+
241
+ enabled: bool = Field(default=False, description="Enable/Disable the OTMM integration")
242
+ username: str = Field(default="", description="Username of the API user to connect to OTMM")
243
+ password: SecretStr = Field(default=None, description="Password of the API user to connect to OTMM")
244
+ client_id: str | None = Field(default=None, description="Client ID of the API user to connect to OTMM")
245
+ client_secret: str | None = Field(default=None, description="Client Secret of the API user to connect to OTMM")
246
+ url: HttpUrl | None = Field(default=None, description="URL of the OTMM service")
247
+
248
+
249
+ class CustomizerSettingsK8S(BaseModel):
250
+ """Class for K8s related settings."""
251
+
252
+ enabled: bool = Field(default=True, description="Enable/Disable the K8s integration")
253
+ kubeconfig_file: str = Field(
254
+ default=os.path.expanduser("~/.kube/config"),
255
+ description="Path to the kubeconfig file",
256
+ )
257
+ namespace: str = Field(default="default", description="Name of the namespace")
258
+
259
+ sts_otawp: str = Field(default="appworks", description="Name of the OTAWP statefulset")
260
+ cm_otawp: str = Field(default="appworks-config-ymls", description="Name of the OTAWP configmap")
261
+ pod_otpd: str = Field(default="otpd-0", description="Name of the OTPD pod")
262
+ pod_otac: str = Field(default="otac-0", description="Name of the OTAC pod")
263
+ sts_otcs_frontend: str = Field(default="otcs-frontend", description="Name of the OTCS-FRONTEND statefulset")
264
+ sts_otcs_frontend_replicas: int = Field(None)
265
+ sts_otcs_admin: str = Field(default="otcs-admin", description="Name of the OTCS-ADMIN statefulset")
266
+ sts_otcs_admin_replicas: int = Field(default=None)
267
+ ingress_otxecm: str = Field(default="otxecm-ingress", description="Name of the otxecm ingress")
268
+
269
+ maintenance_service_name: str = Field(default="otxecm-customizer")
270
+ maintenance_service_port: int = Field(default=5555)
271
+
272
+
273
+ class CustomizerSettingsOTAWP(BaseModel):
274
+ """Class for OTAWP related settings."""
275
+
276
+ enabled: bool = Field(default=False, description="Enable/Disable the OTAWP integration")
277
+ username: str = Field(
278
+ default="sysadmin",
279
+ description="Username of the OTAWP Admin user",
280
+ )
281
+ password: SecretStr = Field(default=None, description="Password of the OTAWP Admin user")
282
+ license_file: str = Field(default="/payload/otawp-license.lic", description="Path to the OTAWP license file.")
283
+ product_name: str = Field(default="APPWORKS_PLATFORM", description="Name of the Product for the license")
284
+ product_description: str = Field(
285
+ default="OpenText Appworks Platform",
286
+ description="Product desciption to be added in OTDS.",
287
+ )
288
+ resource_name: str = Field(default="awp", description="Name of the Resource for OTAWP")
289
+ access_role_name: str = Field(default="Access to awp", description="Name of the Access Role for OTAWP")
290
+ public_protocol: str = Field(default="https", description="Protocol of the public OTAWP endpoint.")
291
+ public_url: str = Field("", description="Public URL address of the OTAWP service")
292
+ port: int = int(os.environ.get("OTAWP_SERVICE_PORT", "8080"))
293
+ protocol: str = Field(default="http", description="Protocol for the OTAWP service.")
294
+
295
+
296
+ class CustomizerSettingsM365(BaseModel):
297
+ """Class for M365 related settings."""
298
+
299
+ username: str = Field(
300
+ default="",
301
+ description="Username of the M365 tenant Admin.",
302
+ validation_alias=AliasChoices("username", "user"),
303
+ )
304
+ password: str = Field(default="", description="Password of the M365 tenant Admin.")
305
+ enabled: bool = Field(default=False, description="Enable/Disable the Microsoft 365 integration.")
306
+ tenant_id: str = Field(default="", description="TennantID of the Microsoft 365 tenant")
307
+ client_id: str = Field(default="", description="Client ID for the Microsoft 365 tenant.")
308
+ client_secret: str = Field(default="", description="Client Secret for the Microsoft 365 tenant.")
309
+ domain: str = Field(default="O365_DOMAIN", description="Base domain for the Microsoft 365 tenant.")
310
+ sku_id: str = Field(default="c7df2760-2c81-4ef7-b578-5b5392b571df")
311
+ update_teams_app: bool = Field(
312
+ default=False,
313
+ description="Automatically update the Teams App to the latest version if already exists.",
314
+ )
315
+ teams_app_name: str = Field(default="OpenText Extended ECM", description="Name of the Teams App")
316
+ teams_app_external_id: str = Field(
317
+ default="dd4af790-d8ff-47a0-87ad-486318272c7a",
318
+ description="External ID of the Teams App",
319
+ )
320
+ sharepoint_app_root_site: str = Field(default="")
321
+ sharepoint_app_client_id: str = Field(default="")
322
+ sharepoint_app_client_secret: str = Field(default="")
323
+
324
+ azure_storage_account: str | None = Field(default=None)
325
+ azure_storage_access_key: str | None = Field(default=None)
326
+ azure_function_url: str | None = Field(default=None)
327
+ azure_function_url_notification: str | None = Field(default=None)
328
+
329
+
330
+ class CustomizerSettingsCoreShare(BaseModel):
331
+ """Class for Core Share related settings."""
332
+
333
+ enabled: bool = Field(default=False, description="Enable/Disable Core Share integration")
334
+ username: str = Field(default="", description="Admin username for Core Share")
335
+ password: SecretStr = Field(default=None, description="Admin username for Core Share")
336
+ base_url: str = Field(default="https://core.opentext.com", description="Base URL of the Core Share Instance")
337
+ sso_url: str = Field(default="https://sso.core.opentext.com", description="OTDS URL of the Core Share Instance")
338
+ client_id: str = Field(default="", description="Client ID for the Core Share integration")
339
+ client_secret: str = Field(default="", description="Client Secret for the Core Share integration")
340
+
341
+
342
+ class CustomizerSettingsAviator(BaseModel):
343
+ """Class for Aviator related settings."""
344
+
345
+ enabled: bool = Field(default=False, description="Content Aviator enabled")
346
+
347
+
348
+ class CustomizerSettingsAVTS(BaseModel):
349
+ """Class for Aviator Search (AVTS) related settings."""
350
+
351
+ enabled: bool = Field(default=False, description="Enable Aviator Search configuration")
352
+ username: str = Field(default="", description="Admin username for Aviator Search")
353
+ password: str = Field(default="", description="Admin password for Aviator Search")
354
+ otds_url: HttpUrl | None = Field(default=None, description="URL of the OTDS")
355
+ client_id: str = Field(default="", description="OTDS Client ID for Aviator Search")
356
+ client_secret: str = Field(default="", description="OTDS Client Secret for Aviator Search")
357
+ base_url: HttpUrl | None = Field(
358
+ default=None,
359
+ validate_default=True,
360
+ )
361
+
362
+
363
+ class Settings(BaseSettings):
364
+ """Class for all settings."""
365
+
366
+ cust_log_file: str = Field(
367
+ default=os.path.join(tempfile.gettempdir(), "customizing.log"),
368
+ description="Logfile for Customizer execution",
369
+ )
370
+
371
+ # The following CUST artifacts are created by the main.tf in the python module:
372
+ cust_settings_dir: str = Field(
373
+ default="/settings/",
374
+ description="Location where AdminSettings xml files are located",
375
+ )
376
+ cust_payload_dir: str = Field(default="/payload/", deprecated=True)
377
+ cust_payload: str = Field(
378
+ default=f"{cust_payload_dir}payload.yaml",
379
+ description="Location of the payload file. File can be in YAML or in Terraform TFVARS Format.",
380
+ )
381
+ cust_payload_gz: str = Field(
382
+ default=f"{cust_payload_dir}payload.yml.gz.b64",
383
+ description="Location of the payload file in gz format, unzip format must bei either YAML or Terraform TFVARS.",
384
+ )
385
+ cust_payload_external: str = Field(default="/payload-external/", deprecated=True)
386
+
387
+ cust_target_folder_nickname: str = Field(
388
+ default="deployment",
389
+ description="Nickname of folder to upload payload and log files",
390
+ )
391
+
392
+ cust_rm_settings_dir: str = Field(default="/settings/")
393
+ stop_on_error: bool = Field(
394
+ default=False,
395
+ description="Stop the payload processing when an error during the transport package deployment occours. This can be useful for debugging, to identify missing dependencies.",
396
+ )
397
+
398
+ placeholder_values: dict = Field(default={})
399
+
400
+ profiling: bool = Field(
401
+ default=False,
402
+ description=" Profiling can only be enabled when using the CustomizerAPI. Switch to enable python profiling using pyinstrument. Result is a html file showing the execution of payload broken down into functions and their duration. The files are located in the logdir. Profiling is disabled by default.",
403
+ )
404
+ cprofiling: bool = Field(
405
+ default=False,
406
+ description=" Profiling can only be enabled when using the CustomizerAPI. Switch to enable python profiling using cProfile. Result is a log file with the cProfile results, as well as a dump of the profiling session. The files are located in the logdir. The files are located in the logdir. Profilig is disabled by default.",
407
+ )
408
+
409
+ otds: CustomizerSettingsOTDS = CustomizerSettingsOTDS()
410
+ otcs: CustomizerSettingsOTCS = CustomizerSettingsOTCS()
411
+ otac: CustomizerSettingsOTAC = CustomizerSettingsOTAC()
412
+ otpd: CustomizerSettingsOTPD = CustomizerSettingsOTPD()
413
+ otiv: CustomizerSettingsOTIV = CustomizerSettingsOTIV()
414
+ k8s: CustomizerSettingsK8S = CustomizerSettingsK8S()
415
+ otawp: CustomizerSettingsOTAWP = CustomizerSettingsOTAWP()
416
+ m365: CustomizerSettingsM365 = CustomizerSettingsM365()
417
+ coreshare: CustomizerSettingsCoreShare = CustomizerSettingsCoreShare()
418
+ aviator: CustomizerSettingsAviator = CustomizerSettingsAviator()
419
+ avts: CustomizerSettingsAVTS = CustomizerSettingsAVTS()
420
+ otmm: CustomizerSettingsOTMM = CustomizerSettingsOTMM()
421
+
422
+ model_config = SettingsConfigDict(
423
+ toml_file="config.toml",
424
+ env_nested_delimiter="__",
425
+ case_sensitive=False,
426
+ )
427
+
428
+ @classmethod
429
+ def settings_customise_sources( # noqa: D102
430
+ cls,
431
+ settings_cls: type[BaseSettings],
432
+ init_settings: PydanticBaseSettingsSource,
433
+ env_settings: PydanticBaseSettingsSource,
434
+ dotenv_settings: PydanticBaseSettingsSource,
435
+ file_secret_settings: PydanticBaseSettingsSource, # noqa: ARG003
436
+ ) -> tuple[PydanticBaseSettingsSource, ...]:
437
+ return (
438
+ init_settings,
439
+ env_settings,
440
+ dotenv_settings,
441
+ TomlConfigSettingsSource(settings_cls),
442
+ )