def behaviorschema(self, source, target): schema = read_target_node(source, target.target) module = schema.parent # check whether this behavior has schema attributes if not 'form.Schema' in schema.bases: schema.bases.append('form.Schema') alsoprovides = "alsoProvides(%s, form.IFormFieldProvider)" \ % schema.classname alsoprovides_exists = False for block in module.blocks(): for line in block.lines: if line == alsoprovides: alsoprovides_exists = True block = python.Block() block.__name__ = str(uuid.uuid4()) if not alsoprovides_exists: block.lines.append(alsoprovides) if block.lines: module.insertafter(block, schema) egg = egg_source(source) imp = Imports(schema.parent) imp.set(egg.name, [['_', None]]) imp.set('plone.directives', [['form', None]]) imp.set('zope.interface', [['alsoProvides', None]])
def transform_attribute(source, target, group, fetch_tgv): field_def = lookup_field_def(source, group) attribute = read_target_node(source, target.target) if not attribute: # attribute has been removed return attribute.value = field_def['factory'] tgv = TaggedValues(source) fetch_tgv(tgv, attribute, field_def['stereotype']) imp = Imports(attribute.parent.parent) imp.set(field_def['import_from'], [[field_def['import'], None]]) if field_def['depends']: pass # XXX write to setup.py setup_dependencies
def plone__init__(self, source, target): egg = egg_source(source) eggname = egg.name targetdir = read_target_node(source, target.target) module = targetdir['__init__.py'] imp = Imports(module) imp.set('zope.i18nmessageid', [['MessageFactory', None]]) value = 'MessageFactory("%s")' % eggname atts = [att for att in module.attributes() if '_' in att.targets] if atts: atts[0].value = value else: module['_'] = Attribute('_', value)
def schemaclass(self, source, target): schema = getschemaclass(source, target) klass = read_target_node(source, target.target) module = schema.parent view = module.classes('%sView' % klass.classname)[0] tok = token(str(view.uuid), True, depends_on=set()) tok.depends_on.add(schema) if not 'form.Schema' in schema.bases: schema.bases.append('form.Schema') egg = egg_source(source) imp = Imports(schema.parent) imp.set(egg.name, [['_', None]]) imp.set('plone.directives', [['form', None]])
def generate_profile_location(self, source, target): targetclass = read_target_node(source, target.target) module = targetclass.parent ifspec = { 'path': 'agx.core.interfaces.IProfileLocation', 'name': 'IProfileLocation', } tok = token(str(targetclass.uuid), False, realizes=[]) if ifspec not in tok.realizes: tok.realizes.append(ifspec) tgv = TaggedValues(source) name = tgv.direct('profile_name', 'generator:profile', None) if not name: name = source.name #msg = 'profile_name tagged value not defined for %s!' % source.name #raise ValueError(msg) imps = Imports(module) frompath = '.'.join(ifspec['path'].split('.')[:-1]) imps.set(frompath, [[ifspec['name'], None]]) attributenames = [att.targets[0] for att in targetclass.attributes()] if 'name' not in attributenames: att = Attribute() att.__name__ = att.uuid targetclass[att.name] = att att.targets = ['name'] att.value = "'%s.profile.uml'" % name if 'package' not in attributenames: att = Attribute() att.__name__ = att.uuid targetclass[att.name] = att att.targets = ['package'] att.value = dotted_path(source.parent) imps.set('', [[att.value, None]]) # remove the import from this class init = targetclass.parent.parent['__init__.py'] fromimp = '.'.join(implicit_dotted_path(source).split('.')[:-1]) imps = [imp for imp in init.imports() if imp.fromimport == fromimp] for imp in imps: init.detach(str(imp.uuid))
def common_imports(self, source, target): """does common imports for modules with handlers """ handlerscope = getUtility(IScope, 'uml2fs.handler') module = read_target_node(source, target.target) has_handlers = False for klass in source.classes: if handlerscope(klass): has_handlers = True break if not has_handlers: return # do some common imports imps = Imports(module) imps.set('node.ext.uml.interfaces', [ ['IOperation', None], ['IClass', None], ['IPackage', None], ['IInterface', None], ['IInterfaceRealization', None], ['IDependency', None], ['IProperty', None], ['IAssociation', None], ]) imps.set('agx.core', [ ['handler', None], ['Scope', None], ['registerScope', None], ['token', None], ]) imps.set('agx.core.interfaces', [ ['IScope', None], ]) imps.set('agx.core.util', [ ['read_target_node', None], ['dotted_path', None], ]) imps.set('agx.generator.pyegg.utils', [ ['class_base_name', None], ['implicit_dotted_path', None], ])
def createschemaclass(self, source, target): """create the schema interface class on the fly. """ klass = read_target_node(source, target.target) module = klass.parent schemaclassname = 'I' + klass.classname found = module.classes(schemaclassname) if found: schemaclass = found[0] else: schemaclass = python.Class(classname=schemaclassname) schemaclass.__name__ = schemaclass.uuid module.insertbefore(schemaclass, klass) # expose it in __init__ imp = Imports(module.parent['__init__.py']) imp.set(class_base_name(schemaclass), [[schemaclassname, None]]) # mark the content class for deletion if not needed createit = TaggedValues(source).direct('create_contentclass', 'plone:content_type', False) if not (createit or klass.functions()): token(str(klass.uuid), True, dont_generate=True)
def zcviewfinalize(self, source, target): """Create zope interface. """ if source.stereotype('pyegg:stub') is not None: return view = source targetview = read_target_node(view, target.target) name = source.name module = targetview.parent imp = Imports(module) imp.set('Products.Five', [['BrowserView', None]]) set_copyright(source, module) if module.classes(name): class_ = module.classes(name)[0] else: class_ = python.Class(name) module[name] = class_ if 'BrowserView' not in targetview.bases: targetview.bases.append('BrowserView')
def behavioradapter(self, source, target): schema = read_target_node(source, target.target) module = schema.parent adaptername = schema.classname[1:] if module.classes(adaptername): adapter = module.classes(adaptername)[0] else: adapter = python.Class() module[uuid.uuid4()] = adapter adapter.classname = adaptername implements = "implements(%s)" % schema.classname implements_exists = False for block in adapter.blocks(): for line in block.lines: if line == implements: implements_exists = True block = python.Block() block.__name__ = str(uuid.uuid4()) if not implements_exists: block.lines.append(implements) if block.lines: adapter.insertfirst(block) # ``__init__ only created once`` # XXX: check if signature changed and raise error if not adapter.functions('__init__'): init = python.Function(functionname='__init__') init.args.append('context') block = init[str(uuid.uuid4())] = python.Block() block.lines.append('self.context = context') adapter[str(uuid.uuid4())] = init imp = Imports(module) imp.set('zope.interface', [['implements', None]]) # read or create configure.zcml package = module.parent if 'configure.zcml' in package: configure = package['configure.zcml'] else: path = package.path path.append('configure.zcml') fullpath = os.path.join(*path) configure = ZCMLFile(fullpath) configure.nsmap['plone'] = 'http://namespaces.plone.org/plone' configure.nsmap['grok'] = 'http://namespaces.zope.org/grok' package['configure.zcml'] = configure provides = '.%s.%s' % (module.modulename, schema.classname) factory = '.%s.%s' % (module.modulename, adapter.classname) # XXX: maybe more filters if not configure.filter( tag='plone:behavior', attr='factory', value=factory): behavior = SimpleDirective(name='plone:behavior', parent=configure) behavior.attrs['title'] = adapter.classname # XXX: stereotype tgv behavior.attrs['description'] = adapter.classname behavior.attrs['provides'] = provides behavior.attrs['factory'] = factory
def typeview(self, source, target): schema = getschemaclass(source, target) klass = read_target_node(source, target.target) module = schema.parent if IModule.providedBy(module): directory = module.parent else: directory = module nsmap = { None: 'http://namespaces.zope.org/zope', 'plone': 'http://namespaces.plone.org/plone', 'grok': 'http://namespaces.zope.org/grok', } zcmlfile = get_zcml(directory, 'configure.zcml', nsmap=nsmap) # include grok:grok directive if not set yet set_zcml_directive(directory, 'configure.zcml', 'grok:grok', 'package', '.') classname = '%sView' % klass.classname if module.classes(classname): view = module.classes(classname)[0] else: view = python.Class() module[uuid.uuid4()] = view view.classname = classname if not 'dexterity.DisplayForm' in view.bases: view.bases.append('dexterity.DisplayForm') context = "grok.context(%s)" % schema.classname require = "grok.require('zope2.View')" context_exists = False require_exists = False for block in view.blocks(): for line in block.lines: if line == context: context_exists = True if line == require: require_exists = True block = python.Block() block.__name__ = str(uuid.uuid4()) if not context_exists: block.lines.append(context) if not require_exists: block.lines.append(require) if block.lines: view.insertfirst(block) template = False for attr in view.attributes(): if 'template' in attr.targets: template = attr break if not template: template = python.Attribute() template.targets = ['template'] view[str(uuid.uuid4())] = template template.value = "PageTemplate('templates/%s.pt')" \ % klass.classname.lower() imp = Imports(module) imp.set('plone.directives', [['dexterity', None]]) imp.set('five', [['grok', None]]) imp.set('grokcore.view.components', [['PageTemplate', None]]) directory = module.parent template_name = '%s.pt' % klass.classname.lower() template = 'templates/%s' % template_name if not 'templates' in directory: directory['templates'] = Directory() templates = directory['templates'] templates.factories['.pt'] = XMLTemplate if template_name not in templates: pt = templates[template_name] = XMLTemplate() pt.template = 'agx.generator.dexterity:templates/displayform.pt'
def generatescopereg(self, source, target): if source.stereotype('pyegg:stub'): return targetclass = read_target_node(source, target.target) module = targetclass.parent blocks = module.blocks() tgv = TaggedValues(source) transform = tgv.direct('transform', 'generator:class_scope', None) or \ tgv.direct('transform', 'generator:simple_scope', None) or \ 'uml2fs' interfaces = tgv.direct('interfaces', 'generator:class_scope', None) or \ tgv.direct('interfaces', 'generator:simple_scope', None) scopename = tgv.direct('scopename', 'generator:class_scope', None) or \ tgv.direct('scopename', 'generator:simple_scope', None) or \ source.name.lower() #do some common imports imps = Imports(module) imps.set('node.ext.uml.interfaces', [ ['IOperation', None], ['IClass', None], ['IPackage', None], ['IInterface', None], ['IInterfaceRealization', None], ['IDependency', None], ['IProperty', None], ['IAssociation', None], ]) imps.set('agx.core', [ ['handler', None], ['Scope', None], ['registerScope', None], ['token', None], ]) # make the register statement if interfaces: ifstring = "[%s]" % ','.join(interfaces) else: ifstring = None if source.stereotype('generator:class_scope'): classname = source.name else: classname = 'Scope' reg = "registerScope('%s', '%s', %s, %s)" % \ (scopename, transform, ifstring, classname) # look if the reg stmt already exists regsearch = "registerScope('%s'" % scopename blockfound = None for b in blocks: for i in range(len(b.lines)): lcode = b.lines[i].strip().replace(' ', '') if lcode.startswith(regsearch): # replace the line b.lines[i] = reg return # else make a new block after the class declaration bl = Block() bl.__name__ = str(bl.uuid) bl.lines.append(reg) classes = [c for c in module.classes() if c.classname == source.name] if classes: klass = classes[0] module.insertafter(bl, klass) else: module.insertlast(bl)