Look for a config file in 2 more locations

This is to aid using Devine in a portable folder by trying to load configs next to Devine's code.
This commit is contained in:
rlaphoenix 2024-01-24 18:41:24 +00:00
parent 21687e6649
commit 3b788c221a
1 changed files with 28 additions and 4 deletions

View File

@ -2,7 +2,7 @@ from __future__ import annotations
import tempfile
from pathlib import Path
from typing import Any
from typing import Any, Optional
import yaml
from appdirs import AppDirs
@ -76,9 +76,33 @@ class Config:
return cls(**yaml.safe_load(path.read_text(encoding="utf8")) or {})
def get_config_path() -> Optional[Path]:
"""
Get Path to Config from various locations.
Looks for a config file in the following folders in order:
1. The AppDirs User Config Folder (e.g., %localappdata%/devine)
2. The Devine Namespace Folder (e.g., %appdata%/Python/Python311/site-packages/devine)
3. The Parent Folder to the Devine Namespace Folder (e.g., %appdata%/Python/Python311/site-packages)
Returns None if no config file could be found.
"""
# noinspection PyProtectedMember
config_path = Config._Directories.user_configs / Config._Filenames.root_config
if config_path.exists():
path = Config._Directories.user_configs / Config._Filenames.root_config
if not path.exists():
# noinspection PyProtectedMember
path = Config._Directories.namespace_dir / Config._Filenames.root_config
if not path.exists():
# noinspection PyProtectedMember
path = Config._Directories.namespace_dir.parent / Config._Filenames.root_config
if not path.exists():
path = None
return path
config_path = get_config_path()
if config_path:
config = Config.from_yaml(config_path)
else:
config = Config()