|
6 | 6 |
|
7 | 7 | from __future__ import annotations |
8 | 8 |
|
| 9 | +import os |
9 | 10 | import shutil |
10 | 11 | from contextlib import contextmanager |
11 | 12 | from pathlib import Path |
@@ -62,21 +63,47 @@ def config_context( |
62 | 63 | renew: bool = False, |
63 | 64 | ) -> Generator[None, Any, None]: |
64 | 65 | """ |
65 | | - A context manager to initialize and configure the config directory. |
| 66 | + Context manager for initializing and configuring the config directory with enhanced safety. |
| 67 | +
|
| 68 | + Args: |
| 69 | + cache_dir: Directory path for caching configurations |
| 70 | + renew: Force renew configuration files when True |
| 71 | +
|
| 72 | + Yields: |
| 73 | + None: Context manager protocol |
| 74 | +
|
| 75 | + Raises: |
| 76 | + FileNotFoundError: If package config directory not found |
| 77 | + RuntimeError: If directory operations fail |
66 | 78 | """ |
67 | 79 | config_lock = FileLock(Path(cache_dir) / "config.lock") |
68 | 80 | config_dir = Path(cache_dir) / "config" |
| 81 | + |
69 | 82 | with config_lock: |
70 | | - pkg_config = distribution(__package__).locate_file(__package__) / "config" |
71 | | - if not config_dir.exists(): |
72 | | - shutil.copytree(str(pkg_config), config_dir) |
| 83 | + try: |
| 84 | + pkg_config = distribution(__package__).locate_file(__package__) / "config" |
| 85 | + if not pkg_config.exists(): |
| 86 | + raise FileNotFoundError( |
| 87 | + "Package config directory not found at" + str(pkg_config) |
| 88 | + ) |
73 | 89 |
|
74 | | - if renew: |
75 | | - shutil.rmtree(config_dir) |
76 | | - shutil.copytree(str(pkg_config), config_dir) |
| 90 | + if renew and config_dir.exists(): |
| 91 | + shutil.rmtree(config_dir) |
77 | 92 |
|
78 | | - init_config(str(config_dir)) |
79 | | - try: |
80 | | - yield |
81 | | - finally: |
82 | | - pass |
| 93 | + if not config_dir.exists(): |
| 94 | + shutil.copytree(str(pkg_config), config_dir) |
| 95 | + |
| 96 | + origin_dir = Path.cwd().resolve() |
| 97 | + try: |
| 98 | + os.chdir(config_dir) |
| 99 | + init_config() |
| 100 | + yield |
| 101 | + except Exception as e: |
| 102 | + raise RuntimeError( |
| 103 | + "Failed to initialize config in " + str(config_dir) + " : " + str(e) |
| 104 | + ) from e |
| 105 | + finally: |
| 106 | + os.chdir(origin_dir) |
| 107 | + |
| 108 | + except (shutil.Error, OSError) as e: |
| 109 | + raise RuntimeError("Configuration management failed: " + str(e)) from e |
0 commit comments