mirror of
https://github.com/RYDE-WORK/ballistica.git
synced 2026-01-19 21:37:57 +08:00
98 lines
3.3 KiB
Python
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))
|