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)
Esempio n. 4
0
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