Commit 09f5e800 authored by Andreas Jung's avatar Andreas Jung

- Collector #2116: sequence.sort() did not work properly

        locale related comparison methods
parent 6ea19977
...@@ -14,6 +14,14 @@ Zope Changes ...@@ -14,6 +14,14 @@ Zope Changes
to the rules for such a type laid out in the Python docs: to the rules for such a type laid out in the Python docs:
http://docs.python.org/api/supporting-cycle-detection.html http://docs.python.org/api/supporting-cycle-detection.html
after Zope 2.8.7 (unreleased)
Bugs fixed
- Collector #2116: sequence.sort() did not work properly
locale related comparison methods
Zope 2.8.7 (2007/05/29) Zope 2.8.7 (2007/05/29)
Features added: Features added:
......
############################################################################## ##############################################################################
# #
# Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved. # Copyright (c) 2002 Zope Corporation and Contributors. All Rights Reserved.
# #
# This software is subject to the provisions of the Zope Public License, # This software is subject to the provisions of the Zope Public License,
# Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution. # Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
...@@ -17,7 +17,8 @@ eg Sort(sequence, (("akey", "nocase"), ("anotherkey", "cmp", "desc"))) ...@@ -17,7 +17,8 @@ eg Sort(sequence, (("akey", "nocase"), ("anotherkey", "cmp", "desc")))
$Id$ $Id$
""" """
from types import TupleType from App.config import getConfiguration
def sort(sequence, sort=(), _=None, mapping=0): def sort(sequence, sort=(), _=None, mapping=0):
""" """
...@@ -82,7 +83,7 @@ def sort(sequence, sort=(), _=None, mapping=0): ...@@ -82,7 +83,7 @@ def sort(sequence, sort=(), _=None, mapping=0):
s=[] s=[]
for client in sequence: for client in sequence:
k = None k = None
if type(client)==TupleType and len(client)==2: if isinstance(client, tuple) and len(client)==2:
if isort: k=client[0] if isort: k=client[0]
v=client[1] v=client[1]
else: else:
...@@ -133,12 +134,25 @@ basic_type={type(''): 1, type(0): 1, type(0.0): 1, type(()): 1, type([]): 1, ...@@ -133,12 +134,25 @@ basic_type={type(''): 1, type(0): 1, type(0.0): 1, type(()): 1, type([]): 1,
def nocase(str1, str2): def nocase(str1, str2):
return cmp(str1.lower(), str2.lower()) return cmp(str1.lower(), str2.lower())
import sys def getStrcoll():
if sys.modules.has_key("locale"): # only if locale is already imported
from locale import strcoll if getConfiguration().locale:
from locale import strcoll
return strcoll
else:
raise RuntimeError("strcoll() is only available for a proper 'locale' configuration in zope.conf")
def getStrcoll_nocase():
if getConfiguration().locale:
from locale import strcoll
return strcoll
def strcoll_nocase(str1, str2):
return strcoll(str1.lower(), str2.lower())
return strcoll_nocase
def strcoll_nocase(str1, str2): else:
return strcoll(str1.lower(), str2.lower()) raise RuntimeError("strcoll() is only available for a proper 'locale' configuration in zope.conf")
def make_sortfunctions(sortfields, _): def make_sortfunctions(sortfields, _):
...@@ -168,9 +182,9 @@ def make_sortfunctions(sortfields, _): ...@@ -168,9 +182,9 @@ def make_sortfunctions(sortfields, _):
elif f_name == "nocase": elif f_name == "nocase":
func = nocase func = nocase
elif f_name in ("locale", "strcoll"): elif f_name in ("locale", "strcoll"):
func = strcoll func = getStrcoll()
elif f_name in ("locale_nocase", "strcoll_nocase"): elif f_name in ("locale_nocase", "strcoll_nocase"):
func = strcoll_nocase func = getStrcoll_nocase()
else: # no - look it up in the namespace else: # no - look it up in the namespace
func = _.getitem(f_name, 0) func = _.getitem(f_name, 0)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment