openapi-generators / openapi-generators/openapi-python-client

String Binary File is just expecting BytesIO and not filename and mime-type

Ouverte
#609 1 commentaire 1 réaction 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

🐞bug
Langage dominant
Python
Étoiles
2k
Forks
293
Merge moyen
34 min
PR mergées (30 j)
1

Description

I have Java OpenAPI server which provides an upload endpoint (POST) that expect as schema a FileRequest ( schema = @Schema(implementation = FileRequest.class))

The FileRequest looks like:

@Value.Immutable
@JsonDeserialize(builder = com.mydata.request.FileRequest.Builder.class)
public abstract class FileRequest implements FileFields {
    @Schema(type = "string", format = "binary", description = "File")
    @JsonProperty
    public abstract String file();

    public static class Builder extends ImmutableFileRequest.Builder {

    }
}

Looking at the generated code, the models looks good. This is the relevant part on types.py:

@attr.s(auto_attribs=True)
class File:
    """ Contains information for file uploads """

    payload: BinaryIO
    file_name: Optional[str] = None
    mime_type: Optional[str] = None

    def to_tuple(self) -> FileJsonType:
        """ Return a tuple representation that httpx will accept for multipart/form-data """
        return self.file_name, self.payload, self.mime_type


T = TypeVar("T")

However, looking at the upload endpoint request, it doesn't expect the Optional values above:


    @classmethod
    def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
        d = src_dict.copy()

        _file = d.pop("file", UNSET)
        file: Union[Unset, File]
        if isinstance(_file,  Unset):
            file = UNSET
        else:
            file = File(
             payload = BytesIO(_file)
        )

Notice that the File expects only the binary data, losing the filename and mimetype.

Expected behavior

I would expect that the generated code would look something like below, which I patched and am using currently:

        else:
            file = File(
             payload = BytesIO(_file['payload']),
                file_name=_file['filename']
        )

Desktop (please complete the following information):

  • OS: Linux, but irrelevant
  • openapi-python-client version: 0.11.1
  • Python 3.8.10
  • openapi: 3.0.1

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par le types.py généré et le code File.from_dict présenté dans l’issue, puis suivez la manière dont les schémas de chaînes binaires sont représentés lors de l’analyse des réponses ou des requêtes. Reproduisez le cas d’upload FileRequest fourni et vérifiez que le File obtenu conserve payload, filename et MIME type, plutôt que seulement les données binaires.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
openapi, python
Domaine
api
Type d'issue
Bug
Difficulté
3/5
Temps estimé
1-2 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.