# pgwui_logout = /logout
# pgwui_upload = /upload
+# Overriding assets
+#
+# The visual presentation of a PGWUI component is controlled by its assets.
+# Overriding assets allows for extensive customization of presentation.
+#
+# A Pyramid asset is any file included in a Pyramid application that is
+# not a Python source code file. So assets are image files, Mako template
+# files used to render pages, CSS files, JavaScript files, etc.
+#
+# See:
+# https://docs.pylonsproject.org/projects/pyramid/en/1.10-branch/narr/assets.html
+#
+# By default no assets are overridden. Override assets with:
+#
+# pgwui.override_assets =
+# asset = new
+#
+# 'asset' is the asset to override, a Pyramid asset specification
+#
+# 'new' is the new value either a Pyramid asset specification
+# or a file system path
+#
+# Example, altering the menu presented by PGWUI_Menu:
+#
+# pgwui.override_assets =
+# pgwui_menu:templates/menu.mak = /tmp/mymenu.mak
+
# Settings validation
# Whether or not to validate the session.secret setting. (optional)
# pgwui_logout = /logout
# pgwui_upload = /upload
+# Overriding assets
+#
+# The visual presentation of a PGWUI component is controlled by its assets.
+# Overriding assets allows for extensive customization of presentation.
+#
+# A Pyramid asset is any file included in a Pyramid application that is
+# not a Python source code file. So assets are image files, Mako template
+# files used to render pages, CSS files, JavaScript files, etc.
+#
+# See:
+# https://docs.pylonsproject.org/projects/pyramid/en/1.10-branch/narr/assets.html
+#
+# By default no assets are overridden. Override assets with:
+#
+# pgwui.override_assets =
+# asset = new
+#
+# 'asset' is the asset to override, a Pyramid asset specification
+#
+# 'new' is the new value either a Pyramid asset specification
+# or a file system path
+#
+# Example, altering the menu presented by PGWUI_Menu:
+#
+# pgwui.override_assets =
+# pgwui_menu:templates/menu.mak = /tmp/mymenu.mak
+
# Settings validation
# Whether or not to validate the session.secret setting. (optional)
'''
from pyramid.config import Configurator
+import pyramid.exceptions
import logging
import sys
from . import exceptions as server_ex
+from pgwui_common import assets
from pgwui_common import check_settings
from pgwui_common import exceptions as common_ex
from pgwui_common import routes
['routes',
'home_page',
'menu_page',
+ 'override_assets',
])
# Default settings
config.include(component)
routes.add_routes(config, settings)
log.debug('Done autoconfiguring PGWUI components')
- return config
+ errors = assets.override_assets(config, settings)
+ return (config, errors)
def pgwui_server_config(settings):
'''
components = plugin.find_pgwui_components()
exit_on_invalid_settings(settings, components)
- config = apply_component_defaults(settings, components)
- errors = pgwui_common.urls.add_urls_setting(config, settings)
+ try:
+ (config, errors) = apply_component_defaults(settings, components)
+ except pyramid.exceptions.ConfigurationError as exp:
+ exit_reporting_errors([common_ex.BadSettingError(exp)])
+ errors.extend(pgwui_common.urls.add_urls_setting(config, settings))
if errors:
exit_reporting_errors(errors)
return config
import copy
import logging
import pytest
+import pyramid.exceptions
import sys
+import pgwui_common.assets
import pgwui_common.exceptions as common_ex
import pgwui_common.check_settings
import pgwui_common.plugin
MockConfigurator = testing.make_magicmock_fixture(
pgwui_server, 'Configurator')
+mock_override_assets = testing.make_mock_fixture(
+ pgwui_common.assets, 'override_assets')
+
mock_find_pgwui_components = testing.make_mock_fixture(
pgwui_common.plugin, 'find_pgwui_components')
mock_find_pgwui_check_settings = testing.make_mock_fixture(
errors.append('error1')
mock_dictify_settings.side_effect = mymock
+ mock_exit_reporting_errors.side_effect = lambda *args: sys.exit(1)
- pgwui_server.exit_on_invalid_settings({}, [])
+ with pytest.raises(SystemExit) as excinfo:
+ pgwui_server.exit_on_invalid_settings({}, [])
+
+ assert excinfo[1].code == 1
mock_dictify_settings.assert_called_once()
mock_validate_settings.assert_called_once()
'''
pgwui_server.exit_on_invalid_settings({}, [])
- assert True
+ assert mock_exit_reporting_errors.call_count == 0
mock_exit_on_invalid_settings = testing.make_mock_fixture(
mock_in_development,
MockConfigurator,
mock_autoconfigurable_components,
- mock_add_routes):
+ mock_add_routes,
+ mock_override_assets):
'''A configurator is returned, a debug log entry is made for
each autoconfigurable component
'''
+ expected_errors = 'some errors'
caplog.set_level(logging.DEBUG)
mock_autoconfigurable_components.return_value = \
['pgwui_mock_component_name']
+ mock_override_assets.return_value = expected_errors
+
+ (config, errors) = pgwui_server.apply_component_defaults(
+ {'pgwui': {}}, [])
- result = pgwui_server.apply_component_defaults({'pgwui': {}}, [])
- assert str(type(result)) == str(type(MockConfigurator))
+ assert str(type(config)) == str(type(MockConfigurator))
+ assert errors == expected_errors
logs = caplog.record_tuples
('errors', 'ere_calls'), [
([], 0),
(['some error'], 1)])
-def test_pgwui_server_config(
+def test_pgwui_server_config_success(
pyramid_config,
mock_find_pgwui_components,
mock_exit_on_invalid_settings,
mock_add_urls_setting,
mock_exit_reporting_errors,
errors, ere_calls):
- '''Makes expected calls, returns a configuration
+ '''When apply_component_defaults() returns -- makes expected calls,
+ returns a configuration
'''
- mock_apply_component_defaults.return_value = pyramid_config
+ mock_apply_component_defaults.return_value = (pyramid_config, [])
mock_add_urls_setting.return_value = errors
+ mock_exit_reporting_errors.side_effect = lambda *args: sys.exit(1)
- result = pgwui_server.pgwui_server_config({})
+ if ere_calls:
+ with pytest.raises(SystemExit):
+ result = pgwui_server.pgwui_server_config({})
+ else:
+ result = pgwui_server.pgwui_server_config({})
mock_find_pgwui_components.assert_called_once()
mock_exit_on_invalid_settings.assert_called_once()
assert result == pyramid_config
+def test_pgwui_server_config_bad_config(
+ pyramid_config,
+ mock_find_pgwui_components,
+ mock_exit_on_invalid_settings,
+ mock_apply_component_defaults,
+ mock_add_urls_setting,
+ mock_exit_reporting_errors):
+ '''When apply_component_defaults() raises a configuration exception
+ exit_reporting_errors() is called
+ '''
+ mock_apply_component_defaults.side_effect = \
+ pyramid.exceptions.ConfigurationError
+ mock_exit_reporting_errors.side_effect = lambda *args: sys.exit(1)
+
+ with pytest.raises(SystemExit):
+ pgwui_server.pgwui_server_config({})
+
+ assert mock_exit_reporting_errors.call_count == 1
+
+
mock_pgwui_server_config = testing.make_mock_fixture(
pgwui_server, 'pgwui_server_config')