Source code for ionize.Database

"""Database module for ionize."""
import json
import re
import os
import operator

from ..Ion import Ion


[docs]class Database(object): """A database containing ion information.""" _default_source = os.path.join(os.getcwd(), os.path.dirname(__file__), 'ion_data.json') data = property(operator.attrgetter("_data")) _data = None source = property(operator.attrgetter("_source")) _source = None def __init__(self, source=None): """Initialize a Database instance.""" self._source = source or self._default_source self._open() def _open(self): with open(self.source, 'r') as fp: self._data = json.load(fp)
[docs] def load(self, name): """Return an ion from the database based on the name.""" if name in self.data: name = self.data[name].get('alias_of', name) data = {key: value for key, value in self.data[name].items() if key != '__ion__'} return Ion(**data) elif name.lower() in self.data: return self.load(name.lower()) else: raise NameError('Ion {} not found in database.'.format(name))
[docs] def search(self, searchstring): """Return each name in the database that matches the searchstring. The searchstring can be a regular expression. """ return tuple(sorted([str(key) for key in self.data.keys() if re.search(searchstring, key)]))
[docs] def keys(self): """Return the keys of the database as a list.""" return sorted(self.data.keys())
[docs] def serialize(self): """Return a JSON formatted serialization of the database.""" return json.dumps(self.data)
def __getitem__(self, key): """Return the ion that matches the key.""" return self.load(key) def __iter__(self): """Retern a generator that yields each ion in the Database.""" for key in self.keys(): yield self[key] def __repr__(self): return 'Database("{}")'.format(self.source) def __str__(self): return 'Database: {} entries'.format(len(self.keys()))