Example #1
0
def test_add_item_ignores_duplicate_resources():
    mock1 = Mock(spec=ResourceSet)

    res = ResourceSet('foo')
    res.add_item(mock1)
    res.add_item(mock1)

    assert len(res._items) == 1
Example #2
0
def test_add_item():
    res = ResourceSet('foo')

    assert len(res._items) == 0

    mock = Mock()
    res.add_item(mock)

    assert len(res._items) == 1
    assert res._items[0] == mock
Example #3
0
def test_resource_set_should_ignore_duplicate_executions():
    mock1 = ResourceSet('boo')
    mock1.apply = Mock()

    res = ResourceSet('foo')
    res.add_item(mock1)

    res.apply()
    res.apply()
    res.apply()
    mock1.apply.assert_called_once_with()
Example #4
0
 def get_root(self):
     if not self.root_resource_set:
         self.root_resource_set = ResourceSet('root')
         self.current_resource_set = self.root_resource_set
         self.resource_set_stack.append(self.root_resource_set)
         self.resource_set_list.append(self.root_resource_set)
     return self.root_resource_set
Example #5
0
def test_rollback_exec_sub_stets():
    mock1 = Mock(spec=ResourceSet)
    mock1.is_executed.return_value = False
    mock2 = Mock(spec=ResourceSet, return_value=False)
    mock2.is_executed.return_value = False
    mock3 = Mock(spec=ResourceSet, return_value=False)
    mock3.is_executed.return_value = False

    res = ResourceSet('foo')
    res.add_item(mock1)
    res.add_item(mock2)
    res.add_item(mock3)

    res.rollback()
    mock1.rollback.assert_called_once_with()
    mock2.rollback.assert_called_once_with()
    mock3.rollback.assert_called_once_with()
Example #6
0
def test_apply_in_rollback_mode():
    mock1 = Mock(spec=ResourceSet)
    mock1.is_executed.return_value = False
    mock2 = Mock(spec=ResourceSet)
    mock2.is_executed.return_value = False
    mock3 = Mock(spec=ResourceSet)
    mock3.is_executed.return_value = False

    res = ResourceSet('foo')
    res.add_item(mock1)
    res.add_item(mock2)
    res.add_item(mock3)
    res.rollback_mode = True

    res.apply()
    mock1.rollback.assert_called_once_with()
    mock1.mark_executed.assert_called_once_with()
    mock2.rollback.assert_called_once_with()
    mock2.mark_executed.assert_called_once_with()
    mock3.rollback.assert_called_once_with()
    mock3.mark_executed.assert_called_once_with()
Example #7
0
def test_apply_exec_sub_stets():
    mock1 = Mock(spec=ResourceSet)
    mock1.is_executed.return_value = False
    mock2 = Mock(spec=ResourceSet)
    mock2.is_executed.return_value = False
    mock3 = Mock(spec=ResourceSet)
    mock3.is_executed.return_value = False

    res = ResourceSet('foo')
    res.add_item(mock1)
    res.add_item(mock2)
    res.add_item(mock3)

    res.apply()
    mock1.apply.assert_called_once_with()
    mock1.mark_executed.assert_called_once_with()
    mock2.apply.assert_called_once_with()
    mock2.mark_executed.assert_called_once_with()
    mock3.apply.assert_called_once_with()
    mock3.mark_executed.assert_called_once_with()
Example #8
0
class Context(object):
    """
    Worker collects resources and builds resource tree
    """

    resources = None
    # this list holds all references to all resources
    resource_set_list = None

    # this list is used as a stack to determine current position inside resource_set tree
    resource_set_stack = None

    current_resource_set = None
    root_resource_set = None

    env = None

    def __init__(self):
        self.reset()

    def changeset(self):
        return ChangeSet(self.root_resource_set.apply())

    def reset(self):
        self.env = Environment()
        self.resources = {}
        self.resource_set_list = []
        self.resource_set_stack = []
        self.resource_set_stack = []
        self.current_resource_set = None
        self.root_resource_set = None

    # internal methods
    def register_resource(self, resource):
        """
        Register resource or merge if it has conflicting id

        @param resource: Resource
        """

        ids = resource.get_resource_keys()

        if ids is None:
            return

        items_to_add = []
        if not ids:
            items_to_add.append(resource)
        else:
            for id_ in ids:
                if id_ in self.resources:
                    self.resources[id_].resolve_conflict(resource)
                    items_to_add.append(self.resources[id_])
                else:
                    self.resources[id_] = resource
                    items_to_add.append(resource)

        for item in items_to_add:
            self.current_resource_set.add_item(item)

    def resource_set_begin(self, resource_set_instance):
        """

        @param resource_set_instance:
        @return:
        """

        current = self.get_current()

        # resource_set stack - push
        self.resource_set_stack.append(resource_set_instance)

        current.add_item(resource_set_instance)

        self.current_resource_set = resource_set_instance

        # add to resource list
        self.resource_set_list.append(resource_set_instance)

    def resource_set_end(self):
        """
        Switch back to parent resource_set
        """

        # resource_set stack - pop
        self.resource_set_stack.pop()
        if len(self.resource_set_stack) == 0:
            self.current_resource_set = None
        else:
            self.current_resource_set = self.resource_set_stack[-1]

    def get_root(self):
        if not self.root_resource_set:
            self.root_resource_set = ResourceSet('root')
            self.current_resource_set = self.root_resource_set
            self.resource_set_stack.append(self.root_resource_set)
            self.resource_set_list.append(self.root_resource_set)
        return self.root_resource_set

    def get_current(self):
        return self.current_resource_set or self.get_root()

    def apply(self, *args):
        res = self.get_current()
        for resource in args:
            res.add_item(resource)

    def to_xml(self):
        root = BeautifulSoup().new_tag("context")
        if self.root_resource_set:
            root.append(self.root_resource_set.to_xml())

        return root