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

Incorrect `const` property validation

Offen
#1,044 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Vorherrschende Sprache
Python
Sterne
2k
Forks
293
Ø Merge
34 Min.
Gemergte PRs (30 T.)
1

Beschreibung

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

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne damit, das Problem mit dem bereitgestellten OpenAPI-Dokument zu reproduzieren, und untersuche die in #1024 eingeführte const-Validierung. Verfolge die Generierung von test-service-client/test_service_client/models/test_model.py, insbesondere die Funktion _parse_foo für das Foo-Schema. Erledigt ist die Aufgabe, wenn die Validierung beide const-Alternativen berücksichtigt, anstatt nach der ersten zurückzukehren, und ein Regressionstest das Beispiel abdeckt.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
openapi, python
Bereich
tooling
Issue-Typ
Bug
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.