feat(v5): 5.5.0 — Kern und Oberfläche aufgeteilt, Übersicht und Einstellungen neu, Erst-Einrichtung mit Poster-Kulisse
Commander-Wünsche vom 02.09.2026 vor der Freigabe von 5.4.0 (die deshalb nie veröffentlicht wurde): Kern: kern/index.ts ist nur noch Bootstrap und Router; Dienste in kern/dienste/ (Einstellungen, Werkzeuge, Laufwerke, Erkennung, Vorgänge, Speicher, Benachrichtigung, Automatik), Kontext in kern/kontext.ts, Protokoll-Datei in gemeinsam/protokoll.ts, Platz-Rechnung in gemeinsam/platz.ts. Oberfläche: fenster/App.tsx ist nur noch der Rahmen; bausteine.tsx, dialoge/, uebersicht/ (LaufwerkKachel, KompressionsKarte, SpeicherKarte, VerlaufKarte), einstellungen/ (Karten je Funktion, SprachAuswahl), einrichtung/ (ErstEinrichtung, PosterHintergrund). Neu: Bibliothek weg, dafür Verlauf; Speicher-und-Bilanz-Karte (statfs); LED-Fußleiste; MakeMKV-Kopf in die Einstellungen; Sprach-Chips mit Dropdown statt Allgemeinem Preset; Karten Automatik/Benachrichtigung/Allgemein/Update; Durchsuchen bei Werkzeugen; Arbeitsordner lokal (Encode dort, dann in die Ablage); Platz-Prüfung vor dem Rip (Dialog und Kern); Automatik mit Countdown; Serien-Merker über Discs; Rettungs-Abbild mit Nullen nur nach gesehenen Lesefehlern (kern/rip/rettung.ts, Phase rettet, iso:-Quelle); Warteschlange pausieren; Discord/Telegram-Benachrichtigung; Protokoll-Datei je Tag; Fensterlage 80 % mittig, gemerkt; Erst-Einrichtung in acht Schritten vor dem Poster-Grid. Beweise: 413 Tests (neu: speicher, benachrichtigung, automatik, rettung, fensterlage, protokoll, kleinkram-550), drei Typprüfungen, Klick-Beweis mit 29 Schritten inklusive Erst-Einrichtung (zweiter Start mit RIPPY_START_BEREICH=einrichtung), Bilder beweise/klick/01…09. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5.1
parent
6678c81592
commit
3dc6798c79
@@ -0,0 +1,53 @@
|
||||
// Tests der Protokoll-Datei (gemeinsam/protokoll.ts, 5.5.0): eine Datei je
|
||||
// Tag, Zeile mit Zeitstempel und Quelle, Aufräumen nach 14 Tagen — und
|
||||
// fremde Dateien im Ordner bleiben unangetastet.
|
||||
import { existsSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs'
|
||||
import { tmpdir } from 'node:os'
|
||||
import { join } from 'node:path'
|
||||
import { afterAll, describe, expect, it } from 'vitest'
|
||||
import { Protokoll, protokollDateiname, veraltet, zeitstempel } from '../src/gemeinsam/protokoll'
|
||||
|
||||
const wurzel = mkdtempSync(join(tmpdir(), 'rippy-protokoll-'))
|
||||
afterAll(() => rmSync(wurzel, { recursive: true, force: true }))
|
||||
|
||||
describe('protokollDateiname / zeitstempel / veraltet', () => {
|
||||
it('Name und Stempel sind lokal und zweistellig', () => {
|
||||
const d = new Date(2026, 8, 2, 7, 5, 9)
|
||||
expect(protokollDateiname(d)).toBe('rippy-2026-09-02.log')
|
||||
expect(zeitstempel(d)).toBe('2026-09-02 07:05:09')
|
||||
})
|
||||
it('veraltet: älter als 14 Tage ja, 13 Tage nein, fremde Namen nie', () => {
|
||||
const jetzt = new Date(2026, 8, 20)
|
||||
const namen = ['rippy-2026-09-01.log', 'rippy-2026-09-07.log', 'rippy-2026-09-19.log', 'notizen.txt', 'rippy-alt.log']
|
||||
expect(veraltet(namen, jetzt)).toEqual(['rippy-2026-09-01.log'])
|
||||
expect(veraltet(namen, jetzt, 5)).toEqual(['rippy-2026-09-01.log', 'rippy-2026-09-07.log'])
|
||||
})
|
||||
})
|
||||
|
||||
describe('Protokoll', () => {
|
||||
it('legt den Ordner an, schreibt Zeilen mit Stempel und Quelle, räumt Altes weg', () => {
|
||||
const ordner = join(wurzel, 'logs')
|
||||
let uhr = new Date(2026, 8, 2, 21, 13, 5)
|
||||
const p = new Protokoll(ordner, 'kern', () => uhr)
|
||||
p.schreiben('Datenbank geöffnet: C:\\x\\rippy.db')
|
||||
p.schreiben('zweite Zeile')
|
||||
const datei = join(ordner, 'rippy-2026-09-02.log')
|
||||
expect(existsSync(datei)).toBe(true)
|
||||
const zeilen = readFileSync(datei, 'utf8').trimEnd().split('\n')
|
||||
expect(zeilen).toEqual(['2026-09-02 21:13:05 [kern] Datenbank geöffnet: C:\\x\\rippy.db', '2026-09-02 21:13:05 [kern] zweite Zeile'])
|
||||
|
||||
writeFileSync(join(ordner, 'rippy-2026-08-01.log'), 'alt\n')
|
||||
writeFileSync(join(ordner, 'fremd.txt'), 'bleibt\n')
|
||||
uhr = new Date(2026, 8, 3)
|
||||
expect(p.aufraeumen()).toBe(1)
|
||||
expect(existsSync(join(ordner, 'rippy-2026-08-01.log'))).toBe(false)
|
||||
expect(existsSync(join(ordner, 'fremd.txt'))).toBe(true)
|
||||
expect(existsSync(datei)).toBe(true)
|
||||
})
|
||||
it('ein nicht schreibbarer Ordner kippt nichts — die Fehlschläge werden beim nächsten Erfolg vermerkt', () => {
|
||||
const sperre = join(wurzel, 'datei-statt-ordner')
|
||||
writeFileSync(sperre, 'x')
|
||||
const p = new Protokoll(join(sperre, 'logs'), 'haupt', () => new Date(2026, 8, 2))
|
||||
expect(() => p.schreiben('geht nicht')).not.toThrow()
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user