Skip to content

RFC 0008 — Umsetzungsstand (Arbeitscheckliste)

Arbeitsstand zur Roadmap aus RFC 0008. Diese Datei ist die Wahrheitsquelle für den Umsetzungs-Loop: pro Iteration wird genau ein offener Punkt vollständig umgesetzt und hier abgehakt ([x] + PR/Commit).

Abgeschlossen (2026-07-02). Alle Punkte aus Paket A, B und C sind umgesetzt und gemergt (PRs #94–#115). Verbleibende, bewusst nicht in dieser Roadmap enthaltene Arbeit steht im Open-points-Backlog (u. a. Data-Ablösung Stufe 2 für 2.0).

Arbeitsregeln (gelten für jede Iteration)

  1. Genau einen offenen Punkt nehmen — den obersten nicht abgehakten, sofern keine Abhängigkeit dagegen spricht.
  2. Eigener Branch je Punkt (fix/…, chore/…, feat/…, docs/… — Konvention wie bisherige Historie, deutsche Commit-Messages).
  3. make ci muss grün sein, bevor abgehakt wird (bei reinen Doku-/Repo-Punkten: mkdocs build bzw. Plausibilitätsprüfung).
  4. Punkt hier abhaken und Branch/Commit notieren (Häkchen+Protokoll im selben Punkt-PR); PR erstellen. Merge nur auf Nutzer-Anweisung (am 2026-07-02 erteilt: weiter mergen).
  5. Bei Paket-B-Punkten: erst das RFC (Draft) schreiben, erst in der Folge-Iteration implementieren — RFC-Review bleibt Menschensache.
  6. Erst wenn alle Punkte abgehakt sind, endet der Loop.

Paket A — Quick-Fixes (je 1 Iteration)

  • [x] A1 logging.basicConfig entfernen (base.py:20, node.py:9), nur getLogger(__name__) (+ NullHandler im Paket-Init) — PR #94
  • [x] A2 Metadata.from_json: expliziter ValueError bei fehlender Quelle (metadata.py:576–592) + Test — PR #95
  • [x] A3 from_csv konsumiert <sname>.meta.jsonld-Sidecar automatisch (analog image.from_file), Schalter sidecar=False, Roundtrip-Test — PR #96
  • [x] A4 Repo-Hygiene: t/, t.py, db.json, tabulate.py, create_pyc_egg.py, upload_pypi.sh, sdata.data.png, alle .ipynb_checkpoints entfernen; .gitignore um .ipynb_checkpoints/ ergänzen. Hinweis RFC §9: t/secret* bleiben in der Historie — falls echtes Schlüsselmaterial: melden, nicht still entfernen — PR #97; t/secret* als Krypto-Artefakte gemeldet (siehe Protokoll)
  • [x] A5 Tote Konfigs: .travis.yml, setup.cfg löschen; tox.ini löschen oder auf py39–py312 reparieren; greetings.yml konfigurieren oder entfernen — PR #98 (alle vier gelöscht; tox wäre ein paralleler, ungetesteter CI-Pfad neben make ci)
  • [x] A6 "sdata.sclass:Prozess" → englischer Name + BFO_IRIS-Eintrag (process.py:47, vocab.py); mutable defaults process.py:132–137 beheben — PR #99 (BFO_IRIS hatte "Process" bereits; nur Umbenennung nötig)
  • [x] A7 Lizenzaussage konsolidieren (LICENSE-APACHE beilegen oder überall nur MIT deklarieren) — PR #100 (MIT: entspricht LICENSE-MIT + Trove-Classifier; Dual-Lizenz wäre eine bewusste Entscheidung des Maintainers)

Paket B — Folge-RFCs (je Punkt: RFC-Iteration, dann Implementierungs-Iteration(en))

  • [x] B1a RFC 0009 DataFrameReader-Protocol schreiben (Draft) — PR #101
  • [x] B1b RFC 0009 implementieren + Tests (Backends: Parquet/Store/SQL, Symmetrie zu WriteReceipt) — PR #102
  • [x] B2a RFC 0010 Format-Versionierung schreiben (_sdata_format_version, Toleranz-/Migrationsregeln) — PR #103
  • [x] B2b RFC 0010 implementieren (Feld + Prüfung in allen from_*, Migrations-Hook) — PR #104
  • [x] B3a RFC 0011 Persistenz-Konsolidierung schreiben (Store-Zwilling, Vault, DataFrameGroup/write_group) — PR #105
  • [x] B3b-1 RFC 0011 Teil 1: Alt-Store JSONSQLiteStore deprecaten, DataFrameGroup auf Metadata+sclass.DataFrame heben (abwärtskompatibles from_dict), write_group/read_group — PR #106
  • [x] B3b-2 RFC 0011 Teil 2: vault.py entfernen (entwirrt node.py-Node), doppelte reindex weg; omit-Liste bereinigen — PR #107 (vault.py + node.py + test_vault.py entfernt, beide omit-Einträge weg)
  • [x] B4a RFC 0012 Ablösung deprecated.Data schreiben (Migrationstabelle, Deprecation-Stufen) — PR #108
  • [x] B4b RFC 0012 umsetzen Stufe 1: DeprecationWarning + interne Abhängigkeiten portieren (doe.py, iolib/hdf.py, iolib/pud.py) — PR #109 (Warnung nur bei direkter Data()-Instanziierung via type(self) is Data; Subklassen-Port = Stufe 2/2.0; DataFrame als Default-Export)
  • [x] B5a RFC 0013 Packaging-Modernisierung schreiben (PEP 621, Extras, contrib/-Triage) — PR #110
  • [x] B5b RFC 0013 implementieren ([project]-Tabelle, requirements.txt-Rolle, contrib-Entflechtung mit Deprecation-Stufe) — PR #111 (PEP-621-[project] + dynamic version; setup.py/requirements.txt weg; verwaiste contrib attrdict/semver/simple_graph_db entfernt; timeflake bleibt — hat Test)

Paket C — Deklarationen/Doku (je 1 Iteration)

  • [x] C1 README-Designziele triagieren (Tabelle RFC §4): je Ziel Roadmap-Punkt oder explizites Nicht-Ziel; README entsprechend umschreiben — PR #112
  • [x] C2 Sprach-Leitlinie Docstrings/Kommentare festlegen und dokumentieren — PR #113 (docs/conventions.md: Code/Docstrings/User-Docs englisch, RFCs/Commits deutsch erlaubt; Migration nur bei Berührung)
  • [x] C3 Typisierungs-Leitlinie dokumentieren; metadata.py und dtypes.py annotieren — PR #114 (dtypes-Public-API + DtypeSpec/LangString annotiert; Metadata-High-Traffic-Methoden annotiert; Rest per On-Touch)
  • [x] C4 Fehler-Politik (lenient/strict) in README/Docs verankern; strict-Default als 2.0-Kandidat notieren — PR #114 (Abschnitt in docs/conventions.md)
  • [x] C5 Offene Punkte aus RFC 0001–0007 als Issues/Roadmap-Liste erfassen — PR #115 (docs/rfc/open-points.md: erledigt durch 0009–0013 vs. offener Backlog)

Protokoll

Datum Punkt Branch/Commit Anmerkung
2026-07-02 Vorbereitung docs/rfc-0008-bestandsaufnahme RFC 0008 + Checkliste + Nav committet; Branch baut auf der unge-mergten RFC-0007-Doku (c5cd053) auf, damit die Nav konsistent bleibt; PR #93
2026-07-02 A1 fix/logging-basicconfig (PR #94) basicConfig raus aus base.py/node.py/iolib/owncloudfs.py, Modul-Logger in node.py, NullHandler im Paket-Init; did/*-CLI-main() bewusst belassen; make ci grün (100 %)
2026-07-02 A2 fix/metadata-from-json (PR #95) from_json ohne Quelle → ValueError (statt UnboundLocalError); Fallback filepath-fehlt+jsonstr bleibt; 3-Fälle-Test; make ci grün (100 %)
2026-07-02 A3 fix/csv-sidecar-roundtrip (PR #96) from_csv(sidecar=True) merged <stem>.meta.jsonld (Dataset via from_jsonld, Spalten via set_column); to_csv platziert Sidecar neben der CSV; Grenzen: JSON-LD trägt keine description/Spalten-ontology; 6 neue Tests; make ci grün (100 %)
2026-07-02 A4 chore/repo-hygiene (PR #97) 78 Dateien enttrackt (70 .ipynb_checkpoints, t.py, db.json, tabulate.py, create_pyc_egg.py, upload_pypi.sh, sdata.data.png, t/secret1+2); .gitignore +.ipynb_checkpoints//t//db.json. Befund t/secret*: 64-Byte-Zufallsblobs (identisch), daneben untrackte privkey*.pem — Artefakte eines lokalen Krypto-Experiments, versehentlich in eeb7f0b committet; nur enttrackt (--cached), lokal belassen; bleiben in der Git-Historie — falls je produktiv genutzt: rotieren
2026-07-02 A5 chore/dead-configs (PR #98) .travis.yml (toter Provider, doppeltes install:), setup.cfg (nur deprecated [aliases]), tox.ini (py27-envlist, flake8 twine/-Copy-Paste), greetings.yml (unkonfigurierter Platzhalter) gelöscht; keine Referenzen in Makefile/ci/RELEASING/docs; make ci grün (100 %)
2026-07-02 A6 fix/process-topology (PR #99) "sdata.sclass:Prozess""…:Process" (bfo_iri liefert jetzt bfo:BFO_0000015 statt None); create_process_class: mutable defaults ({}/[]) → None-Idiom; manuell verifiziert (Modul in Coverage-omit); make ci grün (100 %)
2026-07-02 A7 chore/license-consolidation (PR #100) setup.py license='MIT' (statt MIT/Apache-2.0), mkdocs.yml copyright: MIT License; nur LICENSE-MIT liegt bei, Classifier war schon MIT-only; falls Dual-Lizenz gewollt: LICENSE-APACHE beilegen und revertieren
2026-07-02 B1a docs/rfc-0009-dataframe-reader (PR #101) RFC 0009 Draft: DataFrameReader-Protocol + BaseDataFrameReader-ABC (Eingangsvertrag via gemeinsamer check_contract-Funktion), ParquetReader/StoreReader/SqlReader (Snapshot vs. fresh), Roundtrip-Gesetze §6; kein GraphReader (Senke ist metadaten-only); Implementierung = B1b
2026-07-02 B1b feat/dataframe-reader-interface (PR #102) sdata/iolib/reader.py (83 Stmts, 100 %): Protocol/ABC + ParquetReader/StoreReader (Selektor suuid→sname→int-ID, iter() überspringt Fremd-Records)/SqlReader (Snapshot ≡; fresh=True kumulativ); check_contract aus dem Writer extrahiert (Delegation, kein API-Bruch); 14 neue Tests decken alle §6-Roundtrip-Gesetze; make ci grün (100 %)
2026-07-02 B2a docs/rfc-0010-format-versioning (PR #103) RFC 0010 Draft: _sdata_format_version (int, getrennt von Paket-_sdata_version), Toleranzregeln (fehlend=v1 / gleich / älter→migrieren / neuer→Warnung bzw. strict→Fehler), ein Choke-Point in from_dict/_restore_from_attrs, Migrations-Treppe (Vorbild PRAGMA user_version); Implementierung = B2b
2026-07-02 B2b feat/format-versioning (PR #104) sdata/format.py (49 Stmts, 100 %): read_format_version/ensure_compatible/register_migration + FormatVersionWarning/IncompatibleFormatError; Base setzt _sdata_format_version=1 (int), Choke-Point in Base.from_dict(+strict)/DataFrame.from_dict/_restore_from_attrs; fehlend=v1 rückwärtskompatibel; 13 Tests inkl. Migrations-Treppe; make ci grün (100 %)
2026-07-02 B3a docs/rfc-0011-persistence-consolidation (PR #105) RFC 0011 Draft: JSON1SQLiteStore kanonisch (Alt-JSONSQLiteStore deprecaten; zlib-Frage explizit, Empfehlung Option B), DataFrameGroup auf Metadata+sclass.DataFrame heben (abwärtskompatibel via RFC-0010-Migration), write_group/read_group-Batch über RFC-0007/0009, vault.py entfernen (empfohlen) statt an Data weiterzuschleppen; Implementierung = B3b
2026-07-02 B3b-1 feat/persistence-consolidation (PR #106) JSONSQLiteStore.__init__DeprecationWarning (zlib bleibt Option B/Nicht-Ziel); DataFrameGroup hält jetzt sclass.DataFrame-Mitglieder (volle Spaltensemantik), from_dict liest neues {sdata}- und Legacy-{parquet,column_metadata}-Layout, API abwärtskompatibel; write_group/read_group (eine Senke/Quelle, Store-Transaktion); alle vier Module 100 %; make ci grün (100 %)
2026-07-02 B3b-2 chore/remove-vault (PR #107) sdata/iolib/vault.py (an deprecated Data, doppelte reindex), sdata/node.py (einziger Vault-Nutzer, von nichts importiert) und tests/test_vault.py entfernt; beide omit-Einträge (node.py/vault.py) raus → weniger ungemessener Code; StoreWriter/StoreReader ersetzen den Vault funktional; make ci grün (100 %)
2026-07-02 B4a docs/rfc-0012-data-deprecation (PR #108) RFC 0012 Draft: Migrationstabelle Data→sclass (1:1 / ersetzt / streichen), Deprecation-Treppe (Stufe 1 = Warnung + DataFrame als Default-Export + interne Nutzer portieren; Stufe 2 = 2.0-Entfernung), Deserialisierung alter Data-Objekte via RFC-0010-Format-Migration; Implementierung = B4b
2026-07-02 B4b feat/data-deprecation-stage1 (PR #109) Data.__init__ warnt bei direkter Instanziierung (type(self) is Data; Subklassen Pud/experiments ungestört — Port = Stufe 2); DataFrame an erste Stelle in __all__/SDATACLS, Data bleibt auflösbar (Deserialisierung); 5 Tests; Import bleibt warnungsfrei; make ci grün (100 %)
2026-07-02 B5a docs/rfc-0013-packaging (PR #110) RFC 0013 Draft: PEP-621-[project] in pyproject.toml (Extras/Metadaten an einem Ort, dynamic=["version"] hält Single Source), requirements.txt entfernen (Extras sind die Wahrheit), contrib-Triage (0-Importer attrdict/semver/timeflake/simple_graph_db raus; 1-Importer je Fall entscheiden); Implementierung = B5b
2026-07-02 B5b feat/packaging-pep621 (PR #111) PEP-621-[project] in pyproject.toml (Extras/Metadaten/Classifiers, dynamic=["version"] via [tool.setuptools.dynamic]); setup.py + requirements.txt entfernt; verwaiste contrib attrdict/semver.py/simple_graph_db raus (0 Importer, keine Tests), MANIFEST bereinigt; timeflake behalten (RFC nannte 0-Importer, aber test_timeflake.py deckt es); RELEASING/docs auf dynamic-Version aktualisiert; Editable-Install + Version verifiziert; make ci grün (100 %)
2026-07-02 C1 docs/readme-goal-triage (PR #112) README „Design goals" → ehrliche Status-Tabelle (implemented/partial/roadmap/non-goal) gemäß RFC 0008 §4; netCDF/datacubes = roadmap, gpg/swmr/posix-paths/tensor-libs/change-management = explizite Nicht-Ziele; reine Doku
2026-07-02 C2 docs/conventions-language (PR #113) docs/conventions.md (+ mkdocs-Nav): Sprach-Leitlinie — Identifier/Docstrings/User-Docs/Kommentare englisch, RFCs/Commits deutsch erlaubt; Migration nur bei Berührung, kein Big-Bang; reine Doku
2026-07-02 C3+C4 docs/conventions-typing-errors (PR #114) conventions.md um Typing- und Fehler-Politik-Abschnitt ergänzt; dtypes.py Public-API + DtypeSpec/LangString typannotiert, Metadata-High-Traffic-Methoden (to_dict/get/get_attr/keys) annotiert; Fehler-Politik lenient/strict verankert, strict-Default als 2.0-Kandidat; make ci grün
2026-07-02 C5 docs/open-points-backlog (PR #115) docs/rfc/open-points.md (+ mkdocs-Nav): Risiko-/Offen-Abschnitte aus RFC 0001–0007 konsolidiert; markiert Erledigtes (Reader=0009, Group-Batch/Vault=0011, Format-Version=0010, logger.warn) vs. offenen Backlog (HDF5-Spaltenattribute, unit_system-Persistenz, Parquet-Verzeichnismodus, Bild-Träger, Data-Stufe-2, contrib-Einzelnutzer); reine Doku — letzter Punkt der RFC-0008-Roadmap