openapi-generators / openapi-generators/openapi-python-client
Missing typehint of File payload for async requests
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 2k
- Forks
- 293
- Avg merge
- 34m
- Merged PRs (30d)
- 1
Description
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
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with openapi_python_client/templates/types.py.jinja at line 25 and inspect how file payload types are used by generated synchronous and asyncio upload functions. Compare the BinaryIO and anyio AsyncFile cases described in the issue; done means the generated type hints distinguish the valid payload for each request style and avoid misleading IDE guidance.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- developer-experience, tooling
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100