openapi-generators / openapi-generators/openapi-python-client
Incorrect `const` property validation
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 2k
- Forks
- 293
- Merge moyen
- 34 min
- PR mergées (30 j)
- 1
Description
Describe the bug
The const property validation introduced in #1024 is not correct when there are >= 2 non-none values.
In particular, the validation accepts only the first value
OpenAPI Spec File
--> Please focus on the Foo schema at the end
{
"openapi": "3.1.0",
"info": {
"title": "Test Service",
"version": "0.1.0"
},
"paths": {
"/test": {
"post": {
"summary": "Test",
"operationId": "test",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TestModel"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
}
}
}
}
},
"components": {
"schemas": {
"TestModel": {
"properties": {
"foo": {
"$ref": "#/components/schemas/Foo"
}
},
"type": "object",
"required": [
"foo"
],
"title": "TestModel"
},
"Foo": {
"oneOf": [
{
"const": 1
},
{
"const": 2
}
],
"title": "FooType"
}
}
}
}
Desktop (please complete the following information):
- OS: all
- Python Version: all
- openapi-python-client version: the latest code, after #1024
Additional context
The above schema generates the file test-service-client/test_service_client/models/test_model.py as follows:
class TestModel:
def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
d = src_dict.copy()
def _parse_foo(data: object) -> Union[Literal[1], Literal[2]]:
componentsschemas_foo_type_0 = cast(Literal[1], data)
if componentsschemas_foo_type_0 != 1:
raise ValueError(
f"/components/schemas/Foo_type_0 must match const 1, got '{componentsschemas_foo_type_0}'"
)
return componentsschemas_foo_type_0
# -----> ERROR HERE: the code below this line is never reached<------
componentsschemas_foo_type_1 = cast(Literal[2], data)
if componentsschemas_foo_type_1 != 2:
raise ValueError(
f"/components/schemas/Foo_type_1 must match const 2, got '{componentsschemas_foo_type_1}'"
)
return componentsschemas_foo_type_1
foo = _parse_foo(d.pop("foo"))
test_model = cls(
foo=foo,
)
test_model.additional_properties = d
return test_model
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par reproduire le problème avec le document OpenAPI fourni et inspectez la validation de const introduite dans #1024. Suivez la génération de test-service-client/test_service_client/models/test_model.py, en particulier la fonction _parse_foo pour le schéma Foo. La tâche est terminée lorsque la validation prend en compte les deux alternatives de const au lieu de retourner après la première, et qu’un test de régression couvre l’exemple.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- openapi, python
- Domaine
- tooling
- Type d'issue
- Bug
- Difficulté
- 3/5
- Temps estimé
- 1-2 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 35/100