Skip to main content

A tool for resolving PEP 735 Dependency Group data

Project description

dependency-groups

An implementation of Dependency Groups (PEP 735).

This is a library which is able to parse dependency groups, following includes, and provide that data as output.

Usage

dependency_groups expects data in the form of a dict, the loaded [dependency-groups] table. Start by loading:

import tomllib

with open("pyproject.toml", "rb") as fp:
    pyproject = tomllib.load(fp)

groups = pyproject["dependency-groups"]

Using dependency_groups.resolve, you can produce a list of strings, which must be valid Dependency Specifiers.

from dependency_groups import resolve

groups = {
  "test": ["pytest", {"include-group": "runtime"}],
  "runtime": ["flask"],
}

resolve(groups, "test")  # ['pytest', 'flask']

The library provides its resolution machinery via an object oriented interface, which allows users to explore the structure of data before or during resolution using DependencyGroupInclude and DependencyGroupResolver.

For example,

from dependency_groups import DependencyGroupResolver

groups = {
  "test": ["pytest", {"include-group": "runtime"}],
  "runtime": ["flask"],
}

resolver = DependencyGroupResolver(groups)

# you can lookup a group without resolving it
resolver.lookup("test")  # [Requirement('pytest'), DependencyGroupInclude('runtime')]

# and resolve() produces packaging Requirements
resolver.resolve("test")  # [Requirement('pytest'), Requirement('flask')]

Functional Interface

def resolve(
    dependency_groups: Mapping[str, str | Mapping[str, str]], group: str, /
) -> tuple[str, ...]:
    """
    Resolve a dependency group to a tuple of requirements, as strings.

    :param dependency_groups: the parsed contents of the ``[dependency-groups]`` table
        from ``pyproject.toml``
    :param group: the name of the group to resolve

    :raises TypeError: if the inputs appear to be the wrong types
    :raises ValueError: if the data does not appear to be valid dependency group data
    :raises LookupError: if group name is absent
    :raises packaging.requirements.InvalidRequirement: if a specifier is not valid
    """

Models

Parsed Dependency Group Includes are represented by a dataclass:

@dataclasses.dataclass
class DependencyGroupInclude:
    include_group: str

Resolver

class DependencyGroupResolver:
    """
    A resolver for Dependency Group data.

    This class handles caching, name normalization, cycle detection, and other
    parsing requirements. There are only two public methods for exploring the data:
    ``lookup()`` and ``resolve()``.

    :param dependency_groups: A mapping, as provided via pyproject
        ``[dependency-groups]``.
    """

    def lookup(self, group: str) -> tuple[Requirement | DependencyGroupInclude, ...]:
        """
        Lookup a group name, returning the parsed dependency data for that group.
        This will not resolve includes.

        :param group: the name of the group to lookup

        :raises ValueError: if the data does not appear to be valid dependency group
            data
        :raises LookupError: if group name is absent
        :raises packaging.requirements.InvalidRequirement: if a specifier is not valid
        """

    def resolve(self, group: str) -> tuple[Requirement, ...]:
        """
        Resolve a dependency group to a list of requirements.

        :param group: the name of the group to resolve

        :raises TypeError: if the inputs appear to be the wrong types
        :raises ValueError: if the data does not appear to be valid dependency group
            data
        :raises LookupError: if group name is absent
        :raises packaging.requirements.InvalidRequirement: if a specifier is not valid
        """

Errors

The following error classes are defined:

class CyclicDependencyError(ValueError):
    """
    An error representing the detection of a cycle.
    """

CLI Usage

dependency-groups provides a simple, module-level entrypoint. It can parse a pyproject.toml file and print a dependency group's contents back out. Just use python -m dependency_groups --help for details!

Lint CLI

dependency-groups includes a linter, lint-dependency-groups, as a separate CLI entrypoint.

Use lint-dependency-groups --help for details.

pre-commit

The lint-dependency-groups CLI is also available as a pre-commit hook:

repos:
  - repo: https://github.com/sirosen/dependency-groups
    rev: 0.3.0
    hooks:
      - id: lint-dependency-groups

Install CLI

dependency-groups includes a pip wrapper, pip-install-dependency-groups.

Usage is simple, just pip-install-dependency-groups groupname to install!

Use pip-install-dependency-groups --help for more details.

License

dependency-groups is distributed under the terms of the MIT license.

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

dependency_groups-0.3.0.tar.gz (10.4 kB view details)

Uploaded Source

Built Distribution

dependency_groups-0.3.0-py3-none-any.whl (9.5 kB view details)

Uploaded Python 3

File details

Details for the file dependency_groups-0.3.0.tar.gz.

File metadata

  • Download URL: dependency_groups-0.3.0.tar.gz
  • Upload date:
  • Size: 10.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for dependency_groups-0.3.0.tar.gz
Algorithm Hash digest
SHA256 acf84903d0323c268099c97306266afdb3eee7d988f55f9bd16f3dde5fd2de95
MD5 fe7ae4d125a7d295075a1407b83faa67
BLAKE2b-256 ece6b7af3e19395a1f19746989e4563b62749a561d66e414e45ac9396cd38d30

See more details on using hashes here.

File details

Details for the file dependency_groups-0.3.0-py3-none-any.whl.

File metadata

File hashes

Hashes for dependency_groups-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 eff273bfd13e78b7bbd309ff64b2f0a4a99797e9e10452221262037f8044a7c7
MD5 297e815a3b384356be83fabb0261fe38
BLAKE2b-256 9d7be48bf40129b8e762dbeae1f9b2767daea6ed53f0ef98955bd2376dc742d1

See more details on using hashes here.

Supported by

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