Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(semi) automatisch valideren, resolveer en code genereren #41

Open
fsamwel opened this issue Jun 3, 2020 · 5 comments
Open

(semi) automatisch valideren, resolveer en code genereren #41

fsamwel opened this issue Jun 3, 2020 · 5 comments
Assignees
Labels
enhancement New feature or request

Comments

@fsamwel
Copy link
Collaborator

fsamwel commented Jun 3, 2020

Wanneer er wijzigingen worden gedaan aan de yaml voor een API, moeten we nu handmatig (in Swagger o.i.d.) deze yaml valideren en een resolved versie maken.
Dit is extra werk en bovendien zien we dat vaak wijzigingen alleen worden doorgevoerd op de beheer-yaml en er pas na een aantal (grotere) wijzigingen een nieuwe resolved versie wordt gemaakt.

Via één opdracht (al dan niet in een script of batch bestand) kun je het valideren en resolven automatiseren. Bijvoorbeeld met https://www.npmjs.com/package/swagger-cli.

Het is bovendien mogelijk dit te koppelen aan een pre-commit hook, zodat bij een commit automatisch wordt gecheckt of de te committee yaml wel valide is.

Hiernaast is het voor gebruikers erg handig wanneer er al SDK's beschikbaar zijn. Dan hoeven ze zelf de code niet te genereren. Ik denk dat developers veel blijer worden van een SDK dan van een yaml specificatie.
SDK's genereren kan ook geautomatiseerd, met bijvoorbeeld https://github.com/swagger-api/swagger-codegen

@fsamwel fsamwel added the enhancement New feature or request label Jun 3, 2020
@fsamwel
Copy link
Collaborator Author

fsamwel commented Jun 8, 2020

Om dit te doen moet je eerst lokaal swagger-cli en swagger-codegen installeren.

Vervolgens kan je in een repository een script (.bat voor Windows, .command voor Mac, .sh voor Linux) zetten in de map "code".

Voor Mac en Linux ziet dat er bijvoorbeeld (voor BRK) zo uit:
#!/bin/bash

base_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P )
cd "$base_path"

#!/bin/bash

base_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P )
cd "$base_path"

if swagger-cli validate ../specificatie/BRK-Bevragen/openapi.yaml | tee /dev/stderr | grep -q "is valid"; then
  swagger-cli bundle -o ../specificatie/BRK-Bevragen/genereervariant/openapi.yaml -t yaml ../specificatie/BRK-Bevragen/openapi.yaml
  swagger-cli bundle -o ../specificatie/BRK-Bevragen/genereervariant/openapi.json -t json ../specificatie/BRK-Bevragen/openapi.yaml

  rm -R java
  mkdir java
  swagger-codegen generate -i ../specificatie/BRK-Bevragen/openapi.yaml -l java -o java

  rm -R csharp-dotnet2
  mkdir csharp-dotnet2
  swagger-codegen generate -i ../specificatie/BRK-Bevragen/openapi.yaml -l csharp-dotnet2 -o csharp-dotnet2

  rm -R python
  mkdir python
  swagger-codegen generate -i ../specificatie/BRK-Bevragen/openapi.yaml -l python -o python
fi

In bovenstaand script wordt:

  1. de API specificatie gevalideerd. Volgende stappen worden alleen gedaan wanneer de specs valide zijn
  2. een resolved (genereer) versie gemaakt in yaml en json
  3. voor elke gewenste taal de client code gegenereerd (hier als voorbeelden C#, Java en Python, maar is makkelijk uit te breiden).

Het valt me wel op dat de resolved versie afwijkt van hoe het nu resolved is, bijvoorbeeld door ander gebruik van aanhalingstekens. Ook is de manier van opnemen extern gedefinieerde componenten heel anders.
@MelvLee zou jij eens willen kijken naar de resolved/genereerversie van de yaml of die bruikbaar is in deze vorm?
openapi.yaml.zip
En of de gegenereerde code goed is (die is niet gemaakt op basis van de resolved versie, maar op basis van de beheersversie met externe links)?
csharp-dotnet2.zip

@fsamwel
Copy link
Collaborator Author

fsamwel commented Jun 8, 2020

we hebben trouwens ook op sommige plekken Postman collecties opgenomen in de repository, zoals in BRK. Maar die is niet bijgehouden. Dus bijvoorbeeld nu in versie 1.0.0 komt de Postman collectie niet overeen met de OAS3 specificatie.

Dus ook daarvoor moeten we een geautomatiseerde oplossing vinden, of een stuk strakkere procedure om ook dit synchroon te houden, of (wanneer we denken dit niet te kunnen) het gewoon verwijderen?
Wellicht via https://www.npmjs.com/package/openapi-to-postmanv2?

@fsamwel
Copy link
Collaborator Author

fsamwel commented Jun 8, 2020

automatisch genereren postman collectie kan door het aan bovenstaand script toevoegen van bijvoorbeeld:

openapi2postmanv2 -s ../specificatie/BRK-Bevragen/openapi.yaml -o ../docs/BRK-Bevragen-postman-collection.json

@MelvLee
Copy link
Collaborator

MelvLee commented Jun 9, 2020

De door swagger-cli gebundelde openapi.yaml kan niet worden gebruikt in nswagstudio. Dit komt door gegenereerde $ref-s die er als volgt uit zien:

#/paths/~1kadastraalonroerendezaken/get/parameters/0

@fsamwel
Copy link
Collaborator Author

fsamwel commented Jun 9, 2020

Ik heb de oplossing gevonden. Resolven kan blijkbaar ook met swagger-codegen:

  #genereer resolved yaml: 
  swagger-codegen generate -i ../specificatie/BRK-Bevragen/openapi.yaml -l openapi-yaml -o ../specificatie/BRK-Bevragen/genereervariant
  #genereer resolved json:
  swagger-codegen generate -i ../specificatie/BRK-Bevragen/openapi.yaml -l openapi -o ../specificatie/BRK-Bevragen/genereervariant
  #verwijder door codegen toegevoegde dingen die niet nodig zijn:
  rm -R ../specificatie/BRK-Bevragen/genereervariant/.swagger-codegen
  rm ../specificatie/BRK-Bevragen/genereervariant/.swagger-codegen-ignore
  rm ../specificatie/BRK-Bevragen/genereervariant/README.md

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

3 participants