Browse Source

Merge branch 'fix/better_runner' of github.com:tracim/tracim_backend into fix/few_more_tests

Guénaël Muller 6 years ago
parent
commit
6f399a4615

+ 9 - 1
development.ini.sample View File

@@ -2,7 +2,9 @@
2 2
 # app configuration
3 3
 # https://docs.pylonsproject.org/projects/pyramid/en/latest/narr/environment.html
4 4
 ###
5
-[app:main]
5
+[pipeline:main]
6
+pipeline = tracim_web
7
+[app:tracim_web]
6 8
 use = egg:tracim_backend
7 9
 
8 10
 pyramid.reload_templates = true
@@ -13,6 +15,12 @@ pyramid.default_locale_name = en
13 15
 pyramid.includes =
14 16
     pyramid_debugtoolbar
15 17
 
18
+[pipeline:webdav]
19
+pipeline = tracim_webdav
20
+[app:tracim_webdav]
21
+use = egg:tracim_backend#webdav
22
+
23
+[DEFAULT]
16 24
 sqlalchemy.url = sqlite:///%(here)s/tracim.sqlite
17 25
 
18 26
 retry.attempts = 3

+ 2 - 1
setup.py View File

@@ -95,7 +95,8 @@ setup(
95 95
     install_requires=requires,
96 96
     entry_points={
97 97
         'paste.app_factory': [
98
-            'main = tracim:main',
98
+            'main = tracim:web',
99
+            'webdav = tracim:webdav'
99 100
         ],
100 101
         'console_scripts': [
101 102
             'tracimcli = tracim.command:main',

+ 13 - 1
tracim/__init__.py View File

@@ -13,15 +13,18 @@ from tracim.lib.utils.authentification import basic_auth_check_credentials
13 13
 from tracim.lib.utils.authentification import BASIC_AUTH_WEBUI_REALM
14 14
 from tracim.lib.utils.authorization import AcceptAllAuthorizationPolicy
15 15
 from tracim.lib.utils.authorization import TRACIM_DEFAULT_PERM
16
+from tracim.lib.webdav import WebdavAppFactory
16 17
 from tracim.views import BASE_API_V2
17 18
 from tracim.views.core_api.session_controller import SessionController
18 19
 from tracim.views.errors import ErrorSchema
19 20
 from tracim.lib.utils.cors import add_cors_support
20 21
 
21 22
 
22
-def main(global_config, **settings):
23
+def web(global_config, **local_settings):
23 24
     """ This function returns a Pyramid WSGI application.
24 25
     """
26
+    settings = global_config
27
+    settings.update(local_settings)
25 28
     # set CFG object
26 29
     app_config = CFG(settings)
27 30
     app_config.configure_filedepot()
@@ -64,3 +67,12 @@ def main(global_config, **settings):
64 67
         'API of Tracim v2',
65 68
     )
66 69
     return configurator.make_wsgi_app()
70
+
71
+
72
+def webdav(global_config, **local_settings):
73
+    settings = global_config
74
+    settings.update(local_settings)
75
+    app_factory = WebdavAppFactory(
76
+        tracim_config_file_path=settings['__file__'],
77
+    )
78
+    return app_factory.get_wsgi_app()

+ 2 - 4
tracim/command/webdav.py View File

@@ -6,6 +6,7 @@ from waitress import serve
6 6
 
7 7
 from tracim.command import AppContextCommand
8 8
 from tracim.lib.webdav import WebdavAppFactory
9
+from wsgi import webdav_app
9 10
 
10 11
 
11 12
 class WebdavRunnerCommand(AppContextCommand):
@@ -22,8 +23,5 @@ class WebdavRunnerCommand(AppContextCommand):
22 23
         super(WebdavRunnerCommand, self).take_action(parsed_args)
23 24
         tracim_config = parsed_args.config_file
24 25
         # TODO - G.M - 16-04-2018 - Allow specific webdav config file
25
-        app_factory = WebdavAppFactory(
26
-            tracim_config_file_path=tracim_config,
27
-        )
28
-        app = app_factory.get_wsgi_app()
26
+        app = webdav_app(tracim_config)
29 27
         serve(app, port=app.config['port'], host=app.config['host'])

+ 21 - 14
tracim/lib/webdav/__init__.py View File

@@ -27,43 +27,37 @@ from tracim.models import get_engine, get_session_factory
27 27
 class WebdavAppFactory(object):
28 28
 
29 29
     def __init__(self,
30
-                 webdav_config_file_path: str = None,
31 30
                  tracim_config_file_path: str = None,
32 31
                  ):
33 32
         self.config = self._initConfig(
34
-            webdav_config_file_path,
35 33
             tracim_config_file_path
36 34
         )
37 35
 
38 36
     def _initConfig(self,
39
-                    webdav_config_file_path: str = None,
40 37
                     tracim_config_file_path: str = None
41 38
                     ):
42 39
         """Setup configuration dictionary from default,
43 40
          command line and configuration file."""
44
-        if not webdav_config_file_path:
45
-            webdav_config_file_path = DEFAULT_WEBDAV_CONFIG_FILE
46 41
         if not tracim_config_file_path:
47 42
             tracim_config_file_path = DEFAULT_TRACIM_CONFIG_FILE
48 43
 
49 44
         # Set config defaults
50 45
         config = DEFAULT_CONFIG.copy()
51 46
         temp_verbose = config["verbose"]
47
+        # Get pyramid Env
48
+        tracim_config_file_path = os.path.abspath(tracim_config_file_path)
49
+        config['tracim_config'] = tracim_config_file_path
50
+        settings = self._get_tracim_settings(config)
51
+        app_config = CFG(settings)
52 52
 
53
-        default_config_file = os.path.abspath(webdav_config_file_path)
53
+        default_config_file = os.path.abspath(settings['wsgidav.config_path'])
54 54
         webdav_config_file = self._readConfigFile(
55
-            webdav_config_file_path,
55
+            default_config_file,
56 56
             temp_verbose
57 57
             )
58 58
         # Configuration file overrides defaults
59 59
         config.update(webdav_config_file)
60 60
 
61
-        # Get pyramid Env
62
-        tracim_config_file_path = os.path.abspath(tracim_config_file_path)
63
-        config['tracim_config'] = tracim_config_file_path
64
-        settings = get_appsettings(config['tracim_config'])
65
-        app_config = CFG(settings)
66
-
67 61
         if not useLxml and config["verbose"] >= 1:
68 62
             print(
69 63
                 "WARNING: Could not import lxml: using xml instead (slower). "
@@ -93,10 +87,23 @@ class WebdavAppFactory(object):
93 87
         config['domaincontroller'] = TracimDomainController(
94 88
             presetdomain=None,
95 89
             presetserver=None,
96
-            app_config = app_config,
90
+            app_config=app_config,
97 91
         )
98 92
         return config
99 93
 
94
+    def _get_tracim_settings(
95
+            self,
96
+            default_config,
97
+    ):
98
+        """
99
+        Get tracim settings
100
+        """
101
+        global_conf = get_appsettings(default_config['tracim_config']).global_conf
102
+        local_conf = get_appsettings(default_config['tracim_config'], 'tracim_web')  # nopep8
103
+        settings = global_conf
104
+        settings.update(local_conf)
105
+        return settings
106
+
100 107
     # INFO - G.M - 13-04-2018 - Copy from
101 108
     # wsgidav.server.run_server._readConfigFile
102 109
     def _readConfigFile(self, config_file, verbose):

+ 4 - 1
tracim/lib/webdav/middlewares.py View File

@@ -256,7 +256,10 @@ class TracimEnv(BaseMiddleware):
256 256
         super().__init__(application, config)
257 257
         self._application = application
258 258
         self._config = config
259
-        self.settings = get_appsettings(config['tracim_config'])
259
+        global_conf = get_appsettings(config['tracim_config']).global_conf
260
+        local_conf = get_appsettings(config['tracim_config'], 'tracim_web')
261
+        self.settings = global_conf
262
+        self.settings.update(local_conf)
260 263
         self.engine = get_engine(self.settings)
261 264
         self.session_factory = get_session_factory(self.engine)
262 265
         self.app_config = CFG(self.settings)

+ 3 - 2
tracim/tests/__init__.py View File

@@ -20,7 +20,7 @@ from tracim.fixtures import FixturesLoader
20 20
 from tracim.fixtures.users_and_groups import Base as BaseFixture
21 21
 from tracim.config import CFG
22 22
 from tracim.extensions import hapic
23
-from tracim import main
23
+from tracim import web
24 24
 from webtest import TestApp
25 25
 
26 26
 
@@ -49,7 +49,8 @@ class FunctionalTest(unittest.TestCase):
49 49
         self.run_app()
50 50
 
51 51
     def run_app(self):
52
-        app = main({}, **self.settings)
52
+        app = web({}, **self.settings)
53
+        self.init_database(self.settings)
53 54
         self.testapp = TestApp(app)
54 55
 
55 56
     def init_database(self, settings):

+ 50 - 1
tracim/tests/library/test_webdav.py View File

@@ -3,8 +3,10 @@ import io
3 3
 
4 4
 import pytest
5 5
 from sqlalchemy.exc import InvalidRequestError
6
-
6
+from wsgidav.wsgidav_app import DEFAULT_CONFIG
7
+from tracim import WebdavAppFactory
7 8
 from tracim.lib.core.user import UserApi
9
+from tracim.lib.webdav import TracimDomainController
8 10
 from tracim.tests import eq_
9 11
 from tracim.lib.core.notifications import DummyNotifier
10 12
 from tracim.lib.webdav.dav_provider import Provider
@@ -15,6 +17,53 @@ from tracim.tests import StandardTest
15 17
 from tracim.fixtures.content import Content as ContentFixtures
16 18
 from tracim.fixtures.users_and_groups import Base as BaseFixture
17 19
 from wsgidav import util
20
+from unittest.mock import MagicMock
21
+
22
+
23
+class TestWebdavFactory(StandardTest):
24
+
25
+    def test_unit__initConfig__ok__nominal_case(self):
26
+        """
27
+        Check if config is correctly modify for wsgidav using mocked
28
+        wsgidav and tracim conf (as dict)
29
+        :return:
30
+        """
31
+        tracim_settings = {
32
+            'sqlalchemy.url': 'sqlite:///:memory:',
33
+            'user.auth_token.validity': '604800',
34
+            'depot_storage_dir': '/tmp/test/depot',
35
+            'depot_storage_name': 'test',
36
+            'preview_cache_dir': '/tmp/test/preview_cache',
37
+            'wsgidav.config_path': 'development.ini'
38
+
39
+        }
40
+        wsgidav_setting = DEFAULT_CONFIG.copy()
41
+        wsgidav_setting.update(
42
+            {
43
+               'root_path':  '',
44
+               'acceptbasic': True,
45
+               'acceptdigest': False,
46
+               'defaultdigest': False,
47
+            }
48
+        )
49
+        mock = MagicMock()
50
+        mock._initConfig = WebdavAppFactory._initConfig
51
+        mock._readConfigFile.return_value = wsgidav_setting
52
+        mock._get_tracim_settings.return_value = tracim_settings
53
+        config = mock._initConfig(mock)
54
+        assert config
55
+        assert config['acceptbasic'] is True
56
+        assert config['acceptdigest'] is False
57
+        assert config['defaultdigest'] is False
58
+        # TODO - G.M - 25-05-2018 - Better check for middleware stack config
59
+        assert 'middleware_stack' in config
60
+        assert len(config['middleware_stack']) == 7
61
+        assert 'root_path' in config
62
+        assert 'provider_mapping' in config
63
+        assert config['root_path'] in config['provider_mapping']
64
+        assert isinstance(config['provider_mapping'][config['root_path']], Provider)  # nopep8
65
+        assert 'domaincontroller' in config
66
+        assert isinstance(config['domaincontroller'], TracimDomainController)
18 67
 
19 68
 
20 69
 class TestWebDav(StandardTest):

+ 17 - 0
wsgi/__init__.py View File

@@ -0,0 +1,17 @@
1
+# coding=utf-8
2
+import plaster
3
+import pyramid.paster
4
+
5
+from tracim.lib.webdav import WebdavAppFactory
6
+
7
+
8
+def web_app(config_uri):
9
+    pyramid.paster.setup_logging(config_uri)
10
+    return pyramid.paster.get_app(config_uri)
11
+
12
+
13
+def webdav_app(config_uri):
14
+    config_uri = '{}#webdav'.format(config_uri)
15
+    plaster.setup_logging(config_uri)
16
+    loader = plaster.get_loader(config_uri, protocols=['wsgi'])
17
+    return loader.get_wsgi_app()

+ 2 - 4
wsgi/web.py View File

@@ -1,9 +1,7 @@
1 1
 # coding=utf-8
2 2
 # Runner for uwsgi
3 3
 import os
4
-import pyramid.paster
4
+from wsgi import web_app
5 5
 
6 6
 config_uri = os.environ['TRACIM_CONF_PATH']
7
-
8
-pyramid.paster.setup_logging(config_uri)
9
-application = pyramid.paster.get_app(config_uri)
7
+application = web_app(config_uri)

+ 2 - 7
wsgi/webdav.py View File

@@ -1,12 +1,7 @@
1 1
 # coding=utf-8
2 2
 # Runner for uwsgi
3
-from tracim.lib.webdav import WebdavAppFactory
4 3
 import os
4
+from wsgi import webdav_app
5 5
 
6 6
 config_uri = os.environ['TRACIM_CONF_PATH']
7
-webdav_config_uri = os.environ['TRACIM_WEBDAV_CONF_PATH']
8
-app_factory = WebdavAppFactory(
9
-    tracim_config_file_path=config_uri,
10
-    webdav_config_file_path=webdav_config_uri,
11
-)
12
-application = app_factory.get_wsgi_app()
7
+application = webdav_app(config_uri)