mirror of
https://github.com/calibrain/shelfmark.git
synced 2026-11-15 20:38:13 +00:00
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 >=1.0.0, <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 "nothing matched" 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 /> [](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>
177 lines
3.4 KiB
TOML
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
|