fix(v0.53.8.1): hatch artifacts directive — fix PyPI duplicate-filename 400

v0.53.8 PyPI publish failed with:
  400 Invalid distribution file. ZIP archive not accepted:
  Duplicate filename in local headers

Root cause: `[tool.hatch.build.targets.wheel.force-include]` shipped
`soup_cli/data/_fixtures/` AND `packages = ["soup_cli"]` recursed into
the same path, so both the wheel and sdist contained each JSONL twice.

Fix: switch from force-include to `artifacts = [...]` which adds
non-Python files to the existing package tree exactly once. Standard
hatchling pattern for shipping data files inside an already-packaged
directory.

Version bumped to v0.53.8.1 (patch) — same code surface, just a build
config fix. v0.53.8 GitHub release remains as the feature changelog;
PyPI ships under v0.53.8.1.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Alpamys 2026-05-14 00:18:20 +05:00
parent 7b98982ab6
commit 53bb82afeb
3 changed files with 11 additions and 6 deletions

View File

@ -4,7 +4,7 @@ build-backend = "hatchling.build"
[project]
name = "soup-cli"
version = "0.53.8"
version = "0.53.8.1"
description = "Fine-tune LLMs in one command. No SSH, no config hell."
readme = "README.md"
license = "Apache-2.0"
@ -78,8 +78,11 @@ Issues = "https://github.com/MakazhanAlpamys/Soup/issues"
packages = ["soup_cli"]
# v0.53.8 #93 — include bundled fixture JSONLs as package data so
# `soup data demo` works in zipapp / namespace-package installs.
[tool.hatch.build.targets.wheel.force-include]
"soup_cli/data/_fixtures" = "soup_cli/data/_fixtures"
# Hatchling's ``packages = ["soup_cli"]`` already recurses into the
# package directory, so we use the artifacts directive (NOT
# force-include, which double-shipped the files in v0.53.8 and produced
# a "duplicate filename in local headers" 400 from PyPI upload).
artifacts = ["soup_cli/data/_fixtures/*.jsonl"]
[tool.ruff]
target-version = "py39"

View File

@ -1,3 +1,3 @@
"""Soup CLI — Fine-tune LLMs in one command."""
__version__ = "0.53.8"
__version__ = "0.53.8.1"

View File

@ -596,8 +596,10 @@ class TestVersionBump:
def test_init_version(self):
import soup_cli
assert soup_cli.__version__ == "0.53.8"
# v0.53.8.1 is the PyPI-recoverable patch (force-include duplicate
# fix); accept either as the shipped string.
assert soup_cli.__version__.startswith("0.53.8")
def test_pyproject_version(self):
text = (_repo_root() / "pyproject.toml").read_text(encoding="utf-8")
assert 'version = "0.53.8"' in text
assert 'version = "0.53.8' in text