Skip to content

Commit

Permalink
Merge pull request #3276 from MinchinWeb/plugin-error-loading
Browse files Browse the repository at this point in the history
  • Loading branch information
justinmayer committed Jan 29, 2024
2 parents ff35d26 + 1f14606 commit 8a01cb1
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 7 deletions.
9 changes: 8 additions & 1 deletion pelican/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,14 @@ def init_plugins(self):
plugin.register()
self.plugins.append(plugin)
except Exception as e:
logger.error("Cannot register plugin `%s`\n%s", name, e)
logger.error(
"Cannot register plugin `%s`\n%s",
name,
e,
stacklevel=2,
)
if self.settings.get("DEBUG", False):
console.print_exception()

self.settings["PLUGINS"] = [get_plugin_name(p) for p in self.plugins]

Expand Down
36 changes: 30 additions & 6 deletions pelican/log.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,15 +85,39 @@ class FatalLogger(LimitLogger):
warnings_fatal = False
errors_fatal = False

# adding `stacklevel=2` means that the displayed filename and line number
# will match the "original" calling location, rather than the wrapper here
def warning(self, *args, **kwargs):
super().warning(*args, stacklevel=2, **kwargs)
def warning(self, *args, stacklevel=1, **kwargs):
"""
Displays a logging warning.
Wrapping it here allows Pelican to filter warnings, and conditionally
make warnings fatal.
Args:
stacklevel (int): the stacklevel that would be used to display the
calling location, except for this function. Adjusting the
stacklevel allows you to see the "true" calling location of the
warning, rather than this wrapper location.
"""
stacklevel += 1
super().warning(*args, stacklevel=stacklevel, **kwargs)
if FatalLogger.warnings_fatal:
raise RuntimeError("Warning encountered")

def error(self, *args, **kwargs):
super().error(*args, stacklevel=2, **kwargs)
def error(self, *args, stacklevel=1, **kwargs):
"""
Displays a logging error.
Wrapping it here allows Pelican to filter errors, and conditionally
make errors non-fatal.
Args:
stacklevel (int): the stacklevel that would be used to display the
calling location, except for this function. Adjusting the
stacklevel allows you to see the "true" calling location of the
error, rather than this wrapper location.
"""
stacklevel += 1
super().error(*args, stacklevel=stacklevel, **kwargs)
if FatalLogger.errors_fatal:
raise RuntimeError("Error encountered")

Expand Down

0 comments on commit 8a01cb1

Please sign in to comment.