openapi-generators / openapi-generators/openapi-python-client
Missing typehint of File payload for async requests
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Python
- Estrellas
- 2k
- Forks
- 293
- Merge medio
- 34 min
- PR fusionados (30 d)
- 1
Descripción
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
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza en openapi_python_client/templates/types.py.jinja, en la línea 25, e inspecciona cómo las funciones de carga síncronas y asyncio generadas utilizan los tipos de payload de archivo. Compara los casos BinaryIO y anyio AsyncFile descritos en el issue; se considera terminado cuando las sugerencias de tipo generadas distinguen el payload válido para cada estilo de solicitud y evitan orientar incorrectamente al IDE.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- developer-experience, tooling
- Tipo de issue
- Error
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 45/100