[Zope-dev] SVN: Zope/branches/Zope-2_8-branch/lib/python/Products/PythonScripts/patches.py - integrated Hotfix-2008-08-12

Tres Seaver tseaver at palladion.com
Thu Aug 14 10:42:58 EDT 2008


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Andreas Jung wrote:
> Log message for revision 89809:
>   - integrated Hotfix-2008-08-12
>   
> 
> Changed:
>   A   Zope/branches/Zope-2_8-branch/lib/python/Products/PythonScripts/patches.py
> 
> -=-
> Added: Zope/branches/Zope-2_8-branch/lib/python/Products/PythonScripts/patches.py
> ===================================================================
> --- Zope/branches/Zope-2_8-branch/lib/python/Products/PythonScripts/patches.py	                        (rev 0)
> +++ Zope/branches/Zope-2_8-branch/lib/python/Products/PythonScripts/patches.py	2008-08-13 18:08:21 UTC (rev 89809)
> @@ -0,0 +1,99 @@
> +
> +
> +################################################################
> +# Monkey patch for LP #257276 (Hotfix-2008-08-12)
> +#
> +# This code is taken from the encodings module of Python 2.4.
> +# Note that this code is originally (C) CNRI and it is possibly not compatible
> +# with the ZPL and therefore should not live within svn.zope.org. However this
> +# checkin is blessed by Jim Fulton for now. The fix is no longer required with
> +# Python 2.5 and hopefully fixed in Python 2.4.6 release.
> +################################################################
> +
> +# Written by Marc-Andre Lemburg (mal at lemburg.com).
> +# (c) Copyright CNRI, All Rights Reserved. NO WARRANTY.
> +
> +def search_function(encoding):
> +
> +    # Cache lookup
> +    entry = _cache.get(encoding, _unknown)
> +    if entry is not _unknown:
> +        return entry
> +
> +    # Import the module:
> +    #
> +    # First try to find an alias for the normalized encoding
> +    # name and lookup the module using the aliased name, then try to
> +    # lookup the module using the standard import scheme, i.e. first
> +    # try in the encodings package, then at top-level.
> +    #
> +    norm_encoding = normalize_encoding(encoding)
> +    aliased_encoding = _aliases.get(norm_encoding) or \
> +                       _aliases.get(norm_encoding.replace('.', '_'))
> +    if aliased_encoding is not None:
> +        modnames = [aliased_encoding,
> +                    norm_encoding]
> +    else:
> +        modnames = [norm_encoding]
> +    for modname in modnames:
> +
> +        if not modname or '.' in modname:
> +            continue
> +
> +        try:
> +            mod = __import__(modname,
> +                             globals(), locals(), _import_tail)
> +            if not mod.__name__.startswith('encodings.'):
> +                continue
> +
> +        except ImportError:
> +            pass
> +        else:
> +            break
> +    else:
> +        mod = None
> +
> +    try:
> +        getregentry = mod.getregentry
> +    except AttributeError:
> +        # Not a codec module
> +        mod = None
> +
> +    if mod is None:
> +        # Cache misses
> +        _cache[encoding] = None
> +        return None
> +
> +    # Now ask the module for the registry entry
> +    entry = tuple(getregentry())
> +    if len(entry) != 4:
> +        raise CodecRegistryError,\
> +              'module "%s" (%s) failed to register' % \
> +              (mod.__name__, mod.__file__)
> +    for obj in entry:
> +        if not callable(obj):
> +            raise CodecRegistryError,\
> +                  'incompatible codecs in module "%s" (%s)' % \
> +                  (mod.__name__, mod.__file__)
> +
> +    # Cache the codec registry entry
> +    _cache[encoding] = entry
> +
> +    # Register its aliases (without overwriting previously registered
> +    # aliases)
> +    try:
> +        codecaliases = mod.getaliases()
> +    except AttributeError:
> +        pass
> +    else:
> +        for alias in codecaliases:
> +            if not _aliases.has_key(alias):
> +                _aliases[alias] = modname
> +
> +    # Return the registry entry
> +    return entry
> +
> +
> +import encodings
> +encodings.search_function.func_code = search_function.func_code
> +

Andreas, did you actually test this patch on 2.8 with Python 2.3?  It
relies on a name ('_aliases') which is not present in
lib/python2.3/encodings/__init__.py.  E.g.:

$ diff -ru lib/python2.{3,4}/encodings/__init__.py
...
@@ -38,6 +38,7 @@
                       '                                                '
                       '                                                '
                       '                ')
+_aliases = aliases.aliases

 class CodecRegistryError(exceptions.LookupError,
                          exceptions.SystemError):

...


Tres.
- --
===================================================================
Tres Seaver          +1 540-429-0999          tseaver at palladion.com
Palladion Software   "Excellence by Design"    http://palladion.com
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFIpERy+gerLs4ltQ4RArtdAKCmF+0C8Behv50Ke7uI2D1X2WKn6ACfe7/b
cS2R8xHNePOsei9ElD809wA=
=Ex2l
-----END PGP SIGNATURE-----



More information about the Zope-Dev mailing list