Edgewall Software

Ticket #221: genshi-py24-star-import.patch

File genshi-py24-star-import.patch, 2.0 KB (added by aronacher, 15 years ago)
  • template/base.py

     
    254254        """Pop the top-most scope from the stack."""
    255255
    256256
     257# check for a python 2.4 bug in the ceval loop.
     258try:
     259    exec 'from sys import *' in {}, Context()
     260except SystemError:
     261    def _star_import_compat(self, module):
     262        namespace = self.frames[0]
     263        mod = __import__(module, None, None, ['__all__'])
     264        if hasattr(mod, '__all__'):
     265            members = mod.__all__
     266        else:
     267            members = [x for x in mod.__dict__.items()
     268                       if not x.startswith('_')]
     269        for member in members:
     270            namespace[member] = getattr(mod, member)
     271    Context._star_import_compat = _star_import_compat
     272    del _star_import_compat
     273
     274
    257275def _apply_directives(stream, directives, ctxt, **vars):
    258276    """Apply the given directives to the stream.
    259277   
  • template/eval.py

     
    2626from textwrap import dedent
    2727
    2828from genshi.core import Markup
    29 from genshi.template.base import TemplateRuntimeError
     29from genshi.template.base import TemplateRuntimeError, Context
    3030from genshi.util import flatten
    3131
    3232__all__ = ['Code', 'Expression', 'Suite', 'LenientLookup', 'StrictLookup',
     
    520520            [self.visit(x) for x in node.subs]
    521521        )
    522522
     523    def visitFrom(self, node):
     524        if not hasattr(Context, '_star_import_compat') or \
     525           node.names != [('*', None)]:
     526            return node
     527        # this is a python 2.x bug.  Only if we have a broken python
     528        # version we have to apply that hack.
     529        return ast.Discard(ast.CallFunc(
     530            ast.Getattr(ast.Name('__data__'), '_star_import_compat'),
     531            [ast.Const(node.modname)], None, None
     532        ), lineno=node.lineno)
     533
    523534    # Statements
    524535
    525536    def visitAssert(self, node):