Преглед на файлове

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

Guénaël Muller преди 6 години
родител
ревизия
6f399a4615
променени са 11 файла, в които са добавени 125 реда и са изтрити 36 реда
  1. 9 1
      development.ini.sample
  2. 2 1
      setup.py
  3. 13 1
      tracim/__init__.py
  4. 2 4
      tracim/command/webdav.py
  5. 21 14
      tracim/lib/webdav/__init__.py
  6. 4 1
      tracim/lib/webdav/middlewares.py
  7. 3 2
      tracim/tests/__init__.py
  8. 50 1
      tracim/tests/library/test_webdav.py
  9. 17 0
      wsgi/__init__.py
  10. 2 4
      wsgi/web.py
  11. 2 7
      wsgi/webdav.py

+ 9 - 1
development.ini.sample Целия файл

2
 # app configuration
2
 # app configuration
3
 # https://docs.pylonsproject.org/projects/pyramid/en/latest/narr/environment.html
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
 use = egg:tracim_backend
8
 use = egg:tracim_backend
7
 
9
 
8
 pyramid.reload_templates = true
10
 pyramid.reload_templates = true
13
 pyramid.includes =
15
 pyramid.includes =
14
     pyramid_debugtoolbar
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
 sqlalchemy.url = sqlite:///%(here)s/tracim.sqlite
24
 sqlalchemy.url = sqlite:///%(here)s/tracim.sqlite
17
 
25
 
18
 retry.attempts = 3
26
 retry.attempts = 3

+ 2 - 1
setup.py Целия файл

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

+ 13 - 1
tracim/__init__.py Целия файл

13
 from tracim.lib.utils.authentification import BASIC_AUTH_WEBUI_REALM
13
 from tracim.lib.utils.authentification import BASIC_AUTH_WEBUI_REALM
14
 from tracim.lib.utils.authorization import AcceptAllAuthorizationPolicy
14
 from tracim.lib.utils.authorization import AcceptAllAuthorizationPolicy
15
 from tracim.lib.utils.authorization import TRACIM_DEFAULT_PERM
15
 from tracim.lib.utils.authorization import TRACIM_DEFAULT_PERM
16
+from tracim.lib.webdav import WebdavAppFactory
16
 from tracim.views import BASE_API_V2
17
 from tracim.views import BASE_API_V2
17
 from tracim.views.core_api.session_controller import SessionController
18
 from tracim.views.core_api.session_controller import SessionController
18
 from tracim.views.errors import ErrorSchema
19
 from tracim.views.errors import ErrorSchema
19
 from tracim.lib.utils.cors import add_cors_support
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
     """ This function returns a Pyramid WSGI application.
24
     """ This function returns a Pyramid WSGI application.
24
     """
25
     """
26
+    settings = global_config
27
+    settings.update(local_settings)
25
     # set CFG object
28
     # set CFG object
26
     app_config = CFG(settings)
29
     app_config = CFG(settings)
27
     app_config.configure_filedepot()
30
     app_config.configure_filedepot()
64
         'API of Tracim v2',
67
         'API of Tracim v2',
65
     )
68
     )
66
     return configurator.make_wsgi_app()
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 Целия файл

6
 
6
 
7
 from tracim.command import AppContextCommand
7
 from tracim.command import AppContextCommand
8
 from tracim.lib.webdav import WebdavAppFactory
8
 from tracim.lib.webdav import WebdavAppFactory
9
+from wsgi import webdav_app
9
 
10
 
10
 
11
 
11
 class WebdavRunnerCommand(AppContextCommand):
12
 class WebdavRunnerCommand(AppContextCommand):
22
         super(WebdavRunnerCommand, self).take_action(parsed_args)
23
         super(WebdavRunnerCommand, self).take_action(parsed_args)
23
         tracim_config = parsed_args.config_file
24
         tracim_config = parsed_args.config_file
24
         # TODO - G.M - 16-04-2018 - Allow specific webdav config file
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
         serve(app, port=app.config['port'], host=app.config['host'])
27
         serve(app, port=app.config['port'], host=app.config['host'])

+ 21 - 14
tracim/lib/webdav/__init__.py Целия файл

27
 class WebdavAppFactory(object):
27
 class WebdavAppFactory(object):
28
 
28
 
29
     def __init__(self,
29
     def __init__(self,
30
-                 webdav_config_file_path: str = None,
31
                  tracim_config_file_path: str = None,
30
                  tracim_config_file_path: str = None,
32
                  ):
31
                  ):
33
         self.config = self._initConfig(
32
         self.config = self._initConfig(
34
-            webdav_config_file_path,
35
             tracim_config_file_path
33
             tracim_config_file_path
36
         )
34
         )
37
 
35
 
38
     def _initConfig(self,
36
     def _initConfig(self,
39
-                    webdav_config_file_path: str = None,
40
                     tracim_config_file_path: str = None
37
                     tracim_config_file_path: str = None
41
                     ):
38
                     ):
42
         """Setup configuration dictionary from default,
39
         """Setup configuration dictionary from default,
43
          command line and configuration file."""
40
          command line and configuration file."""
44
-        if not webdav_config_file_path:
45
-            webdav_config_file_path = DEFAULT_WEBDAV_CONFIG_FILE
46
         if not tracim_config_file_path:
41
         if not tracim_config_file_path:
47
             tracim_config_file_path = DEFAULT_TRACIM_CONFIG_FILE
42
             tracim_config_file_path = DEFAULT_TRACIM_CONFIG_FILE
48
 
43
 
49
         # Set config defaults
44
         # Set config defaults
50
         config = DEFAULT_CONFIG.copy()
45
         config = DEFAULT_CONFIG.copy()
51
         temp_verbose = config["verbose"]
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
         webdav_config_file = self._readConfigFile(
54
         webdav_config_file = self._readConfigFile(
55
-            webdav_config_file_path,
55
+            default_config_file,
56
             temp_verbose
56
             temp_verbose
57
             )
57
             )
58
         # Configuration file overrides defaults
58
         # Configuration file overrides defaults
59
         config.update(webdav_config_file)
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
         if not useLxml and config["verbose"] >= 1:
61
         if not useLxml and config["verbose"] >= 1:
68
             print(
62
             print(
69
                 "WARNING: Could not import lxml: using xml instead (slower). "
63
                 "WARNING: Could not import lxml: using xml instead (slower). "
93
         config['domaincontroller'] = TracimDomainController(
87
         config['domaincontroller'] = TracimDomainController(
94
             presetdomain=None,
88
             presetdomain=None,
95
             presetserver=None,
89
             presetserver=None,
96
-            app_config = app_config,
90
+            app_config=app_config,
97
         )
91
         )
98
         return config
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
     # INFO - G.M - 13-04-2018 - Copy from
107
     # INFO - G.M - 13-04-2018 - Copy from
101
     # wsgidav.server.run_server._readConfigFile
108
     # wsgidav.server.run_server._readConfigFile
102
     def _readConfigFile(self, config_file, verbose):
109
     def _readConfigFile(self, config_file, verbose):

+ 4 - 1
tracim/lib/webdav/middlewares.py Целия файл

256
         super().__init__(application, config)
256
         super().__init__(application, config)
257
         self._application = application
257
         self._application = application
258
         self._config = config
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
         self.engine = get_engine(self.settings)
263
         self.engine = get_engine(self.settings)
261
         self.session_factory = get_session_factory(self.engine)
264
         self.session_factory = get_session_factory(self.engine)
262
         self.app_config = CFG(self.settings)
265
         self.app_config = CFG(self.settings)

+ 3 - 2
tracim/tests/__init__.py Целия файл

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

+ 50 - 1
tracim/tests/library/test_webdav.py Целия файл

3
 
3
 
4
 import pytest
4
 import pytest
5
 from sqlalchemy.exc import InvalidRequestError
5
 from sqlalchemy.exc import InvalidRequestError
6
-
6
+from wsgidav.wsgidav_app import DEFAULT_CONFIG
7
+from tracim import WebdavAppFactory
7
 from tracim.lib.core.user import UserApi
8
 from tracim.lib.core.user import UserApi
9
+from tracim.lib.webdav import TracimDomainController
8
 from tracim.tests import eq_
10
 from tracim.tests import eq_
9
 from tracim.lib.core.notifications import DummyNotifier
11
 from tracim.lib.core.notifications import DummyNotifier
10
 from tracim.lib.webdav.dav_provider import Provider
12
 from tracim.lib.webdav.dav_provider import Provider
15
 from tracim.fixtures.content import Content as ContentFixtures
17
 from tracim.fixtures.content import Content as ContentFixtures
16
 from tracim.fixtures.users_and_groups import Base as BaseFixture
18
 from tracim.fixtures.users_and_groups import Base as BaseFixture
17
 from wsgidav import util
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
 class TestWebDav(StandardTest):
69
 class TestWebDav(StandardTest):

+ 17 - 0
wsgi/__init__.py Целия файл

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 Целия файл

1
 # coding=utf-8
1
 # coding=utf-8
2
 # Runner for uwsgi
2
 # Runner for uwsgi
3
 import os
3
 import os
4
-import pyramid.paster
4
+from wsgi import web_app
5
 
5
 
6
 config_uri = os.environ['TRACIM_CONF_PATH']
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 Целия файл

1
 # coding=utf-8
1
 # coding=utf-8
2
 # Runner for uwsgi
2
 # Runner for uwsgi
3
-from tracim.lib.webdav import WebdavAppFactory
4
 import os
3
 import os
4
+from wsgi import webdav_app
5
 
5
 
6
 config_uri = os.environ['TRACIM_CONF_PATH']
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)