[ADD] base: support for breakpoint() in qweb

The breakpoint() builtin was added in [Python 3.7] ([PEP 553]). It is
conveniently everything-agnostic, can be configured (including
disabled) via an envvar (`PYTHONBREAKPOINT`) and
code (`sys.breakpointhook`), and defaults to pdb (`pdb.set_trace`).

This is more flexible as it allows using arbitrary callables without
special casing, which mostly allows using less common
debuggers (e.g. IDE debug servers / hooks).

As using an empty string for the debugger name was not allowed
previously, co-opt that to invoke `breakpoint`. And deprecate the old
style.

[Python 3.7]: https://docs.python.org/3/whatsnew/3.7.html#pep-553-built-in-breakpoint
[PEP 553]: https://peps.python.org/pep-0553/

closes odoo/odoo#134842

Related: odoo/documentation#5800
Signed-off-by: Xavier Morel (xmo) <xmo@odoo.com>
This commit is contained in:
Xavier Morel
2023-09-11 10:29:02 +00:00
parent 9974ee63b1
commit 885aef7b14
+19 -3
View File
@@ -123,15 +123,21 @@ Directives
``t-debug``
~~~~~~~~~~~
**Values**: ``pdb``, ``ipdb``, ``pudb``, ``wdb``
**Values**: `''` (empty string), ``pdb``, ``ipdb``, ``pudb``, ``wdb``
Activate the choosed debugger.
Triggers a debugger breakpoint at that location. With an empty value, calls the
``breakpoint`` builtin invoking whichever breakpoint hook has been set up,
otherwise triggers a breakpoint uses the corresponding debugger.
When dev mode is enabled this allows python developers to have access to the
state of variables being rendered. The code generated by the QWeb engine is
not accessible, only the variables (values, self) can be analyzed or the
methods that called the QWeb rendering.
.. warning:: using a non-empty string is deprecated since 17.0, configure your
preferred debugger via ``PYTHONBREAKPOINT`` or
``sys.setbreakpointhook``.
``t-if``
~~~~~~~~
**Values**: python expression
@@ -370,6 +376,7 @@ import time
import token
import tokenize
import traceback
import warnings
import werkzeug
from markupsafe import Markup, escape
@@ -2354,7 +2361,16 @@ class IrQWeb(models.AbstractModel):
def _debug_trace(self, debugger, values):
"""Method called at running time to load debugger."""
if debugger in SUPPORTED_DEBUGGER:
if not debugger:
breakpoint()
elif debugger in SUPPORTED_DEBUGGER:
warnings.warn(
"Using t-debug with an explicit debugger is deprecated "
"since Odoo 17.0, keep the value empty and configure the "
"``breakpoint`` builtin instead.",
category=DeprecationWarning,
stacklevel=2,
)
__import__(debugger).set_trace()
else:
raise ValueError(f"unsupported t-debug value: {debugger}")