Compare commits

...

4 Commits

Author SHA1 Message Date
stumpylog 5274866925 Updates everything to reference and use towncrier over release drafter 2026-05-11 10:01:55 -07:00
dependabot[bot] 6cd5784bd7 Chore(deps): Bump hono (#12767)
Bumps the npm_and_yarn group with 1 update in the /src-ui directory: [hono](https://github.com/honojs/hono).


Updates `hono` from 4.12.16 to 4.12.18
- [Release notes](https://github.com/honojs/hono/releases)
- [Commits](https://github.com/honojs/hono/compare/v4.12.16...v4.12.18)

---
updated-dependencies:
- dependency-name: hono
  dependency-version: 4.12.18
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-08 22:42:12 -07:00
dependabot[bot] 4207999b63 Chore(deps): Bump @babel/plugin-transform-modules-systemjs (#12764)
Bumps the npm_and_yarn group with 1 update in the /src-ui directory: [@babel/plugin-transform-modules-systemjs](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-modules-systemjs).


Updates `@babel/plugin-transform-modules-systemjs` from 7.29.0 to 7.29.4
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.29.4/packages/babel-plugin-transform-modules-systemjs)

---
updated-dependencies:
- dependency-name: "@babel/plugin-transform-modules-systemjs"
  dependency-version: 7.29.4
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-08 15:45:59 -07:00
dependabot[bot] 934a1ed8d7 Chore(deps): Bump fast-uri from 3.1.1 to 3.1.2 in /src-ui in the npm_and_yarn group across 1 directory (#12763)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-08 15:05:57 -07:00
12 changed files with 229 additions and 123 deletions
+1
View File
@@ -40,3 +40,4 @@ NOTE: PRs that do not address the following will not be merged, please do not sk
- [ ] I have run all Git `pre-commit` hooks, see [documentation](https://docs.paperless-ngx.com/development/#code-formatting-with-pre-commit-hooks).
- [ ] I have made corresponding changes to the documentation as needed.
- [ ] In the description of the PR above I have disclosed the use of AI tools in the coding of this PR.
- [ ] I have added a changelog fragment in `docs/changelog.d/` (see [contributing guidelines](CONTRIBUTING.md#changelog-fragments)), or this PR does not require one (bot PR or labeled `skip-changelog`).
-54
View File
@@ -1,54 +0,0 @@
categories:
- title: 'Breaking Changes'
labels:
- 'breaking-change'
- title: 'Notable Changes'
labels:
- 'notable'
- title: 'Features / Enhancements'
labels:
- 'enhancement'
- title: 'Bug Fixes'
labels:
- 'bug'
- title: 'Documentation'
labels:
- 'documentation'
- title: 'Maintenance'
labels:
- 'chore'
- 'deployment'
- 'translation'
- 'ci-cd'
- title: 'Dependencies'
collapse-after: 3
labels:
- 'dependencies'
- title: 'All App Changes'
labels:
- 'frontend'
- 'backend'
collapse-after: 1
include-labels:
- 'enhancement'
- 'bug'
- 'chore'
- 'deployment'
- 'translation'
- 'dependencies'
- 'documentation'
- 'frontend'
- 'backend'
- 'ci-cd'
- 'breaking-change'
- 'notable'
exclude-labels:
- 'skip-changelog'
filter-by-commitish: true
category-template: '### $TITLE'
change-template: '- $TITLE @$AUTHOR ([#$NUMBER]($URL))'
change-title-escapes: '\<*_&#@'
template: |
## paperless-ngx $RESOLVED_VERSION
$CHANGES
+30
View File
@@ -26,3 +26,33 @@ jobs:
python-version: "3.14"
- name: Run prek
uses: j178/prek-action@cbc2f23eb5539cf20d82d1aabd0d0ecbcc56f4e3 # v2.0.2
- name: Fetch base branch for fragment check
if: |
github.event_name == 'pull_request' &&
!contains(github.actor, '[bot]') &&
!contains(join(github.event.pull_request.labels.*.name, ','), 'skip-changelog')
run: git fetch origin ${{ github.base_ref }} --depth=1
- name: Check changelog fragment
if: |
github.event_name == 'pull_request' &&
!contains(github.actor, '[bot]') &&
!contains(join(github.event.pull_request.labels.*.name, ','), 'skip-changelog')
run: |
pip install towncrier
towncrier check --compare-with origin/${{ github.base_ref }}
- name: Check fragment is single line
if: |
github.event_name == 'pull_request' &&
!contains(github.actor, '[bot]') &&
!contains(join(github.event.pull_request.labels.*.name, ','), 'skip-changelog')
run: |
failed=0
while IFS= read -r fragment; do
lines=$(grep -c . "$fragment" || true)
if [ "$lines" -ne 1 ]; then
echo "Error: $fragment must contain exactly one line (found $lines)"
failed=1
fi
done < <(git diff --name-only --diff-filter=AM "origin/${{ github.base_ref }}...HEAD" \
| grep -E '^docs/changelog\.d/[0-9]+\.[a-z]+\.md$')
exit $failed
+48 -47
View File
@@ -149,7 +149,6 @@ jobs:
pull-requests: write
outputs:
prerelease: ${{ steps.get-version.outputs.prerelease }}
changelog: ${{ steps.create-release.outputs.body }}
version: ${{ steps.get-version.outputs.version }}
steps:
- name: Download release artifact
@@ -168,26 +167,42 @@ jobs:
else
echo "prerelease=false" >> $GITHUB_OUTPUT
fi
- name: Create release and changelog
id: create-release
uses: release-drafter/release-drafter@5de93583980a40bd78603b6dfdcda5b4df377b32 # v7.2.0
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
name: Paperless-ngx ${{ steps.get-version.outputs.version }}
tag: ${{ steps.get-version.outputs.version }}
version: ${{ steps.get-version.outputs.version }}
prerelease: ${{ steps.get-version.outputs.prerelease }}
publish: true
commitish: main
persist-credentials: true
- name: Set up Python
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
with:
python-version: ${{ env.DEFAULT_PYTHON_VERSION }}
- name: Install uv
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
with:
version: ${{ env.DEFAULT_UV_VERSION }}
- name: Draft release notes
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Upload release archive
uses: shogo82148/actions-upload-release-asset@ee2ae851dc5d938b90075b3ef12c540abfd1ee72 # v1.10.1
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
upload_url: ${{ steps.create-release.outputs.upload_url }}
asset_path: ./paperless-ngx.tar.xz
asset_name: paperless-ngx-${{ steps.get-version.outputs.version }}.tar.xz
asset_content_type: application/x-xz
VERSION: ${{ steps.get-version.outputs.version }}
run: |
uv run --group changelog towncrier build \
--draft \
--version "${VERSION#v}" \
> RELEASE_NOTES.md
- name: Create GitHub release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
VERSION: ${{ steps.get-version.outputs.version }}
PRERELEASE: ${{ steps.get-version.outputs.prerelease }}
run: |
prerelease_flag=""
if [[ "${PRERELEASE}" == "true" ]]; then
prerelease_flag="--prerelease"
fi
mv paperless-ngx.tar.xz "paperless-ngx-${VERSION}.tar.xz"
gh release create "${VERSION}" \
--title "Paperless-ngx ${VERSION}" \
--notes-file RELEASE_NOTES.md \
${prerelease_flag} \
"./paperless-ngx-${VERSION}.tar.xz"
# ---------------------------------------------------------------------------
# Append changelog to docs (only on non-prerelease)
# ---------------------------------------------------------------------------
@@ -216,38 +231,24 @@ jobs:
version: ${{ env.DEFAULT_UV_VERSION }}
enable-cache: false
python-version: ${{ env.DEFAULT_PYTHON_VERSION }}
- name: Update changelog
working-directory: docs
- name: Build changelog
env:
VERSION: ${{ needs.publish-release.outputs.version }}
run: |
uv run --group changelog towncrier build \
--version "${VERSION#v}" \
--yes
uv run --dev prek run --files docs/changelog.md || true
- name: Commit and push
env:
CHANGELOG: ${{ needs.publish-release.outputs.changelog }}
PYTHON_VERSION: ${{ steps.setup-python.outputs.python-version }}
VERSION: ${{ needs.publish-release.outputs.version }}
run: |
branch_name="${VERSION}-changelog"
git branch "${branch_name}"
git checkout "${branch_name}"
printf '# Changelog\n\n%s\n' "${CHANGELOG}" > changelog-new.md
echo "Manually linking usernames"
sed -i -r 's|@([a-zA-Z0-9_]+) \(\[#|[@\1](https://github.com/\1) ([#|g' changelog-new.md
echo "Removing unneeded comment tags"
sed -i -r 's|@<!---->|@|g' changelog-new.md
CURRENT_CHANGELOG=$(tail --lines +2 changelog.md)
echo -e "$CURRENT_CHANGELOG" >> changelog-new.md
mv changelog-new.md changelog.md
uv run \
--python "${PYTHON_VERSION}" \
--dev \
prek run --files changelog.md || true
git config --global user.name "github-actions"
git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
git commit -am "Changelog ${VERSION} - GHA"
git checkout -b "${branch_name}"
git config user.name "github-actions"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git add docs/changelog.md docs/changelog.d/
git commit -m "Changelog ${VERSION} - GHA"
git push origin "${branch_name}"
- name: Create pull request
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
+4
View File
@@ -83,3 +83,7 @@ repos:
exclude: "^src-ui/pnpm-lock.yaml"
types:
- yaml
- repo: https://github.com/twisted/towncrier
rev: 25.8.0
hooks:
- id: towncrier-check
+44
View File
@@ -33,6 +33,50 @@ To test your code, execute `pytest` in the src/ directory. This also generates a
Before you can run `pytest`, ensure to [properly set up your local environment](https://docs.paperless-ngx.com/development/#initial-setup-and-first-start).
### Changelog Fragments
Every pull request that changes behavior, adds a feature, or fixes a bug
must include a news fragment. Fragments live in `docs/changelog.d/` and are
named `<pr-number>.<type>.md`.
For example, if your PR number is 1234 and it fixes a bug, create
`docs/changelog.d/1234.bugfix.md` with content describing what changed.
If you haven't opened the PR yet, use a `+` prefix as a placeholder:
```
docs/changelog.d/+my-change.bugfix.md
```
Rename it to the real PR number once the PR exists. The `+`-prefixed fragment
is valid and will pass CI, but the rendered changelog entry won't include a PR
link until it's renamed.
**Fragment types:**
| Type | Changelog section | Use for |
| ---------- | ------------------------ | ------------------------------------------------ |
| `breaking` | Breaking Changes | Anything that breaks existing behavior |
| `notable` | Notable Changes | Significant changes worth calling out separately |
| `feature` | Features / Enhancements | New features and enhancements |
| `bugfix` | Bug Fixes | Bug fixes |
| `doc` | Documentation | Documentation-only changes |
| `misc` | Maintenance (count only) | Chores, CI changes, refactoring |
Write the fragment content as a complete sentence describing the change
from the user's perspective. You may include attribution at the end:
```
Fixed the crash when importing documents with long filenames. By @yourusername
```
**You do not need a fragment if:**
- Your PR is from an automated bot (Dependabot, Crowdin)
- Your PR is labeled `skip-changelog`
CI will fail on PRs that require a fragment but don't have one.
## More info:
... is available [in the documentation](https://docs.paperless-ngx.com/development).
View File
+14
View File
@@ -0,0 +1,14 @@
Add a news fragment for each pull request:
docs/changelog.d/<pr-number>.<type>.md
Types: breaking, notable, feature, bugfix, doc, misc
Example: docs/changelog.d/1234.bugfix.md
Content: Fixed the thing that broke when X happened. By @yourusername
If you haven't opened the PR yet, use a + prefix as a placeholder:
docs/changelog.d/+my-change.bugfix.md
Rename it to the real PR number once the PR exists.
+2
View File
@@ -1,5 +1,7 @@
# Changelog
<!-- towncrier release notes start -->
## paperless-ngx 2.20.15
### Security
+36
View File
@@ -96,6 +96,7 @@ webserver = [
[dependency-groups]
dev = [
{ include-group = "changelog" },
{ include-group = "docs" },
{ include-group = "lint" },
{ include-group = "testing" },
@@ -103,6 +104,9 @@ dev = [
docs = [
"zensical>=0.0.36",
]
changelog = [
"towncrier>=25.8",
]
lint = [
"prek~=0.3.10",
"ruff~=0.15.12",
@@ -342,6 +346,38 @@ omit = [
"paperless/auth.py",
]
[tool.towncrier]
directory = "docs/changelog.d"
filename = "docs/changelog.md"
title_format = "## paperless-ngx {version}"
issue_format = "[#{issue}](https://github.com/paperless-ngx/paperless-ngx/pull/{issue})"
underlines = [ "", "", "" ]
start_string = "<!-- towncrier release notes start -->\n"
[[tool.towncrier.type]]
directory = "breaking"
name = "Breaking Changes"
showcontent = true
[[tool.towncrier.type]]
directory = "notable"
name = "Notable Changes"
showcontent = true
[[tool.towncrier.type]]
directory = "feature"
name = "Features / Enhancements"
showcontent = true
[[tool.towncrier.type]]
directory = "bugfix"
name = "Bug Fixes"
showcontent = true
[[tool.towncrier.type]]
directory = "doc"
name = "Documentation"
showcontent = true
[[tool.towncrier.type]]
directory = "misc"
name = "Maintenance"
showcontent = false
[tool.mypy-baseline]
baseline_path = ".mypy-baseline.txt"
sort_baseline = true
+31 -22
View File
@@ -1027,8 +1027,8 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0-0
'@babel/plugin-transform-modules-systemjs@7.29.0':
resolution: {integrity: sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==}
'@babel/plugin-transform-modules-systemjs@7.29.4':
resolution: {integrity: sha512-N7QmZ0xRZfjHOfZeQLJjwgX2zS9pdGHSVl/cjSGlo4dXMqvurfxXDMKY4RqEKzPozV78VMcd0lxyG13mlbKc4w==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
@@ -3262,6 +3262,7 @@ packages:
'@ungap/structured-clone@1.3.0':
resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
deprecated: Potential CWE-502 - Update to 1.3.1 or higher
'@unrs/resolver-binding-android-arm-eabi@1.11.1':
resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==}
@@ -4312,8 +4313,8 @@ packages:
fast-levenshtein@2.0.6:
resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
fast-uri@3.1.1:
resolution: {integrity: sha512-h2r7rcm6Ee/J8o0LD5djLuFVcfbZxhvho4vvsbeV0aMvXjUgqv4YpxpkEx0d68l6+IleVfLAdVEfhR7QNMkGHQ==}
fast-uri@3.1.2:
resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==}
faye-websocket@0.11.4:
resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==}
@@ -4512,8 +4513,8 @@ packages:
resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==}
engines: {node: '>= 0.4'}
hono@4.12.16:
resolution: {integrity: sha512-jN0ZewiNAWSe5khM3EyCmBb250+b40wWbwNILNfEvq84VREWwOIkuUsFONk/3i3nqkz7Oe1PcpM2mwQEK2L9Kg==}
hono@4.12.18:
resolution: {integrity: sha512-RWzP96k/yv0PQfyXnWjs6zot20TqfpfsNXhOnev8d1InAxubW93L11/oNUc3tQqn2G0bSdAOBpX+2uDFHV7kdQ==}
engines: {node: '>=16.9.0'}
hosted-git-info@9.0.3:
@@ -5435,8 +5436,8 @@ packages:
'@angular/core': ^21.1.0
'@ng-bootstrap/ng-bootstrap': ^20.0.0
node-abi@3.90.0:
resolution: {integrity: sha512-pZNQT7UnYlMwMBy5N1lV5X/YLTbZM5ncytN3xL7CHEzhDN8uVe0u55yaPUJICIJjaCW8NrM5BFdqr7HLweStNA==}
node-abi@3.92.0:
resolution: {integrity: sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ==}
engines: {node: '>=10'}
node-addon-api@6.1.0:
@@ -6068,6 +6069,11 @@ packages:
engines: {node: '>=10'}
hasBin: true
semver@7.8.0:
resolution: {integrity: sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==}
engines: {node: '>=10'}
hasBin: true
send@0.19.2:
resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==}
engines: {node: '>= 0.8.0'}
@@ -8109,7 +8115,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@babel/plugin-transform-modules-systemjs@7.29.0(@babel/core@7.28.5)':
'@babel/plugin-transform-modules-systemjs@7.29.4(@babel/core@7.28.5)':
dependencies:
'@babel/core': 7.28.5
'@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.5)
@@ -8327,7 +8333,7 @@ snapshots:
'@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.5)
'@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.5)
'@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.28.5)
'@babel/plugin-transform-modules-systemjs': 7.29.0(@babel/core@7.28.5)
'@babel/plugin-transform-modules-systemjs': 7.29.4(@babel/core@7.28.5)
'@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.5)
'@babel/plugin-transform-named-capturing-groups-regex': 7.29.0(@babel/core@7.28.5)
'@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.5)
@@ -8724,9 +8730,9 @@ snapshots:
'@harperfast/extended-iterable@1.0.3':
optional: true
'@hono/node-server@1.19.14(hono@4.12.16)':
'@hono/node-server@1.19.14(hono@4.12.18)':
dependencies:
hono: 4.12.16
hono: 4.12.18
'@humanfs/core@0.19.2':
dependencies:
@@ -9314,7 +9320,7 @@ snapshots:
'@modelcontextprotocol/sdk@1.26.0(zod@4.3.6)':
dependencies:
'@hono/node-server': 1.19.14(hono@4.12.16)
'@hono/node-server': 1.19.14(hono@4.12.18)
ajv: 8.20.0
ajv-formats: 3.0.1(ajv@8.20.0)
content-type: 1.0.5
@@ -9324,7 +9330,7 @@ snapshots:
eventsource-parser: 3.0.8
express: 5.2.1
express-rate-limit: 8.4.1(express@5.2.1)
hono: 4.12.16
hono: 4.12.18
jose: 6.2.3
json-schema-typed: 8.0.2
pkce-challenge: 5.0.1
@@ -10396,21 +10402,21 @@ snapshots:
ajv@8.17.1:
dependencies:
fast-deep-equal: 3.1.3
fast-uri: 3.1.1
fast-uri: 3.1.2
json-schema-traverse: 1.0.0
require-from-string: 2.0.2
ajv@8.18.0:
dependencies:
fast-deep-equal: 3.1.3
fast-uri: 3.1.1
fast-uri: 3.1.2
json-schema-traverse: 1.0.0
require-from-string: 2.0.2
ajv@8.20.0:
dependencies:
fast-deep-equal: 3.1.3
fast-uri: 3.1.1
fast-uri: 3.1.2
json-schema-traverse: 1.0.0
require-from-string: 2.0.2
@@ -11392,7 +11398,7 @@ snapshots:
fast-levenshtein@2.0.6: {}
fast-uri@3.1.1: {}
fast-uri@3.1.2: {}
faye-websocket@0.11.4:
dependencies:
@@ -11592,7 +11598,7 @@ snapshots:
dependencies:
function-bind: 1.1.2
hono@4.12.16: {}
hono@4.12.18: {}
hosted-git-info@9.0.3:
dependencies:
@@ -12746,9 +12752,9 @@ snapshots:
- '@angular/router'
- rxjs
node-abi@3.90.0:
node-abi@3.92.0:
dependencies:
semver: 7.7.4
semver: 7.8.0
optional: true
node-addon-api@6.1.0:
@@ -13127,7 +13133,7 @@ snapshots:
minimist: 1.2.8
mkdirp-classic: 0.5.3
napi-build-utils: 2.0.0
node-abi: 3.90.0
node-abi: 3.92.0
pump: 3.0.4
rc: 1.2.8
simple-get: 4.0.1
@@ -13467,6 +13473,9 @@ snapshots:
semver@7.7.4: {}
semver@7.8.0:
optional: true
send@0.19.2:
dependencies:
debug: 2.6.9
Generated
+19
View File
@@ -2953,6 +2953,9 @@ webserver = [
]
[package.dev-dependencies]
changelog = [
{ name = "towncrier", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
]
dev = [
{ name = "daphne", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
{ name = "factory-boy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
@@ -2970,6 +2973,7 @@ dev = [
{ name = "pytest-xdist", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
{ name = "ruff", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
{ name = "time-machine", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
{ name = "towncrier", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
{ name = "zensical", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
]
docs = [
@@ -3094,6 +3098,7 @@ requires-dist = [
provides-extras = ["mariadb", "postgres", "webserver"]
[package.metadata.requires-dev]
changelog = [{ name = "towncrier", specifier = ">=25.8.0" }]
dev = [
{ name = "daphne" },
{ name = "factory-boy", specifier = "~=3.3.1" },
@@ -3111,6 +3116,7 @@ dev = [
{ name = "pytest-xdist", specifier = "~=3.8.0" },
{ name = "ruff", specifier = "~=0.15.12" },
{ name = "time-machine", specifier = ">=2.13" },
{ name = "towncrier", specifier = ">=25.8.0" },
{ name = "zensical", specifier = ">=0.0.36" },
]
docs = [{ name = "zensical", specifier = ">=0.0.36" }]
@@ -5015,6 +5021,19 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/82/9e/656ee4cec0398b1d18d0f1eb6372c41c6b889722641d84948351ae19556d/tornado-6.5.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:36abed1754faeb80fbd6e64db2758091e1320f6bba74a4cf8c09cd18ccce8aca", size = 447445, upload-time = "2026-03-10T21:30:55.541Z" },
]
[[package]]
name = "towncrier"
version = "25.8.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "click", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
{ name = "jinja2", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/c2/eb/5bf25a34123698d3bbab39c5bc5375f8f8bcbcc5a136964ade66935b8b9d/towncrier-25.8.0.tar.gz", hash = "sha256:eef16d29f831ad57abb3ae32a0565739866219f1ebfbdd297d32894eb9940eb1", size = 76322, upload-time = "2025-08-30T11:41:55.393Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/42/06/8ba22ec32c74ac1be3baa26116e3c28bc0e76a5387476921d20b6fdade11/towncrier-25.8.0-py3-none-any.whl", hash = "sha256:b953d133d98f9aeae9084b56a3563fd2519dfc6ec33f61c9cd2c61ff243fb513", size = 65101, upload-time = "2025-08-30T11:41:53.644Z" },
]
[[package]]
name = "tqdm"
version = "4.67.3"