Source code for cocotb.preview

# Copyright cocotb contributors
# Licensed under the Revised BSD License, see LICENSE for details.
# SPDX-License-Identifier: BSD-3-Clause
"""Enable or disable previews of upcoming cocotb behavior."""

from __future__ import annotations

import os
from collections.abc import Iterable

from cocotb._utils import DocStrEnum
from cocotb_tools import _env


[docs] class Feature(DocStrEnum): """Preview features that can be enabled. .. versionadded:: 2.1 """ XFAIL_IN_RESULTS = ( "xfail_in_results", "Use the XFAIL status in the terminal results summary for xfailed tests", )
_feature_strs = {feature.value for feature in Feature} _enabled_features: set[Feature] = set()
[docs] def enable(feature: Feature) -> None: """Enable a preview feature. Args: feature: Preview feature to enable. .. versionadded:: 2.1 """ _enabled_features.add(feature)
[docs] def disable(feature: Feature) -> None: """Disable a preview feature. Args: feature: Preview feature to disable. .. versionadded:: 2.1 """ _enabled_features.discard(feature)
[docs] def is_enabled(feature: Feature) -> bool: """Check if a preview feature is enabled. Args: feature: Preview feature to check. Returns: :data:`True` if the feature is enabled, otherwise :data:`False`. .. versionadded:: 2.1 """ return feature in _enabled_features
def _parse_features(features: str) -> Iterable[Feature]: for value in features.split(","): feature = value.strip() if not feature: continue if feature not in _feature_strs: raise ValueError(f"Unknown preview feature: {feature!r}") yield Feature(feature) def _init() -> None: features = os.getenv("COCOTB_PREVIEW") if not features: return try: bool_flag = _env.as_bool(features) except ValueError: # If not a bool, try parsing as a list of features. requested_features = list(_parse_features(features)) _enabled_features.update(requested_features) else: # If this is a false bool flag, skip. If true, enable all features. if not bool_flag: return _enabled_features.update(Feature)