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