|
| 1 | +from __future__ import annotations |
| 2 | + |
1 | 3 | from collections.abc import Callable
|
2 | 4 | from functools import wraps
|
3 |
| -from typing import Concatenate, ParamSpec, TypeVar |
| 5 | +from pathlib import Path |
| 6 | +from typing import Any, Concatenate, ParamSpec, TypeVar, cast |
| 7 | + |
| 8 | +import yaml |
4 | 9 |
|
5 | 10 | import openapi_client
|
6 | 11 | from openapi_client.exceptions import ApiException
|
7 | 12 |
|
8 |
| -# TODO: Factor backend host url into some kind of config file |
9 |
| -BACKEND_HOST = "http://localhost:8000" |
| 13 | +DEFAULT_CONFIG = {"backend": {"host": "http://localhost:8000"}} |
| 14 | +CONFIG_PATH = Path.home() / ".config" / "jobq" / "config.yaml" |
| 15 | + |
| 16 | + |
| 17 | +C = TypeVar("C", bound="Config") |
| 18 | + |
| 19 | + |
| 20 | +class Config: |
| 21 | + _instance: Config | None = None |
| 22 | + data: dict[str, Any] |
| 23 | + |
| 24 | + def __new__(cls: type[C]) -> C: |
| 25 | + if cls._instance is None: |
| 26 | + cls._instance = super().__new__(cls) |
| 27 | + cls._instance.data = cls._instance.load() |
| 28 | + return cast(C, cls._instance) |
| 29 | + |
| 30 | + def load(self) -> dict[str, Any]: |
| 31 | + if CONFIG_PATH.exists(): |
| 32 | + return yaml.safe_load(CONFIG_PATH.read_text()) |
| 33 | + return DEFAULT_CONFIG.copy() |
| 34 | + |
| 35 | + def save(self) -> None: |
| 36 | + CONFIG_PATH.parent.mkdir(parents=True, exist_ok=True) |
| 37 | + CONFIG_PATH.write_text(yaml.dump(self.data)) |
| 38 | + |
| 39 | + def get(self, key: str) -> Any: |
| 40 | + keys = key.split(".") |
| 41 | + value = self.data |
| 42 | + for k in keys: |
| 43 | + if isinstance(value, dict) and k in value: |
| 44 | + value = value[k] |
| 45 | + else: |
| 46 | + raise ValueError(f"Didnot find {key} in config") |
| 47 | + return value |
| 48 | + |
| 49 | + def set(self, key: str, value: str) -> None: |
| 50 | + keys = key.split(".") |
| 51 | + data = self.data |
| 52 | + for k in keys[:-1]: |
| 53 | + if k not in data: |
| 54 | + data[k] = {} |
| 55 | + data = data[k] |
| 56 | + data[keys[-1]] = value |
| 57 | + self.save() |
| 58 | + |
10 | 59 |
|
11 | 60 | T = TypeVar("T")
|
12 | 61 | P = ParamSpec("P")
|
13 | 62 |
|
14 | 63 |
|
15 | 64 | def _make_api_client() -> openapi_client.ApiClient:
|
16 |
| - api_config = openapi_client.Configuration(host=BACKEND_HOST) |
| 65 | + api_config = openapi_client.Configuration(host=Config().get("backend.host")) |
17 | 66 | return openapi_client.ApiClient(api_config)
|
18 | 67 |
|
19 | 68 |
|
|
0 commit comments