build: consolidate packaging on pyproject.toml and correct the dependency set
The project carried three sets of packaging metadata — pyproject.toml [project], setup.cfg [options] and setup.py kwargs — declaring different dependencies. pyproject.toml wins under any modern backend, so the wheel was correct, but the other two said "Pillow, numpy" and reading either gave the wrong answer about what the library needs. Reduce setup.cfg to its [flake8] section and setup.py to a setup() shim, each pointing at pyproject.toml. Correct the authoritative list while consolidating: - flask was a runtime dependency but is imported only by the fixture HTTP server in tests. Every user was installing Flask, Jinja2, Werkzeug, click, itsdangerous and blinker for nothing. - ebooklib was a runtime dependency and is never imported by the library; epub_reader.py uses zipfile + xml.etree directly. Only the tests use it, to build EPUB fixtures. - requests was declared required but concrete/image.py imports it lazily and degrades gracefully when absent, so it belongs in an extra. - requires-python said >=3.6, which cannot be true: the package uses dataclasses and `from __future__ import annotations`, both 3.7+, and CI tests 3.10/3.12/3.13. Runtime install drops from 7 direct dependencies to 4. Adds test, remote-images and dev extras, and a CI step that installs into an empty venv with only the runtime deps and imports every subpackage — this class of defect is only caught by installing what you ship. Verified: runtime-only install imports all subpackages; `.[test]` runs the full suite, 853 passed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+37
-5
@@ -4,24 +4,56 @@ build-backend = "setuptools.build_meta"
|
||||
|
||||
[project]
|
||||
name = "pyWebLayout"
|
||||
version = "0.1.1"
|
||||
description = "A Python library for HTML-like layout and rendering"
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.6"
|
||||
requires-python = ">=3.10"
|
||||
license = {file = "LICENSE"}
|
||||
authors = [
|
||||
{name = "Duncan Tourolle", email = "duncan@tourolle.paris"}
|
||||
]
|
||||
dynamic = ["version"]
|
||||
classifiers = [
|
||||
"Programming Language :: Python :: 3",
|
||||
"Programming Language :: Python :: 3.10",
|
||||
"Programming Language :: Python :: 3.11",
|
||||
"Programming Language :: Python :: 3.12",
|
||||
"Programming Language :: Python :: 3.13",
|
||||
"License :: OSI Approved :: MIT License",
|
||||
"Operating System :: OS Independent",
|
||||
]
|
||||
dependencies = [
|
||||
"Pillow",
|
||||
"numpy",
|
||||
"pyphen",
|
||||
"beautifulsoup4",
|
||||
"flask",
|
||||
"ebooklib",
|
||||
"requests"
|
||||
]
|
||||
|
||||
[project.urls]
|
||||
Homepage = "https://gitea.tourolle.paris/pyWebLayout"
|
||||
|
||||
[project.optional-dependencies]
|
||||
# Loading images from http(s) URLs. concrete.image imports requests lazily and
|
||||
# degrades to an error message on the image when it is absent, so it is not a
|
||||
# hard requirement.
|
||||
remote-images = ["requests"]
|
||||
test = [
|
||||
"pytest>=6.0",
|
||||
"pytest-cov",
|
||||
"flask", # fixture HTTP server in tests/abstract/test_abstract_blocks.py
|
||||
"werkzeug", # make_server, same fixture
|
||||
"ebooklib", # builds EPUB fixtures; the reader itself uses zipfile + ElementTree
|
||||
"requests", # exercises the remote-images path
|
||||
]
|
||||
dev = [
|
||||
"pyWebLayout[test,remote-images]",
|
||||
"flake8",
|
||||
"coverage-badge",
|
||||
"interrogate",
|
||||
]
|
||||
|
||||
[tool.setuptools.packages.find]
|
||||
include = ["pyWebLayout*"]
|
||||
|
||||
[tool.coverage.run]
|
||||
source = ["pyWebLayout"]
|
||||
branch = true
|
||||
|
||||
Reference in New Issue
Block a user