- 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.
36 lines
1.2 KiB
Python
36 lines
1.2 KiB
Python
"""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})
|