openapi-generators / openapi-generators/openapi-python-client
Missing typehint of File payload for async requests
还没有人认领这个 Issue。
- 主要语言
- Python
- 星标
- 2k
- 派生
- 293
- 平均合并
- 34 分钟
- 30 天内合并 PR
- 1
描述
Describe the bug
LOW PRIORITY
If an API provides an "upload_file" endpoint, when using async, one has to use an asynchronous way to open a file.
Using anyio from httpx, it would require an "AsyncFile" object:
https://github.com/agronholm/anyio/blob/2a63fd0bef1575e583c4cf63cebe7d76a218c83e/src/anyio/_core/_fileio.py#L38C49-L39C5
This doesn't match with File payload typehint:
openapi_python_client/templates/types.py.jinja, line 25
and results with an incorrect IDE warning.
OpenAPI Spec File
https://github.com/openapi-generators/openapi-python-client/blob/main/openapi_python_client/templates/types.py.jinja#L25
Example async usage:
def send_file(client: AuthenticatedClient, my_filepath: str):
async with await anyio.open_file(my_filepath, mode="rb") as async_file:
file = types.File(async_file, my_filepath, "text/html; charset=utf-8")
return await upload.asyncio(client=client, body=file)
(This works fine, but IDE will complain about async_file type)
Desktop (please complete the following information):
- OS: Ubuntu 22.04
- Python Version: 3.11
- openapi-python-client version: 0.24.1
Additional context
Quick solution:
@define
class File:
""" Contains information for file uploads """
payload: BinaryIO | AsyncFile
file_name: Optional[str] = None
mime_type: Optional[str] = None
But:
Running upload.asyncio function with payload of type BinaryIO will result in the following exception:
Runtime Error: Attempted to send an sync request with an AsyncClient instance.
So, to prevent users from getting this a little bit misleading exception, they should get an IDE warning. To do that, asyncio functions should require a different type of payload than sync, when it comes to IO objects:
@define
class File:
""" Contains information for file uploads """
payload: BinaryIO
file_name: Optional[str] = None
mime_type: Optional[str] = None
[.....]
from anyio import AsyncFile
@define
class AsyncFile_:
""" Contains information for file uploads """
payload: AsyncFile
file_name: Optional[str] = None
mime_type: Optional[str] = None
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
从 openapi_python_client/templates/types.py.jinja 第 25 行开始,检查生成的同步和 asyncio 上传函数如何使用文件 payload 类型。比较 issue 中描述的 BinaryIO 和 anyio AsyncFile 情况;完成的标准是,生成的类型提示能够区分每种请求风格的有效 payload,并避免向 IDE 提供误导性指导。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- python
- 领域
- developer-experience, tooling
- Issue 类型
- 缺陷
- 难度
- 3/5
- 预计耗时
- 1-2 天
- 活跃度
- 停滞
- 描述清晰度
- 基本清楚
- 新手友好度
- 45/100