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.
Files changed (87) hide show
  1. {redbot-2.6.0/redbot.egg-info → redbot-2.6.2}/PKG-INFO +4 -20
  2. {redbot-2.6.0 → redbot-2.6.2}/README.md +2 -18
  3. {redbot-2.6.0 → redbot-2.6.2}/pyproject.toml +1 -1
  4. {redbot-2.6.0 → redbot-2.6.2}/redbot/__init__.py +1 -1
  5. {redbot-2.6.0 → redbot-2.6.2}/redbot/daemon.py +11 -2
  6. redbot-2.6.2/redbot/note.py +12 -0
  7. {redbot-2.6.0 → redbot-2.6.2}/redbot/resource/active_check/etag_validate.py +1 -1
  8. {redbot-2.6.0 → redbot-2.6.2}/redbot/webui/__init__.py +0 -2
  9. {redbot-2.6.0 → redbot-2.6.2}/redbot/webui/handlers/__init__.py +1 -2
  10. {redbot-2.6.0 → redbot-2.6.2}/redbot/webui/handlers/show.py +0 -37
  11. {redbot-2.6.0 → redbot-2.6.2/redbot.egg-info}/PKG-INFO +4 -20
  12. {redbot-2.6.0 → redbot-2.6.2}/redbot.egg-info/requires.txt +1 -1
  13. redbot-2.6.0/redbot/note.py +0 -51
  14. {redbot-2.6.0 → redbot-2.6.2}/LICENSE.md +0 -0
  15. {redbot-2.6.0 → redbot-2.6.2}/MANIFEST.in +0 -0
  16. {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/__init__.py +0 -0
  17. {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/icons/__init__.py +0 -0
  18. {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/icons/check-circle.svg +0 -0
  19. {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/icons/exclamation-circle.svg +0 -0
  20. {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/icons/info-circle.svg +0 -0
  21. {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/icons/question-circle.svg +0 -0
  22. {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/icons/times-circle.svg +0 -0
  23. {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/logo/__init__.py +0 -0
  24. {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/logo/apple-touch-icon-144x144.png +0 -0
  25. {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/logo/apple-touch-icon-152x152.png +0 -0
  26. {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/logo/favicon-16x16.png +0 -0
  27. {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/logo/favicon-32x32.png +0 -0
  28. {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/logo/favicon.ico +0 -0
  29. {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/logo/mstile-144x144.png +0 -0
  30. {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/logo/redbot-sq.png +0 -0
  31. {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/prettify.js +0 -0
  32. {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/prettify.js.map +0 -0
  33. {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/red_style.css +0 -0
  34. {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/red_style.css.map +0 -0
  35. {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/script.js +0 -0
  36. {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/script.js.map +0 -0
  37. {redbot-2.6.0 → redbot-2.6.2}/redbot/assets/style.css +0 -0
  38. {redbot-2.6.0 → redbot-2.6.2}/redbot/cli.py +0 -0
  39. {redbot-2.6.0 → redbot-2.6.2}/redbot/formatter/__init__.py +0 -0
  40. {redbot-2.6.0 → redbot-2.6.2}/redbot/formatter/har.py +0 -0
  41. {redbot-2.6.0 → redbot-2.6.2}/redbot/formatter/html.py +0 -0
  42. {redbot-2.6.0 → redbot-2.6.2}/redbot/formatter/html_base.py +0 -0
  43. {redbot-2.6.0 → redbot-2.6.2}/redbot/formatter/null_links.py +0 -0
  44. {redbot-2.6.0 → redbot-2.6.2}/redbot/formatter/templates/__init__.py +0 -0
  45. {redbot-2.6.0 → redbot-2.6.2}/redbot/formatter/templates/footer.html +0 -0
  46. {redbot-2.6.0 → redbot-2.6.2}/redbot/formatter/templates/response_finish.html +0 -0
  47. {redbot-2.6.0 → redbot-2.6.2}/redbot/formatter/templates/response_multi_finish.html +0 -0
  48. {redbot-2.6.0 → redbot-2.6.2}/redbot/formatter/templates/response_start.html +0 -0
  49. {redbot-2.6.0 → redbot-2.6.2}/redbot/formatter/text.py +0 -0
  50. {redbot-2.6.0 → redbot-2.6.2}/redbot/gc.py +0 -0
  51. {redbot-2.6.0 → redbot-2.6.2}/redbot/i18n.py +0 -0
  52. {redbot-2.6.0 → redbot-2.6.2}/redbot/resource/__init__.py +0 -0
  53. {redbot-2.6.0 → redbot-2.6.2}/redbot/resource/active_check/__init__.py +0 -0
  54. {redbot-2.6.0 → redbot-2.6.2}/redbot/resource/active_check/base.py +0 -0
  55. {redbot-2.6.0 → redbot-2.6.2}/redbot/resource/active_check/conneg.py +0 -0
  56. {redbot-2.6.0 → redbot-2.6.2}/redbot/resource/active_check/lm_validate.py +0 -0
  57. {redbot-2.6.0 → redbot-2.6.2}/redbot/resource/active_check/range.py +0 -0
  58. {redbot-2.6.0 → redbot-2.6.2}/redbot/resource/fetch.py +0 -0
  59. {redbot-2.6.0 → redbot-2.6.2}/redbot/resource/link_parse.py +0 -0
  60. {redbot-2.6.0 → redbot-2.6.2}/redbot/translations/__init__.py +0 -0
  61. {redbot-2.6.0 → redbot-2.6.2}/redbot/translations/es/LC_MESSAGES/messages.mo +0 -0
  62. {redbot-2.6.0 → redbot-2.6.2}/redbot/translations/es/LC_MESSAGES/messages.po +0 -0
  63. {redbot-2.6.0 → redbot-2.6.2}/redbot/translations/extra_strings.py +0 -0
  64. {redbot-2.6.0 → redbot-2.6.2}/redbot/translations/fr/LC_MESSAGES/messages.mo +0 -0
  65. {redbot-2.6.0 → redbot-2.6.2}/redbot/translations/fr/LC_MESSAGES/messages.po +0 -0
  66. {redbot-2.6.0 → redbot-2.6.2}/redbot/translations/ja/LC_MESSAGES/messages.mo +0 -0
  67. {redbot-2.6.0 → redbot-2.6.2}/redbot/translations/ja/LC_MESSAGES/messages.po +0 -0
  68. {redbot-2.6.0 → redbot-2.6.2}/redbot/translations/messages.pot +0 -0
  69. {redbot-2.6.0 → redbot-2.6.2}/redbot/translations/zh/LC_MESSAGES/messages.mo +0 -0
  70. {redbot-2.6.0 → redbot-2.6.2}/redbot/translations/zh/LC_MESSAGES/messages.po +0 -0
  71. {redbot-2.6.0 → redbot-2.6.2}/redbot/type.py +0 -0
  72. {redbot-2.6.0 → redbot-2.6.2}/redbot/utils.py +0 -0
  73. {redbot-2.6.0 → redbot-2.6.2}/redbot/webbotauth.py +0 -0
  74. {redbot-2.6.0 → redbot-2.6.2}/redbot/webui/captcha.py +0 -0
  75. {redbot-2.6.0 → redbot-2.6.2}/redbot/webui/handlers/base.py +0 -0
  76. {redbot-2.6.0 → redbot-2.6.2}/redbot/webui/handlers/client_error.py +0 -0
  77. {redbot-2.6.0 → redbot-2.6.2}/redbot/webui/handlers/error.py +0 -0
  78. {redbot-2.6.0 → redbot-2.6.2}/redbot/webui/handlers/run_test.py +0 -0
  79. {redbot-2.6.0 → redbot-2.6.2}/redbot/webui/handlers/save.py +0 -0
  80. {redbot-2.6.0 → redbot-2.6.2}/redbot/webui/links.py +0 -0
  81. {redbot-2.6.0 → redbot-2.6.2}/redbot/webui/ratelimit.py +0 -0
  82. {redbot-2.6.0 → redbot-2.6.2}/redbot/webui/saved_tests.py +0 -0
  83. {redbot-2.6.0 → redbot-2.6.2}/redbot.egg-info/SOURCES.txt +0 -0
  84. {redbot-2.6.0 → redbot-2.6.2}/redbot.egg-info/dependency_links.txt +0 -0
  85. {redbot-2.6.0 → redbot-2.6.2}/redbot.egg-info/entry_points.txt +0 -0
  86. {redbot-2.6.0 → redbot-2.6.2}/redbot.egg-info/top_level.txt +0 -0
  87. {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.0
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.05.01
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, as well as process monitoring (including a watchdog function).
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
- To do this, install REDbot on your system with the `systemd` option. For example:
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, as well as process monitoring (including a watchdog function).
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
- To do this, install REDbot on your system with the `systemd` option. For example:
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
@@ -22,7 +22,7 @@ license-files = ["LICENSE.md"]
22
22
  dependencies = [
23
23
  "cryptography >= 42.0.0",
24
24
  "http-sf >= 1.0",
25
- "httplint >= 2026.05.01",
25
+ "httplint >= 2026.09.1",
26
26
  "importlib_resources",
27
27
  "Jinja2 >= 3.1.2",
28
28
  "markdown >= 3.4.4",
@@ -2,7 +2,7 @@
2
2
  This is the Resource Expert Droid.
3
3
  """
4
4
 
5
- __version__ = "2.6.0"
5
+ __version__ = "2.6.2"
6
6
  __author__ = "Mark Nottingham <mnot@mnot.net>"
7
7
  __copyright__ = """\
8
8
  Copyright (c) 2008- Mark Nottingham
@@ -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(25)
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
- SYSTEMD_NOTIFIER(SYSTEMD_NOTIFICATION.WATCHDOG)
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:
@@ -0,0 +1,12 @@
1
+ from httplint.note import Note
2
+
3
+ from redbot.i18n import _
4
+
5
+
6
+ class RedbotNote(Note):
7
+ """
8
+ A Note that uses REDbot's translation domain.
9
+ """
10
+
11
+ def _translate(self, message: str) -> str:
12
+ return str(_(message))
@@ -83,7 +83,7 @@ class ETagValidate(SubRequest):
83
83
  self.add_notes(
84
84
  "field-etag",
85
85
  INM_DUP_ETAG_STRONG,
86
- etag=self.base.response.headers.parsed["etag"],
86
+ etag=self.base.response.headers.parsed["etag"][1],
87
87
  )
88
88
  else:
89
89
  self.add_notes("field-etag", INM_UNKNOWN)
@@ -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 RedirectHandler, ShowHandler
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.0
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.05.01
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, as well as process monitoring (including a watchdog function).
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
- To do this, install REDbot on your system with the `systemd` option. For example:
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
@@ -1,6 +1,6 @@
1
1
  cryptography>=42.0.0
2
2
  http-sf>=1.0
3
- httplint>=2026.05.01
3
+ httplint>=2026.09.1
4
4
  importlib_resources
5
5
  Jinja2>=3.1.2
6
6
  markdown>=3.4.4
@@ -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