restructure configuration handling
This commit is contained in:
parent
28c841e7f4
commit
252e845505
26 changed files with 56 additions and 39 deletions
1
scripts/.gitignore
vendored
Normal file
1
scripts/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
__pycache__
|
|
@ -23,7 +23,6 @@ DEFAULT_NEW_LECTURE_HEADER = r'\lecture[]{{{date}}}{{{title}}}'
|
|||
DEFAULT_NEW_LECTURE_TITLE = 'Untitled'
|
||||
DEFAULT_LECTURE_SEARCH_REGEX = r'lecture.*({\d*})?{(.*?)}{(.*)}'
|
||||
DEFAULT_IMPORT_INDENTATION = 4
|
||||
FALLBACK_COURSE_INFO_FILE = Path(__file__).parent.resolve() / 'fallback.yaml'
|
||||
TIMEZONE = pytz.timezone('CET')
|
||||
SCHEDULER_DELAY = 60
|
||||
DEFAULT_LATEX_COUNTER_AUX_FILE_EXTENSION = '.cnt'
|
|
@ -1,30 +0,0 @@
|
|||
import shutil
|
||||
from pathlib import Path
|
||||
import importlib.util
|
||||
import os
|
||||
import sys
|
||||
|
||||
# We read a configuration file for university setup that is located
|
||||
# in $XDG_CONFIG_HOME/university-setup/config.cfg
|
||||
# We follow standard configparser procedure
|
||||
|
||||
def get_config_dir() -> str:
|
||||
if 'XDG_CONFIG_HOME' in os.environ.keys():
|
||||
xdg_config_home = Path(os.environ['XDG_CONFIG_HOME']).resolve()
|
||||
else:
|
||||
xdg_config_home = Path('~/.config').expanduser().resolve()
|
||||
config_file = xdg_config_home / 'university-setup' / 'config.py'
|
||||
if not config_file.exists():
|
||||
config_file.parent.mkdir(exist_ok=True, parents=True)
|
||||
shutil.copy(Path(__file__).with_name('default_config.py'), config_file)
|
||||
print(f'Initialized default config file at {str(config_file)}.')
|
||||
return str(config_file.parent.absolute())
|
||||
|
||||
|
||||
sys.path.append(get_config_dir())
|
||||
|
||||
# Note that IDEs will probably complain about this, since they cannot find the module right now
|
||||
# This is because the module is in fact user-supplied
|
||||
from config import *
|
||||
|
||||
# future: potentially check that config in fact defines all symbols that we need
|
53
scripts/src/config_loader.py
Normal file
53
scripts/src/config_loader.py
Normal file
|
@ -0,0 +1,53 @@
|
|||
import shutil
|
||||
from pathlib import Path
|
||||
import os
|
||||
import sys
|
||||
|
||||
# We read a configuration file for university setup that is located
|
||||
# in $XDG_CONFIG_HOME/university-setup/config.cfg
|
||||
|
||||
|
||||
def get_default_file(name: str) -> Path:
|
||||
# System installation
|
||||
f1 = Path('/etc/opt/mkessler/university-setup') / name
|
||||
# no installation, try relative path
|
||||
f2 = Path(__file__).parent.parent / 'config' / name
|
||||
if f1.exists():
|
||||
return f1
|
||||
if f2.exists():
|
||||
return f2
|
||||
raise FileNotFoundError(f'Default file {name} not found, bad installation.')
|
||||
|
||||
|
||||
# Ensure that config.py and fallback.yaml are present
|
||||
# in the config directory and returns this directory
|
||||
def get_config_dir() -> Path:
|
||||
if 'XDG_CONFIG_HOME' in os.environ.keys():
|
||||
xdg_config_home = Path(os.environ['XDG_CONFIG_HOME']).resolve()
|
||||
else:
|
||||
xdg_config_home = Path('~/.config').expanduser().resolve()
|
||||
config_file = xdg_config_home / 'university-setup' / 'config.py'
|
||||
fallback_file = xdg_config_home / 'university-setup' / 'fallback.yaml'
|
||||
config_file.parent.mkdir(exist_ok=True, parents=True)
|
||||
|
||||
# Copy defaults if not present already
|
||||
if not config_file.exists():
|
||||
shutil.copy(get_default_file('config.py'), config_file)
|
||||
print(f'Initialized default config file at {str(config_file)}.')
|
||||
if not fallback_file.exists():
|
||||
shutil.copy(get_default_file('fallback.yaml'), fallback_file)
|
||||
print(f'Initialized default fallback file at {str(fallback_file)}.')
|
||||
|
||||
return config_file.parent.absolute()
|
||||
|
||||
|
||||
FALLBACK_COURSE_INFO_FILE = get_config_dir() / 'university-setup' / 'fallback.yaml'
|
||||
|
||||
sys.path.append(str(get_config_dir()))
|
||||
|
||||
# Note that IDEs will probably complain about this, since they cannot find the module right now
|
||||
# they might also flag this as an unused import, but the imported config values
|
||||
# are in turn imported by all the oder scripts
|
||||
from config import *
|
||||
|
||||
# future: potentially check that config in fact defines all symbols that we need
|
|
@ -20,7 +20,7 @@ from google_auth_oauthlib.flow import InstalledAppFlow
|
|||
from google.auth.transport.requests import Request
|
||||
|
||||
from courses import Courses
|
||||
from config import USERCALENDARID, TIMEZONE, SCHEDULER_DELAY
|
||||
from config_loader import USERCALENDARID, TIMEZONE, SCHEDULER_DELAY
|
||||
|
||||
courses = Courses()
|
||||
|
|
@ -23,13 +23,7 @@ class Course:
|
|||
f"file in the directory or add the directory to the course ignore file named"
|
||||
f" '{COURSE_IGNORE_FILE}' in your root directory ({ROOT})")
|
||||
self.info = {'title': str(path.stem) + ' (unnamed course)'}
|
||||
if FALLBACK_COURSE_INFO_FILE.is_file():
|
||||
fallback_file = yaml.safe_load(FALLBACK_COURSE_INFO_FILE.open())
|
||||
else:
|
||||
warnings.warn(f"No fallback course info file found. Program might crash if your provided info files do not"
|
||||
f"have the correct file format or are missing specified values. Provide the fallback course"
|
||||
f"file at {FALLBACK_COURSE_INFO_FILE}.")
|
||||
fallback_file = {}
|
||||
fallback_file = yaml.safe_load(FALLBACK_COURSE_INFO_FILE.open())
|
||||
self.info = merge_dictionaries(self.info, fallback_file)
|
||||
self._notes = None
|
||||
self._links = None
|
Loading…
Reference in a new issue