poeblix
Poetry Plugin that adds various features deemed unfit for the official release, but makes sense to me
Overview
These contain custom poetry plugins that enable functionality not available in the official distribution of poetry. These include:
- Using the Lock file to build a wheel file with pinned dependencies
- Support for data_files (like with setup.py) such as jupyter extensions or font files
- Validating a wheel file is consistent with dependencies specified in pyproject.toml/poetry.lock
- Validating a docker container’s
pip freeze
contains dependencies as specified in pyproject.toml/poetry.lock
These are not supported in Poetry due to debate in the community: python-poetry/poetry#890, python-poetry/poetry#4013, python-poetry/poetry#2778
How to Use
Prerequisite
Poetry Plugins are only supported in 1.2.0+ which, at the moment (5/29/22), can only be installed when using the new poetry installer, and updating to the preview version via
poetry self update --preview
Installation
You can add the plugin via poetry’s CLI:
poetry plugin add poeblix
Or install directly from source/wheel, then add with the same above command using the path to the built dist
Usage
- To build a wheel from your package (default uses poetry.lock to pin dependencies in the wheel):
poetry blixbuild
- Validate a wheel file has consistent dependencies and data_files as specified in pyproject.toml/poetry.lock
poetry blixvalidatewheel <path-to-wheel>
Note: this validates consistency in both directions
- Validate a docker container contains dependencies in a
pip freeze
as specified in pyproject.toml/poetry.lock
poetry blixvalidatedocker <docker-container-ID>
Note: this only validates the docker container contains dependencies in the project, but not the other direction
Here’s an example series of commands to start up a temporary docker container using its tag, validate it, then stop the temporary container
# This will output the newly running container id
docker run --entrypoint=bash -it -d <docker-image-tag>
# Then validate the running docker container, and stop it when done
poetry blixvalidatedocker <container-id>
docker stop <container-id>
- Adding data_files to pyproject.toml to mimic data_files in setup.py:
...
[tool.blix.data]
data_files = [
{ destination = "share/data/", from = [ "data_files/test.txt", "data_files/anotherfile" ] },
{ destination = "share/data/threes", from = [ "data_files/athirdfile" ] }
]
...
data_files should be under the [tool.blix.data]
category and is a list of objects, each containing the destination
data folder, and a from
list of files to add to the destination data folder.
Note: the destination is a relative path that installs data to relative to the installation prefix
- For more help on each command, use the –help argument
poetry blixbuild --help
poetry blixvalidatewheel --help
poetry blixvalidatedocker --help
Development
mkvirtualenv -p python3.9 venv
# installs the plugin in editable mode for easier testing via `poetry install`
./devtool bootstrap
# Lint checks
./devtool lint
# Run all checks
./devtool all
plugins.py : contains our plugin that adds the poetry blix
command for building our wheel file
validateplugin.py : adds a command that validates a docker file contains dependencies as specified in pyproject.toml and poetry.lock. This does NOT validate that they are exactly matching, but rather that all dependencies in pyproject.toml/poetry.lock exist in the docker container on the correct versions. The docker image may contain more extra dependencies