Ejemplo n.º 1
0
    def __init__(self, theme):
        """
        A Mixed logic template loader module. It will use Compiled theme template
        for current theme and will also use FileSystemLoader like in order to enable
        inheritance
        """

        self.loaders = []

        theme_name = theme['name']
        themes = get_resource_service('themes')
        parent_theme = theme.get('extends')

        files = theme.get('files', {'templates': {}})
        if files.get('templates'):
            self.addDictonary(theme)

            if parent_theme:
                parent = themes.find_one(req=None, name=parent_theme)
                self.addDictonary(parent)
        else:
            compiled = themes.get_theme_compiled_templates_path(theme_name)
            self.loaders.append(ModuleLoader(compiled))
            if parent_theme:
                parent_compiled = themes.get_theme_compiled_templates_path(parent_theme)
                self.loaders.append(ModuleLoader(parent_compiled))

        # let's now add the parent theme prefix loader
        if parent_theme:
            prefix_loader = self._parent_prefix_loader(parent_theme)
            self.loaders.append(prefix_loader)
Ejemplo n.º 2
0
        def recursive_add(theme):
            theme_name = theme['name']
            parent_name = theme.get('extends')
            parent = None

            if parent_name:
                parent = themes.find_one(req=None, name=parent_name)

            files = theme.get('files', {'templates': {}})
            if files.get('templates'):
                self.addDictonary(theme)

                if parent:
                    self.addDictonary(parent)
            else:
                compiled = themes.get_theme_compiled_templates_path(theme_name)
                self.loaders.append(ModuleLoader(compiled))

                if parent_name:
                    parent_compiled = themes.get_theme_compiled_templates_path(parent_name)
                    self.loaders.append(ModuleLoader(parent_compiled))

            # let's now add the parent theme prefix loader
            if parent_name:
                prefix_loader = self._parent_prefix_loader(parent_name)
                self.loaders.append(prefix_loader)

            # now check if parent theme extends another and repeat the story :)
            if parent and parent.get('extends'):
                ancestor = themes.find_one(req=None, name=parent.get('extends'))
                recursive_add(ancestor)
Ejemplo n.º 3
0
 def __init__(self, theme):
     self.loaders = []
     theme_name = theme['name']
     themes = get_resource_service('themes')
     parent_theme = theme.get('extends')
     files = theme.get('files', {'templates': {}})
     if files.get('templates'):
         self.addDictonary(theme)
         if parent_theme:
             parent = themes.find_one(req=None, name=parent_theme)
             self.addDictonary(parent)
     else:
         compiled = themes.get_theme_compiled_templates_path(theme_name)
         self.loaders.append(ModuleLoader(compiled))
         if parent_theme:
             parent_compiled = themes.get_theme_compiled_templates_path(
                 parent_theme)
             self.loaders.append(ModuleLoader(parent_compiled))
Ejemplo n.º 4
0
    def compile_templates(self, target, extensions = None, filter_func = None, zip = 'deflated', log_function = None, ignore_errors = True, py_compile = False):
        from jinja2.loaders import ModuleLoader
        if log_function is None:
            log_function = lambda x: None
        if py_compile:
            import imp, marshal
            py_header = imp.get_magic() + u'\xff\xff\xff\xff'.encode('iso-8859-15')

        def write_file(filename, data, mode):
            if zip:
                info = ZipInfo(filename)
                info.external_attr = 32309248L
                zip_file.writestr(info, data)
            else:
                f = open(os.path.join(target, filename), mode)
                try:
                    f.write(data)
                finally:
                    f.close()

        if zip is not None:
            from zipfile import ZipFile, ZipInfo, ZIP_DEFLATED, ZIP_STORED
            zip_file = ZipFile(target, 'w', dict(deflated=ZIP_DEFLATED, stored=ZIP_STORED)[zip])
            log_function('Compiling into Zip archive "%s"' % target)
        else:
            if not os.path.isdir(target):
                os.makedirs(target)
            log_function('Compiling into folder "%s"' % target)
        try:
            for name in self.list_templates(extensions, filter_func):
                source, filename, _ = self.loader.get_source(self, name)
                try:
                    code = self.compile(source, name, filename, True, True)
                except TemplateSyntaxError as e:
                    if not ignore_errors:
                        raise 
                    log_function('Could not compile "%s": %s' % (name, e))
                    continue

                filename = ModuleLoader.get_module_filename(name)
                if py_compile:
                    c = self._compile(code, _encode_filename(filename))
                    write_file(filename + 'c', py_header + marshal.dumps(c), 'wb')
                    log_function('Byte-compiled "%s" as %s' % (name, filename + 'c'))
                else:
                    write_file(filename, code, 'w')
                    log_function('Compiled "%s" as %s' % (name, filename))

        finally:
            if zip:
                zip_file.close()

        log_function('Finished compiling templates')
Ejemplo n.º 5
0
    def compile_templates(self, target, extensions=None, filter_func=None,
                          zip='deflated', log_function=None,
                          ignore_errors=True, py_compile=False):
        """Finds all the templates the loader can find, compiles them
        and stores them in `target`.  If `zip` is `None`, instead of in a
        zipfile, the templates will be stored in a directory.
        By default a deflate zip algorithm is used. To switch to
        the stored algorithm, `zip` can be set to ``'stored'``.

        `extensions` and `filter_func` are passed to :meth:`list_templates`.
        Each template returned will be compiled to the target folder or
        zipfile.

        By default template compilation errors are ignored.  In case a
        log function is provided, errors are logged.  If you want template
        syntax errors to abort the compilation you can set `ignore_errors`
        to `False` and you will get an exception on syntax errors.

        If `py_compile` is set to `True` .pyc files will be written to the
        target instead of standard .py files.  This flag does not do anything
        on pypy and Python 3 where pyc files are not picked up by itself and
        don't give much benefit.

        .. versionadded:: 2.4
        """
        from jinja2.loaders import ModuleLoader

        if log_function is None:
            log_function = lambda x: None

        if py_compile:
            if not PY2 or PYPY:
                from warnings import warn
                warn(Warning('py_compile has no effect on pypy or Python 3'))
                py_compile = False
            else:
                import imp
                import marshal
                py_header = imp.get_magic() + \
                    u'\xff\xff\xff\xff'.encode('iso-8859-15')

                # Python 3.3 added a source filesize to the header
                if sys.version_info >= (3, 3):
                    py_header += u'\x00\x00\x00\x00'.encode('iso-8859-15')

        def write_file(filename, data, mode):
            if zip:
                info = ZipInfo(filename)
                info.external_attr = 0o755 << 16
                zip_file.writestr(info, data)
            else:
                f = open(os.path.join(target, filename), mode)
                try:
                    f.write(data)
                finally:
                    f.close()

        if zip is not None:
            from zipfile import ZipFile, ZipInfo, ZIP_DEFLATED, ZIP_STORED
            zip_file = ZipFile(target, 'w', dict(deflated=ZIP_DEFLATED,
                                                 stored=ZIP_STORED)[zip])
            log_function('Compiling into Zip archive "%s"' % target)
        else:
            if not os.path.isdir(target):
                os.makedirs(target)
            log_function('Compiling into folder "%s"' % target)

        try:
            for name in self.list_templates(extensions, filter_func):
                source, filename, _ = self.loader.get_source(self, name)
                try:
                    code = self.compile(source, name, filename, True, True)
                except TemplateSyntaxError as e:
                    if not ignore_errors:
                        raise
                    log_function('Could not compile "%s": %s' % (name, e))
                    continue

                filename = ModuleLoader.get_module_filename(name)

                if py_compile:
                    c = self._compile(code, encode_filename(filename))
                    write_file(filename + 'c', py_header +
                               marshal.dumps(c), 'wb')
                    log_function('Byte-compiled "%s" as %s' %
                                 (name, filename + 'c'))
                else:
                    write_file(filename, code, 'w')
                    log_function('Compiled "%s" as %s' % (name, filename))
        finally:
            if zip:
                zip_file.close()

        log_function('Finished compiling templates')
Ejemplo n.º 6
0
    def compile_templates(self,
                          target,
                          extensions=None,
                          filter_func=None,
                          zip='deflated',
                          log_function=None,
                          ignore_errors=True,
                          py_compile=False):
        """Finds all the templates the loader can find, compiles them
        and stores them in `target`.  If `zip` is `None`, instead of in a
        zipfile, the templates will be will be stored in a directory.
        By default a deflate zip algorithm is used, to switch to
        the stored algorithm, `zip` can be set to ``'stored'``.

        `extensions` and `filter_func` are passed to :meth:`list_templates`.
        Each template returned will be compiled to the target folder or
        zipfile.

        By default template compilation errors are ignored.  In case a
        log function is provided, errors are logged.  If you want template
        syntax errors to abort the compilation you can set `ignore_errors`
        to `False` and you will get an exception on syntax errors.

        If `py_compile` is set to `True` .pyc files will be written to the
        target instead of standard .py files.

        .. versionadded:: 2.4
        """
        from jinja2.loaders import ModuleLoader

        if log_function is None:
            log_function = lambda x: None

        if py_compile:
            import imp, marshal
            py_header = imp.get_magic() + \
                u'\xff\xff\xff\xff'.encode('iso-8859-15')

            # Python 3.3 added a source filesize to the header
            if sys.version_info >= (3, 3):
                py_header += u'\x00\x00\x00\x00'.encode('iso-8859-15')

        def write_file(filename, data, mode):
            if zip:
                info = ZipInfo(filename)
                info.external_attr = 0755 << 16L
                zip_file.writestr(info, data)
            else:
                f = open(os.path.join(target, filename), mode)
                try:
                    f.write(data)
                finally:
                    f.close()

        if zip is not None:
            from zipfile import ZipFile, ZipInfo, ZIP_DEFLATED, ZIP_STORED
            zip_file = ZipFile(
                target, 'w',
                dict(deflated=ZIP_DEFLATED, stored=ZIP_STORED)[zip])
            log_function('Compiling into Zip archive "%s"' % target)
        else:
            if not os.path.isdir(target):
                os.makedirs(target)
            log_function('Compiling into folder "%s"' % target)

        try:
            for name in self.list_templates(extensions, filter_func):
                source, filename, _ = self.loader.get_source(self, name)
                try:
                    code = self.compile(source, name, filename, True, True)
                except TemplateSyntaxError, e:
                    if not ignore_errors:
                        raise
                    log_function('Could not compile "%s": %s' % (name, e))
                    continue

                filename = ModuleLoader.get_module_filename(name)

                if py_compile:
                    c = self._compile(code, _encode_filename(filename))
                    write_file(filename + 'c', py_header + marshal.dumps(c),
                               'wb')
                    log_function('Byte-compiled "%s" as %s' %
                                 (name, filename + 'c'))
                else:
                    write_file(filename, code, 'w')
                    log_function('Compiled "%s" as %s' % (name, filename))
        finally:
            if zip:
                zip_file.close()

        log_function('Finished compiling templates')
Ejemplo n.º 7
0
    def compile_templates(self,
                          target,
                          extensions=None,
                          filter_func=None,
                          zip='deflated',
                          log_function=None,
                          ignore_errors=True,
                          py_compile=False):
        from jinja2.loaders import ModuleLoader
        if log_function is None:
            log_function = lambda x: None
        if py_compile:
            import imp, marshal
            py_header = imp.get_magic() + u'\xff\xff\xff\xff'.encode(
                'iso-8859-15')

        def write_file(filename, data, mode):
            if zip:
                info = ZipInfo(filename)
                info.external_attr = 32309248L
                zip_file.writestr(info, data)
            else:
                f = open(os.path.join(target, filename), mode)
                try:
                    f.write(data)
                finally:
                    f.close()

        if zip is not None:
            from zipfile import ZipFile, ZipInfo, ZIP_DEFLATED, ZIP_STORED
            zip_file = ZipFile(
                target, 'w',
                dict(deflated=ZIP_DEFLATED, stored=ZIP_STORED)[zip])
            log_function('Compiling into Zip archive "%s"' % target)
        else:
            if not os.path.isdir(target):
                os.makedirs(target)
            log_function('Compiling into folder "%s"' % target)
        try:
            for name in self.list_templates(extensions, filter_func):
                source, filename, _ = self.loader.get_source(self, name)
                try:
                    code = self.compile(source, name, filename, True, True)
                except TemplateSyntaxError as e:
                    if not ignore_errors:
                        raise
                    log_function('Could not compile "%s": %s' % (name, e))
                    continue

                filename = ModuleLoader.get_module_filename(name)
                if py_compile:
                    c = self._compile(code, _encode_filename(filename))
                    write_file(filename + 'c', py_header + marshal.dumps(c),
                               'wb')
                    log_function('Byte-compiled "%s" as %s' %
                                 (name, filename + 'c'))
                else:
                    write_file(filename, code, 'w')
                    log_function('Compiled "%s" as %s' % (name, filename))

        finally:
            if zip:
                zip_file.close()

        log_function('Finished compiling templates')
Ejemplo n.º 8
0
    def compile_templates(
        self,
        target,
        extensions=None,
        filter_func=None,
        zip="deflated",
        log_function=None,
        ignore_errors=True,
        py_compile=False,
    ):
        """Compiles all the templates the loader can find, compiles them
        and stores them in `target`.  If `zip` is `None`, instead of in a
        zipfile, the templates will be will be stored in a directory.
        By default a deflate zip algorithm is used, to switch to
        the stored algorithm, `zip` can be set to ``'stored'``.

        `extensions` and `filter_func` are passed to :meth:`list_templates`.
        Each template returned will be compiled to the target folder or
        zipfile.

        By default template compilation errors are ignored.  In case a
        log function is provided, errors are logged.  If you want template
        syntax errors to abort the compilation you can set `ignore_errors`
        to `False` and you will get an exception on syntax errors.

        If `py_compile` is set to `True` .pyc files will be written to the
        target instead of standard .py files.

        .. versionadded:: 2.4
        """
        from jinja2.loaders import ModuleLoader

        if log_function is None:
            log_function = lambda x: None

        if py_compile:
            import imp, struct, marshal

            py_header = imp.get_magic() + u"\xff\xff\xff\xff".encode("iso-8859-15")

        def write_file(filename, data, mode):
            if zip:
                info = ZipInfo(filename)
                info.external_attr = 0755 << 16L
                zip_file.writestr(info, data)
            else:
                f = open(os.path.join(target, filename), mode)
                try:
                    f.write(data)
                finally:
                    f.close()

        if zip is not None:
            from zipfile import ZipFile, ZipInfo, ZIP_DEFLATED, ZIP_STORED

            zip_file = ZipFile(target, "w", dict(deflated=ZIP_DEFLATED, stored=ZIP_STORED)[zip])
            log_function('Compiling into Zip archive "%s"' % target)
        else:
            if not os.path.isdir(target):
                os.makedirs(target)
            log_function('Compiling into folder "%s"' % target)

        try:
            for name in self.list_templates(extensions, filter_func):
                source, filename, _ = self.loader.get_source(self, name)
                try:
                    code = self.compile(source, name, filename, True, True)
                except TemplateSyntaxError, e:
                    if not ignore_errors:
                        raise
                    log_function('Could not compile "%s": %s' % (name, e))
                    continue

                filename = ModuleLoader.get_module_filename(name)

                if py_compile:
                    c = self._compile(code, _encode_filename(filename))
                    write_file(filename + "c", py_header + marshal.dumps(c), "wb")
                    log_function('Byte-compiled "%s" as %s' % (name, filename + "c"))
                else:
                    write_file(filename, code, "w")
                    log_function('Compiled "%s" as %s' % (name, filename))
        finally:
            if zip:
                zip_file.close()

        log_function("Finished compiling templates")