Skip to main content

Ondivi (Only diff violations)

wemake-python-styleguide PyPI version CI status Lines of code Hits-of-Code

Tired of 10,000 lint errors blocking your team from adopting code quality tools? Ondivi lets you enforce coding standards ONLY on new changes, making linter adoption possible in any legacy project.

This tool works with any linter or static code analyzer, including but not limited to:

Adopting Linters in Legacy Code

The Problem:

  • Your 200K LOC project has 5,000+ lint violations
  • Enforcing linters would block all development
  • Technical debt keeps accumulating

The Solution with Ondivi:

  1. Run your linter as usual: flake8 .
  2. Pipe to ondivi: flake8 . | ondivi --baseline=main
  3. CI fails ONLY if new changes introduce violations
  4. Old violations are ignored (for now)

Result: Clean new code, legacy gradually refactored.

Prerequisites:

Installation

pip install ondivi

Usage

Ensure you are in the root directory of your Git repository.

Run the script:

flake8 script.py | ondivi
# with ruff:
ruff check file.py --output-format=concise | ondivi

or:

flake8 script.py > violations.txt
ondivi --fromfile=violations.txt
$ ondivi --help
Usage: ondivi [OPTIONS]

  Ondivi (Only diff violations).

  Python script filtering coding violations, identified by static analysis,
  only for changed lines in a Git repo. Usage example:

  flake8 script.py | ondivi

Options:
  --baseline TEXT    Commit or branch which will contain legacy code. Program
                     filter out violations on baseline (default: "master")
  --fromfile TEXT    Path to file with violations. Expected "utf-8" encoding
  --format TEXT      Template for parsing linter messages. The template should
                     include the following named parts:

                     {filename}   The name of the file with the error/warning
                     {line_num}   The line number with the error/warning
                     (integer)

                     Example usage:

                     --format "{filename}:{line_num:d}{other}"

                     In this example, the linter message

                     "src/app_types/listable.py:23:1: UP035 Import from
                     collections.abc instead: Sequence"

                     will be recognized and parsed into the following
                     components:

                      - filename: "src/app_types/listable.py"
                      - line_num: 23
                      - other: :1: "UP035 Import from collections.abc instead:
                      Sequence"

                     Ensure that the template matches the format of the
                     messages generated by your linter.
                     (default: "{filename}:{line_num:d}{other}")
  --only-violations  Show only violations
  --help             Show this message and exit.

How it works

The script parses the Git diff output to identify the changed lines in each file.

It then filters the given coding violations to include only those violations that correspond to the changed lines.

flakeheaven and flakehell are not supported because they rely on internal flake8 API, which can lead to compatibility issues as flake8 evolves. In contrast, ondivi uses only the text output of violations and the state of Git repository, making it more robust and easier to maintain.

Flake8 on file:

$ flake8 file.py
file.py:3:1: E302 expected 2 blank lines, found 1
file.py:9:1: E302 expected 2 blank lines, found 1
file.py:10:121: E501 line too long (123 > 120 characters)
file.py:14:1: E305 expected 2 blank lines after class or function definition, found 1

Example of changes:

 from dataclasses import dataclass

 @dataclass
 class User(object):

     name: str
     age: int

 def greet(user: User):
     print('Long string in initial commit ################################################################################')
     print(f'Hello, {user.name}!')
+    print('Long string in new commit ################################################################################')

 if __name__ == '__main__':
     greet(User(345, 23))
+    greet(User('Bob', '23'))

By git diff we see, that two new lines were appended (12 and 16):

Ondivi filters out violations and shows only one for line 12:

$ flake8 script.py | ondivi
file.py:12:80: E501 line too long (119 > 79 characters)

License

This project is licensed under the MIT License. See the LICENSE file for details.

Release files for ondivi 0.7.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ondivi 0.7.3
File Size Uploaded
ondivi-0.7.3.tar.gz 9.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ondivi 0.7.3
File Interpreter ABI Platform
ondivi-0.7.3-py3-none-any.whl Python 3 none any Details

Total release size: 23.2 kB

Release files / ondivi-0.7.3.tar.gz

Download URL ondivi-0.7.3.tar.gz
Size 9.5 kB
Tags Source
SHA-256 checksum
How to use checksums
8a54ab5e1baf32d5e38d8f4d921e8edd9b692b57fa64ff17f917a46ac23dd4dc
BLAKE2b-256 checksum
How to use checksums
f03966deaa0e780adac8953bdf1e141a4bdf74a97e646050d1e3eda102456b57
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.2.1 CPython/3.13.1 Linux/6.11.0-1018-azure

Release files / ondivi-0.7.3-py3-none-any.whl

Download URL ondivi-0.7.3-py3-none-any.whl
Size 13.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
20e5b213e238ba91528b1842c22fe7ddb2884a7187344a767708b4936ced0e96
BLAKE2b-256 checksum
How to use checksums
484ee669c3b2bcf40e5158795b3d4092d96b9298653a080ccd45ef141dcaa116
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.2.1 CPython/3.13.1 Linux/6.11.0-1018-azure
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page