Changeset 2f650ac in flexoentity


Ignore:
Timestamp:
10/22/25 14:22:21 (3 months ago)
Author:
Enrico Schwass <ennoausberlin@…>
Branches:
master
Children:
3d16c35
Parents:
859e2b1
Message:

add domain as entity

Files:
5 edited

Legend:

Unmodified
Added
Removed
  • flexoentity/__init__.py

    r859e2b1 r2f650ac  
    99from .id_factory import FlexOID, canonical_seed
    1010from .flexo_entity import FlexoEntity, EntityType, EntityState
     11from .domain import Domain
    1112
    1213__all__ = [
     
    1516    "FlexoEntity",
    1617    "EntityType",
     18    "Domain",
    1719    "EntityState",
    1820]
  • flexoentity/domain.py

    r859e2b1 r2f650ac  
     1from dataclasses import dataclass
     2from flexoentity.flexo_entity import FlexoEntity, EntityType, EntityState
     3
    14@dataclass
    25class Domain(FlexoEntity):
    3     abbrev: str
    4     fullname: str
     6    fullname: str = ""
    57    description: str = ""
    68    classification: str = "UNCLASSIFIED"
    79    owner: str = "unknown"
    810
     11    def __post_init__(self):
     12        self.etype = EntityType.DOMAIN
     13        super().__post_init__()
     14
    915    @property
    10     def qtype(self):  # or entity_type
    11         return EntityType.DOMAIN
     16    def text_seed(self) -> str:
     17        """Deterministic text seed for ID generation."""
     18        return f"{self.domain}|{self.fullname}|{self.classification}|{self.owner}"
    1219
    1320    def to_dict(self):
    1421        base = super().to_dict()
    1522        base.update({
    16             "abbrev": self.abbrev,
    1723            "fullname": self.fullname,
    1824            "description": self.description,
     
    2127        })
    2228        return base
     29
     30    @classmethod
     31    def from_dict(cls, data):
     32        return cls(
     33            fullname=data.get("fullname", ""),
     34            description=data.get("description", ""),
     35            classification=data.get("classification", "UNCLASSIFIED"),
     36            owner=data.get("owner", "unknown"),
     37            state=EntityState[data.get("state", "DRAFT")],
     38        )
  • flexoentity/flexo_entity.py

    r859e2b1 r2f650ac  
    44"""
    55import json
     6import re
    67from enum import Enum, auto
    78from dataclasses import dataclass, field
     
    1415from flexoentity.id_factory import FlexOID
    1516from flexoentity import canonical_seed
    16  
    1717
    1818# ──────────────────────────────────────────────────────────────────────────────
     
    2828    DATABASE = auto()
    2929    CERTIFICATE = auto()
    30 
     30    DOMAIN = auto()
     31   
    3132    def short(self) -> str:
    3233        mapping = {
    3334            EntityType.QUESTION: "Q",
     35            EntityType.MEDIA: "M",
     36            EntityType.DOMAIN: "DOM",
    3437            EntityType.CATALOG:  "CAT",
    3538            EntityType.EXAM:     "EX",
     
    8992class FlexoEntity(ABC):
    9093    domain: str
    91     etype: EntityType
    92     state: EntityState = EntityState.DRAFT
    93     flexo_id: FlexOID = field(init=False)
    94     created_at: datetime = field(default_factory=lambda: datetime.now(UTC))
    95     updated_at: Optional[datetime] = None
    96 
    97     # ───────────────────────────────────────────────────────────────
    98 
     94    etype: EntityType
     95    state: EntityState
     96
     97    OID_PATTERN = re.compile(
     98        r"^(?P<domain>[A-Z0-9]+)-(?P<etype>[A-Z]+)"
     99        r"(?P<date>\d{6,8})-(?P<hash>[0-9A-F]+)@(?P<version>\d{3})(?P<state>[A-Z])$"
     100    )
     101
     102    def __str__(self) -> str:
     103        return f"{self.domain}-{self.etype}{self.date}-{self.unique_hash}@{self.version:03d}{self.state}"
     104
     105    @classmethod
     106    def from_string(cls, s: str) -> "FlexOID":
     107        """Rehydrate a FlexOID from its canonical string form."""
     108        m = cls.OID_PATTERN.match(s.strip())
     109        if not m:
     110            raise ValueError(f"Invalid FlexOID string: {s}")
     111        gd = m.groupdict()
     112        return cls(
     113            domain=gd["domain"],
     114            etype=gd["etype"],
     115            state=gd["state"],
     116        )
    99117    @property
    100118    @abstractmethod
     
    121139            "domain": self.domain,
    122140            "etype": self.etype.name,
    123             "text_seed": self.text_seed,
    124141            "state": self.state.name,
    125             "version": self.version,
    126142            "flexo_id": str(self.flexo_id),
    127             "signature": self.flexo_id.signature,
    128             "created_at": self.created_at.isoformat(),
    129             "updated_at": self.updated_at.isoformat() if self.updated_at else None,
    130143        }
    131144
     
    139152        )
    140153        obj.flexo_id = FlexOID(data["flexo_id"], data.get("signature", ""))
    141         if data.get("updated_at"):
    142             obj.updated_at = datetime.fromisoformat(data["updated_at"])
    143154        return obj
    144155
  • tests/conftest.py

    r859e2b1 r2f650ac  
    33import pytest
    44import json
    5 from flexoentity import FlexoEntity, EntityType, EntityState
     5from flexoentity import FlexoEntity, EntityType, EntityState, Domain
    66
    77
     
    3434    """Generic FlexoEntity-like instance in draft state."""
    3535    return DummyEntity(
    36         domain="AF",
     36        domain=Domain(domain="SIG", etype=EntityType.DOMAIN, state=EntityState.DRAFT, fullname="Signal Corps", classification="RESTRICTED"),
    3737        etype=EntityType.CATALOG,
    3838        state=EntityState.DRAFT,
  • tests/test_id_stress.py

    r859e2b1 r2f650ac  
    66import random
    77
    8 from flexoentity import FlexOID, EntityType, EntityState
     8from flexoentity import FlexOID, EntityType, EntityState, Domain
    99
    1010from tests.conftest import DummyEntity
     
    1313def test_bulk_generation_uniqueness():
    1414    """Generate 10,000 IDs and assert uniqueness (statistical test)."""
    15     domain = "AF"
     15    domain = Domain(domain="SIG", etype=EntityType.DOMAIN, state=EntityState.DRAFT,
     16                    fullname="Signal Corps", classification="RESTRICTED", owner="MESE")
     17
    1618    etype = EntityType.QUESTION
    1719    estate = EntityState.DRAFT
     
    4446    should yield the same base ID (without suffix).
    4547    """
    46     domain = "AF"
     48    domain = Domain(domain="SIG", etype=EntityType.DOMAIN, state=EntityState.DRAFT,
     49                    fullname="Signal Corps", classification="RESTRICTED")
    4750    etype = EntityType.CATALOG
    4851    estate = EntityState.DRAFT
Note: See TracChangeset for help on using the changeset viewer.