A Python application for tracking, reporting on timing and complexity in Python code

License: Apache-2.0

Language: Python


A command-line application for tracking, reporting on complexity of Python tests and applications.

Wily Build Status codecov Documentation Status PyPI version black

wily [a]:
quick to think of things, having a very good understanding of situations and possibilities, 
and often willing to use tricks to achieve an aim.

Wily uses git to go through each revision (commit) in a branch and run complexity and code-analysis metrics over the code. You can use this to limit your code or report on trends for complexity, length etc.


Wily can be installed via pip from Python 3.6 and above:

 $ pip install wily


See the Documentation Site for full usage guides.

Wily can be used via a command line interface, wily.

 $ wily --help



Here is a demo of wily analysing a Python project, giving a summary of changes to complexity in the last 10 commits and then showing changes against a specific git revision:


Using Wily in a CI/CD pipeline

Wily can be used in a CI/CD workflow to compare the complexity of the current files against a particular revision.

By default wily will compare against the previous revision (for a git-pre-commit hook) but you can also give a Git ref, for example HEAD^1 is the commit before the HEAD reference.

.. code-block:: console

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

Or, to compare against

.. code-block:: shell

$ wily build src/
$ wily diff src/ -r master

pre-commit plugin

You can install wily as a pre-commit plugin by adding the following to .pre-commit-config.yaml

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

Command line usage

wily build

The first step to using wily is to build a wily cache with the statistics of your project.

Usage: build [OPTIONS] [TARGETS]...

  Build the wily cache

  -n, --max-revisions INTEGER  The maximum number of historical commits to
  -o, --operators TEXT         List of operators, separated by commas
  --help                       Show this message and exit.

By default, wily will assume your project folder is a git directory. Wily will not build a cache if the working copy is dirty (has changed files not committed).

 $ wily build src/

Limit the number of revisions (defaults to 50).


wily report

Show a specific metric for a given file, requires that .wily/ exists

wily report will print the metric and the delta between each revision.


wily graph

Similar to wily report but instead of printing in the console, wily will print a graph in a browser.


wily index

Show information about the build directory. Requires that .wily/ exists.

wily index will print the configuration to the screen and list all revisions that have been analysed and the operators used.


wily list-metrics

List the metrics available in the Wily operators. Each one of the metrics can be used in wily graph and wily report

 $ wily list-metrics
mccabe operator:
No metrics available
raw operator:
│                 │ Name                 │ Description   │ Type                     │
│ loc             │ Lines of Code        │ <class 'int'> │ MetricType.Informational │
│ lloc            │ L Lines of Code      │ <class 'int'> │ MetricType.Informational │
│ sloc            │ S Lines of Code      │ <class 'int'> │ MetricType.Informational │
│ comments        │ Multi-line comments  │ <class 'int'> │ MetricType.Informational │
│ multi           │ Multi lines          │ <class 'int'> │ MetricType.Informational │
│ blank           │ blank lines          │ <class 'int'> │ MetricType.Informational │
│ single_comments │ Single comment lines │ <class 'int'> │ MetricType.Informational │
cyclomatic operator:
No metrics available
maintainability operator:
│      │ Name                    │ Description     │ Type                     │
│ rank │ Maintainability Ranking │ <class 'str'>   │ MetricType.Informational │
│ mi   │ Maintainability Index   │ <class 'float'> │ MetricType.AimLow        │


You can put a wily.cfg file in your project directory and wily will override the runtime settings. Here are the available options:

# 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

You can also override the path to the configuration with the --config flag on the command-line.

IPython/Jupyter Notebooks

Wily will detect and scan all Python code in .ipynb files automatically.

You can disable this behaviour if you require by setting ipynb_support = false in the configuration. You can also disable the behaviour of reporting on individual cells by setting ipynb_cells = false.



  • @wcooley (Wil Cooley)
  • @DahlitzFlorian (Florian Dahlitz)
  • @alegonz
  • @DanielChabrowski

"cute animal doing dabbing" Designed by Freepik

Project Statistics

Sourcerank 9
Repository Size 5.72 MB
Stars 468
Forks 20
Watchers 17
Open issues 23
Dependencies 11
Contributors 8
Tags 30
Last updated
Last pushed

Top Contributors See all

Anthony Shaw Florian Dahlitz alegonz Hugo van Kemenade Daniel Chabrowski Daniel Woste Toshio Kuratomi Wil Cooley

Packages Referencing this Repo

Latest release 1.16.0 - Updated - 468 stars

Recent Tags See all

1.16.0 December 12, 2019
1.15.0 December 09, 2019
1.14.1 December 06, 2019
1.14.0 December 06, 2019
1.13.0 December 02, 2019
1.12.4 September 22, 2019
1.12.3 July 22, 2019
1.12.2 March 14, 2019
1.12.1 February 03, 2019
1.12.0 January 25, 2019
1.10.0 December 30, 2018
1.9.0 December 28, 2018
1.8.2 December 21, 2018
1.8.1 December 19, 2018
1.8.0 December 14, 2018

Something wrong with this page? Make a suggestion

Last synced: 2019-12-06 07:58:07 UTC

Login to resync this repository