Co to znamená
share/events.yaml deklaruje každý název události, který ledger přijímá, příkaz, který ji zapisuje, a klíče payloadu, které musí nést. Zápis neregistrovaného názvu je odmítnut. Filtrování podle něj je odmítnuto. Uložený řádek, který jej nese, je nahlášen.
Toto je vlastní pravidlo repozitáře — neznámý konfigurační klíč je chyba — aplikované na jeho vlastní trvalé záznamy, které byly dosud od něj vyňaty.
Princip
mj_ledger_append načte registr a odmítne dvě věci jako vnitřní chyby: jméno, které registr nedeklaruje, a registrované jméno, jehož payload postrádá klíč, který ten záznam vyžaduje. Jsou to vnitřní chyby, a ne zjištění, protože příkaz zapisující událost, kterou slovník nedefinuje, je chyba v Majordomus, a ne fakt o dohlíženém repozitáři.
history --event <name> odmítne neregistrované jméno místo odpovědi „žádné odpovídající události“, což je odpověď, kterou by dalo i registrované jméno, které nenastalo; filtr, který tyto dvě věci nerozliší, není filtr. history --validate hlásí každý uložený řádek, jehož jméno nezná žádný čtenář.
test/cases/33_event_registry.sh drží čtyři věci vůči sobě: registr, místa volání mj_ledger_append, vykreslení v lib/history.sh a tabulku v docs/SCHEMAS.md. Jméno v kterékoli z nich, které chybí v ostatních, způsobí selhání.
Názvy jsou zaregistrovány přesně tak, jak už byly napsány, včetně nekonzistentních. Přejmenování by rozbilo každý existující ledger, včetně vlastního ledgeru tohoto repozitáře, a čtenář, který tiše vynechá vše před přejmenováním, je horší než nekonzistentní název.
Jak to vidět
majordomus history --event task.startd # exit 2, and lists the names that exist
majordomus history --validate # exit 10 on a line no reader recognises
sed -n 's/^ - id: //p' share/events.yamlCo nepokrývá
Validace payloadu kontroluje, že povinný klíč je přítomen, ne že jeho hodnota dává smysl. Události zapsané před vznikem registru se nemigrují — nemusí, protože registr deklaruje názvy, které se už používaly.
Odmítnuté finish se stále nezaznamenává. Přijaté dokončení se zapíše a odmítnutí nezanechá stopu, takže úloha odmítnutá čtyřikrát je v ledgeru nerozlišitelná od té, která prošla napoprvé. To je chybějící událost, ne neověřená, a test/cases/32_refusal_lifecycle.sh nese tvrzení, které bude platit, až bude existovat.
Proč existuje
mj_ledger_append přijímal libovolný řetězec. Překlepnutý název vyrobil trvalý záznam jen pro připojování, který každý čtenář tiše přeskakoval — nejhorší druh selhání u záznamu, jehož účelem je umožnit někomu rekonstruovat, co se stalo. docs/SCHEMAS.md dokumentoval událost bootstrap s polem reason už od doby, kdy kniha neměla čtenáře, a nic ji nikdy nezapsalo.