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 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)
| 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)
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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logSecurity 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.
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 logA 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.