diff options
Diffstat (limited to 'src/debputy/_deb_options_profiles.py')
-rw-r--r-- | src/debputy/_deb_options_profiles.py | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/src/debputy/_deb_options_profiles.py b/src/debputy/_deb_options_profiles.py new file mode 100644 index 0000000..fddb1b7 --- /dev/null +++ b/src/debputy/_deb_options_profiles.py @@ -0,0 +1,91 @@ +import os +from functools import lru_cache + +from typing import FrozenSet, Optional, Mapping, Dict + + +def _parse_deb_build_options(value: str) -> Mapping[str, Optional[str]]: + res: Dict[str, Optional[str]] = {} + for kvish in value.split(): + if "=" in kvish: + key, value = kvish.split("=", 1) + res[key] = value + else: + res[kvish] = None + return res + + +class DebBuildOptionsAndProfiles: + """Accessor to common environment related values + + >>> env = DebBuildOptionsAndProfiles(environ={'DEB_BUILD_PROFILES': 'noudeb nojava'}) + >>> 'noudeb' in env.deb_build_profiles + True + >>> 'nojava' in env.deb_build_profiles + True + >>> 'nopython' in env.deb_build_profiles + False + >>> sorted(env.deb_build_profiles) + ['nojava', 'noudeb'] + """ + + def __init__(self, *, environ: Optional[Mapping[str, str]] = None) -> None: + """Provide a view of the options. Though consider using DebBuildOptionsAndProfiles.instance() instead + + :param environ: Alternative to os.environ. Mostly useful for testing purposes + """ + if environ is None: + environ = os.environ + self._deb_build_profiles = frozenset( + x for x in environ.get("DEB_BUILD_PROFILES", "").split() + ) + self._deb_build_options = _parse_deb_build_options( + environ.get("DEB_BUILD_OPTIONS", "") + ) + + @staticmethod + @lru_cache(1) + def instance() -> "DebBuildOptionsAndProfiles": + return DebBuildOptionsAndProfiles() + + @property + def deb_build_profiles(self) -> FrozenSet[str]: + """A set-like view of all build profiles active during the build + + >>> env = DebBuildOptionsAndProfiles(environ={'DEB_BUILD_PROFILES': 'noudeb nojava'}) + >>> 'noudeb' in env.deb_build_profiles + True + >>> 'nojava' in env.deb_build_profiles + True + >>> 'nopython' in env.deb_build_profiles + False + >>> sorted(env.deb_build_profiles) + ['nojava', 'noudeb'] + + """ + return self._deb_build_profiles + + @property + def deb_build_options(self) -> Mapping[str, Optional[str]]: + """A set-like view of all build profiles active during the build + + >>> env = DebBuildOptionsAndProfiles(environ={'DEB_BUILD_OPTIONS': 'nostrip parallel=4'}) + >>> 'nostrip' in env.deb_build_options + True + >>> 'parallel' in env.deb_build_options + True + >>> 'noautodbgsym' in env.deb_build_options + False + >>> env.deb_build_options['nostrip'] is None + True + >>> env.deb_build_options['parallel'] + '4' + >>> env.deb_build_options['noautodbgsym'] + Traceback (most recent call last): + ... + KeyError: 'noautodbgsym' + >>> sorted(env.deb_build_options) + ['nostrip', 'parallel'] + + """ + return self._deb_build_options |