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
Siehe auch
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#
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
Metrik anzeigen
$ pipenv run wily report Dies gibt sowohl die Metrik wie auch das Delta zur vorherigen Revision aus.
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.Diagramm anzeigen
$ pipenv run wily graph
Dies zeigt ein Diagramm im Standard-Browser an.
Informationen zum Build-Verzeichnis anzeigen
$ pipenv run wily index
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