Skip to main content
simplint

simplint

simplint is a companion linter for Ruff. It adds checks that make Python code easier to read and review: definitions ordered like a book, explicit exports, Final constants, flat test modules, and more. The rules are opinionated. They reflect the maintainer’s preferences while aiming to be as objective as possible, so select the ones that fit your project.

simplint is written in Rust on top of Ruff’s parser crates, and lints the 264 files of tox-dev/tox in about 10 ms. When the fix for a report is mechanical, it can apply it for you. The release history lists the changes in each version.

A run over two tox modules, limited to two rules:

$ simplint check --output-format concise --select SMP050,SMP101 src/tox/util/path.py src/tox/util/spinner.py
src/tox/util/path.py:16:1: SMP050 `_CACHEDIR_TAG` is used by one function only; define it there
src/tox/util/path.py:16:1: SMP101 `_CACHEDIR_TAG` is never reassigned; annotate it `Final`
src/tox/util/spinner.py:41:1: SMP101 `MISS_DURATION` is never reassigned; annotate it `Final`
src/tox/util/spinner.py:181:1: SMP050 `_PERIODS` is used by one function only; define it there
src/tox/util/spinner.py:181:1: SMP101 `_PERIODS` is never reassigned; annotate it `Final`
Found 5 errors.
4 unsafe fixes available with `--fix --unsafe-fixes`.

Install

simplint ships as a single binary inside a Python wheel, like Ruff, so it needs no Python at runtime. Install it as a tool with uv or pipx, which keeps it apart from the project it lints.

uv tool install simplint
simplint --help

Quick start

Run simplint from the project root. Several rules need to know which names other modules import, so check the whole project, tests included:

simplint check .

simplint check works like ruff check: it finds the same files, honors the same exclude settings and .gitignore, prints in the same formats and exits the same way. It lints every .py file under the paths you give it, the current directory by default, and - reads one file from standard input. By default each report shows the offending code, as ruff check does; --output-format concise prints one line per report, and [*] marks a report with a safe fix. The command exits with status 1 while any report remains, and with status 2 when it cannot run, such as on invalid configuration.

To apply the safe fixes, add --fix. Run simplint between Ruff’s linter and its formatter:

ruff check --fix .
simplint check --fix .
ruff format .

One round is final: running the three again changes nothing. simplint leaves layout to ruff format, so its output need not be formatted, only something one ruff format run finishes. When a fix gives one of the project’s Ruff rules something to report that the file was clean for, simplint applies Ruff’s own fix for it, as for an import left unused; when Ruff has no fix, simplint withdraws its own fix and keeps the report.

The options of simplint check are the ones ruff check has, with the same meaning:

  • --unsafe-fixes also applies the fixes that can change behavior; --diff prints the fixes as a unified diff and writes nothing; --fix-only fixes without reporting what is left; --show-fixes lists what was fixed.

  • --select, --extend-select and --ignore take comma-separated rule codes (SMP111), code prefixes (SMP2) or rule names (dataclass-options). --select replaces the selection from pyproject.toml. --fixable, --unfixable and --extend-fixable pick which of the selected rules may fix, and --per-file-ignores and --extend-per-file-ignores take PATTERN:CODE pairs.

  • --output-format picks one of Ruff’s formats: full, concise, grouped, json, json-lines, junit, github, gitlab, pylint, rdjson, azure or sarif. --statistics counts the reports per rule.

  • --watch checks again whenever a Python or TOML file changes. --add-noqa writes a # noqa comment for every report, and --add-ignore a # simplint: ignore[...] comment; both take an optional reason, as in --add-noqa="legacy code". --show-files lists the files a check would cover and --show-settings prints the settings for the first of them.

  • --config takes a configuration file or a KEY = VALUE override. A [tool.simplint] key, such as --config "select = ['SMP1']", overrides simplint’s settings, and any other key Ruff’s, such as --config "target-version = 'py312'".

  • --exit-zero, --exit-non-zero-on-fix, --ignore-noqa, --isolated, --color, --target-version, --exclude, --extend-exclude, --no-cache, --cache-dir and the --quiet, --silent and --verbose log levels behave as in Ruff.

  • --preview turns on Ruff’s preview mode. simplint has no preview rules, so it only changes the output, which names rules instead of showing their codes, and lets simplint’s fixes account for Ruff’s preview rules.

simplint rules lists every rule and whether it has a fix. As in Ruff, simplint rule SMP111 prints the documentation of one rule and simplint rule --all of every rule, simplint config describes the [tool.simplint] options, simplint linter lists the rule groups, simplint clean removes its caches from the .ruff_cache directories under the current directory and simplint version prints the version. All but clean take --output-format json.

Pre-commit

Add the hook to the .pre-commit-config.yaml of pre-commit and set rev to a release tag:

- repo: https://github.com/gaborbernat/simplint
  rev: ""
  hooks:
    - id: simplint

The hook runs simplint check --fix on the whole project rather than on the changed files, because several rules need to know which names other modules import. List it after Ruff’s ruff-check hook and before its ruff-format hook, the order above. It is a Rust hook: pre-commit builds simplint from source with Cargo, so the first run takes longer than later ones.

The configuration reference covers settings and suppression comments. The rules reference documents every rule with examples and fix safety.

simplint takes two kinds of settings. Which files to check and which Python version to assume come from Ruff’s configuration, found and merged exactly as ruff check finds it. simplint’s own settings come from the [tool.simplint] table of pyproject.toml: for each file, the nearest pyproject.toml with a [tool.simplint] table in the file’s directory or a parent directory. As Ruff does with [tool.ruff], simplint passes over a pyproject.toml without the table, so a nested package inherits its parent’s settings. That directory is the project root, and the paths in the settings below are relative to it. When no pyproject.toml has the table, simplint runs every rule with the defaults, and the nearest pyproject.toml still gives the project metadata.

--config PATH reads both from one file instead, for every file checked, and --isolated ignores every configuration file, as in Ruff. --config "KEY = VALUE" overrides one setting on top of every configuration file: a [tool.simplint] key overrides simplint’s setting, and any other key Ruff’s. simplint config lists the [tool.simplint] options, and simplint config KEY describes one.

Selecting rules

simplint’s own settings live in [tool.simplint]:

[tool.simplint]
select = ["ALL"]                              # the default
extend-select = []
ignore = ["SMP002"]
per-file-ignores = { "tests/*" = ["SMP101"] }
extend-per-file-ignores = {}
  • select enables rules. The default, ALL, enables every rule.

  • extend-select adds rules to select.

  • ignore removes rules from the selection.

  • per-file-ignores maps a glob pattern to the rules to disable in matching files. A pattern matches either the path relative to the project root or the bare file name, and a leading ! disables the rules in every file the pattern does not match. extend-per-file-ignores adds to it.

Each entry is a rule code (SMP101), a code prefix (SMP1) or a rule name (missing-final). An entry that matches no rule stops the run with an error, and so does a key the table does not know. As in Ruff, the more specific entry wins when select and ignore both match a rule, so select = ["SMP1"] with ignore = ["SMP101"] enables every SMP1 rule but SMP101, and ignore wins a tie. On the command line, --select replaces select, extend-select and ignore, --extend-select adds rules, and --ignore removes rules from whatever is selected. --per-file-ignores replaces per-file-ignores and --extend-per-file-ignores adds to it.

Fixes

Which fixes apply and how safe they count follows the same pattern:

[tool.simplint]
fixable = ["ALL"]                # the default
extend-fixable = []
unfixable = ["SMP111"]
extend-unfixable = []
extend-safe-fixes = ["SMP101"]
extend-unsafe-fixes = ["SMP001"]
  • fixable lists the rules whose fixes simplint offers, extend-fixable adds to it and unfixable and extend-unfixable remove from it. A rule left out is still reported, without a fix.

  • extend-safe-fixes makes the unsafe fixes of the listed rules safe, so --fix applies them without --unsafe-fixes; extend-unsafe-fixes makes safe fixes unsafe. When both list a rule, the more specific entry wins, and extend-unsafe-fixes wins a tie.

The --fixable, --unfixable, --extend-fixable and --extend-unfixable flags override these keys.

Run options

The table also takes the run options Ruff reads from [tool.ruff], with the same names. The options of the table found for the current directory apply to the whole run, and the matching command-line flag, or its --no- form, overrides them:

[tool.simplint]
fix = false            # apply safe fixes, like --fix
fix-only = false       # fix and report nothing else, like --fix-only
unsafe-fixes = false   # include unsafe fixes, like --unsafe-fixes; unset shows a hint instead
show-fixes = false     # list what was fixed, like --show-fixes
output-format = "full" # like --output-format

Like Ruff, simplint caches which files had nothing to report, keyed by each file’s modification time. The cache lives in a simplint directory inside Ruff’s cache directory, .ruff_cache unless Ruff’s cache-dir setting, --cache-dir or RUFF_CACHE_DIR names another, and never touches Ruff’s own files there; --no-cache skips it. A cached result also depends on the names other files use from that file, so editing an importer checks the files it imports again.

Naming

Some frameworks read a module variable by its exact name, so renaming it to the _UPPER_CASE form SMP102 asks for breaks the program. SMP102 already leaves alone the names Sphinx, Alembic, gunicorn and WSGI or ASGI servers read; list any other in naming.keep-names:

[tool.simplint.naming]
keep-names = ["urlpatterns"]  # the default is []

--config "naming.keep-names = ['urlpatterns']" replaces the list, and --show-settings prints it as linter.naming.keep_names.

Settings shared with Ruff

simplint resolves Ruff’s configuration with Ruff’s own code, so the two tools agree on it: --isolated, then --config, then the closest .ruff.toml, ruff.toml or pyproject.toml with a [tool.ruff] table, then your user-level Ruff configuration, then Ruff’s defaults. extend chains and hierarchical configuration work as in Ruff. simplint does not repeat Ruff’s warnings about that configuration, such as an ignored rule Ruff has removed: ruff check already shows them.

  • target-version and per-file-target-version set the Python version the rules assume for each file, and --target-version overrides them. Without them, the version comes from requires-python, and then from Ruff’s default, Python 3.14. Every rule and fix that depends on the language version follows it: SMP100 offers := and SMP101 offers Final only from Python 3.8, SMP111 and SMP114 need 3.10, the SMP112 fix reuses the string’s quotes inside an f-string only from 3.12, SMP020 and SMP108 treat annotations as lazy from 3.14, and SMP040 counts a module as standard library only when every version from the target onward ships it.

  • exclude, extend-exclude, lint.exclude, respect-gitignore and force-exclude pick the files to check, Ruff’s built-in excludes included, and the command-line flags of the same names override them.

Settings read from [project]

simplint also reads the project metadata:

  • dependencies are the packages SMP040 treats as required, so it reports a try/except ImportError around their imports. A requirement with an environment marker is conditional and does not count.

  • Entry points in scripts, gui-scripts and entry-points count as imports of the names they reference. Fixes leave those names in place, and SMP113 expects them in __all__.

Suppressing a report

simplint honors the same noqa comments as Ruff. Put the comment on the line where the report starts, and give a reason after the codes:

x = solve(matrix)  # noqa: SMP010 matches the paper's notation

A report on a multi-line string or a line continued with \ takes the comment on the last line of the string or continuation, as in Ruff. A bare # noqa suppresses every simplint rule on its line, but SMP060 reports it for giving no reason.

The file-level comments work as in Ruff too. # ruff: noqa: SMP010 (or # flake8: noqa: SMP010) on its own line suppresses the listed rules in the whole file, a bare # ruff: noqa every rule but SMP060, and # ruff: file-ignore[SMP010] at module scope the listed rules.

# simplint: ignore[SMP010] suppresses the listed rules on its line too, the way Ruff’s # ruff: ignore[...] does for Ruff’s rules. simplint check --add-noqa writes a # noqa comment for every report left, merged into the line’s existing # noqa comment, and --add-ignore writes # simplint: ignore comments the same way. Both take a reason to write after the codes: --add-noqa="matches the paper's notation".

Ruff does not know the SMP codes. List them in lint.external so that Ruff keeps these comments instead of reporting them as unused (RUF100):

[tool.ruff]
lint.external = ["SMP"]

Pairing with Ruff

simplint does not repeat what Ruff already checks. To cover what its rules leave to Ruff, run Ruff with every rule selected (select = ["ALL"]) but the missing-docstring rules, which ask for the docstrings simplint removes (see Rules that work against each other), and add these flake8-tidy-imports settings:

[tool.ruff.lint]
select = ["ALL"]
ignore = ["D1"]

[tool.ruff.lint.flake8-tidy-imports]
ban-relative-imports = "parents"

[tool.ruff.lint.flake8-tidy-imports.banned-api]
"typing.Any".msg = "use the precise type"
"typing.cast".msg = "narrow with isinstance or TypeIs instead"

Ruff reads banned-api per configuration file, so the test-only bans go in a ruff.toml inside the tests directory. That file extends the root configuration and repeats the bans above, because a nested table replaces the parent’s. The unittest.mock ban steers tests from unittest.mock to the mocker fixture of pytest-mock:

extend = "../pyproject.toml"

[lint.flake8-tidy-imports.banned-api]
"typing.Any".msg = "use the precise type"
"typing.cast".msg = "narrow with isinstance or TypeIs instead"
"unittest.mock".msg = "mock through pytest-mock's mocker"
"time.sleep".msg = "wait on an event the mock sets"

Rules that work against each other

Some simplint rules undo what a Ruff rule asks for, under some Ruff settings. With both on for a file, one side’s fix undoes the other’s, or leaves code the other reports, so no run of ruff check --fix and simplint check --fix leaves that file clean. simplint checks every file’s settings before it lints any, and exits with status 2 when it finds such a pair. The error names both rules, the configuration files their settings come from, the first file they meet in, and how to resolve it:

simplint failed
  Cause: simplint and Ruff rules work against each other, so fixing never leaves the code clean:
  - SMP108 (future-annotations) removes `from __future__ import annotations` on Python 3.14 and newer, which Ruff's I002 (missing-required-import) adds back because `lint.isort.required-imports` lists it; ignore SMP108 in `[tool.simplint]`, or drop the import from `required-imports`.
    simplint settings: /project/pyproject.toml; Ruff settings: /project/pyproject.toml; first file: src/app.py

The pairs are:

  • SMP002 removes docstrings that Ruff’s D101, D102, D103, D105, D106 and D107 ask for. Ignore those, and let SMP116 ask for documentation on the public API.

  • SMP004 removes the module docstrings of tests that Ruff’s D100 and D104 ask for. Turn those off for test files in Ruff’s per-file-ignores.

  • SMP108 removes from __future__ import annotations on Python 3.14 and newer, which Ruff’s I002 adds back when lint.isort.required-imports lists it. Drop it from the list once the project targets Python 3.14.

  • SMP110 makes imports from the file’s own package relative, which Ruff’s TID252 turns back when lint.flake8-tidy-imports.ban-relative-imports is "all". Set it to "parents".

Per-file ignores on either side count, so a Ruff rule turned off for tests does not conflict there. In preview, as in Ruff’s reports, the message names rules instead of codes. Other combinations clash only on some code, such as SMP050 inlining a value into a comparison Ruff’s PLR2004 reports: simplint then offers no fix for that report and keeps it, and the run goes on. No setting accepts a conflicting pair; turn one side off. --show-settings and --show-files do not check for conflicts, so they help find where a rule comes from.

Metadata

Release files for simplint 0.2.2

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

Source distribution (sdist)

Source distribution for simplint 0.2.2
File Size Uploaded Provenance Actions
simplint-0.2.2.tar.gz 909.3 kB With provenance Details for simplint-0.2.2.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for simplint 0.2.2
File Actions
simplint-0.2.2-py3-none-win_arm64.whl Python 3 none Windows ARM64 Details for simplint-0.2.2-py3-none-win_arm64.whl
simplint-0.2.2-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details for simplint-0.2.2-py3-none-win_amd64.whl
simplint-0.2.2-py3-none-musllinux_1_2_x86_64.whl Python 3 none Linux musl 1.2+ x86-64 Details for simplint-0.2.2-py3-none-musllinux_1_2_x86_64.whl
simplint-0.2.2-py3-none-musllinux_1_2_aarch64.whl Python 3 none Linux musl 1.2+ ARM64 Details for simplint-0.2.2-py3-none-musllinux_1_2_aarch64.whl
simplint-0.2.2-py3-none-manylinux_2_31_riscv64.whl Python 3 none Linux glibc 2.31+ RISC-V 64 Details for simplint-0.2.2-py3-none-manylinux_2_31_riscv64.whl
simplint-0.2.2-py3-none-manylinux_2_28_x86_64.whl Python 3 none Linux glibc 2.28+ x86-64 Details for simplint-0.2.2-py3-none-manylinux_2_28_x86_64.whl
simplint-0.2.2-py3-none-manylinux_2_28_aarch64.whl Python 3 none Linux glibc 2.28+ ARM64 Details for simplint-0.2.2-py3-none-manylinux_2_28_aarch64.whl
simplint-0.2.2-py3-none-macosx_11_0_arm64.whl Python 3 none macOS 11.0+ ARM64 Details for simplint-0.2.2-py3-none-macosx_11_0_arm64.whl
simplint-0.2.2-py3-none-macosx_10_12_x86_64.whl Python 3 none macOS 10.12+ x86-64 Details for simplint-0.2.2-py3-none-macosx_10_12_x86_64.whl

Total release size: 88.2 MB

Release files / simplint-0.2.2.tar.gz

Download URL simplint-0.2.2.tar.gz
Size 909.3 kB
Tags Source
SHA-256 checksum
How to use checksums
6d9f1601fe0e03870920c8014a6c7e3a7c6ee62591b38beb9a6d06cd8492cdc5
BLAKE2b-256 checksum
How to use checksums
055723e2e653e508ea3a2d0fbc0411f257705d991828f93bfcafff767f3839ba
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 2, 2026.

Transparency log

Release files / simplint-0.2.2-py3-none-win_arm64.whl

Download URL simplint-0.2.2-py3-none-win_arm64.whl
Size 9.4 MB
Tags Python 3 Windows ARM64
SHA-256 checksum
How to use checksums
43368d9a3032a32fc63f56c1c5983e81337add56dd7d837e1af6aa468bab3524
BLAKE2b-256 checksum
How to use checksums
2fb1bbb3148788ee009b3a13612d9c6492f6e36f778253d10c96e868b4a2b787
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 2, 2026.

Transparency log

Release files / simplint-0.2.2-py3-none-win_amd64.whl

Download URL simplint-0.2.2-py3-none-win_amd64.whl
Size 10.7 MB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
442d00624d2bc7da603490fa4ad29415b19bba0789af6b9a75dbbba4f8c30fb3
BLAKE2b-256 checksum
How to use checksums
f1af3a8dbf851520fd05d97f51603e0427cf6de0d4c6682e476100a553eae70c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 2, 2026.

Transparency log

Release files / simplint-0.2.2-py3-none-musllinux_1_2_x86_64.whl

Download URL simplint-0.2.2-py3-none-musllinux_1_2_x86_64.whl
Size 10.4 MB
Tags Linux musl 1.2+ x86-64 Python 3
SHA-256 checksum
How to use checksums
ab52a02bb1fdfa7493a3c8ef8bc36f4ef24d2cdfe1dd38dd0b6041975510f34f
BLAKE2b-256 checksum
How to use checksums
ea8b3545e3754a01f5277005aaa0d070b4fbad5f06b0af1a85db6dd43273e1a8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 2, 2026.

Transparency log

Release files / simplint-0.2.2-py3-none-musllinux_1_2_aarch64.whl

Download URL simplint-0.2.2-py3-none-musllinux_1_2_aarch64.whl
Size 9.0 MB
Tags Linux musl 1.2+ ARM64 Python 3
SHA-256 checksum
How to use checksums
8db5d372a8d06f0867d302f7d38df6a16a59b495f75e5c84a435bed870c86a53
BLAKE2b-256 checksum
How to use checksums
94a698c8a45f279b24d0ba75058ee348f4465fe19473b82b18f529b9fb23b9b1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 2, 2026.

Transparency log

Release files / simplint-0.2.2-py3-none-manylinux_2_31_riscv64.whl

Download URL simplint-0.2.2-py3-none-manylinux_2_31_riscv64.whl
Size 9.5 MB
Tags Linux glibc 2.31+ RISC-V 64 Python 3
SHA-256 checksum
How to use checksums
611cb5354793f9c86e4950688762e49d318a97980e5b015167144295766ae19b
BLAKE2b-256 checksum
How to use checksums
ef5a2edb6a2c382e56246a4e60ab7870f7909ab7035989ab2e3a562e06fa66fa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 2, 2026.

Transparency log

Release files / simplint-0.2.2-py3-none-manylinux_2_28_x86_64.whl

Download URL simplint-0.2.2-py3-none-manylinux_2_28_x86_64.whl
Size 10.4 MB
Tags Linux glibc 2.28+ x86-64 Python 3
SHA-256 checksum
How to use checksums
685fd74af95c845a00a81969cf60a48f8e787f71215d6d42a66ccdc8b0b168e7
BLAKE2b-256 checksum
How to use checksums
4e508c788211c59adb0bd8a31b915b859eefcd81cf83bb51b751cf8c6a7bb075
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 2, 2026.

Transparency log

Release files / simplint-0.2.2-py3-none-manylinux_2_28_aarch64.whl

Download URL simplint-0.2.2-py3-none-manylinux_2_28_aarch64.whl
Size 9.0 MB
Tags Linux glibc 2.28+ ARM64 Python 3
SHA-256 checksum
How to use checksums
011ffd01cc3bf38b1d6ed7c25fbedb5568fc086efdbe49c89f0a5db65db7d7b3
BLAKE2b-256 checksum
How to use checksums
62b68715cc6178dce032489da02b99fbf5b1f9f81c6f7d03e4d373ea16dd6d64
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 2, 2026.

Transparency log

Release files / simplint-0.2.2-py3-none-macosx_11_0_arm64.whl

Download URL simplint-0.2.2-py3-none-macosx_11_0_arm64.whl
Size 9.7 MB
Tags Python 3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
a4d07eb18912af3395da43aa2bd0ae258fd244ff0c460ff1c1011e0a96cdce62
BLAKE2b-256 checksum
How to use checksums
d8c430182f85b046d5df79ba41cc2a1d0da87250b67c5cdfdac380b43a68bac6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 2, 2026.

Transparency log

Release files / simplint-0.2.2-py3-none-macosx_10_12_x86_64.whl

Download URL simplint-0.2.2-py3-none-macosx_10_12_x86_64.whl
Size 9.3 MB
Tags Python 3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
e715d7176ef7bce8e406cbb428e27a282a97382b94da1b40cd043fade61eb191
BLAKE2b-256 checksum
How to use checksums
6436a91f8df38fc276be32457ccecd8f6c59fc1b741f49e24634634106a519e5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 2, 2026.

Transparency log

Security for simplint 0.2.2

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 10 files in this release have been uploaded with provenance metadata.

Select from 10 files

Attestation for simplint-0.2.2.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 2, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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