def sqlcontentclass_engine_created_handler(self, source, target): """create and register the handler for the IEngineCreatedEvent. """ if source.stereotype('pyegg:stub'): return targetpack=read_target_node(source,target.target) targetpack['saconfig.py']=Module() module = targetpack['saconfig.py'] imps = Imports(module) # check if one of the parent packages has the z3c_saconfig stereotype z3c_saconfig=get_z3c_saconfig(source) # add engine-created handler if z3c_saconfig: eggtgv=TaggedValues(z3c_saconfig) engine_name = eggtgv.direct( 'engine_name', 'sql:z3c_saconfig', 'default') globalfuncs = [f for f in module.filtereditems(IFunction)] globalfuncnames = [f.functionname for f in globalfuncs] if 'engineCreatedHandler' not in globalfuncnames: imps.set('z3c.saconfig.interfaces', [['IEngineCreatedEvent', None]]) imps.set('zope', [['component', None]]) imps.set('z3c.saconfig.interfaces',[['IEngineFactory',None]]) imps.set('sqlalchemy.ext.declarative','declarative_base') #att = [att for att in module.filtereditems(IAttribute) \ # if att.targets == ['Base']][0] bases=module.attributes('Base') if not bases: base=Attribute('Base','declarative_base()') module.insertafterimports(base) else: base=bases[0] ff = Function('engineCreatedHandler') # 'engineCreatedHandler' ff.__name__ = ff.uuid ff.args = ('event',) dec = Decorator('component.adapter') dec.__name__ = dec.uuid dec.args = ('IEngineCreatedEvent',) ff.insertfirst(dec) block_lines = [ "fact = component.queryUtility(IEngineFactory, '%s')" \ % engine_name, "if fact and fact._args == event.engine_args:", " Base.metadata.create_all(event.engine)", ] block = Block('\n'.join(block_lines)) block.__name__ = block.uuid ff.insertlast(block) module.insertafter(ff, base) prov = Block('component.provideHandler(engineCreatedHandler)') prov.__name__ = prov.uuid module.insertafter(prov, ff)
def finalize_handler(self, source, target): func = read_target_node(source, target.target) tok = token(str(source.uuid), True, scopes=[], generators=[]) tgv = TaggedValues(source) order = tgv.direct('order', 'generator:handler', None) func.args = ['self', 'source', 'target'] # ...or by dependency on a generator if tok.generators: generatornames = [g.name for g in tok.generators] else: # the generator can be defined by tgv generatornames = [tgv.direct('generator', 'generator:handler', None)] for scope in tok.scopes: stgv = TaggedValues(scope) scopename = stgv.direct('scopename', 'generator:class_scope', None) or \ stgv.direct('scopename', 'generator:simple_scope', None) or \ scope.name.lower() transform = stgv.direct('transform', 'generator:class_scope', None) or \ stgv.direct('transform', 'generator:class_scope', None) or \ 'uml2fs' transformarg = "'%s'" % transform scopenamearg = "'%s'" % scopename decfound = None for generatorname in generatornames: generatornamearg = "'%s'" % generatorname # find the dec for dec in func.decorators(): if dec.args[1] == transformarg \ and dec.args[2] == generatornamearg \ and dec.args[3] == scopenamearg: decfound = dec if decfound: dec = decfound # if not found make it else: dec = Decorator() dec.decoratorname = 'handler' dec.__name__ = dec.uuid func.insertfirst(dec) # define the args for the generator dec.args = ["'%s'" % source.name, transformarg, generatornamearg, scopenamearg] if not order is None: dec.kwargs['order'] = order
def prepare_cornice_function(source, target, method): tok = token(str(source.uuid), True, target=None) servicename = source.parent.name decname = '%s.%s' % (servicename, method) if tok.target: func = tok.target else: func = read_target_node(source, target.target) #func body if not func.blocks(): func.insertfirst(Block("return {'%s':'%s'}" % (servicename,method))) #request param if 'request' not in func.args: func.args.append('request') #decorator dec = Decorator(decname) dec.is_callable = True if not func.decorators(decname): func.insertfirst(dec)
def finalize_handler(self, source, target): func = read_target_node(source, target.target) tok = token(str(source.uuid), True, scopes=[], generators=[]) tgv = TaggedValues(source) order = tgv.direct('order', 'generator:handler', None) func.args = ['self', 'source', 'target'] # ...or by dependency on a generator if tok.generators: generatornames = [g.name for g in tok.generators] else: # the generator can be defined by tgv generatornames = [tgv.direct('generator', 'generator:handler', None)] for scope in tok.scopes: stgv = TaggedValues(scope) scopename = stgv.direct('scopename', 'generator:class_scope', None) or \ stgv.direct('scopename', 'generator:simple_scope', None) or \ scope.name.lower() transform = stgv.direct('transform', 'generator:class_scope', None) or \ stgv.direct('transform', 'generator:class_scope', None) or \ 'uml2fs' transformarg = "'%s'" % transform scopenamearg = "'%s'" % scopename decfound = None for generatorname in generatornames: generatornamearg = "'%s'" % generatorname # find the dec for dec in func.decorators(): if dec.args[1] == transformarg \ and dec.args[2] == generatornamearg \ and dec.args[3] == scopenamearg: decfound = dec if decfound: dec = decfound # if not found make it else: dec = Decorator() dec.decoratorname = 'handler' dec.__name__ = dec.uuid func.insertfirst(dec) # define the args for the generator dec.args = [ "'%s'" % source.name, transformarg, generatornamearg, scopenamearg ] if not order is None: dec.kwargs['order'] = order