Skip to content

feat(content): gemeinsamer Integritäts-Mixin für Blob & DataFrame (RFC 0004, Option B)#74

Merged
lepy merged 1 commit into
masterfrom
feat/content-integrity-mixin
Jun 29, 2026
Merged

feat(content): gemeinsamer Integritäts-Mixin für Blob & DataFrame (RFC 0004, Option B)#74
lepy merged 1 commit into
masterfrom
feat/content-integrity-mixin

Conversation

@lepy

@lepy lepy commented Jun 29, 2026

Copy link
Copy Markdown
Owner

Setzt RFC 0004, Option B um: ein gemeinsamer Integritäts-/Hash-Layer für Blob und DataFrame — ohne Vererbung untereinander (RFC-Befund: das fixe-Blob-Modell passt nicht auf die lebende, mehrformatige Tabelle).

Was

  • ContentIntegrityMixin (sdata/sclass/content.py): sha1/md5/sha256/size + update_checksum/verify über einen content_bytes-Hook + self.metadata.
  • Blob(ContentIntegrityMixin, Base) — die Hash-/verify-/size-Methoden aus blob.py in den Mixin extrahiert (Verhalten identisch; Blob-Tests unverändert grün).
  • DataFrame(ContentIntegrityMixin, Base) — erbt sha256/verify/size/update_checksum; content_bytes = reines Daten-Parquet (self.df.to_parquet(), ohne _sdata-Embedding).

Stolperfalle (gefixt)

Mit content_bytes = self.to_parquet() (mit eingebetteten Metadaten) wäre verify() selbstreferenziell: update_checksum() schreibt die checksum in die Metadaten → diese landen im Parquet → der nächste sha256 wäre anders. Lösung: über die Daten hashen (self.df.to_parquet()), nicht über die Metadaten.

Tests / Coverage

tests/test_sclass_dataframe_integrity.py (sha256/sha1/md5/size, verify match/mismatch, content_bytes == df.to_parquet()). Kanonische CI grün; content.py/blob.py/dataframe.py je 100 %; mkdocs build --strict exit 0.

RFC 0004: Option B umgesetzt; offen nur noch Option C (DataFrame.as_blob(fmt)).

…C 0004, Option B)

ContentIntegrityMixin (sdata/sclass/content.py): sha1/md5/sha256/size +
update_checksum/verify über einen content_bytes-Hook + self.metadata.

- Blob(ContentIntegrityMixin, Base): die Hash-/verify-/size-Methoden aus blob.py in
  den Mixin extrahiert (Verhalten identisch, Blob-Tests unverändert grün).
- DataFrame(ContentIntegrityMixin, Base): erbt sha256/verify/size; content_bytes =
  reines Daten-Parquet (self.df.to_parquet(), OHNE _sdata-Embedding). Wichtig: der
  Hash erfasst die Daten, nicht die Metadaten -> update_checksum (schreibt checksum
  in die Metadaten) verändert den Hash nicht (Selbstreferenz vermieden).
- Keine Vererbung Blob<->DataFrame (RFC-0004-Befund: das fixe-Blob-Modell passt nicht
  auf die lebende, mehrformatige Tabelle); gemeinsamer Layer per Mixin.
- Tests: tests/test_sclass_dataframe_integrity.py (sha256/size, verify match/mismatch,
  content_bytes == df.to_parquet()). content/blob/dataframe je 100 %.

RFC 0004: Option B umgesetzt; offen Option C (DataFrame.as_blob).
@lepy lepy merged commit e53a58f into master Jun 29, 2026
@lepy lepy deleted the feat/content-integrity-mixin branch June 29, 2026 13:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant