Packaging: the wheel carries the PWA, so a release install serves the UI (v2.7.10)
- pyproject declared build-backend = "setuptools.backends._legacy:_Backend", which does not exist: `python -m build`, `pip install .` and even `pip install -e .` died with "Backend ... is not available". It is setuptools.build_meta now. - the wheel and sdist carried only the Python packages, and _default_web_dir() resolved <site-packages>/../frontend, so an installed server started fine but answered every static request with 404. setup.py's build_py now copies the checkout's frontend/ into simtrace_analyser/web/ inside the build (the PWA's tests excluded), and _default_web_dir() prefers that packaged copy, falling back to <repo>/frontend for source and editable runs. The source directory is resolved from setup.py (so an sdist build works) and a missing frontend/ fails the build loudly instead of shipping a package without its UI. - MANIFEST.in grafts frontend/ (with the READMEs, the udev rule and the four launch scripts) into the sdist, so a wheel built from the sdist has the PWA. - README (EN/RU): an install-from-a-release section (pipx/pip with the wheel, the direct release URL for pip) and the --web-dir default documented as the bundled PWA, or <repo>/frontend from source. - tests/test_packaging.py pins the packaged-first resolution (including the empty-directory fallback), the source checkout default, the real build backend, the manifest graft and setup.py's bundling. - verified: a fresh venv install from the wheel and from the sdist serve GET / (200, byte-identical index.html, PWA v2.7.10) out of site-packages/simtrace_analyser/web; an editable install still resolves <repo>/frontend. 547 Python + 80 Node tests.
This commit is contained in:
1 parent
4a03f83459
commit
25aa87ba1e
11 files changed
+196
-16
No files matched your search
@@ -0,0 +1,35 @@
|
||||
"""Bundle the PWA into the installed package.
|
||||
|
||||
The metadata lives in pyproject.toml; this file only adds the build step that
|
||||
copies ``frontend/`` into ``simtrace_analyser/web/`` inside the build tree, so
|
||||
a wheel (or an install from it) serves the same UI as a source checkout.
|
||||
``setup.py`` is part of the sdist, and the source directory is resolved
|
||||
relative to this file, so a wheel built from the unpacked sdist gets the PWA
|
||||
too.
|
||||
"""
|
||||
|
||||
import os
|
||||
import shutil
|
||||
|
||||
from setuptools import setup
|
||||
from setuptools.command.build_py import build_py
|
||||
|
||||
HERE = os.path.dirname(os.path.abspath(__file__))
|
||||
WEB_SOURCE = os.path.join(HERE, 'frontend')
|
||||
WEB_TARGET = os.path.join('simtrace_analyser', 'web')
|
||||
|
||||
|
||||
class BuildPy(build_py):
|
||||
def run(self):
|
||||
super().run()
|
||||
if not os.path.isdir(WEB_SOURCE):
|
||||
raise RuntimeError(
|
||||
'the PWA source directory is missing: %s (a build must not '
|
||||
'ship a package without its user interface)' % WEB_SOURCE)
|
||||
target = os.path.join(self.build_lib, WEB_TARGET)
|
||||
shutil.copytree(
|
||||
WEB_SOURCE, target, dirs_exist_ok=True,
|
||||
ignore=shutil.ignore_patterns('tests', '__pycache__', '*.pyc'))
|
||||
|
||||
|
||||
setup(cmdclass={'build_py': BuildPy})
|
||||
Reference in new issue
Block a user