af60ca446d
The fabledscryer->steward rename had only ever reached host_agent. The other five bundled plugins (http, snmp, traefik, unifi, docker) still imported `from fabledscryer.*` (package no longer exists) and read FABLEDSCRYER_* env vars — so every one of them was broken at import since the original rebrand. CI stayed green only because none are enabled by default and migrations don't import plugin modules. Now that they version in-tree, complete the rename: - fabledscryer.* -> steward.* imports across all five plugins - FABLEDSCRYER_* -> STEWARD_* in plugin migration env.py files - author/repository/homepage + user-facing 'Fabled Scryer' strings -> Steward - snmp/scheduler.py: also drop dead `now`/datetime; record_metric from steward Adds tests/test_no_legacy_names.py — fails if 'scryer'/'roundtable' ever reappear in shipped code (the drift bit twice; this stops a third time). Also clears pre-existing ruff lint debt (unused imports, semicolon statements, mid-file import) surfaced by the new lint lane. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
36 lines
1.3 KiB
Python
36 lines
1.3 KiB
Python
"""Regression guard: shipped code must not reference old project names.
|
|
|
|
The FabledScryer -> Roundtable -> Steward renames repeatedly left stale package
|
|
imports behind in the (then separate) plugins (e.g. `from fabledscryer.models...`),
|
|
silently breaking every non-host_agent plugin. Now that plugins are folded in-tree
|
|
and version with core, this test fails loudly if either legacy name reappears in
|
|
the shipped Python / templates / plugin manifests.
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
_ROOT = Path(__file__).resolve().parent.parent
|
|
_TREES = [_ROOT / "steward", _ROOT / "plugins"]
|
|
_EXTENSIONS = {".py", ".yaml", ".yml", ".html", ".j2"}
|
|
_FORBIDDEN = ("scryer", "roundtable") # case-insensitive; old project names
|
|
|
|
|
|
def _shipped_files():
|
|
for tree in _TREES:
|
|
for path in tree.rglob("*"):
|
|
if path.suffix in _EXTENSIONS and "__pycache__" not in path.parts:
|
|
yield path
|
|
|
|
|
|
@pytest.mark.parametrize("name", _FORBIDDEN)
|
|
def test_no_legacy_project_name(name):
|
|
offenders = [
|
|
str(p.relative_to(_ROOT))
|
|
for p in _shipped_files()
|
|
if name in p.read_text(encoding="utf-8", errors="ignore").lower()
|
|
]
|
|
assert not offenders, f"legacy name {name!r} found in shipped code: {offenders}"
|