Bibliothek zur Nutzung der MediaWiki-API unter .NET

Für ein kleines Projekt war ich auf der Suche nach einer halbwegs aktuellen Bibliothek zur Nutzung der MediaWiki-API. Wenn man sich auf der entsprechenden Seite in der MediaWiki-Dokumentation umschaut, wird man feststellen das einem nicht all zu viele Bibliotheken zur Verfügung stehen.

Die Auswahl an .NET Bibliotheken fällt eher mager aus

Genutzt habe ich letztendlich die Bibliothek Wiki Client Library, da diese halbwegs aktuell ist und mit meinen MediaWiki-Installationen problemlos zusammenarbeitet. Ein minimales Beispiel zur Bearbeitung einer Wiki-Seite sieht mit der Bibliothek wie folgt aus:

// Init
var client = new WikiClient
{
    ClientUserAgent = "WikiBot"
};

var site = new WikiSite(client, https://wiki.example.com/api.php);

// Login
await site.Initialization;
try
{
    await site.LoginAsync("username", "password");
}
catch (WikiClientException ex)
{
    Console.WriteLine(ex.Message);
}

// Edit site
var page = new WikiPage(site, buildingName);

// Load page
await page.RefreshAsync(PageQueryOptions.FetchContent);

// Update page
page.Content = "new content";
await page.UpdateContentAsync("New page created.", minor: false, bot: true);

// Logout
await site.LogoutAsync();

Über die Nutzung von Generatoren ist es möglich größere Bereiche wie z.B. Kategorien oder Suchergebnisse zu iterieren:

// Iterate all pages
var generator = new AllPagesGenerator(site)
{
    StartTitle = "A",
    NamespaceId = BuiltInNamespaces.Main,
    PaginationSize = 50
};

using (var enumerator = generator.EnumPagesAsync().GetEnumerator())
{
    int index = 0;

    while (await enumerator.MoveNext(CancellationToken.None))
    {
        // Debug output
        var page = enumerator.Current;
        Console.WriteLine("{0}: {1}", index, page);
        index++;

        // Load page
        await page.RefreshAsync(PageQueryOptions.FetchContent);

        // Update page
        page.Content = "new content";
        await page.UpdateContentAsync("Update page.", minor: true, bot: true);
    }
}

Der Quelltext der Wiki Client Library ist auf GitHub zu finden. Lizenziert ist er unter der Apache Licence 2 und damit freie Software.

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.

Domänenspezifische Sprache für Tests von REST-Schnittstellen

Eine domänenspezifische Sprache, kurz DSL, ist eine auf ein bestimmtes Problemfeld abgestimmte Sprache. Mit dem freien REST Assured existiert eine solche Sprache für den effektiven Test von REST-Schnittstellen. Genutzt wird REST Assured hauptsächlich unter Java und Groovy. Eine einfache Überprüfung des Statuscodes einer API-Anfrage würde in REST Assured wie folgt aussehen:

given().get("api.example.com").then().assertThat().statusCode(200);

Daneben sind auch komplexe Tests wie die Auswertung von zurückgegebenen JSON-Strukturen und Daten, sowie die Verknüpfung unterschiedlicher Bedingungen ohne Probleme zu implementieren. Eine große Übersicht über die Möglichkeiten von REST Assured bietet der Usage-Guide des Projektes.

rest-assured.io

Die Projektseite von REST Assured ist unter rest-assured.io zu finden. Der unter der Apache Lizenz (Version 2.0) lizenzierte Quellcode kann auf GitHub gefunden werden.

Heimautomation mittels Home Assistant

Auf dem Markt der Heimautomation gibt es eine Reihe von Standards und viele unterschiedliche Softwarelösungen. Viele dieser Lösungen sind proprietär; einige sind freie Software wie z.B. openHAB oder Calaos. Aus der Kategorie der freien Software sticht Home Assistant hervor. Die in Python 3 geschriebene Software versteht sich als eine umfassende Lösung zur Heimautomation. So wird eine Vielzahl von Standards wie Z-Wave oder das IKEA-Beleuchtungssystemen Tradfri unterstützt.

home-assistant.io

Mittlerweile existieren knapp eintausend Komponenten, welche auf der Webseite des Projektes eingesehen werden können. Diese Komponenten decken eine Vielzahl von Sensoren und Anwendungsmöglichkeiten ab. Dies fängt bei Alarmsensoren an, geht weiter über die Integration von Kalendern, die Steuerungen von Aktoren (wie Thermostaten), die Einbeziehung von Wetter, Luftqualität und anderen Daten und Dingen wie der Steuerung von Media-Playern (z.B. PLEX). Mit jeder neuen Version von Home Assistant finden neue Komponenten ihren Weg in das Projekt.

Die Home Assistant Demo-Seite

Installiert werden kann Home Assistant auf einer Vielzahl von Systemen, von verschiedenen Linux-Distributionen über Windows und macOS. Empfohlen wird allerdings die Installation eines vom Projekt erstellten Raspberry Pi-Images. Dieses hört auf den, für deutsche Ohren gewöhnungsbedürftigen, Titel Hass.io und ist für den Betrieb auf einem Raspberry Pi 3 (Modell B) vorgesehen. In diesem Image sind die Funktionalitäten für den Betrieb von Home Assistant kombiniert. Über eine Weboberfläche kann dieses System konfiguriert werden. So können z.B. SSH- oder Samba-Server aktiviert werden um auf die Konfigurationen von Home Assistant zuzugreifen. Technisch basiert Hass.io auf resinOS und nutzt Docker-Container für die Isolierung der einzelnen Serverkomponenten. Der Quelltext des Home Assistant-Projektes ist auf GitHub zu finden. Lizenziert ist das Projekt unter der Apache-Lizenz in der Version 2.

SD-Karten und USB-Sticks einfach bespielen

Wenn man ein Image auf eine SD-Karte oder einen USB-Stick übertragen möchte, so kann man, je nach verendetem System, die Kommandozeile nutzen um das Image auf den Datenträger zu schreiben. Mit Hilfe des Cross-Plattform-Tools Etcher kann man diese Aufgabe unkomplizierter erledigen. In Etcher muss das Image und der Datenträger definiert werden und schon startet der Prozess. Das Tool wird unter anderem von der Raspberry Pi Foundation empfohlen.

Etcher

Heruntergeladen werden kann Etcher auf der Seite des Projektes unter etcher.io. Es ist für macOS, Linux und Windows verfügbar. Der Quelltext des Werkzeuges ist auf GitHub zu finden. Das Projekt ist unter der Apache 2.0 Licence lizenziert und damit freie Software.