summaryrefslogtreecommitdiffstats
path: root/src/debputy/_deb_options_profiles.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/debputy/_deb_options_profiles.py')
-rw-r--r--src/debputy/_deb_options_profiles.py91
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