Skip to content

Commit b1e1093

Browse files
committed
feat: expose classmethod to build tortoise config
1 parent e656ce9 commit b1e1093

2 files changed

Lines changed: 39 additions & 21 deletions

File tree

tortoise/config.py

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,14 @@
22

33
from collections.abc import Mapping
44
from dataclasses import dataclass, field
5-
from typing import Any
5+
from typing import TYPE_CHECKING, Any
66

77
from tortoise.exceptions import ConfigurationError
88

9+
if TYPE_CHECKING:
10+
from collections.abc import Iterable
11+
from types import ModuleType
12+
913

1014
@dataclass(frozen=True)
1115
class DBUrlConfig:
@@ -202,3 +206,36 @@ def from_dict(cls, data: Mapping[str, Any]) -> TortoiseConfig:
202206
use_tz=data.get("use_tz"),
203207
timezone=data.get("timezone"),
204208
)
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

tortoise/context.py

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -303,26 +303,7 @@ async def init(
303303
"""
304304
from tortoise.apps import Apps
305305

306-
# Handle config_file: load it as config dict
307-
if config_file is not None:
308-
if config is not None:
309-
raise ConfigurationError("Cannot specify both 'config' and 'config_file'")
310-
config = self._get_config_from_config_file(config_file)
311-
312-
# Convert input to TortoiseConfig for typed access
313-
typed_config: TortoiseConfig
314-
if config is None:
315-
if db_url is None or modules is None:
316-
raise ConfigurationError(
317-
"Must provide either 'config', 'config_file', or both 'db_url' and 'modules'"
318-
)
319-
config_dict = generate_config(db_url, app_modules=modules)
320-
typed_config = TortoiseConfig.from_dict(config_dict)
321-
elif isinstance(config, TortoiseConfig):
322-
typed_config = config
323-
else:
324-
typed_config = TortoiseConfig.from_dict(config)
325-
306+
typed_config = TortoiseConfig.merge_args(config, config_file, db_url, modules)
326307
config_dict = typed_config.to_dict()
327308
connections_config = config_dict["connections"]
328309
apps_config = config_dict["apps"]

0 commit comments

Comments
 (0)