You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
3.1 KiB
Python
89 lines
3.1 KiB
Python
"""Provides access to variables pertaining to specific call contexts."""
|
|
# Copyright (c) Jupyter Development Team.
|
|
# Distributed under the terms of the Modified BSD License.
|
|
|
|
from contextvars import Context, ContextVar, copy_context
|
|
from typing import Any
|
|
|
|
|
|
class CallContext:
|
|
"""CallContext essentially acts as a namespace for managing context variables.
|
|
|
|
Although not required, it is recommended that any "file-spanning" context variable
|
|
names (i.e., variables that will be set or retrieved from multiple files or services) be
|
|
added as constants to this class definition.
|
|
"""
|
|
|
|
# Add well-known (file-spanning) names here.
|
|
#: Provides access to the current request handler once set.
|
|
JUPYTER_HANDLER: str = "JUPYTER_HANDLER"
|
|
|
|
# A map of variable name to value is maintained as the single ContextVar. This also enables
|
|
# easier management over maintaining a set of ContextVar instances, since the Context is a
|
|
# map of ContextVar instances to their values, and the "name" is no longer a lookup key.
|
|
_NAME_VALUE_MAP = "_name_value_map"
|
|
_name_value_map: ContextVar[dict[str, Any]] = ContextVar(_NAME_VALUE_MAP)
|
|
|
|
@classmethod
|
|
def get(cls, name: str) -> Any:
|
|
"""Returns the value corresponding the named variable relative to this context.
|
|
|
|
If the named variable doesn't exist, None will be returned.
|
|
|
|
Parameters
|
|
----------
|
|
name : str
|
|
The name of the variable to get from the call context
|
|
|
|
Returns
|
|
-------
|
|
value: Any
|
|
The value associated with the named variable for this call context
|
|
"""
|
|
name_value_map = CallContext._get_map()
|
|
|
|
if name in name_value_map:
|
|
return name_value_map[name]
|
|
return None # TODO: should this raise `LookupError` (or a custom error derived from said)
|
|
|
|
@classmethod
|
|
def set(cls, name: str, value: Any) -> None:
|
|
"""Sets the named variable to the specified value in the current call context.
|
|
|
|
Parameters
|
|
----------
|
|
name : str
|
|
The name of the variable to store into the call context
|
|
value : Any
|
|
The value of the variable to store into the call context
|
|
|
|
Returns
|
|
-------
|
|
None
|
|
"""
|
|
name_value_map = CallContext._get_map()
|
|
name_value_map[name] = value
|
|
|
|
@classmethod
|
|
def context_variable_names(cls) -> list[str]:
|
|
"""Returns a list of variable names set for this call context.
|
|
|
|
Returns
|
|
-------
|
|
names: List[str]
|
|
A list of variable names set for this call context.
|
|
"""
|
|
name_value_map = CallContext._get_map()
|
|
return list(name_value_map.keys())
|
|
|
|
@classmethod
|
|
def _get_map(cls) -> dict[str, Any]:
|
|
"""Get the map of names to their values from the _NAME_VALUE_MAP context var.
|
|
|
|
If the map does not exist in the current context, an empty map is created and returned.
|
|
"""
|
|
ctx: Context = copy_context()
|
|
if CallContext._name_value_map not in ctx:
|
|
CallContext._name_value_map.set({})
|
|
return CallContext._name_value_map.get()
|