Giter VIP home page Giter VIP logo

poeblix's Introduction

Notice: this project is no longer actively updated to keep up with Poetry releases. Feel free to fork the repo, or submit PRs which will still be merged

poeblix

Poetry Plugin that adds various features that extend the poetry command such as building wheel files with locked dependencies, and validations of wheel/docker containers.

Supports poetry versions 1.2+ (Note: if you are not using the latest version of poetry, you will need to check the Releases page to see which version of poeblix supports your version of poetry)

Overview

These contain custom poetry plugins that enable functionality not available in the official distribution of poetry. These include:

  1. Using the Lock file to build a wheel file with pinned dependencies
  2. Support for data_files (like with setup.py) such as jupyter extensions or font files
  3. Validating a wheel file is consistent with dependencies specified in pyproject.toml/poetry.lock
  4. 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

Deterministic builds and environments

Poetry guarantees deterministic installations and environments thanks to the poetry.lock file, which is where it stores the exact versions of all the dependencies needed to install a package. However, this doesn't occurs when wheel or package artifacts are build using poetry build command.

To build a package, poetry uses the direct dependencies set in the pyproject.toml and not all the other dependencies required to install a package. For example, if pyproject.toml defines pandas = "1.4.2" as dependency but poetry.lock also says that pandas requires of numpy-1.22.4, poetry will build a package with pandas as dependency but not with numpy.

Another problem that exists is that pyproject.toml can contain dependencies with ranges of versions while poetry.lock has pinned versions. For instance, if pyproject.toml has as dependency pandas = ">=1.3" but poetry.lock sets pandas-1.4.2, poetry will build a package with the dependency Requires-Dist: pandas (>=0.1.3,<0.2.0). When the package is installed, the resolver will install the newest package of pandas which its version number is greater than or equal to 0.1.3 and lower than 0.2.0.

Summing this up, the same python package created with poetry build and installed several times won't install the same dependencies, making impossible to have deterministic installations.

This plugin solves these problems building python packages that use the dependencies defined in the poetry.lock.

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

# You can update poetry using
poetry self update

Installation

You can add the plugin via poetry's CLI:

poetry self add poeblix

For <= 1.2:

poetry plugin add poeblix

Or install directly from source/wheel, then add with the same above command using the absolute path to the built dist

To update the plugin:

# Update to latest
poetry self add poeblix@latest

# Update to specific version
poetry self add poeblix==<version>

You should now see the blix* commands if you run poetry list

Usage

  1. To build a wheel from your package (pyproject.toml dependencies have precedence over poetry.lock ones, by default)
poetry blixbuild

# Note: Options below are also available as part of the `blixvalidatewheel` and `blixvalidatedocker` commands

# To disable using lock file for building wheel and only use pyproject.toml
poetry blixbuild --no-lock

# Uses lock dependencies only which are pinned to exact versions, instead of pyproject.toml
poetry blixbuild --only-lock

# Specify additional dependency groups to include as Requires-Dist in the wheel
poetry blixbuild --with-groups=dev,integ,etc.
  1. Validate a wheel file has consistent dependencies and data_files as specified in pyproject.toml/poetry.lock
poetry blixvalidatewheel <path-to-wheel>

# Disable using lock file for validation
poetry blixvalidatewheel --no-lock <path-to-wheel>

Note: this validates consistency in both directions

  1. Validate a docker container contains dependencies in a pip freeze as specified in pyproject.toml/poetry.lock
poetry blixvalidatedocker <docker-container-ID>

# Disable using lock file for validation
poetry blixvalidatedocker --no-lock <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>
  1. 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

Example: https://github.com/spoorn/poeblix/blob/main/test/positive_cases/happy_case_example/pyproject.toml

  1. For more help on each command, use the --help argument
poetry blixbuild --help
poetry blixvalidatewheel --help
poetry blixvalidatedocker --help

Development

# Make a virtual environment on Python 3.9
# If using virtualenvwrapper, run `mkvirtualenv -p python3.9 venv`
virtualenv -p python3.9 venv

# Or activate existing virtualenv
# If using virtualenvwrapper, run `workon venv`
source venv/bin/activate

# installs the plugin in editable mode for easier testing via `poetry install`
./devtool bootstrap

# Lint checks
./devtool lint

# Tests
./devtool test

# Run all checks and tests
./devtool all

plugins.py : contains our plugin that adds the poetry blixbuild command for building our wheel file

validatewheel.py: adds a poetry blixvalidatewheel command that validates a wheel file contains the Required Dist as specified in pyproject.toml/poetry.lock

validatedocker.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

poeblix's People

Contributors

chdemko avatar hennk avatar pablohn26 avatar sduenas avatar spoorn avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

poeblix's Issues

Support different versions of the same package installed based on the `markers` in the `--only-lock` mode

For example, I have in my pyproject.toml:

torch = [
  { version = "==2.0.1", source = "pypi", markers = "sys_platform != 'linux' or platform_machine == 'aarch64'" },
  { version = "==2.0.1+cpu", source = "pytorch-cpu", markers = "sys_platform == 'linux' and platform_machine != 'aarch64'" }
]
torchvision = [
  { version = "==0.15.2", source = "pypi", markers = "sys_platform != 'linux' or platform_machine == 'aarch64'" },
  { version = "==0.15.2+cpu", source = "pytorch-cpu", markers = "sys_platform == 'linux' and platform_machine != 'aarch64'" }
]

And poetry build generates:

Requires-Dist: torch (==2.0.1) ; sys_platform != "linux" or platform_machine == "aarch64"
Requires-Dist: torch (==2.0.1+cpu) ; sys_platform == "linux" and platform_machine != "aarch64"
Requires-Dist: torchvision (==0.15.2) ; sys_platform != "linux" or platform_machine == "aarch64"
Requires-Dist: torchvision (==0.15.2+cpu) ; sys_platform == "linux" and platform_machine != "aarch64"

But poetry blixbuild --only-lock generates (when built on macOS):

Requires-Dist: torch (==2.0.1)
Requires-Dist: torchvision (==0.15.2)

poetry blixbuild includes both versions, but I would love to fix all the versions to the ones specified in the poetry.lock and have the wheel installable on both Linux and non-Linux OSes.

Non-normalized package names in `pyproject.toml` result in duplicate dependencies in METADATA

When using poetry blixbuild, the following dependencies:

[tool.poetry.dependencies]
python = "^3.11"
"ruamel.yaml" = "^0.17.21"

result in

Requires-Dist: ruamel-yaml (==0.17.40)
Requires-Dist: ruamel-yaml-clib (==0.2.8)
Requires-Dist: ruamel.yaml (>=0.17.21,<0.18.0)

while

[tool.poetry.dependencies]
python = "^3.11"
"ruamel-yaml" = "^0.17.21"

results in

Requires-Dist: ruamel-yaml (>=0.17.21,<0.18.0)
Requires-Dist: ruamel-yaml-clib (==0.2.8)

Support distribution with different locks (feature)

I am wondering if we could create poeblix lock. I have the following use case in mind.

  • In the pyproject.toml file, I want to have the packages that I need. I prefer to keep them open ended. Specifying a max version here makes people lazy and stops incremental progress.
  • As long as it gives me a single lock pyproject.toml for a working development environment, it is great to work with. When something new is needed, people can run poetry update to move onward.
  • When I build a package to be used at a single point, poeblix build --only-lock works great. It pins dependencies from the lock file.
  • However, sometimes I want to be much more flexible, but I don't trust just poeblix build: either the oldest dependency formulated in pyproject.toml might no longer work, or a new one might introduce breaking changes. Essentially, I want to be able to create multiple lock files, and use these with a tool like tox.
    poeblix lock python[5] pandas[3] numpy[2]
    • Python[5]: I want to test at most 3 python versions (low, some majors in between, latest)
    • Pandas[3]: I want to test at most 3 pandas versions (low, middle, max)
    • numpy[2]: I want to test at most 2 numpy versions (low, max)
  • After this poeblix build uses dependencies within the ranges defined above.

Please let me know if this use case makes sense, and if you would be interested to solve this with poeblix.

Test fails with Python 3.11

The test_positive_with_groups fails under Python 3.11 as 2 dependencies (exceptiongroup and tomli) are only included in Python <= 3.10.

❯ pytest test_walkthrough.py 
============================================================================================================ test session starts =============================================================================================================
platform linux -- Python 3.11.5, pytest-7.4.2, pluggy-1.2.0 -- /home/user/code/poeblix/venv311/bin/python
cachedir: .pytest_cache
rootdir: /home/user/code/poeblix
configfile: pyproject.toml
plugins: pspec-0.0.4, cov-4.1.0
collected 9 items                                                                                                                                                                                                                            

test_walkthrough.py::::test_positive_happy_case_example PASSED                                                                                                                                                                         [ 11%]
test_walkthrough.py::::test_positive_with_groups FAILED                                                                                                                                                                                [ 22%]
test_walkthrough.py::::test_positive_no_lock PASSED                                                                                                                                                                                    [ 33%]
test_walkthrough.py::::test_positive_only_lock PASSED                                                                                                                                                                                  [ 44%]
test_walkthrough.py::::test_negative_incompatible_lock_options PASSED                                                                                                                                                                  [ 55%]
test_walkthrough.py::::test_negative_missing_from_project PASSED                                                                                                                                                                       [ 66%]
test_walkthrough.py::::test_negative_missing_from_wheel PASSED                                                                                                                                                                         [ 77%]
test_walkthrough.py::::test_negative_missing_data_files PASSED                                                                                                                                                                         [ 88%]
test_walkthrough.py::::test_negative_missing_data_files_from_project PASSED                                                                                                                                                            [100%]/home/user/code/poeblix/venv311/lib/python3.11/site-packages/coverage/inorout.py:507: CoverageWarning: Module poeblix was never imported. (module-not-imported)
  self.warn(f"Module {pkg} was never imported.", slug="module-not-imported")
/home/user/code/poeblix/venv311/lib/python3.11/site-packages/coverage/control.py:883: CoverageWarning: No data was collected. (no-data-collected)
  self._warn("No data was collected.", slug="no-data-collected")


================================================================================================================== FAILURES ==================================================================================================================
_________________________________________________________________________________________________________ test_positive_with_groups __________________________________________________________________________________________________________

    def test_positive_with_groups():
        cwd = "positive_cases/happy_case_example"
        # Build
        subprocess.check_call(["poetry", "blixbuild", "--with-groups=integ,dev", "-vvv"], cwd=cwd)
    
        # Validate wheel
        subprocess.check_call(
            ["poetry", "blixvalidatewheel", "--with-groups=integ,dev", "dist/blixexample-0.1.0-py3-none-any.whl"], cwd=cwd
        )
    
        path = os.path.join(cwd, "dist/blixexample-0.1.0-py3-none-any.whl")
        metadata = pkginfo.get_metadata(path)
    
        # Validate wheel metadata
        expected = {
            "SQLAlchemy (==2.0.15)",
            "greenlet (==2.0.2)",
            'gunicorn (>=19.9.0,<20.0.0) ; extra == "gunicorn"',
            "nemoize (>=0.1.0,<0.2.0)",
            "numpy (==1.24.3)",
            "pandas (==1.4.2)",
            "python-dateutil (==2.8.2)",
            "six (==1.16.0)",
            "flake8 (==4.0.1)",
            "iniconfig (==2.0.0)",
            "mccabe (==0.6.1)",
            "packaging (==23.1)",
            "pluggy (==1.0.0)",
            "pycodestyle (==2.8.0)",
            "pyflakes (==2.4.0)",
            "exceptiongroup (==1.1.1)",
            "pytest (==7.3.1)",
            "pytz (==2023.3)",
            "tomli (==2.0.1)",
            "typing-extensions (==4.6.2)",
        }
    
        # These dependencies are only on Windows
        if os.name == "nt":
            expected.add("colorama (==0.4.6)")
    
        missing = []
        for package in metadata.requires_dist:
            if package in expected:
                expected.remove(package)
            else:
                missing.append(package)
    
        assert len(missing) == 0, f"{missing} packages were not in expected {expected}"
>       assert len(expected) == 0, f"Wheel is missing Required-Dist: {expected}"
E       AssertionError: Wheel is missing Required-Dist: {'tomli (==2.0.1)', 'exceptiongroup (==1.1.1)'}
E       assert 2 == 0
E        +  where 2 = len({'exceptiongroup (==1.1.1)', 'tomli (==2.0.1)'})

test_walkthrough.py:91: AssertionError
------------------------------------------------------------------------------------------------------------ Captured stdout call ------------------------------------------------------------------------------------------------------------
Using virtualenv: /home/user/code/poeblix/venv311
Building blixexample (0.1.0)
Adding data_files=[{'destination': 'share/data/', 'from': ['data_files/test.txt', 'data_files/anotherfile']}, {'destination': 'share/data/threes', 'from': ['data_files/athirdfile']}]
  - Building wheel
Ignoring: 
  - Adding: /home/user/code/poeblix/test/positive_cases/happy_case_example/src/blixexample/__init__.py
  - Adding: /home/user/code/poeblix/test/positive_cases/happy_case_example/src/blixexample/main.py
Adding dependencies from lock file to wheel build
Resolving dependencies using poetry's solver to get rid of unneeded packages
Adding resolved dependencies to wheel METADATA
Adding to Wheel Requires Dist: [<Install greenlet (2.0.2)>, <Update mccabe (0.7.0) to mccabe (0.6.1)>, <Install numpy (1.24.3)>, <Update packaging (23.2) to packaging (23.1)>, <Update pluggy (1.3.0) to pluggy (1.0.0)>, <Update pycodestyle (2.11.1) to pycodestyle (2.8.0)>, <Update pyflakes (3.1.0) to pyflakes (2.4.0)>, <Install python-dateutil (2.8.2)>, <Install pytz (2023.3)>, <Update typing_extensions (4.8.0) to typing-extensions (4.6.2)>, <Update flake8 (6.1.0) to flake8 (4.0.1)>, <Install gunicorn (19.10.0)>, <Install iniconfig (2.0.0)>, <Install nemoize (0.1.0)>, <Install pandas (1.4.2)>, <Update pytest (7.4.3) to pytest (7.3.1)>, <Install six (1.16.0)>, <Install sqlalchemy (2.0.15)>]
Skipping: /home/user/code/poeblix/test/positive_cases/happy_case_example/COPYING
Skipping: /home/user/code/poeblix/test/positive_cases/happy_case_example/LICENSE
Adding data_files to WHEEL data folder
Copying data files from /home/user/code/poeblix/test/positive_cases/happy_case_example/data_files/test.txt to /tmp/tmp2fudle84/blixexample-0.1.0.data/data/share/data/test.txt
Copying data files from /home/user/code/poeblix/test/positive_cases/happy_case_example/data_files/anotherfile to /tmp/tmp2fudle84/blixexample-0.1.0.data/data/share/data/anotherfile
Copying data files from /home/user/code/poeblix/test/positive_cases/happy_case_example/data_files/athirdfile to /tmp/tmp2fudle84/blixexample-0.1.0.data/data/share/data/threes/athirdfile
Copying file from /tmp/tmp2fudle84/blixexample-0.1.0.data/data/share/data/anotherfile to wheel relative blixexample-0.1.0.data/data/share/data/anotherfile
Copying file from /tmp/tmp2fudle84/blixexample-0.1.0.data/data/share/data/test.txt to wheel relative blixexample-0.1.0.data/data/share/data/test.txt
Copying file from /tmp/tmp2fudle84/blixexample-0.1.0.data/data/share/data/threes/athirdfile to wheel relative blixexample-0.1.0.data/data/share/data/threes/athirdfile
  - Built blixexample-0.1.0-py3-none-any.whl
Validating Requires Dist for wheel [dist/blixexample-0.1.0-py3-none-any.whl] against pyproject.toml/poetry.lock
Validating against pyproject.toml...
Validating against poetry.lock...
Validating data_files in wheel file contain those specified in pyproject.toml
Validation succeeded!

---------- coverage: platform linux, python 3.11.5-final-0 -----------
Name                                                                                        Stmts   Miss Branch BrPart  Cover   Missing
---------------------------------------------------------------------------------------------------------------------------------------
/home/user/code/poeblix/venv311/lib/python3.11/site-packages/poeblix/__init__.py             0      0      0      0   100%
/home/user/code/poeblix/venv311/lib/python3.11/site-packages/poeblix/plugins.py            121      5     44      6    93%   67, 70, 158->184, 165, 244->256, 252-253, 284->exit
/home/user/code/poeblix/venv311/lib/python3.11/site-packages/poeblix/util/__init__.py        0      0      0      0   100%
/home/user/code/poeblix/venv311/lib/python3.11/site-packages/poeblix/util/util.py           30      0     10      2    95%   28->27, 32->34
/home/user/code/poeblix/venv311/lib/python3.11/site-packages/poeblix/validatedocker.py      50     33     18      0    25%   49-58, 64-82, 88-106
/home/user/code/poeblix/venv311/lib/python3.11/site-packages/poeblix/validatewheel.py      110      6     48      5    93%   17-18, 78->102, 122, 155, 168, 177
---------------------------------------------------------------------------------------------------------------------------------------
TOTAL                                                                                         311     44    120     13    83%

Required test coverage of 80% reached. Total coverage: 82.60%
========================================================================================================== short test summary info ===========================================================================================================
FAILED test_walkthrough.py::::test_positive_with_groups - AssertionError: Wheel is missing Required-Dist: {'tomli (==2.0.1)', 'exceptiongroup (==1.1.1)'}
======================================================================================================== 1 failed, 8 passed in 21.26s ========================================================================================================

Destination path in data_files is absolute

I have a config that looks like this

[tool.blix.data]
data_files = [
    { destination = "/etc/jupyter/jupyter_server_config.d/", from = [ "jupyter-config/jupyter_server_config.d/jupyter_workspace_extensions.json" ] },
]

When I run poetry blixbuild I get the error

Destination path in data_files [/etc/jupyter/jupyter_server_config.d/] is absolute.  Please change it to a relative path

I need to copy the config file to /etc , which will always be absolute path, how do I achieve capability using this plugin ?

Example for usage for Jupyter Extensions

I don't really know which files need to be installed where for jupyter extensions to work (I'm currently using the pretty intransparent "magically working" build via jupyter-packaging), so could you please include an example configuration for this use-case?

Using --only-lock removes extras information

When package has optional extra dependencies

[tool.poetry.dependencies]
gunicorn = { version = "^19.9.0", optional = true }
[tool.poetry.extras]
gunicorn = ["gunicorn"]

the default build step produces correct metadata

Provides-Extra: gunicorn
Requires-Dist: gunicorn (>=19.9.0,<20.0.0); extra == "gunicorn"

When building with --only-lock flag the extra information is missing

Provides-Extra: gunicorn
Requires-Dist: gunicorn (==19.10.0)

Missing LICENSE

I've noticed your project doesn't have a license. By default, that means nobody can use/copy/distribute your software without your permission.
I suggest you should add one LICENSE, probably a free/open source license, so everybody can benefit from that. If you are not sure which one choose, I recommend to use the same one that is used by poetry - I think it's MIT - so there are no incompatibilities when people use it or package with your project.

Doesn't work with poetry 1.4 (2023-02-27)

Poeblix fails with newest version of poetry:

cannot import name 'Pool' from 'poetry.repositories' (/usr/local/lib/python3.8/site-packages/poetry/repositories/__init__.py)

`poetry plugin add` doesn't work with poetry > 1.3.2

When using the poetry plugin add poeblix command on poetry 1.3.2 I get:

☠ poetry plugin add poeblix

The command "plugin" does not exist.

Did you mean this?
    self show plugins

It would seem the right way to do it is the following :

poetry self add poeblix

poeblix does not properly handle dependencies that include uppercase letters

Some Python packages, for example, SQLAlchemy, PyMuPDF, Flask and others, have a name that includes some uppercase letters. This is normally not a problem, because pip and poetry both correctly handle such dependencies regardless of whether you use the all-lowercase name or the "official" mixedcase name, and treat both names as one dependency.

However, this is not the case for poeblix. Considering a simple Poetry package that has the following pyproject.toml:

[tool.poetry]
name = "example-package"
version = "0.0.0"
description = "An example package demonstrating poeblix issue"
authors = ["John Smith <[email protected]>"]

[tool.poetry.dependencies]
python = "^3.10"
requests = "^2.28.2"
SQLAlchemy = "^2.0.9"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

Poetry correctly installs both dependencies, with all dependencies, including SQLAlchemy, being written in lowercase in poetry.lock. When generating a wheel with default poetry build, it correctly specifies both dependencies in their original casing:

Requires-Dist: SQLAlchemy (>=2.0.9,<3.0.0)
Requires-Dist: requests (>=2.28.2,<3.0.0)

When generating a wheel with poetry blixbuild, however, the requests dependency (which has been written in lowercase) is correctly processed, while the SQLAlchemy dependency is duplicated, once with loose requirements and original casing from pyproject.toml, and once with strict version and in lowercase from poetry.lock:

Requires-Dist: SQLAlchemy (>=2.0.9,<3.0.0)
Requires-Dist: certifi (==2022.12.7)
Requires-Dist: charset-normalizer (==3.1.0)
Requires-Dist: greenlet (==2.0.2)
Requires-Dist: idna (==3.4)
Requires-Dist: requests (>=2.28.2,<3.0.0)
Requires-Dist: sqlalchemy (==2.0.9)
Requires-Dist: typing-extensions (==4.5.0)
Requires-Dist: urllib3 (==1.26.15)

Additionally, when generating a wheel with poetry blixbuild --only-lock, only the lowercase version from poetry.lock is included (which is expected), however, this causes the validation to fail:

Requires-Dist: certifi (==2022.12.7)
Requires-Dist: charset-normalizer (==3.1.0)
Requires-Dist: greenlet (==2.0.2)
Requires-Dist: idna (==3.4)
Requires-Dist: requests (==2.28.2)
Requires-Dist: sqlalchemy (==2.0.9)
Requires-Dist: typing-extensions (==4.5.0)
Requires-Dist: urllib3 (==1.26.15)
$ poetry blixvalidatewheel dist/example_package-0.0.0-py3-none-any.whl
Validating Requires Dist for wheel [dist/example_package-0.0.0-py3-none-any.whl] against pyproject.toml/poetry.lock
Validating against pyproject.toml...
Packages in pyproject.toml are not present in the Wheel file: ['SQLAlchemy']

I think the solution for this would be to make poeblix treat all case variations of the dependency name as one dependency. This could be probably done by "normalizing" all of them to an all-lowercase name.

Error using [email protected]

Hello,

running poetry blixbuild breaks and doesn't work with the latest version of poetry ([email protected])

[tool.blix.data] section not found in /build/pyproject.toml, no data_files to process
__init__() missing 1 required positional argument: 'name'
error building image: error building stage: failed to execute command: waiting for process to exit: exit status 1

Cheers

Python 3.8 compatibility

Hello 😄

First of all thanks for the plugin! I was wondering if it could be compatible with Python 3.8

Thanks!

Dependency with source parameter

I've been working with a project that uses poetry (1.6.1) as package manager. We have defined two package sources in pyproject.toml:

`[[tool.poetry.source]]
name = "PyPI"
priority = "primary"

[[tool.poetry.source]]
name = source_name
url = my_pypi_url
priority = "default"`

As we want to keep all dependencies' versions in wheel from a lockfile, we decide to use poeblix (0.10.0). I want to run poetry blixbuild --only-lock, but console tells me that my source_name repository doesn't exist. I debugged this issue and it seems that if dependency has source parameter passed, then blixbuild is failing. The situation doesn't occur when use poetry build.

When I removed source from package dependency definition, build has passed.

Do you know about this issue or have plan to fix it?

sources

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.