tzk/tzk/config.py

72 lines
1.9 KiB
Python

"""
config.py - read and manage the tzk config file
"""
import datetime
import functools
import importlib
import os
from pathlib import Path
import sys
from typing import Any
from tzk.util import fail
DEFAULT_INIT_OPTS = {
'wiki_name': 'wiki',
'tw_version_spec': '^5.1.23',
'author': None,
}
class ConfigurationManager:
def __init__(self):
self.initialize_cm()
def __getattr__(self, attr):
if self.conf_mod is None:
return None
else:
return getattr(self.conf_mod, attr, None)
def initialize_cm(self):
self.config_path = Path.cwd()
for child in sorted(self.config_path.iterdir()):
if child.is_file() and child.name.endswith('.py'):
mod_name = child.name.rsplit('.', 1)[0]
if mod_name == 'tzk_config':
sys.path.insert(0, Path("__file__").parent)
sys.path.insert(0, str(self.config_path))
self.conf_mod = importlib.import_module(mod_name)
del sys.path[0:1]
break
else:
# no config file
self.conf_mod = None
def has_config(self) -> bool:
return self.conf_mod is not None
def require_config(self) -> None:
"""
Quit with exit status 1 if no config file was found.
"""
if not self.has_config():
fail(f"No tzk_config.py found in the current directory. "
f"(Try 'tzk init' if you want to create a new one.)")
def cm(cache=[]):
"""
Call this function to retrieve the singleton ConfigurationManager object,
reading and initializing it if necessary.
Since so much happens when the ConfigurationManager is initialized,
this has to go in a function so that autodoc doesn't blow up
when it tries to import the module.
"""
if not cache:
cache.append(ConfigurationManager())
return cache[0]