def test_exception_swallowing():
    class SwallowingContextManager(ContextManager):
        def __init__(self):
            self.times_entered = 0
            self.times_exited = 0

        def __enter__(self):
            self.times_entered += 1
            return self

        def __exit__(self, exc_type, exc_value, exc_traceback):
            self.times_exited += 1
            if isinstance(exc_value, MyException):
                return True

    swallowing_rcm = as_reentrant(SwallowingContextManager())

    my_set = set()

    with swallowing_rcm:
        my_set.add(0)
        with swallowing_rcm:
            my_set.add(1)
            with swallowing_rcm:
                my_set.add(2)
                with swallowing_rcm:
                    my_set.add(3)
                    with swallowing_rcm:
                        my_set.add(4)
                        raise MyException
                    my_set.add(5)
                my_set.add(6)
            my_set.add(7)
        my_set.add(8)
    assert my_set == set((0, 1, 2, 3, 4))
def test_exception_swallowing():
    class SwallowingContextManager(ContextManager):
        def __init__(self):
            self.times_entered = 0
            self.times_exited = 0

        def __enter__(self):
            self.times_entered += 1
            return self

        def __exit__(self, exc_type, exc_value, exc_traceback):
            self.times_exited += 1
            if isinstance(exc_value, MyException):
                return True

    swallowing_rcm = as_reentrant(SwallowingContextManager())

    my_set = set()

    with swallowing_rcm:
        my_set.add(0)
        with swallowing_rcm:
            my_set.add(1)
            with swallowing_rcm:
                my_set.add(2)
                with swallowing_rcm:
                    my_set.add(3)
                    with swallowing_rcm:
                        my_set.add(4)
                        raise MyException
                    my_set.add(5)
                my_set.add(6)
            my_set.add(7)
        my_set.add(8)
    assert my_set == {0, 1, 2, 3, 4}
def test_order_of_depth_modification():
    depth_log = queue_module.Queue()
    
    class JohnnyContextManager(ContextManager):
        def __enter__(self):
            depth_log.put(johnny_reentrant_context_manager.depth)
            return self
        def __exit__(self, exc_type, exc_value, exc_traceback):
            depth_log.put(johnny_reentrant_context_manager.depth)
        
    johnny_reentrant_context_manager = as_reentrant(JohnnyContextManager())
    assert johnny_reentrant_context_manager.depth == 0
    with johnny_reentrant_context_manager:
        assert johnny_reentrant_context_manager.depth == 1
        
        # `.__wrapped__.__enter__` saw a depth of 0, because the depth
        # increment happens *after* `.__wrapped__.__enter__` is called:
        assert depth_log.get(block=False) == 0
        
        with johnny_reentrant_context_manager:
            
            assert johnny_reentrant_context_manager.depth == 2
            assert depth_log.qsize() == 0 # We're in a depth greater than 1,
                                          # so `.__wrapped__.__enter__` wasn't 
                                          # even called.
                                          
        assert johnny_reentrant_context_manager.depth == 1
        
        assert depth_log.qsize() == 0 # We came out of a depth greater than 1,
                                      # so `.__wrapped__.__enter__` wasn't even
                                      # called.
                                      
    # `.__wrapped__.__enter__` saw a depth of 1, because the depth decrement
    # happens *after* `.__wrapped__.__enter__` is called:
    assert depth_log.get(block=False) == 1
def test_order_of_depth_modification():
    depth_log = queue_module.Queue()

    class JohnnyContextManager(ContextManager):
        def __enter__(self):
            depth_log.put(johnny_reentrant_context_manager.depth)
            return self

        def __exit__(self, exc_type, exc_value, exc_traceback):
            depth_log.put(johnny_reentrant_context_manager.depth)

    johnny_reentrant_context_manager = as_reentrant(JohnnyContextManager())
    assert johnny_reentrant_context_manager.depth == 0
    with johnny_reentrant_context_manager:
        assert johnny_reentrant_context_manager.depth == 1

        # `.__wrapped__.__enter__` saw a depth of 0, because the depth
        # increment happens *after* `.__wrapped__.__enter__` is called:
        assert depth_log.get(block=False) == 0

        with johnny_reentrant_context_manager:

            assert johnny_reentrant_context_manager.depth == 2
            assert depth_log.qsize() == 0  # We're in a depth greater than 1,
            # so `.__wrapped__.__enter__` wasn't
            # even called.

        assert johnny_reentrant_context_manager.depth == 1

        assert depth_log.qsize() == 0  # We came out of a depth greater than 1,
        # so `.__wrapped__.__enter__` wasn't even
        # called.

    # `.__wrapped__.__enter__` saw a depth of 1, because the depth decrement
    # happens *after* `.__wrapped__.__enter__` is called:
    assert depth_log.get(block=False) == 1
def test_reentrant_context_manager():
    '''Test the basic workings of `ReentrantContextManager`.'''
    class MyContextManager(ContextManager):
        def __init__(self):
            self.times_entered = 0
            self.times_exited = 0

        def __enter__(self):
            self.times_entered += 1
            return self.times_entered

        def __exit__(self, exc_type, exc_value, exc_traceback):
            self.times_exited += 1

    get_reentrant_context_manager = lambda: as_reentrant(MyContextManager())

    my_rcm = get_reentrant_context_manager()
    assert my_rcm.__wrapped__.times_entered == 0
    assert my_rcm.__wrapped__.times_exited == 0

    with my_rcm as enter_return_value:
        assert enter_return_value == 1
        assert my_rcm.__wrapped__.times_entered == 1
        assert my_rcm.__wrapped__.times_exited == 0
        with my_rcm as enter_return_value:
            with my_rcm as enter_return_value:
                assert enter_return_value == 1
                assert my_rcm.__wrapped__.times_entered == 1
                assert my_rcm.__wrapped__.times_exited == 0
            assert enter_return_value == 1
            assert my_rcm.__wrapped__.times_entered == 1
            assert my_rcm.__wrapped__.times_exited == 0

    assert my_rcm.__wrapped__.times_entered == 1
    assert my_rcm.__wrapped__.times_exited == 1

    with my_rcm as enter_return_value:
        assert enter_return_value == 2
        assert my_rcm.__wrapped__.times_entered == 2
        assert my_rcm.__wrapped__.times_exited == 1
        with my_rcm as enter_return_value:
            with my_rcm as enter_return_value:
                assert enter_return_value == 2
                assert my_rcm.__wrapped__.times_entered == 2
                assert my_rcm.__wrapped__.times_exited == 1
            assert enter_return_value == 2
            assert my_rcm.__wrapped__.times_entered == 2
            assert my_rcm.__wrapped__.times_exited == 1

    with cute_testing.RaiseAssertor(MyException):
        with my_rcm as enter_return_value:
            assert enter_return_value == 3
            assert my_rcm.__wrapped__.times_entered == 3
            assert my_rcm.__wrapped__.times_exited == 2
            with my_rcm as enter_return_value:
                with my_rcm as enter_return_value:
                    assert enter_return_value == 3
                    assert my_rcm.__wrapped__.times_entered == 3
                    assert my_rcm.__wrapped__.times_exited == 2
                assert enter_return_value == 3
                assert my_rcm.__wrapped__.times_entered == 3
                assert my_rcm.__wrapped__.times_exited == 2
                raise MyException
# Copyright 2009-2017 Ram Rachum.
# This program is distributed under the MIT license.

'''Testing module for `python_toolbox.caching.CachedProperty`.'''

import nose

from python_toolbox import context_management
from python_toolbox import misc_tools

from python_toolbox.caching import cache, CachedType, CachedProperty
from python_toolbox.context_management import (as_idempotent, as_reentrant,
                                               BlankContextManager)

get_depth_counting_context_manager = \
                                    lambda: as_reentrant(BlankContextManager())


@misc_tools.set_attributes(i=0)
def counting_func(self):
    '''Return a bigger number every time.'''
    try:
        return counting_func.i
    finally:
        counting_func.i += 1
    
        
def test():
    '''Test basic workings of `CachedProperty`.'''    
    class A:
        personality = CachedProperty(counting_func)
Beispiel #7
0
# Copyright 2009-2017 Ram Rachum.
# This program is distributed under the MIT license.

'''Test the `python_toolbox.context_management.nested` function.'''

from python_toolbox import freezing
from python_toolbox import cute_testing

from python_toolbox.context_management import (BlankContextManager, nested,
                                               as_reentrant)

get_depth_counting_context_manager = \
                                    lambda: as_reentrant(BlankContextManager())


def test_nested():
    '''Test the basic workings of `nested`.'''

    a = get_depth_counting_context_manager()
    b = get_depth_counting_context_manager()
    c = get_depth_counting_context_manager()

    with nested(a):
        assert (a.depth, b.depth, c.depth) == (1, 0, 0)
        with nested(a, b):
            assert (a.depth, b.depth, c.depth) == (2, 1, 0)
            with nested(a, b, c):
                assert (a.depth, b.depth, c.depth) == (3, 2, 1)

        with nested(c):
            assert (a.depth, b.depth, c.depth) == (1, 0, 1)
def test_reentrant_context_manager():
    """Test the basic workings of `ReentrantContextManager`."""

    class MyContextManager(ContextManager):
        def __init__(self):
            self.times_entered = 0
            self.times_exited = 0

        def __enter__(self):
            self.times_entered += 1
            return self.times_entered

        def __exit__(self, exc_type, exc_value, exc_traceback):
            self.times_exited += 1

    get_reentrant_context_manager = lambda: as_reentrant(MyContextManager())

    my_rcm = get_reentrant_context_manager()
    assert my_rcm.__wrapped__.times_entered == 0
    assert my_rcm.__wrapped__.times_exited == 0

    with my_rcm as enter_return_value:
        assert enter_return_value == 1
        assert my_rcm.__wrapped__.times_entered == 1
        assert my_rcm.__wrapped__.times_exited == 0
        with my_rcm as enter_return_value:
            with my_rcm as enter_return_value:
                assert enter_return_value == 1
                assert my_rcm.__wrapped__.times_entered == 1
                assert my_rcm.__wrapped__.times_exited == 0
            assert enter_return_value == 1
            assert my_rcm.__wrapped__.times_entered == 1
            assert my_rcm.__wrapped__.times_exited == 0

    assert my_rcm.__wrapped__.times_entered == 1
    assert my_rcm.__wrapped__.times_exited == 1

    with my_rcm as enter_return_value:
        assert enter_return_value == 2
        assert my_rcm.__wrapped__.times_entered == 2
        assert my_rcm.__wrapped__.times_exited == 1
        with my_rcm as enter_return_value:
            with my_rcm as enter_return_value:
                assert enter_return_value == 2
                assert my_rcm.__wrapped__.times_entered == 2
                assert my_rcm.__wrapped__.times_exited == 1
            assert enter_return_value == 2
            assert my_rcm.__wrapped__.times_entered == 2
            assert my_rcm.__wrapped__.times_exited == 1

    with cute_testing.RaiseAssertor(MyException):
        with my_rcm as enter_return_value:
            assert enter_return_value == 3
            assert my_rcm.__wrapped__.times_entered == 3
            assert my_rcm.__wrapped__.times_exited == 2
            with my_rcm as enter_return_value:
                with my_rcm as enter_return_value:
                    assert enter_return_value == 3
                    assert my_rcm.__wrapped__.times_entered == 3
                    assert my_rcm.__wrapped__.times_exited == 2
                assert enter_return_value == 3
                assert my_rcm.__wrapped__.times_entered == 3
                assert my_rcm.__wrapped__.times_exited == 2
                raise MyException