Coverage for mindsdb / utilities / context.py: 79%
34 statements
« prev ^ index » next coverage.py v7.13.1, created at 2026-01-21 00:36 +0000
« prev ^ index » next coverage.py v7.13.1, created at 2026-01-21 00:36 +0000
1from contextvars import ContextVar
2from typing import Any
3from copy import deepcopy
6class Context:
7 """Thread independent storage"""
9 __slots__ = ("_storage",)
11 def __init__(self, storage) -> None:
12 object.__setattr__(self, "_storage", storage)
13 self.set_default()
15 def set_default(self) -> None:
16 self._storage.set(
17 {
18 "user_id": None,
19 "company_id": None,
20 "session_id": "",
21 "task_id": None,
22 "user_class": 0,
23 "profiling": {"level": 0, "enabled": False, "pointer": None, "tree": None},
24 "email_confirmed": 0,
25 "used_handlers": set(),
26 "params": {},
27 }
28 )
30 def __getattr__(self, name: str) -> Any:
31 storage = self._storage.get({})
32 if name not in storage:
33 raise AttributeError(name)
34 return storage[name]
36 def __setattr__(self, name: str, value: Any) -> None:
37 storage = deepcopy(self._storage.get({}))
38 storage[name] = value
39 self._storage.set(storage)
41 def __delattr__(self, name: str) -> None:
42 storage = deepcopy(self._storage.get({}))
43 if name not in storage:
44 raise AttributeError(name)
45 del storage["name"]
46 self._storage.set(storage)
48 def dump(self) -> dict:
49 storage = deepcopy(self._storage.get({}))
50 return storage
52 def load(self, storage: dict) -> None:
53 self._storage.set(storage)
55 def get_metadata(self, **kwargs) -> dict:
56 return {
57 "user_id": self.user_id or "",
58 "company_id": self.company_id or "",
59 "session_id": self.session_id,
60 "user_class": self.user_class,
61 **kwargs,
62 }
65_context_var = ContextVar("mindsdb.context")
66context = Context(_context_var)