Skip to content

Commit 4ff656a

Browse files
committed
Also handle resource resolver errors gracefully in the GracefulResourceRenderer.
1 parent c1131f8 commit 4ff656a

File tree

3 files changed

+45
-1
lines changed

3 files changed

+45
-1
lines changed

CHANGES.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ Changelog
44
1.3 (unreleased)
55
----------------
66

7+
- Also handle resource resolver errors gracefully in the GracefulResourceRenderer.
8+
[thet]
9+
710
- Improve error messages by including more detailed information.
811
[thet]
912

webresource/_api.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -740,7 +740,19 @@ class GracefulResourceRenderer(ResourceRenderer):
740740

741741
def render(self):
742742
lines = []
743-
for resource in self.resolver.resolve():
743+
resources = []
744+
745+
try:
746+
resources = self.resolver.resolve()
747+
except (
748+
ResourceConflictError,
749+
ResourceCircularDependencyError,
750+
ResourceMissingDependencyError,
751+
) as e:
752+
error_message = str(e)
753+
logger.exception(error_message)
754+
755+
for resource in resources:
744756
error_message = None
745757
try:
746758
lines.append(resource.render(self.base_url))

webresource/tests.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -811,6 +811,35 @@ def test_GracefulResourceRenderer(self):
811811
"""<!-- File not found for resource <ScriptResource name="js2", depends="['js']"> - details in logs -->"""
812812
))
813813

814+
def test_GreacefulResourceRenderer_resolver_errors(self):
815+
# Get log level to restore it later
816+
import logging
817+
original_log_level = logging.getLogger().getEffectiveLevel()
818+
819+
# Create a resource with a circular dependency
820+
resource = Resource(name='res1', resource='res1.ext', depends='res1')
821+
822+
resolver = wr.ResourceResolver([resource])
823+
renderer = wr.GracefulResourceRenderer(resolver)
824+
825+
rendered = None
826+
try:
827+
# Supress error traceback in logs
828+
logging.disable(logging.CRITICAL)
829+
rendered = renderer.render()
830+
# Restore logging level
831+
logging.disable(original_log_level)
832+
except wr.ResourceCircularDependencyError: # pragma: nocover
833+
self.fail(
834+
'GracefulResourceRenderer should not raise '
835+
'ResourceCircularDependencyError'
836+
)
837+
838+
# No error is raised, but rendered is also empty.
839+
# However, a server rendered HTML based UI form should still be
840+
# interactible.
841+
self.assertEqual(rendered, "")
842+
814843

815844
if __name__ == '__main__':
816845
unittest.main()

0 commit comments

Comments
 (0)