Module connpy.services.context_service

Classes

class ContextService (config=None)
Expand source code
class ContextService(BaseService):
    """Business logic for managing and applying regex-based contexts locally."""

    @property
    def contexts(self) -> Dict[str, List[str]]:
        return self.config.config.get("contexts", {"all": [".*"]})

    @property
    def current_context(self) -> str:
        return self.config.config.get("current_context", "all")

    def list_contexts(self) -> List[Dict[str, Any]]:
        result = []
        for name in self.contexts.keys():
            result.append({
                "name": name,
                "active": (name == self.current_context),
                "regexes": self.contexts[name]
            })
        return result

    def add_context(self, name: str, regexes: List[str]):
        if not name.isalnum():
            raise ValueError("Context name must be alphanumeric")
        
        ctxs = self.contexts
        if name in ctxs:
            raise ValueError(f"Context '{name}' already exists")
        
        ctxs[name] = regexes
        self.config.config["contexts"] = ctxs
        self.config._saveconfig(self.config.file)

    def update_context(self, name: str, regexes: List[str]):
        if name == "all":
            raise ValueError("Cannot modify default context 'all'")
        
        ctxs = self.contexts
        if name not in ctxs:
            raise ValueError(f"Context '{name}' does not exist")
        
        ctxs[name] = regexes
        self.config.config["contexts"] = ctxs
        self.config._saveconfig(self.config.file)

    def delete_context(self, name: str):
        if name == "all":
            raise ValueError("Cannot delete default context 'all'")
        if name == self.current_context:
            raise ValueError(f"Cannot delete active context '{name}'")
        
        ctxs = self.contexts
        if name not in ctxs:
            raise ValueError(f"Context '{name}' does not exist")
        
        del ctxs[name]
        self.config.config["contexts"] = ctxs
        self.config._saveconfig(self.config.file)

    def set_active_context(self, name: str):
        if name not in self.contexts:
            raise ValueError(f"Context '{name}' does not exist")
        
        self.config.config["current_context"] = name
        self.config._saveconfig(self.config.file)

    def get_active_regexes(self) -> List[re.Pattern]:
        patterns = self.contexts.get(self.current_context, [".*"])
        return [re.compile(p) for p in patterns]

    def _match_any(self, node_name: str, patterns: List[re.Pattern]) -> bool:
        return any(p.match(node_name) for p in patterns)

    # Hook handlers for filtering
    def filter_node_list(self, *args, **kwargs):
        patterns = self.get_active_regexes()
        return [node for node in kwargs["result"] if self._match_any(node, patterns)]

    def filter_node_dict(self, *args, **kwargs):
        patterns = self.get_active_regexes()
        return {k: v for k, v in kwargs["result"].items() if self._match_any(k, patterns)}

Business logic for managing and applying regex-based contexts locally.

Initialize the service.

Args

config
An instance of configfile (or None to instantiate a new one/use global context).

Ancestors

Instance variables

prop contexts : Dict[str, List[str]]
Expand source code
@property
def contexts(self) -> Dict[str, List[str]]:
    return self.config.config.get("contexts", {"all": [".*"]})
prop current_context : str
Expand source code
@property
def current_context(self) -> str:
    return self.config.config.get("current_context", "all")

Methods

def add_context(self, name: str, regexes: List[str])
Expand source code
def add_context(self, name: str, regexes: List[str]):
    if not name.isalnum():
        raise ValueError("Context name must be alphanumeric")
    
    ctxs = self.contexts
    if name in ctxs:
        raise ValueError(f"Context '{name}' already exists")
    
    ctxs[name] = regexes
    self.config.config["contexts"] = ctxs
    self.config._saveconfig(self.config.file)
def delete_context(self, name: str)
Expand source code
def delete_context(self, name: str):
    if name == "all":
        raise ValueError("Cannot delete default context 'all'")
    if name == self.current_context:
        raise ValueError(f"Cannot delete active context '{name}'")
    
    ctxs = self.contexts
    if name not in ctxs:
        raise ValueError(f"Context '{name}' does not exist")
    
    del ctxs[name]
    self.config.config["contexts"] = ctxs
    self.config._saveconfig(self.config.file)
def filter_node_dict(self, *args, **kwargs)
Expand source code
def filter_node_dict(self, *args, **kwargs):
    patterns = self.get_active_regexes()
    return {k: v for k, v in kwargs["result"].items() if self._match_any(k, patterns)}
def filter_node_list(self, *args, **kwargs)
Expand source code
def filter_node_list(self, *args, **kwargs):
    patterns = self.get_active_regexes()
    return [node for node in kwargs["result"] if self._match_any(node, patterns)]
def get_active_regexes(self) ‑> List[re.Pattern]
Expand source code
def get_active_regexes(self) -> List[re.Pattern]:
    patterns = self.contexts.get(self.current_context, [".*"])
    return [re.compile(p) for p in patterns]
def list_contexts(self) ‑> List[Dict[str, Any]]
Expand source code
def list_contexts(self) -> List[Dict[str, Any]]:
    result = []
    for name in self.contexts.keys():
        result.append({
            "name": name,
            "active": (name == self.current_context),
            "regexes": self.contexts[name]
        })
    return result
def set_active_context(self, name: str)
Expand source code
def set_active_context(self, name: str):
    if name not in self.contexts:
        raise ValueError(f"Context '{name}' does not exist")
    
    self.config.config["current_context"] = name
    self.config._saveconfig(self.config.file)
def update_context(self, name: str, regexes: List[str])
Expand source code
def update_context(self, name: str, regexes: List[str]):
    if name == "all":
        raise ValueError("Cannot modify default context 'all'")
    
    ctxs = self.contexts
    if name not in ctxs:
        raise ValueError(f"Context '{name}' does not exist")
    
    ctxs[name] = regexes
    self.config.config["contexts"] = ctxs
    self.config._saveconfig(self.config.file)

Inherited members