Source code for _pytask.mark_utils
"""This module contains utility functions related to marker.
The utility functions are stored here to be separate from the plugin.
"""
from __future__ import annotations
from typing import Any
from typing import TYPE_CHECKING
from _pytask.models import CollectionMetadata
from _pytask.nodes import Task
if TYPE_CHECKING:
from _pytask.mark import Mark
[docs]
def get_all_marks(obj_or_task: Any | Task) -> list[Mark]:
"""Get all marks from a callable or task."""
if isinstance(obj_or_task, Task):
marks = obj_or_task.markers
else:
obj = obj_or_task
marks = obj.pytask_meta.markers if hasattr(obj, "pytask_meta") else []
return marks
[docs]
def set_marks(obj_or_task: Any | Task, marks: list[Mark]) -> Any | Task:
"""Set marks on a callable or task."""
if isinstance(obj_or_task, Task):
obj_or_task.markers = marks
elif hasattr(obj_or_task, "pytask_meta"):
obj_or_task.pytask_meta.markers = marks
else:
obj_or_task.pytask_meta = CollectionMetadata(markers=marks)
return obj_or_task
[docs]
def get_marks(obj_or_task: Any | Task, marker_name: str) -> list[Mark]:
"""Get marks from callable or task."""
marks = get_all_marks(obj_or_task)
return [mark for mark in marks if mark.name == marker_name]
[docs]
def has_mark(obj_or_task: Any | Task, marker_name: str) -> bool:
"""Test if callable or task has a certain mark."""
marks = get_all_marks(obj_or_task)
return any(mark.name == marker_name for mark in marks)
[docs]
def remove_marks(
obj_or_task: Any | Task, marker_name: str
) -> tuple[Any | Task, list[Mark]]:
"""Remove marks from callable or task."""
marks = get_all_marks(obj_or_task)
selected = [mark for mark in marks if mark.name == marker_name]
others = [mark for mark in marks if mark.name != marker_name]
obj_or_task = set_marks(obj_or_task, others)
return obj_or_task, selected