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

Related tags

Code review toolwily
Overview

wily

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.

Installation

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

 $ pip install wily

Usage

See the Documentation Site for full usage guides.

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

 $ wily --help

help-screen

Demo

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:

demo

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.

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

Or, to compare against

 $ 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

repos:
-   repo: local
    hooks:
    -   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: __main__.py build [OPTIONS] [TARGETS]...

  Build the wily cache

Options:
  -n, --max-revisions INTEGER  The maximum number of historical commits to
                               archive
  -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-build

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-report

wily rank

Show the ranking for all files in a directory or a single file based on the metric provided, requires that .wily/ exists

wily rank will print a table of files and their metric values.

wily-rank

wily graph

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

wily-graph

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-graph

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        │
╘══════╧═════════════════════════╧═════════════════╧══════════════════════════╛

Configuration

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

[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

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.

Credits

Contributors

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

"cute animal doing dabbing" Designed by Freepik

Comments
  • Wily fails to build cache

    Wily fails to build cache

    • Python 3.6.6 on Ubuntu as a WSL on Windows 10
    • wily==1.8.0 (btw would be nice to see version number when using "wily" or "wily help"
    • fairly big project
    • after like 10-15 minutes I receive the following output
    Found 50 revisions from 'git' archiver in '/mnt/d/Projects/bliss_deployment/work/zope/checkout/bliss.git'.
    Running operators - raw,cyclomatic,maintainability
    
    
    Failed to build cache: ''
    multiprocessing.pool.RemoteTraceback:
    """
    Traceback (most recent call last):
      File "/usr/lib/python3.6/multiprocessing/pool.py", line 119, in worker
        result = (True, func(*args, **kwds))
      File "/usr/lib/python3.6/multiprocessing/pool.py", line 47, in starmapstar
        return list(itertools.starmap(args[0], args[1]))
      File "/mnt/d/Projects/envs/wily/lib/python3.6/site-packages/wily/commands/build.py", line 24, in run_operator
        return operator.name, instance.run(revision, config)
      File "/mnt/d/Projects/envs/wily/lib/python3.6/site-packages/wily/operators/cyclomatic.py", line 81, in run
        raise TypeError
    TypeError
    """
    
    The above exception was the direct cause of the following exception:
    
    Traceback (most recent call last):
      File "/mnt/d/Projects/envs/wily/bin/wily", line 11, in <module>
        sys.exit(cli())
      File "/mnt/d/Projects/envs/wily/lib/python3.6/site-packages/click/core.py", line 764, in __call__
        return self.main(*args, **kwargs)
      File "/mnt/d/Projects/envs/wily/lib/python3.6/site-packages/click/core.py", line 717, in main
        rv = self.invoke(ctx)
      File "/mnt/d/Projects/envs/wily/lib/python3.6/site-packages/click/core.py", line 1137, in invoke
        return _process_result(sub_ctx.command.invoke(sub_ctx))
      File "/mnt/d/Projects/envs/wily/lib/python3.6/site-packages/click/core.py", line 956, in invoke
        return ctx.invoke(self.callback, **ctx.params)
      File "/mnt/d/Projects/envs/wily/lib/python3.6/site-packages/click/core.py", line 555, in invoke
        return callback(*args, **kwargs)
      File "/mnt/d/Projects/envs/wily/lib/python3.6/site-packages/click/decorators.py", line 17, in new_func
        return f(get_current_context(), *args, **kwargs)
      File "/mnt/d/Projects/envs/wily/lib/python3.6/site-packages/wily/__main__.py", line 123, in build
        operators=resolve_operators(config.operators),
      File "/mnt/d/Projects/envs/wily/lib/python3.6/site-packages/wily/commands/build.py", line 125, in build
        raise e
      File "/mnt/d/Projects/envs/wily/lib/python3.6/site-packages/wily/commands/build.py", line 84, in build
        [(operator, revision, config) for operator in operators],
      File "/usr/lib/python3.6/multiprocessing/pool.py", line 296, in starmap
        return self._map_async(func, iterable, starmapstar, chunksize).get()
      File "/usr/lib/python3.6/multiprocessing/pool.py", line 670, in get
        raise self._value
    TypeError```
    bug awaiting-feedback 
    opened by jugmac00 18
  • implementation of rank command

    implementation of rank command

    The rank command utilized the report command as the initial template.

    There are some outstanding items that could use some improvement or are lacking at the moment:

    1. informational metrics are not considered at the moment
    2. sub-folders within a path are ignored
    3. the referencing of the revision number feels a little too brittle/sensitive
    4. the click / CLI aspect of the command still needs to be implemented
    opened by jwattier 12
  • refactor: improve CI and local development

    refactor: improve CI and local development

    This PR is quite big and changes several things:

    • fix main deps declaration https://github.com/tonybaloney/wily/commit/52c86c5083addcb71371cdc6efc901ecf5711326
    • declare dev and test deps in pyproject.toml using flit extras
    • add dev/test tools configuration to proper config files
    • add linting and testing stages to Makefile
    • removes tox support (flit and Makefile should be used for local development)
    • merges main and lint_python workflows

    Things to do (but probably in separate PRs):

    • [x] add better coverage configuration - @skarzi
    • [x] investigate why tests fail and fix them
    • [x] add .editorconfig and clean whitespaces in the codebase - check #158
    • [ ] update .gitignore (e.g. with wily_report and foo)
    • [ ] move codecov token to secrets - @tonybaloney
    • [x] set proper black configuration, apply it on the codebase and require it in Makefile
    • [x] set proper isort configuration, apply it on the codebase and require it in Makefile
    • [ ] resolve flake8 issues and clean ignore in its config and set its proper configuration
    • [ ] set proper codespell configuration, apply it on the codebase and require it in Makefile
    • [ ] set proper mypy configuration, resolve its issues and require it in Makefile
    • [ ] add some useful pytest plugins, like pytest-timeout or pytest-randomly
    opened by skarzi 8
  • Wily fails when enabled on GitHub workflow

    Wily fails when enabled on GitHub workflow

    Describe the bug I have added a specific job to my Github Workflow without installing wily locally and Wily fails with a git error:

    Failed to setup archiver: '<class 'git.exc.GitCommandError'> - Cmd('git') failed due to: exit code(128)
      cmdline: git diff --numstat 4b2122317b4775a75d30403fc158ea89bac3d204 ce16aee57f19e7e948a4794779d5aa5135b64e8f --
      stderr: 'fatal: bad object 4b2122317b4775a75d30403fc158ea89bac3d204''
    
    

    To Reproduce Add a job to a Github pipeline to your code like so:

      evaluate-complexity:
        name: Evaluate code complexity
        runs-on: ubuntu-latest
        steps:
        - name: Checkout repository
          uses: actions/[email protected]
        - name: Set up Python
          uses: actions/[email protected]
          with:
            python-version: 3.10.0
        - name: Install Wily and compile cache
          run: |
                pip install wily
                wily build my_proj
        - name: Compute code complexity diff with main
          run: "wily diff my_proj/ -r main"
          id: run_wily
    

    Expected behavior Build would succeed

    Additional context It's interesting that the git diff command copy-pasted on my machine works correctly

    opened by edmondop 8
  • [WIP] Allow setting threshold for diff in order to use via CI

    [WIP] Allow setting threshold for diff in order to use via CI

    Setting exit status via predefined threshold will allow using wily via CI. Relating to issue #66.

    Changes

    • Added ability to pass thresholds to diff command per operator

    Usage:

    $ wily diff [FILES] --thresholds halstead.h1=1,raw.loc=50
    

    TODO

    • [x] Check for metric type when determining if threshold was passed or not
    • [ ] Handle diffs for scenarios where files/modules were renamed, resulting in - as the base value
    • [x] Add ability to pass threshold via config file
    • [ ] Add more tests
    • [ ] Have a nicer output for errors
    • [ ] Add logging
    opened by liiight 8
  • TypeError: unsupported operand type(s) for +: 'int' and 'dict'

    TypeError: unsupported operand type(s) for +: 'int' and 'dict'

    I attempted to run wily build nengo/ on the master branch of https://github.com/nengo/nengo and I get the following error:

    ~/C/nengo (nengo) wily build nengo/                                           (master) 
    Found 50 revisions from 'git' archiver in '/home/tbekolay/Code/nengo'.
    Running operators - maintainability,halstead,cyclomatic,raw
    Processing |                                | 1/200Failed to build cache: 'unsupported operand type(s) for +: 'int' and 'dict''
    Traceback (most recent call last):
      File "/home/tbekolay/.virtualenvs/nengo/bin/wily", line 10, in <module>
        sys.exit(cli())
      File "/home/tbekolay/.virtualenvs/nengo/lib/python3.7/site-packages/click/core.py", line 764, in __call__
        return self.main(*args, **kwargs)
      File "/home/tbekolay/.virtualenvs/nengo/lib/python3.7/site-packages/click/core.py", line 717, in main
        rv = self.invoke(ctx)
      File "/home/tbekolay/.virtualenvs/nengo/lib/python3.7/site-packages/click/core.py", line 1137, in invoke
        return _process_result(sub_ctx.command.invoke(sub_ctx))
      File "/home/tbekolay/.virtualenvs/nengo/lib/python3.7/site-packages/click/core.py", line 956, in invoke
        return ctx.invoke(self.callback, **ctx.params)
      File "/home/tbekolay/.virtualenvs/nengo/lib/python3.7/site-packages/click/core.py", line 555, in invoke
        return callback(*args, **kwargs)
      File "/home/tbekolay/.virtualenvs/nengo/lib/python3.7/site-packages/click/decorators.py", line 17, in new_func
        return f(get_current_context(), *args, **kwargs)
      File "/home/tbekolay/.virtualenvs/nengo/lib/python3.7/site-packages/wily/__main__.py", line 132, in build
        operators=resolve_operators(config.operators),
      File "/home/tbekolay/.virtualenvs/nengo/lib/python3.7/site-packages/wily/commands/build.py", line 127, in build
        raise e
      File "/home/tbekolay/.virtualenvs/nengo/lib/python3.7/site-packages/wily/commands/build.py", line 116, in build
        result[str(root)][metric.name] = func(values)
    TypeError: unsupported operand type(s) for +: 'int' and 'dict'
    

    This is a little puzzling since the line that it's pointing to doesn't contain an addition statement, as far as I can tell.

    This was run in a Python 3.7 virtual environment with wily version 1.12.2. Let me know if I can provide any more information to help with debugging.

    bug 
    opened by tbekolay 6
  • Consider adding Python 3.5 support

    Consider adding Python 3.5 support

    This project uses black, but that's not a requirement to execute it. It also uses f-strings, but those could be replaced with str.format easily

    Please 👍 if you want to see this back-ported to 3.5

    enhancement wontfix 
    opened by tonybaloney 6
  • Patch aggregate statistics

    Patch aggregate statistics

    I discovered that the aggregated statistics were not properly computed.

    In particular in case of file movements, file deletions and deeply nested directories.

    This PR should resolve the issue. Please validate if this does not break other functionality (as I am relatively new to the code base.)

    opened by ThomasTNO 5
  • add possibility to load `cache_path` option from `wily.cfg`

    add possibility to load `cache_path` option from `wily.cfg`

    Hello,

    first of all, thanks for developing wily!

    Is your feature request related to a problem? Please describe.

    Adding cache_path option to wily.cfg will make using custom cache path much, much easier, because developers won't be force to add --cache CLI option in every command call.

    Describe the solution you'd like

    Add cache_path to wily.cfg.

    opened by skarzi 4
  • Fix Maintainability Index color on diff command

    Fix Maintainability Index color on diff command

    Maintainability Index scale from 0 to 100 where the lower the value, the worst the Maintainability Index. The diff command set red colors for increasing values of all metrics, but an increasing Maintainability Index index is actually good.

    Signed-off-by: Willian Rampazzo [email protected]

    opened by willianrampazzo 4
  • Failed to run CC harvester: invalid character in identifier

    Failed to run CC harvester: invalid character in identifier

    wily version 1.12.1, installed via pip in a clean venv with python 3.6.7 on ubuntu.

    I am trying to run wily build on a project of mine. Unfortunately I cannot make it work. It finds an "invalid character" but there is none. See screenshot of relevant code piece below. Even deleting the file from the repo does not help because of course it is still in the git history (and I am not going to soft-reset through 30 commits to get wily to work).

    Even if there were an invalid character, couldn't there be a way to more gracefully handle this and simply exclude that file from the index/reporting?

    Key error: Failed to run CC harvester on dashtry.py : invalid character in identifier (<unknown>, line 29) Following stack:

    multiprocessing.pool.RemoteTraceback: 
    """
    Traceback (most recent call last):
      File "/usr/lib/python3.6/multiprocessing/pool.py", line 119, in worker
        result = (True, func(*args, **kwds))
      File "/usr/lib/python3.6/multiprocessing/pool.py", line 47, in starmapstar
        return list(itertools.starmap(args[0], args[1]))
      File "/Data/Code/projects/finance_data/.venv/lib/python3.6/site-packages/wily/commands/build.py", line 24, in run_operator
        return operator.name, instance.run(revision, config)
      File "/Data/Code/projects/finance_data/.venv/lib/python3.6/site-packages/wily/operators/halstead.py", line 81, in run
        results[filename] = self._report_to_dict(instance)
      File "/Data/Code/projects/finance_data/.venv/lib/python3.6/site-packages/wily/operators/halstead.py", line 86, in _report_to_dict
        "h1": report.h1,
    AttributeError: 'str' object has no attribute 'h1'
    """
    

    image

    Running wily subsequently on a subdirectory leads to this, so apparently wily leaves "corrupted" files behind when exiting in the above fashion:

    image

    output of pip freeze: attrs==19.1.0 certifi==2019.3.9 chardet==3.0.4 Click==7.0 colorama==0.4.1 colorlog==4.0.2 dataclasses==0.6 decorator==4.3.2 entrypoints==0.3 flake8==3.7.7 flake8-polyfill==1.0.2 gitdb2==2.0.5 GitPython==2.1.11 idna==2.8 ipython-genutils==0.2.0 jsonschema==3.0.1 jupyter-core==4.4.0 mando==0.6.4 mccabe==0.6.1 nbformat==4.4.0 pkg-resources==0.0.0 plotly==3.7.0 progress==1.5 pycodestyle==2.5.0 pyflakes==2.1.1 pyrsistent==0.14.11 pytz==2018.9 radon==3.0.1 requests==2.21.0 retrying==1.3.3 six==1.12.0 smmap2==2.0.5 tabulate==0.8.3 traitlets==4.3.2 urllib3==1.24.1 wily==1.12.1

    bug 
    opened by mprostock 4
  • `wily build` alway return `No data collected` for all operators

    `wily build` alway return `No data collected` for all operators

    Regardless of where the build command is executed (whether it is filesystem for a git folder). It is always says No data collected. I have tested it on host and also from inside the container. But the result is the same. I have the analysis of module level. But I don't have the analysis for function level inside the module.

    wily index is OK there no problem in output of it: image

    opened by azamifard 1
  • Return results for diff and rank methods

    Return results for diff and rank methods

    Is your feature request related to a problem? Please describe. Our use case assumes using wily in the unit tests to validate different metrics thresholds. It is not the best practice to parse cli string to get the metrics, instead, it would be very useful to work with python packages, but without accessing output results in the objects for diff and rank methods it's impossible

    Describe the solution you'd like If we add return results to the diff method and return data to the rank method, we can work with wily in unit tests and operate output in better way

    Describe alternatives you've considered Parsing cli

    opened by Ayatafoy 0
  • class complexity behaviour

    class complexity behaviour

    While using Wily, I noted that a class with an explicit constructor and a single method has a complexity of three or four. This is the same whatever change I make to the class or its method. I would like to know if this is expected behavior. @tonybaloney

    opened by Sreerag-ibtl 0
  • report metrics by function, method or class

    report metrics by function, method or class

    Is your feature request related to a problem? Please describe. I would like to identify specific candidates for refactoring. wily rank reports metrics by file which is too coarse grained for this

    Describe the solution you'd like something like wily rank --functions ./src which woul return a ranke list of functions rather than files

    Describe alternatives you've considered Radon reports cyclomatic complexity (only) by function but bins the scores into letter grades. I would like to get the actual score so I can view say the top 20 functions in a package

    opened by mhlr 0
  • Alternative Complexity Measures

    Alternative Complexity Measures

    Is your feature request related to a problem? Please describe. There are other Complexity metrics not included in this repo, that can be included.

    Additional context

    • Koopman Spaghetti Factor https://github.com/ElectronVector/ravioli
    • "Churn" (variable changes) https://github.com/simonrenoult/code-complexity
    • Cognitive Complexity https://pypi.org/project/cognitive-complexity/
    • Indentation Complexity https://github.com/thoughtbot/complexity

    https://github.com/priv-kweihmann/multimetric

    • Difficulty according to Halstead
    • Effort according to Halstead
    • Fan-Out
    • Maintainability index
    • Metric according to pylint
    • Metric according to TIOBE
    • Number of delivered bugs according to Halstead
    • Time required to program according to Halstead
    • Volume according to Halstead

    With https://github.com/mxmssh/IDAmetrics

    • Basic blocks count (function/module)
    • Functions count (module)
    • Conditions count (function/module)
    • Assignments count (function/module)
    • Jilb's metric (function/module)
    • ABC metric (function/module)
    • Pivovarsky metric (function/module)
    • Harrison metric (function/module)
    • Boundary value metric (function/module)
    • Span metric (function/module)
    • Global variables access count (function/module)
    • Oviedo metric (function/module)
    • Chepin metric (function/module)
    • Card & Glass metric (function/module)
    • Henry & Cafura metric (function/module)
    • Cocol metric (function/module)
    opened by BrandonKMLee 2
Releases(1.24.0)
  • 1.24.0(Oct 20, 2022)

    What's Changed

    • refactor: apply black on wily codebase by @skarzi in https://github.com/tonybaloney/wily/pull/162
    • refactor: apply isort on wily codebase by @skarzi in https://github.com/tonybaloney/wily/pull/163
    • Adds Code of Conduct by @kjaymiller in https://github.com/tonybaloney/wily/pull/166
    • Upgrade plotly from 4.x to 5.x by @anderso in https://github.com/tonybaloney/wily/pull/167

    New Contributors

    • @kjaymiller made their first contribution in https://github.com/tonybaloney/wily/pull/166
    • @anderso made their first contribution in https://github.com/tonybaloney/wily/pull/167

    Full Changelog: https://github.com/tonybaloney/wily/compare/1.23.0...1.24.0

    Source code(tar.gz)
    Source code(zip)
  • 1.23.0(Aug 21, 2022)

    What's Changed

    • pyproject.toml: Remove dependency mock by @cclauss in https://github.com/tonybaloney/wily/pull/156
    • feat: add .editorconfig by @skarzi in https://github.com/tonybaloney/wily/pull/158
    • refactor: improve CI and local development by @skarzi in https://github.com/tonybaloney/wily/pull/157
    • Graph deleted files by @ThomasTNO in https://github.com/tonybaloney/wily/pull/140

    Full Changelog: https://github.com/tonybaloney/wily/compare/1.22.0...1.23.0

    Source code(tar.gz)
    Source code(zip)
  • 1.22.0(Jul 15, 2022)

    What's Changed

    • add cache_path option to wily.cfg by @skarzi in https://github.com/tonybaloney/wily/pull/123
    • Create .pre-commit-hooks.yaml by @ricoms in https://github.com/tonybaloney/wily/pull/128
    • Bump nbformat to 5.1.3 by @willfrey in https://github.com/tonybaloney/wily/pull/131
    • add python3.9 to workflow matrices by @skarzi in https://github.com/tonybaloney/wily/pull/124
    • Fix coloring by @tonybaloney in https://github.com/tonybaloney/wily/pull/132
    • Add rank to docs. by @tonybaloney in https://github.com/tonybaloney/wily/pull/133
    • Sort the metrics in report by @tonybaloney in https://github.com/tonybaloney/wily/pull/134
    • Adds support for aggregated graphs + patch title by @ThomasTNO in https://github.com/tonybaloney/wily/pull/138
    • docs: Adds a description on how to use Wily on a Github action by @edmondo1984 in https://github.com/tonybaloney/wily/pull/143
    • Patch aggregate statistics by @ThomasTNO in https://github.com/tonybaloney/wily/pull/139
    • Add conda-forge shield and mention conda installation procedure by @Zeitsperre in https://github.com/tonybaloney/wily/pull/147
    • Update pyproject.toml by @tonybaloney in https://github.com/tonybaloney/wily/pull/145
    • fix tests by @tonybaloney in https://github.com/tonybaloney/wily/pull/148
    • Upgrade GitHub Actions by @cclauss in https://github.com/tonybaloney/wily/pull/150
    • Fix typo by @cclauss in https://github.com/tonybaloney/wily/pull/151
    • GitHub Action to lint Python code by @cclauss in https://github.com/tonybaloney/wily/pull/152
    • pyupgrade --py37-plus by @cclauss in https://github.com/tonybaloney/wily/pull/153
    • Add 3.11 to test matrix by @tonybaloney in https://github.com/tonybaloney/wily/pull/155

    New Contributors

    • @ricoms made their first contribution in https://github.com/tonybaloney/wily/pull/128
    • @willfrey made their first contribution in https://github.com/tonybaloney/wily/pull/131
    • @ThomasTNO made their first contribution in https://github.com/tonybaloney/wily/pull/138
    • @edmondo1984 made their first contribution in https://github.com/tonybaloney/wily/pull/143
    • @Zeitsperre made their first contribution in https://github.com/tonybaloney/wily/pull/147
    • @cclauss made their first contribution in https://github.com/tonybaloney/wily/pull/150

    Full Changelog: https://github.com/tonybaloney/wily/compare/1.19.0...1.22.0

    Source code(tar.gz)
    Source code(zip)
Owner
Anthony Shaw
Python Advocate at Microsoft. Python Software Foundation Fellow.
Anthony Shaw
An extensible and friendly code review tool for projects and companies of all sizes.

Review Board Review Board is an open source, web-based code and document review tool built to help companies, open source projects, and other organiza

Review Board 1.5k Jan 02, 2023
Code Review, hosted on Google App Engine

Welcome to Rietveld GitHub Wiki: https://github.com/rietveld-codereview/rietveld/wiki Google Group: http://groups.google.com/group/codereview-discuss

531 Dec 24, 2022
Monitoring tool based on radon

xenon Xenon is a monitoring tool based on Radon. It monitors your code's complexity. Ideally, Xenon is run every time you commit code. Through command

Michele Lacchia 218 Dec 05, 2022
A tool for measuring Python class cohesion.

Cohesion Cohesion is a tool for measuring Python class cohesion. In computer programming, cohesion refers to the degree to which the elements of a mod

177 Jan 04, 2023
McCabe complexity checker for Python

McCabe complexity checker Ned's script to check McCabe complexity. This module provides a plugin for flake8, the Python code checker. Installation You

Python Code Quality Authority 527 Dec 21, 2022
Various code metrics for Python code

Radon Radon is a Python tool that computes various metrics from the source code. Radon can compute: McCabe's complexity, i.e. cyclomatic complexity ra

Michele Lacchia 1.4k Jan 07, 2023
Inspects Python source files and provides information about type and location of classes, methods etc

prospector About Prospector is a tool to analyse Python code and output information about errors, potential problems, convention violations and comple

Python Code Quality Authority 1.7k Dec 31, 2022
Read-only mirror of https://gitlab.gnome.org/GNOME/meld

About Meld Meld is a visual diff and merge tool targeted at developers. Meld helps you compare files, directories, and version controlled projects. It

GNOME Github Mirror 847 Jan 05, 2023
A Python application for tracking, reporting on timing and complexity in Python code

A command-line application for tracking, reporting on complexity of Python tests and applications. wily [a]: quick to think of things, having a very g

Anthony Shaw 1k Dec 29, 2022