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:
catarrh committed 2026-10-20 23:06:33 +03:00
1 parent 4a03f83459
commit 25aa87ba1e
11 files changed
+196 -16

No files matched your search

+16 -4
View File
@@ -16,10 +16,20 @@ from .capture import CaptureManager, GsmtapListener, DirectSniffer
from .version import __version__
def _pick_web_dir(package_dir, repo_root):
"""The installed package's bundled PWA first, then the source checkout."""
packaged = os.path.join(package_dir, 'web')
if os.path.isfile(os.path.join(packaged, 'index.html')):
return packaged
return os.path.join(repo_root, 'frontend')
def _default_web_dir():
# <repo>/frontend, whether run from source or an editable install.
# __file__ is <repo>/simtrace_analyser/__main__.py → up two levels.
return os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'frontend')
# A wheel/sdist install carries simtrace_analyser/web (copied there by
# setup.py); an editable install and a plain source run fall through to
# <repo>/frontend. __file__ is <repo>/simtrace_analyser/__main__.py.
pkg_dir = os.path.dirname(os.path.abspath(__file__))
return _pick_web_dir(pkg_dir, os.path.dirname(pkg_dir))
def main():
@@ -42,7 +52,9 @@ def main():
p.add_argument('--log-requests', action='store_true', default=False,
help='Log every HTTP request (off by default)')
p.add_argument('--web-dir', default=_default_web_dir(), metavar='PATH',
help='Directory with the simtrace-analyser PWA static files to serve (default: <repo>/frontend)')
help='Directory with the simtrace-analyser PWA static files to serve '
'(default: the PWA bundled in the installed package, '
'or <repo>/frontend in a source checkout)')
args = p.parse_args()
db = Database(args.db)