openapi-generators / openapi-generators/openapi-python-client
Upload file logic seems to be wrong on 3.1 schema
还没有人认领这个 Issue。
- 主要语言
- Python
- 星标
- 2k
- 派生
- 293
- 平均合并
- 34 分钟
- 30 天内合并 PR
- 1
描述
Describe the bug
I just upgraded my API, and the schema changed from 3.0 to 3.1. The uploads suddenly broke. It seems that the code generated for the body class now looks like this:
file: str
...
def to_multipart(self) -> types.RequestFiles:
files: types.RequestFiles = []
files.append(("file", (None, str(self.file).encode(), "text/plain")))
for prop_name, prop in self.additional_properties.items():
files.append((prop_name, (None, str(prop).encode(), "text/plain")))
return files
While the old looked like this:
file: File
python
def to_multipart(self) -> types.RequestFiles:
files: types.RequestFiles = []
files.append(("file", self.file.to_tuple()))
for prop_name, prop in self.additional_properties.items():
files.append((prop_name, (None, str(prop).encode(), "text/plain")))
return files
Where the File object is this:
@define
class File:
"""Contains information for file uploads"""
payload: BinaryIO
file_name: str | None = None
mime_type: str | None = None
def to_tuple(self) -> FileTypes:
"""Return a tuple representation that httpx will accept for multipart/form-data"""
return self.file_name, self.payload, self.mime_type
OpenAPI Spec File
A link to an OpenAPI document which produces this issue. Ideally, write a minimal reproduction only containing the problematic pieces.
The API spec for the body (new 3.1):
"file": {
"type": "string",
"contentMediaType": "application/octet-stream",
"title": "File"
}
Old (3.0) schema:
"file": {
"type": "string",
"format": "binary",
"title": "File"
}
Desktop:
- OS: [e.g. macOS 10.15.1]: MacOS (M4) 26.3.1
- Python Version: [e.g. 3.8.0]: 3.11.14
- openapi-python-client version [e.g. 0.1.0]: 0.28.3
Additional context
I have some code pre-massaging around a different name-related issue and adding this to the pre-processing before this tool is called fixed it, but it's definitely more of a temporary workaround type of thing:
for prop in props.values():
if prop.get("contentMediaType") == "application/octet-stream":
prop["format"] = "binary"
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
首先复现根据所提供的 OpenAPI 3.1 schema 生成的 body 类,并使用 format: binary 将其与 3.0 schema 进行比较。跟踪 contentMediaType: application/octet-stream 在生成过程中的解释方式;完成的标志是生成的字段使用 File,并且 multipart 序列化像旧输出中一样调用 to_tuple()。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- openapi, python
- 领域
- api, tooling
- Issue 类型
- 缺陷
- 难度
- 3/5
- 预计耗时
- 1-2 天
- 活跃度
- 冷清
- 描述清晰度
- 基本清楚
- 新手友好度
- 55/100