Source code for gavo.rsc.common

"""
Helpers for resource creation.
"""

#c Copyright 2008-2023, the GAVO project <gavo@ari.uni-heidelberg.de>
#c
#c This program is free software, covered by the GNU GPL.  See the
#c COPYING file in the source distribution.


import copy

from gavo import base


[docs]class DBTableError(base.Error): """is raised when a manipulation of an on-disk table fails. It always has a qName attribute containing the qualified name of the table causing the trouble. """ def __init__(self, msg, qName, hint=None): base.Error.__init__(self, msg, hint=hint) self.qName = qName self.args = [msg, qName]
[docs]class FLUSH(object): """A sentinel that grammars can yield to flush out records to the Database. This probably is only necessary in updating dispatched grammars to enforce dropping of rows dependent on some table. """
[docs]class ParamMixin(object): """A mixin providing param processing. This is for tables and data elements. If you mix this in, you have to call _initParams(rscdefObject, params=None) rscdefObject is a TableDef or DataDef, params, if given, a dictionary mapping param names to param values. """ def _initParams(self, paramsDef, params=None): self.paramsDef = paramsDef self._params = self.paramsDef.params.deepcopy(self.paramsDef) if self.paramsDef.id: self._params.withinId = "%s %s"%( self.paramsDef.__class__.__name__, self.paramsDef.id) else: self._params.withinId = "anonymous "+self.paramsDef.__class__.__name__ if params is not None: self.setParams(params)
[docs] def setParams(self, parDict, raiseOnBadKeys=True): for k, v in parDict.items(): try: self.setParam(k, v) except base.NotFoundError: if raiseOnBadKeys: raise
[docs] def setParam(self, parName, value): """sets a parameter to a value. String-typed values will be parsed, everything else is just entered directly. Trying to write to non-existing params will raise a NotFoundError. Do not write to params directly, you'll break things. """ self._params.getColumnByName(parName).set(value)
[docs] def getParam(self, parName, default=base.NotGiven): """retrieves a parameter (python) value. """ try: return self._params.getColumnByName(parName).value except base.NotFoundError: if default is not base.NotGiven: return default raise
[docs] def getParamByName(self, parName): return self._params.getColumnByName(parName)
[docs] def getParamByUtype(self, utype): return self._params.getColumnByUtype(utype)
[docs] def iterParams(self): """iterates over the parameters for this table. The items returned are rscdef.Param instances. """ return self._params
[docs] def getParamDict(self): return dict((p.name, p.value) for p in self.iterParams())
[docs]class ParseOptions(object): """see `function getParseOptions`_ . """ def __repr__(self): return "<ParseOptions validateRows=%s maxRows=%s keepGoing=%s>"%( self.validateRows, self.maxRows, self.keepGoing)
[docs] def change(self, **kwargs): """returns a copy of self with the keyword parameters changed. Trying to add attributes in this way will raise an AttributeError. >>> p = parseValidating.change(validateRows=False) >>> p.validateRows False >>> p.change(gulp=1) Traceback (most recent call last): AttributeError: ParseOptions instances have no gulp attributes """ newInstance = copy.copy(self) for key, val in kwargs.items(): if not hasattr(newInstance, key): raise AttributeError("%s instances have no %s attributes"%( newInstance.__class__.__name__, key)) setattr(newInstance, key, val) return newInstance
[docs]def getParseOptions(validateRows=True, doTableUpdates=False, batchSize=1024, maxRows=None, keepGoing=False, dropIndices=False, dumpRows=False, metaOnly=False, buildDependencies=True, systemImport=False, commitAfterMeta=False, dumpIngestees=False, suppressMeta=False, metaPlusIndex=False): """returns an object with some attributes set. This object is used in the parsing code in dddef. It's a standin for the the command line options for tables created internally and should have all attributes that the parsing infrastructure might want from the optparse object. So, just configure what you want via keyword arguments or use the prebuilt objects parseValidating and and parseNonValidating below. See commandline.py for the meaning of the attributes. The exception is buildDependencies. This is true for most internal builds of data (and thus here), but false when we need to manually control when dependencies are built, as in user.importing and while building the dependencies themselves. """ po = ParseOptions() po.validateRows = validateRows po.systemImport = systemImport po.keepGoing = keepGoing po.dumpRows = dumpRows po.doTableUpdates = doTableUpdates po.batchSize = batchSize po.maxRows = maxRows po.dropIndices = dropIndices po.metaOnly = metaOnly po.buildDependencies = buildDependencies po.commitAfterMeta = commitAfterMeta po.dumpIngestees = dumpIngestees po.suppressMeta = suppressMeta po.metaPlusIndex = metaPlusIndex return po
parseValidating = getParseOptions(validateRows=True) parseNonValidating = getParseOptions(validateRows=False) def _test(): # pragma: no cover import doctest doctest.testmod()