Files
shelfmark/pyproject.toml
T
dependabot[bot] d86d34b8e9 build(deps): bump apprise from 1.13.1 to 2.0.0 (#1437)
Bumps [apprise](https://github.com/caronc/apprise) from 1.13.1 to 2.0.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/caronc/apprise/releases">apprise's
releases</a>.</em></p>
<blockquote>
<h2>Apprise v2.0.0</h2>
<h2>What's Changed</h2>
<p>🎉 <strong>Welcome to Apprise v2.0.0!</strong> 🎉</p>
<p>This is the first official release of Apprise v2. It's a big one.
Much of how Apprise works under the hood was rebuilt, and many features
people have asked for over the years are finally here:</p>
<ul>
<li>template variables to keep secrets out of your config files</li>
<li>tag priorities and escalation</li>
<li>smarter retries</li>
<li>timeouts</li>
<li>a detailed <code>AppriseResult</code> object returned from every
<code>notify()</code> call</li>
<li>...and much more</li>
</ul>
<p><strong>Note:</strong> ⚠️ <strong>This is a breaking release
for anyone using Apprise v1.x.</strong> If you are a developer embedding
Apprise in your own project, please read the <strong>Breaking
Changes</strong> section below before upgrading. If you are not ready to
move yet, pin your <code>pyproject.toml</code> or
<code>requirements.txt</code> to <code>apprise &gt;=1.0.0,
&lt;2.0.0</code>. The v1 codebase lives on in the <a
href="https://github.com/caronc/apprise/tree/apprise-v1-release"><code>apprise-v1-release</code></a>
branch. I will keep patching it for security issues and bugs where
practical for a year or two, but v2.x is the way forward.</p>
<h3>⚠️ Breaking Changes</h3>
<ul>
<li><strong><code>notify()</code> now returns an
<code>AppriseResult</code> object instead of
<code>True</code>/<code>False</code>/<code>None</code></strong>
<ul>
<li><code>bool(result)</code> still gives you
<code>True</code>/<code>False</code>, so most existing <code>if
apobj.notify(...):</code> checks keep working. <code>None</code> can't
come back from <code>bool()</code>, so a &quot;nothing matched&quot;
result now reads as <code>False</code>.</li>
<li>The object also holds the logs for each individual service called,
plus a status for each one, so your application can report exactly what
worked and what didn't.</li>
<li>The status values line up with the CLI exit codes:
<ul>
<li><code>SUCCESS</code> (0) - every service was notified successfully
(the old <code>True</code>)</li>
<li><code>FAILURE</code> (1) - the notification failed (the old
<code>False</code>)</li>
<li><code>NOMATCH</code> (3) - nothing matched the tags given, or no
services were loaded (the old <code>None</code>)</li>
<li><code>PARTIAL</code> (4) - some services succeeded but at least one
failed (v1 returned <code>False</code> here)</li>
<li><code>TIMEOUT</code> (5) - a service didn't finish before its time
limit (new in v2)</li>
</ul>
</li>
</ul>
</li>
<li><strong>Multiple body formats per service</strong>
<ul>
<li>In v1 each service supported a single body format. Services can now
support more than one when the upstream service allows it (Telegram, for
example, accepts both Markdown and HTML).</li>
<li>Apprise picks the best matching format automatically based on the
<code>format</code> you send with, so it no longer rewrites your content
when the service can already accept it as-is.</li>
<li>You can also choose the format yourself in the URL with
<code>?format=</code>.</li>
</ul>
</li>
<li><strong>Consistent error handling</strong>
<ul>
<li>Every error Apprise raises now comes from a single
<code>AppriseException</code> family, so developers can catch everything
in one place.</li>
<li>Each error still behaves like the plain Python error it used to be
(a bad setting is still a <code>ValueError</code>, a disk problem is
still an <code>OSError</code>), so existing
<code>try</code>/<code>except</code> blocks keep working.</li>
</ul>
</li>
<li><strong>Deprecations removed</strong> - Apprise v2 starts with a
clean slate:
<ul>
<li>The <code>APPRISE_CONFIG</code> environment variable is now
<code>APPRISE_CONFIG_PATH</code>. The old name still works for now, but
prints a deprecation warning.</li>
<li>The Email options <code>use_pgp=</code> and <code>?pgpkey=</code>
(deprecated back in v1) have been removed. Use <code>pgp_mode=</code>
and <code>?pgppub=</code> instead.</li>
<li>Bad settings in a URL (such as an unknown <code>?format=</code>) now
fail with a clear error message instead of quietly doing something
unexpected.</li>
</ul>
</li>
</ul>
<h3>📣 New Notification Services:</h3>
<ul>
<li>Delta Chat (<code>deltachat://</code>) support added in <a
href="https://redirect.github.com/caronc/apprise/pull/1666">caronc/apprise#1666</a></li>
<li>WPUSH (<code>wpush://</code>) support added by <a
href="https://github.com/anhao"><code>@​anhao</code></a> in <a
href="https://redirect.github.com/caronc/apprise/pull/1721">caronc/apprise#1721</a></li>
<li>YouLMK (<code>youlmk://</code>) support added by <a
href="https://github.com/elilat"><code>@​elilat</code></a> in <a
href="https://redirect.github.com/caronc/apprise/pull/1726">caronc/apprise#1726</a></li>
<li>Telnyx SMS (<code>telnyx://</code>) support added by <a
href="https://github.com/anandghegde"><code>@​anandghegde</code></a> in
<a
href="https://redirect.github.com/caronc/apprise/pull/1731">caronc/apprise#1731</a></li>
</ul>
<h3>🐞  Bugfixes</h3>
<ul>
<li>DingTalk Markdown messages now set <code>msgtype</code> to
<code>markdown</code> so they actually get delivered by <a
href="https://github.com/xtqxk"><code>@​xtqxk</code></a> in <a
href="https://redirect.github.com/caronc/apprise/pull/1733">caronc/apprise#1733</a></li>
<li>OneSignal now honors <code>language=</code> and keeps it in
<code>url()</code> by <a
href="https://github.com/MaxFreedomPollard"><code>@​MaxFreedomPollard</code></a>
in <a
href="https://redirect.github.com/caronc/apprise/pull/1720">caronc/apprise#1720</a></li>
<li>SIGNL4 now keeps its query parameters in <code>url()</code> by <a
href="https://github.com/MaxFreedomPollard"><code>@​MaxFreedomPollard</code></a>
in <a
href="https://redirect.github.com/caronc/apprise/pull/1732">caronc/apprise#1732</a></li>
<li>VAPID now delivers to the subscription endpoint instead of a
per-mode base URL by <a
href="https://github.com/RT530"><code>@​RT530</code></a> in <a
href="https://redirect.github.com/caronc/apprise/pull/1728">caronc/apprise#1728</a></li>
<li>Fluxer now works with self-hosted servers by using the correct URL
by <a href="https://github.com/LaaZa"><code>@​LaaZa</code></a> in <a
href="https://redirect.github.com/caronc/apprise/pull/1740">caronc/apprise#1740</a></li>
<li>ntfy <code>attach=</code> filename detection fixed, and
<code>filename=</code> is kept in <code>url()</code> by <a
href="https://github.com/SulimanAbdulrazzaq"><code>@​SulimanAbdulrazzaq</code></a>
in <a
href="https://redirect.github.com/caronc/apprise/pull/1744">caronc/apprise#1744</a></li>
<li>Compressed IPv6 addresses are now handled properly in <a
href="https://redirect.github.com/caronc/apprise/pull/1734">caronc/apprise#1734</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/caronc/apprise/commit/68f0eaf8bd2127ed693f451414f5e45686eaffd0"><code>68f0eaf</code></a>
bumped version to v2.0.0</li>
<li><a
href="https://github.com/caronc/apprise/commit/782f3038ab6070549117825b83ab173255f6ceca"><code>782f303</code></a>
Fixed o365:// inline attachment contentType sent as a literal string (<a
href="https://redirect.github.com/caronc/apprise/issues/1747">#1747</a>)</li>
<li><a
href="https://github.com/caronc/apprise/commit/a5b7e51b90890b76e4752f6fb00cb515403f438b"><code>a5b7e51</code></a>
Keep CC display names in url() for mailgun, ses, smtp2go and sparkpost
(<a
href="https://redirect.github.com/caronc/apprise/issues/1749">#1749</a>)</li>
<li><a
href="https://github.com/caronc/apprise/commit/5c4f272d0398e86597f46b9b719fd632a4b88a4c"><code>5c4f272</code></a>
Apprise v2 Release (<a
href="https://redirect.github.com/caronc/apprise/issues/1666">#1666</a>)</li>
<li><a
href="https://github.com/caronc/apprise/commit/971861bdc097936b2f988e7e782c91855a26687b"><code>971861b</code></a>
handling of Apprise v1 Branch</li>
<li><a
href="https://github.com/caronc/apprise/commit/6819cc45baff08a68aa3606cb9e707301d46b783"><code>6819cc4</code></a>
reduced codecov retention of file in github from 90 days to 7</li>
<li><a
href="https://github.com/caronc/apprise/commit/1fe1f703ab6eba7c95113123d7032b9ea32d467c"><code>1fe1f70</code></a>
Fix ntfy:// attach= filename detection and keep filename= in url() (<a
href="https://redirect.github.com/caronc/apprise/issues/1744">#1744</a>)</li>
<li><a
href="https://github.com/caronc/apprise/commit/2e72688d0526614980316b483c36d525441b9a4b"><code>2e72688</code></a>
fixes issue with yaml/config parsing (<a
href="https://redirect.github.com/caronc/apprise/issues/1743">#1743</a>)</li>
<li><a
href="https://github.com/caronc/apprise/commit/a02d47bcbfd3c270fc822118cb10cd80064d1914"><code>a02d47b</code></a>
Fluxer improvements to self-hosted api path (<a
href="https://redirect.github.com/caronc/apprise/issues/1740">#1740</a>)</li>
<li><a
href="https://github.com/caronc/apprise/commit/9e15330ed5f08b931d266ff888d6aba16c09b3ac"><code>9e15330</code></a>
Additional improvements/handling of macosx terminal-notifier wrapper (<a
href="https://redirect.github.com/caronc/apprise/issues/1742">#1742</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/caronc/apprise/compare/v1.13.1...v2.0.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=apprise&package-manager=uv&previous-version=1.13.1&new-version=2.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-20 01:24:13 -04:00

177 lines
3.4 KiB
TOML

[project]
name = "shelfmark"
version = "0.1.0"
description = "Shelfmark - Book Downloader"
requires-python = ">=3.14"
dependencies = [
"flask",
"flask-cors",
"flask-socketio",
"python-socketio",
"requests[socks]",
"defusedxml",
"beautifulsoup4",
"tqdm",
"dnspython",
"gunicorn",
"gevent",
"gevent-websocket",
"psutil",
"emoji",
"rarfile",
"qbittorrent-api>=2026.8.1",
"transmission-rpc",
"authlib>=1.8.0,<1.9",
"apprise>=2.0.0",
# HTTP/2 client for RFC 8484 DoH: quad9 rejects HTTP/1.1 outright (505), which
# requests cannot speak. See shelfmark/download/doh_wireformat.py.
"httpx[http2]>=0.28.1",
"publicsuffixlist>=1.0.2.20260925",
]
[project.optional-dependencies]
browser = [
"pyvirtualdisplay",
"pyautogui",
"seleniumbase==4.54.12",
"python-xlib",
]
[dependency-groups]
dev = [
"basedpyright>=1.40.1",
"prek",
"pytest",
"pytest-cov",
"pytest-xdist>=3.8.0",
"ruff==0.16.9",
"vulture>=2.14",
]
[tool.pytest.ini_options]
testpaths = ["tests"]
python_files = ["test_*.py", "*_test.py"]
python_classes = ["Test*"]
python_functions = ["test_*"]
addopts = [
"-v",
"--tb=short",
"-n",
"auto",
]
markers = [
"integration: marks tests that require running services (deselect with '-m \"not integration\"')",
"slow: marks tests as slow (deselect with '-m \"not slow\"')",
"e2e: marks end-to-end tests that require the full application stack",
]
[tool.ruff]
line-length = 100
extend-exclude = [".local"]
[tool.ruff.lint]
select = [
"F", "I", "UP", "B", "C4", "SIM", "PTH", "RET", "PIE", "FURB", "PERF", "TRY",
"A", "DTZ", "N",
"BLE001",
"ANN001", "ANN002", "ANN003", "ANN201", "ANN202", "ANN204",
"E402",
"ERA001",
"E731",
"S101",
"S110",
"S105", "S108",
"S311", "S324",
"S607", "S608",
"G003", "G004",
"PGH003",
"PLC0414",
"PLR1714",
"PLW1510",
"PLW2901",
"PLW0108",
"PT028",
"PYI034",
"Q000",
"RUF005", "RUF012", "RUF013", "RUF059", "RUF100",
"TC001", "TC002", "TC003",
]
ignore = ["D", "EM", "FBT", "PLR2004", "UP035", "TRY003", "E501", "TD002", "S104", "S603"]
[tool.ruff.lint.per-file-ignores]
"scripts/**/*.py" = [
"BLE001",
"S",
"TRY",
]
"tests/**/*.py" = [
"ANN",
"BLE001",
"B010",
"B017",
"B028",
"DTZ",
"E402",
"E731",
"ERA001",
"FURB",
"G003",
"G004",
"PERF",
"PIE",
"PLC0414",
"PLW0108",
"PLW1510",
"PLW2901",
"PTH",
"PT028",
"PYI034",
"Q000",
"RET",
"RUF012",
"S",
"SIM",
"TC001",
"TC002",
"TC003",
"TRY",
"UP028",
]
[tool.basedpyright]
include = ["shelfmark"]
exclude = [".local", "tests", "**/__pycache__", "**/node_modules"]
pythonVersion = "3.14"
typeCheckingMode = "standard"
[tool.vulture]
paths = ["shelfmark"]
exclude = [".local", "tests"]
ignore_decorators = [
"@app.route",
"@app.before_request",
"@app.after_request",
"@app.errorhandler",
"@socketio.on",
"@register_provider",
"@register_provider_kwargs",
"@register_settings",
"@register_source",
"@register_handler",
"@register_client",
"@register_output",
]
min_confidence = 90
sort_by_size = true
[tool.coverage.run]
source = ["shelfmark"]
branch = true
[tool.coverage.report]
show_missing = true
skip_empty = true
[tool.uv]
package = false