from ast import literal_eval
from pyramid.config import Configurator
import logging
+import pkg_resources
import sys
# Constants
'route_prefix',
'routes',
'validate_hmac',
+ 'autoconfigure',
'literal_column_headings',
])
pass
+class AutoconfigureConflict(Error):
+ def __init__(self):
+ super().__init__(
+ 'Autoconfigure is True and there is a pyramid.include setting')
+
+
class BadSettingsAbort(Error):
def __init__(self):
super().__init__('Aborting due to bad setting(s)')
config.add_route(name, route)
+def find_pgwui_components():
+ '''Return list of all pgwui component names as strings
+ '''
+ return [entry_point.resolve().__name__ for entry_point in
+ pkg_resources.iter_entry_points('pgwui.components')]
+
+
+def autoconfig_components(settings):
+ '''Automatic pgwui component discovery
+ '''
+ autoconfig = settings.get('pgwui.autoconfigure')
+ if not autoconfig:
+ return []
+
+ if 'pyramid.include' in settings:
+ log.info(AutoconfigureConflict())
+
+ return find_pgwui_components()
+
+
def pgwui_server_config(settings):
'''Configure pyramid
'''
exit_on_invalid_settings(settings)
+ components = autoconfig_components(settings)
+
rp = settings.get('pgwui.route_prefix')
with Configurator(settings=settings, route_prefix=rp) as config:
config.include('pgwui_common')
+ for component in components:
+ config.include(component)
add_routes(config, settings)
return config
])
+# find_pgwui_components()
+
+def test_find_pgwui_components(monkeypatch):
+ '''Returns list of entry points via iter_entry_points()
+ '''
+ entry_points = ['a', 'b', 'c']
+
+ class MockEntryPoint():
+ def __init__(self, val):
+ self.__name__ = val
+
+ def resolve(self):
+ return self
+
+ class MockPkgResources():
+ def iter_entry_points(*args):
+ return [MockEntryPoint(name) for name in entry_points]
+
+ monkeypatch.setattr(
+ pgwui_server_init, 'pkg_resources', MockPkgResources())
+
+ result = pgwui_server_init.find_pgwui_components()
+
+ assert result == entry_points
+
+
+# autoconfig_components()
+
+def test_autoconfig_components_no_autoconfig(monkeypatch):
+ '''When the settings have no pgwui.autoconfigure return an empty list
+ '''
+ monkeypatch.setattr(pgwui_server_init, 'find_pgwui_components',
+ lambda *args: [])
+
+ result = pgwui_server_init.autoconfig_components({})
+
+ assert result == []
+
+
+def test_autoconfig_components_log_info(monkeypatch, caplog):
+ '''When pyramid.include is in the settings an INFO message is logged
+ '''
+ monkeypatch.setattr(pgwui_server_init, 'find_pgwui_components',
+ lambda *args: [])
+
+ caplog.set_level(logging.INFO)
+
+ pgwui_server_init.autoconfig_components({'pgwui.autoconfigure': True,
+ 'pyramid.include': None})
+
+ logs = caplog.record_tuples
+
+ assert len(logs) == 1
+
+ level = logs[0][1]
+ assert level == logging.INFO
+
+
+def test_autoconfig_components_find_pgwui_components_called(monkeypatch):
+ '''When pyramid.include is in the settings an INFO message is logged
+ '''
+ find_pgwui_components_called = False
+
+ def mock_find_pgwui_components(*args):
+ nonlocal find_pgwui_components_called
+ find_pgwui_components_called = True
+
+ monkeypatch.setattr(pgwui_server_init, 'find_pgwui_components',
+ mock_find_pgwui_components)
+
+ pgwui_server_init.autoconfig_components({'pgwui.autoconfigure': True,
+ 'mock_pgwui_component': 'foo'})
+
+ assert find_pgwui_components_called
+
+
# add_routes()
def test_add_routes_empty():
def test_pgwui_server_config(monkeypatch):
'''Returns a configuration'''
- monkeypatch.setattr(pgwui_server_init, 'validate_settings',
+ monkeypatch.setattr(pgwui_server_init, 'exit_on_invalid_settings',
lambda *args: True)
+ monkeypatch.setattr(pgwui_server_init, 'autoconfig_components',
+ lambda *args: ['pgwui_mock_component_name'])
monkeypatch.setattr(pgwui_server_init, 'Configurator',
MockConfigurator)
monkeypatch.setattr(pgwui_server_init, 'add_routes',