|
2 | 2 |
|
3 | 3 | from collections.abc import Mapping |
4 | 4 | from dataclasses import dataclass, field |
5 | | -from typing import Any |
| 5 | +from typing import TYPE_CHECKING, Any |
6 | 6 |
|
7 | 7 | from tortoise.exceptions import ConfigurationError |
8 | 8 |
|
| 9 | +if TYPE_CHECKING: |
| 10 | + from collections.abc import Iterable |
| 11 | + from types import ModuleType |
| 12 | + |
9 | 13 |
|
10 | 14 | @dataclass(frozen=True) |
11 | 15 | class DBUrlConfig: |
@@ -202,3 +206,36 @@ def from_dict(cls, data: Mapping[str, Any]) -> TortoiseConfig: |
202 | 206 | use_tz=data.get("use_tz"), |
203 | 207 | timezone=data.get("timezone"), |
204 | 208 | ) |
| 209 | + |
| 210 | + @classmethod |
| 211 | + def merge_args( |
| 212 | + cls, |
| 213 | + config: dict[str, Any] | TortoiseConfig | None = None, |
| 214 | + config_file: str | None = None, |
| 215 | + db_url: str | None = None, |
| 216 | + modules: dict[str, Iterable[str | ModuleType]] | None = None, |
| 217 | + ) -> TortoiseConfig: |
| 218 | + # Handle config_file: load it as config dict |
| 219 | + if config_file is not None: |
| 220 | + from tortoise import Tortoise |
| 221 | + |
| 222 | + if config is not None: |
| 223 | + raise ConfigurationError("Cannot specify both 'config' and 'config_file'") |
| 224 | + config = Tortoise._get_config_from_config_file(config_file) |
| 225 | + |
| 226 | + # Convert input to TortoiseConfig for typed access |
| 227 | + typed_config: TortoiseConfig |
| 228 | + if config is None: |
| 229 | + from tortoise.backends.base.config_generator import generate_config |
| 230 | + |
| 231 | + if db_url is None or modules is None: |
| 232 | + raise ConfigurationError( |
| 233 | + "Must provide either 'config', 'config_file', or both 'db_url' and 'modules'" |
| 234 | + ) |
| 235 | + config_dict = generate_config(db_url, app_modules=modules) |
| 236 | + typed_config = cls.from_dict(config_dict) |
| 237 | + elif isinstance(config, dict): |
| 238 | + typed_config = cls.from_dict(config) |
| 239 | + else: |
| 240 | + typed_config = config |
| 241 | + return typed_config |
0 commit comments