Wily

Das Zen of Python 1 betont in vielfältiger Weise die Komplexitätsreduktion:

Einfach ist besser als komplex.

Komplex ist besser als kompliziert.

Flach ist besser als verschachtelt.

Wily ist ein Kommandozeilenwerkzeug zum Überprüfen der Komplexität von Python-Code in Tests und Anwendungen. Hierfür verwendet Wily folgende Metriken:

McCabe-Metrik

auch zyklomatische Komplexität genannt, misst die Komplexität von Code durch die Anzahl linear unabhängiger Pfade im Kontrollflussgraphen.

Das Software Engineering Institute der Carnegie Mellon University unterscheidet die folgenden vier Risikostufen 2:

Zyklomatische Komplexität

Risikobewertung

1–10

einfaches Programm ohne großes Risiko

11–20

mäßiges Risiko

21–50

komplexes, hochriskantes Programm

> 50

untestbares Programm mit sehr hohem Risiko

Halstead-Metrik

statisch analysierendes Verfahren, das aus der Anzahl der Operatoren und Operanden die Schwierigkeit des Programms, den Aufwand und die Implementierungszeit berechnet.

Wartbarkeitsindex (engl. Maintainability Index)

basiert auf den McCabe- und Halstead-Metriken sowie der Anzahl der Codezeilen 3:

Index

Wartbarkeit

0–25

unwartbar

25–50

besorgniserregend

50–75

verbesserungsbedürftig

75–100

Superhelden-Code

Installation

Wily kann einfach installiert werden mit

$ pipenv install wily

Anschließend könnt ihr die Installation überprüfen mit

$ pipenv run wily --help
Usage: wily [OPTIONS] COMMAND [ARGS]...
  Version: 1.19.0
  🦊 Inspect and search through the complexity of your source code. To get
  started, run setup:
    $ wily setup …

Konfiguration

Im Projektverzeichnis kann eine wily.cfg-Datei angelegt werden mit der Liste der verfügbaren Operatoren:

[wily]
# list of operators, choose from cyclomatic, maintainability, mccabe and raw
operators = cyclomatic,raw
# archiver to use, defaults to git
archiver = git
# path to analyse, defaults to .
path = /path/to/target
# max revisions to archive, defaults to 50
max_revisions = 20

Auch Python code in .ipynb-Dateien wird üblicherweise automatisch erkannt. Ihr könnt dies jedoch ggf. unterbinden für ein Jupyter Notebooks mit

ipynb_support = false

oder für einzelne Zellen mit

ipynb_cells = false

Verwendung

… als Kommandozeilenwerkzeug

  1. Aufbau eines Caches mit den Statistiken des Projekts

    Bemerkung

    Wily geht davon aus, dass euer Projektordner ein Git-Repository ist. Wily erstellt jedoch keinen Cache, wenn das Arbeitsverzeichnis verschmutzt ist.

    $ pipenv run wily build
    
  2. Metrik anzeigen

        $ pipenv run wily report
    
    Dies gibt sowohl die Metrik wie auch das Delta zur vorherigen Revision aus.
    
  3. Rangfolge anzeigen

    $ pipenv run wily rank
    

    Dies zeigt die Rangfolge aller Dateien in einem Verzeichnis oder einer einzelnen Datei an basierend auf der angegebenen Metrik, sofern diese in .wily/ vorhanden ist.

  4. Diagramm anzeigen

    $ pipenv run wily graph
    

    Dies zeigt ein Diagramm im Standard-Browser an.

  5. Informationen zum Build-Verzeichnis anzeigen

    $ pipenv run wily index
    
  6. Auflisten der in den Wily-Operatoren verfügbaren Metriken

    $ pipenv run wily list-metrics
    

… als pre-commit Hook

Ihr könnt Wily auch als pre-commit Hook verwenden. Hierzu müsstet ihr in der pre-commit-config.yaml-Konfigurationsdatei z.B. folgendes hinzufügen:

repos:
-   repo: local
    hooks:
    -   id: wily
        name: wily
        entry: wily diff
        verbose: true
        language: python
        additional_dependencies: [wily]

… in einer CI/CD-Pipeline

Üblicherweise vergelicht Wily die Komplexität mit der vorherigen Revision. Ihr könnt jedoch auch andere Referenzen angeben, z.B. HEAD^1 mit

$ pipenv run wily build src/
$ pipenv run wily diff src/ -r HEAD^1

1

PEP 20 – The Zen of Python

2

C4 Software Technology Reference Guide, S. 147

3

Using Metrics to Evaluate Software Svstem Maintainability