Source code for pyobs.mixins.fitsnamespace

import logging
from typing import List, Dict, Optional, Any, Tuple


log = logging.getLogger(__name__)


class FitsNamespaceMixin:
    """Mixin for IFitsHeaderProvider modules that filters FITS headers by namespace."""

    __module__ = "pyobs.mixins"

    def __init__(self, fits_namespaces: Optional[Dict[str, List[str]]] = None, **kwargs: Any):
        self.__namespaces = {} if fits_namespaces is None else fits_namespaces

[docs] def _filter_fits_namespace( self, hdr: Dict[str, Tuple[Any, str]], sender: str, namespaces: Optional[List[str]] = None ) -> Dict[str, Tuple[Any, str]]: """Filter FITS header keywords by given namespaces. If no namespaces are given, let all through. Always let keywords with this module's name as namespace pass. Args: hdr: Input header to filter namespaces: Requested namespaces sender: Name of module that requested headers Returns: Filtered FITS header """ # no namespaces? if not self.__namespaces: return hdr # get list of FITS headers that we let pass keywords: List[str] = [] # is the sender name in my namespaces? if sender in self.__namespaces: # add namespace self.__add_namespace(sender, keywords, hdr) # loop all given namespaces if namespaces is not None: for name in namespaces: # does namespace exist in my config? if name in self.__namespaces: # add namespace self.__add_namespace(name, keywords, hdr) # make unique keywords = list(set(keywords)) # return filtered header return {k: v for k, v in hdr.items() if k in keywords}
def __add_namespace(self, name: str, keywords: List[str], hdr: Dict[str, Any]) -> None: """Add FITS header keywords from namespace to list of valid keywords Args: name: Name of namespace keywords: List of valid keywords, which will be added to hdr: Full unfiltered header """ # what to add? if name not in self.__namespaces: # given namespace doesn't exist? then add none return elif self.__namespaces[name] is None: # take all keywords, if namespace is empty or none are given keywords.extend(hdr.keys()) elif isinstance(self.__namespaces[name], list): # take only keywords from list keywords.extend(self.__namespaces[name]) else: log.error("Unknown namespace format: %s", self.__namespaces[name]) __all__ = ["FitsNamespaceMixin"]