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.12.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.12-py3-none-any.whl (12.9 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: notignored_sdk-0.1.12.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.12.tar.gz
Algorithm Hash digest
SHA256 46cdf92a281b2066605bf6571fd3159144caf1307e1e743d66bc5920059b4d44
MD5 3759e40ce2ce8180f45e685946d8bda5
BLAKE2b-256 cafbd6190742e1ee3c65238ff9922a1f3fe7d4cfa701f626b4518cb99bd8fc6a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for notignored_sdk-0.1.12-py3-none-any.whl
Algorithm Hash digest
SHA256 57d561da85109d6132aa0f0d9a8123e07570f5239ce659575dc5be5a4488687e
MD5 e092a138f0802676921b48c5cf035f30
BLAKE2b-256 3b33b753ddfd1f5edd7f6423686eb372e7c799e8e584cd0736f14012d86dbd38

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

This release

0.1.12 This release

2 files

0.1.11

2 files

0.1.10

2 files

0.1.9

2 files

0.1.8

2 files

0.1.7

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