Changeset 37b5d11 in flexoentity


Ignore:
Timestamp:
10/25/25 12:06:04 (3 months ago)
Author:
Enrico Schwass <ennoausberlin@…>
Branches:
master
Children:
c98728b
Parents:
33be5a0
Message:

add guard for allowed_transitions

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • flexoentity/flexo_entity.py

    r33be5a0 r37b5d11  
    230230            return True
    231231        return False
    232    
    233     # ───────────────────────────────────────────────────────────────
    234     def _transition(self, target_state: EntityState):
    235         """Internal helper for state transitions with version and fingerprint checks."""
    236         if target_state == EntityState.OBSOLETE:
    237             self.state = target_state
    238             return
    239 
    240         # Check if version should bump
    241         if self.should_version(target_state):
    242             self._update_fingerprint()
    243             self.flexo_id = FlexOID.next_version(self.flexo_id)
    244 
     232
     233   def _transition(self, target_state: EntityState):
     234    """
     235    Internal helper for state transitions with version/fingerprint checks
     236    and forward-only enforcement.
     237    """
     238
     239    allowed = self.allowed_transitions()
     240
     241    if target_state.name not in allowed:
     242        raise ValueError(
     243            f"Illegal state transition: {self.state.name} → {target_state.name}. "
     244            f"Allowed: {', '.join(allowed) or 'none'}"
     245        )
     246
     247    # special case: marking obsolete
     248    if target_state == EntityState.OBSOLETE:
    245249        self.state = target_state
    246250        self.updated_at = datetime.now(UTC)
     251        return
     252
     253    # version bump only for stable/external states
     254    if self.should_version(target_state):
     255        self._update_fingerprint()
     256        self.flexo_id = FlexOID.next_version(self.flexo_id)
     257
     258    self.state = target_state
     259    self.updated_at = datetime.now(UTC)
    247260
    248261    # ───────────────────────────────────────────────────────────────
     
    277290        Draft entities receive a new permanent FlexOID with incremented version.
    278291        """
     292       
    279293        if self.state == EntityState.DRAFT:
    280294            new_version = self.flexo_id.version + 1
  • org/FlexoEntity.org

    r33be5a0 r37b5d11  
    66** Was ist ein Hash?
    77
    8 Ein Hash ist wie eine Art eindeutige Kennnummer oder ein "Fingerabdruck" für Daten, der
     8Ein Hash ist ein hoffentlich eindeutiger "Fingerabdruck" für Daten, der
    99sich aus eben diesen Daten über den Algorithmus einer Hash-Funktion errechnet.
     10
     11Die Eingabedaten bezeichnet man als Seed, das Ergebnis als Digest.
     12
     13Man gibt die Saat (das Futter) an die Hashfunktion zum Zerkauen/Zerkleinern (Hashen),
     14das wird verdaut, nebenbei noch gewürzt (Salt) und kommt als Digest wieder heraus.
     15Die Länge der Ausgabe ist fest.
     16
     17** Ein wichtiger Punkt
     18
     19Wichtig ist auch zu verstehen, dass Hashes sogenannte "One-Way-Funktionen" sind.
     20Das heißt, man kann das Hashing nicht einfach umkehren, um das ursprüngliche Objekt wiederherzustellen.
     21Ein Hash ist also eine Einbahnstraße: Er dient nur dazu, die Daten zu repräsentieren,
     22aber man kann nicht vom Hash auf die originalen Daten zurückrechnen.
     23Aus Kacke kann man kein Essen zaubern.
    1024
    1125** Was ist kein Hash?
     
    3246hat sich etwas geändert. Das spart enorm viel Aufwand.
    3347
    34 ** Ein wichtiger Punkt
    35 
    36 Wichtig ist auch zu verstehen, dass Hashes sogenannte "One-Way-Funktionen" sind.
    37 Das heißt, man kann das Hashing nicht einfach umkehren, um das ursprüngliche Objekt wiederherzustellen.
    38 Ein Hash ist also eine Einbahnstraße: Er dient nur dazu, die Daten zu repräsentieren,
    39 aber man kann nicht vom Hash auf die originalen Daten zurückrechnen.
    40 
    4148** Beispiele für den Einsatz von Hashes
    4249
     
    4855root:$6$tsicHaoV3Q$YtAbiIvrHGXFtAJYz9tcEYWHXiGVQ40sJAgzPAbc57lIq9jH8eYjWXwctSW6YQnrMznRFcm6yXLnnY9mHhso20
    4956enno:$6$sdygzfEgx0$YpaZJMQdkZgxGPclphz6RojqNG.PSNEq1oIHRP4kvZRN2iuS5MQrxt0nCkrYQIcpDGyohrb1o0S/GkWrFriWL1
     57
     58Der Hash ist länger als das Passwort. Das dient der Sicherheit, weil man zwar nicht zurückrechnen,
     59wohl aber vorwärtsrechnen kann. Hash-Funktionen sind deterministisch.
     60Bei Linux-Passworteinträgen hat man hier $6$ den Hashalgorithmus kodiert, im daraufolgendem $.....$ das Salz
     61und im Rest den eigentlichen Hash kodiert
    5062
    5163- **Git-Commits**: In Versionskontrollsystemen wie Git werden Hashes benutzt, um jeden Schwung an
     
    168180erreicht haben. Ein Zertifikat kann nur ausgestellt werden, wenn der passende Einstufungstest die Stufe
    169181Veröffentlicht hat. Das origin-Feld des Zertifikats sollte sinnvollerweise die ID des Tests enthalten.
    170        
     182
    171183** Erhöhung der Versionsnummer oder neue ID
    172184
    173185Sobald - aus Gründen - eine neue ID vergeben werden muss, wird ggf. die Ursprungs-ID
    174186im Feld origin der neuen FlexoEntity gespeichert. So ist immer ein Suchen im Stammbaum möglich.
     187
     188AF-Q251022-70F759@001D
     189│  │ │       │     │ │
     190│  │ │       │     │ └── State (Draft, Approved, Signed, Published, Obsolete)
     191│  │ │       │     └──── Version
     192│  │ │       └────────── Hash (3 bytes, 6 Stellen)
     193│  │ └────────────────── Date (YYMMDD)
     194│  └──────────────────── Entity type (Question)
     195└─────────────────────── Domain (e.g. Air force)
     196
    175197
    176198Eine einfache Erhöhung der Versionsnummer (am Ende der ID) ist unter Umständen auch ausreichend,
     
    178200für das Projekt FlexoGrader recht umfangreich und soll hier nicht weiter besprochen werden.
    179201Da es aber im Hintergrund passiert und vom Endanwender nicht bemerkt wird, behindert der
    180 Mechanismus die Nutzung des FlexoGrader (TM) nicht.
    181 
     202Mechanismus die Nutzung des FlexoGrader nicht.
     203
     204** Reifegrad
     205
     206Das Konzept und Design hat die Alpha-Phase verlassen, der Code ist aber noch deutlich Beta.
     207RC1 etwa Anfang Dezember (nach meinem Urlaub). Änderungen an der FlexOID sind nicht mehr zu erwarten, beim API der FlexoEntity schon eher.
     208
     209Das Perfekte ist der Feind des Guten, aber ...
     210
     211Als Gegenbeispiel für unausgereiftes Design ist Pythons eingebaute datetime Bibliothek.
     212Da könnte man ein Buch drüber schreiben. Halb Drama, halb Komödie.
     213
     214- dateutil, arrow, pendulum, maya, moment, delorean, pytz, zoneinfo + numpy/pandas
     215 
    182216** Lizenz
    183217
Note: See TracChangeset for help on using the changeset viewer.