diff --git a/COPYING.txt b/COPYING.txt index 2a01f5cb8..4181e2d17 100644 --- a/COPYING.txt +++ b/COPYING.txt @@ -49,6 +49,12 @@ mapproxy/util/ext/dictspec/*.py (c) 2011 by Oliver Tonnhofer, Omniscale. MIT license. +mapproxy/util/ext/itertools.py +------------------------------ +# Copyright © 2001-2012 Python Software Foundation; All Rights Reserved +# http://docs.python.org/library/itertools.html#itertools.izip_longest +PSF license. + mapproxy/test/schemas/* ----------------------- Copyright (c) 1994 - 2010 Open Geospatial Consortium, Inc diff --git a/mapproxy/seed/seeder.py b/mapproxy/seed/seeder.py index 04a27f814..ba7a25bc6 100644 --- a/mapproxy/seed/seeder.py +++ b/mapproxy/seed/seeder.py @@ -16,12 +16,12 @@ from __future__ import with_statement, division import sys from contextlib import contextmanager -from itertools import izip_longest from mapproxy.config import base_config from mapproxy.grid import MetaGrid from mapproxy.source import SourceError from mapproxy.util import local_base_config +from mapproxy.util.ext.itertools import izip_longest from mapproxy.util.lock import LockTimeout from mapproxy.seed.util import format_seed_task from mapproxy.seed.cachelock import DummyCacheLocker, CacheLockedError diff --git a/mapproxy/util/ext/itertools.py b/mapproxy/util/ext/itertools.py new file mode 100644 index 000000000..dfea99324 --- /dev/null +++ b/mapproxy/util/ext/itertools.py @@ -0,0 +1,29 @@ +# missing izip_longest function for Python 2.5 compatibility +# http://docs.python.org/library/itertools.html#itertools.izip_longest +# Copyright 2001-2012 Python Software Foundation; All Rights Reserved + +from __future__ import absolute_import +import itertools + +if hasattr(itertools, 'izip_longest'): + izip_longest = itertools.izip_longest +else: + class ZipExhausted(Exception): + pass + + def izip_longest(*args, **kwds): + # izip_longest('ABCD', 'xy', fillvalue='-') --> Ax By C- D- + fillvalue = kwds.get('fillvalue') + counter = [len(args) - 1] + def sentinel(): + if not counter[0]: + raise ZipExhausted + counter[0] -= 1 + yield fillvalue + fillers = itertools.repeat(fillvalue) + iterators = [itertools.chain(it, sentinel(), fillers) for it in args] + try: + while iterators: + yield tuple(i.next() for i in iterators) + except ZipExhausted: + pass \ No newline at end of file diff --git a/mapproxy/util/ext/odict.py b/mapproxy/util/ext/odict.py index 9a58f99dc..68c3a2421 100644 --- a/mapproxy/util/ext/odict.py +++ b/mapproxy/util/ext/odict.py @@ -106,6 +106,7 @@ def __setitem__(self, key, value): :copyright: (c) 2008 by Armin Ronacher and PEP 273 authors. :license: modified BSD license. """ +from __future__ import absolute_import from itertools import izip, imap from copy import deepcopy @@ -130,7 +131,7 @@ class odict(dict): >>> d.update({'foo': 'bar'}) >>> d odict.odict([('a', 'b'), ('c', 'd'), ('foo', 'bar')]) - + Keep in mind that when updating from dict-literals the order is not preserved as these dicts are unsorted! @@ -179,7 +180,7 @@ class odict(dict): >>> d.reverse() >>> d odict.odict([('spam', []), ('foo', 'bar'), ('c', 'd'), ('a', 'b')]) - + And sort it like a list: >>> d.sort(key=lambda x: x[0].lower())