Projet

Général

Profil

0001-add-uwsgidecorators-module-57019.patch

Benjamin Dauvergne, 16 septembre 2021 19:17

Télécharger (3,31 ko)

Voir les différences:

Subject: [PATCH] add uwsgidecorators module (#57019)

 hobo/multitenant/uwsgidecorators.py       | 53 +++++++++++++++++++++++
 tests_multitenant/test_uwsgidecorators.py | 41 ++++++++++++++++++
 2 files changed, 94 insertions(+)
 create mode 100644 hobo/multitenant/uwsgidecorators.py
 create mode 100644 tests_multitenant/test_uwsgidecorators.py
hobo/multitenant/uwsgidecorators.py
1
# Copyright (C) 2021 Entr'ouvert
2

  
3
import logging
4
import pickle
5

  
6
try:
7
    import uwsgi
8
except ImportError:
9
    uwsgi = None
10

  
11
logger = logging.getLogger(__name__)
12

  
13
spooler_registry = {}
14

  
15

  
16
def spool(func):
17
    name = '%s.%s' % (func.__module__, func.__name__)
18
    spooler_registry[name] = func
19

  
20
    def spool_function(*args, **kwargs):
21
        uwsgi.spool(name=name.encode(), body=pickle.dumps({'args': args, 'kwargs': kwargs}))
22

  
23
    func.spool = spool_function
24
    return func
25

  
26

  
27
if uwsgi:
28

  
29
    def spooler_function(env):
30
        try:
31
            try:
32
                name = env.get('name').decode()
33
                body = env.get('body')
34
            except Exception:
35
                logger.error('spooler: no name or body found: env.keys()=%s', env.keys())
36
                return uwsgi.SPOOL_OK
37
            try:
38
                params = pickle.loads(body)
39
                args = params['args']
40
                kwargs = params['kwargs']
41
            except Exception:
42
                logger.exception('spooler: depickling of body failed')
43
                return uwsgi.SPOOL_OK
44
            try:
45
                function = spooler_registry[name]
46
            except KeyError:
47
                logger.error('spooler: no function named "%s"', name)
48
            function(*args, **kwargs)
49
        except Exception:
50
            logger.exception('spooler: function "%s" raied')
51
        return uwsgi.SPOOL_OK
52

  
53
    uwsgi.spooler = spooler_function
tests_multitenant/test_uwsgidecorators.py
1
import importlib
2
import pickle
3

  
4
import mock
5
import pytest
6

  
7
import hobo.multitenant.uwsgidecorators
8

  
9

  
10
@pytest.fixture
11
def uwsgi():
12
    import sys
13

  
14
    uwsgi = mock.Mock()
15
    uwsgi.SPOOL_OK = -2
16
    sys.modules['uwsgi'] = uwsgi
17
    importlib.reload(hobo.multitenant.uwsgidecorators)
18
    yield uwsgi
19
    del sys.modules['uwsgi']
20

  
21

  
22
def test_basic():
23
    @hobo.multitenant.uwsgidecorators.spool
24
    def function(a, b):
25
        pass
26

  
27
    function(1, 2)
28
    with pytest.raises(AttributeError):
29
        function.spool(1, 2)
30

  
31

  
32
def test_mocked_uwsgi(uwsgi):
33
    @hobo.multitenant.uwsgidecorators.spool
34
    def function(a, b):
35
        pass
36

  
37
    function(1, 2)
38
    function.spool(1, 2)
39
    assert set(uwsgi.spool.call_args[1].keys()) == {'body', 'name'}
40
    assert pickle.loads(uwsgi.spool.call_args[1]['body']) == {'args': (1, 2), 'kwargs': {}}
41
    assert uwsgi.spool.call_args[1]['name'] == b'test_uwsgidecorators.function'
0
-