diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 18b6a8b..642e98a 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -2,6 +2,12 @@ Changelog ========= +2.1.1 (2025-11-08) +------------------- + +- fix: pydantic specification extractor fixed. + + 2.1.0 (2025-10-31) ------------------- diff --git a/pjrpc/server/specs/extractors/pydantic.py b/pjrpc/server/specs/extractors/pydantic.py index 9710cb1..5933eb8 100644 --- a/pjrpc/server/specs/extractors/pydantic.py +++ b/pjrpc/server/specs/extractors/pydantic.py @@ -151,7 +151,7 @@ def extract_response_schema( title=error.__name__, json_schema_extra=dict(description=f'**{error.CODE}** {error.MESSAGE}'), ), - ) for error in errors or [] + ) for error in sorted(errors or [], key=lambda err: (err.CODE < 0, abs(err.CODE))) ) response_model = pd.create_model( @@ -186,7 +186,7 @@ def extract_error_response_schema( title=error.__name__, json_schema_extra=dict(description=f'**{error.CODE}** {error.MESSAGE}'), ), - ) for error in errors or [] + ) for error in sorted(errors or [], key=lambda err: (err.CODE < 0, abs(err.CODE))) ) response_model = pd.create_model( diff --git a/pjrpc/server/specs/extractors/pydantic_v1.py b/pjrpc/server/specs/extractors/pydantic_v1.py index dec3cee..4eaa7ac 100644 --- a/pjrpc/server/specs/extractors/pydantic_v1.py +++ b/pjrpc/server/specs/extractors/pydantic_v1.py @@ -136,13 +136,13 @@ def extract_response_schema( return_model = self._build_result_model(method_name, method) error_models: list[type[pd.BaseModel]] = [] - for error in errors or []: + for error in sorted(errors or [], key=lambda err: (err.CODE < 0, abs(err.CODE))): class ErrorModel(pydantic.BaseModel): Config = pydantic.config.get_config( dict( self._config_args, title=error.__name__, - json_schema_extra=dict(description=f'**{error.CODE}** {error.MESSAGE}'), + schema_extra=dict(description=f'**{error.CODE}** {error.MESSAGE}'), ), ) __root__: JsonRpcResponseError[JsonRpcError[Literal[error.CODE], Any]] # type: ignore[name-defined] @@ -171,13 +171,13 @@ def extract_error_response_schema( errors: Optional[Iterable[type[exceptions.TypedError]]] = None, ) -> tuple[dict[str, Any], dict[str, dict[str, Any]]]: error_models: list[type[pd.BaseModel]] = [] - for error in errors or []: + for error in sorted(errors or [], key=lambda err: (err.CODE < 0, abs(err.CODE))): class ErrorModel(pydantic.BaseModel): Config = pydantic.config.get_config( dict( self._config_args, title=error.__name__, - json_schema_extra=dict(description=f'**{error.CODE}** {error.MESSAGE}'), + schema_extra=dict(description=f'**{error.CODE}** {error.MESSAGE}'), ), ) __root__: JsonRpcResponseError[JsonRpcError[Literal[error.CODE], Any]] # type: ignore[name-defined] diff --git a/pyproject.toml b/pyproject.toml index 6ed0c23..b3efc3b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "pjrpc" -version = "2.1.0" +version = "2.1.1" description = "Extensible JSON-RPC library" authors = ["Dmitry Pershin "] license = "Unlicense" diff --git a/tests/server/test_openapi.py b/tests/server/test_openapi.py index 14af2af..97e2e82 100644 --- a/tests/server/test_openapi.py +++ b/tests/server/test_openapi.py @@ -1876,13 +1876,13 @@ def test_method(): }, ), '500': response_schema( - description='* **-32603** Internal error\n* **-32000** Server error', + description='* **-32000** Server error\n* **-32603** Internal error', schema={ 'title': 'TestMethodResponse', - 'description': '* **-32603** Internal error\n* **-32000** Server error', + 'description': '* **-32000** Server error\n* **-32603** Internal error', 'anyOf': [ - {'$ref': '#/components/schemas/test_openapi_InternalError'}, {'$ref': '#/components/schemas/test_openapi_ServerError'}, + {'$ref': '#/components/schemas/test_openapi_InternalError'}, ], }, ),