Skip to content

Commit

Permalink
Use generator for context decorator to ensure token is not leaked
Browse files Browse the repository at this point in the history
  • Loading branch information
jamie-chang-globality committed May 23, 2023
1 parent fc6d59e commit d29bf06
Showing 1 changed file with 11 additions and 23 deletions.
34 changes: 11 additions & 23 deletions microcosm/opaque.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,35 +19,23 @@
"""
from collections.abc import MutableMapping
from contextlib import ContextDecorator, ExitStack
from contextlib import contextmanager
from contextvars import ContextVar
from copy import deepcopy
from types import MethodType
from typing import Optional


def _make_initializer(opaque):
class OpaqueInitializer(ContextDecorator, ExitStack):
def __init__(self, func, *args, **kwargs):
super().__init__()

def member_func(self):
return func(*args, **kwargs)

self.func = MethodType(member_func, self)
self.token = None

def __enter__(self):
self.token = opaque._store.set(deepcopy(opaque._store.get()))
self.saved = deepcopy(opaque._store.get())
opaque.update(self.func())

def __exit__(self, *exc):
if self.token:
opaque._store.reset(self.token)
super().__exit__(*exc)

return OpaqueInitializer
@contextmanager
def initialiser(func, *args, **kwargs):
token = opaque._store.set(deepcopy(opaque._store.get()))
opaque.update(func(*args, **kwargs))
try:
yield
finally:
opaque._store.reset(token)

return initialiser


class Opaque(MutableMapping):
Expand Down

0 comments on commit d29bf06

Please sign in to comment.