Exemplo n.º 1
0
def grok_dotted_name(dotted_name,
                     grokker,
                     exclude_filter=None,
                     ignore_nonsource=True,
                     **kw):
    module_info = scan.module_info_from_dotted_name(dotted_name,
                                                    exclude_filter,
                                                    ignore_nonsource)
    grok_package(module_info, grokker, **kw)
Exemplo n.º 2
0
def grok_component(name, component,
                   context=None, module_info=None, templates=None, dotted_name=None):
    if module_info is None:
        if dotted_name is None:
            dotted_name = getattr(component, '__grok_module__', None)
            if dotted_name is None:
                dotted_name = getattr(component, '__module__', None)
            module_info = scan.module_info_from_dotted_name(dotted_name)
        module_info = scan.module_info_from_dotted_name(dotted_name)

    module = module_info.getModule()
    if context is not None:
        grokcore.component.context.set(module, context)
    if templates is not None:
        module.__grok_templates__ = templates
    config = ConfigurationMachine()
    result = zcml.the_multi_grokker.grok(name, component,
                                         module_info=module_info,
                                         config=config)
    config.execute_actions()    
    return result
Exemplo n.º 3
0
 def getModules(self, package=None):
     result = []
     if package is None:
         package = self.package
     info = module_info_from_dotted_name(package.__name__)
     for submod_info in info.getSubModuleInfos():
         if submod_info.isPackage():
             result.extend(self.getModules(submod_info.getModule()))
             continue
         if not self.pfilter_func(submod_info):
             continue
         module = submod_info.getModule()
         result.append(module)
     return result
Exemplo n.º 4
0
    def evolution_scripts(self):
        script_module = \
            module_info_from_dotted_name("ututi.migration")

        directory = os.path.dirname(script_module.path)
        script_modules = []
        script_pattern = r"(\d{3})_(.*)"
        for entry in sorted(os.listdir(directory)):
            name, ext = os.path.splitext(entry)
            match = re.match(script_pattern, name)
            if ext == '.py' and match:
                dotted_name = script_module.dotted_name + '.' + name
                script_modules.append(module_info_from_dotted_name(dotted_name))

        scripts = []
        for script in sorted(script_modules, key=lambda s: s.name):
            match = re.match(script_pattern, script.name)
            if match:
                version, name = match.groups()
                scripts.append(EvolutionScript(int(version),
                                               name,
                                               script.getModule().upgrade,
                                               script.getModule().downgrade))
        return scripts
 def associate_template(self, factory):
     component_name = factory.__name__.lower()
     module_name, design_name = grok.template.bind(
         default=(None, None)).get(factory)
     if module_name is None:
         module_info = factory.module_info
         design_name = component_name
     else:
         module_info = module_info_from_dotted_name(module_name)
     design_dir = file_template_registry.get_template_dir(module_info)
     template_path = os.path.join(design_dir, design_name + self.extension)
     if not os.path.isfile(template_path):
         raise GrokError(u"Missing template %s for %s" % (
                 template_path, factory))
     factory.__template_path__ = template_path
     factory.template = TemplateFile(template_path)
Exemplo n.º 6
0
def associate_template(module_info, factory, component_name,
                       has_render, has_no_render):
    """Associate a template to a factory located in the module
    described by module_info.
    """
    explicit_template = False
    factory_name = factory.__name__.lower()
    module_name, template_name = grokcore.view.template.bind(
        default=(None, None)).get(factory)
    if template_name is None:
        # We didn't used grok.template. Default the template name to
        # the factory name.
        template_name = factory_name
    else:
        # We used grok.template. Use the same module_info to fetch the
        # template that the module in which the directive have been
        # used (to get the grok.templatedir value).
        assert module_name is not None, \
            u"module_name cannot be None if template_name is specified."
        module_info = module_info_from_dotted_name(module_name)
        explicit_template = True

    # We used grok.template, to specify a template which is different
    # than the class name. Check if there is no template with the same
    # name as the view
    if factory_name != template_name:
        try:
            lookup(module_info, factory_name)
            raise GrokError("Multiple possible templates for %s %r. It "
                            "uses grok.template('%s'), but there is also "
                            "a template called '%s'."
                            % (component_name, factory, template_name,
                               factory_name), factory)
        except TemplateLookupError:
            pass

    # Check if view already have a template set with template =
    factory_have_template = (
        getattr(factory, 'template', None) is not None and
        ITemplate.providedBy(factory.template))

    # Lookup for a template in the registry
    try:
        factory.template = lookup(
            module_info, template_name, mark_as_associated=True)

        # If we associate a template, set the static_name to use to
        # the same package name as where the template is found.
        factory.__static_name__ = module_info.package_dotted_name

        # We now have a template.
        factory_have_template = True
    except TemplateLookupError:
        pass

    if not factory_have_template:
        # If a template was explicitly asked, error.
        if explicit_template:
            raise GrokError(
                "Template %s for %s %r cannot be found." %
                (template_name, component_name.title(), factory), factory)

        # Check for render or error.
        if has_no_render(factory):
            raise GrokError(
                "%s %r has no associated template or 'render' method." %
                (component_name.title(), factory), factory)

    if has_render(factory):
        # Check for have both render and template
        if factory_have_template:
            raise GrokError(
                "Multiple possible ways to render %s %r. "
                "It has both a 'render' method as well as "
                "an associated template." %
                (component_name, factory), factory)

        # Set static_name to use if no template are found.
        if getattr(factory, '__static_name__', None) is None:
            factory.__static_name__ = module_info.package_dotted_name

    if factory_have_template:
        factory.template._initFactory(factory)
Exemplo n.º 7
0
def grok_dotted_name(dotted_name, grokker, exclude_filter=None, **kw):
    module_info = scan.module_info_from_dotted_name(dotted_name, exclude_filter)
    grok_package(module_info, grokker, **kw)
Exemplo n.º 8
0
def associate_template(module_info, factory, component_name, has_render,
                       has_no_render):
    """Associate a template to a factory located in the module
    described by module_info.
    """
    explicit_template = False
    factory_name = factory.__name__.lower()
    module_name, template_name = grokcore.view.template.bind(
        default=(None, None)).get(factory)
    if template_name is None:
        # We didn't used grok.template. Default the template name to
        # the factory name.
        template_name = factory_name
    else:
        # We used grok.template. Use the same module_info to fetch the
        # template that the module in which the directive have been
        # used (to get the grok.templatedir value).
        assert module_name is not None, \
            u"module_name cannot be None if template_name is specified."
        module_info = module_info_from_dotted_name(module_name)
        explicit_template = True

    # We used grok.template, to specify a template which is different
    # than the class name. Check if there is no template with the same
    # name as the view
    if factory_name != template_name:
        try:
            lookup(module_info, factory_name)
            raise GrokError(
                "Multiple possible templates for %s %r. It "
                "uses grok.template('%s'), but there is also "
                "a template called '%s'." %
                (component_name, factory, template_name, factory_name),
                factory)
        except TemplateLookupError:
            pass

    # Check if view already have a template set with template =
    factory_have_template = (getattr(factory, 'template', None) is not None
                             and ITemplate.providedBy(factory.template))

    # Lookup for a template in the registry
    try:
        factory.template = lookup(module_info,
                                  template_name,
                                  mark_as_associated=True)

        # If we associate a template, set the static_name to use to
        # the same package name as where the template is found.
        factory.__static_name__ = module_info.package_dotted_name

        # We now have a template.
        factory_have_template = True
    except TemplateLookupError:
        pass

    if not factory_have_template:
        # If a template was explicitly asked, error.
        if explicit_template:
            raise GrokError(
                "Template %s for %s %r cannot be found." %
                (template_name, component_name.title(), factory), factory)

        # Check for render or error.
        if has_no_render(factory):
            raise GrokError(
                "%s %r has no associated template or 'render' method." %
                (component_name.title(), factory), factory)

    if has_render(factory):
        # Check for have both render and template
        if factory_have_template:
            raise GrokError(
                "Multiple possible ways to render %s %r. "
                "It has both a 'render' method as well as "
                "an associated template." % (component_name, factory), factory)

        # Set static_name to use if no template are found.
        if getattr(factory, '__static_name__', None) is None:
            factory.__static_name__ = module_info.package_dotted_name

    if factory_have_template:
        factory.template._initFactory(factory)
Exemplo n.º 9
0
def grok_dotted_name(dotted_name, grokker, exclude_filter=None,
                     ignore_nonsource=True, **kw):
    module_info = scan.module_info_from_dotted_name(dotted_name, exclude_filter,
                                                    ignore_nonsource)
    grok_package(module_info, grokker, **kw)