redbot 2.6.0__tar.gz → 2.6.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {redbot-2.6.0/redbot.egg-info → redbot-2.6.2}/PKG-INFO +4 -20
- {redbot-2.6.0 → redbot-2.6.2}/README.md +2 -18
- {redbot-2.6.0 → redbot-2.6.2}/pyproject.toml +1 -1
- {redbot-2.6.0 → redbot-2.6.2}/redbot/__init__.py +1 -1
- {redbot-2.6.0 → redbot-2.6.2}/redbot/daemon.py +11 -2
- redbot-2.6.2/redbot/note.py +12 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/resource/active_check/etag_validate.py +1 -1
- {redbot-2.6.0 → redbot-2.6.2}/redbot/webui/__init__.py +0 -2
- {redbot-2.6.0 → redbot-2.6.2}/redbot/webui/handlers/__init__.py +1 -2
- {redbot-2.6.0 → redbot-2.6.2}/redbot/webui/handlers/show.py +0 -37
- {redbot-2.6.0 → redbot-2.6.2/redbot.egg-info}/PKG-INFO +4 -20
- {redbot-2.6.0 → redbot-2.6.2}/redbot.egg-info/requires.txt +1 -1
- redbot-2.6.0/redbot/note.py +0 -51
- {redbot-2.6.0 → redbot-2.6.2}/LICENSE.md +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/MANIFEST.in +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/__init__.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/icons/__init__.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/icons/check-circle.svg +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/icons/exclamation-circle.svg +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/icons/info-circle.svg +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/icons/question-circle.svg +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/icons/times-circle.svg +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/logo/__init__.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/logo/apple-touch-icon-144x144.png +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/logo/apple-touch-icon-152x152.png +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/logo/favicon-16x16.png +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/logo/favicon-32x32.png +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/logo/favicon.ico +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/logo/mstile-144x144.png +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/logo/redbot-sq.png +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/prettify.js +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/prettify.js.map +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/red_style.css +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/red_style.css.map +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/script.js +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/script.js.map +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/style.css +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/cli.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/formatter/__init__.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/formatter/har.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/formatter/html.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/formatter/html_base.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/formatter/null_links.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/formatter/templates/__init__.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/formatter/templates/footer.html +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/formatter/templates/response_finish.html +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/formatter/templates/response_multi_finish.html +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/formatter/templates/response_start.html +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/formatter/text.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/gc.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/i18n.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/resource/__init__.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/resource/active_check/__init__.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/resource/active_check/base.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/resource/active_check/conneg.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/resource/active_check/lm_validate.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/resource/active_check/range.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/resource/fetch.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/resource/link_parse.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/translations/__init__.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/translations/es/LC_MESSAGES/messages.mo +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/translations/es/LC_MESSAGES/messages.po +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/translations/extra_strings.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/translations/fr/LC_MESSAGES/messages.mo +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/translations/fr/LC_MESSAGES/messages.po +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/translations/ja/LC_MESSAGES/messages.mo +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/translations/ja/LC_MESSAGES/messages.po +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/translations/messages.pot +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/translations/zh/LC_MESSAGES/messages.mo +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/translations/zh/LC_MESSAGES/messages.po +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/type.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/utils.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/webbotauth.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/webui/captcha.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/webui/handlers/base.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/webui/handlers/client_error.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/webui/handlers/error.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/webui/handlers/run_test.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/webui/handlers/save.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/webui/links.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/webui/ratelimit.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot/webui/saved_tests.py +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot.egg-info/SOURCES.txt +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot.egg-info/dependency_links.txt +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot.egg-info/entry_points.txt +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/redbot.egg-info/top_level.txt +0 -0
- {redbot-2.6.0 → redbot-2.6.2}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: redbot
|
|
3
|
-
Version: 2.6.
|
|
3
|
+
Version: 2.6.2
|
|
4
4
|
Summary: REDbot is lint for HTTP.
|
|
5
5
|
Author-email: Mark Nottingham <mnot@mnot.net>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -18,7 +18,7 @@ Description-Content-Type: text/markdown
|
|
|
18
18
|
License-File: LICENSE.md
|
|
19
19
|
Requires-Dist: cryptography>=42.0.0
|
|
20
20
|
Requires-Dist: http-sf>=1.0
|
|
21
|
-
Requires-Dist: httplint>=2026.
|
|
21
|
+
Requires-Dist: httplint>=2026.09.1
|
|
22
22
|
Requires-Dist: importlib_resources
|
|
23
23
|
Requires-Dist: Jinja2>=3.1.2
|
|
24
24
|
Requires-Dist: markdown>=3.4.4
|
|
@@ -83,25 +83,9 @@ Both of these methods will install the following programs into your [pipx binary
|
|
|
83
83
|
|
|
84
84
|
### Running REDbot as a systemd Service
|
|
85
85
|
|
|
86
|
-
REDbot can run as a standalone service, managed by [systemd](https://freedesktop.org/wiki/Software/systemd/). This offers a degree of sandboxing and resource management,
|
|
86
|
+
REDbot can run as a standalone service, managed by [systemd](https://freedesktop.org/wiki/Software/systemd/). This offers a degree of sandboxing and resource management, process monitoring (including a watchdog function), and a timer that garbage-collects saved tests.
|
|
87
87
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
> pipx install redbot[systemd]
|
|
91
|
-
|
|
92
|
-
The copy `extra/redbot.service` into the appropriate directory (on most systems, `/etc/systemd/system/`.)
|
|
93
|
-
|
|
94
|
-
Modify the file appropriately; this is only a sample. Then, as root:
|
|
95
|
-
|
|
96
|
-
~~~ bash
|
|
97
|
-
> systemctl reload-daemon
|
|
98
|
-
> systemctl enable redbot
|
|
99
|
-
> systemctl start redbot
|
|
100
|
-
~~~
|
|
101
|
-
|
|
102
|
-
By default, REDbot will listen on localhost port 8000. This can be adjusted in `config.txt`. Running REDbot behind a reverse proxy is recommended, if it is to be exposed to the Internet.
|
|
103
|
-
|
|
104
|
-
If you want to allow people to save test results, create the directory referenced by the 'save_dir' configuration variable, and make sure that it's writable to the REDbot process.
|
|
88
|
+
See [extra/README.md](extra/README.md) for the sample units and step-by-step setup.
|
|
105
89
|
|
|
106
90
|
|
|
107
91
|
### Running REDbot in a Container
|
|
@@ -35,25 +35,9 @@ Both of these methods will install the following programs into your [pipx binary
|
|
|
35
35
|
|
|
36
36
|
### Running REDbot as a systemd Service
|
|
37
37
|
|
|
38
|
-
REDbot can run as a standalone service, managed by [systemd](https://freedesktop.org/wiki/Software/systemd/). This offers a degree of sandboxing and resource management,
|
|
38
|
+
REDbot can run as a standalone service, managed by [systemd](https://freedesktop.org/wiki/Software/systemd/). This offers a degree of sandboxing and resource management, process monitoring (including a watchdog function), and a timer that garbage-collects saved tests.
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
> pipx install redbot[systemd]
|
|
43
|
-
|
|
44
|
-
The copy `extra/redbot.service` into the appropriate directory (on most systems, `/etc/systemd/system/`.)
|
|
45
|
-
|
|
46
|
-
Modify the file appropriately; this is only a sample. Then, as root:
|
|
47
|
-
|
|
48
|
-
~~~ bash
|
|
49
|
-
> systemctl reload-daemon
|
|
50
|
-
> systemctl enable redbot
|
|
51
|
-
> systemctl start redbot
|
|
52
|
-
~~~
|
|
53
|
-
|
|
54
|
-
By default, REDbot will listen on localhost port 8000. This can be adjusted in `config.txt`. Running REDbot behind a reverse proxy is recommended, if it is to be exposed to the Internet.
|
|
55
|
-
|
|
56
|
-
If you want to allow people to save test results, create the directory referenced by the 'save_dir' configuration variable, and make sure that it's writable to the REDbot process.
|
|
40
|
+
See [extra/README.md](extra/README.md) for the sample units and step-by-step setup.
|
|
57
41
|
|
|
58
42
|
|
|
59
43
|
### Running REDbot in a Container
|
|
@@ -76,7 +76,7 @@ class RedBotServer:
|
|
|
76
76
|
if self.debug:
|
|
77
77
|
self.console("Debug mode enabled")
|
|
78
78
|
self.warmup_regex()
|
|
79
|
-
tracemalloc.start(
|
|
79
|
+
tracemalloc.start(1)
|
|
80
80
|
|
|
81
81
|
self.handler = partial(RedRequestHandler, server=self)
|
|
82
82
|
|
|
@@ -222,7 +222,16 @@ class RedBotServer:
|
|
|
222
222
|
|
|
223
223
|
def watchdog_ping(self) -> None:
|
|
224
224
|
if SYSTEMD_NOTIFIER and SYSTEMD_NOTIFICATION:
|
|
225
|
-
|
|
225
|
+
# thor's scheduler calls events bare and run() only catches
|
|
226
|
+
# KeyboardInterrupt, so an exception here would otherwise take the
|
|
227
|
+
# whole daemon down. A transient notify failure isn't worth dropping
|
|
228
|
+
# in-flight requests for: log it and keep pinging. If they fail
|
|
229
|
+
# persistently the watchdog stops being fed and systemd kills us
|
|
230
|
+
# anyway, which is the outcome we want.
|
|
231
|
+
try:
|
|
232
|
+
SYSTEMD_NOTIFIER(SYSTEMD_NOTIFICATION.WATCHDOG)
|
|
233
|
+
except Exception: # pylint: disable=broad-except
|
|
234
|
+
self.console(f"Watchdog notify failed:\n{traceback.format_exc()}")
|
|
226
235
|
thor.schedule(self.watchdog_freq, self.watchdog_ping)
|
|
227
236
|
|
|
228
237
|
def handle_crash_signal(self, sig: int, frame: Optional[FrameType] = None) -> signal.Handlers:
|
|
@@ -27,7 +27,6 @@ from redbot.webui.handlers import (
|
|
|
27
27
|
ClientErrorHandler,
|
|
28
28
|
ErrorHandler,
|
|
29
29
|
LoadSavedTestHandler,
|
|
30
|
-
RedirectHandler,
|
|
31
30
|
RunTestHandler,
|
|
32
31
|
SaveHandler,
|
|
33
32
|
ShowHandler,
|
|
@@ -50,7 +49,6 @@ class RedWebUi:
|
|
|
50
49
|
LoadSavedTestHandler,
|
|
51
50
|
ClientErrorHandler,
|
|
52
51
|
RunTestHandler,
|
|
53
|
-
RedirectHandler,
|
|
54
52
|
ShowHandler,
|
|
55
53
|
ErrorHandler, # Final fallback for 404/405
|
|
56
54
|
]
|
|
@@ -8,7 +8,7 @@ from redbot.webui.handlers.client_error import ClientErrorHandler
|
|
|
8
8
|
from redbot.webui.handlers.error import ErrorHandler
|
|
9
9
|
from redbot.webui.handlers.run_test import RunTestHandler
|
|
10
10
|
from redbot.webui.handlers.save import LoadSavedTestHandler, SaveHandler
|
|
11
|
-
from redbot.webui.handlers.show import
|
|
11
|
+
from redbot.webui.handlers.show import ShowHandler
|
|
12
12
|
|
|
13
13
|
__all__ = [
|
|
14
14
|
"SaveHandler",
|
|
@@ -16,6 +16,5 @@ __all__ = [
|
|
|
16
16
|
"ClientErrorHandler",
|
|
17
17
|
"RunTestHandler",
|
|
18
18
|
"ShowHandler",
|
|
19
|
-
"RedirectHandler",
|
|
20
19
|
"ErrorHandler",
|
|
21
20
|
]
|
|
@@ -141,40 +141,3 @@ class ShowHandler(RequestHandler):
|
|
|
141
141
|
Empty string (the page itself contains the form)
|
|
142
142
|
"""
|
|
143
143
|
return ""
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
class RedirectHandler(RequestHandler):
|
|
147
|
-
"""
|
|
148
|
-
Handler for redirecting legacy bookmarklets.
|
|
149
|
-
|
|
150
|
-
This handler responds to GET/HEAD requests with 'uri' in the query string
|
|
151
|
-
at the root path, redirecting them to the check handler.
|
|
152
|
-
"""
|
|
153
|
-
|
|
154
|
-
@classmethod
|
|
155
|
-
def can_handle(cls, ui: RedWebUiProtocol) -> bool:
|
|
156
|
-
"""
|
|
157
|
-
Determine if this handler should process the request.
|
|
158
|
-
"""
|
|
159
|
-
return ui.method in ["GET", "HEAD"] and ui.path == [] and "uri" in ui.query_string
|
|
160
|
-
|
|
161
|
-
@classmethod
|
|
162
|
-
def handle(cls, ui: RedWebUiProtocol) -> None:
|
|
163
|
-
"""
|
|
164
|
-
Handle the redirect request.
|
|
165
|
-
"""
|
|
166
|
-
base_uri = cls.get_base_uri(ui)
|
|
167
|
-
uri = ui.query_string.get("uri", [""])[0]
|
|
168
|
-
params = [("uri", uri)]
|
|
169
|
-
location = f"{base_uri}check?{urlencode(params)}"
|
|
170
|
-
|
|
171
|
-
ui.exchange.response_start(b"303", b"See Other", [(b"Location", location.encode("ascii"))])
|
|
172
|
-
ui.output("Redirecting to the validation page...")
|
|
173
|
-
ui.exchange.response_done([])
|
|
174
|
-
|
|
175
|
-
@classmethod
|
|
176
|
-
def render_link(cls, ui: RedWebUiProtocol, **kwargs: Any) -> str:
|
|
177
|
-
"""
|
|
178
|
-
No link generation needed.
|
|
179
|
-
"""
|
|
180
|
-
return ""
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: redbot
|
|
3
|
-
Version: 2.6.
|
|
3
|
+
Version: 2.6.2
|
|
4
4
|
Summary: REDbot is lint for HTTP.
|
|
5
5
|
Author-email: Mark Nottingham <mnot@mnot.net>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -18,7 +18,7 @@ Description-Content-Type: text/markdown
|
|
|
18
18
|
License-File: LICENSE.md
|
|
19
19
|
Requires-Dist: cryptography>=42.0.0
|
|
20
20
|
Requires-Dist: http-sf>=1.0
|
|
21
|
-
Requires-Dist: httplint>=2026.
|
|
21
|
+
Requires-Dist: httplint>=2026.09.1
|
|
22
22
|
Requires-Dist: importlib_resources
|
|
23
23
|
Requires-Dist: Jinja2>=3.1.2
|
|
24
24
|
Requires-Dist: markdown>=3.4.4
|
|
@@ -83,25 +83,9 @@ Both of these methods will install the following programs into your [pipx binary
|
|
|
83
83
|
|
|
84
84
|
### Running REDbot as a systemd Service
|
|
85
85
|
|
|
86
|
-
REDbot can run as a standalone service, managed by [systemd](https://freedesktop.org/wiki/Software/systemd/). This offers a degree of sandboxing and resource management,
|
|
86
|
+
REDbot can run as a standalone service, managed by [systemd](https://freedesktop.org/wiki/Software/systemd/). This offers a degree of sandboxing and resource management, process monitoring (including a watchdog function), and a timer that garbage-collects saved tests.
|
|
87
87
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
> pipx install redbot[systemd]
|
|
91
|
-
|
|
92
|
-
The copy `extra/redbot.service` into the appropriate directory (on most systems, `/etc/systemd/system/`.)
|
|
93
|
-
|
|
94
|
-
Modify the file appropriately; this is only a sample. Then, as root:
|
|
95
|
-
|
|
96
|
-
~~~ bash
|
|
97
|
-
> systemctl reload-daemon
|
|
98
|
-
> systemctl enable redbot
|
|
99
|
-
> systemctl start redbot
|
|
100
|
-
~~~
|
|
101
|
-
|
|
102
|
-
By default, REDbot will listen on localhost port 8000. This can be adjusted in `config.txt`. Running REDbot behind a reverse proxy is recommended, if it is to be exposed to the Internet.
|
|
103
|
-
|
|
104
|
-
If you want to allow people to save test results, create the directory referenced by the 'save_dir' configuration variable, and make sure that it's writable to the REDbot process.
|
|
88
|
+
See [extra/README.md](extra/README.md) for the sample units and step-by-step setup.
|
|
105
89
|
|
|
106
90
|
|
|
107
91
|
### Running REDbot in a Container
|
redbot-2.6.0/redbot/note.py
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
from threading import local
|
|
2
|
-
|
|
3
|
-
from httplint.note import Note
|
|
4
|
-
from markdown import Markdown
|
|
5
|
-
from markupsafe import Markup, escape
|
|
6
|
-
|
|
7
|
-
from redbot.i18n import _, get_locale
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class _MdLocal(local):
|
|
11
|
-
md: Markdown
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
_md_local = _MdLocal()
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
def _markdown() -> Markdown:
|
|
18
|
-
if not hasattr(_md_local, "md"):
|
|
19
|
-
_md_local.md = Markdown(output_format="html")
|
|
20
|
-
return _md_local.md
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
class RedbotNote(Note):
|
|
24
|
-
"""
|
|
25
|
-
A Note that uses REDbot's translation domain.
|
|
26
|
-
"""
|
|
27
|
-
|
|
28
|
-
def _get_summary(self) -> str:
|
|
29
|
-
try:
|
|
30
|
-
return str(_(self._summary) % self.vars)
|
|
31
|
-
except TypeError as err:
|
|
32
|
-
raise TypeError(
|
|
33
|
-
f"Summary formatting error in {self.__class__.__name__} "
|
|
34
|
-
f"(locale: {get_locale()}): {err} (vars: {self.vars!r})"
|
|
35
|
-
) from err
|
|
36
|
-
|
|
37
|
-
def _get_detail(self) -> Markup:
|
|
38
|
-
try:
|
|
39
|
-
return Markup(
|
|
40
|
-
_markdown()
|
|
41
|
-
.reset()
|
|
42
|
-
.convert(_(self._text) % {k: escape(str(v)) for k, v in self.vars.items()})
|
|
43
|
-
)
|
|
44
|
-
except TypeError as err:
|
|
45
|
-
raise TypeError(
|
|
46
|
-
f"Detail formatting error in {self.__class__.__name__} "
|
|
47
|
-
f"(locale: {get_locale()}): {err} (vars: {self.vars!r})"
|
|
48
|
-
) from err
|
|
49
|
-
|
|
50
|
-
summary = property(_get_summary)
|
|
51
|
-
detail = property(_get_detail)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|