update project files (#5457)
* update pre-commit hooks * add devcontainer * show url in publish environment * update actions versions * separate typing job * use dependabot grouped updates ignore upload/download-artifact until slsa updates * use sphinx.ext.extlinks instead of sphinx-issues * update editorconfig * update gitignore * update .readthedocs.yaml * license is txt, readme is md * use pyproject.toml and flit_core instead of setuptools add typed classifier add pyright config simplify urls * tox builds docs in place * add tox env to update all dev dependencies * update issue and pr templates * simplify matrix
This commit is contained in:
parent
e491223739
commit
20477c6357
17
.devcontainer/devcontainer.json
Normal file
17
.devcontainer/devcontainer.json
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"name": "pallets/jinja",
|
||||||
|
"image": "mcr.microsoft.com/devcontainers/python:3",
|
||||||
|
"customizations": {
|
||||||
|
"vscode": {
|
||||||
|
"settings": {
|
||||||
|
"python.defaultInterpreterPath": "${workspaceFolder}/.venv",
|
||||||
|
"python.terminal.activateEnvInCurrentTerminal": true,
|
||||||
|
"python.terminal.launchArgs": [
|
||||||
|
"-X",
|
||||||
|
"dev"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"onCreateCommand": ".devcontainer/on-create-command.sh"
|
||||||
|
}
|
||||||
7
.devcontainer/on-create-command.sh
Executable file
7
.devcontainer/on-create-command.sh
Executable file
@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
python3 -m venv --upgrade-deps .venv
|
||||||
|
. .venv/bin/activate
|
||||||
|
pip install -r requirements/dev.txt
|
||||||
|
pip install -e .
|
||||||
|
pre-commit install --install-hooks
|
||||||
@ -9,5 +9,5 @@ end_of_line = lf
|
|||||||
charset = utf-8
|
charset = utf-8
|
||||||
max_line_length = 88
|
max_line_length = 88
|
||||||
|
|
||||||
[*.{yml,yaml,json,js,css,html}]
|
[*.{css,html,js,json,jsx,scss,ts,tsx,yaml,yml}]
|
||||||
indent_size = 2
|
indent_size = 2
|
||||||
|
|||||||
28
.flake8
28
.flake8
@ -1,28 +0,0 @@
|
|||||||
[flake8]
|
|
||||||
extend-select =
|
|
||||||
# bugbear
|
|
||||||
B
|
|
||||||
# bugbear opinions
|
|
||||||
B9
|
|
||||||
# implicit str concat
|
|
||||||
ISC
|
|
||||||
extend-ignore =
|
|
||||||
# slice notation whitespace, invalid
|
|
||||||
E203
|
|
||||||
# line length, handled by bugbear B950
|
|
||||||
E501
|
|
||||||
# bare except, handled by bugbear B001
|
|
||||||
E722
|
|
||||||
# zip with strict=, requires python >= 3.10
|
|
||||||
B905
|
|
||||||
# string formatting opinion, B028 renamed to B907
|
|
||||||
B028
|
|
||||||
B907
|
|
||||||
# up to 88 allowed by bugbear B950
|
|
||||||
max-line-length = 80
|
|
||||||
per-file-ignores =
|
|
||||||
# __init__ exports names
|
|
||||||
src/jinja2/__init__.py: F401
|
|
||||||
# not relevant to jinja's compiler
|
|
||||||
src/jinja2/compiler.py: B906
|
|
||||||
src/jinja2/idtracking.py: B906
|
|
||||||
4
.github/ISSUE_TEMPLATE/bug-report.md
vendored
4
.github/ISSUE_TEMPLATE/bug-report.md
vendored
@ -4,8 +4,8 @@ about: Report a bug in Jinja (not other projects which depend on Jinja)
|
|||||||
---
|
---
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
This issue tracker is a tool to address bugs in Jinja itself. Please
|
This issue tracker is a tool to address bugs in Jinja itself. Please use
|
||||||
use Pallets Discord or Stack Overflow for questions about your own code.
|
GitHub Discussions or the Pallets Discord for questions about your own code.
|
||||||
|
|
||||||
Replace this comment with a clear outline of what the bug is.
|
Replace this comment with a clear outline of what the bug is.
|
||||||
-->
|
-->
|
||||||
|
|||||||
13
.github/ISSUE_TEMPLATE/config.yml
vendored
13
.github/ISSUE_TEMPLATE/config.yml
vendored
@ -1,11 +1,8 @@
|
|||||||
blank_issues_enabled: false
|
blank_issues_enabled: false
|
||||||
contact_links:
|
contact_links:
|
||||||
- name: Security issue
|
- name: Questions on Discussions
|
||||||
url: security@palletsprojects.com
|
url: https://github.com/pallets/jinja/discussions/
|
||||||
about: Do not report security issues publicly. Email our security contact.
|
about: Ask questions about your own code on the Discussions tab.
|
||||||
- name: Questions
|
- name: Questions on Chat
|
||||||
url: https://stackoverflow.com/questions/tagged/Jinja?tab=Frequent
|
|
||||||
about: Search for and ask questions about your code on Stack Overflow.
|
|
||||||
- name: Questions and discussions
|
|
||||||
url: https://discord.gg/pallets
|
url: https://discord.gg/pallets
|
||||||
about: Discuss questions about your code on our Discord chat.
|
about: Ask questions about your own code on our Discord chat.
|
||||||
|
|||||||
6
.github/ISSUE_TEMPLATE/feature-request.md
vendored
6
.github/ISSUE_TEMPLATE/feature-request.md
vendored
@ -5,11 +5,11 @@ about: Suggest a new feature for Jinja
|
|||||||
|
|
||||||
<!--
|
<!--
|
||||||
Replace this comment with a description of what the feature should do.
|
Replace this comment with a description of what the feature should do.
|
||||||
Include details such as links relevant specs or previous discussions.
|
Include details such as links to relevant specs or previous discussions.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Replace this comment with an example of the problem which this feature
|
Replace this comment with an example of the problem which this feature
|
||||||
would resolve. Is this problem solvable without changes to Jinja,
|
would resolve. Is this problem solvable without changes to Jinja, such
|
||||||
such as by subclassing or using an extension?
|
as by subclassing or using an extension?
|
||||||
-->
|
-->
|
||||||
|
|||||||
29
.github/dependabot.yml
vendored
29
.github/dependabot.yml
vendored
@ -1,9 +1,24 @@
|
|||||||
version: 2
|
version: 2
|
||||||
updates:
|
updates:
|
||||||
- package-ecosystem: "github-actions"
|
- package-ecosystem: github-actions
|
||||||
directory: "/"
|
directory: /
|
||||||
schedule:
|
schedule:
|
||||||
interval: "monthly"
|
interval: monthly
|
||||||
day: "monday"
|
ignore:
|
||||||
time: "16:00"
|
# slsa depends on upload/download v3
|
||||||
timezone: "UTC"
|
- dependency-name: actions/upload-artifact
|
||||||
|
versions: '>= 4'
|
||||||
|
- dependency-name: actions/download-artifact
|
||||||
|
versions: '>= 4'
|
||||||
|
groups:
|
||||||
|
github-actions:
|
||||||
|
patterns:
|
||||||
|
- '*'
|
||||||
|
- package-ecosystem: pip
|
||||||
|
directory: /requirements/
|
||||||
|
schedule:
|
||||||
|
interval: monthly
|
||||||
|
groups:
|
||||||
|
python-requirements:
|
||||||
|
patterns:
|
||||||
|
- '*'
|
||||||
|
|||||||
31
.github/pull_request_template.md
vendored
31
.github/pull_request_template.md
vendored
@ -1,26 +1,25 @@
|
|||||||
<!--
|
<!--
|
||||||
Before opening a PR, open a ticket describing the issue or feature the PR will address. Follow the steps in CONTRIBUTING.rst.
|
Before opening a PR, open a ticket describing the issue or feature the
|
||||||
|
PR will address. An issue is not required for fixing typos in
|
||||||
|
documentation, or other simple non-code changes.
|
||||||
|
|
||||||
Replace this comment with a description of the change. Describe how it addresses the linked ticket.
|
Replace this comment with a description of the change. Describe how it
|
||||||
|
addresses the linked ticket.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Link to relevant issues or previous PRs, one per line. Use "fixes" to automatically close an issue.
|
Link to relevant issues or previous PRs, one per line. Use "fixes" to
|
||||||
-->
|
automatically close an issue.
|
||||||
|
|
||||||
- fixes #<issue number>
|
fixes #<issue number>
|
||||||
|
-->
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Ensure each step in CONTRIBUTING.rst is complete by adding an "x" to each box below.
|
Ensure each step in CONTRIBUTING.rst is complete, especially the following:
|
||||||
|
|
||||||
If only docs were changed, these aren't relevant and can be removed.
|
- Add tests that demonstrate the correct behavior of the change. Tests
|
||||||
|
should fail without the change.
|
||||||
|
- Add or update relevant docs, in the docs folder and in code.
|
||||||
|
- Add an entry in CHANGES.rst summarizing the change and linking to the issue.
|
||||||
|
- Add `.. versionchanged::` entries in any relevant code docs.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
Checklist:
|
|
||||||
|
|
||||||
- [ ] Add tests that demonstrate the correct behavior of the change. Tests should fail without the change.
|
|
||||||
- [ ] Add or update relevant docs, in the docs folder and in code.
|
|
||||||
- [ ] Add an entry in `CHANGES.rst` summarizing the change and linking to the issue.
|
|
||||||
- [ ] Add `.. versionchanged::` entries in any relevant code docs.
|
|
||||||
- [ ] Run `pre-commit` hooks and fix any issues.
|
|
||||||
- [ ] Run `pytest` and `tox`, no tests failed.
|
|
||||||
|
|||||||
16
.github/workflows/lock.yaml
vendored
16
.github/workflows/lock.yaml
vendored
@ -1,25 +1,23 @@
|
|||||||
name: 'Lock threads'
|
name: Lock inactive closed issues
|
||||||
# Lock closed issues that have not received any further activity for
|
# Lock closed issues that have not received any further activity for two weeks.
|
||||||
# two weeks. This does not close open issues, only humans may do that.
|
# This does not close open issues, only humans may do that. It is easier to
|
||||||
# We find that it is easier to respond to new issues with fresh examples
|
# respond to new issues with fresh examples rather than continuing discussions
|
||||||
# rather than continuing discussions on old issues.
|
# on old issues.
|
||||||
|
|
||||||
on:
|
on:
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '0 0 * * *'
|
- cron: '0 0 * * *'
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
issues: write
|
issues: write
|
||||||
pull-requests: write
|
pull-requests: write
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: lock
|
group: lock
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
lock:
|
lock:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: dessant/lock-threads@c1b35aecc5cdb1a34539d14196df55838bb2f836
|
- uses: dessant/lock-threads@1bf7ec25051fe7c00bdd17e6a7cf3d7bfb7dc771 # v5.0.1
|
||||||
with:
|
with:
|
||||||
issue-inactive-days: 14
|
issue-inactive-days: 14
|
||||||
pr-inactive-days: 14
|
pr-inactive-days: 14
|
||||||
|
discussion-inactive-days: 14
|
||||||
|
|||||||
32
.github/workflows/publish.yaml
vendored
32
.github/workflows/publish.yaml
vendored
@ -9,12 +9,12 @@ jobs:
|
|||||||
outputs:
|
outputs:
|
||||||
hash: ${{ steps.hash.outputs.hash }}
|
hash: ${{ steps.hash.outputs.hash }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c
|
- uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
|
||||||
- uses: actions/setup-python@5ccb29d8773c3f3f653e1705f474dfaa8a06a912
|
- uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0
|
||||||
with:
|
with:
|
||||||
python-version: '3.x'
|
python-version: '3.x'
|
||||||
cache: 'pip'
|
cache: pip
|
||||||
cache-dependency-path: 'requirements/*.txt'
|
cache-dependency-path: requirements*/*.txt
|
||||||
- run: pip install -r requirements/build.txt
|
- run: pip install -r requirements/build.txt
|
||||||
# Use the commit date instead of the current date during the build.
|
# Use the commit date instead of the current date during the build.
|
||||||
- run: echo "SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct)" >> $GITHUB_ENV
|
- run: echo "SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct)" >> $GITHUB_ENV
|
||||||
@ -23,28 +23,28 @@ jobs:
|
|||||||
- name: generate hash
|
- name: generate hash
|
||||||
id: hash
|
id: hash
|
||||||
run: cd dist && echo "hash=$(sha256sum * | base64 -w0)" >> $GITHUB_OUTPUT
|
run: cd dist && echo "hash=$(sha256sum * | base64 -w0)" >> $GITHUB_OUTPUT
|
||||||
- uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce
|
- uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
|
||||||
with:
|
with:
|
||||||
path: ./dist
|
path: ./dist
|
||||||
provenance:
|
provenance:
|
||||||
needs: ['build']
|
needs: [build]
|
||||||
permissions:
|
permissions:
|
||||||
actions: read
|
actions: read
|
||||||
id-token: write
|
id-token: write
|
||||||
contents: write
|
contents: write
|
||||||
# Can't pin with hash due to how this workflow works.
|
# Can't pin with hash due to how this workflow works.
|
||||||
uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v1.4.0
|
uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v1.10.0
|
||||||
with:
|
with:
|
||||||
base64-subjects: ${{ needs.build.outputs.hash }}
|
base64-subjects: ${{ needs.build.outputs.hash }}
|
||||||
create-release:
|
create-release:
|
||||||
# Upload the sdist, wheels, and provenance to a GitHub release. They remain
|
# Upload the sdist, wheels, and provenance to a GitHub release. They remain
|
||||||
# available as build artifacts for a while as well.
|
# available as build artifacts for a while as well.
|
||||||
needs: ['provenance']
|
needs: [provenance]
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a
|
- uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2
|
||||||
- name: create release
|
- name: create release
|
||||||
run: >
|
run: >
|
||||||
gh release create --draft --repo ${{ github.repository }}
|
gh release create --draft --repo ${{ github.repository }}
|
||||||
@ -53,15 +53,21 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
GH_TOKEN: ${{ github.token }}
|
GH_TOKEN: ${{ github.token }}
|
||||||
publish-pypi:
|
publish-pypi:
|
||||||
needs: ['provenance']
|
needs: [provenance]
|
||||||
# Wait for approval before attempting to upload to PyPI. This allows reviewing the
|
# Wait for approval before attempting to upload to PyPI. This allows reviewing the
|
||||||
# files in the draft release.
|
# files in the draft release.
|
||||||
environment: 'publish'
|
environment:
|
||||||
|
name: publish
|
||||||
|
url: https://pypi.org/project/Jinja2/${{ github.ref_name }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
permissions:
|
permissions:
|
||||||
id-token: write
|
id-token: write
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a
|
- uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2
|
||||||
- uses: pypa/gh-action-pypi-publish@2f6f737ca5f74c637829c0f5c3acd0e29ea5e8bf
|
- uses: pypa/gh-action-pypi-publish@81e9d935c883d0b210363ab89cf05f3894778450 # v1.8.14
|
||||||
|
with:
|
||||||
|
repository-url: https://test.pypi.org/legacy/
|
||||||
|
packages-dir: artifact/
|
||||||
|
- uses: pypa/gh-action-pypi-publish@81e9d935c883d0b210363ab89cf05f3894778450 # v1.8.14
|
||||||
with:
|
with:
|
||||||
packages-dir: artifact/
|
packages-dir: artifact/
|
||||||
|
|||||||
58
.github/workflows/tests.yaml
vendored
58
.github/workflows/tests.yaml
vendored
@ -9,48 +9,50 @@ on:
|
|||||||
- '*.md'
|
- '*.md'
|
||||||
- '*.rst'
|
- '*.rst'
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
- '*.x'
|
|
||||||
paths-ignore:
|
paths-ignore:
|
||||||
- 'docs/**'
|
- 'docs/**'
|
||||||
- '*.md'
|
- '*.md'
|
||||||
- '*.rst'
|
- '*.rst'
|
||||||
jobs:
|
jobs:
|
||||||
tests:
|
tests:
|
||||||
name: ${{ matrix.name }}
|
name: ${{ matrix.name || matrix.python }}
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os || 'ubuntu-latest' }}
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- {name: Linux, python: '3.11', os: ubuntu-latest, tox: py311}
|
- {python: '3.12'}
|
||||||
- {name: Windows, python: '3.11', os: windows-latest, tox: py311}
|
- {name: Windows, python: '3.12', os: windows-latest}
|
||||||
- {name: Mac, python: '3.11', os: macos-latest, tox: py311}
|
- {name: Mac, python: '3.12', os: macos-latest}
|
||||||
- {name: '3.12-dev', python: '3.12-dev', os: ubuntu-latest, tox: py312}
|
- {python: '3.11'}
|
||||||
- {name: '3.10', python: '3.10', os: ubuntu-latest, tox: py310}
|
- {python: '3.10'}
|
||||||
- {name: '3.9', python: '3.9', os: ubuntu-latest, tox: py39}
|
- {python: '3.9'}
|
||||||
- {name: '3.8', python: '3.8', os: ubuntu-latest, tox: py38}
|
- {python: '3.8'}
|
||||||
- {name: '3.7', python: '3.7', os: ubuntu-latest, tox: py37}
|
- {python: '3.7'}
|
||||||
- {name: 'PyPy', python: 'pypy-3.10', os: ubuntu-latest, tox: pypy310}
|
- {name: PyPy, python: 'pypy-3.10', tox: pypy310}
|
||||||
- {name: Typing, python: '3.11', os: ubuntu-latest, tox: typing}
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c
|
- uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
|
||||||
- uses: actions/setup-python@5ccb29d8773c3f3f653e1705f474dfaa8a06a912
|
- uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0
|
||||||
with:
|
with:
|
||||||
python-version: ${{ matrix.python }}
|
python-version: ${{ matrix.python }}
|
||||||
cache: 'pip'
|
allow-prereleases: true
|
||||||
cache-dependency-path: 'requirements/*.txt'
|
cache: pip
|
||||||
- name: update pip
|
cache-dependency-path: requirements*/*.txt
|
||||||
run: |
|
- run: pip install tox
|
||||||
pip install -U wheel
|
- run: tox run -e ${{ matrix.tox || format('py{0}', matrix.python) }}
|
||||||
pip install -U setuptools
|
typing:
|
||||||
python -m pip install -U pip
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
|
||||||
|
- uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0
|
||||||
|
with:
|
||||||
|
python-version: '3.x'
|
||||||
|
cache: pip
|
||||||
|
cache-dependency-path: requirements*/*.txt
|
||||||
- name: cache mypy
|
- name: cache mypy
|
||||||
uses: actions/cache@58c146cc91c5b9e778e71775dfe9bf1442ad9a12
|
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
|
||||||
with:
|
with:
|
||||||
path: ./.mypy_cache
|
path: ./.mypy_cache
|
||||||
key: mypy|${{ matrix.python }}|${{ hashFiles('setup.cfg') }}
|
key: mypy|${{ hashFiles('pyproject.toml') }}
|
||||||
if: matrix.tox == 'typing'
|
|
||||||
- run: pip install tox
|
- run: pip install tox
|
||||||
- run: tox run -e ${{ matrix.tox }}
|
- run: tox run -e typing
|
||||||
|
|||||||
29
.gitignore
vendored
29
.gitignore
vendored
@ -1,21 +1,10 @@
|
|||||||
*.so
|
|
||||||
docs/_build/
|
|
||||||
*.pyc
|
|
||||||
*.pyo
|
|
||||||
*.egg-info/
|
|
||||||
*.egg
|
|
||||||
build/
|
|
||||||
dist/
|
|
||||||
.DS_Store
|
|
||||||
.tox/
|
|
||||||
.cache/
|
|
||||||
.idea/
|
.idea/
|
||||||
env/
|
.vscode/
|
||||||
venv/
|
.venv*/
|
||||||
venv-*/
|
venv*/
|
||||||
.coverage
|
__pycache__/
|
||||||
.coverage.*
|
dist/
|
||||||
htmlcov
|
.coverage*
|
||||||
.pytest_cache/
|
htmlcov/
|
||||||
/.vscode/
|
.tox/
|
||||||
.mypy_cache
|
docs/_build/
|
||||||
|
|||||||
@ -1,33 +1,16 @@
|
|||||||
ci:
|
ci:
|
||||||
autoupdate_branch: "3.1.x"
|
|
||||||
autoupdate_schedule: monthly
|
autoupdate_schedule: monthly
|
||||||
repos:
|
repos:
|
||||||
- repo: https://github.com/asottile/pyupgrade
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||||
rev: v3.15.0
|
rev: v0.4.1
|
||||||
hooks:
|
hooks:
|
||||||
- id: pyupgrade
|
- id: ruff
|
||||||
args: ["--py37-plus"]
|
- id: ruff-format
|
||||||
- repo: https://github.com/asottile/reorder-python-imports
|
|
||||||
rev: v3.12.0
|
|
||||||
hooks:
|
|
||||||
- id: reorder-python-imports
|
|
||||||
args: ["--application-directories", "src"]
|
|
||||||
- repo: https://github.com/psf/black
|
|
||||||
rev: 23.12.1
|
|
||||||
hooks:
|
|
||||||
- id: black
|
|
||||||
- repo: https://github.com/PyCQA/flake8
|
|
||||||
rev: 7.0.0
|
|
||||||
hooks:
|
|
||||||
- id: flake8
|
|
||||||
additional_dependencies: [flake8-bugbear]
|
|
||||||
- repo: https://github.com/peterdemin/pip-compile-multi
|
|
||||||
rev: v2.6.3
|
|
||||||
hooks:
|
|
||||||
- id: pip-compile-multi-verify
|
|
||||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||||
rev: v4.5.0
|
rev: v4.6.0
|
||||||
hooks:
|
hooks:
|
||||||
|
- id: check-merge-conflict
|
||||||
|
- id: debug-statements
|
||||||
- id: fix-byte-order-marker
|
- id: fix-byte-order-marker
|
||||||
- id: trailing-whitespace
|
- id: trailing-whitespace
|
||||||
- id: end-of-file-fixer
|
- id: end-of-file-fixer
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
version: 2
|
version: 2
|
||||||
build:
|
build:
|
||||||
os: ubuntu-20.04
|
os: ubuntu-22.04
|
||||||
tools:
|
tools:
|
||||||
python: "3.10"
|
python: '3.12'
|
||||||
python:
|
python:
|
||||||
install:
|
install:
|
||||||
- requirements: requirements/docs.txt
|
- requirements: requirements/docs.txt
|
||||||
|
|||||||
@ -1,76 +0,0 @@
|
|||||||
# Contributor Covenant Code of Conduct
|
|
||||||
|
|
||||||
## Our Pledge
|
|
||||||
|
|
||||||
In the interest of fostering an open and welcoming environment, we as
|
|
||||||
contributors and maintainers pledge to making participation in our project and
|
|
||||||
our community a harassment-free experience for everyone, regardless of age, body
|
|
||||||
size, disability, ethnicity, sex characteristics, gender identity and expression,
|
|
||||||
level of experience, education, socio-economic status, nationality, personal
|
|
||||||
appearance, race, religion, or sexual identity and orientation.
|
|
||||||
|
|
||||||
## Our Standards
|
|
||||||
|
|
||||||
Examples of behavior that contributes to creating a positive environment
|
|
||||||
include:
|
|
||||||
|
|
||||||
* Using welcoming and inclusive language
|
|
||||||
* Being respectful of differing viewpoints and experiences
|
|
||||||
* Gracefully accepting constructive criticism
|
|
||||||
* Focusing on what is best for the community
|
|
||||||
* Showing empathy towards other community members
|
|
||||||
|
|
||||||
Examples of unacceptable behavior by participants include:
|
|
||||||
|
|
||||||
* The use of sexualized language or imagery and unwelcome sexual attention or
|
|
||||||
advances
|
|
||||||
* Trolling, insulting/derogatory comments, and personal or political attacks
|
|
||||||
* Public or private harassment
|
|
||||||
* Publishing others' private information, such as a physical or electronic
|
|
||||||
address, without explicit permission
|
|
||||||
* Other conduct which could reasonably be considered inappropriate in a
|
|
||||||
professional setting
|
|
||||||
|
|
||||||
## Our Responsibilities
|
|
||||||
|
|
||||||
Project maintainers are responsible for clarifying the standards of acceptable
|
|
||||||
behavior and are expected to take appropriate and fair corrective action in
|
|
||||||
response to any instances of unacceptable behavior.
|
|
||||||
|
|
||||||
Project maintainers have the right and responsibility to remove, edit, or
|
|
||||||
reject comments, commits, code, wiki edits, issues, and other contributions
|
|
||||||
that are not aligned to this Code of Conduct, or to ban temporarily or
|
|
||||||
permanently any contributor for other behaviors that they deem inappropriate,
|
|
||||||
threatening, offensive, or harmful.
|
|
||||||
|
|
||||||
## Scope
|
|
||||||
|
|
||||||
This Code of Conduct applies both within project spaces and in public spaces
|
|
||||||
when an individual is representing the project or its community. Examples of
|
|
||||||
representing a project or community include using an official project e-mail
|
|
||||||
address, posting via an official social media account, or acting as an appointed
|
|
||||||
representative at an online or offline event. Representation of a project may be
|
|
||||||
further defined and clarified by project maintainers.
|
|
||||||
|
|
||||||
## Enforcement
|
|
||||||
|
|
||||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
|
||||||
reported by contacting the project team at report@palletsprojects.com. All
|
|
||||||
complaints will be reviewed and investigated and will result in a response that
|
|
||||||
is deemed necessary and appropriate to the circumstances. The project team is
|
|
||||||
obligated to maintain confidentiality with regard to the reporter of an incident.
|
|
||||||
Further details of specific enforcement policies may be posted separately.
|
|
||||||
|
|
||||||
Project maintainers who do not follow or enforce the Code of Conduct in good
|
|
||||||
faith may face temporary or permanent repercussions as determined by other
|
|
||||||
members of the project's leadership.
|
|
||||||
|
|
||||||
## Attribution
|
|
||||||
|
|
||||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
|
||||||
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
|
|
||||||
|
|
||||||
[homepage]: https://www.contributor-covenant.org
|
|
||||||
|
|
||||||
For answers to common questions about this code of conduct, see
|
|
||||||
https://www.contributor-covenant.org/faq
|
|
||||||
10
MANIFEST.in
10
MANIFEST.in
@ -1,10 +0,0 @@
|
|||||||
include CHANGES.rst
|
|
||||||
include tox.ini
|
|
||||||
include requirements/*.txt
|
|
||||||
graft artwork
|
|
||||||
graft docs
|
|
||||||
prune docs/_build
|
|
||||||
graft examples
|
|
||||||
graft tests
|
|
||||||
include src/jinja2/py.typed
|
|
||||||
global-exclude *.pyc
|
|
||||||
@ -1,5 +1,4 @@
|
|||||||
Jinja
|
# Jinja
|
||||||
=====
|
|
||||||
|
|
||||||
Jinja is a fast, expressive, extensible templating engine. Special
|
Jinja is a fast, expressive, extensible templating engine. Special
|
||||||
placeholders in the template allow writing code similar to Python
|
placeholders in the template allow writing code similar to Python
|
||||||
@ -26,20 +25,7 @@ possible, it shouldn't make the template designer's job difficult by
|
|||||||
restricting functionality too much.
|
restricting functionality too much.
|
||||||
|
|
||||||
|
|
||||||
Installing
|
## In A Nutshell
|
||||||
----------
|
|
||||||
|
|
||||||
Install and update using `pip`_:
|
|
||||||
|
|
||||||
.. code-block:: text
|
|
||||||
|
|
||||||
$ pip install -U Jinja2
|
|
||||||
|
|
||||||
.. _pip: https://pip.pypa.io/en/stable/getting-started/
|
|
||||||
|
|
||||||
|
|
||||||
In A Nutshell
|
|
||||||
-------------
|
|
||||||
|
|
||||||
.. code-block:: jinja
|
.. code-block:: jinja
|
||||||
|
|
||||||
@ -54,23 +40,11 @@ In A Nutshell
|
|||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
|
||||||
Donate
|
## Donate
|
||||||
------
|
|
||||||
|
|
||||||
The Pallets organization develops and supports Jinja and other popular
|
The Pallets organization develops and supports Jinja and other popular
|
||||||
packages. In order to grow the community of contributors and users, and
|
packages. In order to grow the community of contributors and users, and
|
||||||
allow the maintainers to devote more time to the projects, `please
|
allow the maintainers to devote more time to the projects, [please
|
||||||
donate today`_.
|
donate today][].
|
||||||
|
|
||||||
.. _please donate today: https://palletsprojects.com/donate
|
[please donate today]: https://palletsprojects.com/donate
|
||||||
|
|
||||||
|
|
||||||
Links
|
|
||||||
-----
|
|
||||||
|
|
||||||
- Documentation: https://jinja.palletsprojects.com/
|
|
||||||
- Changes: https://jinja.palletsprojects.com/changes/
|
|
||||||
- PyPI Releases: https://pypi.org/project/Jinja2/
|
|
||||||
- Source Code: https://github.com/pallets/jinja/
|
|
||||||
- Issue Tracker: https://github.com/pallets/jinja/issues/
|
|
||||||
- Chat: https://discord.gg/pallets
|
|
||||||
21
docs/conf.py
21
docs/conf.py
@ -10,17 +10,24 @@ release, version = get_version("Jinja2")
|
|||||||
|
|
||||||
# General --------------------------------------------------------------
|
# General --------------------------------------------------------------
|
||||||
|
|
||||||
master_doc = "index"
|
default_role = "code"
|
||||||
extensions = [
|
extensions = [
|
||||||
"sphinx.ext.autodoc",
|
"sphinx.ext.autodoc",
|
||||||
|
"sphinx.ext.extlinks",
|
||||||
"sphinx.ext.intersphinx",
|
"sphinx.ext.intersphinx",
|
||||||
"pallets_sphinx_themes",
|
|
||||||
"sphinxcontrib.log_cabinet",
|
"sphinxcontrib.log_cabinet",
|
||||||
"sphinx_issues",
|
"pallets_sphinx_themes",
|
||||||
]
|
]
|
||||||
|
autodoc_member_order = "bysource"
|
||||||
autodoc_typehints = "description"
|
autodoc_typehints = "description"
|
||||||
intersphinx_mapping = {"python": ("https://docs.python.org/3/", None)}
|
autodoc_preserve_defaults = True
|
||||||
issues_github_path = "pallets/jinja"
|
extlinks = {
|
||||||
|
"issue": ("https://github.com/pallets/jinja/issues/%s", "#%s"),
|
||||||
|
"pr": ("https://github.com/pallets/jinja/pull/%s", "#%s"),
|
||||||
|
}
|
||||||
|
intersphinx_mapping = {
|
||||||
|
"python": ("https://docs.python.org/3/", None),
|
||||||
|
}
|
||||||
|
|
||||||
# HTML -----------------------------------------------------------------
|
# HTML -----------------------------------------------------------------
|
||||||
|
|
||||||
@ -45,7 +52,3 @@ html_favicon = "_static/jinja-logo-sidebar.png"
|
|||||||
html_logo = "_static/jinja-logo-sidebar.png"
|
html_logo = "_static/jinja-logo-sidebar.png"
|
||||||
html_title = f"Jinja Documentation ({version})"
|
html_title = f"Jinja Documentation ({version})"
|
||||||
html_show_sourcelink = False
|
html_show_sourcelink = False
|
||||||
|
|
||||||
# LaTeX ----------------------------------------------------------------
|
|
||||||
|
|
||||||
latex_documents = [(master_doc, f"Jinja-{version}.tex", html_title, author, "manual")]
|
|
||||||
|
|||||||
@ -5,7 +5,6 @@ from jinja2.ext import Extension
|
|||||||
from jinja2.lexer import count_newlines
|
from jinja2.lexer import count_newlines
|
||||||
from jinja2.lexer import Token
|
from jinja2.lexer import Token
|
||||||
|
|
||||||
|
|
||||||
_outside_re = re.compile(r"\\?(gettext|_)\(")
|
_outside_re = re.compile(r"\\?(gettext|_)\(")
|
||||||
_inside_re = re.compile(r"\\?[()]")
|
_inside_re = re.compile(r"\\?[()]")
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
BSD-3-Clause License
|
BSD-3-Clause License
|
||||||
====================
|
====================
|
||||||
|
|
||||||
.. include:: ../LICENSE.rst
|
.. literalinclude:: ../LICENSE.txt
|
||||||
|
:language: text
|
||||||
|
|||||||
98
pyproject.toml
Normal file
98
pyproject.toml
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
[project]
|
||||||
|
name = "Jinja2"
|
||||||
|
description = "A very fast and expressive template engine."
|
||||||
|
readme = "README.md"
|
||||||
|
license = {file = "LICENSE.txt"}
|
||||||
|
maintainers = [{name = "Pallets", email = "contact@palletsprojects.com"}]
|
||||||
|
classifiers = [
|
||||||
|
"Development Status :: 5 - Production/Stable",
|
||||||
|
"Environment :: Web Environment",
|
||||||
|
"Intended Audience :: Developers",
|
||||||
|
"License :: OSI Approved :: BSD License",
|
||||||
|
"Operating System :: OS Independent",
|
||||||
|
"Programming Language :: Python",
|
||||||
|
"Topic :: Internet :: WWW/HTTP :: Dynamic Content",
|
||||||
|
"Topic :: Text Processing :: Markup :: HTML",
|
||||||
|
"Typing :: Typed",
|
||||||
|
]
|
||||||
|
requires-python = ">=3.7"
|
||||||
|
dependencies = ["MarkupSafe>=2.0"]
|
||||||
|
dynamic = ["version"]
|
||||||
|
|
||||||
|
[project.urls]
|
||||||
|
Donate = "https://palletsprojects.com/donate"
|
||||||
|
Documentation = "https://jinja.palletsprojects.com/"
|
||||||
|
Changes = "https://jinja.palletsprojects.com/changes/"
|
||||||
|
Source = "https://github.com/pallets/jinja/"
|
||||||
|
Chat = "https://discord.gg/pallets"
|
||||||
|
|
||||||
|
[project.optional-dependencies]
|
||||||
|
i18n = ["Babel>=2.7"]
|
||||||
|
|
||||||
|
[project.entry-points."babel.extractors"]
|
||||||
|
jinja2 = "jinja2.ext:babel_extract[i18n]"
|
||||||
|
|
||||||
|
[build-system]
|
||||||
|
requires = ["flit_core<4"]
|
||||||
|
build-backend = "flit_core.buildapi"
|
||||||
|
|
||||||
|
[tool.flit.module]
|
||||||
|
name = "jinja2"
|
||||||
|
|
||||||
|
[tool.flit.sdist]
|
||||||
|
include = [
|
||||||
|
"docs/",
|
||||||
|
"requirements/",
|
||||||
|
"tests/",
|
||||||
|
"CHANGES.md",
|
||||||
|
"tox.ini",
|
||||||
|
]
|
||||||
|
exclude = [
|
||||||
|
"docs/_build/",
|
||||||
|
]
|
||||||
|
|
||||||
|
[tool.pytest.ini_options]
|
||||||
|
testpaths = ["tests"]
|
||||||
|
filterwarnings = [
|
||||||
|
"error",
|
||||||
|
]
|
||||||
|
|
||||||
|
[tool.coverage.run]
|
||||||
|
branch = true
|
||||||
|
source = ["jinja2", "tests"]
|
||||||
|
|
||||||
|
[tool.coverage.paths]
|
||||||
|
source = ["src", "*/site-packages"]
|
||||||
|
|
||||||
|
[tool.mypy]
|
||||||
|
python_version = "3.8"
|
||||||
|
files = ["src/jinja2"]
|
||||||
|
show_error_codes = true
|
||||||
|
pretty = true
|
||||||
|
strict = true
|
||||||
|
|
||||||
|
[tool.pyright]
|
||||||
|
pythonVersion = "3.8"
|
||||||
|
include = ["src/jinja2"]
|
||||||
|
typeCheckingMode = "basic"
|
||||||
|
|
||||||
|
[tool.ruff]
|
||||||
|
src = ["src"]
|
||||||
|
fix = true
|
||||||
|
show-fixes = true
|
||||||
|
output-format = "full"
|
||||||
|
|
||||||
|
[tool.ruff.lint]
|
||||||
|
select = [
|
||||||
|
"B", # flake8-bugbear
|
||||||
|
"E", # pycodestyle error
|
||||||
|
"F", # pyflakes
|
||||||
|
"I", # isort
|
||||||
|
"UP", # pyupgrade
|
||||||
|
"W", # pycodestyle warning
|
||||||
|
]
|
||||||
|
ignore-init-module-imports = true
|
||||||
|
|
||||||
|
[tool.ruff.lint.isort]
|
||||||
|
force-single-line = true
|
||||||
|
order-by-type = false
|
||||||
81
setup.cfg
81
setup.cfg
@ -1,81 +0,0 @@
|
|||||||
[metadata]
|
|
||||||
name = Jinja2
|
|
||||||
version = attr: jinja2.__version__
|
|
||||||
url = https://palletsprojects.com/p/jinja/
|
|
||||||
project_urls =
|
|
||||||
Donate = https://palletsprojects.com/donate
|
|
||||||
Documentation = https://jinja.palletsprojects.com/
|
|
||||||
Changes = https://jinja.palletsprojects.com/changes/
|
|
||||||
Source Code = https://github.com/pallets/jinja/
|
|
||||||
Issue Tracker = https://github.com/pallets/jinja/issues/
|
|
||||||
Chat = https://discord.gg/pallets
|
|
||||||
license = BSD-3-Clause
|
|
||||||
license_files = LICENSE.rst
|
|
||||||
maintainer = Pallets
|
|
||||||
maintainer_email = contact@palletsprojects.com
|
|
||||||
description = A very fast and expressive template engine.
|
|
||||||
long_description = file: README.rst
|
|
||||||
long_description_content_type = text/x-rst
|
|
||||||
classifiers =
|
|
||||||
Development Status :: 5 - Production/Stable
|
|
||||||
Environment :: Web Environment
|
|
||||||
Intended Audience :: Developers
|
|
||||||
License :: OSI Approved :: BSD License
|
|
||||||
Operating System :: OS Independent
|
|
||||||
Programming Language :: Python
|
|
||||||
Topic :: Internet :: WWW/HTTP :: Dynamic Content
|
|
||||||
Topic :: Text Processing :: Markup :: HTML
|
|
||||||
|
|
||||||
[options]
|
|
||||||
packages = find:
|
|
||||||
package_dir = = src
|
|
||||||
include_package_data = True
|
|
||||||
python_requires = >= 3.7
|
|
||||||
# Dependencies are in setup.py for GitHub's dependency graph.
|
|
||||||
|
|
||||||
[options.packages.find]
|
|
||||||
where = src
|
|
||||||
|
|
||||||
[options.entry_points]
|
|
||||||
babel.extractors =
|
|
||||||
jinja2 = jinja2.ext:babel_extract[i18n]
|
|
||||||
|
|
||||||
[tool:pytest]
|
|
||||||
testpaths = tests
|
|
||||||
filterwarnings =
|
|
||||||
error
|
|
||||||
|
|
||||||
[coverage:run]
|
|
||||||
branch = True
|
|
||||||
source =
|
|
||||||
jinja2
|
|
||||||
tests
|
|
||||||
|
|
||||||
[coverage:paths]
|
|
||||||
source =
|
|
||||||
src
|
|
||||||
*/site-packages
|
|
||||||
|
|
||||||
[mypy]
|
|
||||||
files = src/jinja2
|
|
||||||
python_version = 3.7
|
|
||||||
show_error_codes = True
|
|
||||||
disallow_subclassing_any = True
|
|
||||||
disallow_untyped_calls = True
|
|
||||||
disallow_untyped_defs = True
|
|
||||||
disallow_incomplete_defs = True
|
|
||||||
no_implicit_optional = True
|
|
||||||
local_partial_types = True
|
|
||||||
no_implicit_reexport = True
|
|
||||||
strict_equality = True
|
|
||||||
warn_redundant_casts = True
|
|
||||||
warn_unused_configs = True
|
|
||||||
warn_unused_ignores = True
|
|
||||||
warn_return_any = True
|
|
||||||
warn_unreachable = True
|
|
||||||
|
|
||||||
[mypy-jinja2.defaults]
|
|
||||||
no_implicit_reexport = False
|
|
||||||
|
|
||||||
[mypy-markupsafe]
|
|
||||||
no_implicit_reexport = False
|
|
||||||
8
setup.py
8
setup.py
@ -1,8 +0,0 @@
|
|||||||
from setuptools import setup
|
|
||||||
|
|
||||||
# Metadata goes in setup.cfg. These are here for GitHub's dependency graph.
|
|
||||||
setup(
|
|
||||||
name="Jinja2",
|
|
||||||
install_requires=["MarkupSafe>=2.0"],
|
|
||||||
extras_require={"i18n": ["Babel>=2.7"]},
|
|
||||||
)
|
|
||||||
18
tox.ini
18
tox.ini
@ -10,6 +10,8 @@ skip_missing_interpreters = true
|
|||||||
[testenv]
|
[testenv]
|
||||||
package = wheel
|
package = wheel
|
||||||
wheel_build_env = .pkg
|
wheel_build_env = .pkg
|
||||||
|
constrain_package_deps = true
|
||||||
|
use_frozen_constraints = true
|
||||||
deps = -r requirements/tests.txt
|
deps = -r requirements/tests.txt
|
||||||
commands = pytest -v --tb=short --basetemp={envtmpdir} {posargs}
|
commands = pytest -v --tb=short --basetemp={envtmpdir} {posargs}
|
||||||
|
|
||||||
@ -24,4 +26,18 @@ commands = mypy
|
|||||||
|
|
||||||
[testenv:docs]
|
[testenv:docs]
|
||||||
deps = -r requirements/docs.txt
|
deps = -r requirements/docs.txt
|
||||||
commands = sphinx-build -W -b html -d {envtmpdir}/doctrees docs {envtmpdir}/html
|
commands = sphinx-build -E -W -b dirhtml docs docs/_build/dirhtml
|
||||||
|
|
||||||
|
[testenv:update-requirements]
|
||||||
|
deps =
|
||||||
|
pip-tools
|
||||||
|
pre-commit
|
||||||
|
skip_install = true
|
||||||
|
change_dir = requirements
|
||||||
|
commands =
|
||||||
|
pre-commit autoupdate -j4
|
||||||
|
pip-compile -U build.in
|
||||||
|
pip-compile -U docs.in
|
||||||
|
pip-compile -U tests.in
|
||||||
|
pip-compile -U typing.in
|
||||||
|
pip-compile -U dev.in
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user