Skip to content

Commit 40f3c2c

Browse files
committed
remove python 3.6 compat code
remove PY37 constant, re.Pattern try/except fallbacks, custom nullcontext, ModuleNotFoundError try/except, pre-3.7 aws lambda runtime branch, and gevent version_info guard. does not touch contextvars or datetime_from_isoformat compat fixes #5040
1 parent 11d8a78 commit 40f3c2c

File tree

9 files changed

+38
-112
lines changed

9 files changed

+38
-112
lines changed

sentry_sdk/_compat.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
T = TypeVar("T")
1010

1111

12-
PY37 = sys.version_info[0] == 3 and sys.version_info[1] >= 7
1312
PY38 = sys.version_info[0] == 3 and sys.version_info[1] >= 8
1413
PY310 = sys.version_info[0] == 3 and sys.version_info[1] >= 10
1514
PY311 = sys.version_info[0] == 3 and sys.version_info[1] >= 11

sentry_sdk/_types.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
1-
try:
2-
from re import Pattern
3-
except ImportError:
4-
# 3.6
5-
from typing import Pattern
1+
from re import Pattern
62

73
from typing import TYPE_CHECKING, TypeVar, Union
84

sentry_sdk/client.py

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -163,12 +163,7 @@ def _get_options(*args: "Optional[str]", **kwargs: "Any") -> "Dict[str, Any]":
163163
return rv
164164

165165

166-
try:
167-
# Python 3.6+
168-
module_not_found_error = ModuleNotFoundError
169-
except Exception:
170-
# Older Python versions
171-
module_not_found_error = ImportError # type: ignore
166+
module_not_found_error = ModuleNotFoundError
172167

173168

174169
class BaseClient:
@@ -419,19 +414,6 @@ def _record_lost_event(
419414
)
420415
)
421416

422-
if self.options["_experiments"].get("otel_powered_performance", False):
423-
logger.debug(
424-
"[OTel] Enabling experimental OTel-powered performance monitoring."
425-
)
426-
self.options["instrumenter"] = INSTRUMENTER.OTEL
427-
if (
428-
"sentry_sdk.integrations.opentelemetry.integration.OpenTelemetryIntegration"
429-
not in _DEFAULT_INTEGRATIONS
430-
):
431-
_DEFAULT_INTEGRATIONS.append(
432-
"sentry_sdk.integrations.opentelemetry.integration.OpenTelemetryIntegration",
433-
)
434-
435417
self.integrations = setup_integrations(
436418
self.options["integrations"],
437419
with_defaults=self.options["default_integrations"],

sentry_sdk/integrations/_wsgi_common.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from contextlib import contextmanager
1+
from contextlib import nullcontext
22
import json
33
from copy import deepcopy
44

@@ -52,11 +52,6 @@
5252
)
5353

5454

55-
# This noop context manager can be replaced with "from contextlib import nullcontext" when we drop Python 3.6 support
56-
@contextmanager
57-
def nullcontext() -> "Iterator[None]":
58-
yield
59-
6055

6156
def request_body_within_bounds(
6257
client: "Optional[sentry_sdk.client.BaseClient]", content_length: int

sentry_sdk/integrations/aws_lambda.py

Lines changed: 26 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -214,76 +214,42 @@ def setup_once() -> None:
214214
)
215215
return
216216

217-
pre_37 = hasattr(lambda_bootstrap, "handle_http_request") # Python 3.6
217+
lambda_bootstrap.LambdaRuntimeClient.post_init_error = _wrap_init_error(
218+
lambda_bootstrap.LambdaRuntimeClient.post_init_error
219+
)
218220

219-
if pre_37:
220-
old_handle_event_request = lambda_bootstrap.handle_event_request
221+
old_handle_event_request = lambda_bootstrap.handle_event_request
221222

222-
def sentry_handle_event_request(
223-
request_handler: "Any", *args: "Any", **kwargs: "Any"
224-
) -> "Any":
225-
request_handler = _wrap_handler(request_handler)
226-
return old_handle_event_request(request_handler, *args, **kwargs)
227-
228-
lambda_bootstrap.handle_event_request = sentry_handle_event_request
229-
230-
old_handle_http_request = lambda_bootstrap.handle_http_request
231-
232-
def sentry_handle_http_request(
233-
request_handler: "Any", *args: "Any", **kwargs: "Any"
234-
) -> "Any":
235-
request_handler = _wrap_handler(request_handler)
236-
return old_handle_http_request(request_handler, *args, **kwargs)
237-
238-
lambda_bootstrap.handle_http_request = sentry_handle_http_request
239-
240-
# Patch to_json to drain the queue. This should work even when the
241-
# SDK is initialized inside of the handler
242-
243-
old_to_json = lambda_bootstrap.to_json
244-
245-
def sentry_to_json(*args: "Any", **kwargs: "Any") -> "Any":
246-
_drain_queue()
247-
return old_to_json(*args, **kwargs)
248-
249-
lambda_bootstrap.to_json = sentry_to_json
250-
else:
251-
lambda_bootstrap.LambdaRuntimeClient.post_init_error = _wrap_init_error(
252-
lambda_bootstrap.LambdaRuntimeClient.post_init_error
253-
)
254-
255-
old_handle_event_request = lambda_bootstrap.handle_event_request
256-
257-
def sentry_handle_event_request( # type: ignore
223+
def sentry_handle_event_request( # type: ignore
224+
lambda_runtime_client, request_handler, *args, **kwargs
225+
):
226+
request_handler = _wrap_handler(request_handler)
227+
return old_handle_event_request(
258228
lambda_runtime_client, request_handler, *args, **kwargs
259-
):
260-
request_handler = _wrap_handler(request_handler)
261-
return old_handle_event_request(
262-
lambda_runtime_client, request_handler, *args, **kwargs
263-
)
229+
)
264230

265-
lambda_bootstrap.handle_event_request = sentry_handle_event_request
231+
lambda_bootstrap.handle_event_request = sentry_handle_event_request
266232

267-
# Patch the runtime client to drain the queue. This should work
268-
# even when the SDK is initialized inside of the handler
233+
# Patch the runtime client to drain the queue. This should work
234+
# even when the SDK is initialized inside of the handler
269235

270-
def _wrap_post_function(f: "F") -> "F":
271-
def inner(*args: "Any", **kwargs: "Any") -> "Any":
272-
_drain_queue()
273-
return f(*args, **kwargs)
236+
def _wrap_post_function(f: "F") -> "F":
237+
def inner(*args: "Any", **kwargs: "Any") -> "Any":
238+
_drain_queue()
239+
return f(*args, **kwargs)
274240

275-
return inner # type: ignore
241+
return inner # type: ignore
276242

277-
lambda_bootstrap.LambdaRuntimeClient.post_invocation_result = (
278-
_wrap_post_function(
279-
lambda_bootstrap.LambdaRuntimeClient.post_invocation_result
280-
)
243+
lambda_bootstrap.LambdaRuntimeClient.post_invocation_result = (
244+
_wrap_post_function(
245+
lambda_bootstrap.LambdaRuntimeClient.post_invocation_result
281246
)
282-
lambda_bootstrap.LambdaRuntimeClient.post_invocation_error = (
283-
_wrap_post_function(
284-
lambda_bootstrap.LambdaRuntimeClient.post_invocation_error
285-
)
247+
)
248+
lambda_bootstrap.LambdaRuntimeClient.post_invocation_error = (
249+
_wrap_post_function(
250+
lambda_bootstrap.LambdaRuntimeClient.post_invocation_error
286251
)
252+
)
287253

288254

289255
def get_lambda_bootstrap() -> "Optional[Any]":

sentry_sdk/tracing_utils.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,7 @@
1111
from urllib.parse import quote, unquote
1212
import uuid
1313

14-
try:
15-
from re import Pattern
16-
except ImportError:
17-
# 3.6
18-
from typing import Pattern
14+
from re import Pattern
1915

2016
import sentry_sdk
2117
from sentry_sdk.consts import OP, SPANDATA, SPANSTATUS, SPANTEMPLATE

sentry_sdk/utils.py

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
from typing import TYPE_CHECKING
2929

3030
import sentry_sdk
31-
from sentry_sdk._compat import PY37
3231
from sentry_sdk._types import SENSITIVE_DATA_SUBSTITUTE, Annotated, AnnotatedValue
3332
from sentry_sdk.consts import (
3433
DEFAULT_ADD_FULL_STACK,
@@ -1302,8 +1301,8 @@ def _is_contextvars_broken() -> bool:
13021301
# that case, check if contextvars are effectively patched.
13031302
if (
13041303
# Gevent 20.9.0+
1305-
(sys.version_info >= (3, 7) and version_tuple >= (20, 9))
1306-
# Gevent 20.5.0+ or Python < 3.7
1304+
version_tuple >= (20, 9)
1305+
# Gevent 20.5.0+ with patched contextvars
13071306
or (is_object_patched("contextvars", "ContextVar"))
13081307
):
13091308
return False
@@ -1848,15 +1847,8 @@ def runner(*args: "P.args", **kwargs: "P.kwargs") -> "R":
18481847
return patcher
18491848

18501849

1851-
if PY37:
1852-
1853-
def nanosecond_time() -> int:
1854-
return time.perf_counter_ns()
1855-
1856-
else:
1857-
1858-
def nanosecond_time() -> int:
1859-
return int(time.perf_counter() * 1e9)
1850+
def nanosecond_time() -> int:
1851+
return time.perf_counter_ns()
18601852

18611853

18621854
def now() -> float:

tests/test_gevent.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from datetime import datetime, timezone
44

55
import sentry_sdk
6-
from sentry_sdk._compat import PY37, PY38
6+
from sentry_sdk._compat import PY38
77

88
import pytest
99
from tests.conftest import CapturingServer
@@ -50,7 +50,7 @@ def inner(**kwargs):
5050
@pytest.mark.parametrize("compression_level", (0, 9, None))
5151
@pytest.mark.parametrize(
5252
"compression_algo",
53-
(("gzip", "br", "<invalid>", None) if PY37 else ("gzip", "<invalid>", None)),
53+
("gzip", "br", "<invalid>", None),
5454
)
5555
@pytest.mark.parametrize("http2", [True, False] if PY38 else [False])
5656
def test_transport_works_gevent(

tests/test_transport.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
get_isolation_scope,
2525
Hub,
2626
)
27-
from sentry_sdk._compat import PY37, PY38
27+
from sentry_sdk._compat import PY38
2828
from sentry_sdk.envelope import Envelope, Item, parse_json, PayloadRef
2929
from sentry_sdk.transport import (
3030
KEEP_ALIVE_SOCKET_OPTIONS,
@@ -82,7 +82,7 @@ def mock_transaction_envelope(span_count: int) -> "Envelope":
8282
@pytest.mark.parametrize("compression_level", (0, 9, None))
8383
@pytest.mark.parametrize(
8484
"compression_algo",
85-
(("gzip", "br", "<invalid>", None) if PY37 else ("gzip", "<invalid>", None)),
85+
("gzip", "br", "<invalid>", None),
8686
)
8787
@pytest.mark.parametrize("http2", [True, False] if PY38 else [False])
8888
def test_transport_works(

0 commit comments

Comments
 (0)