[build-system] requires = ["setuptools>=68"] build-backend = "setuptools.build_meta" [project] name = "uj-mastering-master" version = "0.1.0" requires-python = ">=3.10" # Only what the *analysis* needs. The GUI stack lives in the `desktop` extra # below, because nothing on the web path touches it: `webapp.py`, # `web_session.py`, `metrics_json.py`, `master_core.py`, `metrics.py` and # `plotspec.py` import no Qt, no pyqtgraph and no matplotlib canvas. Keeping # PyQt5 here would force a `--headless`-style install to drag in a full Qt # stack it never loads. dependencies = [ "librosa", "numpy", "matplotlib", # librosa dependency, and colormaps for the colormap helper "mutagen", "pyloudnorm", ] license = {text = "Apache-2.0"} [project.optional-dependencies] # Desktop GUI. Installed with: # uv sync --extra desktop (or `uv sync --all-extras`) desktop = [ "PyQt5>=5.15.10", # 5.15.2 is the only pyqt5-qt5 release with a Windows wheel; later # versions are Linux/macOS only. "PyQt5-Qt5==5.15.2 ; sys_platform == 'win32'", "pyqtgraph>=0.14.0", ] # Web front end. Installed with: # uv sync --extra web # Deliberately separate from the desktop path: a server install of the web UI # needs no Qt/wheel stack. Which is what makes the container image small and # lets it run without a display server at all. web = [ "fastapi>=0.110", "uvicorn[standard]>=0.27", "python-multipart>=0.0.9", # multipart upload parsing for FastAPI ] [tool.uv] # Note: `default-groups` cannot name an entry from `[project.optional-dependencies]` # — it only accepts `[dependency-groups]` names, and errors with "Default group # `desktop` ... is not defined in the project's `dependency-groups` table". # Extras must be requested explicitly, which is why the README spells out both: # uv sync # analysis + nothing else # uv sync --extra desktop # + Qt/pyqtgraph (the GUI; `uv run ujm`) # uv sync --extra web # + fastapi/uvicorn (`uv run ujm-web`) # uv sync --all-extras # both [project.scripts] ujm = "main:main" ujm-web = "webapp:main" [tool.setuptools] py-modules = [ "main", "analysis_results_manager", "audio_visualization_widget", "master_core", "metrics", "plotspec", "font_manager", "plot_control_widget", "ref_line_widget", "logger_setup", "setup_fonts", # web front end "webapp", "web_session", "metrics_json", ] # `static/` is declared a *package* so `package-data` has something to attach # to. `package-data` keys match packages, and top-level `py-modules` are not # packages — so the earlier `"*" = [...]` form silently matched nothing and the # built wheel contained no assets at all (verified: 14 .py files, zero HTML/ # JS/CSS). An installed `ujm-web` therefore 404'd every asset. With this entry # the assets install to `site-packages/static/`, which is exactly where # `webapp.py` looks (`Path(__file__).parent / "static"`). packages = ["static"] [tool.setuptools.package-data] # Vendored browser assets: uPlot (curves), no CDN at runtime. Keyed on the # `static` package (declared above) rather than `"*"`: a `"*"` key matches # *packages*, and there are none besides `static` — the app modules are # top-level `py-modules`, which is why the original form shipped nothing. # # `**/*` rather than `*` so the glob reaches `static/vendor/`, where the uPlot # bundle lives. static = ["*", "**/*"]