From d8aeba612336894fa5a72f14dfc0a4736a334377 Mon Sep 17 00:00:00 2001 From: Dmitry Pershin Date: Tue, 28 Nov 2023 18:15:25 +0500 Subject: [PATCH 1/3] pre-commit hooks upgraded. --- .pre-commit-config.yaml | 15 ++++--- examples/aio_pika_server.py | 2 +- pjrpc/common/common.py | 11 +---- pjrpc/server/dispatcher.py | 9 ++--- pjrpc/server/validators/pydantic.py | 2 +- pyproject.toml | 62 ++--------------------------- tests/server/test_werkzeug.py | 10 ++--- 7 files changed, 26 insertions(+), 85 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 02df39d..2d94e92 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,7 +4,7 @@ default_stages: repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 + rev: v4.5.0 hooks: - id: check-yaml - id: check-toml @@ -25,13 +25,13 @@ repos: args: - --fix=no - repo: https://github.com/asottile/add-trailing-comma - rev: v3.0.0 + rev: v3.1.0 hooks: - id: add-trailing-comma stages: - commit - repo: https://github.com/pre-commit/mirrors-autopep8 - rev: v2.0.2 + rev: v2.0.4 hooks: - id: autopep8 stages: @@ -39,7 +39,7 @@ repos: args: - --diff - repo: https://github.com/pycqa/flake8 - rev: 6.0.0 + rev: 6.1.0 hooks: - id: flake8 - repo: https://github.com/pycqa/isort @@ -63,7 +63,7 @@ repos: - --multi-line=9 - --project=pjrpc - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.4.1 + rev: v1.7.1 hooks: - id: mypy stages: @@ -71,3 +71,8 @@ repos: name: mypy pass_filenames: false args: ["--package", "pjrpc"] + additional_dependencies: + - aiohttp>=3.7 + - httpx>=0.23.0 + - pydantic>=2.0 + - types-requests>=2.0 diff --git a/examples/aio_pika_server.py b/examples/aio_pika_server.py index a2c6e88..c4c8e20 100644 --- a/examples/aio_pika_server.py +++ b/examples/aio_pika_server.py @@ -51,7 +51,7 @@ def add_user(message: aio_pika.IncomingMessage, user_info: UserInfo) -> AddedUse executor = integration.Executor( - broker_url=URL('amqp://guest:guest@localhost:5672/v1'), queue_name='jsonrpc' + broker_url=URL('amqp://guest:guest@localhost:5672/v1'), queue_name='jsonrpc', ) executor.dispatcher.add_methods(methods) diff --git a/pjrpc/common/common.py b/pjrpc/common/common.py index 21d533a..7180a03 100644 --- a/pjrpc/common/common.py +++ b/pjrpc/common/common.py @@ -1,12 +1,5 @@ import json -import sys -from typing import Any, Dict, TypeVar, Union - -if sys.version_info >= (3, 8): - from typing import Literal - FalseType = Literal[False] -else: - FalseType = bool +from typing import Any, Dict, Literal, TypeVar, Union import pjrpc from pjrpc.common.typedefs import Json # noqa: for back compatibility @@ -18,7 +11,7 @@ class UnsetType: Used to distinct unset (missing) values from ``None`` ones. """ - def __bool__(self) -> FalseType: + def __bool__(self) -> Literal[False]: return False def __repr__(self) -> str: diff --git a/pjrpc/server/dispatcher.py b/pjrpc/server/dispatcher.py index c8b687c..df8f5c6 100644 --- a/pjrpc/server/dispatcher.py +++ b/pjrpc/server/dispatcher.py @@ -537,13 +537,12 @@ async def dispatch(self, request_text: str, context: Optional[Any] = None) -> Op else: if isinstance(request, BatchRequest): response = self._batch_response( - *filter( - lambda resp: resp is not UNSET, await asyncio.gather( - *(self._handle_request(request, context) for request in request), - ), + *( + resp + for resp in await asyncio.gather(*(self._handle_request(req, context) for req in request)) + if resp ), ) - else: response = await self._handle_request(request, context) diff --git a/pjrpc/server/validators/pydantic.py b/pjrpc/server/validators/pydantic.py index 87d9dde..8aa1a42 100644 --- a/pjrpc/server/validators/pydantic.py +++ b/pjrpc/server/validators/pydantic.py @@ -24,7 +24,7 @@ def __init__(self, coerce: bool = True, **config_args: Any): config_args.setdefault('extra', 'forbid') # https://pydantic-docs.helpmanual.io/usage/model_config/ - self._model_config = pydantic.ConfigDict(**config_args) + self._model_config = pydantic.ConfigDict(**config_args) # type: ignore[typeddict-item] def validate_method( self, method: Callable[..., Any], params: Optional['JsonRpcParams'], exclude: Iterable[str] = (), **kwargs: Any, diff --git a/pyproject.toml b/pyproject.toml index 655fb24..00b78e1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -78,7 +78,7 @@ docs = [ 'aiohttp', 'aio-pika', 'flask', 'jsonschema', 'pydantic', 'requests', 'kombu' ] -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] aioresponses = "^0.7.4" asynctest = "^0.13.0" codecov = "^2.1.13" @@ -88,8 +88,8 @@ pytest-cov = "^4.1.0" pytest-mock = "^3.11.1" responses = "^0.23.3" respx = "^0.20.2" -mypy = "^1.4.1" -pre-commit = "^2.19" +mypy = "^1.7.1" +pre-commit = "~3.2.0" [build-system] requires = ["poetry-core>=1.0.0"] @@ -107,62 +107,6 @@ strict_equality = true warn_unused_ignores = true -[[tool.mypy.overrides]] -module = "aiohttp.*" -ignore_missing_imports = true - [[tool.mypy.overrides]] module = "aio_pika.*" ignore_missing_imports = true - -[[tool.mypy.overrides]] -module = "docstring_parser.*" -ignore_missing_imports = true - -[[tool.mypy.overrides]] -module = "django.*" -ignore_missing_imports = true - -[[tool.mypy.overrides]] -module = "flask.*" -ignore_missing_imports = true - -[[tool.mypy.overrides]] -module = "jsonschema.*" -ignore_missing_imports = true - -[[tool.mypy.overrides]] -module = "starlette.*" -ignore_missing_imports = true - -[[tool.mypy.overrides]] -module = "openapi_ui_bundles.*" -ignore_missing_imports = true - -[[tool.mypy.overrides]] -module = "werkzeug.*" -ignore_missing_imports = true - -[[tool.mypy.overrides]] -module = "httpx.*" -ignore_missing_imports = true - -[[tool.mypy.overrides]] -module = "kombu.*" -ignore_missing_imports = true - -[[tool.mypy.overrides]] -module = "pydantic.*" -ignore_missing_imports = true - -[[tool.mypy.overrides]] -module = "pytest.*" -ignore_missing_imports = true - -[[tool.mypy.overrides]] -module = "requests.*" -ignore_missing_imports = true - -[[tool.mypy.overrides]] -module = "yarl.*" -ignore_missing_imports = true diff --git a/tests/server/test_werkzeug.py b/tests/server/test_werkzeug.py index 761c48c..2369ed3 100644 --- a/tests/server/test_werkzeug.py +++ b/tests/server/test_werkzeug.py @@ -43,7 +43,7 @@ def test_request(json_rpc, path, mocker, request_id, params, result): test_response = cli.post( path, json=v20.Request(method=method_name, params=params, id=request_id).to_json(), ) - if type(test_response) == tuple: # werkzeug 1.0 + if type(test_response) is tuple: # werkzeug 1.0 body_iter, code, header = test_response body = b''.join(body_iter) else: # werkzeug >= 2.1 @@ -72,7 +72,7 @@ def test_notify(json_rpc, path, mocker): test_response = cli.post( path, json=v20.Request(method=method_name, params=params).to_json(), ) - if type(test_response) == tuple: # werkzeug 1.0 + if type(test_response) is tuple: # werkzeug 1.0 body_iter, code, header = test_response body = b''.join(body_iter) else: # werkzeug >= 2.1 @@ -98,7 +98,7 @@ def error_method(*args, **kwargs): test_response = cli.post( path, json=v20.Request(method='unknown_method', params=params, id=request_id).to_json(), ) - if type(test_response) == tuple: # werkzeug 1.0 + if type(test_response) is tuple: # werkzeug 1.0 body_iter, code, header = test_response body = b''.join(body_iter) else: # werkzeug >= 2.1 @@ -114,7 +114,7 @@ def error_method(*args, **kwargs): test_response = cli.post( path, json=v20.Request(method=method_name, params=params, id=request_id).to_json(), ) - if type(test_response) == tuple: # werkzeug 1.0 + if type(test_response) is tuple: # werkzeug 1.0 body_iter, code, header = test_response body = b''.join(body_iter) else: # werkzeug >= 2.1 @@ -131,7 +131,7 @@ def error_method(*args, **kwargs): test_response = cli.post( path, headers={'Content-Type': 'application/json'}, data='', ) - if type(test_response) == tuple: # werkzeug 1.0 + if type(test_response) is tuple: # werkzeug 1.0 body_iter, code, header = test_response body = b''.join(body_iter) else: From 58e883cd93e5ebdcc1b6055e5dbb30ca96a06e4f Mon Sep 17 00:00:00 2001 From: Dmitry Pershin Date: Tue, 28 Nov 2023 18:20:18 +0500 Subject: [PATCH 2/3] client headers passing bug fixed. --- pjrpc/client/backend/aiohttp.py | 6 ++---- pjrpc/client/backend/httpx.py | 14 +++++--------- pjrpc/client/backend/requests.py | 6 ++---- 3 files changed, 9 insertions(+), 17 deletions(-) diff --git a/pjrpc/client/backend/aiohttp.py b/pjrpc/client/backend/aiohttp.py index e6fd532..32319b7 100644 --- a/pjrpc/client/backend/aiohttp.py +++ b/pjrpc/client/backend/aiohttp.py @@ -34,10 +34,8 @@ async def _request(self, request_text: str, is_notification: bool = False, **kwa :returns: response text """ - kwargs = { - 'headers': {'Content-Type': pjrpc.common.DEFAULT_CONTENT_TYPE}, - **kwargs, - } + headers = kwargs.setdefault('headers', {}) + headers['Content-Type'] = pjrpc.common.DEFAULT_CONTENT_TYPE resp = await self._session.post(self._endpoint, data=request_text, **kwargs) resp.raise_for_status() diff --git a/pjrpc/client/backend/httpx.py b/pjrpc/client/backend/httpx.py index ffa8ac8..f80b48b 100644 --- a/pjrpc/client/backend/httpx.py +++ b/pjrpc/client/backend/httpx.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, List, Optional +from typing import Any, List, Optional import httpx @@ -29,10 +29,8 @@ def _request(self, request_text: str, is_notification: bool = False, **kwargs: A :returns: response text """ - kwargs: Dict[str, Any] = { - 'headers': {'Content-Type': pjrpc.common.DEFAULT_CONTENT_TYPE}, - **kwargs, - } + headers = kwargs.setdefault('headers', {}) + headers['Content-Type'] = pjrpc.common.DEFAULT_CONTENT_TYPE resp = self._client.post(self._endpoint, content=request_text, **kwargs) resp.raise_for_status() @@ -84,10 +82,8 @@ async def _request(self, request_text: str, is_notification: bool = False, **kwa :returns: response text """ - kwargs: Dict[str, Any] = { - 'headers': {'Content-Type': pjrpc.common.DEFAULT_CONTENT_TYPE}, - **kwargs, - } + headers = kwargs.setdefault('headers', {}) + headers['Content-Type'] = pjrpc.common.DEFAULT_CONTENT_TYPE resp = await self._client.post(self._endpoint, content=request_text, **kwargs) resp.raise_for_status() diff --git a/pjrpc/client/backend/requests.py b/pjrpc/client/backend/requests.py index 8bb5d5b..bc69251 100644 --- a/pjrpc/client/backend/requests.py +++ b/pjrpc/client/backend/requests.py @@ -29,10 +29,8 @@ def _request(self, request_text: str, is_notification: bool = False, **kwargs: A :returns: response text """ - kwargs = { - 'headers': {'Content-Type': pjrpc.common.DEFAULT_CONTENT_TYPE}, - **kwargs, - } + headers = kwargs.setdefault('headers', {}) + headers['Content-Type'] = pjrpc.common.DEFAULT_CONTENT_TYPE resp = self._session.post(self._endpoint, data=request_text, **kwargs) resp.raise_for_status() From cbe54a030d85d2082ded1946f6114c22ec9f9053 Mon Sep 17 00:00:00 2001 From: Dmitry Pershin Date: Tue, 28 Nov 2023 18:35:57 +0500 Subject: [PATCH 3/3] bump version 1.8.1. --- CHANGELOG.rst | 6 ++++++ pjrpc/__about__.py | 2 +- pyproject.toml | 3 ++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 0d91c00..9f8ec4b 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,6 +1,12 @@ Changelog ========= +1.8.1 (2023-11-28) +------------------ + +- client headers passing bug fixed. + + 1.8.0 (2023-09-26) ------------------ diff --git a/pjrpc/__about__.py b/pjrpc/__about__.py index 4615488..c3b8d6c 100644 --- a/pjrpc/__about__.py +++ b/pjrpc/__about__.py @@ -2,7 +2,7 @@ __description__ = 'Extensible JSON-RPC library' __url__ = 'https://github.com/dapper91/pjrpc' -__version__ = '1.8.0' +__version__ = '1.8.1' __author__ = 'Dmitry Pershin' __email__ = 'dapper1291@gmail.com' diff --git a/pyproject.toml b/pyproject.toml index 00b78e1..d3fe0bd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "pjrpc" -version = "1.8.0" +version = "1.8.1" description = "Extensible JSON-RPC library" authors = ["Dmitry Pershin "] license = "Unlicense" @@ -22,6 +22,7 @@ classifiers = [ "Framework :: Django", "Framework :: Flask", "Framework :: Pytest", + "Typing :: Typed", "Topic :: Internet :: WWW/HTTP", "Topic :: Software Development :: Libraries", "Topic :: Software Development :: Libraries :: Application Frameworks",