Files
simtrace-analyser/setup.py
T
catarrh 25aa87ba1e 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.
2026-10-20 23:06:33 +03:00

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})