Пример #1
0
    def _test_execution(self):

        yawf.clear_polices()

        class E(yawf.Policy):
            def __call__(self):
                raise RuntimeError()

            @property
            def dependencies(self):
                return [('F', {
                    'name': 'F',
                })]

        class F(yawf.Policy):
            pass

        yawf.register_policy(E)
        yawf.register_policy(F)

        work_flow = yawf.new_work_flow(
            'foo work flow', lambda work_flow: yawf.WorkFlowEngine.instance.
            node_model(work_flow=work_flow, name='E', policy_name='E'))
        try:
            work_flow.start()
        except yawf.exceptions.WorkFlowDelayed, e:
            delayed_node = e.node
Пример #2
0
    def _test_single_node(self):

        yawf.clear_polices()

        class FooPolicy(yawf.Policy):
            pass

        yawf.register_policy(FooPolicy)

        _NodeModel = yawf.WorkFlowEngine.instance.node_model

        with patch.object(FooPolicy, "__call__") as mock_method1:
            with patch.object(FooPolicy, "on_approved") as mock_method2:
                with patch.object(FooPolicy, "after_executed") as mock_method3:
                    work_flow = yawf.new_work_flow(
                        'foo work flow',
                        lambda work_flow: _NodeModel(work_flow=work_flow,
                                                     name='foo task',
                                                     policy_name='FooPolicy'))
                    work_flow.start()
                    mock_method1.assert_called_once_with()
                    mock_method2.assert_called_once_with()
                    mock_method3.assert_called_once_with()
                    assert work_flow.status == yawf.constants.WORK_FLOW_EXECUTED

        with patch.object(FooPolicy, "__call__") as mock_method1:
            with patch.object(FooPolicy, "on_approved") as mock_method2:
                with patch.object(FooPolicy, "after_executed") as mock_method3:
                    with patch.object(FooPolicy, "on_refused") as mock_method4:
                        work_flow = yawf.new_work_flow(
                            'foo work flow', lambda work_flow: _NodeModel(
                                work_flow=work_flow,
                                name='foo task',
                                policy_name='FooPolicy'))
                        work_flow.root_node.refuse()
                        assert mock_method1.call_count == 0
                        assert mock_method2.call_count == 0
                        assert mock_method3.call_count == 0
                        mock_method4.assert_called_once_with(True)
                        assert work_flow.status == yawf.constants.WORK_FLOW_REFUSED

        work_flow = yawf.new_work_flow(
            'foo work flow',
            lambda work_flow: yawf.WorkFlowEngine.instance.node_model(
                work_flow=work_flow, name='foo task', policy_name='FooPolicy'))
        work_flow.start()
        raises(yawf.exceptions.NodeAlreadyApproved,
               work_flow.root_node.approve)
Пример #3
0
    def _test_binding(self):

        yawf.clear_polices()

        class G(yawf.Policy):
            pass

        yawf.register_policy(G)

        work_flow = yawf.new_work_flow(
            'foo work flow',
            lambda work_flow: yawf.WorkFlowEngine.instance.node_model(
                work_flow=work_flow, name='G', policy_name='G'),
            token='foo')

        assert yawf.token_bound('foo work flow', 'foo')

        work_flow.start()
        assert not yawf.token_bound('foo work flow', 'foo')
Пример #4
0

class Travel(yawf.Policy):
    @property
    def dependencies(self):
        return [("PermitTravel", {
            'name':
            'permit travel application',
            'handler_group':
            models.Group.query.filter(models.Group.name == 'Clerks').one(),
            'tag':
            self.node.tag,
        })]


register_policy(Travel)


class PermitTravel(yawf.Policy):

    pass


register_policy(PermitTravel)


@app.route("/")
def index():
    return redirect(url_for('node_list_view'))

Пример #5
0
        os.path.join(os.environ["LITE_MMS_HOME"], "config.py"), silent=True)
app.config.from_pyfile(os.path.join(os.getcwd(), "config.py"), silent=True)
from flask.ext.login import LoginManager, current_user
login_manager = LoginManager()
login_manager.init_app(app)
from flask.ext.principal import Principal, Permission


import yawf

from lite_mms.database import db
from lite_mms import models
yawf.WorkFlowEngine(db, models.Node)
import yawf.models
from lite_mms.apis.delivery import CreateDeliveryTaskWithAbnormalWeight, PermitDeliveryTaskWithAbnormalWeight
yawf.register_policy(CreateDeliveryTaskWithAbnormalWeight)
yawf.register_policy(PermitDeliveryTaskWithAbnormalWeight)

principal = Principal(app)

import logging
import logging.handlers

logging.basicConfig(level=logging.DEBUG)

file_handler = logging.handlers.TimedRotatingFileHandler(
    app.config["LOG_FILE"], 'D', 1, 10, "utf-8")
file_handler.setFormatter(
    logging.Formatter('%(asctime)s - %(levelname)s: %(message)s'))
file_handler.suffix = "%Y%m%d.log"
app.logger.addHandler(file_handler)
Пример #6
0
    def _test_multiple_node(self):

        yawf.clear_polices()

        class A(yawf.Policy):
            @property
            def dependencies(self):
                return [('B', {'name': 'B'}), ('C', {'name': 'C'})]

        class B(yawf.Policy):
            pass

        class C(yawf.Policy):
            @property
            def dependencies(self):
                return [('D', {'name': 'D'})]

        class D(yawf.Policy):
            pass

        yawf.register_policy(A)
        yawf.register_policy(B)
        yawf.register_policy(C)
        yawf.register_policy(D)

        with patch.object(A, "__call__") as call_a:
            with patch.object(B, "__call__") as call_b:
                with patch.object(C, "__call__") as call_c:
                    with patch.object(D, "__call__") as call_d:
                        work_flow = yawf.new_work_flow(
                            'foo work flow',
                            lambda work_flow: yawf.WorkFlowEngine.instance.
                            node_model(work_flow=work_flow,
                                       name='A',
                                       policy_name='A'))
                        e_info = raises(yawf.exceptions.WorkFlowDelayed,
                                        work_flow.start)
                        assert work_flow.root_node.approved
                        delayed_node = e_info.value.node
                        assert not delayed_node.approved

                        e_info = raises(yawf.exceptions.WorkFlowDelayed,
                                        delayed_node.approve)
                        assert delayed_node.approved
                        delayed_node = e_info.value.node
                        assert not delayed_node.approved
                        assert delayed_node.id == work_flow.current_node_id

                        e_info = raises(yawf.exceptions.WorkFlowDelayed,
                                        delayed_node.approve)
                        assert delayed_node.approved
                        delayed_node = e_info.value.node
                        assert not delayed_node.approved

                        delayed_node.approve()
                        call_a.assert_called_once_with()
                        call_b.assert_called_once_with()
                        call_c.assert_called_once_with()
                        call_d.assert_called_once_with()

                        assert not delayed_node.failed
                        assert not work_flow.failed

        ## test refused
        with patch.object(B, "on_refused") as mock_method:
            work_flow = yawf.new_work_flow(
                'foo work flow', lambda work_flow: yawf.WorkFlowEngine.instance
                .node_model(work_flow=work_flow, name='A', policy_name='A'))
            try:
                work_flow.start()
            except yawf.exceptions.WorkFlowDelayed, e:
                delayed_node = e.node
            delayed_node.refuse()
            assert work_flow.status == yawf.constants.WORK_FLOW_REFUSED
            mock_method.assert_called_once_with(True)
            raises(yawf.exceptions.WorkFlowRefused, delayed_node.approve)
Пример #7
0
    def _test_web_services(self):

        yawf.clear_polices()

        class FooPolicy(yawf.Policy):
            pass

        yawf.register_policy(FooPolicy)
        work_flow = yawf.new_work_flow(
            'foo work flow', lambda work_flow: self.node_model(
                work_flow=work_flow, name='foo task', policy_name='FooPolicy'))
        work_flow.start()

        with self.app.test_client() as c:
            rv = c.get('/__flask_yawf__/node/' + str(work_flow.root_node.id))
            assert rv.status_code == 200
            d = json.loads(rv.data)
            assert d['id'] == work_flow.root_node.id
            assert d['work_flow_id'] == work_flow.id
            assert d['name'] == work_flow.root_node.name
            assert not d['failed']
            assert d['policy_name'] == 'FooPolicy'

        class A(yawf.Policy):
            @property
            def dependencies(self):
                return [('B', {'name': 'B'})]

        class B(yawf.Policy):

            pass

        yawf.register_policies(A, B)
        work_flow = yawf.new_work_flow(
            'foo work flow', lambda work_flow: self.node_model(
                work_flow=work_flow, name='foo task', policy_name='FooPolicy'))
        work_flow.start()
        with patch.object(B, '__call__') as mock_method1:
            with self.app.test_client() as c:
                rv = c.put('/__flask_yawf__/node/%d?action=approve' %
                           work_flow.root_node.id)
                assert rv.status_code == 200

                node = self.node_model.query.get(work_flow.root_node.id)
                assert node.approved
                assert mock_method1.call_count == 0

        work_flow = yawf.new_work_flow(
            'foo work flow', lambda work_flow: self.node_model(
                work_flow=work_flow, name='foo task', policy_name='FooPolicy'))
        work_flow.start()
        with patch.object(B, '__call__') as mock_method1:
            with patch.object(B, 'on_refused') as mock_method2:
                with patch.object(B, 'on_refused') as mock_method2:
                    rv = c.put('/__flask_yawf__/node/%d?action=refuse' %
                               work_flow.root_node.id)
                assert rv.status_code == 200

                root_node = self.node_model.query.get(work_flow.root_node.id)
                assert root_node.approved
                for node in root_node.dependencies:
                    assert not node.approved
                assert mock_method1.call_count == 0
                assert mock_method2.called_once_with(True)
                assert mock_method1.called_once_with(False)
Пример #8
0
        raises(RuntimeError, work_flow.execute)

        assert work_flow.failed
        assert not delayed_node.failed
        assert work_flow.root_node.failed
        assert work_flow.status == yawf.constants.WORK_FLOW_APPROVED

        class E_(yawf.Policy):
            @property
            def dependencies(self):
                return [('F', {
                    'name': 'F',
                })]

        yawf.register_policy(E_)
        work_flow = yawf.new_work_flow(
            'foo work flow', lambda work_flow: yawf.WorkFlowEngine.instance.
            node_model(work_flow=work_flow, name='E_', policy_name='E_'))
        try:
            work_flow.start()
        except yawf.exceptions.WorkFlowDelayed, e:
            delayed_node = e.node

        delayed_node.approve()
        assert work_flow.status == yawf.constants.WORK_FLOW_EXECUTED

    def _test_binding(self):

        yawf.clear_polices()
Пример #9
0
                                        "config.py"),
                           silent=True)
app.config.from_pyfile(os.path.join(os.getcwd(), "config.py"), silent=True)
from flask.ext.login import LoginManager, current_user
login_manager = LoginManager()
login_manager.init_app(app)
from flask.ext.principal import Principal, Permission

import yawf

from lite_mms.database import db
from lite_mms import models
yawf.WorkFlowEngine(db, models.Node)
import yawf.models
from lite_mms.apis.delivery import CreateDeliveryTaskWithAbnormalWeight, PermitDeliveryTaskWithAbnormalWeight
yawf.register_policy(CreateDeliveryTaskWithAbnormalWeight)
yawf.register_policy(PermitDeliveryTaskWithAbnormalWeight)

principal = Principal(app)

import logging
import logging.handlers

logging.basicConfig(level=logging.DEBUG)

file_handler = logging.handlers.TimedRotatingFileHandler(
    app.config["LOG_FILE"], 'D', 1, 10, "utf-8")
file_handler.setFormatter(
    logging.Formatter('%(asctime)s - %(levelname)s: %(message)s'))
file_handler.suffix = "%Y%m%d.log"
app.logger.addHandler(file_handler)