Skip to main content

nox-poetry

Project description

Project Status PyPI Python Version License

Read the documentation at https://nox-poetry.readthedocs.io/ Tests Codecov

pre-commit Black

Use Poetry inside Nox sessions

This package provides a drop-in replacement for session.install in Nox sessions. It modifies its behavior in two ways:

  • Packages are pinned to the versions specified in Poetry’s lock file.

  • The argument "." is replaced by a wheel built from the package.

Installation

Install nox-poetry from the Python Package Index:

$ pip install nox-poetry

Important: This package must be installed into the same environment that Nox is run from. If you installed Nox using pipx, use the following command to install this package into the same environment:

$ pipx inject nox nox-poetry

Usage

Import nox_poetry.patch at the top of your noxfile.py.

nox-poetry intercepts calls to session.install and uses Poetry to export a constraints file and build the package behind the scenes. All packages installed in Nox sessions must be managed as dependencies in Poetry.

For example, the following Nox session runs your test suite:

# noxfile.py
import nox
import nox_poetry.patch
from nox.sessions import Session

@nox.session
def tests(session: Session) -> None:
    """Run the test suite."""
    session.install(".")
    session.install("pytest")
    session.run("pytest")

More precisely, the session builds a wheel from the local package, installs the wheel as well as the pytest package, and invokes pytest to run the test suite against the installation.

If you prefer a more explicit approach, invoke nox_poetry.install and nox_poetry.installroot instead of session.install. Use the nox_poetry.WHEEL or nox_poetry.SDIST constants to specify the distribution format for the local package.

Here is the example above using the more explicit approach:

# noxfile.py
import nox
import nox_poetry
from nox.sessions import Session

@nox.session
def tests(session: Session) -> None:
    """Run the test suite."""
    nox_poetry.installroot(session, distribution_format=nox_poetry.WHEEL)
    #nox_poetry.install(session, ".")  # this is equivalent to the statement above
    nox_poetry.install(session, "pytest")
    session.run("pytest")

Why?

Consider what would happen in the first version without the line importing nox-poetry.patch:

  • Package dependencies would only be constrained by the wheel metadata, not by the lock file. In other words, their versions would not be pinned.

  • The pytest dependency would not be constrained at all.

  • Poetry would be installed as a build backend every time (although this could be avoided by passing the option --no-build-isolation).

Unpinned dependencies mean that your checks are not reproducible and deterministic, which can lead to surprises in Continuous Integration and when collaborating with others. You can solve these issues by declaring pytest as a development dependency, and installing your package and its dependencies using poetry install:

@nox.session
def tests(session: Session) -> None:
    """Run the test suite."""
    session.run("poetry", "install", external=True)
    session.run("pytest")

Unfortunately, this approach comes with its own set of problems:

  • Checks run against an editable installation of your package, i.e. your local copy of the code, instead of the installed wheel your users see. In the best case, any mistakes will still be caught during Continuous Integration. In the worst case, you publish a buggy release because you forgot to commit some changes.

  • The package is installed, as well as all of its core and development dependencies, no matter which tools a session actually runs. Code formatters or linters, for example, don’t need your package installed at all. Besides being wasteful, it goes against the idea of running checks in isolated environments.

nox-poetry uses a third approach:

  • Installations are performed by pip, via the session.install method.

  • When installing your own package, Poetry is used to build a wheel, which is passed to pip.

  • When installing third-party packages, Poetry is used to export a constraints file, which is passed to pip along with the packages. The constraints file ensures that package versions are pinned by the lock file, without forcing an installation of every listed dependency and sub-dependency.

In summary, this approach brings the following advantages:

  • You can manage tools like pytest as development dependencies in Poetry.

  • Dependencies are pinned by Poetry’s lock file, making checks predictable and deterministic.

  • You can run checks against an installed wheel, instead of your local copy of the code.

  • Every tool can run in an isolated environment with minimal dependencies.

  • No need to install your package with all its dependencies if all you need is some linter.

For more details, take a look at this article.

Contributing

Contributions are very welcome. To learn more, see the Contributor Guide.

License

nox-poetry is free and open source software, distributed under the terms of the MIT license.

Issues

If you encounter any problems, please file an issue along with a detailed description.

Credits

This project was generated from @cjolowicz’s Hypermodern Python Cookiecutter template.

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

nox-poetry-0.7.1.tar.gz (11.5 kB view details)

Uploaded Source

Built Distribution

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

nox_poetry-0.7.1-py3-none-any.whl (9.6 kB view details)

Uploaded Python 3

File details

Details for the file nox-poetry-0.7.1.tar.gz.

File metadata

  • Download URL: nox-poetry-0.7.1.tar.gz
  • Upload date:
  • Size: 11.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.1.2 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.8.7

File hashes

Hashes for nox-poetry-0.7.1.tar.gz
Algorithm Hash digest
SHA256 7b598ff54e20b4fc28ca2dab961363089d6ca085118a5218fc28680a1920b709
MD5 e0869cec620a8e26b072edf831107f1a
BLAKE2b-256 be54c1cc3051c268a23e1a1d14d9d53c15b9530903118d2c8920c623e111ddef

See more details on using hashes here.

File details

Details for the file nox_poetry-0.7.1-py3-none-any.whl.

File metadata

  • Download URL: nox_poetry-0.7.1-py3-none-any.whl
  • Upload date:
  • Size: 9.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.1.2 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.8.7

File hashes

Hashes for nox_poetry-0.7.1-py3-none-any.whl
Algorithm Hash digest
SHA256 73bb9b16c5ce93119409fa314f7a820c36895b8e762ff387601f6cc3d50dd698
MD5 867d63843d7892d6fb1472e5dabd8b1d
BLAKE2b-256 dc91fe69ba87076327113a7f51fbef9f849438ff9c36cdc8fd8becff70664864

See more details on using hashes here.

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