Source code for imednet.core.context

"""Thread- and task-local study context helpers."""

from __future__ import annotations

import contextvars
from collections.abc import Iterator
from contextlib import contextmanager

from imednet.errors.validation import ConfigurationError

_active_study: contextvars.ContextVar[str | None] = contextvars.ContextVar(
    "active_study", default=None
)
_active_base_url: contextvars.ContextVar[str | None] = contextvars.ContextVar(
    "active_base_url", default=None
)


def set_study_context(study_key: str) -> contextvars.Token[str | None]:
    """Set the active study key for the current thread/task context."""
    return _active_study.set(study_key)


def reset_study_context(token: contextvars.Token[str | None]) -> None:
    """Reset the active study key using a token from :func:`set_study_context`."""
    _active_study.reset(token)


[docs]def set_base_url_context(base_url: str) -> contextvars.Token[str | None]: """Set the active base URL for the current thread/task context.""" return _active_base_url.set(base_url)
[docs]def reset_base_url_context(token: contextvars.Token[str | None]) -> None: """Reset the active base URL using a token from :func:`set_base_url_context`.""" _active_base_url.reset(token)
[docs]def get_base_url_context() -> str | None: """Get the current base URL for the active thread/task context.""" return _active_base_url.get()
def clear_study_context() -> None: """Clear the active study key for the current thread/task context.""" _active_study.set(None)
[docs]def get_study_context() -> str | None: """Get the current study key for the active thread/task context.""" return _active_study.get()
def get_current_study() -> str: """Get the current study key or raise when no study context is set.""" study = _active_study.get() if not study: raise ConfigurationError( "No study key provided. You must either pass 'study_key' explicitly " "to the endpoint method or set it using ImednetSDK.study_context(...)." ) return study @contextmanager def study_context(study_key: str) -> Iterator[None]: """Temporarily set the active study key for the current thread/task context.""" token = set_study_context(study_key) try: yield finally: reset_study_context(token) class Context: """Compatibility shim backed by thread/task-local context variables.""" @property def default_study_key(self) -> str | None: """Return the current default study key from the context.""" return _active_study.get() def set_default_study_key(self, study_key: str) -> None: """Set the default study key for the current context.""" _active_study.set(study_key) def clear_default_study_key(self) -> None: """Clear the default study key from the current context.""" clear_study_context()