Clients und Server-Stubs mittels Swagger Codegen erzeugen

Mit Swagger gibt es seit einigen Jahren eine Möglichkeit REST-API sinnvoll zu dokumentieren und zu generieren. Aus einer YAML-Datei, welche die Beschreibung der API enthält kann mit dem Swagger Code Generator (kurz Swagger Codegen) eine entsprechende Client-Bibliothek oder ein Server-Stub erzeugt werden. Eine solche minimale YAML-Datei könnte wie folgt aussehen:

swagger: '2.0'
info:
  description: "API"
  version: "2018.04"
  title: "API"
host: "api.example.com"
basePath: "/v1"
schemes: 
- "https"
paths:
  /tree:
    get:
      produces: 
      - "application/json"
      summary: Returns the document tree
      tags:
      - "Document tree"
      description: Lorem Ipsum dolor sit amet
      responses:
        200:
          description: OK

In dieser Datei wird eine Ressource mit dem Namen tree und für diese eine Get-Methode definiert. Um daraus nun die Client-Bibliotheken bzw. Server-Stubs zu generieren muss der Swagger Codegen über Git bezogen, anschließend kompiliert und paketiert werden:

https://github.com/swagger-api/swagger-codegen.git
cd swagger-codegen
mvn clean package

Zur Erzeugung eines PHP-Server-Stubs mit dem Slim-Framework kann der Swagger Codegen anschließend wie folgt genutzt werden:

java -jar modules/swagger-codegen-cli/target/swagger-codegen-cli.jar generate -i api.yaml   -l slim -o folder/slim

Eine Client-Bibliothek wird auf dem gleichen Weg erzeugt:

java -jar modules/swagger-codegen-cli/target/swagger-codegen-cli.jar generate -i api.yaml   -l javascript -o folder/javascript

In diesem Fall wird eine JavaScript-Client-Bibliothek erzeugt. Die verfügbaren Sprachen bzw. Frameworks für die Clients und Server-Stubs erzeugt werden können, können mit dem Befehl:

java -jar modules/swagger-codegen-cli/target/swagger-codegen-cli.jar langs

angezeigt werden. Die Ausgabe spezifiziert alle vorhandenen Generatoren:

Available languages: [ada, ada-server, akka-scala, android, apache2, apex, aspnetcore, bash, csharp, clojure, cwiki, cpprest, csharp-dotnet2, dart, elixir, elm, eiffel, erlang-client, erlang-server, finch, flash, python-flask, go, go-server, groovy, haskell-http-client, haskell, jmeter, jaxrs-cxf-client, jaxrs-cxf, java, inflector, jaxrs-cxf-cdi, jaxrs-spec, jaxrs, msf4j, java-pkmst, java-play-framework, jaxrs-resteasy-eap, jaxrs-resteasy, javascript, javascript-closure-angular, java-vertx, kotlin, lua, lumen, nancyfx, nodejs-server, objc, perl, php, powershell, pistache-server, python, qt5cpp, r, rails5, restbed, ruby, rust, rust-server, scala, scala-gatling, scala-lagom-server, scalatra, scalaz, php-silex, sinatra, slim, spring, dynamic-html, html2, html, swagger, swagger-yaml, swift4, swift3, swift, php-symfony, tizen, typescript-aurelia, typescript-angular, typescript-inversify, typescript-angularjs, typescript-fetch, typescript-jquery, typescript-node, undertow, ze-ph, kotlin-server]

Lizenziert ist der Swagger Codegen unter der Apache Licence in der Version 2 und somit freie Software.

Probleme mit Mono auf Ubuntu-Servern

Wenn man beim Ausführen einer Mono-Applikation auf einem Ubuntu-Server Fehlermeldungen wie diese:

Unhandled Exception: System.TypeLoadException: A type load exception has occurred.
[ERROR] FATAL UNHANDLED EXCEPTION: System.TypeLoadException: A type load exception has occurred.

zu sehen bekommt, so lässt sich dieses Problem meist leicht lösen, indem man die passenden Mono-Bibliotheken durch Installation des Paketes “mono-complete” hinzufügt:

apt-get install mono-complete

Danach sollte die entsprechende Anwendung ohne Probleme starten.

E, EFL, Evas und Edje

Zur Zeit belese ich mich gerade über EVAS und Edje welche Teile der Enlightenment Foundation Libraries (EFL) sind. Das ganze dient dazu, mich in die Lage zu versetzen meine erste graphische Anwendung für das Neo zu schreiben. Doch erst einmal hübsch der Reihe nach. Wovon wird hier überhaupt geredet?

Am besten ist es mit Enlightenment zu beginnen. Bei Enlightenment (meist einfach nur E genannt) handelt es sich um einen Fenstermanager für unixoide Systeme. So ein Fenstermanager macht im Grunde nichts anderes Fenster zu verwalten, was ja irgendwie logisch ist. Konkret bedeutet das, dass der Manager Funktionen wie das Minimieren, Vergrößern, Verschieben und Schließen des Fensters bereitstellt. Dies tut der Manager natürlich nicht nur für ein Fenster sondern für alle Fenster.

Enlightenment wurde 1997 ins Leben gerufen und schlief dann irgendwann mit der Version 0.16 ein. Aber dank Open Source wurde Enlightment aus seinem Dornröschenschlaf geweckt. Die neue Version von Englightment hört auf den Namen E17 und befindet sich zur Zeit in der Entwicklung. Für diese Version wurden auch die Enlightenment Foundation Libraries (EFL) geschrieben. Das Schöne an den Enlightenment Foundation Libraries ist das sie ohne Probleme auf Embedded Geräten wie z.B. PDAs und Smartphones benutzt werden können. Unter anderem auf dem Neo Freerunner :)

Damit man einen Überblick über die Enlightenment Foundation Libraries bekommt sollen hier einige der wichtigsten Teile dieser Bibliotheken vorgestellt werden:

Evas
Bei Evas handelt es sich um eine hardwarebeschleunigte Canvas API, welche sich um die graphische Low Level Arbeit kümmert. Evas definiert dabei eine Gruppe von Evas_Objects wie z.B. Rechtecke, Kreise, Bilder und Gradienten. Für diese Objekte können dann Dinge wie die Farbe, der Transperenzgrad etc. zugewiesen werden. Evas das ganze dann in die Primitive um und zeichnet das ganze. Allerdings habe ich zwei Quellen gefunden die jeweils das gegensätzliche behaupten. Die Enlightment Wiki behauptet das Evas das ganze in X11 Primitive zerlegt und zeichnet während die andere Quelle besagt das Evas diese Objekte in ein Bild zeichnet und dieses Bild letztendlich anzeigt.

Ecore
Bei Ecore handelt es sich wie der Name bereits erraten läßt um die Kernbibliotheken der Enlightenment Foundation Libraries. Diese Bibliotheken enthalten Dinge wie Events, Timer, IPC und Ecore_Evas welches die Erzeugung eines Evas Canvas wrappt und das ganze unter einer einfachen API bereitstellt.

EET
Bei EET handelt es sich um eine Bibliothek zum Speichern von beliebigen Datenchunks in einer Datei. Optional können diese Chunks auch automatisch komprimiert werden. Diese EET Dateien eignen sich am besten für Daten welche oft gelesen aber relativ selten geschrieben werden müssen.

Edje
Edje ist die grafische Design und Layoutbibliothek man könnte das ganze auch Theming Engine nennen, ganz einfach aus dem Grund, das jede Anwendung welche Edje benutzt automatisch für Skins vorbereitet ist. Technisch gesehen liefert Edje (welche auf dem Evas Canvas aufbaut) eine Abstraktionsebene zwischen dem Interface und dem Code, sprich Code und Interface sind sauber voneinander getrennt. Dies erlaubt sehr flexible Layouts und Animationen. Edje kombiniert dabei komplexe Evas Objekte in ein einzelnes Objekt. Dieses Edje_Object kann dabei genauso behandelt werden wie die Evas Primitive.

Ich denke diese vier Bibliotheken sind für den Anfang das wichtigste. Wer mehr Informationen dazu sucht, findet diese unter http://wiki.enlightenment.org/. Vielleicht schreibe ich demnächst mal einen Artikel wie man das ganze in Verbindung mit Python benutzt (sobald ich herausbekommen habe wie es funktioniert).