Tres Seaver
2013-12-17 19d2190b6240a7b7a9fdfc536e6ec865cd5ddf07
middleware:  don't barf when wrapped generater yields no items.

Fixes: http://bugs.repoze.org/issue184
3 files modified
14 ■■■■■ changed files
CHANGES.rst 3 ●●●●● patch | view | raw | blame | history
repoze/who/middleware.py 4 ●●● patch | view | raw | blame | history
repoze/who/tests/test_middleware.py 7 ●●●●● patch | view | raw | blame | history
CHANGES.rst
@@ -4,6 +4,9 @@
Unreleased
----------
- middleware:  avoid UnboundLocalError when wrapped generater yields no
  items.  See:  http://bugs.repoze.org/issue184
- Make cookie expiration date RFC-2616 compliant (independent of locale,
  including 'GMT' zone). See https://github.com/repoze/repoze.who/pull/11
repoze/who/middleware.py
@@ -135,6 +135,7 @@
    close = getattr(result, 'close', lambda: None)
    # Neat trick to pull the first iteration only. We need to do this outside
    # of the generator function to ensure it is called.
    first = marker = []
    for iter in result:
        first = iter
        break
@@ -142,7 +143,8 @@
    # Wrapper yields the first iteration, then passes result's iterations
    # directly up.
    def wrapper():
        yield first
        if first is not marker:
            yield first
        for iter in result:
            # We'll let result's StopIteration bubble up directly.
            yield iter
repoze/who/tests/test_middleware.py
@@ -539,6 +539,13 @@
        self.assertEqual(L, ['yo!'])
        self.assertEqual(list(newgen), ['a', 'b'])
    def test_w_empty_generator(self):
        def gen():
            if False:
                yield 'a'
        newgen = self._callFUT(gen())
        self.assertEqual(list(newgen), [])
    def test_w_iterator_having_close(self):
        def gen():
            yield 'a'