mirror of
https://github.com/element-hq/synapse.git
synced 2026-05-15 10:15:32 +00:00
891983f3f4
Bumps the minor-and-patches group with 3 updates: [mypy](https://github.com/python/mypy), [mypy-zope](https://github.com/Shoobx/mypy-zope) and [phonenumbers](https://github.com/daviddrysdale/python-phonenumbers). Updates `mypy` from 1.17.1 to 1.18.2 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/python/mypy/blob/master/CHANGELOG.md">mypy's changelog</a>.</em></p> <blockquote> <h3>Mypy 1.18.2</h3> <ul> <li>Fix crash on recursive alias (Ivan Levkivskyi, PR <a href="https://redirect.github.com/python/mypy/pull/19845">19845</a>)</li> <li>Add additional guidance for stubtest errors when runtime is <code>object.__init__</code> (Stephen Morton, PR <a href="https://redirect.github.com/python/mypy/pull/19733">19733</a>)</li> <li>Fix handling of None values in f-string expressions in mypyc (BobTheBuidler, PR <a href="https://redirect.github.com/python/mypy/pull/19846">19846</a>)</li> </ul> <h3>Acknowledgements</h3> <p>Thanks to all mypy contributors who contributed to this release:</p> <ul> <li>Ali Hamdan</li> <li>Anthony Sottile</li> <li>BobTheBuidler</li> <li>Brian Schubert</li> <li>Chainfire</li> <li>Charlie Denton</li> <li>Christoph Tyralla</li> <li>CoolCat467</li> <li>Daniel Hnyk</li> <li>Emily</li> <li>Emma Smith</li> <li>Ethan Sarp</li> <li>Ivan Levkivskyi</li> <li>Jahongir Qurbonov</li> <li>Jelle Zijlstra</li> <li>Joren Hammudoglu</li> <li>Jukka Lehtosalo</li> <li>Marc Mueller</li> <li>Omer Hadari</li> <li>Piotr Sawicki</li> <li>PrinceNaroliya</li> <li>Randolf Scholz</li> <li>Robsdedude</li> <li>Saul Shanabrook</li> <li>Shantanu</li> <li>Stanislav Terliakov</li> <li>Stephen Morton</li> <li>wyattscarpenter</li> </ul> <p>I’d also like to thank my employer, Dropbox, for supporting mypy development.</p> <h2>Mypy 1.17</h2> <p>We’ve just uploaded mypy 1.17 to the Python Package Index (<a href="https://pypi.org/project/mypy/">PyPI</a>). Mypy is a static type checker for Python. This release includes new features and bug fixes. You can install it as follows:</p> <pre><code>python3 -m pip install -U mypy </code></pre> <p>You can read the full documentation for this release on <a href="http://mypy.readthedocs.io">Read the Docs</a>.</p> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/python/mypy/commit/df05f05555ee62dbdb9960c64cad186172e92be1"><code>df05f05</code></a> remove +dev from version</li> <li><a href="https://github.com/python/mypy/commit/01a7a1285d03cb7a330359b22cb462aacb5f9720"><code>01a7a12</code></a> Update changelog for 1.18.2 (<a href="https://redirect.github.com/python/mypy/issues/19873">#19873</a>)</li> <li><a href="https://github.com/python/mypy/commit/ca5abf09f3bfc543ac9c18a364696bc5da20bc03"><code>ca5abf0</code></a> Typeshed cherry-pick: Make type of <code>unitest.mock.Any</code> a subclass of <code>Any</code> (<a href="https://redirect.github.com/python/mypy/issues/1">#1</a>...</li> <li><a href="https://github.com/python/mypy/commit/9d794b57d9c5b03d61caa3286756c05e0ae3021b"><code>9d794b5</code></a> [mypyc] fix: inappropriate <code>None</code>s in f-strings (<a href="https://redirect.github.com/python/mypy/issues/19846">#19846</a>)</li> <li><a href="https://github.com/python/mypy/commit/2c0510c84868b6bb42ef0f305b701e530a85c25f"><code>2c0510c</code></a> stubtest: additional guidance on errors when runtime is object.<strong>init</strong> (<a href="https://redirect.github.com/python/mypy/issues/19733">#19733</a>)</li> <li><a href="https://github.com/python/mypy/commit/2f3f03c3e39e68dbfa3544c01a34f99803b3e1c2"><code>2f3f03c</code></a> Bump version to 1.18.2+dev for point release</li> <li><a href="https://github.com/python/mypy/commit/76698412bc1f3ca99000d52649acd5a0e06aa71d"><code>7669841</code></a> Fix crash on recursive alias in indirection.py (<a href="https://redirect.github.com/python/mypy/issues/19845">#19845</a>)</li> <li><a href="https://github.com/python/mypy/commit/03fbaa941bccc3a9f8aea796d586603b67119bf2"><code>03fbaa9</code></a> bump version to 1.18.1 due to wheels failure</li> <li><a href="https://github.com/python/mypy/commit/b44a1fbf0cf9fd90fd29d6bcd9f64c55dd2fd4c8"><code>b44a1fb</code></a> removed +dev from version</li> <li><a href="https://github.com/python/mypy/commit/7197a99d1aebb1b7a584f82a53c44efb7dddf136"><code>7197a99</code></a> Removed Unreleased in the Changelog for Release 1.18 (<a href="https://redirect.github.com/python/mypy/issues/19827">#19827</a>)</li> <li>Additional commits viewable in <a href="https://github.com/python/mypy/compare/v1.17.1...v1.18.2">compare view</a></li> </ul> </details> <br /> Updates `mypy-zope` from 1.0.13 to 1.0.14 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/Shoobx/mypy-zope/blob/master/CHANGELOG.md">mypy-zope's changelog</a>.</em></p> <blockquote> <h2>1.0.14 (2025-12-01)</h2> <hr /> <ul> <li>Support mypy-1.19</li> <li>Support mypy-1.18</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/Shoobx/mypy-zope/commit/38d22f3f4f6fc1b85c9a0d3b64577749f682a6d2"><code>38d22f3</code></a> Preparing release 1.0.14</li> <li><a href="https://github.com/Shoobx/mypy-zope/commit/76762ec861b1b3cddc471f1e8949902f3f3264be"><code>76762ec</code></a> Maintain changelog</li> <li><a href="https://github.com/Shoobx/mypy-zope/commit/4971d98ab80db3362bd5864a92d385e8c5a43aec"><code>4971d98</code></a> Merge pull request <a href="https://redirect.github.com/Shoobx/mypy-zope/issues/134">#134</a> from Shoobx/dependabot/pip/mypy-gte-1.0.0-and-lt-1.20.0</li> <li><a href="https://github.com/Shoobx/mypy-zope/commit/47af89d2c709f9e478ddbd5590994eba0829fb34"><code>47af89d</code></a> Update mypy requirement from <1.19.0,>=1.0.0 to >=1.0.0,<1.20.0</li> <li><a href="https://github.com/Shoobx/mypy-zope/commit/0c596ff804a1ece6a8d33c0abf1587a766e047c8"><code>0c596ff</code></a> Maintain changelog</li> <li><a href="https://github.com/Shoobx/mypy-zope/commit/dcaa27841defa865c474f585e8bb799a8242399f"><code>dcaa278</code></a> Merge pull request <a href="https://redirect.github.com/Shoobx/mypy-zope/issues/132">#132</a> from Shoobx/dependabot/pip/mypy-gte-1.0.0-and-lt-1.19.0</li> <li><a href="https://github.com/Shoobx/mypy-zope/commit/8f7b6778df6e3dde48c082ec07182e50b9938c76"><code>8f7b677</code></a> Update mypy requirement from <1.18.0,>=1.0.0 to >=1.0.0,<1.19.0</li> <li><a href="https://github.com/Shoobx/mypy-zope/commit/91b275b364cc90403b2a160695f32ca27bc06bb9"><code>91b275b</code></a> Back to development: 1.0.14</li> <li>See full diff in <a href="https://github.com/Shoobx/mypy-zope/compare/1.0.13...1.0.14">compare view</a></li> </ul> </details> <br /> Updates `phonenumbers` from 9.0.18 to 9.0.19 <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/daviddrysdale/python-phonenumbers/commit/38f2ffe1e816e22a3305ee0e11ece993d4f5d1b6"><code>38f2ffe</code></a> Prep for 9.0.19 release</li> <li><a href="https://github.com/daviddrysdale/python-phonenumbers/commit/cd7f0cc64f1ff4c6b28a83102bf0372bb5653d91"><code>cd7f0cc</code></a> Generated files for metadata</li> <li><a href="https://github.com/daviddrysdale/python-phonenumbers/commit/40ae18f50a74c3d7958011dfdfcef0a3981dc535"><code>40ae18f</code></a> Merge metadata changes from upstream 9.0.19</li> <li>See full diff in <a href="https://github.com/daviddrysdale/python-phonenumbers/compare/v9.0.18...v9.0.19">compare view</a></li> </ul> </details> <br /> **Does not** update `pysaml2` from 7.5.0 to 7.5.4 since this would downgrade pyOpenSSL <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/IdentityPython/pysaml2/releases">pysaml2's releases</a>.</em></p> <blockquote> <h2>Version v7.5.4</h2> <h2>v7.5.4 (2025-10-07)</h2> <ul> <li>Minor refactor to handle <code>shelve.open</code> and <code>dbm</code> errors</li> <li>Remove import of deprecated <code>cgi</code> module</li> <li>Replace deprecated <code>datetime.utcnow()</code> by <code>datetime.now(timezone.utc)</code></li> <li>deps: Remove the <code>importlib_metadata</code> dependency</li> <li>deps: Remove the <code>importlib_resources</code> dependency</li> <li>deps: Update dependency versions and lockfile</li> <li>build: Update pyproject and lockfile to be compatible with PEP 621</li> <li>docs: Correct spelling mistakes</li> <li>docs: Fix interal references/links</li> <li>docs: Clarify units for accepted_time_diff config param</li> <li>docs: Correct documentation for contact_person</li> </ul> <h2>Version 7.5.3</h2> <h2>7.5.3 (2025-10-04)</h2> <ul> <li><a href="https://redirect.github.com/IdentityPython/pysaml2/issues/973">#973</a> Fix prepare_for_negotiated_authenticate to avoid double signing redirect requests</li> </ul> <h2>Version 7.5.2</h2> <h2>7.5.2 (2025-02-10)</h2> <ul> <li>Include the XSD of the XML Encryption Syntax and Processing Version 1.1 to the schema validator</li> </ul> <h2>Version 7.5.1</h2> <h2>7.5.1 (2025-02-10)</h2> <ul> <li>deps: restrict pyOpenSSL up to v24.2.1 until it is replaced</li> <li>deps: update dependncies for the lockfile and examples</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/IdentityPython/pysaml2/blob/master/CHANGELOG.md">pysaml2's changelog</a>.</em></p> <blockquote> <h2>v7.5.4 (2025-10-07)</h2> <ul> <li>Minor refactor to handle <code>shelve.open</code> and <code>dbm</code> errors</li> <li>Remove import of deprecated <code>cgi</code> module</li> <li>Replace deprecated <code>datetime.utcnow()</code> by <code>datetime.now(timezone.utc)</code></li> <li>deps: Remove the <code>importlib_metadata</code> dependency</li> <li>deps: Remove the <code>importlib_resources</code> dependency</li> <li>deps: Update dependency versions and lockfile</li> <li>build: Update pyproject and lockfile to be compatible with PEP 621</li> <li>docs: Correct spelling mistakes</li> <li>docs: Fix interal references/links</li> <li>docs: Clarify units for accepted_time_diff config param</li> <li>docs: Correct documentation for contact_person</li> </ul> <h2>7.5.3 (2025-10-04)</h2> <ul> <li><a href="https://redirect.github.com/IdentityPython/pysaml2/issues/973">#973</a> Fix prepare_for_negotiated_authenticate to avoid double signing redirect requests</li> </ul> <h2>7.5.2 (2025-02-10)</h2> <ul> <li>Include the XSD of the XML Encryption Syntax and Processing Version 1.1 to the schema validator</li> </ul> <h2>7.5.1 (2025-02-10)</h2> <ul> <li>deps: restrict pyOpenSSL up to v24.2.1 until it is replaced</li> <li>deps: update dependencies for the lockfile and examples</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/IdentityPython/pysaml2/commit/9cf71f7f9e37e2bfa10d885ffe6252743b84bfb8"><code>9cf71f7</code></a> Release version 7.5.4</li> <li><a href="https://github.com/IdentityPython/pysaml2/commit/c3ec7199d117c2918b5e5057ee608636c12579ac"><code>c3ec719</code></a> Refactor _shelve_compat</li> <li><a href="https://github.com/IdentityPython/pysaml2/commit/1d6ea6024efc84486b668a9d375b8eb9d983a80a"><code>1d6ea60</code></a> Remove import of deprecated cgi module</li> <li><a href="https://github.com/IdentityPython/pysaml2/commit/c45eb9df8248ad983b220bb1fd2b4e8ed779a40d"><code>c45eb9d</code></a> Replace deprecated datetime.utcnow() by datetime.now(timezone.utc)</li> <li><a href="https://github.com/IdentityPython/pysaml2/commit/178f6d12b43a52a37b59b2ed1fee308af3537082"><code>178f6d1</code></a> Remove unneeded dependencies</li> <li><a href="https://github.com/IdentityPython/pysaml2/commit/1f0a25a5cf122e47aaafbfd93397d095ca9005e4"><code>1f0a25a</code></a> remove importlib_metadata import</li> <li><a href="https://github.com/IdentityPython/pysaml2/commit/099f716ae7245732dfb302a69074a331914136ff"><code>099f716</code></a> remove importlib_resources imports</li> <li><a href="https://github.com/IdentityPython/pysaml2/commit/3fa11ee15db1a69426db3546586ac59056cc6c2c"><code>3fa11ee</code></a> spelling updates.</li> <li><a href="https://github.com/IdentityPython/pysaml2/commit/4b7887f59a5e24650ad52d05c2285bd5dbb53a3e"><code>4b7887f</code></a> update link.</li> <li><a href="https://github.com/IdentityPython/pysaml2/commit/bc8d3b4ecce7753f2473100127581c895134541a"><code>bc8d3b4</code></a> update link.</li> <li>Additional commits viewable in <a href="https://github.com/IdentityPython/pysaml2/compare/v7.5.0...v7.5.4">compare view</a></li> </ul> </details> <br /> Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Devon Hudson <devonhudson@librem.one>
191 lines
5.4 KiB
Python
191 lines
5.4 KiB
Python
#
|
|
# This file is licensed under the Affero General Public License (AGPL) version 3.
|
|
#
|
|
# Copyright 2020 The Matrix.org Foundation C.I.C.
|
|
# Copyright 2014-2016 OpenMarket Ltd
|
|
# Copyright (C) 2023 New Vector, Ltd
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU Affero General Public License as
|
|
# published by the Free Software Foundation, either version 3 of the
|
|
# License, or (at your option) any later version.
|
|
#
|
|
# See the GNU Affero General Public License for more details:
|
|
# <https://www.gnu.org/licenses/agpl-3.0.html>.
|
|
#
|
|
# Originally licensed under the Apache License, Version 2.0:
|
|
# <http://www.apache.org/licenses/LICENSE-2.0>.
|
|
#
|
|
# [This file includes modifications made by New Vector Limited]
|
|
#
|
|
#
|
|
import heapq
|
|
from itertools import islice
|
|
from typing import (
|
|
Any,
|
|
Callable,
|
|
Collection,
|
|
Generator,
|
|
Iterable,
|
|
Iterator,
|
|
Mapping,
|
|
Protocol,
|
|
Sized,
|
|
TypeVar,
|
|
)
|
|
|
|
T = TypeVar("T", bound=Any)
|
|
S = TypeVar("S", bound="_SelfSlice")
|
|
|
|
|
|
class _SelfSlice(Sized, Protocol):
|
|
"""A helper protocol that matches types where taking a slice results in the
|
|
same type being returned.
|
|
|
|
This is more specific than `Sequence`, which allows another `Sequence` to be
|
|
returned.
|
|
"""
|
|
|
|
def __getitem__(self: S, i: slice) -> S: ...
|
|
|
|
|
|
def batch_iter(iterable: Iterable[T], size: int) -> Iterator[tuple[T, ...]]:
|
|
"""batch an iterable up into tuples with a maximum size
|
|
|
|
Args:
|
|
iterable: the iterable to slice
|
|
size: the maximum batch size
|
|
|
|
Returns:
|
|
an iterator over the chunks
|
|
"""
|
|
# make sure we can deal with iterables like lists too
|
|
sourceiter = iter(iterable)
|
|
# call islice until it returns an empty tuple
|
|
return iter(lambda: tuple(islice(sourceiter, size)), ())
|
|
|
|
|
|
def chunk_seq(iseq: S, maxlen: int) -> Iterator[S]:
|
|
"""Split the given sequence into chunks of the given size
|
|
|
|
The last chunk may be shorter than the given size.
|
|
|
|
If the input is empty, no chunks are returned.
|
|
"""
|
|
return (iseq[i : i + maxlen] for i in range(0, len(iseq), maxlen))
|
|
|
|
|
|
def partition(
|
|
iterable: Iterable[T], predicate: Callable[[T], bool]
|
|
) -> tuple[list[T], list[T]]:
|
|
"""
|
|
Separate a given iterable into two lists based on the result of a predicate function.
|
|
|
|
Args:
|
|
iterable: the iterable to partition (separate)
|
|
predicate: a function that takes an item from the iterable and returns a boolean
|
|
|
|
Returns:
|
|
A tuple of two lists, the first containing all items for which the predicate
|
|
returned True, the second containing all items for which the predicate returned
|
|
False
|
|
"""
|
|
true_results = []
|
|
false_results = []
|
|
for item in iterable:
|
|
if predicate(item):
|
|
true_results.append(item)
|
|
else:
|
|
false_results.append(item)
|
|
return true_results, false_results
|
|
|
|
|
|
def sorted_topologically(
|
|
nodes: Iterable[T],
|
|
graph: Mapping[T, Collection[T]],
|
|
) -> Generator[T, None, None]:
|
|
"""Given a set of nodes and a graph, yield the nodes in toplogical order.
|
|
|
|
For example `sorted_topologically([1, 2], {1: [2]})` will yield `2, 1`.
|
|
"""
|
|
|
|
# This is implemented by Kahn's algorithm.
|
|
|
|
degree_map = dict.fromkeys(nodes, 0)
|
|
reverse_graph: dict[T, set[T]] = {}
|
|
|
|
for node, edges in graph.items():
|
|
if node not in degree_map:
|
|
continue
|
|
|
|
for edge in set(edges):
|
|
if edge in degree_map:
|
|
degree_map[node] += 1
|
|
|
|
reverse_graph.setdefault(edge, set()).add(node)
|
|
reverse_graph.setdefault(node, set())
|
|
|
|
zero_degree = [node for node, degree in degree_map.items() if degree == 0]
|
|
heapq.heapify(zero_degree)
|
|
|
|
while zero_degree:
|
|
node = heapq.heappop(zero_degree)
|
|
yield node
|
|
|
|
for edge in reverse_graph.get(node, []):
|
|
if edge in degree_map:
|
|
degree_map[edge] -= 1
|
|
if degree_map[edge] == 0:
|
|
heapq.heappush(zero_degree, edge)
|
|
|
|
|
|
def sorted_topologically_batched(
|
|
nodes: Iterable[T],
|
|
graph: Mapping[T, Collection[T]],
|
|
) -> Generator[Collection[T], None, None]:
|
|
r"""Walk the graph topologically, returning batches of nodes where all nodes
|
|
that references it have been previously returned.
|
|
|
|
For example, given the following graph:
|
|
|
|
A
|
|
/ \
|
|
B C
|
|
\ /
|
|
D
|
|
|
|
This function will return: `[[A], [B, C], [D]]`.
|
|
|
|
This function is useful for e.g. batch persisting events in an auth chain,
|
|
where we can only persist an event if all its auth events have already been
|
|
persisted.
|
|
"""
|
|
|
|
degree_map = dict.fromkeys(nodes, 0)
|
|
reverse_graph: dict[T, set[T]] = {}
|
|
|
|
for node, edges in graph.items():
|
|
if node not in degree_map:
|
|
continue
|
|
|
|
for edge in set(edges):
|
|
if edge in degree_map:
|
|
degree_map[node] += 1
|
|
|
|
reverse_graph.setdefault(edge, set()).add(node)
|
|
reverse_graph.setdefault(node, set())
|
|
|
|
zero_degree = [node for node, degree in degree_map.items() if degree == 0]
|
|
|
|
while zero_degree:
|
|
new_zero_degree = []
|
|
for node in zero_degree:
|
|
for edge in reverse_graph.get(node, []):
|
|
if edge in degree_map:
|
|
degree_map[edge] -= 1
|
|
if degree_map[edge] == 0:
|
|
new_zero_degree.append(edge)
|
|
|
|
yield zero_degree
|
|
zero_degree = new_zero_degree
|