Source code for lsst.verify.blobset
#
# LSST Data Management System
#
# This product includes software developed by the
# LSST Project (http://www.lsst.org/).
#
# See COPYRIGHT file at the top of the source tree.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the LSST License Statement and
# the GNU General Public License along with this program.  If not,
# see <https://www.lsstcorp.org/LegalNotices/>.
#
from __future__ import print_function, division
__all__ = ['BlobSet']
from .blob import Blob
from .jsonmixin import JsonSerializationMixin
[docs]class BlobSet(JsonSerializationMixin):
    """A collection of `~lsst.verify.Blob`\ s.
    Parameters
    ----------
    blobs : `list` of `lsst.verify.Blob`\ s
        Blobs to include in the set.
    """
    def __init__(self, blobs=None):
        # internal dict of Blobs
        self._items = {}
        # internal mapping of blob names to identifiers
        self._name_map = {}
        if blobs is not None:
            for blob in blobs:
                self.insert(blob)
    @classmethod
[docs]    def deserialize(cls, blobs=None):
        """Create a BlobSet from a parsed JSON dataset.
        Parameters
        ----------
        blobs : `list`, optional
            A list of blob JSON serializations.
        Returns
        -------
        instance : `BlobSet`
            A `BlobSet` instance.
        """
        instance = cls()
        if blobs is None:
            blobs = []
        for blob_doc in blobs:
            blob = Blob.deserialize(**blob_doc)
            instance.insert(blob)
        return instance 
    def __getitem__(self, key):
        try:
            # key may be a blob's name, rather than identifier
            key = self._name_map[key]
        except KeyError:
            pass
        return self._items[key]
    def __setitem__(self, key, value):
        if not isinstance(value, Blob):
            message = ('Blob {0} is not a '
                       'lsst.verify.Blob-type')
            raise TypeError(message.format(value))
        if key != value.identifier:
            message = ("Key {0} is inconsistent with the blob's "
                       "identifier, {1}")
            raise KeyError(message.format(key, value.identifier))
        self._items[key] = value
        self._name_map[value.name] = key
    def __len__(self):
        return len(self._items)
    def __contains__(self, key):
        try:
            # key may be a blob's name, rather than identifier
            key = self._name_map[key]
        except KeyError:
            pass
        return key in self._items
    def __delitem__(self, key):
        try:
            # key may be a blob's name, rather than identifier
            key = self._name_map[key]
        except KeyError:
            pass
        del self._items[key]
    def __iter__(self):
        for key in self._items:
            yield key
    def __eq__(self, other):
        return self._items == other._items
    def __ne__(self, other):
        return not self.__eq__(other)
    def __str__(self):
        count = len(self)
        if count == 0:
            count_str = 'empty'
        elif count == 1:
            count_str = '1 Blob'
        else:
            count_str = '{count:d} Blobs'.format(count=count)
        return '<BlobSet: {0}>'.format(count_str)
[docs]    def keys(self):
        """Get a sequence of blob identifiers, which are keys to the BlobSet.
        Returns
        -------
        keys : sequence of `str`
            Sequence of `Blob.identifier`.
        """
        return self._items.keys() 
[docs]    def items(self):
        """Iterate over (identifier, `Blob`) pairs in the set.
        Yields
        ------
        item : `tuple`
            Tuple containing:
            - `Blob.identifier` of the `Blob` (`str`)
            - `Blob` instance
        """
        for item in self._items.items():
            yield item 
[docs]    def insert(self, blob):
        """Insert a blob into the set.
        Parameters
        ----------
        blob : `Blob`
            `Blob` to insert into the set. It can be accessed by key from
            the BlobSet through its `Blob.identifier` string.
        """
        self[blob.identifier] = blob 
    @property
    def json(self):
        """A `dict` that can be serialized as JSON."""
        json_doc = JsonSerializationMixin._jsonify_list(
            [blob for identifier, blob in self.items()]
        )
        return json_doc