openapi-generators / openapi-generators/openapi-python-client
Incorrect `const` property validation
Nessuno ha ancora preso questa issue.
- Lingua principale
- Python
- Stelle
- 2k
- Fork
- 293
- Merge medio
- 34m
- PR unite (30g)
- 1
Descrizione
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
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia riproducendo il problema con il documento OpenAPI fornito e analizza la validazione di const introdotta in #1024. Segui la generazione di test-service-client/test_service_client/models/test_model.py, in particolare la funzione _parse_foo per lo schema Foo. Il lavoro è completato quando la validazione considera entrambe le alternative di const invece di restituire il risultato dopo la prima, e un test di regressione copre l'esempio.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- openapi, python
- Ambito
- tooling
- Tipo di issue
- Bug
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 35/100