3 Commits
Author SHA1 Message Date
dsql 654c18fece chore: bump to 1.1.0 (logging-discipline audit)
Signed-off-by: disqualifier <dev@disqualifier.me>
2026-08-10 23:00:50 -04:00
dsql 5095953257 fix: drop exc_info on the best-effort cleanup warnings
cache_button refresh and on_timeout delete are best-effort cleanup that swallow the
HTTPException and recover; both logged at WARNING with exc_info=True, dumping a full
traceback on a handled-and-recovered path. exc_info belongs on terminal/unhandled paths -
drop it and fold the exception reason in with %s so the diagnostic is kept without the
traceback noise.

Signed-off-by: disqualifier <dev@disqualifier.me>
2026-08-09 02:13:12 -04:00
dsql 438a15813f release: 1.0.0
first stable release. pre-1.0.0 verification complete: all surviving MED regressions and
gaps resolved and independently re-fired, tree audited clean across the suite.

Signed-off-by: disqualifier <dev@disqualifier.me>
2026-07-09 18:53:15 -04:00
3 changed files with 12 additions and 9 deletions
+3 -3
View File
@@ -9,18 +9,18 @@ buttons) behind previous / jump / next navigation, with an optional cache button
`requirements.txt`:
```
dpy_paginator @ git+ssh://git@git.rethinkstudios.io/rethink-public/dpy_paginator.git@v0.1.8
dpy_paginator @ git+ssh://git@git.rethinkstudios.io/rethink-public/dpy_paginator.git@v1.0.0
```
Direct:
```bash
pip install "dpy_paginator @ git+ssh://git@git.rethinkstudios.io/rethink-public/dpy_paginator.git@v0.1.8"
pip install "dpy_paginator @ git+ssh://git@git.rethinkstudios.io/rethink-public/dpy_paginator.git@v1.0.0"
```
Requires `discord.py` (pulled transitively).
Drop the `@v0.1.8` suffix from the line above to install the latest unpinned.
Drop the `@v1.0.0` suffix from the line above to install the latest unpinned.
## Basic usage
+1 -1
View File
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
[project]
name = "dpy_paginator"
version = "1.0.0"
version = "1.1.0"
description = "Button-navigated paginator for discord.py — config-free, injectable emojis, installable."
requires-python = ">=3.10"
dependencies = [
+8 -5
View File
@@ -385,8 +385,10 @@ class DPYPaginator(Generic[PageT_co], discord.ui.View):
await self.message.edit(**kwargs)
except (discord.NotFound, discord.Forbidden):
pass
except discord.HTTPException:
log.warning("paginator cache_button: failed to refresh message", exc_info=True)
except discord.HTTPException as exc:
# swallowed best-effort cleanup that recovers - no traceback (exc_info belongs
# on terminal/unhandled paths); the reason is folded in for diagnosis.
log.warning("paginator cache_button: failed to refresh message: %s", exc)
@discord.ui.button(style=discord.ButtonStyle.blurple)
async def next_page(self, interaction: Interaction, _: discord.ui.Button[Self]) -> None:
@@ -464,9 +466,10 @@ class DPYPaginator(Generic[PageT_co], discord.ui.View):
await self.message.delete()
except (discord.NotFound, discord.Forbidden):
pass
except discord.HTTPException:
# best-effort cleanup task; log rather than raise into an unretrieved task
log.warning("paginator on_timeout: failed to delete message", exc_info=True)
except discord.HTTPException as exc:
# best-effort cleanup task; log rather than raise into an unretrieved task. no
# traceback (exc_info belongs on terminal/unhandled paths) - fold the reason in.
log.warning("paginator on_timeout: failed to delete message: %s", exc)
# back-compat alias: the class was originally named ButtonPaginator; DPYPaginator is