Newer
Older
# TODO
# mypy strict_optional=False
import sys
import os
from os import path
from .configuration import SfgConfiguration, config_from_commandline, merge_configurations
from .context import SfgContext
class SourceFileGenerator:
"""Context manager that controls the code generation process in generator scripts."""
def __init__(self, sfg_config: SfgConfiguration | None = None):
if sfg_config and not isinstance(sfg_config, SfgConfiguration):
raise TypeError("sfg_config is not an SfgConfiguration.")
import __main__
scriptpath = __main__.__file__
scriptname = path.split(scriptpath)[1]
basename = path.splitext(scriptname)[0]
project_config, cmdline_config, script_args = config_from_commandline(sys.argv)
config = merge_configurations(project_config, cmdline_config, sfg_config)
self._context = SfgContext(config.outer_namespace, config.codestyle, argv=script_args)
from .emitters import HeaderSourcePairEmitter
self._emitter = HeaderSourcePairEmitter(config.get_output_spec(basename))
def clean_files(self):
for file in self._emitter.output_files:
if path.exists(file):
os.remove(file)
def __exit__(self, exc_type, exc_value, traceback):
if exc_type is None:
self._emitter.write_files(self._context)