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 Notebook 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-Framework 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