Changeset 524040a in flexoentity


Ignore:
Timestamp:
10/22/25 15:40:50 (3 months ago)
Author:
Enrico Schwass <ennoausberlin@…>
Branches:
master
Children:
6a7dec1
Parents:
3d16c35
Message:

add lots of convinience methods

Files:
4 edited

Legend:

Unmodified
Added
Removed
  • flexoentity/domain.py

    r3d16c35 r524040a  
    88    classification: str = "UNCLASSIFIED"
    99    owner: str = "unknown"
     10
     11    @classmethod
     12    def default(cls):
     13        return cls(domain="GEN", etype=EntityType.DATABASE, state=EntityState.DRAFT)
    1014
    1115    def __post_init__(self):
     
    3539            classification=data.get("classification", "UNCLASSIFIED"),
    3640            owner=data.get("owner", "unknown"),
    37             state=EntityState[data.get("state", "DRAFT")],
    3841        )
  • flexoentity/flexo_entity.py

    r3d16c35 r524040a  
    121121        raise NotImplementedError("Subclasses must define text_seed property")
    122122
     123    @classmethod
     124    @abstractmethod
     125    def default(cls):
     126        """Return a minimal valid instance of this entity (DRAFT state)."""
     127        raise NotImplementedError("Subclasses must implement default()")
     128
    123129    def __post_init__(self):
    124130        """Generate ID and content fingerprint."""
  • flexoentity/id_factory.py

    r3d16c35 r524040a  
    133133        return part[-1]
    134134
     135    # ──────────────────────────────────────────────────────────────────────────
     136    #  Parsed Accessors
     137    # ──────────────────────────────────────────────────────────────────────────
     138
     139    @property
     140    def domain(self) -> str:
     141        """Return the domain prefix (e.g., 'AF')."""
     142        try:
     143            return self.flexo_id.split('-', 1)[0]
     144        except IndexError:
     145            raise ValueError(f"Malformed Flex-O ID: {self.flexo_id}")
     146
     147    @property
     148    def etype(self) -> str:
     149        """Return the entity type code (e.g., 'Q', 'CAT', etc.)."""
     150        try:
     151            part = self.flexo_id.split('-', 1)[1]
     152            return ''.join(filter(str.isalpha, part.split('-')[0]))  # up to first dash
     153        except IndexError:
     154            raise ValueError(f"Malformed Flex-O ID: {self.flexo_id}")
     155
     156    @property
     157    def date_str(self) -> str:
     158        """Return the YYMMDD creation date as string."""
     159        try:
     160            part = self.flexo_id.split('-', 1)[1]
     161            # e.g. "Q251019" → skip type prefix, take next 6 digits
     162            digits = ''.join(ch for ch in part if ch.isdigit())
     163            return digits[:6]
     164        except IndexError:
     165            raise ValueError(f"Malformed Flex-O ID: {self.flexo_id}")
     166
     167    @property
     168    def date(self) -> datetime:
     169        """Return the creation date as datetime.date object (UTC, naive)."""
     170        try:
     171            ds = self.date_str
     172            return datetime.strptime(ds, "%y%m%d").date()
     173        except Exception as e:
     174            raise ValueError(f"Invalid date in Flex-O ID: {self.flexo_id}") from e
     175
     176    @property
     177    def hash_part(self) -> str:
     178        """Return the 6-hex BLAKE hash portion (e.g., '9B3E2')."""
     179        try:
     180            after_dash = self.flexo_id.split('-', 2)[2]
     181            return after_dash.split('@')[0]
     182        except IndexError:
     183            raise ValueError(f"Malformed Flex-O ID: {self.flexo_id}")
     184
     185    @property
     186    def suffix(self) -> str:
     187        """Return the full suffix after '@' (e.g., '001A')."""
     188        try:
     189            return self.flexo_id.split('@', 1)[1]
     190        except IndexError:
     191            raise ValueError(f"Malformed Flex-O ID: {self.flexo_id}")
     192
    135193    @property
    136194    def version(self) -> int:
    137195        try:
    138             ver_state = self.flexo_id.rsplit("@", 1)[-1]
    139             return int(ver_state[:-1])  # drop state suffix
     196            return int(self.suffix[:-1])  # drop state suffix
    140197        except (ValueError, IndexError):
    141198            return 1
     
    147204        # return self.flexo_id.split('@')[0].rsplit('-', 1)[0]
    148205
    149     @property
    150     def prefix_old(self) -> str:
    151         return self.flexo_id.rsplit("@", 1)[0]
     206    def parsed(self) -> dict:
     207        """Return a structured breakdown of the Flex-O ID."""
     208        return {
     209            "domain": self.domain,
     210            "etype": self.etype,
     211            "date": self.date,
     212            "hash": self.hash_part,
     213            "version": self.version,
     214            "state": self.state_code,
     215            "signature": self.signature,
     216        }
    152217    # ──────────────────────────────────────────────────────────────────────────
    153218
  • tests/conftest.py

    r3d16c35 r524040a  
    5555    )
    5656    return exam
     57
     58@pytest.fixture
     59def null_media():
     60    """Provide a default NullMediaItem instance for tests."""
     61    return NullMediaItem(
     62        domain="GEN",
     63        etype=EntityType.MEDIA,
     64        state=EntityState.DRAFT
     65    )
Note: See TracChangeset for help on using the changeset viewer.