Changeset 524040a in flexoentity
- Timestamp:
- 10/22/25 15:40:50 (3 months ago)
- Branches:
- master
- Children:
- 6a7dec1
- Parents:
- 3d16c35
- Files:
-
- 4 edited
-
flexoentity/domain.py (modified) (2 diffs)
-
flexoentity/flexo_entity.py (modified) (1 diff)
-
flexoentity/id_factory.py (modified) (2 diffs)
-
tests/conftest.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
flexoentity/domain.py
r3d16c35 r524040a 8 8 classification: str = "UNCLASSIFIED" 9 9 owner: str = "unknown" 10 11 @classmethod 12 def default(cls): 13 return cls(domain="GEN", etype=EntityType.DATABASE, state=EntityState.DRAFT) 10 14 11 15 def __post_init__(self): … … 35 39 classification=data.get("classification", "UNCLASSIFIED"), 36 40 owner=data.get("owner", "unknown"), 37 state=EntityState[data.get("state", "DRAFT")],38 41 ) -
flexoentity/flexo_entity.py
r3d16c35 r524040a 121 121 raise NotImplementedError("Subclasses must define text_seed property") 122 122 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 123 129 def __post_init__(self): 124 130 """Generate ID and content fingerprint.""" -
flexoentity/id_factory.py
r3d16c35 r524040a 133 133 return part[-1] 134 134 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 135 193 @property 136 194 def version(self) -> int: 137 195 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 140 197 except (ValueError, IndexError): 141 198 return 1 … … 147 204 # return self.flexo_id.split('@')[0].rsplit('-', 1)[0] 148 205 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 } 152 217 # ────────────────────────────────────────────────────────────────────────── 153 218 -
tests/conftest.py
r3d16c35 r524040a 55 55 ) 56 56 return exam 57 58 @pytest.fixture 59 def 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.
