MCPcopy Index your code
hub / github.com/dlint-py/dlint

github.com/dlint-py/dlint @0.15.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release 0.15.0 ↗ · + Follow
479 symbols 2,200 edges 111 files 58 documented · 12% 1 cross-repo links updated 6mo ago★ 17921 open issues
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

Dlint

CI Coverage Status Python Versions PyPI Version

Dlint is a tool for encouraging best coding practices and helping ensure Python code is secure.

The most important thing I have done as a programmer in recent years is to aggressively pursue static code analysis. Even more valuable than the hundreds of serious bugs I have prevented with it is the change in mindset about the way I view software reliability and code quality.

For a static analysis project to succeed, developers must feel they benefit from and enjoy using it.

For documentation and a list of rules see docs.

Installing

$ python -m pip install dlint

And double check that it was installed correctly:

$ python -m flake8 -h
Usage: flake8 [options] file file ...

...

Installed plugins: dlint: 0.15.0, mccabe: 0.5.3, pycodestyle: 2.2.0, pyflakes: 1.3.0

Note the dlint: 0.15.0.

Using

Dlint builds on flake8 to perform its linting. This provides many useful features without re-inventing the wheel.

CLI

Let's run a simple check:

$ cat << EOF > test.py
print("TEST1")
exec('print("TEST2")')
EOF
$ python test.py
TEST1
TEST2
$ python -m flake8 --select=DUO test.py
test.py:2:1: DUO105 use of "exec" is insecure

The --select=DUO flag tells flake8 to only run Dlint lint rules.

From here, we can easily run Dlint against a directory of Python code:

$ python -m flake8 --select=DUO /path/to/code

To fine-tune your linting, check out the flake8 help:

$ python -m flake8 --help

Inline Editor

Dlint results can also be included inline in your editor for fast feedback. This typically requires an editor plugin or extension. Here are some starting points for common editors:

Integrating

Dlint can easily be integrated into CI pipelines, or anything really.

For more information and examples see 'How can I integrate Dlint into XYZ?'.

Custom Plugins

Dlint's custom plugins are built on a simple naming convention, and rely on Python modules. To make a Dlint custom plugin use the following conventions:

  • The Python module name must start with dlint_plugin_.
  • The linter class name must start with Dlint.
  • The linter class should inherit from dlint.linters.base.BaseLinter.
  • If for some reason you'd like to avoid this, then you must implement the get_results function appropriately and inherit from ast.NodeVisitor.

See an example plugin for further details.

Developing

First, install development packages:

$ python -m pip install -r requirements.txt
$ python -m pip install -r requirements-dev.txt
$ python -m pip install -e .

Testing

$ pytest

Linting

$ flake8

Coverage

$ pytest --cov

Benchmarking

$ pytest -k test_benchmark_run --benchmark-py-file /path/to/file.py tests/test_benchmark/

Or get benchmark results for linters individually:

$ pytest -k test_benchmark_individual --benchmark-py-file /path/to/file.py tests/test_benchmark/

Or run against a single linter:

$ pytest -k test_benchmark_individual[DUO138-BadReCatastrophicUseLinter] --benchmark-py-file /path/to/file.py tests/test_benchmark/

Core symbols most depended-on inside this repo

get_ast_node
called by 199
dlint/test/base.py
visit
called by 192
dlint/multi.py
get_results
called by 183
dlint/linters/base.py
from_module_node
called by 9
dlint/namespace.py
get_results
called by 9
dlint/linters/bad_re_catastrophic_use.py
name_imported
called by 8
dlint/namespace.py
illegal_module_imported
called by 7
dlint/namespace.py
run
called by 4
dlint/extension.py

Shape

Method 316
Class 102
Function 61

Languages

Python100%

Modules by API surface

dlint/redos/detect.py26 symbols
tests/test_helpers/test_bad_module_attribute_use.py25 symbols
tests/test_helpers/test_bad_module_use.py24 symbols
dlint/tree.py23 symbols
tests/test_helpers/test_bad_kwarg_use.py22 symbols
tests/test_twisted/test_inlinecallbacks_yield_statement.py19 symbols
tests/test_helpers/test_bad_name_attribute_use.py18 symbols
tests/test_twisted/test_returnvalue_in_inlinecallbacks.py15 symbols
tests/test_twisted/test_yield_return_statement.py14 symbols
tests/test_extension.py10 symbols
tests/test_bad_re_catastrophic_use.py9 symbols
tests/test_namespace.py8 symbols

Used by 1 indexed graphs manifest dependencies, hub-wide

For agents

$ claude mcp add dlint \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact