# HG changeset patch # User pjenvey # Date 1223505775 0 # Node ID 05487ae7696ea76b22a89cc0e7507ddf5d34392d # Parent 49859ecea64abc3fd679f5f035d1b466ed558bb8 fix Python 2.3 compat: rearrange set/itemgetter/rsplit/sorted/unicode.decode usage. still has a few, unimportant failing tests diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -5,6 +5,7 @@ * Added support for the locale plural rules defined by the CLDR. * Added `format_timedelta` function to support localized formatting of relative times with strings such as "2 days" or "1 month" (ticket #126). + * Fixed Python 2.3 compatibility (ticket #146). Version 0.9.4 diff --git a/babel/messages/catalog.py b/babel/messages/catalog.py --- a/babel/messages/catalog.py +++ b/babel/messages/catalog.py @@ -19,17 +19,13 @@ from email import message_from_string from copy import copy import re -try: - set -except NameError: - from sets import Set as set import time from babel import __version__ as VERSION from babel.core import Locale from babel.dates import format_datetime from babel.messages.plurals import get_plural -from babel.util import odict, distinct, LOCALTZ, UTC, FixedOffsetTimezone +from babel.util import odict, distinct, set, LOCALTZ, UTC, FixedOffsetTimezone __all__ = ['Message', 'Catalog', 'TranslationError'] __docformat__ = 'restructuredtext en' diff --git a/babel/messages/checkers.py b/babel/messages/checkers.py --- a/babel/messages/checkers.py +++ b/babel/messages/checkers.py @@ -18,6 +18,7 @@ from itertools import izip from babel.messages.catalog import TranslationError, PYTHON_FORMAT +from babel.util import set #: list of format chars that are compatible to each other _string_format_compatibilities = [ diff --git a/babel/messages/extract.py b/babel/messages/extract.py --- a/babel/messages/extract.py +++ b/babel/messages/extract.py @@ -22,14 +22,10 @@ """ import os -try: - set -except NameError: - from sets import Set as set import sys from tokenize import generate_tokens, COMMENT, NAME, OP, STRING -from babel.util import parse_encoding, pathmatch, relpath +from babel.util import parse_encoding, pathmatch, relpath, set from textwrap import dedent __all__ = ['extract', 'extract_from_dir', 'extract_from_file'] diff --git a/babel/messages/frontend.py b/babel/messages/frontend.py --- a/babel/messages/frontend.py +++ b/babel/messages/frontend.py @@ -1170,8 +1170,9 @@ def parse_keywords(strings=[]): """Parse keywords specifications from the given list of strings. - >>> kw = parse_keywords(['_', 'dgettext:2', 'dngettext:2,3']) - >>> for keyword, indices in sorted(kw.items()): + >>> kw = parse_keywords(['_', 'dgettext:2', 'dngettext:2,3']).items() + >>> kw.sort() + >>> for keyword, indices in kw: ... print (keyword, indices) ('_', None) ('dgettext', (2,)) diff --git a/babel/messages/jslexer.py b/babel/messages/jslexer.py --- a/babel/messages/jslexer.py +++ b/babel/messages/jslexer.py @@ -16,7 +16,8 @@ """ import re -from operator import itemgetter + +from babel.util import itemgetter operators = [ diff --git a/babel/messages/plurals.py b/babel/messages/plurals.py --- a/babel/messages/plurals.py +++ b/babel/messages/plurals.py @@ -13,9 +13,8 @@ """Plural form definitions.""" - -from operator import itemgetter from babel.core import default_locale, Locale +from babel.util import itemgetter LC_CTYPE = default_locale('LC_CTYPE') diff --git a/babel/messages/pofile.py b/babel/messages/pofile.py --- a/babel/messages/pofile.py +++ b/babel/messages/pofile.py @@ -21,14 +21,10 @@ from datetime import date, datetime import os import re -try: - set -except NameError: - from sets import Set as set from babel import __version__ as VERSION from babel.messages.catalog import Catalog, Message -from babel.util import wraptext, LOCALTZ +from babel.util import set, wraptext, LOCALTZ __all__ = ['read_po', 'write_po'] __docformat__ = 'restructuredtext en' @@ -207,7 +203,9 @@ context.append(line.rstrip()) for lineno, line in enumerate(fileobj.readlines()): - line = line.strip().decode(catalog.charset) + line = line.strip() + if not isinstance(line, unicode): + line = line.decode(catalog.charset) if line.startswith('#'): in_msgid[0] = in_msgstr[0] = False if messages and translations: diff --git a/babel/numbers.py b/babel/numbers.py --- a/babel/numbers.py +++ b/babel/numbers.py @@ -391,7 +391,10 @@ raise ValueError('Significant digit patterns can not contain ' '"@" or "0"') if '.' in number: - integer, fraction = number.rsplit('.', 1) + #integer, fraction = number.rsplit('.', 1) + # 2.3 compat: this is rsplit + parts = number.split('.') + integer, fraction = '.'.join(parts[:-1]), parts[-1] else: integer = number fraction = '' diff --git a/babel/plural.py b/babel/plural.py --- a/babel/plural.py +++ b/babel/plural.py @@ -14,10 +14,8 @@ """CLDR Plural support. See UTS #35. EXPERIMENTAL""" import re -try: - set -except NameError: - from sets import ImmutableSet as frozenset, Set as set + +from babel.util import frozenset, set __all__ = ['PluralRule', 'RuleError', 'to_gettext', 'to_javascript', 'to_python'] diff --git a/babel/support.py b/babel/support.py --- a/babel/support.py +++ b/babel/support.py @@ -20,17 +20,12 @@ from datetime import date, datetime, time, timedelta import gettext -try: - set -except NameError: - from sets import set - from babel.core import Locale from babel.dates import format_date, format_datetime, format_time, \ format_timedelta, LC_TIME from babel.numbers import format_number, format_decimal, format_currency, \ format_percent, format_scientific, LC_NUMERIC -from babel.util import UTC +from babel.util import set, UTC __all__ = ['Format', 'LazyProxy', 'Translations'] __docformat__ = 'restructuredtext en' diff --git a/babel/util.py b/babel/util.py --- a/babel/util.py +++ b/babel/util.py @@ -17,13 +17,21 @@ from datetime import timedelta, tzinfo import os import re -try: - set -except NameError: - from sets import Set as set import textwrap import time from itertools import izip, imap +try: + # assigned so they're importable + frozenset = frozenset + set = set +except NameError: + from sets import ImmutableSet as frozenset, Set as set +try: + from operator import itemgetter +except ImportError: + def itemgetter(item): + return lambda obj: obj[item] + missing = object() __all__ = ['distinct', 'pathmatch', 'relpath', 'wraptext', 'odict', 'UTC',