Skip to main content

Check dependencies of a python project against pyproject.toml requirements

Project description

Check Dependencies

Check all imports from python files and compares them against the declared imports of a pyproject dependency list of expected imports.

It can be used as a stand-alone or as part of a CI/CD to check if an application has all the necessary, but no superfluous imports.

It supports PEP-621, Poetry (v1.2+), UV (0.2+) and Hatch style dependencies.

This is a pure-Python zero-dependency (Up until Python 3.11 one, toml) package.

Usage

usage: check-dependencies [-h] [--include-dev] [--verbose] [--all] [--missing MISSING] [--extra EXTRA] [--provides PACKAGE=IMPORT] [--include INCLUDE] file_name [file_name ...]

Find undeclared and unused (or all) imports in Python files

positional arguments:
  file_name             Python Source file to analyse

options:
  -h, --help            show this help message and exit
  --include-dev         Include dev dependencies
  --verbose             Show every import of a package
  --all                 Show all imports (including correct ones)
  --missing MISSING     Comma separated list of requirements known to be missing.
                        Assume they are part of the requirements.
  --extra EXTRA         Comma separated list of requirements known to not be imported.
                        Assume they are not part of the requirements.
                        This can be plugins or similar that affect the package but are not imported explicitly.
  --provides PACKAGE=IMPORT
                        Map a package name to its import name for packages whose import name differs
                        from the package name. Can be specified multiple times.
                        E.g. --provides Pillow=PIL --provides PyJWT=jwt. The package name is
                        normalized (case-insensitive, hyphens and underscores are equivalent),
                        so Pillow=PIL, pillow=PIL and PIL-ow=PIL are all the same.
  --include, -I INCLUDE
                        Additional config files to include. Can be specified multiple times.
                        E.g. --include check-dependencies.toml.

Output

The output is a list of imports with a prefix indicating the status of the import.

  • ! - Undeclared import
  • + - Extra import, declared in pyproject.toml, but not used in the file
  • ? - Dynamic import that could not be resolved.
  • !! - Could not parse the file (e.g. syntax error)
  • - Correct import (only shown with --all)

In case of --verbose, the output is a list of all imports in the file, prefixed with:

  • !NA - Undeclared import
  • +EXTRA - Extra import, declared in pyproject.toml, but not used in the file
  • ?UNKNOWN - Dynamic import that could not be resolved.
  • !!FILE_ERROR - Could not parse the file (e.g. syntax error)
  • OK - Correct import (only shown with --all)

Additionally, each import is prefixed with the file name and line number where it is imported.

Notes

This can be used as a stand-alone application or as part of a CI/CD pipeline. In the former case, it can be installed via uv tool or pipx.

Using uv:

uv tool install check-dependencies
check-dependencies

Using pipx:

pipx install check-dependencies
check-dependencies

Alternatively, to run without installing:

uvx check-dependencies
pipx run check-dependencies

Examples

Basic usage

check-dependencies  project/src/
  pandas
! matplotlib
  numpy
+ requests

Output all dependencies

Output all dependencies, including the correct ones.

check-dependencies --all project/src/
  pandas
! matplotlib
  numpy
+ requests

Verbose output

Output each erroneous import and extra dependency with cause, file name and line number.

check-dependencies --verbose project/src/
!NA matplotlib project/src/main.py:4
+EXTRA project/pyproject.toml requests

Combine verbose and all

Output all imports, including the correct ones with file name and line number.

check-dependencies --verbose --all project/src/
 OK project/src/data.py:5 pandas
 OK project/src/main.py:3 pandas
 OK project/src/plotting.py:4 pandas
!NA project/src/plotting.py:5 matplotlib
 OK project/src/plotting.py:6 numpy

### Dependencies in config file not used in application:
# Config file: project/pyproject.toml
+EXTRA requests

Configuration

The configuration is read from pyproject.toml file. The configuration file supports the following entries:

  • [tool.check-dependencies.known-extra] to add extra packages to the list of dependencies.

  • [tool.check-dependencies.known-missing] does the opposite, it will ignore existing dependencies even if they are not imported. This is useful for packages, that provide functionality via plugins (e.g. sqlalchemy plugins) and are not imported directly in the codebase.

  • [tool.check-dependencies.provides] to map package names to import names for packages whose import name differs from the package name. E.g. Pillow is imported as PIL, but the package name is Pillow. The value can be either a single module or a list of modules.

  • [tool.check-dependencies.includes] to include additional config files. This is useful for monorepos or similar setups where multiple packages share a common configuration file.

[tool.check-dependencies]
known-missing = [
    "undeclared_package",
    "another_package"
]
known-extra = [
    "package_as_extra_for_another_package",
    "yet_another_package"
]
[tool.check-dependencies.provides]
# Maps package name (as declared in dependencies) -> import/module name
Pillow = "PIL"
PyJWT = "jwt"
pyshp = "shapefile"
foxtrox = ["fox", "trox"]  # This package provides both `import fox` and `import trox`, but the package name is `foxtrox`
[tool.check-dependencies]
includes = [
  "check-dependencies.toml",
  "../../common-provides.toml"
]

Exit code

  • 0: No missing or superfluous dependencies found
  • 2: Missing (used, but not declared in pyproject.toml) dependencies found
  • 4: Extra (declaredfcheck_ in pyproject.toml, but unused) dependencies found
  • 6: Both missing and superfluous dependencies found
  • 8: Could not find associated pyproject.toml file
  • 16: Could not parse source file(s)
  • 1: Another error occurred

Development

See CONTRIBUTING.md for development setup and guidelines.

Project details


Download files

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

Source Distribution

check_dependencies-1.1.0.tar.gz (26.9 kB view details)

Uploaded Source

Built Distribution

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

check_dependencies-1.1.0-py3-none-any.whl (33.2 kB view details)

Uploaded Python 3

File details

Details for the file check_dependencies-1.1.0.tar.gz.

File metadata

  • Download URL: check_dependencies-1.1.0.tar.gz
  • Upload date:
  • Size: 26.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for check_dependencies-1.1.0.tar.gz
Algorithm Hash digest
SHA256 a1ca6d7c3edab37cb4e247ee417c951032ce7259f326381f7e73fa6362195a81
MD5 96509b81f64ec8c1268232a2b7c50277
BLAKE2b-256 2849a7d70bf5fb7b426f7c1da317107b6f56178c86698d1e2c0b145f3a9376af

See more details on using hashes here.

Provenance

The following attestation bundles were made for check_dependencies-1.1.0.tar.gz:

Publisher: python.yml on schollm/check-dependencies

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file check_dependencies-1.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for check_dependencies-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a5eecfbac520c3b045e9286c48c1780409b35606629d7406aff4edbc70c32e52
MD5 2cbfd8759c3e444fa870462954e15fbd
BLAKE2b-256 e8cd3e57c15f3ea8faa962408819c4701c1feeae4189bb343988b496f9abe469

See more details on using hashes here.

Provenance

The following attestation bundles were made for check_dependencies-1.1.0-py3-none-any.whl:

Publisher: python.yml on schollm/check-dependencies

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page