mirror of
https://github.com/jhd3197/ServerKit.git
synced 2026-11-09 05:24:49 +09:00
With the remote index memoized, re-parsing every bundled YAML on each call was the entire remaining cost of a Templates page load. Entries are now memoized per file and keyed on (st_mtime_ns, st_size), so a sync or an edit invalidates exactly the file that changed: measured on the real catalog, list_local_templates() goes from 304ms to 0.89ms (118 templates), and the full catalog listing from 1707ms to 1.26ms. The writers need no invalidation call - mtime keying covers create, overwrite and delete, the last because the listing only returns what the directory scan finds. Cache entries are pruned to what is still on disk so a long-running panel that churns templates cannot grow it without bound. Failed parses are cached too, keyed on the same stat tuple, so one malformed YAML no longer costs a parse on every render; it is retried the moment the file changes. A file that fails to parse still does not claim its id, so a valid file of the same name in the fallback directory can supply it - pinned by a test, since that is easy to lose in a refactor. Entries are deep-copied out: a shallow copy would share the nested categories/repo/engine containers, so a caller appending to categories would corrupt every later listing. Also swaps os.listdir for os.scandir (DirEntry.stat() reuses data the scan already returned) and sorts directory entries, which makes a same-id collision (foo.yaml vs foo.yml) resolve identically on every platform instead of depending on filesystem order.