Skip to main content

notignored-sdk

Typed Python access to notignored: every lint and type-check suppression comment in a source tree — # noqa, // eslint-disable-next-line, #[allow(...)], # type: ignore, and the rest — as frozen records with the tool, the rules, and the stated reason.

The distribution is notignored-sdk, the import is notignored_sdk, and every release depends on the exact notignored-cli it was built with, so pip install brings a binary that speaks the same report contract.

pip install notignored-sdk
from notignored_sdk import scan

report = scan(["src"])
for directive in report.ignores:
    print(
        f"{directive.path}:{directive.line} {directive.tool} {directive.rules}{directive.reason}"
    )

The guard: prove nobody silenced a linter to make the gate pass

The case this exists for. A green just check means nothing if the way it went green was a new # noqa, so pin the suppressions a branch is allowed to add and fail when it adds one that is not justified:

from notignored_sdk import scan


def test_this_branch_added_no_unjustified_suppression() -> None:
    """Every suppression this change adds has to say why it is there."""
    added = scan(diff=True, diff_base="origin/main")

    unexplained = [d for d in added.ignores if not d.reason]
    assert not unexplained, "\n".join(
        f"{d.path}:{d.line} adds `{d.raw}` with no stated reason" for d in unexplained
    )

diff=True reports only the suppressions on lines the change added, using the same merge-base semantics as notignored --diff — so a suppression that was already on main is never yours.

The surface

One entry point, in two forms. ascan takes the identical arguments and returns the identical report:

scan(paths=(), *, diff=False, diff_base=None, tools=None, cwd=None) -> Report
await ascan(...)  # the same call, on an event loop
Argument What it does
paths Files and/or directories. Directories are walked recursively, honouring .gitignore. Empty scans the working directory.
diff Report only the suppressions this change added.
diff_base The git revision diff compares against. Without diff=True it is a ValueError, exactly as the CLI rejects it.
tools Report only these tools (Tool members or their names); None reports all of them.
cwd Directory to run in. Report paths are relative to it.

Which binary runs

Resolution is, in order: NOTIGNORED_BIN, then the notignored on PATH.

NOTIGNORED_BIN is the explicit override — the entry points deliberately take no binary argument, so their signatures carry the CLI's flags and nothing else. pip install notignored-sdk puts the pinned binary on PATH for you, so most callers never set it; point it at a specific build when you need one, as this repository's own suite does.

The records mirror the CLI's JSON contract exactly, as frozen dataclasses:

Report(version, ignores, errors)
IgnoreDirective(tool, scope, rules, reason, path, line, end_line, column, raw, suppressed)
Suppressed(start_line, end_line)  # end_line is None when the range runs to end-of-file
ReportError(path, message)

Tool and Scope are enum.StrEnums, so directive.tool == "ruff", f"{directive.tool}", and "/".join([directive.scope]) all give the wire name.

Only a clean run returns. Any non-zero exit — including the 2 the CLI uses for a file it could not read — raises NotignoredExitError with the CLI's own stderr, so a tree that could not be fully scanned can never be mistaken for a clean one. Report.errors is part of the v1 envelope and is carried on the record, but a returned report always has it empty for that reason.

Errors

Everything raised is a NotignoredError:

Error When
NotignoredNotFoundError No notignored binary could be found. The message says how to install one.
NotignoredSpawnError The binary is there but the process could not start.
NotignoredExitError The CLI exited non-zero; carries returncode and the CLI's stderr.
NotignoredContractError The output is not the report contract this SDK reads.

Parsing is strict: an unknown tool, an unknown scope, or a missing field is a NotignoredContractError, never a silently dropped record. Because the package pins its CLI exactly, a supported install cannot hit it.

Working on it

From the repository root:

just bootstrap                             # provisions every project
just nx run notignored-sdk-python:check    # this project's gate alone
just check                                 # the whole repo's gate

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

notignored_sdk-0.1.7.tar.gz (11.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

notignored_sdk-0.1.7-py3-none-any.whl (12.8 kB view details)

Uploaded Python 3

File details

Details for the file notignored_sdk-0.1.7.tar.gz.

File metadata

  • Download URL: notignored_sdk-0.1.7.tar.gz
  • Upload date:
  • Size: 11.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for notignored_sdk-0.1.7.tar.gz
Algorithm Hash digest
SHA256 d6b239ab20339afc07c28e4778bb1c0e2b1e9000062c0f193e904ccebae2a342
MD5 10d9145638b551e8cb2620335c7edf5c
BLAKE2b-256 aa2e961abbc5543ccc5b6e3a80e34a846cc137d674af454cd8f04206a07ff9f3

See more details on using hashes here.

File details

Details for the file notignored_sdk-0.1.7-py3-none-any.whl.

File metadata

  • Download URL: notignored_sdk-0.1.7-py3-none-any.whl
  • Upload date:
  • Size: 12.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for notignored_sdk-0.1.7-py3-none-any.whl
Algorithm Hash digest
SHA256 19c01fdaca01394bf3521a32d04ef13ff9324d7e7588ed5fb74e9b1b947f81d0
MD5 17f44ceea7071b4718384e7c393fae02
BLAKE2b-256 fcb92fe7395ec6550f2822e4e268fcea731d49aba303ef9387e90c82933aec20

See more details on using hashes here.

Release history Release notifications | RSS feed

0.1.16

2 files

0.1.15

2 files

0.1.14

2 files

0.1.13

2 files

0.1.12

2 files

0.1.11

2 files

0.1.10

2 files

0.1.9

2 files

0.1.8

2 files

This release

0.1.7 This release

2 files

0.1.6

2 files

0.1.5

2 files

0.1.4

2 files

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