diff --git a/ddtrace/internal/compat.py b/ddtrace/internal/compat.py index 7f00043f049..94494723903 100644 --- a/ddtrace/internal/compat.py +++ b/ddtrace/internal/compat.py @@ -185,9 +185,6 @@ def get_connection_response( return conn.getresponse() -CONTEXTVARS_IS_AVAILABLE = True - - try: from collections.abc import Iterable # noqa:F401 except ImportError: diff --git a/ddtrace/internal/coverage/code.py b/ddtrace/internal/coverage/code.py index b6f5d379661..5227e08fa42 100644 --- a/ddtrace/internal/coverage/code.py +++ b/ddtrace/internal/coverage/code.py @@ -1,4 +1,5 @@ from collections import defaultdict +from contextvars import ContextVar from copy import deepcopy from inspect import getmodule import os @@ -19,14 +20,13 @@ from ddtrace.internal.packages import purelib_path from ddtrace.internal.packages import stdlib_path from ddtrace.internal.test_visibility.coverage_lines import CoverageLines -from ddtrace.vendor.contextvars import ContextVar log = get_logger(__name__) _original_exec = exec -ctx_covered = ContextVar("ctx_covered", default=None) +ctx_covered: ContextVar[t.List[t.DefaultDict[str, CoverageLines]]] = ContextVar("ctx_covered", default=[]) ctx_is_import_coverage = ContextVar("ctx_is_import_coverage", default=False) ctx_coverage_enabled = ContextVar("ctx_coverage_enabled", default=False) diff --git a/ddtrace/vendor/__init__.py b/ddtrace/vendor/__init__.py index c74ff435562..c8487e48a8c 100644 --- a/ddtrace/vendor/__init__.py +++ b/ddtrace/vendor/__init__.py @@ -47,20 +47,6 @@ License: BSD 3 -contextvars -------------- - -Source: https://github.com/MagicStack/contextvars -Version: 2.4 -License: Apache License 2.0 - -Notes: - - removal of metaclass usage - - formatting - - use a plain old dict instead of immutables.Map - - removal of `*` syntax - - sqlcommenter ------------ diff --git a/ddtrace/vendor/contextvars/__init__.py b/ddtrace/vendor/contextvars/__init__.py deleted file mode 100644 index f4c5c62dcc6..00000000000 --- a/ddtrace/vendor/contextvars/__init__.py +++ /dev/null @@ -1,160 +0,0 @@ -import threading - -try: - from collections.abc import Mapping -except ImportError: - from collections import Mapping - - -__all__ = ("ContextVar", "Context", "Token", "copy_context") - - -_NO_DEFAULT = object() - - -class Context(Mapping): - def __init__(self): - self._data = {} - self._prev_context = None - - def run(self, callable, *args, **kwargs): - if self._prev_context is not None: - raise RuntimeError("cannot enter context: {} is already entered".format(self)) - - self._prev_context = _get_context() - try: - _set_context(self) - return callable(*args, **kwargs) - finally: - _set_context(self._prev_context) - self._prev_context = None - - def copy(self): - new = Context() - new._data = self._data.copy() - return new - - def __getitem__(self, var): - if not isinstance(var, ContextVar): - raise TypeError("a ContextVar key was expected, got {!r}".format(var)) - return self._data[var] - - def __contains__(self, var): - if not isinstance(var, ContextVar): - raise TypeError("a ContextVar key was expected, got {!r}".format(var)) - return var in self._data - - def __len__(self): - return len(self._data) - - def __iter__(self): - return iter(self._data) - - -class ContextVar(object): - def __init__(self, name, default=_NO_DEFAULT): - if not isinstance(name, str): - raise TypeError("context variable name must be a str") - self._name = name - self._default = default - - @property - def name(self): - return self._name - - def get(self, default=_NO_DEFAULT): - ctx = _get_context() - try: - return ctx[self] - except KeyError: - pass - - if default is not _NO_DEFAULT: - return default - - if self._default is not _NO_DEFAULT: - return self._default - - raise LookupError - - def set(self, value): - ctx = _get_context() - data = ctx._data - try: - old_value = data[self] - except KeyError: - old_value = Token.MISSING - - updated_data = data.copy() - updated_data[self] = value - ctx._data = updated_data - return Token(ctx, self, old_value) - - def reset(self, token): - if token._used: - raise RuntimeError("Token has already been used once") - - if token._var is not self: - raise ValueError("Token was created by a different ContextVar") - - if token._context is not _get_context(): - raise ValueError("Token was created in a different Context") - - ctx = token._context - if token._old_value is Token.MISSING: - del ctx._data[token._var] - else: - ctx._data[token._var] = token._old_value - - token._used = True - - def __repr__(self): - r = "".format(id(self)) - - -class Token(object): - - MISSING = object() - - def __init__(self, context, var, old_value): - self._context = context - self._var = var - self._old_value = old_value - self._used = False - - @property - def var(self): - return self._var - - @property - def old_value(self): - return self._old_value - - def __repr__(self): - r = "