Summary
Since the move from Poetry to the uv build backend, the published source distributions no longer contain the LICENSE file. The file is still present in the repository at each tag — it just never makes it into the sdist (or the wheel metadata).
Reproduction
$ pip download --no-binary :all: --no-deps qcs-api-client==0.26.5 -d .
$ tar tzf qcs_api_client-0.26.5.tar.gz | awk -F/ 'NF<=2'
qcs_api_client-0.26.5/LICENSE # <-- present
qcs_api_client-0.26.5/PKG-INFO
qcs_api_client-0.26.5/README.md
qcs_api_client-0.26.5/pyproject.toml
qcs_api_client-0.26.5/qcs_api_client
$ pip download --no-binary :all: --no-deps qcs-api-client==0.27.6 -d .
$ tar tzf qcs_api_client-0.27.6.tar.gz | awk -F/ 'NF<=2'
qcs_api_client-0.27.6/PKG-INFO # <-- no LICENSE
qcs_api_client-0.27.6/README.md
qcs_api_client-0.27.6/pyproject.toml
qcs_api_client-0.27.6/pyproject.toml.orig
qcs_api_client-0.27.6/qcs_api_client
0.27.7 is affected as well. PKG-INFO also carries no License:, License-Expression: or License-File: field, so there is no license information in the distribution metadata either.
Cause
pyproject.toml declares neither project.license nor project.license-files:
[project]
name = "qcs_api_client"
version = "0.27.6"
description = "A client library for accessing Rigetti QCS API"
include = ["qcs_api_client/py.typed"]
readme = "README.md"
requires-python = ">=3.10,<4.0"
Poetry used to include LICENSE implicitly. uv_build does not — it only ships what is declared, so with no license-files entry the file is dropped from both the sdist and the wheel's .dist-info.
Impact
Downstream redistributors that build from the sdist have to ship the license text with the package, and they only have the sdist to work from. On conda-forge the recipe fails outright, because license_file: LICENSE cannot be resolved (see conda-forge/qcs-api-client-feedstock#46); we have had to vendor a copy of the Apache-2.0 text into the recipe as a workaround.
More generally, Apache-2.0 §4(a) requires that recipients of the Work be given a copy of the License, so the sdist and wheel are currently not self-consistent with the license they are distributed under.
Suggested fix
Declare the license explicitly in pyproject.toml:
[project]
name = "qcs_api_client"
license = "Apache-2.0"
license-files = ["LICENSE"]
uv_build includes everything matched by project.license-files in both the sdist and the wheel's .dist-info, and the PEP 639 License-Expression / License-File metadata fields then get populated too.
If you would rather not adopt PEP 639 metadata yet, [tool.uv.build-backend] source-include = ["LICENSE"] will at least get the file back into the sdist.
Happy to open a PR if that would help.
Summary
Since the move from Poetry to the uv build backend, the published source distributions no longer contain the
LICENSEfile. The file is still present in the repository at each tag — it just never makes it into the sdist (or the wheel metadata).Reproduction
0.27.7 is affected as well.
PKG-INFOalso carries noLicense:,License-Expression:orLicense-File:field, so there is no license information in the distribution metadata either.Cause
pyproject.tomldeclares neitherproject.licensenorproject.license-files:Poetry used to include
LICENSEimplicitly.uv_builddoes not — it only ships what is declared, so with nolicense-filesentry the file is dropped from both the sdist and the wheel's.dist-info.Impact
Downstream redistributors that build from the sdist have to ship the license text with the package, and they only have the sdist to work from. On conda-forge the recipe fails outright, because
license_file: LICENSEcannot be resolved (see conda-forge/qcs-api-client-feedstock#46); we have had to vendor a copy of the Apache-2.0 text into the recipe as a workaround.More generally, Apache-2.0 §4(a) requires that recipients of the Work be given a copy of the License, so the sdist and wheel are currently not self-consistent with the license they are distributed under.
Suggested fix
Declare the license explicitly in
pyproject.toml:uv_buildincludes everything matched byproject.license-filesin both the sdist and the wheel's.dist-info, and the PEP 639License-Expression/License-Filemetadata fields then get populated too.If you would rather not adopt PEP 639 metadata yet,
[tool.uv.build-backend] source-include = ["LICENSE"]will at least get the file back into the sdist.Happy to open a PR if that would help.