Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-grpclib for openSUSE:Factory checked in at 2026-01-19 18:38:47 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-grpclib (Old) and /work/SRC/openSUSE:Factory/.python-grpclib.new.1928 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-grpclib" Mon Jan 19 18:38:47 2026 rev:5 rq:1328090 version:0.4.9 Changes: -------- --- /work/SRC/openSUSE:Factory/python-grpclib/python-grpclib.changes 2025-10-30 17:10:57.857534951 +0100 +++ /work/SRC/openSUSE:Factory/.python-grpclib.new.1928/python-grpclib.changes 2026-01-19 18:42:44.737578939 +0100 @@ -1,0 +2,11 @@ +Mon Jan 19 10:48:52 UTC 2026 - John Paul Adrian Glaubitz <[email protected]> + +- Update to 0.4.9 + * Added Python 3.14 support; pull request courtesy Thomas J. Fan @thomasjpfan + * Dropped Python 3.8 and 3.9 support + * Added support for a custom ``DescriptorPool`` for the server reflection + (#204); pull request courtesy Eric Daniels @edaniels +- Drop support-new-pytest-asyncio.patch, merged upstream +- Drop support-python-314.patch, merged upstream + +------------------------------------------------------------------- Old: ---- grpclib-0.4.8.tar.gz support-new-pytest-asyncio.patch support-python-314.patch New: ---- grpclib-0.4.9.tar.gz ----------(Old B)---------- Old: (#204); pull request courtesy Eric Daniels @edaniels - Drop support-new-pytest-asyncio.patch, merged upstream - Drop support-python-314.patch, merged upstream Old:- Drop support-new-pytest-asyncio.patch, merged upstream - Drop support-python-314.patch, merged upstream ----------(Old E)---------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-grpclib.spec ++++++ --- /var/tmp/diff_new_pack.FSXLZE/_old 2026-01-19 18:42:45.237599628 +0100 +++ /var/tmp/diff_new_pack.FSXLZE/_new 2026-01-19 18:42:45.237599628 +0100 @@ -1,7 +1,7 @@ # # spec file for package python-grpclib # -# Copyright (c) 2025 SUSE LLC and contributors +# Copyright (c) 2026 SUSE LLC and contributors # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -18,16 +18,12 @@ %{?sle15_python_module_pythons} Name: python-grpclib -Version: 0.4.8 +Version: 0.4.9 Release: 0 Summary: Pure-Python gRPC implementation for asyncio License: BSD-3-Clause URL: https://github.com/vmagamedov/grpclib Source: https://github.com/vmagamedov/grpclib/archive/v%{version}.tar.gz#/grpclib-%{version}.tar.gz -# PATCH-FIX-UPSTREAM gh#vmagamedov/grpclib#205 -Patch0: support-new-pytest-asyncio.patch -# PATCH-FIX-UPSTREAM gh#vmagamedov/grpclib#208 -Patch1: support-python-314.patch BuildRequires: %{python_module pip} BuildRequires: %{python_module setuptools >= 40.6.0} BuildRequires: %{python_module wheel} ++++++ grpclib-0.4.8.tar.gz -> grpclib-0.4.9.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grpclib-0.4.8/.github/workflows/release-dry-run.yaml new/grpclib-0.4.9/.github/workflows/release-dry-run.yaml --- old/grpclib-0.4.8/.github/workflows/release-dry-run.yaml 2025-05-04 18:21:46.000000000 +0200 +++ new/grpclib-0.4.9/.github/workflows/release-dry-run.yaml 2025-12-14 23:21:58.000000000 +0100 @@ -9,7 +9,7 @@ - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "3.10" - run: pip3 install -r requirements/release.txt - run: pip3 install -e . - run: make release diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grpclib-0.4.8/.github/workflows/release.yaml new/grpclib-0.4.9/.github/workflows/release.yaml --- old/grpclib-0.4.8/.github/workflows/release.yaml 2025-05-04 18:21:46.000000000 +0200 +++ new/grpclib-0.4.9/.github/workflows/release.yaml 2025-12-14 23:21:58.000000000 +0100 @@ -13,7 +13,7 @@ key: pip-${{ hashFiles('requirements/release.txt') }} }} - uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "3.10" - run: pip3 install -r requirements/release.txt - run: pip3 install -e . - run: make release diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grpclib-0.4.8/.github/workflows/test.yaml new/grpclib-0.4.9/.github/workflows/test.yaml --- old/grpclib-0.4.8/.github/workflows/test.yaml 2025-05-04 18:21:46.000000000 +0200 +++ new/grpclib-0.4.9/.github/workflows/test.yaml 2025-12-14 23:21:58.000000000 +0100 @@ -13,7 +13,7 @@ key: pip-${{ hashFiles('requirements/check.txt') }} - uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "3.10" - run: pip3 install -r requirements/check.txt - run: pip3 install -e . - run: make proto @@ -24,7 +24,7 @@ runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] + python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] steps: - uses: actions/checkout@v4 - uses: actions/cache@v4 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grpclib-0.4.8/.readthedocs.yaml new/grpclib-0.4.9/.readthedocs.yaml --- old/grpclib-0.4.8/.readthedocs.yaml 2025-05-04 18:21:46.000000000 +0200 +++ new/grpclib-0.4.9/.readthedocs.yaml 2025-12-14 23:21:58.000000000 +0100 @@ -2,7 +2,7 @@ build: os: ubuntu-22.04 tools: - python: "3.8" + python: "3.10" sphinx: configuration: docs/conf.py python: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grpclib-0.4.8/LICENSE.txt new/grpclib-0.4.9/LICENSE.txt --- old/grpclib-0.4.8/LICENSE.txt 2025-05-04 18:21:46.000000000 +0200 +++ new/grpclib-0.4.9/LICENSE.txt 2025-12-14 23:21:58.000000000 +0100 @@ -1,4 +1,4 @@ -Copyright (c) 2019, Vladimir Magamedov +Copyright (c) 2019, Volodymyr Magamedov All rights reserved. Redistribution and use in source and binary forms, with or without diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grpclib-0.4.8/README.rst new/grpclib-0.4.9/README.rst --- old/grpclib-0.4.8/README.rst 2025-05-04 18:21:46.000000000 +0200 +++ new/grpclib-0.4.9/README.rst 2025-12-14 23:21:58.000000000 +0100 @@ -2,11 +2,11 @@ =========================================== .. image:: https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/7e1631d13476f1e870af0d5605b643fc14471a6d/banner-direct-single.svg - :target: https://standforukraine.com + :target: https://savelife.in.ua/en/ |project|_ |documentation|_ |version|_ |tag|_ |downloads|_ |license|_ -This project is based on `hyper-h2`_ and **requires Python >= 3.8**. +This project is based on `hyper-h2`_ and **requires Python >= 3.10**. .. contents:: :local: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grpclib-0.4.8/docs/changelog/index.rst new/grpclib-0.4.9/docs/changelog/index.rst --- old/grpclib-0.4.8/docs/changelog/index.rst 2025-05-04 18:21:46.000000000 +0200 +++ new/grpclib-0.4.9/docs/changelog/index.rst 2025-12-14 23:21:58.000000000 +0100 @@ -1,6 +1,14 @@ Changelog ========= +0.4.9 +~~~~~ + + - Added Python 3.14 support; pull request courtesy Thomas J. Fan @thomasjpfan + - Dropped Python 3.8 and 3.9 support + - Added support for a custom ``DescriptorPool`` for the server reflection + (#204); pull request courtesy Eric Daniels @edaniels + 0.4.8 ~~~~~ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grpclib-0.4.8/docs/conf.py new/grpclib-0.4.9/docs/conf.py --- old/grpclib-0.4.8/docs/conf.py 2025-05-04 18:21:46.000000000 +0200 +++ new/grpclib-0.4.9/docs/conf.py 2025-12-14 23:21:58.000000000 +0100 @@ -14,8 +14,8 @@ master_doc = 'index' project = 'grpclib' -copyright = '2019, Vladimir Magamedov' -author = 'Vladimir Magamedov' +copyright = '2019, Volodymyr Magamedov' +author = 'Volodymyr Magamedov' templates_path = [] @@ -27,4 +27,4 @@ def setup(app): - app.add_stylesheet('style.css') + app.add_css_file('style.css') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grpclib-0.4.8/grpclib/__init__.py new/grpclib-0.4.9/grpclib/__init__.py --- old/grpclib-0.4.8/grpclib/__init__.py 2025-05-04 18:21:46.000000000 +0200 +++ new/grpclib-0.4.9/grpclib/__init__.py 2025-12-14 23:21:58.000000000 +0100 @@ -1,7 +1,7 @@ from .const import Status from .exceptions import GRPCError -__version__ = '0.4.8' +__version__ = '0.4.9' __all__ = ( 'Status', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grpclib-0.4.8/grpclib/_compat.py new/grpclib-0.4.9/grpclib/_compat.py --- old/grpclib-0.4.8/grpclib/_compat.py 1970-01-01 01:00:00.000000000 +0100 +++ new/grpclib-0.4.9/grpclib/_compat.py 2025-12-14 23:21:58.000000000 +0100 @@ -0,0 +1,28 @@ +from typing import Dict, Any +import sys + +PY314 = sys.version_info >= (3, 14) + + +def get_annotations(params: Dict[str, Any]) -> Dict[str, Any]: + """Get annotations compatible with Python 3.14's deferred annotations.""" + + # This recipe was inferred from + # https://docs.python.org/3.14/library/annotationlib.html#recipes + annotations: Dict[str, Any] + if "__annotations__" in params: + annotations = params["__annotations__"] + return annotations + elif PY314: + # annotationlib introduced in Python 3.14 to inspect annotations + import annotationlib + + annotate = annotationlib.get_annotate_from_class_namespace(params) + if annotate is None: + return {} + annotations = annotationlib.call_annotate_function( + annotate, format=annotationlib.Format.FORWARDREF + ) + return annotations + else: + return {} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grpclib-0.4.8/grpclib/client.py new/grpclib-0.4.9/grpclib/client.py --- old/grpclib-0.4.8/grpclib/client.py 2025-05-04 18:21:46.000000000 +0200 +++ new/grpclib-0.4.9/grpclib/client.py 2025-12-14 23:21:58.000000000 +0100 @@ -433,7 +433,7 @@ self._messages_received += 1 self._stream.connection.messages_received += 1 self._stream.connection.last_message_received = time.monotonic() - return message + return message # type: ignore[no-any-return] else: return None diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grpclib-0.4.8/grpclib/events.py new/grpclib-0.4.9/grpclib/events.py --- old/grpclib-0.4.8/grpclib/events.py 2025-05-04 18:21:46.000000000 +0200 +++ new/grpclib-0.4.9/grpclib/events.py 2025-12-14 23:21:58.000000000 +0100 @@ -5,6 +5,7 @@ from .const import Status from .metadata import Deadline, _Metadata +from ._compat import get_annotations if TYPE_CHECKING: @@ -41,7 +42,7 @@ class _EventMeta(type): def __new__(mcs, name, bases, params): # type: ignore - annotations = params.get('__annotations__') or {} + annotations = get_annotations(params) payload = params.get('__payload__') or () params['__slots__'] = tuple(name for name in annotations) params['__readonly__'] = frozenset(name for name in annotations diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grpclib-0.4.8/grpclib/protocol.py new/grpclib-0.4.9/grpclib/protocol.py --- old/grpclib-0.4.8/grpclib/protocol.py 2025-05-04 18:21:46.000000000 +0200 +++ new/grpclib-0.4.9/grpclib/protocol.py 2025-12-14 23:21:58.000000000 +0100 @@ -186,7 +186,7 @@ self.stream_close_waiter = Event() def feed(self, data: bytes) -> List[H2Event]: - return self._connection.receive_data(data) # type: ignore + return self._connection.receive_data(data) def ack(self, stream_id: int, size: int) -> None: if size: @@ -414,6 +414,7 @@ self.connection.headers_send_process() async def send_data(self, data: bytes, end_stream: bool = False) -> None: + assert self.id is not None f = BytesIO(data) f_pos, f_last = 0, len(data) @@ -450,11 +451,13 @@ self.connection.data_send_process() async def end(self) -> None: + assert self.id is not None await self.connection.write_ready.wait() self._h2_connection.end_stream(self.id) self._transport.write(self._h2_connection.data_to_send()) async def reset(self, error_code: ErrorCodes = ErrorCodes.NO_ERROR) -> None: + assert self.id is not None await self.connection.write_ready.wait() self._h2_connection.reset_stream(self.id, error_code=error_code) self._transport.write(self._h2_connection.data_to_send()) @@ -463,6 +466,7 @@ self, error_code: ErrorCodes = ErrorCodes.NO_ERROR, ) -> None: + assert self.id is not None self._h2_connection.reset_stream(self.id, error_code=error_code) if self.connection.write_ready.is_set(): self._transport.write(self._h2_connection.data_to_send()) @@ -476,6 +480,7 @@ @property def closable(self) -> bool: + assert self.id is not None if self._transport.is_closing(): return False if self._h2_connection.state_machine.state is ConnectionState.CLOSED: @@ -569,18 +574,22 @@ except AttributeError: pass # connection was closed and self.processors was deleted else: - proc(event) + proc(event) # type: ignore[operator] def process_request_received(self, event: RequestReceived) -> None: stream = self.connection.create_stream(stream_id=event.stream_id) release_stream = self.register(stream) - self.handler.accept(stream, event.headers, release_stream) + self.handler.accept( + stream, + event.headers, # type: ignore[arg-type] + release_stream, + ) # TODO: check EOF def process_response_received(self, event: ResponseReceived) -> None: stream = self.streams.get(event.stream_id) if stream is not None: - stream.headers = event.headers + stream.headers = event.headers # type: ignore[assignment] stream.headers_received.set() def process_remote_settings_changed( @@ -626,7 +635,7 @@ def process_trailers_received(self, event: TrailersReceived) -> None: stream = self.streams.get(event.stream_id) if stream is not None: - stream.trailers = event.headers + stream.trailers = event.headers # type: ignore[assignment] stream.trailers_received.set() def process_stream_ended(self, event: StreamEnded) -> None: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grpclib-0.4.8/grpclib/reflection/_deprecated.py new/grpclib-0.4.9/grpclib/reflection/_deprecated.py --- old/grpclib-0.4.8/grpclib/reflection/_deprecated.py 2025-05-04 18:21:46.000000000 +0200 +++ new/grpclib-0.4.9/grpclib/reflection/_deprecated.py 2025-12-14 23:21:58.000000000 +0100 @@ -14,7 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. # -from typing import Collection +from typing import Any, Collection, Optional from google.protobuf.descriptor import FileDescriptor from google.protobuf.descriptor_pb2 import FileDescriptorProto @@ -35,10 +35,14 @@ """ Implements server reflection protocol. """ - def __init__(self, *, _service_names: Collection[str]): + def __init__( + self, *, + _service_names: Collection[str], + _pool: Optional[Any] = None + ): self._service_names = _service_names # FIXME: DescriptorPool has incomplete typings - self._pool = Default() # type: ignore + self._pool = _pool or Default() # type: ignore def _not_found_response(self) -> ServerReflectionResponse: return ServerReflectionResponse( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grpclib-0.4.8/grpclib/reflection/service.py new/grpclib-0.4.9/grpclib/reflection/service.py --- old/grpclib-0.4.8/grpclib/reflection/service.py 2025-05-04 18:21:46.000000000 +0200 +++ new/grpclib-0.4.9/grpclib/reflection/service.py 2025-12-14 23:21:58.000000000 +0100 @@ -14,7 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. # -from typing import TYPE_CHECKING, Collection, List +from typing import TYPE_CHECKING, Any, Collection, List, Optional from google.protobuf.descriptor import FileDescriptor from google.protobuf.descriptor_pb2 import FileDescriptorProto @@ -41,10 +41,14 @@ """ Implements server reflection protocol. """ - def __init__(self, *, _service_names: Collection[str]): + def __init__( + self, *, + _service_names: Collection[str], + _pool: Optional[Any] = None + ): self._service_names = _service_names # FIXME: DescriptorPool has incomplete typings - self._pool = Default() # type: ignore + self._pool = _pool or Default() # type: ignore def _not_found_response(self) -> ServerReflectionResponse: return ServerReflectionResponse( @@ -161,7 +165,11 @@ await stream.send_message(response) @classmethod - def extend(cls, services: 'Collection[IServable]') -> 'List[IServable]': + def extend( + cls, services: 'Collection[IServable]', + *, + pool: Optional[Any] = None + ) -> 'List[IServable]': """ Extends services list with reflection service: @@ -181,6 +189,7 @@ for service in services: service_names.append(_service_name(service)) services = list(services) - services.append(cls(_service_names=service_names)) - services.append(_ServerReflectionV1Alpha(_service_names=service_names)) + services.append(cls(_service_names=service_names, _pool=pool)) + services.append( + _ServerReflectionV1Alpha(_service_names=service_names, _pool=pool)) return services diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grpclib-0.4.8/grpclib/server.py new/grpclib-0.4.9/grpclib/server.py --- old/grpclib-0.4.8/grpclib/server.py 2025-05-04 18:21:46.000000000 +0200 +++ new/grpclib-0.4.9/grpclib/server.py 2025-12-14 23:21:58.000000000 +0100 @@ -139,7 +139,7 @@ self._messages_received += 1 self._stream.connection.messages_received += 1 self._stream.connection.last_message_received = time.monotonic() - return message + return message # type: ignore[no-any-return] else: return None diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grpclib-0.4.8/requirements/check.in new/grpclib-0.4.9/requirements/check.in --- old/grpclib-0.4.8/requirements/check.in 2025-05-04 18:21:46.000000000 +0200 +++ new/grpclib-0.4.9/requirements/check.in 2025-12-14 23:21:58.000000000 +0100 @@ -1,6 +1,5 @@ -r runtime.in -grpcio-tools +grpcio-tools==1.62.1 mypy -mypy-protobuf +mypy-protobuf==3.6.0 flake8 -types-certifi diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grpclib-0.4.8/requirements/check.txt new/grpclib-0.4.9/requirements/check.txt --- old/grpclib-0.4.8/requirements/check.txt 2025-05-04 18:21:46.000000000 +0200 +++ new/grpclib-0.4.9/requirements/check.txt 2025-12-14 23:21:58.000000000 +0100 @@ -1,29 +1,30 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.10 # by the following command: # # pip-compile --annotation-style=line requirements/check.in # -certifi==2024.2.2 # via -r requirements/runtime.in -flake8==7.0.0 # via -r requirements/check.in -googleapis-common-protos==1.63.0 # via -r requirements/runtime.in -grpcio==1.62.1 # via grpcio-tools +certifi==2025.11.12 # via -r requirements/runtime.in +flake8==7.3.0 # via -r requirements/check.in +googleapis-common-protos==1.72.0 # via -r requirements/runtime.in +grpcio==1.76.0 # via grpcio-tools grpcio-tools==1.62.1 # via -r requirements/check.in -h2==4.1.0 # via -r requirements/../setup.txt -hpack==4.0.0 # via -r requirements/../setup.txt, h2 -hyperframe==6.0.1 # via -r requirements/../setup.txt, h2 +h2==4.3.0 # via -r setup.txt +hpack==4.1.0 # via -r setup.txt, h2 +hyperframe==6.1.0 # via -r setup.txt, h2 +librt==0.7.3 # via mypy mccabe==0.7.0 # via flake8 -multidict==6.0.5 # via -r requirements/../setup.txt -mypy==1.9.0 # via -r requirements/check.in -mypy-extensions==1.0.0 # via mypy +multidict==6.7.0 # via -r setup.txt +mypy==1.19.0 # via -r requirements/check.in +mypy-extensions==1.1.0 # via mypy mypy-protobuf==3.6.0 # via -r requirements/check.in -protobuf==4.25.3 # via -r requirements/runtime.in, googleapis-common-protos, grpcio-tools, mypy-protobuf -pycodestyle==2.11.1 # via flake8 -pyflakes==3.2.0 # via flake8 -tomli==2.0.1 # via mypy -types-certifi==2021.10.8.3 # via -r requirements/check.in -types-protobuf==4.25.0.20240417 # via mypy-protobuf -typing-extensions==4.11.0 # via mypy +pathspec==0.12.1 # via mypy +protobuf==4.25.8 # via -r requirements/runtime.in, googleapis-common-protos, grpcio-tools, mypy-protobuf +pycodestyle==2.14.0 # via flake8 +pyflakes==3.4.0 # via flake8 +tomli==2.3.0 # via mypy +types-protobuf==6.32.1.20251210 # via mypy-protobuf +typing-extensions==4.15.0 # via -r setup.txt, grpcio, multidict, mypy # The following packages are considered to be unsafe in a requirements file: # setuptools diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grpclib-0.4.8/requirements/docs.txt new/grpclib-0.4.9/requirements/docs.txt --- old/grpclib-0.4.8/requirements/docs.txt 2025-05-04 18:21:46.000000000 +0200 +++ new/grpclib-0.4.9/requirements/docs.txt 2025-12-14 23:21:58.000000000 +0100 @@ -1,38 +1,37 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.10 # by the following command: # # pip-compile --annotation-style=line requirements/docs.in # -alabaster==0.7.13 # via sphinx -babel==2.14.0 # via sphinx -certifi==2024.2.2 # via -r requirements/runtime.in, requests -charset-normalizer==3.3.2 # via requests -docutils==0.20.1 # via sphinx, sphinx-rtd-theme -googleapis-common-protos==1.63.0 # via -r requirements/runtime.in -h2==4.1.0 # via -r requirements/../setup.txt -hpack==4.0.0 # via -r requirements/../setup.txt, h2 -hyperframe==6.0.1 # via -r requirements/../setup.txt, h2 -idna==3.7 # via requests +alabaster==1.0.0 # via sphinx +babel==2.17.0 # via sphinx +certifi==2025.11.12 # via -r requirements/runtime.in, requests +charset-normalizer==3.4.4 # via requests +docutils==0.21.2 # via sphinx, sphinx-rtd-theme +googleapis-common-protos==1.72.0 # via -r requirements/runtime.in +h2==4.3.0 # via -r setup.txt +hpack==4.1.0 # via -r setup.txt, h2 +hyperframe==6.1.0 # via -r setup.txt, h2 +idna==3.11 # via requests imagesize==1.4.1 # via sphinx -importlib-metadata==7.1.0 # via sphinx -jinja2==3.1.3 # via sphinx -markupsafe==2.1.5 # via jinja2 -multidict==6.0.5 # via -r requirements/../setup.txt -packaging==24.0 # via sphinx -protobuf==4.25.3 # via -r requirements/runtime.in, googleapis-common-protos -pygments==2.17.2 # via sphinx -pytz==2024.1 # via babel -requests==2.31.0 # via sphinx -snowballstemmer==2.2.0 # via sphinx -sphinx==7.1.2 # via -r requirements/docs.in, sphinx-rtd-theme, sphinxcontrib-jquery -sphinx-rtd-theme==2.0.0 # via -r requirements/docs.in -sphinxcontrib-applehelp==1.0.4 # via sphinx -sphinxcontrib-devhelp==1.0.2 # via sphinx -sphinxcontrib-htmlhelp==2.0.1 # via sphinx +jinja2==3.1.6 # via sphinx +markupsafe==3.0.3 # via jinja2 +multidict==6.7.0 # via -r setup.txt +packaging==25.0 # via sphinx +protobuf==6.33.1 # via -r requirements/runtime.in, googleapis-common-protos +pygments==2.19.2 # via sphinx +requests==2.32.5 # via sphinx +snowballstemmer==3.0.1 # via sphinx +sphinx==8.1.3 # via -r requirements/docs.in, sphinx-rtd-theme, sphinxcontrib-jquery +sphinx-rtd-theme==3.0.2 # via -r requirements/docs.in +sphinxcontrib-applehelp==2.0.0 # via sphinx +sphinxcontrib-devhelp==2.0.0 # via sphinx +sphinxcontrib-htmlhelp==2.1.0 # via sphinx sphinxcontrib-jquery==4.1 # via sphinx-rtd-theme sphinxcontrib-jsmath==1.0.1 # via sphinx -sphinxcontrib-qthelp==1.0.3 # via sphinx -sphinxcontrib-serializinghtml==1.1.5 # via sphinx -urllib3==2.2.1 # via requests -zipp==3.18.1 # via importlib-metadata +sphinxcontrib-qthelp==2.0.0 # via sphinx +sphinxcontrib-serializinghtml==2.0.0 # via sphinx +tomli==2.3.0 # via sphinx +typing-extensions==4.15.0 # via -r setup.txt, multidict +urllib3==2.5.0 # via requests diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grpclib-0.4.8/requirements/release.in new/grpclib-0.4.9/requirements/release.in --- old/grpclib-0.4.8/requirements/release.in 2025-05-04 18:21:46.000000000 +0200 +++ new/grpclib-0.4.9/requirements/release.in 2025-12-14 23:21:58.000000000 +0100 @@ -1,5 +1,5 @@ -r ../setup.txt twine -grpcio-tools -mypy-protobuf +grpcio-tools==1.62.1 +mypy-protobuf==3.6.0 wheel diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grpclib-0.4.8/requirements/release.txt new/grpclib-0.4.9/requirements/release.txt --- old/grpclib-0.4.8/requirements/release.txt 2025-05-04 18:21:46.000000000 +0200 +++ new/grpclib-0.4.9/requirements/release.txt 2025-12-14 23:21:58.000000000 +0100 @@ -1,50 +1,45 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.10 # by the following command: # # pip-compile --annotation-style=line requirements/release.in # -backports-tarfile==1.1.0 # via jaraco-context -certifi==2024.2.2 # via requests -cffi==1.16.0 # via cryptography -charset-normalizer==3.3.2 # via requests -cryptography==42.0.5 # via secretstorage -docutils==0.20.1 # via readme-renderer -grpcio==1.62.1 # via grpcio-tools +backports-tarfile==1.2.0 # via jaraco-context +certifi==2025.11.12 # via requests +charset-normalizer==3.4.4 # via requests +docutils==0.22.3 # via readme-renderer +grpcio==1.76.0 # via grpcio-tools grpcio-tools==1.62.1 # via -r requirements/release.in -h2==4.1.0 # via -r requirements/../setup.txt -hpack==4.0.0 # via -r requirements/../setup.txt, h2 -hyperframe==6.0.1 # via -r requirements/../setup.txt, h2 -idna==3.7 # via requests -importlib-metadata==7.1.0 # via keyring, twine -importlib-resources==6.4.0 # via keyring +h2==4.3.0 # via -r setup.txt +hpack==4.1.0 # via -r setup.txt, h2 +hyperframe==6.1.0 # via -r setup.txt, h2 +id==1.5.0 # via twine +idna==3.11 # via requests +importlib-metadata==8.7.0 # via keyring jaraco-classes==3.4.0 # via keyring -jaraco-context==5.3.0 # via keyring -jaraco-functools==4.0.0 # via keyring -jeepney==0.8.0 # via keyring, secretstorage -keyring==25.1.0 # via twine -markdown-it-py==3.0.0 # via rich +jaraco-context==6.0.1 # via keyring +jaraco-functools==4.3.0 # via keyring +keyring==25.7.0 # via twine +markdown-it-py==4.0.0 # via rich mdurl==0.1.2 # via markdown-it-py -more-itertools==10.2.0 # via jaraco-classes, jaraco-functools -multidict==6.0.5 # via -r requirements/../setup.txt +more-itertools==10.8.0 # via jaraco-classes, jaraco-functools +multidict==6.7.0 # via -r setup.txt mypy-protobuf==3.6.0 # via -r requirements/release.in -nh3==0.2.17 # via readme-renderer -pkginfo==1.10.0 # via twine -protobuf==4.25.3 # via grpcio-tools, mypy-protobuf -pycparser==2.22 # via cffi -pygments==2.17.2 # via readme-renderer, rich -readme-renderer==43.0 # via twine -requests==2.31.0 # via requests-toolbelt, twine +nh3==0.3.2 # via readme-renderer +packaging==25.0 # via twine +protobuf==4.25.8 # via grpcio-tools, mypy-protobuf +pygments==2.19.2 # via readme-renderer, rich +readme-renderer==44.0 # via twine +requests==2.32.5 # via id, requests-toolbelt, twine requests-toolbelt==1.0.0 # via twine rfc3986==2.0.0 # via twine -rich==13.7.1 # via twine -secretstorage==3.3.3 # via keyring -twine==5.0.0 # via -r requirements/release.in -types-protobuf==4.25.0.20240417 # via mypy-protobuf -typing-extensions==4.11.0 # via rich -urllib3==2.2.1 # via requests, twine -wheel==0.43.0 # via -r requirements/release.in -zipp==3.18.1 # via importlib-metadata, importlib-resources +rich==14.2.0 # via twine +twine==6.2.0 # via -r requirements/release.in +types-protobuf==6.32.1.20251210 # via mypy-protobuf +typing-extensions==4.15.0 # via -r setup.txt, grpcio, multidict +urllib3==2.6.2 # via requests, twine +wheel==0.45.1 # via -r requirements/release.in +zipp==3.23.0 # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: # setuptools diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grpclib-0.4.8/requirements/runtime.txt new/grpclib-0.4.9/requirements/runtime.txt --- old/grpclib-0.4.8/requirements/runtime.txt 2025-05-04 18:21:46.000000000 +0200 +++ new/grpclib-0.4.9/requirements/runtime.txt 2025-12-14 23:21:58.000000000 +0100 @@ -1,13 +1,14 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.10 # by the following command: # # pip-compile --annotation-style=line requirements/runtime.in # -certifi==2024.2.2 # via -r requirements/runtime.in -googleapis-common-protos==1.63.0 # via -r requirements/runtime.in -h2==4.1.0 # via -r requirements/../setup.txt -hpack==4.0.0 # via -r requirements/../setup.txt, h2 -hyperframe==6.0.1 # via -r requirements/../setup.txt, h2 -multidict==6.0.5 # via -r requirements/../setup.txt -protobuf==4.25.3 # via -r requirements/runtime.in, googleapis-common-protos +certifi==2025.11.12 # via -r requirements/runtime.in +googleapis-common-protos==1.72.0 # via -r requirements/runtime.in +h2==4.3.0 # via -r setup.txt +hpack==4.1.0 # via -r setup.txt, h2 +hyperframe==6.1.0 # via -r setup.txt, h2 +multidict==6.7.0 # via -r setup.txt +protobuf==6.33.1 # via -r requirements/runtime.in, googleapis-common-protos +typing-extensions==4.15.0 # via -r setup.txt, multidict diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grpclib-0.4.8/requirements/test.in new/grpclib-0.4.9/requirements/test.in --- old/grpclib-0.4.8/requirements/test.in 2025-05-04 18:21:46.000000000 +0200 +++ new/grpclib-0.4.9/requirements/test.in 2025-12-14 23:21:58.000000000 +0100 @@ -3,4 +3,5 @@ pytest-cov pytest-asyncio async_timeout +backports-asyncio-runner; python_version < '3.11' faker diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grpclib-0.4.8/requirements/test.txt new/grpclib-0.4.9/requirements/test.txt --- old/grpclib-0.4.8/requirements/test.txt 2025-05-04 18:21:46.000000000 +0200 +++ new/grpclib-0.4.9/requirements/test.txt 2025-12-14 23:21:58.000000000 +0100 @@ -1,27 +1,28 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.10 # by the following command: # # pip-compile --annotation-style=line requirements/test.in # -async-timeout==4.0.3 # via -r requirements/test.in -certifi==2024.2.2 # via -r requirements/runtime.in -coverage[toml]==7.4.4 # via pytest-cov -exceptiongroup==1.2.0 # via pytest -faker==24.11.0 # via -r requirements/test.in -googleapis-common-protos==1.63.0 # via -r requirements/runtime.in -h2==4.1.0 # via -r requirements/../setup.txt -hpack==4.0.0 # via -r requirements/../setup.txt, h2 -hyperframe==6.0.1 # via -r requirements/../setup.txt, h2 -iniconfig==2.0.0 # via pytest -multidict==6.0.5 # via -r requirements/../setup.txt -packaging==24.0 # via pytest -pluggy==1.4.0 # via pytest -protobuf==4.25.3 # via -r requirements/runtime.in, googleapis-common-protos -pytest==8.1.1 # via -r requirements/test.in, pytest-asyncio, pytest-cov -pytest-asyncio==0.23.6 # via -r requirements/test.in -pytest-cov==5.0.0 # via -r requirements/test.in -python-dateutil==2.9.0.post0 # via faker -six==1.16.0 # via python-dateutil -tomli==2.0.1 # via coverage, pytest -typing-extensions==4.11.0 # via faker +async-timeout==5.0.1 # via -r requirements/test.in +backports-asyncio-runner==1.2.0 ; python_version < "3.11" # via -r requirements/test.in, pytest-asyncio +certifi==2025.11.12 # via -r requirements/runtime.in +coverage[toml]==7.12.0 # via pytest-cov +exceptiongroup==1.3.1 # via pytest +faker==38.2.0 # via -r requirements/test.in +googleapis-common-protos==1.72.0 # via -r requirements/runtime.in +h2==4.3.0 # via -r setup.txt +hpack==4.1.0 # via -r setup.txt, h2 +hyperframe==6.1.0 # via -r setup.txt, h2 +iniconfig==2.3.0 # via pytest +multidict==6.7.0 # via -r setup.txt +packaging==25.0 # via pytest +pluggy==1.6.0 # via pytest, pytest-cov +protobuf==6.33.1 # via -r requirements/runtime.in, googleapis-common-protos +pygments==2.19.2 # via pytest +pytest==9.0.1 # via -r requirements/test.in, pytest-asyncio, pytest-cov +pytest-asyncio==1.3.0 # via -r requirements/test.in +pytest-cov==7.0.0 # via -r requirements/test.in +tomli==2.3.0 # via coverage, pytest +typing-extensions==4.15.0 # via -r setup.txt, exceptiongroup, multidict, pytest-asyncio +tzdata==2025.2 # via faker diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grpclib-0.4.8/setup.cfg new/grpclib-0.4.9/setup.cfg --- old/grpclib-0.4.8/setup.cfg 2025-05-04 18:21:46.000000000 +0200 +++ new/grpclib-0.4.9/setup.cfg 2025-12-14 23:21:58.000000000 +0100 @@ -6,7 +6,7 @@ description = Pure-Python gRPC implementation for asyncio long_description = file: README.rst long_description_content_type = text/x-rst -author = Vladimir Magamedov +author = Volodymyr Magamedov author_email = [email protected] url = https://github.com/vmagamedov/grpclib classifiers = @@ -15,18 +15,18 @@ License :: OSI Approved :: BSD License Operating System :: OS Independent Programming Language :: Python - Programming Language :: Python :: 3.8 - Programming Language :: Python :: 3.9 Programming Language :: Python :: 3.10 Programming Language :: Python :: 3.11 Programming Language :: Python :: 3.12 + Programming Language :: Python :: 3.13 + Programming Language :: Python :: 3.14 Programming Language :: Python :: 3 :: Only Topic :: Internet :: WWW/HTTP :: HTTP Servers Topic :: Software Development :: Libraries :: Python Modules [options] packages = find: -python_requires = >=3.8 +python_requires = >=3.10 install_requires= h2<5,>=3.1.0 multidict @@ -48,7 +48,7 @@ [tool:pytest] addopts = -q --tb=native testpaths = tests -asyncio_mode = auto +asyncio_mode = strict filterwarnings = error ignore:.*pkg_resources.*:DeprecationWarning @@ -98,3 +98,6 @@ [mypy-google.rpc.*] ignore_missing_imports = true + +[mypy-annotationlib.*] +ignore_missing_imports = true diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grpclib-0.4.8/setup.py new/grpclib-0.4.9/setup.py --- old/grpclib-0.4.8/setup.py 2025-05-04 18:21:46.000000000 +0200 +++ new/grpclib-0.4.9/setup.py 2025-12-14 23:21:58.000000000 +0100 @@ -2,5 +2,5 @@ setuptools.setup( name="grpclib", - python_requires='>=3.8', + python_requires='>=3.10', ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grpclib-0.4.8/setup.txt new/grpclib-0.4.9/setup.txt --- old/grpclib-0.4.8/setup.txt 2025-05-04 18:21:46.000000000 +0200 +++ new/grpclib-0.4.9/setup.txt 2025-12-14 23:21:58.000000000 +0100 @@ -1,10 +1,11 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.10 # by the following command: # # pip-compile --annotation-style=line --output-file=setup.txt setup.py # -h2==4.1.0 # via grpclib (setup.py) -hpack==4.0.0 # via h2 -hyperframe==6.0.1 # via h2 -multidict==6.0.5 # via grpclib (setup.py) +h2==4.3.0 # via grpclib (setup.py) +hpack==4.1.0 # via h2 +hyperframe==6.1.0 # via h2 +multidict==6.7.0 # via grpclib (setup.py) +typing-extensions==4.15.0 # via multidict diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grpclib-0.4.8/tests/conftest.py new/grpclib-0.4.9/tests/conftest.py --- old/grpclib-0.4.8/tests/conftest.py 2025-05-04 18:21:46.000000000 +0200 +++ new/grpclib-0.4.9/tests/conftest.py 2025-12-14 23:21:58.000000000 +0100 @@ -1,12 +1,15 @@ +import asyncio + import pytest +import pytest_asyncio from grpclib.config import Configuration [email protected](name='loop') -def loop_fixture(event_loop): +@pytest_asyncio.fixture(name='loop') +async def loop_fixture(): """ Shortcut """ - return event_loop + return asyncio.get_running_loop() @pytest.fixture(name='config') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grpclib-0.4.8/tests/test_client_channel.py new/grpclib-0.4.9/tests/test_client_channel.py --- old/grpclib-0.4.8/tests/test_client_channel.py 2025-05-04 18:21:46.000000000 +0200 +++ new/grpclib-0.4.9/tests/test_client_channel.py 2025-12-14 23:21:58.000000000 +0100 @@ -48,7 +48,8 @@ ) -def test_default_ssl_context(): [email protected] +async def test_default_ssl_context(): with patch.object(certifi, "where", return_value=certifi.where()) as po: certifi_channel = Channel(ssl=True) assert certifi_channel._ssl @@ -80,7 +81,8 @@ ) -def test_default_verify_paths(): [email protected] +async def test_default_verify_paths(): with contextlib.ExitStack() as cm: tf = cm.enter_context(tempfile.NamedTemporaryFile()).name td = cm.enter_context(tempfile.TemporaryDirectory()) @@ -98,7 +100,8 @@ assert default_verify_paths.openssl_capath_env == "SSL_CERT_DIR" -def test_no_ssl_support(): [email protected] +async def test_no_ssl_support(): with patch.object(grpclib.client, "_ssl", None): Channel() with pytest.raises(RuntimeError) as err: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grpclib-0.4.8/tests/test_reflection.py new/grpclib-0.4.9/tests/test_reflection.py --- old/grpclib-0.4.8/tests/test_reflection.py 2025-05-04 18:21:46.000000000 +0200 +++ new/grpclib-0.4.9/tests/test_reflection.py 2025-12-14 23:21:58.000000000 +0100 @@ -1,5 +1,7 @@ import socket +from google.protobuf.descriptor_pool import DescriptorPool + import pytest import pytest_asyncio @@ -108,3 +110,45 @@ service, = r1.list_services_response.service assert service.name == DESCRIPTOR.services_by_name['DummyService'].full_name + + [email protected] +async def test_file_containing_symbol_response_custom_pool(port): + my_pool = DescriptorPool() + services = [DummyService()] + services = ServerReflection.extend(services, pool=my_pool) + + server = Server(services) + await server.start(port=port) + + channel = Channel(port=port) + try: + # because we use our own pool (my_pool), there's no descriptors to find. + req = ServerReflectionRequest( + file_containing_symbol=( + DESCRIPTOR.message_types_by_name['DummyRequest'].full_name + ), + ) + resp, = await ServerReflectionStub(channel).ServerReflectionInfo([req]) + + assert resp == ServerReflectionResponse( + error_response=ErrorResponse( + error_code=5, + error_message='not found', + ), + ) + + # once we update the pool, we should find the descriptor. + my_pool.AddSerializedFile(DESCRIPTOR.serialized_pb) + + resp, = await ServerReflectionStub(channel).ServerReflectionInfo([req]) + + proto_bytes, = resp.file_descriptor_response.file_descriptor_proto + dummy_proto = FileDescriptorProto() + dummy_proto.ParseFromString(proto_bytes) + assert dummy_proto.name == DESCRIPTOR.name + assert dummy_proto.package == DESCRIPTOR.package + finally: + channel.close() + server.close() + await server.wait_closed() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grpclib-0.4.8/tests/test_utils.py new/grpclib-0.4.9/tests/test_utils.py --- old/grpclib-0.4.8/tests/test_utils.py 2025-05-04 18:21:46.000000000 +0200 +++ new/grpclib-0.4.9/tests/test_utils.py 2025-12-14 23:21:58.000000000 +0100 @@ -92,7 +92,7 @@ await server.wait_closed() if __name__ == '__main__': - asyncio.get_event_loop().run_until_complete(main()) + asyncio.run(main()) """ @@ -125,7 +125,7 @@ await asyncio.sleep(10) if __name__ == '__main__': - asyncio.get_event_loop().run_until_complete(main()) + asyncio.run(main()) """
