Source code for gavo.grammars.customgrammar
"""
A grammar that imports a user-defined module and takes the RowIterator
from there.
The module has to define a RowIterator derived from CustomRowIterator. It may
define a function makeDataPack receiving the grammar as its argument and
returning anything. This anything will then be available as
self.grammar.dataPack to the row iterator. Use this for expensive, one-time
preparations your row iterator has to perform.
"""
#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.
from gavo import base
from gavo import rscdef
from gavo import utils
from gavo.grammars import common
_knownModules = {}
[docs]def getModuleName():
i = 0
while True:
name = "usergrammar%d"%i
if name not in _knownModules:
_knownModules[name] = None
return name
[docs]class CustomGrammar(common.Grammar, base.RestrictionMixin):
"""A Grammar with a user-defined row iterator taken from a module.
See the `Writing Custom Grammars`_ (in the reference manual) for details.
"""
# To save on time when initializing the grammar (which happens at
# RD parsing time), we delay initializing the user grammar to when
# it's actually used (which happens much less frequently than loading
# the RD).
name_ = "customGrammar"
_module = rscdef.ResdirRelativeAttribute("module", default=base.Undefined,
description="Path to module containing your row iterator.", copyable=True)
_isDispatching = base.BooleanAttribute("isDispatching", default=False,
description="Is this a dispatching grammar (i.e., does the row iterator"
" return pairs of role, row rather than only rows)?", copyable=True)
def _initUserGrammar(self):
self.userModule, _ = utils.loadPythonModule(self.module)
self.rowIterator = self.userModule.RowIterator
if hasattr(self.userModule, "makeDataPack"):
self.dataPack = self.userModule.makeDataPack(self)
[docs] def parse(self, *args, **kwargs):
if not hasattr(self, "userModule"):
self._initUserGrammar()
return common.Grammar.parse(self, *args, **kwargs)
[docs]class CustomRowIterator(common.RowIterator):
"""is a base class for custom row iterators.
Implement at least _iterRows. And pass on any keyword args to __init__
to the next constructor.
"""