from ittapi.native import task_begin as _task_begin, task_end as _task_end
from ittapi.native import task_begin_overlapped as _task_begin_overlapped, task_end_overlapped as _task_end_overlapped
from .domain import domain as _domain
from .id import id as _id
from .region import _CallSite, _NamedRegion
class _Task(_NamedRegion):
def __init__(self, task=None, domain=None, id=None, parent=None) -> None:
super().__init__(task)
self._domain = self.__get_task_domain(domain)
self._id = self.__get_task_id(id, self._domain)
self._parent_id = self.__get_parent_id(parent)
def __str__(self) -> str:
return (f"{{ name: '{str(self._name)}', domain: '{str(self._domain)}',"
f" id: {str(self._id)}, parent_id: {str(self._parent_id)} }}")
def __repr__(self) -> str:
return (f'{self.__class__.__name__}({repr(self._name)}, {repr(self._domain)},'
f' {repr(self._id)}, {repr(self._parent_id)})')
def domain(self):
return self._domain
def id(self):
return self._id
def parent_id(self):
return self._parent_id
def begin(self) -> None:
raise NotImplementedError()
def end(self) -> None:
raise NotImplementedError()
@staticmethod
def __get_task_domain(original_domain):
if original_domain is None or isinstance(original_domain, str):
return _domain(original_domain)
return original_domain
@staticmethod
def __get_task_id(original_id, domain):
return _id(domain) if original_id is None else original_id
@staticmethod
def __get_parent_id(original_parent):
return original_parent.id() if isinstance(original_parent, task.__class__) else original_parent
class NestedTask(_Task):
def begin(self) -> None:
_task_begin(self._domain, self._name, self._id, self._parent_id)
def end(self) -> None:
_task_end(self._domain)
def nested_task(task=None, domain=None, id=None, parent=None):
task = _CallSite(_CallSite.CallerFrame) if task is None else task
return NestedTask(task, domain, id, parent)
class OverlappedTask(_Task):
def begin(self) -> None:
_task_begin_overlapped(self._domain, self._name, self._id, self._parent_id)
def end(self) -> None:
_task_end_overlapped(self._domain, self._id)
def overlapped_task(task=None, domain=None, id=None, parent=None):
task = _CallSite(_CallSite.CallerFrame) if task is None else task
return OverlappedTask(task, domain, id, parent)
def task(task=None, domain=None, id=None, parent=None, overlapped=False):
task = _CallSite(_CallSite.CallerFrame) if task is None else task
return OverlappedTask(task, domain, id, parent) if overlapped else NestedTask(task, domain, id, parent)