Files
FabledSteward/tests/test_no_plugin_catalog.py
bvandeusenandClaude Opus 5.5 f67678998c
CI / lint (push) Successful in 3s
CI / integration (push) Failing after 1m12s
CI / unit (push) Successful in 1m25s
CI / publish (push) Skipped
refactor(plugins): no plugin catalog; plugins ship in the image or are mounted (#5374)
First-party plugins have shipped inside the image since a7a281c, and the
catalog's only repository (Steward-plugins) answers 404, so Steward polled a
dead URL every minute for nothing. The operator chose to remove the catalog
entirely (#5214 "Review: readable and fast on the live instance").

Removed:
- core/plugin_index.py and the plugin_catalog_refresh startup task;
- the plugins.index_url default, and migration 0035 deletes the stored
  plugins.index_url / plugins.repositories rows;
- the Settings -> Plugins repository editor, catalog, refresh, install and
  reload routes and their templates;
- the download/checksum/extract install path in plugin_manager, and the
  PLUGIN_INSTALL_DIR config it wrote to;
- plugins/index.yaml, docs/plugins/index.yaml.example and the guide's
  "Publishing to the Catalog" section (now "Shipping a Plugin").

Kept: enabling and configuring plugins, hot-reload on enable, restart, orphan
cleanup, and the external root (/data/plugins) for operator-mounted plugins.
tests/test_no_plugin_catalog.py guards the routes, default and task.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 13:15:55 -04:00

28 lines
1.1 KiB
Python

"""Steward never downloads plugins (Plugin System ruling, 2026-10-08, #5374).
First-party plugins ship in the image; a third-party plugin is a folder the
operator mounts in /data/plugins. So there is no catalog to fetch, no
repository to configure and no install route: each guard below names one of
those and fails if it comes back.
"""
from steward.core.settings import DEFAULTS
def test_no_route_fetches_lists_or_installs_plugins(app):
rules = [r.rule for r in app.url_map.iter_rules()]
assert any(r.startswith("/settings/plugins/") for r in rules) # the page itself is still there
for gone in ("/settings/plugins/catalog", "/settings/plugins/install", "/settings/plugins/repos",
"/settings/plugins/reload"):
assert not [r for r in rules if r.startswith(gone)], gone
def test_no_default_names_a_catalog():
assert not [k for k in DEFAULTS if k.startswith("plugins.")]
def test_no_scheduled_task_fetches_a_catalog(app):
from steward.app import _register_core_tasks
_register_core_tasks(app)
names = [t.name for t in app._task_registry]
assert names and "plugin_catalog_refresh" not in names