This commit is contained in:
Erik Johnston 2024-06-03 14:16:35 +01:00
parent 99c107920d
commit 3c3c0dd419
2 changed files with 131 additions and 53 deletions

View file

@ -1,38 +1,38 @@
[tool.towncrier] [tool.towncrier]
package = "synapse" package = "synapse"
filename = "CHANGES.md" filename = "CHANGES.md"
directory = "changelog.d" directory = "changelog.d"
issue_format = "[\\#{issue}](https://github.com/element-hq/synapse/issues/{issue})" issue_format = "[\\#{issue}](https://github.com/element-hq/synapse/issues/{issue})"
[[tool.towncrier.type]] [[tool.towncrier.type]]
directory = "feature" directory = "feature"
name = "Features" name = "Features"
showcontent = true showcontent = true
[[tool.towncrier.type]] [[tool.towncrier.type]]
directory = "bugfix" directory = "bugfix"
name = "Bugfixes" name = "Bugfixes"
showcontent = true showcontent = true
[[tool.towncrier.type]] [[tool.towncrier.type]]
directory = "docker" directory = "docker"
name = "Updates to the Docker image" name = "Updates to the Docker image"
showcontent = true showcontent = true
[[tool.towncrier.type]] [[tool.towncrier.type]]
directory = "doc" directory = "doc"
name = "Improved Documentation" name = "Improved Documentation"
showcontent = true showcontent = true
[[tool.towncrier.type]] [[tool.towncrier.type]]
directory = "removal" directory = "removal"
name = "Deprecations and Removals" name = "Deprecations and Removals"
showcontent = true showcontent = true
[[tool.towncrier.type]] [[tool.towncrier.type]]
directory = "misc" directory = "misc"
name = "Internal Changes" name = "Internal Changes"
showcontent = true showcontent = true
[tool.black] [tool.black]
target-version = ['py38', 'py39', 'py310', 'py311'] target-version = ['py38', 'py39', 'py310', 'py311']
@ -51,11 +51,7 @@ line-length = 88
# flake8-bugbear compatible checks. Its error codes are described at # flake8-bugbear compatible checks. Its error codes are described at
# https://beta.ruff.rs/docs/rules/#flake8-bugbear-b # https://beta.ruff.rs/docs/rules/#flake8-bugbear-b
# B023: Functions defined inside a loop must not use variables redefined in the loop # B023: Functions defined inside a loop must not use variables redefined in the loop
ignore = [ ignore = ["B023", "E501", "E731"]
"B023",
"E501",
"E731",
]
select = [ select = [
# pycodestyle # pycodestyle
"E", "E",
@ -80,7 +76,15 @@ select = [
[tool.isort] [tool.isort]
line_length = 88 line_length = 88
sections = ["FUTURE", "STDLIB", "THIRDPARTY", "TWISTED", "FIRSTPARTY", "TESTS", "LOCALFOLDER"] sections = [
"FUTURE",
"STDLIB",
"THIRDPARTY",
"TWISTED",
"FIRSTPARTY",
"TESTS",
"LOCALFOLDER",
]
default_section = "THIRDPARTY" default_section = "THIRDPARTY"
known_first_party = ["synapse"] known_first_party = ["synapse"]
known_tests = ["tests"] known_tests = ["tests"]
@ -102,9 +106,7 @@ authors = ["Matrix.org Team and Contributors <packages@matrix.org>"]
license = "AGPL-3.0-or-later" license = "AGPL-3.0-or-later"
readme = "README.rst" readme = "README.rst"
repository = "https://github.com/element-hq/synapse" repository = "https://github.com/element-hq/synapse"
packages = [ packages = [{ include = "synapse" }]
{ include = "synapse" },
]
classifiers = [ classifiers = [
"Development Status :: 5 - Production/Stable", "Development Status :: 5 - Production/Stable",
"Topic :: Communications :: Chat", "Topic :: Communications :: Chat",
@ -120,7 +122,7 @@ include = [
{ path = "INSTALL.md", format = "sdist" }, { path = "INSTALL.md", format = "sdist" },
{ path = "mypy.ini", format = "sdist" }, { path = "mypy.ini", format = "sdist" },
{ path = "scripts-dev", format = "sdist" }, { path = "scripts-dev", format = "sdist" },
{ path = "synmark", format="sdist" }, { path = "synmark", format = "sdist" },
{ path = "sytest-blacklist", format = "sdist" }, { path = "sytest-blacklist", format = "sdist" },
{ path = "tests", format = "sdist" }, { path = "tests", format = "sdist" },
{ path = "UPGRADE.rst", format = "sdist" }, { path = "UPGRADE.rst", format = "sdist" },
@ -130,9 +132,7 @@ include = [
{ path = "rust/build.rs", format = "sdist" }, { path = "rust/build.rs", format = "sdist" },
{ path = "rust/src/**", format = "sdist" }, { path = "rust/src/**", format = "sdist" },
] ]
exclude = [ exclude = [{ path = "synapse/*.so", format = "sdist" }]
{ path = "synapse/*.so", format = "sdist"}
]
[tool.poetry.build] [tool.poetry.build]
script = "build_rust.py" script = "build_rust.py"
@ -171,9 +171,8 @@ canonicaljson = "^2.0.0"
signedjson = "^1.1.0" signedjson = "^1.1.0"
# validating SSL certs for IP addresses requires service_identity 18.1. # validating SSL certs for IP addresses requires service_identity 18.1.
service-identity = ">=18.1.0" service-identity = ">=18.1.0"
# Twisted 18.9 introduces some logger improvements that the structured # Twisted 21.2 introduces contextvar support
# logger utilises Twisted = { extras = ["tls", "contextvars"], version = ">=21.2.0" }
Twisted = {extras = ["tls"], version = ">=18.9.0"}
treq = ">=15.1" treq = ">=15.1"
# Twisted has required pyopenssl 16.0 since about Twisted 16.6. # Twisted has required pyopenssl 16.0 since about Twisted 16.6.
pyOpenSSL = ">=16.0.0" pyOpenSSL = ">=16.0.0"
@ -292,7 +291,9 @@ all = [
# matrix-synapse-ldap3 # matrix-synapse-ldap3
"matrix-synapse-ldap3", "matrix-synapse-ldap3",
# postgres # postgres
"psycopg2", "psycopg2cffi", "psycopg2cffi-compat", "psycopg2",
"psycopg2cffi",
"psycopg2cffi-compat",
# saml2 # saml2
"pysaml2", "pysaml2",
# oidc and jwt # oidc and jwt
@ -302,9 +303,11 @@ all = [
# sentry # sentry
"sentry-sdk", "sentry-sdk",
# opentracing # opentracing
"jaeger-client", "opentracing", "jaeger-client",
"opentracing",
# redis # redis
"txredisapi", "hiredis", "txredisapi",
"hiredis",
# cache-memory # cache-memory
"pympler", "pympler",
# improved user search # improved user search
@ -388,8 +391,8 @@ build-backend = "poetry.core.masonry.api"
skip = "cp36* cp37* pp37* *-musllinux_i686 pp*aarch64 *-musllinux_aarch64" skip = "cp36* cp37* pp37* *-musllinux_i686 pp*aarch64 *-musllinux_aarch64"
# We need a rust compiler # We need a rust compiler
before-all = "curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain stable -y --profile minimal" before-all = "curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain stable -y --profile minimal"
environment= { PATH = "$PATH:$HOME/.cargo/bin" } environment = { PATH = "$PATH:$HOME/.cargo/bin" }
# For some reason if we don't manually clean the build directory we # For some reason if we don't manually clean the build directory we
# can end up polluting the next build with a .so that is for the wrong # can end up polluting the next build with a .so that is for the wrong

View file

@ -33,9 +33,12 @@ import logging
import threading import threading
import typing import typing
import warnings import warnings
from collections.abc import Coroutine, Generator
from contextvars import ContextVar
from types import TracebackType from types import TracebackType
from typing import ( from typing import (
TYPE_CHECKING, TYPE_CHECKING,
Any,
Awaitable, Awaitable,
Callable, Callable,
Optional, Optional,
@ -657,13 +660,14 @@ class PreserveLoggingContext:
) )
_thread_local = threading.local() _CURRENT_CONTEXT_VAR: ContextVar[LoggingContextOrSentinel] = ContextVar(
_thread_local.current_context = SENTINEL_CONTEXT "current_context", default=SENTINEL_CONTEXT
)
def current_context() -> LoggingContextOrSentinel: def current_context() -> LoggingContextOrSentinel:
"""Get the current logging context from thread local storage""" """Get the current logging context from thread local storage"""
return getattr(_thread_local, "current_context", SENTINEL_CONTEXT) return _CURRENT_CONTEXT_VAR.get()
def set_current_context(context: LoggingContextOrSentinel) -> LoggingContextOrSentinel: def set_current_context(context: LoggingContextOrSentinel) -> LoggingContextOrSentinel:
@ -684,7 +688,7 @@ def set_current_context(context: LoggingContextOrSentinel) -> LoggingContextOrSe
if current is not context: if current is not context:
rusage = get_thread_resource_usage() rusage = get_thread_resource_usage()
current.stop(rusage) current.stop(rusage)
_thread_local.current_context = context _CURRENT_CONTEXT_VAR.set(context)
context.start(rusage) context.start(rusage)
return current return current
@ -971,3 +975,74 @@ def defer_to_threadpool(
return f(*args, **kwargs) return f(*args, **kwargs)
return make_deferred_yieldable(threads.deferToThreadPool(reactor, threadpool, g)) return make_deferred_yieldable(threads.deferToThreadPool(reactor, threadpool, g))
_T = TypeVar("_T")
@attr.s(frozen=True, slots=True, auto_attribs=True)
class _ResourceTracker(Generator[defer.Deferred[Any], Any, _T]):
gen: Generator[defer.Deferred[Any], Any, _T]
def send(self, val: Any) -> defer.Deferred[_T]:
try:
return self.gen.send(val)
finally:
pass
@overload
def throw(
self,
a: Type[BaseException],
b: object = ...,
c: Optional[TracebackType] = ...,
/,
) -> defer.Deferred[Any]: ...
@overload
def throw(
self, a: BaseException, v: None = ..., c: Optional[TracebackType] = ..., /
) -> defer.Deferred[Any]: ...
def throw(self, a: Any, b: Any = None, c: Any = None) -> defer.Deferred[Any]:
try:
return self.throw(a, b, c)
finally:
pass
@attr.s(frozen=True, slots=True, auto_attribs=True)
class _ResourceTracker2(Coroutine[defer.Deferred[Any], Any, _T]):
gen: Coroutine[defer.Deferred[Any], Any, _T]
def send(self, val: Any) -> defer.Deferred[_T]:
try:
return self.gen.send(val)
finally:
pass
@overload
def throw(
self,
a: Type[BaseException],
b: object = ...,
c: Optional[TracebackType] = ...,
/,
) -> defer.Deferred[Any]: ...
@overload
def throw(
self, a: BaseException, v: None = ..., c: Optional[TracebackType] = ..., /
) -> defer.Deferred[Any]: ...
def throw(self, a: Any, b: Any = None, c: Any = None) -> defer.Deferred[Any]:
try:
return self.throw(a, b, c)
finally:
pass
def __await__(self) -> Generator[defer.Deferred[Any], Any, _T]:
return _ResourceTracker(self.gen.__await__())
def close(self) -> None:
return self.gen.close()