Coverage for src / graphable / registry.py: 100%

24 statements  

« prev     ^ index     » next       coverage.py v7.13.3, created at 2026-02-16 21:32 +0000

1from __future__ import annotations 

2 

3from typing import TYPE_CHECKING, Any, Callable 

4 

5if TYPE_CHECKING: 

6 from .graph import Graph 

7 

8# Define types for parsers and exporters 

9ParserFnc = Callable[..., "Graph[Any]"] 

10ExporterFnc = Callable[["Graph[Any]", Any], None] 

11CreatorFnc = Callable[["Graph[Any]", Any], str] 

12 

13# Registry for parsers (extension -> function) 

14PARSERS: dict[str, ParserFnc] = {} 

15 

16# Registry for exporters (extension -> function) 

17EXPORTERS: dict[str, ExporterFnc] = {} 

18 

19# Registry for creators (function that returns string instead of writing to file) 

20# Maps an export function to its corresponding create function 

21CREATOR_MAP: dict[ExporterFnc, CreatorFnc] = {} 

22 

23 

24def register_parser(extension: str | list[str]): 

25 def decorator(fnc: ParserFnc): 

26 exts = [extension] if isinstance(extension, str) else extension 

27 for ext in exts: 

28 PARSERS[ext.lower()] = fnc 

29 return fnc 

30 

31 return decorator 

32 

33 

34def register_view(extension: str | list[str], creator_fnc: CreatorFnc | None = None): 

35 def decorator(fnc: ExporterFnc): 

36 exts = [extension] if isinstance(extension, str) else extension 

37 for ext in exts: 

38 EXPORTERS[ext.lower()] = fnc 

39 if creator_fnc: 

40 CREATOR_MAP[fnc] = creator_fnc 

41 return fnc 

42 

43 return decorator