diff --git a/src/textual/app.py b/src/textual/app.py index ae92bc9ca..0d900822b 100644 --- a/src/textual/app.py +++ b/src/textual/app.py @@ -36,6 +36,7 @@ from .devtools.client import DevtoolsClient, DevtoolsConnectionError, DevtoolsLo from .devtools.redirect_output import StdoutRedirector from .dom import DOMNode from .driver import Driver +from .features import parse_features, FeatureFlag from .file_monitor import FileMonitor from .geometry import Offset, Region, Size from .layouts.dock import Dock @@ -89,7 +90,6 @@ class App(Generic[ReturnType], DOMNode): def __init__( self, - screen: bool = True, driver_class: Type[Driver] | None = None, log: str = "", log_verbosity: int = 1, @@ -162,11 +162,7 @@ class App(Generic[ReturnType], DOMNode): if css is not None: self.css = css - self.features = set( - feature.strip().lower() - for feature in os.getenv("TEXTUAL", "").split(",") - if feature.strip() - ) + self.features: frozenset[FeatureFlag] = parse_features(os.getenv("TEXTUAL", "")) self.registry: set[MessagePump] = set() diff --git a/src/textual/features.py b/src/textual/features.py new file mode 100644 index 000000000..fe4ebab62 --- /dev/null +++ b/src/textual/features.py @@ -0,0 +1,32 @@ +import sys + +from typing import cast + +if sys.version_info >= (3, 8): + from typing import Final, Literal +else: + from typing_extensions import Final, Literal + +FEATURES: Final = {"devtools", "debug"} + +FeatureFlag = Literal["devtools", "debug"] + + +def parse_features(features: str) -> frozenset[FeatureFlag]: + """Parse features env var + + Args: + features (str): Comma seprated feature flags + + Returns: + frozenset[FeatureFlag]: A frozen set of known features. + """ + + features_set = frozenset( + set( + feature.strip().lower() + for feature in features.split(",") + if feature.strip() + ).intersection(FEATURES) + ) + return cast("frozenset[FeatureFlag]", features_set)