2024-04-23 13:44:40 -07:00

98 lines
3.3 KiB
Python

# Released under the MIT License. See LICENSE for details.
#
"""Project related functionality."""
from __future__ import annotations
import os
import json
from pathlib import Path
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from typing import Literal, Any
# Cache these since we may repeatedly fetch these in batch mode.
_g_project_configs: dict[str, dict[str, Any]] = {}
_g_local_configs: dict[str, dict[str, Any]] = {}
def get_public_legal_notice(
style: Literal['python', 'c++', 'makefile', 'raw']
) -> str:
"""Return the license notice as used for our public facing stuff.
'style' arg can be 'python', 'c++', or 'makefile, or 'raw'.
"""
# FIXME: Probably don't need style here for the minimal amount we're
# doing with it now.
if style == 'raw':
return 'Released under the MIT License. See LICENSE for details.'
if style == 'python':
return '# Released under the MIT License. See LICENSE for details.'
if style == 'makefile':
return '# Released under the MIT License. See LICENSE for details.'
if style == 'c++':
return '// Released under the MIT License. See LICENSE for details.'
raise RuntimeError(f'Invalid style: {style}')
def get_non_public_legal_notice() -> str:
"""Return the one line legal notice we expect private repo files to have."""
# TODO: Move this to project config or somewhere not hard-coded.
return 'Copyright (c) 2011-2024 Eric Froemling'
def get_non_public_legal_notice_prev() -> str:
"""Allows us to auto-update."""
# TODO: Move this to project config or somewhere not hard-coded.
return 'Copyright (c) 2011-2023 Eric Froemling'
def getlocalconfig(projroot: Path | str) -> dict[str, Any]:
"""Return a project's localconfig contents (or default if missing)."""
projrootstr = str(projroot)
if projrootstr not in _g_local_configs:
localconfig: dict[str, Any]
# Allow overriding path via env var.
path = os.environ.get('EFRO_LOCALCONFIG_PATH')
if path is None:
path = 'config/localconfig.json'
try:
with open(Path(projroot, path), encoding='utf-8') as infile:
localconfig = json.loads(infile.read())
except FileNotFoundError:
localconfig = {}
_g_local_configs[projrootstr] = localconfig
return _g_local_configs[projrootstr]
def getprojectconfig(projroot: Path | str) -> dict[str, Any]:
"""Return a project's projectconfig contents (or default if missing)."""
projrootstr = str(projroot)
if projrootstr not in _g_project_configs:
config: dict[str, Any]
try:
with open(
Path(projroot, 'config/projectconfig.json'), encoding='utf-8'
) as infile:
config = json.loads(infile.read())
except FileNotFoundError:
config = {}
_g_project_configs[projrootstr] = config
return _g_project_configs[projrootstr]
def setprojectconfig(projroot: Path | str, config: dict[str, Any]) -> None:
"""Set the project config contents."""
projrootstr = str(projroot)
_g_project_configs[projrootstr] = config
os.makedirs(Path(projroot, 'config'), exist_ok=True)
with Path(projroot, 'config/projectconfig.json').open(
'w', encoding='utf-8'
) as outfile:
outfile.write(json.dumps(config, indent=2))