Skip to content

Commit 2f6cea0

Browse files
committed
Extract processor registry into new module
Moves processor registration and discovery helpers out of `dlc_processor_socket.py` into a new `registry.py` module so registry access no longer depends on importing socket logic. `dlc_processor_socket.py` now imports the shared registry helpers and adds a safe fallback when `dlclive` is unavailable, reducing import-time failures in environments without that dependency. Package exports were updated to expose registry APIs from the new module.
1 parent 42ce638 commit 2f6cea0

4 files changed

Lines changed: 62 additions & 54 deletions

File tree

dlclivegui/processors/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
from .dlc_processor_socket import PROCESSOR_REGISTRY, BaseProcessorSocket, register_processor
1+
from .registry import PROCESSOR_REGISTRY, register_processor
22

3-
__all__ = ["register_processor", "BaseProcessorSocket", "PROCESSOR_REGISTRY"]
3+
__all__ = ["register_processor", "PROCESSOR_REGISTRY"]

dlclivegui/processors/dlc_processor_socket.py

Lines changed: 5 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,11 @@
1313

1414
import numpy as np
1515
import pandas as pd
16-
from dlclive.processor import Processor # type: ignore
16+
17+
try:
18+
from dlclive.processor import Processor # type: ignore
19+
except ImportError:
20+
Processor = object # Fallback for type checking if dlclive is not installed
1721

1822
logger = logging.getLogger("dlc_processor_socket")
1923

@@ -23,21 +27,6 @@
2327
_handler.setFormatter(logging.Formatter("%(asctime)s [%(levelname)s] %(message)s"))
2428
logger.addHandler(_handler)
2529

26-
# Registry for GUI discovery
27-
PROCESSOR_REGISTRY = {}
28-
29-
30-
def register_processor(cls):
31-
registry_key = getattr(cls, "PROCESSOR_ID", cls.__name__)
32-
if registry_key in PROCESSOR_REGISTRY:
33-
msg = (
34-
f"Duplicate processor registration key '{registry_key}': "
35-
f"{PROCESSOR_REGISTRY[registry_key].__name__} vs {cls.__name__}"
36-
)
37-
logger.warning(msg)
38-
PROCESSOR_REGISTRY[registry_key] = cls
39-
return cls
40-
4130

4231
# pragma: cover
4332
class BaseProcessorSocket(Processor):
@@ -435,38 +424,3 @@ def get_data(self):
435424
if self.dlc_cfg is not None:
436425
save_dict["dlc_cfg"] = self.dlc_cfg
437426
return save_dict
438-
439-
440-
def get_available_processors():
441-
"""
442-
Get list of available processor classes.
443-
444-
Returns:
445-
dict: Dictionary mapping registry keys to processor info.
446-
"""
447-
return {
448-
name: {
449-
"class": cls,
450-
"name": getattr(cls, "PROCESSOR_NAME", name),
451-
"description": getattr(cls, "PROCESSOR_DESCRIPTION", ""),
452-
"params": getattr(cls, "PROCESSOR_PARAMS", {}),
453-
}
454-
for name, cls in PROCESSOR_REGISTRY.items()
455-
}
456-
457-
458-
def instantiate_processor(class_name, **kwargs):
459-
"""
460-
Instantiate a processor by class name with given parameters.
461-
462-
Args:
463-
class_name: Registry key (e.g., "MyProcessorSocket")
464-
**kwargs: Constructor kwargs
465-
466-
Raises:
467-
ValueError: If class_name is not in registry
468-
"""
469-
if class_name not in PROCESSOR_REGISTRY:
470-
available = ", ".join(PROCESSOR_REGISTRY.keys())
471-
raise ValueError(f"Unknown processor '{class_name}'. Available: {available}")
472-
return PROCESSOR_REGISTRY[class_name](**kwargs)

dlclivegui/processors/examples.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66

77
import numpy as np
88

9-
from dlclivegui.processors import BaseProcessorSocket, register_processor
9+
from dlclivegui.processors import register_processor
10+
from dlclivegui.processors.dlc_processor_socket import BaseProcessorSocket
1011

1112
logger = logging.getLogger(__name__)
1213

dlclivegui/processors/registry.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import logging
2+
3+
logger = logging.getLogger(__name__)
4+
5+
# Registry for GUI discovery
6+
PROCESSOR_REGISTRY = {}
7+
8+
9+
def register_processor(cls):
10+
registry_key = getattr(cls, "PROCESSOR_ID", cls.__name__)
11+
if registry_key in PROCESSOR_REGISTRY:
12+
msg = (
13+
f"Duplicate processor registration key '{registry_key}': "
14+
f"{PROCESSOR_REGISTRY[registry_key].__name__} vs {cls.__name__}"
15+
)
16+
logger.warning(msg)
17+
PROCESSOR_REGISTRY[registry_key] = cls
18+
return cls
19+
20+
21+
def get_available_processors():
22+
"""
23+
Get list of available processor classes.
24+
25+
Returns:
26+
dict: Dictionary mapping registry keys to processor info.
27+
"""
28+
return {
29+
name: {
30+
"class": cls,
31+
"name": getattr(cls, "PROCESSOR_NAME", name),
32+
"description": getattr(cls, "PROCESSOR_DESCRIPTION", ""),
33+
"params": getattr(cls, "PROCESSOR_PARAMS", {}),
34+
}
35+
for name, cls in PROCESSOR_REGISTRY.items()
36+
}
37+
38+
39+
def instantiate_processor(class_name, **kwargs):
40+
"""
41+
Instantiate a processor by class name with given parameters.
42+
43+
Args:
44+
class_name: Registry key (e.g., "MyProcessorSocket")
45+
**kwargs: Constructor kwargs
46+
47+
Raises:
48+
ValueError: If class_name is not in registry
49+
"""
50+
if class_name not in PROCESSOR_REGISTRY:
51+
available = ", ".join(PROCESSOR_REGISTRY.keys())
52+
raise ValueError(f"Unknown processor '{class_name}'. Available: {available}")
53+
return PROCESSOR_REGISTRY[class_name](**kwargs)

0 commit comments

Comments
 (0)