| 264 | |
| 265 | |
| 266 | def explain_file(path: Path) -> ExplainFile | None: |
| 267 | filename = path.name.split(".") |
| 268 | |
| 269 | if len(filename) == 5: |
| 270 | ext = filename.pop() |
| 271 | suffix = filename.pop() |
| 272 | stage = filename.pop() |
| 273 | explainee_type = filename.pop() |
| 274 | name = filename.pop() |
| 275 | elif len(filename) == 4: |
| 276 | ext = filename.pop() |
| 277 | suffix = None |
| 278 | stage = filename.pop() |
| 279 | explainee_type = filename.pop() |
| 280 | name = filename.pop() |
| 281 | else: |
| 282 | return None |
| 283 | |
| 284 | parents = list(path.parents) |
| 285 | parents.reverse() |
| 286 | schema = parents.pop().name |
| 287 | database = parents.pop().name |
| 288 | item_type = parents.pop().name |
| 289 | |
| 290 | try: |
| 291 | return ExplainFile( |
| 292 | database=database, |
| 293 | schema=schema, |
| 294 | name=name, |
| 295 | suffix=suffix, |
| 296 | item_type=ItemType(item_type.lower()), |
| 297 | explainee_type=ExplaineeType[explainee_type.upper()], |
| 298 | stage=ExplainStage[stage.upper()], |
| 299 | ext=ext, |
| 300 | ) |
| 301 | except (KeyError, ValueError): |
| 302 | return None |
| 303 | |
| 304 | |
| 305 | def explain_diff(base: ExplainFile, diff_suffix: str) -> ExplainFile: |