pax_global_header 0000666 0000000 0000000 00000000064 15260643574 0014526 g ustar 00root root 0000000 0000000 52 comment=fa03b48b8cdfe336065f5ad8eb51fbcc40c6b1d2
typeddjango-django-stubs-fa03b48/ 0000775 0000000 0000000 00000000000 15260643574 0017045 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/.editorconfig 0000664 0000000 0000000 00000000442 15260643574 0021522 0 ustar 00root root 0000000 0000000 # Check http://editorconfig.org for more information
# This is the main config file for this project:
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
trim_trailing_whitespace = true
[*.{py, pyi}]
indent_size = 4
[*.toml]
indent_size = 2
typeddjango-django-stubs-fa03b48/.gitattributes 0000664 0000000 0000000 00000000132 15260643574 0021734 0 ustar 00root root 0000000 0000000 scripts/allowlist_*.txt linguist-language=ini
pyrightconfig*.json linguist-language=jsonc
typeddjango-django-stubs-fa03b48/.github/ 0000775 0000000 0000000 00000000000 15260643574 0020405 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/.github/AI_POLICY.md 0000664 0000000 0000000 00000003441 15260643574 0022301 0 ustar 00root root 0000000 0000000
We support using AI (i.e., LLMs) as tools for coding. However, you remain
responsible for any code you publish and we are responsible for any code we
merge and release. We hold a high bar for all contributions to our projects.
**AI should not be used to generate comments when communicating with
maintainers**. We expect comments on our projects to be written by humans. We
may hide any comments that we believe are AI generated.
If you are opening an issue, we expect you to describe the problem in your own
words.
If you are opening a pull request, we expect you to be able to explain the
proposed changes in your own words. This includes the pull request body and
responses to questions. **Do not copy responses from the AI when replying to
questions from maintainers.**
Due to the foundational nature of our projects, we require a human in the loop
who understands the work produced by AI. **We do not allow autonomous agents to
be used for contributing to our projects**. We will close any pull requests that
we believe were created autonomously.
If you wish to include context from an interaction with AI in your comments, it
must be in a quote block (e.g., using `>`) and disclosed as such. It must be
accompanied by human commentary explaining the relevance and implications of the
context. Do not share long snippets.
We understand that AI is useful when communicating as a non-native English
speaker. If you are using AI to edit your comments for this purpose, please take
the time to ensure it reflects your own voice and ideas. If using AI for
translation, we recommend writing in your native language and including the AI
translation in a quote block.
typeddjango-django-stubs-fa03b48/.github/ISSUE_TEMPLATE/ 0000775 0000000 0000000 00000000000 15260643574 0022570 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/.github/ISSUE_TEMPLATE/bug.md 0000664 0000000 0000000 00000001124 15260643574 0023665 0 ustar 00root root 0000000 0000000 ---
name: Bug
about: Create a report of something is not working
labels: 'bug'
---
# Bug report
## What's wrong
## How is that should be
## System information
- OS:
- `python` version:
- `django` version:
- `mypy` version:
- `django-stubs` version:
- `django-stubs-ext` version:
typeddjango-django-stubs-fa03b48/.github/pull_request_template.md 0000664 0000000 0000000 00000001146 15260643574 0025350 0 ustar 00root root 0000000 0000000 # I have made things!
## Related issues
## AI Policy
- [ ] I have read and agree to the [AI Policy](https://github.com/typeddjango/django-stubs/blob/master/.github/AI_POLICY.md), removed any "Co-Authored-By" lines attributing coding agents, and manually reviewed the final result
typeddjango-django-stubs-fa03b48/.github/renovate.json5 0000664 0000000 0000000 00000003103 15260643574 0023205 0 ustar 00root root 0000000 0000000 {
$schema: "https://docs.renovatebot.com/renovate-schema.json",
extends: ["config:best-practices"],
// Python versions in CI are managed manually (test-older-django pins 3.12)
ignoreDeps: ["python"],
suppressNotifications: ["prEditedNotification"],
mode: "full",
// Wait 3 days before proposing updates to limit supply chain attack exposure
minimumReleaseAge: "3 days",
lockFileMaintenance: {
enabled: true,
automerge: true,
automergeType: "branch",
schedule: ["* * * * 1"],
automergeSchedule: ["* * * * 2"],
},
packageRules: [
{
matchPackageNames: ["mypy"],
rangeStrategy: "widen",
},
{
// Group upload/download artifact updates, the versions are dependent
groupName: "Artifact GitHub Actions dependencies",
matchManagers: ["github-actions"],
matchPackageNames: ["actions/upload-artifact", "actions/download-artifact"],
},
{
// Don't update GitHub runners (e.g. 'runs-on: ubuntu-latest')
groupName: "GitHub runners",
matchManagers: ["github-actions"],
matchDatasources: ["github-runners"],
enabled: false,
},
{
// Django 6.0 dropped Python <3.12 support, keep the compat pin on 5.x.
// Match the pyproject value, not the version: uv.lock has two django entries
// and renovate's lockfile lookup keeps only the last one (6.x), see
// https://github.com/renovatebot/renovate/blob/main/lib/modules/manager/pep621/schema.ts
matchPackageNames: ["django"],
matchCurrentValue: "/^==5\\./",
allowedVersions: "<6.0.0",
},
],
}
typeddjango-django-stubs-fa03b48/.github/workflows/ 0000775 0000000 0000000 00000000000 15260643574 0022442 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/.github/workflows/mypy_primer.yml 0000664 0000000 0000000 00000006311 15260643574 0025542 0 ustar 00root root 0000000 0000000 name: Run mypy_primer
on:
# Only run on PR, since we diff against main
pull_request:
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
permissions:
contents: read
jobs:
mypy_primer:
name: Run
runs-on: ubuntu-latest
strategy:
matrix:
shard-index: [0] # e.g. change this to [0, 1, 2] and --num-shards below to 3
fail-fast: false
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
path: django-stubs_to_test
fetch-depth: 0
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
with:
python-version: "3.14"
- name: Install uv
uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
- name: Install dependencies
run: |
uv venv
uv pip install git+https://github.com/hauntsaninja/mypy_primer.git
- name: Run mypy_primer
shell: bash
run: |
cd django-stubs_to_test
MYPY_VERSION=$(uv tree --package=mypy --depth=0 -q | sed -n 's/^mypy v\(.\+\)$/\1/p')
echo "new commit"
git checkout $GITHUB_SHA
git rev-list --format=%s --max-count=1 HEAD
MERGE_BASE=$(git merge-base $GITHUB_SHA origin/$GITHUB_BASE_REF)
git worktree add ../django-stubs_base $MERGE_BASE
cd ../django-stubs_base
echo "base commit"
git rev-list --format=%s --max-count=1 HEAD
echo ''
cd ..
# fail action if exit code isn't zero or one
(
uv run mypy_primer \
--new v${MYPY_VERSION} --old v${MYPY_VERSION} \
--known-dependency-selector django-stubs \
--old-prepend-path django-stubs_base --new-prepend-path django-stubs_to_test \
--num-shards 1 --shard-index ${{ matrix.shard-index }} \
--debug \
--output concise \
| tee diff_${{ matrix.shard-index }}.txt
) || [ $? -eq 1 ]
- if: ${{ matrix.shard-index == 0 }}
name: Save PR number
run: |
echo ${{ github.event.pull_request.number }} | tee pr_number.txt
- name: Upload mypy_primer diff + PR number
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
if: ${{ matrix.shard-index == 0 }}
with:
name: mypy_primer_diffs-${{ matrix.shard-index }}
path: |
diff_${{ matrix.shard-index }}.txt
pr_number.txt
- name: Upload mypy_primer diff
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
if: ${{ matrix.shard-index != 0 }}
with:
name: mypy_primer_diffs-${{ matrix.shard-index }}
path: diff_${{ matrix.shard-index }}.txt
join_artifacts:
name: Join artifacts
runs-on: ubuntu-latest
needs: [mypy_primer]
permissions:
contents: read
steps:
- name: Merge artifacts
uses: actions/upload-artifact/merge@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: mypy_primer_diffs
pattern: mypy_primer_diffs-*
delete-merged: true
typeddjango-django-stubs-fa03b48/.github/workflows/mypy_primer_comment.yml 0000664 0000000 0000000 00000007474 15260643574 0027277 0 ustar 00root root 0000000 0000000 name: Comment with mypy_primer diff
on:
workflow_run:
workflows:
- Run mypy_primer
types:
- completed
permissions:
contents: read
pull-requests: write
jobs:
comment:
name: Comment PR from mypy_primer
runs-on: ubuntu-latest
if: ${{ github.event.workflow_run.conclusion == 'success' }}
steps:
- name: Download diffs
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
with:
script: |
const fs = require('fs');
const artifacts = await github.rest.actions.listWorkflowRunArtifacts({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: ${{ github.event.workflow_run.id }},
});
const [matchArtifact] = artifacts.data.artifacts.filter((artifact) =>
artifact.name == "mypy_primer_diffs");
const download = await github.rest.actions.downloadArtifact({
owner: context.repo.owner,
repo: context.repo.repo,
artifact_id: matchArtifact.id,
archive_format: "zip",
});
fs.writeFileSync("diff.zip", Buffer.from(download.data));
- run: unzip diff.zip
- name: Get PR number
id: get-pr-number
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
with:
script: |
const fs = require('fs');
return parseInt(fs.readFileSync("pr_number.txt", { encoding: "utf8" }))
- name: Hide old comments
uses: int128/hide-comment-action@d87d3445b5b7c0181476117977004197b1d19ddc # v1.75.0
with:
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: ${{ steps.get-pr-number.outputs.result }}
- run: cat diff_*.txt | tee fulldiff.txt
- name: Post comment
id: post-comment
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const MAX_CHARACTERS = 50000
const MAX_CHARACTERS_PER_PROJECT = MAX_CHARACTERS / 3
const fs = require('fs')
let data = fs.readFileSync('fulldiff.txt', { encoding: 'utf8' })
function truncateIfNeeded(original, maxLength) {
if (original.length <= maxLength) {
return original
}
let truncated = original.substring(0, maxLength)
// further, remove last line that might be truncated
truncated = truncated.substring(0, truncated.lastIndexOf('\n'))
let lines_truncated = original.split('\n').length - truncated.split('\n').length
return `${truncated}\n\n... (truncated ${lines_truncated} lines) ...`
}
const projects = data.split('\n\n')
// don't let one project dominate
data = projects.map(project => truncateIfNeeded(project, MAX_CHARACTERS_PER_PROJECT)).join('\n\n')
// posting comment fails if too long, so truncate
data = truncateIfNeeded(data, MAX_CHARACTERS)
console.log("Diff from mypy_primer:")
console.log(data)
let body
if (data.trim()) {
body = 'Diff from [mypy_primer](https://github.com/hauntsaninja/mypy_primer), '
body += 'showing the effect of this PR on type check results on a corpus of open source code:\n```diff\n'
body += data + '```'
const prNumber = parseInt(fs.readFileSync("pr_number.txt", { encoding: "utf8" }))
await github.rest.issues.createComment({
issue_number: prNumber,
owner: context.repo.owner,
repo: context.repo.repo,
body
})
}
typeddjango-django-stubs-fa03b48/.github/workflows/release.yml 0000664 0000000 0000000 00000002740 15260643574 0024610 0 ustar 00root root 0000000 0000000 name: Release
on:
release:
types: [published]
concurrency:
group: release-${{ github.event.release.tag_name }}
jobs:
build-and-publish-ext:
runs-on: ubuntu-latest
environment:
name: release-ext
url: https://pypi.org/p/django-stubs-ext
permissions:
id-token: write
steps:
- name: Install uv & Python
uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
with:
python-version: "3.13"
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
fetch-depth: 0
- name: Build ext package
run: uv build --package=django-stubs-ext
- name: Publish ext to PyPI
uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
build-and-publish:
runs-on: ubuntu-latest
needs: [build-and-publish-ext]
environment:
name: release
url: https://pypi.org/p/django-stubs
permissions:
id-token: write
steps:
- name: Install uv & Python
uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
with:
python-version: "3.13"
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
fetch-depth: 0
- name: Build package
run: uv build --package=django-stubs
- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
typeddjango-django-stubs-fa03b48/.github/workflows/test.yml 0000664 0000000 0000000 00000022542 15260643574 0024151 0 ustar 00root root 0000000 0000000 name: test
on:
push:
branches:
- master
# Renovate "automerge" branches -- there is no PR, so branch tests are used instead
- "renovate/lock-file-maintenance"
pull_request:
workflow_dispatch:
env:
UV_FROZEN: true # https://docs.astral.sh/uv/configuration/environment/#uv_frozen
UV_NO_SYNC: true # prevent `uv run` cmd from bringing very dev dependencies
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
mypy-self-check:
timeout-minutes: 10
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ['3.11', '3.12', '3.13', '3.14']
fail-fast: false
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
- name: Install uv
uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: uv sync --no-dev --group tests
- name: Run mypy on plugin code
run: uv run mypy mypy_django_plugin
- name: Run mypy on ext code
run: uv run mypy ext
- name: Run mypy on scripts and utils
run: uv run mypy scripts
- name: Run mypy on stubs
run: uv run mypy --cache-dir=/dev/null --no-incremental django-stubs
- name: Run mypy on the test cases
run: uv run mypy tests
test:
timeout-minutes: 15
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ['3.11', '3.12', '3.13', '3.14']
shard: [0, 1]
fail-fast: false
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
- name: Cache apt packages
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
with:
path: /var/cache/apt/archives
key: apt-gdal-${{ runner.os }}
- name: Setup system dependencies
run: |
sudo apt-get update || true
sudo apt-get install -y --no-install-recommends libgdal-dev libproj-dev
- name: Install uv
uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: uv sync --no-dev --group tests
# Must match `shard` definition in the test matrix:
- name: Run pytest tests
run: uv run pytest --num-shards=2 --shard-id=${{ matrix.shard }} -n auto tests
test-older-django:
timeout-minutes: 15
runs-on: ubuntu-latest
strategy:
matrix:
shard: [0, 1]
fail-fast: false
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
- name: Cache apt packages
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
with:
path: /var/cache/apt/archives
key: apt-gdal-${{ runner.os }}
- name: Setup system dependencies
run: |
sudo apt-get update || true
sudo apt-get install -y --no-install-recommends libgdal-dev libproj-dev
- name: Install uv
uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
- name: Set up Python
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
with:
python-version: '3.12'
- name: Install dependencies
run: uv sync --no-dev --group tests
- name: Downgrade Django
run: uv pip install django==5.2.0
# Exit 1 only if ont of the pytest error is a mypy crash
- name: Run pytest tests
run: "! uv run pytest --num-shards=2 --shard-id=${{ matrix.shard }} -n auto tests | grep 'pytest_mypy_plugins.utils.TypecheckAssertionError: Critical error occurred'"
stubtest:
timeout-minutes: 10
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ['3.12', '3.13', '3.14']
fail-fast: false
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
- name: Cache apt packages
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
with:
path: /var/cache/apt/archives
key: apt-gdal-${{ runner.os }}
- name: Setup system dependencies
run: |
sudo apt-get update || true
sudo apt-get install -y --no-install-recommends libgdal-dev libproj-dev
- name: Install uv
uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: uv sync --no-dev --group tests
- name: Run stubtest
run: uv run ./scripts/stubtest.sh
run-pyright:
timeout-minutes: 10
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ['3.12'] # TODO: enable on other versions
fail-fast: false
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
- name: Install uv
uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: uv sync --no-dev --group pyright
# See https://github.com/jakebailey/pyright-action#providing-a-pyright-version-sourced-from-preexisting-dependencies
- name: Add venv to path
run: echo "$PWD/.venv/bin" >> $GITHUB_PATH
- name: Run pyright on the test cases
uses: jakebailey/pyright-action@8ec14b5cfe41f26e5f41686a31eb6012758217ef # v3
with:
version: PATH
run-pyrefly:
timeout-minutes: 10
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ['3.12']
fail-fast: false
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
- name: Install uv
uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: uv sync --no-dev --group pyrefly
- name: Add venv to path
run: echo "$PWD/.venv/bin" >> $GITHUB_PATH
- name: Run pyrefly on the test cases
run: pyrefly check tests/assert_type
run-ty:
timeout-minutes: 10
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ['3.12']
fail-fast: false
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
- name: Install uv
uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: uv sync --no-dev --group ty
- name: Add venv to path
run: echo "$PWD/.venv/bin" >> $GITHUB_PATH
- name: Run ty on the test cases
run: ty check tests/assert_type
matrix-test:
timeout-minutes: 10
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python-version: ['3.11', '3.12', '3.13', '3.14']
django-version: ['5.2']
include:
- python-version: '3.12'
django-version: '6.0'
- python-version: '3.13'
django-version: '6.0'
- python-version: '3.12'
django-version: '6.1'
- python-version: '3.13'
django-version: '6.1'
- python-version: '3.14'
django-version: '6.1'
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
- name: Install uv
uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: uv sync --no-dev --group tests
- name: Run django-stubs-ext tests
run: uv run --with "django==${{ matrix.django-version }}" pytest ext
build-and-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
fetch-tags: true
- name: Install uv & Python
uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
with:
python-version: "3.13"
- name: Ensure uv.lock is up to date
run: env --unset=UV_FROZEN uv lock --check
- name: Build
run: uv build --all-packages
typeddjango-django-stubs-fa03b48/.gitignore 0000664 0000000 0000000 00000000260 15260643574 0021033 0 ustar 00root root 0000000 0000000 *.egg-info
.DS_Store
.idea/
.vscode/
.mypy_cache/
.pytest_cache/
.ruff_cache/
.venv/
venv/
__pycache__/
django-source/
out/
pip-wheel-metadata/
stubgen/
build/
dist/
ext/dist/
typeddjango-django-stubs-fa03b48/.pre-commit-config.yaml 0000664 0000000 0000000 00000002563 15260643574 0023334 0 ustar 00root root 0000000 0000000 # See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
default_language_version:
python: "3.13"
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: 3e8a8703264a2f4a69428a0aa4dcb512790b2c8c # frozen: v6.0.0
hooks:
- id: trailing-whitespace
- id: check-executables-have-shebangs
- id: debug-statements
- id: end-of-file-fixer
- id: check-yaml
- id: check-toml
- id: check-merge-conflict
- id: mixed-line-ending
args: [--fix=lf]
- id: check-case-conflict
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: a56c0b927e6465d37cae3e97d35d4d18ab2b96cd # frozen: v0.16.9
hooks:
- id: ruff-check
args: ["--fix", "--exit-non-zero-on-fix"]
- id: ruff-format
- repo: https://github.com/codespell-project/codespell
rev: 57b21406f092110c18776e39b0bda50d37c945c8 # frozen: v2.4.3
hooks:
- id: codespell
args: ["-w"]
- repo: https://github.com/astral-sh/uv-pre-commit
rev: 2aeb804518b4373dbf5adb8dddc5466d9a6e6b21 # frozen: 0.12.19
hooks:
- id: uv-lock
ci:
autofix_commit_msg: "[pre-commit.ci] auto fixes from pre-commit.com hooks"
autofix_prs: true
autoupdate_commit_msg: "[pre-commit.ci] pre-commit autoupdate"
autoupdate_schedule: weekly
submodules: false
skip:
- uv-lock
typeddjango-django-stubs-fa03b48/CONTRIBUTING.md 0000664 0000000 0000000 00000023014 15260643574 0021276 0 ustar 00root root 0000000 0000000 # Contribution Guide
This project is open source and community driven. As such we encourage code contributions of all kinds. Some areas you can contribute in:
1. Improve the stubs
2. Sync stubs with the latest version of Django
3. Improve plugin code and extend its capabilities
4. Write tests
5. Update dependencies
6. Fix and remove things from our `scripts/stubtest/allowlist_todo.txt`
## Tutorials
If you want to start working on this project, you will need to get familiar with python typings.
The Mypy documentation offers an excellent resource for this, as well as the python official documentation:
- [Mypy typing documentation](https://mypy.readthedocs.io/en/stable/#overview-type-system-reference)
- [Python official typing documentation](https://docs.python.org/3/library/typing.html)
- [Typing in Python](https://inventwithpython.com/blog/2019/11/24/type-hints-for-busy-python-programmers/) article
Additionally, the following resources might be useful:
- [How to write custom mypy plugins](https://mypy.readthedocs.io/en/stable/extending_mypy.html)
- [Typechecking Django and DRF](https://sobolevn.me/2019/08/typechecking-django-and-drf) guide
- [Testing mypy stubs, plugins, and types](https://sobolevn.me/2019/08/testing-mypy-types) guide
- [Awesome Python Typing](https://github.com/typeddjango/awesome-python-typing) list
## Dev setup
### Repository Setup
As a first step you will need to fork this repository and clone your fork locally.
In order to be able to continuously sync your fork with the origin repository's master branch, you will need to set up an upstream master.
To do so follow this [official github guide](https://docs.github.com/en/free-pro-team@latest/github/collaborating-with-issues-and-pull-requests/syncing-a-fork).
### System Dependencies
The test suite requires some system libraries that Django itself treats as optional.
This project depends on `mysqlclient`, which needs MySQL/MariaDB C client libraries to build.
Install them for your platform following the
[mysqlclient install guide](https://github.com/PyMySQL/mysqlclient#install).
For Debian/Ubuntu, the [django-docker-box packages list](https://github.com/django/django-docker-box/blob/main/packages.txt)
is also a useful reference.
**GDAL and GEOS** are needed to pass all tests (2 GIS-related tests require them).
See the Django documentation on
[installing geospatial libraries](https://docs.djangoproject.com/en/stable/ref/contrib/gis/install/geolibs/).
If you're not working on GIS-related stubs, you can skip GDAL/GEOS —
the 2 failing tests won't affect other contributions.
> **macOS Note:** Homebrew installs GDAL/GEOS to `/opt/homebrew` (Apple Silicon) or `/usr/local` (Intel),
> which are not in the default library search path. The GIS tests may fail unless you create symlinks:
>
> ```bash
> sudo mkdir -p /usr/local/lib
> sudo ln -s /opt/homebrew/opt/gdal/lib/libgdal.dylib /usr/local/lib/libgdal.dylib
> sudo ln -s /opt/homebrew/opt/geos/lib/libgeos_c.dylib /usr/local/lib/libgeos_c.dylib
> ```
### Dependency Setup
We use [uv](https://github.com/astral-sh/uv) to manage our dev dependencies.
To install it, see their [installation guide](https://docs.astral.sh/uv/getting-started/installation/)
We use [just](https://github.com/casey/just) as a command runner. Install it with:
```bash
uv tool install rust-just
```
Then bootstrap your environment (installs pre-commit hooks and syncs dependencies):
```bash
just bootstrap
```
Manual setup (without just)
```bash
uv sync
source .venv/bin/activate
pre-commit install --install-hooks
```
### Testing and Linting
Running `just` at the root of the repository lists all available recipes
Before submitting a PR, run all checks at once:
```bash
just pre-mr-check
```
Extra arguments can be passed to `test` and `stubtest`:
```bash
just test tests -k test_name
just stubtest --allowlist extra.txt
```
If you get unexpected results, clear the mypy cache with `just clean`.
### Model-based `assert_type` tests
For tests that need Django models, add a `models.py` module under `tests/assert_type/`.
Its package is discovered and automatically added to `INSTALLED_APPS` for the test suite.
To keep a test self-contained, put both the models **and** the `assert_type` assertions in
that single `models.py`. Write the assertions inside functions, they are never executed and only statically checked,
so they can safely reference the app registry:
```python
# tests/assert_type/apps/test_registry/models.py
from __future__ import annotations
from django.apps import apps
from django.db import models
from typing_extensions import assert_type
class First(models.Model):
pass
def get_model_resolves_literal_references() -> None:
# only the mypy plugin resolves the reference; the stubs return `type[Any]`, so the
# other type checkers need an inline ignore for the `assert_type` mismatch
assert_type(apps.get_model("test_registry.First"), type[First]) # pyright: ignore[reportAssertTypeFailure] # pyrefly: ignore[assert-type] # ty: ignore[type-assertion-failure]
```
```text
tests/assert_type/
└── apps/test_registry/
├── __init__.py
└── models.py
```
### Debugging plugin code
For yml tests, we use a dedicated [pytest plugin](https://github.com/typeddjango/pytest-mypy-plugins) that is by default
running mypy in a subprocess, making it difficult to debug.
To avoid that, run pytest with the `--mypy-same-process` flag.
```shell
pytest --mypy-same-process tests/typecheck/managers/querysets/test_annotate.yml
```
### Testing stubs with `stubtest`
Run `just stubtest` (or [`./scripts/stubtest.sh`](scripts/stubtest.sh) directly) to test that stubs and sources are in-line.
We have some special files to allow errors:
1. [`scripts/stubtest/allowlist.txt`](scripts/stubtest/allowlist.txt) - Permanent exclusions, e.g. internal utilities, plugin-handled items, type system limitations.
2. [`scripts/stubtest/allowlist_todo.txt`](scripts/stubtest/allowlist_todo.txt) - General backlog of stub errors to fix or move to permanent allowlist.
You might also want to disable `incremental` mode while working on `stubtest` changes.
This mode leads to several known problems (stubs do not show up or have strange errors).
## Submission Guidelines
The workflow for contributions is fairly simple:
1. Fork and set up the repository as in the previous step.
2. Create a local branch.
3. Make whatever changes you want to contribute.
4. Ensure your contribution passes linting and tests.
5. Make a pull request with an adequate description.
## Generics
As Django uses a lot of the more dynamic features of Python (i.e. metaobjects), statically typing it requires heavy use of generics.
Unfortunately, the syntax for generics is also valid Python syntax.
For instance, the statement `class SomeClass(SuperType[int])` implicitly translates to `class SomeClass(SuperType.__class_getitem__(int))`.
If `SuperType` doesn't define the `__class_getitem__` method, this causes a runtime error, even if the code passes type checking.
When adding a new generic class, or changing an existing class to use generics, the `tests/test_generic_consistency.py` test checks that the class (or one of its bases) is patched in the [`django_stubs_ext.patch` module](https://github.com/typeddjango/django-stubs/blob/master/ext/django_stubs_ext/patch.py).
If it fails, please add the new generic class to the `_need_generic` list there.
## Private attributes
We only add hints for private attributes when it has some demonstrated real-world use case.
That means from a third-party package or some well described snippet for a project.
This rule helps us avoid tying in too closely to Django’s undocumented internals.
## Releasing `django-stubs`
1. Open a pull request that updates `pyproject.toml`, `ext/pyproject.toml` and `README.md`
(anyone can open this PR, not just maintainers):
- Version number `major.minor.patch` is formed as follows:
`major.minor` version must match newest supported Django release.
`patch` is sequentially increasing for each stubs release. Reset to `0` if `major.minor` was updated.
- Update the `version =` value within `[project]` section in **both** `pyproject.toml` files. The versions must be in sync.
- Update `django-stubs-ext>=` dependency in root `pyproject.toml` to the same version number.
- Run `uv lock` to update lockfile
- Add a new row at the top of ['Version compatibility' table in README.md](README.md#version-compatibility).
- Use pull request title "Version x.y.z release" by convention.
- Add the correct classifiers to `classifiers =` if support is added for a new Python or Django version
2. Ensure the CI succeeds. A maintainer must merge this PR. If it's just a version bump, no need
to wait for a second maintainer's approval.
3. A maintainer must [сreate a new GitHub release](https://github.com/typeddjango/django-stubs/releases/new):
- Under "Choose a tag" enter the new version number. Do **not** use `v` prefix.
- Click "Generate release notes".
- Look for merged PRs with the ['release notes reminder' label](https://github.com/typeddjango/django-stubs/issues?q=is%3Aopen+is%3Aissue+label%3A%22release+notes+reminder%22)
and move them to a separate section at the top, so that they stand out. Remove the label from PRs.
- Delete all release notes lines containing `by @pre-commit-ci` or `by @dependabot`, as these
are irrelevant for our users.
4. Once you feel brave enough, click "Publish release".
5. Check that the [release workflow](https://github.com/typeddjango/django-stubs/actions/workflows/release.yml) succeeds.
typeddjango-django-stubs-fa03b48/LICENSE.md 0000664 0000000 0000000 00000002063 15260643574 0020452 0 ustar 00root root 0000000 0000000 Copyright (c) Maxim Kurnikov.
All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
typeddjango-django-stubs-fa03b48/README.md 0000664 0000000 0000000 00000051124 15260643574 0020327 0 ustar 00root root 0000000 0000000
[](https://github.com/typeddjango/django-stubs/actions/workflows/test.yml)
[](http://mypy-lang.org/)
[](https://stackoverflow.com/questions/tagged/django-stubs?tab=Active)
This package contains [type stubs](https://www.python.org/dev/peps/pep-0561/) and a custom mypy plugin to provide more precise static types and type inference for Django framework. Django uses some Python "magic" that makes having precise types for some code patterns problematic. This is why we need this project. The final goal is to be able to get precise types for most common patterns.
## Supported type checkers
- mypy: full and complete support with multiple advanced features with our custom mypy plugin
- pyright: basic support, checked in CI
- pyrefly: basic support, checked in CI
- ty: basic support, checked in CI
## Installation
```bash
pip install 'django-stubs[compatible-mypy]'
```
To make mypy aware of the plugin, you need to add
```ini
[mypy]
plugins =
mypy_django_plugin.main
[mypy.plugins.django-stubs]
django_settings_module = "myproject.settings"
```
in your `mypy.ini` or `setup.cfg` [file](https://mypy.readthedocs.io/en/latest/config_file.html).
[pyproject.toml](https://mypy.readthedocs.io/en/stable/config_file.html#using-a-pyproject-toml-file) configurations are also supported:
```toml
[tool.mypy]
plugins = ["mypy_django_plugin.main"]
[tool.django-stubs]
django_settings_module = "myproject.settings"
```
Two things happening here:
1. We need to explicitly list our plugin to be loaded by `mypy`
2. You can either specify `django_settings_module` as seen above, or let `django_stubs` use the `DJANGO_SETTINGS_MODULE` variable from your environment.
This fully working [typed boilerplate](https://github.com/wemake-services/wemake-django-template) can serve you as an example.
## Version compatibility
We rely on different `django` and `mypy` versions:
| django-stubs | Mypy version | Django version | Django partial support | Python version |
|----------------|--------------|----------------|------------------------|----------------|
| 6.1.2 | 1.13 - 2.4 | 6.1 | 6.0, 5.2 | 3.11 - 3.14 |
| 6.1.1 | 1.13 - 2.3 | 6.1 | 6.0, 5.2 | 3.11 - 3.14 |
| 6.1.0 | 1.13 - 2.3 | 6.1 | 6.0, 5.2 | 3.11 - 3.14 |
| 6.0.9 | 1.13 - 2.3 | 6.0 | 5.2, 5.1, 5.0 | 3.10 - 3.14 |
| 6.0.8 | 1.13 - 2.3 | 6.0 | 5.2, 5.1, 5.0 | 3.10 - 3.14 |
| 6.0.7 | 1.13 - 2.3 | 6.0 | 5.2, 5.1, 5.0 | 3.10 - 3.14 |
| 6.0.6 | 1.13 - 2.1 | 6.0 | 5.2, 5.1, 5.0 | 3.10 - 3.14 |
| 6.0.5 | 1.13 - 2.1 | 6.0 | 5.2, 5.1, 5.0 | 3.10 - 3.14 |
| 6.0.4 | 1.13 - 2.0 | 6.0 | 5.2, 5.1, 5.0 | 3.10 - 3.14 |
| 6.0.3 | 1.13 - 1.20 | 6.0 | 5.2, 5.1, 5.0 | 3.10 - 3.14 |
| 6.0.2 | 1.13 - 1.20 | 6.0 | 5.2, 5.1, 5.0 | 3.10 - 3.14 |
| 6.0.1 | 1.13 - 1.19 | 6.0 | 5.2, 5.1, 5.0 | 3.10 - 3.14 |
| 6.0.0 | 1.13 - 1.19 | 6.0 | 5.2, 5.1, 5.0 | 3.10 - 3.14 |
| 5.2.9 | 1.13 - 1.19 | 5.2 | 5.1, 5.0 | 3.10 - 3.13 |
| 5.2.8 | 1.13 - 1.19 | 5.2 | 5.1, 5.0 | 3.10 - 3.13 |
| 5.2.7 | 1.13 - 1.18 | 5.2 | 5.1, 5.0 | 3.10 - 3.13 |
| 5.2.6 | 1.13 - 1.18 | 5.2 | 5.1, 5.0 | 3.10 - 3.13 |
| 5.2.5 | 1.13 - 1.18 | 5.2 | 5.1, 5.0 | 3.10 - 3.13 |
| 5.2.4 | 1.13 - 1.18 | 5.2 | 5.1, 5.0 | 3.10 - 3.13 |
| 5.2.3 | 1.13 - 1.18 | 5.2 | 5.1, 5.0 | 3.10 - 3.13 |
| 5.2.2 | 1.13 - 1.17 | 5.2 | 5.1, 5.0 | 3.10 - 3.13 |
| 5.2.1 | 1.13 - 1.16 | 5.2 | 5.1, 5.0 | 3.10 - 3.13 |
| 5.2.0 | 1.13+ | 5.2 | 5.1, 5.0 | 3.10 - 3.13 |
What "partial" support means, and why we don't pin to the exact Django/mypy version, is explained in
https://github.com/typeddjango/django-stubs/discussions/2101#discussioncomment-9276632.
## Features
### Type checking of Model Meta attributes
> [!NOTE]
> If you are using the mypy plugin and have `django_stub_ext` installed, your model `Meta` classes
> will be automatically type-checked without further changes.
By inheriting from the `TypedModelMeta` class, you can ensure you're using correct types for
attributes:
```python
from django.db import models
from django_stubs_ext.db.models import TypedModelMeta
class MyModel(models.Model):
example = models.CharField(max_length=100)
class Meta(TypedModelMeta):
ordering = ["example"]
constraints = [
models.UniqueConstraint(fields=["example"], name="unique_example"),
]
```
### Other typed base classes
* `django_stubs_ext.db.router.TypedDatabaseRouter` can be used as base when implementing custom database routers.
## Settings
django-stubs has a few settings, which you can list in:
* `pyproject.toml`, under the table `[tool.django-stubs]`
* `mypy.ini` under the table `[mypy.plugins.django-stubs]`
The supported settings are:
- `django_settings_module`, a string, default to `os.getenv(DJANGO_SETTINGS_MODULE)`.
Specify the import path of your settings module, the same as Django’s [`DJANGO_SETTINGS_MODULE` environment variable](https://docs.djangoproject.com/en/stable/topics/settings/#designating-the-settings).
- `strict_settings`, a boolean, default `true`.
Set to `false` if using dynamic settings, as [described below](https://github.com/typeddjango/django-stubs#how-to-use-a-custom-library-to-handle-django-settings).
- `strict_model_abstract_attrs`, a boolean, default `true`.
Set to `false` if you want to keep `.objects`, `.DoesNotExist`, `.NotUpdated`, and
`.MultipleObjectsReturned` attributes on `models.Model` type.
[See here why](https://github.com/typeddjango/django-stubs?tab=readme-ov-file#how-to-use-typemodel-annotation-with-objects-attribute)
this is dangerous to do by default.
## FAQ
### Is this an official Django project?
No, it is not. We are independent from Django at the moment.
There's a [proposal](https://github.com/django/deps/pull/65) to merge our project into the Django itself.
You can show your support by liking the PR.
### Is it safe to use this in production?
Yes, it is! This project does not affect your runtime at all.
It only affects `mypy` type checking process.
But, it does not make any sense to use this project without `mypy`.
### mypy crashes when I run it with this plugin installed
The current implementation uses Django's runtime to extract information about models, so it might crash if your installed apps or `models.py` are broken.
In other words, if your `manage.py runserver` crashes, mypy will crash too.
You can also run `mypy` with [`--tb`](https://mypy.readthedocs.io/en/stable/command_line.html#cmdoption-mypy-show-traceback)
option to get extra information about the error.
### I cannot use QuerySet or Manager with type annotations
You can get a `TypeError: 'type' object is not subscriptable`
when you will try to use `QuerySet[MyModel]`, `Manager[MyModel]` or some other Django-based Generic types.
This happens because these Django classes do not support [`__class_getitem__`](https://www.python.org/dev/peps/pep-0560/#class-getitem) magic method in runtime.
1. You can go with our [`django_stubs_ext`](https://github.com/typeddjango/django-stubs/tree/master/ext) helper, that patches all the types we use as Generic in django.
Install it:
```bash
pip install django-stubs-ext # as a production dependency
```
And then place in your top-level settings:
```python
import django_stubs_ext
django_stubs_ext.monkeypatch()
```
You can add extra types to patch with `django_stubs_ext.monkeypatch(extra_classes=[YourDesiredType])`
**If you use generic symbols in `django.contrib.auth.forms`**, you will have to do the monkeypatching
manually in your first [`AppConfig.ready`](https://docs.djangoproject.com/en/stable/ref/applications/#django.apps.AppConfig.ready).
This is currently required because `django.contrib.auth.forms` cannot be imported until django is initialized.
```python
import django_stubs_ext
from django.apps import AppConfig
class ClientsConfig(AppConfig):
name = "clients"
def ready(self) -> None:
from django.contrib.auth.forms import SetPasswordMixin, SetUnusablePasswordMixin
# For Django version prior to 5.1, use `extra_classes=[SetPasswordForm, AdminPasswordChangeForm]` instead.
django_stubs_ext.monkeypatch(extra_classes=[SetPasswordMixin, SetUnusablePasswordMixin])
```
2. You can use strings instead: `'QuerySet[MyModel]'` and `'Manager[MyModel]'`, this way it will work as a type for `mypy` and as a regular `str` in runtime.
### How can I create a HttpRequest that's guaranteed to have an authenticated user?
Django's built in [`HttpRequest`](https://docs.djangoproject.com/en/stable/ref/request-response/#django.http.HttpRequest) has the attribute `user` that resolves to the type `User | AnonymousUser` where `User` is the user model specified by the `AUTH_USER_MODEL` setting.
If you want a `HttpRequest` that you can type-annotate with where you know that the user is authenticated you can subclass the normal `HttpRequest` class like so:
```python
from django.http import HttpRequest
from my_user_app.models import MyUser
class AuthenticatedHttpRequest(HttpRequest):
user: MyUser
```
And then use `AuthenticatedHttpRequest` instead of the standard `HttpRequest` for when you know that the user is authenticated. For example in views using the `@login_required` decorator.
### Why am I getting incompatible return type errors on my custom managers?
If you declare your custom managers without generics and override built-in
methods you might see an error message about incompatible error messages,
something like this:
```python
from django.db import models
class MyManager(model.Manager):
def create(self, **kwargs) -> "MyModel":
pass
```
will cause this error message:
> error: Return type "MyModel" of "create" incompatible with return type "_T" in supertype "BaseManager"
This is happening because the `Manager` class is generic, but without
specifying generics the built-in manager methods are expected to return the
generic type of the base manager, which is any model. To fix this issue you
should declare your manager with your model as the type variable:
```python
class MyManager(models.Manager["MyModel"]): ...
```
### How do I annotate cases where I called QuerySet.annotate?
Django-stubs provides a special type, `django_stubs_ext.WithAnnotations[Model, ]`, which indicates that
the `Model` has been annotated, meaning it requires extra attributes on the model instance.
You should provide a `TypedDict` of these attributes, e.g. `WithAnnotations[MyModel, MyTypedDict]`, to specify which
annotated attributes are present.
Currently, the mypy plugin can recognize that specific names were passed to `QuerySet.annotate` and
include them in the type, but does not record the types of these attributes.
The knowledge of the specific annotated fields is not yet used in creating more specific types for `QuerySet`'s
`values`, `values_list`, or `filter` methods, however knowledge that the model was annotated _is_ used to create a
broader type result type for `values`/`values_list`, and to allow `filter`ing on any field.
```python
from typing import TypedDict
from django_stubs_ext import WithAnnotations
from django.db import models
from django.db.models.expressions import Value
class MyModel(models.Model):
username = models.CharField(max_length=100)
class MyTypedDict(TypedDict):
foo: str
def func(m: WithAnnotations[MyModel, MyTypedDict]) -> str:
print(m.bar) # Error, since field "bar" is not in MyModel or MyTypedDict.
return m.foo # OK, since we said field "foo" was allowed
func(MyModel.objects.annotate(foo=Value("")).get(id=1)) # OK
func(MyModel.objects.annotate(bar=Value("")).get(id=1)) # Error
```
You can also use `WithAnnotations` in custom `QuerySet` methods by making the queryset generic over a
model `TypeVar`. This way the return type stays accurate through chained calls and manager access:
```python
from typing import TypeVar, TypedDict
from django.db import models
from django.db.models import Manager
from django_stubs_ext import WithAnnotations
class SalesDict(TypedDict):
total_sales: int
_Model = TypeVar("_Model", bound=models.Model, covariant=True)
class ProductQuerySet(models.QuerySet[_Model]):
def with_sales(self) -> "ProductQuerySet[WithAnnotations[_Model, SalesDict]]":
return self.annotate(total_sales=models.Sum("order__amount"))
ProductManager = Manager.from_queryset(ProductQuerySet)
class Product(models.Model):
name = models.CharField(max_length=100)
objects = ProductManager()
product = Product.objects.with_sales().get(id=1)
product.total_sales # OK, int
product.name # OK, str
```
### Why am I getting incompatible argument type mentioning `_StrPromise`?
The lazy translation functions of Django (such as `gettext_lazy`) return a `Promise` instead of `str`. These two types [cannot be used interchangeably](https://github.com/typeddjango/django-stubs/pull/1139#issuecomment-1232167698). The return type of these functions was therefore [changed](https://github.com/typeddjango/django-stubs/pull/689) to reflect that.
If you encounter this error in your own code, you can either cast the `Promise` to `str` (causing the translation to be evaluated), or use the `StrPromise` or `StrOrPromise` types from `django-stubs-ext` in type hints. Which solution to choose depends depends on the particular case. See [working with lazy translation objects](https://docs.djangoproject.com/en/stable/topics/i18n/translation/#working-with-lazy-translation-objects) in the Django documentation for more information.
If this is reported on Django code, please report an issue or open a pull request to fix the type hints.
### How to use a custom library to handle Django settings?
Using something like [`django-split-settings`](https://github.com/wemake-services/django-split-settings) or [`django-configurations`](https://github.com/jazzband/django-configurations) will make it hard for mypy to infer your settings.
This might also be the case when using something like:
```python
try:
from .local_settings import *
except Exception:
pass
```
So, mypy would not like this code:
```python
from django.conf import settings
settings.CUSTOM_VALUE # E: 'Settings' object has no attribute 'CUSTOM_VALUE'
```
To handle this corner case we have a special setting `strict_settings` (`True` by default),
you can switch it to `False` to always return `Any` and not raise any errors if runtime settings module has the given value,
for example `pyproject.toml`:
```toml
[tool.django-stubs]
strict_settings = false
```
or `mypy.ini`:
```ini
[mypy.plugins.django-stubs]
strict_settings = false
```
And then:
```python
from typing import reveal_type
# Works:
reveal_type(settings.EXISTS_AT_RUNTIME) # N: Any
# Errors:
reveal_type(settings.MISSING) # E: 'Settings' object has no attribute 'MISSING'
```
### How to use `type[Model]` annotation with `.objects` attribute?
Let's say you have a function similar to this one,
which accepts a model type and accesses its `.object` attribute:
```python
from django.db import models
def assert_zero_count(model_type: type[models.Model]) -> None:
assert model_type.objects.count() == 0
```
This code will raise an error from mypy:
```
error: "type[Model]" has no attribute "objects" [attr-defined]
```
It is a common problem: some `type[models.Model]` types won't have `.objects` available.
Notable example: [abstract models](https://docs.djangoproject.com/en/stable/topics/db/models/#abstract-base-classes).
See [the reasoning here](https://github.com/typeddjango/django-stubs/issues/1684).
So, instead for the general case you should write:
```python
def assert_zero_count(model_type: type[models.Model]) -> None:
assert model_type._default_manager.count() == 0
```
Configurable with `strict_model_abstract_attrs = false` to skip removing `.objects`,
`.DoesNotExist`, `.NotUpdated`, and `.MultipleObjectsReturned` attributes from `model.Model` if
you are using our mypy plugin.
Use this setting on your own risk, because it can hide valid errors.
### Do I need to annotate reverse relations?
Not if you use our mypy plugin. It reads your app registry and declares every reverse accessor for you, as
`RelatedManager[Model]`, or `ManyRelatedManager[Model, Through]` for a `ManyToManyField`.
pyright, pyrefly and ty do not run the plugin, so under those you declare them yourself.
Reach for `RelatedManager` rather than `Manager`: a reverse accessor is read from a model instance, whereas a regular manager such as `objects` only exists on the model class.
```python
from django.db import models
from django_stubs_ext.db.models.manager import ManyRelatedManager, RelatedManager
class Article(models.Model):
category_set: RelatedManager[Category]
tags: ManyRelatedManager[Tag, ArticleTag]
```
Make sure to import symbols from `django_stubs_ext.db.models.manager`. Django dynamically create these so they cannot be imported directly
### How to type a custom `models.Field`?
> [!NOTE]
> This require type generic support, see this section to enable it.
Django `models.Field` (and subclasses) are generic types with two parameters:
- `_ST`: type that can be used when setting a value
- `_GT`: type that will be returned when getting a value
When you create a subclass, you have two options depending on how strict you want
the type to be for consumers of your custom field.
1. Generic subclass:
```python
from typing import TypeVar, reveal_type
from django.db import models
_ST = TypeVar("_ST", contravariant=True)
_GT = TypeVar("_GT", covariant=True)
class MyIntegerField(models.IntegerField[_ST, _GT]): ...
class User(models.Model):
my_field = MyIntegerField()
reveal_type(User().my_field) # N: Revealed type is "int"
User().my_field = "12" # OK (because Django IntegerField allows str and will try to coerce it)
```
2. Non-generic subclass (more strict):
```python
from typing import reveal_type
from django.db import models
# This is a non-generic subclass being very explicit
# that it expects only int when setting values.
class MyStrictIntegerField(models.IntegerField[int, int]): ...
class User(models.Model):
my_field = MyStrictIntegerField()
reveal_type(User().my_field) # N: Revealed type is "int"
User().my_field = "12" # E: Incompatible types in assignment (expression has type "str", variable has type "int")
```
See mypy section on [generic classes subclasses](https://mypy.readthedocs.io/en/stable/generics.html#defining-subclasses-of-generic-classes).
## Related projects
- [`awesome-python-typing`](https://github.com/typeddjango/awesome-python-typing) - Awesome list of all typing-related things in Python.
- [`djangorestframework-stubs`](https://github.com/typeddjango/djangorestframework-stubs) - Stubs for Django REST Framework.
- [`pytest-mypy-plugins`](https://github.com/typeddjango/pytest-mypy-plugins) - `pytest` plugin that we use for testing `mypy` stubs and plugins.
- [`wemake-django-template`](https://github.com/wemake-services/wemake-django-template) - Create new typed Django projects in seconds.
- [`django-modern-rest`](https://github.com/wemake-services/django-modern-rest) - Modern REST framework for Django with everything properly typed.
## Contributing
This project is open source and community driven. As such we encourage contributions big and small. You can contribute by doing any of the following:
1. Contribute code (e.g. improve stubs, add plugin capabilities, write tests etc) - to do so please follow the [contribution guide](./CONTRIBUTING.md).
2. Assist in code reviews and discussions in issues.
3. Identify bugs and issues and report these
4. Ask and answer questions on [StackOverflow](https://stackoverflow.com/questions/tagged/django-stubs)
You can always also reach out in gitter to discuss your contributions!
typeddjango-django-stubs-fa03b48/django-stubs/ 0000775 0000000 0000000 00000000000 15260643574 0021445 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/__init__.pyi 0000664 0000000 0000000 00000000340 15260643574 0023724 0 ustar 00root root 0000000 0000000 from typing import Literal
from .utils.version import get_version as get_version
VERSION: tuple[int, int, int, Literal["alpha", "beta", "rc", "final"], int]
__version__: str
def setup(set_prefix: bool = ...) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/apps/ 0000775 0000000 0000000 00000000000 15260643574 0022410 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/apps/__init__.pyi 0000664 0000000 0000000 00000000157 15260643574 0024675 0 ustar 00root root 0000000 0000000 from .config import AppConfig as AppConfig
from .registry import apps as apps
__all__ = ["AppConfig", "apps"]
typeddjango-django-stubs-fa03b48/django-stubs/apps/config.pyi 0000664 0000000 0000000 00000002170 15260643574 0024400 0 ustar 00root root 0000000 0000000 import types
from collections.abc import Iterator
from django.apps.registry import Apps
from django.db.models.base import Model
from django.utils.functional import _Getter, _StrOrPromise
APPS_MODULE_NAME: str
MODELS_MODULE_NAME: str
class AppConfig:
name: str
module: types.ModuleType | None
apps: Apps | None
label: str
verbose_name: _StrOrPromise
path: str
models_module: types.ModuleType | None
# Default auto_field is a cached_property on the base, but is usually subclassed as a str
# If not subclassing with a str, a type ignore[override] is needed
models: dict[str, type[Model]]
default: bool
default_auto_field: str | _Getter[str]
def __init__(self, app_name: str, app_module: types.ModuleType | None) -> None: ...
@classmethod
def create(cls, entry: str) -> AppConfig: ...
def get_model(self, model_name: str, require_ready: bool = True) -> type[Model]: ...
def get_models(
self, include_auto_created: bool = False, include_swapped: bool = False
) -> Iterator[type[Model]]: ...
def import_models(self) -> None: ...
def ready(self) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/apps/registry.pyi 0000664 0000000 0000000 00000004242 15260643574 0025005 0 ustar 00root root 0000000 0000000 import threading
from collections import defaultdict
from collections.abc import Callable, Iterable
from typing import Any
from django.db.models.base import Model
from .config import AppConfig
class Apps:
all_models: dict[str, dict[str, type[Model]]]
app_configs: dict[str, AppConfig]
stored_app_configs: list[Any]
apps_ready: bool
ready_event: threading.Event
loading: bool
# Maps ("app_label", "modelname") tuples to lists of functions to be called when the corresponding model is ready.
_pending_operations: defaultdict[tuple[str, str], list[Callable[[type[Model]], Any]]]
_apps: dict[str, type[Any]]
models_ready: bool
ready: bool
def __init__(self, installed_apps: Iterable[AppConfig | str] | None = ()) -> None: ...
def populate(self, installed_apps: Iterable[AppConfig | str] | None = None) -> None: ...
def check_apps_ready(self) -> None: ...
def check_models_ready(self) -> None: ...
def get_app_configs(self) -> Iterable[AppConfig]: ...
def get_app_config(self, app_label: str) -> AppConfig: ...
# it's not possible to support it in plugin properly now
def get_models(self, include_auto_created: bool = False, include_swapped: bool = False) -> list[type[Model]]: ...
def get_model(self, app_label: str, model_name: str | None = None, require_ready: bool = True) -> type[Any]: ...
def register_model(self, app_label: str, model: type[Model]) -> None: ...
def is_installed(self, app_name: str) -> bool: ...
def get_containing_app_config(self, object_name: str) -> AppConfig | None: ...
def get_registered_model(self, app_label: str, model_name: str) -> type[Model]: ...
def get_swappable_settings_name(self, to_string: str) -> str | None: ...
def set_available_apps(self, available: Iterable[str]) -> None: ...
def unset_available_apps(self) -> None: ...
def set_installed_apps(self, installed: Iterable[str]) -> None: ...
def unset_installed_apps(self) -> None: ...
def clear_cache(self) -> None: ...
def lazy_model_operation(self, function: Callable[..., Any], *model_keys: Any) -> None: ...
def do_pending_operations(self, model: type[Model]) -> None: ...
apps: Apps
typeddjango-django-stubs-fa03b48/django-stubs/conf/ 0000775 0000000 0000000 00000000000 15260643574 0022372 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/conf/__init__.pyi 0000664 0000000 0000000 00000003260 15260643574 0024655 0 ustar 00root root 0000000 0000000 from typing import Any, Literal, Self, type_check_only
from django.utils.functional import LazyObject
from typing_extensions import override
# explicit dependency on standard settings to make it loaded
from . import global_settings # noqa: F401
ENVIRONMENT_VARIABLE: Literal["DJANGO_SETTINGS_MODULE"]
DEFAULT_STORAGE_ALIAS: Literal["default"]
STATICFILES_STORAGE_ALIAS: Literal["staticfiles"]
# RemovedInDjango70Warning.
SIGNED_COOKIE_LEGACY_SALT_DEPRECATED_MSG: str
USE_BLANK_CHOICE_DASH_DEPRECATED_MSG: str
DEPRECATED_EMAIL_SETTINGS: set[str]
EMAIL_SETTING_DEPRECATED_MSG: str
# required for plugin to be able to distinguish this specific instance of LazySettings from others
@type_check_only
class _DjangoConfLazyObject(LazyObject[Any]):
@override
def __getattr__(self, item: Any) -> Any: ...
class LazySettings(_DjangoConfLazyObject):
SETTINGS_MODULE: str
@property
def configured(self) -> bool: ...
def configure(self, default_settings: Any = ..., **options: Any) -> None: ...
settings: LazySettings
class Settings:
SETTINGS_MODULE: str
def __init__(self, settings_module: str) -> None: ...
def is_overridden(self, setting: str) -> bool: ...
class UserSettingsHolder:
SETTINGS_MODULE: None
def __init__(self, default_settings: Any) -> None: ...
def __getattr__(self, name: str) -> Any: ...
@override
def __setattr__(self, name: str, value: Any) -> None: ...
@override
def __delattr__(self, name: str) -> None: ...
def is_overridden(self, setting: str) -> bool: ...
class SettingsReference(str):
def __new__(self, value: Any, setting_name: str) -> Self: ...
def __init__(self, value: str, setting_name: str) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/conf/global_settings.pyi 0000664 0000000 0000000 00000045414 15260643574 0026305 0 ustar 00root root 0000000 0000000 from collections.abc import Collection, Mapping, Sequence
from re import Pattern
from typing import Any, Literal, NotRequired, Protocol, TypeAlias, TypedDict, type_check_only
from django.utils.functional import _StrOrPromise
from django_stubs_ext.settings import TemplatesSetting
# This is defined here as a do-nothing function because we can't import
# django.utils.translation -- that module depends on the settings.
def gettext_noop(s: str) -> str: ...
# Note: the tuple element format for ADMINS or MANAGERS is deprecated. Use a
# list of strings instead.
_Admins: TypeAlias = list[str] | list[tuple[str, str]]
####################
# CORE #
####################
DEBUG: bool
# Whether the framework should propagate raw exceptions rather than catching
# them. This is useful under some testing situations and should never be used
# on a live site.
DEBUG_PROPAGATE_EXCEPTIONS: bool
# People who get code error notifications.
# In the format [('Full Name', 'email@example.com'), ('Full Name', 'anotheremail@example.com')]
ADMINS: _Admins
# List of IP addresses, as strings, that:
# * See debug comments, when DEBUG is true
# * Receive x-headers
INTERNAL_IPS: list[str]
# Hosts/domain names that are valid for this site.
# "*" matches anything, ".example.com" matches example.com and all subdomains
ALLOWED_HOSTS: list[str]
# Local time zone for this installation. All choices can be found here:
# https://en.wikipedia.org/wiki/List_of_tz_zones_by_name (although not all
# systems may support all possibilities). When USE_TZ is True, this is
# interpreted as the default user time zone.
TIME_ZONE: str
# If you set this to True, Django will use timezone-aware datetimes.
USE_TZ: bool
# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE: str
# Languages we provide translations for, out of the box.
LANGUAGES: list[tuple[str, str]]
# Languages using BiDi (right-to-left) layout
LANGUAGES_BIDI: list[str]
# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N: bool
LOCALE_PATHS: list[str]
# Settings for language cookie
LANGUAGE_COOKIE_NAME: str
LANGUAGE_COOKIE_AGE: int | None
LANGUAGE_COOKIE_DOMAIN: str | None
LANGUAGE_COOKIE_PATH: str
LANGUAGE_COOKIE_HTTPONLY: bool
LANGUAGE_COOKIE_SAMESITE: Literal["Lax", "Strict", "None", False] | None
LANGUAGE_COOKIE_SECURE: bool
# Not-necessarily-technical managers of the site. They get broken link
# notifications and other various emails.
MANAGERS: _Admins
# Default charset to use for all HttpResponse objects, if a
# MIME type isn't manually specified. These are used to construct the
# Content-Type header.
DEFAULT_CHARSET: str
# `SERIALIZATION_MODULES` is a dictionary (`dict[str, str]`) of modules containing serializer definitions.
# Because Django doesn't define it, we can't provide its type here. Use `getattr` for type-safe access
# e.g. `getattr(settings, "SERIALIZATION_MODULES")`
# Email address that error messages come from.
SERVER_EMAIL: str
# Database connection info. If left empty, will default to the dummy backend.
DATABASES: dict[str, dict[str, Any]]
# Classes used to implement DB routing behavior.
@type_check_only
class Router(Protocol):
def allow_migrate(self, db: str, app_label: str, **hints: Any) -> bool | None: ...
DATABASE_ROUTERS: list[str | Router]
# Mailer configurations. No mailers are defined by default.
# RemovedInDjango70Warning: uncomment the next line.
# MAILERS: Mapping[str, Mapping[str, Any]]
# RemovedInDjango70Warning.
# The email backend to use. For possible shortcuts see django.core.mail.
# The default is to use the SMTP backend.
# Third-party backends can be specified by providing a Python path
# to a module that defines an EmailBackend class.
EMAIL_BACKEND: str
# `EMAIL_FILE_PATH` is a `str` indicating the directory used by the file email backend to store output files.
# Because Django doesn't define it, we can't provide its type here. Use `getattr` for type-safe access
# e.g. `getattr(settings, "EMAIL_FILE_PATH")`
# RemovedInDjango70Warning.
# Host for sending email.
EMAIL_HOST: str
# RemovedInDjango70Warning.
# Port for sending email.
EMAIL_PORT: int
# Whether to send SMTP 'Date' header in the local time zone or in UTC.
EMAIL_USE_LOCALTIME: bool
# RemovedInDjango70Warning.
# Optional SMTP authentication information for EMAIL_HOST.
EMAIL_HOST_USER: str
EMAIL_HOST_PASSWORD: str
EMAIL_USE_TLS: bool
EMAIL_USE_SSL: bool
EMAIL_SSL_CERTFILE: str | None
EMAIL_SSL_KEYFILE: str | None
EMAIL_TIMEOUT: int | None
# List of strings representing installed apps.
INSTALLED_APPS: list[str]
TEMPLATES: list[TemplatesSetting]
# Default form rendering class.
FORM_RENDERER: str
# RemovedInDjango70Warning: This setting allows to revert back to the old
# blank choice label in Django 6.1.
USE_BLANK_CHOICE_DASH: bool
# Default email address to use for various automated correspondence from
# the site managers.
DEFAULT_FROM_EMAIL: str
# Subject-line prefix for email messages send with django.core.mail.mail_admins
# or ...mail_managers. Make sure to include the trailing space.
EMAIL_SUBJECT_PREFIX: str
# Whether to append trailing slashes to URLs.
APPEND_SLASH: bool
# Whether to prepend the "www." subdomain to URLs that don't have it.
PREPEND_WWW: bool
# Override the server-derived value of SCRIPT_NAME
FORCE_SCRIPT_NAME: str | None
# List of compiled regular expression objects representing User-Agent strings
# that are not allowed to visit any page, systemwide. Use this for bad
# robots/crawlers. Here are a few examples:
# import re
# DISALLOWED_USER_AGENTS = [
# re.compile(r'^NaverBot.*'),
# re.compile(r'^EmailSiphon.*'),
# re.compile(r'^SiteSucker.*'),
# re.compile(r'^sohu-search'),
# ]
DISALLOWED_USER_AGENTS: list[Pattern[str]]
ABSOLUTE_URL_OVERRIDES: dict[str, Any]
# List of compiled regular expression objects representing URLs that need not
# be reported by BrokenLinkEmailsMiddleware. Here are a few examples:
# import re
# IGNORABLE_404_URLS = [
# re.compile(r'^/apple-touch-icon.*\.png$'),
# re.compile(r'^/favicon.ico$'),
# re.compile(r'^/robots.txt$'),
# re.compile(r'^/phpmyadmin/'),
# re.compile(r'\.(cgi|php|pl)$'),
# ]
IGNORABLE_404_URLS: list[Pattern[str]]
# `ROOT_URLCONF` is a string representing the full Python import path to the root `URLconf`.
# Because Django doesn't define it, we can't provide its type here. Use `getattr` for type-safe access
# e.g. `getattr(settings, "ROOT_URLCONF")`
# A secret key for this particular Django installation. Used in secret-key
# hashing algorithms. Set this in your settings, or Django will complain
# loudly.
SECRET_KEY: str | bytes
# A list of fallback secret keys for a particular Django installation. These
# are used to allow rotation of the SECRET_KEY.
SECRET_KEY_FALLBACKS: list[str | bytes]
STORAGES: dict[str, dict[str, Any]]
# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/var/www/example.com/media/"
MEDIA_ROOT: str
# URL that handles the media served from MEDIA_ROOT.
# Examples: "http://example.com/media/", "http://media.example.com/"
MEDIA_URL: str
# `SITE_ID` is the ID, as an integer, of the current site in the `django_site` database table.
# Because Django doesn't define it, we can't provide its type here. Use `getattr` for type-safe access
# e.g. `getattr(settings, "SITE_ID")`
# Absolute path to the directory static files should be collected to.
# Example: "/var/www/example.com/static/"
STATIC_ROOT: str | None
# URL that handles the static files served from STATIC_ROOT.
# Example: "http://example.com/static/", "http://static.example.com/"
STATIC_URL: str | None
# List of upload handler classes to be applied in order.
FILE_UPLOAD_HANDLERS: list[str]
# Maximum size, in bytes, of a request before it will be streamed to the
# file system instead of into memory.
FILE_UPLOAD_MAX_MEMORY_SIZE: int # i.e. 2.5 MB
# Maximum size in bytes of request data (excluding file uploads) that will be
# read before a SuspiciousOperation (RequestDataTooBig) is raised.
DATA_UPLOAD_MAX_MEMORY_SIZE: int # i.e. 2.5 MB
# Maximum number of GET/POST parameters that will be read before a
# SuspiciousOperation (TooManyFieldsSent) is raised.
DATA_UPLOAD_MAX_NUMBER_FIELDS: int
# Maximum number of files encoded in a multipart upload that will be read
# before a SuspiciousOperation (TooManyFilesSent) is raised.
DATA_UPLOAD_MAX_NUMBER_FILES: int
# Directory in which upload streamed files will be temporarily saved. A value of
# `None` will make Django use the operating system's default temporary directory
# (i.e. "/tmp" on *nix systems).
FILE_UPLOAD_TEMP_DIR: str | None
# The numeric mode to set newly-uploaded files to. The value should be a mode
# you'd pass directly to os.chmod; see https://docs.python.org/library/os.html#files-and-directories.
FILE_UPLOAD_PERMISSIONS: int
# The numeric mode to assign to newly-created directories, when uploading files.
# The value should be a mode as you'd pass to os.chmod;
# see https://docs.python.org/library/os.html#files-and-directories.
FILE_UPLOAD_DIRECTORY_PERMISSIONS: int | None
# Python module path where user will place custom format definition.
# The directory where this setting is pointing should contain subdirectories
# named as the locales, containing a formats.py file
# (i.e. "myproject.locale" for myproject/locale/en/formats.py etc. use)
FORMAT_MODULE_PATH: str | None
# Default formatting for date objects. See all available format strings here:
# https://docs.djangoproject.com/en/stable/ref/templates/builtins/#date
DATE_FORMAT: str
# Default formatting for datetime objects. See all available format strings here:
# https://docs.djangoproject.com/en/stable/ref/templates/builtins/#date
DATETIME_FORMAT: str
# Default formatting for time objects. See all available format strings here:
# https://docs.djangoproject.com/en/stable/ref/templates/builtins/#date
TIME_FORMAT: str
# Default formatting for date objects when only the year and month are relevant.
# See all available format strings here:
# https://docs.djangoproject.com/en/stable/ref/templates/builtins/#date
YEAR_MONTH_FORMAT: str
# Default formatting for date objects when only the month and day are relevant.
# See all available format strings here:
# https://docs.djangoproject.com/en/stable/ref/templates/builtins/#date
MONTH_DAY_FORMAT: str
# Default short formatting for date objects. See all available format strings here:
# https://docs.djangoproject.com/en/stable/ref/templates/builtins/#date
SHORT_DATE_FORMAT: str
# Default short formatting for datetime objects.
# See all available format strings here:
# https://docs.djangoproject.com/en/stable/ref/templates/builtins/#date
SHORT_DATETIME_FORMAT: str
# Default formats to be used when parsing dates from input boxes, in order
# See all available format string here:
# https://docs.python.org/library/datetime.html#strftime-behavior
# * Note that these format strings are different from the ones to display dates
DATE_INPUT_FORMATS: list[str]
# Default formats to be used when parsing times from input boxes, in order
# See all available format string here:
# https://docs.python.org/library/datetime.html#strftime-behavior
# * Note that these format strings are different from the ones to display dates
TIME_INPUT_FORMATS: list[str] # '14:30:59' # '14:30:59.000200' # '14:30'
# Default formats to be used when parsing dates and times from input boxes,
# in order
# See all available format string here:
# https://docs.python.org/library/datetime.html#strftime-behavior
# * Note that these format strings are different from the ones to display dates
DATETIME_INPUT_FORMATS: list[str]
# First day of week, to be used on calendars
# 0 means Sunday, 1 means Monday...
FIRST_DAY_OF_WEEK: int
# Decimal separator symbol
DECIMAL_SEPARATOR: str
# Boolean that sets whether to add thousand separator when formatting numbers
USE_THOUSAND_SEPARATOR: bool
# Number of digits that will be together, when splitting them by
# THOUSAND_SEPARATOR. 0 means no grouping, 3 means splitting by thousands...
NUMBER_GROUPING: int
# Thousand separator symbol
THOUSAND_SEPARATOR: str
# The tablespaces to use for each model when not specified otherwise.
DEFAULT_TABLESPACE: str
DEFAULT_INDEX_TABLESPACE: str
# Default primary key field type.
DEFAULT_AUTO_FIELD: str
# Default X-Frame-Options header value
X_FRAME_OPTIONS: str
USE_X_FORWARDED_HOST: bool
USE_X_FORWARDED_PORT: bool
# The Python dotted path to the WSGI application that Django's internal server
# (runserver) will use. If `None`, the return value of
# 'django.core.wsgi.get_wsgi_application' is used, thus preserving the same
# behavior as previous versions of Django. Otherwise this should point to an
# actual WSGI application object.
WSGI_APPLICATION: str | None
# If your Django app is behind a proxy that sets a header to specify secure
# connections, AND that proxy ensures that user-submitted headers with the
# same name are ignored (so that people can't spoof it), set this value to
# a tuple of (header_name, header_value). For any requests that come in with
# that header/value, request.is_secure() will return True.
# WARNING! Only set this if you fully understand what you're doing. Otherwise,
# you may be opening yourself up to a security risk.
SECURE_PROXY_SSL_HEADER: tuple[str, str] | None
##############
# MIDDLEWARE #
##############
# List of middleware to use. Order is important; in the request phase, these
# middleware will be applied in the order given, and in the response
# phase the middleware will be applied in reverse order.
MIDDLEWARE: list[str]
############
# SESSIONS #
############
# Cache to store session data if using the cache session backend.
SESSION_CACHE_ALIAS: str
# Cookie name. This can be whatever you want.
SESSION_COOKIE_NAME: str
# Age of cookie, in seconds (default: 2 weeks).
SESSION_COOKIE_AGE: int
# A string like "example.com", or None for standard domain cookie.
SESSION_COOKIE_DOMAIN: str | None
# Whether the session cookie should be secure (https:// only).
SESSION_COOKIE_SECURE: bool
# The path of the session cookie.
SESSION_COOKIE_PATH: str
# Whether to use the non-RFC standard httpOnly flag (IE, FF3+, others)
SESSION_COOKIE_HTTPONLY: bool
# Whether to set the flag restricting cookie leaks on cross-site requests.
# This can be 'Lax', 'Strict', 'None', or False to disable the flag.
SESSION_COOKIE_SAMESITE: Literal["Lax", "Strict", "None", False]
# Whether to save the session data on every request.
SESSION_SAVE_EVERY_REQUEST: bool
# Whether a user's session cookie expires when the Web browser is closed.
SESSION_EXPIRE_AT_BROWSER_CLOSE: bool
# The module to store session data
SESSION_ENGINE: str
# Directory to store session files if using the file session module. If None,
# the backend will use a sensible default.
SESSION_FILE_PATH: str | None
# class to serialize session data
SESSION_SERIALIZER: str
#########
# CACHE #
#########
# The cache backends to use.
CACHES: dict[str, dict[str, Any]]
CACHE_MIDDLEWARE_KEY_PREFIX: str
CACHE_MIDDLEWARE_SECONDS: int
CACHE_MIDDLEWARE_ALIAS: str
##################
# AUTHENTICATION #
##################
AUTH_USER_MODEL: str
AUTHENTICATION_BACKENDS: Sequence[str]
LOGIN_URL: _StrOrPromise
LOGIN_REDIRECT_URL: _StrOrPromise
LOGOUT_REDIRECT_URL: _StrOrPromise | None
# The number of seconds a password reset link is valid for
PASSWORD_RESET_TIMEOUT: int
# the first hasher in this list is the preferred algorithm. any
# password using different algorithms will be converted automatically
# upon login
PASSWORD_HASHERS: list[str]
@type_check_only
class _AuthPasswordValidatorsDict(TypedDict):
NAME: str
OPTIONS: NotRequired[dict[str, Any]]
AUTH_PASSWORD_VALIDATORS: list[_AuthPasswordValidatorsDict]
###########
# SIGNING #
###########
SIGNED_COOKIE_LEGACY_SALT_FALLBACK: bool
SIGNING_BACKEND: str
########
# CSRF #
########
# Dotted path to callable to be used as view when a request is
# rejected by the CSRF middleware.
CSRF_FAILURE_VIEW: str
# Settings for CSRF cookie.
CSRF_COOKIE_NAME: str
CSRF_COOKIE_AGE: int
CSRF_COOKIE_DOMAIN: str | None
CSRF_COOKIE_PATH: str
CSRF_COOKIE_SECURE: bool
CSRF_COOKIE_HTTPONLY: bool
CSRF_COOKIE_SAMESITE: Literal["Lax", "Strict", "None", False]
CSRF_HEADER_NAME: str
CSRF_TRUSTED_ORIGINS: list[str]
CSRF_USE_SESSIONS: bool
############
# MESSAGES #
############
# Class to use as messages backend
MESSAGE_STORAGE: str
# Default values of MESSAGE_LEVEL and MESSAGE_TAGS are defined within
# django.contrib.messages to avoid imports in this settings file.
###########
# LOGGING #
###########
# The callable to use to configure logging
LOGGING_CONFIG: str
# Custom logging configuration.
LOGGING: dict[str, Any]
# Default exception reporter class used in case none has been
# specifically assigned to the HttpRequest instance.
DEFAULT_EXCEPTION_REPORTER: str
# Default exception reporter filter class used in case none has been
# specifically assigned to the HttpRequest instance.
DEFAULT_EXCEPTION_REPORTER_FILTER: str
###########
# TESTING #
###########
# The name of the class to use to run the test suite
TEST_RUNNER: str
# Apps that don't need to be serialized at test database creation time
# (only apps with migrations are to start with)
TEST_NON_SERIALIZED_APPS: list[str]
############
# FIXTURES #
############
# The list of directories to search for fixtures
FIXTURE_DIRS: list[str]
###############
# STATICFILES #
###############
# A list of locations of additional static files
STATICFILES_DIRS: list[str]
# List of finder classes that know how to find static files in
# various locations.
STATICFILES_FINDERS: list[str]
##############
# MIGRATIONS #
##############
# Migration module overrides for apps, by app label.
MIGRATION_MODULES: dict[str, str | None]
#################
# SYSTEM CHECKS #
#################
# List of all issues generated by system checks that should be silenced. Light
# issues like warnings, infos or debugs will not generate a message. Silencing
# serious issues like errors and criticals does not result in hiding the
# message, but Django will not stop you from e.g. running server.
SILENCED_SYSTEM_CHECKS: list[str]
#######################
# SECURITY MIDDLEWARE #
#######################
SECURE_CONTENT_TYPE_NOSNIFF: bool
SECURE_CROSS_ORIGIN_OPENER_POLICY: str
SECURE_HSTS_INCLUDE_SUBDOMAINS: bool
SECURE_HSTS_PRELOAD: bool
SECURE_HSTS_SECONDS: int
SECURE_REDIRECT_EXEMPT: list[str]
SECURE_REFERRER_POLICY: str
SECURE_SSL_HOST: str | None
SECURE_SSL_REDIRECT: bool
##################
# CSP MIDDLEWARE #
##################
SECURE_CSP: Mapping[str, Collection[str] | str]
SECURE_CSP_REPORT_ONLY: Mapping[str, Collection[str] | str]
# RemovedInDjango70Warning: A transitional setting helpful in early adoption of
# HTTPS as the default protocol in urlize and urlizetrunc when no protocol is
# provided. Set to True to assume HTTPS during the Django 6.x release cycle.
URLIZE_ASSUME_HTTPS: bool
#########
# TASKS #
#########
TASKS: dict[str, dict[str, Any]]
typeddjango-django-stubs-fa03b48/django-stubs/conf/locale/ 0000775 0000000 0000000 00000000000 15260643574 0023631 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/conf/locale/__init__.pyi 0000664 0000000 0000000 00000000062 15260643574 0026111 0 ustar 00root root 0000000 0000000 from typing import Any
LANG_INFO: dict[str, Any]
typeddjango-django-stubs-fa03b48/django-stubs/conf/urls/ 0000775 0000000 0000000 00000000000 15260643574 0023357 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/conf/urls/__init__.pyi 0000664 0000000 0000000 00000000457 15260643574 0025647 0 ustar 00root root 0000000 0000000 from django.urls import include as include
from django.views import defaults
__all__ = ["handler400", "handler403", "handler404", "handler500", "include"]
handler400 = defaults.bad_request
handler403 = defaults.permission_denied
handler404 = defaults.page_not_found
handler500 = defaults.server_error
typeddjango-django-stubs-fa03b48/django-stubs/conf/urls/i18n.pyi 0000664 0000000 0000000 00000000347 15260643574 0024665 0 ustar 00root root 0000000 0000000 from django.urls import _AnyURL
def i18n_patterns(*urls: _AnyURL, prefix_default_language: bool = ...) -> list[_AnyURL]: ...
def is_language_prefix_patterns_used(urlconf: str) -> tuple[bool, bool]: ...
urlpatterns: list[_AnyURL]
typeddjango-django-stubs-fa03b48/django-stubs/conf/urls/static.pyi 0000664 0000000 0000000 00000000412 15260643574 0025366 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any
from django.http.response import HttpResponseBase
from django.urls.resolvers import URLPattern
def static(prefix: str, view: Callable[..., HttpResponseBase] = ..., **kwargs: Any) -> list[URLPattern]: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/ 0000775 0000000 0000000 00000000000 15260643574 0023105 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0025355 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/ 0000775 0000000 0000000 00000000000 15260643574 0024175 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/__init__.pyi 0000664 0000000 0000000 00000003444 15260643574 0026464 0 ustar 00root root 0000000 0000000 from . import checks as checks
from .decorators import action as action
from .decorators import display as display
from .decorators import register as register
from .filters import AllValuesFieldListFilter as AllValuesFieldListFilter
from .filters import BooleanFieldListFilter as BooleanFieldListFilter
from .filters import ChoicesFieldListFilter as ChoicesFieldListFilter
from .filters import DateFieldListFilter as DateFieldListFilter
from .filters import EmptyFieldListFilter as EmptyFieldListFilter
from .filters import FieldListFilter as FieldListFilter
from .filters import ListFilter as ListFilter
from .filters import RelatedFieldListFilter as RelatedFieldListFilter
from .filters import RelatedOnlyFieldListFilter as RelatedOnlyFieldListFilter
from .filters import SimpleListFilter as SimpleListFilter
from .options import HORIZONTAL as HORIZONTAL
from .options import VERTICAL as VERTICAL
from .options import Action as Action
from .options import ActionLocation as ActionLocation
from .options import ModelAdmin as ModelAdmin
from .options import ShowFacets as ShowFacets
from .options import StackedInline as StackedInline
from .options import TabularInline as TabularInline
from .sites import AdminSite as AdminSite
from .sites import site as site
def autodiscover() -> None: ...
__all__ = [
"HORIZONTAL",
"VERTICAL",
"Action",
"ActionLocation",
"AdminSite",
"AllValuesFieldListFilter",
"BooleanFieldListFilter",
"ChoicesFieldListFilter",
"DateFieldListFilter",
"EmptyFieldListFilter",
"FieldListFilter",
"ListFilter",
"ModelAdmin",
"RelatedFieldListFilter",
"RelatedOnlyFieldListFilter",
"ShowFacets",
"SimpleListFilter",
"StackedInline",
"TabularInline",
"action",
"autodiscover",
"display",
"register",
"site",
]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/actions.pyi 0000664 0000000 0000000 00000000541 15260643574 0026360 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.admin.options import ModelAdmin
from django.db.models.query import QuerySet
from django.http.request import HttpRequest
from django.template.response import TemplateResponse
def delete_selected(
modeladmin: ModelAdmin[Any], request: HttpRequest, queryset: QuerySet[Any]
) -> TemplateResponse | None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/apps.pyi 0000664 0000000 0000000 00000000210 15260643574 0025654 0 ustar 00root root 0000000 0000000 from django.apps import AppConfig
class SimpleAdminConfig(AppConfig):
default_site: str
class AdminConfig(SimpleAdminConfig): ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/checks.pyi 0000664 0000000 0000000 00000002301 15260643574 0026154 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from typing import Any
from django.apps.config import AppConfig
from django.contrib.admin.options import BaseModelAdmin
from django.core.checks.messages import CheckMessage
from typing_extensions import override
def check_admin_app(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
def check_dependencies(**kwargs: object) -> list[CheckMessage]: ...
class BaseModelAdminChecks:
def check(self, admin_obj: BaseModelAdmin[Any], **kwargs: object) -> list[CheckMessage]: ...
class ModelAdminChecks(BaseModelAdminChecks): ...
class InlineModelAdminChecks(BaseModelAdminChecks):
# We need this override because `InlineModelAdminChecks` rename `admin_obj` to `inline_obj` here
@override
def check(self, inline_obj: BaseModelAdmin[Any], **kwargs: object) -> list[CheckMessage]: ... # type: ignore[override]
def must_be(type: str, option: str, obj: BaseModelAdmin[Any], id: str) -> list[CheckMessage]: ...
def must_inherit_from(parent: str, option: str, obj: BaseModelAdmin[Any], id: str) -> list[CheckMessage]: ...
def refer_to_missing_field(field: str, option: str, obj: BaseModelAdmin[Any], id: str) -> list[CheckMessage]: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/decorators.pyi 0000664 0000000 0000000 00000004134 15260643574 0027067 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Sequence
from typing import Any, overload
from django.contrib.admin import ActionLocation, ModelAdmin
from django.contrib.admin.sites import AdminSite
from django.db.models.base import Model
from django.db.models.expressions import BaseExpression, Combinable
from django.utils.functional import _StrOrPromise
from typing_extensions import TypeVar
_ModelAdmin = TypeVar("_ModelAdmin", bound=ModelAdmin[Any])
_F = TypeVar("_F", bound=Callable[..., Any])
@overload
def action(
function: _F,
*,
permissions: Sequence[str] | None = ...,
description: _StrOrPromise | None = ...,
description_plural: _StrOrPromise | None = ...,
location: ActionLocation | Sequence[ActionLocation] = ...,
) -> _F: ...
@overload
def action(
function: None = None,
*,
permissions: Sequence[str] | None = ...,
description: _StrOrPromise | None = ...,
description_plural: _StrOrPromise | None = ...,
location: ActionLocation | Sequence[ActionLocation] = ...,
) -> Callable[[_F], _F]: ...
@overload
def display(
function: _F,
*,
boolean: bool | None = ...,
ordering: str | Combinable | BaseExpression | None = ...,
description: _StrOrPromise | None = ...,
empty_value: None = ...,
) -> _F: ...
@overload
def display(
function: _F,
*,
boolean: None = ...,
ordering: str | Combinable | BaseExpression | None = ...,
description: _StrOrPromise | None = ...,
empty_value: str | None = ...,
) -> _F: ...
@overload
def display(
function: None = None,
*,
boolean: bool | None = ...,
ordering: str | Combinable | BaseExpression | None = ...,
description: _StrOrPromise | None = ...,
empty_value: None = ...,
) -> Callable[[_F], _F]: ...
@overload
def display(
function: None = None,
*,
boolean: None = ...,
ordering: str | Combinable | BaseExpression | None = ...,
description: _StrOrPromise | None = ...,
empty_value: str | None = ...,
) -> Callable[[_F], _F]: ...
def register(
*models: type[Model], site: AdminSite | None = ...
) -> Callable[[type[_ModelAdmin]], type[_ModelAdmin]]: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/exceptions.pyi 0000664 0000000 0000000 00000000373 15260643574 0027104 0 ustar 00root root 0000000 0000000 from django.core.exceptions import SuspiciousOperation
class DisallowedModelAdminLookup(SuspiciousOperation): ...
class DisallowedModelAdminToField(SuspiciousOperation): ...
class AlreadyRegistered(Exception): ...
class NotRegistered(Exception): ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/filters.pyi 0000664 0000000 0000000 00000011247 15260643574 0026375 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterable, Iterator, Mapping
from datetime import date, datetime
from typing import Any, ClassVar
from django.contrib.admin.options import ModelAdmin
from django.contrib.admin.views.main import ChangeList
from django.db.models.aggregates import Count
from django.db.models.base import Model
from django.db.models.fields import Field
from django.db.models.fields.related import RelatedField
from django.db.models.query import QuerySet
from django.db.models.query_utils import Q
from django.http.request import HttpRequest
from django.utils.datastructures import _ListOrTuple
from django.utils.functional import _StrOrPromise
from django.utils.safestring import SafeString
from typing_extensions import TypedDict, override
class _ListFilterChoices(TypedDict):
selected: bool
query_string: str
display: _StrOrPromise
class ListFilter:
title: _StrOrPromise | None
template: str
request: HttpRequest
used_parameters: dict[str, object]
def __init__(
self, request: HttpRequest, params: dict[str, list[str]], model: type[Model], model_admin: ModelAdmin[Any]
) -> None: ...
def has_output(self) -> bool: ...
def choices(self, changelist: ChangeList) -> Iterator[Mapping[str, object]]: ...
def queryset(self, request: HttpRequest, queryset: QuerySet[Any]) -> QuerySet[Any] | None: ...
def expected_parameters(self) -> list[str | None]: ...
class FacetsMixin:
def get_facet_counts(self, pk_attname: str, filtered_qs: QuerySet[Model]) -> dict[str, Count]: ...
def get_facet_queryset(self, changelist: ChangeList) -> dict[str, int]: ...
class SimpleListFilter(FacetsMixin, ListFilter):
# SimpleListFilter stores scalar str values (see value() and get_facet_counts())
used_parameters: dict[str, str] # type: ignore[assignment]
parameter_name: str | None
lookup_choices: list[tuple[str, _StrOrPromise]]
def value(self) -> str | None: ...
def lookups(
self, request: HttpRequest, model_admin: ModelAdmin[Any]
) -> Iterable[tuple[str, _StrOrPromise]] | None: ...
@override
def choices(self, changelist: ChangeList) -> Iterator[_ListFilterChoices]: ...
class FieldListFilter(FacetsMixin, ListFilter):
list_separator: ClassVar[str]
field: Field[Any, Any]
field_path: str
def __init__(
self,
field: Field[Any, Any],
request: HttpRequest,
params: dict[str, list[str]],
model: type[Model],
model_admin: ModelAdmin[Any],
field_path: str,
) -> None: ...
@classmethod
def register(
cls, test: Callable[[Field[Any, Any]], Any], list_filter_class: type[FieldListFilter], take_priority: bool = ...
) -> None: ...
@classmethod
def create(
cls,
field: Field[Any, Any],
request: HttpRequest,
params: dict[str, list[str]],
model: type[Model],
model_admin: ModelAdmin[Any],
field_path: str,
) -> FieldListFilter: ...
@override
def choices(self, changelist: ChangeList) -> Iterator[_ListFilterChoices]: ...
class RelatedFieldListFilter(FieldListFilter):
lookup_kwarg: str
lookup_kwarg_isnull: str
lookup_val: str | None
lookup_val_isnull: str | None
lookup_choices: list[tuple[str, _StrOrPromise]]
lookup_title: _StrOrPromise
empty_value_display: SafeString
@property
def include_empty_choice(self) -> bool: ...
def field_admin_ordering(
self, field: RelatedField[Any, Any], request: HttpRequest, model_admin: ModelAdmin[Any]
) -> _ListOrTuple[str]: ...
def field_choices(
self, field: RelatedField[Any, Any], request: HttpRequest, model_admin: ModelAdmin[Any]
) -> list[tuple[str, _StrOrPromise]]: ...
class BooleanFieldListFilter(FieldListFilter):
lookup_kwarg: str
lookup_kwarg2: str
lookup_val: str | None
lookup_val2: str | None
class ChoicesFieldListFilter(FieldListFilter):
lookup_kwarg: str
lookup_kwarg_isnull: str
lookup_val: str | None
lookup_val_isnull: str | None
class DateFieldListFilter(FieldListFilter):
field_generic: str
date_params: dict[str, str]
lookup_kwarg_since: str
lookup_kwarg_until: str
links: tuple[tuple[_StrOrPromise, dict[str, bool | date | datetime]], ...]
lookup_kwarg_isnull: str
class AllValuesFieldListFilter(FieldListFilter):
lookup_kwarg: str
lookup_kwarg_isnull: str
lookup_val: str | None
lookup_val_isnull: str | None
empty_value_display: SafeString
lookup_choices: QuerySet[Any]
class RelatedOnlyFieldListFilter(RelatedFieldListFilter): ...
class EmptyFieldListFilter(FieldListFilter):
lookup_kwarg: str
lookup_val: str | None
def get_lookup_condition(self) -> Q: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/formfields.pyi 0000664 0000000 0000000 00000000421 15260643574 0027047 0 ustar 00root root 0000000 0000000 from typing import Any
from django.forms import NullBooleanField
from typing_extensions import override
class StrictBooleanField(NullBooleanField):
@override
def to_python(self, value: Any | None) -> bool: ...
class StrictNullBooleanField(NullBooleanField): ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/forms.pyi 0000664 0000000 0000000 00000000355 15260643574 0026051 0 ustar 00root root 0000000 0000000 from django.contrib.auth.forms import AuthenticationForm, PasswordChangeForm
class AdminAuthenticationForm(AuthenticationForm):
required_css_class: str
class AdminPasswordChangeForm(PasswordChangeForm):
required_css_class: str
typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/helpers.pyi 0000664 0000000 0000000 00000014407 15260643574 0026370 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterable, Iterator, Mapping, Sequence
from typing import Any, type_check_only
from django import forms
from django.contrib.admin.options import BaseModelAdmin, ModelAdmin
from django.db.models import Model
from django.db.models.fields import AutoField
from django.db.models.fields.reverse_related import ForeignObjectRel
from django.forms import BaseForm
from django.forms.boundfield import BoundField
from django.forms.fields import Field
from django.forms.models import ModelForm
from django.forms.utils import ErrorDict, ErrorList
from django.forms.widgets import Media, Widget
from django.utils.functional import cached_property
from django.utils.safestring import SafeString
from typing_extensions import TypedDict, override
ACTION_CHECKBOX_NAME: str
class ActionForm(forms.Form):
action: Any
select_across: Any
@type_check_only
class _PrepopulatedDict(TypedDict):
field: BoundField
dependencies: list[BoundField]
class AdminForm:
prepopulated_fields: list[_PrepopulatedDict]
model_admin: BaseModelAdmin[Any] | None
readonly_fields: Sequence[str]
form: ModelForm[Any]
fieldsets: list[tuple[Any, dict[str, list[str]]]]
def __init__(
self,
form: ModelForm[Any],
fieldsets: list[tuple[Any, dict[str, list[str]]]],
prepopulated_fields: Mapping[str, Iterable[str]],
readonly_fields: Sequence[str] | None = ...,
model_admin: BaseModelAdmin[Any] | None = ...,
) -> None: ...
def __iter__(self) -> Iterator[Fieldset]: ...
@property
def errors(self) -> ErrorDict: ...
@property
def non_field_errors(self) -> Callable[[], ErrorList]: ...
@property
def fields(self) -> dict[str, Field]: ...
@property
def is_bound(self) -> bool: ...
@property
def media(self) -> Media: ...
class Fieldset:
form: ModelForm[Any]
classes: str
description: str | None
model_admin: BaseModelAdmin[Any] | None
readonly_fields: Sequence[str]
def __init__(
self,
form: ModelForm[Any],
name: Any | None = ...,
readonly_fields: Sequence[str] = ...,
fields: Sequence[str] = ...,
classes: Iterable[str] = ...,
description: str | None = ...,
model_admin: BaseModelAdmin[Any] | None = ...,
) -> None: ...
@cached_property
def is_collapsible(self) -> bool: ...
@property
def media(self) -> Media: ...
def __iter__(self) -> Iterator[Fieldline]: ...
class Fieldline:
form: ModelForm[Any]
fields: Sequence[str]
has_visible_field: bool
model_admin: BaseModelAdmin[Any] | None
readonly_fields: Sequence[str]
def __init__(
self,
form: ModelForm[Any],
field: str | Sequence[str],
readonly_fields: Sequence[str] | None = ...,
model_admin: BaseModelAdmin[Any] | None = ...,
) -> None: ...
def __iter__(self) -> Iterator[AdminField | AdminReadonlyField]: ...
def errors(self) -> SafeString: ...
class AdminField:
field: BoundField
is_first: bool
is_checkbox: bool
is_readonly: bool
def __init__(self, form: ModelForm[Any], field: str, is_first: bool) -> None: ...
def label_tag(self) -> SafeString: ...
def errors(self) -> SafeString: ...
@type_check_only
class _FieldDictT(TypedDict):
name: str
label: str
help_text: str
field: Callable[[Model], Any] | str
is_hidden: bool
class AdminReadonlyField:
field: _FieldDictT
form: ModelForm[Any]
model_admin: BaseModelAdmin[Any] | None
is_first: bool
is_checkbox: bool
is_readonly: bool
empty_value_display: Any
def __init__(
self,
form: ModelForm[Any],
field: Callable[[Model], Any] | str,
is_first: bool,
model_admin: BaseModelAdmin[Any] | None = ...,
) -> None: ...
def label_tag(self) -> SafeString: ...
def get_admin_url(self, remote_field: ForeignObjectRel, remote_obj: Model) -> str: ...
def contents(self) -> SafeString: ...
class InlineAdminFormSet:
opts: Any
formset: Any
fieldsets: Any
model_admin: ModelAdmin[Any] | None
readonly_fields: Sequence[str]
prepopulated_fields: dict[str, Any]
classes: str
has_add_permission: bool
has_change_permission: bool
has_delete_permission: bool
has_view_permission: bool
def __init__(
self,
inline: Any,
formset: Any,
fieldsets: Any,
prepopulated_fields: dict[str, Any] | None = ...,
readonly_fields: Sequence[str] | None = ...,
model_admin: ModelAdmin[Any] | None = ...,
has_add_permission: bool = ...,
has_change_permission: bool = ...,
has_delete_permission: bool = ...,
has_view_permission: bool = ...,
) -> None: ...
def __iter__(self) -> Iterator[InlineAdminForm]: ...
def fields(self) -> Iterator[dict[str, dict[str, bool] | bool | Widget | str]]: ...
def inline_formset_data(self) -> str: ...
@property
def forms(self) -> list[BaseForm]: ...
@cached_property
def is_collapsible(self) -> bool: ...
def non_form_errors(self) -> ErrorList: ...
@property
def is_bound(self) -> bool: ...
@property
def total_form_count(self) -> Callable[[], int]: ...
@property
def media(self) -> Media: ...
class InlineAdminForm(AdminForm):
formset: Any
original: bool | None
show_url: bool
absolute_url: str | None
def __init__(
self,
formset: Any,
form: ModelForm[Any],
fieldsets: Any,
prepopulated_fields: Any,
original: bool | None,
readonly_fields: Sequence[str] | None = ...,
model_admin: BaseModelAdmin[Any] | None = ...,
view_on_site_url: str | None = ...,
) -> None: ...
@override
def __iter__(self) -> Iterator[InlineFieldset]: ...
def needs_explicit_pk_field(self) -> bool | AutoField[Any, Any]: ...
def pk_field(self) -> AdminField: ...
def fk_field(self) -> AdminField: ...
def deletion_field(self) -> AdminField: ...
class InlineFieldset(Fieldset):
formset: Any
def __init__(self, formset: Any, *args: Any, **kwargs: Any) -> None: ...
@override
def __iter__(self) -> Iterator[Fieldline]: ...
class AdminErrorList(forms.utils.ErrorList):
def __init__(self, form: ModelForm[Any], inline_formsets: Any) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/migrations/ 0000775 0000000 0000000 00000000000 15260643574 0026351 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/migrations/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0030621 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/models.pyi 0000664 0000000 0000000 00000003475 15260643574 0026214 0 ustar 00root root 0000000 0000000 import datetime as dt
from collections.abc import Iterable
from typing import Any, ClassVar, Literal, overload
from uuid import UUID
from django.contrib.auth.models import _User
from django.contrib.contenttypes.models import ContentType
from django.db import models
from django.db.models.base import Model
from django.db.models.expressions import Combinable
ADDITION: int
CHANGE: int
DELETION: int
ACTION_FLAG_CHOICES: Any
class LogEntryManager(models.Manager[LogEntry]):
@overload
def log_actions(
self,
user_id: int | str | UUID,
queryset: Iterable[Model],
action_flag: int,
change_message: str | list[Any] = "",
*,
single_object: Literal[True],
) -> LogEntry: ...
@overload
def log_actions(
self,
user_id: int | str | UUID,
queryset: Iterable[Model],
action_flag: int,
change_message: str | list[Any] = "",
*,
single_object: Literal[False] = ...,
) -> list[LogEntry]: ...
class LogEntry(models.Model):
action_time: models.DateTimeField[str | dt.datetime | dt.date | Combinable, dt.datetime]
user: models.ForeignKey[_User | Combinable, _User]
content_type: models.ForeignKey[ContentType | Combinable | None, ContentType | None]
object_id: models.TextField[str | Combinable | None, str | None]
object_repr: models.CharField[str | int | Combinable, str]
action_flag: models.PositiveSmallIntegerField[float | int | str | Combinable, int]
change_message: models.TextField[str | Combinable, str]
objects: ClassVar[LogEntryManager]
def is_addition(self) -> bool: ...
def is_change(self) -> bool: ...
def is_deletion(self) -> bool: ...
def get_change_message(self) -> str: ...
def get_edited_object(self) -> Model: ...
def get_admin_url(self) -> str | None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/options.pyi 0000664 0000000 0000000 00000047675 15260643574 0026436 0 ustar 00root root 0000000 0000000 import enum
import sys
from collections.abc import Callable, Iterable, Iterator, Mapping, Sequence
from dataclasses import dataclass
from typing import Any, ClassVar, Generic, Literal, Self, TypeAlias, cast, type_check_only
from django import forms
from django.contrib.admin.filters import FieldListFilter, ListFilter
from django.contrib.admin.models import LogEntry
from django.contrib.admin.sites import AdminSite
from django.contrib.admin.views.main import ChangeList
from django.contrib.contenttypes.models import ContentType
from django.core.checks.messages import CheckMessage
from django.core.paginator import Paginator
from django.db.models.base import Model
from django.db.models.fields import Field
from django.db.models.fields.related import ForeignKey, ManyToManyField, RelatedField
from django.db.models.options import Options
from django.db.models.query import QuerySet, _OrderByFieldName
from django.forms.fields import Field as FormField
from django.forms.fields import TypedChoiceField
from django.forms.formsets import BaseFormSet
from django.forms.models import (
BaseInlineFormSet,
BaseModelFormSet,
ModelChoiceField,
ModelForm,
ModelMultipleChoiceField,
)
from django.forms.widgets import Media, MediaDefiningClass
from django.http.request import HttpRequest
from django.http.response import HttpResponse, HttpResponseBase, HttpResponseRedirect
from django.template.response import _TemplateForResponseT
from django.urls.resolvers import URLPattern
from django.utils.datastructures import _ListOrTuple
from django.utils.functional import _StrOrPromise
from django.utils.safestring import SafeString
from typing_extensions import TypedDict, TypeVar, deprecated, override
IS_POPUP_VAR: Literal["_popup"]
SOURCE_MODEL_VAR: Literal["_source_model"]
TO_FIELD_VAR: Literal["_to_field"]
IS_FACETS_VAR: Literal["_facets"]
EMPTY_VALUE_STRING: Literal["-"]
class ShowFacets(enum.Enum):
NEVER = cast(str, ...)
ALLOW = cast(str, ...)
ALWAYS = cast(str, ...)
class ActionLocation(enum.Enum):
CHANGE_FORM = cast(str, ...)
CHANGE_LIST = cast(str, ...)
HORIZONTAL: Literal[1]
VERTICAL: Literal[2]
_Direction: TypeAlias = Literal[1, 2]
@dataclass
class Action:
func: _ActionCallable[ModelAdmin[Any], Any]
name: str
description: str
plural_description: str
locations: list[ActionLocation]
# RemovedInDjango70Warning.
@deprecated("Unpacking an action tuple is deprecated. Use Action attributes instead.")
def __iter__(self) -> Iterator[_ActionCallable[ModelAdmin[Any], Any] | str]: ...
# RemovedInDjango70Warning.
@deprecated("Using indexes on an action tuple is deprecated. Use Action attributes instead.")
def __getitem__(self, index: int) -> _ActionCallable[ModelAdmin[Any], Any] | str: ...
def get_content_type_for_model(obj: type[Model] | Model) -> ContentType: ...
def get_ul_class(radio_style: int) -> str: ...
class IncorrectLookupParameters(Exception): ...
FORMFIELD_FOR_DBFIELD_DEFAULTS: Any
csrf_protect_m: Any
_FieldGroups: TypeAlias = _ListOrTuple[str | _ListOrTuple[str]]
@type_check_only
class _OptionalFieldOpts(TypedDict, total=False):
classes: Sequence[str]
description: _StrOrPromise
@type_check_only
class _FieldOpts(_OptionalFieldOpts, total=True):
fields: _FieldGroups
_FieldsetSpec: TypeAlias = _ListOrTuple[tuple[_StrOrPromise | None, _FieldOpts]]
_ListFilterT: TypeAlias = (
type[ListFilter]
| Field[Any, Any]
| str
| tuple[Field[Any, Any] | str, type[FieldListFilter]]
| list[Field[Any, Any] | str | type[FieldListFilter]]
)
# Generic type specifically for models, for use in BaseModelAdmin and subclasses
# https://github.com/typeddjango/django-stubs/issues/482
_ModelT = TypeVar("_ModelT", bound=Model)
_DisplayT: TypeAlias = str | Callable[[_ModelT], str | bool]
_ListDisplayT: TypeAlias = _ListOrTuple[_DisplayT[_ModelT]]
# Options `form`, `list_display`, `list_display_links` and `actions` are not marked as `ClassVar` due to the
# limitations of the current type system: `ClassVar` cannot contain type variables.
class BaseModelAdmin(Generic[_ModelT], metaclass=MediaDefiningClass):
autocomplete_fields: ClassVar[_ListOrTuple[str]]
raw_id_fields: ClassVar[_ListOrTuple[str]]
fields: ClassVar[_FieldGroups | None]
exclude: ClassVar[_ListOrTuple[str] | None]
fieldsets: ClassVar[_FieldsetSpec | None]
form: type[forms.ModelForm[_ModelT]]
filter_vertical: ClassVar[_ListOrTuple[str]]
filter_horizontal: ClassVar[_ListOrTuple[str]]
radio_fields: ClassVar[Mapping[str, _Direction]]
prepopulated_fields: ClassVar[dict[str, Sequence[str]]]
formfield_overrides: ClassVar[Mapping[type[Field[Any, Any]], Mapping[str, Any]]]
readonly_fields: ClassVar[_ListOrTuple[str]]
ordering: ClassVar[_ListOrTuple[_OrderByFieldName] | None]
sortable_by: ClassVar[_ListOrTuple[str] | None]
show_full_result_count: ClassVar[bool]
checks_class: ClassVar[Any]
delete_confirmation_max_display: ClassVar[int | None]
model: type[_ModelT]
opts: Options[_ModelT]
admin_site: AdminSite
def __init__(self) -> None: ...
def check(self, **kwargs: Any) -> list[CheckMessage]: ...
def formfield_for_dbfield(
self, db_field: Field[Any, Any], request: HttpRequest, **kwargs: Any
) -> FormField | None: ...
def formfield_for_choice_field(
self, db_field: Field[Any, Any], request: HttpRequest, **kwargs: Any
) -> TypedChoiceField | None: ...
def get_field_queryset(
self, db: str | None, db_field: RelatedField[Any, Any], request: HttpRequest
) -> QuerySet[Any] | None: ...
def formfield_for_foreignkey(
self, db_field: ForeignKey[Any, Any], request: HttpRequest, **kwargs: Any
) -> ModelChoiceField[Any] | None: ...
def formfield_for_manytomany(
self, db_field: ManyToManyField[Any, Any], request: HttpRequest, **kwargs: Any
) -> ModelMultipleChoiceField[Any] | None: ...
def get_autocomplete_fields(self, request: HttpRequest) -> _ListOrTuple[str]: ...
def get_view_on_site_url(self, obj: _ModelT | None = ...) -> str | None: ...
def get_empty_value_display(self) -> SafeString: ...
def get_exclude(self, request: HttpRequest, obj: _ModelT | None = ...) -> _ListOrTuple[str] | None: ...
def get_fields(self, request: HttpRequest, obj: _ModelT | None = ...) -> _FieldGroups: ...
def get_fieldsets(self, request: HttpRequest, obj: _ModelT | None = ...) -> _FieldsetSpec: ...
def get_inlines(
self, request: HttpRequest, obj: _ModelT | None
) -> _ListOrTuple[type[InlineModelAdmin[Any, Any]]]: ...
def get_ordering(self, request: HttpRequest) -> _ListOrTuple[_OrderByFieldName]: ...
def get_readonly_fields(self, request: HttpRequest, obj: _ModelT | None = ...) -> _ListOrTuple[str]: ...
def get_prepopulated_fields(self, request: HttpRequest, obj: _ModelT | None = ...) -> dict[str, Sequence[str]]: ...
def get_queryset(self, request: HttpRequest) -> QuerySet[_ModelT]: ...
def get_sortable_by(self, request: HttpRequest) -> _ListDisplayT[_ModelT]: ...
def lookup_allowed(self, lookup: str, value: str, request: HttpRequest) -> bool: ...
def to_field_allowed(self, request: HttpRequest, to_field: str) -> bool: ...
def has_add_permission(self, request: HttpRequest) -> bool: ...
def has_change_permission(self, request: HttpRequest, obj: _ModelT | None = ...) -> bool: ...
def has_delete_permission(self, request: HttpRequest, obj: _ModelT | None = ...) -> bool: ...
def has_view_permission(self, request: HttpRequest, obj: _ModelT | None = ...) -> bool: ...
def has_view_or_change_permission(self, request: HttpRequest, obj: _ModelT | None = ...) -> bool: ...
def has_module_permission(self, request: HttpRequest) -> bool: ...
view_on_site: Callable[[_ModelT], str | None] | bool
@property
def media(self) -> Media: ...
_ModelAdmin = TypeVar("_ModelAdmin", bound=ModelAdmin[Any])
_ActionCallable: TypeAlias = Callable[[_ModelAdmin, HttpRequest, QuerySet[_ModelT]], HttpResponseBase | None]
class ModelAdmin(BaseModelAdmin[_ModelT]):
list_display: _ListDisplayT[_ModelT]
list_display_links: _ListDisplayT[_ModelT] | None
list_filter: ClassVar[_ListOrTuple[_ListFilterT]]
list_select_related: ClassVar[bool | _ListOrTuple[str]]
list_per_page: ClassVar[int]
list_max_show_all: ClassVar[int]
list_editable: ClassVar[_ListOrTuple[str]]
search_fields: ClassVar[_ListOrTuple[str]]
search_help_text: ClassVar[_StrOrPromise | None]
date_hierarchy: ClassVar[str | None]
save_as: ClassVar[bool]
save_as_continue: ClassVar[bool]
save_on_top: ClassVar[bool]
paginator: ClassVar[type]
preserve_filters: ClassVar[bool]
show_facets: ClassVar[ShowFacets]
inlines: ClassVar[_ListOrTuple[type[InlineModelAdmin[Any, Any]]]]
add_form_template: ClassVar[_TemplateForResponseT | None]
change_form_template: ClassVar[_TemplateForResponseT | None]
change_list_template: ClassVar[_TemplateForResponseT | None]
delete_confirmation_template: ClassVar[_TemplateForResponseT | None]
delete_selected_confirmation_template: ClassVar[_TemplateForResponseT | None]
object_history_template: ClassVar[_TemplateForResponseT | None]
popup_response_template: ClassVar[_TemplateForResponseT | None]
actions: Sequence[_ActionCallable[Self, _ModelT] | str] | None
action_form: ClassVar[Any]
actions_on_top: ClassVar[bool]
actions_on_bottom: ClassVar[bool]
actions_selection_counter: ClassVar[bool]
model: type[_ModelT]
opts: Options[_ModelT]
admin_site: AdminSite
def __init__(self, model: type[_ModelT], admin_site: AdminSite) -> None: ...
def get_inline_instances(
self, request: HttpRequest, obj: _ModelT | None = ...
) -> list[InlineModelAdmin[Any, Any]]: ...
def get_urls(self) -> list[URLPattern]: ...
@property
def urls(self) -> list[URLPattern]: ...
@property
@override
def media(self) -> Media: ...
def get_model_perms(self, request: HttpRequest) -> dict[str, bool]: ...
def get_form(
self, request: HttpRequest, obj: _ModelT | None = ..., change: bool = ..., **kwargs: Any
) -> type[forms.ModelForm[_ModelT]]: ...
def get_changelist(self, request: HttpRequest, **kwargs: Any) -> type[ChangeList]: ...
def get_changelist_instance(self, request: HttpRequest) -> ChangeList: ...
def get_object(self, request: HttpRequest, object_id: str, from_field: str | None = ...) -> _ModelT | None: ...
def get_changelist_form(self, request: HttpRequest, **kwargs: Any) -> type[ModelForm[_ModelT]]: ...
def get_changelist_formset(
self, request: HttpRequest, **kwargs: Any
) -> type[BaseModelFormSet[_ModelT, ModelForm[_ModelT]]]: ...
def get_formsets_with_inlines(self, request: HttpRequest, obj: _ModelT | None = ...) -> Iterator[Any]: ...
def get_paginator(
self,
request: HttpRequest,
queryset: QuerySet[Any],
per_page: int,
orphans: int = ...,
allow_empty_first_page: bool = ...,
) -> Paginator[Any]: ...
def log_addition(self, request: HttpRequest, obj: _ModelT, message: Any) -> LogEntry: ...
def log_change(self, request: HttpRequest, obj: _ModelT, message: Any) -> LogEntry: ...
def log_deletions(self, request: HttpRequest, queryset: QuerySet[_ModelT]) -> list[LogEntry]: ...
def action_checkbox(self, obj: _ModelT) -> SafeString: ...
# Django 6.0 requires Python 3.12, so the `else` branch can only ever meet
# Django 5.x: it keeps the Django 5.x action signatures.
if sys.version_info >= (3, 12):
def get_actions(
self, request: HttpRequest, action_location: ActionLocation = ...
) -> dict[str, Action | None]: ...
def get_action_choices(
self,
request: HttpRequest,
default_choices: list[tuple[str, str]] | None = ...,
action_location: ActionLocation = ...,
) -> list[tuple[str, str]]: ...
def get_action(
self,
action: _ActionCallable[Self, _ModelT] | str,
action_location: ActionLocation = ...,
) -> Action | None: ...
else:
def get_actions(self, request: HttpRequest) -> dict[str, tuple[Callable[..., str], str, str] | None]: ...
def get_action_choices(
self, request: HttpRequest, default_choices: list[tuple[str, str]] = ...
) -> list[tuple[str, str]]: ...
def get_action(self, action: Callable[..., Any] | str) -> tuple[Callable[..., str], str, str] | None: ...
def get_list_display(self, request: HttpRequest) -> _ListDisplayT[_ModelT]: ...
def get_list_display_links(
self, request: HttpRequest, list_display: _ListDisplayT[_ModelT]
) -> _ListDisplayT[_ModelT]: ...
def get_list_filter(self, request: HttpRequest) -> _ListOrTuple[_ListFilterT]: ...
def get_list_select_related(self, request: HttpRequest) -> bool | _ListOrTuple[str]: ...
def get_search_fields(self, request: HttpRequest) -> _ListOrTuple[str]: ...
def get_search_results(
self, request: HttpRequest, queryset: QuerySet[Any], search_term: str
) -> tuple[QuerySet[_ModelT], bool]: ...
def get_preserved_filters(self, request: HttpRequest) -> str: ...
def _get_edited_object_pks(self, request: HttpRequest, prefix: str) -> list[str]: ...
def _get_list_editable_queryset(self, request: HttpRequest, prefix: str) -> QuerySet[_ModelT]: ...
def construct_change_message(
self, request: HttpRequest, form: forms.Form, formsets: Iterable[BaseFormSet[Any]], add: bool = ...
) -> list[dict[str, dict[str, list[str]]]]: ...
def message_user(
self,
request: HttpRequest,
message: _StrOrPromise,
level: int | str = ...,
extra_tags: str = ...,
fail_silently: bool = ...,
) -> None: ...
def save_form(self, request: HttpRequest, form: Any, change: Any) -> Any: ...
def save_model(self, request: HttpRequest, obj: _ModelT, form: Any, change: Any) -> None: ...
def delete_model(self, request: HttpRequest, obj: _ModelT) -> None: ...
def delete_queryset(self, request: HttpRequest, queryset: QuerySet[Any]) -> None: ...
def save_formset(self, request: HttpRequest, form: Any, formset: Any, change: Any) -> None: ...
def save_related(self, request: HttpRequest, form: Any, formsets: Any, change: Any) -> None: ...
def render_change_form(
self,
request: HttpRequest,
context: dict[str, Any],
add: bool = ...,
change: bool = ...,
form_url: str = ...,
obj: _ModelT | None = ...,
) -> HttpResponse: ...
def response_add(self, request: HttpRequest, obj: _ModelT, post_url_continue: str | None = ...) -> HttpResponse: ...
def response_change(self, request: HttpRequest, obj: _ModelT) -> HttpResponse: ...
def response_post_save_add(self, request: HttpRequest, obj: _ModelT) -> HttpResponseRedirect: ...
def response_post_save_change(self, request: HttpRequest, obj: _ModelT) -> HttpResponseRedirect: ...
# Probably FileResponse cannot come from ModelAdmin views
def response_action(
self, request: HttpRequest, queryset: QuerySet[Any], action_location: ActionLocation = ...
) -> HttpResponse | None: ...
def response_delete(self, request: HttpRequest, obj_display: str, obj_id: int) -> HttpResponse: ...
def render_delete_form(self, request: HttpRequest, context: dict[str, Any]) -> HttpResponse: ...
def get_inline_formsets(
self, request: HttpRequest, formsets: list[Any], inline_instances: list[Any], obj: _ModelT | None = ...
) -> list[Any]: ...
def get_changeform_initial_data(self, request: HttpRequest) -> dict[str, str | list[str]]: ...
def changeform_view(
self,
request: HttpRequest,
object_id: str | None = ...,
form_url: str = ...,
extra_context: dict[str, Any] | None = ...,
) -> HttpResponse: ...
def add_view(
self, request: HttpRequest, form_url: str = ..., extra_context: dict[str, Any] | None = ...
) -> HttpResponse: ...
def change_view(
self, request: HttpRequest, object_id: str, form_url: str = ..., extra_context: dict[str, Any] | None = ...
) -> HttpResponse: ...
def changelist_view(self, request: HttpRequest, extra_context: dict[str, Any] | None = ...) -> HttpResponse: ...
def get_deleted_objects(
self, objs: Sequence[_ModelT] | QuerySet[_ModelT], request: HttpRequest
) -> tuple[list[str], dict[str, int], set[str], list[str]]: ...
def delete_view(
self, request: HttpRequest, object_id: str, extra_context: dict[str, Any] | None = ...
) -> HttpResponse: ...
def history_view(
self, request: HttpRequest, object_id: str, extra_context: dict[str, Any] | None = ...
) -> HttpResponse: ...
def get_formset_kwargs(
self, request: HttpRequest, obj: _ModelT, inline: InlineModelAdmin[Any, _ModelT], prefix: str
) -> dict[str, Any]: ...
_ChildModelT = TypeVar("_ChildModelT", bound=Model)
_ParentModelT = TypeVar("_ParentModelT", bound=Model)
class InlineModelAdmin(BaseModelAdmin[Any], Generic[_ChildModelT, _ParentModelT]):
model: type[_ChildModelT]
form: type[forms.ModelForm[_ChildModelT]]
fk_name: str | None
formset: type[BaseInlineFormSet[_ChildModelT, _ParentModelT, forms.ModelForm[_ChildModelT]]]
extra: int
min_num: int | None
max_num: int | None
template: str
verbose_name: _StrOrPromise | None
verbose_name_plural: _StrOrPromise | None
can_delete: bool
show_change_link: bool
classes: Sequence[str] | None
admin_site: AdminSite
parent_model: type[_ParentModelT]
opts: Options[_ChildModelT]
has_registered_model: bool
def __init__(self, parent_model: type[_ParentModelT], admin_site: AdminSite) -> None: ...
@property
@override
def media(self) -> Media: ...
def get_extra(self, request: HttpRequest, obj: _ParentModelT | None = ..., **kwargs: Any) -> int: ...
def get_min_num(self, request: HttpRequest, obj: _ParentModelT | None = ..., **kwargs: Any) -> int | None: ...
def get_max_num(self, request: HttpRequest, obj: _ParentModelT | None = ..., **kwargs: Any) -> int | None: ...
def get_formset(
self, request: HttpRequest, obj: _ParentModelT | None = ..., **kwargs: Any
) -> type[BaseInlineFormSet[_ChildModelT, _ParentModelT, forms.ModelForm[_ChildModelT]]]: ...
@override
def get_exclude(self, request: HttpRequest, obj: _ParentModelT | None = ...) -> _ListOrTuple[str] | None: ...
@override
def get_fields(self, request: HttpRequest, obj: _ParentModelT | None = ...) -> _FieldGroups: ...
@override
def get_fieldsets(self, request: HttpRequest, obj: _ParentModelT | None = ...) -> _FieldsetSpec: ...
@override
def get_inlines(
self, request: HttpRequest, obj: _ParentModelT | None
) -> _ListOrTuple[type[InlineModelAdmin[Any, Any]]]: ...
@override
def get_readonly_fields(self, request: HttpRequest, obj: _ParentModelT | None = ...) -> _ListOrTuple[str]: ...
@override
def get_prepopulated_fields(
self, request: HttpRequest, obj: _ParentModelT | None = ...
) -> dict[str, Sequence[str]]: ...
@override
def has_view_or_change_permission(self, request: HttpRequest, obj: _ParentModelT | None = ...) -> bool: ...
@override
def get_view_on_site_url(self, obj: _ChildModelT | None = ...) -> str | None: ...
view_on_site: Callable[[_ChildModelT], str | None] | bool
@override
def get_queryset(self, request: HttpRequest) -> QuerySet[_ChildModelT]: ...
@override
def has_add_permission(self, request: HttpRequest, obj: _ParentModelT | None) -> bool: ... # type: ignore[override]
@override
def has_change_permission(self, request: HttpRequest, obj: _ParentModelT | None = ...) -> bool: ...
@override
def has_delete_permission(self, request: HttpRequest, obj: _ParentModelT | None = ...) -> bool: ...
@override
def has_view_permission(self, request: HttpRequest, obj: _ParentModelT | None = ...) -> bool: ...
class StackedInline(InlineModelAdmin[_ChildModelT, _ParentModelT]):
template: str
class TabularInline(InlineModelAdmin[_ChildModelT, _ParentModelT]):
template: str
typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/sites.pyi 0000664 0000000 0000000 00000010576 15260643574 0026060 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterable, Sequence
from typing import Any
from weakref import WeakSet
from django.apps.config import AppConfig
from django.contrib.admin.models import LogEntry
from django.contrib.admin.options import ModelAdmin, _ActionCallable
from django.contrib.auth.forms import AuthenticationForm, PasswordChangeForm
from django.core.checks import CheckMessage
from django.db.models.base import Model
from django.db.models.query import QuerySet
from django.http.request import HttpRequest
from django.http.response import HttpResponse, HttpResponseBase
from django.template.response import TemplateResponse
from django.urls import URLPattern, URLResolver
from django.utils.functional import LazyObject, _StrOrPromise
from typing_extensions import TypeVar
all_sites: WeakSet[AdminSite]
_ViewType = TypeVar("_ViewType", bound=Callable[..., HttpResponseBase])
_ModelT = TypeVar("_ModelT", bound=Model)
class AdminSite:
site_title: _StrOrPromise
site_header: _StrOrPromise
index_title: _StrOrPromise
site_url: str | None
login_form: type[AuthenticationForm] | None
password_change_form: type[PasswordChangeForm] | None
index_template: str | None
app_index_template: str | None
login_template: str | None
logout_template: str | None
password_change_template: str | None
password_change_done_template: str | None
name: str
enable_nav_sidebar: bool
empty_value_display: str
final_catch_all_view: bool
_empty_value_display: str
_registry: dict[type[Model], ModelAdmin[Any]]
_global_actions: dict[str, _ActionCallable[ModelAdmin[Any], Any]]
_actions: dict[str, _ActionCallable[ModelAdmin[Any], Any]]
def __init__(self, name: str = ...) -> None: ...
def check(self, app_configs: Sequence[AppConfig] | None) -> list[CheckMessage]: ...
def register(
self,
model_or_iterable: type[_ModelT] | Iterable[type[_ModelT]],
admin_class: type[ModelAdmin[_ModelT]] | None = ...,
**options: Any,
) -> None: ...
def unregister(self, model_or_iterable: type[Model] | Iterable[type[Model]]) -> None: ...
def is_registered(self, model: type[Model]) -> bool: ...
def get_model_admin(self, model: type[_ModelT]) -> ModelAdmin[_ModelT]: ...
def add_action(self, action: _ActionCallable[ModelAdmin[_ModelT], _ModelT], name: str | None = ...) -> None: ...
def disable_action(self, name: str) -> None: ...
def get_action(self, name: str) -> _ActionCallable[ModelAdmin[_ModelT], _ModelT]: ...
@property
def actions(self) -> Iterable[tuple[str, _ActionCallable[ModelAdmin[_ModelT], _ModelT]]]: ...
def has_permission(self, request: HttpRequest) -> bool: ...
def admin_view(self, view: _ViewType, cacheable: bool = ...) -> _ViewType: ...
def get_urls(self) -> list[URLResolver | URLPattern]: ...
@property
def urls(self) -> tuple[list[URLResolver | URLPattern], str, str]: ...
def each_context(self, request: HttpRequest) -> dict[str, Any]: ...
def password_change(self, request: HttpRequest, extra_context: dict[str, Any] | None = ...) -> TemplateResponse: ...
def password_change_done(
self, request: HttpRequest, extra_context: dict[str, Any] | None = ...
) -> TemplateResponse: ...
def i18n_javascript(self, request: HttpRequest, extra_context: dict[str, Any] | None = ...) -> HttpResponse: ...
def logout(self, request: HttpRequest, extra_context: dict[str, Any] | None = ...) -> TemplateResponse: ...
def login(self, request: HttpRequest, extra_context: dict[str, Any] | None = ...) -> HttpResponse: ...
def _build_app_dict(self, request: HttpRequest, label: _StrOrPromise | None = ...) -> dict[str, Any]: ...
def get_app_list(self, request: HttpRequest, app_label: str | None = ...) -> list[Any]: ...
def index(self, request: HttpRequest, extra_context: dict[str, Any] | None = ...) -> TemplateResponse: ...
def app_index(
self, request: HttpRequest, app_label: str, extra_context: dict[str, Any] | None = ...
) -> TemplateResponse: ...
def autocomplete_view(self, request: HttpRequest) -> HttpResponse: ...
def catch_all_view(self, request: HttpRequest, url: str) -> HttpResponse: ...
def get_log_entries(self, request: HttpRequest) -> QuerySet[LogEntry]: ...
class DefaultAdminSite(LazyObject[AdminSite]): ...
# site is actually an instance of DefaultAdminSite, but it proxies through to a AdminSite
site: AdminSite
typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/templatetags/ 0000775 0000000 0000000 00000000000 15260643574 0026667 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/templatetags/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0031137 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/templatetags/admin_filters.pyi 0000664 0000000 0000000 00000000357 15260643574 0032237 0 ustar 00root root 0000000 0000000 from typing import Any
from django.utils.safestring import SafeString
register: Any
def to_object_display_value(value: Any) -> str: ...
def truncated_unordered_list(value: Any, max_items: int, autoescape: bool = ...) -> SafeString: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/templatetags/admin_list.pyi 0000664 0000000 0000000 00000003710 15260643574 0031536 0 ustar 00root root 0000000 0000000 from collections.abc import Iterator
from typing import Any
from django.contrib.admin.filters import FieldListFilter
from django.contrib.admin.views.main import ChangeList
from django.db.models.base import Model
from django.forms.boundfield import BoundField
from django.forms.models import ModelForm
from django.template.base import Parser, Token
from django.template.context import RequestContext
from django.utils.safestring import SafeString
from .base import InclusionAdminNode
register: Any
def paginator_number(cl: ChangeList, i: int) -> SafeString: ...
def pagination(cl: ChangeList) -> dict[str, Any]: ...
def pagination_tag(parser: Parser, token: Token) -> InclusionAdminNode: ...
def result_headers(cl: ChangeList) -> Iterator[dict[str, int | str | None]]: ...
def items_for_result(cl: ChangeList, result: Model, form: ModelForm[Any] | None) -> Iterator[SafeString]: ...
class ResultList(list[Any]):
form: ModelForm[Any] | None
def __init__(self, form: ModelForm[Any] | None, *items: Any) -> None: ...
def results(cl: ChangeList) -> Iterator[ResultList]: ...
def result_hidden_fields(cl: ChangeList) -> Iterator[BoundField]: ...
def result_list(
cl: ChangeList,
) -> dict[str, list[dict[str, int | str | None]] | list[ResultList] | list[BoundField] | ChangeList | int]: ...
def result_list_tag(parser: Parser, token: Token) -> InclusionAdminNode: ...
def date_hierarchy(cl: ChangeList) -> dict[str, Any] | None: ...
def date_hierarchy_tag(parser: Parser, token: Token) -> InclusionAdminNode: ...
def search_form(cl: ChangeList) -> dict[str, bool | ChangeList | str]: ...
def search_form_tag(parser: Parser, token: Token) -> InclusionAdminNode: ...
def admin_list_filter(cl: ChangeList, spec: FieldListFilter) -> SafeString: ...
def admin_actions(context: RequestContext) -> RequestContext: ...
def admin_actions_tag(parser: Parser, token: Token) -> InclusionAdminNode: ...
def change_list_object_tools_tag(parser: Parser, token: Token) -> InclusionAdminNode: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/templatetags/admin_modify.pyi 0000664 0000000 0000000 00000001401 15260643574 0032045 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.admin.helpers import InlineAdminForm
from django.template.base import Parser, Token
from django.template.context import Context, RequestContext
from .base import InclusionAdminNode
register: Any
def prepopulated_fields_js(context: RequestContext) -> RequestContext: ...
def prepopulated_fields_js_tag(parser: Parser, token: Token) -> InclusionAdminNode: ...
def submit_row(context: RequestContext) -> Context: ...
def submit_row_tag(parser: Parser, token: Token) -> InclusionAdminNode: ...
def change_form_object_tools_tag(parser: Parser, token: Token) -> InclusionAdminNode: ...
def cell_count(inline_admin_form: InlineAdminForm) -> int: ...
def admin_actions_tag(parser: Parser, token: Token) -> InclusionAdminNode: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/templatetags/admin_urls.pyi 0000664 0000000 0000000 00000001001 15260643574 0031537 0 ustar 00root root 0000000 0000000 from typing import Any
from uuid import UUID
from django.db.models.options import Options
from django.template.context import RequestContext
from django.utils.safestring import SafeString
register: Any
def admin_urlname(value: Options[Any], arg: SafeString) -> str: ...
def admin_urlquote(value: int | str | UUID) -> int | str | UUID: ...
def add_preserved_filters(
context: dict[str, Options[Any] | str] | RequestContext,
url: str,
popup: bool = ...,
to_field: str | None = ...,
) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/templatetags/base.pyi 0000664 0000000 0000000 00000001342 15260643574 0030324 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any
from django.template.base import Parser, Token
from django.template.context import Context
from django.template.library import InclusionNode
from django.utils.safestring import SafeString
from typing_extensions import override
class InclusionAdminNode(InclusionNode):
args: list[Any]
func: Callable[..., Any]
kwargs: dict[str, Any]
takes_context: bool
template_name: str
def __init__(
self,
name: str,
parser: Parser,
token: Token,
func: Callable[..., Any],
template_name: str,
takes_context: bool = ...,
) -> None: ...
@override
def render(self, context: Context) -> SafeString: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/templatetags/log.pyi 0000664 0000000 0000000 00000000756 15260643574 0030203 0 ustar 00root root 0000000 0000000 from typing import Any
from django import template
from django.template.base import Parser, Token
from django.template.context import Context
from typing_extensions import override
register: Any
class AdminLogNode(template.Node):
limit: str
user: str
varname: str
def __init__(self, limit: str, varname: str, user: str | None) -> None: ...
@override
def render(self, context: Context) -> str: ...
def get_admin_log(parser: Parser, token: Token) -> AdminLogNode: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/tests.pyi 0000664 0000000 0000000 00000003330 15260643574 0026061 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from contextlib import AbstractContextManager
from typing import Any
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from django.test.selenium import SeleniumTestCase
from django.utils.csp import CSP as CSP
from django.utils.functional import _StrOrPromise
class AdminSeleniumTestCase(SeleniumTestCase, StaticLiveServerTestCase):
def wait_until(self, callback: Callable[..., Any], timeout: int = 10) -> None: ...
def wait_for_and_switch_to_popup(self, num_windows: int = 2, timeout: int = 10) -> None: ...
def wait_for(self, css_selector: str, timeout: int = 10) -> None: ...
def wait_for_text(self, css_selector: str, text: str, timeout: int = 10) -> None: ...
def wait_for_value(self, css_selector: str, text: str, timeout: int = 10) -> None: ...
def wait_until_visible(self, css_selector: str, timeout: int = 10) -> None: ...
def wait_until_invisible(self, css_selector: str, timeout: int = 10) -> None: ...
def wait_page_ready(self, timeout: int = 10) -> None: ...
def wait_page_loaded(self, timeout: int = 10) -> AbstractContextManager[None]: ...
def trigger_resize(self) -> None: ...
def admin_login(self, username: str, password: str, login_url: _StrOrPromise = "/admin/") -> None: ...
def select_option(self, selector: str, value: Any) -> None: ...
def deselect_option(self, selector: str, value: Any) -> None: ...
def assertCountSeleniumElements(self, selector: str, count: int, root_element: Any = None) -> None: ...
def assertSelectOptions(self, selector: str, values: Any) -> None: ...
def assertSelectedOptions(self, selector: str, values: Any) -> None: ...
def is_disabled(self, selector: str) -> bool: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/utils.pyi 0000664 0000000 0000000 00000011514 15260643574 0026062 0 ustar 00root root 0000000 0000000 from collections import defaultdict
from collections.abc import Callable, Iterable, Sequence
from re import Pattern
from typing import Any, Literal, overload, type_check_only
from uuid import UUID
from django.contrib.admin.options import BaseModelAdmin, _DisplayT, _FieldGroups, _FieldsetSpec, _ListDisplayT, _ModelT
from django.contrib.admin.sites import AdminSite
from django.db.models.base import Model
from django.db.models.deletion import Collector
from django.db.models.fields import Field, reverse_related
from django.db.models.options import Options
from django.db.models.query import QuerySet
from django.db.models.query_utils import Q
from django.forms.forms import BaseForm, Form
from django.forms.formsets import BaseFormSet
from django.http.request import HttpRequest
from django.utils.datastructures import _IndexableCollection
from typing_extensions import TypedDict, TypeVar, override
_T = TypeVar("_T")
QUOTE_MAP: dict[int, str]
UNQUOTE_MAP: dict[str, str]
UNQUOTE_RE: Pattern[str]
class FieldIsAForeignKeyColumnName(Exception): ...
def lookup_spawns_duplicates(opts: Options[Any], lookup_path: str) -> bool: ...
def get_last_value_from_parameters(parameters: dict[str, list[str] | str], key: str) -> str | None: ...
@overload
def prepare_lookup_value(key: str, value: list[str], separator: str = ...) -> list[str] | list[bool]: ...
@overload
def prepare_lookup_value(key: str, value: str, separator: str = ...) -> str | bool | list[str]: ...
@overload
def prepare_lookup_value(key: str, value: _T, separator: str = ...) -> _T: ...
def build_q_object_from_lookup_parameters(parameters: dict[str, Iterable[object]]) -> Q: ...
def quote(s: int | str | UUID) -> str: ...
def unquote(s: str) -> str: ...
@overload
def flatten(fields: _FieldGroups) -> list[str]: ...
@overload
def flatten(fields: _ListDisplayT[_ModelT]) -> list[_DisplayT[_ModelT]]: ...
def flatten_fieldsets(fieldsets: _FieldsetSpec) -> list[str]: ...
def get_deleted_objects(
objs: Sequence[Model | None] | QuerySet[Model], request: HttpRequest, admin_site: AdminSite
) -> tuple[list[str], dict[str, int], set[str], list[str]]: ...
class NestedObjects(Collector):
edges: dict[Model, list[Model]]
protected: set[Model]
model_objs: defaultdict[str, set[Model]]
@override
def __init__(self, *args: object, force_collection: bool = ..., **kwargs: object) -> None: ...
def add_edge(self, source: Model | None, target: Model) -> None: ...
@override
def collect( # type: ignore[override]
self,
objs: _IndexableCollection[Model | None],
source: type[Model] | None = ...,
source_attr: str | None = ...,
*,
nullable: bool = ...,
collect_related: bool = ...,
reverse_dependency: bool = ...,
keep_parents: bool = ...,
fail_on_restricted: bool = ...,
) -> None: ...
@override
def related_objects(
self, related_model: type[Model], related_fields: Iterable[Field[Any, Any]], objs: _IndexableCollection[Model]
) -> QuerySet[Model]: ...
@overload
def nested(self, format_callback: None = None) -> list[Any]: ...
@overload
def nested(self, format_callback: Callable[[Model], _T]) -> list[Any]: ...
@type_check_only
class _ModelFormatDict(TypedDict):
verbose_name: str
verbose_name_plural: str
def model_format_dict(obj: Model | type[Model] | QuerySet[Any] | Options[Model]) -> _ModelFormatDict: ...
def model_ngettext(obj: Options[Any] | QuerySet[Any], n: int | None = ...) -> str: ...
def lookup_field(
name: Callable[..., Any] | str, obj: Model, model_admin: BaseModelAdmin[Any] | None = ...
) -> tuple[Field[Any, Any] | None, str | None, Any]: ...
@overload
def label_for_field(
name: Callable[..., Any] | str,
model: type[Model],
model_admin: BaseModelAdmin[Any] | None = ...,
return_attr: Literal[True] = True,
form: BaseForm | None = ...,
) -> tuple[str, Callable[..., Any] | str | None]: ...
@overload
def label_for_field(
name: Callable[..., Any] | str,
model: type[Model],
model_admin: BaseModelAdmin[Any] | None = ...,
return_attr: Literal[False] = False,
form: BaseForm | None = ...,
) -> str: ...
def help_text_for_field(name: str, model: type[Model]) -> str: ...
def display_for_field(
value: Any, field: Field[Any, Any], empty_value_display: str, avoid_link: bool = False
) -> str: ...
def display_for_value(value: Any, empty_value_display: str, boolean: bool = ...) -> str: ...
class NotRelationField(Exception): ...
def get_model_from_relation(field: Field[Any, Any] | reverse_related.ForeignObjectRel) -> type[Model]: ...
def reverse_field_path(model: type[Model], path: str) -> tuple[type[Model], str]: ...
def get_fields_from_path(model: type[Model], path: str) -> list[Field[Any, Any]]: ...
def construct_change_message(
form: Form, formsets: Iterable[BaseFormSet[Any]], add: bool
) -> list[dict[str, dict[str, list[str]]]]: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/views/ 0000775 0000000 0000000 00000000000 15260643574 0025332 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/views/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0027602 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/views/autocomplete.pyi 0000664 0000000 0000000 00000001371 15260643574 0030560 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.admin.options import ModelAdmin
from django.contrib.admin.sites import AdminSite
from django.db.models import Model
from django.db.models.fields.related import ForeignKey
from django.http.request import HttpRequest
from django.views.generic.list import BaseListView
class AutocompleteJsonView(BaseListView[Any]):
admin_site: AdminSite | None
model_admin: ModelAdmin[Any]
source_field: ForeignKey[Any, Any]
term: str
def serialize_result(self, obj: Model, to_field_name: str) -> dict[str, str]: ...
def process_request(self, request: HttpRequest) -> tuple[str, ModelAdmin[Any], ForeignKey[Any, Any], str]: ...
def has_perm(self, request: HttpRequest, obj: Model | None = ...) -> bool: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/views/decorators.pyi 0000664 0000000 0000000 00000001003 15260643574 0030214 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any, overload
from django.utils.functional import _StrOrPromise
from typing_extensions import TypeVar
_C = TypeVar("_C", bound=Callable[..., Any])
@overload
def staff_member_required(
view_func: _C = ..., redirect_field_name: str | None = ..., login_url: _StrOrPromise = ...
) -> _C: ...
@overload
def staff_member_required(
view_func: None = None, redirect_field_name: str | None = ..., login_url: _StrOrPromise = ...
) -> Callable[..., Any]: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/views/main.pyi 0000664 0000000 0000000 00000006664 15260643574 0027015 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterable, Sequence
from typing import Any, Literal
from django import forms
from django.contrib.admin.filters import ListFilter
from django.contrib.admin.options import ModelAdmin, _ListDisplayT, _ListFilterT
from django.db.models.base import Model
from django.db.models.options import Options
from django.db.models.query import QuerySet, _OrderByFieldName
from django.forms.formsets import BaseFormSet
from django.http.request import HttpRequest
ALL_VAR: str
ORDER_VAR: str
PAGE_VAR: str
SEARCH_VAR: str
ERROR_FLAG: str
IGNORED_PARAMS: tuple[str, ...]
class ChangeListSearchForm(forms.Form): ...
class ChangeList:
search_form_class: type[forms.Form]
model: type[Model]
opts: Options[Any]
lookup_opts: Options[Any]
root_queryset: QuerySet[Any]
list_display: _ListDisplayT[Any]
list_display_links: _ListDisplayT[Any]
list_filter: Sequence[_ListFilterT]
date_hierarchy: Any
search_fields: Sequence[str]
search_help_text: str | None
list_select_related: bool | Sequence[str]
list_per_page: int
list_max_show_all: int
model_admin: ModelAdmin[Any]
preserved_filters: str
sortable_by: Sequence[str] | None
page_num: int
show_all: bool
is_popup: bool
add_facets: bool
is_facets_optional: bool
to_field: Any
params: dict[str, Any]
filter_params: dict[str, list[str]]
remove_facet_link: str
add_facet_link: str
list_editable: Sequence[str]
query: str
queryset: Any
title: str
pk_attname: str
formset: BaseFormSet[Any] | None
def __init__(
self,
request: HttpRequest,
model: type[Model],
list_display: _ListDisplayT[Any],
list_display_links: _ListDisplayT[Any],
list_filter: Sequence[_ListFilterT],
date_hierarchy: str | None,
search_fields: Sequence[str],
list_select_related: bool | Sequence[str],
list_per_page: int,
list_max_show_all: int,
list_editable: Sequence[str],
model_admin: ModelAdmin[Any],
sortable_by: Sequence[str] | None,
search_help_text: str | None,
) -> None: ...
def get_filters_params(self, params: dict[str, Any] | None = ...) -> dict[str, Any]: ...
def get_filters(self, request: HttpRequest) -> tuple[list[ListFilter], bool, dict[str, bool | str], bool, bool]: ...
def get_query_string(self, new_params: dict[str, Any] | None = ..., remove: Iterable[str] | None = ...) -> str: ...
result_count: int
show_full_result_count: bool
show_admin_actions: bool
full_result_count: int | None
result_list: Any
can_show_all: bool
multi_page: bool
paginator: Any
def get_results(self, request: HttpRequest) -> None: ...
def get_ordering_field(self, field_name: Callable[..., Any] | str) -> _OrderByFieldName | None: ...
def get_ordering(self, request: HttpRequest, queryset: QuerySet[Any]) -> list[_OrderByFieldName]: ...
def get_ordering_field_columns(self) -> dict[int, Literal["desc", "asc"]]: ...
def get_queryset(
self, request: HttpRequest, exclude_parameters: list[str | None] | None = ...
) -> QuerySet[Any]: ...
filter_specs: list[ListFilter]
has_filters: bool
has_active_filters: bool
clear_all_filters_qs: str
def apply_select_related(self, qs: QuerySet[Any]) -> QuerySet[Any]: ...
def get_select_related_fields(self) -> list[str]: ...
def url_for_result(self, result: Model) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/widgets.pyi 0000664 0000000 0000000 00000014674 15260643574 0026402 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable, Mapping, Sequence
from typing import Any
from django import forms
from django.contrib.admin.sites import AdminSite
from django.core.files.base import File
from django.db.models.fields.reverse_related import ManyToManyRel, ManyToOneRel
from django.forms.models import ModelChoiceIterator
from django.forms.widgets import ChoiceWidget, Media, _OptAttrs
from django.utils.choices import _Choices
from django.utils.functional import _StrOrPromise
from typing_extensions import override
class FilteredSelectMultiple(forms.SelectMultiple):
verbose_name: _StrOrPromise
is_stacked: bool
def __init__(
self,
verbose_name: _StrOrPromise,
is_stacked: bool,
attrs: _OptAttrs | None = ...,
choices: _Choices = ...,
) -> None: ...
class Media:
js: list[str]
class DateTimeWidgetContextMixin:
def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ...
class BaseAdminDateWidget(DateTimeWidgetContextMixin, forms.DateInput):
def __init__(self, attrs: _OptAttrs | None = ..., format: str | None = ...) -> None: ...
class Media:
js: list[str]
class AdminDateWidget(BaseAdminDateWidget):
template_name: str
class BaseAdminTimeWidget(DateTimeWidgetContextMixin, forms.TimeInput):
def __init__(self, attrs: _OptAttrs | None = ..., format: str | None = ...) -> None: ...
class Media:
js: list[str]
class AdminTimeWidget(BaseAdminTimeWidget):
template_name: str
class AdminSplitDateTime(forms.SplitDateTimeWidget):
template_name: str
def __init__(self, attrs: _OptAttrs | None = ...) -> None: ...
@override
def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ...
class AdminRadioSelect(forms.RadioSelect): ...
class AdminFileWidget(forms.ClearableFileInput): ...
def url_params_from_lookup_dict(lookups: Any) -> dict[str, str]: ...
class ForeignKeyRawIdWidget(forms.TextInput):
rel: ManyToOneRel
admin_site: AdminSite
db: str | None
def __init__(
self,
rel: ManyToOneRel,
admin_site: AdminSite,
attrs: _OptAttrs | None = ...,
using: str | None = ...,
) -> None: ...
def base_url_parameters(self) -> dict[str, str]: ...
@override
def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ...
def url_parameters(self) -> dict[str, str]: ...
def label_and_url_for_value(self, value: Any) -> tuple[str, str]: ...
class ManyToManyRawIdWidget(ForeignKeyRawIdWidget):
rel: ManyToManyRel # type: ignore[assignment]
def __init__(
self,
rel: ManyToManyRel,
admin_site: AdminSite,
attrs: _OptAttrs | None = ...,
using: str | None = ...,
) -> None: ...
@override
def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ...
@override
def url_parameters(self) -> dict[str, str]: ...
@override
def label_and_url_for_value(self, value: Any) -> tuple[str, str]: ...
@override
def format_value(self, value: Any) -> str: ...
@override
def value_from_datadict(
self, data: Mapping[str, Any], files: Mapping[str, Iterable[File[Any]]], name: str
) -> Any: ...
class RelatedFieldWidgetWrapper(forms.Widget):
template_name: str
widget: ChoiceWidget
rel: ManyToOneRel
can_add_related: bool
can_change_related: bool
can_delete_related: bool
can_view_related: bool
admin_site: AdminSite
def __init__(
self,
widget: ChoiceWidget,
rel: ManyToOneRel,
admin_site: AdminSite,
can_add_related: bool | None = ...,
can_change_related: bool = ...,
can_delete_related: bool = ...,
can_view_related: bool = ...,
) -> None: ...
@property
@override
def is_hidden(self) -> bool: ...
@property
def choices(self) -> ModelChoiceIterator[Any]: ...
@choices.setter
def choices(self, value: ModelChoiceIterator[Any]) -> None: ...
def get_related_url(self, info: tuple[str, str], action: str, *args: Any) -> str: ...
@override
def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ...
@override
def value_from_datadict(
self, data: Mapping[str, Any], files: Mapping[str, Iterable[File[Any]]], name: str
) -> Any: ...
@override
def value_omitted_from_data(
self, data: Mapping[str, Any], files: Mapping[str, Iterable[File[Any]]], name: str
) -> bool: ...
@override
def id_for_label(self, id_: str) -> str: ...
class AdminTextareaWidget(forms.Textarea):
def __init__(self, attrs: _OptAttrs | None = ...) -> None: ...
class AdminTextInputWidget(forms.TextInput):
def __init__(self, attrs: _OptAttrs | None = ...) -> None: ...
class AdminEmailInputWidget(forms.EmailInput):
def __init__(self, attrs: _OptAttrs | None = ...) -> None: ...
class AdminURLFieldWidget(forms.URLInput):
template_name: str
def __init__(self, attrs: _OptAttrs | None = ..., validator_class: Any = ...) -> None: ...
@override
def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ...
class AdminIntegerFieldWidget(forms.NumberInput):
def __init__(self, attrs: _OptAttrs | None = ...) -> None: ...
class_name: str
class AdminBigIntegerFieldWidget(AdminIntegerFieldWidget):
class_name: str
class AdminUUIDInputWidget(forms.TextInput):
def __init__(self, attrs: _OptAttrs | None = ...) -> None: ...
SELECT2_TRANSLATIONS: dict[str, str]
def get_select2_language() -> str | None: ...
class AutocompleteMixin:
url_name: str
field: Any
admin_site: AdminSite
db: str | None
choices: Any
attrs: _OptAttrs
def __init__(
self,
field: Any,
admin_site: AdminSite,
attrs: _OptAttrs | None = ...,
choices: Any = ...,
using: str | None = ...,
) -> None: ...
@property
def media(self) -> Media: ...
def get_url(self) -> str: ...
def build_attrs(self, base_attrs: _OptAttrs, extra_attrs: _OptAttrs | None = ...) -> dict[str, Any]: ...
# typo in source: `attr` instead of `attrs`
def optgroups(
self, name: str, value: Sequence[str], attr: _OptAttrs | None = ...
) -> list[tuple[str | None, list[dict[str, Any]], int | None]]: ...
class AutocompleteSelect(AutocompleteMixin, forms.Select): ...
class AutocompleteSelectMultiple(AutocompleteMixin, forms.SelectMultiple): ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/admindocs/ 0000775 0000000 0000000 00000000000 15260643574 0025046 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/admindocs/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0027316 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/admindocs/apps.pyi 0000664 0000000 0000000 00000000201 15260643574 0026525 0 ustar 00root root 0000000 0000000 from typing import Any
from django.apps import AppConfig
class AdminDocsConfig(AppConfig):
name: str
verbose_name: Any
typeddjango-django-stubs-fa03b48/django-stubs/contrib/admindocs/middleware.pyi 0000664 0000000 0000000 00000000750 15260643574 0027710 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any
from django.http.request import HttpRequest
from django.http.response import HttpResponse, HttpResponseBase
from django.utils.deprecation import MiddlewareMixin
class XViewMiddleware(MiddlewareMixin):
def process_view(
self,
request: HttpRequest,
view_func: Callable[..., HttpResponseBase],
view_args: tuple[Any, ...],
view_kwargs: dict[str, Any],
) -> HttpResponse | None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/admindocs/urls.pyi 0000664 0000000 0000000 00000000074 15260643574 0026557 0 ustar 00root root 0000000 0000000 from django.urls import _AnyURL
urlpatterns: list[_AnyURL]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/admindocs/utils.pyi 0000664 0000000 0000000 00000002246 15260643574 0026735 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from re import Pattern
from typing import Any
from django.utils.safestring import SafeString
docutils_is_available: bool
def get_view_name(view_func: Callable[..., Any]) -> str: ...
def parse_docstring(docstring: str) -> tuple[str, str, dict[str, str]]: ...
def parse_rst(text: str, default_reference_context: Any, thing_being_parsed: Any | None = ...) -> SafeString: ...
ROLES: dict[str, str]
explicit_title_re: Pattern[str]
def split_explicit_title(text: str) -> tuple[bool, str, str]: ...
def create_reference_role(rolename: str, urlbase: str) -> None: ...
def default_reference_role(
name: str,
rawtext: str,
text: str,
lineno: Any,
inliner: Any,
options: Any | None = ...,
content: Any | None = ...,
) -> tuple[list[Any], list[Any]]: ...
named_group_matcher: Pattern[str]
unnamed_group_matcher: Pattern[str]
non_capturing_group_matcher: Pattern[str]
def replace_metacharacters(pattern: str) -> str: ...
def replace_named_groups(pattern: str) -> str: ...
def replace_unnamed_groups(pattern: str) -> str: ...
def remove_non_capturing_groups(pattern: str) -> str: ...
def strip_p_tags(value: str) -> SafeString: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/admindocs/views.pyi 0000664 0000000 0000000 00000002425 15260643574 0026731 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterable
from re import Pattern
from typing import Any
from django.contrib.auth.models import AbstractBaseUser, AnonymousUser
from django.db.models import Model
from django.db.models.fields import Field
from django.db.models.options import Options
from django.urls import _AnyURL
from django.views.generic import TemplateView
MODEL_METHODS_EXCLUDE: Any
class BaseAdminDocsView(TemplateView): ...
class BookmarkletsView(BaseAdminDocsView): ...
class TemplateTagIndexView(BaseAdminDocsView): ...
class TemplateFilterIndexView(BaseAdminDocsView): ...
class ViewIndexView(BaseAdminDocsView): ...
class ViewDetailView(BaseAdminDocsView): ...
def user_has_model_view_permission(user: AbstractBaseUser | AnonymousUser, opts: Options[Model]) -> bool: ...
class ModelIndexView(BaseAdminDocsView): ...
class ModelDetailView(BaseAdminDocsView): ...
class TemplateDetailView(BaseAdminDocsView): ...
def get_return_data_type(func_name: Any) -> str: ...
def get_readable_field_data_type(field: Field[Any, Any] | str) -> str: ...
def extract_views_from_urlpatterns(
urlpatterns: Iterable[_AnyURL], base: str = ..., namespace: str | None = ...
) -> list[tuple[Callable[..., Any], Pattern[str], str | None, str | None]]: ...
def simplify_regex(pattern: str) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/ 0000775 0000000 0000000 00000000000 15260643574 0024046 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/__init__.pyi 0000664 0000000 0000000 00000003347 15260643574 0026337 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.auth.backends import BaseBackend
from django.contrib.auth.models import _AnyUser, _User, _UserModel
from django.db.models.options import Options
from django.http.request import HttpRequest
from django.test.client import Client
from .signals import user_logged_in as user_logged_in
from .signals import user_logged_out as user_logged_out
from .signals import user_login_failed as user_login_failed
SESSION_KEY: str
BACKEND_SESSION_KEY: str
HASH_SESSION_KEY: str
REDIRECT_FIELD_NAME: str
def load_backend(path: str) -> BaseBackend: ...
def get_backends() -> list[BaseBackend]: ...
def authenticate(request: HttpRequest | None = ..., **credentials: Any) -> _User | None: ...
async def aauthenticate(request: HttpRequest | None = ..., **credentials: Any) -> _User | None: ...
def login(request: HttpRequest, user: _User | None, backend: type[BaseBackend] | str | None = ...) -> None: ...
async def alogin(request: HttpRequest, user: _User | None, backend: type[BaseBackend] | str | None = ...) -> None: ...
def logout(request: HttpRequest) -> None: ...
async def alogout(request: HttpRequest) -> None: ...
def get_user_model() -> _UserModel: ...
def get_user(request: HttpRequest | Client) -> _AnyUser: ...
async def aget_user(request: HttpRequest | Client) -> _AnyUser: ...
def get_permission_codename(action: str, opts: Options[Any]) -> str: ...
def update_session_auth_hash(request: HttpRequest, user: _User) -> None: ...
async def aupdate_session_auth_hash(request: HttpRequest, user: _User) -> None: ...
def check_password_with_timing_attack_mitigation(user: _User | None, password: str | None) -> bool: ...
async def acheck_password_with_timing_attack_mitigation(user: _User | None, password: str | None) -> bool: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/admin.pyi 0000664 0000000 0000000 00000002233 15260643574 0025661 0 ustar 00root root 0000000 0000000 from typing import Any
from django import forms
from django.contrib import admin
from django.contrib.auth.models import Group, _UserType
from django.db.models.fields.related import ManyToManyField
from django.forms.models import ModelMultipleChoiceField
from django.http.request import HttpRequest
from django.http.response import HttpResponse
from typing_extensions import override
class GroupAdmin(admin.ModelAdmin[Group]):
@override
def formfield_for_manytomany(
self, db_field: ManyToManyField[Any, Any], request: HttpRequest | None = ..., **kwargs: Any
) -> ModelMultipleChoiceField[Any] | None: ...
class UserAdmin(admin.ModelAdmin[_UserType]):
change_user_password_template: Any
add_fieldsets: Any
add_form: Any
change_password_form: Any
@override
def get_form( # type: ignore[override]
self, request: HttpRequest, obj: _UserType | None = ..., **kwargs: Any
) -> type[forms.ModelForm[_UserType]]: ...
@override
def lookup_allowed(self, lookup: str, value: str, request: HttpRequest) -> bool: ...
def user_change_password(self, request: HttpRequest, id: str, form_url: str = ...) -> HttpResponse: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/apps.pyi 0000664 0000000 0000000 00000000104 15260643574 0025527 0 ustar 00root root 0000000 0000000 from django.apps import AppConfig
class AuthConfig(AppConfig): ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/backends.pyi 0000664 0000000 0000000 00000005702 15260643574 0026347 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.auth.models import Permission, _AnyUser, _User, _UserModel, _UserType
from django.db.models import QuerySet
from django.db.models.base import Model
from django.http.request import HttpRequest
from typing_extensions import override
UserModel = _UserModel
class BaseBackend:
def authenticate(self, request: HttpRequest | None, **kwargs: Any) -> _User | None: ...
async def aauthenticate(self, request: HttpRequest | None, **kwargs: Any) -> _User | None: ...
def get_user(self, user_id: Any) -> _User | None: ...
async def aget_user(self, user_id: Any) -> _User | None: ...
def get_user_permissions(self, user_obj: _AnyUser, obj: Model | None = ...) -> set[str]: ...
async def aget_user_permissions(self, user_obj: _AnyUser, obj: Model | None = ...) -> set[str]: ...
def get_group_permissions(self, user_obj: _AnyUser, obj: Model | None = ...) -> set[str]: ...
async def aget_group_permissions(self, user_obj: _AnyUser, obj: Model | None = ...) -> set[str]: ...
def get_all_permissions(self, user_obj: _AnyUser, obj: Model | None = ...) -> set[str]: ...
async def aget_all_permissions(self, user_obj: _AnyUser, obj: Model | None = ...) -> set[str]: ...
def has_perm(self, user_obj: _AnyUser, perm: str, obj: Model | None = ...) -> bool: ...
async def ahas_perm(self, user_obj: _AnyUser, perm: str, obj: Model | None = ...) -> bool: ...
class ModelBackend(BaseBackend):
@override
def authenticate(
self, request: HttpRequest | None, username: str | None = ..., password: str | None = ..., **kwargs: Any
) -> _User | None: ...
@override
async def aauthenticate(
self, request: HttpRequest | None, username: str | None = ..., password: str | None = ..., **kwargs: Any
) -> _User | None: ...
def user_can_authenticate(self, user: _AnyUser | None) -> bool: ...
def has_module_perms(self, user_obj: _AnyUser, app_label: str) -> bool: ...
async def ahas_module_perms(self, user_obj: _AnyUser, app_label: str) -> bool: ...
def with_perm(
self,
perm: str | Permission,
is_active: bool = ...,
include_superusers: bool = ...,
obj: Model | None = ...,
) -> QuerySet[_User]: ...
class AllowAllUsersModelBackend(ModelBackend): ...
class RemoteUserBackend(ModelBackend):
create_unknown_user: bool
@override
def authenticate(self, request: HttpRequest | None, remote_user: str) -> _User | None: ... # type: ignore[override]
@override
async def aauthenticate(self, request: HttpRequest | None, remote_user: str) -> _User | None: ... # type: ignore[override]
def clean_username(self, username: str) -> str: ...
def configure_user(self, request: HttpRequest | None, user: _UserType, created: bool = ...) -> _UserType: ...
async def aconfigure_user(self, request: HttpRequest | None, user: _UserType, created: bool = ...) -> _UserType: ...
class AllowAllUsersRemoteUserBackend(RemoteUserBackend): ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/base_user.pyi 0000664 0000000 0000000 00000003605 15260643574 0026545 0 ustar 00root root 0000000 0000000 import datetime as dt
from collections.abc import Iterable
from typing import Any, ClassVar, Literal, overload
from django.db import models
from django.db.models.base import Model
from django.db.models.expressions import Combinable
from django.db.models.fields import BooleanField
from typing_extensions import TypeVar
_T = TypeVar("_T", bound=Model)
class BaseUserManager(models.Manager[_T]):
@classmethod
def normalize_email(cls, email: str | None) -> str: ...
def get_by_natural_key(self, username: str | None) -> _T: ...
async def aget_by_natural_key(self, username: str | None) -> _T: ...
class AbstractBaseUser(models.Model):
REQUIRED_FIELDS: ClassVar[list[str]]
class Meta:
abstract: ClassVar[bool]
password: models.CharField[str | int | Combinable, str]
last_login: models.DateTimeField[str | dt.datetime | dt.date | Combinable | None, dt.datetime | None]
is_active: bool | BooleanField[bool | Combinable, bool]
backend: str # Set dynamically by authenticate(), used by login()
def get_username(self) -> str: ...
def natural_key(self) -> tuple[str, ...]: ...
@property
def is_anonymous(self) -> Literal[False]: ...
@property
def is_authenticated(self) -> Literal[True]: ...
def set_password(self, raw_password: str | None) -> None: ...
def check_password(self, raw_password: str | None) -> bool: ...
async def acheck_password(self, raw_password: str | None) -> bool: ...
def set_unusable_password(self) -> None: ...
def has_usable_password(self) -> bool: ...
def get_session_auth_hash(self) -> str: ...
def get_session_auth_fallback_hash(self) -> Iterable[str]: ...
@classmethod
def get_email_field_name(cls) -> str: ...
@classmethod
@overload
def normalize_username(cls, username: str) -> str: ...
@classmethod
@overload
def normalize_username(cls, username: Any) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/checks.pyi 0000664 0000000 0000000 00000000716 15260643574 0026035 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from django.apps.config import AppConfig
from django.core.checks.messages import CheckMessage
def check_user_model(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
def check_models_permissions(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
def check_middleware(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/context_processors.pyi 0000664 0000000 0000000 00000001226 15260643574 0030540 0 ustar 00root root 0000000 0000000 from collections.abc import Iterator
from typing import Any
from django.http.request import HttpRequest
class PermLookupDict:
app_label: str
user: Any
def __init__(self, user: Any, app_label: str) -> None: ...
def __getitem__(self, perm_name: str) -> bool: ...
def __iter__(self) -> Iterator[Any]: ...
def __bool__(self) -> bool: ...
class PermWrapper:
user: Any
def __init__(self, user: Any) -> None: ...
def __getitem__(self, app_label: str) -> PermLookupDict: ...
def __iter__(self) -> Iterator[Any]: ...
def __contains__(self, perm_name: Any) -> bool: ...
def auth(request: HttpRequest) -> dict[str, Any]: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/decorators.pyi 0000664 0000000 0000000 00000002113 15260643574 0026733 0 ustar 00root root 0000000 0000000 from collections.abc import Awaitable, Callable, Iterable
from typing import overload
from django.contrib.auth.models import _AnyUser
from django.http.response import HttpResponseBase
from django.utils.functional import _StrOrPromise
from typing_extensions import TypeVar
_VIEW = TypeVar("_VIEW", bound=Callable[..., HttpResponseBase | Awaitable[HttpResponseBase]])
def user_passes_test(
test_func: Callable[[_AnyUser], bool],
login_url: _StrOrPromise | None = ...,
redirect_field_name: str | None = ...,
) -> Callable[[_VIEW], _VIEW]: ...
@overload
def login_required(
function: _VIEW,
redirect_field_name: str | None = ...,
login_url: _StrOrPromise | None = ...,
) -> _VIEW: ...
@overload
def login_required(
function: None = None,
redirect_field_name: str | None = ...,
login_url: _StrOrPromise | None = ...,
) -> Callable[[_VIEW], _VIEW]: ...
def login_not_required(view_func: _VIEW) -> _VIEW: ...
def permission_required(
perm: Iterable[str] | str, login_url: _StrOrPromise | None = ..., raise_exception: bool = ...
) -> Callable[[_VIEW], _VIEW]: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/forms.pyi 0000664 0000000 0000000 00000013175 15260643574 0025726 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable
from logging import Logger
from typing import Any, ClassVar, Generic
from django import forms
from django.contrib.auth.models import _User, _UserModel, _UserType
from django.contrib.auth.tokens import PasswordResetTokenGenerator
from django.core.exceptions import ValidationError
from django.db import models
from django.db.models.fields import _ErrorMessagesDict
from django.forms.fields import _ClassLevelWidgetT
from django.forms.widgets import Widget
from django.http.request import HttpRequest
from django.utils.functional import _StrOrPromise
from typing_extensions import override
logger: Logger
UserModel = _UserModel
class ReadOnlyPasswordHashWidget(forms.Widget):
template_name: str
@override
def get_context(self, name: str, value: Any, attrs: dict[str, Any] | None) -> dict[str, Any]: ...
class ReadOnlyPasswordHashField(forms.Field):
widget: _ClassLevelWidgetT
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
class UsernameField(forms.CharField):
@override
def to_python(self, value: Any | None) -> Any | None: ...
@override
def widget_attrs(self, widget: Widget) -> dict[str, Any]: ...
class SetPasswordMixin(Generic[_UserType]):
error_messages: _ErrorMessagesDict
@staticmethod
def create_password_fields(
label1: _StrOrPromise = ..., label2: _StrOrPromise = ...
) -> tuple[forms.CharField, forms.CharField]: ...
def validate_passwords(
self,
password1_field_name: str = ...,
password2_field_name: str = ...,
) -> None: ...
def validate_password_for_user(self, user: _UserType, password_field_name: str = "password2") -> None: ...
def set_password_and_save(
self, user: _UserType, password_field_name: str = "password1", commit: bool = True
) -> _UserType: ...
def __class_getitem__(cls, *args: Any, **kwargs: Any) -> Any: ...
class SetUnusablePasswordMixin(Generic[_UserType]):
usable_password_help_text: _StrOrPromise
@staticmethod
def create_usable_password_field(help_text: _StrOrPromise = ...) -> forms.ChoiceField: ...
def validate_passwords(
self,
password1_field_name: str = ...,
password2_field_name: str = ...,
usable_password_field_name: str = ...,
) -> None: ...
def validate_password_for_user(self, user: _UserType, **kwargs: Any) -> None: ...
def set_password_and_save(self, user: _User, commit: bool = True, **kwargs: Any) -> _User: ...
class BaseUserCreationForm(forms.ModelForm[_UserType], Generic[_UserType]):
error_messages: _ErrorMessagesDict
password1: forms.Field
password2: forms.Field
class Meta:
model: ClassVar[type[_User]]
fields: ClassVar[tuple[str, ...]]
field_classes: ClassVar[dict[str, type[forms.Field]]]
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
@override
def save(self, commit: bool = ...) -> _UserType: ...
class UserCreationForm(BaseUserCreationForm[_UserType]):
def clean_username(self) -> str: ...
class UserChangeForm(forms.ModelForm[_UserType]):
password: forms.Field
class Meta:
model: ClassVar[type[_User]]
fields: ClassVar[str]
field_classes: ClassVar[dict[str, type[forms.Field]]]
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
class AuthenticationForm(forms.Form):
username: forms.Field
password: forms.Field
error_messages: _ErrorMessagesDict
request: HttpRequest | None
user_cache: _User | None
username_field: models.Field[Any, Any]
def __init__(self, request: HttpRequest | None = ..., *args: Any, **kwargs: Any) -> None: ...
def confirm_login_allowed(self, user: _User) -> None: ...
def get_user(self) -> _User: ...
def get_invalid_login_error(self) -> ValidationError: ...
@override
def clean(self) -> dict[str, Any]: ...
class PasswordResetForm(forms.Form):
email: forms.Field
def send_mail(
self,
subject_template_name: str,
email_template_name: str,
context: dict[str, Any],
from_email: str | None,
to_email: str,
html_email_template_name: str | None = ...,
) -> None: ...
def get_users(self, email: str) -> Iterable[_User]: ...
def save(
self,
domain_override: str | None = ...,
subject_template_name: str = ...,
email_template_name: str = ...,
use_https: bool = ...,
token_generator: PasswordResetTokenGenerator = ...,
from_email: str | None = ...,
request: HttpRequest | None = ...,
html_email_template_name: str | None = ...,
extra_email_context: dict[str, str] | None = ...,
) -> None: ...
class SetPasswordForm(SetPasswordMixin[_UserType], forms.Form, Generic[_UserType]):
new_password1: forms.Field
new_password2: forms.Field
user: _UserType
def __init__(self, user: _UserType, *args: Any, **kwargs: Any) -> None: ...
def save(self, commit: bool = ...) -> _UserType: ...
class PasswordChangeForm(SetPasswordForm[_User]):
old_password: forms.Field
def clean_old_password(self) -> str: ...
class AdminPasswordChangeForm(forms.Form, Generic[_UserType]):
error_messages: _ErrorMessagesDict
required_css_class: str
usable_password_help_text: str
password1: forms.Field
password2: forms.Field
user: _UserType
def __init__(self, user: _UserType, *args: Any, **kwargs: Any) -> None: ...
def save(self, commit: bool = ...) -> _UserType: ...
@property
@override
def changed_data(self) -> list[str]: ...
class AdminUserCreationForm(SetUnusablePasswordMixin[_UserType], UserCreationForm[_UserType]):
usable_password: forms.ChoiceField = ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/handlers/ 0000775 0000000 0000000 00000000000 15260643574 0025646 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/handlers/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0030116 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/handlers/modwsgi.pyi 0000664 0000000 0000000 00000000326 15260643574 0030043 0 ustar 00root root 0000000 0000000 from typing import Any
UserModel: Any
def check_password(environ: dict[Any, Any], username: str, password: str) -> bool | None: ...
def groups_for_user(environ: dict[Any, Any], username: str) -> list[bytes]: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/hashers.pyi 0000664 0000000 0000000 00000005576 15260643574 0026243 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any
from django.utils.functional import _StrOrPromise
from typing_extensions import override
UNUSABLE_PASSWORD_PREFIX: str
UNUSABLE_PASSWORD_SUFFIX_LENGTH: int
def is_password_usable(encoded: str | None) -> bool: ...
def verify_password(password: str | None, encoded: str, preferred: str = ...) -> tuple[bool, bool]: ...
def check_password(
password: str | None, encoded: str, setter: Callable[[str], Any] | None = ..., preferred: str = ...
) -> bool: ...
async def acheck_password(
password: str | None, encoded: str, setter: Callable[[str], Any] | None = ..., preferred: str = ...
) -> bool: ...
def make_password(password: str | None, salt: str | None = ..., hasher: str | BasePasswordHasher = ...) -> str: ...
def get_hashers() -> list[BasePasswordHasher]: ...
def get_hashers_by_algorithm() -> dict[str, BasePasswordHasher]: ...
def reset_hashers(*, setting: str, **kwargs: Any) -> None: ...
def get_hasher(algorithm: str | BasePasswordHasher = ...) -> BasePasswordHasher: ...
def identify_hasher(encoded: str) -> BasePasswordHasher: ...
def mask_hash(hash: str, show: int = ..., char: str = ...) -> str: ...
def must_update_salt(salt: str, expected_entropy: int) -> bool: ...
class BasePasswordHasher:
algorithm: str | None
library: str | tuple[str, str] | None
salt_entropy: int
def salt(self) -> str: ...
def verify(self, password: str, encoded: str) -> bool: ...
def encode(self, password: str, salt: str) -> str: ...
def decode(self, encoded: str) -> dict[str, Any]: ...
def safe_summary(self, encoded: str) -> dict[_StrOrPromise, Any]: ...
def must_update(self, encoded: str) -> bool: ...
def harden_runtime(self, password: str, encoded: str) -> None: ...
class PBKDF2PasswordHasher(BasePasswordHasher):
iterations: int
digest: Any
@override
def encode(self, password: str, salt: str, iterations: int | None = ...) -> str: ...
@override
def decode(self, encoded: str) -> dict[str, str | int]: ...
class PBKDF2SHA1PasswordHasher(PBKDF2PasswordHasher): ...
class Argon2PasswordHasher(BasePasswordHasher):
time_cost: int
memory_cost: int
parallelism: int
def params(self) -> Any: ...
class BCryptSHA256PasswordHasher(BasePasswordHasher):
digest: Any
rounds: int
@override
def decode(self, encoded: str) -> dict[str, str | int]: ...
class BCryptPasswordHasher(BCryptSHA256PasswordHasher): ...
class ScryptPasswordHasher(BasePasswordHasher):
block_size: int
maxmem: int
parallelism: int
work_factor: int
@override
def encode(
self, password: str, salt: str, n: int | None = ..., r: int | None = ..., p: int | None = ...
) -> str: ...
@override
def decode(self, encoded: str) -> dict[str, str | int]: ...
class MD5PasswordHasher(BasePasswordHasher):
@override
def decode(self, encoded: str) -> dict[str, str]: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/management/ 0000775 0000000 0000000 00000000000 15260643574 0026162 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/management/__init__.pyi 0000664 0000000 0000000 00000001371 15260643574 0030446 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from typing import Any, TextIO
from django.apps.config import AppConfig
from django.apps.registry import Apps
from django.db.migrations.migration import Migration
def create_permissions(
app_config: AppConfig,
verbosity: int = ...,
interactive: bool = ...,
using: str = ...,
apps: Apps = ...,
**kwargs: Any,
) -> None: ...
def rename_permissions_after_model_rename(
app_config: AppConfig,
verbosity: int = ...,
plan: Sequence[tuple[Migration, bool]] | None = ...,
using: str = ...,
apps: Apps = ...,
stdout: TextIO = ...,
**kwargs: Any,
) -> None: ...
def get_system_username() -> str: ...
def get_default_username(check_db: bool = ..., database: str = ...) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/management/commands/ 0000775 0000000 0000000 00000000000 15260643574 0027763 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/management/commands/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0032233 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/management/commands/changepassword.pyi 0000664 0000000 0000000 00000000175 15260643574 0033521 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.management.base import BaseCommand
UserModel: Any
class Command(BaseCommand): ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/management/commands/createsuperuser.pyi 0000664 0000000 0000000 00000001253 15260643574 0033730 0 ustar 00root root 0000000 0000000 import getpass as getpass
from typing import Any
from django.contrib.auth.base_user import AbstractBaseUser
from django.core.management.base import BaseCommand
from django.db.models import Field
from django.utils.functional import cached_property
class NotRunningInTTYException(Exception): ...
PASSWORD_FIELD: str
class Command(BaseCommand):
UserModel: type[AbstractBaseUser]
username_field: Field[Any, Any]
stdin: Any
def get_input_data(self, field: Field[Any, Any], message: str, default: str | None = ...) -> str | None: ...
@cached_property
def username_is_unique(self) -> bool: ...
@cached_property
def natural_key_defined(self) -> bool: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/middleware.pyi 0000664 0000000 0000000 00000004113 15260643574 0026705 0 ustar 00root root 0000000 0000000 from collections.abc import Awaitable, Callable
from typing import Any, ClassVar, Literal
from django.contrib.auth.models import _AnyUser
from django.http import HttpRequest, HttpResponseBase, HttpResponseRedirect
from django.utils.deprecation import MiddlewareMixin, _AnyGetResponseCallable
def get_user(request: HttpRequest) -> _AnyUser: ...
async def auser(request: HttpRequest) -> _AnyUser: ...
class AuthenticationMiddleware(MiddlewareMixin):
def process_request(self, request: HttpRequest) -> None: ...
class LoginRequiredMiddleware(MiddlewareMixin):
redirect_field_name: ClassVar[str]
def process_view(
self,
request: HttpRequest,
view_func: Callable[..., HttpResponseBase],
view_args: tuple[Any, ...],
view_kwargs: dict[Any, Any],
) -> HttpResponseBase | None: ...
def get_login_url(self, view_func: Callable[..., HttpResponseBase]) -> str: ...
def get_redirect_field_name(self, view_func: Callable[..., HttpResponseBase]) -> str: ...
def handle_no_permission(
self, request: HttpRequest, view_func: Callable[..., HttpResponseBase]
) -> HttpResponseRedirect: ...
class RemoteUserMiddleware:
header: ClassVar[str]
force_logout_if_no_header: ClassVar[bool]
sync_capable: ClassVar[Literal[True]]
async_capable: ClassVar[Literal[True]]
get_response: _AnyGetResponseCallable
is_async: bool
def __init__(self, get_response: _AnyGetResponseCallable) -> None: ...
def __call__(self, request: HttpRequest) -> HttpResponseBase | Awaitable[HttpResponseBase]: ...
async def __acall__(self, request: HttpRequest) -> HttpResponseBase: ...
def clean_username(self, username: str, request: HttpRequest) -> str: ...
async def aclean_username(self, username: str, request: HttpRequest) -> str: ...
def get_username(self, request: HttpRequest) -> str: ...
def process_request(self, request: HttpRequest) -> None: ...
async def aprocess_request(self, request: HttpRequest) -> None: ...
class PersistentRemoteUserMiddleware(RemoteUserMiddleware):
force_logout_if_no_header: ClassVar[bool]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/migrations/ 0000775 0000000 0000000 00000000000 15260643574 0026222 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/migrations/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0030472 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/mixins.pyi 0000664 0000000 0000000 00000002347 15260643574 0026106 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Sequence
from typing import Any
from django import http
from django.http.response import HttpResponseBase, HttpResponseRedirect
from django.utils.functional import _StrOrPromise
class AccessMixin:
login_url: _StrOrPromise | None
permission_denied_message: _StrOrPromise
raise_exception: bool
redirect_field_name: Any
def get_login_url(self) -> str: ...
def get_permission_denied_message(self) -> _StrOrPromise: ...
def get_redirect_field_name(self) -> str: ...
def handle_no_permission(self) -> HttpResponseRedirect: ...
class LoginRequiredMixin(AccessMixin):
def dispatch(self, request: http.HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase: ...
class PermissionRequiredMixin(AccessMixin):
permission_required: Any
def get_permission_required(self) -> Sequence[str]: ...
def has_permission(self) -> bool: ...
def dispatch(self, request: http.HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase: ...
class UserPassesTestMixin(AccessMixin):
def test_func(self) -> bool | None: ...
def get_test_func(self) -> Callable[..., Any]: ...
def dispatch(self, request: http.HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/models.pyi 0000664 0000000 0000000 00000015703 15260643574 0026062 0 ustar 00root root 0000000 0000000 import datetime as dt
from collections.abc import Iterable
from typing import Any, ClassVar, Literal, Never, Self, TypeAlias
from django.contrib.auth.base_user import AbstractBaseUser as AbstractBaseUser
from django.contrib.auth.base_user import BaseUserManager as BaseUserManager
from django.contrib.auth.validators import UnicodeUsernameValidator
from django.contrib.contenttypes.models import ContentType
from django.db import models
from django.db.models import QuerySet
from django.db.models.base import Model
from django.db.models.expressions import Combinable
from django.db.models.manager import EmptyManager
from django.utils.functional import _StrOrPromise
from typing_extensions import TypeVar
# This is our "placeholder" type the mypy plugin refines to configured 'AUTH_USER_MODEL'
# wherever it is used as a type. The most recognised example of this is (probably)
# `HttpRequest.user`
_User: TypeAlias = AbstractBaseUser
_UserModel: TypeAlias = type[_User]
_AnyUser: TypeAlias = _User | AnonymousUser
# These are only needed for generic classes in order to bind to a specific implementation
_AnyUserType = TypeVar("_AnyUserType", bound=_AnyUser) # noqa: PYI018
# do not use the alias `_User` so the bound remains at `AbstractBaseUser`
_UserType = TypeVar("_UserType", bound=AbstractBaseUser)
def update_last_login(sender: _UserModel, user: _User, **kwargs: Any) -> None: ...
class PermissionManager(models.Manager[Permission]):
def get_by_natural_key(self, codename: str, app_label: str, model: str) -> Permission: ...
class Permission(models.Model):
content_type_id: int
objects: ClassVar[PermissionManager]
name: models.CharField[str | int | Combinable, str]
content_type: models.ForeignKey[ContentType | Combinable, ContentType]
codename: models.CharField[str | int | Combinable, str]
@property
def user_perm_str(self) -> str: ...
def natural_key(self) -> tuple[str, str, str]: ...
class GroupManager(models.Manager[Group]):
def get_by_natural_key(self, name: str) -> Group: ...
async def aget_by_natural_key(self, name: str) -> Group: ...
class Group(models.Model):
objects: ClassVar[GroupManager]
name: models.CharField[str | int | Combinable, str]
permissions = models.ManyToManyField(Permission)
def natural_key(self) -> tuple[str]: ...
class UserManager(BaseUserManager[_UserType]):
def create_user(
self, username: str, email: str | None = ..., password: str | None = ..., **extra_fields: Any
) -> _UserType: ...
async def acreate_user(
self, username: str, email: str | None = ..., password: str | None = ..., **extra_fields: Any
) -> _UserType: ...
def create_superuser(
self, username: str, email: str | None = ..., password: str | None = ..., **extra_fields: Any
) -> _UserType: ...
async def acreate_superuser(
self, username: str, email: str | None = ..., password: str | None = ..., **extra_fields: Any
) -> _UserType: ...
def with_perm(
self,
perm: str | Permission,
is_active: bool = ...,
include_superusers: bool = ...,
backend: str | None = ...,
obj: Model | None = ...,
) -> QuerySet[_UserType]: ...
class PermissionsMixin(models.Model):
is_superuser: models.BooleanField[bool | Combinable, bool]
groups = models.ManyToManyField(Group)
user_permissions = models.ManyToManyField(Permission)
class Meta:
abstract: ClassVar[bool]
def get_user_permissions(self, obj: Model | None = ...) -> set[str]: ...
async def aget_user_permissions(self, obj: Model | None = ...) -> set[str]: ...
def get_group_permissions(self, obj: Model | None = ...) -> set[str]: ...
async def aget_group_permissions(self, obj: Model | None = ...) -> set[str]: ...
def get_all_permissions(self, obj: Model | None = ...) -> set[str]: ...
async def aget_all_permissions(self, obj: Model | None = ...) -> set[str]: ...
def has_perm(self, perm: str, obj: Model | None = ...) -> bool: ...
async def ahas_perm(self, perm: str, obj: Model | None = ...) -> bool: ...
def has_perms(self, perm_list: Iterable[str], obj: Model | None = ...) -> bool: ...
async def ahas_perms(self, perm_list: Iterable[str], obj: Model | None = ...) -> bool: ...
def has_module_perms(self, app_label: str) -> bool: ...
async def ahas_module_perms(self, app_label: str) -> bool: ...
class AbstractUser(AbstractBaseUser, PermissionsMixin):
username_validator: UnicodeUsernameValidator
class Meta:
abstract: ClassVar[bool]
verbose_name: ClassVar[str]
verbose_name_plural: ClassVar[str]
username: models.CharField[str | int | Combinable, str]
first_name: models.CharField[str | int | Combinable, str]
last_name: models.CharField[str | int | Combinable, str]
email: models.EmailField[str | Combinable, str]
is_staff: models.BooleanField[bool | Combinable, bool]
is_active: models.BooleanField[bool | Combinable, bool]
date_joined: models.DateTimeField[str | dt.datetime | dt.date | Combinable, dt.datetime]
objects: ClassVar[UserManager[Self]]
EMAIL_FIELD: str
USERNAME_FIELD: str
def get_full_name(self) -> str: ...
def get_short_name(self) -> str: ...
def email_user(
self, subject: _StrOrPromise, message: _StrOrPromise, from_email: str | None = ..., **kwargs: Any
) -> None: ...
class User(AbstractUser): ...
class AnonymousUser:
id: None
pk: None
username: Literal[""]
is_staff: Literal[False]
is_active: Literal[False]
is_superuser: Literal[False]
def __int__(self) -> Never: ...
def save(self) -> None: ...
def delete(self) -> None: ...
def set_password(self, raw_password: str | None) -> None: ...
def check_password(self, raw_password: str | None) -> bool: ...
@property
def groups(self) -> EmptyManager[Group]: ...
@property
def user_permissions(self) -> EmptyManager[Permission]: ...
def get_user_permissions(self, obj: Model | None = ...) -> set[str]: ...
async def aget_user_permissions(self, obj: Model | None = ...) -> set[str]: ...
def get_group_permissions(self, obj: Model | None = ...) -> set[Any]: ...
async def aget_group_permissions(self, obj: Model | None = ...) -> set[Any]: ...
def get_all_permissions(self, obj: Model | None = ...) -> set[str]: ...
async def aget_all_permissions(self, obj: Model | None = ...) -> set[str]: ...
def has_perm(self, perm: str, obj: Model | None = ...) -> bool: ...
async def ahas_perm(self, perm: str, obj: Model | None = ...) -> bool: ...
def has_perms(self, perm_list: Iterable[str], obj: Model | None = ...) -> bool: ...
async def ahas_perms(self, perm_list: Iterable[str], obj: Model | None = ...) -> bool: ...
def has_module_perms(self, module: str) -> bool: ...
async def ahas_module_perms(self, module: str) -> bool: ...
@property
def is_anonymous(self) -> Literal[True]: ...
@property
def is_authenticated(self) -> Literal[False]: ...
def get_username(self) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/password_validation.pyi 0000664 0000000 0000000 00000004510 15260643574 0030645 0 ustar 00root root 0000000 0000000 from collections.abc import Mapping, Sequence
from pathlib import Path, PosixPath
from typing import Any, Protocol, type_check_only
from django.contrib.auth.models import _User
from django.utils.functional import cached_property
@type_check_only
class PasswordValidator(Protocol):
def validate(self, password: str, user: _User | None = ..., /) -> None: ...
def get_help_text(self) -> str: ...
def get_default_password_validators() -> list[PasswordValidator]: ...
def get_password_validators(validator_config: Sequence[Mapping[str, Any]]) -> list[PasswordValidator]: ...
def validate_password(
password: str, user: _User | None = ..., password_validators: Sequence[PasswordValidator] | None = ...
) -> None: ...
def password_changed(
password: str, user: _User | None = ..., password_validators: Sequence[PasswordValidator] | None = ...
) -> None: ...
def password_validators_help_texts(password_validators: Sequence[PasswordValidator] | None = ...) -> list[str]: ...
password_validators_help_text_html: Any
class MinimumLengthValidator:
min_length: int
def __init__(self, min_length: int = ...) -> None: ...
def validate(self, password: str, user: _User | None = ...) -> None: ...
def get_help_text(self) -> str: ...
def get_error_message(self) -> str: ...
def exceeds_maximum_length_ratio(password: str, max_similarity: float, value: str) -> bool: ...
class UserAttributeSimilarityValidator:
DEFAULT_USER_ATTRIBUTES: Sequence[str]
user_attributes: Sequence[str]
max_similarity: float
def __init__(self, user_attributes: Sequence[str] = ..., max_similarity: float = ...) -> None: ...
def validate(self, password: str, user: _User | None = ...) -> None: ...
def get_help_text(self) -> str: ...
def get_error_message(self) -> str: ...
class CommonPasswordValidator:
@cached_property
def DEFAULT_PASSWORD_LIST_PATH(self) -> Path: ...
passwords: set[str]
def __init__(self, password_list_path: Path | PosixPath | str = ...) -> None: ...
def validate(self, password: str, user: _User | None = ...) -> None: ...
def get_help_text(self) -> str: ...
def get_error_message(self) -> str: ...
class NumericPasswordValidator:
def validate(self, password: str, user: _User | None = ...) -> None: ...
def get_help_text(self) -> str: ...
def get_error_message(self) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/signals.pyi 0000664 0000000 0000000 00000000170 15260643574 0026227 0 ustar 00root root 0000000 0000000 from django.dispatch.dispatcher import Signal
user_logged_in: Signal
user_login_failed: Signal
user_logged_out: Signal
typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/templatetags/ 0000775 0000000 0000000 00000000000 15260643574 0026540 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/templatetags/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0031010 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/templatetags/auth.pyi 0000664 0000000 0000000 00000000251 15260643574 0030222 0 ustar 00root root 0000000 0000000 from django.template import Library
from django.utils.safestring import SafeString
register: Library
def render_password_as_hash(value: str | None) -> SafeString: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/tokens.pyi 0000664 0000000 0000000 00000001247 15260643574 0026100 0 ustar 00root root 0000000 0000000 from datetime import date, datetime
from django.contrib.auth.models import _User
class PasswordResetTokenGenerator:
key_salt: str
secret: str | bytes
secret_fallbacks: list[str | bytes]
algorithm: str | None
def make_token(self, user: _User) -> str: ...
def check_token(self, user: _User | None, token: str | None) -> bool: ...
def _make_token_with_timestamp(self, user: _User, timestamp: int, secret: str | bytes) -> str: ...
def _make_hash_value(self, user: _User, timestamp: int) -> str: ...
def _num_seconds(self, dt: datetime | date) -> int: ...
def _now(self) -> datetime: ...
default_token_generator: PasswordResetTokenGenerator
typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/urls.pyi 0000664 0000000 0000000 00000000074 15260643574 0025557 0 ustar 00root root 0000000 0000000 from django.urls import _AnyURL
urlpatterns: list[_AnyURL]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/validators.pyi 0000664 0000000 0000000 00000000231 15260643574 0026735 0 ustar 00root root 0000000 0000000 from django.core.validators import RegexValidator
class ASCIIUsernameValidator(RegexValidator): ...
class UnicodeUsernameValidator(RegexValidator): ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/views.pyi 0000664 0000000 0000000 00000006254 15260643574 0025735 0 ustar 00root root 0000000 0000000 from collections.abc import Mapping
from typing import Any
from django.contrib.auth.forms import AuthenticationForm, PasswordChangeForm, PasswordResetForm, SetPasswordForm
from django.contrib.auth.models import _User, _UserModel
from django.http.request import HttpRequest
from django.http.response import HttpResponse, HttpResponseRedirect
from django.utils.functional import _StrOrPromise
from django.views.generic.base import TemplateView
from django.views.generic.edit import FormView
from typing_extensions import TypeVar, override
UserModel = _UserModel
_AuthForm = TypeVar("_AuthForm", bound=AuthenticationForm, default=AuthenticationForm)
class RedirectURLMixin:
next_page: str | None
redirect_field_name: str
success_url_allowed_hosts: set[str]
def get_success_url(self) -> str: ...
def get_redirect_url(self, request: HttpRequest | None = None) -> str: ...
def get_success_url_allowed_hosts(self, request: HttpRequest | None = None) -> set[str]: ...
def get_default_redirect_url(self) -> str: ...
class LoginView(RedirectURLMixin, FormView[_AuthForm]):
form_class: type[AuthenticationForm] # type: ignore[assignment]
authentication_form: type[_AuthForm] | None
redirect_field_name: str
redirect_authenticated_user: bool
extra_context: Mapping[str, Any] | None
class LogoutView(RedirectURLMixin, TemplateView[HttpResponse]):
next_page: str | None
redirect_field_name: str
extra_context: Mapping[str, Any] | None
@override
def dispatch(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ...
def post(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ...
def logout_then_login(request: HttpRequest, login_url: str | None = ...) -> HttpResponseRedirect: ...
def redirect_to_login(
next: str, login_url: str | None = ..., redirect_field_name: str | None = ...
) -> HttpResponseRedirect: ...
class PasswordContextMixin:
extra_context: Mapping[str, Any] | None
def get_context_data(self, **kwargs: Any) -> dict[str, Any]: ...
class PasswordResetView(PasswordContextMixin, FormView[PasswordResetForm]):
email_template_name: str
extra_email_context: Mapping[str, Any] | None
form_class: type[PasswordResetForm]
from_email: str | None
html_email_template_name: str | None
subject_template_name: str
title: _StrOrPromise
token_generator: Any
INTERNAL_RESET_SESSION_TOKEN: str
class PasswordResetDoneView(PasswordContextMixin, TemplateView):
title: _StrOrPromise
class PasswordResetConfirmView(PasswordContextMixin, FormView[SetPasswordForm[_User]]):
form_class: type[SetPasswordForm[_User]]
post_reset_login: bool
post_reset_login_backend: str | None
reset_url_token: str
title: _StrOrPromise
token_generator: Any
validlink: bool
user: _User | None
def get_user(self, uidb64: str) -> _User | None: ...
class PasswordResetCompleteView(PasswordContextMixin, TemplateView):
title: _StrOrPromise
class PasswordChangeView(PasswordContextMixin, FormView[PasswordChangeForm]):
form_class: type[PasswordChangeForm]
title: _StrOrPromise
class PasswordChangeDoneView(PasswordContextMixin, TemplateView):
title: _StrOrPromise
typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/ 0000775 0000000 0000000 00000000000 15260643574 0025644 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0030114 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/admin.pyi 0000664 0000000 0000000 00000001544 15260643574 0027463 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.admin.checks import InlineModelAdminChecks
from django.contrib.admin.options import InlineModelAdmin
from django.contrib.contenttypes.forms import BaseGenericInlineFormSet
from django.db.models.base import Model
class GenericInlineModelAdminChecks(InlineModelAdminChecks):
def _check_exclude_of_parent_model(self, obj: GenericInlineModelAdmin, parent_model: type[Model]) -> list[Any]: ...
def _check_relation(self, obj: GenericInlineModelAdmin, parent_model: type[Model]) -> list[Any]: ...
class GenericInlineModelAdmin(InlineModelAdmin[Any, Any]):
ct_field: str
ct_fk_field: str
formset: type[BaseGenericInlineFormSet[Any, Any]] # type: ignore[assignment]
class GenericStackedInline(GenericInlineModelAdmin):
template: str
class GenericTabularInline(GenericInlineModelAdmin):
template: str
typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/apps.pyi 0000664 0000000 0000000 00000000114 15260643574 0027326 0 ustar 00root root 0000000 0000000 from django.apps import AppConfig
class ContentTypesConfig(AppConfig): ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/checks.pyi 0000664 0000000 0000000 00000000715 15260643574 0027632 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from django.apps.config import AppConfig
from django.core.checks.messages import CheckMessage
def check_generic_foreign_keys(
app_configs: Sequence[AppConfig] | None, *, databases: Sequence[str] | None = ..., **kwargs: object
) -> list[CheckMessage]: ...
def check_model_name_lengths(
app_configs: Sequence[AppConfig] | None, *, databases: Sequence[str] | None = ..., **kwargs: object
) -> list[CheckMessage]: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/fields.pyi 0000664 0000000 0000000 00000012240 15260643574 0027634 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Sequence
from typing import Any, Self, overload
from django.contrib.contenttypes.models import ContentType
from django.core.checks.messages import CheckMessage
from django.db.models.base import Model
from django.db.models.expressions import Combinable
from django.db.models.fields import Field, _AllLimitChoicesTo
from django.db.models.fields.mixins import FieldCacheMixin
from django.db.models.fields.related import ForeignObject
from django.db.models.fields.related_descriptors import ReverseManyToOneDescriptor
from django.db.models.fields.reverse_related import ForeignObjectRel
from django.db.models.query import QuerySet
from django.db.models.query_utils import FilteredRelation, PathInfo
from django.db.models.sql.where import WhereNode
from django.utils.functional import cached_property
from typing_extensions import override
class GenericForeignKey(FieldCacheMixin, Field[Any, Any]):
# django-stubs implementation only fields
_pyi_private_set_type: Any | Combinable
_pyi_private_get_type: Any
# attributes
hidden: bool
is_relation: bool
many_to_many: bool
many_to_one: bool
one_to_many: bool
one_to_one: bool
related_model: Any
ct_field: str
fk_field: str
for_concrete_model: bool
column: None
def __init__(
self, ct_field: str = "content_type", fk_field: str = "object_id", for_concrete_model: bool = True
) -> None: ...
# class access
@overload
@override
def __get__(self, instance: None, owner: Any) -> GenericForeignKeyDescriptor: ...
# Model instance access
@overload
@override
def __get__(self, instance: Model, owner: Any) -> Any | None: ...
# non-Model instances
@overload
@override
def __get__(self, instance: Any, owner: Any) -> Self: ...
name: Any
model: Any
@override
def contribute_to_class(self, cls: type[Model], name: str, **kwargs: Any) -> None: ... # type: ignore[override]
@override
def get_attname_column(self) -> tuple[str, None]: ...
@cached_property
def ct_field_attname(self) -> str: ...
@override
def get_filter_kwargs_for_object(self, obj: Model) -> dict[str, ContentType | None]: ...
def get_forward_related_filter(self, obj: Model) -> dict[str, int]: ...
@override
def check(self, **kwargs: Any) -> list[CheckMessage]: ...
def get_content_type(
self,
obj: Model | None = None,
id: int | None = None,
using: str | None = None,
model: type[Model] | None = None,
) -> ContentType: ...
class GenericForeignKeyDescriptor:
field: GenericForeignKey
def __init__(self, field: GenericForeignKey) -> None: ...
def is_cached(self, instance: Model) -> bool: ...
def get_prefetch_querysets(
self, instances: Sequence[Model] | QuerySet[Any], querysets: Sequence[QuerySet[Any]] | None = None
) -> tuple[list[Model], Callable[..., Any], Callable[..., Any], bool, str, bool]: ...
def __get__(self, instance: Model | None, cls: type[Model] | None = ...) -> Any | None: ...
def fetch_one(self, instance: Model) -> None: ...
def fetch_many(self, instances: Sequence[Model] | QuerySet[Any]) -> None: ...
def __set__(self, instance: Model, value: Any | None) -> None: ...
class GenericRel(ForeignObjectRel):
field: GenericRelation
def __init__(
self,
field: GenericRelation,
to: type[Model] | str,
related_name: str | None = None,
related_query_name: str | None = None,
limit_choices_to: _AllLimitChoicesTo | None = None,
) -> None: ...
class GenericRelation(ForeignObject[Any, Any]):
rel_class: type[GenericRel]
mti_inherited: bool
object_id_field_name: str
content_type_field_name: str
for_concrete_model: bool
def __init__(
self,
to: type[Model] | str,
object_id_field: str = "object_id",
content_type_field: str = "content_type",
for_concrete_model: bool = True,
related_query_name: str | None = None,
limit_choices_to: _AllLimitChoicesTo | None = None,
**kwargs: Any,
) -> None: ...
@override
def resolve_related_fields(self) -> list[tuple[Field[Any, Any], Field[Any, Any]]]: ...
@override
def get_local_related_value(self, instance: Model) -> tuple[Any, ...]: ...
@override
def get_foreign_related_value(self, instance: Model) -> tuple[Any, ...]: ...
@override
def get_path_info(self, filtered_relation: FilteredRelation | None = None) -> list[PathInfo]: ...
@override
def get_reverse_path_info(self, filtered_relation: FilteredRelation | None = None) -> list[PathInfo]: ...
@override
def contribute_to_class(self, cls: type[Model], name: str, **kwargs: Any) -> None: ... # type: ignore[override]
def get_content_type(self) -> ContentType: ...
@override
def get_extra_restriction(self, alias: str | None, remote_alias: str) -> WhereNode: ...
def bulk_related_objects(self, objs: list[Model], using: str = "default") -> QuerySet[Any]: ...
class ReverseGenericManyToOneDescriptor(ReverseManyToOneDescriptor[Any]): ...
def create_generic_related_manager(superclass: Any, rel: Any) -> type[Any]: ... # GenericRelatedObjectManager
typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/forms.pyi 0000664 0000000 0000000 00000003074 15260643574 0027521 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.models import Model
from django.forms.models import BaseModelFormSet, ModelForm
from typing_extensions import TypeVar, override
_M = TypeVar("_M", bound=Model)
_ModelFormT = TypeVar("_ModelFormT", bound=ModelForm[Any], default=ModelForm[_M]) # ONLY use together with _M
class BaseGenericInlineFormSet(BaseModelFormSet[_M, _ModelFormT]):
instance: Any
rel_name: Any
save_as_new: Any
def __init__(
self,
data: Any | None = ...,
files: Any | None = ...,
instance: Any | None = ...,
save_as_new: bool = ...,
prefix: Any | None = ...,
queryset: Any | None = ...,
**kwargs: Any,
) -> None: ...
@override
def initial_form_count(self) -> int: ...
@classmethod
@override
def get_default_prefix(cls) -> str: ...
@override
def save_new(self, form: Any, commit: bool = ...) -> _M: ...
def generic_inlineformset_factory(
model: type[_M],
form: type[_ModelFormT] = ...,
formset: type[BaseGenericInlineFormSet[Any, Any]] = ...,
ct_field: str = ...,
fk_field: str = ...,
fields: Any | None = ...,
exclude: Any | None = ...,
extra: int = ...,
can_order: bool = ...,
can_delete: bool = ...,
max_num: Any | None = ...,
formfield_callback: Any | None = ...,
validate_max: bool = ...,
for_concrete_model: bool = ...,
min_num: Any | None = ...,
validate_min: bool = ...,
absolute_max: int | None = ...,
can_delete_extra: bool = ...,
) -> type[BaseGenericInlineFormSet[_M, _ModelFormT]]: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/management/ 0000775 0000000 0000000 00000000000 15260643574 0027760 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/management/__init__.pyi 0000664 0000000 0000000 00000002026 15260643574 0032242 0 ustar 00root root 0000000 0000000 from typing import Any
from django.apps.config import AppConfig
from django.apps.registry import Apps
from django.db import migrations
from django.db.backends.sqlite3.schema import DatabaseSchemaEditor
from django.db.migrations.migration import Migration
from django.db.migrations.state import StateApps
class RenameContentType(migrations.RunPython):
app_label: str
old_model: str
new_model: str
def __init__(self, app_label: str, old_model: str, new_model: str) -> None: ...
def rename_forward(self, apps: StateApps, schema_editor: DatabaseSchemaEditor) -> None: ...
def rename_backward(self, apps: StateApps, schema_editor: DatabaseSchemaEditor) -> None: ...
def inject_rename_contenttypes_operations(
plan: list[tuple[Migration, bool]] | None = None, apps: Apps = ..., using: str = "default", **kwargs: Any
) -> None: ...
def create_contenttypes(
app_config: AppConfig,
verbosity: int = 2,
interactive: bool = True,
using: str = "default",
apps: Apps = ...,
**kwargs: Any,
) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/management/commands/ 0000775 0000000 0000000 00000000000 15260643574 0031561 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/management/commands/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0034031 0 ustar 00root root 0000000 0000000 remove_stale_contenttypes.pyi 0000664 0000000 0000000 00000000313 15260643574 0037526 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/management/commands from typing import Any
from django.core.management import BaseCommand
from typing_extensions import override
class Command(BaseCommand):
@override
def handle(self, **options: Any) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/migrations/ 0000775 0000000 0000000 00000000000 15260643574 0030020 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/migrations/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0032270 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/models.pyi 0000664 0000000 0000000 00000002427 15260643574 0027657 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar
from django.db import models
from django.db.models.base import Model
from django.db.models.expressions import Combinable
from django.db.models.query import QuerySet
class ContentTypeManager(models.Manager[ContentType]):
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
def get_by_natural_key(self, app_label: str, model: str) -> ContentType: ...
def get_for_model(self, model: type[Model] | Model, for_concrete_model: bool = True) -> ContentType: ...
def get_for_models(self, *models: Any, for_concrete_models: bool = True) -> dict[type[Model], ContentType]: ...
def get_for_id(self, id: int) -> ContentType: ...
def clear_cache(self) -> None: ...
class ContentType(models.Model):
id: int
app_label: models.CharField[str | int | Combinable, str]
model: models.CharField[str | int | Combinable, str]
objects: ClassVar[ContentTypeManager]
@property
def name(self) -> str: ...
@property
def app_labeled_name(self) -> str: ...
def model_class(self) -> type[Model] | None: ...
def get_object_for_this_type(self, using: str | None = None, **kwargs: Any) -> Model: ...
def get_all_objects_for_this_type(self, **kwargs: Any) -> QuerySet[Any]: ...
def natural_key(self) -> tuple[str, str]: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/prefetch.pyi 0000664 0000000 0000000 00000002335 15260643574 0030172 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from typing import Any, Generic
from django.db.models import Model, Prefetch
from django.db.models.query import QuerySet
from typing_extensions import TypeVar, override
# The type of the lookup passed to Prefetch(...)
# This will be specialized to a `LiteralString` in the plugin for further processing and validation
_LookupT = TypeVar("_LookupT", bound=str, covariant=True)
# The type of the querysets passed to GenericPrefetch(...)
_PrefetchedQuerySetsT = TypeVar(
"_PrefetchedQuerySetsT", bound=Sequence[QuerySet[Model]], covariant=True, default=list[QuerySet[Model]]
)
# The attribute name to store the prefetched list[_PrefetchedQuerySetT]
# This will be specialized to a `LiteralString` in the plugin for further processing and validation
_ToAttrT = TypeVar("_ToAttrT", bound=str, covariant=True, default=str)
class GenericPrefetch(Prefetch[Any, Any, Any], Generic[_LookupT, _PrefetchedQuerySetsT, _ToAttrT]):
def __init__(self, lookup: _LookupT, querysets: _PrefetchedQuerySetsT, to_attr: _ToAttrT | None = None) -> None: ...
@override
def __getstate__(self) -> dict[str, Any]: ...
@override
def get_current_querysets(self, level: int) -> _PrefetchedQuerySetsT | None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/views.pyi 0000664 0000000 0000000 00000000325 15260643574 0027524 0 ustar 00root root 0000000 0000000 from django.http.request import HttpRequest
from django.http.response import HttpResponseRedirect
def shortcut(request: HttpRequest, content_type_id: int | str, object_id: int | str) -> HttpResponseRedirect: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/flatpages/ 0000775 0000000 0000000 00000000000 15260643574 0025053 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/flatpages/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0027323 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/flatpages/admin.pyi 0000664 0000000 0000000 00000000453 15260643574 0026670 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar
from django.contrib import admin
from django.contrib.flatpages.models import FlatPage
class FlatPageAdmin(admin.ModelAdmin[FlatPage]):
form: Any
fieldsets: ClassVar[Any]
list_display: Any
list_filter: ClassVar[Any]
search_fields: ClassVar[Any]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/flatpages/apps.pyi 0000664 0000000 0000000 00000000201 15260643574 0026532 0 ustar 00root root 0000000 0000000 from typing import Any
from django.apps import AppConfig
class FlatPagesConfig(AppConfig):
name: str
verbose_name: Any
typeddjango-django-stubs-fa03b48/django-stubs/contrib/flatpages/forms.pyi 0000664 0000000 0000000 00000000451 15260643574 0026724 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar
from django import forms
from django.contrib.flatpages.models import FlatPage
class FlatpageForm(forms.ModelForm[FlatPage]):
url: Any
class Meta:
model: ClassVar[type[FlatPage]]
fields: ClassVar[str]
def clean_url(self) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/flatpages/middleware.pyi 0000664 0000000 0000000 00000000445 15260643574 0027716 0 ustar 00root root 0000000 0000000 from django.http.request import HttpRequest
from django.http.response import HttpResponse
from django.utils.deprecation import MiddlewareMixin
class FlatpageFallbackMiddleware(MiddlewareMixin):
def process_response(self, request: HttpRequest, response: HttpResponse) -> HttpResponse: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/flatpages/migrations/ 0000775 0000000 0000000 00000000000 15260643574 0027227 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/flatpages/migrations/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0031477 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/flatpages/models.pyi 0000664 0000000 0000000 00000001141 15260643574 0027056 0 ustar 00root root 0000000 0000000 from django.contrib.sites.models import Site
from django.db import models
from django.db.models.expressions import Combinable
class FlatPage(models.Model):
url: models.CharField[str | int | Combinable, str]
title: models.CharField[str | int | Combinable, str]
content: models.TextField[str | Combinable, str]
enable_comments: models.BooleanField[bool | Combinable, bool]
template_name: models.CharField[str | int | Combinable, str]
registration_required: models.BooleanField[bool | Combinable, bool]
sites = models.ManyToManyField(Site)
def get_absolute_url(self) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/flatpages/sitemaps.pyi 0000664 0000000 0000000 00000000220 15260643574 0027415 0 ustar 00root root 0000000 0000000 from django.contrib.flatpages.models import FlatPage
from django.contrib.sitemaps import Sitemap
class FlatPageSitemap(Sitemap[FlatPage]): ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/flatpages/templatetags/ 0000775 0000000 0000000 00000000000 15260643574 0027545 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/flatpages/templatetags/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0032015 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/flatpages/templatetags/flatpages.pyi 0000664 0000000 0000000 00000001031 15260643574 0032231 0 ustar 00root root 0000000 0000000 from typing import Any
from django import template
from django.template.base import Parser, Token
from django.template.context import Context
from typing_extensions import override
register: Any
class FlatpageNode(template.Node):
context_name: str
starts_with: None
user: None
def __init__(self, context_name: str, starts_with: str | None = ..., user: str | None = ...) -> None: ...
@override
def render(self, context: Context) -> str: ...
def get_flatpages(parser: Parser, token: Token) -> FlatpageNode: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/flatpages/urls.pyi 0000664 0000000 0000000 00000000074 15260643574 0026564 0 ustar 00root root 0000000 0000000 from django.urls import _AnyURL
urlpatterns: list[_AnyURL]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/flatpages/views.pyi 0000664 0000000 0000000 00000000465 15260643574 0026740 0 ustar 00root root 0000000 0000000 from django.contrib.flatpages.models import FlatPage
from django.http.request import HttpRequest
from django.http.response import HttpResponse
DEFAULT_TEMPLATE: str
def flatpage(request: HttpRequest, url: str) -> HttpResponse: ...
def render_flatpage(request: HttpRequest, f: FlatPage) -> HttpResponse: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/ 0000775 0000000 0000000 00000000000 15260643574 0023667 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0026137 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/admin/ 0000775 0000000 0000000 00000000000 15260643574 0024757 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/admin/__init__.pyi 0000664 0000000 0000000 00000001626 15260643574 0027246 0 ustar 00root root 0000000 0000000 from django.contrib.admin import HORIZONTAL as HORIZONTAL
from django.contrib.admin import VERTICAL as VERTICAL
from django.contrib.admin import AdminSite as AdminSite
from django.contrib.admin import ModelAdmin as ModelAdmin
from django.contrib.admin import StackedInline as StackedInline
from django.contrib.admin import TabularInline as TabularInline
from django.contrib.admin import action as action
from django.contrib.admin import autodiscover as autodiscover
from django.contrib.admin import display as display
from django.contrib.admin import register as register
from django.contrib.admin import site as site
from django.contrib.gis.admin.options import GISModelAdmin as GISModelAdmin
__all__ = [
"HORIZONTAL",
"VERTICAL",
"AdminSite",
"GISModelAdmin",
"ModelAdmin",
"StackedInline",
"TabularInline",
"action",
"autodiscover",
"display",
"register",
"site",
]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/admin/options.pyi 0000664 0000000 0000000 00000001237 15260643574 0027200 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.admin import ModelAdmin
from django.contrib.gis.forms import OSMWidget
from django.db.models import Model
from django.db.models.fields import Field
from django.forms.fields import Field as FormField
from django.http.request import HttpRequest
from typing_extensions import TypeVar
_ModelT = TypeVar("_ModelT", bound=Model)
class GeoModelAdminMixin:
gis_widget: type[OSMWidget]
gis_widget_kwargs: dict[str, Any]
def formfield_for_dbfield(
self, db_field: Field[Any, Any], request: HttpRequest, **kwargs: Any
) -> FormField | None: ...
class GISModelAdmin(GeoModelAdminMixin, ModelAdmin[_ModelT]): ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/apps.pyi 0000664 0000000 0000000 00000000103 15260643574 0025347 0 ustar 00root root 0000000 0000000 from django.apps import AppConfig
class GISConfig(AppConfig): ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/ 0000775 0000000 0000000 00000000000 15260643574 0024254 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0026524 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/ 0000775 0000000 0000000 00000000000 15260643574 0026026 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0030276 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/base/ 0000775 0000000 0000000 00000000000 15260643574 0026740 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/base/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0031210 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/base/adapter.pyi 0000664 0000000 0000000 00000000414 15260643574 0031102 0 ustar 00root root 0000000 0000000 from typing import Any
from typing_extensions import override
class WKTAdapter:
wkt: Any
srid: Any
def __init__(self, geom: Any) -> None: ...
@override
def __eq__(self, other: object) -> bool: ...
@override
def __hash__(self) -> int: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/base/features.pyi 0000664 0000000 0000000 00000002560 15260643574 0031304 0 ustar 00root root 0000000 0000000 from typing import Any
class BaseSpatialFeatures:
gis_enabled: bool
has_spatialrefsys_table: bool
supports_add_srs_entry: bool
supports_geometry_field_introspection: bool
supports_geography: bool
supports_3d_storage: bool
supports_3d_functions: bool
supports_transform: bool
supports_null_geometries: bool
supports_empty_geometries: bool
supports_distance_geodetic: bool
supports_length_geodetic: bool
supports_perimeter_geodetic: bool
supports_area_geodetic: bool
supports_num_points_poly: bool
supports_dwithin_distance_expr: bool
supports_raster: bool
supports_geometry_field_unique_index: bool
can_alter_geometry_field: bool
supports_tolerance_parameter: bool
unsupported_geojson_options: set[str]
empty_intersection_returns_none: bool
@property
def supports_crosses_lookup(self) -> bool: ...
@property
def supports_distances_lookups(self) -> bool: ...
@property
def supports_relate_lookup(self) -> bool: ...
@property
def supports_isvalid_lookup(self) -> bool: ...
@property
def supports_collect_aggr(self) -> bool: ...
@property
def supports_extent_aggr(self) -> bool: ...
@property
def supports_make_line_aggr(self) -> bool: ...
@property
def supports_union_aggr(self) -> bool: ...
def __getattr__(self, name: Any) -> bool: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/base/models.pyi 0000664 0000000 0000000 00000001504 15260643574 0030746 0 ustar 00root root 0000000 0000000 from typing import Any
class SpatialRefSysMixin:
@property
def srs(self) -> Any: ...
@property
def ellipsoid(self) -> Any: ...
@property
def name(self) -> Any: ...
@property
def spheroid(self) -> Any: ...
@property
def datum(self) -> Any: ...
@property
def projected(self) -> Any: ...
@property
def local(self) -> Any: ...
@property
def geographic(self) -> Any: ...
@property
def linear_name(self) -> Any: ...
@property
def linear_units(self) -> Any: ...
@property
def angular_name(self) -> Any: ...
@property
def angular_units(self) -> Any: ...
@property
def units(self) -> Any: ...
@classmethod
def get_units(cls, wkt: Any) -> Any: ...
@classmethod
def get_spheroid(cls, wkt: Any, string: bool = ...) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/base/operations.pyi 0000664 0000000 0000000 00000002653 15260643574 0031654 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.models.sql.compiler import _AsSqlType
from django.utils.functional import cached_property
class BaseSpatialOperations:
postgis: bool
spatialite: bool
mariadb: bool
mysql: bool
oracle: bool
spatial_version: Any
select: str
@cached_property
def select_extent(self) -> str: ...
disallowed_aggregates: Any
geom_func_prefix: str
function_names: Any
unsupported_functions: set[str]
from_text: bool
def convert_extent(self, box: Any, srid: Any) -> Any: ...
def convert_extent3d(self, box: Any, srid: Any) -> Any: ...
def geo_quote_name(self, name: Any) -> Any: ...
def geo_db_type(self, f: Any) -> Any: ...
def get_distance(self, f: Any, value: Any, lookup_type: Any) -> Any: ...
def get_geom_placeholder_sql(self, f: Any, value: Any, compiler: Any) -> _AsSqlType: ...
def check_expression_support(self, expression: Any) -> None: ...
def spatial_aggregate_name(self, agg_name: Any) -> Any: ...
def spatial_function_name(self, func_name: Any) -> Any: ...
def geometry_columns(self) -> Any: ...
def spatial_ref_sys(self) -> Any: ...
distance_expr_for_lookup: Any
def get_db_converters(self, expression: Any) -> Any: ...
def get_geometry_converter(self, expression: Any) -> Any: ...
def get_area_att_for_field(self, field: Any) -> Any: ...
def get_distance_att_for_field(self, field: Any) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/mysql/ 0000775 0000000 0000000 00000000000 15260643574 0027173 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/mysql/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0031443 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/mysql/base.pyi 0000664 0000000 0000000 00000000373 15260643574 0030633 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.mysql.base import DatabaseWrapper as MySQLDatabaseWrapper
class DatabaseWrapper(MySQLDatabaseWrapper):
SchemaEditorClass: Any
features_class: Any
introspection_class: Any
ops_class: Any
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/mysql/features.pyi 0000664 0000000 0000000 00000001321 15260643574 0031531 0 ustar 00root root 0000000 0000000 from django.contrib.gis.db.backends.base.features import BaseSpatialFeatures
from django.db.backends.mysql.features import DatabaseFeatures as MySQLDatabaseFeatures
from django.utils.functional import cached_property
from typing_extensions import override
class DatabaseFeatures(BaseSpatialFeatures, MySQLDatabaseFeatures):
has_spatialrefsys_table: bool
supports_add_srs_entry: bool
supports_distance_geodetic: bool
supports_length_geodetic: bool
supports_area_geodetic: bool
supports_transform: bool
supports_null_geometries: bool
supports_num_points_poly: bool
@cached_property
@override
def supports_geometry_field_unique_index(self) -> bool: ... # type: ignore[override]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/mysql/introspection.pyi 0000664 0000000 0000000 00000000515 15260643574 0032617 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.mysql.introspection import DatabaseIntrospection
class MySQLIntrospection(DatabaseIntrospection):
data_types_reverse: Any
def get_geometry_type(self, table_name: Any, description: Any) -> Any: ...
def supports_spatial_index(self, cursor: Any, table_name: Any) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/mysql/operations.pyi 0000664 0000000 0000000 00000002734 15260643574 0032107 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any
from django.contrib.gis.db.backends.base.operations import BaseSpatialOperations
from django.contrib.gis.db.backends.utils import SpatialOperator
from django.contrib.gis.geos.geometry import GEOSGeometryBase
from django.db.backends.mysql.operations import DatabaseOperations
from django.utils.functional import cached_property
from typing_extensions import override
class MySQLOperations(BaseSpatialOperations, DatabaseOperations):
name: str
geom_func_prefix: str
Adapter: Any
@cached_property
@override
def mariadb(self) -> bool: ... # type: ignore[override]
@cached_property
@override
def mysql(self) -> bool: ... # type: ignore[override]
@cached_property
@override
def select(self) -> str: ... # type: ignore[override]
@cached_property
@override
def from_text(self) -> str: ... # type: ignore[override]
@cached_property
def collect(self) -> str: ...
@cached_property
def gis_operators(self) -> dict[str, SpatialOperator]: ...
disallowed_aggregates: Any
@cached_property
@override
def unsupported_functions(self) -> set[str]: ... # type: ignore[override]
@override
def geo_db_type(self, f: Any) -> Any: ...
@override
def get_distance(self, f: Any, value: Any, lookup_type: Any) -> list[Any]: ...
@override
def get_geometry_converter(self, expression: Any) -> Callable[[Any, Any, Any], GEOSGeometryBase | None]: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/mysql/schema.pyi 0000664 0000000 0000000 00000001530 15260643574 0031155 0 ustar 00root root 0000000 0000000 from logging import Logger
from typing import Any
from django.db.backends.mysql.schema import DatabaseSchemaEditor
from django.db.models.base import Model
from django.db.models.fields import Field
from typing_extensions import override
logger: Logger
class MySQLGISSchemaEditor(DatabaseSchemaEditor):
sql_add_spatial_index: str
@override
def skip_default(self, field: Field[Any, Any]) -> bool: ...
@override
def column_sql(
self, model: type[Model], field: Field[Any, Any], include_default: bool = ...
) -> tuple[None, None] | tuple[str, list[Any]]: ...
@override
def create_model(self, model: type[Model]) -> None: ...
@override
def add_field(self, model: type[Model], field: Field[Any, Any]) -> None: ...
@override
def remove_field(self, model: type[Model], field: Field[Any, Any]) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/oracle/ 0000775 0000000 0000000 00000000000 15260643574 0027273 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/oracle/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0031543 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/oracle/adapter.pyi 0000664 0000000 0000000 00000000342 15260643574 0031435 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.gis.db.backends.base.adapter import WKTAdapter
class OracleSpatialAdapter(WKTAdapter):
input_size: Any
wkt: Any
srid: Any
def __init__(self, geom: Any) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/oracle/base.pyi 0000664 0000000 0000000 00000000376 15260643574 0030736 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.oracle.base import DatabaseWrapper as OracleDatabaseWrapper
class DatabaseWrapper(OracleDatabaseWrapper):
SchemaEditorClass: Any
features_class: Any
introspection_class: Any
ops_class: Any
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/oracle/features.pyi 0000664 0000000 0000000 00000001270 15260643574 0031634 0 ustar 00root root 0000000 0000000 from django.contrib.gis.db.backends.base.features import BaseSpatialFeatures
from django.db.backends.oracle.features import DatabaseFeatures as OracleDatabaseFeatures
from django.utils.functional import cached_property
from typing_extensions import override
class DatabaseFeatures(BaseSpatialFeatures, OracleDatabaseFeatures):
supports_add_srs_entry: bool
supports_geometry_field_introspection: bool
supports_geometry_field_unique_index: bool
supports_perimeter_geodetic: bool
supports_dwithin_distance_expr: bool
supports_tolerance_parameter: bool
@cached_property
@override
def django_test_skips(self) -> dict[str, set[str]]: ... # type: ignore[override]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/oracle/introspection.pyi 0000664 0000000 0000000 00000000646 15260643574 0032724 0 ustar 00root root 0000000 0000000 from functools import cached_property
from typing import Any
from django.db.backends.oracle.introspection import DatabaseIntrospection
from typing_extensions import override
class OracleIntrospection(DatabaseIntrospection):
@cached_property
@override
def data_types_reverse(self) -> dict[int, str]: ... # type: ignore[override]
def get_geometry_type(self, table_name: Any, description: Any) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/oracle/models.pyi 0000664 0000000 0000000 00000001272 15260643574 0031303 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar, Self
from django.contrib.gis.db import models
from django.contrib.gis.db.backends.base.models import SpatialRefSysMixin
from django.db.models.manager import Manager
class OracleGeometryColumns(models.Model):
table_name: Any
column_name: Any
srid: Any
objects: ClassVar[Manager[Self]]
@classmethod
def table_name_col(cls) -> Any: ...
@classmethod
def geom_col_name(cls) -> Any: ...
class OracleSpatialRefSys(models.Model, SpatialRefSysMixin):
cs_name: Any
srid: Any
auth_srid: Any
auth_name: Any
wktext: Any
cs_bounds: Any
objects: ClassVar[Manager[Self]]
@property
def wkt(self) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/oracle/operations.pyi 0000664 0000000 0000000 00000003503 15260643574 0032202 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.gis.db.backends.base.operations import BaseSpatialOperations
from django.contrib.gis.db.backends.utils import SpatialOperator
from django.db.backends.oracle.operations import DatabaseOperations
from django.db.models.sql.compiler import _AsSqlType
from typing_extensions import override
DEFAULT_TOLERANCE: str
class SDOOperator(SpatialOperator):
sql_template: str
class SDODWithin(SpatialOperator):
sql_template: str
class SDODisjoint(SpatialOperator):
sql_template: Any
class SDORelate(SpatialOperator):
sql_template: str
def check_relate_argument(self, arg: Any) -> None: ...
class OracleOperations(BaseSpatialOperations, DatabaseOperations):
name: str
oracle: bool
disallowed_aggregates: Any
Adapter: Any
extent: str
unionagg: str
from_text: str # type: ignore[assignment]
function_names: Any
select: str
gis_operators: Any
unsupported_functions: Any
@override
def geo_quote_name(self, name: Any) -> Any: ...
@override
def convert_extent(self, clob: Any) -> tuple[float, float, float, float] | None: ... # type: ignore[override]
@override
def geo_db_type(self, f: Any) -> Any: ...
@override
def get_distance(self, f: Any, value: Any, lookup_type: Any) -> Any: ...
@override
def get_geom_placeholder_sql(self, f: Any, value: Any, compiler: Any) -> _AsSqlType: ...
@override
def spatial_aggregate_name(self, agg_name: Any) -> Any: ...
@override
def geometry_columns(self) -> Any: ...
@override
def spatial_ref_sys(self) -> Any: ...
@override
def modify_insert_params(self, placeholder: Any, params: Any) -> Any: ...
@override
def get_geometry_converter(self, expression: Any) -> Any: ...
@override
def get_area_att_for_field(self, field: Any) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/oracle/schema.pyi 0000664 0000000 0000000 00000002131 15260643574 0031253 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.oracle.schema import DatabaseSchemaEditor
from django.db.models.base import Model
from django.db.models.fields import Field
from typing_extensions import override
class OracleGISSchemaEditor(DatabaseSchemaEditor):
sql_add_geometry_metadata: str
sql_add_spatial_index: str
sql_clear_geometry_table_metadata: str
sql_clear_geometry_field_metadata: str
geometry_sql: Any
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
def geo_quote_name(self, name: Any) -> Any: ...
@override
def column_sql(
self, model: type[Model], field: Field[Any, Any], include_default: bool = ...
) -> tuple[None, None] | tuple[str, list[Any]]: ...
@override
def create_model(self, model: type[Model]) -> None: ...
@override
def delete_model(self, model: type[Model]) -> None: ...
@override
def add_field(self, model: type[Model], field: Field[Any, Any]) -> None: ...
@override
def remove_field(self, model: type[Model], field: Field[Any, Any]) -> None: ...
def run_geometry_sql(self) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/postgis/ 0000775 0000000 0000000 00000000000 15260643574 0027516 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/postgis/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0031766 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/postgis/adapter.pyi 0000664 0000000 0000000 00000000645 15260643574 0031666 0 ustar 00root root 0000000 0000000 from typing import Any
from typing_extensions import override
class PostGISAdapter:
is_geometry: Any
ewkb: Any
srid: Any
geography: Any
def __init__(self, obj: Any, geography: bool = ...) -> None: ...
def __conform__(self, proto: Any) -> Any: ...
@override
def __eq__(self, other: object) -> bool: ...
@override
def __hash__(self) -> int: ...
def getquoted(self) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/postgis/base.pyi 0000664 0000000 0000000 00000002233 15260643574 0031153 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.postgresql.base import DatabaseWrapper as Psycopg2DatabaseWrapper
from psycopg import BaseConnection
from psycopg.adapt import Dumper
from psycopg.pq import Format
from typing_extensions import override
class BaseBinaryDumper(Dumper):
format: Format
@override
def dump(self, obj: Any) -> bytes: ...
class BaseTextDumper(Dumper):
@override
def dump(self, obj: Any) -> bytes: ...
class DatabaseWrapper(Psycopg2DatabaseWrapper):
SchemaEditorClass: Any
features: Any
ops: Any
introspection: Any
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
@override
def prepare_database(self) -> None: ...
def register_geometry_adapters(self, pg_connection: BaseConnection[bytes], clear_caches: bool = False) -> None: ...
class GeometryType: ...
class GeographyType: ...
class RasterType: ...
# Uses @functools.lru_cache, but that would prevent typechecking arguments.
# typeshed issue: https://github.com/python/typeshed/issues/11280
def postgis_adapters(
geo_oid: int | None,
geog_oid: int | None,
raster_oid: int | None,
) -> tuple[type[Dumper], type[Dumper]]: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/postgis/const.pyi 0000664 0000000 0000000 00000000275 15260643574 0031373 0 ustar 00root root 0000000 0000000 from typing import Any
GDAL_TO_POSTGIS: Any
POSTGIS_TO_GDAL: Any
POSTGIS_HEADER_STRUCTURE: str
GDAL_TO_STRUCT: Any
STRUCT_SIZE: Any
BANDTYPE_PIXTYPE_MASK: int
BANDTYPE_FLAG_HASNODATA: Any
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/postgis/features.pyi 0000664 0000000 0000000 00000000561 15260643574 0032061 0 ustar 00root root 0000000 0000000 from django.contrib.gis.db.backends.base.features import BaseSpatialFeatures
from django.db.backends.postgresql.features import DatabaseFeatures as Psycopg2DatabaseFeatures
class DatabaseFeatures(BaseSpatialFeatures, Psycopg2DatabaseFeatures):
supports_3d_storage: bool
supports_3d_functions: bool
supports_raster: bool
supports_empty_geometries: bool
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/postgis/introspection.pyi 0000664 0000000 0000000 00000000635 15260643574 0033145 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.postgresql.introspection import DatabaseIntrospection
from typing_extensions import override
class PostGISIntrospection(DatabaseIntrospection):
postgis_oid_lookup: Any
ignored_tables: Any
@override
def get_field_type(self, data_type: Any, description: Any) -> Any: ...
def get_geometry_type(self, table_name: Any, description: Any) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/postgis/models.pyi 0000664 0000000 0000000 00000001340 15260643574 0031522 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar, Self
from django.contrib.gis.db.backends.base.models import SpatialRefSysMixin
from django.db import models
class PostGISGeometryColumns(models.Model):
f_table_catalog: Any
f_table_schema: Any
f_table_name: Any
f_geometry_column: Any
coord_dimension: Any
srid: Any
type: Any
objects: ClassVar[models.Manager[Self]]
@classmethod
def table_name_col(cls) -> Any: ...
@classmethod
def geom_col_name(cls) -> Any: ...
class PostGISSpatialRefSys(models.Model, SpatialRefSysMixin):
srid: Any
auth_name: Any
auth_srid: Any
srtext: Any
proj4text: Any
objects: ClassVar[models.Manager[Self]]
@property
def wkt(self) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/postgis/operations.pyi 0000664 0000000 0000000 00000006073 15260643574 0032432 0 ustar 00root root 0000000 0000000 from collections.abc import MutableMapping
from typing import Any, Literal
from django.contrib.gis.db.backends.base.operations import BaseSpatialOperations
from django.contrib.gis.db.backends.utils import SpatialOperator
from django.contrib.gis.db.models.fields import GeometryField
from django.contrib.gis.db.models.lookups import GISLookup
from django.db.backends.postgresql.operations import DatabaseOperations
from django.db.models import Func
from django.db.models.sql.compiler import _AsSqlType
from django.utils.functional import cached_property
from typing_extensions import override
BILATERAL: Literal["bilateral"]
class PostGISOperator(SpatialOperator):
geography: Any
raster: bool | Literal["bilateral"]
def __init__(self, geography: bool = False, raster: bool | Literal["bilateral"] = False, **kwargs: Any) -> None: ...
def check_raster(self, lookup: Any, template_params: Any) -> Any: ...
def check_geography(
self,
lookup: GISLookup,
template_params: MutableMapping[str, Any],
) -> MutableMapping[str, Any]: ...
class ST_Polygon(Func):
function: str
def __init__(self, expr: Any) -> None: ...
@cached_property
@override
def output_field(self) -> GeometryField[Any, Any]: ...
class PostGISOperations(BaseSpatialOperations, DatabaseOperations):
name: str
postgis: bool
geom_func_prefix: str
Adapter: Any
collect: Any
extent: Any
extent3d: Any
length3d: Any
makeline: Any
perimeter3d: Any
unionagg: Any
gis_operators: Any
unsupported_functions: Any
select: str
select_extent: Any
@cached_property
@override
def function_names(self) -> Any: ...
@cached_property
@override
def spatial_version(self) -> Any: ...
@override
def convert_extent(self, box: Any) -> tuple[float, float, float, float] | None: ... # type: ignore[override]
@override
def convert_extent3d(self, box3d: Any) -> tuple[float, float, float, float, float, float] | None: ... # type: ignore[override]
@override
def geo_db_type(self, f: Any) -> Any: ...
@override
def get_distance(self, f: Any, dist_val: Any, lookup_type: Any) -> Any: ...
@override
def get_geom_placeholder_sql(self, f: Any, value: Any, compiler: Any) -> _AsSqlType: ...
def postgis_geos_version(self) -> Any: ...
def postgis_lib_version(self) -> Any: ...
def postgis_proj_version(self) -> Any: ...
def postgis_version(self) -> Any: ...
def postgis_full_version(self) -> Any: ...
def postgis_version_tuple(self) -> Any: ...
def proj_version_tuple(self) -> Any: ...
@override
def spatial_aggregate_name(self, agg_name: Any) -> Any: ...
@override
def geometry_columns(self) -> Any: ...
@override
def spatial_ref_sys(self) -> Any: ...
def parse_raster(self, value: Any) -> Any: ...
@override
def distance_expr_for_lookup(self, lhs: Any, rhs: Any, **kwargs: Any) -> Any: ...
@override
def get_geometry_converter(self, expression: Any) -> Any: ...
@override
def get_area_att_for_field(self, field: Any) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/postgis/pgraster.pyi 0000664 0000000 0000000 00000000367 15260643574 0032076 0 ustar 00root root 0000000 0000000 from typing import Any
def pack(structure: Any, data: Any) -> Any: ...
def unpack(structure: Any, data: Any) -> Any: ...
def chunk(data: Any, index: Any) -> Any: ...
def from_pgraster(data: Any) -> Any: ...
def to_pgraster(rast: Any) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/postgis/schema.pyi 0000664 0000000 0000000 00000000525 15260643574 0031503 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.postgresql.schema import DatabaseSchemaEditor
class PostGISSchemaEditor(DatabaseSchemaEditor):
geom_index_type: str
geom_index_ops_nd: str
rast_index_template: str
sql_alter_column_to_3d: str
sql_alter_column_to_2d: str
def geo_quote_name(self, name: Any) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/spatialite/ 0000775 0000000 0000000 00000000000 15260643574 0030165 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/spatialite/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0032435 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/spatialite/adapter.pyi 0000664 0000000 0000000 00000000266 15260643574 0032334 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.gis.db.backends.base.adapter import WKTAdapter
class SpatiaLiteAdapter(WKTAdapter):
def __conform__(self, protocol: Any) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/spatialite/base.pyi 0000664 0000000 0000000 00000001606 15260643574 0031625 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.sqlite3.base import DatabaseWrapper as SQLiteDatabaseWrapper
from typing_extensions import override
from .client import SpatiaLiteClient
from .features import DatabaseFeatures
from .introspection import SpatiaLiteIntrospection
from .operations import SpatiaLiteOperations
from .schema import SpatialiteSchemaEditor
class DatabaseWrapper(SQLiteDatabaseWrapper):
SchemaEditorClass: type[SpatialiteSchemaEditor]
client_class: type[SpatiaLiteClient]
features_class: type[DatabaseFeatures]
introspection_class: type[SpatiaLiteIntrospection]
ops_class: type[SpatiaLiteOperations]
lib_spatialite_paths: str
ops: SpatiaLiteOperations
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
@override
def get_new_connection(self, conn_params: Any) -> Any: ...
@override
def prepare_database(self) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/spatialite/client.pyi 0000664 0000000 0000000 00000000177 15260643574 0032173 0 ustar 00root root 0000000 0000000 from django.db.backends.sqlite3.client import DatabaseClient
class SpatiaLiteClient(DatabaseClient):
executable_name: str
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/spatialite/features.pyi 0000664 0000000 0000000 00000000726 15260643574 0032533 0 ustar 00root root 0000000 0000000 from django.contrib.gis.db.backends.base.features import BaseSpatialFeatures
from django.db.backends.sqlite3.features import DatabaseFeatures as SQLiteDatabaseFeatures
from django.utils.functional import cached_property
from typing_extensions import override
class DatabaseFeatures(BaseSpatialFeatures, SQLiteDatabaseFeatures):
supports_3d_storage: bool
@cached_property
@override
def supports_area_geodetic(self) -> bool: ... # type: ignore[override]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/spatialite/introspection.pyi 0000664 0000000 0000000 00000000770 15260643574 0033614 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.sqlite3.introspection import DatabaseIntrospection, FlexibleFieldLookupDict
from typing_extensions import override
class GeoFlexibleFieldLookupDict(FlexibleFieldLookupDict):
base_data_types_reverse: Any
class SpatiaLiteIntrospection(DatabaseIntrospection):
data_types_reverse: Any
def get_geometry_type(self, table_name: Any, description: Any) -> Any: ...
@override
def get_constraints(self, cursor: Any, table_name: Any) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/spatialite/models.pyi 0000664 0000000 0000000 00000001352 15260643574 0032174 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar, Self
from django.contrib.gis.db.backends.base.models import SpatialRefSysMixin
from django.db import models
class SpatialiteGeometryColumns(models.Model):
f_table_name: Any
f_geometry_column: Any
coord_dimension: Any
srid: Any
spatial_index_enabled: Any
type: Any
objects: ClassVar[models.Manager[Self]]
@classmethod
def table_name_col(cls) -> Any: ...
@classmethod
def geom_col_name(cls) -> Any: ...
class SpatialiteSpatialRefSys(models.Model, SpatialRefSysMixin):
srid: Any
auth_name: Any
auth_srid: Any
ref_sys_name: Any
proj4text: Any
srtext: Any
objects: ClassVar[models.Manager[Self]]
@property
def wkt(self) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/spatialite/operations.pyi 0000664 0000000 0000000 00000003360 15260643574 0033075 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.gis.db.backends.base.operations import BaseSpatialOperations
from django.contrib.gis.db.backends.utils import SpatialOperator
from django.db.backends.sqlite3.operations import DatabaseOperations
from django.utils.functional import cached_property
from typing_extensions import override
class SpatialiteNullCheckOperator(SpatialOperator): ...
class SpatiaLiteOperations(BaseSpatialOperations, DatabaseOperations):
name: str
spatialite: bool
from_text: str # type: ignore[assignment]
Adapter: Any
collect: str
extent: str
makeline: str
unionagg: str
gis_operators: Any
disallowed_aggregates: Any
select: str
function_names: Any
@cached_property
@override
def unsupported_functions(self) -> set[str]: ... # type: ignore[override]
@cached_property
@override
def spatial_version(self) -> Any: ...
@override
def convert_extent(self, box: Any) -> tuple[float, float, float, float] | None: ... # type: ignore[override]
@override
def geo_db_type(self, f: Any) -> None: ...
@override
def get_distance(self, f: Any, value: Any, lookup_type: Any) -> Any: ...
def geos_version(self) -> Any: ...
def proj_version(self) -> Any: ...
def lwgeom_version(self) -> Any: ...
def rttopo_version(self) -> str | None: ...
def geom_lib_version(self) -> str | None: ...
def spatialite_version(self) -> Any: ...
def spatialite_version_tuple(self) -> Any: ...
@override
def spatial_aggregate_name(self, agg_name: Any) -> Any: ...
@override
def geometry_columns(self) -> Any: ...
@override
def spatial_ref_sys(self) -> Any: ...
@override
def get_geometry_converter(self, expression: Any) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/spatialite/schema.pyi 0000664 0000000 0000000 00000002714 15260643574 0032154 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.sqlite3.schema import DatabaseSchemaEditor
from django.db.models.base import Model
from django.db.models.fields import Field
from typing_extensions import override
class SpatialiteSchemaEditor(DatabaseSchemaEditor):
sql_add_geometry_column: str
sql_add_spatial_index: str
sql_drop_spatial_index: str
sql_recover_geometry_metadata: str
sql_remove_geometry_metadata: str
sql_discard_geometry_columns: str
sql_update_geometry_columns: str
geometry_tables: Any
geometry_sql: Any
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
def geo_quote_name(self, name: Any) -> Any: ...
@override
def column_sql(
self, model: type[Model], field: Field[Any, Any], include_default: bool = False
) -> tuple[None, None] | tuple[str, list[Any]]: ...
def remove_geometry_metadata(self, model: type[Model], field: Field[Any, Any]) -> None: ...
@override
def create_model(self, model: type[Model]) -> None: ...
@override
def delete_model(self, model: type[Model], **kwargs: Any) -> None: ... # type: ignore[override]
@override
def add_field(self, model: type[Model], field: Field[Any, Any]) -> None: ...
@override
def remove_field(self, model: type[Model], field: Field[Any, Any]) -> None: ...
@override
def alter_db_table(
self,
model: type[Model],
old_db_table: str,
new_db_table: str,
) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/utils.pyi 0000664 0000000 0000000 00000001240 15260643574 0027706 0 ustar 00root root 0000000 0000000 from collections.abc import MutableMapping, Sequence
from typing import Any
from django.contrib.gis.db.models.lookups import GISLookup
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models.sql.compiler import _AsSqlType
class SpatialOperator:
sql_template: Any
op: Any
func: Any
def __init__(self, op: Any | None = None, func: Any | None = None) -> None: ...
@property
def default_template(self) -> Any: ...
def as_sql(
self,
connection: BaseDatabaseWrapper,
lookup: GISLookup,
template_params: MutableMapping[str, Any],
sql_params: Sequence[Any],
) -> _AsSqlType: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/models/ 0000775 0000000 0000000 00000000000 15260643574 0025537 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/models/__init__.pyi 0000664 0000000 0000000 00000006747 15260643574 0030037 0 ustar 00root root 0000000 0000000 from django.contrib.gis.db.models.aggregates import Collect as Collect
from django.contrib.gis.db.models.aggregates import Extent as Extent
from django.contrib.gis.db.models.aggregates import Extent3D as Extent3D
from django.contrib.gis.db.models.aggregates import MakeLine as MakeLine
from django.contrib.gis.db.models.aggregates import Union as Union
from django.contrib.gis.db.models.fields import GeometryCollectionField as GeometryCollectionField
from django.contrib.gis.db.models.fields import GeometryField as GeometryField
from django.contrib.gis.db.models.fields import LineStringField as LineStringField
from django.contrib.gis.db.models.fields import MultiLineStringField as MultiLineStringField
from django.contrib.gis.db.models.fields import MultiPointField as MultiPointField
from django.contrib.gis.db.models.fields import MultiPolygonField as MultiPolygonField
from django.contrib.gis.db.models.fields import PointField as PointField
from django.contrib.gis.db.models.fields import PolygonField as PolygonField
from django.contrib.gis.db.models.fields import RasterField as RasterField
from django.db.models import *
__all__ = [
"BLANK_CHOICE_DASH",
"BLANK_CHOICE_LABEL",
"CASCADE",
"DB_CASCADE",
"DB_SET_DEFAULT",
"DB_SET_NULL",
"DEFERRED",
"DO_NOTHING",
"FETCH_ONE",
"FETCH_PEERS",
"FETCH_RAISE",
"NOT_PROVIDED",
"PROTECT",
"RESTRICT",
"SET",
"SET_DEFAULT",
"SET_NULL",
"Aggregate",
"AnyValue",
"AutoField",
"Avg",
"BaseConstraint",
"BigAutoField",
"BigIntegerField",
"BinaryField",
"BitAnd",
"BitOr",
"BitXor",
"BooleanField",
"Case",
"CharField",
"CheckConstraint",
"Choices",
"Collect",
"CommaSeparatedIntegerField",
"CompositePrimaryKey",
"Count",
"DateField",
"DateTimeField",
"DecimalField",
"Deferrable",
"DurationField",
"EmailField",
"Empty",
"Exists",
"Expression",
"ExpressionList",
"ExpressionWrapper",
"Extent",
"Extent3D",
"F",
"Field",
"FileField",
"FilePathField",
"FilteredRelation",
"FloatField",
"ForeignKey",
"ForeignObject",
"ForeignObjectRel",
"Func",
"GeneratedField",
"GenericIPAddressField",
"GeometryCollectionField",
"GeometryField",
"IPAddressField",
"ImageField",
"Index",
"IntegerChoices",
"IntegerField",
"JSONField",
"JSONNull",
"LineStringField",
"Lookup",
"MakeLine",
"Manager",
"ManyToManyField",
"ManyToManyRel",
"ManyToOneRel",
"Max",
"Min",
"Model",
"MultiLineStringField",
"MultiPointField",
"MultiPolygonField",
"NullBooleanField",
"ObjectDoesNotExist",
"OneToOneField",
"OneToOneRel",
"OrderBy",
"OrderWrt",
"OuterRef",
"PointField",
"PolygonField",
"PositiveBigIntegerField",
"PositiveIntegerField",
"PositiveSmallIntegerField",
"Prefetch",
"ProtectedError",
"Q",
"QuerySet",
"RasterField",
"RestrictedError",
"RowRange",
"SlugField",
"SmallAutoField",
"SmallIntegerField",
"StdDev",
"StringAgg",
"Subquery",
"Sum",
"TextChoices",
"TextField",
"TimeField",
"Transform",
"URLField",
"UUIDField",
"Union",
"UniqueConstraint",
"Value",
"ValueRange",
"Variance",
"When",
"Window",
"WindowFrame",
"WindowFrameExclusion",
"aprefetch_related_objects",
"prefetch_related_objects",
"signals",
]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/models/aggregates.pyi 0000664 0000000 0000000 00000002176 15260643574 0030401 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models import Aggregate
from django.db.models.sql.compiler import SQLCompiler, _AsSqlType
from typing_extensions import override
__all__ = ["Collect", "Extent", "Extent3D", "MakeLine", "Union"]
class GeoAggregate(Aggregate):
is_extent: bool | str
@override
def as_sql( # type: ignore[override]
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, function: str | None = None, **extra_context: Any
) -> _AsSqlType: ...
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class Collect(GeoAggregate):
name: str
output_field_class: Any
class Extent(GeoAggregate):
name: str
is_extent: str
def __init__(self, expression: Any, **extra: Any) -> None: ...
class Extent3D(GeoAggregate):
name: str
is_extent: str
def __init__(self, expression: Any, **extra: Any) -> None: ...
class MakeLine(GeoAggregate):
name: str
output_field_class: Any
class Union(GeoAggregate):
name: str
output_field_class: Any
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/models/fields.pyi 0000664 0000000 0000000 00000016526 15260643574 0027542 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable
from typing import Any, NamedTuple
from django.contrib.gis import forms
from django.contrib.gis.geos import (
GeometryCollection,
GEOSGeometry,
LineString,
MultiLineString,
MultiPoint,
MultiPolygon,
Point,
Polygon,
)
from django.core.validators import _ValidatorCallable
from django.db.models import Model
from django.db.models.expressions import Combinable, Expression
from django.db.models.fields import NOT_PROVIDED, Field, _ErrorMessagesMapping
from django.db.models.sql.compiler import _AsSqlType
from django.forms.widgets import Widget
from django.utils.choices import _Choices
from django.utils.functional import _StrOrPromise
from typing_extensions import TypeVar, override
# __set__ value type
_ST = TypeVar("_ST", contravariant=True)
# __get__ return type
_GT = TypeVar("_GT", covariant=True)
class SRIDCacheEntry(NamedTuple):
units: Any
units_name: str
spheroid: str
geodetic: bool
def get_srid_info(srid: int, connection: Any) -> SRIDCacheEntry: ...
class BaseSpatialField(Field[_ST, _GT]):
form_class: type[forms.GeometryField]
geom_type: str
geom_class: type[GEOSGeometry] | None
geography: bool
spatial_index: bool
srid: int
def __init__(
self,
verbose_name: _StrOrPromise | None = None,
srid: int = 4326,
spatial_index: bool = True,
*,
name: str | None = ...,
primary_key: bool = ...,
max_length: int | None = ...,
unique: bool = ...,
blank: bool = ...,
null: bool = ...,
db_index: bool = ...,
default: Any = ...,
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
editable: bool = ...,
auto_created: bool = ...,
serialize: bool = ...,
unique_for_date: str | None = ...,
unique_for_month: str | None = ...,
unique_for_year: str | None = ...,
choices: _Choices | None = ...,
help_text: _StrOrPromise = ...,
db_column: str | None = ...,
db_comment: str | None = ...,
db_tablespace: str | None = ...,
validators: Iterable[_ValidatorCallable] = ...,
error_messages: _ErrorMessagesMapping | None = ...,
) -> None: ...
@override
def db_type(self, connection: Any) -> Any: ...
def spheroid(self, connection: Any) -> Any: ...
def units(self, connection: Any) -> Any: ...
def units_name(self, connection: Any) -> Any: ...
def geodetic(self, connection: Any) -> Any: ...
def get_placeholder_sql(self, value: Any, compiler: Any, connection: Any) -> _AsSqlType: ...
def get_srid(self, obj: Any) -> Any: ...
@override
def get_db_prep_value(self, value: Any, connection: Any, *args: Any, **kwargs: Any) -> Any: ...
def get_raster_prep_value(self, value: Any, is_candidate: Any) -> Any: ...
@override
def get_prep_value(self, value: Any) -> Any: ...
class GeometryField(BaseSpatialField[_ST, _GT]):
dim: int
def __init__(
self,
verbose_name: _StrOrPromise | None = None,
dim: int = 2,
geography: bool = False,
*,
extent: tuple[float, float, float, float] = ...,
tolerance: float = 0.05,
max_geom_collections: int | None = ...,
srid: int = 4326,
spatial_index: bool = True,
name: str | None = ...,
primary_key: bool = ...,
max_length: int | None = ...,
unique: bool = ...,
blank: bool = ...,
null: bool = ...,
db_index: bool = ...,
default: Any = ...,
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
editable: bool = ...,
auto_created: bool = ...,
serialize: bool = ...,
unique_for_date: str | None = ...,
unique_for_month: str | None = ...,
unique_for_year: str | None = ...,
choices: _Choices | None = ...,
help_text: _StrOrPromise = ...,
db_column: str | None = ...,
db_comment: str | None = ...,
db_tablespace: str | None = ...,
validators: Iterable[_ValidatorCallable] = ...,
error_messages: _ErrorMessagesMapping | None = ...,
) -> None: ...
@override
def contribute_to_class(self, cls: type[Model], name: str, **kwargs: Any) -> None: ... # type: ignore[override]
@override
def formfield( # type: ignore[override]
self,
*,
form_class: type[forms.GeometryField] | None = ...,
choices_form_class: type[forms.GeometryField] | None = ...,
required: bool = ...,
widget: Widget | type[Widget] | None = ...,
label: _StrOrPromise | None = ...,
initial: Any | None = ...,
help_text: _StrOrPromise = ...,
error_messages: _ErrorMessagesMapping | None = ...,
show_hidden_initial: bool = ...,
validators: Iterable[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
# GeometryField adds `geom_type` and `srid`
geom_type: str = ...,
srid: Any = ...,
**kwargs: Any,
) -> forms.GeometryField | None: ...
class PointField(GeometryField[_ST, _GT]):
_pyi_private_set_type: Point | Combinable
_pyi_private_get_type: Point
_pyi_lookup_exact_type: Point
geom_class: type[Point]
form_class: type[forms.PointField]
class LineStringField(GeometryField[_ST, _GT]):
_pyi_private_set_type: LineString | Combinable
_pyi_private_get_type: LineString
_pyi_lookup_exact_type: LineString
geom_class: type[LineString]
form_class: type[forms.LineStringField]
class PolygonField(GeometryField[_ST, _GT]):
_pyi_private_set_type: Polygon | Combinable
_pyi_private_get_type: Polygon
_pyi_lookup_exact_type: Polygon
geom_class: type[Polygon]
form_class: type[forms.PolygonField]
class MultiPointField(GeometryField[_ST, _GT]):
_pyi_private_set_type: MultiPoint | Combinable
_pyi_private_get_type: MultiPoint
_pyi_lookup_exact_type: MultiPoint
geom_class: type[MultiPoint]
form_class: type[forms.MultiPointField]
class MultiLineStringField(GeometryField[_ST, _GT]):
_pyi_private_set_type: MultiLineString | Combinable
_pyi_private_get_type: MultiLineString
_pyi_lookup_exact_type: MultiLineString
geom_class: type[MultiLineString]
form_class: type[forms.MultiLineStringField]
class MultiPolygonField(GeometryField[_ST, _GT]):
_pyi_private_set_type: MultiPolygon | Combinable
_pyi_private_get_type: MultiPolygon
_pyi_lookup_exact_type: MultiPolygon
geom_class: type[MultiPolygon]
form_class: type[forms.MultiPolygonField]
class GeometryCollectionField(GeometryField[_ST, _GT]):
_pyi_private_set_type: GeometryCollection | Combinable
_pyi_private_get_type: GeometryCollection
_pyi_lookup_exact_type: GeometryCollection
geom_class: type[GeometryCollection]
form_class: type[forms.GeometryCollectionField]
class ExtentField(Field[Any, Any]):
@override
def get_internal_type(self) -> str: ...
class RasterField(BaseSpatialField[_ST, _GT]):
@override
def db_type(self, connection: Any) -> Any: ...
def from_db_value(self, value: Any, expression: Any, connection: Any) -> Any: ...
@override
def contribute_to_class(self, cls: type[Model], name: str, **kwargs: Any) -> None: ... # type: ignore[override]
@override
def get_transform(self, name: Any) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/models/functions.pyi 0000664 0000000 0000000 00000022007 15260643574 0030273 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar
from django.contrib.gis.db.models.fields import GeometryField
from django.contrib.gis.db.models.sql.conversion import AreaField, DistanceField
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models import BinaryField, BooleanField, CharField, FloatField, Func, IntegerField, TextField
from django.db.models import Transform as StandardTransform
from django.db.models.expressions import BaseExpression
from django.db.models.sql.compiler import SQLCompiler, _AsSqlType
from django.utils.functional import cached_property
from typing_extensions import override
NUMERIC_TYPES: Any
class GeoFuncMixin:
function: str | None = None
geom_param_pos: Any
def __init__(self, *expressions: Any, **extra: Any) -> None: ...
@property
def name(self) -> str: ...
@cached_property
def geo_field(self) -> Any: ...
# `as_sql` drops `template`/`arg_joiner` from `Func.as_sql`, matching runtime.
def as_sql(
self,
compiler: SQLCompiler,
connection: BaseDatabaseWrapper,
function: str | None = None,
**extra_context: Any,
) -> _AsSqlType: ...
def resolve_expression(
self,
*args: Any,
**kwargs: Any,
) -> Any: ...
class GeoFunc(GeoFuncMixin, Func): ... # type: ignore[misc]
class GeomOutputGeoFunc(GeoFunc):
@cached_property
@override
def output_field(self) -> GeometryField[Any, Any]: ...
class SQLiteDecimalToFloatMixin:
def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class OracleToleranceMixin:
tolerance: float
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class Area(OracleToleranceMixin, GeoFunc):
arity: int
@cached_property
@override
def output_field(self) -> AreaField[Any, Any]: ...
@override
def as_sql( # type: ignore[override]
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any
) -> _AsSqlType: ...
@override
def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class Azimuth(GeoFunc):
output_field: ClassVar[FloatField[Any, Any]]
arity: int
geom_param_pos: Any
class AsGeoJSON(GeoFunc):
output_field: ClassVar[TextField[Any, Any]]
def __init__(
self, expression: Any, bbox: bool = False, crs: bool = False, precision: int = 8, **extra: Any
) -> None: ...
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class AsGML(GeoFunc):
geom_param_pos: Any
output_field: ClassVar[TextField[Any, Any]]
def __init__(self, expression: Any, version: int = 2, precision: int = 8, **extra: Any) -> None: ...
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class AsKML(GeoFunc):
output_field: ClassVar[TextField[Any, Any]]
def __init__(self, expression: Any, precision: int = 8, **extra: Any) -> None: ...
class AsSVG(GeoFunc):
output_field: ClassVar[TextField[Any, Any]]
def __init__(self, expression: Any, relative: bool = False, precision: int = 8, **extra: Any) -> None: ...
class AsWKB(GeoFunc):
output_field: ClassVar[BinaryField[Any, Any]]
arity: int
class AsWKT(GeoFunc):
output_field: ClassVar[TextField[Any, Any]]
arity: int
class BoundingCircle(OracleToleranceMixin, GeomOutputGeoFunc): # type: ignore[misc]
def __init__(self, expression: Any, num_seg: int = 48, **extra: Any) -> None: ...
@override
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class Centroid(OracleToleranceMixin, GeomOutputGeoFunc): # type: ignore[misc]
arity: int
class ClosestPoint(GeomOutputGeoFunc):
arity: int
geom_param_pos: tuple[int, int]
class Difference(OracleToleranceMixin, GeomOutputGeoFunc): # type: ignore[misc]
arity: int
geom_param_pos: Any
class DistanceResultMixin:
@cached_property
def output_field(self) -> DistanceField[Any, Any]: ...
def source_is_geography(self) -> Any: ...
class Distance(DistanceResultMixin, OracleToleranceMixin, GeoFunc): # type: ignore[misc]
geom_param_pos: Any
spheroid: Any
def __init__(self, expr1: Any, expr2: Any, spheroid: Any | None = None, **extra: Any) -> None: ...
def as_postgresql(
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any
) -> _AsSqlType: ...
@override
def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class Envelope(GeomOutputGeoFunc):
arity: int
class ForcePolygonCW(GeomOutputGeoFunc):
arity: int
class FromWKB(GeoFunc):
arity: int
def __init__(self, expression: BaseExpression, srid: int = 0, **extra: Any) -> None: ...
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class FromWKT(FromWKB): ...
class GeoHash(GeoFunc):
output_field: ClassVar[TextField[Any, Any]]
def __init__(self, expression: Any, precision: Any | None = None, **extra: Any) -> None: ...
def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class GeometryDistance(GeoFunc):
output_field: ClassVar[FloatField[Any, Any]]
arity: int
function: str
arg_joiner: str
geom_param_pos: Any
class Intersection(OracleToleranceMixin, GeomOutputGeoFunc): # type: ignore[misc]
arity: int
geom_param_pos: Any
class GeometryType(GeoFuncMixin, StandardTransform): # type: ignore[misc]
lookup_name: str
output_field: ClassVar[CharField[Any, Any]]
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class IsEmpty(GeoFuncMixin, StandardTransform): # type: ignore[misc]
lookup_name: str
output_field: ClassVar[BooleanField[Any, Any]]
class IsValid(OracleToleranceMixin, GeoFuncMixin, StandardTransform): # type: ignore[misc]
lookup_name: str
output_field: ClassVar[BooleanField[Any, Any]]
@override
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class Length(DistanceResultMixin, OracleToleranceMixin, GeoFunc):
spheroid: Any
def __init__(self, expr1: Any, spheroid: bool = True, **extra: Any) -> None: ...
@override
def as_sql( # type: ignore[override]
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any
) -> _AsSqlType: ...
def as_postgresql(
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any
) -> _AsSqlType: ...
@override
def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class LineLocatePoint(GeoFunc):
output_field: ClassVar[FloatField[Any, Any]]
arity: int
geom_param_pos: Any
class MakeValid(GeomOutputGeoFunc): ...
class MemSize(GeoFunc):
output_field: ClassVar[IntegerField[Any, Any]]
arity: int
class NumDimensions(GeoFuncMixin, StandardTransform): # type: ignore[misc]
lookup_name: str
output_field: ClassVar[IntegerField[Any, Any]]
arity: int
class NumGeometries(GeoFunc):
output_field: ClassVar[IntegerField[Any, Any]]
arity: int
class NumPoints(GeoFunc):
output_field: ClassVar[IntegerField[Any, Any]]
arity: int
class Perimeter(DistanceResultMixin, OracleToleranceMixin, GeoFunc): # type: ignore[misc]
arity: int
def as_postgresql(
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any
) -> _AsSqlType: ...
@override
def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class PointOnSurface(OracleToleranceMixin, GeomOutputGeoFunc): # type: ignore[misc]
arity: int
class Reverse(GeoFunc):
arity: int
class Rotate(GeomOutputGeoFunc):
def __init__(self, expression: Any, angle: Any, origin: Any | None = None, **extra: Any) -> None: ...
class Scale(SQLiteDecimalToFloatMixin, GeomOutputGeoFunc): # type: ignore[misc]
def __init__(self, expression: Any, x: Any, y: Any, z: float = 0.0, **extra: Any) -> None: ...
class SnapToGrid(SQLiteDecimalToFloatMixin, GeomOutputGeoFunc): # type: ignore[misc]
def __init__(self, expression: Any, *args: Any, **extra: Any) -> None: ...
class SymDifference(OracleToleranceMixin, GeomOutputGeoFunc): # type: ignore[misc]
arity: int
geom_param_pos: Any
class Transform(GeomOutputGeoFunc):
def __init__(self, expression: Any, srid: Any, **extra: Any) -> None: ...
class Translate(Scale):
@override
def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class Union(OracleToleranceMixin, GeomOutputGeoFunc): # type: ignore[misc]
arity: int
geom_param_pos: Any
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/models/lookups.pyi 0000664 0000000 0000000 00000006436 15260643574 0027767 0 ustar 00root root 0000000 0000000 from re import Pattern
from typing import Any
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models import Lookup, Transform
from django.db.models.sql.compiler import SQLCompiler, _AsSqlType
from typing_extensions import override
class RasterBandTransform(Transform):
@override
def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... # type: ignore[override]
class GISLookup(Lookup):
sql_template: Any
transform_func: Any
distance: bool
band_rhs: Any
band_lhs: Any
template_params: Any
def __init__(self, lhs: Any, rhs: Any) -> None: ...
def process_rhs_params(self) -> None: ...
def process_band_indices(self, only_lhs: bool = False) -> None: ...
@override
def get_db_prep_lookup(self, value: Any, connection: Any) -> Any: ...
@override
def process_rhs(self, compiler: Any, connection: Any) -> Any: ...
def get_rhs_op(self, connection: Any, rhs: Any) -> Any: ...
class OverlapsLeftLookup(GISLookup):
lookup_name: str
class OverlapsRightLookup(GISLookup):
lookup_name: str
class OverlapsBelowLookup(GISLookup):
lookup_name: str
class OverlapsAboveLookup(GISLookup):
lookup_name: str
class LeftLookup(GISLookup):
lookup_name: str
class RightLookup(GISLookup):
lookup_name: str
class StrictlyBelowLookup(GISLookup):
lookup_name: str
class StrictlyAboveLookup(GISLookup):
lookup_name: str
class SameAsLookup(GISLookup):
lookup_name: str
class BBContainsLookup(GISLookup):
lookup_name: str
class BBOverlapsLookup(GISLookup):
lookup_name: str
class ContainedLookup(GISLookup):
lookup_name: str
class ContainsLookup(GISLookup):
lookup_name: str
class ContainsProperlyLookup(GISLookup):
lookup_name: str
class CoveredByLookup(GISLookup):
lookup_name: str
class CoversLookup(GISLookup):
lookup_name: str
class CrossesLookup(GISLookup):
lookup_name: str
class DisjointLookup(GISLookup):
lookup_name: str
class EqualsLookup(GISLookup):
lookup_name: str
class IntersectsLookup(GISLookup):
lookup_name: str
class OverlapsLookup(GISLookup):
lookup_name: str
class RelateLookup(GISLookup):
lookup_name: str
sql_template: str
pattern_regex: Pattern[str]
@override
def process_rhs(self, compiler: Any, connection: Any) -> Any: ...
class TouchesLookup(GISLookup):
lookup_name: str
class WithinLookup(GISLookup):
lookup_name: str
class DistanceLookupBase(GISLookup):
distance: bool
sql_template: str
@override
def process_rhs_params(self) -> None: ...
def process_distance(self, compiler: Any, connection: Any) -> Any: ...
class DWithinLookup(DistanceLookupBase):
lookup_name: str
sql_template: str
@override
def process_distance(self, compiler: Any, connection: Any) -> Any: ...
@override
def process_rhs(self, compiler: Any, connection: Any) -> Any: ...
class DistanceLookupFromFunction(DistanceLookupBase): ...
class DistanceGTLookup(DistanceLookupFromFunction):
lookup_name: str
op: str
class DistanceGTELookup(DistanceLookupFromFunction):
lookup_name: str
op: str
class DistanceLTLookup(DistanceLookupFromFunction):
lookup_name: str
op: str
class DistanceLTELookup(DistanceLookupFromFunction):
lookup_name: str
op: str
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/models/proxy.pyi 0000664 0000000 0000000 00000000616 15260643574 0027446 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.models.query_utils import DeferredAttribute
from typing_extensions import override
class SpatialProxy(DeferredAttribute):
def __init__(self, klass: Any, field: Any, load_func: Any | None = ...) -> None: ...
@override
def __get__(self, instance: Any, cls: Any | None = ...) -> Any: ...
def __set__(self, instance: Any, value: Any) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/models/sql/ 0000775 0000000 0000000 00000000000 15260643574 0026336 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/models/sql/__init__.pyi 0000664 0000000 0000000 00000000320 15260643574 0030613 0 ustar 00root root 0000000 0000000 from django.contrib.gis.db.models.sql.conversion import AreaField as AreaField
from django.contrib.gis.db.models.sql.conversion import DistanceField as DistanceField
__all__ = ["AreaField", "DistanceField"]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/models/sql/conversion.pyi 0000664 0000000 0000000 00000002401 15260643574 0031243 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.gis.measure import Area, Distance
from django.db import models
from typing_extensions import TypeVar, override
# __set__ value type
_ST = TypeVar("_ST", contravariant=True)
# __get__ return type
_GT = TypeVar("_GT", covariant=True)
class AreaField(models.FloatField[_ST, _GT]):
_pyi_private_get_type: Area # type: ignore[assignment]
geo_field: Any
def __init__(self, geo_field: Any) -> None: ...
@override
def get_prep_value(self, value: Any) -> Any: ...
@override
def get_db_prep_value(self, value: Any, connection: Any, prepared: bool = ...) -> Any: ...
def from_db_value(self, value: Any, expression: Any, connection: Any) -> Any: ...
@override
def get_internal_type(self) -> Any: ...
class DistanceField(models.FloatField[_ST, _GT]):
_pyi_private_get_type: Distance # type: ignore[assignment]
geo_field: Any
def __init__(self, geo_field: Any) -> None: ...
@override
def get_prep_value(self, value: Any) -> Any: ...
@override
def get_db_prep_value(self, value: Any, connection: Any, prepared: bool = ...) -> Any: ...
def from_db_value(self, value: Any, expression: Any, connection: Any) -> Any: ...
@override
def get_internal_type(self) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/feeds.pyi 0000664 0000000 0000000 00000001657 15260643574 0025511 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable, Sequence
from typing import Any
from django.contrib.syndication.views import Feed as BaseFeed
from django.utils.feedgenerator import Atom1Feed, Rss201rev2Feed
from django.utils.xmlutils import SimplerXMLGenerator
from typing_extensions import override
class GeoFeedMixin:
def georss_coords(self, coords: Iterable[Sequence[float]]) -> str: ...
def add_georss_point(self, handler: SimplerXMLGenerator, coords: Sequence[float], w3c_geo: bool = ...) -> None: ...
def add_georss_element(self, handler: SimplerXMLGenerator, item: dict[str, Any], w3c_geo: bool = ...) -> None: ...
class GeoRSSFeed(Rss201rev2Feed, GeoFeedMixin):
@override
def rss_attributes(self) -> dict[str, str]: ...
class GeoAtom1Feed(Atom1Feed, GeoFeedMixin): ...
class W3CGeoFeed(Rss201rev2Feed, GeoFeedMixin):
@override
def rss_attributes(self) -> dict[str, str]: ...
class Feed(BaseFeed[Any, Any]): ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/forms/ 0000775 0000000 0000000 00000000000 15260643574 0025015 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/forms/__init__.pyi 0000664 0000000 0000000 00000001202 15260643574 0027272 0 ustar 00root root 0000000 0000000 from django.forms import *
from .fields import GeometryCollectionField as GeometryCollectionField
from .fields import GeometryField as GeometryField
from .fields import LineStringField as LineStringField
from .fields import MultiLineStringField as MultiLineStringField
from .fields import MultiPointField as MultiPointField
from .fields import MultiPolygonField as MultiPolygonField
from .fields import PointField as PointField
from .fields import PolygonField as PolygonField
from .widgets import BaseGeometryWidget as BaseGeometryWidget
from .widgets import OpenLayersWidget as OpenLayersWidget
from .widgets import OSMWidget as OSMWidget
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/forms/fields.pyi 0000664 0000000 0000000 00000001767 15260643574 0027021 0 ustar 00root root 0000000 0000000 from typing import Any
from django import forms
from typing_extensions import override
class GeometryField(forms.Field):
widget: Any
geom_type: str
max_geom_collections: int
srid: Any
def __init__(
self,
*,
srid: Any | None = ...,
geom_type: Any | None = ...,
max_geom_collections: int | None = None,
**kwargs: Any,
) -> None: ...
@override
def to_python(self, value: Any) -> Any: ...
@override
def clean(self, value: Any) -> Any: ...
@override
def has_changed(self, initial: Any, data: Any) -> Any: ...
class GeometryCollectionField(GeometryField):
geom_type: str
class PointField(GeometryField):
geom_type: str
class MultiPointField(GeometryField):
geom_type: str
class LineStringField(GeometryField):
geom_type: str
class MultiLineStringField(GeometryField):
geom_type: str
class PolygonField(GeometryField):
geom_type: str
class MultiPolygonField(GeometryField):
geom_type: str
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/forms/widgets.pyi 0000664 0000000 0000000 00000002103 15260643574 0027202 0 ustar 00root root 0000000 0000000 from logging import Logger
from typing import Any
from django.forms.widgets import Widget
from typing_extensions import override
logger: Logger
class BaseGeometryWidget(Widget):
base_layer: str | None
geom_type: str
map_srid: int
display_raw: bool
max_geom_collections: int
supports_3d: bool
template_name: str
attrs: Any
def __init__(self, attrs: Any | None = ...) -> None: ...
def serialize(self, value: Any) -> Any: ...
def deserialize(self, value: Any) -> Any: ...
@override
def get_context(self, name: Any, value: Any, attrs: Any) -> Any: ...
class OpenLayersWidget(BaseGeometryWidget):
base_layer: str
template_name: str
map_srid: int
class Media:
css: Any
js: Any
@override
def serialize(self, value: Any) -> Any: ...
@override
def deserialize(self, value: Any) -> Any: ...
class OSMWidget(OpenLayersWidget):
base_layer: str
template_name: str
default_lon: int
default_lat: int
default_zoom: int
def __init__(self, attrs: Any | None = ...) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/ 0000775 0000000 0000000 00000000000 15260643574 0024576 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/__init__.pyi 0000664 0000000 0000000 00000002537 15260643574 0027067 0 ustar 00root root 0000000 0000000 from django.contrib.gis.gdal.datasource import DataSource as DataSource
from django.contrib.gis.gdal.driver import Driver as Driver
from django.contrib.gis.gdal.envelope import Envelope as Envelope
from django.contrib.gis.gdal.error import GDALException as GDALException
from django.contrib.gis.gdal.error import SRSException as SRSException
from django.contrib.gis.gdal.error import check_err as check_err
from django.contrib.gis.gdal.geometries import OGRGeometry as OGRGeometry
from django.contrib.gis.gdal.geomtype import OGRGeomType as OGRGeomType
from django.contrib.gis.gdal.libgdal import GDAL_VERSION as GDAL_VERSION
from django.contrib.gis.gdal.libgdal import gdal_full_version as gdal_full_version
from django.contrib.gis.gdal.libgdal import gdal_version as gdal_version
from django.contrib.gis.gdal.raster.source import GDALRaster as GDALRaster
from django.contrib.gis.gdal.srs import AxisOrder as AxisOrder
from django.contrib.gis.gdal.srs import CoordTransform as CoordTransform
from django.contrib.gis.gdal.srs import SpatialReference as SpatialReference
__all__ = (
"GDAL_VERSION",
"AxisOrder",
"CoordTransform",
"DataSource",
"Driver",
"Envelope",
"GDALException",
"GDALRaster",
"OGRGeomType",
"OGRGeometry",
"SRSException",
"SpatialReference",
"check_err",
"gdal_full_version",
"gdal_version",
)
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/base.pyi 0000664 0000000 0000000 00000000211 15260643574 0026225 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.gis.ptr import CPointerBase
class GDALBase(CPointerBase):
null_ptr_exception_class: Any
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/datasource.pyi 0000664 0000000 0000000 00000001076 15260643574 0027457 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.gis.gdal.base import GDALBase
from django.contrib.gis.gdal.driver import Driver
from django.contrib.gis.gdal.layer import Layer
class DataSource(GDALBase):
destructor: Any
encoding: str
ptr: Any
driver: Driver
def __init__(self, ds_input: Any, ds_driver: bool = ..., write: bool = ..., encoding: str = ...) -> None: ...
def __getitem__(self, index: str | int) -> Layer: ...
def __len__(self) -> int: ...
@property
def layer_count(self) -> int: ...
@property
def name(self) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/driver.pyi 0000664 0000000 0000000 00000000504 15260643574 0026613 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.gis.gdal.base import GDALBase
class Driver(GDALBase):
ptr: Any
def __init__(self, dr_input: Any) -> None: ...
@classmethod
def ensure_registered(cls) -> None: ...
@classmethod
def driver_count(cls) -> int: ...
@property
def name(self) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/envelope.pyi 0000664 0000000 0000000 00000001442 15260643574 0027137 0 ustar 00root root 0000000 0000000 from ctypes import Structure
from typing import Any
from typing_extensions import override
class OGREnvelope(Structure):
MinX: float
MaxX: float
MinY: float
MaxY: float
class Envelope:
def __init__(self, *args: Any) -> None: ...
@override
def __eq__(self, other: object) -> bool: ...
def expand_to_include(self, *args: Any) -> None: ...
@property
def min_x(self) -> float: ...
@property
def min_y(self) -> float: ...
@property
def max_x(self) -> float: ...
@property
def max_y(self) -> float: ...
@property
def ur(self) -> tuple[float, float]: ...
@property
def ll(self) -> tuple[float, float]: ...
@property
def tuple(self) -> tuple[float, float, float, float]: ...
@property
def wkt(self) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/error.pyi 0000664 0000000 0000000 00000000310 15260643574 0026444 0 ustar 00root root 0000000 0000000 from typing import Any
class GDALException(Exception): ...
class SRSException(Exception): ...
OGRERR_DICT: Any
CPLERR_DICT: Any
ERR_NONE: int
def check_err(code: Any, cpl: bool = ...) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/feature.pyi 0000664 0000000 0000000 00000001750 15260643574 0026757 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.gis.gdal.base import GDALBase
from django.contrib.gis.gdal.field import Field
from django.contrib.gis.gdal.geometries import OGRGeometry
from django.contrib.gis.gdal.geomtype import OGRGeomType
from typing_extensions import override
class Feature(GDALBase):
destructor: Any
ptr: Any
def __init__(self, feat: Any, layer: Any) -> None: ...
def __getitem__(self, index: str | int) -> Field: ...
def __len__(self) -> int: ...
@override
def __eq__(self, other: object) -> bool: ...
@property
def encoding(self) -> str: ...
@property
def fid(self) -> int: ...
@property
def layer_name(self) -> str: ...
@property
def num_fields(self) -> int: ...
@property
def fields(self) -> list[str]: ...
@property
def geom(self) -> OGRGeometry: ...
@property
def geom_type(self) -> OGRGeomType: ...
def get(self, field: str) -> Any: ...
def index(self, field_name: str) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/field.pyi 0000664 0000000 0000000 00000003057 15260643574 0026411 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.gis.gdal.base import GDALBase
from typing_extensions import override
class Field(GDALBase):
ptr: Any
def __init__(self, feat: Any, index: Any) -> None: ...
def as_double(self) -> float | None: ...
def as_int(self, is_64: bool = ...) -> int | None: ...
def as_string(self) -> str | None: ...
def as_datetime(self) -> tuple[int, int, int, int, int, int, int] | None: ...
@property
def is_set(self) -> bool: ...
@property
def name(self) -> str: ...
@property
def precision(self) -> int: ...
@property
def type(self) -> int: ...
@property
def type_name(self) -> bytes: ...
@property
def value(self) -> Any: ...
@property
def width(self) -> int: ...
class OFTInteger(Field):
@property
@override
def value(self) -> Any: ...
@property
@override
def type(self) -> Any: ...
class OFTReal(Field):
@property
@override
def value(self) -> Any: ...
class OFTString(Field): ...
class OFTWideString(Field): ...
class OFTBinary(Field): ...
class OFTDate(Field):
@property
@override
def value(self) -> Any: ...
class OFTDateTime(Field):
@property
@override
def value(self) -> Any: ...
class OFTTime(Field):
@property
@override
def value(self) -> Any: ...
class OFTInteger64(OFTInteger): ...
class OFTIntegerList(Field): ...
class OFTRealList(Field): ...
class OFTStringList(Field): ...
class OFTWideStringList(Field): ...
class OFTInteger64List(Field): ...
OGRFieldTypes: Any
ROGRFieldTypes: Any
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/geometries.pyi 0000664 0000000 0000000 00000013341 15260643574 0027466 0 ustar 00root root 0000000 0000000 from typing import Any, AnyStr, ClassVar
from django.contrib.gis.gdal import CoordTransform, SpatialReference
from django.contrib.gis.gdal.base import GDALBase
from django.contrib.gis.gdal.envelope import Envelope
from django.contrib.gis.gdal.geomtype import OGRGeomType
from django.contrib.gis.geos import GEOSGeometry
from typing_extensions import override
class OGRGeometry(GDALBase):
destructor: Any
geos_support: ClassVar[bool]
ptr: Any
srs: SpatialReference | None
def __init__(self, geom_input: Any, srs: SpatialReference | None = ...) -> None: ...
@classmethod
def from_bbox(cls, bbox: tuple[float, float, float, float]) -> OGRGeometry: ...
@staticmethod
def from_json(geom_input: AnyStr) -> OGRGeometry: ...
@classmethod
def from_gml(cls, gml_string: AnyStr) -> OGRGeometry: ...
def __or__(self, other: OGRGeometry) -> OGRGeometry: ...
def __and__(self, other: OGRGeometry) -> OGRGeometry: ...
def __sub__(self, other: OGRGeometry) -> OGRGeometry: ...
def __xor__(self, other: OGRGeometry) -> OGRGeometry: ...
@override
def __eq__(self, other: object) -> bool: ...
@property
def dimension(self) -> int: ...
@property
def coord_dim(self) -> int: ...
@property
def geom_count(self) -> int: ...
@property
def point_count(self) -> int: ...
@property
def num_points(self) -> int: ...
@property
def num_coords(self) -> int: ...
@property
def geom_type(self) -> OGRGeomType: ...
@property
def geom_name(self) -> str: ...
@property
def area(self) -> float: ...
@property
def envelope(self) -> Envelope: ...
@property
def empty(self) -> bool: ...
@property
def extent(self) -> tuple[float, float, float, float]: ...
@property
def is_3d(self) -> bool: ...
def set_3d(self, value: bool) -> None: ...
@property
def is_measured(self) -> bool: ...
def set_measured(self, value: bool) -> None: ...
@property
def has_curve(self) -> bool: ...
def get_linear_geometry(self) -> OGRGeometry: ...
def get_curve_geometry(self) -> OGRGeometry: ...
srid: int | None
@property
def geos(self) -> GEOSGeometry: ...
@property
def gml(self) -> str: ...
@property
def hex(self) -> bytes: ...
@property
def json(self) -> str: ...
@property
def geojson(self) -> str: ...
@property
def kml(self) -> str: ...
@property
def wkb_size(self) -> int: ...
@property
def wkb(self) -> memoryview: ...
@property
def wkt(self) -> str: ...
@property
def ewkt(self) -> str: ...
def clone(self) -> Any: ...
def close_rings(self) -> None: ...
def transform(self, coord_trans: CoordTransform | SpatialReference | str | int, clone: bool = ...) -> Any: ...
def intersects(self, other: OGRGeometry) -> bool: ...
def equals(self, other: OGRGeometry) -> bool: ...
def disjoint(self, other: OGRGeometry) -> bool: ...
def touches(self, other: OGRGeometry) -> bool: ...
def crosses(self, other: OGRGeometry) -> bool: ...
def within(self, other: OGRGeometry) -> bool: ...
def contains(self, other: OGRGeometry) -> bool: ...
def overlaps(self, other: OGRGeometry) -> bool: ...
@property
def boundary(self) -> OGRGeometry: ...
@property
def convex_hull(self) -> OGRGeometry: ...
def difference(self, other: OGRGeometry) -> OGRGeometry: ...
def intersection(self, other: OGRGeometry) -> OGRGeometry: ...
def sym_difference(self, other: OGRGeometry) -> OGRGeometry: ...
def union(self, other: OGRGeometry) -> OGRGeometry: ...
@property
def centroid(self) -> Point: ...
class Point(OGRGeometry):
@property
def x(self) -> float: ...
@property
def y(self) -> float: ...
@property
def z(self) -> float | None: ...
@property
def m(self) -> float | None: ...
@property
def coords(self) -> tuple[float, float] | tuple[float, float, float]: ...
@property
def tuple(self) -> tuple[float, float] | tuple[float, float, float]: ...
class LineString(OGRGeometry):
def __getitem__(self, index: int) -> tuple[float, ...]: ...
def __len__(self) -> int: ...
@property
def coords(self) -> tuple[tuple[float, ...], ...]: ...
@property
def tuple(self) -> tuple[tuple[float, ...], ...]: ...
@property
def x(self) -> list[float]: ...
@property
def y(self) -> list[float]: ...
@property
def z(self) -> list[float] | None: ...
@property
def m(self) -> list[float] | None: ...
class LinearRing(LineString): ...
class Polygon(OGRGeometry):
def __len__(self) -> int: ...
def __getitem__(self, index: int) -> OGRGeometry: ...
@property
def shell(self) -> LinearRing: ...
@property
def exterior_ring(self) -> LinearRing: ...
@property
def coords(self) -> tuple[tuple[tuple[float, ...], ...], ...]: ...
@property
def tuple(self) -> tuple[tuple[tuple[float, ...]]]: ...
@property
@override
def point_count(self) -> int: ...
@property
@override
def centroid(self) -> Point: ...
class GeometryCollection(OGRGeometry):
def __getitem__(self, index: int) -> OGRGeometry: ...
def __len__(self) -> int: ...
def add(self, geom: OGRGeometry | str) -> None: ...
@property
@override
def point_count(self) -> int: ...
@property
def coords(self) -> tuple[Any, ...]: ...
@property
def tuple(self) -> tuple[Any, ...]: ...
class MultiPoint(GeometryCollection): ...
class MultiLineString(GeometryCollection): ...
class MultiPolygon(GeometryCollection): ...
class CircularString(LineString): ...
class CompoundCurve(OGRGeometry): ...
class CurvePolygon(Polygon): ...
class MultiCurve(GeometryCollection): ...
class MultiSurface(GeometryCollection): ...
GEO_CLASSES: Any
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/geomtype.pyi 0000664 0000000 0000000 00000000546 15260643574 0027157 0 ustar 00root root 0000000 0000000 from typing import Any
from typing_extensions import override
class OGRGeomType:
wkb25bit: int
num: int
def __init__(self, type_input: Any) -> None: ...
@override
def __eq__(self, other: object) -> bool: ...
@property
def name(self) -> str: ...
@property
def django(self) -> str: ...
def to_multi(self) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/layer.pyi 0000664 0000000 0000000 00000003317 15260643574 0026441 0 ustar 00root root 0000000 0000000 from collections.abc import Iterator
from typing import Any, AnyStr, Literal, overload
from django.contrib.gis.gdal.base import GDALBase
from django.contrib.gis.gdal.envelope import Envelope
from django.contrib.gis.gdal.feature import Feature
from django.contrib.gis.gdal.field import Field
from django.contrib.gis.gdal.geometries import OGRGeometry
from django.contrib.gis.gdal.geomtype import OGRGeomType
from django.contrib.gis.gdal.srs import SpatialReference
from django.contrib.gis.geos.geometry import GEOSGeometry
class Layer(GDALBase):
ptr: Any
def __init__(self, layer_ptr: Any, ds: Any) -> None: ...
@overload
def __getitem__(self, index: int) -> Feature: ...
@overload
def __getitem__(self, index: slice) -> list[Feature]: ...
def __iter__(self) -> Iterator[Feature]: ...
def __len__(self) -> int: ...
@property
def extent(self) -> Envelope: ...
@property
def name(self) -> str: ...
@property
def num_feat(self) -> int: ...
@property
def num_fields(self) -> int: ...
@property
def geom_type(self) -> OGRGeomType: ...
@property
def srs(self) -> SpatialReference: ...
@property
def fields(self) -> list[str]: ...
@property
def field_types(self) -> list[type[Field]]: ...
@property
def field_widths(self) -> list[int]: ...
@property
def field_precisions(self) -> list[int]: ...
spatial_filter: OGRGeometry | None
def get_fields(self, field_name: str) -> list[Any]: ...
@overload
def get_geoms(self, geos: Literal[False] = False) -> list[OGRGeometry]: ...
@overload
def get_geoms(self, geos: Literal[True]) -> list[GEOSGeometry]: ...
def test_capability(self, capability: AnyStr) -> bool: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/libgdal.pyi 0000664 0000000 0000000 00000001531 15260643574 0026717 0 ustar 00root root 0000000 0000000 import sys
from _ctypes import _CData
from collections.abc import Callable, Sequence
from ctypes import CDLL, _FuncPointer, _NamedFuncPointer
from logging import Logger
from typing import Any
logger: Logger
lib_path: str | None
lib_names: list[str] | None
lib_name: str
lgdal: CDLL
if sys.platform == "win32":
from ctypes import WinDLL
lwingdal: WinDLL
def std_call(func: str) -> _NamedFuncPointer: ...
def gdal_version() -> bytes: ...
def gdal_full_version() -> bytes: ...
def gdal_version_info() -> tuple[int, int, int]: ...
GDAL_VERSION: tuple[int, int, int]
CPLErrorHandler: type[_FuncPointer]
def function(
name: str,
# Taken from _ctypes.CFuncPtr
args: Sequence[type[_CData]],
restype: type[_CData] | Callable[[int], Any] | None,
) -> _NamedFuncPointer: ...
err_handler: _FuncPointer
set_error_handler: _NamedFuncPointer
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/prototypes/ 0000775 0000000 0000000 00000000000 15260643574 0027026 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/prototypes/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0031276 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/prototypes/ds.pyi 0000664 0000000 0000000 00000002262 15260643574 0030161 0 ustar 00root root 0000000 0000000 from typing import Any, Final
c_int_p: Any
GDAL_OF_READONLY: Final = 0x00
GDAL_OF_UPDATE: Final = 0x01
GDAL_OF_ALL: Final = 0x00
GDAL_OF_RASTER: Final = 0x02
GDAL_OF_VECTOR: Final = 0x04
register_all: Any
cleanup_all: Any
get_driver: Any
get_driver_by_name: Any
get_driver_count: Any
get_driver_description: Any
open_ds: Any
destroy_ds: Any
get_ds_name: Any
get_dataset_driver: Any
get_layer: Any
get_layer_by_name: Any
get_layer_count: Any
get_extent: Any
get_feature: Any
get_feature_count: Any
get_layer_defn: Any
get_layer_srs: Any
get_next_feature: Any
reset_reading: Any
test_capability: Any
get_spatial_filter: Any
set_spatial_filter: Any
set_spatial_filter_rect: Any
get_fd_geom_type: Any
get_fd_name: Any
get_feat_name: Any
get_field_count: Any
get_field_defn: Any
clone_feature: Any
destroy_feature: Any
feature_equal: Any
get_feat_geom_ref: Any
get_feat_field_count: Any
get_feat_field_defn: Any
get_fid: Any
get_field_as_datetime: Any
get_field_as_double: Any
get_field_as_integer: Any
get_field_as_integer64: Any
is_field_set: Any
get_field_as_string: Any
get_field_index: Any
get_field_name: Any
get_field_precision: Any
get_field_type: Any
get_field_type_name: Any
get_field_width: Any
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/prototypes/errcheck.pyi 0000664 0000000 0000000 00000001701 15260643574 0031336 0 ustar 00root root 0000000 0000000 from typing import Any
def arg_byref(args: Any, offset: int = ...) -> Any: ...
def ptr_byref(args: Any, offset: int = ...) -> Any: ...
def check_const_string(result: Any, func: Any, cargs: Any, offset: Any | None = ..., cpl: bool = ...) -> Any: ...
def check_string(result: Any, func: Any, cargs: Any, offset: int = ..., str_result: bool = ...) -> Any: ...
def check_envelope(result: Any, func: Any, cargs: Any, offset: int = ...) -> Any: ...
def check_geom(result: Any, func: Any, cargs: Any) -> Any: ...
def check_geom_offset(result: Any, func: Any, cargs: Any, offset: int = ...) -> Any: ...
def check_srs(result: Any, func: Any, cargs: Any) -> Any: ...
def check_arg_errcode(result: Any, func: Any, cargs: Any, cpl: bool = ...) -> Any: ...
def check_errcode(result: Any, func: Any, cargs: Any, cpl: bool = ...) -> None: ...
def check_pointer(result: Any, func: Any, cargs: Any) -> Any: ...
def check_str_arg(result: Any, func: Any, cargs: Any) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/prototypes/generation.pyi 0000664 0000000 0000000 00000002065 15260643574 0031707 0 ustar 00root root 0000000 0000000 from ctypes import c_char_p
from typing import Any
class gdal_char_p(c_char_p): ...
def bool_output(func: Any, argtypes: Any, errcheck: Any | None = ...) -> Any: ...
def double_output(func: Any, argtypes: Any, errcheck: bool = ..., strarg: bool = ..., cpl: bool = ...) -> Any: ...
def geom_output(func: Any, argtypes: Any, offset: Any | None = ...) -> Any: ...
def int_output(func: Any, argtypes: Any, errcheck: Any | None = ...) -> Any: ...
def int64_output(func: Any, argtypes: Any) -> Any: ...
def srs_output(func: Any, argtypes: Any) -> Any: ...
def const_string_output(
func: Any, argtypes: Any, offset: Any | None = ..., decoding: Any | None = ..., cpl: bool = ...
) -> Any: ...
def string_output(
func: Any, argtypes: Any, offset: int = ..., str_result: bool = ..., decoding: Any | None = ...
) -> Any: ...
def void_output(func: Any, argtypes: Any, errcheck: bool = ..., cpl: bool = ...) -> Any: ...
def voidptr_output(func: Any, argtypes: Any, errcheck: bool = ...) -> Any: ...
def chararray_output(func: Any, argtypes: Any, errcheck: bool = ...) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/prototypes/geom.pyi 0000664 0000000 0000000 00000002153 15260643574 0030501 0 ustar 00root root 0000000 0000000 from typing import Any
def env_func(f: Any, argtypes: Any) -> Any: ...
def pnt_func(f: Any) -> Any: ...
def topology_func(f: Any) -> Any: ...
from_json: Any
to_json: Any
to_kml: Any
getx: Any
gety: Any
getz: Any
getm: Any
from_wkb: Any
from_wkt: Any
from_gml: Any
create_geom: Any
clone_geom: Any
get_geom_ref: Any
get_boundary: Any
geom_convex_hull: Any
geom_diff: Any
geom_intersection: Any
geom_sym_diff: Any
geom_union: Any
is_3d: Any
set_3d: Any
is_measured: Any
set_measured: Any
has_curve_geom: Any
get_linear_geom: Any
get_curve_geom: Any
add_geom: Any
import_wkt: Any
destroy_geom: Any
to_wkb: Any
to_iso_wkb: Any
to_wkt: Any
to_iso_wkt: Any
to_gml: Any
get_wkbsize: Any
assign_srs: Any
get_geom_srs: Any
get_area: Any
get_centroid: Any
get_dims: Any
get_coord_dim: Any
set_coord_dim: Any
is_empty: Any
get_geom_count: Any
get_geom_name: Any
get_geom_type: Any
get_point_count: Any
get_point: Any
geom_close_rings: Any
ogr_contains: Any
ogr_crosses: Any
ogr_disjoint: Any
ogr_equals: Any
ogr_intersects: Any
ogr_overlaps: Any
ogr_touches: Any
ogr_within: Any
geom_transform: Any
geom_transform_to: Any
get_envelope: Any
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/prototypes/raster.pyi 0000664 0000000 0000000 00000001661 15260643574 0031055 0 ustar 00root root 0000000 0000000 from typing import Any
create_ds: Any
open_ds: Any
close_ds: Any
flush_ds: Any
copy_ds: Any
add_band_ds: Any
get_ds_description: Any
get_ds_driver: Any
get_ds_xsize: Any
get_ds_ysize: Any
get_ds_raster_count: Any
get_ds_raster_band: Any
get_ds_projection_ref: Any
set_ds_projection_ref: Any
get_ds_geotransform: Any
set_ds_geotransform: Any
get_ds_metadata: Any
set_ds_metadata: Any
get_ds_metadata_domain_list: Any
get_ds_metadata_item: Any
set_ds_metadata_item: Any
free_dsl: Any
get_ds_info: Any
band_io: Any
get_band_xsize: Any
get_band_ysize: Any
get_band_index: Any
get_band_description: Any
get_band_ds: Any
get_band_datatype: Any
get_band_color_interp: Any
get_band_nodata_value: Any
set_band_nodata_value: Any
delete_band_nodata_value: Any
get_band_statistics: Any
compute_band_statistics: Any
reproject_image: Any
auto_create_warped_vrt: Any
create_vsi_file_from_mem_buffer: Any
get_mem_buffer_from_vsi_file: Any
unlink_vsi_file: Any
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/prototypes/srs.pyi 0000664 0000000 0000000 00000001146 15260643574 0030362 0 ustar 00root root 0000000 0000000 from typing import Any
def srs_double(f: Any) -> Any: ...
def units_func(f: Any) -> Any: ...
clone_srs: Any
new_srs: Any
release_srs: Any
destroy_srs: Any
srs_validate: Any
set_axis_strategy: Any
semi_major: Any
semi_minor: Any
invflattening: Any
from_wkt: Any
from_proj: Any
from_epsg: Any
from_xml: Any
from_user_input: Any
morph_to_esri: Any
morph_from_esri: Any
identify_epsg: Any
linear_units: Any
angular_units: Any
to_wkt: Any
to_proj: Any
to_pretty_wkt: Any
to_xml: Any
get_attr_value: Any
get_auth_name: Any
get_auth_code: Any
isgeographic: Any
islocal: Any
isprojected: Any
new_ct: Any
destroy_ct: Any
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/raster/ 0000775 0000000 0000000 00000000000 15260643574 0026076 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/raster/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0030346 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/raster/band.pyi 0000664 0000000 0000000 00000003041 15260643574 0027523 0 ustar 00root root 0000000 0000000 from typing import Any, Literal, overload
from django.contrib.gis.gdal.raster.base import GDALRasterBase
class GDALBand(GDALRasterBase):
source: Any
def __init__(self, source: Any, index: Any) -> None: ...
@property
def description(self) -> str: ...
@property
def width(self) -> int: ...
@property
def height(self) -> int: ...
@property
def pixel_count(self) -> int: ...
def statistics(
self, refresh: bool = ..., approximate: bool = ...
) -> tuple[float, float, float, float] | tuple[None, None, None, None]: ...
@property
def min(self) -> float | None: ...
@property
def max(self) -> float | None: ...
@property
def mean(self) -> float | None: ...
@property
def std(self) -> float | None: ...
@property
def nodata_value(self) -> float | None: ...
@nodata_value.setter
def nodata_value(self, value: float | None) -> None: ...
@overload
def datatype(self, as_string: Literal[False] = False) -> int: ...
@overload
def datatype(self, as_string: Literal[True]) -> str: ...
@overload
def color_interp(self, as_string: Literal[False] = False) -> int: ...
@overload
def color_interp(self, as_string: Literal[True]) -> str: ...
def data(
self,
data: Any | None = ...,
offset: Any | None = ...,
size: Any | None = ...,
shape: Any | None = ...,
as_memoryview: bool = ...,
) -> Any: ...
class BandList(list[GDALBand]):
source: Any
def __init__(self, source: Any) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/raster/base.pyi 0000664 0000000 0000000 00000000341 15260643574 0027531 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.gis.gdal.base import GDALBase
class GDALRasterBase(GDALBase):
@property
def metadata(self) -> Any: ...
@metadata.setter
def metadata(self, value: Any) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/raster/const.pyi 0000664 0000000 0000000 00000000450 15260643574 0027746 0 ustar 00root root 0000000 0000000 GDAL_PIXEL_TYPES: dict[int, str]
GDAL_INTEGER_TYPES: list[int]
GDAL_TO_CTYPES: list[type | None]
GDAL_RESAMPLE_ALGORITHMS: dict[str, int]
GDAL_COLOR_TYPES: dict[int, str]
VSI_FILESYSTEM_PREFIX: str
VSI_MEM_FILESYSTEM_BASE_PATH: str
VSI_TAKE_BUFFER_OWNERSHIP: bool
VSI_DELETE_BUFFER_ON_READ: bool
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/raster/source.pyi 0000664 0000000 0000000 00000005135 15260643574 0030125 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from ctypes import c_void_p
from pathlib import Path
from typing import Any
from django.contrib.gis.gdal.driver import Driver
from django.contrib.gis.gdal.raster.band import BandList
from django.contrib.gis.gdal.raster.base import GDALRasterBase
from django.contrib.gis.gdal.srs import SpatialReference
from django.core.exceptions import SuspiciousOperation
from django.utils.functional import cached_property
from typing_extensions import override
class DisallowedRasterLookup(SuspiciousOperation): ...
class TransformPoint(list[Sequence[float]]):
indices: dict[str, tuple[int, int]]
def __init__(self, raster: GDALRaster, prop: str) -> None: ...
@property
def x(self) -> float: ...
@x.setter
def x(self, value: float) -> None: ...
@property
def y(self) -> float: ...
@y.setter
def y(self, value: float) -> None: ...
class GDALRaster(GDALRasterBase):
destructor: Any
def __init__(self, ds_input: str | Path | bytes | dict[str, Any] | c_void_p, write: bool = ...) -> None: ...
@override
def __del__(self) -> None: ...
@classmethod
def check_raster_lookup_value(cls, ds_input: Any) -> None: ...
@property
def vsi_buffer(self) -> bytes | None: ...
@cached_property
def is_vsi_based(self) -> bool: ...
@property
def name(self) -> str: ...
@cached_property
def driver(self) -> Driver: ...
@property
def width(self) -> int: ...
@property
def height(self) -> int: ...
@property
def srs(self) -> SpatialReference | None: ...
@srs.setter
def srs(self, value: SpatialReference | int | str) -> None: ...
@property
def srid(self) -> int: ...
@srid.setter
def srid(self, value: int) -> None: ...
@property
def geotransform(self) -> list[float]: ...
@geotransform.setter
def geotransform(self, values: list[float]) -> None: ...
@property
def origin(self) -> TransformPoint: ...
@property
def scale(self) -> TransformPoint: ...
@property
def skew(self) -> TransformPoint: ...
@property
def extent(self) -> tuple[float, float, float, float]: ...
@property
def bands(self) -> BandList: ...
def warp(self, ds_input: Any, resampling: str = ..., max_error: float = ...) -> GDALRaster: ...
def clone(self, name: str | None = ...) -> GDALRaster: ...
def transform(
self,
srs: SpatialReference | int | str,
driver: Any | None = ...,
name: str | None = ...,
resampling: str = ...,
max_error: float = ...,
) -> GDALRaster: ...
@property
def info(self) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/srs.pyi 0000664 0000000 0000000 00000004361 15260643574 0026134 0 ustar 00root root 0000000 0000000 from enum import IntEnum
from typing import Any, AnyStr, Self, cast
from django.contrib.gis.gdal.base import GDALBase
class AxisOrder(IntEnum):
TRADITIONAL = cast(int, ...)
AUTHORITY = cast(int, ...)
class SpatialReference(GDALBase):
destructor: Any
axis_order: AxisOrder
ptr: Any
def __init__(self, srs_input: str | int = ..., srs_type: str = ..., axis_order: AxisOrder | None = ...) -> None: ...
def __getitem__(self, target: str | tuple[str, int]) -> str: ...
def attr_value(self, target: AnyStr, index: int = ...) -> str: ...
def auth_name(self, target: AnyStr) -> str: ...
def auth_code(self, target: AnyStr) -> str: ...
def clone(self) -> Self: ...
def from_esri(self) -> None: ...
def identify_epsg(self) -> None: ...
def to_esri(self) -> None: ...
def validate(self) -> None: ...
@property
def name(self) -> str | None: ...
@property
def srid(self) -> int | None: ...
@property
def linear_name(self) -> str: ...
@property
def linear_units(self) -> float: ...
@property
def angular_name(self) -> str: ...
@property
def angular_units(self) -> float: ...
@property
def units(self) -> tuple[float | None, str | None]: ...
@property
def ellipsoid(self) -> tuple[float, float, float]: ...
@property
def semi_major(self) -> float: ...
@property
def semi_minor(self) -> float: ...
@property
def inverse_flattening(self) -> float: ...
@property
def geographic(self) -> bool: ...
@property
def local(self) -> bool: ...
@property
def projected(self) -> bool: ...
def import_epsg(self, epsg: int) -> None: ...
def import_proj(self, proj: AnyStr) -> None: ...
def import_user_input(self, user_input: AnyStr) -> None: ...
def import_wkt(self, wkt: AnyStr) -> None: ...
def import_xml(self, xml: AnyStr) -> None: ...
@property
def wkt(self) -> str: ...
@property
def pretty_wkt(self) -> str: ...
@property
def proj(self) -> str: ...
@property
def proj4(self) -> str: ...
@property
def xml(self) -> str: ...
class CoordTransform(GDALBase):
destructor: Any
ptr: Any
def __init__(self, source: SpatialReference, target: SpatialReference) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geoip2.pyi 0000664 0000000 0000000 00000003741 15260643574 0025604 0 ustar 00root root 0000000 0000000 from ipaddress import IPv4Address, IPv6Address
from typing import Final, TypeAlias, TypedDict
from _typeshed import StrPath
from django.contrib.gis.geos import Point
from django.utils.functional import cached_property
HAS_GEOIP2: bool
SUPPORTED_DATABASE_TYPES: set[str]
_CoordType: TypeAlias = tuple[float, float] | tuple[None, None]
_QueryType: TypeAlias = str | IPv4Address | IPv6Address
class _CityResponse(TypedDict):
accuracy_radius: int | None
city: str
continent_code: str
continent_name: str
country_code: str
country_name: str
is_in_european_union: bool
latitude: float
longitude: float
metro_code: int | None
postal_code: str | None
region_code: str | None
region_name: str | None
time_zone: str | None
# Kept for backward compatibility.
dma_code: int | None
region: str | None
class _CountryResponse(TypedDict):
continent_code: str
continent_name: str
country_code: str
country_name: str
is_in_european_union: bool
class GeoIP2Exception(Exception): ...
class GeoIP2:
MODE_AUTO: Final = 0
MODE_MMAP_EXT: Final = 1
MODE_MMAP: Final = 2
MODE_FILE: Final = 4
MODE_MEMORY: Final = 8
cache_options: Final[frozenset[int]]
def __init__(
self,
path: StrPath | None = None,
cache: int = 0,
country: str | None = None,
city: str | None = None,
) -> None: ...
def __del__(self) -> None: ...
@cached_property
def is_city(self) -> bool: ...
@cached_property
def is_country(self) -> bool: ...
def city(self, query: _QueryType) -> _CityResponse: ...
def country_code(self, query: _QueryType) -> str: ...
def country_name(self, query: _QueryType) -> str: ...
def country(self, query: _QueryType) -> _CountryResponse: ...
def lon_lat(self, query: _QueryType) -> _CoordType: ...
def lat_lon(self, query: _QueryType) -> _CoordType: ...
def geos(self, query: _QueryType) -> Point: ...
__all__ = ["HAS_GEOIP2"]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geometry.pyi 0000664 0000000 0000000 00000000141 15260643574 0026241 0 ustar 00root root 0000000 0000000 from re import Pattern
hex_regex: Pattern[str]
wkt_regex: Pattern[str]
json_regex: Pattern[str]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/ 0000775 0000000 0000000 00000000000 15260643574 0024624 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/__init__.pyi 0000664 0000000 0000000 00000001563 15260643574 0027113 0 ustar 00root root 0000000 0000000 from ..geometry import hex_regex as hex_regex
from ..geometry import wkt_regex as wkt_regex
from .collections import GeometryCollection as GeometryCollection
from .collections import MultiLineString as MultiLineString
from .collections import MultiPoint as MultiPoint
from .collections import MultiPolygon as MultiPolygon
from .error import GEOSException as GEOSException
from .factory import fromfile as fromfile
from .factory import fromstr as fromstr
from .geometry import GEOSGeometry as GEOSGeometry
from .io import WKBReader as WKBReader
from .io import WKBWriter as WKBWriter
from .io import WKTReader as WKTReader
from .io import WKTWriter as WKTWriter
from .libgeos import geos_version as geos_version
from .linestring import LinearRing as LinearRing
from .linestring import LineString as LineString
from .point import Point as Point
from .polygon import Polygon as Polygon
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/base.pyi 0000664 0000000 0000000 00000000271 15260643574 0026261 0 ustar 00root root 0000000 0000000 from django.contrib.gis.geos.error import GEOSException
from django.contrib.gis.ptr import CPointerBase
class GEOSBase(CPointerBase):
null_ptr_exception_class: type[GEOSException]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/collections.pyi 0000664 0000000 0000000 00000001134 15260643574 0027664 0 ustar 00root root 0000000 0000000 from collections.abc import Iterator
from typing import Any
from django.contrib.gis.geos.geometry import GEOSGeometry, LinearGeometryMixin
class GeometryCollection(GEOSGeometry):
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
def __iter__(self) -> Iterator[GEOSGeometry]: ...
def __len__(self) -> int: ...
@property
def coords(self) -> tuple[Any, ...]: ...
@property
def tuple(self) -> tuple[Any, ...]: ...
class MultiPoint(GeometryCollection): ...
class MultiLineString(LinearGeometryMixin, GeometryCollection): ...
class MultiPolygon(GeometryCollection): ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/coordseq.pyi 0000664 0000000 0000000 00000002534 15260643574 0027172 0 ustar 00root root 0000000 0000000 from collections.abc import Iterator
from typing import Any, Self
from django.contrib.gis.geos.base import GEOSBase
class GEOSCoordSeq(GEOSBase):
ptr_type: Any
def __init__(self, ptr: Any, z: bool = ...) -> None: ...
def __iter__(self) -> Iterator[tuple[float, ...]]: ...
def __len__(self) -> int: ...
def __getitem__(self, index: int) -> Any: ...
def __setitem__(self, index: int, value: Any) -> None: ...
def getOrdinate(self, dimension: int, index: int) -> float: ...
def setOrdinate(self, dimension: int, index: int, value: float) -> None: ...
def getX(self, index: int) -> float: ...
def setX(self, index: int, value: float) -> None: ...
def getY(self, index: int) -> float: ...
def setY(self, index: int, value: float) -> None: ...
def getZ(self, index: int) -> float: ...
def setZ(self, index: int, value: float) -> None: ...
def getM(self, index: int) -> float: ...
def setM(self, index: int, value: float) -> None: ...
@property
def size(self) -> int: ...
@property
def dims(self) -> int: ...
@property
def hasz(self) -> bool: ...
@property
def hasm(self) -> bool: ...
def clone(self) -> Self: ...
@property
def kml(self) -> str: ...
@property
def tuple(self) -> tuple[Any, ...]: ...
@property
def is_counterclockwise(self) -> bool: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/error.pyi 0000664 0000000 0000000 00000000044 15260643574 0026476 0 ustar 00root root 0000000 0000000 class GEOSException(Exception): ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/factory.pyi 0000664 0000000 0000000 00000000466 15260643574 0027024 0 ustar 00root root 0000000 0000000 from typing import Any, Protocol, type_check_only
from django.contrib.gis.geos.geometry import GEOSGeometry
@type_check_only
class _Reader(Protocol):
def read(self) -> str | bytes: ...
def fromfile(file_h: str | _Reader) -> GEOSGeometry: ...
def fromstr(string: str, **kwargs: Any) -> GEOSGeometry: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/geometry.pyi 0000664 0000000 0000000 00000013215 15260643574 0027204 0 ustar 00root root 0000000 0000000 from typing import Any, Literal, Self, overload
from django.contrib.gis.gdal import CoordTransform, SpatialReference
from django.contrib.gis.gdal.geometries import OGRGeometry
from django.contrib.gis.geos.base import GEOSBase
from django.contrib.gis.geos.coordseq import GEOSCoordSeq
from django.contrib.gis.geos.mutable_list import ListMixin
from django.contrib.gis.geos.point import Point
from django.contrib.gis.geos.prepared import PreparedGeometry
from django.utils.deconstruct import _Deconstructible
from typing_extensions import override
class GEOSGeometryBase(GEOSBase):
ptr_type: Any
destructor: Any
has_cs: bool
def __init__(self, ptr: Any, cls: Any) -> None: ...
def __copy__(self) -> Self: ...
def __deepcopy__(self, memodict: Any) -> Self: ...
@staticmethod
def from_ewkt(ewkt: str) -> GEOSGeometry: ...
@classmethod
def from_gml(cls, gml_string: str) -> GEOSGeometry: ...
@override
def __eq__(self, other: object) -> bool: ...
@override
def __hash__(self) -> int: ...
def __or__(self, other: GEOSGeometry) -> GEOSGeometry: ...
def __and__(self, other: GEOSGeometry) -> GEOSGeometry: ...
def __sub__(self, other: GEOSGeometry) -> GEOSGeometry: ...
def __xor__(self, other: GEOSGeometry) -> GEOSGeometry: ...
@property
def coord_seq(self) -> GEOSCoordSeq | None: ...
@property
def geom_type(self) -> str: ...
@property
def geom_typeid(self) -> int: ...
@property
def num_geom(self) -> int: ...
@property
def num_coords(self) -> int: ...
@property
def num_points(self) -> int: ...
@property
def dims(self) -> int: ...
@overload
def normalize(self, clone: Literal[False] = False) -> None: ...
@overload
def normalize(self, clone: Literal[True]) -> Self: ...
def make_valid(self) -> GEOSGeometry: ...
@property
def empty(self) -> bool: ...
@property
def hasz(self) -> bool: ...
@property
def hasm(self) -> bool: ...
@property
def ring(self) -> bool: ...
@property
def simple(self) -> bool: ...
@property
def valid(self) -> bool: ...
@property
def valid_reason(self) -> str: ...
def contains(self, other: GEOSGeometry) -> bool: ...
def covers(self, other: GEOSGeometry) -> bool: ...
def crosses(self, other: GEOSGeometry) -> bool: ...
def disjoint(self, other: GEOSGeometry) -> bool: ...
def equals(self, other: GEOSGeometry) -> bool: ...
def equals_exact(self, other: GEOSGeometry, tolerance: float = ...) -> bool: ...
def equals_identical(self, other: GEOSGeometry) -> bool: ...
def intersects(self, other: GEOSGeometry) -> bool: ...
def overlaps(self, other: GEOSGeometry) -> bool: ...
def relate_pattern(self, other: GEOSGeometry, pattern: str) -> bool: ...
def touches(self, other: GEOSGeometry) -> bool: ...
def within(self, other: GEOSGeometry) -> bool: ...
@property
def srid(self) -> int | None: ...
@srid.setter
def srid(self, srid: int | None) -> None: ...
@property
def ewkt(self) -> str: ...
@property
def wkt(self) -> str: ...
@property
def hex(self) -> bytes: ...
@property
def hexewkb(self) -> bytes: ...
@property
def json(self) -> str: ...
@property
def geojson(self) -> str: ...
@property
def wkb(self) -> memoryview: ...
@property
def ewkb(self) -> memoryview: ...
@property
def kml(self) -> str: ...
@property
def prepared(self) -> PreparedGeometry: ...
@property
def ogr(self) -> OGRGeometry: ...
@property
def srs(self) -> SpatialReference | None: ...
@property
def crs(self) -> SpatialReference | None: ...
ptr: Any
def transform(self, ct: CoordTransform | SpatialReference | str | int, clone: bool = ...) -> GEOSGeometry: ...
@property
def boundary(self) -> GEOSGeometry: ...
def buffer(self, width: float, quadsegs: int = ...) -> GEOSGeometry: ...
def buffer_with_style(
self,
width: float,
quadsegs: int = ...,
end_cap_style: int = ...,
join_style: int = ...,
mitre_limit: float = ...,
) -> GEOSGeometry: ...
@property
def centroid(self) -> Point: ...
@property
def convex_hull(self) -> GEOSGeometry: ...
def difference(self, other: GEOSGeometry) -> GEOSGeometry: ...
@property
def envelope(self) -> GEOSGeometry: ...
def intersection(self, other: GEOSGeometry) -> GEOSGeometry: ...
@property
def point_on_surface(self) -> Point: ...
def relate(self, other: GEOSGeometry) -> str: ...
def simplify(self, tolerance: float = ..., preserve_topology: bool = ...) -> GEOSGeometry: ...
def sym_difference(self, other: GEOSGeometry) -> GEOSGeometry: ...
@property
def unary_union(self) -> GEOSGeometry: ...
def union(self, other: GEOSGeometry) -> GEOSGeometry: ...
@property
def area(self) -> float: ...
def distance(self, other: GEOSGeometry) -> float: ...
@property
def extent(self) -> tuple[float, float, float, float]: ...
@property
def length(self) -> float: ...
def clone(self) -> Self: ...
class LinearGeometryMixin:
def interpolate(self, distance: float) -> Point: ...
def interpolate_normalized(self, distance: float) -> Point: ...
def project(self, point: Point) -> float: ...
def project_normalized(self, point: Point) -> float: ...
@property
def merged(self) -> GEOSGeometry: ...
@property
def closed(self) -> bool: ...
class GEOSGeometry(_Deconstructible, GEOSGeometryBase, ListMixin):
def __init__(
self,
geo_input: Any,
srid: int | None = ...,
*,
max_geom_collections: int | None = ...,
) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/io.pyi 0000664 0000000 0000000 00000001174 15260643574 0025761 0 ustar 00root root 0000000 0000000 from django.contrib.gis.geos.geometry import GEOSGeometry
from django.contrib.gis.geos.prototypes.io import WKBWriter as WKBWriter
from django.contrib.gis.geos.prototypes.io import WKTWriter as WKTWriter
from django.contrib.gis.geos.prototypes.io import _WKBReader, _WKTReader
from typing_extensions import override
class WKBReader(_WKBReader):
@override
def read(self, wkb: bytes | str) -> GEOSGeometry: ... # type: ignore[override]
class WKTReader(_WKTReader):
@override
def read(self, wkt: bytes | str) -> GEOSGeometry: ... # type: ignore[override]
__all__ = ["WKBReader", "WKBWriter", "WKTReader", "WKTWriter"]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/libgeos.pyi 0000664 0000000 0000000 00000001572 15260643574 0027000 0 ustar 00root root 0000000 0000000 from ctypes import Structure
from logging import Logger
from typing import Any
from django.utils.functional import cached_property
logger: Logger
def load_geos() -> Any: ...
NOTICEFUNC: Any
notice_h: Any
ERRORFUNC: Any
error_h: Any
class GEOSGeom_t(Structure): ...
class GEOSPrepGeom_t(Structure): ...
class GEOSCoordSeq_t(Structure): ...
class GEOSContextHandle_t(Structure): ...
GEOM_PTR: Any
PREPGEOM_PTR: Any
CS_PTR: Any
CONTEXT_PTR: Any
lgeos: Any
class GEOSFuncFactory:
argtypes: Any
restype: Any
errcheck: Any
func_name: Any
def __init__(
self, func_name: Any, *, restype: Any | None = ..., errcheck: Any | None = ..., argtypes: Any | None = ...
) -> None: ...
def __call__(self, *args: Any) -> Any: ...
@cached_property
def func(self) -> Any: ...
def geos_version() -> bytes: ...
def geos_version_tuple() -> tuple[int, ...]: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/linestring.pyi 0000664 0000000 0000000 00000001376 15260643574 0027534 0 ustar 00root root 0000000 0000000 from collections.abc import Iterator
from typing import Any
from django.contrib.gis.geos.geometry import GEOSGeometry, LinearGeometryMixin
class LineString(LinearGeometryMixin, GEOSGeometry):
has_cs: bool
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
def __iter__(self) -> Iterator[tuple[float, ...]]: ...
def __len__(self) -> int: ...
@property
def coords(self) -> tuple[tuple[float, ...]]: ...
@property
def tuple(self) -> tuple[tuple[float, ...]]: ...
@property
def array(self) -> Any: ...
@property
def x(self) -> Any: ...
@property
def y(self) -> Any: ...
@property
def z(self) -> Any: ...
class LinearRing(LineString):
@property
def is_counterclockwise(self) -> bool: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/mutable_list.pyi 0000664 0000000 0000000 00000002410 15260643574 0030030 0 ustar 00root root 0000000 0000000 from typing import Any, Self
from typing_extensions import override
class ListMixin:
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
def __getitem__(self, index: int | slice) -> Any: ...
def __delitem__(self, index: int | slice) -> None: ...
def __setitem__(self, index: int | slice, val: Any) -> None: ...
def __add__(self, other: Any) -> Self: ...
def __radd__(self, other: Any) -> Any: ...
def __iadd__(self, other: Any) -> Self: ...
def __mul__(self, n: int) -> Self: ...
def __rmul__(self, n: int) -> Self: ...
def __imul__(self, n: int) -> Self: ...
@override
def __eq__(self, other: object) -> bool: ...
def __lt__(self, other: Any) -> bool: ...
def __le__(self, other: Any) -> bool: ...
def __gt__(self, other: Any) -> bool: ...
def __ge__(self, other: Any) -> bool: ...
def count(self, val: Any) -> int: ...
def index(self, val: Any) -> int: ...
def append(self, val: Any) -> None: ...
def extend(self, vals: Any) -> None: ...
def insert(self, index: int, val: Any) -> None: ...
def pop(self, index: int = ...) -> Any: ...
def remove(self, val: Any) -> None: ...
def reverse(self) -> None: ...
def sort(self, key: Any | None = ..., reverse: bool = ...) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/point.pyi 0000664 0000000 0000000 00000001651 15260643574 0026503 0 ustar 00root root 0000000 0000000 from collections.abc import Iterator
from typing import Any
from django.contrib.gis.geos.geometry import GEOSGeometry
class Point(GEOSGeometry):
has_cs: bool
def __init__(
self, x: Any | None = ..., y: Any | None = ..., z: Any | None = ..., srid: Any | None = ...
) -> None: ...
def __iter__(self) -> Iterator[float]: ...
def __len__(self) -> int: ...
@property
def x(self) -> float: ...
@x.setter
def x(self, value: float) -> None: ...
@property
def y(self) -> float: ...
@y.setter
def y(self, value: float) -> None: ...
@property
def z(self) -> float | None: ...
@z.setter
def z(self, value: float) -> None: ...
@property
def coords(self) -> tuple[float, ...]: ...
@coords.setter
def coords(self, tup: Any) -> None: ...
@property
def tuple(self) -> tuple[float, ...]: ...
@tuple.setter
def tuple(self, tup: Any) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/polygon.pyi 0000664 0000000 0000000 00000001311 15260643574 0027032 0 ustar 00root root 0000000 0000000 from collections.abc import Iterator
from typing import Any
from django.contrib.gis.geos.geometry import GEOSGeometry
from django.contrib.gis.geos.linestring import LinearRing
class Polygon(GEOSGeometry):
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
def __iter__(self) -> Iterator[LinearRing]: ...
def __len__(self) -> int: ...
@classmethod
def from_bbox(cls, bbox: tuple[float, float, float, float]) -> Polygon: ...
@property
def num_interior_rings(self) -> int: ...
exterior_ring: LinearRing
shell: LinearRing
@property
def coords(self) -> tuple[tuple[tuple[float, ...]]]: ...
@property
def tuple(self) -> tuple[tuple[tuple[float, ...]]]: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/prepared.pyi 0000664 0000000 0000000 00000001341 15260643574 0027150 0 ustar 00root root 0000000 0000000 from typing import Any
from .base import GEOSBase
from .geometry import GEOSGeometry
class PreparedGeometry(GEOSBase):
ptr_type: Any
destructor: Any
ptr: Any
def __init__(self, geom: Any) -> None: ...
def contains(self, other: GEOSGeometry) -> bool: ...
def contains_properly(self, other: GEOSGeometry) -> bool: ...
def covers(self, other: GEOSGeometry) -> bool: ...
def intersects(self, other: GEOSGeometry) -> bool: ...
def crosses(self, other: GEOSGeometry) -> bool: ...
def disjoint(self, other: GEOSGeometry) -> bool: ...
def overlaps(self, other: GEOSGeometry) -> bool: ...
def touches(self, other: GEOSGeometry) -> bool: ...
def within(self, other: GEOSGeometry) -> bool: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/prototypes/ 0000775 0000000 0000000 00000000000 15260643574 0027054 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/prototypes/__init__.pyi 0000664 0000000 0000000 00000010231 15260643574 0031333 0 ustar 00root root 0000000 0000000 from django.contrib.gis.geos.prototypes.coordseq import create_cs as create_cs
from django.contrib.gis.geos.prototypes.coordseq import cs_clone as cs_clone
from django.contrib.gis.geos.prototypes.coordseq import cs_getdims as cs_getdims
from django.contrib.gis.geos.prototypes.coordseq import cs_getordinate as cs_getordinate
from django.contrib.gis.geos.prototypes.coordseq import cs_getsize as cs_getsize
from django.contrib.gis.geos.prototypes.coordseq import cs_getx as cs_getx
from django.contrib.gis.geos.prototypes.coordseq import cs_gety as cs_gety
from django.contrib.gis.geos.prototypes.coordseq import cs_getz as cs_getz
from django.contrib.gis.geos.prototypes.coordseq import cs_is_ccw as cs_is_ccw
from django.contrib.gis.geos.prototypes.coordseq import cs_setordinate as cs_setordinate
from django.contrib.gis.geos.prototypes.coordseq import cs_setx as cs_setx
from django.contrib.gis.geos.prototypes.coordseq import cs_sety as cs_sety
from django.contrib.gis.geos.prototypes.coordseq import cs_setz as cs_setz
from django.contrib.gis.geos.prototypes.coordseq import get_cs as get_cs
from django.contrib.gis.geos.prototypes.geom import create_collection as create_collection
from django.contrib.gis.geos.prototypes.geom import create_empty_polygon as create_empty_polygon
from django.contrib.gis.geos.prototypes.geom import create_linearring as create_linearring
from django.contrib.gis.geos.prototypes.geom import create_linestring as create_linestring
from django.contrib.gis.geos.prototypes.geom import create_point as create_point
from django.contrib.gis.geos.prototypes.geom import create_polygon as create_polygon
from django.contrib.gis.geos.prototypes.geom import destroy_geom as destroy_geom
from django.contrib.gis.geos.prototypes.geom import geom_clone as geom_clone
from django.contrib.gis.geos.prototypes.geom import geos_get_srid as geos_get_srid
from django.contrib.gis.geos.prototypes.geom import geos_normalize as geos_normalize
from django.contrib.gis.geos.prototypes.geom import geos_set_srid as geos_set_srid
from django.contrib.gis.geos.prototypes.geom import geos_type as geos_type
from django.contrib.gis.geos.prototypes.geom import geos_typeid as geos_typeid
from django.contrib.gis.geos.prototypes.geom import get_dims as get_dims
from django.contrib.gis.geos.prototypes.geom import get_extring as get_extring
from django.contrib.gis.geos.prototypes.geom import get_geomn as get_geomn
from django.contrib.gis.geos.prototypes.geom import get_intring as get_intring
from django.contrib.gis.geos.prototypes.geom import get_nrings as get_nrings
from django.contrib.gis.geos.prototypes.geom import get_num_coords as get_num_coords
from django.contrib.gis.geos.prototypes.geom import get_num_geoms as get_num_geoms
from django.contrib.gis.geos.prototypes.predicates import geos_contains as geos_contains
from django.contrib.gis.geos.prototypes.predicates import geos_covers as geos_covers
from django.contrib.gis.geos.prototypes.predicates import geos_crosses as geos_crosses
from django.contrib.gis.geos.prototypes.predicates import geos_disjoint as geos_disjoint
from django.contrib.gis.geos.prototypes.predicates import geos_equals as geos_equals
from django.contrib.gis.geos.prototypes.predicates import geos_equalsexact as geos_equalsexact
from django.contrib.gis.geos.prototypes.predicates import geos_hasz as geos_hasz
from django.contrib.gis.geos.prototypes.predicates import geos_intersects as geos_intersects
from django.contrib.gis.geos.prototypes.predicates import geos_isclosed as geos_isclosed
from django.contrib.gis.geos.prototypes.predicates import geos_isempty as geos_isempty
from django.contrib.gis.geos.prototypes.predicates import geos_isring as geos_isring
from django.contrib.gis.geos.prototypes.predicates import geos_issimple as geos_issimple
from django.contrib.gis.geos.prototypes.predicates import geos_isvalid as geos_isvalid
from django.contrib.gis.geos.prototypes.predicates import geos_overlaps as geos_overlaps
from django.contrib.gis.geos.prototypes.predicates import geos_relatepattern as geos_relatepattern
from django.contrib.gis.geos.prototypes.predicates import geos_touches as geos_touches
from django.contrib.gis.geos.prototypes.predicates import geos_within as geos_within
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/prototypes/coordseq.pyi 0000664 0000000 0000000 00000001726 15260643574 0031424 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.gis.geos.libgeos import GEOSFuncFactory
from typing_extensions import override
def check_cs_op(result: Any, func: Any, cargs: Any) -> Any: ...
def check_cs_get(result: Any, func: Any, cargs: Any) -> Any: ...
class CsInt(GEOSFuncFactory):
argtypes: Any
restype: Any
errcheck: Any
class CsOperation(GEOSFuncFactory):
restype: Any
def __init__(self, *args: Any, ordinate: bool = ..., get: bool = ..., **kwargs: Any) -> None: ...
class CsOutput(GEOSFuncFactory):
restype: Any
@staticmethod
@override
def errcheck(result: Any, func: Any, cargs: Any) -> Any: ...
class CsUnaryPredicate(GEOSFuncFactory):
argtypes: Any
restype: Any
errcheck: Any
cs_clone: Any
create_cs: Any
get_cs: Any
cs_getordinate: Any
cs_setordinate: Any
cs_getx: Any
cs_gety: Any
cs_getz: Any
cs_getm: Any
cs_setx: Any
cs_sety: Any
cs_setz: Any
cs_setm: Any
cs_getsize: Any
cs_getdims: Any
cs_hasm: Any
cs_is_ccw: Any
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/prototypes/errcheck.pyi 0000664 0000000 0000000 00000000732 15260643574 0031367 0 ustar 00root root 0000000 0000000 from typing import Any
free: Any
def last_arg_byref(args: Any) -> Any: ...
def check_dbl(result: Any, func: Any, cargs: Any) -> Any: ...
def check_geom(result: Any, func: Any, cargs: Any) -> Any: ...
def check_minus_one(result: Any, func: Any, cargs: Any) -> Any: ...
def check_predicate(result: Any, func: Any, cargs: Any) -> Any: ...
def check_sized_string(result: Any, func: Any, cargs: Any) -> Any: ...
def check_string(result: Any, func: Any, cargs: Any) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/prototypes/geom.pyi 0000664 0000000 0000000 00000001454 15260643574 0030532 0 ustar 00root root 0000000 0000000 from ctypes import c_char_p
from typing import Any
from django.contrib.gis.geos.libgeos import GEOSFuncFactory
c_uchar_p: Any
class geos_char_p(c_char_p): ...
class GeomOutput(GEOSFuncFactory):
restype: Any
errcheck: Any
class IntFromGeom(GEOSFuncFactory):
argtypes: Any
restype: Any
errcheck: Any
class StringFromGeom(GEOSFuncFactory):
argtypes: Any
restype: Any
errcheck: Any
geos_normalize: Any
geos_type: Any
geos_typeid: Any
get_dims: Any
get_num_coords: Any
get_num_geoms: Any
create_point: Any
create_linestring: Any
create_linearring: Any
create_polygon: Any
create_empty_polygon: Any
create_collection: Any
get_extring: Any
get_intring: Any
get_nrings: Any
get_geomn: Any
geom_clone: Any
destroy_geom: Any
geos_get_srid: Any
geos_set_srid: Any
geos_makevalid: Any
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/prototypes/io.pyi 0000664 0000000 0000000 00000006440 15260643574 0030212 0 ustar 00root root 0000000 0000000 import threading
from ctypes import Structure
from typing import Any
from django.contrib.gis.geos.base import GEOSBase
from django.contrib.gis.geos.libgeos import GEOSFuncFactory
class WKTReader_st(Structure): ...
class WKTWriter_st(Structure): ...
class WKBReader_st(Structure): ...
class WKBWriter_st(Structure): ...
WKT_READ_PTR: Any
WKT_WRITE_PTR: Any
WKB_READ_PTR: Any
WKB_WRITE_PTR: Any
wkt_reader_create: Any
wkt_reader_destroy: Any
wkt_reader_read: Any
wkt_writer_create: Any
wkt_writer_destroy: Any
wkt_writer_write: Any
wkt_writer_get_outdim: Any
wkt_writer_set_outdim: Any
wkt_writer_set_trim: Any
wkt_writer_set_precision: Any
wkb_reader_create: Any
wkb_reader_destroy: Any
class WKBReadFunc(GEOSFuncFactory):
argtypes: Any
restype: Any
errcheck: Any
wkb_reader_read: Any
wkb_reader_read_hex: Any
wkb_writer_create: Any
wkb_writer_destroy: Any
class WKBWriteFunc(GEOSFuncFactory):
argtypes: Any
restype: Any
errcheck: Any
wkb_writer_write: Any
wkb_writer_write_hex: Any
class WKBWriterGet(GEOSFuncFactory):
argtypes: Any
restype: Any
class WKBWriterSet(GEOSFuncFactory):
argtypes: Any
wkb_writer_get_byteorder: Any
wkb_writer_set_byteorder: Any
wkb_writer_get_outdim: Any
wkb_writer_set_outdim: Any
wkb_writer_get_include_srid: Any
wkb_writer_set_include_srid: Any
class IOBase(GEOSBase):
ptr: Any
def __init__(self) -> None: ...
MAX_GEOM_COLLECTIONS: int
class _WKTReader(IOBase):
ptr_type: Any
destructor: Any
def limit(self, wkt: Any, max_geom_collections: int | None) -> None: ...
def read(self, wkt: Any, max_geom_collections: int | None = ...) -> Any: ...
class _WKBReader(IOBase):
ptr_type: Any
destructor: Any
def limit_wkb(self, wkb: Any, max_geom_collections: int | None) -> None: ...
def limit_hex(self, wkb: Any, max_geom_collections: int | None) -> None: ...
def read(self, wkb: Any, max_geom_collections: int | None = ...) -> Any: ...
def default_trim_value() -> bool: ...
class WKTWriter(IOBase):
ptr_type: Any
destructor: Any
def __init__(self, dim: int = ..., trim: bool = ..., precision: Any | None = ...) -> None: ...
def write(self, geom: Any) -> Any: ...
@property
def outdim(self) -> Any: ...
@outdim.setter
def outdim(self, new_dim: Any) -> None: ...
@property
def trim(self) -> Any: ...
@trim.setter
def trim(self, flag: Any) -> None: ...
@property
def precision(self) -> Any: ...
@precision.setter
def precision(self, precision: Any) -> None: ...
class WKBWriter(IOBase):
ptr_type: Any
destructor: Any
geos_version: Any
def __init__(self, dim: int = ...) -> None: ...
def write(self, geom: Any) -> Any: ...
def write_hex(self, geom: Any) -> Any: ...
byteorder: Any
@property
def outdim(self) -> Any: ...
@outdim.setter
def outdim(self, new_dim: Any) -> None: ...
@property
def srid(self) -> Any: ...
@srid.setter
def srid(self, include: Any) -> None: ...
class ThreadLocalIO(threading.local):
wkt_r: Any
wkt_w: Any
wkb_r: Any
wkb_w: Any
ewkb_w: Any
thread_context: Any
def wkt_r() -> Any: ...
def wkt_w(dim: int = ..., trim: bool = ..., precision: Any | None = ...) -> Any: ...
def wkb_r() -> Any: ...
def wkb_w(dim: int = ...) -> Any: ...
def ewkb_w(dim: int = ...) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/prototypes/misc.pyi 0000664 0000000 0000000 00000000467 15260643574 0030541 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.gis.geos.libgeos import GEOSFuncFactory
class DblFromGeom(GEOSFuncFactory):
restype: Any
errcheck: Any
geos_area: Any
geos_distance: Any
geos_length: Any
geos_isvalidreason: Any
__all__ = ["geos_area", "geos_distance", "geos_isvalidreason", "geos_length"]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/prototypes/predicates.pyi 0000664 0000000 0000000 00000001457 15260643574 0031731 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.gis.geos.libgeos import GEOSFuncFactory
class UnaryPredicate(GEOSFuncFactory):
argtypes: Any
restype: Any
errcheck: Any
class BinaryPredicate(UnaryPredicate):
argtypes: Any
geos_hasz: UnaryPredicate
geos_hasm: UnaryPredicate
geos_isclosed: UnaryPredicate
geos_isempty: UnaryPredicate
geos_isring: UnaryPredicate
geos_issimple: UnaryPredicate
geos_isvalid: UnaryPredicate
geos_contains: BinaryPredicate
geos_covers: BinaryPredicate
geos_crosses: BinaryPredicate
geos_disjoint: BinaryPredicate
geos_equals: BinaryPredicate
geos_equalsexact: BinaryPredicate
geos_equalsidentical: BinaryPredicate
geos_intersects: BinaryPredicate
geos_overlaps: BinaryPredicate
geos_relatepattern: BinaryPredicate
geos_touches: BinaryPredicate
geos_within: BinaryPredicate
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/prototypes/prepared.pyi 0000664 0000000 0000000 00000000662 15260643574 0031405 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.gis.geos.libgeos import GEOSFuncFactory
geos_prepare: Any
prepared_destroy: Any
class PreparedPredicate(GEOSFuncFactory):
argtypes: Any
restype: Any
errcheck: Any
prepared_contains: Any
prepared_contains_properly: Any
prepared_covers: Any
prepared_crosses: Any
prepared_disjoint: Any
prepared_intersects: Any
prepared_overlaps: Any
prepared_touches: Any
prepared_within: Any
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/prototypes/threadsafe.pyi 0000664 0000000 0000000 00000000760 15260643574 0031710 0 ustar 00root root 0000000 0000000 import threading
from typing import Any
from django.contrib.gis.geos.base import GEOSBase
class GEOSContextHandle(GEOSBase):
ptr_type: Any
destructor: Any
ptr: Any
def __init__(self) -> None: ...
class GEOSContext(threading.local):
handle: Any
thread_context: Any
class GEOSFunc:
cfunc: Any
thread_context: Any
def __init__(self, func_name: Any) -> None: ...
def __call__(self, *args: Any) -> Any: ...
argtypes: Any
restype: Any
errcheck: Any
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/prototypes/topology.pyi 0000664 0000000 0000000 00000001141 15260643574 0031450 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.gis.geos.libgeos import GEOSFuncFactory
class Topology(GEOSFuncFactory):
argtypes: Any
restype: Any
errcheck: Any
geos_boundary: Any
geos_buffer: Any
geos_bufferwithstyle: Any
geos_centroid: Any
geos_convexhull: Any
geos_difference: Any
geos_envelope: Any
geos_intersection: Any
geos_linemerge: Any
geos_pointonsurface: Any
geos_preservesimplify: Any
geos_simplify: Any
geos_symdifference: Any
geos_union: Any
geos_unary_union: Any
geos_relate: Any
geos_project: Any
geos_interpolate: Any
geos_project_normalized: Any
geos_interpolate_normalized: Any
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/management/ 0000775 0000000 0000000 00000000000 15260643574 0026003 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/management/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0030253 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/management/commands/ 0000775 0000000 0000000 00000000000 15260643574 0027604 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/management/commands/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0032054 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/management/commands/inspectdb.pyi 0000664 0000000 0000000 00000000623 15260643574 0032303 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.management.commands.inspectdb import Command as InspectDBCommand
from django.db.backends.base.base import BaseDatabaseWrapper
from typing_extensions import override
class Command(InspectDBCommand):
@override
def get_field_type(
self, connection: BaseDatabaseWrapper, table_name: str, row: Any
) -> tuple[str, dict[str, Any], list[str]]: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/management/commands/ogrinspect.pyi 0000664 0000000 0000000 00000001561 15260643574 0032507 0 ustar 00root root 0000000 0000000 from argparse import Action, ArgumentParser, Namespace
from collections.abc import Sequence
from typing import Any
from django.core.management.base import BaseCommand
from typing_extensions import override
class LayerOptionAction(Action):
@override
def __call__(
self,
parser: ArgumentParser,
namespace: Namespace,
value: str | Sequence[Any] | None,
option_string: str | None = None,
) -> None: ...
class ListOptionAction(Action):
@override
def __call__(
self,
parser: ArgumentParser,
namespace: Namespace,
value: str | Sequence[Any] | None,
option_string: str | None = None,
) -> None: ...
class Command(BaseCommand):
@override
def add_arguments(self, parser: ArgumentParser) -> None: ...
@override
def handle(self, *args: Any, **options: Any) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/measure.pyi 0000664 0000000 0000000 00000003017 15260643574 0026054 0 ustar 00root root 0000000 0000000 from decimal import Decimal
from typing import Any, Self, TypeAlias
from typing_extensions import override
_NUMERIC_TYPES: TypeAlias = int | float | Decimal
class MeasureBase:
STANDARD_UNIT: str | None
UNITS: dict[str, float]
ALIAS: dict[str, str]
LALIAS: dict[str, str]
def __init__(self, default_unit: str | None = None, **kwargs: Any) -> None: ...
standard: Any
def __getattr__(self, name: str) -> float: ...
@override
def __eq__(self, other: object) -> bool: ...
def __lt__(self, other: Self) -> bool: ...
def __le__(self, other: Self) -> bool: ...
def __gt__(self, other: Self) -> bool: ...
def __ge__(self, other: Self) -> bool: ...
def __add__(self, other: Self) -> Self: ...
def __iadd__(self, other: Self) -> Self: ...
def __sub__(self, other: Self) -> Self: ...
def __isub__(self, other: Self) -> Self: ...
def __mul__(self, other: _NUMERIC_TYPES) -> Any: ...
def __imul__(self, other: _NUMERIC_TYPES) -> Self: ...
def __rmul__(self, other: Any) -> Self: ...
def __truediv__(self, other: _NUMERIC_TYPES) -> Self: ...
def __itruediv__(self, other: _NUMERIC_TYPES) -> Self: ...
def __bool__(self) -> bool: ...
def default_units(self, kwargs: dict[str, Any]) -> tuple[float, str]: ...
@classmethod
def unit_attname(cls, unit_str: str) -> str: ...
class Distance(MeasureBase):
STANDARD_UNIT: str
class Area(MeasureBase):
STANDARD_UNIT: str
D: TypeAlias = Distance
A: TypeAlias = Area
__all__ = ["A", "Area", "D", "Distance"]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/ptr.pyi 0000664 0000000 0000000 00000000374 15260643574 0025223 0 ustar 00root root 0000000 0000000 from typing import Any
class CPointerBase:
ptr_type: Any
destructor: Any
null_ptr_exception_class: Any
@property
def ptr(self) -> Any: ...
@ptr.setter
def ptr(self, ptr: Any) -> None: ...
def __del__(self) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/serializers/ 0000775 0000000 0000000 00000000000 15260643574 0026223 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/serializers/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0030473 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/serializers/geojson.pyi 0000664 0000000 0000000 00000001132 15260643574 0030407 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.serializers.json import Serializer as JSONSerializer
from typing_extensions import override
class Serializer(JSONSerializer):
@override
def start_serialization(self) -> None: ...
@override
def end_serialization(self) -> None: ...
geometry_field: Any
@override
def start_object(self, obj: Any) -> None: ...
@override
def get_dump_object(self, obj: Any) -> Any: ...
@override
def handle_field(self, obj: Any, field: Any) -> None: ...
class Deserializer:
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/shortcuts.pyi 0000664 0000000 0000000 00000000364 15260643574 0026453 0 ustar 00root root 0000000 0000000 from typing import Any
from django.http.response import HttpResponse
def compress_kml(kml: str) -> bytes: ...
def render_to_kml(*args: Any, **kwargs: Any) -> HttpResponse: ...
def render_to_kmz(*args: Any, **kwargs: Any) -> HttpResponse: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/sitemaps/ 0000775 0000000 0000000 00000000000 15260643574 0025514 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/sitemaps/__init__.pyi 0000664 0000000 0000000 00000000262 15260643574 0027776 0 ustar 00root root 0000000 0000000 from django.contrib.gis.sitemaps.kml import KMLSitemap as KMLSitemap
from django.contrib.gis.sitemaps.kml import KMZSitemap as KMZSitemap
__all__ = ["KMLSitemap", "KMZSitemap"]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/sitemaps/kml.pyi 0000664 0000000 0000000 00000000620 15260643574 0027020 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.sitemaps import Sitemap
from typing_extensions import override
class KMLSitemap(Sitemap[Any]):
geo_format: str
locations: Any
def __init__(self, locations: Any | None = ...) -> None: ...
@override
def items(self) -> Any: ...
@override
def location(self, obj: Any) -> Any: ...
class KMZSitemap(KMLSitemap):
geo_format: str
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/sitemaps/views.pyi 0000664 0000000 0000000 00000000540 15260643574 0027373 0 ustar 00root root 0000000 0000000 from django.http import HttpRequest, HttpResponse
def kml(
request: HttpRequest,
label: str,
model: str,
field_name: str | None = ...,
compress: bool = ...,
using: str = ...,
) -> HttpResponse: ...
def kmz(
request: HttpRequest, label: str, model: str, field_name: str | None = ..., using: str = ...
) -> HttpResponse: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/utils/ 0000775 0000000 0000000 00000000000 15260643574 0025027 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/utils/__init__.pyi 0000664 0000000 0000000 00000001026 15260643574 0027310 0 ustar 00root root 0000000 0000000 from django.contrib.gis.utils.layermapping import LayerMapError as LayerMapError
from django.contrib.gis.utils.layermapping import LayerMapping as LayerMapping
from django.contrib.gis.utils.ogrinfo import ogrinfo as ogrinfo
from django.contrib.gis.utils.ogrinspect import mapping as mapping
from django.contrib.gis.utils.ogrinspect import ogrinspect as ogrinspect
from django.contrib.gis.utils.srs import add_srs_entry as add_srs_entry
__all__ = ["LayerMapError", "LayerMapping", "add_srs_entry", "mapping", "ogrinfo", "ogrinspect"]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/utils/layermapping.pyi 0000664 0000000 0000000 00000005107 15260643574 0030245 0 ustar 00root root 0000000 0000000 from collections.abc import Mapping
from pathlib import Path
from typing import Any, Protocol, type_check_only
from django.contrib.gis.gdal import DataSource, OGRGeomType
from django.contrib.gis.gdal.field import Field as OGRField
from django.contrib.gis.gdal.layer import Layer
from django.db.backends.base.operations import BaseDatabaseOperations
from django.db.models import Field, Model
class LayerMapError(Exception): ...
class InvalidString(LayerMapError): ...
class InvalidDecimal(LayerMapError): ...
class InvalidInteger(LayerMapError): ...
class MissingForeignKey(LayerMapError): ...
@type_check_only
class _Writer(Protocol):
def write(self, s: str, /) -> Any: ...
class LayerMapping:
MULTI_TYPES: dict[int, OGRGeomType]
FIELD_TYPES: dict[Field[Any, Any], OGRField | tuple[OGRField, ...]]
ds: DataSource
layer: Layer
using: str
spatial_backend: BaseDatabaseOperations
mapping: Mapping[str, str]
model: type[Model]
geo_field: Any
source_srs: Any
transform: Any
encoding: str | None
unique: list[str] | tuple[str, ...] | str | None
transaction_mode: Any
transaction_decorator: Any
def __init__(
self,
model: type[Model],
data: str | Path | DataSource,
mapping: Mapping[str, str],
layer: int = ...,
source_srs: Any | None = ...,
encoding: str = ...,
transaction_mode: str = ...,
transform: bool = ...,
unique: list[str] | tuple[str, ...] | str | None = ...,
using: str | None = ...,
) -> None: ...
def check_fid_range(self, fid_range: Any) -> Any: ...
geom_field: str
fields: dict[str, Field[Any, Any]]
coord_dim: int
def check_layer(self) -> Any: ...
def check_srs(self, source_srs: Any) -> Any: ...
def check_unique(self, unique: Any) -> None: ...
def feature_kwargs(self, feat: Any) -> Any: ...
def unique_kwargs(self, kwargs: Any) -> Any: ...
def verify_ogr_field(self, ogr_field: Any, model_field: Any) -> Any: ...
def verify_fk(self, feat: Any, rel_model: Any, rel_mapping: Any) -> Any: ...
def verify_geom(self, geom: Any, model_field: Any) -> Any: ...
def coord_transform(self) -> Any: ...
def geometry_field(self) -> Any: ...
def make_multi(self, geom_type: Any, model_field: Any) -> Any: ...
def save(
self,
verbose: bool = ...,
fid_range: bool | tuple[int, int] | list[int] | slice = ...,
step: bool | int = ...,
progress: bool | int = ...,
silent: bool = ...,
stream: _Writer = ...,
strict: bool = ...,
) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/utils/ogrinfo.pyi 0000664 0000000 0000000 00000000201 15260643574 0027206 0 ustar 00root root 0000000 0000000 from django.contrib.gis.gdal import DataSource
def ogrinfo(data_source: str | DataSource, num_features: int = ...) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/utils/ogrinspect.pyi 0000664 0000000 0000000 00000000500 15260643574 0027722 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.gis.gdal import DataSource
def mapping(
data_source: str | DataSource, geom_name: str = ..., layer_key: int | str = ..., multi_geom: bool = ...
) -> dict[str, str]: ...
def ogrinspect(data_source: str | DataSource, model_name: str, *args: Any, **kwargs: Any) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/utils/srs.pyi 0000664 0000000 0000000 00000000307 15260643574 0026361 0 ustar 00root root 0000000 0000000 from typing import Any
def add_srs_entry(
srs: Any,
auth_name: str = ...,
auth_srid: Any | None = ...,
ref_sys_name: Any | None = ...,
database: Any | None = ...,
) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/views.pyi 0000664 0000000 0000000 00000000312 15260643574 0025543 0 ustar 00root root 0000000 0000000 from django.contrib.gis.feeds import Feed
from django.http import HttpRequest, HttpResponse
def feed(request: HttpRequest, url: str, feed_dict: dict[str, type[Feed]] | None = ...) -> HttpResponse: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/humanize/ 0000775 0000000 0000000 00000000000 15260643574 0024725 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/humanize/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0027175 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/humanize/apps.pyi 0000664 0000000 0000000 00000000200 15260643574 0026403 0 ustar 00root root 0000000 0000000 from typing import Any
from django.apps import AppConfig
class HumanizeConfig(AppConfig):
name: str
verbose_name: Any
typeddjango-django-stubs-fa03b48/django-stubs/contrib/humanize/templatetags/ 0000775 0000000 0000000 00000000000 15260643574 0027417 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/humanize/templatetags/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0031667 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/humanize/templatetags/humanize.pyi 0000664 0000000 0000000 00000001556 15260643574 0031771 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from datetime import date, datetime
from typing import Any, SupportsInt
from django import template
register: template.Library
def ordinal(value: str | SupportsInt | None) -> str | None: ...
def intcomma(value: str | SupportsInt | None, use_l10n: bool = True) -> str: ...
intword_converters: tuple[tuple[int, Callable[[int], str]], ...]
def intword(value: str | SupportsInt | None) -> int | str | None: ...
def apnumber(value: str | SupportsInt | None) -> int | str | None: ...
def naturalday(value: date | str | None, arg: str | None = None) -> str | None: ...
def naturaltime(value: datetime) -> str: ...
class NaturalTimeFormatter:
time_strings: dict[str, str]
past_substrings: dict[str, str]
future_substrings: dict[str, str]
@classmethod
def string_for(cls: type[NaturalTimeFormatter], value: Any) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/messages/ 0000775 0000000 0000000 00000000000 15260643574 0024714 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/messages/__init__.pyi 0000664 0000000 0000000 00000001262 15260643574 0027177 0 ustar 00root root 0000000 0000000 from .api import MessageFailure as MessageFailure
from .api import add_message as add_message
from .api import debug as debug
from .api import error as error
from .api import get_level as get_level
from .api import get_messages as get_messages
from .api import info as info
from .api import set_level as set_level
from .api import success as success
from .api import warning as warning
from .constants import DEBUG as DEBUG
from .constants import DEFAULT_LEVELS as DEFAULT_LEVELS
from .constants import DEFAULT_TAGS as DEFAULT_TAGS
from .constants import ERROR as ERROR
from .constants import INFO as INFO
from .constants import SUCCESS as SUCCESS
from .constants import WARNING as WARNING
typeddjango-django-stubs-fa03b48/django-stubs/contrib/messages/api.pyi 0000664 0000000 0000000 00000002706 15260643574 0026215 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.messages.storage.base import BaseStorage
from django.http.request import HttpRequest
from django.utils.functional import _StrOrPromise
class MessageFailure(Exception): ...
def add_message(
request: HttpRequest | None,
level: int,
message: _StrOrPromise,
extra_tags: str = "",
fail_silently: bool | str = False,
) -> None: ...
def get_messages(request: HttpRequest) -> list[Any] | BaseStorage: ...
def get_level(request: HttpRequest) -> int: ...
def set_level(request: HttpRequest, level: int) -> bool: ...
def debug(
request: HttpRequest,
message: _StrOrPromise,
extra_tags: str = "",
fail_silently: bool | str = False,
) -> None: ...
def info(
request: HttpRequest,
message: _StrOrPromise,
extra_tags: str = "",
fail_silently: bool | str = False,
) -> None: ...
def success(
request: HttpRequest,
message: _StrOrPromise,
extra_tags: str = "",
fail_silently: bool | str = False,
) -> None: ...
def warning(
request: HttpRequest,
message: _StrOrPromise,
extra_tags: str = "",
fail_silently: bool | str = False,
) -> None: ...
def error(
request: HttpRequest,
message: _StrOrPromise,
extra_tags: str = "",
fail_silently: bool | str = False,
) -> None: ...
__all__ = (
"MessageFailure",
"add_message",
"debug",
"error",
"get_level",
"get_messages",
"info",
"set_level",
"success",
"warning",
)
typeddjango-django-stubs-fa03b48/django-stubs/contrib/messages/apps.pyi 0000664 0000000 0000000 00000000301 15260643574 0026374 0 ustar 00root root 0000000 0000000 from typing import Any
from django.apps import AppConfig
def update_level_tags(setting: str, **kwargs: Any) -> None: ...
class MessagesConfig(AppConfig):
name: str
verbose_name: Any
typeddjango-django-stubs-fa03b48/django-stubs/contrib/messages/constants.pyi 0000664 0000000 0000000 00000000170 15260643574 0027451 0 ustar 00root root 0000000 0000000 DEBUG: int
INFO: int
SUCCESS: int
WARNING: int
ERROR: int
DEFAULT_TAGS: dict[int, str]
DEFAULT_LEVELS: dict[str, int]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/messages/context_processors.pyi 0000664 0000000 0000000 00000000341 15260643574 0031403 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.messages.storage.base import BaseStorage
from django.http.request import HttpRequest
def messages(request: HttpRequest) -> dict[str, dict[str, int] | list[Any] | BaseStorage]: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/messages/middleware.pyi 0000664 0000000 0000000 00000000535 15260643574 0027557 0 ustar 00root root 0000000 0000000 from django.http.request import HttpRequest
from django.http.response import HttpResponse
from django.utils.deprecation import MiddlewareMixin
class MessageMiddleware(MiddlewareMixin):
def process_request(self, request: HttpRequest) -> None: ...
def process_response(self, request: HttpRequest, response: HttpResponse) -> HttpResponse: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/messages/storage/ 0000775 0000000 0000000 00000000000 15260643574 0026360 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/messages/storage/__init__.pyi 0000664 0000000 0000000 00000000250 15260643574 0030637 0 ustar 00root root 0000000 0000000 from django.contrib.messages.storage.base import BaseStorage
from django.http.request import HttpRequest
def default_storage(request: HttpRequest) -> BaseStorage: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/messages/storage/base.pyi 0000664 0000000 0000000 00000001612 15260643574 0030015 0 ustar 00root root 0000000 0000000 from collections.abc import Iterator
from typing import Any
from django.http.request import HttpRequest
from django.http.response import HttpResponseBase
LEVEL_TAGS: Any
class Message:
level: int
message: str
extra_tags: str
def __init__(self, level: int, message: str, extra_tags: str | None = None) -> None: ...
@property
def tags(self) -> str: ...
@property
def level_tag(self) -> str: ...
class BaseStorage:
request: HttpRequest
used: bool
added_new: bool
def __init__(self, request: HttpRequest, *args: Any, **kwargs: Any) -> None: ...
def __len__(self) -> int: ...
def __iter__(self) -> Iterator[Message]: ...
def __contains__(self, item: Any) -> bool: ...
def update(self, response: HttpResponseBase) -> list[Message] | None: ...
def add(self, level: int, message: str, extra_tags: str | None = "") -> None: ...
level: Any
typeddjango-django-stubs-fa03b48/django-stubs/contrib/messages/storage/cookie.pyi 0000664 0000000 0000000 00000002203 15260643574 0030351 0 ustar 00root root 0000000 0000000 import json
from collections.abc import Callable, Sequence
from typing import Any
from django.contrib.messages.storage.base import BaseStorage
from typing_extensions import override
class MessageEncoder(json.JSONEncoder):
allow_nan: bool
check_circular: bool
ensure_ascii: bool
skipkeys: bool
sort_keys: bool
message_key: str
@override
def default(self, obj: Any) -> Any: ...
class MessageDecoder(json.JSONDecoder):
def process_messages(self, obj: Any) -> Any: ...
@override
def decode(self, s: str, **kwargs: Any) -> Any: ... # type: ignore[override]
class MessagePartSerializer:
def dumps(self, obj: Any) -> Sequence[str]: ...
class MessagePartGatherSerializer:
def dumps(self, obj: Any) -> bytes: ...
class MessageSerializer:
def loads(self, data: bytes | bytearray) -> Any: ...
class CookieStorage(BaseStorage):
cookie_name: str
max_cookie_size: int
not_finished: str
not_finished_json: str
key_salt: str
def bisect_keep_left(a: list[int], fn: Callable[[list[int]], bool]) -> int: ...
def bisect_keep_right(a: list[int], fn: Callable[[list[int]], bool]) -> int: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/messages/storage/fallback.pyi 0000664 0000000 0000000 00000000344 15260643574 0030643 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.messages.storage.base import BaseStorage
class FallbackStorage(BaseStorage):
storage_classes: Any
storages: Any
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/messages/storage/session.pyi 0000664 0000000 0000000 00000000724 15260643574 0030571 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from typing import Any
from django.contrib.messages.storage.base import BaseStorage
from django.http.request import HttpRequest
class SessionStorage(BaseStorage):
session_key: str
def __init__(self, request: HttpRequest, *args: Any, **kwargs: Any) -> None: ...
def serialize_messages(self, messages: Sequence[Any]) -> str: ...
def deserialize_messages(self, data: list[Any] | str | None) -> list[Any] | None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/messages/test.pyi 0000664 0000000 0000000 00000000462 15260643574 0026420 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.messages.storage.base import BaseStorage
from django.http.response import HttpResponse
class MessagesTestMixin:
def assertMessages(
self, response: HttpResponse, expected_messages: list[Any] | BaseStorage, *, ordered: bool = True
) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/messages/utils.pyi 0000664 0000000 0000000 00000000054 15260643574 0026576 0 ustar 00root root 0000000 0000000 def get_level_tags() -> dict[int, str]: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/messages/views.pyi 0000664 0000000 0000000 00000000710 15260643574 0026572 0 ustar 00root root 0000000 0000000 from typing import Generic
from django.forms.forms import BaseForm
from django.http.response import HttpResponse
from django.utils.functional import _StrOrPromise
from typing_extensions import TypeVar
_F = TypeVar("_F", bound=BaseForm)
class SuccessMessageMixin(Generic[_F]):
success_message: _StrOrPromise
def form_valid(self, form: _F) -> HttpResponse: ...
def get_success_message(self, cleaned_data: dict[str, str]) -> _StrOrPromise: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/ 0000775 0000000 0000000 00000000000 15260643574 0024753 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0027223 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/aggregates/ 0000775 0000000 0000000 00000000000 15260643574 0027064 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/aggregates/__init__.pyi 0000664 0000000 0000000 00000001540 15260643574 0031346 0 ustar 00root root 0000000 0000000 from .general import ArrayAgg as ArrayAgg
from .general import BitAnd as BitAnd
from .general import BitOr as BitOr
from .general import BitXor as BitXor
from .general import BoolAnd as BoolAnd
from .general import BoolOr as BoolOr
from .general import JSONBAgg as JSONBAgg
from .general import StringAgg as StringAgg
from .statistics import Corr as Corr
from .statistics import CovarPop as CovarPop
from .statistics import RegrAvgX as RegrAvgX
from .statistics import RegrAvgY as RegrAvgY
from .statistics import RegrCount as RegrCount
from .statistics import RegrIntercept as RegrIntercept
from .statistics import RegrR2 as RegrR2
from .statistics import RegrSlope as RegrSlope
from .statistics import RegrSXX as RegrSXX
from .statistics import RegrSXY as RegrSXY
from .statistics import RegrSYY as RegrSYY
from .statistics import StatAggregate as StatAggregate
typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/aggregates/general.pyi 0000664 0000000 0000000 00000006737 15260643574 0031241 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from typing import Any, ClassVar, Self
from django.contrib.postgres.fields import ArrayField
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models import Aggregate, BooleanField, JSONField, TextField
from django.db.models.expressions import BaseExpression, Combinable
from django.db.models.query import _OrderByFieldName
from django.db.models.query_utils import Q
from django.db.models.sql.compiler import SQLCompiler, _AsSqlType
from typing_extensions import deprecated, override
from .mixins import OrderableAggMixin
class ArrayAgg(OrderableAggMixin, Aggregate):
@property
@override
def output_field(self) -> ArrayField[Any, Any]: ...
@override
def resolve_expression(
self,
query: Any = ...,
allow_joins: bool = ...,
reuse: set[str] | None = ...,
summarize: bool = ...,
for_save: bool = ...,
) -> Self: ...
@override
def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... # type: ignore[override]
class BitAnd(Aggregate):
@override
@deprecated(
"The PostgreSQL-specific BitAnd function is deprecated. Use django.db.models.aggregates.BitAnd instead."
)
def __init__(self, expression: Any, **extra: Any) -> None: ...
class BitOr(Aggregate):
@override
@deprecated("The PostgreSQL-specific BitOr function is deprecated. Use django.db.models.aggregates.BitOr instead.")
def __init__(self, expression: Any, **extra: Any) -> None: ...
class BitXor(Aggregate):
@override
@deprecated(
"The PostgreSQL-specific BitXor function is deprecated. Use django.db.models.aggregates.BitXor instead."
)
def __init__(self, expression: Any, **extra: Any) -> None: ...
class BoolAnd(Aggregate):
output_field: ClassVar[BooleanField[Any, Any]]
class BoolOr(Aggregate):
output_field: ClassVar[BooleanField[Any, Any]]
class JSONBAgg(OrderableAggMixin, Aggregate):
output_field: ClassVar[JSONField[Any, Any]]
@override
def resolve_expression(
self,
query: Any = ...,
allow_joins: bool = ...,
reuse: set[str] | None = ...,
summarize: bool = ...,
for_save: bool = ...,
) -> Self: ...
@override
def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... # type: ignore[override]
class StringAgg(OrderableAggMixin, Aggregate):
output_field: ClassVar[TextField[Any, Any]]
@deprecated(
"The PostgreSQL specific StringAgg function is deprecated. Use django.db.models.aggregates.StringAgg instead."
)
def __init__(
self,
expression: BaseExpression | Combinable | str,
delimiter: Any,
*,
distinct: bool = False,
filter: Q | BaseExpression | None = None,
default: Any | None = None,
ordering: _OrderByFieldName | Sequence[_OrderByFieldName] = ...,
order_by: _OrderByFieldName | Sequence[_OrderByFieldName] = ...,
**extra: Any,
) -> None: ...
@override
def resolve_expression(
self,
query: Any = ...,
allow_joins: bool = ...,
reuse: set[str] | None = ...,
summarize: bool = ...,
for_save: bool = ...,
) -> Self: ...
@override
def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... # type: ignore[override]
__all__ = ["ArrayAgg", "BitAnd", "BitOr", "BitXor", "BoolAnd", "BoolOr", "JSONBAgg", "StringAgg"]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/aggregates/mixins.pyi 0000664 0000000 0000000 00000000336 15260643574 0031120 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar
from typing_extensions import override
class OrderableAggMixin:
allow_order_by: ClassVar[bool]
@override
def __init_subclass__(cls, /, *args: Any, **kwargs: Any) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/aggregates/statistics.pyi 0000664 0000000 0000000 00000002164 15260643574 0032004 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar
from django.db.models import Aggregate, FloatField, IntegerField
class StatAggregate(Aggregate):
output_field: ClassVar[FloatField[Any, Any]]
def __init__(
self, y: Any, x: Any, output_field: Any | None = ..., filter: Any | None = ..., default: Any | None = ...
) -> None: ...
class Corr(StatAggregate): ...
class CovarPop(StatAggregate):
def __init__(
self, y: Any, x: Any, sample: bool = ..., filter: Any | None = ..., default: Any | None = ...
) -> None: ...
class RegrAvgX(StatAggregate): ...
class RegrAvgY(StatAggregate): ...
class RegrCount(StatAggregate):
output_field: ClassVar[IntegerField[Any, Any]] # type: ignore[assignment]
class RegrIntercept(StatAggregate): ...
class RegrR2(StatAggregate): ...
class RegrSlope(StatAggregate): ...
class RegrSXX(StatAggregate): ...
class RegrSXY(StatAggregate): ...
class RegrSYY(StatAggregate): ...
__all__ = [
"Corr",
"CovarPop",
"RegrAvgX",
"RegrAvgY",
"RegrCount",
"RegrIntercept",
"RegrR2",
"RegrSXX",
"RegrSXY",
"RegrSYY",
"RegrSlope",
"StatAggregate",
]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/apps.pyi 0000664 0000000 0000000 00000000503 15260643574 0026437 0 ustar 00root root 0000000 0000000 from typing import Any
from django.apps import AppConfig
from typing_extensions import override
RANGE_TYPES: Any
def uninstall_if_needed(setting: Any, value: Any, enter: Any, **kwargs: Any) -> None: ...
class PostgresConfig(AppConfig):
name: str
verbose_name: Any
@override
def ready(self) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/constraints.pyi 0000664 0000000 0000000 00000003042 15260643574 0030044 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable, Sequence
from django.core.checks import CheckMessage
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models import Deferrable
from django.db.models.base import Model
from django.db.models.constraints import BaseConstraint
from django.db.models.expressions import Combinable
from django.db.models.indexes import IndexExpression
from django.db.models.query_utils import Q
from django.utils.functional import _StrOrPromise
from typing_extensions import override
from .utils import CheckPostgresInstalledMixin
class ExclusionConstraintExpression(IndexExpression): ...
class ExclusionConstraint(CheckPostgresInstalledMixin, BaseConstraint):
template: str
expressions: Sequence[tuple[str | Combinable, str]]
index_type: str
condition: Q | None
def __init__(
self,
*,
name: str,
expressions: Sequence[tuple[str | Combinable, str]],
index_type: str | None = None,
condition: Q | None = None,
deferrable: Deferrable | None = None,
include: list[str] | tuple[str, ...] | None = None,
violation_error_code: str | None = None,
violation_error_message: _StrOrPromise | None = None,
) -> None: ...
@override
def check(self, model: type[Model], connection: BaseDatabaseWrapper) -> list[CheckMessage]: ...
@override
def validate(
self, model: type[Model], instance: Model, exclude: Iterable[str] | None = None, using: str = "default"
) -> None: ...
__all__ = ["ExclusionConstraint"]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/expressions.pyi 0000664 0000000 0000000 00000001025 15260643574 0030056 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.postgres.fields import ArrayField
from django.db.models import Subquery
from django.db.models.query import QuerySet
from django.db.models.sql.query import Query
from django.utils.functional import cached_property
from typing_extensions import override
class ArraySubquery(Subquery):
template: str
def __init__(self, queryset: Query | QuerySet[Any] | Subquery, **kwargs: Any) -> None: ...
@cached_property
@override
def output_field(self) -> ArrayField[Any, Any]: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/fields/ 0000775 0000000 0000000 00000000000 15260643574 0026221 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/fields/__init__.pyi 0000664 0000000 0000000 00000001322 15260643574 0030501 0 ustar 00root root 0000000 0000000 from .array import ArrayField as ArrayField
from .citext import CICharField as CICharField
from .citext import CIEmailField as CIEmailField
from .citext import CITextField as CITextField
from .hstore import HStoreField as HStoreField
from .jsonb import JSONField as JSONField
from .ranges import BigIntegerRangeField as BigIntegerRangeField
from .ranges import DateRangeField as DateRangeField
from .ranges import DateTimeRangeField as DateTimeRangeField
from .ranges import DecimalRangeField as DecimalRangeField
from .ranges import IntegerRangeField as IntegerRangeField
from .ranges import RangeBoundary as RangeBoundary
from .ranges import RangeField as RangeField
from .ranges import RangeOperators as RangeOperators
typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/fields/array.pyi 0000664 0000000 0000000 00000005456 15260643574 0030074 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable, Sequence
from typing import Any, ClassVar
from _typeshed import Unused
from django.contrib.postgres.utils import CheckPostgresInstalledMixin
from django.core.checks import CheckMessage
from django.core.validators import _ValidatorCallable
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models import Field
from django.db.models.expressions import Combinable, Expression
from django.db.models.fields import NOT_PROVIDED, _ErrorMessagesDict, _ErrorMessagesMapping
from django.db.models.fields.mixins import CheckFieldDefaultMixin
from django.db.models.lookups import Transform
from django.db.models.sql.compiler import _AsSqlType
from django.utils.choices import _Choices
from django.utils.functional import _StrOrPromise
from typing_extensions import TypeVar, override
# __set__ value type
_ST = TypeVar("_ST", contravariant=True)
# __get__ return type
_GT = TypeVar("_GT", covariant=True)
class ArrayField(CheckPostgresInstalledMixin, CheckFieldDefaultMixin, Field[_ST, _GT]):
_pyi_private_set_type: Sequence[Any] | Combinable
_pyi_private_get_type: list[Any]
empty_strings_allowed: bool
default_error_messages: ClassVar[_ErrorMessagesDict]
base_field: Field[Any, Any]
size: int | None
default_validators: list[_ValidatorCallable]
from_db_value: Any
def __init__(
self,
base_field: Field[Any, Any],
size: int | None = None,
*,
verbose_name: _StrOrPromise | None = ...,
name: str | None = ...,
primary_key: bool = ...,
max_length: int | None = ...,
unique: bool = ...,
blank: bool = ...,
null: bool = ...,
db_index: bool = ...,
default: Any = ...,
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
editable: bool = ...,
auto_created: bool = ...,
serialize: bool = ...,
unique_for_date: str | None = ...,
unique_for_month: str | None = ...,
unique_for_year: str | None = ...,
choices: _Choices | None = ...,
help_text: _StrOrPromise = ...,
db_column: str | None = ...,
db_comment: str | None = ...,
db_tablespace: str | None = ...,
validators: Iterable[_ValidatorCallable] = ...,
error_messages: _ErrorMessagesMapping | None = ...,
) -> None: ...
@override
def check(self, **kwargs: Any) -> list[CheckMessage]: ...
@property
@override
def description(self) -> str: ... # type: ignore[override]
@override
def cast_db_type(self, connection: BaseDatabaseWrapper) -> str: ...
def get_placeholder_sql(self, value: Unused, compiler: Unused, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
@override
def get_transform(self, name: str) -> type[Transform] | None: ...
__all__ = ["ArrayField"]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/fields/citext.pyi 0000664 0000000 0000000 00000000646 15260643574 0030252 0 ustar 00root root 0000000 0000000 from django.db.models.fields import CharField, EmailField, TextField
from typing_extensions import TypeVar
# __set__ value type
_ST = TypeVar("_ST", contravariant=True)
# __get__ return type
_GT = TypeVar("_GT", covariant=True)
class CICharField(CharField[_ST, _GT]): ...
class CIEmailField(EmailField[_ST, _GT]): ...
class CITextField(TextField[_ST, _GT]): ...
__all__ = ["CICharField", "CIEmailField", "CITextField"]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/fields/hstore.pyi 0000664 0000000 0000000 00000002336 15260643574 0030254 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar
from django.contrib.postgres.fields.array import ArrayField
from django.contrib.postgres.utils import CheckPostgresInstalledMixin
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models import Field, TextField, Transform
from django.db.models.fields.mixins import CheckFieldDefaultMixin
from django.db.models.sql.compiler import SQLCompiler, _AsSqlType
from typing_extensions import override
class HStoreField(CheckPostgresInstalledMixin, CheckFieldDefaultMixin, Field[Any, Any]):
@override
def get_transform(self, name: str) -> Any: ...
class KeyTransform(Transform):
output_field: ClassVar[TextField[Any, Any]]
def __init__(self, key_name: str, *args: Any, **kwargs: Any) -> None: ...
@override
def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... # type: ignore[override]
class KeyTransformFactory:
def __init__(self, key_name: str) -> None: ...
def __call__(self, *args: Any, **kwargs: Any) -> KeyTransform: ...
class KeysTransform(Transform):
output_field: ClassVar[ArrayField[Any, Any]]
class ValuesTransform(Transform):
output_field: ClassVar[ArrayField[Any, Any]]
__all__ = ["HStoreField"]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/fields/jsonb.pyi 0000664 0000000 0000000 00000000174 15260643574 0030061 0 ustar 00root root 0000000 0000000 from django.db.models import JSONField as BuiltinJSONField
class JSONField(BuiltinJSONField): ...
__all__ = ["JSONField"]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/fields/ranges.pyi 0000664 0000000 0000000 00000007676 15260643574 0030243 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar, Literal
from _typeshed import Unused
from django.contrib.postgres import forms
from django.contrib.postgres.utils import CheckPostgresInstalledMixin
from django.db import models
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models.lookups import PostgresOperatorLookup
from django.db.models.sql.compiler import SQLCompiler, _AsSqlType
from psycopg2.extras import DateRange, DateTimeTZRange, NumericRange, Range # type: ignore[import-untyped]
from typing_extensions import TypeVar, override
class RangeBoundary(models.Expression):
lower: str
upper: str
def __init__(self, inclusive_lower: bool = True, inclusive_upper: bool = False) -> None: ...
class RangeOperators:
EQUAL: Literal["="]
NOT_EQUAL: Literal["<>"]
CONTAINS: Literal["@>"]
CONTAINED_BY: Literal["<@"]
OVERLAPS: Literal["&&"]
FULLY_LT: Literal["<<"]
FULLY_GT: Literal[">>"]
NOT_LT: Literal["&>"]
NOT_GT: Literal["&<"]
ADJACENT_TO: Literal["-|-"]
_RangeT = TypeVar("_RangeT", bound=Range[Any])
class RangeField(CheckPostgresInstalledMixin, models.Field[Any, _RangeT]):
empty_strings_allowed: bool
base_field: type[models.Field[Any, Any]]
range_type: type[_RangeT]
def get_placeholder_sql(self, value: Unused, compiler: Unused, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
@override
def get_prep_value(self, value: Any) -> Any | None: ...
@override
def to_python(self, value: Any) -> Any: ...
@override
def value_to_string(self, obj: models.Model) -> str | None: ... # type: ignore[override]
class ContinuousRangeField(RangeField[_RangeT]):
default_bounds: str
def __init__(self, *args: Any, default_bounds: str = "[)", **kwargs: Any) -> None: ...
class IntegerRangeField(RangeField[NumericRange]):
base_field: type[models.IntegerField[Any, Any]]
form_field: type[forms.IntegerRangeField]
class BigIntegerRangeField(RangeField[NumericRange]):
base_field: type[models.BigIntegerField[Any, Any]]
form_field: type[forms.IntegerRangeField]
class DecimalRangeField(ContinuousRangeField[NumericRange]):
base_field: type[models.DecimalField[Any, Any]]
form_field: type[forms.DecimalRangeField]
class DateTimeRangeField(ContinuousRangeField[DateTimeTZRange]):
base_field: type[models.DateTimeField[Any, Any]]
form_field: type[forms.DateTimeRangeField]
class DateRangeField(RangeField[DateRange]):
base_field: type[models.DateField[Any, Any]]
form_field: type[forms.DateRangeField]
class DateTimeRangeContains(PostgresOperatorLookup): ...
class RangeContainedBy(PostgresOperatorLookup):
type_mapping: dict[str, str]
@override
def process_lhs(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... # type: ignore[override]
class FullyLessThan(PostgresOperatorLookup): ...
class FullGreaterThan(PostgresOperatorLookup): ...
class NotLessThan(PostgresOperatorLookup): ...
class NotGreaterThan(PostgresOperatorLookup): ...
class AdjacentToLookup(PostgresOperatorLookup): ...
class RangeStartsWith(models.Transform):
@property
@override
def output_field(self) -> models.Field[Any, Any]: ...
class RangeEndsWith(models.Transform):
@property
@override
def output_field(self) -> models.Field[Any, Any]: ...
class IsEmpty(models.Transform):
output_field: ClassVar[models.BooleanField[Any, Any]]
class LowerInclusive(models.Transform):
output_field: ClassVar[models.BooleanField[Any, Any]]
class LowerInfinite(models.Transform):
output_field: ClassVar[models.BooleanField[Any, Any]]
class UpperInclusive(models.Transform):
output_field: ClassVar[models.BooleanField[Any, Any]]
class UpperInfinite(models.Transform):
output_field: ClassVar[models.BooleanField[Any, Any]]
__all__ = [
"BigIntegerRangeField",
"DateRangeField",
"DateTimeRangeField",
"DecimalRangeField",
"IntegerRangeField",
"RangeBoundary",
"RangeField",
"RangeOperators",
]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/fields/utils.pyi 0000664 0000000 0000000 00000000152 15260643574 0030102 0 ustar 00root root 0000000 0000000 from typing import Any
class AttributeSetter:
def __init__(self, name: Any, value: Any) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/forms/ 0000775 0000000 0000000 00000000000 15260643574 0026101 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/forms/__init__.pyi 0000664 0000000 0000000 00000001134 15260643574 0030362 0 ustar 00root root 0000000 0000000 from .array import SimpleArrayField as SimpleArrayField
from .array import SplitArrayField as SplitArrayField
from .array import SplitArrayWidget as SplitArrayWidget
from .hstore import HStoreField as HStoreField
from .ranges import BaseRangeField as BaseRangeField
from .ranges import DateRangeField as DateRangeField
from .ranges import DateTimeRangeField as DateTimeRangeField
from .ranges import DecimalRangeField as DecimalRangeField
from .ranges import HiddenRangeWidget as HiddenRangeWidget
from .ranges import IntegerRangeField as IntegerRangeField
from .ranges import RangeWidget as RangeWidget
typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/forms/array.pyi 0000664 0000000 0000000 00000005027 15260643574 0027746 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from typing import Any, ClassVar
from django import forms
from django.db.models.fields import _ErrorMessagesDict
from django.forms.fields import _ClassLevelWidgetT
from django.forms.utils import _DataT, _FilesT
from django.forms.widgets import _OptAttrs
from typing_extensions import override
from ..utils import prefix_validation_error as prefix_validation_error
class SimpleArrayField(forms.CharField):
default_error_messages: ClassVar[_ErrorMessagesDict]
base_field: forms.Field
delimiter: str
min_length: int | None
max_length: int | None
def __init__(
self,
base_field: forms.Field,
*,
delimiter: str = ",",
max_length: int | None = None,
min_length: int | None = None,
**kwargs: Any,
) -> None: ...
@override
def clean(self, value: Any) -> Sequence[Any]: ...
@override
def prepare_value(self, value: Any) -> Any: ...
@override
def to_python(self, value: Any) -> Sequence[Any]: ... # type: ignore[override]
@override
def validate(self, value: Sequence[Any]) -> None: ...
@override
def run_validators(self, value: Sequence[Any]) -> None: ...
@override
def has_changed(self, initial: Any, data: Any) -> bool: ...
class SplitArrayWidget(forms.Widget):
template_name: str
widget: _ClassLevelWidgetT
size: int
def __init__(self, widget: forms.Widget | type[forms.Widget], size: int, **kwargs: Any) -> None: ...
@property
@override
def is_hidden(self) -> bool: ...
@override
def value_from_datadict(self, data: _DataT, files: _FilesT, name: str) -> Any: ...
@override
def value_omitted_from_data(self, data: _DataT, files: _FilesT, name: str) -> bool: ...
@override
def id_for_label(self, id_: str) -> str: ...
@override
def get_context(self, name: str, value: Any, attrs: _OptAttrs | None = None) -> dict[str, Any]: ...
@property
@override
def needs_multipart_form(self) -> bool: ... # type: ignore[override]
class SplitArrayField(forms.Field):
default_error_messages: ClassVar[_ErrorMessagesDict]
base_field: forms.Field
size: int
remove_trailing_nulls: bool
def __init__(
self, base_field: forms.Field, size: int, *, remove_trailing_nulls: bool = False, **kwargs: Any
) -> None: ...
@override
def to_python(self, value: Any) -> Sequence[Any]: ...
@override
def clean(self, value: Any) -> Sequence[Any]: ...
@override
def has_changed(self, initial: Any, data: Any) -> bool: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/forms/hstore.pyi 0000664 0000000 0000000 00000001136 15260643574 0030131 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar
from django import forms
from django.db.models.fields import _ErrorMessagesDict
from django.forms.fields import _ClassLevelWidgetT
from typing_extensions import override
class HStoreField(forms.CharField):
widget: _ClassLevelWidgetT
default_error_messages: ClassVar[_ErrorMessagesDict]
@override
def prepare_value(self, value: Any) -> Any: ...
@override
def to_python(self, value: Any) -> dict[str, str | None]: ... # type: ignore[override]
@override
def has_changed(self, initial: Any, data: Any) -> bool: ...
__all__ = ["HStoreField"]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/forms/ranges.pyi 0000664 0000000 0000000 00000003503 15260643574 0030104 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar
from django import forms
from django.db.models.fields import _ErrorMessagesDict
from django.forms.widgets import MultiWidget, _OptAttrs
from psycopg2.extras import Range # type: ignore [import-untyped]
from typing_extensions import override
class RangeWidget(MultiWidget):
def __init__(self, base_widget: forms.Widget | type[forms.Widget], attrs: _OptAttrs | None = None) -> None: ...
@override
def decompress(self, value: Any) -> tuple[Any | None, Any | None]: ...
class HiddenRangeWidget(RangeWidget):
def __init__(self, attrs: _OptAttrs | None = None) -> None: ...
class BaseRangeField(forms.MultiValueField):
default_error_messages: ClassVar[_ErrorMessagesDict]
base_field: type[forms.Field]
range_type: type[Range]
hidden_widget: type[forms.Widget]
def __init__(self, **kwargs: Any) -> None: ...
@override
def prepare_value(self, value: Any) -> Any: ...
@override
def compress(self, values: tuple[Any | None, Any | None]) -> Range | None: ...
class IntegerRangeField(BaseRangeField):
default_error_messages: ClassVar[_ErrorMessagesDict]
base_field: type[forms.Field]
range_type: type[Range]
class DecimalRangeField(BaseRangeField):
default_error_messages: ClassVar[_ErrorMessagesDict]
base_field: type[forms.Field]
range_type: type[Range]
class DateTimeRangeField(BaseRangeField):
default_error_messages: ClassVar[_ErrorMessagesDict]
base_field: type[forms.Field]
range_type: type[Range]
class DateRangeField(BaseRangeField):
default_error_messages: ClassVar[_ErrorMessagesDict]
base_field: type[forms.Field]
range_type: type[Range]
__all__ = [
"BaseRangeField",
"DateRangeField",
"DateTimeRangeField",
"DecimalRangeField",
"HiddenRangeWidget",
"IntegerRangeField",
"RangeWidget",
]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/functions.pyi 0000664 0000000 0000000 00000000370 15260643574 0027506 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar
from django.db.models import DateTimeField, Func, UUIDField
class RandomUUID(Func):
output_field: ClassVar[UUIDField[Any, Any]]
class TransactionNow(Func):
output_field: ClassVar[DateTimeField[Any, Any]]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/indexes.pyi 0000664 0000000 0000000 00000010255 15260643574 0027140 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from typing import Any
from django.db.backends.base.schema import BaseDatabaseSchemaEditor
from django.db.backends.ddl_references import Statement
from django.db.models import Func, Index, Model
from django.db.models.expressions import BaseExpression, Combinable
from django.db.models.query_utils import Q
from django.utils.datastructures import _ListOrTuple
from django.utils.functional import cached_property
from typing_extensions import override
class PostgresIndex(Index):
@override
@cached_property
def max_name_length(self) -> int: ... # type: ignore[override]
@override
def create_sql(
self, model: type[Model], schema_editor: BaseDatabaseSchemaEditor, using: str = "", **kwargs: Any
) -> Statement: ...
def check_supported(self, schema_editor: BaseDatabaseSchemaEditor) -> None: ...
def get_with_params(self) -> Sequence[str]: ...
class BloomIndex(PostgresIndex):
def __init__(
self,
*expressions: BaseExpression | Combinable | str,
length: int | None = None,
columns: _ListOrTuple[int] = (),
fields: Sequence[str] = ...,
name: str | None = ...,
db_tablespace: str | None = ...,
opclasses: Sequence[str] = ...,
condition: Q | None = ...,
include: Sequence[str] | None = ...,
) -> None: ...
class BrinIndex(PostgresIndex):
def __init__(
self,
*expressions: BaseExpression | Combinable | str,
autosummarize: bool | None = None,
pages_per_range: int | None = None,
fields: Sequence[str] = ...,
name: str | None = ...,
db_tablespace: str | None = ...,
opclasses: Sequence[str] = ...,
condition: Q | None = ...,
include: Sequence[str] | None = ...,
) -> None: ...
class BTreeIndex(PostgresIndex):
def __init__(
self,
*expressions: BaseExpression | Combinable | str,
fillfactor: int | None = None,
deduplicate_items: bool | None = None,
fields: Sequence[str] = ...,
name: str | None = ...,
db_tablespace: str | None = ...,
opclasses: Sequence[str] = ...,
condition: Q | None = ...,
include: Sequence[str] | None = ...,
) -> None: ...
class GinIndex(PostgresIndex):
def __init__(
self,
*expressions: BaseExpression | Combinable | str,
fastupdate: bool | None = None,
gin_pending_list_limit: int | None = None,
fields: Sequence[str] = ...,
name: str | None = ...,
db_tablespace: str | None = ...,
opclasses: Sequence[str] = ...,
condition: Q | None = ...,
include: Sequence[str] | None = ...,
) -> None: ...
class GistIndex(PostgresIndex):
def __init__(
self,
*expressions: BaseExpression | Combinable | str,
buffering: bool | None = None,
fillfactor: int | None = None,
fields: Sequence[str] = ...,
name: str | None = ...,
db_tablespace: str | None = ...,
opclasses: Sequence[str] = ...,
condition: Q | None = ...,
include: Sequence[str] | None = ...,
) -> None: ...
class HashIndex(PostgresIndex):
def __init__(
self,
*expressions: BaseExpression | Combinable | str,
fillfactor: int | None = None,
fields: Sequence[str] = ...,
name: str | None = ...,
db_tablespace: str | None = ...,
opclasses: Sequence[str] = ...,
condition: Q | None = ...,
include: Sequence[str] | None = ...,
) -> None: ...
class SpGistIndex(PostgresIndex):
def __init__(
self,
*expressions: BaseExpression | Combinable | str,
fillfactor: int | None = None,
fields: Sequence[str] = ...,
name: str | None = ...,
db_tablespace: str | None = ...,
opclasses: Sequence[str] = ...,
condition: Q | None = ...,
include: Sequence[str] | None = ...,
) -> None: ...
class OpClass(Func):
def __init__(
self,
expression: BaseExpression | Combinable | str,
name: str,
) -> None: ...
__all__ = ["BTreeIndex", "BloomIndex", "BrinIndex", "GinIndex", "GistIndex", "HashIndex", "SpGistIndex"]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/lookups.pyi 0000664 0000000 0000000 00000001642 15260643574 0027175 0 ustar 00root root 0000000 0000000 from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models import Transform
from django.db.models.lookups import PostgresOperatorLookup
from django.db.models.sql.compiler import SQLCompiler, _AsSqlType
from typing_extensions import override
from .search import SearchVectorExact
class DataContains(PostgresOperatorLookup): ...
class ContainedBy(PostgresOperatorLookup): ...
class Overlap(PostgresOperatorLookup): ...
class HasKey(PostgresOperatorLookup): ...
class HasKeys(PostgresOperatorLookup): ...
class HasAnyKeys(HasKeys): ...
class Unaccent(Transform): ...
class SearchLookup(SearchVectorExact):
@override
def process_lhs(self, qn: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... # type: ignore[override]
class TrigramSimilar(PostgresOperatorLookup): ...
class TrigramWordSimilar(PostgresOperatorLookup): ...
class TrigramStrictWordSimilar(PostgresOperatorLookup): ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/operations.pyi 0000664 0000000 0000000 00000004440 15260643574 0027663 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.base.schema import BaseDatabaseSchemaEditor
from django.db.migrations import AddConstraint, AddIndex, RemoveIndex
from django.db.migrations.operations.base import Operation
class CreateExtension(Operation):
name: str
hints: dict[str, Any]
def __init__(self, name: str, hints: dict[str, Any] | None = None) -> None: ...
def extension_exists(self, schema_editor: BaseDatabaseSchemaEditor, extension: str) -> bool: ...
class BloomExtension(CreateExtension):
def __init__(self, hints: dict[str, Any] | None = None) -> None: ...
class BtreeGinExtension(CreateExtension):
def __init__(self, hints: dict[str, Any] | None = None) -> None: ...
class BtreeGistExtension(CreateExtension):
def __init__(self, hints: dict[str, Any] | None = None) -> None: ...
class CITextExtension(CreateExtension):
def __init__(self, hints: dict[str, Any] | None = None) -> None: ...
class CryptoExtension(CreateExtension):
def __init__(self, hints: dict[str, Any] | None = None) -> None: ...
class HStoreExtension(CreateExtension):
def __init__(self, hints: dict[str, Any] | None = None) -> None: ...
class TrigramExtension(CreateExtension):
def __init__(self, hints: dict[str, Any] | None = None) -> None: ...
class UnaccentExtension(CreateExtension):
def __init__(self, hints: dict[str, Any] | None = None) -> None: ...
class NotInTransactionMixin:
def _ensure_not_in_transaction(self, schema_editor: BaseDatabaseSchemaEditor) -> None: ...
class AddIndexConcurrently(NotInTransactionMixin, AddIndex): ...
class RemoveIndexConcurrently(NotInTransactionMixin, RemoveIndex): ...
class CollationOperation(Operation):
name: str
locale: str
provider: str
deterministic: bool
def __init__(self, name: str, locale: str, *, provider: str = "libc", deterministic: bool = True) -> None: ...
def create_collation(self, schema_editor: BaseDatabaseSchemaEditor) -> None: ...
def remove_collation(self, schema_editor: BaseDatabaseSchemaEditor) -> None: ...
class CreateCollation(CollationOperation): ...
class RemoveCollation(CollationOperation): ...
class AddConstraintNotValid(AddConstraint): ...
class ValidateConstraint(Operation):
model_name: str
name: str
def __init__(self, model_name: str, name: str) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/search.pyi 0000664 0000000 0000000 00000014545 15260643574 0026754 0 ustar 00root root 0000000 0000000 import re
from typing import Any, ClassVar, Self, TypeAlias
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models import Expression, Field, FloatField, TextField
from django.db.models.expressions import Combinable, CombinedExpression, Func, Value
from django.db.models.lookups import Lookup
from django.db.models.sql.compiler import SQLCompiler, _AsSqlType
from psycopg.adapt import Dumper
from typing_extensions import TypeVar, override
from .utils import CheckPostgresInstalledMixin
_Expression: TypeAlias = str | Combinable | SearchQueryCombinable
# __set__ value type
_ST = TypeVar("_ST", contravariant=True)
# __get__ return type
_GT = TypeVar("_GT", covariant=True)
class UTF8Dumper(Dumper):
@override
def dump(self, obj: object) -> bytes: ...
def quote_lexeme(value: str) -> str: ...
spec_chars_re: re.Pattern[str]
multiple_spaces_re: re.Pattern[str]
def normalize_spaces(val: str) -> str | None: ...
def psql_escape(query: str) -> str | None: ...
class SearchVectorExact(Lookup):
@override
def process_rhs(self, qn: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
@override
def as_sql(self, qn: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
class SearchVectorField(CheckPostgresInstalledMixin, Field[_ST, _GT]): ...
class SearchQueryField(CheckPostgresInstalledMixin, Field[_ST, _GT]): ...
class SearchConfig(Expression):
config: _Expression | None
def __init__(self, config: _Expression) -> None: ...
@classmethod
def from_parameter(cls, config: _Expression | None) -> SearchConfig: ...
class SearchVectorCombinable:
ADD: str
class SearchVector(SearchVectorCombinable, Func):
config: _Expression | None
function: str
arg_joiner: str
output_field: ClassVar[SearchVectorField[Any, Any]]
def __init__(
self, *expressions: _Expression, config: _Expression | None = None, weight: Any | None = None
) -> None: ...
@override
def as_sql( # type: ignore[override]
self,
compiler: SQLCompiler,
connection: BaseDatabaseWrapper,
function: str | None = None,
template: str | None = None,
) -> _AsSqlType: ...
class CombinedSearchVector(SearchVectorCombinable, CombinedExpression):
def __init__(
self,
lhs: Combinable,
connector: str,
rhs: Combinable,
config: _Expression | None,
output_field: Field[Any, Any] | None = None,
) -> None: ...
class SearchQueryCombinable:
BITAND: str
BITOR: str
def __or__(self, other: SearchQueryCombinable) -> Self: ...
def __ror__(self, other: SearchQueryCombinable) -> Self: ...
def __and__(self, other: SearchQueryCombinable) -> Self: ...
def __rand__(self, other: SearchQueryCombinable) -> Self: ...
class SearchQuery(SearchQueryCombinable, Func): # type: ignore[misc]
output_field: ClassVar[SearchQueryField[Any, Any]]
SEARCH_TYPES: dict[str, str]
def __init__(
self,
value: _Expression,
output_field: Field[Any, Any] | None = None,
*,
config: _Expression | None = None,
invert: bool = False,
search_type: str = "plain",
) -> None: ...
@override
def as_sql( # type: ignore[override]
self,
compiler: SQLCompiler,
connection: BaseDatabaseWrapper,
function: str | None = None,
template: str | None = None,
) -> _AsSqlType: ...
@override
def __invert__(self) -> Self: ... # type: ignore[override]
class CombinedSearchQuery(SearchQueryCombinable, CombinedExpression): # type: ignore[misc]
def __init__(
self,
lhs: Combinable,
connector: str,
rhs: Combinable,
config: _Expression | None,
output_field: Field[Any, Any] | None = None,
) -> None: ...
class SearchRank(Func):
output_field: ClassVar[FloatField[Any, Any]]
def __init__(
self,
vector: SearchVector | _Expression,
query: SearchQuery | _Expression,
weights: Any | None = None,
normalization: Any | None = None,
cover_density: bool = False,
) -> None: ...
class SearchHeadline(Func):
function: str
template: str
output_field: ClassVar[TextField[Any, Any]]
def __init__(
self,
expression: _Expression,
query: _Expression,
*,
config: _Expression | None = None,
start_sel: Any | None = None,
stop_sel: Any | None = None,
max_words: int | None = None,
min_words: int | None = None,
short_word: str | None = None,
highlight_all: bool | None = None,
max_fragments: int | None = None,
fragment_delimiter: str | None = None,
) -> None: ...
@override
def as_sql( # type: ignore[override]
self,
compiler: SQLCompiler,
connection: BaseDatabaseWrapper,
function: str | None = None,
template: str | None = None,
) -> _AsSqlType: ...
class TrigramBase(Func):
output_field: ClassVar[FloatField[Any, Any]]
def __init__(self, expression: _Expression, string: str, **extra: Any) -> None: ...
class TrigramWordBase(Func):
output_field: ClassVar[FloatField[Any, Any]]
def __init__(self, string: str, expression: _Expression, **extra: Any) -> None: ...
class TrigramSimilarity(TrigramBase): ...
class TrigramDistance(TrigramBase): ...
class TrigramWordDistance(TrigramWordBase): ...
class TrigramStrictWordDistance(TrigramWordBase): ...
class TrigramWordSimilarity(TrigramWordBase): ...
class TrigramStrictWordSimilarity(TrigramWordBase): ...
class LexemeCombinable:
BITAND: str
BITOR: str
def __or__(self, other: LexemeCombinable) -> CombinedLexeme: ...
def __ror__(self, other: LexemeCombinable) -> CombinedLexeme: ...
def __and__(self, other: LexemeCombinable) -> CombinedLexeme: ...
def __rand__(self, other: LexemeCombinable) -> CombinedLexeme: ...
class Lexeme(LexemeCombinable, Value): # type: ignore[misc]
def __init__(
self,
value: Any,
output_field: Any | None = None,
*,
invert: bool = False,
prefix: bool = False,
weight: Any | None = None,
) -> None: ...
@override
def __invert__(self) -> Self: ... # type: ignore[override]
class CombinedLexeme(LexemeCombinable, CombinedExpression): # type: ignore[misc]
@override
def __invert__(self) -> Self: ... # type: ignore[override]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/serializers.pyi 0000664 0000000 0000000 00000000315 15260643574 0030031 0 ustar 00root root 0000000 0000000 from django.db.migrations.serializer import BaseSerializer
from typing_extensions import override
class RangeSerializer(BaseSerializer):
@override
def serialize(self) -> tuple[str, set[str]]: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/signals.pyi 0000664 0000000 0000000 00000000577 15260643574 0027147 0 ustar 00root root 0000000 0000000 from typing import Any
def get_type_oids(connection_alias: str, type_name: str) -> tuple[tuple[Any, ...], tuple[Any, ...]]: ...
def get_hstore_oids(connection_alias: str) -> tuple[tuple[Any, ...], tuple[Any, ...]]: ...
def get_citext_oids(connection_alias: str) -> tuple[tuple[Any, ...], tuple[Any, ...]]: ...
def register_type_handlers(connection: Any, **kwargs: Any) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/utils.pyi 0000664 0000000 0000000 00000000632 15260643574 0026637 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.checks import CheckMessage
from django.core.exceptions import ValidationError
def prefix_validation_error(error: Any, prefix: Any, code: Any, params: Any) -> ValidationError: ...
class CheckPostgresInstalledMixin:
def _check_postgres_installed(self, *args: Any) -> list[CheckMessage]: ...
def check(self, *args: Any, **kwargs: Any) -> list[CheckMessage]: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/validators.pyi 0000664 0000000 0000000 00000001324 15260643574 0027646 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable, Mapping
from typing import Any
from django.core.validators import MaxLengthValidator, MaxValueValidator, MinLengthValidator, MinValueValidator
from django.utils.deconstruct import _Deconstructible
class ArrayMaxLengthValidator(MaxLengthValidator): ...
class ArrayMinLengthValidator(MinLengthValidator): ...
class KeysValidator(_Deconstructible):
messages: dict[str, str]
strict: bool
def __init__(
self, keys: Iterable[str], strict: bool = False, messages: Mapping[str, str] | None = None
) -> None: ...
def __call__(self, value: Any) -> None: ...
class RangeMaxValueValidator(MaxValueValidator): ...
class RangeMinValueValidator(MinValueValidator): ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/redirects/ 0000775 0000000 0000000 00000000000 15260643574 0025071 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/redirects/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0027341 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/redirects/admin.pyi 0000664 0000000 0000000 00000000440 15260643574 0026702 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar
from django.contrib import admin
from django.contrib.redirects.models import Redirect
class RedirectAdmin(admin.ModelAdmin[Redirect]):
list_display: Any
list_filter: ClassVar[Any]
search_fields: ClassVar[Any]
radio_fields: ClassVar[Any]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/redirects/apps.pyi 0000664 0000000 0000000 00000000201 15260643574 0026550 0 ustar 00root root 0000000 0000000 from typing import Any
from django.apps import AppConfig
class RedirectsConfig(AppConfig):
name: str
verbose_name: Any
typeddjango-django-stubs-fa03b48/django-stubs/contrib/redirects/middleware.pyi 0000664 0000000 0000000 00000000730 15260643574 0027731 0 ustar 00root root 0000000 0000000 from typing import ClassVar
from django.http.request import HttpRequest
from django.http.response import HttpResponse, HttpResponseRedirectBase
from django.utils.deprecation import MiddlewareMixin
class RedirectFallbackMiddleware(MiddlewareMixin):
response_gone_class: ClassVar[type[HttpResponse]]
response_redirect_class: ClassVar[type[HttpResponseRedirectBase]]
def process_response(self, request: HttpRequest, response: HttpResponse) -> HttpResponse: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/redirects/migrations/ 0000775 0000000 0000000 00000000000 15260643574 0027245 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/redirects/migrations/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0031515 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/redirects/models.pyi 0000664 0000000 0000000 00000000512 15260643574 0027075 0 ustar 00root root 0000000 0000000 from django.contrib.sites.models import Site
from django.db import models
from django.db.models.expressions import Combinable
class Redirect(models.Model):
site: models.ForeignKey[Site | Combinable, Site]
old_path: models.CharField[str | int | Combinable, str]
new_path: models.CharField[str | int | Combinable, str]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/ 0000775 0000000 0000000 00000000000 15260643574 0024753 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0027223 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/apps.pyi 0000664 0000000 0000000 00000000200 15260643574 0026431 0 ustar 00root root 0000000 0000000 from typing import Any
from django.apps import AppConfig
class SessionsConfig(AppConfig):
name: str
verbose_name: Any
typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/backends/ 0000775 0000000 0000000 00000000000 15260643574 0026525 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/backends/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0030775 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/backends/base.pyi 0000664 0000000 0000000 00000010406 15260643574 0030163 0 ustar 00root root 0000000 0000000 from _collections_abc import dict_items, dict_keys, dict_values
from collections.abc import Iterable
from datetime import datetime, timedelta
from typing import Any, overload
from _typeshed import SupportsKeysAndGetItem
from typing_extensions import override
VALID_KEY_CHARS: Any
class CreateError(Exception): ...
class UpdateError(Exception): ...
class SessionBase(dict[str, Any]):
TEST_COOKIE_NAME: str
TEST_COOKIE_VALUE: str
accessed: bool
modified: bool
serializer: Any
def __init__(self, session_key: str | None = None) -> None: ...
async def aset(self, key: str, value: Any) -> None: ...
def __bool__(self) -> bool: ...
@property
def key_salt(self) -> str: ...
@overload # type: ignore[override]
def get(self, key: str) -> Any | None: ...
@overload
@override
def get(self, key: str, default: Any) -> Any: ...
@overload
async def aget(self, key: str) -> Any | None: ...
@overload
async def aget(self, key: str, default: Any) -> Any: ...
@overload
@override
def pop(self, key: str) -> Any: ...
@overload
@override
def pop(self, key: str, default: Any) -> Any: ...
@overload
async def apop(self, key: str) -> Any: ...
@overload
async def apop(self, key: str, default: Any) -> Any: ...
@override
def setdefault(self, key: str, value: Any) -> Any: ... # type: ignore[override]
async def asetdefault(self, key: str, value: Any) -> Any: ...
def set_test_cookie(self) -> None: ...
async def aset_test_cookie(self) -> None: ...
def test_cookie_worked(self) -> bool: ...
async def atest_cookie_worked(self) -> bool: ...
def delete_test_cookie(self) -> None: ...
async def adelete_test_cookie(self) -> None: ...
def encode(self, session_dict: dict[str, Any]) -> str: ...
def decode(self, session_data: bytes | str) -> dict[str, Any]: ...
@overload # type: ignore[override]
def update(self, dict_: SupportsKeysAndGetItem[str, Any]) -> None: ...
@overload
@override
def update(self, dict_: Iterable[tuple[str, Any]]) -> None: ...
@overload
async def aupdate(self, dict_: SupportsKeysAndGetItem[str, Any]) -> None: ...
@overload
async def aupdate(self, dict_: Iterable[tuple[str, Any]]) -> None: ...
def has_key(self, key: Any) -> bool: ...
async def ahas_key(self, key: Any) -> bool: ...
async def akeys(self) -> dict_keys[str, Any]: ...
async def avalues(self) -> dict_values[str, Any]: ...
async def aitems(self) -> dict_items[str, Any]: ...
@override
def clear(self) -> None: ...
def is_empty(self) -> bool: ...
def _get_session_key(self) -> str | None: ...
def _set_session_key(self, value: str | None) -> None: ...
@property
def session_key(self) -> str | None: ...
@property
def _session_key(self) -> str | None: ...
@_session_key.setter
def _session_key(self, value: str | None) -> None: ...
def get_session_cookie_age(self) -> int: ...
def get_expiry_age(self, **kwargs: Any) -> int: ...
async def aget_expiry_age(self, **kwargs: Any) -> int: ...
def get_expiry_date(self, **kwargs: Any) -> datetime: ...
async def aget_expiry_date(self, **kwargs: Any) -> datetime: ...
def set_expiry(self, value: datetime | timedelta | int | None) -> None: ...
async def aset_expiry(self, value: datetime | timedelta | int | None) -> None: ...
def get_expire_at_browser_close(self) -> bool: ...
async def aget_expire_at_browser_close(self) -> bool: ...
def flush(self) -> None: ...
async def aflush(self) -> None: ...
def cycle_key(self) -> None: ...
async def acycle_key(self) -> None: ...
def exists(self, session_key: str) -> bool: ...
async def aexists(self, session_key: str) -> bool: ...
def create(self) -> None: ...
async def acreate(self) -> None: ...
def save(self, must_create: bool = False) -> None: ...
async def asave(self, must_create: bool = False) -> None: ...
def delete(self, session_key: str | None = None) -> None: ...
async def adelete(self, session_key: str | None = None) -> None: ...
def load(self) -> dict[str, Any]: ...
async def aload(self) -> dict[str, Any]: ...
@classmethod
def clear_expired(cls) -> None: ...
@classmethod
async def aclear_expired(cls) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/backends/cache.pyi 0000664 0000000 0000000 00000000504 15260643574 0030312 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.sessions.backends.base import SessionBase
KEY_PREFIX: str
class SessionStore(SessionBase):
cache_key_prefix: Any
def __init__(self, session_key: str | None = None) -> None: ...
@property
def cache_key(self) -> str: ...
async def acache_key(self) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/backends/cached_db.pyi 0000664 0000000 0000000 00000000565 15260643574 0031132 0 ustar 00root root 0000000 0000000 from logging import Logger
from typing import Any
from django.contrib.sessions.backends.db import SessionStore as DBStore
KEY_PREFIX: str
logger: Logger
class SessionStore(DBStore):
cache_key_prefix: Any
def __init__(self, session_key: str | None = None) -> None: ...
@property
def cache_key(self) -> str: ...
async def acache_key(self) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/backends/db.pyi 0000664 0000000 0000000 00000001316 15260643574 0027636 0 ustar 00root root 0000000 0000000 from typing import Any, Generic
from django.contrib.sessions.backends.base import SessionBase
from django.contrib.sessions.base_session import AbstractBaseSession
from django.utils.functional import cached_property
from typing_extensions import TypeVar
_ST = TypeVar("_ST", bound=AbstractBaseSession, default=AbstractBaseSession)
class SessionStore(SessionBase, Generic[_ST]):
def __init__(self, session_key: str | None = None) -> None: ...
@classmethod
def get_model_class(cls) -> type[_ST]: ...
@cached_property
def model(self) -> type[_ST]: ...
def create_model_instance(self, data: dict[str, Any]) -> _ST: ...
async def acreate_model_instance(self, data: dict[str, Any]) -> _ST: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/backends/file.pyi 0000664 0000000 0000000 00000000317 15260643574 0030170 0 ustar 00root root 0000000 0000000 from django.contrib.sessions.backends.base import SessionBase
class SessionStore(SessionBase):
storage_path: str
file_prefix: str
def __init__(self, session_key: str | None = None) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/backends/signed_cookies.pyi 0000664 0000000 0000000 00000000456 15260643574 0032242 0 ustar 00root root 0000000 0000000 from django.contrib.sessions.backends.base import SessionBase
from typing_extensions import override
class SessionStore(SessionBase):
@override
def exists(self, session_key: str | None = None) -> bool: ...
@override
async def aexists(self, session_key: str | None = None) -> bool: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/base_session.pyi 0000664 0000000 0000000 00000002062 15260643574 0030153 0 ustar 00root root 0000000 0000000 import datetime as dt
from typing import Any, ClassVar, Self
from django.contrib.sessions.backends.base import SessionBase
from django.db import models
from django.db.models.expressions import Combinable
from typing_extensions import TypeVar
_T = TypeVar("_T", bound=AbstractBaseSession)
class BaseSessionManager(models.Manager[_T]):
def encode(self, session_dict: dict[str, Any]) -> str: ...
def save(self, session_key: str, session_dict: dict[str, Any], expire_date: dt.datetime) -> _T: ...
class AbstractBaseSession(models.Model):
session_key: models.CharField[str | int | Combinable, str]
session_data: models.TextField[str | Combinable, str]
expire_date: models.DateTimeField[str | dt.datetime | dt.date | Combinable, dt.datetime]
objects: ClassVar[BaseSessionManager[Self]]
class Meta:
abstract: ClassVar[bool]
verbose_name: ClassVar[str]
verbose_name_plural: ClassVar[str]
@classmethod
def get_session_store_class(cls) -> type[SessionBase] | None: ...
def get_decoded(self) -> dict[str, Any]: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/exceptions.pyi 0000664 0000000 0000000 00000000322 15260643574 0027654 0 ustar 00root root 0000000 0000000 from django.core.exceptions import BadRequest, SuspiciousOperation
class InvalidSessionKey(SuspiciousOperation): ...
class SuspiciousSession(SuspiciousOperation): ...
class SessionInterrupted(BadRequest): ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/management/ 0000775 0000000 0000000 00000000000 15260643574 0027067 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/management/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0031337 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/management/commands/ 0000775 0000000 0000000 00000000000 15260643574 0030670 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/management/commands/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0033140 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/management/commands/clearsessions.pyi0000664 0000000 0000000 00000000320 15260643574 0034263 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.management.base import BaseCommand
from typing_extensions import override
class Command(BaseCommand):
@override
def handle(self, **options: Any) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/middleware.pyi 0000664 0000000 0000000 00000000677 15260643574 0027625 0 ustar 00root root 0000000 0000000 from django.contrib.sessions.backends.base import SessionBase
from django.http.request import HttpRequest
from django.http.response import HttpResponse
from django.utils.deprecation import MiddlewareMixin
class SessionMiddleware(MiddlewareMixin):
SessionStore: type[SessionBase]
def process_request(self, request: HttpRequest) -> None: ...
def process_response(self, request: HttpRequest, response: HttpResponse) -> HttpResponse: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/migrations/ 0000775 0000000 0000000 00000000000 15260643574 0027127 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/migrations/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0031377 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/models.pyi 0000664 0000000 0000000 00000000375 15260643574 0026766 0 ustar 00root root 0000000 0000000 from django.contrib.sessions.base_session import AbstractBaseSession, BaseSessionManager
from typing_extensions import TypeVar
_T = TypeVar("_T", bound=Session)
class SessionManager(BaseSessionManager[_T]): ...
class Session(AbstractBaseSession): ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/serializers.pyi 0000664 0000000 0000000 00000000223 15260643574 0030027 0 ustar 00root root 0000000 0000000 from typing import TypeAlias
from django.core.signing import JSONSerializer as BaseJSONSerializer
JSONSerializer: TypeAlias = BaseJSONSerializer
typeddjango-django-stubs-fa03b48/django-stubs/contrib/sitemaps/ 0000775 0000000 0000000 00000000000 15260643574 0024732 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/sitemaps/__init__.pyi 0000664 0000000 0000000 00000003435 15260643574 0027221 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable, Mapping, Sequence
from datetime import datetime
from typing import Any, Generic
from django.contrib.sites.models import Site
from django.contrib.sites.requests import RequestSite
from django.core.paginator import Paginator
from django.db.models.base import Model
from django.db.models.query import QuerySet
from typing_extensions import TypeVar, override
_ItemT = TypeVar("_ItemT")
class Sitemap(Generic[_ItemT]):
limit: int
protocol: str | None
i18n: bool
languages: Sequence[str] | None
alternates: bool
x_default: bool
def items(self) -> Iterable[_ItemT]: ...
def location(self, item: _ItemT) -> str: ...
@property
def paginator(self) -> Paginator[_ItemT]: ...
def get_languages_for_item(self, item: _ItemT) -> list[str]: ...
def get_protocol(self, protocol: str | None = None) -> str: ...
def get_domain(self, site: Site | RequestSite | None = None) -> str: ...
def get_urls(
self, page: int | str = 1, site: Site | RequestSite | None = None, protocol: str | None = None
) -> list[dict[str, Any]]: ...
def get_latest_lastmod(self) -> datetime | None: ...
_ModelT = TypeVar("_ModelT", bound=Model)
class GenericSitemap(Sitemap[_ModelT]):
priority: float | None
changefreq: str | None
queryset: QuerySet[_ModelT]
date_field: str | None
protocol: str | None
def __init__(
self,
info_dict: Mapping[str, datetime | QuerySet[_ModelT] | str],
priority: float | None = None,
changefreq: str | None = None,
protocol: str | None = None,
) -> None: ...
@override
def items(self) -> QuerySet[_ModelT]: ...
def lastmod(self, item: _ModelT) -> datetime | None: ...
@override
def get_latest_lastmod(self) -> datetime | None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/sitemaps/apps.pyi 0000664 0000000 0000000 00000000200 15260643574 0026410 0 ustar 00root root 0000000 0000000 from typing import Any
from django.apps import AppConfig
class SiteMapsConfig(AppConfig):
name: str
verbose_name: Any
typeddjango-django-stubs-fa03b48/django-stubs/contrib/sitemaps/views.pyi 0000664 0000000 0000000 00000001556 15260643574 0026621 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from dataclasses import dataclass
from typing import Any
from django.contrib.sitemaps import Sitemap
from django.http.request import HttpRequest
from django.template.response import TemplateResponse
from typing_extensions import TypeVar
_C = TypeVar("_C", bound=Callable[..., Any])
@dataclass
class SitemapIndexItem:
location: str
last_mod: bool | None = ...
def x_robots_tag(func: _C) -> _C: ...
def index(
request: HttpRequest,
sitemaps: dict[str, type[Sitemap[Any]] | Sitemap[Any]],
template_name: str = ...,
content_type: str = ...,
sitemap_url_name: str = ...,
) -> TemplateResponse: ...
def sitemap(
request: HttpRequest,
sitemaps: dict[str, type[Sitemap[Any]] | Sitemap[Any]],
section: str | None = ...,
template_name: str = ...,
content_type: str = ...,
) -> TemplateResponse: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/sites/ 0000775 0000000 0000000 00000000000 15260643574 0024234 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/sites/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0026504 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/sites/admin.pyi 0000664 0000000 0000000 00000000321 15260643574 0026043 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar
from django.contrib import admin
from django.contrib.sites.models import Site
class SiteAdmin(admin.ModelAdmin[Site]):
list_display: Any
search_fields: ClassVar[Any]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/sites/apps.pyi 0000664 0000000 0000000 00000000105 15260643574 0025716 0 ustar 00root root 0000000 0000000 from django.apps import AppConfig
class SitesConfig(AppConfig): ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/sites/checks.pyi 0000664 0000000 0000000 00000000355 15260643574 0026222 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from django.apps.config import AppConfig
from django.core.checks.messages import CheckMessage
def check_site_id(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/sites/management.pyi 0000664 0000000 0000000 00000000446 15260643574 0027077 0 ustar 00root root 0000000 0000000 from typing import Any
from django.apps.config import AppConfig
from django.apps.registry import Apps
def create_default_site(
app_config: AppConfig,
verbosity: int = 2,
interactive: bool = True,
using: str = "default",
apps: Apps = ...,
**kwargs: Any,
) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/sites/managers.pyi 0000664 0000000 0000000 00000000335 15260643574 0026555 0 ustar 00root root 0000000 0000000 from django.db import models
from typing_extensions import TypeVar
_T = TypeVar("_T", bound=models.Model)
class CurrentSiteManager(models.Manager[_T]):
def __init__(self, field_name: str | None = None) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/sites/middleware.pyi 0000664 0000000 0000000 00000000321 15260643574 0027070 0 ustar 00root root 0000000 0000000 from django.http.request import HttpRequest
from django.utils.deprecation import MiddlewareMixin
class CurrentSiteMiddleware(MiddlewareMixin):
def process_request(self, request: HttpRequest) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/sites/migrations/ 0000775 0000000 0000000 00000000000 15260643574 0026410 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/sites/migrations/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0030660 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/sites/models.pyi 0000664 0000000 0000000 00000001252 15260643574 0026242 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar
from django.db import models
from django.db.models.expressions import Combinable
from django.http.request import HttpRequest
SITE_CACHE: Any
class SiteManager(models.Manager[Site]):
def get_current(self, request: HttpRequest | None = ...) -> Site: ...
def clear_cache(self) -> None: ...
def get_by_natural_key(self, domain: str) -> Site: ...
class Site(models.Model):
objects: ClassVar[SiteManager]
domain: models.CharField[str | int | Combinable, str]
name: models.CharField[str | int | Combinable, str]
def natural_key(self) -> tuple[str]: ...
def clear_site_cache(sender: type[Site], **kwargs: Any) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/sites/requests.pyi 0000664 0000000 0000000 00000000573 15260643574 0026637 0 ustar 00root root 0000000 0000000 from typing import NoReturn
from django.db.models.base import ModelBase
from django.http.request import HttpRequest
class RequestSite:
name: str
domain: str
def __init__(self, request: HttpRequest) -> None: ...
def save(self, force_insert: bool | tuple[ModelBase, ...] = False, force_update: bool = False) -> NoReturn: ...
def delete(self) -> NoReturn: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/sites/shortcuts.pyi 0000664 0000000 0000000 00000000335 15260643574 0027016 0 ustar 00root root 0000000 0000000 from django.contrib.sites.models import Site
from django.contrib.sites.requests import RequestSite
from django.http.request import HttpRequest
def get_current_site(request: HttpRequest | None) -> Site | RequestSite: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/ 0000775 0000000 0000000 00000000000 15260643574 0025417 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0027667 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/apps.pyi 0000664 0000000 0000000 00000000170 15260643574 0027103 0 ustar 00root root 0000000 0000000 from typing import Any
from django.apps import AppConfig
class StaticFilesConfig(AppConfig):
ignore_patterns: Any
typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/checks.pyi 0000664 0000000 0000000 00000000552 15260643574 0027404 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from django.apps.config import AppConfig
from django.core.checks.messages import CheckMessage, Error
E005: Error
def check_finders(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
def check_storages(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/finders.pyi 0000664 0000000 0000000 00000004060 15260643574 0027574 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable, Iterator, Sequence
from typing import Any, Literal, overload
from django.core.checks.messages import CheckMessage
from django.core.files.storage import FileSystemStorage, Storage
from typing_extensions import override
searched_locations: Any
class BaseFinder:
def check(self, **kwargs: Any) -> list[CheckMessage]: ...
@overload
def find(self, path: str, find_all: Literal[False] = False) -> str | None: ...
@overload
def find(self, path: str, find_all: Literal[True]) -> list[str]: ...
def list(self, ignore_patterns: Iterable[str] | None) -> Iterable[Any]: ...
class FileSystemFinder(BaseFinder):
locations: list[tuple[str, str]]
storages: dict[str, Any]
def __init__(self, app_names: Sequence[str] | None = None, *args: Any, **kwargs: Any) -> None: ...
def find_location(self, root: str, path: str, prefix: str | None = None) -> str | None: ...
@override
def list(self, ignore_patterns: Iterable[str] | None) -> Iterable[Any]: ...
class AppDirectoriesFinder(BaseFinder):
storage_class: type[FileSystemStorage]
source_dir: str
apps: list[str]
storages: dict[str, FileSystemStorage]
def __init__(self, app_names: Iterable[str] | None = None, *args: Any, **kwargs: Any) -> None: ...
def find_in_app(self, app: str, path: str) -> str | None: ...
@override
def list(self, ignore_patterns: Iterable[str] | None) -> Iterable[Any]: ...
class BaseStorageFinder(BaseFinder):
storage: Storage | None
def __init__(self, storage: Storage | None = None, *args: Any, **kwargs: Any) -> None: ...
@override
def list(self, ignore_patterns: Iterable[str] | None) -> Iterable[Any]: ...
class DefaultStorageFinder(BaseStorageFinder):
storage: Storage
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
@overload
def find(path: str, find_all: Literal[False] = False) -> str | None: ...
@overload
def find(path: str, find_all: Literal[True]) -> list[str]: ...
def get_finders() -> Iterator[BaseFinder]: ...
def get_finder(import_path: str) -> BaseFinder: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/handlers.pyi 0000664 0000000 0000000 00000003403 15260643574 0027742 0 ustar 00root root 0000000 0000000 from collections.abc import Awaitable, Callable, Mapping
from typing import Any
from urllib.parse import ParseResult
from wsgiref.types import StartResponse, WSGIEnvironment
from django.core.handlers.asgi import ASGIHandler
from django.core.handlers.base import BaseHandler
from django.core.handlers.wsgi import WSGIHandler
from django.http import HttpRequest
from django.http.response import FileResponse, HttpResponse, HttpResponseBase
from typing_extensions import override
class StaticFilesHandlerMixin:
handles_files: bool
application: BaseHandler
base_url: ParseResult
def load_middleware(self) -> None: ...
def get_base_url(self) -> str: ...
def _should_handle(self, path: str) -> bool: ...
def file_path(self, url: str) -> str: ...
def serve(self, request: HttpRequest) -> HttpResponse | FileResponse: ...
def get_response(self, request: HttpRequest) -> HttpResponseBase: ...
async def get_response_async(self, request: HttpRequest) -> HttpResponseBase: ...
class StaticFilesHandler(StaticFilesHandlerMixin, WSGIHandler): # type: ignore[misc]
application: WSGIHandler
base_url: ParseResult
def __init__(self, application: WSGIHandler) -> None: ...
@override
def __call__(
self,
environ: WSGIEnvironment,
start_response: StartResponse,
) -> HttpResponseBase: ...
class ASGIStaticFilesHandler(StaticFilesHandlerMixin, ASGIHandler): # type: ignore[misc]
application: ASGIHandler
base_url: ParseResult
def __init__(self, application: ASGIHandler) -> None: ...
@override
async def __call__(
self,
scope: dict[str, Any],
receive: Callable[[], Awaitable[Mapping[str, Any]]],
send: Callable[[Mapping[str, Any]], Awaitable[None]],
) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/management/ 0000775 0000000 0000000 00000000000 15260643574 0027533 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/management/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0032003 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/management/commands/ 0000775 0000000 0000000 00000000000 15260643574 0031334 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/management/commands/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0033604 0 ustar 00root root 0000000 0000000 collectstatic.pyi 0000664 0000000 0000000 00000002305 15260643574 0034635 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/management/commands from typing import Any
from django.core.files.storage import Storage
from django.core.management.base import BaseCommand
from django.utils.functional import cached_property
from typing_extensions import override
class Command(BaseCommand):
copied_files: Any
symlinked_files: Any
unmodified_files: Any
post_processed_files: Any
storage: Any
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
@cached_property
def local(self) -> bool: ...
interactive: Any
verbosity: Any
symlink: Any
clear: Any
dry_run: Any
ignore_patterns: Any
post_process: Any
def set_options(self, **options: Any) -> None: ...
def collect(self) -> dict[str, list[str]]: ...
@override
def handle(self, **options: Any) -> str | None: ...
def log(self, msg: str, level: int = 2) -> None: ...
def is_local_storage(self) -> bool: ...
def clear_dir(self, path: str) -> None: ...
def delete_file(self, path: str, prefixed_path: str, source_storage: Storage) -> bool: ...
def link_file(self, path: str, prefixed_path: str, source_storage: Storage) -> None: ...
def copy_file(self, path: str, prefixed_path: str, source_storage: Storage) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/management/commands/findstatic.pyi0000664 0000000 0000000 00000000403 15260643574 0034204 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.management.base import LabelCommand
from typing_extensions import override
class Command(LabelCommand):
@override
def handle_label(self, path: str, **options: Any) -> str | None: ... # type: ignore[override]
typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/management/commands/runserver.pyi 0000664 0000000 0000000 00000000170 15260643574 0034110 0 ustar 00root root 0000000 0000000 from django.core.management.commands.runserver import Command as RunserverCommand
class Command(RunserverCommand): ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/storage.pyi 0000664 0000000 0000000 00000005216 15260643574 0027612 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterator
from re import Match, Pattern
from typing import Any, TypeAlias
from _typeshed import StrPath
from django.core.files.base import File
from django.core.files.storage import FileSystemStorage, Storage
from django.utils.functional import LazyObject
from typing_extensions import override
_PostProcessT: TypeAlias = Iterator[tuple[str, str, bool] | tuple[str, None, RuntimeError]]
class StaticFilesStorage(FileSystemStorage):
def __init__(
self, location: StrPath | None = None, base_url: str | None = None, *args: Any, **kwargs: Any
) -> None: ...
@override
def path(self, name: StrPath) -> str: ...
class HashedFilesMixin:
default_template: str
max_post_process_passes: int
support_js_module_import_aggregation: bool
patterns: Any
hashed_files: Any
keep_intermediate_files: bool
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
def file_hash(self, name: str, content: File[Any] | None = None) -> str | None: ...
def hashed_name(self, name: str, content: File[Any] | None = None, filename: str | None = None) -> str: ...
def url(self, name: str, force: bool = False) -> str: ...
def get_ignored_blocks(self, content: str, pattern: Pattern[str]) -> list[tuple[int, int]]: ...
def is_in_ignored_block(self, pos: int, ignored_blocks: list[tuple[int, int]]) -> bool: ...
def url_converter(
self,
name: str,
hashed_files: dict[str, Any],
template: str | None = None,
ignored_blocks: list[tuple[int, int]] | None = None,
) -> Callable[[Match[str]], str]: ...
def post_process(self, paths: dict[str, Any], dry_run: bool = False, **options: Any) -> _PostProcessT: ...
def clean_name(self, name: str) -> str: ...
def hash_key(self, name: str) -> str: ...
def stored_name(self, name: str) -> str: ...
class ManifestFilesMixin(HashedFilesMixin):
manifest_version: str
manifest_name: str
manifest_strict: bool
keep_intermediate_files: bool
manifest_storage: Storage | None
hashed_files: dict[str, str]
manifest_hash: str
def __init__(self, *args: Any, manifest_storage: Storage | None = None, **kwargs: Any) -> None: ...
def read_manifest(self) -> str: ...
def load_manifest(self) -> dict[str, Any]: ...
def save_manifest(self) -> None: ...
@override
def post_process(self, *args: Any, **kwargs: Any) -> _PostProcessT: ...
@override
def stored_name(self, name: str) -> str: ...
class ManifestStaticFilesStorage(ManifestFilesMixin, StaticFilesStorage): ... # type: ignore[misc]
class ConfiguredStorage(LazyObject[Storage]): ...
staticfiles_storage: Storage
typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/testing.pyi 0000664 0000000 0000000 00000000144 15260643574 0027616 0 ustar 00root root 0000000 0000000 from django.test import LiveServerTestCase
class StaticLiveServerTestCase(LiveServerTestCase): ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/urls.pyi 0000664 0000000 0000000 00000000230 15260643574 0027122 0 ustar 00root root 0000000 0000000 from django.urls import URLPattern, _AnyURL
urlpatterns: list[_AnyURL]
def staticfiles_urlpatterns(prefix: str | None = ...) -> list[URLPattern]: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/utils.pyi 0000664 0000000 0000000 00000000532 15260643574 0027302 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable, Iterator
from django.core.files.storage import Storage
def matches_patterns(path: str, patterns: Iterable[str]) -> bool: ...
def get_files(storage: Storage, ignore_patterns: Iterable[str] | None = None, location: str = "") -> Iterator[str]: ...
def check_settings(base_url: str | None = None) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/views.pyi 0000664 0000000 0000000 00000000367 15260643574 0027305 0 ustar 00root root 0000000 0000000 from typing import Any
from django.http.request import HttpRequest
from django.http.response import FileResponse, HttpResponse
def serve(request: HttpRequest, path: str, insecure: bool = False, **kwargs: Any) -> HttpResponse | FileResponse: ...
typeddjango-django-stubs-fa03b48/django-stubs/contrib/syndication/ 0000775 0000000 0000000 00000000000 15260643574 0025431 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/syndication/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0027701 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/contrib/syndication/apps.pyi 0000664 0000000 0000000 00000000203 15260643574 0027112 0 ustar 00root root 0000000 0000000 from typing import Any
from django.apps import AppConfig
class SyndicationConfig(AppConfig):
name: str
verbose_name: Any
typeddjango-django-stubs-fa03b48/django-stubs/contrib/syndication/views.pyi 0000664 0000000 0000000 00000003576 15260643574 0027324 0 ustar 00root root 0000000 0000000 from typing import Any, Generic
from django.core.exceptions import ObjectDoesNotExist
from django.http.request import HttpRequest
from django.http.response import HttpResponse
from django.utils.feedgenerator import Enclosure, SyndicationFeed
from typing_extensions import TypeVar
def add_domain(domain: str, url: str, secure: bool = ...) -> str: ...
class FeedDoesNotExist(ObjectDoesNotExist): ...
_Item = TypeVar("_Item")
_Object = TypeVar("_Object")
class Feed(Generic[_Item, _Object]):
feed_type: type[SyndicationFeed]
title_template: str | None
description_template: str | None
language: str | None
# Dynamic attributes:
title: Any
link: Any
feed_url: Any
feed_guid: Any
description: Any
author_name: Any
author_email: Any
author_link: Any
categories: Any
feed_copyright: Any
ttl: Any
items: Any
item_guid: Any
item_guid_is_permalink: Any
item_author_name: Any
item_author_email: Any
item_author_link: Any
item_enclosure_url: Any
item_enclosure_length: Any
item_enclosure_mime_type: Any
item_pubdate: Any
item_updateddate: Any
item_categories: Any
item_copyright: Any
item_comments: Any
def __call__(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ...
def get_object(self, request: HttpRequest, *args: Any, **kwargs: Any) -> _Object | None: ...
def feed_extra_kwargs(self, obj: _Object) -> dict[Any, Any]: ...
def item_extra_kwargs(self, item: _Item) -> dict[Any, Any]: ...
def get_context_data(self, **kwargs: Any) -> dict[str, Any]: ...
def get_feed(self, obj: _Object, request: HttpRequest) -> SyndicationFeed: ...
def item_title(self, item: _Item) -> str: ...
def item_description(self, item: _Item) -> str: ...
def item_link(self, item: _Item) -> str: ...
def item_enclosures(self, item: _Item) -> list[Enclosure]: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/ 0000775 0000000 0000000 00000000000 15260643574 0022375 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/core/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0024645 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/core/asgi.pyi 0000664 0000000 0000000 00000000142 15260643574 0024040 0 ustar 00root root 0000000 0000000 from django.core.handlers.asgi import ASGIHandler
def get_asgi_application() -> ASGIHandler: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/cache/ 0000775 0000000 0000000 00000000000 15260643574 0023440 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/core/cache/__init__.pyi 0000664 0000000 0000000 00000002010 15260643574 0025713 0 ustar 00root root 0000000 0000000 from typing import Any
from django.utils.connection import BaseConnectionHandler
from typing_extensions import override
from .backends.base import BaseCache as BaseCache
from .backends.base import CacheKeyWarning as CacheKeyWarning
from .backends.base import InvalidCacheBackendError as InvalidCacheBackendError
from .backends.base import InvalidCacheKey as InvalidCacheKey
DEFAULT_CACHE_ALIAS: str
class CacheHandler(BaseConnectionHandler[BaseCache]):
settings_name: str
exception_class: type[Exception]
@override
def create_connection(self, alias: str) -> BaseCache: ...
@override
def all(self, initialized_only: bool = False) -> list[BaseCache]: ...
def close_caches(**kwargs: Any) -> None: ...
caches: CacheHandler
# Actually ConnectionProxy, but quacks exactly like BaseCache, it's not worth distinguishing the two.
cache: BaseCache
__all__ = [
"DEFAULT_CACHE_ALIAS",
"BaseCache",
"CacheKeyWarning",
"InvalidCacheBackendError",
"InvalidCacheKey",
"cache",
"caches",
]
typeddjango-django-stubs-fa03b48/django-stubs/core/cache/backends/ 0000775 0000000 0000000 00000000000 15260643574 0025212 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/core/cache/backends/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0027462 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/core/cache/backends/base.pyi 0000664 0000000 0000000 00000010206 15260643574 0026646 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterable, Iterator
from re import Pattern
from typing import Any
from django.core.exceptions import ImproperlyConfigured
class InvalidCacheBackendError(ImproperlyConfigured): ...
class CacheKeyWarning(RuntimeWarning): ...
class InvalidCacheKey(ValueError): ...
DEFAULT_TIMEOUT: Any
MEMCACHE_MAX_KEY_LENGTH: int
def default_key_func(key: Any, key_prefix: str, version: Any) -> str: ...
def get_key_func(key_func: Callable[..., Any] | str | None) -> Callable[..., Any]: ...
class BaseCache:
_missing_key: object
default_timeout: float | None
_max_entries: int
_cull_frequency: int
key_prefix: str
version: int
key_func: Callable[..., Any]
def __init__(self, params: dict[str, Any]) -> None: ...
def get_backend_timeout(self, timeout: float | None = ...) -> float | None: ...
def make_key(self, key: Any, version: int | None = None) -> str: ...
def validate_key(self, key: Any) -> None: ...
def make_and_validate_key(self, key: Any, version: int | None = None) -> str: ...
def add(self, key: Any, value: Any, timeout: float | None = ..., version: int | None = None) -> bool: ...
async def aadd(self, key: Any, value: Any, timeout: float | None = ..., version: int | None = None) -> bool: ...
def get(self, key: Any, default: Any | None = None, version: int | None = None) -> Any: ...
async def aget(self, key: Any, default: Any | None = None, version: int | None = None) -> Any: ...
def set(self, key: Any, value: Any, timeout: float | None = ..., version: int | None = None) -> None: ...
async def aset(self, key: Any, value: Any, timeout: float | None = ..., version: int | None = None) -> None: ...
def touch(self, key: Any, timeout: float | None = ..., version: int | None = None) -> bool: ...
async def atouch(self, key: Any, timeout: float | None = ..., version: int | None = None) -> bool: ...
def delete(self, key: Any, version: int | None = None) -> bool: ...
async def adelete(self, key: Any, version: int | None = None) -> bool: ...
def get_many(self, keys: Iterable[Any], version: int | None = None) -> dict[Any, Any]: ...
async def aget_many(self, keys: Iterable[Any], version: int | None = None) -> dict[Any, Any]: ...
def get_or_set(
self, key: Any, default: Any | None, timeout: float | None = ..., version: int | None = None
) -> Any | None: ...
async def aget_or_set(
self, key: Any, default: Any | None, timeout: float | None = ..., version: int | None = None
) -> Any | None: ...
def has_key(self, key: Any, version: int | None = None) -> bool: ...
async def ahas_key(self, key: Any, version: int | None = None) -> bool: ...
def incr(self, key: Any, delta: int = 1, version: int | None = None) -> int: ...
async def aincr(self, key: Any, delta: int = 1, version: int | None = None) -> int: ...
def decr(self, key: Any, delta: int = 1, version: int | None = None) -> int: ...
async def adecr(self, key: Any, delta: int = 1, version: int | None = None) -> int: ...
def __contains__(self, key: Any) -> bool: ...
def set_many(self, data: dict[Any, Any], timeout: float | None = ..., version: int | None = None) -> list[Any]: ...
async def aset_many(
self, data: dict[Any, Any], timeout: float | None = ..., version: int | None = None
) -> list[Any]: ...
def delete_many(self, keys: Iterable[Any], version: int | None = None) -> None: ...
async def adelete_many(self, keys: Iterable[Any], version: int | None = None) -> None: ...
def clear(self) -> None: ...
async def aclear(self) -> None: ...
def incr_version(self, key: Any, delta: int = 1, version: int | None = None) -> int: ...
async def aincr_version(self, key: Any, delta: int = 1, version: int | None = None) -> int: ...
def decr_version(self, key: Any, delta: int = 1, version: int | None = None) -> int: ...
async def adecr_version(self, key: Any, delta: int = 1, version: int | None = None) -> int: ...
def close(self, **kwargs: Any) -> None: ...
async def aclose(self, **kwargs: Any) -> None: ...
memcached_error_chars_re: Pattern[str]
def memcache_key_warnings(key: str) -> Iterator[str]: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/cache/backends/db.pyi 0000664 0000000 0000000 00000001172 15260643574 0026323 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar
from django.core.cache.backends.base import BaseCache
from django.utils.functional import _StrOrPromise
class Options:
db_table: str
app_label: str
model_name: str
verbose_name: _StrOrPromise
verbose_name_plural: _StrOrPromise
object_name: str
abstract: bool
managed: bool
proxy: bool
swapped: bool
def __init__(self, table: str) -> None: ...
class BaseDatabaseCache(BaseCache):
cache_model_class: Any
def __init__(self, table: str, params: dict[str, Any]) -> None: ...
class DatabaseCache(BaseDatabaseCache):
pickle_protocol: ClassVar[int]
typeddjango-django-stubs-fa03b48/django-stubs/core/cache/backends/dummy.pyi 0000664 0000000 0000000 00000000266 15260643574 0027074 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.cache.backends.base import BaseCache
class DummyCache(BaseCache):
def __init__(self, host: str, *args: Any, **kwargs: Any) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/cache/backends/filebased.pyi 0000664 0000000 0000000 00000000403 15260643574 0027650 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar
from django.core.cache.backends.base import BaseCache
class FileBasedCache(BaseCache):
cache_suffix: ClassVar[str]
pickle_protocol: ClassVar[int]
def __init__(self, dir: str, params: dict[str, Any]) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/cache/backends/locmem.pyi 0000664 0000000 0000000 00000000342 15260643574 0027210 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar
from django.core.cache.backends.base import BaseCache
class LocMemCache(BaseCache):
pickle_protocol: ClassVar[int]
def __init__(self, name: str, params: dict[str, Any]) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/cache/backends/memcached.pyi 0000664 0000000 0000000 00000001475 15260643574 0027652 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from types import ModuleType
from typing import Any
from django.core.cache.backends.base import BaseCache
from typing_extensions import override
class BaseMemcachedCache(BaseCache):
def __init__(
self,
server: str | Sequence[str],
params: dict[str, Any],
library: ModuleType,
value_not_found_exception: type[BaseException],
) -> None: ...
@property
def client_servers(self) -> Sequence[str]: ...
class PyLibMCCache(BaseMemcachedCache):
def __init__(self, server: str | Sequence[str], params: dict[str, Any]) -> None: ...
@property
@override
def client_servers(self) -> list[str]: ...
class PyMemcacheCache(BaseMemcachedCache):
def __init__(self, server: str | Sequence[str], params: dict[str, Any]) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/cache/backends/redis.pyi 0000664 0000000 0000000 00000004656 15260643574 0027056 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterable, Mapping
from datetime import timedelta
from typing import Any, Protocol, SupportsInt, TypeAlias, overload, type_check_only
from _typeshed import ReadableBuffer
from django.core.cache.backends.base import BaseCache
from django.utils.functional import cached_property
from redis._parsers import BaseParser
from redis.client import Redis
from redis.connection import ConnectionPool
@type_check_only
class _RedisCacheClientSerializer(Protocol):
def dumps(self, obj: Any) -> bytes: ...
@overload
def loads(self, data: SupportsInt) -> int: ...
@overload
def loads(self, data: ReadableBuffer) -> Any: ...
class RedisSerializer:
def __init__(self, protocol: int | None = None) -> None: ...
def dumps(self, obj: Any) -> bytes: ...
@overload
def loads(self, data: SupportsInt) -> int: ...
@overload
def loads(self, data: ReadableBuffer) -> Any: ...
# Taken from https://github.com/redis/redis-py/blob/6b8978/redis/typing.py
_Key: TypeAlias = str | bytes | memoryview
_Expiry: TypeAlias = int | timedelta
class RedisCacheClient:
def __init__(
self,
servers: list[str],
serializer: str | Callable[[], _RedisCacheClientSerializer] | _RedisCacheClientSerializer | None = None,
pool_class: str | type[ConnectionPool] | None = None,
parser_class: str | type[BaseParser] | None = None,
**options: Any,
) -> None: ...
def get_client(self, key: _Key | None = None, *, write: bool = False) -> Redis[Any]: ...
def add(self, key: _Key, value: Any, timeout: _Expiry | None) -> bool: ...
def get(self, key: _Key, default: Any) -> Any: ...
def set(self, key: _Key, value: Any, timeout: _Expiry | None) -> None: ...
def touch(self, key: _Key, timeout: _Expiry) -> bool: ...
def delete(self, key: _Key) -> bool: ...
def get_many(self, keys: Iterable[_Key]) -> dict[_Key, Any]: ...
def has_key(self, key: _Key) -> bool: ...
def incr(self, key: _Key, delta: int) -> Any: ...
def set_many(self, data: Mapping[_Key, Any], timeout: _Expiry) -> None: ...
def delete_many(self, keys: Iterable[_Key]) -> None: ...
def clear(self) -> bool: ...
class RedisCache(BaseCache):
def __init__(self, server: str | list[str], params: dict[str, Any]) -> None: ...
# We need this, because it is the only way to get the Redis connection from cache:
@cached_property
def _cache(self) -> RedisCacheClient: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/cache/utils.pyi 0000664 0000000 0000000 00000000307 15260643574 0025323 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable
from typing import Any
TEMPLATE_FRAGMENT_KEY_TEMPLATE: str
def make_template_fragment_key(fragment_name: str, vary_on: Iterable[Any] | None = None) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/checks/ 0000775 0000000 0000000 00000000000 15260643574 0023635 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/core/checks/__init__.pyi 0000664 0000000 0000000 00000001571 15260643574 0026123 0 ustar 00root root 0000000 0000000 from . import model_checks as model_checks
from .messages import CRITICAL as CRITICAL
from .messages import DEBUG as DEBUG
from .messages import ERROR as ERROR
from .messages import INFO as INFO
from .messages import WARNING as WARNING
from .messages import CheckMessage as CheckMessage
from .messages import Critical as Critical
from .messages import Debug as Debug
from .messages import Error as Error
from .messages import Info as Info
from .messages import Warning as Warning
from .registry import Tags as Tags
from .registry import register as register
from .registry import run_checks as run_checks
from .registry import tag_exists as tag_exists
__all__ = [
"CRITICAL",
"DEBUG",
"ERROR",
"INFO",
"WARNING",
"CheckMessage",
"Critical",
"Debug",
"Error",
"Info",
"Tags",
"Warning",
"register",
"run_checks",
"tag_exists",
]
typeddjango-django-stubs-fa03b48/django-stubs/core/checks/async_checks.pyi 0000664 0000000 0000000 00000000406 15260643574 0027015 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from django.apps.config import AppConfig
from django.core.checks.messages import CheckMessage, Error
E001: Error
def check_async_unsafe(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/checks/caches.pyi 0000664 0000000 0000000 00000001037 15260643574 0025607 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from django.apps.config import AppConfig
from django.core.checks.messages import CheckMessage, Error
E001: Error
def check_default_cache_is_configured(
app_configs: Sequence[AppConfig] | None, **kwargs: object
) -> list[CheckMessage]: ...
def check_cache_location_not_exposed(
app_configs: Sequence[AppConfig] | None, **kwargs: object
) -> list[CheckMessage]: ...
def check_file_based_cache_is_absolute(
app_configs: Sequence[AppConfig] | None, **kwargs: object
) -> list[CheckMessage]: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/checks/commands.pyi 0000664 0000000 0000000 00000000217 15260643574 0026161 0 ustar 00root root 0000000 0000000 from django.core.checks.messages import CheckMessage
def migrate_and_makemigrations_autodetector(**kwargs: object) -> list[CheckMessage]: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/checks/compatibility/ 0000775 0000000 0000000 00000000000 15260643574 0026506 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/core/checks/compatibility/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0030756 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/core/checks/compatibility/django_4_0.pyi 0000664 0000000 0000000 00000000372 15260643574 0031137 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from django.apps.config import AppConfig
from django.core.checks.messages import CheckMessage
def check_csrf_trusted_origins(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/checks/database.pyi 0000664 0000000 0000000 00000000304 15260643574 0026121 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable
from django.core.checks import CheckMessage
def check_database_backends(databases: Iterable[str] | None = None, **kwargs: object) -> list[CheckMessage]: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/checks/files.pyi 0000664 0000000 0000000 00000000410 15260643574 0025455 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from django.apps.config import AppConfig
from django.core.checks.messages import CheckMessage
def check_setting_file_upload_temp_dir(
app_configs: Sequence[AppConfig] | None, **kwargs: object
) -> list[CheckMessage]: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/checks/mail.pyi 0000664 0000000 0000000 00000000635 15260643574 0025306 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from django.apps.config import AppConfig
from django.core.checks import CheckMessage
def check_mailers_default_alias(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
NON_PRODUCTION_EMAIL_BACKENDS: set[str]
def check_mailers_production_backend(
app_configs: Sequence[AppConfig] | None, **kwargs: object
) -> list[CheckMessage]: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/checks/messages.pyi 0000664 0000000 0000000 00000002123 15260643574 0026165 0 ustar 00root root 0000000 0000000 from typing import Any
DEBUG: int
INFO: int
WARNING: int
ERROR: int
CRITICAL: int
class CheckMessage:
level: int
msg: str
hint: str | None
obj: Any
id: str | None
def __init__(
self, level: int, msg: str, hint: str | None = None, obj: Any | None = None, id: str | None = None
) -> None: ...
def is_serious(self, level: int = 40) -> bool: ...
def is_silenced(self) -> bool: ...
class Debug(CheckMessage):
def __init__(self, msg: str, hint: str | None = ..., obj: Any = ..., id: str | None = ...) -> None: ...
class Info(CheckMessage):
def __init__(self, msg: str, hint: str | None = ..., obj: Any = ..., id: str | None = ...) -> None: ...
class Warning(CheckMessage):
def __init__(self, msg: str, hint: str | None = ..., obj: Any = ..., id: str | None = ...) -> None: ...
class Error(CheckMessage):
def __init__(self, msg: str, hint: str | None = ..., obj: Any = ..., id: str | None = ...) -> None: ...
class Critical(CheckMessage):
def __init__(self, msg: str, hint: str | None = ..., obj: Any = ..., id: str | None = ...) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/checks/model_checks.pyi 0000664 0000000 0000000 00000000540 15260643574 0026777 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from django.apps.config import AppConfig
from django.core.checks.messages import CheckMessage
def check_all_models(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
def check_lazy_references(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/checks/registry.pyi 0000664 0000000 0000000 00000004031 15260643574 0026226 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterable, Sequence
from typing import Any, Protocol, overload, type_check_only
from django.apps.config import AppConfig
from django.core.checks.messages import CheckMessage
from typing_extensions import TypeVar
class Tags:
admin: str
async_support: str
caches: str
commands: str
compatibility: str
database: str
files: str
mail: str
models: str
security: str
signals: str
sites: str
staticfiles: str
templates: str
translation: str
urls: str
@type_check_only
class _CheckCallable(Protocol):
def __call__(
self,
*,
app_configs: Sequence[AppConfig] | None,
databases: Sequence[str] | None,
**kwargs: Any,
) -> Iterable[CheckMessage]: ...
_C = TypeVar("_C", bound=_CheckCallable)
@type_check_only
class _ProcessedCheckCallable(Protocol[_C]):
tags: Sequence[str]
__call__: _C
class CheckRegistry:
registered_checks: set[_ProcessedCheckCallable[_CheckCallable]]
deployment_checks: set[_ProcessedCheckCallable[_CheckCallable]]
def __init__(self) -> None: ...
@overload
def register(self, check: _C, *tags: str, **kwargs: Any) -> _ProcessedCheckCallable[_C]: ...
@overload
def register(
self, check: str | None = None, *tags: str, **kwargs: Any
) -> Callable[[_C], _ProcessedCheckCallable[_C]]: ...
def run_checks(
self,
app_configs: Sequence[AppConfig] | None = None,
tags: Sequence[str] | None = None,
include_deployment_checks: bool = False,
databases: Sequence[str] | None = None,
) -> list[CheckMessage]: ...
def tag_exists(self, tag: str, include_deployment_checks: bool = False) -> bool: ...
def tags_available(self, deployment_checks: bool = False) -> set[str]: ...
def get_checks(self, include_deployment_checks: bool = False) -> list[_ProcessedCheckCallable[_CheckCallable]]: ...
registry: CheckRegistry = ...
register = registry.register
run_checks = registry.run_checks
tag_exists = registry.tag_exists
typeddjango-django-stubs-fa03b48/django-stubs/core/checks/security/ 0000775 0000000 0000000 00000000000 15260643574 0025504 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/core/checks/security/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0027754 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/core/checks/security/base.pyi 0000664 0000000 0000000 00000004545 15260643574 0027151 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from django.apps.config import AppConfig
from django.core.checks.messages import CheckMessage, Error, Warning
CROSS_ORIGIN_OPENER_POLICY_VALUES: set[str]
REFERRER_POLICY_VALUES: set[str]
SECRET_KEY_INSECURE_PREFIX: str
SECRET_KEY_MIN_LENGTH: int
SECRET_KEY_MIN_UNIQUE_CHARACTERS: int
SECRET_KEY_WARNING_MSG: str
W001: Warning
W002: Warning
W004: Warning
W005: Warning
W006: Warning
W008: Warning
W009: Warning
W018: Warning
W019: Warning
W020: Warning
W021: Warning
W022: Warning
E023: Error
E024: Error
W025: Warning
E026: Error
W027: Warning
def check_security_middleware(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
def check_xframe_options_middleware(
app_configs: Sequence[AppConfig] | None, **kwargs: object
) -> list[CheckMessage]: ...
def check_sts(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
def check_sts_include_subdomains(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
def check_sts_preload(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
def check_content_type_nosniff(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
def check_ssl_redirect(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
def check_secret_key(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
def check_secret_key_fallbacks(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
def check_debug(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
def check_xframe_deny(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
def check_allowed_hosts(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
def check_referrer_policy(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
def check_cross_origin_opener_policy(
app_configs: Sequence[AppConfig] | None, **kwargs: object
) -> list[CheckMessage]: ...
def check_csp_settings(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
def check_csp_nonce_context_processor(
app_configs: Sequence[AppConfig] | None, **kwargs: object
) -> list[CheckMessage]: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/checks/security/csrf.pyi 0000664 0000000 0000000 00000001000 15260643574 0027153 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from django.apps.config import AppConfig
from django.core.checks.messages import CheckMessage, Warning
W003: Warning
W016: Warning
def check_csrf_middleware(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
def check_csrf_cookie_secure(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
def check_csrf_failure_view(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/checks/security/sessions.pyi 0000664 0000000 0000000 00000001100 15260643574 0030065 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from django.apps.config import AppConfig
from django.core.checks.messages import CheckMessage, Warning
def add_session_cookie_message(message: str) -> str: ...
W010: Warning
W011: Warning
W012: Warning
def add_httponly_message(message: str) -> str: ...
W013: Warning
W014: Warning
W015: Warning
def check_session_cookie_secure(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
def check_session_cookie_httponly(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/checks/templates.pyi 0000664 0000000 0000000 00000000357 15260643574 0026363 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from django.apps.config import AppConfig
from django.core.checks.messages import CheckMessage
def check_templates(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/checks/translation.pyi 0000664 0000000 0000000 00000001237 15260643574 0026721 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from django.apps.config import AppConfig
from django.core.checks.messages import CheckMessage, Error
E001: Error
E002: Error
E003: Error
E004: Error
def check_setting_language_code(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
def check_setting_languages(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
def check_setting_languages_bidi(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
def check_language_settings_consistent(
app_configs: Sequence[AppConfig] | None, **kwargs: object
) -> list[CheckMessage]: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/checks/urls.pyi 0000664 0000000 0000000 00000001467 15260643574 0025355 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from typing import Any
from django.apps.config import AppConfig
from django.core.checks.messages import CheckMessage, Error
from django.urls import _AnyURL
def check_url_config(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
def check_resolver(resolver: _AnyURL) -> list[CheckMessage]: ...
def check_url_namespaces_unique(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
def get_warning_for_invalid_pattern(pattern: Any) -> list[CheckMessage]: ...
def check_url_settings(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
def E006(name: str) -> Error: ...
def check_custom_error_handlers(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/exceptions.pyi 0000664 0000000 0000000 00000004001 15260643574 0025274 0 ustar 00root root 0000000 0000000 from collections.abc import Iterator
from typing import Any, Literal
from django.utils.functional import _StrOrPromise
class FieldDoesNotExist(Exception): ...
class AppRegistryNotReady(Exception): ...
class ObjectDoesNotExist(Exception):
silent_variable_failure: bool
class ObjectNotUpdated(Exception): ...
class MultipleObjectsReturned(Exception): ...
class SuspiciousOperation(Exception): ...
class SuspiciousMultipartForm(SuspiciousOperation): ...
class SuspiciousFileOperation(SuspiciousOperation): ...
class DisallowedHost(SuspiciousOperation): ...
class DisallowedRedirect(SuspiciousOperation): ...
class TooManyFieldsSent(SuspiciousOperation): ...
class TooManyFilesSent(SuspiciousOperation): ...
class RequestDataTooBig(SuspiciousOperation): ...
class RequestAborted(Exception): ...
class BadRequest(Exception): ...
class PermissionDenied(Exception): ...
class ViewDoesNotExist(Exception): ...
class MiddlewareNotUsed(Exception): ...
class ImproperlyConfigured(Exception): ...
class FieldError(Exception): ...
class FieldFetchBlocked(Exception): ...
NON_FIELD_ERRORS: Literal["__all__"]
class ValidationError(Exception):
error_dict: dict[str, list[ValidationError]]
error_list: list[ValidationError]
message: _StrOrPromise
code: str | None
params: dict[str, Any] | None
def __init__(
self,
# Accepts arbitrarily nested data structure, mypy doesn't allow describing it accurately.
message: _StrOrPromise | ValidationError | dict[str, Any] | list[Any],
code: str | None = None,
params: dict[str, Any] | None = None,
) -> None: ...
@property
def message_dict(self) -> dict[str, list[str]]: ...
@property
def messages(self) -> list[str]: ...
def update_error_dict(self, error_dict: dict[str, list[ValidationError]]) -> dict[str, list[ValidationError]]: ...
def __iter__(self) -> Iterator[tuple[str, list[str]] | str]: ...
class EmptyResultSet(Exception): ...
class FullResultSet(Exception): ...
class SynchronousOnlyOperation(Exception): ...
typeddjango-django-stubs-fa03b48/django-stubs/core/files/ 0000775 0000000 0000000 00000000000 15260643574 0023477 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/core/files/__init__.pyi 0000664 0000000 0000000 00000000104 15260643574 0025754 0 ustar 00root root 0000000 0000000 from django.core.files.base import File as File
__all__ = ["File"]
typeddjango-django-stubs-fa03b48/django-stubs/core/files/base.pyi 0000664 0000000 0000000 00000003766 15260643574 0025150 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterator
from types import TracebackType
from typing import IO, AnyStr, Self, type_check_only
from django.core.files.utils import FileProxyMixin
from django.utils.functional import cached_property
from typing_extensions import override
class File(FileProxyMixin[AnyStr], IO[AnyStr]):
DEFAULT_CHUNK_SIZE: int
file: IO[AnyStr] | None
name: str | None
mode: str
def __init__(self, file: IO[AnyStr] | None, name: str | None = None) -> None: ...
def __bool__(self) -> bool: ...
def __len__(self) -> int: ...
@cached_property
def size(self) -> int: ...
def chunks(self, chunk_size: int | None = None) -> Iterator[AnyStr]: ...
def multiple_chunks(self, chunk_size: int | None = None) -> bool | None: ...
@override
def __iter__(self) -> Iterator[AnyStr]: ...
@override
def __enter__(self) -> Self: ...
@override
def __exit__(
self,
exc_type: type[BaseException] | None,
exc_value: BaseException | None,
exc_tb: TracebackType | None,
) -> None: ...
def open(
self,
mode: str | None = None,
buffering: int = -1,
encoding: str | None = None,
errors: str | None = None,
newline: str | None = None,
closefd: bool = True,
opener: Callable[[str, int], int] | None = None,
) -> Self: ...
@override
def close(self) -> None: ...
@type_check_only
@override
def __next__(self) -> AnyStr: ...
class ContentFile(File[AnyStr]):
file: IO[AnyStr]
def __init__(self, content: AnyStr, name: str | None = None) -> None: ...
@override
def __bool__(self) -> bool: ...
@override
def open(self, mode: str | None = None) -> Self: ... # type: ignore[override]
@override
def close(self) -> None: ...
@override
def write(self, data: AnyStr) -> int: ...
def endswith_cr(line: bytes | str) -> bool: ...
def endswith_lf(line: bytes | str) -> bool: ...
def equals_lf(line: bytes | str) -> bool: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/files/images.pyi 0000664 0000000 0000000 00000000514 15260643574 0025467 0 ustar 00root root 0000000 0000000 from typing import IO
from _typeshed import StrPath
from django.core.files import File
class ImageFile(File[bytes]):
@property
def width(self) -> int: ...
@property
def height(self) -> int: ...
def get_image_dimensions(file_or_path: StrPath | IO[bytes], close: bool = False) -> tuple[int | None, int | None]: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/files/locks.pyi 0000664 0000000 0000000 00000000642 15260643574 0025337 0 ustar 00root root 0000000 0000000 import sys
from ctypes import Structure, Union
from typing import Any
LOCK_SH: int
LOCK_NB: int
LOCK_EX: int
if sys.platform == "win32":
ULONG_PTR: Any
PVOID: Any
class _OFFSET(Structure): ...
class _OFFSET_UNION(Union): ...
class OVERLAPPED(Structure): ...
def lock(f: Any, flags: int) -> bool: ...
def unlock(f: Any) -> bool: ...
__all__ = ("LOCK_EX", "LOCK_NB", "LOCK_SH", "lock", "unlock")
typeddjango-django-stubs-fa03b48/django-stubs/core/files/move.pyi 0000664 0000000 0000000 00000000244 15260643574 0025170 0 ustar 00root root 0000000 0000000 def file_move_safe(
old_file_name: str, new_file_name: str, chunk_size: int = 65536, allow_overwrite: bool = False
) -> None: ...
__all__ = ["file_move_safe"]
typeddjango-django-stubs-fa03b48/django-stubs/core/files/storage/ 0000775 0000000 0000000 00000000000 15260643574 0025143 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/core/files/storage/__init__.pyi 0000664 0000000 0000000 00000001121 15260643574 0027420 0 ustar 00root root 0000000 0000000 from django.utils.functional import LazyObject
from .base import Storage
from .filesystem import FileSystemStorage
from .handler import InvalidStorageError, StorageHandler
from .memory import InMemoryStorage
__all__ = (
"DefaultStorage",
"FileSystemStorage",
"InMemoryStorage",
"InvalidStorageError",
"Storage",
"StorageHandler",
"default_storage",
"storages",
)
class DefaultStorage(LazyObject[Storage]): ...
storages: StorageHandler
# default_storage is actually an instance of DefaultStorage, but it proxies through to a Storage
default_storage: Storage
typeddjango-django-stubs-fa03b48/django-stubs/core/files/storage/base.pyi 0000664 0000000 0000000 00000002171 15260643574 0026601 0 ustar 00root root 0000000 0000000 from datetime import datetime
from typing import IO, Any
from _typeshed import StrPath
from django.core.files.base import File
class Storage:
def open(self, name: str, mode: str = "rb") -> File[Any]: ...
def save(self, name: str | None, content: IO[Any], max_length: int | None = None) -> str: ...
def is_name_available(self, name: str, max_length: int | None = None) -> bool: ...
def get_valid_name(self, name: str) -> str: ...
def get_alternative_name(self, file_root: str, file_ext: str) -> str: ...
def get_available_name(self, name: str, max_length: int | None = None) -> str: ...
def generate_filename(self, filename: StrPath) -> str: ...
def path(self, name: str) -> str: ...
def delete(self, name: str) -> None: ...
def exists(self, name: str) -> bool: ...
def listdir(self, path: str) -> tuple[list[str], list[str]]: ...
def size(self, name: str) -> int: ...
def url(self, name: str | None) -> str: ...
def get_accessed_time(self, name: str) -> datetime: ...
def get_created_time(self, name: str) -> datetime: ...
def get_modified_time(self, name: str) -> datetime: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/files/storage/filesystem.pyi 0000664 0000000 0000000 00000001572 15260643574 0030057 0 ustar 00root root 0000000 0000000 from _typeshed import StrPath
from django.utils.deconstruct import _Deconstructible
from django.utils.functional import cached_property
from .base import Storage
from .mixins import StorageSettingsMixin
class FileSystemStorage(_Deconstructible, Storage, StorageSettingsMixin):
def __init__(
self,
location: StrPath | None = None,
base_url: str | None = None,
file_permissions_mode: int | None = None,
directory_permissions_mode: int | None = None,
allow_overwrite: bool = False,
) -> None: ...
@cached_property
def base_location(self) -> StrPath: ...
@cached_property
def location(self) -> StrPath: ...
@cached_property
def base_url(self) -> str: ...
@cached_property
def file_permissions_mode(self) -> int | None: ...
@cached_property
def directory_permissions_mode(self) -> int | None: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/files/storage/handler.pyi 0000664 0000000 0000000 00000000776 15260643574 0027315 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.exceptions import ImproperlyConfigured
from django.utils.functional import cached_property
from .base import Storage
class InvalidStorageError(ImproperlyConfigured): ...
class StorageHandler:
def __init__(self, backends: dict[str, Storage] | None = None) -> None: ...
@cached_property
def backends(self) -> dict[str, Storage]: ...
def __getitem__(self, alias: str) -> Storage: ...
def create_storage(self, params: dict[str, Any]) -> Storage: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/files/storage/memory.pyi 0000664 0000000 0000000 00000001561 15260643574 0027201 0 ustar 00root root 0000000 0000000 from _typeshed import StrPath
from django.utils.deconstruct import _Deconstructible
from django.utils.functional import cached_property
from .base import Storage
from .mixins import StorageSettingsMixin
class InMemoryStorage(_Deconstructible, Storage, StorageSettingsMixin):
def __init__(
self,
location: StrPath | None = None,
base_url: str | None = None,
file_permissions_mode: int | None = None,
directory_permissions_mode: int | None = None,
) -> None: ...
@cached_property
def base_location(self) -> StrPath: ...
@cached_property
def location(self) -> StrPath: ...
@cached_property
def base_url(self) -> str: ...
@cached_property
def file_permissions_mode(self) -> int | None: ...
@cached_property
def directory_permissions_mode(self) -> int | None: ...
__all__ = ("InMemoryStorage",)
typeddjango-django-stubs-fa03b48/django-stubs/core/files/storage/mixins.pyi 0000664 0000000 0000000 00000000522 15260643574 0027174 0 ustar 00root root 0000000 0000000 from typing import Any, Literal
class StorageSettingsMixin:
def _clear_cached_properties(
self,
setting: Literal["MEDIA_ROOT", "MEDIA_URL", "FILE_UPLOAD_PERMISSIONS", "FILE_UPLOAD_DIRECTORY_PERMISSIONS"],
**kwargs: Any,
) -> None: ...
def _value_or_setting(self, value: Any, setting: Any) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/files/temp.pyi 0000664 0000000 0000000 00000000224 15260643574 0025165 0 ustar 00root root 0000000 0000000 import tempfile
NamedTemporaryFile = tempfile.NamedTemporaryFile
gettempdir = tempfile.gettempdir
__all__ = ("NamedTemporaryFile", "gettempdir")
typeddjango-django-stubs-fa03b48/django-stubs/core/files/uploadedfile.pyi 0000664 0000000 0000000 00000003707 15260643574 0026666 0 ustar 00root root 0000000 0000000 from typing import IO, Any, Self
from django.core.files.base import File
from django.utils.functional import cached_property
from typing_extensions import TypeVar, override
# `typing.AnyStr` is deprecated from 3.16+, so we define our own equivalent constrained TypeVar.
_AnyStr = TypeVar("_AnyStr", str, bytes)
class UploadedFile(File[_AnyStr]):
content_type: str | None
charset: str | None
content_type_extra: dict[str, bytes] | None
@override
@cached_property
def size(self) -> int | None: ... # type: ignore[override]
name: str | None
def __init__(
self,
file: IO[_AnyStr] | None = None,
name: str | None = None,
content_type: str | None = None,
size: int | None = None,
charset: str | None = None,
content_type_extra: dict[str, bytes] | None = None,
) -> None: ...
class TemporaryUploadedFile(UploadedFile[Any]):
def __init__(
self,
name: str,
content_type: str | None,
size: int | None,
charset: str | None,
content_type_extra: dict[str, bytes] | None = None,
) -> None: ...
def temporary_file_path(self) -> str: ...
class InMemoryUploadedFile(UploadedFile[Any]):
field_name: str | None
def __init__(
self,
file: IO[Any],
field_name: str | None,
name: str | None,
content_type: str | None,
size: int | None,
charset: str | None,
content_type_extra: dict[str, bytes] | None = None,
) -> None: ...
@override
def open(self, mode: str | None = None) -> Self: ... # type: ignore[override]
class SimpleUploadedFile(InMemoryUploadedFile):
def __init__(self, name: str, content: bytes | None, content_type: str = "text/plain") -> None: ...
@classmethod
def from_dict(cls, file_dict: dict[str, str | bytes]) -> Self: ...
__all__ = (
"InMemoryUploadedFile",
"SimpleUploadedFile",
"TemporaryUploadedFile",
"UploadedFile",
)
typeddjango-django-stubs-fa03b48/django-stubs/core/files/uploadhandler.pyi 0000664 0000000 0000000 00000006442 15260643574 0027052 0 ustar 00root root 0000000 0000000 from typing import IO, Any
from django.core.files.uploadedfile import TemporaryUploadedFile, UploadedFile
from django.http.request import HttpRequest, QueryDict
from django.utils.datastructures import MultiValueDict
from typing_extensions import override
class UploadFileException(Exception): ...
class StopUpload(UploadFileException):
connection_reset: bool
def __init__(self, connection_reset: bool = False) -> None: ...
class SkipFile(UploadFileException): ...
class StopFutureHandlers(UploadFileException): ...
class FileUploadHandler:
chunk_size: int
file_name: str | None
content_type: str | None
content_length: int | None
charset: str | None
content_type_extra: dict[str, bytes] | None
request: HttpRequest | None
field_name: str
def __init__(self, request: HttpRequest | None = None) -> None: ...
def handle_raw_input(
self,
input_data: IO[bytes],
META: dict[str, str],
content_length: int,
boundary: str,
encoding: str | None = None,
) -> tuple[QueryDict, MultiValueDict[str, UploadedFile[Any]]] | None: ...
def new_file(
self,
field_name: str,
file_name: str,
content_type: str,
content_length: int | None,
charset: str | None = None,
content_type_extra: dict[str, bytes] | None = None,
) -> None: ...
def receive_data_chunk(self, raw_data: bytes, start: int) -> bytes | None: ...
def file_complete(self, file_size: int) -> UploadedFile[Any] | None: ...
def upload_complete(self) -> None: ...
def upload_interrupted(self) -> None: ...
class TemporaryFileUploadHandler(FileUploadHandler):
file: TemporaryUploadedFile
@override
def new_file(
self,
field_name: str,
file_name: str,
content_type: str,
content_length: int | None,
charset: str | None = ...,
content_type_extra: dict[str, bytes] | None = ...,
) -> None: ...
@override
def receive_data_chunk(self, raw_data: bytes, start: int) -> bytes | None: ...
@override
def file_complete(self, file_size: int) -> UploadedFile[Any] | None: ...
@override
def upload_interrupted(self) -> None: ...
class MemoryFileUploadHandler(FileUploadHandler):
activated: bool
file: IO[bytes]
@override
def handle_raw_input(
self,
input_data: IO[bytes],
META: dict[str, str],
content_length: int,
boundary: str,
encoding: str | None = None,
) -> tuple[QueryDict, MultiValueDict[str, UploadedFile[Any]]] | None: ...
@override
def new_file(
self,
field_name: str,
file_name: str,
content_type: str,
content_length: int | None,
charset: str | None = ...,
content_type_extra: dict[str, bytes] | None = ...,
) -> None: ...
@override
def receive_data_chunk(self, raw_data: bytes, start: int) -> bytes | None: ...
@override
def file_complete(self, file_size: int) -> UploadedFile[Any] | None: ...
def load_handler(path: str, *args: Any, **kwargs: Any) -> FileUploadHandler: ...
__all__ = [
"FileUploadHandler",
"MemoryFileUploadHandler",
"SkipFile",
"StopFutureHandlers",
"StopUpload",
"TemporaryFileUploadHandler",
"UploadFileException",
"load_handler",
]
typeddjango-django-stubs-fa03b48/django-stubs/core/files/utils.pyi 0000664 0000000 0000000 00000002165 15260643574 0025366 0 ustar 00root root 0000000 0000000 from collections.abc import Iterator
from typing import IO, Any, AnyStr, Generic
from _typeshed import StrPath
def validate_file_name(name: StrPath, allow_relative_path: bool = False) -> StrPath: ...
class FileProxyMixin(Generic[AnyStr]):
file: IO[AnyStr] | None
@property
def encoding(self) -> Any: ...
@property
def fileno(self) -> Any: ...
@property
def flush(self) -> Any: ...
@property
def isatty(self) -> Any: ...
@property
def newlines(self) -> Any: ...
@property
def read(self) -> Any: ...
@property
def readinto(self) -> Any: ...
@property
def readline(self) -> Any: ...
@property
def readlines(self) -> Any: ...
@property
def seek(self) -> Any: ...
@property
def tell(self) -> Any: ...
@property
def truncate(self) -> Any: ...
@property
def write(self) -> Any: ...
@property
def writelines(self) -> Any: ...
@property
def closed(self) -> bool: ...
def readable(self) -> bool: ...
def writable(self) -> bool: ...
def seekable(self) -> bool: ...
def __iter__(self) -> Iterator[AnyStr]: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/handlers/ 0000775 0000000 0000000 00000000000 15260643574 0024175 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/core/handlers/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0026445 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/core/handlers/asgi.pyi 0000664 0000000 0000000 00000005210 15260643574 0025641 0 ustar 00root root 0000000 0000000 from collections.abc import Awaitable, Callable, Iterator, Mapping, Sequence
from logging import Logger
from typing import IO, Any, TypeAlias
from _typeshed import ExcInfo
from django.core.files import uploadedfile
from django.core.handlers import base
from django.http.request import HttpRequest, _ImmutableQueryDict
from django.http.response import HttpResponseBase
from django.urls.resolvers import ResolverMatch, URLResolver
from django.utils.datastructures import MultiValueDict
from django.utils.functional import cached_property
from typing_extensions import TypeVar, override
_ReceiveCallback: TypeAlias = Callable[[], Awaitable[Mapping[str, Any]]]
_SendCallback: TypeAlias = Callable[[Mapping[str, Any]], Awaitable[None]]
logger: Logger
def get_script_prefix(scope: Mapping[str, Any]) -> str: ...
class ASGIRequest(HttpRequest):
body_receive_timeout: int
scope: Mapping[str, Any]
resolver_match: ResolverMatch | None
script_name: str | None
path_info: str
path: str
method: str
META: dict[str, Any]
def __init__(self, scope: Mapping[str, Any], body_file: IO[bytes]) -> None: ...
@cached_property
@override
def GET(self) -> _ImmutableQueryDict: ... # type: ignore[override]
POST: _ImmutableQueryDict
@property
@override
def FILES(self) -> MultiValueDict[str, uploadedfile.UploadedFile[Any]]: ... # type: ignore[override]
@cached_property
@override
def COOKIES(self) -> dict[str, str]: ... # type: ignore[override]
_T = TypeVar("_T")
class ASGIHandler(base.BaseHandler):
request_class: type[ASGIRequest]
chunk_size: int
def __init__(self) -> None: ...
async def __call__(
self,
scope: dict[str, Any],
receive: _ReceiveCallback,
send: _SendCallback,
) -> None: ...
async def handle(
self, scope: dict[str, Any], receive: _ReceiveCallback, send: _SendCallback
) -> HttpResponseBase | None: ...
async def listen_for_disconnect(self, receive: _ReceiveCallback) -> None: ...
async def run_get_response(self, request: HttpRequest) -> HttpResponseBase: ...
async def read_body(self, receive: _ReceiveCallback) -> IO[bytes]: ...
def create_request(
self, scope: Mapping[str, Any], body_file: IO[bytes]
) -> tuple[ASGIRequest, None] | tuple[None, HttpResponseBase]: ...
def handle_uncaught_exception(
self, request: HttpRequest, resolver: URLResolver, exc_info: ExcInfo
) -> HttpResponseBase: ...
async def send_response(self, response: HttpResponseBase, send: _SendCallback) -> None: ...
@classmethod
def chunk_bytes(cls, data: Sequence[_T]) -> Iterator[tuple[Sequence[_T], bool]]: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/handlers/base.pyi 0000664 0000000 0000000 00000002511 15260643574 0025631 0 ustar 00root root 0000000 0000000 from collections.abc import Awaitable, Callable
from logging import Logger
from typing import Any
import _typeshed
from django.http.request import HttpRequest
from django.http.response import HttpResponse, HttpResponseBase
from django.urls.resolvers import ResolverMatch
logger: Logger
class BaseHandler:
def load_middleware(self, is_async: bool = ...) -> None: ...
def adapt_method_mode(
self,
is_async: bool,
method: Callable[[HttpRequest], HttpResponseBase | Awaitable[HttpResponseBase]],
method_is_async: bool | None = ...,
debug: bool = ...,
name: str | None = ...,
) -> Callable[[HttpRequest], HttpResponseBase | Awaitable[HttpResponseBase]]: ...
def get_response(self, request: HttpRequest) -> HttpResponseBase: ...
async def get_response_async(self, request: HttpRequest) -> HttpResponseBase: ...
def resolve_request(self, request: HttpRequest) -> ResolverMatch: ...
def check_response(self, response: HttpResponseBase, callback: Any, name: str | None = ...) -> None: ...
def make_view_atomic(self, view: Callable[..., HttpResponseBase]) -> Callable[..., HttpResponseBase]: ...
def process_exception_by_middleware(self, exception: Exception, request: HttpRequest) -> HttpResponse: ...
def reset_urlconf(sender: _typeshed.Unused, **kwargs: Any) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/handlers/exception.pyi 0000664 0000000 0000000 00000001416 15260643574 0026720 0 ustar 00root root 0000000 0000000 from collections.abc import Awaitable, Callable
from _typeshed import ExcInfo
from django.http.request import HttpRequest
from django.http.response import HttpResponse, HttpResponseBase
from django.urls.resolvers import URLResolver
def convert_exception_to_response(
get_response: Callable[[HttpRequest], HttpResponseBase | Awaitable[HttpResponseBase]],
) -> Callable[[HttpRequest], HttpResponseBase | Awaitable[HttpResponseBase]]: ...
def response_for_exception(request: HttpRequest, exc: Exception) -> HttpResponse: ...
def get_exception_response(
request: HttpRequest, resolver: URLResolver, status_code: int, exception: Exception
) -> HttpResponse: ...
def handle_uncaught_exception(request: HttpRequest, resolver: URLResolver, exc_info: ExcInfo) -> HttpResponse: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/handlers/wsgi.pyi 0000664 0000000 0000000 00000003351 15260643574 0025673 0 ustar 00root root 0000000 0000000 from io import BytesIO, IOBase
from typing import Any
from wsgiref.types import StartResponse, WSGIEnvironment
from django.core.files import uploadedfile
from django.core.handlers import base
from django.http import HttpRequest
from django.http.request import _ImmutableQueryDict
from django.http.response import HttpResponseBase
from django.utils.datastructures import MultiValueDict
from django.utils.functional import cached_property
from typing_extensions import override
class LimitedStream(IOBase):
limit: int
def __init__(self, stream: BytesIO, limit: int) -> None: ...
@override
def read(self, size: int | None = -1, /) -> bytes: ...
@override
def readline(self, size: int | None = -1, /) -> bytes: ...
class WSGIRequest(HttpRequest):
environ: WSGIEnvironment
def __init__(self, environ: WSGIEnvironment) -> None: ...
@cached_property
@override
def GET(self) -> _ImmutableQueryDict: ... # type: ignore[override]
@cached_property
@override
def COOKIES(self) -> dict[str, str]: ... # type: ignore[override]
@property
@override
def FILES(self) -> MultiValueDict[str, uploadedfile.UploadedFile[Any]]: ... # type: ignore[override]
class WSGIHandler(base.BaseHandler):
request_class: type[WSGIRequest]
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
def __call__(
self,
environ: WSGIEnvironment,
start_response: StartResponse,
) -> HttpResponseBase: ...
def get_path_info(environ: WSGIEnvironment) -> str: ...
def get_script_name(environ: WSGIEnvironment) -> str: ...
def get_bytes_from_wsgi(environ: WSGIEnvironment, key: str, default: str) -> bytes: ...
def get_str_from_wsgi(environ: WSGIEnvironment, key: str, default: str) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/mail/ 0000775 0000000 0000000 00000000000 15260643574 0023317 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/core/mail/__init__.pyi 0000664 0000000 0000000 00000005414 15260643574 0025605 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable, Sequence
from typing import Any
from django.utils.functional import _StrOrPromise
from .backends.base import BaseEmailBackend
from .exceptions import InvalidMailer as InvalidMailer
from .exceptions import MailerDoesNotExist as MailerDoesNotExist
from .handler import MailersHandler
from .message import DEFAULT_ATTACHMENT_MIME_TYPE as DEFAULT_ATTACHMENT_MIME_TYPE
from .message import BadHeaderError as BadHeaderError
from .message import EmailAlternative as EmailAlternative
from .message import EmailAttachment as EmailAttachment
from .message import EmailMessage as EmailMessage
from .message import EmailMultiAlternatives as EmailMultiAlternatives
from .message import SafeMIMEMultipart as SafeMIMEMultipart
from .message import SafeMIMEText as SafeMIMEText
from .message import forbid_multi_line_headers as forbid_multi_line_headers
from .message import make_msgid as make_msgid
from .utils import DNS_NAME as DNS_NAME
from .utils import CachedDnsName as CachedDnsName
mailers: MailersHandler
def get_connection(backend: str | None = None, *, fail_silently: bool = False, **kwds: Any) -> BaseEmailBackend: ...
def send_mail(
subject: _StrOrPromise,
message: _StrOrPromise,
from_email: str | None,
recipient_list: Sequence[str],
*,
fail_silently: bool = False,
auth_user: str | None = None,
auth_password: str | None = None,
connection: BaseEmailBackend | None = None,
html_message: str | None = None,
using: str | None = None,
) -> int: ...
def send_mass_mail(
datatuple: Iterable[tuple[str, str, str | None, list[str]]],
*,
fail_silently: bool = False,
auth_user: str | None = None,
auth_password: str | None = None,
connection: BaseEmailBackend | None = None,
using: str | None = None,
) -> int: ...
def mail_admins(
subject: _StrOrPromise,
message: _StrOrPromise,
*,
fail_silently: bool = False,
connection: BaseEmailBackend | None = None,
html_message: str | None = None,
using: str | None = None,
) -> None: ...
def mail_managers(
subject: _StrOrPromise,
message: _StrOrPromise,
*,
fail_silently: bool = False,
connection: BaseEmailBackend | None = None,
html_message: str | None = None,
using: str | None = None,
) -> None: ...
outbox: list[EmailMessage | EmailMultiAlternatives]
__all__ = [
"DEFAULT_ATTACHMENT_MIME_TYPE",
"DNS_NAME",
"BadHeaderError",
"CachedDnsName",
"EmailAlternative",
"EmailAttachment",
"EmailMessage",
"EmailMultiAlternatives",
"InvalidMailer",
"MailerDoesNotExist",
"SafeMIMEMultipart",
"SafeMIMEText",
"forbid_multi_line_headers",
"get_connection",
"mail_admins",
"mail_managers",
"mailers",
"make_msgid",
"send_mail",
"send_mass_mail",
]
typeddjango-django-stubs-fa03b48/django-stubs/core/mail/backends/ 0000775 0000000 0000000 00000000000 15260643574 0025071 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/core/mail/backends/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0027341 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/core/mail/backends/base.pyi 0000664 0000000 0000000 00000001416 15260643574 0026530 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from types import TracebackType
from typing import Any, Self
from django.core.mail.message import EmailMessage
class BaseEmailBackend:
fail_silently: bool
def __init__(
self,
fail_silently: bool | object = ...,
*,
alias: str | None = None,
_ignore_unknown_kwargs: set[str] | None = None,
**kwargs: Any,
) -> None: ...
def open(self) -> bool | None: ...
def close(self) -> None: ...
def __enter__(self) -> Self: ...
def __exit__(
self,
exc_type: type[BaseException] | None,
exc_value: BaseException | None,
exc_tb: TracebackType | None,
) -> None: ...
def send_messages(self, email_messages: Sequence[EmailMessage]) -> int: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/mail/backends/console.pyi 0000664 0000000 0000000 00000000457 15260643574 0027264 0 ustar 00root root 0000000 0000000 import threading
from typing import TextIO
from django.core.mail.backends.base import BaseEmailBackend
from django.core.mail.message import EmailMessage
class EmailBackend(BaseEmailBackend):
stream: TextIO
_lock: threading.RLock
def write_message(self, message: EmailMessage) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/mail/backends/dummy.pyi 0000664 0000000 0000000 00000000147 15260643574 0026751 0 ustar 00root root 0000000 0000000 from django.core.mail.backends.base import BaseEmailBackend
class EmailBackend(BaseEmailBackend): ...
typeddjango-django-stubs-fa03b48/django-stubs/core/mail/backends/filebased.pyi 0000664 0000000 0000000 00000000425 15260643574 0027533 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.mail.backends.console import EmailBackend as ConsoleEmailBackend
class EmailBackend(ConsoleEmailBackend):
file_path: str
def __init__(self, fail_silently: bool = False, file_path: str | None = None, **kwargs: Any) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/mail/backends/locmem.pyi 0000664 0000000 0000000 00000000472 15260643574 0027073 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from django.core.mail.backends.base import BaseEmailBackend
from django.core.mail.message import EmailMessage
from typing_extensions import override
class EmailBackend(BaseEmailBackend):
@override
def send_messages(self, messages: Sequence[EmailMessage]) -> int: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/mail/backends/smtp.pyi 0000664 0000000 0000000 00000002340 15260643574 0026576 0 ustar 00root root 0000000 0000000 import smtplib
import ssl
import threading
from typing import Any
from _typeshed import StrOrBytesPath
from django.core.mail.backends.base import BaseEmailBackend
from django.utils.functional import cached_property
class EmailBackend(BaseEmailBackend):
host: str
port: int
username: str
password: str
use_tls: bool
use_ssl: bool
timeout: float | None
ssl_keyfile: StrOrBytesPath | None
ssl_certfile: StrOrBytesPath | None
connection: smtplib.SMTP_SSL | smtplib.SMTP | None
_lock: threading.RLock
def __init__(
self,
host: str | None = None,
port: int | None = None,
username: str | None = None,
password: str | None = None,
use_tls: bool | None = None,
fail_silently: bool = False,
use_ssl: bool | None = None,
timeout: float | None = None,
ssl_keyfile: StrOrBytesPath | None = None,
ssl_certfile: StrOrBytesPath | None = None,
**kwargs: Any,
) -> None: ...
@property
def connection_class(self) -> type[smtplib.SMTP_SSL | smtplib.SMTP]: ...
@cached_property
def ssl_context(self) -> ssl.SSLContext: ...
def prep_address(self, address: str, force_ascii: bool = True) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/mail/deprecation.pyi 0000664 0000000 0000000 00000000740 15260643574 0026340 0 ustar 00root root 0000000 0000000 # RemovedInDjango70Warning: this entire file.
from django.core.mail.backends.base import BaseEmailBackend
FAIL_SILENTLY_ARG_WARNING: str
AUTH_ARGS_WARNING: str
CONNECTION_ARG_WARNING: str
NO_DEFAULT_MAILER_WARNING: str
def report_using_incompatibility(
connection: BaseEmailBackend | None = None,
fail_silently: bool = False,
auth_user: str | None = None,
auth_password: str | None = None,
) -> None: ...
def warn_about_default_mailers_if_needed() -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/mail/exceptions.pyi 0000664 0000000 0000000 00000000426 15260643574 0026225 0 ustar 00root root 0000000 0000000 from django.core.exceptions import ImproperlyConfigured
class InvalidMailer(ImproperlyConfigured):
def __init__(self, msg: str, *, alias: str | None = None) -> None: ...
class MailerDoesNotExist(InvalidMailer, KeyError):
def __init__(self, *, alias: str) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/mail/handler.pyi 0000664 0000000 0000000 00000001543 15260643574 0025462 0 ustar 00root root 0000000 0000000 from collections.abc import Iterator, Mapping
from typing import Any, Literal, TypeAlias
from django.core.mail.backends.base import BaseEmailBackend
DEFAULT_MAILER_ALIAS: Literal["default"]
DEFAULT_MAILER_BACKEND: Literal["django.core.mail.backends.smtp.EmailBackend"]
_MailerSetting: TypeAlias = Mapping[str, Any]
class MailersHandler:
def __getitem__(self, /, alias: str) -> BaseEmailBackend: ...
def __contains__(self, /, alias: str) -> bool: ...
def __iter__(self) -> Iterator[_MailerSetting]: ...
def get(self, alias: str, /, default: Any | None = None) -> BaseEmailBackend: ...
@property
def default(self) -> BaseEmailBackend: ...
@property
def settings(self) -> _MailerSetting: ...
def create_connection(
self, alias: str, /, *, _deprecated_kwargs: Mapping[str, Any] | None = None
) -> BaseEmailBackend: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/mail/message.pyi 0000664 0000000 0000000 00000010717 15260643574 0025474 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from email.message import EmailMessage as _StdlibEmailMessage
from email.message import Message, MIMEPart
from email.mime.base import MIMEBase
from email.mime.message import MIMEMessage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.policy import Policy
from email.utils import make_msgid as make_msgid
from typing import Any, NamedTuple, TypeAlias, overload
from django.core.mail.backends.base import BaseEmailBackend
from django.utils.functional import _StrOrPromise
utf8_charset: Any
utf8_charset_qp: Any
DEFAULT_ATTACHMENT_MIME_TYPE: str
RFC5322_EMAIL_LINE_LENGTH_LIMIT: int
class BadHeaderError(ValueError): ...
ADDRESS_HEADERS: set[str]
def forbid_multi_line_headers(name: str, val: str, encoding: str) -> tuple[str, str]: ...
def sanitize_address(addr: tuple[str, str] | str, encoding: str) -> str: ...
class MIMEMixin:
def as_string(self, unixfrom: bool = False, linesep: str = "\n") -> str: ...
def as_bytes(self, unixfrom: bool = False, linesep: str = "\n") -> bytes: ...
class SafeMIMEMessage(MIMEMixin, MIMEMessage): ... # type: ignore[misc]
class SafeMIMEText(MIMEMixin, MIMEText): # type: ignore[misc]
encoding: str
def __init__(self, _text: str, _subtype: str = "plain", _charset: str | None = None) -> None: ...
class SafeMIMEMultipart(MIMEMixin, MIMEMultipart): # type: ignore[misc]
encoding: str
def __init__(
self,
_subtype: str = "mixed",
boundary: Any | None = None,
_subparts: Any | None = None,
encoding: str | None = None,
**_params: Any,
) -> None: ...
_AttachmentContent: TypeAlias = bytes | EmailMessage | Message | SafeMIMEText | str
_AttachmentTuple: TypeAlias = (
tuple[str, _AttachmentContent] | tuple[str | None, _AttachmentContent, str] | tuple[str, _AttachmentContent, None]
)
class EmailAlternative(NamedTuple):
content: _AttachmentContent
mimetype: str
class EmailAttachment(NamedTuple):
filename: str | None
content: _AttachmentContent
mimetype: str
class EmailMessage:
content_subtype: str
encoding: Any
to: list[str]
cc: list[Any]
bcc: list[Any]
reply_to: list[Any]
from_email: str
subject: _StrOrPromise
body: _StrOrPromise
attachments: list[Any]
extra_headers: dict[Any, Any]
connection: BaseEmailBackend | None
def __init__(
self,
subject: _StrOrPromise = "",
body: _StrOrPromise | None = "",
from_email: str | None = None,
to: Sequence[str] | None = None,
*,
bcc: Sequence[str] | None = None,
connection: BaseEmailBackend | None = None,
attachments: Sequence[MIMEBase | _AttachmentTuple] | None = None,
headers: dict[str, str] | None = None,
cc: Sequence[str] | None = None,
reply_to: Sequence[str] | None = None,
) -> None: ...
def message(self, *, policy: Policy | None = ...) -> _StdlibEmailMessage: ...
def recipients(self) -> list[str]: ...
def send(self, fail_silently: bool = False, *, using: str | None = None) -> int: ...
@overload
def attach(self, filename: MIMEBase | None = None, content: None = None, mimetype: None = None) -> None: ...
@overload
def attach(
self, filename: None = None, content: _AttachmentContent | None = None, mimetype: str | None = None
) -> None: ...
@overload
def attach(
self, filename: str | None = None, content: _AttachmentContent | None = None, mimetype: str | None = None
) -> None: ...
@overload
def attach(self, filename: MIMEPart) -> None: ...
def attach_file(self, path: str, mimetype: str | None = None) -> None: ...
class EmailMultiAlternatives(EmailMessage):
alternatives: list[tuple[_AttachmentContent, str]]
def __init__(
self,
subject: _StrOrPromise = "",
body: _StrOrPromise | None = "",
from_email: str | None = None,
to: Sequence[str] | None = None,
*,
bcc: Sequence[str] | None = None,
connection: Any | None = None,
attachments: Sequence[MIMEBase | _AttachmentTuple] | None = None,
headers: dict[str, str] | None = None,
alternatives: list[tuple[_AttachmentContent, str]] | None = None,
cc: Sequence[str] | None = None,
reply_to: Sequence[str] | None = None,
) -> None: ...
def attach_alternative(self, content: _AttachmentContent, mimetype: str) -> None: ...
def body_contains(self, text: str) -> bool: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/mail/utils.pyi 0000664 0000000 0000000 00000000137 15260643574 0025203 0 ustar 00root root 0000000 0000000 from typing import Any
class CachedDnsName:
def get_fqdn(self) -> str: ...
DNS_NAME: Any
typeddjango-django-stubs-fa03b48/django-stubs/core/management/ 0000775 0000000 0000000 00000000000 15260643574 0024511 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/core/management/__init__.pyi 0000664 0000000 0000000 00000001665 15260643574 0027003 0 ustar 00root root 0000000 0000000 from typing import Any
from .base import BaseCommand as BaseCommand
from .base import CommandError as CommandError
from .base import CommandParser as CommandParser
from .base import handle_default_options as handle_default_options
def find_commands(management_dir: str) -> list[str]: ...
def load_command_class(app_name: str, name: str) -> BaseCommand: ...
def get_commands() -> dict[str, str]: ...
def call_command(command_name: BaseCommand | str, *args: Any, **options: Any) -> str: ...
class ManagementUtility:
argv: list[str]
prog_name: str
settings_exception: Exception | None
def __init__(self, argv: list[str] | None = None) -> None: ...
def main_help_text(self, commands_only: bool = False) -> str: ...
def fetch_command(self, subcommand: str) -> BaseCommand: ...
def autocomplete(self) -> None: ...
def execute(self) -> None: ...
def execute_from_command_line(argv: list[str] | None = None) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/management/base.pyi 0000664 0000000 0000000 00000010060 15260643574 0026143 0 ustar 00root root 0000000 0000000 from argparse import ArgumentParser, HelpFormatter, Namespace
from collections.abc import Callable, Iterable, Sequence
from io import TextIOBase
from typing import Any, Literal, TextIO
from django.apps.config import AppConfig
from django.core.management.color import Style
from django.utils.datastructures import _ListOrTuple
from typing_extensions import override
ALL_CHECKS: Literal["__all__"]
class CommandError(Exception):
returncode: int
def __init__(self, *args: Any, returncode: int = 1, **kwargs: Any) -> None: ...
class SystemCheckError(CommandError): ...
class CommandParser(ArgumentParser):
missing_args_message: str | None
called_from_command_line: bool | None
def __init__(
self, *, missing_args_message: str | None = None, called_from_command_line: bool | None = None, **kwargs: Any
) -> None: ...
@override
def error(self, message: str) -> Any: ...
def handle_default_options(options: Namespace) -> None: ...
def no_translations(handle_func: Callable[..., Any]) -> Callable[..., Any]: ...
class DjangoHelpFormatter(HelpFormatter):
show_last: set[str]
@override
def add_usage(self, usage: str | None, actions: Iterable[Any], *args: Any, **kwargs: Any) -> Any: ...
@override
def add_arguments(self, actions: Any) -> Any: ...
class OutputWrapper(TextIOBase):
@property
def style_func(self) -> Callable[[str], str]: ...
@style_func.setter
def style_func(self, style_func: Callable[[str], str] | None) -> None: ...
ending: str
def __init__(self, out: TextIO, ending: str = "\n") -> None: ...
def __getattr__(self, name: str) -> Callable[..., Any]: ...
@override
def flush(self) -> None: ...
@override
def isatty(self) -> bool: ...
@override
def write( # type: ignore[override]
self, msg: str = "", style_func: Callable[[str], str] | None = None, ending: str | None = None
) -> None: ...
class BaseCommand:
help: str
output_transaction: bool
requires_migrations_checks: bool
requires_system_checks: _ListOrTuple[str] | Literal["__all__"]
base_stealth_options: tuple[str, ...]
stealth_options: tuple[str, ...]
suppressed_base_arguments: set[str]
stdout: OutputWrapper
stderr: OutputWrapper
style: Style
def __init__(
self,
stdout: TextIO | None = None,
stderr: TextIO | None = None,
no_color: bool = False,
force_color: bool = False,
) -> None: ...
def get_version(self) -> str: ...
def create_parser(self, prog_name: str, subcommand: str, **kwargs: Any) -> CommandParser: ...
def add_arguments(self, parser: CommandParser) -> None: ...
def add_base_argument(self, parser: CommandParser, *args: Any, **kwargs: Any) -> None: ...
def print_help(self, prog_name: str, subcommand: str) -> None: ...
def run_from_argv(self, argv: list[str]) -> None: ...
def execute(self, *args: Any, **options: Any) -> str | None: ...
def get_check_kwargs(self, options: Any) -> dict[str | None, _ListOrTuple[str] | Literal["__all__"] | None]: ...
def check(
self,
app_configs: Sequence[AppConfig] | None = None,
tags: Sequence[str] | None = None,
display_num_errors: bool = False,
include_deployment_checks: bool = False,
fail_level: int = 40,
databases: Sequence[str] | None = None,
) -> None: ...
def check_migrations(self) -> None: ...
def handle(self, *args: Any, **options: Any) -> str | None: ...
class AppCommand(BaseCommand):
missing_args_message: str
@override
def add_arguments(self, parser: CommandParser) -> None: ...
@override
def handle(self, *app_labels: str, **options: Any) -> str | None: ...
def handle_app_config(self, app_config: Any, **options: Any) -> str | None: ...
class LabelCommand(BaseCommand):
label: str
missing_args_message: Any
@override
def add_arguments(self, parser: CommandParser) -> None: ...
@override
def handle(self, *labels: str, **options: Any) -> str | None: ...
def handle_label(self, label: str, **options: Any) -> str | None: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/management/color.pyi 0000664 0000000 0000000 00000002233 15260643574 0026352 0 ustar 00root root 0000000 0000000 HAS_COLORAMA: bool
def supports_color() -> bool: ...
class Style:
# set by make_style. Method names are keys in django.utils.termcolors.PALETTES
def ERROR(self, text: str) -> str: ...
def SUCCESS(self, text: str) -> str: ...
def WARNING(self, text: str) -> str: ...
def NOTICE(self, text: str) -> str: ...
def SQL_FIELD(self, text: str) -> str: ...
def SQL_COLTYPE(self, text: str) -> str: ...
def SQL_KEYWORD(self, text: str) -> str: ...
def SQL_TABLE(self, text: str) -> str: ...
def HTTP_INFO(self, text: str) -> str: ...
def HTTP_SUCCESS(self, text: str) -> str: ...
def HTTP_REDIRECT(self, text: str) -> str: ...
def HTTP_NOT_MODIFIED(self, text: str) -> str: ...
def HTTP_BAD_REQUEST(self, text: str) -> str: ...
def HTTP_NOT_FOUND(self, text: str) -> str: ...
def HTTP_SERVER_ERROR(self, text: str) -> str: ...
def MIGRATE_HEADING(self, text: str) -> str: ...
def MIGRATE_LABEL(self, text: str) -> str: ...
def ERROR_OUTPUT(self, text: str) -> str: ...
def make_style(config_string: str = "") -> Style: ...
def no_style() -> Style: ...
def color_style(force_color: bool = False) -> Style: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/ 0000775 0000000 0000000 00000000000 15260643574 0026312 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0030562 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/check.pyi 0000664 0000000 0000000 00000000350 15260643574 0030110 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.management.base import BaseCommand
from typing_extensions import override
class Command(BaseCommand):
@override
def handle(self, *app_labels: list[str], **options: Any) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/compilemessages.pyi 0000664 0000000 0000000 00000001011 15260643574 0032206 0 ustar 00root root 0000000 0000000 from pathlib import Path
from typing import Any
from _typeshed import StrPath
from django.core.management.base import BaseCommand
from typing_extensions import override
def has_bom(fn: Path) -> bool: ...
def is_dir_writable(path: StrPath) -> bool: ...
class Command(BaseCommand):
program: str
program_options: list[str]
verbosity: int
has_errors: bool
@override
def handle(self, **options: Any) -> None: ...
def compile_messages(self, locations: list[tuple[StrPath, StrPath]]) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/createcachetable.pyi 0000664 0000000 0000000 00000000521 15260643574 0032272 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.management.base import BaseCommand
from typing_extensions import override
class Command(BaseCommand):
verbosity: int
@override
def handle(self, *tablenames: list[str], **options: Any) -> None: ...
def create_table(self, database: str, tablename: str, dry_run: bool) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/dbshell.pyi 0000664 0000000 0000000 00000000320 15260643574 0030445 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.management.base import BaseCommand
from typing_extensions import override
class Command(BaseCommand):
@override
def handle(self, **options: Any) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/diffsettings.pyi 0000664 0000000 0000000 00000001155 15260643574 0031530 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any
from django.core.management.base import BaseCommand
from typing_extensions import override
def module_to_dict(module: Any, omittable: Callable[[str], bool] = ...) -> dict[str, str]: ...
class Command(BaseCommand):
@override
def handle(self, **options: Any) -> str: ...
def output_hash(
self, user_settings: dict[str, str], default_settings: dict[str, str], **options: Any
) -> list[str]: ...
def output_unified(
self, user_settings: dict[str, str], default_settings: dict[str, str], **options: Any
) -> list[str]: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/dumpdata.pyi 0000664 0000000 0000000 00000000231 15260643574 0030630 0 ustar 00root root 0000000 0000000 from django.core.management.base import BaseCommand
has_bz2: bool
has_lzma: bool
class ProxyModelWarning(Warning): ...
class Command(BaseCommand): ...
typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/flush.pyi 0000664 0000000 0000000 00000000421 15260643574 0030153 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.management.base import BaseCommand
from django.core.management.color import Style
from typing_extensions import override
class Command(BaseCommand):
style: Style
@override
def handle(self, **options: Any) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/inspectdb.pyi 0000664 0000000 0000000 00000001745 15260643574 0031017 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable
from typing import Any
from django.core.management.base import BaseCommand
from django.db.backends.base.base import BaseDatabaseWrapper
from typing_extensions import override
class Command(BaseCommand):
db_module: str
@override
def handle(self, **options: Any) -> None: ...
def handle_inspection(self, options: dict[str, Any]) -> Iterable[str]: ...
def normalize_col_name(
self, col_name: str, used_column_names: list[str], is_relation: bool
) -> tuple[str, dict[str, str], list[str]]: ...
def normalize_table_name(self, table_name: str) -> str: ...
def get_field_type(
self, connection: BaseDatabaseWrapper, table_name: str, row: Any
) -> tuple[str, dict[str, Any], list[str]]: ...
def get_meta(
self,
table_name: str,
constraints: Any,
column_to_field_name: Any,
is_view: bool,
is_partition: bool,
comment: str | None,
) -> list[str]: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/loaddata.pyi 0000664 0000000 0000000 00000004463 15260643574 0030615 0 ustar 00root root 0000000 0000000 import zipfile
from collections.abc import Callable, Sequence
from io import BufferedReader
from typing import Literal, TypeAlias
from django.apps.config import AppConfig
from django.core.management.base import BaseCommand
from django.core.serializers.base import DeserializedObject
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models.base import Model
from django.utils.functional import cached_property
from typing_extensions import override
has_bz2: bool
has_lzma: bool
READ_STDIN: str
_ReadBinaryMode: TypeAlias = Literal["r", "rb"]
class Command(BaseCommand):
missing_args_message: str
ignore: bool
using: str
app_label: str
verbosity: int
excluded_models: set[type[Model]]
excluded_apps: set[AppConfig]
format: str
fixture_count: int
loaded_object_count: int
fixture_object_count: int
models: set[type[Model]]
serialization_formats: list[str]
objs_with_deferred_fields: list[DeserializedObject]
@cached_property
def compression_formats(self) -> dict[str | None, tuple[Callable[[str, _ReadBinaryMode], BufferedReader]]]: ...
def reset_sequences(self, connection: BaseDatabaseWrapper, models: set[type[Model]]) -> None: ...
def loaddata(self, fixture_labels: Sequence[str]) -> None: ...
def save_obj(self, obj: DeserializedObject) -> bool: ...
def load_label(self, fixture_label: str) -> None: ...
def get_fixture_name_and_dirs(self, fixture_name: str) -> tuple[str, list[str]]: ...
def get_targets(self, fixture_name: str, ser_fmt: str | None, cmp_fmt: str | None) -> set[str]: ...
def find_fixture_files_in_dir(
self, fixture_dir: str, fixture_name: str, targets: set[str]
) -> list[tuple[str, str, str]]: ...
def find_fixtures(self, fixture_label: str) -> list[tuple[str, str | None, str | None]]: ...
@cached_property
def fixture_dirs(self) -> list[str]: ...
def parse_name(self, fixture_name: str) -> tuple[str, str | None, str | None]: ...
class SingleZipReader(zipfile.ZipFile):
# Incompatible override
# zipfile.ZipFile.read(
# self,
# name: typing.Text | zipfile.ZipInfo,
# pwd: bytes | None = ...,
# ) -> bytes: ...
@override
def read(self) -> bytes: ... # type: ignore[override]
def humanize(dirname: str) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/makemessages.pyi 0000664 0000000 0000000 00000005151 15260643574 0031504 0 ustar 00root root 0000000 0000000 from re import Match, Pattern
from typing import Any
from django.core.management.base import BaseCommand
from django.utils.functional import cached_property
from typing_extensions import override
plural_forms_re: Pattern[str]
STATUS_OK: int
NO_LOCALE_DIR: Any
def check_programs(*programs: str) -> None: ...
def is_valid_locale(locale: str) -> Match[str] | None: ...
class TranslatableFile:
dirpath: str
file: str
locale_dir: str | None
def __init__(self, dirpath: str, file_name: str, locale_dir: str | None) -> None: ...
@override
def __eq__(self, other: object) -> bool: ...
def __ge__(self, other: object) -> bool: ...
def __gt__(self, other: object) -> bool: ...
def __le__(self, other: object) -> bool: ...
def __lt__(self, other: object) -> bool: ...
@property
def path(self) -> str: ...
class BuildFile:
"""
Represent the state of a translatable file during the build process.
"""
command: BaseCommand
domain: str
translatable: TranslatableFile
def __init__(self, command: BaseCommand, domain: str, translatable: TranslatableFile) -> None: ...
@cached_property
def is_templatized(self) -> bool: ...
@cached_property
def path(self) -> str: ...
@cached_property
def work_path(self) -> str: ...
def preprocess(self) -> None: ...
def postprocess_messages(self, msgs: str) -> str: ...
def cleanup(self) -> None: ...
def normalize_eols(raw_contents: str) -> str: ...
def write_pot_file(potfile: str, msgs: str) -> None: ...
class Command(BaseCommand):
translatable_file_class: type[TranslatableFile]
build_file_class: type[BuildFile]
msgmerge_options: list[str]
msguniq_options: list[str]
msgattrib_options: list[str]
xgettext_options: list[str]
domain: str
verbosity: int
symlinks: bool
ignore_patterns: list[str]
no_obsolete: bool
keep_pot: bool
extensions: set[str]
invoked_for_django: bool
locale_paths: list[str]
default_locale_path: str | None
@cached_property
def gettext_version(self) -> tuple[int, int] | tuple[int, int, int]: ...
@cached_property
def settings_available(self) -> bool: ...
def build_potfiles(self) -> list[str]: ...
def remove_potfiles(self) -> None: ...
def find_files(self, root: str) -> list[TranslatableFile]: ...
def process_files(self, file_list: list[TranslatableFile]) -> None: ...
def process_locale_dir(self, locale_dir: str, files: list[TranslatableFile]) -> None: ...
def write_po_file(self, potfile: str, locale: str) -> None: ...
def copy_plural_forms(self, msgs: str, locale: str) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/makemigrations.pyi 0000664 0000000 0000000 00000001726 15260643574 0032055 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar
from django.core.management.base import BaseCommand, OutputWrapper
from django.db.migrations.autodetector import MigrationAutodetector
from django.db.migrations.loader import MigrationLoader
class Command(BaseCommand):
autodetector: ClassVar[type[MigrationAutodetector]]
verbosity: int
interactive: bool
dry_run: bool
merge: bool
empty: bool
migration_name: str
include_header: bool
scriptable: bool
update: bool
@property
def log_output(self) -> OutputWrapper: ...
def log(self, msg: str) -> None: ...
def write_to_last_migration_files(self, changes: dict[str, Any]) -> None: ...
def write_migration_files(
self, changes: dict[str, Any], update_previous_migration_paths: dict[str, str] | None = None
) -> None: ...
@staticmethod
def get_relative_path(path: str) -> str: ...
def handle_merge(self, loader: MigrationLoader, conflicts: dict[str, Any]) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/migrate.pyi 0000664 0000000 0000000 00000001414 15260643574 0030465 0 ustar 00root root 0000000 0000000 from collections.abc import Container
from typing import Any, ClassVar
from django.core.management.base import BaseCommand
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.migrations.autodetector import MigrationAutodetector
from django.db.migrations.operations.base import Operation
class Command(BaseCommand):
autodetector: ClassVar[type[MigrationAutodetector]]
verbosity: int
interactive: bool
start: float
def migration_progress_callback(self, action: str, migration: Any | None = None, fake: bool = False) -> None: ...
def sync_apps(self, connection: BaseDatabaseWrapper, app_labels: Container[str]) -> None: ...
@staticmethod
def describe_operation(operation: Operation, backwards: bool) -> tuple[str, bool]: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/optimizemigration.pyi 0000664 0000000 0000000 00000000125 15260643574 0032605 0 ustar 00root root 0000000 0000000 from django.core.management.base import BaseCommand
class Command(BaseCommand): ...
typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/runserver.pyi 0000664 0000000 0000000 00000001151 15260643574 0031066 0 ustar 00root root 0000000 0000000 from re import Pattern
from typing import Any
from django.core.handlers.wsgi import WSGIHandler
from django.core.management.base import BaseCommand
from django.core.servers.basehttp import WSGIServer
naiveip_re: Pattern[str]
class Command(BaseCommand):
default_addr: str
default_addr_ipv6: str
default_port: str
protocol: str
server_cls: type[WSGIServer]
def run(self, **options: Any) -> None: ...
def get_handler(self, *args: Any, **options: Any) -> WSGIHandler: ...
def inner_run(self, *args: Any, **options: Any) -> None: ...
def on_bind(self, server_port: int) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/sendtestemail.pyi 0000664 0000000 0000000 00000000423 15260643574 0031675 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.management.base import BaseCommand
from typing_extensions import override
class Command(BaseCommand):
missing_args_message: str
@override
def handle(self, *args: Any, using: str | None = None, **kwargs: Any) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/shell.pyi 0000664 0000000 0000000 00000000757 15260643574 0030155 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.management import BaseCommand
from typing_extensions import override
class Command(BaseCommand):
shells: list[str]
@override
def handle(self, **options: Any) -> None: ...
def ipython(self, options: Any) -> None: ...
def bpython(self, options: Any) -> None: ...
def python(self, options: Any) -> None: ...
def get_auto_imports(self) -> list[str] | None: ...
def get_namespace(self, **options: Any) -> dict[str, Any]: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/showmigrations.pyi 0000664 0000000 0000000 00000000565 15260643574 0032120 0 ustar 00root root 0000000 0000000 from django.core.management.base import BaseCommand
from django.db.backends.base.base import BaseDatabaseWrapper
class Command(BaseCommand):
verbosity: int
def show_list(self, connection: BaseDatabaseWrapper, app_names: list[str] | None = None) -> None: ...
def show_plan(self, connection: BaseDatabaseWrapper, app_names: list[str] | None = None) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/sqlflush.pyi 0000664 0000000 0000000 00000000355 15260643574 0030701 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.management.base import BaseCommand
from typing_extensions import override
class Command(BaseCommand):
output_transaction: bool
@override
def handle(self, **options: Any) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/sqlmigrate.pyi 0000664 0000000 0000000 00000000400 15260643574 0031177 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.management.base import BaseCommand
from typing_extensions import override
class Command(BaseCommand):
output_transaction: bool
@override
def execute(self, *args: Any, **options: Any) -> str | None: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/sqlsequencereset.pyi 0000664 0000000 0000000 00000000123 15260643574 0032424 0 ustar 00root root 0000000 0000000 from django.core.management.base import AppCommand
class Command(AppCommand): ...
typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/squashmigrations.pyi 0000664 0000000 0000000 00000000712 15260643574 0032436 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.management.base import BaseCommand
from django.db.migrations.loader import MigrationLoader
from django.db.migrations.migration import Migration
from typing_extensions import override
class Command(BaseCommand):
verbosity: int
interactive: bool
@override
def handle(self, **options: Any) -> None: ...
def find_migration(self, loader: MigrationLoader, app_label: str, name: str) -> Migration: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/startapp.pyi 0000664 0000000 0000000 00000000426 15260643574 0030675 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.management.templates import TemplateCommand
from typing_extensions import override
class Command(TemplateCommand):
missing_args_message: str
@override
def handle(self, **options: Any) -> None: ... # type: ignore[override]
typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/startproject.pyi 0000664 0000000 0000000 00000000426 15260643574 0031563 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.management.templates import TemplateCommand
from typing_extensions import override
class Command(TemplateCommand):
missing_args_message: str
@override
def handle(self, **options: Any) -> None: ... # type: ignore[override]
typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/test.pyi 0000664 0000000 0000000 00000000453 15260643574 0030016 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.management.base import BaseCommand
from typing_extensions import override
class Command(BaseCommand):
test_runner: Any
@override
def run_from_argv(self, argv: Any) -> None: ...
@override
def add_arguments(self, parser: Any) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/testserver.pyi 0000664 0000000 0000000 00000000125 15260643574 0031241 0 ustar 00root root 0000000 0000000 from django.core.management.base import BaseCommand
class Command(BaseCommand): ...
typeddjango-django-stubs-fa03b48/django-stubs/core/management/sql.pyi 0000664 0000000 0000000 00000000753 15260643574 0026040 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.management.color import Style
from django.db.backends.base.base import BaseDatabaseWrapper
def sql_flush(
style: Style,
connection: BaseDatabaseWrapper,
reset_sequences: bool = True,
allow_cascade: bool = False,
) -> list[str]: ...
def emit_pre_migrate_signal(verbosity: int, interactive: bool, db: str, **kwargs: Any) -> None: ...
def emit_post_migrate_signal(verbosity: int, interactive: bool, db: str, **kwargs: Any) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/management/templates.pyi 0000664 0000000 0000000 00000002114 15260643574 0027230 0 ustar 00root root 0000000 0000000 from argparse import ArgumentParser
from collections.abc import Sequence
from typing import Any
from django.core.management.base import BaseCommand
from typing_extensions import override
class TemplateCommand(BaseCommand):
url_schemes: Sequence[str]
rewrite_template_suffixes: Sequence[tuple[str, str]]
app_or_project: str
a_or_an: str
paths_to_remove: Sequence[Any]
verbosity: Any
@override
def add_arguments(self, parser: ArgumentParser) -> None: ...
@override
def handle(self, app_or_project: str, name: str, target: str | None = ..., **options: Any) -> None: ...
def handle_template(self, template: str | None, subdir: str | None) -> str: ...
def validate_name(self, name: str, name_or_dir: str = ...) -> None: ...
def download(self, url: str) -> str: ...
def splitext(self, the_path: str) -> tuple[str, str]: ...
def extract(self, filename: str) -> str: ...
def is_url(self, template: str) -> bool: ...
def apply_umask(self, old_path: str, new_path: str) -> None: ...
def make_writeable(self, filename: str) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/management/utils.pyi 0000664 0000000 0000000 00000002075 15260643574 0026400 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable, Sequence
from typing import Any
from _typeshed import StrOrBytesPath, StrPath, SupportsWrite
from django.apps.config import AppConfig
from django.db.models.base import Model
def popen_wrapper(args: list[str], stdout_encoding: str = "utf-8") -> tuple[str, str, int]: ...
def handle_extensions(extensions: Iterable[str]) -> set[str]: ...
def find_command(
cmd: str,
path: str | Iterable[str] | None = None,
pathext: str | Iterable[str] | None = None,
) -> str | None: ...
def get_random_secret_key() -> str: ...
def parse_apps_and_model_labels(labels: Iterable[str]) -> tuple[set[type[Model]], set[AppConfig]]: ...
def get_command_line_option(argv: Sequence[Any], option: Any) -> Any | None: ...
def normalize_path_patterns(patterns: Iterable[str]) -> list[str]: ...
def is_ignored_path(path: StrPath, ignore_patterns: Iterable[str]) -> bool: ...
def find_formatters() -> dict[str, str | None]: ...
def run_formatters(
written_files: Iterable[StrOrBytesPath], black_path: str = ..., stderr: SupportsWrite[str] = ...
) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/paginator.pyi 0000664 0000000 0000000 00000010167 15260643574 0025111 0 ustar 00root root 0000000 0000000 from collections.abc import AsyncIterator, Iterable, Iterator, Sequence, Sized
from typing import ClassVar, Generic, Protocol, overload, type_check_only
from django.db.models.fields import _ErrorMessagesDict
from django.utils.functional import _StrPromise, cached_property
from typing_extensions import TypeVar, override
class UnorderedObjectListWarning(RuntimeWarning): ...
class InvalidPage(Exception): ...
class PageNotAnInteger(InvalidPage): ...
class EmptyPage(InvalidPage): ...
_T = TypeVar("_T")
@type_check_only
class _SupportsPagination(Protocol[_T], Sized, Iterable[_T]):
@overload
def __getitem__(self, index: int, /) -> _T: ...
@overload
def __getitem__(self, index: slice, /) -> _SupportsPagination[_T]: ...
class BasePaginator(Generic[_T]):
ELLIPSIS: ClassVar[_StrPromise]
default_error_messages: ClassVar[_ErrorMessagesDict]
error_messages: _ErrorMessagesDict
object_list: _SupportsPagination[_T]
per_page: int
orphans: int
allow_empty_first_page: bool
def __init__(
self,
object_list: _SupportsPagination[_T],
per_page: int | str,
orphans: int = 0,
allow_empty_first_page: bool = True,
error_messages: _ErrorMessagesDict | None = None,
) -> None: ...
class Paginator(BasePaginator[_T]):
def __iter__(self) -> Iterator[Page[_T]]: ...
def validate_number(self, number: int | float | str) -> int: ...
def get_page(self, number: int | float | str | None) -> Page[_T]: ...
def page(self, number: int | str) -> Page[_T]: ...
@cached_property
def count(self) -> int: ...
@cached_property
def num_pages(self) -> int: ...
@property
def page_range(self) -> range: ...
def get_elided_page_range(
self, number: int | float | str = 1, *, on_each_side: int = 3, on_ends: int = 2
) -> Iterator[str | int]: ...
class AsyncPaginator(BasePaginator[_T]):
def __aiter__(self) -> AsyncIterator[AsyncPage[_T]]: ...
async def avalidate_number(self, number: int | float | str) -> int: ...
async def aget_page(self, number: int | float | str | None) -> AsyncPage[_T]: ...
async def apage(self, number: int | str) -> AsyncPage[_T]: ...
async def acount(self) -> int: ...
async def anum_pages(self) -> int: ...
async def apage_range(self) -> range: ...
async def aget_elided_page_range(
self, number: int | float | str = 1, *, on_each_side: int = 3, on_ends: int = 2
) -> AsyncIterator[str | int]: ...
class Page(Sequence[_T]):
object_list: _SupportsPagination[_T]
number: int
paginator: Paginator[_T]
def __init__(
self,
object_list: _SupportsPagination[_T],
number: int,
paginator: Paginator[_T],
) -> None: ...
@overload
@override
def __getitem__(self, index: int) -> _T: ...
@overload
@override
def __getitem__(self, index: slice) -> Sequence[_T]: ... # Avoid override error
@override
def __len__(self) -> int: ...
def has_next(self) -> bool: ...
def has_previous(self) -> bool: ...
def has_other_pages(self) -> bool: ...
def next_page_number(self) -> int: ...
def previous_page_number(self) -> int: ...
def start_index(self) -> int: ...
def end_index(self) -> int: ...
class AsyncPage(Generic[_T]):
object_list: _SupportsPagination[_T]
number: int
paginator: AsyncPaginator[_T]
def __init__(
self,
object_list: _SupportsPagination[_T],
number: int,
paginator: AsyncPaginator[_T],
) -> None: ...
def __aiter__(self) -> AsyncIterator[_T]: ...
def __len__(self) -> int: ...
def __reversed__(self) -> Iterator[_T]: ...
@overload
def __getitem__(self, index: int) -> _T: ...
@overload
def __getitem__(self, index: slice) -> list[_T]: ...
async def aget_object_list(self) -> list[_T]: ...
async def ahas_next(self) -> bool: ...
async def ahas_previous(self) -> bool: ...
async def ahas_other_pages(self) -> bool: ...
async def anext_page_number(self) -> int: ...
async def aprevious_page_number(self) -> int: ...
async def astart_index(self) -> int: ...
async def aend_index(self) -> int: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/serializers/ 0000775 0000000 0000000 00000000000 15260643574 0024731 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/core/serializers/__init__.pyi 0000664 0000000 0000000 00000002266 15260643574 0027221 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterable, Iterator
from typing import Any
from django.db.models.base import Model
from .base import DeserializedObject, Deserializer, Serializer
from .base import SerializerDoesNotExist as SerializerDoesNotExist
BUILTIN_SERIALIZERS: dict[str, str]
class BadSerializer:
internal_use_only: bool
exception: BaseException
def __init__(self, exception: BaseException) -> None: ...
def __call__(self, *args: Any, **kwargs: Any) -> Any: ...
def register_serializer(format: str, serializer_module: str, serializers: dict[str, Any] | None = None) -> None: ...
def unregister_serializer(format: str) -> None: ...
def get_serializer(format: str) -> type[Serializer] | BadSerializer: ...
def get_serializer_formats() -> list[str]: ...
def get_public_serializer_formats() -> list[str]: ...
def get_deserializer(format: str) -> Callable[..., Any] | type[Deserializer]: ...
def serialize(format: str, queryset: Iterable[Model], **options: Any) -> Any: ...
def deserialize(format: str, stream_or_string: Any, **options: Any) -> Iterator[DeserializedObject]: ...
def sort_dependencies(app_list: Iterable[Any], allow_cycles: bool = False) -> list[type[Model]]: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/serializers/base.pyi 0000664 0000000 0000000 00000006255 15260643574 0026376 0 ustar 00root root 0000000 0000000 from collections.abc import Collection, Iterable, Sequence
from typing import IO, Any
from django.db.models.base import Model
from django.db.models.fields import Field
from django.db.models.fields.related import ForeignKey, ManyToManyField
DEFER_FIELD: object
class SerializerDoesNotExist(KeyError): ...
class SerializationError(Exception): ...
class DeserializationError(Exception):
@classmethod
def WithData(
cls, original_exc: Exception, model: str, fk: int | str, field_value: Sequence[str] | str | None
) -> DeserializationError: ...
class M2MDeserializationError(Exception):
original_exc: Exception
pk: Any
def __init__(self, original_exc: Exception, pk: Any) -> None: ...
class ProgressBar:
progress_width: int
output: IO[str] | None
total_count: int
prev_done: int
def __init__(self, output: IO[str] | None, total_count: int) -> None: ...
def update(self, count: int) -> None: ...
class Serializer:
internal_use_only: bool
progress_class: type[ProgressBar]
stream_class: type[IO[str]]
options: dict[str, Any]
stream: IO[str]
selected_fields: Collection[str] | None
use_natural_foreign_keys: bool
use_natural_primary_keys: bool
first: bool
def serialize(
self,
queryset: Iterable[Model],
*,
stream: IO[str] | None = None,
fields: Collection[str] | None = None,
use_natural_foreign_keys: bool = False,
use_natural_primary_keys: bool = False,
progress_output: IO[str] | None = None,
object_count: int = 0,
**options: Any,
) -> Any: ...
def start_serialization(self) -> None: ...
def end_serialization(self) -> None: ...
def start_object(self, obj: Any) -> None: ...
def end_object(self, obj: Any) -> None: ...
def handle_field(self, obj: Any, field: Any) -> None: ...
def handle_fk_field(self, obj: Any, field: Any) -> None: ...
def handle_m2m_field(self, obj: Any, field: Any) -> None: ...
def getvalue(self) -> bytes | str | None: ...
class Deserializer:
options: dict[str, Any]
stream: IO[str] | IO[bytes]
def __init__(self, stream_or_string: bytes | str | IO[bytes] | IO[str], **options: Any) -> None: ...
def __iter__(self) -> Deserializer: ...
def __next__(self) -> Any: ...
class DeserializedObject:
object: Model
m2m_data: dict[str, Sequence[Any]] | None
deferred_fields: dict[Field[Any, Any], Any]
def __init__(
self,
obj: Model,
m2m_data: dict[str, Sequence[Any]] | None = None,
deferred_fields: dict[Field[Any, Any], Any] | None = None,
) -> None: ...
def save(self, save_m2m: bool = True, using: str | None = None, **kwargs: Any) -> None: ...
def save_deferred_fields(self, using: str | None = None) -> None: ...
def build_instance(Model: type[Model], data: dict[str, Any], db: str) -> Model: ...
def deserialize_m2m_values(
field: ManyToManyField[Any, Any], field_value: Iterable[Any], using: str | None, handle_forward_references: bool
) -> Sequence[Any] | object: ...
def deserialize_fk_value(
field: ForeignKey[Any, Any], field_value: Any, using: str | None, handle_forward_references: bool
) -> Any | object: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/serializers/json.pyi 0000664 0000000 0000000 00000001232 15260643574 0026423 0 ustar 00root root 0000000 0000000 import json
from typing import Any, TypeAlias
import _typeshed
from django.core.serializers.python import Deserializer as PythonDeserializer
from django.core.serializers.python import Serializer as PythonSerializer
_DeserializerInput: TypeAlias = _typeshed.SupportsRead[bytes | str] | bytes | str
class Serializer(PythonSerializer):
json_kwargs: dict[str, Any]
class Deserializer(PythonDeserializer):
def __init__(self, stream_or_string: _DeserializerInput, **options: Any) -> None: ...
class DjangoJSONEncoder(json.JSONEncoder):
allow_nan: bool
check_circular: bool
ensure_ascii: bool
indent: int
skipkeys: bool
sort_keys: bool
typeddjango-django-stubs-fa03b48/django-stubs/core/serializers/jsonl.pyi 0000664 0000000 0000000 00000000664 15260643574 0026607 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.serializers.json import _DeserializerInput
from django.core.serializers.python import Deserializer as PythonDeserializer
from django.core.serializers.python import Serializer as PythonSerializer
class Serializer(PythonSerializer):
json_kwargs: dict[str, Any]
class Deserializer(PythonDeserializer):
def __init__(self, stream_or_string: _DeserializerInput, **options: Any) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/serializers/python.pyi 0000664 0000000 0000000 00000000772 15260643574 0027003 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable
from typing import Any
from django.core.serializers import base
from django.db.models.base import Model
class Serializer(base.Serializer):
objects: list[Any]
def get_dump_object(self, obj: Model) -> dict[str, Any]: ...
class Deserializer(base.Deserializer):
def __init__(
self,
object_list: Iterable[dict[str, Any]],
*,
using: str = ...,
ignorenonexistent: bool = False,
**options: Any,
) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/serializers/pyyaml.pyi 0000664 0000000 0000000 00000001577 15260643574 0027001 0 ustar 00root root 0000000 0000000 from typing import IO, Any
from django.core.serializers.base import Deserializer as PythonDeserializer
from django.core.serializers.python import Serializer as PythonSerializer
from django.db.models.fields import Field
from typing_extensions import override
from yaml import CSafeDumper as SafeDumper
from yaml import ScalarNode
class DjangoSafeDumper(SafeDumper):
def represent_decimal(self, data: Any) -> ScalarNode: ...
def represent_time(self, data: Any) -> ScalarNode: ...
class Serializer(PythonSerializer):
internal_use_only: bool
@override
def handle_field(self, obj: Any, field: Field[Any, Any]) -> None: ...
@override
def end_serialization(self) -> None: ...
@override
def getvalue(self) -> Any: ...
class Deserializer(PythonDeserializer):
def __init__(self, stream_or_string: bytes | str | IO[bytes] | IO[str], **options: Any) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/serializers/xml_serializer.pyi 0000664 0000000 0000000 00000005070 15260643574 0030507 0 ustar 00root root 0000000 0000000 from typing import IO, Any
from xml.sax.expatreader import ExpatParser
from django.core.serializers import base
from typing_extensions import override
class Serializer(base.Serializer):
def indent(self, level: int) -> None: ...
xml: Any
@override
def start_serialization(self) -> None: ...
@override
def end_serialization(self) -> None: ...
@override
def start_object(self, obj: Any) -> None: ...
@override
def end_object(self, obj: Any) -> None: ...
@override
def handle_field(self, obj: Any, field: Any) -> None: ...
@override
def handle_fk_field(self, obj: Any, field: Any) -> None: ...
@override
def handle_m2m_field(self, obj: Any, field: Any) -> None: ...
class Deserializer(base.Deserializer):
handle_forward_references: bool
event_stream: Any
db: str
ignore: bool
def __init__(
self,
stream_or_string: bytes | str | IO[bytes] | IO[str],
*,
using: str = ...,
ignorenonexistent: bool = ...,
**options: Any,
) -> None: ...
@override
def __next__(self) -> base.DeserializedObject: ...
def check_element_type(element: Any) -> bool: ...
def getChildrenByTagName(node: Any, tag_name: str) -> list[Any]: ...
def getInnerText(node: Any) -> str: ...
class DefusedExpatParser(ExpatParser):
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
@override
def start_doctype_decl(self, name: Any, sysid: Any, pubid: Any, has_internal_subset: Any) -> None: ...
def entity_decl(
self, name: Any, is_parameter_entity: Any, value: Any, base: Any, sysid: Any, pubid: Any, notation_name: Any
) -> None: ...
@override
def unparsed_entity_decl(self, name: Any, base: Any, sysid: Any, pubid: Any, notation_name: Any) -> None: ...
def external_entity_ref_handler(self, context: Any, base: Any, sysid: Any, pubid: Any) -> None: ...
@override
def reset(self) -> None: ...
class DefusedXmlException(ValueError): ...
class DTDForbidden(DefusedXmlException):
name: Any
sysid: Any
pubid: Any
def __init__(self, name: Any, sysid: Any, pubid: Any) -> None: ...
class EntitiesForbidden(DefusedXmlException):
name: Any
value: Any
base: Any
sysid: Any
pubid: Any
notation_name: Any
def __init__(self, name: Any, value: Any, base: Any, sysid: Any, pubid: Any, notation_name: Any) -> None: ...
class ExternalReferenceForbidden(DefusedXmlException):
context: Any
base: Any
sysid: Any
pubid: Any
def __init__(self, context: Any, base: Any, sysid: Any, pubid: Any) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/servers/ 0000775 0000000 0000000 00000000000 15260643574 0024066 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/core/servers/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0026336 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/core/servers/basehttp.pyi 0000664 0000000 0000000 00000003545 15260643574 0026432 0 ustar 00root root 0000000 0000000 import socketserver
from collections.abc import Callable
from io import BytesIO
from typing import Any
from wsgiref import simple_server
from django.core.handlers.wsgi import WSGIHandler, WSGIRequest
from typing_extensions import override
def get_internal_wsgi_application() -> WSGIHandler: ...
def is_broken_pipe_error() -> bool: ...
class WSGIServer(simple_server.WSGIServer):
request_queue_size: int
address_family: Any
allow_reuse_address: Any
def __init__(self, *args: Any, ipv6: bool = ..., allow_reuse_address: bool = ..., **kwargs: Any) -> None: ...
@override
def handle_error(self, request: Any, client_address: Any) -> None: ...
class ThreadedWSGIServer(socketserver.ThreadingMixIn, WSGIServer):
connections_override: Any
def __init__(self, *args: Any, connections_override: Any = ..., **kwargs: Any) -> None: ...
class ServerHandler(simple_server.ServerHandler):
def __init__(self, stdin: Any, stdout: Any, stderr: Any, environ: dict[str, Any], **kwargs: Any) -> None: ...
@override
def handle_error(self) -> None: ...
class WSGIRequestHandler(simple_server.WSGIRequestHandler):
close_connection: bool
connection: WSGIRequest
request: WSGIRequest
rfile: BytesIO
wfile: BytesIO
protocol_version: str
@override
def address_string(self) -> str: ...
@override
def log_message(self, format: str, *args: Any) -> None: ...
@override
def get_environ(self) -> dict[str, str]: ...
raw_requestline: bytes
requestline: str
request_version: str
@override
def handle(self) -> None: ...
def run(
addr: str | bytes | bytearray,
port: int,
wsgi_handler: WSGIHandler,
ipv6: bool = ...,
threading: bool = ...,
on_bind: Callable[[str], None] | None = ...,
server_cls: type[WSGIServer] = ...,
) -> None: ...
__all__ = ("WSGIRequestHandler", "WSGIServer")
typeddjango-django-stubs-fa03b48/django-stubs/core/signals.pyi 0000664 0000000 0000000 00000000213 15260643574 0024554 0 ustar 00root root 0000000 0000000 from django.dispatch import Signal
request_started: Signal
request_finished: Signal
got_request_exception: Signal
setting_changed: Signal
typeddjango-django-stubs-fa03b48/django-stubs/core/signing.pyi 0000664 0000000 0000000 00000004477 15260643574 0024572 0 ustar 00root root 0000000 0000000 from datetime import timedelta
from typing import Any, Protocol, type_check_only
from typing_extensions import override
BASE62_ALPHABET: str
class BadSignature(Exception): ...
class SignatureExpired(BadSignature): ...
def b62_encode(s: int) -> str: ...
def b62_decode(s: str) -> int: ...
def b64_encode(s: bytes) -> bytes: ...
def b64_decode(s: bytes) -> bytes: ...
def base64_hmac(salt: bytes | str, value: bytes | str, key: bytes | str, algorithm: str | None = None) -> str: ...
def get_cookie_signer(salt: str = "django.core.signing.get_cookie_signer") -> TimestampSigner: ...
@type_check_only
class Serializer(Protocol):
def dumps(self, obj: Any) -> bytes: ...
def loads(self, data: bytes) -> Any: ...
class JSONSerializer:
def dumps(self, obj: Any) -> bytes: ...
def loads(self, data: bytes) -> Any: ...
def dumps(
obj: Any,
key: bytes | str | None = None,
salt: bytes | str = "django.core.signing",
serializer: type[Serializer] = ...,
compress: bool = False,
) -> str: ...
def loads(
s: str,
key: bytes | str | None = None,
salt: bytes | str = "django.core.signing",
serializer: type[Serializer] = ...,
max_age: int | timedelta | None = None,
fallback_keys: list[str | bytes] | None = None,
) -> Any: ...
class Signer:
key: bytes | str
fallback_keys: list[bytes | str]
sep: str
salt: bytes | str
algorithm: str
def __init__(
self,
*,
key: bytes | str | None = None,
sep: str = ":",
salt: bytes | str | None = None,
algorithm: str | None = None,
fallback_keys: list[bytes | str] | None = None,
) -> None: ...
def signature(self, value: bytes | str, key: bytes | str | None = None) -> str: ...
def sign(self, value: str) -> str: ...
def unsign(self, signed_value: str) -> str: ...
def sign_object(
self,
obj: Any,
serializer: type[Serializer] = ...,
compress: bool = False,
) -> str: ...
def unsign_object(
self,
signed_obj: str,
serializer: type[Serializer] = ...,
**kwargs: Any,
) -> Any: ...
class TimestampSigner(Signer):
def timestamp(self) -> str: ...
@override
def sign(self, value: str) -> str: ...
@override
def unsign(self, value: str, max_age: int | timedelta | None = None) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/validators.pyi 0000664 0000000 0000000 00000012167 15260643574 0025277 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Collection, Sequence, Sized
from decimal import Decimal
from re import Pattern, RegexFlag
from typing import Any, TypeAlias
from django.core.files.base import File
from django.utils.deconstruct import _Deconstructible
from django.utils.functional import _StrOrPromise
from typing_extensions import override
EMPTY_VALUES: Any
_Regex: TypeAlias = str | Pattern[str]
_ValidatorCallable: TypeAlias = Callable[[Any], None] # noqa: PYI047
class RegexValidator(_Deconstructible):
regex: _Regex # Pattern[str] on instance, but may be str on class definition
message: _StrOrPromise
code: str
inverse_match: bool
flags: int
def __init__(
self,
regex: _Regex | None = None,
message: _StrOrPromise | None = None,
code: str | None = None,
inverse_match: bool | None = None,
flags: RegexFlag | None = None,
) -> None: ...
def __call__(self, value: Any) -> None: ...
class DomainNameValidator(RegexValidator):
ul: str
hostname_re: str
domain_re: str
tld_no_fqdn_re: str
tld_re: str
ascii_only_hostname_re: str
ascii_only_domain_re: str
ascii_only_tld_re: str
max_length: int
def __init__(self, *, accept_idna: bool = True, **kwargs: Any) -> None: ...
@override
def __call__(self, value: Any) -> None: ...
validate_domain_name: DomainNameValidator
class URLValidator(RegexValidator):
ipv4_re: str
ipv6_re: str
hostname_re: str
domain_re: str
tld_re: str
host_re: str
schemes: Sequence[str]
unsafe_chars: frozenset[str]
max_length: int
def __init__(self, schemes: Sequence[str] | None = None, **kwargs: Any) -> None: ...
@override
def __call__(self, value: Any) -> None: ...
integer_validator: RegexValidator
def validate_integer(value: float | str | None) -> None: ...
class EmailValidator(_Deconstructible):
message: _StrOrPromise
code: str
domain_re: str
hostname_re: str
tld_no_fqdn_re: str
user_regex: Pattern[str]
domain_regex: Pattern[str]
literal_regex: Pattern[str]
domain_allowlist: Sequence[str]
def __init__(
self,
message: _StrOrPromise | None = None,
code: str | None = None,
allowlist: Sequence[str] | None = None,
) -> None: ...
def __call__(self, value: str | None) -> None: ...
def validate_domain_part(self, domain_part: str) -> bool: ...
@override
def __eq__(self, other: object) -> bool: ...
validate_email: EmailValidator
slug_re: Pattern[str]
validate_slug: RegexValidator
slug_unicode_re: Pattern[str]
validate_unicode_slug: RegexValidator
def validate_ipv4_address(value: str) -> None: ...
def validate_ipv6_address(value: str) -> None: ...
def validate_ipv46_address(value: str) -> None: ...
_IPValidator: TypeAlias = tuple[list[Callable[[Any], None]], str]
ip_address_validator_map: dict[str, _IPValidator]
def ip_address_validators(protocol: str, unpack_ipv4: bool) -> _IPValidator: ...
def int_list_validator(
sep: str = ",", message: _StrOrPromise | None = None, code: str = "invalid", allow_negative: bool = False
) -> RegexValidator: ...
validate_comma_separated_integer_list: RegexValidator
class BaseValidator(_Deconstructible):
message: _StrOrPromise
code: str
limit_value: Any
def __init__(self, limit_value: Any | Callable[[], Any], message: _StrOrPromise | None = None) -> None: ...
def __call__(self, value: Any) -> None: ...
def compare(self, a: Any, b: Any) -> bool: ...
def clean(self, x: Any) -> Any: ...
@override
def __eq__(self, other: object) -> bool: ...
class MaxValueValidator(BaseValidator): ...
class MinValueValidator(BaseValidator): ...
class StepValueValidator(BaseValidator):
offset: int | None
def __init__(
self, limit_value: Any | Callable[[], Any], message: _StrOrPromise | None = None, offset: int | None = None
) -> None: ...
class MinLengthValidator(BaseValidator):
@override
def clean(self, x: Sized) -> int: ...
class MaxLengthValidator(BaseValidator):
@override
def clean(self, x: Sized) -> int: ...
class DecimalValidator(_Deconstructible):
messages: dict[str, str]
max_digits: int | None
decimal_places: int | None
def __init__(self, max_digits: int | None, decimal_places: int | None) -> None: ...
def __call__(self, value: Decimal) -> None: ...
@override
def __eq__(self, other: object) -> bool: ...
class FileExtensionValidator(_Deconstructible):
message: _StrOrPromise
code: str
allowed_extensions: Collection[str] | None
def __init__(
self,
allowed_extensions: Collection[str] | None = None,
message: _StrOrPromise | None = None,
code: str | None = None,
) -> None: ...
def __call__(self, value: File[Any]) -> None: ...
def get_available_image_extensions() -> Sequence[str]: ...
def validate_image_file_extension(value: File[Any]) -> None: ...
class ProhibitNullCharactersValidator(_Deconstructible):
message: _StrOrPromise
code: str
def __init__(self, message: _StrOrPromise | None = None, code: str | None = None) -> None: ...
def __call__(self, value: Any) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/core/wsgi.pyi 0000664 0000000 0000000 00000000142 15260643574 0024066 0 ustar 00root root 0000000 0000000 from django.core.handlers.wsgi import WSGIHandler
def get_wsgi_application() -> WSGIHandler: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/ 0000775 0000000 0000000 00000000000 15260643574 0022032 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/db/__init__.pyi 0000664 0000000 0000000 00000002572 15260643574 0024322 0 ustar 00root root 0000000 0000000 from typing import Any
from .backends.base.base import BaseDatabaseWrapper
from .utils import DEFAULT_DB_ALIAS as DEFAULT_DB_ALIAS # Not exported in __all__
from .utils import DJANGO_VERSION_PICKLE_KEY as DJANGO_VERSION_PICKLE_KEY
from .utils import ConnectionHandler, ConnectionRouter
from .utils import DatabaseError as DatabaseError
from .utils import DataError as DataError
from .utils import Error as Error
from .utils import IntegrityError as IntegrityError
from .utils import InterfaceError as InterfaceError
from .utils import InternalError as InternalError
from .utils import NotSupportedError as NotSupportedError
from .utils import OperationalError as OperationalError
from .utils import ProgrammingError as ProgrammingError
connections: ConnectionHandler
router: ConnectionRouter
# Actually ConnectionProxy, but quacks exactly like BaseDatabaseWrapper, it's not worth distinguishing the two.
connection: BaseDatabaseWrapper
def close_old_connections(**kwargs: Any) -> None: ...
def reset_queries(**kwargs: Any) -> None: ...
__all__ = [
"DEFAULT_DB_ALIAS",
"DJANGO_VERSION_PICKLE_KEY",
"DataError",
"DatabaseError",
"Error",
"IntegrityError",
"InterfaceError",
"InternalError",
"NotSupportedError",
"OperationalError",
"ProgrammingError",
"close_old_connections",
"connection",
"connections",
"reset_queries",
"router",
]
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/ 0000775 0000000 0000000 00000000000 15260643574 0023604 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/db/backends/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0026054 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/db/backends/base/ 0000775 0000000 0000000 00000000000 15260643574 0024516 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/db/backends/base/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0026766 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/db/backends/base/base.pyi 0000664 0000000 0000000 00000012612 15260643574 0026155 0 ustar 00root root 0000000 0000000 from collections import deque
from collections.abc import Callable, Iterable
from contextlib import AbstractContextManager
from datetime import tzinfo
from logging import Logger
from typing import Any, Self, TypeAlias
from django.db.backends.base.client import BaseDatabaseClient
from django.db.backends.base.creation import BaseDatabaseCreation
from django.db.backends.base.features import BaseDatabaseFeatures
from django.db.backends.base.introspection import BaseDatabaseIntrospection
from django.db.backends.base.operations import BaseDatabaseOperations
from django.db.backends.base.schema import BaseDatabaseSchemaEditor
from django.db.backends.base.validation import BaseDatabaseValidation
from django.db.backends.utils import CursorDebugWrapper, CursorWrapper
from django.db.transaction import Atomic
from django.db.utils import DatabaseErrorWrapper
from django.utils.functional import cached_property
NO_DB_ALIAS: str
RAN_DB_VERSION_CHECK: set[str]
logger: Logger
_ExecuteWrapper: TypeAlias = Callable[
[Callable[[str, Any, bool, dict[str, Any]], Any], str, Any, bool, dict[str, Any]], Any
]
class BaseDatabaseWrapper:
data_types: dict[str, str]
data_types_suffix: dict[str, str]
data_type_check_constraints: dict[str, str]
vendor: str
display_name: str
SchemaEditorClass: type[BaseDatabaseSchemaEditor]
client_class: type[BaseDatabaseClient]
creation_class: type[BaseDatabaseCreation]
features_class: type[BaseDatabaseFeatures]
introspection_class: type[BaseDatabaseIntrospection]
ops_class: type[BaseDatabaseOperations]
validation_class: type[BaseDatabaseValidation]
queries_limit: int
connection: Any
settings_dict: dict[str, Any]
alias: str
queries_log: deque[dict[str, str]]
force_debug_cursor: bool
autocommit: bool
in_atomic_block: bool
savepoint_state: int
savepoint_ids: list[str]
commit_on_exit: bool
needs_rollback: bool
close_at: float | None
closed_in_transaction: bool
errors_occurred: bool
run_on_commit: list[tuple[set[str], Callable[[], None]]]
run_commit_hooks_on_set_autocommit_on: bool
execute_wrappers: list[_ExecuteWrapper]
client: BaseDatabaseClient
creation: BaseDatabaseCreation
features: BaseDatabaseFeatures
introspection: BaseDatabaseIntrospection
ops: BaseDatabaseOperations
validation: BaseDatabaseValidation
atomic_blocks: list[Atomic]
def __init__(self, settings_dict: dict[str, Any], alias: str = "default") -> None: ...
def ensure_timezone(self) -> bool: ...
@cached_property
def timezone(self) -> tzinfo | None: ...
@cached_property
def timezone_name(self) -> str: ...
@property
def queries_logged(self) -> bool: ...
@property
def queries(self) -> list[dict[str, str]]: ...
def get_database_version(self) -> tuple[int, ...]: ...
def check_database_version_supported(self) -> None: ...
def get_connection_params(self) -> dict[str, Any]: ...
def get_new_connection(self, conn_params: Any) -> Any: ...
def init_connection_state(self) -> None: ...
def create_cursor(self, name: str | None = None) -> Any: ...
def connect(self) -> None: ...
def check_settings(self) -> None: ...
def ensure_connection(self) -> None: ...
def cursor(self) -> CursorWrapper: ...
def commit(self) -> None: ...
def rollback(self) -> None: ...
def close(self) -> None: ...
def savepoint(self) -> str | None: ...
def savepoint_rollback(self, sid: str) -> None: ...
def savepoint_commit(self, sid: str) -> None: ...
def clean_savepoints(self) -> None: ...
def get_autocommit(self) -> bool: ...
def set_autocommit(
self, autocommit: bool, force_begin_transaction_with_broken_autocommit: bool = False
) -> None: ...
def get_rollback(self) -> bool: ...
def set_rollback(self, rollback: bool) -> None: ...
def validate_no_atomic_block(self) -> None: ...
def validate_no_broken_transaction(self) -> None: ...
def constraint_checks_disabled(self) -> AbstractContextManager[None]: ...
def disable_constraint_checking(self) -> bool: ...
def enable_constraint_checking(self) -> None: ...
def check_constraints(self, table_names: Iterable[str] | None = None) -> None: ...
def is_usable(self) -> bool: ...
def close_if_health_check_failed(self) -> None: ...
def close_if_unusable_or_obsolete(self) -> None: ...
@property
def allow_thread_sharing(self) -> bool: ...
def inc_thread_sharing(self) -> None: ...
def dec_thread_sharing(self) -> None: ...
def validate_thread_sharing(self) -> None: ...
def prepare_database(self) -> None: ...
@cached_property
def wrap_database_errors(self) -> DatabaseErrorWrapper: ...
def chunked_cursor(self) -> CursorWrapper: ...
def make_debug_cursor(self, cursor: CursorWrapper) -> CursorDebugWrapper: ...
def make_cursor(self, cursor: CursorWrapper) -> CursorWrapper: ...
def temporary_connection(self) -> AbstractContextManager[CursorWrapper]: ...
def _nodb_cursor(self) -> AbstractContextManager[CursorWrapper]: ...
def schema_editor(self, *args: Any, **kwargs: Any) -> BaseDatabaseSchemaEditor: ...
def on_commit(self, func: Callable[[], object], robust: bool = False) -> None: ...
def run_and_clear_commit_hooks(self) -> None: ...
def execute_wrapper(self, wrapper: _ExecuteWrapper) -> AbstractContextManager[None]: ...
def copy(self, alias: str | None = None) -> Self: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/base/client.pyi 0000664 0000000 0000000 00000001116 15260643574 0026516 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable, Sequence
from typing import Any
from django.db.backends.base.base import BaseDatabaseWrapper
class BaseDatabaseClient:
executable_name: str | None
connection: BaseDatabaseWrapper
def __init__(self, connection: BaseDatabaseWrapper) -> None: ...
def __del__(self) -> None: ...
@classmethod
def settings_to_cmd_args_env(
cls,
settings_dict: dict[str, Any],
parameters: Iterable[str],
) -> tuple[Sequence[str], dict[str, str] | None]: ...
def runshell(self, parameters: Iterable[str]) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/base/creation.pyi 0000664 0000000 0000000 00000003546 15260643574 0027055 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar, overload
from django.db.backends.base.base import BaseDatabaseWrapper
from typing_extensions import deprecated
TEST_DATABASE_PREFIX: str
class BaseDatabaseCreation:
destroy_test_db_connection_close_method: ClassVar[str | None]
connection: BaseDatabaseWrapper
def __init__(self, connection: BaseDatabaseWrapper) -> None: ...
def __del__(self) -> None: ...
def log(self, msg: str) -> None: ...
@overload
@deprecated(
"DatabaseCreation.create_test_db(serialize) is deprecated. Call DatabaseCreation.serialize_test_db() once all "
"test databases are set up instead if you need fixtures persistence between tests."
)
def create_test_db(
self, verbosity: int = 1, autoclobber: bool = False, serialize: bool = ..., keepdb: bool = False
) -> str: ...
@overload
def create_test_db(
self, verbosity: int = 1, autoclobber: bool = False, serialize: None = None, keepdb: bool = False
) -> str: ...
def set_as_test_mirror(self, primary_settings_dict: dict[str, dict[str, None] | int | str | None]) -> None: ...
def serialize_db_to_string(self) -> str: ...
def deserialize_db_from_string(self, data: str) -> None: ...
def clone_test_db(
self, suffix: Any, verbosity: int = 1, autoclobber: bool = False, keepdb: bool = False
) -> None: ...
def get_test_db_clone_settings(self, suffix: str) -> dict[str, Any]: ...
def destroy_test_db(
self,
old_database_name: str | None = None,
verbosity: int = 1,
keepdb: bool = False,
suffix: str | None = None,
) -> None: ...
def mark_expected_failures_and_skips(self) -> None: ...
def sql_table_creation_suffix(self) -> str: ...
def test_db_signature(self) -> tuple[str, str, str, str]: ...
def setup_worker_connection(self, _worker_id: int) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/base/features.pyi 0000664 0000000 0000000 00000015573 15260643574 0027072 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from typing import Any
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models.base import Model
from django.db.utils import DatabaseError, DataError
from django.utils.functional import cached_property
class BaseDatabaseFeatures:
minimum_database_version: tuple[int, ...] | None
gis_enabled: bool
allows_group_by_lob: bool
allows_group_by_selected_pks: bool
allows_group_by_select_index: bool
empty_fetchmany_value: Sequence[Any]
update_can_self_select: bool
delete_can_self_reference_subquery: bool
interprets_empty_strings_as_nulls: bool
supports_nullable_unique_constraints: bool
supports_partially_nullable_unique_constraints: bool
supports_deferrable_unique_constraints: bool
can_use_chunked_reads: bool
can_return_columns_from_insert: bool
can_return_rows_from_bulk_insert: bool
can_return_rows_from_update: bool
has_bulk_insert: bool
uses_savepoints: bool
can_release_savepoints: bool
related_fields_match_type: bool
allow_sliced_subqueries_with_in: bool
has_select_for_update: bool
has_select_for_update_nowait: bool
has_select_for_update_skip_locked: bool
has_select_for_update_of: bool
has_select_for_no_key_update: bool
select_for_update_of_column: bool
test_db_allows_multiple_connections: bool
supports_unspecified_pk: bool
supports_forward_references: bool
truncates_names: bool
has_real_datatype: bool
supports_subqueries_in_group_by: bool
ignores_unnecessary_order_by_in_subqueries: bool
has_native_boolean_field: bool
has_native_uuid_field: bool
has_native_duration_field: bool
supports_temporal_subtraction: bool
supports_regex_backreferencing: bool
supports_date_lookup_using_string: bool
supports_timezones: bool
has_zoneinfo_database: bool
requires_explicit_null_ordering_when_grouping: bool
nulls_order_largest: bool
supports_order_by_nulls_modifier: bool
order_by_nulls_first: bool
max_query_params: int | None
allows_auto_pk_0: bool
can_defer_constraint_checks: bool
supports_tablespaces: bool
supports_sequence_reset: bool
can_introspect_default: bool
can_introspect_foreign_keys: bool
introspected_field_types: dict[str, str]
supports_index_column_ordering: bool
can_introspect_materialized_views: bool
can_distinct_on_fields: bool
atomic_transactions: bool
can_rollback_ddl: bool
schema_editor_uses_clientside_param_binding: bool
supports_combined_alters: bool
supports_foreign_keys: bool
can_create_inline_fk: bool
can_rename_index: bool
indexes_foreign_keys: bool
supports_column_check_constraints: bool
supports_table_check_constraints: bool
can_introspect_check_constraints: bool
supports_paramstyle_pyformat: bool
requires_literal_defaults: bool
supports_expression_defaults: bool
supports_default_keyword_in_insert: bool
supports_default_keyword_in_bulk_insert: bool
connection_persists_old_columns: bool
closed_cursor_error_class: type[DatabaseError]
has_case_insensitive_like: bool
bare_select_suffix: str
implied_column_null: bool
supports_select_for_update_with_limit: bool
greatest_least_ignores_nulls: bool
can_clone_databases: bool
ignores_table_name_case: bool
for_update_after_from: bool
supports_select_union: bool
supports_select_intersection: bool
supports_select_difference: bool
supports_slicing_ordering_in_compound: bool
supports_parentheses_in_compound: bool
supports_nulls_distinct_unique_constraints: bool
requires_compound_order_by_subquery: bool
supports_aggregate_filter_clause: bool
supports_aggregate_order_by_clause: bool
supports_aggregate_distinct_multiple_argument: bool
supports_any_value: bool
supports_bit_aggregations: bool
supports_default_in_bit_aggregations: bool
supports_index_on_text_field: bool
supports_over_clause: bool
supports_frame_range_fixed_distance: bool
supports_frame_exclusion: bool
only_supports_unbounded_with_preceding_and_following: bool
supports_cast_with_precision: bool
time_cast_precision: int
create_test_procedure_without_params_sql: str | None
create_test_procedure_with_int_param_sql: str | None
supports_callproc_kwargs: bool
supported_explain_formats: set[str]
supports_default_in_lead_lag: bool
supports_ignore_conflicts: bool
supports_update_conflicts: bool
supports_update_conflicts_with_target: bool
requires_casted_case_in_updates: bool
supports_partial_indexes: bool
supports_functions_in_partial_indexes: bool
supports_covering_indexes: bool
supports_expression_indexes: bool
collate_as_index_expression: bool
allows_multiple_constraints_on_same_fields: bool
supports_comparing_boolean_expr: bool
supports_json_field: bool
can_introspect_json_field: bool
supports_primitives_in_json_field: bool
has_native_json_field: bool
has_json_operators: bool
supports_json_field_contains: bool
json_key_contains_list_matching_requires_list: bool
has_json_object_function: bool
supports_json_negative_indexing: bool
supports_collation_on_charfield: bool
supports_collation_on_textfield: bool
supports_non_deterministic_collations: bool
supports_comments: bool
supports_comments_inline: bool
supports_stored_generated_columns: bool
supports_virtual_generated_columns: bool
supports_alter_generated_column_data_type: bool
supports_logical_xor: bool
prohibits_null_characters_in_text_exception: tuple[ValueError | DataError] | None
supports_unlimited_charfield: bool
supports_tuple_comparison_against_subquery: bool
rounds_to_even: bool
pattern_lookup_needs_param_pattern: bool
supports_no_precision_decimalfield: bool
supports_tuple_lookups: bool
supports_on_delete_db_cascade: bool
supports_on_delete_db_default: bool
supports_on_delete_db_null: bool
supports_inspectdb: bool
test_collations: dict[str, str | None]
test_now_utc_template: str | None
insert_test_table_with_defaults: str | None
django_test_expected_failures: set[str]
django_test_skips: dict[str, set[str]]
disallowed_simple_test_case_connection_methods: list[tuple[str, str]]
supports_uuid4_function: bool
supports_uuid4_function_in_default: bool
supports_uuid7_function: bool
supports_uuid7_function_shift: bool
connection: BaseDatabaseWrapper
def __init__(self, connection: BaseDatabaseWrapper) -> None: ...
def __del__(self) -> None: ...
@cached_property
def supports_explaining_query_execution(self) -> bool: ...
@cached_property
def supports_transactions(self) -> bool: ...
@cached_property
def supports_boolean_expr_in_select_clause(self) -> bool: ...
def allows_group_by_selected_pks_on_model(self, model: type[Model]) -> bool: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/base/introspection.pyi 0000664 0000000 0000000 00000005172 15260643574 0030146 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable
from typing import Any, Literal, NamedTuple, NotRequired, type_check_only
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.backends.utils import CursorWrapper
from django.db.models.base import Model
from django.db.models.deletion import DatabaseOnDelete, _Collector
from django.db.models.fields import Field
from typing_extensions import TypedDict
class TableInfo(NamedTuple):
name: str
type: str
class FieldInfo(NamedTuple):
name: str
type_code: int
display_size: int
internal_size: int
precision: int
scale: int
null_ok: bool
default: str
collation: str
@type_check_only
class _ConstraintDict(TypedDict):
columns: list[str]
primary_key: bool
unique: bool
foreign_key: tuple[str, str] | None
check: bool
index: bool
orders: NotRequired[list[Literal["ASC", "DESC"]]]
type: NotRequired[str]
definition: NotRequired[str | None]
options: NotRequired[dict[str, str] | None]
@type_check_only
class _SequenceDict(TypedDict):
table: str
column: str
name: NotRequired[str]
class BaseDatabaseIntrospection:
data_types_reverse: Any
on_delete_types: dict[str, _Collector | DatabaseOnDelete]
connection: BaseDatabaseWrapper
def __init__(self, connection: BaseDatabaseWrapper) -> None: ...
def __del__(self) -> None: ...
def get_field_type(self, data_type: str, description: FieldInfo) -> str: ...
def identifier_converter(self, name: str) -> str: ...
def table_names(self, cursor: CursorWrapper | None = None, include_views: bool = False) -> list[str]: ...
def get_table_list(self, cursor: CursorWrapper) -> list[TableInfo]: ...
def get_table_description(self, cursor: CursorWrapper, table_name: str) -> list[Any]: ...
def get_migratable_models(self) -> Iterable[type[Model]]: ...
def django_table_names(self, only_existing: bool = False, include_views: bool = True) -> list[str]: ...
def installed_models(self, tables: list[str]) -> set[type[Model]]: ...
def sequence_list(self) -> list[dict[str, str]]: ...
def get_sequences(
self, cursor: CursorWrapper, table_name: str, table_fields: Iterable[Field[Any, Any]] = ()
) -> list[_SequenceDict]: ...
def get_relations(self, cursor: CursorWrapper, table_name: str) -> dict[str, tuple[str, str]]: ...
def get_primary_key_column(self, cursor: CursorWrapper, table_name: str) -> str | None: ...
def get_primary_key_columns(self, cursor: CursorWrapper, table_name: str) -> list[str] | None: ...
def get_constraints(self, cursor: CursorWrapper, table_name: str) -> dict[str, _ConstraintDict]: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/base/operations.pyi 0000664 0000000 0000000 00000017540 15260643574 0027433 0 ustar 00root root 0000000 0000000 import json
from collections.abc import Iterable, Sequence
from datetime import date, time, timedelta
from datetime import datetime as real_datetime
from decimal import Decimal
from typing import Any
from django.core.management.color import Style
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.backends.utils import CursorWrapper
from django.db.models.base import Model
from django.db.models.constants import OnConflict
from django.db.models.expressions import Case, Col, Expression
from django.db.models.fields import Field
from django.db.models.sql.compiler import SQLCompiler
class BaseDatabaseOperations:
compiler_module: str
integer_field_ranges: dict[str, tuple[int, int]]
set_operators: dict[str, str]
cast_data_types: dict[Any, Any]
cast_char_field_without_max_length: Any
PRECEDING: str
FOLLOWING: str
UNBOUNDED_PRECEDING: str
UNBOUNDED_FOLLOWING: str
CURRENT_ROW: str
explain_prefix: str | None
connection: BaseDatabaseWrapper
def __init__(self, connection: BaseDatabaseWrapper) -> None: ...
def __del__(self) -> None: ...
def autoinc_sql(self, table: str, column: str) -> str | None: ...
def bulk_batch_size(self, fields: Any, objs: Any) -> int: ...
def format_for_duration_arithmetic(self, sql: str) -> str: ...
def cache_key_culling_sql(self) -> str: ...
def unification_cast_sql(self, output_field: Field[Any, Any]) -> str: ...
def date_extract_sql(self, lookup_type: str, sql: Any, params: Any) -> tuple[str, Any]: ...
# def date_interval_sql(self, timedelta: None) -> Any: ...
def date_trunc_sql(self, lookup_type: str, sql: str, params: Any, tzname: str | None = None) -> tuple[str, Any]: ...
def datetime_cast_date_sql(self, sql: str, params: Any, tzname: str | None) -> tuple[str, Any]: ...
def datetime_cast_time_sql(self, sql: str, params: Any, tzname: str | None) -> tuple[str, Any]: ...
def datetime_extract_sql(self, lookup_type: str, sql: str, params: Any, tzname: str | None) -> tuple[str, Any]: ...
def datetime_trunc_sql(self, lookup_type: str, sql: str, params: Any, tzname: str | None) -> str: ...
def time_trunc_sql(self, lookup_type: str, sql: str, params: Any, tzname: str | None = None) -> str: ...
def time_extract_sql(self, lookup_type: str, sql: str, params: Any) -> str: ...
def deferrable_sql(self) -> str: ...
def distinct_sql(self, fields: list[str], params: list[Any] | None) -> tuple[list[str], list[str]]: ...
def force_group_by(self) -> list[str]: ...
def force_no_ordering(self) -> list[Any]: ...
def for_update_sql(
self, nowait: bool = False, skip_locked: bool = False, of: Any = (), no_key: bool = False
) -> str: ...
def limit_offset_sql(self, low_mark: int, high_mark: int | None) -> str: ...
def fk_on_delete_sql(self, operation: str) -> str: ...
def bulk_insert_sql(self, fields: Iterable[Field[Any, Any]], placeholder_rows: Iterable[str]) -> str: ...
def last_executed_query(self, cursor: Any, sql: Any, params: Any) -> str: ...
def last_insert_id(self, cursor: CursorWrapper, table_name: str, pk_name: str) -> int: ...
def lookup_cast(self, lookup_type: str, internal_type: str | None = None) -> str: ...
def max_in_list_size(self) -> int | None: ...
def max_name_length(self) -> int | None: ...
def no_limit_value(self) -> str | None: ...
def pk_default_value(self) -> str: ...
def prepare_sql_script(self, sql: Any) -> list[str]: ...
def process_clob(self, value: str) -> str: ...
def returning_columns(self, fields: Iterable[Field[Any, Any]]) -> tuple[str, tuple[()]]: ...
def fetch_returned_rows(self, cursor: CursorWrapper, returning_params: tuple[()]) -> list[tuple[Any, ...]]: ...
def compiler(self, compiler_name: str) -> type[SQLCompiler]: ...
def quote_name(self, name: str) -> str: ...
def regex_lookup(self, lookup_type: str) -> str: ...
def savepoint_create_sql(self, sid: str) -> str: ...
def savepoint_commit_sql(self, sid: str) -> str: ...
def savepoint_rollback_sql(self, sid: str) -> str: ...
def set_time_zone_sql(self) -> str: ...
def sql_flush(
self, style: Style, tables: Sequence[str], *, reset_sequences: bool = False, allow_cascade: bool = False
) -> list[str]: ...
def execute_sql_flush(self, sql_list: Iterable[str]) -> None: ...
def sequence_reset_by_name_sql(self, style: Style, sequences: list[Any]) -> list[Any]: ...
def sequence_reset_sql(self, style: Style, model_list: Sequence[type[Model]]) -> list[Any]: ...
def start_transaction_sql(self) -> str: ...
def end_transaction_sql(self, success: bool = True) -> str: ...
def tablespace_sql(self, tablespace: str | None, inline: bool = False) -> str: ...
def prep_for_like_query(self, x: str) -> str: ...
prep_for_iexact_query: Any
def validate_autopk_value(self, value: int) -> int: ...
def adapt_unknown_value(self, value: Any) -> Any: ...
def adapt_integerfield_value(self, value: Any, internal_type: Any) -> Any: ...
def adapt_datefield_value(self, value: date | None) -> str | None: ...
def adapt_datetimefield_value(self, value: real_datetime | None) -> str | None: ...
def adapt_durationfield_value(self, value: timedelta | None) -> int | None: ...
def adapt_timefield_value(self, value: real_datetime | time | None) -> str | None: ...
def adapt_decimalfield_value(
self, value: Decimal | None, max_digits: int | None = None, decimal_places: int | None = None
) -> str | None: ...
def adapt_ipaddressfield_value(self, value: str | None) -> str | None: ...
def adapt_json_value(self, value: Any, encoder: type[json.JSONEncoder] | None) -> str: ...
def year_lookup_bounds_for_date_field(self, value: int, iso_year: bool = False) -> list[str]: ...
def year_lookup_bounds_for_datetime_field(self, value: int, iso_year: bool = False) -> list[str]: ...
def get_db_converters(self, expression: Expression) -> list[Any]: ...
def convert_durationfield_value(
self, value: float | None, expression: Expression, connection: BaseDatabaseWrapper
) -> timedelta | None: ...
def convert_trunc_expression(
self, value: real_datetime | None, expression: Expression
) -> real_datetime | date | time | None: ...
def check_expression_support(self, expression: Any) -> None: ...
def conditional_expression_supported_in_where_clause(self, expression: Any) -> bool: ...
def combine_expression(self, connector: str, sub_expressions: list[str]) -> str: ...
def combine_duration_expression(self, connector: Any, sub_expressions: Any) -> str: ...
def binary_placeholder_sql(self, value: Case | None, compiler: SQLCompiler) -> str: ...
def modify_insert_params(self, placeholder: str, params: Any) -> Any: ...
def integer_field_range(self, internal_type: Any) -> tuple[int, int]: ...
def subtract_temporals(self, internal_type: Any, lhs: Any, rhs: Any) -> tuple[str, tuple[Any, ...]]: ...
def window_frame_value(self, value: int | None) -> str: ...
def window_frame_rows_start_end(self, start: int | None = None, end: int | None = None) -> tuple[str, str]: ...
def window_frame_range_start_end(self, start: int | None = None, end: int | None = None) -> tuple[str, str]: ...
def explain_query_prefix(self, format: str | None = None, **options: Any) -> str: ...
def insert_statement(self, on_conflict: OnConflict | None = None) -> str: ...
def on_conflict_suffix_sql(
self, fields: Any, on_conflict: Any, update_fields: Any, unique_fields: Any
) -> str | Any: ...
def prepare_join_on_clause(
self, lhs_table: str, lhs_field: Field[Any, Any], rhs_table: str, rhs_field: Field[Any, Any]
) -> tuple[Col, Col]: ...
def format_debug_sql(self, sql: str) -> str: ...
def format_json_path_numeric_index(self, num: int) -> str: ...
def compile_json_path(self, key_transforms: Iterable[str], include_root: bool = True) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/base/schema.pyi 0000664 0000000 0000000 00000011135 15260643574 0026502 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from contextlib import AbstractContextManager
from logging import Logger
from types import TracebackType
from typing import Any, Self
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.backends.ddl_references import Statement
from django.db.models.base import Model
from django.db.models.constraints import BaseConstraint
from django.db.models.fields import Field
from django.db.models.indexes import Index
from django.db.models.sql.compiler import _AsSqlType
from typing_extensions import override
logger: Logger
class BaseDatabaseSchemaEditor(AbstractContextManager[Any]):
sql_create_table: str
sql_rename_table: str
sql_retablespace_table: str
sql_delete_table: str
sql_create_column: str
sql_alter_column: str
sql_alter_column_type: str
sql_alter_column_null: str
sql_alter_column_not_null: str
sql_alter_column_default: str
sql_alter_column_no_default: str
sql_alter_column_no_default_null: str
sql_delete_column: str
sql_rename_column: str
sql_update_with_default: str
sql_unique_constraint: str
sql_check_constraint: str
sql_delete_constraint: str
sql_constraint: str
sql_create_check: str
sql_delete_check: str
sql_create_unique: str
sql_delete_unique: str
sql_create_fk: str
sql_create_inline_fk: str | None
sql_create_column_inline_fk: str | None
sql_delete_fk: str
sql_create_index: str
sql_create_unique_index: str
sql_rename_index: str
sql_delete_index: str
sql_create_pk: str
sql_delete_pk: str
sql_pk_constraint: str
sql_delete_procedure: str
sql_alter_table_comment: str
sql_alter_column_comment: str
connection: BaseDatabaseWrapper
collect_sql: bool
collected_sql: Any
atomic_migration: Any
def __init__(self, connection: BaseDatabaseWrapper, collect_sql: bool = False, atomic: bool = True) -> None: ...
deferred_sql: Any
atomic: Any
@override
def __enter__(self) -> Self: ...
@override
def __exit__(
self,
exc_type: type[BaseException] | None,
exc_value: BaseException | None,
traceback: TracebackType | None,
) -> None: ...
def execute(self, sql: Statement | str, params: Sequence[Any] | None = ()) -> None: ...
def quote_name(self, name: str) -> str: ...
def table_sql(self, model: type[Model]) -> tuple[str, list[Any]]: ...
def column_sql(
self, model: type[Model], field: Field[Any, Any], include_default: bool = False
) -> tuple[None, None] | tuple[str, list[Any]]: ...
def skip_default(self, field: Field[Any, Any]) -> bool: ...
def skip_default_on_alter(self, field: Field[Any, Any]) -> bool: ...
def prepare_default(self, value: Any) -> Any: ...
def db_default_sql(self, field: Field[Any, Any]) -> _AsSqlType: ...
def effective_default(self, field: Field[Any, Any]) -> int | str: ...
def quote_value(self, value: Any) -> str: ...
def create_model(self, model: type[Model]) -> None: ...
def delete_model(self, model: type[Model]) -> None: ...
def add_index(self, model: type[Model], index: Index) -> None: ...
def remove_index(self, model: type[Model], index: Index) -> None: ...
def rename_index(self, model: type[Model], old_index: Index, new_index: Index) -> None: ...
def add_constraint(self, model: type[Model], constraint: BaseConstraint) -> None: ...
def remove_constraint(self, model: type[Model], constraint: BaseConstraint) -> None: ...
def alter_unique_together(
self,
model: type[Model],
old_unique_together: Sequence[Sequence[str]],
new_unique_together: Sequence[Sequence[str]],
) -> None: ...
def alter_index_together(
self,
model: type[Model],
old_index_together: Sequence[Sequence[str]],
new_index_together: Sequence[Sequence[str]],
) -> None: ...
def alter_db_table(self, model: type[Model], old_db_table: str, new_db_table: str) -> None: ...
def alter_db_table_comment(
self, model: type[Model], old_db_table_comment: str, new_db_table_comment: str
) -> None: ...
def alter_db_tablespace(self, model: type[Model], old_db_tablespace: str, new_db_tablespace: str) -> None: ...
def add_field(self, model: type[Model], field: Field[Any, Any]) -> None: ...
def remove_field(self, model: type[Model], field: Field[Any, Any]) -> None: ...
def alter_field(
self, model: type[Model], old_field: Field[Any, Any], new_field: Field[Any, Any], strict: bool = False
) -> None: ...
def remove_procedure(self, procedure_name: Any, param_types: Any = ()) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/base/validation.pyi 0000664 0000000 0000000 00000000771 15260643574 0027400 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.checks.messages import CheckMessage
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models.fields import Field
class BaseDatabaseValidation:
connection: BaseDatabaseWrapper
def __init__(self, connection: BaseDatabaseWrapper) -> None: ...
def __del__(self) -> None: ...
def check(self, **kwargs: Any) -> list[CheckMessage]: ...
def check_field(self, field: Field[Any, Any], **kwargs: Any) -> list[CheckMessage]: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/ddl_references.pyi 0000664 0000000 0000000 00000007023 15260643574 0027275 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from typing import Any, Protocol, type_check_only
from typing_extensions import override
@type_check_only
class _QuoteCallable(Protocol):
def __call__(self, column: str, /) -> str: ...
class Reference:
def references_table(self, table: Any) -> bool: ...
def references_column(self, table: Any, column: Any) -> bool: ...
def references_index(self, table: Any, index: Any) -> bool: ...
def rename_table_references(self, old_table: Any, new_table: Any) -> None: ...
def rename_column_references(self, table: Any, old_column: Any, new_column: Any) -> None: ...
class Table(Reference):
table: str
quote_name: _QuoteCallable
def __init__(self, table: str, quote_name: _QuoteCallable) -> None: ...
@override
def references_table(self, table: str) -> bool: ...
@override
def references_index(self, table: Any, index: Any) -> bool: ...
@override
def rename_table_references(self, old_table: str, new_table: str) -> None: ...
class TableColumns(Table):
table: str
columns: list[str]
def __init__(self, table: str, columns: list[str]) -> None: ...
@override
def references_column(self, table: str, column: str) -> bool: ...
@override
def rename_column_references(self, table: str, old_column: str, new_column: str) -> None: ...
class Columns(TableColumns):
quote_name: _QuoteCallable
col_suffixes: Sequence[str]
def __init__(
self, table: str, columns: list[str], quote_name: _QuoteCallable, col_suffixes: Sequence[str] = ()
) -> None: ...
@type_check_only
class _NameCallable(Protocol):
def __call__(self, table: str, columns: list[str], suffix: str, /) -> str: ...
class IndexName(TableColumns):
suffix: str
create_index_name: _NameCallable
def __init__(self, table: str, columns: list[str], suffix: str, create_index_name: _NameCallable) -> None: ...
class IndexColumns(Columns):
opclasses: Any
def __init__(
self, table: Any, columns: Any, quote_name: Any, col_suffixes: Any = (), opclasses: Any = ()
) -> None: ...
class ForeignKeyName(TableColumns):
to_reference: TableColumns
suffix_template: str
create_fk_name: _NameCallable
def __init__(
self,
from_table: str,
from_columns: list[str],
to_table: str,
to_columns: list[str],
suffix_template: str,
create_fk_name: _NameCallable,
) -> None: ...
@override
def references_table(self, table: str) -> bool: ...
@override
def references_column(self, table: str, column: str) -> bool: ...
@override
def rename_table_references(self, old_table: str, new_table: str) -> None: ...
@override
def rename_column_references(self, table: str, old_column: str, new_column: str) -> None: ...
class Expressions(TableColumns):
compiler: Any
expressions: Any
quote_value: Any
def __init__(self, table: str, expressions: Any, compiler: Any, quote_value: Any) -> None: ...
class Statement(Reference):
template: str
parts: dict[str, Table]
def __init__(self, template: str, **parts: Any) -> None: ...
@override
def references_table(self, table: str) -> bool: ...
@override
def references_column(self, table: str, column: str) -> bool: ...
@override
def references_index(self, table: Any, index: Any) -> bool: ...
@override
def rename_table_references(self, old_table: str, new_table: str) -> None: ...
@override
def rename_column_references(self, table: str, old_column: str, new_column: str) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/dummy/ 0000775 0000000 0000000 00000000000 15260643574 0024737 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/db/backends/dummy/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0027207 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/db/backends/dummy/base.pyi 0000664 0000000 0000000 00000001634 15260643574 0026400 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.backends.base.client import BaseDatabaseClient
from django.db.backends.base.creation import BaseDatabaseCreation
from django.db.backends.base.introspection import BaseDatabaseIntrospection
from django.db.backends.base.operations import BaseDatabaseOperations
def complain(*args: Any, **kwargs: Any) -> Any: ...
def ignore(*args: Any, **kwargs: Any) -> None: ...
class DatabaseOperations(BaseDatabaseOperations):
quote_name: Any
class DatabaseClient(BaseDatabaseClient): ...
class DatabaseCreation(BaseDatabaseCreation):
create_test_db: Any
destroy_test_db: Any
class DatabaseIntrospection(BaseDatabaseIntrospection):
get_table_list: Any
get_table_description: Any
get_relations: Any
get_indexes: Any
class DatabaseWrapper(BaseDatabaseWrapper):
operators: Any
ensure_connection: Any
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/dummy/features.pyi 0000664 0000000 0000000 00000000260 15260643574 0027276 0 ustar 00root root 0000000 0000000 from django.db.backends.base.features import BaseDatabaseFeatures
class DummyDatabaseFeatures(BaseDatabaseFeatures):
supports_transactions: bool
uses_savepoints: bool
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/mysql/ 0000775 0000000 0000000 00000000000 15260643574 0024751 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/db/backends/mysql/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0027221 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/db/backends/mysql/base.pyi 0000664 0000000 0000000 00000005216 15260643574 0026412 0 ustar 00root root 0000000 0000000 from collections.abc import Container, Iterator
from re import Pattern
from typing import Any, Literal
from django.db.backends.base.base import BaseDatabaseWrapper
from typing_extensions import override
from .client import DatabaseClient
from .creation import DatabaseCreation
from .features import DatabaseFeatures
from .introspection import DatabaseIntrospection
from .operations import DatabaseOperations
from .validation import DatabaseValidation
version: Any
django_conversions: Any
server_version_re: Pattern[str]
class CursorWrapper:
codes_for_integrityerror: Any
cursor: Any
def __init__(self, cursor: Any) -> None: ...
def execute(self, query: Any, args: Any | None = ...) -> Any: ...
def executemany(self, query: Any, args: Any) -> Any: ...
def __getattr__(self, attr: Any) -> Any: ...
def __iter__(self) -> Iterator[Any]: ...
class DatabaseWrapper(BaseDatabaseWrapper):
client: DatabaseClient
creation: DatabaseCreation
features: DatabaseFeatures
introspection: DatabaseIntrospection
validation: DatabaseValidation
ops: DatabaseOperations
client_class: type[DatabaseClient]
creation_class: type[DatabaseCreation]
features_class: type[DatabaseFeatures]
introspection_class: type[DatabaseIntrospection]
ops_class: type[DatabaseOperations]
validation_class: type[DatabaseValidation]
vendor: str
data_types: Any
operators: Any
pattern_esc: str
pattern_ops: Any
isolation_levels: Any
Database: Any
SchemaEditorClass: Any
isolation_level: Any
@override
def get_connection_params(self) -> dict[str, Any]: ...
@override
def get_new_connection(self, conn_params: Any) -> Any: ...
@override
def init_connection_state(self) -> None: ...
@override
def create_cursor(self, name: Any | None = ...) -> CursorWrapper: ...
@override
def disable_constraint_checking(self) -> Literal[True]: ...
needs_rollback: Any
@override
def enable_constraint_checking(self) -> None: ...
@override
def check_constraints(self, table_names: Any | None = ...) -> None: ...
@override
def is_usable(self) -> bool: ...
@property
@override
def display_name(self) -> str: ... # type: ignore[override]
@property
@override
def data_type_check_constraints(self) -> dict[str, str]: ... # type: ignore[override]
@property
def mysql_server_data(self) -> dict[str, Any]: ...
@property
def mysql_server_info(self) -> str: ...
@property
def mysql_version(self) -> tuple[int, ...]: ...
@property
def mysql_is_mariadb(self) -> bool: ...
@property
def sql_mode(self) -> Container[str]: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/mysql/client.pyi 0000664 0000000 0000000 00000001016 15260643574 0026750 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable
from typing import Any
from django.db.backends.base.client import BaseDatabaseClient
from django.db.backends.mysql.base import DatabaseWrapper
from typing_extensions import override
class DatabaseClient(BaseDatabaseClient):
connection: DatabaseWrapper
executable_name: str
@classmethod
@override
def settings_to_cmd_args_env(
cls,
settings_dict: dict[str, Any],
parameters: Iterable[str],
) -> tuple[list[str], dict[str, str] | None]: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/mysql/compiler.pyi 0000664 0000000 0000000 00000001420 15260643574 0027303 0 ustar 00root root 0000000 0000000 from django.db.models.sql import compiler
from django.db.models.sql.compiler import _AsSqlType
from typing_extensions import override
class SQLCompiler(compiler.SQLCompiler): ...
class SQLInsertCompiler(compiler.SQLInsertCompiler, SQLCompiler): ...
class SQLDeleteCompiler(compiler.SQLDeleteCompiler, SQLCompiler):
# https://github.com/django/django/blob/242499f2dc2bf24a9a5c855690a2e13d3303581a/django/db/backends/mysql/compiler.py#L26
@override
def as_sql(self) -> _AsSqlType: ... # type: ignore[override]
class SQLUpdateCompiler(compiler.SQLUpdateCompiler, SQLCompiler): ...
class SQLAggregateCompiler(compiler.SQLAggregateCompiler, SQLCompiler): ...
__all__ = ["SQLAggregateCompiler", "SQLCompiler", "SQLDeleteCompiler", "SQLInsertCompiler", "SQLUpdateCompiler"]
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/mysql/creation.pyi 0000664 0000000 0000000 00000000464 15260643574 0027304 0 ustar 00root root 0000000 0000000 from django.db.backends.base.creation import BaseDatabaseCreation
from django.db.backends.mysql.base import DatabaseWrapper
from typing_extensions import override
class DatabaseCreation(BaseDatabaseCreation):
connection: DatabaseWrapper
@override
def sql_table_creation_suffix(self) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/mysql/features.pyi 0000664 0000000 0000000 00000011457 15260643574 0027322 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.base.features import BaseDatabaseFeatures
from django.db.backends.mysql.base import DatabaseWrapper
from django.utils.functional import cached_property
from typing_extensions import override
class DatabaseFeatures(BaseDatabaseFeatures):
connection: DatabaseWrapper
empty_fetchmany_value: Any
related_fields_match_type: bool
allow_sliced_subqueries_with_in: bool
has_select_for_update: bool
has_select_for_update_nowait: bool
has_select_for_update_skip_locked: bool
supports_forward_references: bool
supports_regex_backreferencing: bool
supports_date_lookup_using_string: bool
supports_timezones: bool
requires_explicit_null_ordering_when_grouping: bool
atomic_transactions: bool
can_clone_databases: bool
supports_temporal_subtraction: bool
supports_slicing_ordering_in_compound: bool
supports_index_on_text_field: bool
supports_over_clause: bool
supports_frame_range_fixed_distance: bool
create_test_procedure_without_params_sql: str
create_test_procedure_with_int_param_sql: str
supports_partial_indexes: bool
supports_order_by_nulls_modifier: bool
order_by_nulls_first: bool
supports_aggregate_order_by_clause: bool
supports_json_negative_indexing: bool
@cached_property
@override
def minimum_database_version(self) -> tuple[int, ...]: ... # type: ignore[override]
@cached_property
@override
def test_collations(self) -> dict[str, str]: ... # type: ignore[override]
@cached_property
@override
def django_test_skips(self) -> dict[str, set[str]]: ... # type: ignore[override]
@cached_property
@override
def allows_auto_pk_0(self) -> bool: ... # type: ignore[override]
@cached_property
@override
def update_can_self_select(self) -> bool: ... # type: ignore[override]
@cached_property
@override
def can_introspect_foreign_keys(self) -> bool: ... # type: ignore[override]
@cached_property
@override
def introspected_field_types(self) -> dict[str, str]: ... # type: ignore[override]
@cached_property
@override
def can_return_columns_from_insert(self) -> bool: ... # type: ignore[override]
@property
@override
def can_return_rows_from_bulk_insert(self) -> bool: ... # type: ignore[override]
@cached_property
@override
def has_zoneinfo_database(self) -> bool: ... # type: ignore[override]
@cached_property
def is_sql_auto_is_null_enabled(self) -> bool: ...
@cached_property
@override
def supports_column_check_constraints(self) -> bool: ... # type: ignore[override]
@property
@override
def supports_table_check_constraints(self) -> bool: ... # type: ignore[override]
@cached_property
@override
def can_introspect_check_constraints(self) -> bool: ... # type: ignore[override]
@cached_property
@override
def has_select_for_update_of(self) -> bool: ... # type: ignore[override]
@cached_property
@override
def supported_explain_formats(self) -> set[str]: ... # type: ignore[override]
@cached_property
@override
def supports_transactions(self) -> bool: ...
@cached_property
@override
def ignores_table_name_case(self) -> bool: ... # type: ignore[override]
@cached_property
@override
def supports_default_in_lead_lag(self) -> bool: ... # type: ignore[override]
@property
@override
def supports_json_field(self) -> bool: ... # type: ignore[override]
@cached_property
@override
def can_introspect_json_field(self) -> bool: ... # type: ignore[override]
@cached_property
@override
def supports_index_column_ordering(self) -> bool: ... # type: ignore[override]
@cached_property
@override
def supports_expression_indexes(self) -> bool: ... # type: ignore[override]
@cached_property
@override
def supports_select_intersection(self) -> bool: ... # type: ignore[override]
@property
@override
def supports_select_difference(self) -> bool: ... # type: ignore[override]
@cached_property
@override
def supports_expression_defaults(self) -> bool: ... # type: ignore[override]
@cached_property
@override
def has_native_uuid_field(self) -> bool: ... # type: ignore[override]
@cached_property
@override
def allows_group_by_selected_pks(self) -> bool: ... # type: ignore[override]
@cached_property
@override
def supports_any_value(self) -> bool: ... # type: ignore[override]
@cached_property
@override
def supports_uuid4_function(self) -> bool: ... # type: ignore[override]
@property
@override
def supports_uuid4_function_in_default(self) -> bool: ... # type: ignore[override]
@cached_property
@override
def supports_uuid7_function(self) -> bool: ... # type: ignore[override]
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/mysql/introspection.pyi 0000664 0000000 0000000 00000001615 15260643574 0030377 0 ustar 00root root 0000000 0000000 from typing import Any, NamedTuple
from django.db.backends.base.introspection import BaseDatabaseIntrospection
from django.db.backends.mysql.base import DatabaseWrapper
from django.db.backends.utils import CursorWrapper
from typing_extensions import override
FieldInfo: Any
class InfoLine(NamedTuple):
col_name: str
data_type: str
max_len: int | None
num_prec: int | None
num_scale: int | None
extra: str
column_default: str | None
collation: str | None
is_unsigned: bool
comment: str
class TableInfo(NamedTuple):
name: str
type: str
comment: str
class DatabaseIntrospection(BaseDatabaseIntrospection):
connection: DatabaseWrapper
data_types_reverse: Any
def get_storage_engine(self, cursor: Any, table_name: str) -> str: ...
@override
def get_table_description(self, cursor: CursorWrapper, table_name: str) -> list[FieldInfo]: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/mysql/operations.pyi 0000664 0000000 0000000 00000006163 15260643574 0027665 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.management.color import Style
from django.db.backends.base.operations import BaseDatabaseOperations
from django.db.backends.mysql.base import DatabaseWrapper
from django.db.models.constants import OnConflict
from django.db.models.sql.compiler import SQLCompiler
from typing_extensions import override
class DatabaseOperations(BaseDatabaseOperations):
connection: DatabaseWrapper
compiler_module: str
integer_field_ranges: dict[str, tuple[int, int]]
cast_data_types: dict[str, str]
cast_char_field_without_max_length: str
explain_prefix: str
@override
def date_extract_sql(self, lookup_type: str, sql: str, params: Any) -> tuple[str, Any]: ...
@override
def date_trunc_sql(self, lookup_type: str, sql: str, params: Any, tzname: str | None = None) -> Any: ...
@override
def datetime_cast_date_sql(self, sql: str, params: Any, tzname: str | None) -> Any: ...
@override
def datetime_cast_time_sql(self, sql: str, params: Any, tzname: str | None) -> Any: ...
@override
def datetime_extract_sql(self, lookup_type: str, sql: str, params: Any, tzname: str | None) -> Any: ...
@override
def datetime_trunc_sql(self, lookup_type: str, sql: str, params: Any, tzname: str | None) -> Any: ...
@override
def time_trunc_sql(self, lookup_type: str, sql: str, params: Any, tzname: str | None = None) -> Any: ...
@override
def format_for_duration_arithmetic(self, sql: Any) -> Any: ...
@override
def force_no_ordering(self) -> Any: ...
@override
def last_executed_query(self, cursor: Any, sql: Any, params: Any) -> Any: ...
@override
def no_limit_value(self) -> Any: ...
@override
def quote_name(self, name: str) -> Any: ...
@override
def sequence_reset_by_name_sql(self, style: Style, sequences: Any) -> Any: ...
@override
def validate_autopk_value(self, value: Any) -> Any: ...
@override
def adapt_datetimefield_value(self, value: Any) -> Any: ...
@override
def adapt_timefield_value(self, value: Any) -> Any: ...
@override
def max_name_length(self) -> Any: ...
@override
def combine_expression(self, connector: Any, sub_expressions: Any) -> Any: ...
@override
def get_db_converters(self, expression: Any) -> Any: ...
def convert_booleanfield_value(self, value: Any, expression: Any, connection: Any) -> Any: ...
def convert_datetimefield_value(self, value: Any, expression: Any, connection: Any) -> Any: ...
def convert_uuidfield_value(self, value: Any, expression: Any, connection: Any) -> Any: ...
@override
def binary_placeholder_sql(self, value: Any, compiler: SQLCompiler) -> Any: ...
@override
def subtract_temporals(self, internal_type: Any, lhs: Any, rhs: Any) -> Any: ...
@override
def explain_query_prefix(self, format: Any | None = None, **options: Any) -> Any: ...
@override
def regex_lookup(self, lookup_type: str) -> Any: ...
@override
def insert_statement(self, on_conflict: OnConflict | None = None) -> str: ...
@override
def lookup_cast(self, lookup_type: str, internal_type: Any | None = None) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/mysql/schema.pyi 0000664 0000000 0000000 00000002244 15260643574 0026736 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.base.schema import BaseDatabaseSchemaEditor
from django.db.backends.mysql.base import DatabaseWrapper
from django.db.models.base import Model
from django.db.models.fields import Field
from typing_extensions import override
class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
connection: DatabaseWrapper
sql_rename_table: str
sql_alter_column_null: str
sql_alter_column_not_null: str
sql_alter_column_type: str
sql_delete_column: str
sql_delete_unique: str
sql_create_column_inline_fk: str
sql_delete_fk: str
sql_delete_index: str
sql_create_pk: str
sql_delete_pk: str
sql_create_index: str
sql_alter_column_comment: None # type: ignore[assignment]
@property
@override
def sql_delete_check(self) -> str: ... # type: ignore[override]
@property
@override
def sql_rename_column(self) -> str: ... # type: ignore[override]
@override
def quote_value(self, value: Any) -> str: ...
@override
def skip_default(self, field: Field[Any, Any]) -> bool: ...
@override
def add_field(self, model: type[Model], field: Field[Any, Any]) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/mysql/validation.pyi 0000664 0000000 0000000 00000001040 15260643574 0027621 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.checks.messages import CheckMessage
from django.db.backends.base.validation import BaseDatabaseValidation
from django.db.backends.mysql.base import DatabaseWrapper
from django.db.models.fields import Field
from typing_extensions import override
class DatabaseValidation(BaseDatabaseValidation):
connection: DatabaseWrapper
@override
def check(self, **kwargs: Any) -> list[CheckMessage]: ...
def check_field_type(self, field: Field[Any, Any], field_type: str) -> list[CheckMessage]: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/oracle/ 0000775 0000000 0000000 00000000000 15260643574 0025051 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/db/backends/oracle/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0027321 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/db/backends/oracle/base.pyi 0000664 0000000 0000000 00000006030 15260643574 0026505 0 ustar 00root root 0000000 0000000 from collections.abc import Iterator
from contextlib import AbstractContextManager
from typing import Any
from django.db.backends.base.base import BaseDatabaseWrapper
from django.utils.functional import cached_property
from typing_extensions import override
from .client import DatabaseClient
from .creation import DatabaseCreation
from .features import DatabaseFeatures
from .introspection import DatabaseIntrospection
from .operations import DatabaseOperations
from .validation import DatabaseValidation
def wrap_oracle_errors() -> AbstractContextManager[None]: ...
class _UninitializedOperatorsDescriptor:
def __get__(self, instance: Any, cls: Any | None = None) -> Any: ...
class DatabaseWrapper(BaseDatabaseWrapper):
client: DatabaseClient
creation: DatabaseCreation
features: DatabaseFeatures
introspection: DatabaseIntrospection
validation: DatabaseValidation
client_class: type[DatabaseClient]
creation_class: type[DatabaseCreation]
features_class: type[DatabaseFeatures]
introspection_class: type[DatabaseIntrospection]
ops_class: type[DatabaseOperations]
validation_class: type[DatabaseValidation]
vendor: str
display_name: str
data_types: Any
data_type_check_constraints: Any
operators: Any
pattern_esc: str
Database: Any
SchemaEditorClass: Any
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
@property
def is_pool(self) -> bool: ...
@property
def pool(self) -> Any: ...
def close_pool(self) -> None: ...
@override
def get_connection_params(self) -> Any: ...
@override
def get_new_connection(self, conn_params: Any) -> Any: ...
pattern_ops: Any
@override
def init_connection_state(self) -> None: ...
@override
def create_cursor(self, name: Any | None = None) -> Any: ...
@override
def check_constraints(self, table_names: Any | None = None) -> None: ...
@override
def is_usable(self) -> bool: ...
@cached_property
def oracle_version(self) -> tuple[int, ...]: ...
@cached_property
def oracledb_version(self) -> tuple[int, ...]: ...
class OracleParam:
force_bytes: Any
input_size: Any
def __init__(self, param: Any, cursor: Any, strings_only: bool = False) -> None: ...
class VariableWrapper:
var: Any
def __init__(self, var: Any) -> None: ...
def bind_parameter(self, cursor: Any) -> Any: ...
def __getattr__(self, key: Any) -> Any: ...
@override
def __setattr__(self, key: Any, value: Any) -> None: ...
class FormatStylePlaceholderCursor:
charset: str
cursor: Any
database: BaseDatabaseWrapper
def __init__(self, connection: Any, database: BaseDatabaseWrapper) -> None: ...
def execute(self, query: Any, params: Any | None = None) -> Any: ...
def executemany(self, query: Any, params: Any | None = None) -> Any: ...
def close(self) -> None: ...
def var(self, *args: Any) -> Any: ...
def arrayvar(self, *args: Any) -> Any: ...
def __getattr__(self, attr: Any) -> Any: ...
def __iter__(self) -> Iterator[Any]: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/oracle/client.pyi 0000664 0000000 0000000 00000001127 15260643574 0027053 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable
from typing import Any
from django.db.backends.base.client import BaseDatabaseClient
from django.db.backends.oracle.base import DatabaseWrapper
from typing_extensions import override
class DatabaseClient(BaseDatabaseClient):
connection: DatabaseWrapper
executable_name: str
wrapper_name: str
@staticmethod
def connect_string(settings_dict: dict[str, Any]) -> str: ...
@classmethod
@override
def settings_to_cmd_args_env(
cls, settings_dict: dict[str, Any], parameters: Iterable[str]
) -> tuple[list[str], None]: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/oracle/creation.pyi 0000664 0000000 0000000 00000001004 15260643574 0027373 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar
from django.db.backends.base.creation import BaseDatabaseCreation
from django.db.backends.oracle.base import DatabaseWrapper
from typing_extensions import override
TEST_DATABASE_PREFIX: str
class DatabaseCreation(BaseDatabaseCreation):
destroy_test_db_connection_close_method: ClassVar[str | None]
connection: DatabaseWrapper
@override
def set_as_test_mirror(self, primary_settings_dict: Any) -> None: ...
@override
def test_db_signature(self) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/oracle/features.pyi 0000664 0000000 0000000 00000007106 15260643574 0027416 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.base.features import BaseDatabaseFeatures
from django.db.backends.oracle.base import DatabaseWrapper
from django.utils.functional import cached_property
from typing_extensions import override
class DatabaseFeatures(BaseDatabaseFeatures):
connection: DatabaseWrapper
interprets_empty_strings_as_nulls: bool
has_select_for_update: bool
has_select_for_update_nowait: bool
has_select_for_update_skip_locked: bool
has_select_for_update_of: bool
select_for_update_of_column: bool
can_return_columns_from_insert: bool
supports_subqueries_in_group_by: bool
supports_transactions: bool
supports_timezones: bool
has_native_duration_field: bool
can_defer_constraint_checks: bool
supports_partially_nullable_unique_constraints: bool
supports_deferrable_unique_constraints: bool
truncates_names: bool
supports_tablespaces: bool
supports_sequence_reset: bool
can_introspect_materialized_views: bool
atomic_transactions: bool
nulls_order_largest: bool
requires_literal_defaults: bool
closed_cursor_error_class: Any
supports_select_for_update_with_limit: bool
supports_temporal_subtraction: bool
ignores_table_name_case: bool
supports_index_on_text_field: bool
create_test_procedure_without_params_sql: str
create_test_procedure_with_int_param_sql: str
supports_callproc_kwargs: bool
supports_over_clause: bool
supports_frame_range_fixed_distance: bool
supports_ignore_conflicts: bool
max_query_params: int
supports_partial_indexes: bool
supports_slicing_ordering_in_compound: bool
allows_multiple_constraints_on_same_fields: bool
supports_json_field_contains: bool
can_return_rows_from_update: bool
supports_aggregate_order_by_clause: bool
supports_any_value: bool
supports_tuple_comparison_against_subquery: bool
@cached_property
@override
def supports_json_negative_indexing(self) -> bool: ... # type: ignore[override]
@cached_property
@override
def django_test_skips(self) -> dict[str, set[str]]: ... # type: ignore[override]
@cached_property
@override
def introspected_field_types(self) -> dict[str, str]: ... # type: ignore[override]
@cached_property
@override
def test_collations(self) -> dict[str, str | None]: ... # type: ignore[override]
@cached_property
@override
def supports_collation_on_charfield(self) -> bool: ... # type: ignore[override]
@cached_property
@override
def supports_primitives_in_json_field(self) -> bool: ... # type: ignore[override]
@cached_property
@override
def supports_frame_exclusion(self) -> bool: ... # type: ignore[override]
@cached_property
@override
def supports_comparing_boolean_expr(self) -> bool: ... # type: ignore[override]
@cached_property
def supports_aggregation_over_interval_types(self) -> bool: ...
@cached_property
@override
def bare_select_suffix(self) -> str: ... # type: ignore[override]
@cached_property
@override
def supports_tuple_lookups(self) -> bool: ... # type: ignore[override]
@cached_property
@override
def supports_uuid4_function(self) -> bool: ... # type: ignore[override]
@cached_property
@override
def supports_uuid4_function_in_default(self) -> bool: ... # type: ignore[override]
@cached_property
@override
def supports_stored_generated_columns(self) -> bool: ... # type: ignore[override]
@cached_property
@override
def supports_bit_aggregations(self) -> bool: ... # type: ignore[override]
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/oracle/functions.pyi 0000664 0000000 0000000 00000000620 15260643574 0027602 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.models import Func
class IntervalToSeconds(Func):
function: str
template: str
def __init__(self, expression: Any, *, output_field: Any | None = None, **extra: Any) -> None: ...
class SecondsToInterval(Func):
function: str
template: str
def __init__(self, expression: Any, *, output_field: Any | None = None, **extra: Any) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/oracle/introspection.pyi 0000664 0000000 0000000 00000001166 15260643574 0030500 0 ustar 00root root 0000000 0000000 from typing import Any, NamedTuple
from django.db.backends.base.introspection import BaseDatabaseIntrospection
from django.db.backends.oracle.base import DatabaseWrapper
from django.db.backends.utils import CursorWrapper
from typing_extensions import override
FieldInfo: Any
class TableInfo(NamedTuple):
name: str
type: str
comment: str | None
class DatabaseIntrospection(BaseDatabaseIntrospection):
connection: DatabaseWrapper
cache_bust_counter: int
data_types_reverse: dict[int, str]
@override
def get_table_description(self, cursor: CursorWrapper, table_name: str) -> list[FieldInfo]: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/oracle/operations.pyi 0000664 0000000 0000000 00000010332 15260643574 0027756 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.management.color import Style
from django.db.backends.base.operations import BaseDatabaseOperations
from django.db.backends.oracle.base import DatabaseWrapper
from typing_extensions import override
class DatabaseOperations(BaseDatabaseOperations):
connection: DatabaseWrapper
integer_field_ranges: Any
set_operators: Any
cast_char_field_without_max_length: str
cast_data_types: Any
@override
def cache_key_culling_sql(self) -> str: ...
@override
def date_extract_sql(self, lookup_type: str, sql: str, params: Any) -> tuple[str, Any]: ...
@override
def date_trunc_sql(self, lookup_type: str, sql: str, params: Any, tzname: str | None = ...) -> tuple[str, Any]: ...
@override
def datetime_cast_date_sql(self, sql: str, params: Any, tzname: str | None) -> tuple[str, Any]: ...
@override
def datetime_cast_time_sql(self, sql: str, params: Any, tzname: str | None) -> tuple[str, Any]: ...
@override
def datetime_extract_sql(self, lookup_type: str, sql: str, params: Any, tzname: str | None) -> tuple[str, Any]: ...
@override
def datetime_trunc_sql(self, lookup_type: str, sql: str, params: Any, tzname: str | None) -> str: ...
@override
def time_trunc_sql(self, lookup_type: str, sql: str, params: Any, tzname: str | None = ...) -> str: ...
@override
def get_db_converters(self, expression: Any) -> list[Any]: ...
def convert_textfield_value(self, value: Any, expression: Any, connection: Any) -> Any: ...
def convert_binaryfield_value(self, value: Any, expression: Any, connection: Any) -> Any: ...
def convert_booleanfield_value(self, value: Any, expression: Any, connection: Any) -> Any: ...
def convert_datetimefield_value(self, value: Any, expression: Any, connection: Any) -> Any: ...
def convert_datefield_value(self, value: Any, expression: Any, connection: Any) -> Any: ...
def convert_timefield_value(self, value: Any, expression: Any, connection: Any) -> Any: ...
def convert_uuidfield_value(self, value: Any, expression: Any, connection: Any) -> Any: ...
@staticmethod
def convert_empty_string(value: Any, expression: Any, connection: Any) -> Any: ...
@staticmethod
def convert_empty_bytes(value: Any, expression: Any, connection: Any) -> Any: ...
@override
def deferrable_sql(self) -> str: ...
@override
def no_limit_value(self) -> str | None: ...
@override
def limit_offset_sql(self, low_mark: Any, high_mark: Any) -> str: ...
@override
def last_executed_query(self, cursor: Any, sql: Any, params: Any) -> str: ...
@override
def last_insert_id(self, cursor: Any, table_name: Any, pk_name: Any) -> Any: ...
@override
def lookup_cast(self, lookup_type: str, internal_type: Any | None = ...) -> str: ...
@override
def max_in_list_size(self) -> int: ...
@override
def max_name_length(self) -> int: ...
@override
def pk_default_value(self) -> str: ...
@override
def prep_for_iexact_query(self, x: Any) -> str: ...
@override
def process_clob(self, value: Any) -> Any: ...
@override
def quote_name(self, name: str) -> str: ...
@override
def regex_lookup(self, lookup_type: str) -> str: ...
@override
def sequence_reset_by_name_sql(self, style: Style, sequences: Any) -> list[str]: ...
@override
def sequence_reset_sql(self, style: Style, model_list: Any) -> list[str]: ...
@override
def start_transaction_sql(self) -> str: ...
@override
def tablespace_sql(self, tablespace: Any, inline: bool = ...) -> str: ...
@override
def adapt_datefield_value(self, value: Any) -> Any: ...
@override
def adapt_datetimefield_value(self, value: Any) -> Any: ...
@override
def adapt_durationfield_value(self, value: Any) -> Any: ...
@override
def adapt_timefield_value(self, value: Any) -> Any: ...
@override
def combine_expression(self, connector: Any, sub_expressions: Any) -> Any: ...
@override
def subtract_temporals(self, internal_type: Any, lhs: Any, rhs: Any) -> Any: ...
@override
def bulk_batch_size(self, fields: Any, objs: Any) -> int: ...
@override
def conditional_expression_supported_in_where_clause(self, expression: Any) -> bool: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/oracle/schema.pyi 0000664 0000000 0000000 00000002247 15260643574 0027041 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.base.schema import BaseDatabaseSchemaEditor
from django.db.backends.oracle.base import DatabaseWrapper
from django.db.models.base import Model
from django.db.models.fields import Field
from typing_extensions import override
class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
connection: DatabaseWrapper
sql_create_column: str
sql_alter_column_type: str
sql_alter_column_null: str
sql_alter_column_not_null: str
sql_alter_column_default: str
sql_alter_column_no_default: str
sql_delete_column: str
sql_create_column_inline_fk: str
sql_delete_table: str
sql_create_index: str
@override
def quote_value(self, value: Any) -> str: ...
@override
def remove_field(self, model: type[Model], field: Field[Any, Any]) -> None: ...
@override
def delete_model(self, model: type[Model]) -> None: ...
@override
def alter_field(
self, model: type[Model], old_field: Field[Any, Any], new_field: Field[Any, Any], strict: bool = False
) -> None: ...
def normalize_name(self, name: Any) -> str: ...
@override
def prepare_default(self, value: Any) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/oracle/utils.pyi 0000664 0000000 0000000 00000001063 15260643574 0026734 0 ustar 00root root 0000000 0000000 import datetime
from typing import Any
class BoundVar:
types: Any
db_type: Any
bound_param: Any
def __init__(self, field: Any) -> None: ...
def bind_parameter(self, cursor: Any) -> Any: ...
def get_value(self) -> Any: ...
class Oracle_datetime(datetime.datetime):
input_size: Any
@classmethod
def from_datetime(cls, dt: Any) -> Any: ...
class BulkInsertMapper:
BLOB: str
DATE: str
INTERVAL: str
NCLOB: str
NUMBER: str
TIMESTAMP: str
types: Any
def dsn(settings_dict: dict[str, Any]) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/oracle/validation.pyi 0000664 0000000 0000000 00000000656 15260643574 0027735 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.checks.messages import CheckMessage
from django.db.backends.base.validation import BaseDatabaseValidation
from django.db.backends.oracle.base import DatabaseWrapper
from django.db.models.fields import Field
class DatabaseValidation(BaseDatabaseValidation):
connection: DatabaseWrapper
def check_field_type(self, field: Field[Any, Any], field_type: str) -> list[CheckMessage]: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/postgresql/ 0000775 0000000 0000000 00000000000 15260643574 0026007 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/db/backends/postgresql/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0030257 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/db/backends/postgresql/base.pyi 0000664 0000000 0000000 00000003227 15260643574 0027450 0 ustar 00root root 0000000 0000000 from types import ModuleType
from typing import Any
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.backends.utils import CursorDebugWrapper as BaseCursorDebugWrapper
from django.db.backends.utils import _ExecuteQuery
from django.utils.functional import cached_property
from .client import DatabaseClient
from .creation import DatabaseCreation
from .features import DatabaseFeatures
from .introspection import DatabaseIntrospection
from .operations import DatabaseOperations
TIMESTAMPTZ_OID: int
def psycopg_version() -> tuple[int, int, int]: ...
class DatabaseWrapper(BaseDatabaseWrapper):
client: DatabaseClient
creation: DatabaseCreation
features: DatabaseFeatures
introspection: DatabaseIntrospection
ops: DatabaseOperations
client_class: type[DatabaseClient]
creation_class: type[DatabaseCreation]
features_class: type[DatabaseFeatures]
introspection_class: type[DatabaseIntrospection]
ops_class: type[DatabaseOperations]
Database: ModuleType
operators: dict[str, str]
pattern_esc: str
pattern_ops: dict[str, str]
# PostgreSQL backend-specific attributes.
_named_cursor_idx: int
@property
def pool(self) -> Any: ...
def close_pool(self) -> None: ...
def tzinfo_factory(self, offset: int) -> Any: ...
@cached_property
def pg_version(self) -> int: ...
class CursorMixin:
def callproc(self, name: Any, args: Any = ...) -> Any: ...
class ServerBindingCursor(CursorMixin): ...
class Cursor(CursorMixin): ...
class ServerSideCursor(CursorMixin): ...
class CursorDebugWrapper(BaseCursorDebugWrapper):
def copy(self, statement: _ExecuteQuery) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/postgresql/client.pyi 0000664 0000000 0000000 00000001117 15260643574 0030010 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable
from typing import Any
from django.db.backends.base.client import BaseDatabaseClient
from django.db.backends.postgresql.base import DatabaseWrapper
from typing_extensions import override
class DatabaseClient(BaseDatabaseClient):
connection: DatabaseWrapper
executable_name: str
@classmethod
@override
def settings_to_cmd_args_env(
cls, settings_dict: dict[str, Any], parameters: Iterable[str]
) -> tuple[list[str], dict[str, str] | None]: ...
@override
def runshell(self, parameters: Iterable[str]) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/postgresql/compiler.pyi 0000664 0000000 0000000 00000001422 15260643574 0030343 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.models.sql.compiler import SQLAggregateCompiler as SQLAggregateCompiler
from django.db.models.sql.compiler import SQLCompiler as SQLCompiler
from django.db.models.sql.compiler import SQLDeleteCompiler as SQLDeleteCompiler
from django.db.models.sql.compiler import SQLInsertCompiler as BaseSQLInsertCompiler
from django.db.models.sql.compiler import SQLUpdateCompiler as SQLUpdateCompiler
from typing_extensions import override
__all__ = [
"SQLAggregateCompiler",
"SQLCompiler",
"SQLDeleteCompiler",
"SQLInsertCompiler",
"SQLUpdateCompiler",
]
class InsertUnnest(list[str]): ...
class SQLInsertCompiler(BaseSQLInsertCompiler):
@override
def assemble_as_sql(self, fields: Any, value_rows: Any) -> tuple[Any, Any]: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/postgresql/creation.pyi 0000664 0000000 0000000 00000000320 15260643574 0030331 0 ustar 00root root 0000000 0000000 from django.db.backends.base.creation import BaseDatabaseCreation
from django.db.backends.postgresql.base import DatabaseWrapper
class DatabaseCreation(BaseDatabaseCreation):
connection: DatabaseWrapper
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/postgresql/features.pyi 0000664 0000000 0000000 00000006761 15260643574 0030362 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.base.features import BaseDatabaseFeatures
from django.db.backends.postgresql.base import DatabaseWrapper
from django.utils.functional import cached_property
from typing_extensions import override
class DatabaseFeatures(BaseDatabaseFeatures):
connection: DatabaseWrapper
allows_group_by_selected_pks: bool
can_return_columns_from_insert: bool
can_return_rows_from_bulk_insert: bool
has_real_datatype: bool
has_native_boolean_field: bool
has_native_uuid_field: bool
has_native_duration_field: bool
has_native_json_field: bool
can_defer_constraint_checks: bool
has_select_for_update: bool
has_select_for_update_nowait: bool
has_select_for_update_of: bool
has_select_for_update_skip_locked: bool
has_select_for_no_key_update: bool
can_release_savepoints: bool
supports_tablespaces: bool
supports_transactions: bool
can_introspect_materialized_views: bool
can_distinct_on_fields: bool
can_rollback_ddl: bool
supports_combined_alters: bool
nulls_order_largest: bool
closed_cursor_error_class: Any
has_case_insensitive_like: bool
greatest_least_ignores_nulls: bool
can_clone_databases: bool
supports_temporal_subtraction: bool
supports_slicing_ordering_in_compound: bool
create_test_procedure_without_params_sql: str
create_test_procedure_with_int_param_sql: str
requires_casted_case_in_updates: bool
supports_over_clause: bool
only_supports_unbounded_with_preceding_and_following: bool
supports_aggregate_filter_clause: bool
supported_explain_formats: set[str]
supports_deferrable_unique_constraints: bool
has_json_operators: bool
json_key_contains_list_matching_requires_list: bool
supports_uuid4_function: bool
@cached_property
@override
def supports_uuid7_function(self) -> bool: ... # type: ignore[override]
@cached_property
@override
def supports_uuid7_function_shift(self) -> bool: ... # type: ignore[override]
@cached_property
@override
def django_test_skips(self) -> dict[str, set[str]]: ... # type: ignore[override]
@cached_property
@override
def django_test_expected_failures(self) -> set[str]: ... # type: ignore[override]
@cached_property
def uses_server_side_binding(self) -> bool: ...
@cached_property
@override
def max_query_params(self) -> int | None: ... # type: ignore[override]
@cached_property
@override
def prohibits_null_characters_in_text_exception(self) -> tuple[type[Exception], str]: ... # type: ignore[override]
@cached_property
@override
def introspected_field_types(self) -> dict[str, str]: ... # type: ignore[override]
@cached_property
def is_postgresql_16(self) -> bool: ...
@cached_property
def is_postgresql_17(self) -> bool: ...
@cached_property
def is_postgresql_18(self) -> bool: ...
supports_covering_indexes: bool
supports_non_deterministic_collations: bool
can_return_rows_from_update: bool
supports_aggregate_order_by_clause: bool
@property
@override
def supports_nulls_distinct_unique_constraints(self) -> bool: ... # type: ignore[override]
@property
@override
def supports_any_value(self) -> bool: ... # type: ignore[override]
@property
@override
def supports_virtual_generated_columns(self) -> bool: ... # type: ignore[override]
@property
@override
def supports_uuid4_function_in_default(self) -> bool: ... # type: ignore[override]
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/postgresql/introspection.pyi 0000664 0000000 0000000 00000002052 15260643574 0031431 0 ustar 00root root 0000000 0000000 from typing import NamedTuple
from django.db.backends.base.introspection import BaseDatabaseIntrospection
from django.db.backends.postgresql.base import DatabaseWrapper
from django.db.backends.utils import CursorWrapper
from django.db.models.deletion import DatabaseOnDelete, _Collector
from typing_extensions import override
class FieldInfo(NamedTuple):
name: str
type_code: int
display_size: int | None
internal_size: int | None
precision: int | None
scale: int | None
null_ok: bool
default: str | None
collation: str | None
is_autofield: bool
comment: str | None
class TableInfo(NamedTuple):
name: str
type: str
comment: str | None
class DatabaseIntrospection(BaseDatabaseIntrospection):
connection: DatabaseWrapper
data_types_reverse: dict[int, str]
index_default_access_method: str
ignored_tables: list[str]
on_delete_types: dict[str, _Collector | DatabaseOnDelete]
@override
def get_table_description(self, cursor: CursorWrapper, table_name: str) -> list[FieldInfo]: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/postgresql/operations.pyi 0000664 0000000 0000000 00000000762 15260643574 0030722 0 ustar 00root root 0000000 0000000 from types import ModuleType
from typing import Any
from django.db.backends.base.operations import BaseDatabaseOperations
from django.db.backends.postgresql.base import DatabaseWrapper
def get_json_dumps(encoder: type[Any] | None) -> Any: ...
class DatabaseOperations(BaseDatabaseOperations):
connection: DatabaseWrapper
explain_options: frozenset[str]
integerfield_type_map: dict[str, type[Any]]
numeric: ModuleType
def compose_sql(self, sql: Any, params: Any) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/postgresql/psycopg_any.pyi 0000664 0000000 0000000 00000001623 15260643574 0031067 0 ustar 00root root 0000000 0000000 from enum import IntEnum
from types import ModuleType
from typing import Any
from django.db.backends.base.base import BaseDatabaseWrapper
is_psycopg3: bool
TSRANGE_OID: int
TSTZRANGE_OID: int
errors: ModuleType
sql: ModuleType
adapt: ModuleType
adapters: Any
class IsolationLevel(IntEnum):
READ_UNCOMMITTED = 1
READ_COMMITTED = 2
REPEATABLE_READ = 3
SERIALIZABLE = 4
# Range types from psycopg
Range: Any
DateRange: Any
DateTimeRange: Any
DateTimeTZRange: Any
NumericRange: Any
RANGE_TYPES: tuple[Any, ...]
# Psycopg types
Jsonb: Any
ClientCursor: Any
TextLoader: Any
BaseTzLoader: Any
RangeDumper: Any
DjangoRangeDumper: Any
orig_tz_loader_cls: Any
def Inet(address: str) -> Any: ...
def mogrify(sql: str, params: Any, connection: BaseDatabaseWrapper) -> str: ...
def register_tzloader(tz: Any, context: Any) -> None: ...
def get_adapters_template(use_tz: bool, timezone: Any) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/postgresql/schema.pyi 0000664 0000000 0000000 00000002026 15260643574 0027772 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.base.schema import BaseDatabaseSchemaEditor
from django.db.backends.postgresql.base import DatabaseWrapper
from django.db.models.base import Model
from django.db.models.indexes import Index
from typing_extensions import override
class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
connection: DatabaseWrapper
sql_delete_sequence: str
sql_alter_sequence_type: str
sql_create_index: str
sql_create_index_concurrently: str
sql_delete_index: str
sql_delete_index_concurrently: str
sql_create_column_inline_fk: str
sql_delete_fk: str
sql_delete_procedure: str
sql_add_identity: str
sql_drop_indentity: str # typo in source: `indentity` instead of `identity`
@override
def quote_value(self, value: Any) -> str: ...
@override
def add_index(self, model: type[Model], index: Index, concurrently: bool = False) -> None: ...
@override
def remove_index(self, model: type[Model], index: Index, concurrently: bool = False) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/signals.pyi 0000664 0000000 0000000 00000000077 15260643574 0025773 0 ustar 00root root 0000000 0000000 from django.dispatch import Signal
connection_created: Signal
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/sqlite3/ 0000775 0000000 0000000 00000000000 15260643574 0025170 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/db/backends/sqlite3/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0027440 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/db/backends/sqlite3/base.pyi 0000664 0000000 0000000 00000003454 15260643574 0026633 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterable
from datetime import date, datetime
from re import Pattern
from sqlite3 import dbapi2 as Database
from types import ModuleType
from typing import Any
from django.db.backends.base.base import BaseDatabaseWrapper
from typing_extensions import TypeVar, override
from .client import DatabaseClient
from .creation import DatabaseCreation
from .features import DatabaseFeatures
from .introspection import DatabaseIntrospection
from .operations import DatabaseOperations
from .schema import DatabaseSchemaEditor
_R = TypeVar("_R")
def decoder(conv_func: Callable[[str], _R]) -> Callable[[bytes], _R]: ...
def adapt_date(val: date) -> str: ...
def adapt_datetime(val: datetime) -> str: ...
class DatabaseWrapper(BaseDatabaseWrapper):
client: DatabaseClient
creation: DatabaseCreation
features: DatabaseFeatures
introspection: DatabaseIntrospection
ops: DatabaseOperations
operators: dict[str, str]
pattern_esc: str
pattern_ops: dict[str, str]
transaction_modes: frozenset[str]
Database: ModuleType
SchemaEditorClass: type[DatabaseSchemaEditor]
client_class: type[DatabaseClient]
creation_class: type[DatabaseCreation]
features_class: type[DatabaseFeatures]
introspection_class: type[DatabaseIntrospection]
ops_class: type[DatabaseOperations]
def is_in_memory_db(self) -> bool: ...
FORMAT_QMARK_REGEX: Pattern[str]
class SQLiteCursorWrapper(Database.Cursor):
@override
def execute(self, query: str, params: Iterable[Any] | None = None) -> SQLiteCursorWrapper: ... # type: ignore[override]
@override
def executemany(self, query: str, param_list: Iterable[Iterable[Any]]) -> SQLiteCursorWrapper: ... # type: ignore[override]
def convert_query(self, query: str, *, param_names: Any = None) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/sqlite3/client.pyi 0000664 0000000 0000000 00000000756 15260643574 0027201 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable
from typing import Any
from django.db.backends.base.client import BaseDatabaseClient
from django.db.backends.sqlite3.base import DatabaseWrapper
from typing_extensions import override
class DatabaseClient(BaseDatabaseClient):
connection: DatabaseWrapper
executable_name: str
@classmethod
@override
def settings_to_cmd_args_env(
cls, settings_dict: dict[str, Any], parameters: Iterable[str]
) -> tuple[list[str], None]: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/sqlite3/creation.pyi 0000664 0000000 0000000 00000000473 15260643574 0027523 0 ustar 00root root 0000000 0000000 from _typeshed import StrPath
from django.db.backends.base.creation import BaseDatabaseCreation
from django.db.backends.sqlite3.base import DatabaseWrapper
class DatabaseCreation(BaseDatabaseCreation):
connection: DatabaseWrapper
@staticmethod
def is_in_memory_db(database_name: StrPath) -> bool: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/sqlite3/features.pyi 0000664 0000000 0000000 00000003240 15260643574 0027530 0 ustar 00root root 0000000 0000000 from django.db.backends.base.features import BaseDatabaseFeatures
from django.db.backends.sqlite3.base import DatabaseWrapper
from django.utils.functional import cached_property
from typing_extensions import override
class DatabaseFeatures(BaseDatabaseFeatures):
connection: DatabaseWrapper
can_alter_table_drop_column: bool
supports_aggregate_order_by_clause: bool
supports_aggregate_distinct_multiple_argument: bool
supports_any_value: bool
@cached_property
@override
def supports_uuid7_function(self) -> bool: ... # type: ignore[override]
@cached_property
@override
def django_test_skips(self) -> dict[str, set[str]]: ... # type: ignore[override]
@cached_property
@override
def introspected_field_types(self) -> dict[str, str]: ... # type: ignore[override]
@property
@override
def max_query_params(self) -> int: ... # type: ignore[override]
@cached_property
@override
def supports_json_field(self) -> bool: ... # type: ignore[override]
@property
@override
def can_introspect_json_field(self) -> bool: ... # type: ignore[override]
@property
@override
def has_json_object_function(self) -> bool: ... # type: ignore[override]
@cached_property
@override
def can_return_columns_from_insert(self) -> bool: ... # type: ignore[override]
@property
@override
def can_return_rows_from_bulk_insert(self) -> bool: ... # type: ignore[override]
@property
@override
def can_return_rows_from_update(self) -> bool: ... # type: ignore[override]
@property
@override
def supports_uuid4_function_in_default(self) -> bool: ... # type: ignore[override]
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/sqlite3/introspection.pyi 0000664 0000000 0000000 00000001702 15260643574 0030613 0 ustar 00root root 0000000 0000000 from re import Pattern
from typing import Any, NamedTuple
from django.db.backends.base.introspection import BaseDatabaseIntrospection
from django.db.backends.sqlite3.base import DatabaseWrapper
from django.db.backends.utils import CursorWrapper
from typing_extensions import override
class FieldInfo(NamedTuple):
name: str
type_code: int
display_size: int | None
internal_size: int | None
precision: int | None
scale: int | None
null_ok: bool
default: str | None
collation: str | None
pk: bool
has_json_constraint: bool
field_size_re: Pattern[str]
def get_field_size(name: str) -> int | None: ...
class FlexibleFieldLookupDict:
base_data_types_reverse: Any
def __getitem__(self, key: str) -> Any: ...
class DatabaseIntrospection(BaseDatabaseIntrospection):
connection: DatabaseWrapper
@override
def get_table_description(self, cursor: CursorWrapper, table_name: str) -> list[FieldInfo]: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/sqlite3/operations.pyi 0000664 0000000 0000000 00000002667 15260643574 0030111 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from decimal import Decimal
from typing import Any
from uuid import UUID
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.backends.base.operations import BaseDatabaseOperations
from django.db.models.aggregates import Aggregate
from django.db.models.expressions import Expression
from django.db.models.fields import DateField, DateTimeField, TimeField
from typing_extensions import override
UNSUPPORTED_DATETIME_AGGREGATES: tuple[type[Aggregate], ...]
DATETIME_FIELDS: tuple[type[DateField[Any, Any] | DateTimeField[Any, Any] | TimeField[Any, Any]], ...]
class DatabaseOperations(BaseDatabaseOperations):
jsonfield_datatype_values: frozenset[str]
def convert_datetimefield_value(self, value: Any, expression: Any, connection: Any) -> Any | None: ...
def convert_datefield_value(self, value: Any, expression: Any, connection: Any) -> Any: ...
def convert_timefield_value(self, value: Any, expression: Any, connection: Any) -> Any: ...
def get_decimalfield_converter(
self,
expression: Any,
) -> Callable[[float | None, Expression, BaseDatabaseWrapper], Decimal | None]: ...
def convert_uuidfield_value(self, value: Any, expression: Any, connection: Any) -> UUID | None: ...
def convert_booleanfield_value(self, value: Any, expression: Any, connection: Any) -> Any: ...
@override
def format_json_path_numeric_index(self, num: int) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/sqlite3/schema.pyi 0000664 0000000 0000000 00000001076 15260643574 0027157 0 ustar 00root root 0000000 0000000 from django.db.backends.base.schema import BaseDatabaseSchemaEditor
from django.db.backends.sqlite3.base import DatabaseWrapper
from django.db.models.base import Model
from typing_extensions import override
class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
connection: DatabaseWrapper
sql_create_fk: None # type: ignore[assignment]
sql_alter_table_comment: None # type: ignore[assignment]
sql_alter_column_comment: None # type: ignore[assignment]
@override
def delete_model(self, model: type[Model], handle_autom2m: bool = True) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/backends/utils.pyi 0000664 0000000 0000000 00000006065 15260643574 0025476 0 ustar 00root root 0000000 0000000 import datetime
from collections.abc import Iterator, Mapping, Sequence
from contextlib import AbstractContextManager
from decimal import Decimal
from logging import Logger
from types import TracebackType
from typing import Any, Literal, Protocol, Self, TypeAlias, overload, type_check_only
from uuid import UUID
logger: Logger
# Protocol matching psycopg2.sql.Composable, to avoid depending psycopg2
@type_check_only
class _Composable(Protocol):
def as_string(self, context: Any, /) -> str: ...
def __add__(self, other: Self, /) -> _Composable: ...
def __mul__(self, n: int, /) -> _Composable: ...
_ExecuteQuery: TypeAlias = str | _Composable
# Python types that can be adapted to SQL.
_SQLType: TypeAlias = (
bool
| int
| float
| Decimal
| str
| bytes
| datetime.date
| datetime.datetime
| UUID
| tuple[Any, ...]
| list[Any]
| None
)
_ExecuteParameters: TypeAlias = Sequence[_SQLType] | Mapping[str, _SQLType] | None
class CursorWrapper:
cursor: Any
db: Any
def __init__(self, cursor: Any, db: Any) -> None: ...
WRAP_ERROR_ATTRS: Any
APPS_NOT_READY_WARNING_MSG: str
def __getattr__(self, attr: str) -> Any: ...
def __iter__(self) -> Iterator[tuple[Any, ...]]: ...
def __enter__(self) -> Self: ...
def __exit__(
self,
type: type[BaseException] | None,
value: BaseException | None,
traceback: TracebackType | None,
) -> None: ...
def callproc(
self, procname: str, params: Sequence[Any] | None = None, kparams: dict[str, int] | None = None
) -> Any: ...
def execute(self, sql: _ExecuteQuery, params: _ExecuteParameters | None = None) -> Any: ...
def executemany(self, sql: _ExecuteQuery, param_list: Sequence[_ExecuteParameters]) -> Any: ...
class CursorDebugWrapper(CursorWrapper):
def debug_sql(
self,
sql: str | None = None,
params: _ExecuteParameters | Sequence[_ExecuteParameters] | None = None,
use_last_executed_query: bool = False,
many: bool = False,
) -> AbstractContextManager[None]: ...
def debug_transaction(connection: Any, sql: str) -> AbstractContextManager[None]: ...
def split_tzname_delta(tzname: str) -> tuple[str, str | None, str | None]: ...
@overload
def typecast_date(s: Literal[""] | None) -> None: ... # type: ignore[overload-overlap]
@overload
def typecast_date(s: str) -> datetime.date: ...
@overload
def typecast_time(s: Literal[""] | None) -> None: ... # type: ignore[overload-overlap]
@overload
def typecast_time(s: str) -> datetime.time: ...
@overload
def typecast_timestamp(s: Literal[""] | None) -> None: ... # type: ignore[overload-overlap]
@overload
def typecast_timestamp(s: str) -> datetime.datetime: ...
def split_identifier(identifier: str) -> tuple[str, str]: ...
def truncate_name(identifier: str, length: int | None = None, hash_len: int = 4) -> str: ...
def names_digest(*args: str, length: int) -> str: ...
def format_number(value: Decimal | None, max_digits: int | None, decimal_places: int | None) -> str | None: ...
def strip_quotes(table_name: str) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/ 0000775 0000000 0000000 00000000000 15260643574 0024206 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/__init__.pyi 0000664 0000000 0000000 00000000214 15260643574 0026465 0 ustar 00root root 0000000 0000000 from .migration import Migration as Migration
from .migration import swappable_dependency as swappable_dependency
from .operations import *
typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/autodetector.pyi 0000664 0000000 0000000 00000007477 15260643574 0027452 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterable
from enum import Enum
from typing import Any, Self
from django.db.migrations.graph import MigrationGraph
from django.db.migrations.migration import Migration
from django.db.migrations.operations.base import Operation
from django.db.migrations.questioner import MigrationQuestioner
from django.db.migrations.state import ProjectState
from django.db.models.fields import Field
from django.utils.functional import cached_property
class OperationDependency(tuple[str, str, str | None, OperationDependency.Type]):
class Type(Enum):
CREATE = 0
REMOVE = 1
ALTER = 2
REMOVE_ORDER_WRT = 3
ALTER_FOO_TOGETHER = 4
REMOVE_INDEX_OR_CONSTRAINT = 5
app_label: str
model_name: str
field_name: str | None
type: Type
def __new__(_cls, app_label: str, model_name: str, field_name: str | None, type: Type) -> Self: ...
@cached_property
def model_name_lower(self) -> str: ...
@cached_property
def field_name_lower(self) -> str: ...
class MigrationAutodetector:
from_state: ProjectState
to_state: ProjectState
questioner: MigrationQuestioner
existing_apps: set[Any]
def __init__(
self, from_state: ProjectState, to_state: ProjectState, questioner: MigrationQuestioner | None = None
) -> None: ...
def changes(
self,
graph: MigrationGraph,
trim_to_apps: set[str] | None = None,
convert_apps: set[str] | None = None,
migration_name: str | None = None,
) -> dict[str, list[Migration]]: ...
def deep_deconstruct(self, obj: Any) -> Any: ...
def only_relation_agnostic_fields(
self, fields: dict[str, Field[Any, Any]]
) -> list[tuple[str, list[Any], dict[str, Callable[..., Any] | int | str]]]: ...
def check_dependency(self, operation: Operation, dependency: tuple[str, str, str | None, bool | str]) -> bool: ...
def add_operation(
self,
app_label: str,
operation: Operation,
dependencies: Iterable[tuple[str, str, str | None, bool | str]] | None = None,
beginning: bool = False,
) -> None: ...
def swappable_first_key(self, item: tuple[str, str]) -> tuple[str, str]: ...
renamed_models: Any
renamed_models_rel: Any
def generate_renamed_models(self) -> None: ...
def generate_created_models(self) -> None: ...
def generate_created_proxies(self) -> None: ...
def generate_deleted_models(self) -> None: ...
def generate_deleted_proxies(self) -> None: ...
def create_renamed_fields(self) -> None: ...
renamed_fields: Any
def generate_renamed_fields(self) -> None: ...
def generate_added_fields(self) -> None: ...
def generate_removed_fields(self) -> None: ...
def generate_altered_fields(self) -> None: ...
def create_altered_indexes(self) -> None: ...
def generate_added_indexes(self) -> None: ...
def generate_removed_indexes(self) -> None: ...
def generate_renamed_indexes(self) -> None: ...
def create_altered_constraints(self) -> None: ...
def generate_added_constraints(self) -> None: ...
def generate_removed_constraints(self) -> None: ...
def generate_altered_constraints(self) -> None: ...
def generate_removed_altered_unique_together(self) -> None: ...
def generate_altered_unique_together(self) -> None: ...
def generate_altered_db_table(self) -> None: ...
def generate_altered_db_table_comment(self) -> None: ...
def generate_altered_options(self) -> None: ...
def generate_altered_order_with_respect_to(self) -> None: ...
def generate_altered_managers(self) -> None: ...
def arrange_for_graph(
self, changes: dict[str, list[Migration]], graph: MigrationGraph, migration_name: str | None = None
) -> dict[str, list[Migration]]: ...
@classmethod
def parse_number(cls, name: str) -> int: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/exceptions.pyi 0000664 0000000 0000000 00000001231 15260643574 0027107 0 ustar 00root root 0000000 0000000 from django.db.migrations.migration import Migration
from django.db.utils import DatabaseError
class AmbiguityError(Exception): ...
class BadMigrationError(Exception): ...
class CircularDependencyError(Exception): ...
class InconsistentMigrationHistory(Exception): ...
class InvalidBasesError(ValueError): ...
class IrreversibleError(RuntimeError): ...
class NodeNotFoundError(LookupError):
message: str
origin: Migration | None
node: tuple[str, str]
def __init__(self, message: str, node: tuple[str, str], origin: Migration | None = None) -> None: ...
class MigrationSchemaMissing(DatabaseError): ...
class InvalidMigrationPlan(ValueError): ...
typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/executor.pyi 0000664 0000000 0000000 00000003424 15260643574 0026572 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from typing import Protocol, type_check_only
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.migrations.migration import Migration
from .loader import MigrationLoader
from .recorder import MigrationRecorder
from .state import ProjectState
@type_check_only
class _ProgressCallbackT(Protocol):
def __call__(self, action: str, migration: Migration | None = ..., fake: bool | None = ..., /) -> None: ...
class MigrationExecutor:
connection: BaseDatabaseWrapper
loader: MigrationLoader
recorder: MigrationRecorder
progress_callback: _ProgressCallbackT | None
def __init__(
self,
connection: BaseDatabaseWrapper | None,
progress_callback: _ProgressCallbackT | None = None,
) -> None: ...
def migration_plan(
self, targets: Sequence[tuple[str, str | None]] | set[tuple[str, str]], clean_start: bool = False
) -> list[tuple[Migration, bool]]: ...
def migrate(
self,
targets: Sequence[tuple[str, str | None]] | None,
plan: Sequence[tuple[Migration, bool]] | None = None,
state: ProjectState | None = None,
fake: bool = False,
fake_initial: bool = False,
) -> ProjectState: ...
def apply_migration(
self, state: ProjectState, migration: Migration, fake: bool = False, fake_initial: bool = False
) -> ProjectState: ...
def record_migration(self, app_label: str, name: str, forward: bool = True) -> None: ...
def unapply_migration(self, state: ProjectState, migration: Migration, fake: bool = False) -> ProjectState: ...
def check_replacements(self) -> None: ...
def detect_soft_applied(
self, project_state: ProjectState | None, migration: Migration
) -> tuple[bool, ProjectState]: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/graph.pyi 0000664 0000000 0000000 00000005112 15260643574 0026031 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from typing import Any
from django.db.migrations.migration import Migration
from django.db.migrations.state import ProjectState
from typing_extensions import override
class Node:
key: tuple[str, str]
children: set[Any]
parents: set[Any]
def __init__(self, key: tuple[str, str]) -> None: ...
@override
def __eq__(self, other: object) -> bool: ...
def __lt__(self, other: tuple[str, str] | Node) -> bool: ...
def __le__(self, other: tuple[str, str] | Node) -> bool: ...
def __gt__(self, other: tuple[str, str] | Node) -> bool: ...
def __ge__(self, other: tuple[str, str] | Node) -> bool: ...
@override
def __hash__(self) -> int: ...
def __getitem__(self, item: int) -> str: ...
def add_child(self, child: Node) -> None: ...
def add_parent(self, parent: Node) -> None: ...
class DummyNode(Node):
origin: Any
error_message: Any
def __init__(self, key: tuple[str, str], origin: Migration | str, error_message: str) -> None: ...
def raise_error(self) -> None: ...
class MigrationGraph:
node_map: dict[tuple[str, str], Node]
nodes: dict[tuple[str, str], Migration | None]
def __init__(self) -> None: ...
def add_node(self, key: tuple[str, str], migration: Migration | None) -> None: ...
def add_dummy_node(self, key: tuple[str, str], origin: Migration | str, error_message: str) -> None: ...
def add_dependency(
self,
migration: Migration | str | None,
child: tuple[str, str],
parent: tuple[str, str],
skip_validation: bool = False,
) -> None: ...
def remove_replaced_nodes(self, replacement: tuple[str, str], replaced: list[tuple[str, str]]) -> None: ...
def remove_replacement_node(self, replacement: tuple[str, str], replaced: list[tuple[str, str]]) -> None: ...
def validate_consistency(self) -> None: ...
def forwards_plan(self, target: tuple[str, str]) -> list[tuple[str, str]]: ...
def backwards_plan(self, target: tuple[str, str]) -> list[tuple[str, str]]: ...
def iterative_dfs(self, start: Any, forwards: bool = True) -> list[tuple[str, str]]: ...
def root_nodes(self, app: str | None = None) -> list[tuple[str, str]]: ...
def leaf_nodes(self, app: str | None = None) -> list[tuple[str, str]]: ...
def ensure_not_cyclic(self) -> None: ...
def make_state(
self,
nodes: tuple[str, str] | Sequence[tuple[str, str]] | None = None,
at_end: bool = True,
real_apps: list[str] | None = None,
) -> ProjectState: ...
def __contains__(self, node: tuple[str, str]) -> bool: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/loader.pyi 0000664 0000000 0000000 00000004454 15260643574 0026206 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from typing import Any
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.migrations.migration import Migration
from django.db.migrations.state import ProjectState
from .exceptions import AmbiguityError as AmbiguityError
from .exceptions import BadMigrationError as BadMigrationError
from .exceptions import InconsistentMigrationHistory as InconsistentMigrationHistory
from .exceptions import NodeNotFoundError as NodeNotFoundError
MIGRATIONS_MODULE_NAME: str
class MigrationLoader:
connection: BaseDatabaseWrapper | None
disk_migrations: dict[tuple[str, str], Migration]
applied_migrations: dict[tuple[str, str], Migration]
ignore_no_migrations: bool
def __init__(
self,
connection: BaseDatabaseWrapper | None,
load: bool = True,
ignore_no_migrations: bool = False,
replace_migrations: bool = True,
) -> None: ...
@classmethod
def migrations_module(cls, app_label: str) -> tuple[str | None, bool]: ...
unmigrated_apps: set[str]
migrated_apps: set[str]
def load_disk(self) -> None: ...
def get_migration(self, app_label: str, name_prefix: str) -> Migration: ...
def get_migration_by_prefix(self, app_label: str, name_prefix: str) -> Migration: ...
def check_key(self, key: tuple[str, str], current_app: str) -> tuple[str, str] | None: ...
def add_internal_dependencies(self, key: tuple[str, str], migration: Migration) -> None: ...
def add_external_dependencies(self, key: tuple[str, str], migration: Migration) -> None: ...
graph: Any
replacements: dict[tuple[str, str], Migration]
replacements_progress: dict[tuple[str, str], bool]
def replace_migration(self, migration_key: tuple[str, str]) -> None: ...
def build_graph(self) -> None: ...
def check_consistent_history(self, connection: BaseDatabaseWrapper) -> None: ...
def all_replaced_applied(
self, migration_key: tuple[str, str], applied: dict[tuple[str, str], Migration]
) -> bool: ...
def detect_conflicts(self) -> dict[str, list[str]]: ...
def project_state(
self, nodes: tuple[str, str] | Sequence[tuple[str, str]] | None = None, at_end: bool = True
) -> ProjectState: ...
def collect_sql(self, plan: Sequence[tuple[Migration, bool]]) -> list[str]: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/migration.pyi 0000664 0000000 0000000 00000002360 15260643574 0026723 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from typing import ClassVar, Self
from django.db.backends.base.schema import BaseDatabaseSchemaEditor
from django.db.migrations.operations.base import Operation
from django.db.migrations.state import ProjectState
class Migration:
operations: ClassVar[Sequence[Operation]]
dependencies: ClassVar[Sequence[tuple[str, str]]]
run_before: ClassVar[Sequence[tuple[str, str]]]
replaces: ClassVar[Sequence[tuple[str, str]]]
initial: ClassVar[bool | None]
atomic: ClassVar[bool]
name: str
app_label: str
def __init__(self, name: str, app_label: str) -> None: ...
def mutate_state(self, project_state: ProjectState, preserve: bool = True) -> ProjectState: ...
def apply(
self, project_state: ProjectState, schema_editor: BaseDatabaseSchemaEditor, collect_sql: bool = False
) -> ProjectState: ...
def unapply(
self, project_state: ProjectState, schema_editor: BaseDatabaseSchemaEditor, collect_sql: bool = False
) -> ProjectState: ...
def suggest_name(self) -> str: ...
class SwappableTuple(tuple[str, str]):
setting: str
def __new__(cls, value: tuple[str, str], setting: str) -> Self: ...
def swappable_dependency(value: str) -> SwappableTuple: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/operations/ 0000775 0000000 0000000 00000000000 15260643574 0026371 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/operations/__init__.pyi 0000664 0000000 0000000 00000003303 15260643574 0030652 0 ustar 00root root 0000000 0000000 from .fields import AddField as AddField
from .fields import AlterField as AlterField
from .fields import RemoveField as RemoveField
from .fields import RenameField as RenameField
from .models import AddConstraint as AddConstraint
from .models import AddIndex as AddIndex
from .models import AlterConstraint as AlterConstraint
from .models import AlterIndexTogether as AlterIndexTogether
from .models import AlterModelManagers as AlterModelManagers
from .models import AlterModelOptions as AlterModelOptions
from .models import AlterModelTable as AlterModelTable
from .models import AlterModelTableComment as AlterModelTableComment
from .models import AlterOrderWithRespectTo as AlterOrderWithRespectTo
from .models import AlterUniqueTogether as AlterUniqueTogether
from .models import CreateModel as CreateModel
from .models import DeleteModel as DeleteModel
from .models import RemoveConstraint as RemoveConstraint
from .models import RemoveIndex as RemoveIndex
from .models import RenameIndex as RenameIndex
from .models import RenameModel as RenameModel
from .special import RunPython as RunPython
from .special import RunSQL as RunSQL
from .special import SeparateDatabaseAndState as SeparateDatabaseAndState
__all__ = [
"AddConstraint",
"AddField",
"AddIndex",
"AlterConstraint",
"AlterField",
"AlterIndexTogether",
"AlterModelManagers",
"AlterModelOptions",
"AlterModelTable",
"AlterModelTableComment",
"AlterOrderWithRespectTo",
"AlterUniqueTogether",
"CreateModel",
"DeleteModel",
"RemoveConstraint",
"RemoveField",
"RemoveIndex",
"RenameField",
"RenameIndex",
"RenameModel",
"RunPython",
"RunSQL",
"SeparateDatabaseAndState",
]
typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/operations/base.pyi 0000664 0000000 0000000 00000003425 15260643574 0030032 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from enum import StrEnum
from typing import Any, ClassVar, Self
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.backends.base.schema import BaseDatabaseSchemaEditor
from django.db.migrations.state import ProjectState
from django.db.models import Model
class OperationCategory(StrEnum):
ADDITION = "+"
REMOVAL = "-"
ALTERATION = "~"
PYTHON = "p"
SQL = "s"
MIXED = "?"
class Operation:
reversible: ClassVar[bool]
reduces_to_sql: ClassVar[bool]
atomic: ClassVar[bool]
elidable: ClassVar[bool]
serialization_expand_args: ClassVar[list[str]]
category: ClassVar[OperationCategory | None]
def __new__(cls, *args: Any, **kwargs: Any) -> Self: ...
def deconstruct(self) -> tuple[str, Sequence[Any], dict[str, Any]]: ...
def state_forwards(self, app_label: str, state: ProjectState) -> None: ...
def database_forwards(
self, app_label: str, schema_editor: BaseDatabaseSchemaEditor, from_state: ProjectState, to_state: ProjectState
) -> None: ...
def database_backwards(
self, app_label: str, schema_editor: BaseDatabaseSchemaEditor, from_state: ProjectState, to_state: ProjectState
) -> None: ...
def describe(self) -> str: ...
def formatted_description(self) -> str: ...
@property
def migration_name_fragment(self) -> str: ...
def references_model(self, name: str, app_label: str) -> bool: ...
def references_field(self, model_name: str, name: str, app_label: str) -> bool: ...
def allow_migrate_model(self, connection_alias: BaseDatabaseWrapper | str, model: type[Model]) -> bool: ...
def reduce(self, operation: Operation, app_label: str) -> bool | list[Operation]: ...
def __replace__(self, /, **changes: Any) -> Self: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/operations/fields.pyi 0000664 0000000 0000000 00000002460 15260643574 0030364 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.models.fields import Field
from django.utils.functional import cached_property
from .base import Operation
class FieldOperation(Operation):
model_name: str
name: str
def __init__(self, model_name: str, name: str, field: Field[Any, Any] | None = None) -> None: ...
@cached_property
def name_lower(self) -> str: ...
@cached_property
def model_name_lower(self) -> str: ...
def is_same_model_operation(self, operation: FieldOperation) -> bool: ...
def is_same_field_operation(self, operation: FieldOperation) -> bool: ...
class AddField(FieldOperation):
field: Field[Any, Any]
preserve_default: bool
def __init__(self, model_name: str, name: str, field: Field[Any, Any], preserve_default: bool = True) -> None: ...
class RemoveField(FieldOperation): ...
class AlterField(FieldOperation):
field: Field[Any, Any]
preserve_default: bool
def __init__(self, model_name: str, name: str, field: Field[Any, Any], preserve_default: bool = True) -> None: ...
class RenameField(FieldOperation):
old_name: str
new_name: str
def __init__(self, model_name: str, old_name: str, new_name: str) -> None: ...
@cached_property
def old_name_lower(self) -> str: ...
@cached_property
def new_name_lower(self) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/operations/models.pyi 0000664 0000000 0000000 00000013132 15260643574 0030377 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from typing import Any
from django.db.backends.base.schema import BaseDatabaseSchemaEditor
from django.db.migrations.operations.base import Operation
from django.db.models.base import Model
from django.db.models.constraints import BaseConstraint
from django.db.models.fields import Field
from django.db.models.indexes import Index
from django.db.models.manager import Manager
from django.db.models.options import _OptionTogetherT
from django.utils.functional import cached_property
from typing_extensions import override
class ModelOperation(Operation):
name: str
def __init__(self, name: str) -> None: ...
@cached_property
def name_lower(self) -> str: ...
def can_reduce_through(self, operation: Operation, app_label: str) -> bool: ...
class CreateModel(ModelOperation):
fields: list[tuple[str, Field[Any, Any]]]
options: dict[str, Any]
bases: Sequence[type[Model] | str] | None
managers: Sequence[tuple[str, Manager[Any]]] | None
def __init__(
self,
name: str,
fields: list[tuple[str, Field[Any, Any]]],
options: dict[str, Any] | None = None,
bases: Sequence[type[Any] | str] | None = None,
managers: Sequence[tuple[str, Manager[Any]]] | None = None,
) -> None: ...
class DeleteModel(ModelOperation): ...
class RenameModel(ModelOperation):
old_name: str
new_name: str
def __init__(self, old_name: str, new_name: str) -> None: ...
@cached_property
def old_name_lower(self) -> str: ...
@cached_property
def new_name_lower(self) -> str: ...
class ModelOptionOperation(ModelOperation): ...
class AlterModelTable(ModelOptionOperation):
table: str | None
def __init__(self, name: str, table: str | None) -> None: ...
class AlterModelTableComment(ModelOptionOperation):
table_comment: str
def __init__(self, name: str, table_comment: str) -> None: ...
@override
def state_forwards(self, app_label: str, state: Any) -> None: ...
@override
def database_forwards(
self, app_label: str, schema_editor: BaseDatabaseSchemaEditor, from_state: Any, to_state: Any
) -> None: ...
@override
def database_backwards(
self, app_label: str, schema_editor: BaseDatabaseSchemaEditor, from_state: Any, to_state: Any
) -> None: ...
@override
def describe(self) -> str: ...
@property
@override
def migration_name_fragment(self) -> str: ...
class AlterTogetherOptionOperation(ModelOptionOperation):
option_name: str
def __init__(
self,
name: str,
option_value: _OptionTogetherT | None,
) -> None: ...
@cached_property
def option_value(self) -> set[tuple[str, ...]] | None: ...
@override
def state_forwards(self, app_label: str, state: Any) -> None: ...
@override
def database_forwards(
self, app_label: str, schema_editor: BaseDatabaseSchemaEditor, from_state: Any, to_state: Any
) -> None: ...
@override
def database_backwards(
self, app_label: str, schema_editor: BaseDatabaseSchemaEditor, from_state: Any, to_state: Any
) -> None: ...
@override
def references_field(self, model_name: str, name: str, app_label: str) -> bool: ...
@override
def describe(self) -> str: ...
@property
@override
def migration_name_fragment(self) -> str: ...
class AlterUniqueTogether(AlterTogetherOptionOperation):
option_name: str
unique_together: set[tuple[str, ...]] | None
def __init__(self, name: str, unique_together: _OptionTogetherT | None) -> None: ...
class AlterIndexTogether(AlterTogetherOptionOperation):
option_name: str
index_together: set[tuple[str, ...]] | None
def __init__(self, name: str, index_together: _OptionTogetherT | None) -> None: ...
class AlterOrderWithRespectTo(ModelOptionOperation):
option_name: str
order_with_respect_to: str | None
def __init__(self, name: str, order_with_respect_to: str | None) -> None: ...
class AlterModelOptions(ModelOptionOperation):
ALTER_OPTION_KEYS: list[str]
options: dict[str, Any]
def __init__(self, name: str, options: dict[str, Any]) -> None: ...
class AlterModelManagers(ModelOptionOperation):
managers: Sequence[tuple[str, Manager[Any]]]
def __init__(self, name: str, managers: Sequence[tuple[str, Manager[Any]]]) -> None: ...
class IndexOperation(Operation):
option_name: str
@cached_property
def model_name_lower(self) -> str: ...
class AddIndex(IndexOperation):
model_name: str
index: Index
def __init__(self, model_name: str, index: Index) -> None: ...
class RemoveIndex(IndexOperation):
model_name: str
name: str
def __init__(self, model_name: str, name: str) -> None: ...
class RenameIndex(IndexOperation):
model_name: str
new_name: str
old_name: str | None
old_fields: Sequence[str] | None
def __init__(
self,
model_name: str,
new_name: str,
old_name: str | None = None,
old_fields: Sequence[str] | None = None,
) -> None: ...
@cached_property
def old_name_lower(self) -> str: ...
@cached_property
def new_name_lower(self) -> str: ...
class AddConstraint(IndexOperation):
model_name: str
constraint: BaseConstraint
def __init__(self, model_name: str, constraint: BaseConstraint) -> None: ...
class RemoveConstraint(IndexOperation):
model_name: str
name: str
def __init__(self, model_name: str, name: str) -> None: ...
class AlterConstraint(IndexOperation):
model_name: str
name: str
constraint: BaseConstraint
def __init__(self, model_name: str, name: str, constraint: BaseConstraint) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/operations/special.pyi 0000664 0000000 0000000 00000003760 15260643574 0030542 0 ustar 00root root 0000000 0000000 from collections.abc import Mapping, Sequence
from typing import Any, Literal, Protocol, TypeAlias, type_check_only
from django.db.backends.base.schema import BaseDatabaseSchemaEditor
from django.db.migrations.state import StateApps
from django.utils.datastructures import _ListOrTuple
from typing_extensions import override
from .base import Operation
_SqlOperations: TypeAlias = str | _ListOrTuple[str | tuple[str, dict[str, Any] | _ListOrTuple[Any] | None]]
class SeparateDatabaseAndState(Operation):
database_operations: Sequence[Operation]
state_operations: Sequence[Operation]
def __init__(
self,
database_operations: Sequence[Operation] | None = None,
state_operations: Sequence[Operation] | None = None,
) -> None: ...
class RunSQL(Operation):
noop: Literal[""]
sql: _SqlOperations
reverse_sql: _SqlOperations | None
state_operations: Sequence[Operation]
hints: Mapping[str, Any]
def __init__(
self,
sql: _SqlOperations,
reverse_sql: _SqlOperations | None = None,
state_operations: Sequence[Operation] | None = None,
hints: Mapping[str, Any] | None = None,
elidable: bool = False,
) -> None: ...
@property
@override
def reversible(self) -> bool: ... # type: ignore[override]
@type_check_only
class _CodeCallable(Protocol):
def __call__(self, state_apps: StateApps, schema_editor: BaseDatabaseSchemaEditor, /) -> None: ...
class RunPython(Operation):
code: _CodeCallable
reverse_code: _CodeCallable | None
hints: Mapping[str, Any]
def __init__(
self,
code: _CodeCallable,
reverse_code: _CodeCallable | None = None,
atomic: bool | None = None,
hints: Mapping[str, Any] | None = None,
elidable: bool = False,
) -> None: ...
@staticmethod
def noop(apps: StateApps, schema_editor: BaseDatabaseSchemaEditor) -> None: ...
@property
@override
def reversible(self) -> bool: ... # type: ignore[override]
typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/optimizer.pyi 0000664 0000000 0000000 00000000442 15260643574 0026753 0 ustar 00root root 0000000 0000000 from django.db.migrations.operations.base import Operation
class MigrationOptimizer:
def optimize(self, operations: list[Operation], app_label: str | None) -> list[Operation]: ...
def optimize_inner(self, operations: list[Operation], app_label: str | None) -> list[Operation]: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/questioner.pyi 0000664 0000000 0000000 00000003706 15260643574 0027135 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any
from django.core.management.base import OutputWrapper
from django.db.migrations.state import ModelState
from django.db.models.fields import Field
class MigrationQuestioner:
defaults: dict[str, Any]
specified_apps: set[str]
dry_run: bool | None
def __init__(
self,
defaults: dict[str, bool] | None = None,
specified_apps: set[str] | None = None,
dry_run: bool | None = None,
) -> None: ...
def ask_initial(self, app_label: str) -> bool: ...
def ask_not_null_addition(self, field_name: str, model_name: str) -> Any: ...
def ask_not_null_alteration(self, field_name: Any, model_name: Any) -> Any: ...
def ask_rename(self, model_name: str, old_name: str, new_name: str, field_instance: Field[Any, Any]) -> bool: ...
def ask_rename_model(self, old_model_state: ModelState, new_model_state: ModelState) -> bool: ...
def ask_merge(self, app_label: str) -> bool: ...
def ask_auto_now_add_addition(self, field_name: str, model_name: str) -> Any: ...
def ask_unique_callable_default_addition(self, field_name: str, model_name: str) -> None: ...
class InteractiveMigrationQuestioner(MigrationQuestioner):
prompt_output: OutputWrapper
def __init__(
self,
defaults: dict[str, bool] | None = None,
specified_apps: set[str] | None = None,
dry_run: bool | None = None,
prompt_output: OutputWrapper | None = None,
) -> None: ...
class NonInteractiveMigrationQuestioner(MigrationQuestioner):
verbosity: int
log: Callable[[str], None] | None
def __init__(
self,
defaults: dict[str, bool] | None = None,
specified_apps: set[str] | None = None,
dry_run: bool | None = None,
verbosity: int = 1,
log: Callable[[str], None] | None = None,
) -> None: ...
def log_lack_of_migration(self, field_name: str, model_name: str, reason: str) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/recorder.pyi 0000664 0000000 0000000 00000001545 15260643574 0026543 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar, Self
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models.base import Model
from django.db.models.manager import Manager
from django.db.models.query import QuerySet
class MigrationRecorder:
class Migration(Model):
app: Any
name: Any
applied: Any
objects: ClassVar[Manager[Self]]
connection: BaseDatabaseWrapper
def __init__(self, connection: BaseDatabaseWrapper) -> None: ...
@property
def migration_qs(self) -> QuerySet[Migration]: ...
def has_table(self) -> bool: ...
def ensure_schema(self) -> None: ...
def applied_migrations(self) -> dict[tuple[str, str], Migration]: ...
def record_applied(self, app: str, name: str) -> None: ...
def record_unapplied(self, app: str, name: str) -> None: ...
def flush(self) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/serializer.pyi 0000664 0000000 0000000 00000004157 15260643574 0027111 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any
FUNCTION_TYPES: tuple[type, ...]
class BaseSerializer:
value: Any
def __init__(self, value: Any) -> None: ...
def serialize(self) -> tuple[str, set[str]]: ...
class BaseSequenceSerializer(BaseSerializer): ...
class BaseUnorderedSequenceSerializer(BaseSequenceSerializer): ...
class BaseSimpleSerializer(BaseSerializer): ...
class DateTimeSerializer(BaseSerializer): ...
class DatetimeDatetimeSerializer(BaseSerializer): ...
class DecimalSerializer(BaseSerializer): ...
class ChoicesSerializer(BaseSerializer): ...
class DatabaseOnDeleteSerializer(BaseSerializer): ...
class DeconstructibleSerializer(BaseSerializer):
@staticmethod
def serialize_deconstructed(
path: str, args: list[Any], kwargs: dict[str, Callable[..., Any] | int | str]
) -> tuple[str, set[str]]: ...
class DictionarySerializer(BaseSerializer): ...
class EnumSerializer(BaseSerializer): ...
class FloatSerializer(BaseSimpleSerializer): ...
class FrozensetSerializer(BaseUnorderedSequenceSerializer): ...
class FunctionTypeSerializer(BaseSerializer): ...
class FunctoolsPartialSerializer(BaseSerializer): ...
class GenericAliasSerializer(BaseSerializer): ...
class IterableSerializer(BaseSerializer): ...
class ModelFieldSerializer(DeconstructibleSerializer): ...
class ModelManagerSerializer(DeconstructibleSerializer): ...
class OperationSerializer(BaseSerializer): ...
class PathLikeSerializer(BaseSerializer): ...
class PathSerializer(BaseSerializer): ...
class RegexSerializer(BaseSerializer): ...
class SequenceSerializer(BaseSequenceSerializer): ...
class SetSerializer(BaseUnorderedSequenceSerializer): ...
class SettingsReferenceSerializer(BaseSerializer): ...
class TupleSerializer(BaseSequenceSerializer): ...
class TypeSerializer(BaseSerializer): ...
class UUIDSerializer(BaseSerializer): ...
class ZoneInfoSerializer(BaseSerializer): ...
def serializer_factory(value: Any) -> BaseSerializer: ...
class Serializer:
@classmethod
def register(cls, type_: type, serializer: type[BaseSerializer]) -> None: ...
@classmethod
def unregister(cls, type_: type) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/state.pyi 0000664 0000000 0000000 00000012256 15260643574 0026057 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable, Iterator, Sequence
from contextlib import AbstractContextManager
from typing import Any
from django.apps import AppConfig
from django.apps.registry import Apps
from django.db.models.base import Model
from django.db.models.fields import Field
from django.db.models.manager import Manager
from django.utils.functional import cached_property
from typing_extensions import override
class AppConfigStub(AppConfig):
def __init__(self, label: str) -> None: ...
class ModelState:
name: str
app_label: str
fields: dict[str, Field[Any, Any]]
options: dict[str, Any]
bases: Sequence[type[Model] | str]
managers: list[tuple[str, Manager[Any]]]
def __init__(
self,
app_label: str,
name: str,
fields: list[tuple[str, Field[Any, Any]]] | dict[str, Field[Any, Any]],
options: dict[str, Any] | None = None,
bases: Sequence[type[Model] | str] | None = None,
managers: list[tuple[str, Manager[Any]]] | None = None,
) -> None: ...
def clone(self) -> ModelState: ...
def construct_managers(self) -> Iterator[tuple[str, Manager[Any]]]: ...
@classmethod
def from_model(cls, model: type[Model], exclude_rels: bool = False) -> ModelState: ...
def get_field(self, field_name: str) -> Field[Any, Any]: ...
@cached_property
def name_lower(self) -> str: ...
def render(self, apps: Apps) -> Any: ...
def get_index_by_name(self, name: str) -> Any: ...
def get_constraint_by_name(self, name: str) -> Any: ...
@override
def __eq__(self, other: object) -> bool: ...
def get_related_models_tuples(model: type[Model]) -> set[tuple[str, str]]: ...
def get_related_models_recursive(model: type[Model]) -> set[tuple[str, str]]: ...
class ProjectState:
is_delayed: bool
models: dict[Any, Any]
real_apps: set[str]
def __init__(
self, models: dict[tuple[str, str], ModelState] | None = None, real_apps: set[str] | None = None
) -> None: ...
@property
def relations(self) -> Any: ...
def add_model(self, model_state: ModelState) -> None: ...
@cached_property
def apps(self) -> StateApps: ...
def clear_delayed_apps_cache(self) -> None: ...
def clone(self) -> ProjectState: ...
@classmethod
def from_apps(cls, apps: Apps) -> ProjectState: ...
def reload_model(self, app_label: str, model_name: str, delay: bool = False) -> None: ...
def reload_models(self, models: list[Any], delay: bool = True) -> None: ...
def remove_model(self, app_label: str, model_name: str) -> None: ...
def rename_model(self, app_label: str, old_name: str, new_name: str) -> None: ...
def alter_model_options(
self, app_label: str, model_name: str, options: dict[str, Any], option_keys: Iterable[str] | None = None
) -> None: ...
def remove_model_options(self, app_label: str, model_name: str, option_name: str, value_to_remove: Any) -> None: ...
def alter_model_managers(
self, app_label: str, model_name: str, managers: list[tuple[str, Manager[Any]]]
) -> None: ...
def add_index(self, app_label: str, model_name: str, index: Any) -> None: ...
def remove_index(self, app_label: str, model_name: str, index_name: str) -> None: ...
def rename_index(self, app_label: str, model_name: str, old_index_name: str, new_index_name: str) -> None: ...
def add_constraint(self, app_label: str, model_name: str, constraint: Any) -> None: ...
def remove_constraint(self, app_label: str, model_name: str, constraint_name: str) -> None: ...
def alter_constraint(self, app_label: str, model_name: str, constraint_name: str, constraint: Any) -> None: ...
def add_field(
self, app_label: str, model_name: str, name: str, field: Field[Any, Any], preserve_default: Any
) -> None: ...
def remove_field(self, app_label: str, model_name: str, name: str) -> None: ...
def alter_field(
self, app_label: str, model_name: str, name: str, field: Field[Any, Any], preserve_default: Any
) -> None: ...
def rename_field(self, app_label: str, model_name: str, old_name: str, new_name: str) -> None: ...
def update_model_field_relation(
self, model: type[Model], model_key: tuple[str, str], field_name: str, field: Field[Any, Any], concretes: Any
) -> None: ...
def resolve_model_field_relations(
self, model_key: tuple[str, str], field_name: str, field: Field[Any, Any], concretes: Any | None = None
) -> None: ...
def resolve_model_relations(self, model_key: tuple[str, str], concretes: Any | None = None) -> None: ...
def resolve_fields_and_relations(self) -> None: ...
def get_concrete_model_key(self, model: type[Model]) -> Any: ...
class StateApps(Apps):
real_models: list[ModelState]
def __init__(
self, real_apps: list[str], models: dict[tuple[str, str], ModelState], ignore_swappable: bool = False
) -> None: ...
def bulk_update(self) -> AbstractContextManager[None]: ...
def clone(self) -> StateApps: ...
def render_multiple(self, model_states: list[ModelState]) -> None: ...
@override
def register_model(self, app_label: str, model: type[Model]) -> None: ...
def unregister_model(self, app_label: str, model_name: str) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/utils.pyi 0000664 0000000 0000000 00000002305 15260643574 0026071 0 ustar 00root root 0000000 0000000 from collections.abc import Iterator
from typing import Any, Literal, NamedTuple
from django.db.migrations.state import ModelState, ProjectState
from django.db.models import Field, Model
COMPILED_REGEX_TYPE: Any
RECURSIVE_RELATIONSHIP_CONSTANT: str
class RegexObject:
pattern: str
flags: int
def __init__(self, obj: Any) -> None: ...
def get_migration_name_timestamp() -> str: ...
def resolve_relation(
model: str | type[Model], app_label: str | None = None, model_name: str | None = None
) -> tuple[str, str]: ...
class FieldReference(NamedTuple):
to: Any
through: Any
def field_references(
model_tuple: tuple[str, str],
field: Field[Any, Any],
reference_model_tuple: tuple[str, str],
reference_field_name: str | None = None,
reference_field: Field[Any, Any] | None = None,
) -> Literal[False] | FieldReference: ...
def get_references(
state: ProjectState,
model_tuple: tuple[str, str],
field_tuple: tuple[()] | tuple[str, Field[Any, Any]] = (),
) -> Iterator[tuple[ModelState, str, Field[Any, Any], FieldReference]]: ...
def field_is_referenced(
state: ProjectState, model_tuple: tuple[str, str], field_tuple: tuple[str, Field[Any, Any]]
) -> bool: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/writer.pyi 0000664 0000000 0000000 00000002322 15260643574 0026244 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.migrations.migration import Migration
from django.db.migrations.operations.base import Operation
from django.db.migrations.serializer import BaseSerializer
class OperationWriter:
operation: Operation
buff: list[Any]
indentation: int
def __init__(self, operation: Operation, indentation: int = 2) -> None: ...
def serialize(self) -> tuple[str, set[str]]: ...
def indent(self) -> None: ...
def unindent(self) -> None: ...
def feed(self, line: str) -> None: ...
def render(self) -> str: ...
class MigrationWriter:
migration: Migration
needs_manual_porting: bool
def __init__(self, migration: Migration, include_header: bool = True) -> None: ...
def as_string(self) -> str: ...
@property
def basedir(self) -> str: ...
@property
def filename(self) -> str: ...
@property
def path(self) -> str: ...
@classmethod
def serialize(cls, value: Any) -> tuple[str, set[str]]: ...
@classmethod
def register_serializer(cls, type_: type, serializer: type[BaseSerializer]) -> None: ...
@classmethod
def unregister_serializer(cls, type_: type) -> None: ...
MIGRATION_HEADER_TEMPLATE: str
MIGRATION_TEMPLATE: str
typeddjango-django-stubs-fa03b48/django-stubs/db/models/ 0000775 0000000 0000000 00000000000 15260643574 0023315 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/db/models/__init__.pyi 0000664 0000000 0000000 00000017117 15260643574 0025606 0 ustar 00root root 0000000 0000000 from django.core.exceptions import ObjectDoesNotExist as ObjectDoesNotExist
from . import lookups as lookups
from . import signals as signals
from .aggregates import Aggregate as Aggregate
from .aggregates import AnyValue as AnyValue
from .aggregates import Avg as Avg
from .aggregates import BitAnd as BitAnd
from .aggregates import BitOr as BitOr
from .aggregates import BitXor as BitXor
from .aggregates import Count as Count
from .aggregates import Max as Max
from .aggregates import Min as Min
from .aggregates import StdDev as StdDev
from .aggregates import StringAgg as StringAgg
from .aggregates import Sum as Sum
from .aggregates import Variance as Variance
from .base import DEFERRED as DEFERRED
from .base import Model as Model
from .constraints import BaseConstraint as BaseConstraint
from .constraints import CheckConstraint as CheckConstraint
from .constraints import Deferrable as Deferrable
from .constraints import UniqueConstraint as UniqueConstraint
from .deletion import CASCADE as CASCADE
from .deletion import DB_CASCADE as DB_CASCADE
from .deletion import DB_SET_DEFAULT as DB_SET_DEFAULT
from .deletion import DB_SET_NULL as DB_SET_NULL
from .deletion import DO_NOTHING as DO_NOTHING
from .deletion import PROTECT as PROTECT
from .deletion import RESTRICT as RESTRICT
from .deletion import SET as SET
from .deletion import SET_DEFAULT as SET_DEFAULT
from .deletion import SET_NULL as SET_NULL
from .deletion import ProtectedError as ProtectedError
from .deletion import RestrictedError as RestrictedError
from .enums import Choices as Choices
from .enums import IntegerChoices as IntegerChoices
from .enums import TextChoices as TextChoices
from .expressions import Case as Case
from .expressions import Exists as Exists
from .expressions import Expression as Expression
from .expressions import ExpressionList as ExpressionList
from .expressions import ExpressionWrapper as ExpressionWrapper
from .expressions import F as F
from .expressions import Func as Func
from .expressions import JSONNull as JSONNull
from .expressions import OrderBy as OrderBy
from .expressions import OuterRef as OuterRef
from .expressions import RowRange as RowRange
from .expressions import Subquery as Subquery
from .expressions import Value as Value
from .expressions import ValueRange as ValueRange
from .expressions import When as When
from .expressions import Window as Window
from .expressions import WindowFrame as WindowFrame
from .expressions import WindowFrameExclusion as WindowFrameExclusion
from .fetch_modes import FETCH_ONE as FETCH_ONE
from .fetch_modes import FETCH_PEERS as FETCH_PEERS
from .fetch_modes import FETCH_RAISE as FETCH_RAISE
from .fields import BLANK_CHOICE_DASH as BLANK_CHOICE_DASH
from .fields import BLANK_CHOICE_LABEL as BLANK_CHOICE_LABEL
from .fields import NOT_PROVIDED as NOT_PROVIDED
from .fields import AutoField as AutoField
from .fields import BigAutoField as BigAutoField
from .fields import BigIntegerField as BigIntegerField
from .fields import BinaryField as BinaryField
from .fields import BooleanField as BooleanField
from .fields import CharField as CharField
from .fields import CommaSeparatedIntegerField as CommaSeparatedIntegerField
from .fields import DateField as DateField
from .fields import DateTimeField as DateTimeField
from .fields import DecimalField as DecimalField
from .fields import DurationField as DurationField
from .fields import EmailField as EmailField
from .fields import Empty as Empty
from .fields import Field as Field
from .fields import FilePathField as FilePathField
from .fields import FloatField as FloatField
from .fields import GenericIPAddressField as GenericIPAddressField
from .fields import IntegerField as IntegerField
from .fields import IPAddressField as IPAddressField
from .fields import NullBooleanField as NullBooleanField
from .fields import PositiveBigIntegerField as PositiveBigIntegerField
from .fields import PositiveIntegerField as PositiveIntegerField
from .fields import PositiveSmallIntegerField as PositiveSmallIntegerField
from .fields import SlugField as SlugField
from .fields import SmallAutoField as SmallAutoField
from .fields import SmallIntegerField as SmallIntegerField
from .fields import TextField as TextField
from .fields import TimeField as TimeField
from .fields import URLField as URLField
from .fields import UUIDField as UUIDField
from .fields.composite import CompositePrimaryKey
from .fields.files import FileField as FileField
from .fields.files import ImageField as ImageField
from .fields.generated import GeneratedField as GeneratedField
from .fields.json import JSONField as JSONField
from .fields.proxy import OrderWrt as OrderWrt
from .fields.related import ForeignKey as ForeignKey
from .fields.related import ForeignObject as ForeignObject
from .fields.related import ForeignObjectRel as ForeignObjectRel
from .fields.related import ManyToManyField as ManyToManyField
from .fields.related import ManyToManyRel as ManyToManyRel
from .fields.related import ManyToOneRel as ManyToOneRel
from .fields.related import OneToOneField as OneToOneField
from .fields.related import OneToOneRel as OneToOneRel
from .indexes import Index as Index
from .lookups import Lookup as Lookup
from .lookups import Transform as Transform
from .manager import Manager as Manager
from .query import Prefetch as Prefetch
from .query import QuerySet as QuerySet
from .query import aprefetch_related_objects as aprefetch_related_objects
from .query import prefetch_related_objects as prefetch_related_objects
from .query_utils import FilteredRelation as FilteredRelation
from .query_utils import Q as Q
__all__ = [
"BLANK_CHOICE_DASH",
"BLANK_CHOICE_LABEL",
"CASCADE",
"DB_CASCADE",
"DB_SET_DEFAULT",
"DB_SET_NULL",
"DEFERRED",
"DO_NOTHING",
"FETCH_ONE",
"FETCH_PEERS",
"FETCH_RAISE",
"NOT_PROVIDED",
"PROTECT",
"RESTRICT",
"SET",
"SET_DEFAULT",
"SET_NULL",
"Aggregate",
"AnyValue",
"AutoField",
"Avg",
"BaseConstraint",
"BigAutoField",
"BigIntegerField",
"BinaryField",
"BitAnd",
"BitOr",
"BitXor",
"BooleanField",
"Case",
"CharField",
"CheckConstraint",
"Choices",
"CommaSeparatedIntegerField",
"CompositePrimaryKey",
"Count",
"DateField",
"DateTimeField",
"DecimalField",
"Deferrable",
"DurationField",
"EmailField",
"Empty",
"Exists",
"Expression",
"ExpressionList",
"ExpressionWrapper",
"F",
"Field",
"FileField",
"FilePathField",
"FilteredRelation",
"FloatField",
"ForeignKey",
"ForeignObject",
"ForeignObjectRel",
"Func",
"GeneratedField",
"GenericIPAddressField",
"IPAddressField",
"ImageField",
"Index",
"IntegerChoices",
"IntegerField",
"JSONField",
"JSONNull",
"Lookup",
"Manager",
"ManyToManyField",
"ManyToManyRel",
"ManyToOneRel",
"Max",
"Min",
"Model",
"NullBooleanField",
"ObjectDoesNotExist",
"OneToOneField",
"OneToOneRel",
"OrderBy",
"OrderWrt",
"OuterRef",
"PositiveBigIntegerField",
"PositiveIntegerField",
"PositiveSmallIntegerField",
"Prefetch",
"ProtectedError",
"Q",
"QuerySet",
"RestrictedError",
"RowRange",
"SlugField",
"SmallAutoField",
"SmallIntegerField",
"StdDev",
"StringAgg",
"Subquery",
"Sum",
"TextChoices",
"TextField",
"TimeField",
"Transform",
"URLField",
"UUIDField",
"UniqueConstraint",
"Value",
"ValueRange",
"Variance",
"When",
"Window",
"WindowFrame",
"WindowFrameExclusion",
"aprefetch_related_objects",
"prefetch_related_objects",
"signals",
]
typeddjango-django-stubs-fa03b48/django-stubs/db/models/aggregates.pyi 0000664 0000000 0000000 00000007243 15260643574 0026157 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from typing import Any, ClassVar
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models.expressions import BaseExpression, Combinable, Func
from django.db.models.fields import IntegerField
from django.db.models.functions.mixins import FixDurationInputMixin, NumericOutputFieldMixin
from django.db.models.query import _OrderByFieldName
from django.db.models.query_utils import Q
from django.db.models.sql.compiler import SQLCompiler, _AsSqlType
from typing_extensions import override
class Aggregate(Func):
name: str | None
filter: Any
allow_distinct: bool
allow_order_by: bool
empty_result_set_value: int | None
def __init__(
self,
*expressions: Any,
distinct: bool = False,
filter: Q | BaseExpression | None = None,
default: Any | None = None,
order_by: _OrderByFieldName | Sequence[_OrderByFieldName] | None = None,
**extra: Any,
) -> None: ...
@property
def default_alias(self) -> str: ...
@override
def as_sql( # type: ignore[override]
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any
) -> _AsSqlType: ...
class AnyValue(Aggregate):
@override
def as_sql( # type: ignore[override]
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any
) -> _AsSqlType: ...
class Avg(FixDurationInputMixin, NumericOutputFieldMixin, Aggregate): ...
class BitAggregate(Aggregate):
def __init__(self, expression: Combinable | str, **extra: Any) -> None: ...
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class BitAnd(BitAggregate): ...
class BitOr(BitAggregate): ...
class BitXor(BitAggregate): ...
class Count(Aggregate):
output_field: ClassVar[IntegerField[Any, Any]]
def __init__(
self,
expression: Combinable | str,
filter: Q | BaseExpression | None = None,
*,
distinct: bool = False,
**extra: Any,
) -> None: ...
class Max(Aggregate): ...
class Min(Aggregate): ...
class StdDev(NumericOutputFieldMixin, Aggregate):
def __init__(
self,
expression: Combinable | str,
sample: bool = False,
*,
filter: Q | BaseExpression | None = None,
default: Any | None = None,
**extra: Any,
) -> None: ...
class StringAgg(Aggregate):
def __init__(
self,
expression: Combinable | str,
delimiter: str | Combinable,
*,
distinct: bool = False,
filter: Q | BaseExpression | None = None,
default: Any | None = None,
order_by: _OrderByFieldName | Sequence[_OrderByFieldName] | None = None,
**extra: Any,
) -> None: ...
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
@override
def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class Sum(FixDurationInputMixin, Aggregate): ...
class Variance(NumericOutputFieldMixin, Aggregate):
def __init__(
self,
expression: Combinable | str,
sample: bool = False,
*,
filter: Q | BaseExpression | None = None,
default: Any | None = None,
**extra: Any,
) -> None: ...
__all__ = [
"Aggregate",
"AnyValue",
"Avg",
"BitAnd",
"BitOr",
"BitXor",
"Count",
"Max",
"Min",
"StdDev",
"StringAgg",
"Sum",
"Variance",
]
typeddjango-django-stubs-fa03b48/django-stubs/db/models/base.pyi 0000664 0000000 0000000 00000015534 15260643574 0024762 0 ustar 00root root 0000000 0000000 from collections.abc import Collection, Iterable, Sequence
from typing import Any, ClassVar, Final, Literal, Self, overload
from weakref import ReferenceType
from django.core.checks.messages import CheckMessage
from django.core.exceptions import MultipleObjectsReturned as BaseMultipleObjectsReturned
from django.core.exceptions import ObjectDoesNotExist, ObjectNotUpdated, ValidationError
from django.db.models import BaseConstraint, Field, QuerySet
from django.db.models.fetch_modes import FetchMode
from django.db.models.manager import Manager
from django.db.models.options import Options
from django.db.models.utils import AltersData
from django.utils.datastructures import _ListOrTuple
from typing_extensions import TypeVar, override
_Self = TypeVar("_Self", bound=Model)
class Deferred: ...
DEFERRED: Deferred
class ModelStateFieldsCacheDescriptor:
@overload
def __get__(self, instance: None, cls: type[ModelState] | None = None) -> Self: ...
@overload
def __get__(self, instance: ModelState, cls: type[ModelState] | None = None) -> dict[Any, Any]: ...
class ModelStateFetchModeDescriptor:
@overload
def __get__(self, instance: None, cls: type[ModelState] | None = None) -> Self: ...
@overload
def __get__(self, instance: ModelState, cls: type[ModelState] | None = None) -> FetchMode: ...
class ModelState:
db: str | None
adding: bool
fields_cache: ModelStateFieldsCacheDescriptor
fetch_mode: ModelStateFetchModeDescriptor
peers: _ListOrTuple[ReferenceType[Model]]
@override
def __getstate__(self) -> dict[str, Any]: ...
def __del__(self) -> None: ...
class ModelBase(type):
def __new__(cls, name: str, bases: tuple[type, ...], attrs: dict[str, Any], **kwargs: Any) -> ModelBase: ...
def add_to_class(cls, name: str, value: Any) -> None: ...
@property
def _base_manager(cls: type[_Self]) -> Manager[_Self]: ... # type: ignore[misc]
@property
def _default_manager(cls: type[_Self]) -> Manager[_Self]: ... # type: ignore[misc]
# Class level only access for the `objects` manager when it's not defined explicitly.
# Because this acts as a fallback (matching django adding this manager if not defined), it resolves conflict
# we previously had with pyright and pyrefly when overriding `objects`.
# See https://github.com/typeddjango/django-stubs/pull/3559#issue-5057479304
def __getattr__(cls: type[_Self], name: Literal["objects"]) -> Manager[_Self]: ...
class Model(AltersData, metaclass=ModelBase):
# These attributes should only exist on concrete subclasses, not abstract models, and are
# generated by the metaclass. To replicate this runtime behavior, the mypy plugin will delete
# them, replacing them only on concrete subclasses. In the case of the exception subclasses,
# the correct inheritance hierarchy including any concrete parents will also be reproduced.
# Other type checkers will not understand the absence of these from abstract models, nor the
# correct exception hierarchy unless they re-implement the plugin logic themselves.
DoesNotExist: Final[type[ObjectDoesNotExist]]
NotUpdated: Final[type[ObjectNotUpdated]]
MultipleObjectsReturned: Final[type[BaseMultipleObjectsReturned]]
_meta: ClassVar[Options[Self]]
pk: Any
_state: ModelState
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
@classmethod
def from_db(
cls,
db: str | None,
field_names: Collection[str],
values: Collection[Any],
*,
fetch_mode: FetchMode | None = None,
) -> Self: ...
@override
def __getstate__(self) -> dict[str, Any]: ...
def _get_pk_val(self, meta: Options[Model] | None = None) -> str: ...
def get_deferred_fields(self) -> set[str]: ...
def refresh_from_db(
self,
using: str | None = None,
fields: Iterable[str] | None = None,
from_queryset: QuerySet[Self] | None = None,
) -> None: ...
async def arefresh_from_db(
self,
using: str | None = None,
fields: Iterable[str] | None = None,
from_queryset: QuerySet[Self] | None = None,
) -> None: ...
def serializable_value(self, field_name: str) -> Any: ...
def save(
self,
*,
force_insert: bool | tuple[ModelBase, ...] = False,
force_update: bool = False,
using: str | None = None,
update_fields: Iterable[str] | None = None,
) -> None: ...
async def asave(
self,
*,
force_insert: bool | tuple[ModelBase, ...] = False,
force_update: bool = False,
using: str | None = None,
update_fields: Iterable[str] | None = None,
) -> None: ...
def save_base(
self,
raw: bool = False,
force_insert: bool | tuple[ModelBase, ...] = False,
force_update: bool = False,
using: str | None = None,
update_fields: Iterable[str] | None = None,
) -> None: ...
def _do_update(
self,
base_qs: QuerySet[Self],
using: str | None,
pk_val: Any,
values: Collection[tuple[Field[Any, Any], type[Model] | None, Any]],
update_fields: Iterable[str] | None,
forced_update: bool,
returning_fields: Sequence[Field[Any, Any]],
) -> list[Sequence[Any]]: ...
def delete(self, using: Any | None = None, keep_parents: bool = False) -> tuple[int, dict[str, int]]: ...
async def adelete(self, using: Any | None = None, keep_parents: bool = False) -> tuple[int, dict[str, int]]: ...
def prepare_database_save(self, field: Field[Any, Any]) -> Any: ...
def clean(self) -> None: ...
def validate_unique(self, exclude: Collection[str] | None = None) -> None: ...
def date_error_message(self, lookup_type: str, field_name: str, unique_for: str) -> ValidationError: ...
def unique_error_message(self, model_class: type[Model], unique_check: Sequence[str]) -> ValidationError: ...
def get_constraints(self) -> list[tuple[type[Model], Sequence[BaseConstraint]]]: ...
def validate_constraints(self, exclude: Collection[str] | None = None) -> None: ...
def full_clean(
self, exclude: Iterable[str] | None = None, validate_unique: bool = True, validate_constraints: bool = True
) -> None: ...
def clean_fields(self, exclude: Collection[str] | None = None) -> None: ...
@classmethod
def check(cls, **kwargs: Any) -> list[CheckMessage]: ...
def subclass_exception(
name: str, bases: tuple[type[BaseException], ...], module: str, attached_to: type[Model]
) -> type[BaseException]: ...
def method_set_order(
self: Model, ordered_obj: type[Model], id_list: Iterable[Any], using: str | None = None
) -> None: ...
def method_get_order(self: Model, ordered_obj: type[Model]) -> QuerySet[Any]: ...
def make_foreign_order_accessors(model: type[Model], related_model: type[Model]) -> None: ...
def model_unpickle(model_id: tuple[str, str] | type[Model]) -> Model: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/models/constants.pyi 0000664 0000000 0000000 00000000220 15260643574 0026046 0 ustar 00root root 0000000 0000000 from enum import Enum
from typing import cast
LOOKUP_SEP: str
class OnConflict(Enum):
IGNORE = cast(str, ...)
UPDATE = cast(str, ...)
typeddjango-django-stubs-fa03b48/django-stubs/db/models/constraints.pyi 0000664 0000000 0000000 00000007643 15260643574 0026421 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from enum import Enum
from typing import Any, Self, cast, overload
from django.core.checks import CheckMessage
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.backends.base.schema import BaseDatabaseSchemaEditor
from django.db.models.base import Model
from django.db.models.expressions import BaseExpression, Combinable
from django.db.models.query_utils import Q
from django.utils.functional import _StrOrPromise
from typing_extensions import override
class Deferrable(Enum):
DEFERRED = cast(str, ...)
IMMEDIATE = cast(str, ...)
class BaseConstraint:
name: str
violation_error_code: str | None
violation_error_message: _StrOrPromise | None
default_violation_error_message: _StrOrPromise
non_db_attrs: tuple[str, ...]
def __init__(
self,
*,
name: str,
violation_error_code: str | None = None,
violation_error_message: _StrOrPromise | None = None,
) -> None: ...
@property
def contains_expressions(self) -> bool: ...
def constraint_sql(self, model: type[Model] | None, schema_editor: BaseDatabaseSchemaEditor | None) -> str: ...
def create_sql(self, model: type[Model] | None, schema_editor: BaseDatabaseSchemaEditor | None) -> str: ...
def remove_sql(self, model: type[Model] | None, schema_editor: BaseDatabaseSchemaEditor | None) -> str: ...
def validate(
self, model: type[Model], instance: Model, exclude: set[str] | None = None, using: str = "default"
) -> None: ...
def get_violation_error_message(self) -> _StrOrPromise | dict[str, Any]: ...
def check(self, model: type[Model], connection: BaseDatabaseWrapper) -> list[CheckMessage]: ...
def deconstruct(self) -> tuple[str, Sequence[Any], dict[str, Any]]: ...
def clone(self) -> Self: ...
class CheckConstraint(BaseConstraint):
condition: Q | BaseExpression
def __init__(
self,
*,
name: str,
condition: Q | BaseExpression,
violation_error_code: str | None = None,
violation_error_message: _StrOrPromise | None = None,
) -> None: ...
@override
def check(self, model: type[Model], connection: BaseDatabaseWrapper) -> list[CheckMessage]: ...
@override
def validate(
self, model: type[Model], instance: Model, exclude: set[str] | None = None, using: str = "default"
) -> None: ...
class UniqueConstraint(BaseConstraint):
expressions: Sequence[BaseExpression | Combinable]
fields: Sequence[str]
condition: Q | None
deferrable: Deferrable | None
nulls_distinct: bool | None
@overload
def __init__(
self,
*expressions: str | BaseExpression | Combinable,
fields: None = None,
name: str,
condition: Q | None = None,
deferrable: Deferrable | None = None,
include: Sequence[str] | None = None,
opclasses: Sequence[Any] = (),
nulls_distinct: bool | None = None,
violation_error_code: str | None = None,
violation_error_message: _StrOrPromise | None = None,
) -> None: ...
@overload
def __init__(
self,
*,
fields: Sequence[str],
name: str,
condition: Q | None = None,
deferrable: Deferrable | None = None,
include: Sequence[str] | None = None,
opclasses: Sequence[Any] = (),
nulls_distinct: bool | None = None,
violation_error_code: str | None = None,
violation_error_message: _StrOrPromise | None = None,
) -> None: ...
@property
@override
def contains_expressions(self) -> bool: ...
@override
def check(self, model: type[Model], connection: BaseDatabaseWrapper) -> list[CheckMessage]: ...
@override
def validate(
self, model: type[Model], instance: Model, exclude: set[str] | None = None, using: str = "default"
) -> None: ...
__all__ = ["BaseConstraint", "CheckConstraint", "Deferrable", "UniqueConstraint"]
typeddjango-django-stubs-fa03b48/django-stubs/db/models/deletion.pyi 0000664 0000000 0000000 00000010746 15260643574 0025653 0 ustar 00root root 0000000 0000000 from collections import defaultdict
from collections.abc import Callable, Iterable, Iterator, Sequence
from typing import Any, TypeAlias
from django.db import IntegrityError
from django.db.backends.base.schema import BaseDatabaseSchemaEditor
from django.db.models.base import Model
from django.db.models.fields import Field
from django.db.models.options import Options
from django.db.models.query import QuerySet
from django.utils.datastructures import _IndexableCollection
def CASCADE(
collector: Collector,
field: Field[Any, Any],
sub_objs: QuerySet[Model],
using: str,
) -> None: ...
def SET_NULL(
collector: Collector,
field: Field[Any, Any],
sub_objs: QuerySet[Model],
using: str,
) -> None: ...
def SET_DEFAULT(
collector: Collector,
field: Field[Any, Any],
sub_objs: QuerySet[Model],
using: str,
) -> None: ...
def DO_NOTHING(
collector: Collector,
field: Field[Any, Any],
sub_objs: QuerySet[Model],
using: str,
) -> None: ...
def PROTECT(
collector: Collector,
field: Field[Any, Any],
sub_objs: QuerySet[Model],
using: str,
) -> None: ...
def RESTRICT(
collector: Collector,
field: Field[Any, Any],
sub_objs: QuerySet[Model],
using: str,
) -> None: ...
def SET(value: Any) -> Callable[..., Any]: ...
_Collector: TypeAlias = Callable[[Collector, Field[Any, Any], QuerySet[Model], str], None]
class DatabaseOnDelete:
operation: str
forced_collector: _Collector | None
def __init__(self, operation: str, name: str, forced_collector: _Collector | None = ...) -> None: ...
def __call__(collector, field: Field[Any, Any], sub_objs: QuerySet[Model], using: str) -> None: ...
def on_delete_sql(self, schema_editor: BaseDatabaseSchemaEditor) -> str: ...
DB_CASCADE: DatabaseOnDelete
DB_SET_DEFAULT: DatabaseOnDelete
DB_SET_NULL: DatabaseOnDelete
SKIP_COLLECTION: frozenset[_Collector | DatabaseOnDelete]
def get_candidate_relations_to_delete(opts: Options[Model]) -> Iterable[Field[Any, Any]]: ...
class ProtectedError(IntegrityError):
protected_objects: set[Model]
def __init__(self, msg: str, protected_objects: set[Model]) -> None: ...
class RestrictedError(IntegrityError):
restricted_objects: set[Model]
def __init__(self, msg: str, restricted_objects: set[Model]) -> None: ...
class Collector:
using: str
origin: Model | QuerySet[Model] | None
data: dict[type[Model], set[Model] | list[Model]]
field_updates: defaultdict[tuple[Field[Any, Any], Any], list[Model]]
restricted_objects: defaultdict[Model, defaultdict[Field[Any, Any], set[Model]]]
fast_deletes: list[QuerySet[Model]]
dependencies: defaultdict[Model, set[Model]]
def __init__(
self, using: str, origin: Model | QuerySet[Model] | None = None, force_collection: bool = ...
) -> None: ...
def add(
self,
objs: _IndexableCollection[Model],
source: type[Model] | None = None,
nullable: bool = False,
reverse_dependency: bool = False,
) -> list[Model]: ...
def add_dependency(self, model: type[Model], dependency: type[Model], reverse_dependency: bool = False) -> None: ...
def add_field_update(self, field: Field[Any, Any], value: Any, objs: _IndexableCollection[Model]) -> None: ...
def add_restricted_objects(self, field: Field[Any, Any], objs: _IndexableCollection[Model]) -> None: ...
def clear_restricted_objects_from_set(self, model: type[Model], objs: set[Model]) -> None: ...
def clear_restricted_objects_from_queryset(self, model: type[Model], qs: QuerySet[Model]) -> None: ...
def can_fast_delete(self, objs: Model | Iterable[Model], from_field: Field[Any, Any] | None = None) -> bool: ...
def get_del_batches(
self, objs: _IndexableCollection[Model], fields: Iterable[Field[Any, Any]]
) -> Sequence[Sequence[Model]]: ...
def collect(
self,
objs: _IndexableCollection[Model | None],
source: type[Model] | None = None,
nullable: bool = False,
collect_related: bool = True,
source_attr: str | None = None,
reverse_dependency: bool = False,
keep_parents: bool = False,
fail_on_restricted: bool = True,
) -> None: ...
def related_objects(
self, related_model: type[Model], related_fields: Iterable[Field[Any, Any]], objs: _IndexableCollection[Model]
) -> QuerySet[Model]: ...
def instances_with_model(self) -> Iterator[tuple[type[Model], Model]]: ...
def sort(self) -> None: ...
def delete(self) -> tuple[int, dict[str, int]]: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/models/enums.pyi 0000664 0000000 0000000 00000005145 15260643574 0025174 0 ustar 00root root 0000000 0000000 import enum
import sys
from enum import EnumType, IntEnum, StrEnum
from enum import property as enum_property
from typing import Any, Literal, overload, type_check_only
from _typeshed import ConvertibleToInt
from _typeshed import Self as MetaclassSelf # noqa: TID251
from django.utils.functional import _StrOrPromise
from typing_extensions import override
class ChoicesType(EnumType):
__empty__: _StrOrPromise
def __new__(
metacls: type[MetaclassSelf], classname: str, bases: tuple[type, ...], classdict: enum._EnumDict, **kwds: Any
) -> MetaclassSelf: ...
@property
def names(self) -> list[str]: ...
@property
def choices(self) -> list[tuple[Any, _StrOrPromise]]: ...
@property
def labels(self) -> list[_StrOrPromise]: ...
@property
def values(self) -> list[Any]: ...
if sys.version_info < (3, 12):
@override
def __contains__(self, member: Any) -> bool: ...
class Choices(enum.Enum, metaclass=ChoicesType): # type: ignore[misc]
_label_: _StrOrPromise
do_not_call_in_templates: Literal[True]
@enum_property
def label(self) -> _StrOrPromise: ...
@enum_property
@override
def value(self) -> Any: ...
# fake, to keep simulate class properties
@type_check_only
class _IntegerChoicesType(ChoicesType):
@property
@override
def choices(self) -> list[tuple[int, _StrOrPromise]]: ...
@property
@override
def values(self) -> list[int]: ...
# In reality, the `__init__` overloads provided below should also support
# all the arguments of `int.__new__`/`str.__new__` (e.g. `base`, `encoding`).
# They are omitted on purpose to avoid having convoluted stubs for these enums:
class IntegerChoices(Choices, IntEnum, metaclass=_IntegerChoicesType): # type: ignore[misc]
_value_: int
@overload
def __init__(self, x: ConvertibleToInt) -> None: ...
@overload
def __init__(self, x: ConvertibleToInt, label: _StrOrPromise) -> None: ...
@enum_property
@override
def value(self) -> int: ...
# fake, to keep simulate class properties
@type_check_only
class _TextChoicesType(ChoicesType):
@property
@override
def choices(self) -> list[tuple[str, _StrOrPromise]]: ...
@property
@override
def values(self) -> list[str]: ...
class TextChoices(Choices, StrEnum, metaclass=_TextChoicesType): # type: ignore[misc]
_value_: str
@overload
def __init__(self, object: str) -> None: ...
@overload
def __init__(self, object: str, label: _StrOrPromise) -> None: ...
@enum_property
@override
def value(self) -> str: ...
__all__ = ["Choices", "IntegerChoices", "TextChoices"]
typeddjango-django-stubs-fa03b48/django-stubs/db/models/expressions.pyi 0000664 0000000 0000000 00000036545 15260643574 0026437 0 ustar 00root root 0000000 0000000 import datetime
from collections.abc import Callable, Iterator, Mapping, Sequence
from decimal import Decimal
from enum import Enum
from typing import Any, ClassVar, Generic, Literal, Never, Self, TypeAlias
from django.core.exceptions import FieldError
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models import Q, fields
from django.db.models.fields import Field
from django.db.models.lookups import Lookup, Transform
from django.db.models.query import QuerySet
from django.db.models.sql.compiler import SQLCompiler, _AsSqlType, _ParamsT
from django.db.models.sql.query import Query
from django.utils.deconstruct import _Deconstructible
from django.utils.functional import cached_property
from typing_extensions import TypeVar, override
_OutputField = TypeVar("_OutputField", bound=Field[Any, Any], default=Field[Any, Any])
_Numeric: TypeAlias = float | Decimal
_AddOperand: TypeAlias = datetime.datetime | datetime.timedelta | _Numeric | Combinable | str | None
_SubOperand: TypeAlias = datetime.datetime | datetime.timedelta | _Numeric | Combinable | None
_ExprListCompatible: TypeAlias = Sequence[BaseExpression | F | str] | BaseExpression | F | str
class SQLiteNumericMixin:
def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class OutputFieldIsNoneError(FieldError): ...
class Combinable:
ADD: str
SUB: str
MUL: str
DIV: str
POW: str
MOD: str
BITAND: str
BITOR: str
BITLEFTSHIFT: str
BITRIGHTSHIFT: str
BITXOR: str
def __neg__(self) -> CombinedExpression: ...
def __add__(self, other: _AddOperand) -> CombinedExpression: ...
def __sub__(self, other: _SubOperand) -> CombinedExpression: ...
def __mul__(self, other: datetime.timedelta | Combinable | _Numeric) -> CombinedExpression: ...
def __truediv__(self, other: Combinable | _Numeric) -> CombinedExpression: ...
def __mod__(self, other: int | Combinable) -> CombinedExpression: ...
def __pow__(self, other: _Numeric | Combinable) -> CombinedExpression: ...
def __and__(self, other: Combinable | Q) -> Q: ...
def bitand(self, other: int) -> CombinedExpression: ...
def bitleftshift(self, other: int) -> CombinedExpression: ...
def bitrightshift(self, other: int) -> CombinedExpression: ...
def __xor__(self, other: Combinable | Q) -> Q: ...
def bitxor(self, other: int) -> CombinedExpression: ...
def __or__(self, other: Combinable | Q) -> Q: ...
def bitor(self, other: int) -> CombinedExpression: ...
def __radd__(self, other: _AddOperand) -> CombinedExpression: ...
def __rsub__(self, other: _SubOperand) -> CombinedExpression: ...
def __rmul__(self, other: _Numeric | Combinable) -> CombinedExpression: ...
def __rtruediv__(self, other: _Numeric | Combinable) -> CombinedExpression: ...
def __rmod__(self, other: int | Combinable) -> CombinedExpression: ...
def __rpow__(self, other: _Numeric | Combinable) -> CombinedExpression: ...
def __rand__(self, other: Any) -> Combinable: ...
def __ror__(self, other: Any) -> Combinable: ...
def __rxor__(self, other: Any) -> Combinable: ...
def __invert__(self) -> NegatedExpression[Combinable]: ...
class BaseExpression:
empty_result_set_value: Any
is_summary: bool
filterable: bool
window_compatible: bool
allowed_default: bool
constraint_validation_compatible: bool
set_returning: bool
allows_composite_expressions: bool
def __init__(self, output_field: Field[Any, Any] | None = None) -> None: ...
def get_db_converters(self, connection: BaseDatabaseWrapper) -> list[Callable[..., Any]]: ...
def get_source_expressions(self) -> list[Any]: ...
def set_source_expressions(self, exprs: Sequence[Combinable | Expression]) -> None: ...
def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
@cached_property
def contains_aggregate(self) -> bool: ...
@cached_property
def contains_over_clause(self) -> bool: ...
@cached_property
def contains_column_references(self) -> bool: ...
@cached_property
def contains_subquery(self) -> bool: ...
def resolve_expression(
self,
query: Any | None = None,
allow_joins: bool = True,
reuse: set[str] | None = None,
summarize: bool = False,
for_save: bool = False,
) -> Self: ...
@property
def conditional(self) -> bool: ...
@property
def field(self) -> Field[Any, Any]: ...
@cached_property
def output_field(self) -> Field[Any, Any]: ...
@cached_property
def convert_value(self) -> Callable[..., Any]: ...
def get_lookup(self, lookup: str) -> type[Lookup] | None: ...
def get_transform(self, name: str) -> type[Transform] | None: ...
def relabeled_clone(self, change_map: Mapping[str, str]) -> Self: ...
def replace_expressions(self, replacements: Mapping[Self, Any]) -> Self: ...
def get_refs(self) -> set[str]: ...
def copy(self) -> Self: ...
def prefix_references(self, prefix: str) -> Self: ...
def get_group_by_cols(self) -> list[BaseExpression]: ...
def get_source_fields(self) -> list[Field[Any, Any] | None]: ...
def asc(self, **kwargs: Any) -> OrderBy: ...
def desc(self, **kwargs: Any) -> OrderBy: ...
def reverse_ordering(self) -> BaseExpression: ...
def flatten(self) -> Iterator[BaseExpression]: ...
def select_format(self, compiler: SQLCompiler, sql: str, params: _ParamsT) -> _AsSqlType: ...
def get_expression_for_validation(self) -> BaseExpression: ...
class Expression(_Deconstructible, BaseExpression, Combinable):
@cached_property
def identity(self) -> tuple[Any, ...]: ...
def register_combinable_fields(
lhs: type[Field[Any, Any]],
connector: str,
rhs: type[Field[Any, Any]],
result: type[Field[Any, Any]],
) -> None: ...
class CombinedExpression(SQLiteNumericMixin, Expression):
@cached_property
@override
def allowed_default(self) -> bool: ... # type: ignore[override]
connector: str
lhs: Combinable
rhs: Combinable
def __init__(
self, lhs: Combinable, connector: str, rhs: Combinable, output_field: Field[Any, Any] | None = None
) -> None: ...
class DurationExpression(CombinedExpression):
def compile(self, side: Combinable, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
class TemporalSubtraction(CombinedExpression):
output_field: ClassVar[fields.DurationField[Any, Any]]
def __init__(self, lhs: Combinable, rhs: Combinable) -> None: ...
class F(_Deconstructible, Combinable):
allowed_default: ClassVar[bool]
def __init__(self, name: str) -> None: ...
def __getitem__(self, subscript: int | slice) -> Sliced: ...
def __contains__(self, other: Any) -> Never: ...
def resolve_expression(
self,
query: Any | None = None,
allow_joins: bool = True,
reuse: set[str] | None = None,
summarize: bool = False,
for_save: bool = False,
) -> Expression: ...
def replace_expressions(self, replacements: Mapping[F, Any]) -> F: ...
def asc(self, **kwargs: Any) -> OrderBy: ...
def desc(self, **kwargs: Any) -> OrderBy: ...
def copy(self) -> Self: ...
class Sliced(F):
def __init__(self, obj: F, subscript: int | slice) -> None: ...
@override
def resolve_expression(
self,
query: Any | None = None,
allow_joins: bool = True,
reuse: set[str] | None = None,
summarize: bool = False,
for_save: bool = False,
) -> Func: ...
class ResolvedOuterRef(F):
contains_aggregate: ClassVar[bool]
contains_over_clause: ClassVar[bool]
def as_sql(self, *args: Any, **kwargs: Any) -> _AsSqlType: ...
def relabeled_clone(self, relabels: Mapping[str, str]) -> Self: ...
def get_group_by_cols(self) -> list[BaseExpression]: ...
class OuterRef(F):
contains_aggregate: ClassVar[bool]
contains_over_clause: ClassVar[bool]
def __init__(self, name: str | OuterRef) -> None: ...
def relabeled_clone(self, relabels: Any) -> Self: ...
class Func(SQLiteNumericMixin, Expression, Generic[_OutputField]):
@cached_property
@override
def allowed_default(self) -> bool: ... # type: ignore[override]
function: str | None = None
template: str
arg_joiner: str
arity: int | None
source_expressions: list[Expression]
extra: dict[Any, Any]
def __init__(self, *expressions: Any, output_field: _OutputField | None = None, **extra: Any) -> None: ...
@override
def as_sql(
self,
compiler: SQLCompiler,
connection: BaseDatabaseWrapper,
function: str | None = None,
template: str | None = None,
arg_joiner: str | None = None,
**extra_context: Any,
) -> _AsSqlType: ...
class Value(Expression):
value: Any
for_save: bool
def __init__(self, value: Any, output_field: Field[Any, Any] | None = None) -> None: ...
@property
@override
def empty_result_set_value(self) -> Any: ...
def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class JSONNull(Value):
def __init__(self) -> None: ...
def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
class RawSQL(Expression):
params: list[Any]
sql: str
def __init__(self, sql: str, params: Sequence[Any], output_field: Field[Any, Any] | None = None) -> None: ...
class Star(Expression): ...
class DatabaseDefault(Expression):
def __init__(self, expression: Expression, output_field: Field[Any, Any] | None = None) -> None: ...
class Col(Expression):
target: Field[Any, Any]
alias: str
contains_column_references: Literal[True]
possibly_multivalued: Literal[False]
def __init__(self, alias: str, target: Field[Any, Any], output_field: Field[Any, Any] | None = None) -> None: ...
@override
def relabeled_clone(self, relabels: Mapping[str, str]) -> Self: ...
class ColPairs(Expression):
alias: str
targets: Sequence[Field[Any, Any]]
sources: Sequence[Field[Any, Any]]
def __init__(
self,
alias: str,
targets: Sequence[Field[Any, Any]],
sources: Sequence[Field[Any, Any]],
output_field: Field[Any, Any] | None,
) -> None: ...
def __len__(self) -> int: ...
def __iter__(self) -> Iterator[Col]: ...
def get_cols(self) -> list[Col]: ...
@override
def relabeled_clone(self, relabels: Mapping[str, str]) -> Self: ...
class Ref(Expression):
def __init__(self, refs: str, source: Expression) -> None: ...
@override
def relabeled_clone(self, relabels: Mapping[str, str]) -> Self: ...
class ExpressionList(Func):
def __init__(
self, *expressions: BaseExpression | Combinable, output_field: Field[Any, Any] | None = None, **extra: Any
) -> None: ...
class OrderByList(ExpressionList):
@classmethod
def from_param(cls, context: str, param: _ExprListCompatible | None) -> Self | None: ...
_E = TypeVar("_E", bound=Q | Combinable)
class ExpressionWrapper(Expression, Generic[_E]):
@property
@override
def allowed_default(self) -> bool: ... # type: ignore[override]
def __init__(self, expression: _E, output_field: Field[Any, Any]) -> None: ...
expression: _E
class NegatedExpression(ExpressionWrapper[_E]):
def __init__(self, expression: _E) -> None: ...
@override
def __invert__(self) -> _E: ... # type: ignore[override]
class When(Expression):
@cached_property
@override
def allowed_default(self) -> bool: ... # type: ignore[override]
template: str
condition: Any
result: Any
def __init__(self, condition: Any | None = None, then: Any | None = None, **lookups: Any) -> None: ...
@override
def as_sql(
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, template: str | None = None, **extra_context: Any
) -> _AsSqlType: ...
class Case(Expression):
@cached_property
@override
def allowed_default(self) -> bool: ... # type: ignore[override]
template: str
case_joiner: str
cases: Any
default: Any
extra: Any
def __init__(
self, *cases: Any, default: Any | None = None, output_field: Field[Any, Any] | None = None, **extra: Any
) -> None: ...
@override
def as_sql(
self,
compiler: SQLCompiler,
connection: BaseDatabaseWrapper,
template: str | None = None,
case_joiner: str | None = None,
**extra_context: Any,
) -> _AsSqlType: ...
class Subquery(BaseExpression, Combinable, Generic[_OutputField]):
template: str
subquery: bool
query: Query
extra: dict[Any, Any]
def __init__(
self, queryset: Query | QuerySet[Any] | Subquery, output_field: _OutputField | None = None, **extra: Any
) -> None: ...
@property
def external_aliases(self) -> set[str]: ...
def get_external_cols(self) -> list[Col]: ...
@override
def as_sql(
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, template: str | None = None, **extra_context: Any
) -> _AsSqlType: ...
class Exists(Subquery):
output_field: ClassVar[fields.BooleanField[Any, Any]]
def __init__(self, queryset: Query | QuerySet[Any] | Subquery, **kwargs: Any) -> None: ...
class OrderBy(Expression):
template: str
nulls_first: bool
nulls_last: bool
descending: bool
expression: Expression | F | Subquery
allows_composite_expressions: bool
def __init__(
self,
expression: Expression | F | Subquery,
descending: bool = False,
nulls_first: bool | None = None,
nulls_last: bool | None = None,
) -> None: ...
@override
def as_sql(
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, template: str | None = None, **extra_context: Any
) -> _AsSqlType: ...
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
@override
def asc(self) -> None: ... # type: ignore[override]
@override
def desc(self) -> None: ... # type: ignore[override]
class Window(SQLiteNumericMixin, Expression):
template: str
contains_aggregate: bool
contains_over_clause: bool
partition_by: ExpressionList | None
order_by: OrderByList | None
def __init__(
self,
expression: BaseExpression,
partition_by: _ExprListCompatible | None = None,
order_by: _ExprListCompatible | None = None,
frame: WindowFrame | None = None,
output_field: Field[Any, Any] | None = None,
) -> None: ...
@override
def as_sql(
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, template: str | None = None
) -> _AsSqlType: ...
@override
def as_sqlite( # type: ignore[override]
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper
) -> _AsSqlType: ...
class WindowFrameExclusion(Enum):
CURRENT_ROW = "CURRENT ROW"
GROUP = "GROUP"
TIES = "TIES"
NO_OTHERS = "NO OTHERS"
class WindowFrame(Expression):
template: str
def __init__(
self,
start: int | None = None,
end: int | None = None,
exclusion: WindowFrameExclusion | None = None,
) -> None: ...
def get_exclusion(self) -> str: ...
def window_frame_start_end(
self, connection: BaseDatabaseWrapper, start: int | None, end: int | None
) -> tuple[int, int]: ...
class RowRange(WindowFrame):
frame_type: str
class ValueRange(WindowFrame):
frame_type: str
typeddjango-django-stubs-fa03b48/django-stubs/db/models/fetch_modes.pyi 0000664 0000000 0000000 00000001422 15260643574 0026317 0 ustar 00root root 0000000 0000000 from typing import Any, NoReturn
from django.db.models import Model
from typing_extensions import override
class FetchMode:
track_peers: bool
def fetch(self, fetcher: Any, instance: Model) -> None: ...
class FetchOne(FetchMode):
@override
def fetch(self, fetcher: Any, instance: Model) -> None: ...
@override
def __reduce__(self) -> str: ...
FETCH_ONE: FetchOne
class FetchPeers(FetchMode):
track_peers: bool
@override
def fetch(self, fetcher: Any, instance: Model) -> None: ...
@override
def __reduce__(self) -> str: ...
FETCH_PEERS: FetchPeers
class FetchRaise(FetchMode):
@override
def fetch(self, fetcher: Any, instance: Model) -> NoReturn: ...
@override
def __reduce__(self) -> str: ...
FETCH_RAISE: FetchRaise
typeddjango-django-stubs-fa03b48/django-stubs/db/models/fields/ 0000775 0000000 0000000 00000000000 15260643574 0024563 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/db/models/fields/__init__.pyi 0000664 0000000 0000000 00000063435 15260643574 0027060 0 ustar 00root root 0000000 0000000 import decimal
import uuid
from collections.abc import Callable, Iterable, Mapping, Sequence
from datetime import date, time, timedelta
from datetime import datetime as real_datetime
from typing import Any, ClassVar, Generic, Protocol, Self, TypeAlias, overload, type_check_only
from django import forms
from django.core.checks import CheckMessage
from django.core.validators import _ValidatorCallable
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models import Model
from django.db.models.expressions import Col, Combinable, Expression, Func
from django.db.models.fields.reverse_related import ForeignObjectRel
from django.db.models.query import _OrderByFieldName
from django.db.models.query_utils import Q, RegisterLookupMixin
from django.db.models.sql.compiler import SQLCompiler, _AsSqlType, _ParamsT
from django.forms.widgets import Widget
from django.utils.choices import BlankChoiceIterator, _Choice, _ChoiceNamedGroup, _ChoicesCallable, _ChoicesInput
from django.utils.datastructures import DictWrapper
from django.utils.functional import _Getter, _StrOrPromise, cached_property
from typing_extensions import TypeVar, override
class Empty: ...
class NOT_PROVIDED: ...
# RemovedInDjango70Warning
BLANK_CHOICE_DASH: list[tuple[str, str]]
BLANK_CHOICE_LABEL: _StrOrPromise
_ChoicesList: TypeAlias = Sequence[_Choice] | Sequence[_ChoiceNamedGroup]
_LimitChoicesTo: TypeAlias = Q | dict[str, Any]
_LimitChoicesToCallable: TypeAlias = Callable[[], _LimitChoicesTo]
_F = TypeVar("_F", bound=Field[Any, Any], covariant=True)
@type_check_only
class _FieldDescriptor(Protocol[_F]):
"""
Accessing fields of a model class (not instance) returns an object conforming to this protocol.
Depending on field type this could be DeferredAttribute, ForwardManyToOneDescriptor, FileDescriptor, etc.
"""
@property
def field(self) -> _F: ...
_AllLimitChoicesTo: TypeAlias = _LimitChoicesTo | _LimitChoicesToCallable | _ChoicesCallable # noqa: PYI047
_ErrorMessagesMapping: TypeAlias = Mapping[str, _StrOrPromise]
_ErrorMessagesDict: TypeAlias = dict[str, _StrOrPromise]
# __set__ value type
_ST = TypeVar("_ST", contravariant=True)
# __get__ return type
_GT = TypeVar("_GT", covariant=True)
class Field(RegisterLookupMixin, Generic[_ST, _GT]):
"""
Typing model fields.
How does this work?
Let's take a look at the self-contained example
(it is way easier than our django implementation, but has the same concept).
To understand this example you need:
1. Be familiar with descriptors: https://docs.python.org/3/howto/descriptor.html
2. Follow our explanation below
Let's start with defining our fake model class and fake integer field.
.. code:: python
from typing import Generic
class Model(object):
...
_SetType = int | float # You can assign ints and floats
_GetType = int # access type is always `int`
class IntField(object):
def __get__(self, instance: Model, owner) -> _GetType:
...
def __set__(self, instance, value: _SetType) -> None:
...
Now, let's create our own example model,
this would be something like ``User`` in your own apps:
.. code:: python
class Example(Model):
count = IntField()
And now, lets test that our reveal type works:
.. code:: python
example = Example()
reveal_type(example.count)
# Revealed type is "int"
example.count = 1.5 # ok
example.count = 'a'
# Incompatible types in assignment
# (expression has type "str", variable has type "int | float")
Notice, that this is not magic. This is how descriptors work with ``mypy``.
We also need ``_pyi_private_set_type`` attributes
and friends to help inside our plugin.
It is required to enhance parts like ``filter`` queries.
"""
_pyi_private_set_type: Any
_pyi_private_get_type: Any
_pyi_lookup_exact_type: Any
help_text: _StrOrPromise
attname: str
auto_created: bool
primary_key: bool
remote_field: ForeignObjectRel | None
is_relation: bool
related_model: type[Model] | None
generated: ClassVar[bool]
one_to_many: bool | None
one_to_one: bool | None
many_to_many: bool | None
many_to_one: bool | None
max_length: int | None
model: type[Model]
name: str
verbose_name: _StrOrPromise
description: _StrOrPromise | _Getter[_StrOrPromise]
blank: bool
null: bool
editable: bool
empty_strings_allowed: bool
choices: _ChoicesList | None
db_column: str | None
db_comment: str | None
db_default: type[NOT_PROVIDED] | Expression
column: str | None
concrete: bool
default: Any
empty_values: Sequence[Any]
creation_counter: int
auto_creation_counter: int
default_validators: list[_ValidatorCallable]
default_error_messages: ClassVar[_ErrorMessagesDict]
hidden: bool
system_check_removed_details: Any | None
system_check_deprecated_details: Any | None
non_db_attrs: tuple[str, ...]
def __init__(
self,
verbose_name: _StrOrPromise | None = None,
name: str | None = None,
primary_key: bool = False,
max_length: int | None = None,
unique: bool = False,
blank: bool = False,
null: bool = False,
db_index: bool = False,
rel: ForeignObjectRel | None = None,
default: Any = ...,
editable: bool = True,
serialize: bool = True,
unique_for_date: str | None = None,
unique_for_month: str | None = None,
unique_for_year: str | None = None,
choices: _ChoicesInput | None = None,
help_text: _StrOrPromise = "",
db_column: str | None = None,
db_tablespace: str | None = None,
auto_created: bool = False,
validators: Iterable[_ValidatorCallable] = (),
error_messages: _ErrorMessagesMapping | None = None,
db_comment: str | None = None,
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
) -> None: ...
def __set__(self, instance: Any, value: _ST) -> None: ...
# class access
@overload
def __get__(self, instance: None, owner: Any) -> _FieldDescriptor[Self]: ...
# Model instance access
@overload
def __get__(self, instance: Model, owner: Any) -> _GT: ...
# non-Model instances
@overload
def __get__(self, instance: Any, owner: Any) -> Self: ...
def check(self, **kwargs: Any) -> list[CheckMessage]: ...
def get_col(self, alias: str, output_field: Field[Any, Any] | None = None) -> Col: ...
@cached_property
def cached_col(self) -> Col: ...
def select_format(self, compiler: SQLCompiler, sql: str, params: _ParamsT) -> _AsSqlType: ...
def deconstruct(self) -> tuple[str, str, Sequence[Any], dict[str, Any]]: ...
def clone(self) -> Self: ...
def __lt__(self, other: Any) -> bool: ...
def __le__(self, other: Any) -> bool: ...
def __gt__(self, other: Any) -> bool: ...
def __ge__(self, other: Any) -> bool: ...
def __deepcopy__(self, memodict: dict[int, Any]) -> Self: ...
def __copy__(self) -> Self: ...
def get_pk_value_on_save(self, instance: Model) -> Any: ...
def to_python(self, value: Any) -> Any: ...
@cached_property
def error_messages(self) -> _ErrorMessagesDict: ...
@cached_property
def validators(self) -> list[_ValidatorCallable]: ...
def run_validators(self, value: Any) -> None: ...
def validate(self, value: Any, model_instance: Model | None) -> None: ...
def clean(self, value: Any, model_instance: Model | None) -> Any: ...
def db_type_parameters(self, connection: BaseDatabaseWrapper) -> DictWrapper[Any]: ...
def db_check(self, connection: BaseDatabaseWrapper) -> str | None: ...
def db_type(self, connection: BaseDatabaseWrapper) -> str | None: ...
def rel_db_type(self, connection: BaseDatabaseWrapper) -> str | None: ...
def cast_db_type(self, connection: BaseDatabaseWrapper) -> str | None: ...
def db_parameters(self, connection: BaseDatabaseWrapper) -> dict[str, str | None]: ...
def db_type_suffix(self, connection: BaseDatabaseWrapper) -> str | None: ...
def get_db_converters(self, connection: BaseDatabaseWrapper) -> list[Callable[..., Any]]: ...
@cached_property
def unique(self) -> bool: ...
@property
def db_tablespace(self) -> str: ...
@property
def db_returning(self) -> bool: ...
descriptor_class: type
def set_attributes_from_name(self, name: str) -> None: ...
def contribute_to_class(self, cls: type[Model], name: str, private_only: bool = False) -> None: ...
def get_filter_kwargs_for_object(self, obj: Model) -> dict[str, Any]: ...
def get_attname(self) -> str: ...
def get_attname_column(self) -> tuple[str, str | None]: ...
def get_internal_type(self) -> str: ...
def pre_save(self, model_instance: Model, add: bool) -> Any: ...
def get_prep_value(self, value: Any) -> Any: ...
def get_db_prep_value(self, value: Any, connection: BaseDatabaseWrapper, prepared: bool = False) -> Any: ...
def get_db_prep_save(self, value: Any, connection: BaseDatabaseWrapper) -> Any: ...
def has_default(self) -> bool: ...
def has_db_default(self) -> bool: ...
def get_default(self) -> Any: ...
def get_choices(
self,
include_blank: bool = True,
blank_choice: _ChoicesList | None = None,
limit_choices_to: _LimitChoicesTo | None = None,
ordering: Sequence[_OrderByFieldName] = (),
) -> BlankChoiceIterator | _ChoicesList: ...
def value_to_string(self, obj: Model) -> str: ...
@property
def flatchoices(self) -> list[_Choice]: ...
def save_form_data(self, instance: Model, data: Any) -> None: ...
def formfield(
self,
*,
form_class: type[forms.Field] | None = ...,
choices_form_class: type[forms.ChoiceField] | None = ...,
required: bool = ...,
widget: Widget | type[Widget] | None = ...,
label: _StrOrPromise | None = ...,
initial: Any | None = ...,
help_text: _StrOrPromise = ...,
error_messages: _ErrorMessagesMapping | None = ...,
show_hidden_initial: bool = ...,
validators: Iterable[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
**kwargs: Any,
# Subclasses are allowed to return None
) -> forms.Field | None: ...
def value_from_object(self, obj: Model) -> _GT: ...
def slice_expression(self, expression: Expression, start: int, length: int | None) -> Func: ...
class IntegerField(Field[_ST, _GT]):
_pyi_private_set_type: float | int | str | Combinable
_pyi_private_get_type: int
_pyi_lookup_exact_type: str | int
class PositiveIntegerRelDbTypeMixin:
def rel_db_type(self, connection: BaseDatabaseWrapper) -> str: ...
class SmallIntegerField(IntegerField[_ST, _GT]): ...
class BigIntegerField(IntegerField[_ST, _GT]):
MAX_BIGINT: ClassVar[int]
class PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField[_ST, _GT]):
integer_field_class: type[IntegerField[Any, Any]]
class PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, SmallIntegerField[_ST, _GT]):
integer_field_class: type[SmallIntegerField[Any, Any]]
class PositiveBigIntegerField(PositiveIntegerRelDbTypeMixin, BigIntegerField[_ST, _GT]):
integer_field_class: type[BigIntegerField[Any, Any]]
class FloatField(Field[_ST, _GT]):
_pyi_private_set_type: float | int | str | Combinable
_pyi_private_get_type: float
_pyi_lookup_exact_type: float
class DecimalField(Field[_ST, _GT]):
_pyi_private_set_type: str | float | decimal.Decimal | Combinable
_pyi_private_get_type: decimal.Decimal
_pyi_lookup_exact_type: str | int | decimal.Decimal
# attributes
max_digits: int
decimal_places: int
def __init__(
self,
verbose_name: _StrOrPromise | None = None,
name: str | None = None,
max_digits: int | None = None,
decimal_places: int | None = None,
*,
primary_key: bool = ...,
unique: bool = ...,
blank: bool = ...,
null: bool = ...,
db_index: bool = ...,
default: Any = ...,
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
editable: bool = ...,
auto_created: bool = ...,
serialize: bool = ...,
choices: _ChoicesInput | None = ...,
help_text: _StrOrPromise = ...,
db_column: str | None = ...,
db_comment: str | None = ...,
db_tablespace: str | None = ...,
validators: Iterable[_ValidatorCallable] = ...,
error_messages: _ErrorMessagesMapping | None = ...,
) -> None: ...
@cached_property
def context(self) -> decimal.Context: ...
class CharField(Field[_ST, _GT]):
_pyi_private_set_type: str | int | Combinable
_pyi_private_get_type: str
# objects are converted to string before comparison
_pyi_lookup_exact_type: Any
db_collation: str | None
def __init__(
self,
verbose_name: _StrOrPromise | None = ...,
name: str | None = ...,
primary_key: bool = ...,
max_length: int | None = ...,
unique: bool = ...,
blank: bool = ...,
null: bool = ...,
db_index: bool = ...,
default: Any = ...,
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
editable: bool = ...,
auto_created: bool = ...,
serialize: bool = ...,
unique_for_date: str | None = ...,
unique_for_month: str | None = ...,
unique_for_year: str | None = ...,
choices: _ChoicesInput | None = ...,
help_text: _StrOrPromise = ...,
db_column: str | None = ...,
db_comment: str | None = ...,
db_tablespace: str | None = ...,
validators: Iterable[_ValidatorCallable] = ...,
error_messages: _ErrorMessagesMapping | None = ...,
*,
db_collation: str | None = None,
) -> None: ...
class CommaSeparatedIntegerField(CharField[_ST, _GT]): ...
class SlugField(CharField[_ST, _GT]):
def __init__(
self,
verbose_name: _StrOrPromise | None = ...,
name: str | None = ...,
primary_key: bool = ...,
unique: bool = ...,
blank: bool = ...,
null: bool = ...,
default: Any = ...,
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
editable: bool = ...,
auto_created: bool = ...,
serialize: bool = ...,
unique_for_date: str | None = ...,
unique_for_month: str | None = ...,
unique_for_year: str | None = ...,
choices: _ChoicesInput | None = ...,
help_text: _StrOrPromise = ...,
db_column: str | None = ...,
db_comment: str | None = ...,
db_tablespace: str | None = ...,
validators: Iterable[_ValidatorCallable] = ...,
error_messages: _ErrorMessagesMapping | None = ...,
*,
max_length: int | None = 50,
db_index: bool = True,
allow_unicode: bool = False,
db_collation: str | None = None,
) -> None: ...
class EmailField(CharField[_ST, _GT]):
_pyi_private_set_type: str | Combinable
class URLField(CharField[_ST, _GT]):
def __init__(
self,
verbose_name: _StrOrPromise | None = None,
name: str | None = None,
*,
primary_key: bool = ...,
max_length: int | None = ...,
unique: bool = ...,
blank: bool = ...,
null: bool = ...,
db_index: bool = ...,
rel: ForeignObjectRel | None = ...,
default: Any = ...,
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
editable: bool = ...,
serialize: bool = ...,
unique_for_date: str | None = ...,
unique_for_month: str | None = ...,
unique_for_year: str | None = ...,
choices: _ChoicesInput | None = ...,
help_text: _StrOrPromise = ...,
db_column: str | None = ...,
db_comment: str | None = ...,
db_tablespace: str | None = ...,
auto_created: bool = ...,
validators: Iterable[_ValidatorCallable] = ...,
error_messages: _ErrorMessagesMapping | None = ...,
db_collation: str | None = None,
) -> None: ...
class TextField(Field[_ST, _GT]):
_pyi_private_set_type: str | Combinable
_pyi_private_get_type: str
# objects are converted to string before comparison
_pyi_lookup_exact_type: Any
db_collation: str | None
def __init__(
self,
verbose_name: _StrOrPromise | None = ...,
name: str | None = ...,
primary_key: bool = ...,
max_length: int | None = ...,
unique: bool = ...,
blank: bool = ...,
null: bool = ...,
db_index: bool = ...,
default: Any = ...,
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
editable: bool = ...,
auto_created: bool = ...,
serialize: bool = ...,
unique_for_date: str | None = ...,
unique_for_month: str | None = ...,
unique_for_year: str | None = ...,
choices: _ChoicesInput | None = ...,
help_text: _StrOrPromise = ...,
db_column: str | None = ...,
db_comment: str | None = ...,
db_tablespace: str | None = ...,
validators: Iterable[_ValidatorCallable] = ...,
error_messages: _ErrorMessagesMapping | None = ...,
*,
db_collation: str | None = None,
) -> None: ...
class BooleanField(Field[_ST, _GT]):
_pyi_private_set_type: bool | Combinable
_pyi_private_get_type: bool
_pyi_lookup_exact_type: bool
class NullBooleanField(BooleanField[_ST, _GT]):
_pyi_private_set_type: bool | Combinable | None # type: ignore[assignment]
_pyi_private_get_type: bool | None # type: ignore[assignment]
_pyi_lookup_exact_type: bool | None # type: ignore[assignment]
class IPAddressField(Field[_ST, _GT]):
_pyi_private_set_type: str | Combinable
_pyi_private_get_type: str
class GenericIPAddressField(Field[_ST, _GT]):
_pyi_private_set_type: str | int | Callable[..., Any] | Combinable
_pyi_private_get_type: str
default_error_messages: ClassVar[_ErrorMessagesDict]
unpack_ipv4: bool
protocol: str
def __init__(
self,
verbose_name: _StrOrPromise | None = None,
name: Any | None = None,
protocol: str = "both",
unpack_ipv4: bool = False,
primary_key: bool = ...,
unique: bool = ...,
blank: bool = ...,
null: bool = ...,
db_index: bool = ...,
default: Any = ...,
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
editable: bool = ...,
auto_created: bool = ...,
serialize: bool = ...,
choices: _ChoicesInput | None = ...,
help_text: _StrOrPromise = ...,
db_column: str | None = ...,
db_comment: str | None = ...,
db_tablespace: str | None = ...,
validators: Iterable[_ValidatorCallable] = ...,
error_messages: _ErrorMessagesMapping | None = ...,
) -> None: ...
class DateTimeCheckMixin:
def check(self, **kwargs: Any) -> list[CheckMessage]: ...
class DateField(DateTimeCheckMixin, Field[_ST, _GT]):
_pyi_private_set_type: str | date | Combinable
_pyi_private_get_type: date
_pyi_lookup_exact_type: str | date
auto_now: bool
auto_now_add: bool
def __init__(
self,
verbose_name: _StrOrPromise | None = None,
name: str | None = None,
auto_now: bool = False,
auto_now_add: bool = False,
*,
primary_key: bool = ...,
max_length: int | None = ...,
unique: bool = ...,
blank: bool = ...,
null: bool = ...,
db_index: bool = ...,
default: Any = ...,
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
editable: bool = ...,
auto_created: bool = ...,
serialize: bool = ...,
choices: _ChoicesInput | None = ...,
help_text: _StrOrPromise = ...,
db_column: str | None = ...,
db_comment: str | None = ...,
db_tablespace: str | None = ...,
validators: Iterable[_ValidatorCallable] = ...,
error_messages: _ErrorMessagesMapping | None = ...,
) -> None: ...
@override
def contribute_to_class(self, cls: type[Model], name: str, **kwargs: Any) -> None: ... # type: ignore[override]
class TimeField(DateTimeCheckMixin, Field[_ST, _GT]):
_pyi_private_set_type: str | time | real_datetime | Combinable
_pyi_private_get_type: time
auto_now: bool
auto_now_add: bool
def __init__(
self,
verbose_name: _StrOrPromise | None = None,
name: str | None = None,
auto_now: bool = False,
auto_now_add: bool = False,
*,
primary_key: bool = ...,
unique: bool = ...,
blank: bool = ...,
null: bool = ...,
db_index: bool = ...,
default: Any = ...,
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
editable: bool = ...,
auto_created: bool = ...,
serialize: bool = ...,
choices: _ChoicesInput | None = ...,
help_text: _StrOrPromise = ...,
db_column: str | None = ...,
db_comment: str | None = ...,
db_tablespace: str | None = ...,
validators: Iterable[_ValidatorCallable] = ...,
error_messages: _ErrorMessagesMapping | None = ...,
) -> None: ...
class DateTimeField(DateField[_ST, _GT]):
_pyi_private_set_type: str | real_datetime | date | Combinable
_pyi_private_get_type: real_datetime
_pyi_lookup_exact_type: str | real_datetime
class UUIDField(Field[_ST, _GT]):
_pyi_private_set_type: str | uuid.UUID
_pyi_private_get_type: uuid.UUID
_pyi_lookup_exact_type: uuid.UUID | str
def __init__(
self,
verbose_name: _StrOrPromise | None = None,
*,
name: str | None = ...,
primary_key: bool = ...,
max_length: int | None = ...,
unique: bool = ...,
blank: bool = ...,
null: bool = ...,
db_index: bool = ...,
rel: ForeignObjectRel | None = ...,
default: Any = ...,
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
editable: bool = ...,
serialize: bool = ...,
unique_for_date: str | None = ...,
unique_for_month: str | None = ...,
unique_for_year: str | None = ...,
choices: _ChoicesInput | None = ...,
help_text: _StrOrPromise = ...,
db_column: str | None = ...,
db_comment: str | None = ...,
db_tablespace: str | None = ...,
auto_created: bool = ...,
validators: Iterable[_ValidatorCallable] = ...,
error_messages: _ErrorMessagesMapping | None = ...,
) -> None: ...
class FilePathField(Field[_ST, _GT]):
path: Any
match: str | None
recursive: bool
allow_files: bool
allow_folders: bool
def __init__(
self,
verbose_name: _StrOrPromise | None = None,
name: str | None = None,
path: str | Callable[..., str] = "",
match: str | None = None,
recursive: bool = False,
allow_files: bool = True,
allow_folders: bool = False,
*,
primary_key: bool = ...,
max_length: int = ...,
unique: bool = ...,
blank: bool = ...,
null: bool = ...,
db_index: bool = ...,
default: Any = ...,
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
editable: bool = ...,
auto_created: bool = ...,
serialize: bool = ...,
choices: _ChoicesInput | None = ...,
help_text: _StrOrPromise = ...,
db_column: str | None = ...,
db_comment: str | None = ...,
db_tablespace: str | None = ...,
validators: Iterable[_ValidatorCallable] = ...,
error_messages: _ErrorMessagesMapping | None = ...,
) -> None: ...
class BinaryField(Field[_ST, _GT]):
_pyi_private_get_type: bytes | memoryview
def get_placeholder_sql(self, value: Any, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
class DurationField(Field[_ST, _GT]):
_pyi_private_get_type: timedelta
class AutoFieldMixin:
db_returning: bool
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
def check(self, **kwargs: Any) -> list[CheckMessage]: ...
def deconstruct(self) -> tuple[str, str, Sequence[Any], dict[str, Any]]: ...
def validate(self, value: Any, model_instance: Model | None) -> None: ...
def get_db_prep_value(self, value: Any, connection: BaseDatabaseWrapper, prepared: bool = False) -> Any: ...
def get_db_prep_save(self, value: Any, connection: BaseDatabaseWrapper) -> Any: ...
def contribute_to_class(self, cls: type[Model], name: str, **kwargs: Any) -> None: ...
def formfield(self, **kwargs: Any) -> None: ...
class AutoFieldMeta(type): ...
class AutoField(AutoFieldMixin, IntegerField[_ST, _GT], metaclass=AutoFieldMeta): # type: ignore[misc]
_pyi_private_set_type: Combinable | int | str
_pyi_private_get_type: int
_pyi_lookup_exact_type: str | int
class BigAutoField(AutoFieldMixin, BigIntegerField[_ST, _GT]): ... # type: ignore[misc]
class SmallAutoField(AutoFieldMixin, SmallIntegerField[_ST, _GT]): ... # type: ignore[misc]
__all__ = [
"BLANK_CHOICE_DASH",
"BLANK_CHOICE_LABEL",
"NOT_PROVIDED",
"AutoField",
"BigAutoField",
"BigIntegerField",
"BinaryField",
"BooleanField",
"CharField",
"CommaSeparatedIntegerField",
"DateField",
"DateTimeField",
"DecimalField",
"DurationField",
"EmailField",
"Empty",
"Field",
"FilePathField",
"FloatField",
"GenericIPAddressField",
"IPAddressField",
"IntegerField",
"NullBooleanField",
"PositiveBigIntegerField",
"PositiveIntegerField",
"PositiveSmallIntegerField",
"SlugField",
"SmallAutoField",
"SmallIntegerField",
"TextField",
"TimeField",
"URLField",
"UUIDField",
]
typeddjango-django-stubs-fa03b48/django-stubs/db/models/fields/composite.pyi 0000664 0000000 0000000 00000005077 15260643574 0027321 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable, Iterator, Mapping
from typing import Any, Literal
from django.core.validators import _ValidatorCallable
from django.db.models import NOT_PROVIDED, Field
from django.db.models.base import Model
from django.db.models.fields.reverse_related import ForeignObjectRel
from django.db.models.options import _AnyField
from django.utils.choices import _ChoicesInput
from django.utils.functional import _StrOrPromise, cached_property
from typing_extensions import override
class AttributeSetter:
def __init__(self, name: str, value: Any) -> None: ...
class CompositeAttribute:
field: CompositePrimaryKey
def __init__(self, field: CompositePrimaryKey) -> None: ...
@property
def attnames(self) -> list[str]: ...
def __get__(self, instance: Model, cls: type[Model] | None = None) -> tuple[Any, ...]: ...
def __set__(self, instance: Model, values: list[Any] | tuple[Any] | None) -> None: ...
class CompositePrimaryKey(Field[Any, Any]):
field_names: tuple[str]
descriptor_class: type[CompositeAttribute]
column: None
def __init__(
self,
*args: str,
verbose_name: _StrOrPromise | None = None,
name: str | None = None,
primary_key: Literal[True] = True,
max_length: int | None = None,
unique: bool = False,
blank: Literal[True] = True,
null: bool = False,
db_index: bool = False,
rel: ForeignObjectRel | None = None,
default: type[NOT_PROVIDED] = ...,
editable: Literal[False] = False,
serialize: bool = True,
unique_for_date: str | None = None,
unique_for_month: str | None = None,
unique_for_year: str | None = None,
choices: _ChoicesInput | None = None,
help_text: _StrOrPromise = "",
db_column: None = None,
db_tablespace: str | None = None,
auto_created: bool = False,
validators: Iterable[_ValidatorCallable] = (),
error_messages: Mapping[str, _StrOrPromise] | None = None,
db_comment: str | None = None,
db_default: type[NOT_PROVIDED] = ...,
) -> None: ...
@cached_property
def fields(
self,
) -> tuple[_AnyField, ...]: ...
@cached_property
def columns(self) -> tuple[str, ...]: ...
def __iter__(self) -> Iterator[_AnyField]: ...
def __len__(self) -> int: ...
@override
def get_pk_value_on_save(self, instance: Model) -> tuple[Any, ...]: ...
@override
def get_attname_column(self) -> tuple[str, None]: ...
def unnest(fields: Iterable[Field[Any, Any]]) -> list[Field[Any, Any]]: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/models/fields/files.pyi 0000664 0000000 0000000 00000012004 15260643574 0026405 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterable
from typing import Any, Protocol, Self, overload, type_check_only
from _typeshed import StrPath
from django.core.files.base import File
from django.core.files.images import ImageFile
from django.core.files.storage import Storage
from django.core.validators import _ValidatorCallable
from django.db.models.base import Model
from django.db.models.expressions import Expression
from django.db.models.fields import NOT_PROVIDED, Field, _ErrorMessagesMapping
from django.db.models.query_utils import DeferredAttribute
from django.db.models.utils import AltersData
from django.utils.choices import _Choices
from django.utils.functional import _StrOrPromise
from typing_extensions import TypeVar, override
class FieldFile(File[Any], AltersData):
instance: Model
field: FileField
storage: Storage
name: str | None
def __init__(self, instance: Model, field: FileField, name: str | None) -> None: ...
@override
def __eq__(self, other: object) -> bool: ...
@override
def __hash__(self) -> int: ...
file: Any
@property
def path(self) -> str: ...
@property
def url(self) -> str: ...
@property
@override
def size(self) -> int: ...
@override
def open(self, mode: str = "rb") -> Self: ... # type: ignore[override]
def save(self, name: str, content: File[Any], save: bool = True) -> None: ...
def delete(self, save: bool = True) -> None: ...
@property
@override
def closed(self) -> bool: ...
@override
def __getstate__(self) -> dict[str, Any]: ...
def __setstate__(self, state: dict[str, Any]) -> None: ...
class FileDescriptor(DeferredAttribute):
field: FileField
@override
def __get__(self, instance: Model | None, cls: type[Model] | None = None) -> FieldFile | FileDescriptor: ...
def __set__(self, instance: Model, value: Any | None) -> None: ...
_M = TypeVar("_M", bound=Model, contravariant=True)
@type_check_only
class _UploadToCallable(Protocol[_M]):
def __call__(self, instance: _M, filename: str, /) -> StrPath: ...
class FileField(Field[Any, Any]):
attr_class: type[FieldFile]
descriptor_class: type[FileDescriptor]
storage: Storage
upload_to: StrPath | _UploadToCallable[Any]
def __init__(
self,
verbose_name: _StrOrPromise | None = None,
name: str | None = None,
upload_to: StrPath | _UploadToCallable[Any] = "",
storage: Storage | Callable[[], Storage] | None = None,
*,
max_length: int | None = ...,
unique: bool = ...,
blank: bool = ...,
null: bool = ...,
db_index: bool = ...,
default: Any = ...,
db_default: type[NOT_PROVIDED] | Expression | str = ...,
editable: bool = ...,
auto_created: bool = ...,
serialize: bool = ...,
unique_for_date: str | None = ...,
unique_for_month: str | None = ...,
unique_for_year: str | None = ...,
choices: _Choices | None = ...,
help_text: _StrOrPromise = ...,
db_column: str | None = ...,
db_comment: str | None = ...,
db_tablespace: str | None = ...,
validators: Iterable[_ValidatorCallable] = ...,
error_messages: _ErrorMessagesMapping | None = ...,
) -> None: ...
# class access
@overload
@override
def __get__(self, instance: None, owner: Any) -> FileDescriptor: ...
# Model instance access
@overload
@override
def __get__(self, instance: Model, owner: Any) -> FieldFile: ...
# non-Model instances
@overload
@override
def __get__(self, instance: Any, owner: Any) -> Self: ...
@override
def contribute_to_class(self, cls: type[Model], name: str, **kwargs: Any) -> None: ... # type: ignore[override]
def generate_filename(self, instance: Model, filename: StrPath) -> str: ...
@override
def save_form_data(self, instance: Model, data: File[Any] | str | bool | None) -> None: ...
class ImageFileDescriptor(FileDescriptor):
field: ImageField
@override
def __set__(self, instance: Model, value: str | None) -> None: ...
class ImageFieldFile(ImageFile, FieldFile):
field: ImageField
@override
def delete(self, save: bool = True) -> None: ...
class ImageField(FileField):
attr_class: type[ImageFieldFile]
descriptor_class: type[ImageFileDescriptor]
def __init__(
self,
verbose_name: _StrOrPromise | None = None,
name: str | None = None,
width_field: str | None = None,
height_field: str | None = None,
**kwargs: Any,
) -> None: ...
# class access
@overload
@override
def __get__(self, instance: None, owner: Any) -> ImageFileDescriptor: ...
# Model instance access
@overload
@override
def __get__(self, instance: Model, owner: Any) -> ImageFieldFile: ...
# non-Model instances
@overload
@override
def __get__(self, instance: Any, owner: Any) -> Self: ...
def update_dimension_fields(self, instance: Model, force: bool = False, *args: Any, **kwargs: Any) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/models/fields/generated.pyi 0000664 0000000 0000000 00000003770 15260643574 0027253 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable
from typing import Any, ClassVar, Literal
from django.core.validators import _ValidatorCallable
from django.db import models
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models.expressions import Expression
from django.db.models.fields import _ErrorMessagesMapping
from django.db.models.sql import Query
from django.utils.choices import _ChoicesInput
from django.utils.datastructures import DictWrapper
from django.utils.functional import _StrOrPromise, cached_property
from typing_extensions import override
class GeneratedField(models.Field[Any, Any]):
generated: ClassVar[Literal[True]]
db_returning: Literal[True]
_query: Query | None
output_field: models.Field[Any, Any] | None
def __init__(
self,
*,
expression: Expression,
output_field: models.Field[Any, Any],
db_persist: bool,
verbose_name: _StrOrPromise | None = ...,
name: str | None = ...,
primary_key: bool = ...,
unique: bool = ...,
blank: bool = ...,
null: bool = ...,
default: Any = ...,
editable: bool = ...,
auto_created: bool = ...,
serialize: bool = ...,
unique_for_date: str | None = ...,
unique_for_month: str | None = ...,
unique_for_year: str | None = ...,
choices: _ChoicesInput | None = ...,
help_text: _StrOrPromise = ...,
db_column: str | None = ...,
db_comment: str | None = ...,
db_tablespace: str | None = ...,
validators: Iterable[_ValidatorCallable] = ...,
error_messages: _ErrorMessagesMapping | None = ...,
**kwargs: Any,
) -> None: ...
def generated_sql(self, connection: BaseDatabaseWrapper) -> tuple[str, Any]: ...
@cached_property
def referenced_fields(self) -> frozenset[models.Field[Any, Any]]: ...
@override
def db_type_parameters(self, connection: BaseDatabaseWrapper) -> DictWrapper[Any]: ...
__all__ = ["GeneratedField"]
typeddjango-django-stubs-fa03b48/django-stubs/db/models/fields/json.pyi 0000664 0000000 0000000 00000013504 15260643574 0026262 0 ustar 00root root 0000000 0000000 import json
from collections.abc import Callable
from typing import Any, ClassVar, Self
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models import Model, lookups
from django.db.models.expressions import Expression
from django.db.models.fields import TextField
from django.db.models.lookups import FieldGetDbPrepValueMixin, PostgresOperatorLookup, Transform
from django.db.models.sql.compiler import SQLCompiler, _AsSqlType
from django.utils.functional import _StrOrPromise
from typing_extensions import TypeVar, override
from . import Field
from .mixins import CheckFieldDefaultMixin
# __set__ value type
_ST = TypeVar("_ST", contravariant=True, default=Any)
# __get__ return type
_GT = TypeVar("_GT", covariant=True, default=Any)
class JSONField(CheckFieldDefaultMixin, Field[_ST, _GT]):
encoder: type[json.JSONEncoder] | None
decoder: type[json.JSONDecoder] | None
def __init__(
self,
verbose_name: _StrOrPromise | None = None,
name: str | None = None,
encoder: type[json.JSONEncoder] | None = None,
decoder: type[json.JSONDecoder] | None = None,
**kwargs: Any,
) -> None: ...
def from_db_value(self, value: str | None, expression: Expression, connection: BaseDatabaseWrapper) -> Any: ...
@override
def get_transform(self, name: str) -> type[Transform] | KeyTransformFactory: ... # type: ignore[override]
@override
def value_to_string(self, obj: Model) -> Any: ...
class DataContains(FieldGetDbPrepValueMixin, PostgresOperatorLookup): ...
class ContainedBy(FieldGetDbPrepValueMixin, PostgresOperatorLookup): ...
class HasKeyLookup(PostgresOperatorLookup):
logical_operator: str | None
def compile_json_path_final_key(self, connection: BaseDatabaseWrapper, key_transform: Any) -> str: ...
@override
def as_sql(
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, template: str | None = None
) -> _AsSqlType: ...
def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
class HasKey(HasKeyLookup):
postgres_operator: str
class HasKeys(HasKeyLookup):
postgres_operator: str
logical_operator: str
class HasAnyKeys(HasKeys):
postgres_operator: str
logical_operator: str
class HasKeyOrArrayIndex(HasKey):
@override
def compile_json_path_final_key(self, connection: BaseDatabaseWrapper, key_transform: Any) -> str: ...
class JSONExact(lookups.Exact): ...
class CaseInsensitiveMixin:
# `process_lhs` drops `lhs` from `Lookup.process_lhs`, matching runtime.
def process_lhs(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
def process_rhs(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
class JSONIContains(CaseInsensitiveMixin, lookups.IContains): ... # type: ignore[misc]
class KeyTransform(Transform):
key_name: str
postgres_operator: str
postgres_nested_operator: str
def __init__(self, key_name: Any, *args: Any, **kwargs: Any) -> None: ...
def preprocess_lhs(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> Any: ...
def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
def as_postgresql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
@override
def as_sqlite( # type: ignore[override]
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper
) -> _AsSqlType: ...
class KeyTextTransform(KeyTransform):
postgres_operator: str
postgres_nested_operator: str
output_field: ClassVar[TextField[Any, Any]]
@override
def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
@classmethod
def from_lookup(cls, lookup: str) -> Self: ...
KT: Callable[[str], KeyTextTransform]
class KeyTransformTextLookupMixin:
def __init__(self, key_transform: Any, *args: Any, **kwargs: Any) -> None: ...
class KeyTransformIsNull(lookups.IsNull):
def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
class KeyTransformIn(lookups.In): ...
class KeyTransformExact(JSONExact): ...
class KeyTransformIExact(CaseInsensitiveMixin, KeyTransformTextLookupMixin, lookups.IExact): ... # type: ignore[misc]
class KeyTransformIContains( # type: ignore[misc]
CaseInsensitiveMixin, KeyTransformTextLookupMixin, lookups.IContains
): ...
class KeyTransformStartsWith(KeyTransformTextLookupMixin, lookups.StartsWith): ...
class KeyTransformIStartsWith( # type: ignore[misc]
CaseInsensitiveMixin, KeyTransformTextLookupMixin, lookups.IStartsWith
): ...
class KeyTransformEndsWith(KeyTransformTextLookupMixin, lookups.EndsWith): ...
class KeyTransformIEndsWith( # type: ignore[misc]
CaseInsensitiveMixin, KeyTransformTextLookupMixin, lookups.IEndsWith
): ...
class KeyTransformRegex(KeyTransformTextLookupMixin, lookups.Regex): ...
class KeyTransformIRegex(CaseInsensitiveMixin, KeyTransformTextLookupMixin, lookups.IRegex): ... # type: ignore[misc]
class KeyTransformNumericLookupMixin:
def process_rhs(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
class KeyTransformLt(KeyTransformNumericLookupMixin, lookups.LessThan): ...
class KeyTransformLte(KeyTransformNumericLookupMixin, lookups.LessThanOrEqual): ...
class KeyTransformGt(KeyTransformNumericLookupMixin, lookups.GreaterThan): ...
class KeyTransformGte(KeyTransformNumericLookupMixin, lookups.GreaterThanOrEqual): ...
class KeyTransformFactory:
key_name: Any
def __init__(self, key_name: Any) -> None: ...
def __call__(self, *args: Any, **kwargs: Any) -> KeyTransform: ...
__all__ = ["JSONField"]
typeddjango-django-stubs-fa03b48/django-stubs/db/models/fields/mixins.pyi 0000664 0000000 0000000 00000001214 15260643574 0026613 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.checks.messages import CheckMessage
from django.db.models.base import Model
from django.utils.functional import cached_property
NOT_PROVIDED: Any
class FieldCacheMixin:
@cached_property
def cache_name(self) -> str: ...
def get_cached_value(self, instance: Model, default: Any = ...) -> Model | None: ...
def is_cached(self, instance: Model) -> bool: ...
def set_cached_value(self, instance: Model, value: Model | None) -> None: ...
def delete_cached_value(self, instance: Model) -> None: ...
class CheckFieldDefaultMixin:
def check(self, **kwargs: Any) -> list[CheckMessage]: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/models/fields/proxy.pyi 0000664 0000000 0000000 00000000253 15260643574 0026467 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.models import fields
class OrderWrt(fields.IntegerField[Any, Any]):
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/models/fields/related.pyi 0000664 0000000 0000000 00000041340 15260643574 0026730 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterable, Sequence
from typing import Any, Generic, Literal, Self, overload
from uuid import UUID
from django import forms
from django.core.validators import _ValidatorCallable
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models.base import Model
from django.db.models.expressions import Combinable, Expression
from django.db.models.fields import NOT_PROVIDED, Field, _AllLimitChoicesTo, _ErrorMessagesMapping, _LimitChoicesTo
from django.db.models.fields.mixins import FieldCacheMixin
from django.db.models.fields.related_descriptors import ForeignKeyDeferredAttribute, ManyRelatedManager
from django.db.models.fields.related_descriptors import ForwardManyToOneDescriptor as ForwardManyToOneDescriptor
from django.db.models.fields.related_descriptors import ForwardOneToOneDescriptor as ForwardOneToOneDescriptor
from django.db.models.fields.related_descriptors import ManyToManyDescriptor as ManyToManyDescriptor
from django.db.models.fields.related_descriptors import ReverseManyToOneDescriptor as ReverseManyToOneDescriptor
from django.db.models.fields.related_descriptors import ReverseOneToOneDescriptor as ReverseOneToOneDescriptor
from django.db.models.fields.reverse_related import ForeignObjectRel as ForeignObjectRel
from django.db.models.fields.reverse_related import ManyToManyRel as ManyToManyRel
from django.db.models.fields.reverse_related import ManyToOneRel as ManyToOneRel
from django.db.models.fields.reverse_related import OneToOneRel as OneToOneRel
from django.db.models.query_utils import FilteredRelation, PathInfo, Q
from django.db.models.sql.where import WhereNode
from django.forms.widgets import Widget
from django.utils.choices import _Choices
from django.utils.functional import _StrOrPromise, cached_property
from typing_extensions import TypeVar, override
RECURSIVE_RELATIONSHIP_CONSTANT: Literal["self"]
def resolve_relation(scope_model: type[Model], relation: str | type[Model]) -> str | type[Model]: ...
def lazy_related_operation(
function: Callable[..., Any], model: type[Model], *related_models: type[Model] | str, **kwargs: Any
) -> None: ...
# __set__ value type
_ST = TypeVar("_ST", contravariant=True)
# __get__ return type
_GT = TypeVar("_GT", covariant=True, default=_ST)
class RelatedField(FieldCacheMixin, Field[_ST, _GT]):
one_to_many: bool
one_to_one: bool
many_to_many: bool
many_to_one: bool
opts: Any
remote_field: ForeignObjectRel
rel_class: type[ForeignObjectRel]
def __init__(
self,
related_name: str | None = None,
related_query_name: str | None = None,
limit_choices_to: _AllLimitChoicesTo | None = None,
*,
verbose_name: _StrOrPromise | None = ...,
name: str | None = ...,
primary_key: bool = ...,
max_length: int | None = ...,
unique: bool = ...,
blank: bool = ...,
null: bool = ...,
db_index: bool = ...,
rel: ForeignObjectRel | None = ...,
default: Any = ...,
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
editable: bool = ...,
serialize: bool = ...,
unique_for_date: str | None = ...,
unique_for_month: str | None = ...,
unique_for_year: str | None = ...,
choices: _Choices | None = ...,
help_text: _StrOrPromise = ...,
db_column: str | None = ...,
db_tablespace: str | None = ...,
auto_created: bool = ...,
validators: Iterable[_ValidatorCallable] = ...,
error_messages: _ErrorMessagesMapping | None = ...,
db_comment: str | None = ...,
) -> None: ...
@cached_property
@override
def related_model(self) -> type[Model]: ... # type: ignore[override]
@override
def contribute_to_class(self, cls: type[Model], name: str, private_only: bool = False, **kwargs: Any) -> None: ...
def get_forward_related_filter(self, obj: Model) -> dict[str, int | UUID]: ...
def get_reverse_related_filter(self, obj: Model) -> Q: ...
@property
def swappable_setting(self) -> str | None: ...
def set_attributes_from_rel(self) -> None: ...
def do_related_class(self, other: type[Model], cls: type[Model]) -> None: ...
def get_limit_choices_to(self) -> _LimitChoicesTo: ...
def related_query_name(self) -> str: ...
@property
def target_field(self) -> Field[Any, Any]: ...
class ForeignObject(RelatedField[_ST, _GT]):
remote_field: ForeignObjectRel
rel_class: type[ForeignObjectRel]
column: None
from_fields: Sequence[str]
to_fields: Sequence[str | None] # None occurs in ForeignKey, where to_field defaults to None
def __init__(
self,
to: type[Model] | str,
on_delete: Callable[..., None],
from_fields: Sequence[str],
to_fields: Sequence[str],
rel: ForeignObjectRel | None = None,
related_name: str | None = None,
related_query_name: str | None = None,
limit_choices_to: _AllLimitChoicesTo | None = None,
parent_link: bool = False,
swappable: bool = True,
*,
verbose_name: _StrOrPromise | None = ...,
name: str | None = ...,
primary_key: bool = ...,
unique: bool = ...,
blank: bool = ...,
null: bool = ...,
db_index: bool = ...,
default: Any = ...,
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
editable: bool = ...,
auto_created: bool = ...,
serialize: bool = ...,
choices: _Choices | None = ...,
help_text: _StrOrPromise = ...,
db_column: str | None = ...,
db_tablespace: str | None = ...,
validators: Iterable[_ValidatorCallable] = ...,
error_messages: _ErrorMessagesMapping | None = ...,
db_comment: str | None = ...,
) -> None: ...
# class access
@overload
@override
def __get__(self, instance: None, owner: Any) -> ForwardManyToOneDescriptor[Self]: ...
# Model instance access
@overload
@override
def __get__(self, instance: Model, owner: Any) -> _GT: ...
# non-Model instances
@overload
@override
def __get__(self, instance: Any, owner: Any) -> Self: ...
def resolve_related_fields(self) -> list[tuple[Field[Any, Any], Field[Any, Any]]]: ...
@cached_property
def related_fields(self) -> list[tuple[Field[Any, Any], Field[Any, Any]]]: ...
@cached_property
def reverse_related_fields(self) -> list[tuple[Field[Any, Any], Field[Any, Any]]]: ...
@cached_property
def local_related_fields(self) -> tuple[Field[Any, Any], ...]: ...
@cached_property
def foreign_related_fields(self) -> tuple[Field[Any, Any], ...]: ...
@property
@override
def non_db_attrs(self) -> tuple[str, ...]: ... # type: ignore[override]
def get_local_related_value(self, instance: Model) -> tuple[Any, ...]: ...
def get_foreign_related_value(self, instance: Model) -> tuple[Any, ...]: ...
@staticmethod
def get_instance_value_for_fields(instance: Model, fields: Sequence[Field[Any, Any]]) -> tuple[Any, ...]: ...
def get_joining_fields(self, reverse_join: bool = False) -> tuple[tuple[Field[Any, Any], Field[Any, Any]], ...]: ...
def get_reverse_joining_fields(self) -> tuple[tuple[Field[Any, Any], Field[Any, Any]], ...]: ...
def get_extra_descriptor_filter(self, instance: Model) -> dict[str, Any] | Q: ...
def get_extra_restriction(self, alias: str, related_alias: str) -> WhereNode | None: ...
def get_path_info(self, filtered_relation: FilteredRelation | None = None) -> list[PathInfo]: ...
@cached_property
def path_infos(self) -> list[PathInfo]: ...
def get_reverse_path_info(self, filtered_relation: FilteredRelation | None = None) -> list[PathInfo]: ...
@cached_property
def reverse_path_infos(self) -> list[PathInfo]: ...
def contribute_to_related_class(self, cls: type[Model], related: RelatedField[Any, Any]) -> None: ...
@override
def get_attname_column(self) -> tuple[str, None]: ...
forward_related_accessor_class: type[ForwardManyToOneDescriptor[Any]]
related_accessor_class: type[ReverseManyToOneDescriptor[Any]]
requires_unique_target: bool
class ForeignKey(ForeignObject[_ST, _GT]):
_pyi_private_set_type: Any | Combinable
_pyi_private_get_type: Any
descriptor_class: type[ForeignKeyDeferredAttribute]
remote_field: ManyToOneRel
rel_class: type[ManyToOneRel]
column: str # type: ignore[assignment]
def __init__(
self,
to: type[Model] | str,
on_delete: Callable[..., None],
related_name: str | None = None,
related_query_name: str | None = None,
limit_choices_to: _AllLimitChoicesTo | None = None,
parent_link: bool = False,
to_field: str | None = None,
db_constraint: bool = True,
*,
swappable: bool = ...,
verbose_name: _StrOrPromise | None = ...,
name: str | None = ...,
primary_key: bool = ...,
max_length: int | None = ...,
unique: bool = ...,
blank: bool = ...,
null: bool = ...,
db_index: bool = ...,
default: Any = ...,
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
editable: bool = ...,
auto_created: bool = ...,
serialize: bool = ...,
unique_for_date: str | None = ...,
unique_for_month: str | None = ...,
unique_for_year: str | None = ...,
choices: _Choices | None = ...,
help_text: _StrOrPromise = ...,
db_column: str | None = ...,
db_tablespace: str | None = ...,
validators: Iterable[_ValidatorCallable] = ...,
error_messages: _ErrorMessagesMapping | None = ...,
db_comment: str | None = ...,
) -> None: ...
@classmethod
def __class_getitem__(cls, *args: Any, **kwargs: Any) -> type[Self]: ...
@override
def contribute_to_related_class(self, cls: type[Model], related: RelatedField[Any, Any]) -> None: ...
@override
def formfield(
self,
*,
form_class: type[forms.Field] | None = ...,
choices_form_class: type[forms.ChoiceField] | None = ...,
required: bool = ...,
widget: Widget | type[Widget] | None = ...,
label: _StrOrPromise | None = ...,
initial: Any | None = ...,
help_text: _StrOrPromise = ...,
error_messages: _ErrorMessagesMapping | None = ...,
show_hidden_initial: bool = ...,
validators: Iterable[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
# ForeignKey adds `using`
using: str | None = ...,
**kwargs: Any,
) -> forms.Field | None: ...
@override
def cast_db_type(self, connection: BaseDatabaseWrapper) -> str | None: ...
def convert_empty_strings(self, value: Any, expression: Expression, connection: BaseDatabaseWrapper) -> Any: ...
@override
def get_attname_column(self) -> tuple[str, str]: ... # type: ignore[override]
class OneToOneField(ForeignKey[_ST, _GT]):
_pyi_private_set_type: Any | Combinable
_pyi_private_get_type: Any
remote_field: OneToOneRel
rel_class: type[OneToOneRel]
def __init__(
self,
to: type[Model] | str,
on_delete: Callable[..., None],
to_field: str | None = None,
*,
swappable: bool = ...,
related_name: str | None = ...,
related_query_name: str | None = ...,
limit_choices_to: _AllLimitChoicesTo | None = ...,
parent_link: bool = ...,
db_constraint: bool = ...,
verbose_name: _StrOrPromise | None = ...,
name: str | None = ...,
primary_key: bool = ...,
max_length: int | None = ...,
unique: bool = ...,
blank: bool = ...,
null: bool = ...,
db_index: bool = ...,
default: Any = ...,
db_default: type[NOT_PROVIDED] | Expression | _ST = ...,
editable: bool = ...,
auto_created: bool = ...,
serialize: bool = ...,
unique_for_date: str | None = ...,
unique_for_month: str | None = ...,
unique_for_year: str | None = ...,
choices: _Choices | None = ...,
help_text: _StrOrPromise = ...,
db_column: str | None = ...,
db_tablespace: str | None = ...,
validators: Iterable[_ValidatorCallable] = ...,
error_messages: _ErrorMessagesMapping | None = ...,
db_comment: str | None = ...,
) -> None: ...
# class access
@overload
@override
def __get__(self, instance: None, owner: Any) -> ForwardOneToOneDescriptor[Self]: ...
# Model instance access
@overload
@override
def __get__(self, instance: Model, owner: Any) -> _GT: ...
# non-Model instances
@overload
@override
def __get__(self, instance: Any, owner: Any) -> Self: ...
forward_related_accessor_class: type[ForwardOneToOneDescriptor[Any]]
related_accessor_class: type[ReverseOneToOneDescriptor[Any, Any]] # type: ignore[assignment]
_Through = TypeVar("_Through", bound=Model, default=Any)
_To = TypeVar("_To", bound=Model)
class ManyToManyField(RelatedField[Any, Any], Generic[_To, _Through]):
has_null_arg: bool
swappable: bool
many_to_many: Literal[True]
many_to_one: Literal[False]
one_to_many: Literal[False]
one_to_one: Literal[False]
remote_field: ManyToManyRel
rel_class: type[ManyToManyRel]
column: None
def __init__(
self,
to: type[_To] | str,
related_name: str | None = None,
related_query_name: str | None = None,
limit_choices_to: _AllLimitChoicesTo | None = None,
symmetrical: bool | None = None,
through: type[_Through] | str | None = None,
through_fields: tuple[str, str] | None = None,
db_constraint: bool = True,
db_table: str | None = None,
swappable: bool = True,
*,
verbose_name: _StrOrPromise | None = ...,
name: str | None = ...,
primary_key: bool = ...,
max_length: int | None = ...,
unique: bool = ...,
blank: bool = ...,
null: bool = ...,
db_index: bool = ...,
default: Any = ...,
editable: bool = ...,
auto_created: bool = ...,
serialize: bool = ...,
unique_for_date: str | None = ...,
unique_for_month: str | None = ...,
unique_for_year: str | None = ...,
choices: _Choices | None = ...,
help_text: _StrOrPromise = ...,
db_column: str | None = ...,
db_tablespace: str | None = ...,
error_messages: _ErrorMessagesMapping | None = ...,
db_comment: str | None = ...,
) -> None: ...
# class access
@overload
@override
def __get__(self, instance: None, owner: Any) -> ManyToManyDescriptor[_To, _Through]: ...
# Model instance access
@overload
@override
def __get__(self, instance: Model, owner: Any) -> ManyRelatedManager[_To, _Through]: ...
# non-Model instances
@overload
@override
def __get__(self, instance: Any, owner: Any) -> Self: ...
def get_path_info(self, filtered_relation: FilteredRelation | None = None) -> list[PathInfo]: ...
def get_reverse_path_info(self, filtered_relation: FilteredRelation | None = None) -> list[PathInfo]: ...
@override
def contribute_to_class(self, cls: type[Model], name: str, **kwargs: Any) -> None: ... # type: ignore[override]
def contribute_to_related_class(self, cls: type[Model], related: RelatedField[Any, Any]) -> None: ...
@override
def get_attname_column(self) -> tuple[str, None]: ...
def m2m_db_table(self) -> str: ...
def m2m_column_name(self) -> str: ...
def m2m_reverse_name(self) -> str: ...
def m2m_field_name(self) -> str: ...
def m2m_reverse_field_name(self) -> str: ...
def m2m_target_field_name(self) -> str: ...
def m2m_reverse_target_field_name(self) -> str: ...
@override
def formfield(
self,
*,
form_class: type[forms.Field] | None = ...,
choices_form_class: type[forms.ChoiceField] | None = ...,
required: bool = ...,
widget: Widget | type[Widget] | None = ...,
label: _StrOrPromise | None = ...,
initial: Any | None = ...,
help_text: _StrOrPromise = ...,
error_messages: _ErrorMessagesMapping | None = ...,
show_hidden_initial: bool = ...,
validators: Iterable[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
# ManyToManyField adds `using`
using: str | None = ...,
**kwargs: Any,
) -> forms.Field | None: ...
@cached_property
def path_infos(self) -> list[PathInfo]: ...
@cached_property
def reverse_path_infos(self) -> list[PathInfo]: ...
def create_many_to_many_intermediary_model(field: ManyToManyField[Any, Any], klass: type[Model]) -> type[Model]: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/models/fields/related_descriptors.pyi 0000664 0000000 0000000 00000022362 15260643574 0031354 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterable, Mapping
from typing import Any, Generic, Never, Self, overload, type_check_only
from django.core.exceptions import ObjectDoesNotExist
from django.db.models.base import Model
from django.db.models.fields import Field
from django.db.models.fields.related import ForeignKey, ManyToManyField, RelatedField
from django.db.models.fields.reverse_related import ManyToManyRel, ManyToOneRel, OneToOneRel
from django.db.models.manager import BaseManager, Manager
from django.db.models.query import QuerySet
from django.db.models.query_utils import DeferredAttribute
from django.utils.functional import cached_property
from typing_extensions import TypeVar, override
_M = TypeVar("_M", bound=Model)
_F = TypeVar("_F", bound=Field[Any, Any])
_From = TypeVar("_From", bound=Model)
_Through = TypeVar("_Through", bound=Model, default=Model)
_To = TypeVar("_To", bound=Model)
class ForeignKeyDeferredAttribute(DeferredAttribute):
field: RelatedField[Any, Any]
def __set__(self, instance: Model, value: Any) -> None: ...
class ForwardManyToOneDescriptor(Generic[_F]):
field: _F
def __init__(self, field_with_rel: _F) -> None: ...
@cached_property
def RelatedObjectDoesNotExist(self) -> type[ObjectDoesNotExist]: ...
def is_cached(self, instance: Model) -> bool: ...
def get_queryset(self, *, instance: Model) -> QuerySet[Any]: ...
def get_prefetch_querysets(
self, instances: list[Model], querysets: list[QuerySet[Any]] | None = None
) -> tuple[QuerySet[Any], Callable[..., Any], Callable[..., Any], bool, str, bool]: ...
def get_object(self, instance: Model) -> Model: ...
def __get__(
self, instance: Model | None, cls: type[Model] | None = None
) -> Model | ForwardManyToOneDescriptor[Any] | None: ...
def fetch_one(self, instance: Model) -> None: ...
def fetch_many(self, instances: Iterable[Model]) -> None: ...
def __set__(self, instance: Model, value: Model | None) -> None: ...
@override
def __reduce__(self) -> tuple[Callable[..., Any], tuple[type[Model], str]]: ...
class ForwardOneToOneDescriptor(ForwardManyToOneDescriptor[_F]):
@override
def get_object(self, instance: Model) -> Model: ...
class ReverseOneToOneDescriptor(Generic[_From, _To]):
"""
In the example::
class Restaurant(Model):
place = OneToOneField(Place, related_name='restaurant')
``Place.restaurant`` is a ``ReverseOneToOneDescriptor`` instance.
"""
related: OneToOneRel
def __init__(self, related: OneToOneRel) -> None: ...
@cached_property
def RelatedObjectDoesNotExist(self) -> type[ObjectDoesNotExist]: ...
def is_cached(self, instance: _From) -> bool: ...
def get_queryset(self, *, instance: Model) -> QuerySet[_To]: ...
def get_prefetch_querysets(
self, instances: list[_From], querysets: list[QuerySet[_To]] | None = None
) -> tuple[QuerySet[_To], Callable[..., Any], Callable[..., Any], bool, str, bool]: ...
@overload
def __get__(self, instance: None, cls: Any | None = None) -> ReverseOneToOneDescriptor[_From, _To]: ...
@overload
def __get__(self, instance: _From, cls: Any | None = None) -> _To: ...
# For compatibility with the fetcher protocol. While `self.related` is really a `OneToOneRel`,
# it quacks enough like a `Field` to work.
@property
def field(self) -> Field[Any, Any]: ...
def fetch_one(self, instance: Model) -> None: ...
def fetch_many(self, instances: Iterable[Model]) -> None: ...
def __set__(self, instance: _From, value: _To | None) -> None: ...
@override
def __reduce__(self) -> tuple[Callable[..., Any], tuple[type[_To], str]]: ...
class ReverseManyToOneDescriptor(Generic[_To]):
"""
In the example::
class Child(Model):
parent = ForeignKey(Parent, related_name='children')
``Parent.children`` is a ``ReverseManyToOneDescriptor`` instance.
"""
rel: ManyToOneRel
field: ForeignKey[_To, _To]
def __init__(self, rel: ManyToOneRel) -> None: ...
@cached_property
def related_manager_cls(self) -> type[RelatedManager[_To]]: ...
@overload
def __get__(self, instance: None, cls: Any | None = None) -> Self: ...
@overload
def __get__(self, instance: Model, cls: Any | None = None) -> RelatedManager[_To]: ...
def __set__(self, instance: Any, value: Any) -> Never: ...
# Fake class, Django defines 'RelatedManager' inside a function body
@type_check_only
class RelatedManager(Manager[_To], Generic[_To]):
related_val: tuple[int, ...]
# Related managers are bound to model instances, so we allow instance access.
@override
def __get__(self, instance: object, cls: type[Any] | None = None) -> Self: ...
def __call__(self, *, manager: str) -> RelatedManager[_To]: ...
def add(self, *objs: _To | int, bulk: bool = ...) -> None: ...
async def aadd(self, *objs: _To | int, bulk: bool = ...) -> None: ...
def remove(self, *objs: _To | int, bulk: bool = ...) -> None: ...
async def aremove(self, *objs: _To | int, bulk: bool = ...) -> None: ...
def clear(self, *, bulk: bool = ...) -> None: ...
async def aclear(self, *, bulk: bool = ...) -> None: ...
def set(
self,
objs: QuerySet[_To] | Iterable[_To | int],
*,
bulk: bool = ...,
clear: bool = ...,
) -> None: ...
async def aset(
self,
objs: QuerySet[_To] | Iterable[_To | int],
*,
bulk: bool = ...,
clear: bool = ...,
) -> None: ...
def create_reverse_many_to_one_manager(
superclass: type[BaseManager[_M]], rel: ManyToOneRel
) -> type[RelatedManager[_M]]: ...
class ManyToManyDescriptor(ReverseManyToOneDescriptor[Any], Generic[_To, _Through]):
"""
In the example::
class Pizza(Model):
toppings = ManyToManyField(Topping, related_name='pizzas')
``Pizza.toppings`` and ``Topping.pizzas`` are ``ManyToManyDescriptor``
instances.
"""
# 'field' here is 'rel.field'
rel: ManyToManyRel # type: ignore[assignment]
field: ManyToManyField[_To, _Through] # type: ignore[assignment]
reverse: bool
def __init__(self, rel: ManyToManyRel, reverse: bool = False) -> None: ...
@property
def through(self) -> type[_Through]: ...
@cached_property
@override
def related_manager_cls(self) -> type[ManyRelatedManager[_To, _Through]]: ... # type: ignore[override]
@overload # type: ignore[override]
def __get__(self, instance: None, cls: Any | None = None) -> Self: ...
@overload
@override
def __get__(self, instance: Model, cls: Any | None = None) -> ManyRelatedManager[_To, _Through]: ...
# Fake class, Django defines 'ManyRelatedManager' inside a function body
@type_check_only
class ManyRelatedManager(Manager[_To], Generic[_To, _Through]):
related_val: tuple[int, ...]
# See `RelatedManager.__get__`
@override
def __get__(self, instance: object, cls: type[Any] | None = None) -> Self: ...
through: type[_Through]
def __call__(self, *, manager: str) -> ManyRelatedManager[_To, _Through]: ...
def add(
self,
*objs: _To | int,
through_defaults: Mapping[str, Any] | None = ...,
) -> None: ...
async def aadd(
self,
*objs: _To | int,
through_defaults: Mapping[str, Any] | None = ...,
) -> None: ...
def remove(self, *objs: _To | int) -> None: ...
async def aremove(self, *objs: _To | int) -> None: ...
def clear(self) -> None: ...
async def aclear(self) -> None: ...
def set(
self,
objs: QuerySet[_To] | Iterable[_To | int],
*,
clear: bool = ...,
through_defaults: Mapping[str, Any] | None = ...,
) -> None: ...
async def aset(
self,
objs: QuerySet[_To] | Iterable[_To | int],
*,
clear: bool = ...,
through_defaults: Mapping[str, Any] | None = ...,
) -> None: ...
@override
def create(
self,
*,
through_defaults: Mapping[str, Any] | None = ...,
**kwargs: Any,
) -> _To: ...
@override
async def acreate(
self,
*,
through_defaults: Mapping[str, Any] | None = ...,
**kwargs: Any,
) -> _To: ...
@override
def get_or_create(
self,
defaults: Mapping[str, Any] | None = ...,
through_defaults: Mapping[str, Any] | None = ...,
**kwargs: Any,
) -> tuple[_To, bool]: ...
@override
async def aget_or_create(
self,
defaults: Mapping[str, Any] | None = ...,
through_defaults: Mapping[str, Any] | None = ...,
**kwargs: Any,
) -> tuple[_To, bool]: ...
@override
def update_or_create(
self,
defaults: Mapping[str, Any] | None = ...,
create_defaults: Mapping[str, Any] | None = ...,
through_defaults: Mapping[str, Any] | None = ...,
**kwargs: Any,
) -> tuple[_To, bool]: ...
@override
async def aupdate_or_create(
self,
defaults: Mapping[str, Any] | None = ...,
create_defaults: Mapping[str, Any] | None = ...,
through_defaults: Mapping[str, Any] | None = ...,
**kwargs: Any,
) -> tuple[_To, bool]: ...
def create_forward_many_to_many_manager(
superclass: type[BaseManager[_To]], rel: ManyToManyRel, reverse: bool
) -> type[ManyRelatedManager[_To, _Through]]: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/models/fields/related_lookups.pyi 0000664 0000000 0000000 00000002035 15260643574 0030502 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable
from typing import Any
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models.lookups import Exact, GreaterThan, GreaterThanOrEqual, In, IsNull, LessThan, LessThanOrEqual
from django.db.models.sql.compiler import SQLCompiler, _AsSqlType
from typing_extensions import override
def get_normalized_value(value: Any, lhs: Any) -> tuple[Any, ...]: ...
class RelatedIn(In):
@override
def get_prep_lookup(self) -> Iterable[Any]: ...
class RelatedLookupMixin:
rhs: Any
def get_prep_lookup(self) -> Any: ...
def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
class RelatedExact(RelatedLookupMixin, Exact): ...
class RelatedLessThan(RelatedLookupMixin, LessThan): ...
class RelatedGreaterThan(RelatedLookupMixin, GreaterThan): ...
class RelatedGreaterThanOrEqual(RelatedLookupMixin, GreaterThanOrEqual): ...
class RelatedLessThanOrEqual(RelatedLookupMixin, LessThanOrEqual): ...
class RelatedIsNull(RelatedLookupMixin, IsNull): ...
typeddjango-django-stubs-fa03b48/django-stubs/db/models/fields/reverse_related.pyi 0000664 0000000 0000000 00000012702 15260643574 0030463 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Sequence
from typing import Any, Literal
from django.db.models.base import Model
from django.db.models.fields import Field, _AllLimitChoicesTo, _ChoicesList, _LimitChoicesTo
from django.db.models.fields.related import ForeignKey, ForeignObject, ManyToManyField, OneToOneField
from django.db.models.lookups import Lookup, StartsWith, Transform
from django.db.models.query import _OrderByFieldName
from django.db.models.query_utils import FilteredRelation, PathInfo
from django.db.models.sql.where import WhereNode
from django.utils.functional import cached_property
from typing_extensions import override
from .mixins import FieldCacheMixin
# Common note: `model` and `through` can be of type `str` when passed to `__init__`.
# When parent's `contribute_to_class` is called (during startup),
# strings are resolved to real model classes.
# Thus `str` is acceptable in __init__, but instance attribute `model` is always
# `Type[Model]`
class ForeignObjectRel(FieldCacheMixin):
auto_created: bool
concrete: Literal[False]
editable: bool
empty_strings_allowed: bool
is_relation: bool
null: bool
field: ForeignObject[Any, Any]
model: type[Model]
related_name: str | None
related_query_name: str | None
limit_choices_to: _AllLimitChoicesTo | None
parent_link: bool
on_delete: Callable[..., Any] | None
symmetrical: bool
multiple: bool
field_name: str | None
def __init__(
self,
field: ForeignObject[Any, Any],
to: type[Model] | str,
related_name: str | None = None,
related_query_name: str | None = None,
limit_choices_to: _AllLimitChoicesTo | None = None,
parent_link: bool = False,
on_delete: Callable[..., Any] | None = None,
) -> None: ...
@cached_property
def hidden(self) -> bool: ...
@cached_property
def name(self) -> str: ...
@property
def remote_field(self) -> ForeignObject[Any, Any]: ...
@property
def target_field(self) -> Field[Any, Any]: ...
@cached_property
def related_model(self) -> type[Model]: ...
@cached_property
def many_to_many(self) -> bool: ...
@cached_property
def many_to_one(self) -> bool: ...
@cached_property
def one_to_many(self) -> bool: ...
@cached_property
def one_to_one(self) -> bool: ...
def get_lookup(self, lookup_name: str) -> type[Lookup] | None: ...
def get_lookups(self) -> dict[str, Any]: ...
def get_transform(self, name: str) -> type[Transform] | None: ...
def get_internal_type(self) -> str: ...
@property
def db_type(self) -> Any: ...
# Yes, seems that `get_choices` will fail if `limit_choices_to=None`
# and `self.limit_choices_to` is callable.
def get_choices(
self,
include_blank: bool = True,
blank_choice: _ChoicesList | None = None,
limit_choices_to: _LimitChoicesTo | None = None,
ordering: Sequence[_OrderByFieldName] = (),
) -> _ChoicesList: ...
def get_joining_fields(self) -> tuple[tuple[Field[Any, Any], Field[Any, Any]], ...]: ...
def get_extra_restriction(self, alias: str, related_alias: str) -> StartsWith | WhereNode | None: ...
def set_field_name(self) -> None: ...
@property
def identity(self) -> tuple[Any, ...]: ...
@cached_property
def accessor_name(self) -> str | None: ...
def get_accessor_name(self, model: type[Model] | None = None) -> str | None: ...
def get_path_info(self, filtered_relation: FilteredRelation | None = None) -> list[PathInfo]: ...
@cached_property
def path_infos(self) -> list[PathInfo]: ...
class ManyToOneRel(ForeignObjectRel):
field: ForeignKey[Any, Any]
def __init__(
self,
field: ForeignKey[Any, Any],
to: type[Model] | str,
field_name: str,
related_name: str | None = None,
related_query_name: str | None = None,
limit_choices_to: _AllLimitChoicesTo | None = None,
parent_link: bool = False,
on_delete: Callable[..., Any] | None = None,
) -> None: ...
def get_related_field(self) -> Field[Any, Any]: ...
@override
def get_accessor_name(self, model: type[Model] | None = None) -> str: ...
@property
@override
def identity(self) -> tuple[Any, ...]: ...
class OneToOneRel(ManyToOneRel):
field: OneToOneField[Any, Any]
def __init__(
self,
field: OneToOneField[Any, Any],
to: type[Model] | str,
field_name: str | None,
related_name: str | None = None,
related_query_name: str | None = None,
limit_choices_to: _AllLimitChoicesTo | None = None,
parent_link: bool = False,
on_delete: Callable[..., Any] | None = None,
) -> None: ...
class ManyToManyRel(ForeignObjectRel):
field: ManyToManyField[Any, Any] # type: ignore[assignment]
through: type[Model] | None
through_fields: tuple[str, str] | None
db_constraint: bool
def __init__(
self,
field: ManyToManyField[Any, Any],
to: type[Model] | str,
related_name: str | None = None,
related_query_name: str | None = None,
limit_choices_to: _AllLimitChoicesTo | None = None,
symmetrical: bool = True,
through: type[Model] | str | None = None,
through_fields: tuple[str, str] | None = None,
db_constraint: bool = True,
) -> None: ...
def get_related_field(self) -> Field[Any, Any]: ...
@property
@override
def identity(self) -> tuple[Any, ...]: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/models/fields/tuple_lookups.pyi 0000664 0000000 0000000 00000004140 15260643574 0030212 0 ustar 00root root 0000000 0000000 from collections.abc import Iterator
from typing import Any
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models.expressions import Expression, Func
from django.db.models.fields import Field
from django.db.models.lookups import Exact, GreaterThan, GreaterThanOrEqual, In, IsNull, LessThan, LessThanOrEqual
from django.db.models.sql.compiler import SQLCompiler, _AsSqlType
from typing_extensions import override
class Tuple(Func):
function: str
output_field: Field[Any, Any]
def __len__(self) -> int: ...
def __iter__(self) -> Iterator[Expression]: ...
@override
def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... # type: ignore[override]
class TupleLookupMixin:
allows_composite_expressions: bool
def get_prep_lookup(self) -> Any: ...
def check_rhs_is_tuple_or_list(self) -> None: ...
def check_rhs_length_equals_lhs_length(self) -> None: ...
def check_rhs_is_supported_expression(self) -> None: ...
def get_lhs_str(self) -> str: ...
def get_prep_lhs(self) -> Any: ...
def process_lhs(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, lhs: Any = None) -> _AsSqlType: ...
def process_rhs(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
def get_fallback_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
class TupleExact(TupleLookupMixin, Exact): ...
class TupleIsNull(TupleLookupMixin, IsNull): ...
class TupleGreaterThan(TupleLookupMixin, GreaterThan): ...
class TupleGreaterThanOrEqual(TupleLookupMixin, GreaterThanOrEqual): ...
class TupleLessThan(TupleLookupMixin, LessThan): ...
class TupleLessThanOrEqual(TupleLookupMixin, LessThanOrEqual): ...
class TupleIn(TupleLookupMixin, In):
def check_rhs_is_collection_of_tuples_or_lists(self) -> None: ...
def check_rhs_elements_length_equals_lhs_length(self) -> None: ...
def check_rhs_is_query(self) -> None: ...
tuple_lookups: dict[str, type[TupleLookupMixin]]
typeddjango-django-stubs-fa03b48/django-stubs/db/models/functions/ 0000775 0000000 0000000 00000000000 15260643574 0025325 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/db/models/functions/__init__.pyi 0000664 0000000 0000000 00000011477 15260643574 0027621 0 ustar 00root root 0000000 0000000 from .comparison import Cast as Cast
from .comparison import Coalesce as Coalesce
from .comparison import Collate as Collate
from .comparison import Greatest as Greatest
from .comparison import Least as Least
from .comparison import NullIf as NullIf
from .datetime import Extract as Extract
from .datetime import ExtractDay as ExtractDay
from .datetime import ExtractHour as ExtractHour
from .datetime import ExtractIsoWeekDay as ExtractIsoWeekDay
from .datetime import ExtractIsoYear as ExtractIsoYear
from .datetime import ExtractMinute as ExtractMinute
from .datetime import ExtractMonth as ExtractMonth
from .datetime import ExtractQuarter as ExtractQuarter
from .datetime import ExtractSecond as ExtractSecond
from .datetime import ExtractWeek as ExtractWeek
from .datetime import ExtractWeekDay as ExtractWeekDay
from .datetime import ExtractYear as ExtractYear
from .datetime import Now as Now
from .datetime import Trunc as Trunc
from .datetime import TruncDate as TruncDate
from .datetime import TruncDay as TruncDay
from .datetime import TruncHour as TruncHour
from .datetime import TruncMinute as TruncMinute
from .datetime import TruncMonth as TruncMonth
from .datetime import TruncQuarter as TruncQuarter
from .datetime import TruncSecond as TruncSecond
from .datetime import TruncTime as TruncTime
from .datetime import TruncWeek as TruncWeek
from .datetime import TruncYear as TruncYear
from .json import JSONArray as JSONArray
from .json import JSONObject as JSONObject
from .math import Abs as Abs
from .math import ACos as ACos
from .math import ASin as ASin
from .math import ATan as ATan
from .math import ATan2 as ATan2
from .math import Ceil as Ceil
from .math import Cos as Cos
from .math import Cot as Cot
from .math import Degrees as Degrees
from .math import Exp as Exp
from .math import Floor as Floor
from .math import Ln as Ln
from .math import Log as Log
from .math import Mod as Mod
from .math import Pi as Pi
from .math import Power as Power
from .math import Radians as Radians
from .math import Random as Random
from .math import Round as Round
from .math import Sign as Sign
from .math import Sin as Sin
from .math import Sqrt as Sqrt
from .math import Tan as Tan
from .text import MD5 as MD5
from .text import SHA1 as SHA1
from .text import SHA224 as SHA224
from .text import SHA256 as SHA256
from .text import SHA384 as SHA384
from .text import SHA512 as SHA512
from .text import Chr as Chr
from .text import Concat as Concat
from .text import ConcatPair as ConcatPair
from .text import Left as Left
from .text import Length as Length
from .text import Lower as Lower
from .text import LPad as LPad
from .text import LTrim as LTrim
from .text import Ord as Ord
from .text import Repeat as Repeat
from .text import Replace as Replace
from .text import Reverse as Reverse
from .text import Right as Right
from .text import RPad as RPad
from .text import RTrim as RTrim
from .text import StrIndex as StrIndex
from .text import Substr as Substr
from .text import Trim as Trim
from .text import Upper as Upper
from .uuid import UUID4 as UUID4
from .uuid import UUID7 as UUID7
from .window import CumeDist as CumeDist
from .window import DenseRank as DenseRank
from .window import FirstValue as FirstValue
from .window import Lag as Lag
from .window import LastValue as LastValue
from .window import Lead as Lead
from .window import NthValue as NthValue
from .window import Ntile as Ntile
from .window import PercentRank as PercentRank
from .window import Rank as Rank
from .window import RowNumber as RowNumber
__all__ = [
"MD5",
"SHA1",
"SHA224",
"SHA256",
"SHA384",
"SHA512",
"UUID4",
"UUID7",
"ACos",
"ASin",
"ATan",
"ATan2",
"Abs",
"Cast",
"Ceil",
"Chr",
"Coalesce",
"Collate",
"Concat",
"ConcatPair",
"Cos",
"Cot",
"CumeDist",
"Degrees",
"DenseRank",
"Exp",
"Extract",
"ExtractDay",
"ExtractHour",
"ExtractIsoWeekDay",
"ExtractIsoYear",
"ExtractMinute",
"ExtractMonth",
"ExtractQuarter",
"ExtractSecond",
"ExtractWeek",
"ExtractWeekDay",
"ExtractYear",
"FirstValue",
"Floor",
"Greatest",
"JSONArray",
"JSONObject",
"LPad",
"LTrim",
"Lag",
"LastValue",
"Lead",
"Least",
"Left",
"Length",
"Ln",
"Log",
"Lower",
"Mod",
"Now",
"NthValue",
"Ntile",
"NullIf",
"Ord",
"PercentRank",
"Pi",
"Power",
"RPad",
"RTrim",
"Radians",
"Random",
"Rank",
"Repeat",
"Replace",
"Reverse",
"Right",
"Round",
"RowNumber",
"Sign",
"Sin",
"Sqrt",
"StrIndex",
"Substr",
"Tan",
"Trim",
"Trunc",
"TruncDate",
"TruncDay",
"TruncHour",
"TruncMinute",
"TruncMonth",
"TruncQuarter",
"TruncSecond",
"TruncTime",
"TruncWeek",
"TruncYear",
"Upper",
]
typeddjango-django-stubs-fa03b48/django-stubs/db/models/functions/comparison.pyi 0000664 0000000 0000000 00000003241 15260643574 0030222 0 ustar 00root root 0000000 0000000 import re
from typing import Any
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models import Func
from django.db.models.expressions import Combinable
from django.db.models.fields import Field
from django.db.models.sql.compiler import SQLCompiler, _AsSqlType
from typing_extensions import override
class Cast(Func):
def __init__(self, expression: Combinable | str, output_field: str | Field[Any, Any]) -> None: ...
@override
def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... # type: ignore[override]
def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
def as_postgresql(
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any
) -> _AsSqlType: ...
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class Coalesce(Func):
@property
@override
def empty_result_set_value(self) -> Any: ...
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class Collate(Func):
collation_re: re.Pattern[str]
def __init__(self, expression: Combinable | str, collation: str) -> None: ...
@override
def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... # type: ignore[override]
class Greatest(Func): ...
class Least(Func): ...
class NullIf(Func):
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/models/functions/datetime.pyi 0000664 0000000 0000000 00000005443 15260643574 0027652 0 ustar 00root root 0000000 0000000 from datetime import tzinfo
from typing import Any, ClassVar
from django.db import models
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models import Func, Transform
from django.db.models.expressions import Combinable
from django.db.models.fields import Field
from django.db.models.sql.compiler import SQLCompiler, _AsSqlType
from typing_extensions import override
class TimezoneMixin:
tzinfo: Any
def get_tzname(self) -> str | None: ...
class Extract(TimezoneMixin, Transform):
lookup_name: str | None # type: ignore[assignment]
output_field: ClassVar[models.IntegerField[Any, Any]]
def __init__(
self, expression: Combinable | str, lookup_name: str | None = None, tzinfo: Any | None = None, **extra: Any
) -> None: ...
@override
def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... # type: ignore[override]
class ExtractYear(Extract): ...
class ExtractIsoYear(Extract): ...
class ExtractMonth(Extract): ...
class ExtractDay(Extract): ...
class ExtractWeek(Extract): ...
class ExtractWeekDay(Extract): ...
class ExtractIsoWeekDay(Extract): ...
class ExtractQuarter(Extract): ...
class ExtractHour(Extract): ...
class ExtractMinute(Extract): ...
class ExtractSecond(Extract): ...
class Now(Func):
output_field: ClassVar[models.DateTimeField[Any, Any]]
def as_postgresql(
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any
) -> _AsSqlType: ...
def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class TruncBase(TimezoneMixin, Transform):
kind: str | None
tzinfo: Any
def __init__(
self,
expression: Combinable | str,
output_field: Field[Any, Any] | None = None,
tzinfo: tzinfo | None = None,
**extra: Any,
) -> None: ...
@override
def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... # type: ignore[override]
class Trunc(TruncBase):
def __init__(
self,
expression: Combinable | str,
kind: str,
output_field: Field[Any, Any] | None = None,
tzinfo: tzinfo | None = None,
**extra: Any,
) -> None: ...
class TruncYear(TruncBase): ...
class TruncQuarter(TruncBase): ...
class TruncMonth(TruncBase): ...
class TruncWeek(TruncBase): ...
class TruncDay(TruncBase): ...
class TruncDate(TruncBase):
output_field: ClassVar[models.DateField[Any, Any]]
class TruncTime(TruncBase):
output_field: ClassVar[models.TimeField[Any, Any]]
class TruncHour(TruncBase): ...
class TruncMinute(TruncBase): ...
class TruncSecond(TruncBase): ...
typeddjango-django-stubs-fa03b48/django-stubs/db/models/functions/json.pyi 0000664 0000000 0000000 00000003300 15260643574 0027015 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from typing import Any, ClassVar
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models.expressions import Func
from django.db.models.fields.json import JSONField
from django.db.models.sql.compiler import SQLCompiler, _AsSqlType
from typing_extensions import override
class JSONArray(Func):
output_field: ClassVar[JSONField[Any, Any]]
@override
def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... # type: ignore [override]
def as_native(
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, *, returning: str, **extra_context: Any
) -> _AsSqlType: ...
def as_postgresql(
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any
) -> _AsSqlType: ...
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class JSONObject(Func):
output_field: ClassVar[JSONField[Any, Any]]
def __init__(self, **fields: Any) -> None: ...
@override
def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... # type: ignore [override]
def as_native(
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, *, returning: str, **extra_context: Any
) -> _AsSqlType: ...
def as_postgresql(
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any
) -> _AsSqlType: ...
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
def join(self, args: Sequence[Any]) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/models/functions/math.pyi 0000664 0000000 0000000 00000004521 15260643574 0027003 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models.expressions import Combinable, Func
from django.db.models.functions.mixins import FixDecimalInputMixin, NumericOutputFieldMixin
from django.db.models.lookups import Transform
from django.db.models.sql.compiler import SQLCompiler, _AsSqlType
class Abs(Transform): ...
class ACos(NumericOutputFieldMixin, Transform): ...
class ASin(NumericOutputFieldMixin, Transform): ...
class ATan(NumericOutputFieldMixin, Transform): ...
class ATan2(NumericOutputFieldMixin, Func): ...
class Ceil(Transform):
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class Cos(NumericOutputFieldMixin, Transform): ...
class Cot(NumericOutputFieldMixin, Transform):
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class Degrees(NumericOutputFieldMixin, Transform):
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class Exp(NumericOutputFieldMixin, Transform): ...
class Floor(Transform): ...
class Ln(NumericOutputFieldMixin, Transform): ...
class Log(FixDecimalInputMixin, NumericOutputFieldMixin, Func): ...
class Mod(FixDecimalInputMixin, NumericOutputFieldMixin, Func): ...
class Pi(NumericOutputFieldMixin, Func):
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class Power(NumericOutputFieldMixin, Func): ...
class Radians(NumericOutputFieldMixin, Transform):
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class Random(NumericOutputFieldMixin, Func):
def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class Round(FixDecimalInputMixin, Transform):
def __init__(self, expression: Combinable | str, precision: int = 0, **extra: Any) -> None: ...
class Sin(NumericOutputFieldMixin, Transform): ...
class Sqrt(NumericOutputFieldMixin, Transform): ...
class Tan(NumericOutputFieldMixin, Transform): ...
class Sign(Transform): ...
typeddjango-django-stubs-fa03b48/django-stubs/db/models/functions/mixins.pyi 0000664 0000000 0000000 00000001162 15260643574 0027357 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models.sql.compiler import SQLCompiler, _AsSqlType
class FixDecimalInputMixin:
def as_postgresql(
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any
) -> _AsSqlType: ...
class FixDurationInputMixin:
def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class NumericOutputFieldMixin: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/models/functions/text.pyi 0000664 0000000 0000000 00000011335 15260643574 0027037 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar
from django.db import models
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models import Func, Transform
from django.db.models.expressions import Combinable, Expression, Value, _OutputField
from django.db.models.sql.compiler import SQLCompiler, _AsSqlType
from typing_extensions import override
class MySQLSHA2Mixin:
def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class OracleHashMixin:
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class PostgreSQLSHAMixin:
def as_postgresql(
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any
) -> _AsSqlType: ...
class Chr(Transform):
def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class ConcatPair(Func):
def pipes_concat_sql(
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any
) -> _AsSqlType: ...
as_sqlite = pipes_concat_sql
def as_postgresql(
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any
) -> _AsSqlType: ...
def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
def coalesce(self) -> ConcatPair: ...
class Concat(Func):
def __init__(self, *expressions: Any, **extra: Any) -> None: ...
class Left(Func[_OutputField]):
output_field: ClassVar[models.CharField[Any, Any]]
def __init__(
self,
expression: Combinable | str,
length: Expression | int,
*,
output_field: _OutputField | None = None,
**extra: Any,
) -> None: ...
def get_substr(self) -> Substr: ...
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class Length(Transform):
output_field: ClassVar[models.IntegerField[Any, Any]]
def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class Lower(Transform): ...
class LPad(Func):
output_field: ClassVar[models.CharField[Any, Any]]
def __init__(
self, expression: Combinable | str, length: Expression | int | None, fill_text: Expression = ..., **extra: Any
) -> None: ...
class LTrim(Transform): ...
class MD5(OracleHashMixin, Transform): ...
class Ord(Transform):
output_field: ClassVar[models.IntegerField[Any, Any]]
def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class Repeat(Func):
output_field: ClassVar[models.CharField[Any, Any]]
def __init__(self, expression: Combinable | str, number: Expression | int | None, **extra: Any) -> None: ...
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class Replace(Func):
def __init__(self, expression: Combinable | str, text: Value, replacement: Value = ..., **extra: Any) -> None: ...
class Reverse(Transform):
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class Right(Left[_OutputField]):
@override
def get_substr(self) -> Substr: ...
class RPad(LPad): ...
class RTrim(Transform): ...
class SHA1(OracleHashMixin, PostgreSQLSHAMixin, Transform): ...
class SHA224(MySQLSHA2Mixin, PostgreSQLSHAMixin, Transform):
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class SHA256(MySQLSHA2Mixin, OracleHashMixin, PostgreSQLSHAMixin, Transform): ...
class SHA384(MySQLSHA2Mixin, OracleHashMixin, PostgreSQLSHAMixin, Transform): ...
class SHA512(MySQLSHA2Mixin, OracleHashMixin, PostgreSQLSHAMixin, Transform): ...
class StrIndex(Func):
output_field: ClassVar[models.IntegerField[Any, Any]]
def as_postgresql(
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any
) -> _AsSqlType: ...
class Substr(Func[_OutputField]):
output_field: ClassVar[models.CharField[Any, Any]]
def __init__(
self,
expression: Combinable | str,
pos: Expression | int,
length: Expression | int | None = None,
*,
output_field: _OutputField | None = None,
**extra: Any,
) -> None: ...
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class Trim(Transform): ...
class Upper(Transform): ...
typeddjango-django-stubs-fa03b48/django-stubs/db/models/functions/uuid.pyi 0000664 0000000 0000000 00000003126 15260643574 0027020 0 ustar 00root root 0000000 0000000 import datetime as dt
from typing import Any, ClassVar
from django.db import models
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models.expressions import Func
from django.db.models.sql.compiler import SQLCompiler, _AsSqlType
from typing_extensions import override
class UUID4(Func):
output_field: ClassVar[models.UUIDField[Any, Any]]
@override
def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... # type: ignore[override]
def as_postgresql(
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any
) -> _AsSqlType: ...
def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class UUID7(Func):
output_field: ClassVar[models.UUIDField[Any, Any]]
def __init__(self, shift: dt.timedelta | None = None, **extra: Any) -> None: ...
@override
def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... # type: ignore[override]
def as_postgresql(
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any
) -> _AsSqlType: ...
@override
def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/models/functions/window.pyi 0000664 0000000 0000000 00000002333 15260643574 0027360 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar
from django.db import models
from django.db.models.expressions import Combinable, Func
class CumeDist(Func):
output_field: ClassVar[models.FloatField[Any, Any]]
class DenseRank(Func):
output_field: ClassVar[models.IntegerField[Any, Any]]
class FirstValue(Func): ...
class LagLeadFunction(Func):
def __init__(self, expression: Combinable | str, offset: int = 1, default: Any = None, **extra: Any) -> None: ...
class Lag(LagLeadFunction): ...
class LastValue(Func): ...
class Lead(LagLeadFunction): ...
class NthValue(Func):
def __init__(self, expression: Combinable | str, nth: int = 1, **extra: Any) -> None: ...
class Ntile(Func):
def __init__(self, num_buckets: int = 1, **extra: Any) -> None: ...
output_field: ClassVar[models.IntegerField[Any, Any]]
class PercentRank(Func):
output_field: ClassVar[models.FloatField[Any, Any]]
class Rank(Func):
output_field: ClassVar[models.IntegerField[Any, Any]]
class RowNumber(Func):
output_field: ClassVar[models.IntegerField[Any, Any]]
__all__ = [
"CumeDist",
"DenseRank",
"FirstValue",
"Lag",
"LastValue",
"Lead",
"NthValue",
"Ntile",
"PercentRank",
"Rank",
"RowNumber",
]
typeddjango-django-stubs-fa03b48/django-stubs/db/models/indexes.pyi 0000664 0000000 0000000 00000004702 15260643574 0025502 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from typing import Any
from django.core.checks import CheckMessage
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.backends.base.schema import BaseDatabaseSchemaEditor
from django.db.backends.ddl_references import Statement
from django.db.models.base import Model
from django.db.models.expressions import BaseExpression, Combinable, Expression, Func
from django.db.models.query_utils import Q
from django.db.models.sql.compiler import SQLCompiler, _AsSqlType
from typing_extensions import override
class Index:
suffix: str
max_name_length: int
fields: Sequence[str]
fields_orders: Sequence[tuple[str, str]]
name: str
db_tablespace: str | None
opclasses: Sequence[str]
condition: Q | None
expressions: Sequence[BaseExpression | Combinable]
include: Sequence[str]
def __init__(
self,
*expressions: BaseExpression | Combinable | str,
fields: Sequence[str] = (),
name: str | None = None,
db_tablespace: str | None = None,
opclasses: Sequence[str] = (),
condition: Q | None = None,
include: Sequence[str] | None = None,
) -> None: ...
@property
def contains_expressions(self) -> bool: ...
def check(self, model: type[Model], connection: BaseDatabaseWrapper) -> list[CheckMessage]: ...
def create_sql(
self, model: type[Model], schema_editor: BaseDatabaseSchemaEditor, using: str = "", **kwargs: Any
) -> Statement: ...
def remove_sql(self, model: type[Model], schema_editor: BaseDatabaseSchemaEditor, **kwargs: Any) -> str: ...
def deconstruct(self) -> tuple[str, Sequence[Any], dict[str, Any]]: ...
def clone(self) -> Index: ...
def set_name_with_model(self, model: type[Model]) -> None: ...
class IndexExpression(Func):
template: str
wrapper_classes: tuple[type[Expression], ...]
def set_wrapper_classes(self, connection: Any | None = None) -> None: ...
@classmethod
def register_wrappers(cls, *wrapper_classes: type[Expression]) -> None: ...
@override
def resolve_expression(
self,
query: Any | None = None,
allow_joins: bool = True,
reuse: set[str] | None = None,
summarize: bool = False,
for_save: bool = False,
) -> IndexExpression: ...
@override
def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
__all__ = ["Index"]
typeddjango-django-stubs-fa03b48/django-stubs/db/models/lookups.pyi 0000664 0000000 0000000 00000015560 15260643574 0025543 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable, Sequence
from typing import Any, Generic, Literal
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models.expressions import Combinable, Expression, Func
from django.db.models.fields import BooleanField
from django.db.models.query_utils import RegisterLookupMixin
from django.db.models.sql.compiler import SQLCompiler, _AsSqlType, _ParamT
from django.utils.datastructures import OrderedSet
from django.utils.functional import cached_property
from typing_extensions import TypeVar, override
_T = TypeVar("_T", default=Any)
class Lookup(Expression, Generic[_T]):
lookup_name: str | None
prepare_rhs: bool
can_use_none_as_rhs: bool
lhs: Any
rhs: Any
bilateral_transforms: list[type[Transform]]
def __init__(self, lhs: Any, rhs: Any) -> None: ...
def apply_bilateral_transforms(self, value: Expression) -> Expression: ...
def batch_process_rhs(
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, rhs: OrderedSet[Any] | None = None
) -> tuple[list[str], list[str]]: ...
@override
def get_source_expressions(self) -> list[Expression]: ...
@override
def set_source_expressions(self, new_exprs: Sequence[Combinable | Expression]) -> None: ...
def get_prep_lookup(self) -> Any: ...
def get_prep_lhs(self) -> Any: ...
def get_db_prep_lookup(self, value: _ParamT, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
def process_lhs(
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, lhs: Expression | None = None
) -> _AsSqlType: ...
def process_rhs(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
def rhs_is_direct_value(self) -> bool: ...
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
@cached_property
@override
def output_field(self) -> BooleanField[Any, Any]: ...
@property
@override
def identity(self) -> tuple[type[Lookup], Any, Any]: ...
@cached_property
@override
def allowed_default(self) -> bool: ... # type: ignore[override]
class Transform(RegisterLookupMixin, Func):
bilateral: bool
@property
def lhs(self) -> Expression: ...
def get_bilateral_transforms(self) -> list[type[Transform]]: ...
class BuiltinLookup(Lookup[_T]):
@override
def process_lhs(
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, lhs: Expression | None = None
) -> _AsSqlType: ...
def get_rhs_op(self, connection: BaseDatabaseWrapper, rhs: str) -> str: ...
class FieldGetDbPrepValueMixin:
get_db_prep_lookup_value_is_iterable: bool
def get_db_prep_lookup(self, value: _ParamT, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
class FieldGetDbPrepValueIterableMixin(FieldGetDbPrepValueMixin):
get_db_prep_lookup_value_is_iterable: Literal[True]
def get_prep_lookup(self) -> Iterable[Any]: ...
def process_rhs(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
def resolve_expression_parameter(
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, sql: str, param: Any
) -> _AsSqlType: ...
def batch_process_rhs(
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, rhs: OrderedSet[Any] | None = None
) -> tuple[list[str], list[str]]: ...
class PostgresOperatorLookup(Lookup[_T]):
postgres_operator: str | None
def as_postgresql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
class Exact(FieldGetDbPrepValueMixin, BuiltinLookup[_T]): ...
class IExact(BuiltinLookup[_T]):
@override
def process_rhs(self, qn: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
class GreaterThan(FieldGetDbPrepValueMixin, BuiltinLookup[_T]): ...
class GreaterThanOrEqual(FieldGetDbPrepValueMixin, BuiltinLookup[_T]): ...
class LessThan(FieldGetDbPrepValueMixin, BuiltinLookup[_T]): ...
class LessThanOrEqual(FieldGetDbPrepValueMixin, BuiltinLookup[_T]): ...
class IntegerFieldOverflow:
underflow_exception: type[Exception]
overflow_exception: type[Exception]
def process_rhs(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
class IntegerFieldFloatRounding:
rhs: Any
def get_prep_lookup(self) -> Any: ...
class IntegerFieldExact(IntegerFieldOverflow, Exact[int | float]): ...
class IntegerGreaterThan(IntegerFieldOverflow, GreaterThan[int | float]): ...
class IntegerGreaterThanOrEqual(IntegerFieldOverflow, IntegerFieldFloatRounding, GreaterThanOrEqual[int | float]): ...
class IntegerLessThan(IntegerFieldOverflow, IntegerFieldFloatRounding, LessThan[int | float]): ...
class IntegerLessThanOrEqual(IntegerFieldOverflow, LessThanOrEqual[int | float]): ...
class In(FieldGetDbPrepValueIterableMixin, BuiltinLookup[Iterable[_T]]):
def split_parameter_list_as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> Any: ...
class PatternLookup(BuiltinLookup[str]):
param_pattern: str
@override
def process_rhs(self, qn: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
@property
def is_simple_lookup(self) -> bool: ...
class Contains(PatternLookup): ...
class IContains(Contains): ...
class StartsWith(PatternLookup): ...
class IStartsWith(StartsWith): ...
class EndsWith(PatternLookup): ...
class IEndsWith(EndsWith): ...
class Range(FieldGetDbPrepValueIterableMixin, BuiltinLookup[_T]): ...
class IsNull(BuiltinLookup[bool]): ...
class Regex(BuiltinLookup[str]): ...
class IRegex(Regex): ...
class YearLookup(Lookup):
def year_lookup_bounds(self, connection: BaseDatabaseWrapper, year: int) -> list[str]: ...
def get_direct_rhs_sql(self, connection: BaseDatabaseWrapper, rhs: str) -> str: ...
def get_bound_params(self, start: Any, finish: Any) -> Any: ...
class YearExact(YearLookup, Exact[_T]):
@override
def get_bound_params(self, start: Any, finish: Any) -> tuple[Any, Any]: ...
class YearGt(YearLookup, GreaterThan[_T]):
@override
def get_bound_params(self, start: Any, finish: Any) -> tuple[Any]: ...
class YearGte(YearLookup, GreaterThanOrEqual[_T]):
@override
def get_bound_params(self, start: Any, finish: Any) -> tuple[Any]: ...
class YearLt(YearLookup, LessThan[_T]):
@override
def get_bound_params(self, start: Any, finish: Any) -> tuple[Any]: ...
class YearLte(YearLookup, LessThanOrEqual[_T]):
@override
def get_bound_params(self, start: Any, finish: Any) -> tuple[Any]: ...
class UUIDTextMixin:
rhs: Any
def process_rhs(self, qn: Any, connection: BaseDatabaseWrapper) -> Any: ...
class UUIDIExact(UUIDTextMixin, IExact[_T]): ...
class UUIDContains(UUIDTextMixin, Contains): ...
class UUIDIContains(UUIDTextMixin, IContains): ...
class UUIDStartsWith(UUIDTextMixin, StartsWith): ...
class UUIDIStartsWith(UUIDTextMixin, IStartsWith): ...
class UUIDEndsWith(UUIDTextMixin, EndsWith): ...
class UUIDIEndsWith(UUIDTextMixin, IEndsWith): ...
typeddjango-django-stubs-fa03b48/django-stubs/db/models/manager.pyi 0000664 0000000 0000000 00000022162 15260643574 0025455 0 ustar 00root root 0000000 0000000 import datetime
from collections.abc import AsyncIterator, Collection, Iterable, Iterator, Mapping, Sequence
from typing import Any, Generic, Literal, NoReturn, Self, overload
from django.core.checks.messages import CheckMessage
from django.db.models.base import Model
from django.db.models.expressions import Combinable, OrderBy
from django.db.models.options import Options
from django.db.models.query import Prefetch, QuerySet, RawQuerySet, _LookupT, _PrefetchedQuerySetT, _ToAttrT
from typing_extensions import TypeVar, override
_T = TypeVar("_T", bound=Model, covariant=True)
class BaseManager(Generic[_T]):
creation_counter: int
auto_created: bool
use_in_migrations: bool
name: str
model: type[_T]
_db: str | None
def __new__(cls, *args: Any, **kwargs: Any) -> Self: ...
def __init__(self) -> None: ...
def __class_getitem__(cls, *args: Any, **kwargs: Any) -> type[Self]: ...
def deconstruct(
self,
) -> tuple[bool, str | None, str | None, Sequence[Any] | None, dict[str, Any] | None]: ...
def check(self, **kwargs: Any) -> list[CheckMessage]: ...
@classmethod
def from_queryset(cls, queryset_class: type[QuerySet[_T]], class_name: str | None = None) -> type[Self]: ...
@classmethod
def _get_queryset_methods(cls, queryset_class: type) -> dict[str, Any]: ...
def contribute_to_class(self, cls: type[Model], name: str) -> None: ...
def db_manager(self, using: str | None = None, hints: dict[str, Model] | None = None) -> Self: ...
@property
def db(self) -> str: ...
def get_queryset(self) -> QuerySet[_T]: ...
def all(self) -> QuerySet[_T]: ...
# At runtime, managers declared on a model are wrapped in a `ManagerDescriptor` which raises on instance access.
# Accepting only `instance=None` makes `instance.objects` a type error.
# `Options` is accepted to work around https://github.com/python/mypy/issues/13608
# mypy re-applies `__get__` to the return type of `Options.base_manager`, passing the `Options` object as `instance`.
def __get__(self, instance: Options[Any] | None, cls: type[Any] | None = None) -> Self: ...
class Manager(BaseManager[_T]):
# NOTE: The following methods are in common with QuerySet, but note that the use of QuerySet as a return type
# rather than a self-type (_QS), since Manager's QuerySet-like methods return QuerySets and not Managers.
def iterator(self, chunk_size: int | None = ...) -> Iterator[_T]: ...
def aiterator(self, chunk_size: int = ...) -> AsyncIterator[_T]: ...
def aggregate(self, *args: Any, **kwargs: Any) -> dict[str, Any]: ...
async def aaggregate(self, *args: Any, **kwargs: Any) -> dict[str, Any]: ...
def get(self, *args: Any, **kwargs: Any) -> _T: ...
async def aget(self, *args: Any, **kwargs: Any) -> _T: ...
def create(self, **kwargs: Any) -> _T: ...
async def acreate(self, **kwargs: Any) -> _T: ...
def bulk_create(
self,
objs: Iterable[_T],
batch_size: int | None = ...,
ignore_conflicts: bool = ...,
update_conflicts: bool = ...,
update_fields: Collection[str] | None = ...,
unique_fields: Collection[str] | None = ...,
) -> list[_T]: ...
async def abulk_create(
self,
objs: Iterable[_T],
batch_size: int | None = ...,
ignore_conflicts: bool = ...,
update_conflicts: bool = ...,
update_fields: Collection[str] | None = ...,
unique_fields: Collection[str] | None = ...,
) -> list[_T]: ...
def bulk_update(self, objs: Iterable[_T], fields: Iterable[str], batch_size: int | None = ...) -> int: ...
async def abulk_update(self, objs: Iterable[_T], fields: Iterable[str], batch_size: int | None = ...) -> int: ...
def get_or_create(self, defaults: Mapping[str, Any] | None = ..., **kwargs: Any) -> tuple[_T, bool]: ...
async def aget_or_create(self, defaults: Mapping[str, Any] | None = ..., **kwargs: Any) -> tuple[_T, bool]: ...
def update_or_create(
self,
defaults: Mapping[str, Any] | None = ...,
create_defaults: Mapping[str, Any] | None = ...,
**kwargs: Any,
) -> tuple[_T, bool]: ...
async def aupdate_or_create(
self,
defaults: Mapping[str, Any] | None = ...,
create_defaults: Mapping[str, Any] | None = ...,
**kwargs: Any,
) -> tuple[_T, bool]: ...
def earliest(self, *fields: str | OrderBy) -> _T: ...
async def aearliest(self, *fields: str | OrderBy) -> _T: ...
def latest(self, *fields: str | OrderBy) -> _T: ...
async def alatest(self, *fields: str | OrderBy) -> _T: ...
def first(self) -> _T | None: ...
async def afirst(self) -> _T | None: ...
def last(self) -> _T | None: ...
async def alast(self) -> _T | None: ...
def in_bulk(self, id_list: Iterable[Any] | None = ..., *, field_name: str = ...) -> dict[Any, _T]: ...
async def ain_bulk(self, id_list: Iterable[Any] | None = ..., *, field_name: str = ...) -> dict[Any, _T]: ...
def update(self, **kwargs: Any) -> int: ...
async def aupdate(self, **kwargs: Any) -> int: ...
def exists(self) -> bool: ...
async def aexists(self) -> bool: ...
def explain(self, *, format: str | None = ..., **options: Any) -> str: ...
async def aexplain(self, *, format: str | None = ..., **options: Any) -> str: ...
def contains(self, obj: Model) -> bool: ...
async def acontains(self, obj: Model) -> bool: ...
def raw(
self,
raw_query: str,
params: Any = ...,
translations: dict[str, str] | None = ...,
using: str | None = ...,
) -> RawQuerySet[_T]: ...
# The type of values may be overridden to be more specific in the mypy plugin, depending on the fields param
def values(self, *fields: str | Combinable, **expressions: Any) -> QuerySet[_T, dict[str, Any]]: ...
# The type of values_list may be overridden to be more specific in the mypy plugin, depending on the fields param
def values_list(self, *fields: str | Combinable, flat: bool = ..., named: bool = ...) -> QuerySet[_T, Any]: ...
def dates(
self,
field_name: str,
kind: Literal["year", "month", "week", "day"],
order: Literal["ASC", "DESC"] = "ASC",
) -> QuerySet[_T, datetime.date]: ...
def datetimes(
self,
field_name: str,
kind: Literal["year", "month", "week", "day", "hour", "minute", "second"],
order: Literal["ASC", "DESC"] = "ASC",
tzinfo: datetime.tzinfo | None = None,
) -> QuerySet[_T, datetime.datetime]: ...
def none(self) -> QuerySet[_T]: ...
def filter(self, *args: Any, **kwargs: Any) -> QuerySet[_T]: ...
def exclude(self, *args: Any, **kwargs: Any) -> QuerySet[_T]: ...
def complex_filter(self, filter_obj: Any) -> QuerySet[_T]: ...
def count(self) -> int: ...
async def acount(self) -> int: ...
def union(self, *other_qs: QuerySet[Model, Any], all: bool = ...) -> QuerySet[_T]: ...
def intersection(self, *other_qs: QuerySet[Model, Any]) -> QuerySet[_T]: ...
def difference(self, *other_qs: QuerySet[Model, Any]) -> QuerySet[_T]: ...
def select_for_update(
self, nowait: bool = ..., skip_locked: bool = ..., of: Sequence[str] = ..., no_key: bool = ...
) -> QuerySet[_T]: ...
@overload
def select_related(self, clear: None, /) -> QuerySet[_T]: ...
@overload
def select_related(self, *fields: str) -> QuerySet[_T]: ...
@overload
def prefetch_related(self, clear: None, /) -> QuerySet[_T]: ...
@overload
def prefetch_related(self, *lookups: str | Prefetch[_LookupT, _PrefetchedQuerySetT, _ToAttrT]) -> QuerySet[_T]: ...
def annotate(self, *args: Any, **kwargs: Any) -> QuerySet[_T]: ...
def alias(self, *args: Any, **kwargs: Any) -> QuerySet[_T]: ...
def order_by(self, *field_names: str | Combinable) -> QuerySet[_T]: ...
def distinct(self, *field_names: str) -> QuerySet[_T]: ...
# extra() return type won't be supported any time soon
def extra(
self,
select: dict[str, Any] | None = ...,
where: list[str] | None = ...,
params: list[Any] | None = ...,
tables: list[str] | None = ...,
order_by: Sequence[str] | None = ...,
select_params: Sequence[Any] | None = ...,
) -> QuerySet[Any]: ...
def reverse(self) -> QuerySet[_T]: ...
@overload
def defer(self, clear: None, /) -> QuerySet[_T]: ...
@overload
def defer(self, *fields: str) -> QuerySet[_T]: ...
def only(self, *fields: str) -> QuerySet[_T]: ...
def using(self, alias: str | None) -> QuerySet[_T]: ...
class ManagerDescriptor:
manager: BaseManager[Any]
def __init__(self, manager: BaseManager[Any]) -> None: ...
@overload
def __get__(self, instance: None, cls: type[Model] | None = None) -> BaseManager[Any]: ...
@overload
def __get__(self, instance: Model, cls: type[Model] | None = None) -> NoReturn: ...
class EmptyManager(Manager[_T]):
def __init__(self, model: type[_T]) -> None: ...
# Unlike other managers, `EmptyManager` is exposed through properties of plain classes (e.g. `AnonymousUser.groups`)
# where instance access is legitimate.
@override
def __get__(self, instance: object, cls: type[Any] | None = None) -> Self: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/models/options.pyi 0000664 0000000 0000000 00000013657 15260643574 0025547 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable, Sequence
from typing import Any, Generic, TypeAlias, overload
from django.apps.config import AppConfig
from django.apps.registry import Apps
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models.base import Model
from django.db.models.constraints import BaseConstraint, UniqueConstraint
from django.db.models.fields import AutoField, Field
from django.db.models.fields.related import ManyToManyField, OneToOneField
from django.db.models.fields.reverse_related import ForeignObjectRel
from django.db.models.manager import Manager
from django.db.models.query import _OrderByFieldName
from django.db.models.query_utils import PathInfo
from django.utils.datastructures import ImmutableList, _ListOrTuple
from django.utils.functional import _StrOrPromise, cached_property
from typing_extensions import TypeVar
PROXY_PARENTS: object
EMPTY_RELATION_TREE: Any
IMMUTABLE_WARNING: str
DEFAULT_NAMES: tuple[str, ...]
_OptionTogetherT: TypeAlias = _ListOrTuple[_ListOrTuple[str] | str] | set[tuple[str, ...]] # noqa: PYI047
_AnyField: TypeAlias = Field[Any, Any] | ForeignObjectRel
@overload
def normalize_together(option_together: _ListOrTuple[_ListOrTuple[str] | str]) -> tuple[tuple[str, ...], ...]: ...
# Any other value will be returned unchanged, but probably only set is semantically allowed
@overload
def normalize_together(option_together: set[tuple[str, ...]]) -> set[tuple[str, ...]]: ...
_T = TypeVar("_T")
def make_immutable_fields_list(name: str, data: Iterable[_T]) -> ImmutableList[_T]: ...
_M = TypeVar("_M", bound=Model)
class Options(Generic[_M]):
constraints: _ListOrTuple[BaseConstraint]
FORWARD_PROPERTIES: set[str]
REVERSE_PROPERTIES: set[str]
default_apps: Any
local_fields: list[Field[Any, Any]]
local_many_to_many: list[ManyToManyField[Any, Any]]
private_fields: list[Any]
local_managers: list[Manager[_M]]
base_manager_name: str | None
default_manager_name: str | None
model_name: str | None
verbose_name: _StrOrPromise | None
verbose_name_plural: _StrOrPromise | None
db_table: str
db_table_comment: str
ordering: Sequence[_OrderByFieldName] | None
indexes: _ListOrTuple[Any]
unique_together: Sequence[tuple[str, ...]] # Are always normalized
select_on_save: bool
default_permissions: Sequence[str]
permissions: _ListOrTuple[Any]
object_name: str | None
app_label: str
get_latest_by: Sequence[str] | None
order_with_respect_to: str | None
db_tablespace: str
required_db_features: _ListOrTuple[str]
required_db_vendor: str | None
meta: type | None
pk: Field[Any, Any]
auto_field: AutoField[Any, Any] | None
abstract: bool
managed: bool
proxy: bool
proxy_for_model: type[Model] | None
concrete_model: type[Model] | None
swappable: str | None
parents: dict[type[Model], Field[Any, Any] | None]
auto_created: bool
related_fkey_lookups: list[Any]
apps: Apps
default_related_name: str | None
model: type[Model]
original_attrs: dict[str, Any]
def __init__(self, meta: type | None, app_label: str | None = None) -> None: ...
@property
def label(self) -> str: ...
@property
def label_lower(self) -> str: ...
@property
def app_config(self) -> AppConfig: ...
def contribute_to_class(self, cls: type[Model], name: str) -> None: ...
def add_manager(self, manager: Manager[_M]) -> None: ...
def add_field(self, field: Field[Any, Any], private: bool = False) -> None: ...
# if GenericForeignKey is passed as argument, it has primary_key = True set before
def setup_pk(self, field: Field[Any, Any]) -> None: ...
def setup_proxy(self, target: type[Model]) -> None: ...
def can_migrate(self, connection: BaseDatabaseWrapper | str) -> bool: ...
@cached_property
def verbose_name_raw(self) -> str: ...
@cached_property
def swapped(self) -> str | None: ...
def setting_changed(self, *, setting: str, **kwargs: Any) -> None: ...
@cached_property
def managers(self) -> ImmutableList[Manager[_M]]: ...
@cached_property
def managers_map(self) -> dict[str, Manager[_M]]: ...
@cached_property
def base_manager(self) -> Manager[_M]: ...
@cached_property
def default_manager(self) -> Manager[_M] | None: ...
@cached_property
def fields(self) -> ImmutableList[Field[Any, Any]]: ...
@cached_property
def concrete_fields(self) -> ImmutableList[Field[Any, Any]]: ...
@cached_property
def local_concrete_fields(self) -> ImmutableList[Field[Any, Any]]: ...
@cached_property
def many_to_many(self) -> ImmutableList[ManyToManyField[Any, Any]]: ...
@cached_property
def related_objects(self) -> ImmutableList[ForeignObjectRel]: ...
@cached_property
def fields_map(self) -> dict[str, _AnyField]: ...
def get_field(self, field_name: str) -> _AnyField: ...
def get_base_chain(self, model: type[Model]) -> list[type[Model]]: ...
@cached_property
def all_parents(self) -> tuple[type[Model]]: ...
def get_parent_list(self) -> list[type[Model]]: ...
def get_ancestor_link(self, ancestor: type[Model]) -> OneToOneField[Any, Any] | None: ...
def get_path_to_parent(self, parent: type[Model]) -> list[PathInfo]: ...
def get_path_from_parent(self, parent: type[Model]) -> list[PathInfo]: ...
def get_fields(self, include_parents: bool = True, include_hidden: bool = False) -> list[_AnyField]: ...
def _get_fields(
self,
forward: bool = True,
reverse: bool = True,
include_parents: bool | object = True,
include_hidden: bool = False,
topmost_call: bool = True,
) -> list[_AnyField]: ...
@cached_property
def total_unique_constraints(self) -> list[UniqueConstraint]: ...
@cached_property
def pk_fields(self) -> list[Field[Any, Any]]: ...
@property
def is_composite_pk(self) -> bool: ...
@cached_property
def db_returning_fields(self) -> list[Field[Any, Any]]: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/models/query.pyi 0000664 0000000 0000000 00000035566 15260643574 0025224 0 ustar 00root root 0000000 0000000 import datetime
from collections.abc import AsyncIterator, Collection, Iterable, Iterator, Mapping, Sequence, Sized
from types import TracebackType
from typing import Any, Generic, Literal, NamedTuple, Self, TypeAlias, overload, type_check_only
from django.db.backends.utils import _ExecuteQuery
from django.db.models import Manager
from django.db.models.base import Model
from django.db.models.expressions import Combinable, OrderBy
from django.db.models.fetch_modes import FetchMode
from django.db.models.sql.query import Query, RawQuery
from django.db.models.utils import AltersData
from django.utils.functional import cached_property
from typing_extensions import TypeVar, override
_T = TypeVar("_T", covariant=True)
_ContainsT = TypeVar("_ContainsT")
_Model = TypeVar("_Model", bound=Model, covariant=True)
_Row = TypeVar("_Row", covariant=True, default=_Model) # ONLY use together with _Model
_TupleT = TypeVar("_TupleT", bound=tuple[Any, ...], covariant=True)
# The type of the lookup passed to Prefetch(...)
# This will be specialized to a `LiteralString` in the plugin for further processing and validation
_LookupT = TypeVar("_LookupT", bound=str, covariant=True)
# The type of the queryset passed to Prefetch(...)
_PrefetchedQuerySetT = TypeVar("_PrefetchedQuerySetT", bound=QuerySet[Model], covariant=True, default=QuerySet[Model])
# The attribute name to store the prefetched list[_PrefetchedQuerySetT]
# This will be specialized to a `LiteralString` in the plugin for further processing and validation
_ToAttrT = TypeVar("_ToAttrT", bound=str, covariant=True, default=str)
_OrderByFieldName: TypeAlias = str | Combinable
MAX_GET_RESULTS: int
REPR_OUTPUT_SIZE: int
DEFAULT_FETCH_MODE: FetchMode
PROHIBITED_FILTER_KWARGS: frozenset[str]
class BaseIterable(Generic[_T]):
queryset: QuerySet[Model]
chunked_fetch: bool
chunk_size: int
def __init__(self, queryset: QuerySet[Model], chunked_fetch: bool = False, chunk_size: int = 100) -> None: ...
def __aiter__(self) -> AsyncIterator[_T]: ...
class ModelIterable(BaseIterable[_Model], Generic[_Model]):
def __iter__(self) -> Iterator[_Model]: ...
class RawModelIterable(BaseIterable[dict[str, Any]]):
def __iter__(self) -> Iterator[dict[str, Any]]: ...
class ValuesIterable(BaseIterable[dict[str, Any]]):
def __iter__(self) -> Iterator[dict[str, Any]]: ...
class ValuesListIterable(BaseIterable[_TupleT]):
def __iter__(self) -> Iterator[_TupleT]: ...
class NamedValuesListIterable(ValuesListIterable[NamedTuple]):
@override
def __iter__(self) -> Iterator[NamedTuple]: ...
class FlatValuesListIterable(BaseIterable[_T]):
def __iter__(self) -> Iterator[_T]: ...
@type_check_only
class _SupportsContains(Generic[_ContainsT]):
def __contains__(self, item: _ContainsT, /) -> bool: ...
class PreventQuerySetCloning:
queryset: QuerySet[Any]
def __init__(self, queryset: QuerySet[Any]) -> None: ...
def __enter__(self) -> QuerySet[Any]: ...
def __exit__(
self,
exc_type: type[BaseException] | None,
exc_value: BaseException | None,
traceback: TracebackType | None,
) -> None: ...
# Using `object` (not `_Row | None`) to satisfy Collection protocol and support `User | AnonymousUser` patterns
class QuerySet(AltersData, _SupportsContains[object], Iterable[_Row], Sized, Generic[_Model, _Row]):
model: type[_Model]
query: Query
_iterable_class: type[BaseIterable[Any]]
_result_cache: list[_Row] | None
def __init__(
self,
model: type[Model] | None = None,
query: Query | None = None,
using: str | None = None,
hints: dict[str, Model] | None = None,
) -> None: ...
@classmethod
def as_manager(cls) -> Manager[_Model]: ...
def __deepcopy__(self, memo: dict[int, Any]) -> Self: ...
@override
def __getstate__(self) -> dict[str, Any]: ...
@override
def __len__(self) -> int: ...
@override
def __iter__(self) -> Iterator[_Row]: ...
def __aiter__(self) -> AsyncIterator[_Row]: ...
def __bool__(self) -> bool: ...
@overload
def __getitem__(self, i: int) -> _Row: ...
@overload
def __getitem__(self, s: slice) -> Self: ...
def __class_getitem__(cls, item: type[_Model]) -> Self: ...
# Technically, the other QuerySet must be of the same type _T, but _T is covariant
def __and__(self, other: QuerySet[_Model, _Row]) -> Self: ...
def __or__(self, other: QuerySet[_Model, _Row]) -> Self: ...
def __xor__(self, other: QuerySet[_Model, _Row]) -> Self: ...
# IMPORTANT: When updating any of the following methods' signatures, please ALSO modify
# the corresponding method in BaseManager.
def iterator(self, chunk_size: int | None = None) -> Iterator[_Row]: ...
def aiterator(self, chunk_size: int = 2000) -> AsyncIterator[_Row]: ...
def aggregate(self, *args: Any, **kwargs: Any) -> dict[str, Any]: ...
async def aaggregate(self, *args: Any, **kwargs: Any) -> dict[str, Any]: ...
def count(self) -> int: ...
async def acount(self) -> int: ...
def get(self, *args: Any, **kwargs: Any) -> _Row: ...
async def aget(self, *args: Any, **kwargs: Any) -> _Row: ...
def create(self, **kwargs: Any) -> _Model: ...
async def acreate(self, **kwargs: Any) -> _Model: ...
def bulk_create(
self,
objs: Iterable[_Model],
batch_size: int | None = None,
ignore_conflicts: bool = False,
update_conflicts: bool = False,
update_fields: Collection[str] | None = None,
unique_fields: Collection[str] | None = None,
) -> list[_Model]: ...
async def abulk_create(
self,
objs: Iterable[_Model],
batch_size: int | None = None,
ignore_conflicts: bool = False,
update_conflicts: bool = False,
update_fields: Collection[str] | None = None,
unique_fields: Collection[str] | None = None,
) -> list[_Model]: ...
def bulk_update(self, objs: Iterable[_Model], fields: Iterable[str], batch_size: int | None = None) -> int: ...
async def abulk_update(
self, objs: Iterable[_Model], fields: Iterable[str], batch_size: int | None = None
) -> int: ...
def get_or_create(self, defaults: Mapping[str, Any] | None = None, **kwargs: Any) -> tuple[_Model, bool]: ...
async def aget_or_create(self, defaults: Mapping[str, Any] | None = None, **kwargs: Any) -> tuple[_Model, bool]: ...
def update_or_create(
self,
defaults: Mapping[str, Any] | None = None,
create_defaults: Mapping[str, Any] | None = None,
**kwargs: Any,
) -> tuple[_Model, bool]: ...
async def aupdate_or_create(
self,
defaults: Mapping[str, Any] | None = None,
create_defaults: Mapping[str, Any] | None = None,
**kwargs: Any,
) -> tuple[_Model, bool]: ...
def earliest(self, *fields: str | OrderBy) -> _Row: ...
async def aearliest(self, *fields: str | OrderBy) -> _Row: ...
def latest(self, *fields: str | OrderBy) -> _Row: ...
async def alatest(self, *fields: str | OrderBy) -> _Row: ...
def first(self) -> _Row | None: ...
async def afirst(self) -> _Row | None: ...
def last(self) -> _Row | None: ...
async def alast(self) -> _Row | None: ...
def in_bulk(self, id_list: Iterable[Any] | None = None, *, field_name: str = "pk") -> dict[Any, _Model]: ...
async def ain_bulk(self, id_list: Iterable[Any] | None = None, *, field_name: str = "pk") -> dict[Any, _Model]: ...
def delete(self) -> tuple[int, dict[str, int]]: ...
async def adelete(self) -> tuple[int, dict[str, int]]: ...
def _raw_delete(self, using: str | None) -> int: ...
def update(self, **kwargs: Any) -> int: ...
async def aupdate(self, **kwargs: Any) -> int: ...
def exists(self) -> bool: ...
async def aexists(self) -> bool: ...
def contains(self, obj: Model) -> bool: ...
async def acontains(self, obj: Model) -> bool: ...
def explain(self, *, format: str | None = None, **options: Any) -> str: ...
async def aexplain(self, *, format: str | None = None, **options: Any) -> str: ...
def raw(
self,
raw_query: _ExecuteQuery,
params: Any = (),
translations: dict[str, str] | None = None,
using: str | None = None,
) -> RawQuerySet[_Model]: ...
# The type of values may be overridden to be more specific in the mypy plugin, depending on the fields param
def values(self, *fields: str | Combinable, **expressions: Any) -> QuerySet[_Model, dict[str, Any]]: ...
# The type of values_list may be overridden to be more specific in the mypy plugin, depending on the fields param
def values_list(
self, *fields: str | Combinable, flat: bool = False, named: bool = False
) -> QuerySet[_Model, Any]: ...
def dates(
self,
field_name: str,
kind: Literal["year", "month", "week", "day"],
order: Literal["ASC", "DESC"] = "ASC",
) -> QuerySet[_Model, datetime.date]: ...
def datetimes(
self,
field_name: str,
kind: Literal["year", "month", "week", "day", "hour", "minute", "second"],
order: Literal["ASC", "DESC"] = "ASC",
tzinfo: datetime.tzinfo | None = None,
) -> QuerySet[_Model, datetime.datetime]: ...
def none(self) -> Self: ...
def all(self) -> Self: ...
def filter(self, *args: Any, **kwargs: Any) -> Self: ...
def exclude(self, *args: Any, **kwargs: Any) -> Self: ...
def complex_filter(self, filter_obj: Any) -> Self: ...
def union(self, *other_qs: QuerySet[Model, Any], all: bool = False) -> Self: ...
def intersection(self, *other_qs: QuerySet[Model, Any]) -> Self: ...
def difference(self, *other_qs: QuerySet[Model, Any]) -> Self: ...
def select_for_update(
self, nowait: bool = False, skip_locked: bool = False, of: Sequence[str] = (), no_key: bool = False
) -> Self: ...
@overload
def select_related(self, clear: None, /) -> Self: ...
@overload
def select_related(self, *fields: str) -> Self: ...
@overload
def prefetch_related(self, clear: None, /) -> Self: ...
@overload
def prefetch_related(self, *lookups: str | Prefetch[_LookupT, _PrefetchedQuerySetT, _ToAttrT]) -> Self: ...
def annotate(self, *args: Any, **kwargs: Any) -> Self: ...
def alias(self, *args: Any, **kwargs: Any) -> Self: ...
def order_by(self, *field_names: _OrderByFieldName) -> Self: ...
def distinct(self, *field_names: str) -> Self: ...
# extra() return type won't be supported any time soon
def extra(
self,
select: dict[str, Any] | None = None,
where: Sequence[str] | None = None,
params: Sequence[Any] | None = None,
tables: Sequence[str] | None = None,
order_by: Sequence[_OrderByFieldName] | None = None,
select_params: Sequence[Any] | None = None,
) -> QuerySet[Any, Any]: ...
def reverse(self) -> Self: ...
@overload
def defer(self, clear: None, /) -> Self: ...
@overload
def defer(self, *fields: str) -> Self: ...
def only(self, *fields: str) -> Self: ...
def fetch_mode(self, fetch_mode: FetchMode) -> Self: ...
def using(self, alias: str | None) -> Self: ...
@property
def ordered(self) -> bool: ...
@property
def totally_ordered(self) -> bool: ...
@property
def db(self) -> str: ...
def _fetch_all(self) -> None: ...
def resolve_expression(self, *args: Any, **kwargs: Any) -> Any: ...
class RawQuerySet(_SupportsContains[object], Iterable[_Model], Sized):
raw_query: RawQuery | str
model: type[_Model] | None
query: RawQuery
params: tuple[Any, ...] | None
translations: dict[str, str]
def __init__(
self,
raw_query: RawQuery | str,
model: type[_Model] | None = None,
query: Query | None = None,
params: tuple[Any, ...] = (),
translations: dict[str, str] | None = None,
using: str | None = None,
hints: dict[str, Model] | None = None,
fetch_mode: FetchMode = ...,
) -> None: ...
def resolve_model_init_order(self) -> tuple[list[str], list[int], list[tuple[str, int]]]: ...
@overload
def prefetch_related(self, clear: None, /) -> Self: ...
@overload
def prefetch_related(self, *lookups: str | Prefetch[_LookupT, _PrefetchedQuerySetT, _ToAttrT]) -> Self: ...
@override
def __len__(self) -> int: ...
def __bool__(self) -> bool: ...
@override
def __iter__(self) -> Iterator[_Model]: ...
def __aiter__(self) -> AsyncIterator[_Model]: ...
def iterator(self) -> Iterator[_Model]: ...
@overload
def __getitem__(self, k: int) -> _Model: ...
@overload
def __getitem__(self, k: str) -> Any: ...
@overload
def __getitem__(self, k: slice) -> Self: ...
@property
def db(self) -> str: ...
def using(self, alias: str | None) -> Self: ...
@cached_property
def columns(self) -> list[str]: ...
@cached_property
def model_fields(self) -> dict[str, str]: ...
# Deprecated alias of QuerySet, for compatibility only.
_QuerySet: TypeAlias = QuerySet # noqa: PYI047
class Prefetch(Generic[_LookupT, _PrefetchedQuerySetT, _ToAttrT]):
prefetch_through: str
prefetch_to: str
queryset: _PrefetchedQuerySetT | None
to_attr: _ToAttrT | None
def __init__(
self, lookup: _LookupT, queryset: _PrefetchedQuerySetT | None = None, to_attr: _ToAttrT | None = None
) -> None: ...
@override
def __getstate__(self) -> dict[str, Any]: ...
def add_prefix(self, prefix: str) -> None: ...
def get_current_prefetch_to(self, level: int) -> str: ...
def get_current_to_attr(self, level: int) -> tuple[str, str]: ...
def get_current_querysets(self, level: int) -> Sequence[_PrefetchedQuerySetT] | None: ...
def normalize_prefetch_lookups(
lookups: Sequence[str | Prefetch[Any]], prefix: str | None = None
) -> list[Prefetch[Any]]: ...
def prefetch_related_objects(model_instances: Sequence[_Model], *related_lookups: str | Prefetch[Any]) -> None: ...
async def aprefetch_related_objects(
model_instances: Sequence[_Model], *related_lookups: str | Prefetch[Any]
) -> None: ...
def get_prefetcher(instance: Model, through_attr: str, to_attr: str) -> tuple[Any, Any, bool, bool]: ...
def prefetch_one_level(
instances: Sequence[Model], prefetcher: Any, lookup: Prefetch[Any], level: int
) -> tuple[list[Any], list[Prefetch[Any]]]: ...
class InstanceCheckMeta(type): ...
class EmptyQuerySet(metaclass=InstanceCheckMeta):
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
class RelatedPopulator:
db: str
cols_start: int
cols_end: int
init_list: list[str]
reorder_for_init: Any
model_cls: type[Model]
pk_idx: int
related_populators: list[RelatedPopulator]
local_setter: Any
remote_setter: Any
def __init__(self, klass_info: dict[str, Any], select: Any, db: str, fetch_mode: FetchMode) -> None: ...
def populate(self, row: Sequence[Any], from_obj: Model) -> None: ...
def get_related_populators(
klass_info: dict[str, Any], select: Any, db: str, fetch_mode: FetchMode
) -> list[RelatedPopulator]: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/models/query_utils.pyi 0000664 0000000 0000000 00000012205 15260643574 0026425 0 ustar 00root root 0000000 0000000 import logging
from collections.abc import Callable, Iterable, Iterator, Mapping, Sequence
from typing import Any, ClassVar, Literal, NamedTuple
from _typeshed import Incomplete
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models.base import Model
from django.db.models.expressions import BaseExpression
from django.db.models.fields import Field
from django.db.models.fields.mixins import FieldCacheMixin
from django.db.models.lookups import Lookup, Transform
from django.db.models.options import Options
from django.db.models.sql.compiler import SQLCompiler, _AsSqlType
from django.db.models.sql.query import Query
from django.db.models.sql.where import WhereNode
from django.utils import tree
from django.utils.functional import cached_property
from typing_extensions import TypeVar
logger: logging.Logger
PROHIBITED_FILTER_KWARGS: frozenset[str]
class class_or_instance_method:
class_method: Callable[..., Any]
instance_method: Callable[..., Any]
def __init__(self, class_method: Callable[..., Any], instance_method: Callable[..., Any]) -> None: ...
def __get__(self, instance: Any, owner: Any) -> Callable[..., Any]: ...
class PathInfo(NamedTuple):
from_opts: Options[Model]
to_opts: Options[Model]
target_fields: tuple[Field[Any, Any], ...]
join_field: Field[Any, Any]
m2m: bool
direct: bool
filtered_relation: FilteredRelation | None
def subclasses(cls: type[RegisterLookupMixin]) -> Iterator[type[RegisterLookupMixin]]: ...
class Q(tree.Node):
AND: Literal["AND"]
OR: Literal["OR"]
XOR: Literal["XOR"]
conditional: bool
connectors: tuple[None, Literal["AND"], Literal["OR"], Literal["XOR"]]
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
# Fake signature, the real is
# def __init__(self, *args: Any, _connector: Any | None = ..., _negated: bool = ..., **kwargs: Any) -> None: ...
def __or__(self, other: Q) -> Q: ...
def __and__(self, other: Q) -> Q: ...
def __xor__(self, other: Q) -> Q: ...
def __invert__(self) -> Q: ...
def resolve_expression(
self,
query: Query | None = None,
allow_joins: bool = True,
reuse: set[str] | None = None,
summarize: bool = False,
for_save: bool = False,
) -> WhereNode: ...
def replace_expressions(self, replacements: dict[tree.Node, tree.Node]) -> tree.Node: ...
def flatten(self) -> Iterator[Incomplete]: ...
def check(self, against: dict[str, Any], using: str = "default") -> bool: ...
def deconstruct(self) -> tuple[str, Sequence[Any], dict[str, Any]]: ...
@cached_property
def identity(self) -> tuple[Any, ...]: ...
@cached_property
def referenced_base_fields(self) -> set[str]: ...
class DeferredAttribute:
field: Field[Any, Any]
def __init__(self, field: Field[Any, Any]) -> None: ...
def __get__(self, instance: Model | None, cls: type[Model] | None = None) -> Any: ...
def fetch_one(self, instance: Model) -> None: ...
def fetch_many(self, instances: Iterable[Model]) -> None: ...
_R = TypeVar("_R", bound=type)
class RegisterLookupMixin:
class_lookups: ClassVar[dict[str, Any]]
lookup_name: str
@classmethod
def get_class_lookups(cls) -> dict[str, Any]: ...
def get_instance_lookups(self) -> dict[str, Any]: ...
def get_lookups(self) -> dict[str, Any]: ...
def get_lookup(self, lookup_name: str) -> type[Lookup] | None: ...
def get_transform(self, lookup_name: str) -> type[Transform] | None: ...
@staticmethod
def merge_dicts(dicts: Iterable[dict[str, Any]]) -> dict[str, Any]: ...
@classmethod
def register_class_lookup(cls, lookup: _R, lookup_name: str | None = None) -> _R: ...
def register_instance_lookup(self, lookup: _R, lookup_name: str | None = None) -> _R: ...
@classmethod
def register_lookup(cls, lookup: _R, lookup_name: str | None = None) -> _R: ...
@classmethod
def _unregister_class_lookup(cls, lookup: type[Lookup], lookup_name: str | None = None) -> None: ...
def _unregister_instance_lookup(self, lookup: type[Lookup], lookup_name: str | None = None) -> None: ...
@classmethod
def _unregister_lookup(cls, lookup: type[Lookup], lookup_name: str | None = None) -> None: ...
def select_related_descend(
field: Field[Any, Any],
restricted: bool,
requested: Mapping[str, Any] | None,
select_mask: set[Field[Any, Any]] | None,
) -> bool: ...
_E = TypeVar("_E", bound=BaseExpression)
def refs_expression(
lookup_parts: Sequence[str], annotations: Mapping[str, _E]
) -> tuple[Literal[False] | _E, Sequence[str]]: ...
def check_rel_lookup_compatibility(model: type[Model], target_opts: Any, field: FieldCacheMixin) -> bool: ...
class FilteredRelation:
relation_name: str
alias: str | None
condition: Q
def __init__(self, relation_name: str, *, condition: Q = ...) -> None: ...
def clone(self) -> FilteredRelation: ...
def relabeled_clone(self, change_map: dict[str, str]) -> FilteredRelation: ...
def resolve_expression(self, query: Query, reuse: set[str], *args: Any, **kwargs: Any) -> FilteredRelation: ...
def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/models/signals.pyi 0000664 0000000 0000000 00000002110 15260643574 0025472 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any
from django.apps.registry import Apps
from django.db.models.base import Model
from django.dispatch import Signal
from django.dispatch.dispatcher import _AnyHashable
from typing_extensions import override
class_prepared: Signal
class ModelSignal(Signal):
@override
def connect( # type: ignore[override]
self,
receiver: Callable[..., Any],
sender: type[Model] | str | None = None,
weak: bool = True,
dispatch_uid: _AnyHashable | None = None,
apps: Apps | None = None,
) -> None: ...
@override
def disconnect( # type: ignore[override]
self,
receiver: Callable[..., Any] | None = None,
sender: type[Model] | str | None = None,
dispatch_uid: _AnyHashable | None = None,
apps: Apps | None = None,
) -> bool | None: ...
pre_init: ModelSignal
post_init: ModelSignal
pre_save: ModelSignal
post_save: ModelSignal
pre_delete: ModelSignal
post_delete: ModelSignal
m2m_changed: ModelSignal
pre_migrate: Signal
post_migrate: Signal
typeddjango-django-stubs-fa03b48/django-stubs/db/models/sql/ 0000775 0000000 0000000 00000000000 15260643574 0024114 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/db/models/sql/__init__.pyi 0000664 0000000 0000000 00000000635 15260643574 0026402 0 ustar 00root root 0000000 0000000 from .query import Query as Query
from .query import RawQuery as RawQuery
from .subqueries import AggregateQuery as AggregateQuery
from .subqueries import DeleteQuery as DeleteQuery
from .subqueries import InsertQuery as InsertQuery
from .subqueries import UpdateQuery as UpdateQuery
from .where import AND as AND
from .where import OR as OR
from .where import XOR as XOR
__all__ = ["AND", "OR", "XOR", "Query"]
typeddjango-django-stubs-fa03b48/django-stubs/db/models/sql/compiler.pyi 0000664 0000000 0000000 00000017450 15260643574 0026460 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterable, Iterator, Sequence
from datetime import date, datetime
from decimal import Decimal
from re import Pattern
from typing import Any, Literal, TypeAlias, overload
from uuid import UUID
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.backends.utils import CursorWrapper
from django.db.models import Field
from django.db.models.base import Model
from django.db.models.expressions import BaseExpression, Expression, Ref
from django.db.models.sql.query import Query
from django.db.models.sql.subqueries import AggregateQuery, DeleteQuery, InsertQuery, UpdateQuery
from django.utils.functional import cached_property
from typing_extensions import deprecated, override
_ParamT: TypeAlias = str | int
_ParamsT: TypeAlias = tuple[_ParamT, ...]
_AsSqlType: TypeAlias = tuple[str, _ParamsT]
class PositionRef(Ref):
def __init__(self, ordinal: str, refs: str, source: Expression) -> None: ...
class SQLCompiler:
query: Query
connection: BaseDatabaseWrapper
using: str | None
quote_cache: Any
select: Any
annotation_col_map: Any
klass_info: Any
ordering_parts: Pattern[str]
def __init__(
self, query: Query, connection: BaseDatabaseWrapper, using: str | None, elide_empty: bool = True
) -> None: ...
col_count: int | None
def setup_query(self, with_col_aliases: bool = False) -> None: ...
has_extra_select: Any
def pre_sql_setup(
self,
with_col_aliases: bool = False,
) -> tuple[
list[tuple[Expression, _AsSqlType, None]],
list[tuple[Expression, tuple[str, _ParamsT, bool]]],
list[_AsSqlType],
]: ...
def get_group_by(
self,
select: list[tuple[BaseExpression, _AsSqlType, str | None]],
order_by: list[tuple[Expression, tuple[str, _ParamsT, bool]]],
) -> list[_AsSqlType]: ...
def collapse_group_by(
self, expressions: list[Expression], having: list[Expression] | tuple[Any, ...]
) -> list[Expression]: ...
@classmethod
def get_select_from_parent(cls, klass_info: dict[str, Any]) -> None: ...
def get_select(
self,
with_col_aliases: bool = False,
) -> tuple[list[tuple[Expression, _AsSqlType, str | None]], dict[str, Any] | None, dict[str, int]]: ...
def _order_by_pairs(self) -> None: ...
def get_order_by(self) -> list[tuple[Expression, tuple[str, _ParamsT, bool]]]: ...
def get_extra_select(
self,
order_by: list[tuple[Expression, tuple[str, _ParamsT, bool]]],
select: list[tuple[Expression, _AsSqlType, str | None]],
) -> list[tuple[Expression, _AsSqlType, None]]: ...
def quote_name(self, name: str) -> str: ...
@deprecated("SQLCompiler.quote_name_unless_alias() is deprecated. Use .quote_name() instead.")
def quote_name_unless_alias(self, name: str) -> str: ...
def compile(self, node: BaseExpression) -> _AsSqlType: ...
def get_combinator_sql(self, combinator: str, all: bool) -> tuple[list[str], list[int] | list[str]]: ...
def get_qualify_sql(self) -> tuple[list[str], list[Any]]: ...
def as_sql(self, with_limits: bool = True, with_col_aliases: bool = False) -> _AsSqlType: ...
def get_default_columns(
self,
select_mask: dict[str, Any],
start_alias: str | None = None,
opts: Any | None = None,
from_parent: type[Model] | None = None,
) -> list[Expression]: ...
def get_distinct(self) -> tuple[list[Any], list[Any]]: ...
def find_ordering_name(
self,
name: str,
opts: Any,
alias: str | None = None,
default_order: str = "ASC",
already_seen: set[tuple[tuple[tuple[str, str]] | None, tuple[tuple[str, str]]]] | None = None,
) -> list[tuple[Expression, bool]]: ...
def get_from_clause(self) -> tuple[list[str], _ParamsT]: ...
def get_related_selections(
self,
select: list[tuple[Expression, str | None]],
select_mask: dict[str, Any],
opts: Any | None = None,
root_alias: str | None = None,
cur_depth: int = 1,
requested: dict[str, dict[str, dict[str, dict[Any, Any]]]] | None = None,
restricted: bool | None = None,
) -> list[dict[str, Any]]: ...
def get_select_for_update_of_arguments(self) -> list[Any]: ...
def get_converters(
self, expressions: list[Expression]
) -> dict[int, tuple[list[Callable[..., Any]], Expression]]: ...
def apply_converters(
self, rows: Iterable[Iterable[Any]], converters: dict[int, tuple[list[Callable[..., Any]], Expression]]
) -> Iterator[list[date | datetime | float | Decimal | UUID | bytes | str | None]]: ...
def has_composite_fields(self, expressions: Iterable[Expression]) -> bool: ...
def composite_fields_to_tuples(
self, rows: Iterable[Any], expressions: Iterable[Expression]
) -> Iterator[list[tuple[Any, ...]]]: ...
def results_iter(
self,
results: Iterable[list[Sequence[Any]]] | None = None,
tuple_expected: bool = False,
chunked_fetch: bool = False,
chunk_size: int = 100,
) -> Iterator[Sequence[Any]]: ...
def has_results(self) -> bool: ...
@overload
def execute_sql(
self, result_type: Literal["cursor"] = "cursor", chunked_fetch: bool = False, chunk_size: int = 100
) -> CursorWrapper: ...
@overload
def execute_sql(
self,
result_type: Literal["no results"] | None = "no results",
chunked_fetch: bool = False,
chunk_size: int = 100,
) -> None: ...
@overload
def execute_sql(
self, result_type: Literal["single"] = "single", chunked_fetch: bool = False, chunk_size: int = 100
) -> Iterable[Sequence[Any]] | None: ...
@overload
def execute_sql(
self, result_type: Literal["multi"] = "multi", chunked_fetch: bool = False, chunk_size: int = 100
) -> Iterable[list[Sequence[Any]]] | None: ...
def explain_query(self) -> Iterator[str]: ...
class SQLInsertCompiler(SQLCompiler):
query: InsertQuery
returning_fields: Sequence[Any] | None
returning_params: Sequence[Any]
def field_as_sql(
self,
field: Field[Any, Any] | None,
get_placeholder_sql: Callable[[Any, SQLInsertCompiler, BaseDatabaseWrapper], _AsSqlType],
val: Any,
) -> _AsSqlType: ...
def prepare_value(self, field: Any, value: Any) -> Any: ...
def pre_save_val(self, field: Any, obj: Any) -> Any: ...
def assemble_as_sql(self, fields: Any, value_rows: Any) -> tuple[list[list[str]], list[list[Any]]]: ...
@override
def as_sql(self) -> list[_AsSqlType]: ... # type: ignore[override]
@override
def execute_sql( # type: ignore[override]
self, returning_fields: Sequence[str] | None = None
) -> list[tuple[Any]]: ... # 1-tuple
class SQLDeleteCompiler(SQLCompiler):
query: DeleteQuery
@cached_property
def single_alias(self) -> bool: ...
@cached_property
def contains_self_reference_subquery(self) -> bool: ...
@override
def as_sql(self) -> _AsSqlType: ... # type: ignore[override]
class SQLUpdateCompiler(SQLCompiler):
query: UpdateQuery
returning_fields: Sequence[Any] | None
returning_params: Sequence[Any]
@override
def as_sql(self) -> _AsSqlType: ... # type: ignore[override]
@override
def execute_sql(self, result_type: Literal["cursor", "no results"]) -> int: ... # type: ignore[override]
def execute_returning_sql(self, returning_fields: Sequence[Any] | None) -> list[Sequence[Any]]: ...
@override
def pre_sql_setup(self) -> None: ... # type: ignore[override]
class SQLAggregateCompiler(SQLCompiler):
query: AggregateQuery
col_count: int
@override
def as_sql(self) -> _AsSqlType: ... # type: ignore[override]
def cursor_iter(
cursor: CursorWrapper, sentinel: Any, col_count: int | None, itersize: int
) -> Iterator[list[Sequence[Any]]]: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/models/sql/constants.pyi 0000664 0000000 0000000 00000000476 15260643574 0026662 0 ustar 00root root 0000000 0000000 from typing import Final, Literal
GET_ITERATOR_CHUNK_SIZE: Final[int]
MULTI: Literal["multi"]
SINGLE: Literal["single"]
NO_RESULTS: Literal["no results"]
CURSOR: Literal["cursor"]
ROW_COUNT: Literal["row count"]
ORDER_DIR: dict[str, tuple[str, str]]
INNER: Literal["INNER JOIN"]
LOUTER: Literal["LEFT OUTER JOIN"]
typeddjango-django-stubs-fa03b48/django-stubs/db/models/sql/datastructures.pyi 0000664 0000000 0000000 00000003454 15260643574 0027722 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models.fields.mixins import FieldCacheMixin
from django.db.models.query_utils import FilteredRelation, PathInfo
from django.db.models.sql.compiler import SQLCompiler, _AsSqlType
class MultiJoin(Exception):
level: int
names_with_path: list[tuple[str, list[PathInfo]]]
def __init__(self, names_pos: int, path_with_names: list[tuple[str, list[PathInfo]]]) -> None: ...
class Empty: ...
class Join:
table_name: str
parent_alias: str
table_alias: str | None
join_type: str
join_cols: tuple[Any, ...]
join_field: FieldCacheMixin
nullable: bool
filtered_relation: FilteredRelation | None
def __init__(
self,
table_name: str,
parent_alias: str,
table_alias: str | None,
join_type: str,
join_field: FieldCacheMixin,
nullable: bool,
filtered_relation: FilteredRelation | None = None,
) -> None: ...
def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
def relabeled_clone(self, change_map: dict[str | None, str]) -> Join: ...
@property
def identity(self) -> tuple[type[Join], str, str, FieldCacheMixin, FilteredRelation | None]: ...
def demote(self) -> Join: ...
def promote(self) -> Join: ...
class BaseTable:
join_type: Any
parent_alias: Any
filtered_relation: Any
table_name: str
table_alias: str | None
def __init__(self, table_name: str, alias: str | None) -> None: ...
def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
def relabeled_clone(self, change_map: dict[str | None, str]) -> BaseTable: ...
@property
def identity(self) -> tuple[type[BaseTable], str, str | None]: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/models/sql/query.pyi 0000664 0000000 0000000 00000024727 15260643574 0026020 0 ustar 00root root 0000000 0000000 import collections
from collections.abc import Callable, Iterable, Iterator, Sequence
from typing import Any, Literal, NamedTuple
from django.db.backends.utils import CursorWrapper
from django.db.models import Field, FilteredRelation, Model, Q
from django.db.models.expressions import BaseExpression, Combinable, Expression
from django.db.models.lookups import Lookup, Transform
from django.db.models.options import Options
from django.db.models.query import _OrderByFieldName
from django.db.models.query_utils import PathInfo
from django.db.models.sql.datastructures import BaseTable, Join
from django.db.models.sql.where import WhereNode
from django.utils.functional import cached_property
from typing_extensions import override
class JoinInfo(NamedTuple):
final_field: Field[Any, Any]
targets: tuple[Any, ...]
opts: Any
joins: list[str]
path: list[Any]
transform_function: Callable[[Field[Any, Any], str], Expression]
class RawQuery:
high_mark: int | None
low_mark: int | None
params: Any
sql: str
using: str
extra_select: dict[Any, Any]
annotation_select: dict[Any, Any]
cursor: CursorWrapper | None
def __init__(self, sql: str, using: str, params: Any = ()) -> None: ...
def chain(self, using: str) -> RawQuery: ...
def clone(self, using: str) -> RawQuery: ...
def get_columns(self) -> list[str]: ...
def __iter__(self) -> Iterator[Any]: ...
@property
def params_type(self) -> type[dict[Any, Any] | tuple[Any, ...]] | None: ...
class Query(BaseExpression):
alias_prefix: str
subq_aliases: frozenset[Any]
compiler: str
base_table_class: type[BaseTable]
model: type[Model] | None
alias_refcount: dict[str, int]
alias_map: dict[str, BaseTable | Join]
external_aliases: dict[str, bool]
table_map: dict[str, list[str]]
default_cols: bool
default_ordering: bool
standard_ordering: bool
used_aliases: set[str]
where: WhereNode
filter_is_sticky: bool
subquery: bool
group_by: Sequence[Combinable] | Sequence[str] | Literal[True] | None
order_by: Sequence[_OrderByFieldName]
distinct: bool
distinct_fields: tuple[str, ...]
select: Sequence[BaseExpression]
select_for_update: bool
select_for_update_nowait: bool
select_for_update_skip_locked: bool
select_for_update_of: tuple[Any, ...]
select_for_no_key_update: bool
select_related: dict[str, Any] | bool
max_depth: int
join_class: type[Join]
values_select: tuple[Any, ...]
selected: dict[str, int | str | Expression] | None
annotation_select_mask: list[str] | None
combinator: str | None
combinator_all: bool
combined_queries: tuple[Any, ...]
extra_select_mask: set[str] | None
extra_tables: tuple[Any, ...]
extra_order_by: Sequence[_OrderByFieldName]
deferred_loading: tuple[set[str] | frozenset[str], bool]
high_mark: int | None
low_mark: int
extra: dict[str, Any]
annotations: dict[str, Expression]
empty_result_set_value: Any | None
explain_info: Any | None
def __init__(self, model: type[Model] | None, alias_cols: bool = True) -> None: ...
@property
@override
def output_field(self) -> Field[Any, Any]: ...
@property
def has_select_fields(self) -> bool: ...
@cached_property
def base_table(self) -> str: ...
def add_annotation(self, annotation: Any, alias: str, select: bool = True) -> None: ...
def sql_with_params(self) -> tuple[str, tuple[Any, ...]]: ...
def __deepcopy__(self, memo: dict[int, Any]) -> Query: ...
def get_compiler(
self, using: str | None = None, connection: Any | None = None, elide_empty: bool = True
) -> Any: ...
def join_parent_model(self, opts: Any, model: Any | None, alias: str, seen: dict[Any, str]) -> str: ...
def names_to_path(
self, names: Sequence[str], opts: Any, allow_many: bool = True, fail_on_missing: bool = False
) -> tuple[list[Any], Any, tuple[Any, ...], Sequence[str]]: ...
def get_meta(self) -> Options[Any]: ...
def clone(self) -> Query: ...
def chain(self, klass: type[Query] | None = None) -> Query: ...
def get_count(self, using: str) -> int: ...
@override
def get_group_by_cols(self, wrapper: Any | None = None) -> list[Any]: ...
def has_filters(self) -> WhereNode: ...
def get_external_cols(self) -> list[Any]: ...
def exists(self, limit: bool = True) -> Any: ...
def has_results(self, using: str) -> bool: ...
def explain(self, using: str, format: str | None = None, **options: Any) -> str: ...
def combine(self, rhs: Query, connector: str) -> None: ...
def ref_alias(self, alias: str) -> None: ...
def unref_alias(self, alias: str, amount: int = 1) -> None: ...
def promote_joins(self, aliases: Iterable[str]) -> None: ...
def demote_joins(self, aliases: Iterable[str]) -> None: ...
def reset_refcounts(self, to_counts: dict[str, int]) -> None: ...
def check_alias(self, alias: str) -> None: ...
def check_related_objects(self, field: Any, value: Any, opts: Any) -> None: ...
def check_query_object_type(self, value: Any, opts: Any, field: Any) -> None: ...
def change_aliases(self, change_map: dict[str | None, str]) -> None: ...
def bump_prefix(self, other_query: Query, exclude: Any | None = None) -> None: ...
def get_initial_alias(self) -> str: ...
def count_active_tables(self) -> int: ...
@override
def resolve_expression(self, query: Query, *args: Any, **kwargs: Any) -> Query: ... # type: ignore[override]
def resolve_lookup_value(
self, value: Any, can_reuse: set[str] | None, allow_joins: bool, summarize: bool = False
) -> Any: ...
def solve_lookup_type(
self, lookup: str, summarize: bool = False
) -> tuple[Sequence[str], Sequence[str], Expression | Literal[False]]: ...
def table_alias(
self, table_name: str, create: bool = False, filtered_relation: Any | None = None
) -> tuple[str, bool]: ...
def get_aggregation(self, using: Any, aggregate_exprs: dict[str, Any]) -> dict[str, Any]: ...
def build_filter(
self,
filter_expr: Q | Expression | dict[str, str] | tuple[str, Any],
branch_negated: bool = False,
current_negated: bool = False,
can_reuse: set[str] | None = None,
allow_joins: bool = True,
split_subq: bool = True,
check_filterable: bool = True,
summarize: bool = False,
update_join_types: bool = True,
) -> tuple[WhereNode, Iterable[str]]: ...
def add_select_col(self, col: Any, name: str) -> None: ...
def add_filter(self, filter_lhs: tuple[str, Any], filter_rhs: tuple[str, Any]) -> None: ...
def add_q(self, q_object: Q, reuse_all: bool = False) -> None: ...
def build_where(self, filter_expr: Q | Expression | dict[str, str] | tuple[str, Any]) -> WhereNode: ...
def add_filtered_relation(self, filtered_relation: FilteredRelation, alias: str) -> None: ...
def setup_joins(
self,
names: Sequence[str],
opts: Any,
alias: str,
can_reuse: set[str] | None = None,
allow_many: bool = True,
) -> JoinInfo: ...
def trim_joins(
self, targets: tuple[Field[Any, Any], ...], joins: list[str], path: list[PathInfo]
) -> tuple[tuple[Field[Any, Any], ...], str, list[str]]: ...
def resolve_ref(
self, name: str, allow_joins: bool = True, reuse: set[str] | None = None, summarize: bool = False
) -> Expression: ...
def split_exclude(
self,
filter_expr: tuple[str, Any],
can_reuse: set[str],
names_with_path: list[tuple[str, list[PathInfo]]],
) -> tuple[WhereNode, Iterable[str]]: ...
def set_empty(self) -> None: ...
def is_empty(self) -> bool: ...
def set_limits(self, low: int | None = None, high: int | None = None) -> None: ...
def clear_limits(self) -> None: ...
@property
def is_sliced(self) -> bool: ...
def has_limit_one(self) -> bool: ...
def can_filter(self) -> bool: ...
def clear_select_clause(self) -> None: ...
def clear_select_fields(self) -> None: ...
def set_select(self, cols: list[Expression]) -> None: ...
def add_distinct_fields(self, *field_names: str) -> None: ...
def add_fields(self, field_names: Iterable[str], allow_m2m: bool = True) -> None: ...
def add_ordering(self, *ordering: _OrderByFieldName) -> None: ...
@property
def orderby_issubset_groupby(self) -> bool: ...
def clear_where(self) -> None: ...
def clear_ordering(self, force: bool = False, clear_default: bool = True) -> None: ...
def set_group_by(self, allow_aliases: bool = True) -> None: ...
def add_select_related(self, fields: Iterable[str]) -> None: ...
def add_extra(
self,
select: dict[str, Any] | None,
select_params: Iterable[Any] | None,
where: Sequence[str] | None,
params: Sequence[str] | None,
tables: Sequence[str] | None,
order_by: Sequence[_OrderByFieldName] | None,
) -> None: ...
def clear_deferred_loading(self) -> None: ...
def add_deferred_loading(self, field_names: Iterable[str]) -> None: ...
def add_immediate_loading(self, field_names: Iterable[str]) -> None: ...
def get_select_mask(self) -> dict[str, Any]: ...
def set_annotation_mask(self, names: Iterable[str] | None) -> None: ...
def append_annotation_mask(self, names: Iterable[str]) -> None: ...
def set_extra_mask(self, names: Iterable[str] | None) -> None: ...
def set_values(self, fields: Iterable[str] | None) -> None: ...
@property
def annotation_select(self) -> dict[str, Any]: ...
@property
def extra_select(self) -> dict[str, Any]: ...
def trim_start(self, names_with_path: list[tuple[str, list[PathInfo]]]) -> tuple[str, bool]: ...
def is_nullable(self, field: Field[Any, Any]) -> bool: ...
def check_filterable(self, expression: Any) -> None: ...
def build_lookup(self, lookups: Sequence[str], lhs: Expression | Query, rhs: Any) -> Lookup: ...
def try_transform(self, lhs: Expression | Query, name: str, lookups: Sequence[str] | None = ...) -> Transform: ...
def join(
self,
join: BaseTable | Join,
reuse: str | None = None,
) -> str: ...
class JoinPromoter:
connector: str
negated: bool
effective_connector: str
num_children: int
votes: collections.Counter[str]
def __init__(self, connector: str, num_children: int, negated: bool) -> None: ...
def add_votes(self, votes: Iterable[str]) -> None: ...
def update_join_types(self, query: Query) -> set[str]: ...
__all__ = ["Query", "RawQuery"]
typeddjango-django-stubs-fa03b48/django-stubs/db/models/sql/subqueries.pyi 0000664 0000000 0000000 00000003157 15260643574 0027034 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable
from typing import Any
from django.db.models.base import Model
from django.db.models.expressions import Case
from django.db.models.fields import Field
from django.db.models.sql.query import Query
from django.db.models.sql.where import WhereNode
class DeleteQuery(Query):
def do_query(self, table: str, where: WhereNode, using: str) -> int: ...
def delete_batch(self, pk_list: list[int] | list[str], using: str) -> int: ...
class UpdateQuery(Query):
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
def update_batch(self, pk_list: list[int], values: dict[str, int | None], using: str) -> None: ...
def add_update_values(self, values: dict[str, Any]) -> None: ...
def add_update_fields(self, values_seq: list[tuple[Field[Any, Any], type[Model] | None, Case]]) -> None: ...
def add_related_update(self, model: type[Model], field: Field[Any, Any], value: int | str) -> None: ...
def get_related_updates(self) -> list[UpdateQuery]: ...
class InsertQuery(Query):
fields: Iterable[Field[Any, Any]]
objs: list[Model]
raw: bool
def __init__(
self,
*args: Any,
on_conflict: Any | None = ...,
update_fields: Any | None = ...,
unique_fields: Any | None = ...,
**kwargs: Any,
) -> None: ...
def insert_values(self, fields: Iterable[Field[Any, Any]], objs: list[Model], raw: bool = False) -> None: ...
class AggregateQuery(Query):
inner_query: Query
def __init__(self, model: type[Model], inner_query: Query) -> None: ...
__all__ = ["AggregateQuery", "DeleteQuery", "InsertQuery", "UpdateQuery"]
typeddjango-django-stubs-fa03b48/django-stubs/db/models/sql/where.pyi 0000664 0000000 0000000 00000005023 15260643574 0025751 0 ustar 00root root 0000000 0000000 from collections.abc import Iterator, Sequence
from typing import Any, Final
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models.expressions import Expression
from django.db.models.fields import BooleanField
from django.db.models.lookups import Lookup
from django.db.models.sql.compiler import SQLCompiler, _AsSqlType, _ParamsT
from django.utils import tree
from django.utils.functional import cached_property
AND: Final = "AND"
OR: Final = "OR"
XOR: Final = "XOR"
class WhereNode(tree.Node):
resolved: bool
conditional: bool
def split_having_qualify(
self, negated: bool = ..., must_group_by: bool = ...
) -> tuple[WhereNode | None, WhereNode | None, WhereNode | None]: ...
def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
def get_group_by_cols(self) -> list[Expression]: ...
def get_source_expressions(self) -> list[Any]: ...
def set_source_expressions(self, children: list[Any]) -> None: ...
def relabel_aliases(self, change_map: dict[str | None, str]) -> None: ...
def clone(self) -> WhereNode: ...
def relabeled_clone(self, change_map: dict[str | None, str]) -> WhereNode: ...
def replace_expressions(self, replacements: dict[Any, Any]) -> WhereNode: ...
def get_refs(self) -> set[str]: ...
@cached_property
def contains_aggregate(self) -> bool: ...
@cached_property
def contains_over_clause(self) -> bool: ...
@property
def is_summary(self) -> bool: ...
def resolve_expression(self, *args: Any, **kwargs: Any) -> WhereNode: ...
@cached_property
def output_field(self) -> BooleanField[Any, Any]: ...
def select_format(self, compiler: SQLCompiler, sql: str, params: _ParamsT) -> _AsSqlType: ...
def get_db_converters(self, connection: BaseDatabaseWrapper) -> list[Any]: ...
def get_lookup(self, lookup: str) -> type[Lookup] | None: ...
def leaves(self) -> Iterator[Any]: ...
class NothingNode:
contains_aggregate: bool
contains_over_clause: bool
def as_sql(
self, compiler: SQLCompiler | None = None, connection: BaseDatabaseWrapper | None = None
) -> _AsSqlType: ...
class ExtraWhere:
contains_aggregate: bool
contains_over_clause: bool
sqls: Sequence[str]
params: Sequence[int] | Sequence[str] | None
def __init__(self, sqls: Sequence[str], params: Sequence[int] | Sequence[str] | None) -> None: ...
def as_sql(
self, compiler: SQLCompiler | None = None, connection: BaseDatabaseWrapper | None = None
) -> _AsSqlType: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/models/utils.pyi 0000664 0000000 0000000 00000001362 15260643574 0025202 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable, Iterator, Mapping
from typing import Any, NamedTuple
from django.db.models.base import Model
from typing_extensions import deprecated, override
def make_model_tuple(model: type[Model] | str | tuple[str, str]) -> tuple[str, str]: ...
def resolve_callables(mapping: Mapping[str, Any]) -> Iterator[tuple[str, Any]]: ...
def unpickle_named_row(names: Iterable[str], values: Iterable[Any]) -> NamedTuple: ...
def create_namedtuple_class(*names: str) -> type[NamedTuple]: ...
class AltersData:
@override
def __init_subclass__(cls, **kwargs: Any) -> None: ...
# RemovedInDjango70Warning
@deprecated("Replace with `BLANK_CHOICE_LABEL` if not using `BLANK_CHOICE_DASH`.")
def get_blank_choice_label() -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/transaction.pyi 0000664 0000000 0000000 00000004512 15260643574 0025104 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from contextlib import AbstractContextManager
from types import TracebackType
from typing import Any, overload
from django.db import ProgrammingError
from typing_extensions import TypeVar, deprecated
class TransactionManagementError(ProgrammingError): ...
def get_connection(using: str | None = None) -> Any: ...
def get_autocommit(using: str | None = None) -> bool: ...
def set_autocommit(autocommit: bool, using: str | None = None) -> Any: ...
def commit(using: str | None = None) -> None: ...
def rollback(using: str | None = None) -> None: ...
@deprecated("savepoint() is deprecated. Use savepoint_create() instead.")
def savepoint(using: str | None = None) -> str: ...
def savepoint_create(using: str | None = None) -> str: ...
def savepoint_rollback(sid: str, using: str | None = None) -> None: ...
def savepoint_commit(sid: str, using: str | None = None) -> None: ...
def clean_savepoints(using: str | None = None) -> None: ...
def get_rollback(using: str | None = None) -> bool: ...
def set_rollback(rollback: bool, using: str | None = None) -> None: ...
def mark_for_rollback_on_error(using: str | None = None) -> AbstractContextManager[None]: ...
def on_commit(func: Callable[[], object], using: str | None = None, robust: bool = False) -> None: ...
_C = TypeVar("_C", bound=Callable[..., Any]) # Any callable
# Don't inherit from ContextDecorator, so we can provide a more specific signature for __call__
class Atomic:
using: str | None
savepoint: bool
def __init__(self, using: str | None, savepoint: bool, durable: bool) -> None: ...
# When decorating, return the decorated function as-is, rather than clobbering it as ContextDecorator does.
def __call__(self, func: _C) -> _C: ...
def __enter__(self) -> None: ...
def __exit__(
self,
exc_type: type[BaseException] | None,
exc_value: BaseException | None,
exc_tb: TracebackType | None,
) -> None: ...
# Bare decorator
@overload
def atomic(using: _C) -> _C: ...
# Decorator or context-manager with parameters
@overload
def atomic(using: str | None = None, savepoint: bool = True, durable: bool = False) -> Atomic: ...
# Bare decorator
@overload
def non_atomic_requests(using: _C) -> _C: ...
# Decorator with arguments
@overload
def non_atomic_requests(using: str | None = None) -> Callable[[_C], _C]: ...
typeddjango-django-stubs-fa03b48/django-stubs/db/utils.pyi 0000664 0000000 0000000 00000004342 15260643574 0023720 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterable
from types import TracebackType
from typing import Any
from django.apps import AppConfig
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models import Model
from django.utils.connection import BaseConnectionHandler
from django.utils.functional import cached_property
from typing_extensions import TypeVar, override
DEFAULT_DB_ALIAS: str
DJANGO_VERSION_PICKLE_KEY: str
class Error(Exception): ...
class InterfaceError(Error): ...
class DatabaseError(Error): ...
class DataError(DatabaseError): ...
class OperationalError(DatabaseError): ...
class IntegrityError(DatabaseError): ...
class InternalError(DatabaseError): ...
class ProgrammingError(DatabaseError): ...
class NotSupportedError(DatabaseError): ...
_F = TypeVar("_F", bound=Callable[..., Any])
class DatabaseErrorWrapper:
def __init__(self, wrapper: Any) -> None: ...
def __del__(self) -> None: ...
def __enter__(self) -> None: ...
def __exit__(
self,
exc_type: type[BaseException] | None,
exc_value: BaseException | None,
traceback: TracebackType | None,
) -> None: ...
def __call__(self, func: _F) -> _F: ...
def load_backend(backend_name: str) -> Any: ...
class ConnectionHandler(BaseConnectionHandler[BaseDatabaseWrapper]):
@override
def configure_settings(self, databases: dict[str, Any] | None) -> dict[str, Any]: ...
@property
def databases(self) -> dict[str, dict[str, Any]]: ...
@override
def create_connection(self, alias: str) -> BaseDatabaseWrapper: ...
class ConnectionRouter:
def __init__(self, routers: Iterable[Any] | None = None) -> None: ...
@cached_property
def routers(self) -> list[Any]: ...
def db_for_read(self, model: type[Model], **hints: Any) -> str: ...
def db_for_write(self, model: type[Model], **hints: Any) -> str: ...
def allow_relation(self, obj1: Model, obj2: Model, **hints: Any) -> bool: ...
def allow_migrate(self, db: str, app_label: str, **hints: Any) -> bool: ...
def allow_migrate_model(self, db: str, model: type[Model]) -> bool: ...
def get_migratable_models(
self, app_config: AppConfig, db: str, include_auto_created: bool = False
) -> list[type[Model]]: ...
typeddjango-django-stubs-fa03b48/django-stubs/dispatch/ 0000775 0000000 0000000 00000000000 15260643574 0023244 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/dispatch/__init__.pyi 0000664 0000000 0000000 00000000164 15260643574 0025527 0 ustar 00root root 0000000 0000000 from django.dispatch.dispatcher import Signal as Signal
from django.dispatch.dispatcher import receiver as receiver
typeddjango-django-stubs-fa03b48/django-stubs/dispatch/dispatcher.pyi 0000664 0000000 0000000 00000003277 15260643574 0026126 0 ustar 00root root 0000000 0000000 import threading
from collections.abc import Callable, MutableMapping
from logging import Logger
from typing import Any, TypeAlias
from typing_extensions import TypeVar
_AnyHashable: TypeAlias = Any
NONE_ID: int
NO_RECEIVERS: Any
logger: Logger
class Signal:
receivers: list[Any]
lock: threading.Lock
use_caching: bool
sender_receivers_cache: MutableMapping[Any, Any]
def __init__(self, use_caching: bool = False) -> None: ...
def connect(
self,
receiver: Callable[..., Any],
sender: object | None = None,
weak: bool = True,
dispatch_uid: _AnyHashable | None = None,
) -> None: ...
def disconnect(
self,
receiver: Callable[..., Any] | None = None,
sender: object | None = None,
dispatch_uid: _AnyHashable | None = None,
) -> bool: ...
def has_listeners(self, sender: Any | None = None) -> bool: ...
def send(self, sender: Any, **named: Any) -> list[tuple[Callable[..., Any], str | None]]: ...
async def asend(self, sender: Any, **named: Any) -> list[tuple[Callable[..., Any], str | None]]: ...
def send_robust(self, sender: Any, **named: Any) -> list[tuple[Callable[..., Any], Exception | Any]]: ...
async def asend_robust(self, sender: Any, **named: Any) -> list[tuple[Callable[..., Any], Exception | Any]]: ...
def _live_receivers(self, sender: Any) -> tuple[list[Callable[..., Any]], list[Callable[..., Any]]]: ...
_F = TypeVar("_F", bound=Callable[..., Any])
def receiver(
signal: list[Signal] | tuple[Signal, ...] | Signal,
*,
sender: object | None = ...,
weak: bool = ...,
dispatch_uid: _AnyHashable | None = ...,
**named: Any,
) -> Callable[[_F], _F]: ...
typeddjango-django-stubs-fa03b48/django-stubs/forms/ 0000775 0000000 0000000 00000000000 15260643574 0022573 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/forms/__init__.pyi 0000664 0000000 0000000 00000004600 15260643574 0025055 0 ustar 00root root 0000000 0000000 from django.core.exceptions import ValidationError as ValidationError
from .boundfield import BoundField as BoundField
from .fields import BooleanField as BooleanField
from .fields import CharField as CharField
from .fields import ChoiceField as ChoiceField
from .fields import ComboField as ComboField
from .fields import DateField as DateField
from .fields import DateTimeField as DateTimeField
from .fields import DecimalField as DecimalField
from .fields import DurationField as DurationField
from .fields import EmailField as EmailField
from .fields import Field as Field
from .fields import FileField as FileField
from .fields import FilePathField as FilePathField
from .fields import FloatField as FloatField
from .fields import GenericIPAddressField as GenericIPAddressField
from .fields import ImageField as ImageField
from .fields import IntegerField as IntegerField
from .fields import JSONField as JSONField
from .fields import MultipleChoiceField as MultipleChoiceField
from .fields import MultiValueField as MultiValueField
from .fields import NullBooleanField as NullBooleanField
from .fields import RegexField as RegexField
from .fields import SlugField as SlugField
from .fields import SplitDateTimeField as SplitDateTimeField
from .fields import TimeField as TimeField
from .fields import TypedChoiceField as TypedChoiceField
from .fields import TypedMultipleChoiceField as TypedMultipleChoiceField
from .fields import URLField as URLField
from .fields import UUIDField as UUIDField
from .forms import BaseForm as BaseForm
from .forms import Form as Form
from .formsets import BaseFormSet as BaseFormSet
from .formsets import all_valid as all_valid
from .formsets import formset_factory as formset_factory
from .models import ALL_FIELDS as ALL_FIELDS
from .models import BaseInlineFormSet as BaseInlineFormSet
from .models import BaseModelForm as BaseModelForm
from .models import BaseModelFormSet as BaseModelFormSet
from .models import ModelChoiceField as ModelChoiceField
from .models import ModelForm as ModelForm
from .models import ModelMultipleChoiceField as ModelMultipleChoiceField
from .models import fields_for_model as fields_for_model
from .models import inlineformset_factory as inlineformset_factory
from .models import model_to_dict as model_to_dict
from .models import modelform_factory as modelform_factory
from .models import modelformset_factory as modelformset_factory
from .widgets import *
typeddjango-django-stubs-fa03b48/django-stubs/forms/boundfield.pyi 0000664 0000000 0000000 00000006412 15260643574 0025434 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable, Iterator
from typing import Any, TypeAlias, overload
from django.forms.fields import Field
from django.forms.forms import BaseForm
from django.forms.renderers import BaseRenderer
from django.forms.utils import ErrorList, RenderableFieldMixin
from django.forms.widgets import Widget
from django.utils.functional import _StrOrPromise, cached_property
from django.utils.safestring import SafeString
from typing_extensions import override
_AttrsT: TypeAlias = dict[str, str | bool]
class BoundField(RenderableFieldMixin):
form: BaseForm
field: Field
name: str
html_name: str
html_initial_name: str
html_initial_id: str
label: _StrOrPromise
help_text: _StrOrPromise
renderer: BaseRenderer
def __init__(self, form: BaseForm, field: Field, name: str) -> None: ...
@cached_property
def subwidgets(self) -> list[BoundWidget]: ...
def __bool__(self) -> bool: ...
def __iter__(self) -> Iterator[BoundWidget]: ...
def __len__(self) -> int: ...
@overload
def __getitem__(self, idx: int | str) -> BoundWidget: ...
@overload
def __getitem__(self, idx: slice) -> list[BoundWidget]: ...
@property
def errors(self) -> ErrorList: ...
@property
def template_name(self) -> str: ...
@override
def get_context(self) -> dict[str, Any]: ...
@override
def as_widget(
self, widget: Widget | None = None, attrs: _AttrsT | None = None, only_initial: bool = False
) -> SafeString: ...
def as_text(self, attrs: _AttrsT | None = None, **kwargs: Any) -> SafeString: ...
@override
def __html__(self) -> SafeString: ...
def as_textarea(self, attrs: _AttrsT | None = None, **kwargs: Any) -> SafeString: ...
@override
def as_hidden(self, attrs: _AttrsT | None = None, **kwargs: Any) -> SafeString: ...
@property
def data(self) -> Any: ...
def value(self) -> Any: ...
def label_tag(
self,
contents: str | None = None,
attrs: _AttrsT | None = None,
label_suffix: str | None = None,
tag: str | None = None,
) -> SafeString: ...
def legend_tag(
self, contents: str | None = None, attrs: _AttrsT | None = None, label_suffix: str | None = None
) -> SafeString: ...
def css_classes(self, extra_classes: str | Iterable[str] | None = None) -> str: ...
@property
def is_hidden(self) -> bool: ...
@property
def auto_id(self) -> str: ...
@property
def id_for_label(self) -> str: ...
@cached_property
def initial(self) -> Any: ...
def build_widget_attrs(self, attrs: _AttrsT, widget: Widget | None = None) -> _AttrsT: ...
@property
def aria_describedby(self) -> str | None: ...
@property
def widget_type(self) -> str: ...
@property
def use_fieldset(self) -> bool: ...
class BoundWidget:
parent_widget: Widget
data: dict[str, Any]
renderer: BaseRenderer
def __init__(self, parent_widget: Widget, data: dict[str, Any], renderer: BaseRenderer) -> None: ...
def tag(self, wrap_label: bool = False) -> SafeString: ...
@property
def template_name(self) -> str: ...
@property
def id_for_label(self) -> str: ...
@property
def choice_label(self) -> str: ...
def __html__(self) -> SafeString: ...
__all__ = ("BoundField",)
typeddjango-django-stubs-fa03b48/django-stubs/forms/fields.pyi 0000664 0000000 0000000 00000055145 15260643574 0024576 0 ustar 00root root 0000000 0000000 import datetime
import json
from collections.abc import Callable, Collection, Iterable, Iterator, Sequence
from decimal import Decimal
from re import Pattern
from typing import Any, ClassVar, Protocol, Self, TypeAlias, type_check_only
from uuid import UUID
from django.core.files import File
from django.core.validators import _ValidatorCallable
from django.db.models.fields import _ErrorMessagesDict, _ErrorMessagesMapping
from django.forms.boundfield import BoundField
from django.forms.forms import BaseForm
from django.forms.widgets import Widget
from django.utils.choices import CallableChoiceIterator, _ChoicesCallable, _ChoicesInput
from django.utils.datastructures import _PropertyDescriptor
from django.utils.functional import _StrOrPromise
from typing_extensions import override
# Problem: attribute `widget` is always of type `Widget` after field instantiation.
# However, on class level it can be set to `Type[Widget]` too.
# If we annotate it as `Widget | Type[Widget]`, every code that uses field
# instances will not typecheck.
# If we annotate it as `Widget`, any widget subclasses that do e.g.
# `widget = Select` will not typecheck.
# `Any` gives too much freedom, but does not create false positives.
_ClassLevelWidgetT: TypeAlias = Any
class Field:
initial: Any
label: _StrOrPromise | None
required: bool
widget: _ClassLevelWidgetT
hidden_widget: type[Widget]
default_validators: list[_ValidatorCallable]
default_error_messages: ClassVar[_ErrorMessagesDict]
empty_values: Sequence[Any]
show_hidden_initial: bool
help_text: _StrOrPromise
disabled: bool
label_suffix: str | None
localize: bool
error_messages: _ErrorMessagesDict
validators: list[_ValidatorCallable]
bound_field_class: type[BoundField] | None
def __init__(
self,
*,
required: bool = True,
widget: Widget | type[Widget] | None = None,
label: _StrOrPromise | None = None,
initial: Any | None = None,
help_text: _StrOrPromise = "",
error_messages: _ErrorMessagesMapping | None = None,
show_hidden_initial: bool = False,
validators: Iterable[_ValidatorCallable] = (),
localize: bool = False,
disabled: bool = False,
label_suffix: str | None = None,
template_name: str | None = None,
bound_field_class: type[BoundField] | None = None,
) -> None: ...
def prepare_value(self, value: Any) -> Any: ...
def to_python(self, value: Any | None) -> Any | None: ...
def validate(self, value: Any) -> None: ...
def run_validators(self, value: Any) -> None: ...
def clean(self, value: Any) -> Any: ...
def bound_data(self, data: Any, initial: Any) -> Any: ...
def widget_attrs(self, widget: Widget) -> dict[str, Any]: ...
def has_changed(self, initial: Any | None, data: Any | None) -> bool: ...
def get_bound_field(self, form: BaseForm, field_name: str) -> BoundField: ...
def __deepcopy__(self, memo: dict[int, Any]) -> Self: ...
class CharField(Field):
max_length: int | None
min_length: int | None
strip: bool
empty_value: str | None
def __init__(
self,
*,
max_length: int | None = None,
min_length: int | None = None,
strip: bool = True,
empty_value: str | None = "",
required: bool = ...,
widget: Widget | type[Widget] | None = ...,
label: _StrOrPromise | None = ...,
initial: Any | None = ...,
help_text: _StrOrPromise = ...,
error_messages: _ErrorMessagesMapping | None = ...,
show_hidden_initial: bool = ...,
validators: Iterable[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
@override
def to_python(self, value: Any | None) -> str | None: ...
@override
def widget_attrs(self, widget: Widget) -> dict[str, Any]: ...
class IntegerField(Field):
widget: _ClassLevelWidgetT
max_value: int | Callable[[], int] | None
min_value: int | Callable[[], int] | None
step_size: int | Callable[[], int] | None
re_decimal: Pattern[str]
def __init__(
self,
*,
max_value: int | Callable[[], int] | None = None,
min_value: int | Callable[[], int] | None = None,
step_size: int | Callable[[], int] | None = None,
required: bool = ...,
widget: Widget | type[Widget] | None = ...,
label: _StrOrPromise | None = ...,
initial: Any | None = ...,
help_text: _StrOrPromise = ...,
error_messages: _ErrorMessagesMapping | None = ...,
show_hidden_initial: bool = ...,
validators: Iterable[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
@override
def to_python(self, value: Any | None) -> int | None: ...
@override
def widget_attrs(self, widget: Widget) -> dict[str, Any]: ...
class FloatField(IntegerField):
def __init__(
self,
*,
max_value: int | float | None = None,
min_value: int | float | None = None,
step_size: int | float | None = None,
required: bool = ...,
widget: Widget | type[Widget] | None = ...,
label: _StrOrPromise | None = ...,
initial: Any | None = ...,
help_text: _StrOrPromise = ...,
error_messages: _ErrorMessagesMapping | None = ...,
show_hidden_initial: bool = ...,
validators: Iterable[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
@override
def to_python(self, value: Any | None) -> float | None: ... # type: ignore[override]
@override
def validate(self, value: float) -> None: ...
@override
def widget_attrs(self, widget: Widget) -> dict[str, Any]: ...
class DecimalField(IntegerField):
decimal_places: int | None
max_digits: int | None
def __init__(
self,
*,
max_value: Decimal | int | float | None = None,
min_value: Decimal | int | float | None = None,
max_digits: int | None = None,
decimal_places: int | None = None,
step_size: Decimal | int | float | None = ...,
required: bool = ...,
widget: Widget | type[Widget] | None = ...,
label: _StrOrPromise | None = ...,
initial: Any | None = ...,
help_text: _StrOrPromise = ...,
error_messages: _ErrorMessagesMapping | None = ...,
show_hidden_initial: bool = ...,
validators: Iterable[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
@override
def to_python(self, value: Any | None) -> Decimal | None: ... # type: ignore[override]
@override
def validate(self, value: Decimal) -> None: ...
@override
def widget_attrs(self, widget: Widget) -> dict[str, Any]: ...
class BaseTemporalField(Field):
input_formats: Collection[str] | DateTimeFormatsIterator | None
def __init__(
self,
*,
input_formats: Collection[str] | DateTimeFormatsIterator | None = None,
required: bool = ...,
widget: Widget | type[Widget] | None = ...,
label: _StrOrPromise | None = ...,
initial: Any | None = ...,
help_text: _StrOrPromise = ...,
error_messages: _ErrorMessagesMapping | None = ...,
show_hidden_initial: bool = ...,
validators: Iterable[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
@override
def to_python(self, value: str | None) -> Any | None: ...
def strptime(self, value: str, format: str) -> Any: ...
class DateField(BaseTemporalField):
widget: _ClassLevelWidgetT
@override
def to_python(self, value: str | datetime.datetime | datetime.date | None) -> datetime.date | None: ...
@override
def strptime(self, value: str, format: str) -> datetime.date: ...
class TimeField(BaseTemporalField):
widget: _ClassLevelWidgetT
@override
def to_python(self, value: str | datetime.time | None) -> datetime.time | None: ...
@override
def strptime(self, value: str, format: str) -> datetime.time: ...
class DateTimeFormatsIterator:
def __iter__(self) -> Iterator[str]: ...
class DateTimeField(BaseTemporalField):
widget: _ClassLevelWidgetT
@override
def prepare_value(self, value: Any) -> Any: ...
@override
def to_python(self, value: str | datetime.datetime | datetime.date | None) -> datetime.datetime | None: ...
@override
def strptime(self, value: str, format: str) -> datetime.datetime: ...
class DurationField(Field):
@override
def prepare_value(self, value: datetime.timedelta | str | None) -> str | None: ...
@override
def to_python(self, value: Any | None) -> datetime.timedelta | None: ...
class RegexField(CharField):
regex: _PropertyDescriptor[str | Pattern[str], Pattern[str]]
def __init__(
self,
regex: str | Pattern[str],
*,
max_length: int | None = ...,
min_length: int | None = ...,
strip: bool = ...,
empty_value: str | None = ...,
required: bool = ...,
widget: Widget | type[Widget] | None = ...,
label: _StrOrPromise | None = ...,
initial: Any | None = ...,
help_text: _StrOrPromise = ...,
error_messages: _ErrorMessagesMapping | None = ...,
show_hidden_initial: bool = ...,
validators: Iterable[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
class EmailField(CharField):
widget: _ClassLevelWidgetT
def __init__(
self,
*,
max_length: int | None = ...,
min_length: int | None = ...,
strip: bool = ...,
empty_value: str | None = ...,
required: bool = ...,
widget: Widget | type[Widget] | None = ...,
label: _StrOrPromise | None = ...,
initial: Any | None = ...,
help_text: _StrOrPromise = ...,
error_messages: _ErrorMessagesMapping | None = ...,
show_hidden_initial: bool = ...,
validators: Iterable[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
class FileField(Field):
widget: _ClassLevelWidgetT
allow_empty_file: bool
max_length: int | None
def __init__(
self,
*,
max_length: int | None = None,
allow_empty_file: bool = False,
required: bool = ...,
widget: Widget | type[Widget] | None = ...,
label: _StrOrPromise | None = ...,
initial: Any | None = ...,
help_text: _StrOrPromise = ...,
error_messages: _ErrorMessagesMapping | None = ...,
show_hidden_initial: bool = ...,
validators: Iterable[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
@override
def to_python(self, data: File[Any] | None) -> File[Any] | None: ...
@override
def clean(self, data: Any, initial: Any | None = None) -> Any: ...
@override
def bound_data(self, _: Any | None, initial: Any) -> Any: ...
@override
def has_changed(self, initial: Any | None, data: Any | None) -> bool: ...
class ImageField(FileField):
@override
def to_python(self, data: File[Any] | None) -> File[Any] | None: ...
@override
def widget_attrs(self, widget: Widget) -> dict[str, Any]: ...
class URLField(CharField):
widget: _ClassLevelWidgetT
def __init__(
self,
*,
max_length: int | None = ...,
min_length: int | None = ...,
strip: bool = ...,
empty_value: str | None = ...,
required: bool = ...,
widget: Widget | type[Widget] | None = ...,
label: _StrOrPromise | None = ...,
initial: Any | None = ...,
help_text: _StrOrPromise = ...,
error_messages: _ErrorMessagesMapping | None = ...,
show_hidden_initial: bool = ...,
validators: Iterable[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
assume_scheme: str | None = None,
) -> None: ...
@override
def to_python(self, value: Any | None) -> str | None: ...
class BooleanField(Field):
widget: _ClassLevelWidgetT
@override
def to_python(self, value: Any | None) -> bool: ...
@override
def validate(self, value: Any) -> None: ...
@override
def has_changed(self, initial: Any | None, data: Any | None) -> bool: ...
class NullBooleanField(BooleanField):
widget: _ClassLevelWidgetT
@override
def to_python(self, value: Any | None) -> bool | None: ... # type: ignore[override]
@override
def validate(self, value: Any) -> None: ...
class ChoiceField(Field):
choices: _PropertyDescriptor[
_ChoicesInput | _ChoicesCallable | CallableChoiceIterator,
_ChoicesInput | CallableChoiceIterator,
]
widget: _ClassLevelWidgetT
def __init__(
self,
*,
choices: _ChoicesInput | _ChoicesCallable = (),
required: bool = ...,
widget: Widget | type[Widget] | None = ...,
label: _StrOrPromise | None = ...,
initial: Any | None = ...,
help_text: _StrOrPromise = ...,
error_messages: _ErrorMessagesMapping | None = ...,
show_hidden_initial: bool = ...,
validators: Iterable[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
@override
def __deepcopy__(self, memo: dict[int, Any]) -> Self: ...
# Real return type of `to_python` is `str`, but it results in errors when
# subclassing `ModelChoiceField`: `# type: ignore[override]` is not inherited
@override
def to_python(self, value: Any | None) -> Any: ...
@override
def validate(self, value: Any) -> None: ...
def valid_value(self, value: Any) -> bool: ...
@type_check_only
class _CoerceCallable(Protocol):
def __call__(self, value: Any, /) -> Any: ...
class TypedChoiceField(ChoiceField):
coerce: _CoerceCallable
empty_value: str | None
def __init__(
self,
*,
coerce: _CoerceCallable = ...,
empty_value: str | None = "",
choices: _ChoicesInput | _ChoicesCallable = ...,
required: bool = ...,
widget: Widget | type[Widget] | None = ...,
label: _StrOrPromise | None = ...,
initial: Any | None = ...,
help_text: _StrOrPromise = ...,
error_messages: _ErrorMessagesMapping | None = ...,
show_hidden_initial: bool = ...,
validators: Iterable[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
@override
def clean(self, value: Any) -> Any: ...
class MultipleChoiceField(ChoiceField):
widget: _ClassLevelWidgetT
hidden_widget: type[Widget]
@override
def to_python(self, value: Any | None) -> list[str]: ...
@override
def validate(self, value: Any) -> None: ...
@override
def has_changed(self, initial: Collection[Any] | None, data: Collection[Any] | None) -> bool: ...
class TypedMultipleChoiceField(MultipleChoiceField):
coerce: _CoerceCallable
empty_value: list[Any] | None
def __init__(
self,
*,
coerce: _CoerceCallable = ...,
empty_value: list[Any] | None = ...,
choices: _ChoicesInput | _ChoicesCallable = ...,
required: bool = ...,
widget: Widget | type[Widget] | None = ...,
label: _StrOrPromise | None = ...,
initial: Any | None = ...,
help_text: _StrOrPromise = ...,
error_messages: _ErrorMessagesMapping | None = ...,
show_hidden_initial: bool = ...,
validators: Iterable[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
@override
def clean(self, value: Any) -> Any: ...
@override
def validate(self, value: Any) -> None: ...
class ComboField(Field):
fields: Sequence[Field]
def __init__(
self,
fields: Sequence[Field],
*,
required: bool = ...,
widget: Widget | type[Widget] | None = ...,
label: _StrOrPromise | None = ...,
initial: Any | None = ...,
help_text: _StrOrPromise = ...,
error_messages: _ErrorMessagesMapping | None = ...,
show_hidden_initial: bool = ...,
validators: Iterable[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
@override
def clean(self, value: Any) -> Any: ...
class MultiValueField(Field):
require_all_fields: bool
fields: Sequence[Field]
def __init__(
self,
fields: Sequence[Field],
*,
require_all_fields: bool = True,
required: bool = ...,
widget: Widget | type[Widget] | None = ...,
label: _StrOrPromise | None = ...,
initial: Any | None = ...,
help_text: _StrOrPromise = ...,
error_messages: _ErrorMessagesMapping | None = ...,
show_hidden_initial: bool = ...,
validators: Iterable[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
@override
def __deepcopy__(self, memo: dict[int, Any]) -> Self: ...
@override
def validate(self, value: Any) -> None: ...
@override
def clean(self, value: Any) -> Any: ...
def compress(self, data_list: Any) -> Any: ...
@override
def has_changed(self, initial: Any | None, data: Any | None) -> bool: ...
class FilePathField(ChoiceField):
allow_files: bool
allow_folders: bool
match: str | None
path: str
recursive: bool
match_re: Pattern[str] | None
def __init__(
self,
path: str,
*,
match: str | None = None,
recursive: bool = False,
allow_files: bool = True,
allow_folders: bool = False,
choices: _ChoicesInput | _ChoicesCallable = ...,
required: bool = ...,
widget: Widget | type[Widget] | None = ...,
label: _StrOrPromise | None = ...,
initial: Any | None = ...,
help_text: _StrOrPromise = ...,
error_messages: _ErrorMessagesMapping | None = ...,
show_hidden_initial: bool = ...,
validators: Iterable[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
def set_choices(self) -> None: ...
class SplitDateTimeField(MultiValueField):
widget: _ClassLevelWidgetT
hidden_widget: type[Widget]
def __init__(
self,
*,
input_date_formats: Any | None = None,
input_time_formats: Any | None = None,
fields: Sequence[Field] = ...,
require_all_fields: bool = ...,
required: bool = ...,
widget: Widget | type[Widget] | None = ...,
label: _StrOrPromise | None = ...,
initial: Any | None = ...,
help_text: _StrOrPromise = ...,
error_messages: _ErrorMessagesMapping | None = ...,
show_hidden_initial: bool = ...,
validators: Iterable[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
@override
def compress(self, data_list: tuple[datetime.date, datetime.time] | None) -> datetime.datetime | None: ...
class GenericIPAddressField(CharField):
unpack_ipv4: bool
def __init__(
self,
*,
protocol: str = "both",
unpack_ipv4: bool = False,
required: bool = ...,
widget: Widget | type[Widget] | None = ...,
label: _StrOrPromise | None = ...,
initial: Any | None = ...,
help_text: _StrOrPromise = ...,
error_messages: _ErrorMessagesMapping | None = ...,
show_hidden_initial: bool = ...,
validators: Iterable[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
@override
def to_python(self, value: Any) -> str: ...
class SlugField(CharField):
allow_unicode: bool
def __init__(
self,
*,
allow_unicode: bool = False,
max_length: Any | None = ...,
min_length: Any | None = ...,
strip: bool = ...,
empty_value: str | None = ...,
required: bool = ...,
widget: Widget | type[Widget] | None = ...,
label: _StrOrPromise | None = ...,
initial: Any | None = ...,
help_text: _StrOrPromise = ...,
error_messages: _ErrorMessagesMapping | None = ...,
show_hidden_initial: bool = ...,
validators: Iterable[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
class UUIDField(CharField):
@override
def prepare_value(self, value: Any | None) -> Any | None: ...
@override
def to_python(self, value: Any) -> UUID | None: ... # type: ignore[override]
class InvalidJSONInput(str): ...
class JSONString(str): ...
class JSONField(CharField):
default_error_messages: ClassVar[_ErrorMessagesDict]
widget: _ClassLevelWidgetT
encoder: type[json.JSONEncoder] | None
decoder: type[json.JSONDecoder] | None
def __init__(
self,
encoder: type[json.JSONEncoder] | None = None,
decoder: type[json.JSONDecoder] | None = None,
**kwargs: Any,
) -> None: ...
@override
def to_python(self, value: Any) -> Any: ...
@override
def bound_data(self, data: Any, initial: Any) -> Any: ...
@override
def prepare_value(self, value: Any) -> str: ...
@override
def has_changed(self, initial: Any | None, data: Any | None) -> bool: ...
__all__ = (
"BooleanField",
"CharField",
"ChoiceField",
"ComboField",
"DateField",
"DateTimeField",
"DecimalField",
"DurationField",
"EmailField",
"Field",
"FileField",
"FilePathField",
"FloatField",
"GenericIPAddressField",
"ImageField",
"IntegerField",
"JSONField",
"MultiValueField",
"MultipleChoiceField",
"NullBooleanField",
"RegexField",
"SlugField",
"SplitDateTimeField",
"TimeField",
"TypedChoiceField",
"TypedMultipleChoiceField",
"URLField",
"UUIDField",
)
typeddjango-django-stubs-fa03b48/django-stubs/forms/forms.pyi 0000664 0000000 0000000 00000007021 15260643574 0024444 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable, Iterator, Mapping, MutableMapping, Sequence
from typing import Any, ClassVar, overload
from django.core.exceptions import ValidationError
from django.db.models.query import _SupportsContains
from django.forms.boundfield import BoundField
from django.forms.fields import Field
from django.forms.renderers import BaseRenderer
from django.forms.utils import ErrorDict, ErrorList, RenderableFormMixin, _DataT, _FilesT
from django.forms.widgets import Media, MediaDefiningClass
from django.utils.functional import _StrOrPromise, cached_property
from typing_extensions import override
class DeclarativeFieldsMetaclass(MediaDefiningClass): ...
class BaseForm(_SupportsContains[str], RenderableFormMixin):
default_renderer: BaseRenderer | type[BaseRenderer] | None
field_order: Iterable[str] | None
use_required_attribute: bool
is_bound: bool
data: _DataT
files: _FilesT
auto_id: bool | str
initial: MutableMapping[str, Any]
error_class: type[ErrorList]
prefix: str | None
label_suffix: str
empty_permitted: bool
fields: dict[str, Field]
renderer: BaseRenderer
cleaned_data: dict[str, Any]
template_name_div: str
template_name_p: str
template_name_table: str
template_name_ul: str
template_name_label: str
bound_field_class: type[BoundField] | None
def __init__(
self,
data: _DataT | None = None,
files: _FilesT | None = None,
auto_id: bool | str = "id_%s",
prefix: str | None = None,
initial: MutableMapping[str, Any] | None = None,
error_class: type[ErrorList] = ...,
label_suffix: str | None = None,
empty_permitted: bool = False,
field_order: Iterable[str] | None = None,
use_required_attribute: bool | None = None,
renderer: BaseRenderer | None = None,
bound_field_class: type[BoundField] | None = None,
) -> None: ...
def order_fields(self, field_order: Iterable[str] | None) -> None: ...
def __iter__(self) -> Iterator[BoundField]: ...
def __getitem__(self, name: str) -> BoundField: ...
@property
def errors(self) -> ErrorDict: ...
def is_valid(self) -> bool: ...
def add_prefix(self, field_name: str) -> str: ...
def add_initial_prefix(self, field_name: str) -> str: ...
@property
def template_name(self) -> str: ...
@override
def get_context(self) -> dict[str, Any]: ...
def non_field_errors(self) -> ErrorList: ...
@overload
def add_error(
self,
field: None,
error: Mapping[str, ValidationError | _StrOrPromise | Sequence[ValidationError | _StrOrPromise]],
) -> None: ...
@overload
def add_error(
self, field: str | None, error: ValidationError | _StrOrPromise | Sequence[ValidationError | _StrOrPromise]
) -> None: ...
def has_error(self, field: str | None, code: str | None = None) -> bool: ...
def full_clean(self) -> None: ...
def clean(self) -> dict[str, Any] | None: ...
def has_changed(self) -> bool: ...
@cached_property
def changed_data(self) -> list[str]: ...
@property
def media(self) -> Media: ...
def is_multipart(self) -> bool: ...
def hidden_fields(self) -> list[BoundField]: ...
def visible_fields(self) -> list[BoundField]: ...
def get_initial_for_field(self, field: Field, field_name: str) -> Any: ...
class Form(BaseForm, metaclass=DeclarativeFieldsMetaclass):
base_fields: ClassVar[dict[str, Field]]
declared_fields: ClassVar[dict[str, Field]]
__all__ = ("BaseForm", "Form")
typeddjango-django-stubs-fa03b48/django-stubs/forms/formsets.pyi 0000664 0000000 0000000 00000010252 15260643574 0025160 0 ustar 00root root 0000000 0000000 from collections.abc import Iterator, Mapping, Sequence, Sized
from typing import Any, ClassVar, Generic
from django.db.models.fields import _ErrorMessagesDict
from django.db.models.query import _SupportsContains
from django.forms.forms import BaseForm, Form
from django.forms.renderers import BaseRenderer
from django.forms.utils import ErrorList, RenderableFormMixin, _DataT, _FilesT
from django.forms.widgets import Media, MediaDefiningClass, Widget
from django.utils.functional import cached_property
from typing_extensions import TypeVar, override
TOTAL_FORM_COUNT: str
INITIAL_FORM_COUNT: str
MIN_NUM_FORM_COUNT: str
MAX_NUM_FORM_COUNT: str
ORDERING_FIELD_NAME: str
DELETION_FIELD_NAME: str
DEFAULT_MIN_NUM: int
DEFAULT_MAX_NUM: int
_F = TypeVar("_F", bound=BaseForm)
class ManagementForm(Form):
cleaned_data: dict[str, int | None]
@override
def clean(self) -> dict[str, int | None]: ...
class BaseFormSet(_SupportsContains[_F], Sized, RenderableFormMixin, Generic[_F]):
form: type[_F]
extra: int
can_order: bool
can_delete: bool
can_delete_extra: bool
min_num: int
max_num: int
absolute_max: int
validate_min: bool
validate_max: bool
is_bound: bool
prefix: str | None
auto_id: str
data: _DataT
files: _FilesT
initial: Sequence[Mapping[str, Any]] | None
form_kwargs: dict[str, Any]
error_class: type[ErrorList]
deletion_widget: MediaDefiningClass
ordering_widget: MediaDefiningClass
default_error_messages: ClassVar[_ErrorMessagesDict]
template_name_div: str
template_name_p: str
template_name_table: str
template_name_ul: str
def __init__(
self,
data: _DataT | None = None,
files: _FilesT | None = None,
auto_id: str = "id_%s",
prefix: str | None = None,
initial: Sequence[Mapping[str, Any]] | None = None,
error_class: type[ErrorList] = ...,
form_kwargs: dict[str, Any] | None = None,
error_messages: Mapping[str, str] | None = None,
) -> None: ...
def __iter__(self) -> Iterator[_F]: ...
def __getitem__(self, index: int) -> _F: ...
@override
def __len__(self) -> int: ...
def __bool__(self) -> bool: ...
@cached_property
def management_form(self) -> ManagementForm: ...
def total_form_count(self) -> int: ...
def initial_form_count(self) -> int: ...
@cached_property
def forms(self) -> list[_F]: ...
def get_form_kwargs(self, index: int | None) -> dict[str, Any]: ...
@property
def initial_forms(self) -> list[_F]: ...
@property
def extra_forms(self) -> list[_F]: ...
@property
def empty_form(self) -> _F: ...
@property
def cleaned_data(self) -> list[dict[str, Any]]: ...
@property
def deleted_forms(self) -> list[_F]: ...
@property
def ordered_forms(self) -> list[_F]: ...
@classmethod
def get_default_prefix(cls) -> str: ...
@classmethod
def get_deletion_widget(cls) -> type[Widget]: ...
@classmethod
def get_ordering_widget(cls) -> type[Widget]: ...
def non_form_errors(self) -> ErrorList: ...
@property
def errors(self) -> list[ErrorList]: ...
def total_error_count(self) -> int: ...
def is_valid(self) -> bool: ...
def full_clean(self) -> None: ...
def clean(self) -> None: ...
def has_changed(self) -> bool: ...
def add_fields(self, form: _F, index: int | None) -> None: ...
def add_prefix(self, index: int | str) -> str: ...
def is_multipart(self) -> bool: ...
@property
def media(self) -> Media: ...
@property
def template_name(self) -> str: ...
@override
def get_context(self) -> dict[str, Any]: ...
def formset_factory(
form: type[_F],
formset: type[BaseFormSet[_F]] = ...,
extra: int = 1,
can_order: bool = False,
can_delete: bool = False,
max_num: int | None = None,
validate_max: bool = False,
min_num: int | None = None,
validate_min: bool = False,
absolute_max: int | None = None,
can_delete_extra: bool = True,
renderer: BaseRenderer | None = None,
) -> type[BaseFormSet[_F]]: ...
def all_valid(formsets: Sequence[BaseFormSet[_F]]) -> bool: ...
__all__ = ("BaseFormSet", "all_valid", "formset_factory")
typeddjango-django-stubs-fa03b48/django-stubs/forms/models.pyi 0000664 0000000 0000000 00000031322 15260643574 0024602 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Collection, Container, Iterator, Mapping, MutableMapping, Sequence
from typing import Any, ClassVar, Generic, Literal, Self, TypeAlias, overload
from uuid import UUID
from django.db import models
from django.db.models import ForeignKey
from django.db.models.base import Model
from django.db.models.fields import _AllLimitChoicesTo, _LimitChoicesTo
from django.db.models.manager import Manager
from django.db.models.query import QuerySet
from django.db.models.utils import AltersData
from django.forms.fields import ChoiceField, Field, _ClassLevelWidgetT
from django.forms.forms import BaseForm, DeclarativeFieldsMetaclass
from django.forms.formsets import BaseFormSet
from django.forms.renderers import BaseRenderer
from django.forms.utils import ErrorList, _DataT, _FilesT
from django.forms.widgets import Widget
from django.utils.choices import BaseChoiceIterator, CallableChoiceIterator, _ChoicesCallable, _ChoicesInput
from django.utils.datastructures import _PropertyDescriptor
from django.utils.functional import _StrOrPromise
from typing_extensions import TypeVar, override
ALL_FIELDS: Literal["__all__"]
_Fields: TypeAlias = Collection[str] | Literal["__all__"]
_Widgets: TypeAlias = dict[str, type[Widget] | Widget]
_Labels: TypeAlias = dict[str, str]
_HelpTexts: TypeAlias = dict[str, str]
_ErrorMessages: TypeAlias = dict[str, dict[str, str]]
_FormFieldCallback: TypeAlias = Callable[[models.Field[Any, Any]], Field | None]
_M = TypeVar("_M", bound=Model)
_ParentM = TypeVar("_ParentM", bound=Model)
def construct_instance(
form: BaseForm, instance: _M, fields: Container[str] | None = None, exclude: Container[str] | None = None
) -> _M: ...
def model_to_dict(instance: Model, fields: _Fields | None = None, exclude: _Fields | None = None) -> dict[str, Any]: ...
def apply_limit_choices_to_to_formfield(formfield: Field) -> None: ...
def fields_for_model(
model: type[Model],
fields: _Fields | None = None,
exclude: _Fields | None = None,
widgets: _Widgets | None = None,
formfield_callback: _FormFieldCallback | None = None,
localized_fields: _Fields | None = None,
labels: _Labels | None = None,
help_texts: _HelpTexts | None = None,
error_messages: _ErrorMessages | None = None,
field_classes: Mapping[str, type[Field]] | None = None,
*,
apply_limit_choices_to: bool = True,
form_declared_fields: _Fields | None = None,
) -> dict[str, Any]: ...
class ModelFormOptions(Generic[_M]):
model: type[_M]
fields: _Fields | None
exclude: _Fields | None
widgets: _Widgets | None
localized_fields: _Fields | None
labels: _Labels | None
help_texts: _HelpTexts | None
error_messages: _ErrorMessages | None
field_classes: dict[str, type[Field]] | None
formfield_callback: _FormFieldCallback | None
def __init__(self, options: type | None = None) -> None: ...
class ModelFormMetaclass(DeclarativeFieldsMetaclass): ...
class BaseModelForm(BaseForm, AltersData, Generic[_M]):
instance: _M
_meta: ModelFormOptions[_M]
def __init__(
self,
data: _DataT | None = None,
files: _FilesT | None = None,
auto_id: bool | str = "id_%s",
prefix: str | None = None,
initial: MutableMapping[str, Any] | None = None,
error_class: type[ErrorList] = ...,
label_suffix: str | None = None,
empty_permitted: bool = False,
instance: _M | None = None,
use_required_attribute: bool | None = None,
renderer: BaseRenderer | None = None,
) -> None: ...
def validate_unique(self) -> None: ...
def validate_constraints(self) -> None: ...
def save(self, commit: bool = True) -> _M: ...
def save_m2m(self) -> None: ...
class ModelForm(BaseModelForm[_M], metaclass=ModelFormMetaclass):
base_fields: ClassVar[dict[str, Field]]
declared_fields: ClassVar[dict[str, Field]]
def modelform_factory(
model: type[_M],
form: type[ModelForm[_M]] = ...,
fields: _Fields | None = None,
exclude: _Fields | None = None,
formfield_callback: _FormFieldCallback | None = None,
widgets: _Widgets | None = None,
localized_fields: _Fields | None = None,
labels: _Labels | None = None,
help_texts: _HelpTexts | None = None,
error_messages: _ErrorMessages | None = None,
field_classes: Mapping[str, type[Field]] | None = None,
) -> type[ModelForm[_M]]: ...
_ModelFormT = TypeVar("_ModelFormT", bound=ModelForm[Any], default=ModelForm[_M]) # ONLY use together with _M
class BaseModelFormSet(BaseFormSet[_ModelFormT], AltersData, Generic[_M, _ModelFormT]):
model: type[_M] | None
edit_only: bool
unique_fields: Collection[str]
queryset: QuerySet[_M] | None
initial_extra: Sequence[dict[str, Any]] | None
def __init__(
self,
data: _DataT | None = None,
files: _FilesT | None = None,
auto_id: str = "id_%s",
prefix: str | None = None,
queryset: QuerySet[_M] | None = None,
*,
initial: Sequence[dict[str, Any]] | None = None,
**kwargs: Any,
) -> None: ...
@override
def initial_form_count(self) -> int: ...
def get_queryset(self) -> QuerySet[_M]: ...
def save_new(self, form: _ModelFormT, commit: bool = True) -> _M: ...
def save_existing(self, form: _ModelFormT, obj: _M, commit: bool = True) -> _M: ...
def delete_existing(self, obj: _M, commit: bool = True) -> None: ...
saved_forms: list[_ModelFormT]
def save_m2m(self) -> None: ...
def save(self, commit: bool = True) -> list[_M]: ...
@override
def clean(self) -> None: ...
def validate_unique(self) -> None: ...
def get_unique_error_message(self, unique_check: Sequence[str]) -> str: ...
def get_date_error_message(self, date_check: tuple[str, Literal["date", "year", "month"], str, str]) -> str: ...
def get_form_error(self) -> str: ...
changed_objects: list[tuple[_M, list[str]]]
deleted_objects: list[_M]
def save_existing_objects(self, commit: bool = True) -> list[_M]: ...
new_objects: list[_M]
def save_new_objects(self, commit: bool = True) -> list[_M]: ...
@override
def add_fields(self, form: _ModelFormT, index: int | None) -> None: ...
def modelformset_factory(
model: type[_M],
form: type[_ModelFormT] = ...,
formfield_callback: _FormFieldCallback | None = None,
formset: type[BaseModelFormSet[Any, Any]] = ...,
extra: int = 1,
can_delete: bool = False,
can_order: bool = False,
max_num: int | None = None,
fields: _Fields | None = None,
exclude: _Fields | None = None,
widgets: _Widgets | None = None,
validate_max: bool = False,
localized_fields: _Fields | None = None,
labels: _Labels | None = None,
help_texts: _HelpTexts | None = None,
error_messages: _ErrorMessages | None = None,
min_num: int | None = None,
validate_min: bool = False,
field_classes: Mapping[str, type[Field]] | None = None,
absolute_max: int | None = None,
can_delete_extra: bool = True,
renderer: BaseRenderer | None = None,
edit_only: bool = False,
) -> type[BaseModelFormSet[_M, _ModelFormT]]: ...
class BaseInlineFormSet(BaseModelFormSet[_M, _ModelFormT], Generic[_M, _ParentM, _ModelFormT]):
instance: _ParentM
save_as_new: bool
unique_fields: Collection[str]
fk: ForeignKey[Any, Any] # set by inlineformset_set
def __init__(
self,
data: _DataT | None = None,
files: _FilesT | None = None,
instance: _ParentM | None = None,
save_as_new: bool = False,
prefix: str | None = None,
queryset: QuerySet[_M] | None = None,
**kwargs: Any,
) -> None: ...
@override
def initial_form_count(self) -> int: ...
@classmethod
@override
def get_default_prefix(cls) -> str: ...
@override
def save_new(self, form: _ModelFormT, commit: bool = True) -> _M: ...
@override
def add_fields(self, form: _ModelFormT, index: int | None) -> None: ...
@override
def get_unique_error_message(self, unique_check: Sequence[str]) -> str: ...
@overload
def _get_foreign_key(
parent_model: type[Model], model: type[Model], fk_name: str | None = None, can_fail: Literal[False] = ...
) -> ForeignKey[Any, Any]: ...
@overload
def _get_foreign_key(
parent_model: type[Model], model: type[Model], fk_name: str | None = None, can_fail: Literal[True] = ...
) -> ForeignKey[Any, Any] | None: ...
def inlineformset_factory(
parent_model: type[_ParentM],
model: type[_M],
form: type[_ModelFormT] = ...,
formset: type[BaseInlineFormSet[Any, Any, Any]] = ...,
fk_name: str | None = None,
fields: _Fields | None = None,
exclude: _Fields | None = None,
extra: int = 3,
can_order: bool = False,
can_delete: bool = True,
max_num: int | None = None,
formfield_callback: _FormFieldCallback | None = None,
widgets: _Widgets | None = None,
validate_max: bool = False,
localized_fields: Sequence[str] | None = None,
labels: _Labels | None = None,
help_texts: _HelpTexts | None = None,
error_messages: _ErrorMessages | None = None,
min_num: int | None = None,
validate_min: bool = False,
field_classes: Mapping[str, type[Field]] | None = None,
absolute_max: int | None = None,
can_delete_extra: bool = True,
renderer: BaseRenderer | None = None,
edit_only: bool = False,
) -> type[BaseInlineFormSet[_M, _ParentM, _ModelFormT]]: ...
class InlineForeignKeyField(Field):
widget: _ClassLevelWidgetT
parent_instance: Model
pk_field: bool
to_field: str | None
def __init__(
self,
parent_instance: Model,
*args: Any,
pk_field: bool = False,
to_field: str | None = None,
**kwargs: Any,
) -> None: ...
@override
def clean(self, value: Any) -> Model: ...
@override
def has_changed(self, initial: Any, data: Any) -> bool: ...
class ModelChoiceIteratorValue:
def __init__(self, value: Any, instance: Model) -> None: ...
class ModelChoiceIterator(BaseChoiceIterator, Generic[_M]):
field: ModelChoiceField[_M]
queryset: QuerySet[_M]
def __init__(self, field: ModelChoiceField[_M]) -> None: ...
@override
def __iter__(self) -> Iterator[tuple[ModelChoiceIteratorValue | str, str]]: ...
def __len__(self) -> int: ...
def __bool__(self) -> bool: ...
def choice(self, obj: _M) -> tuple[ModelChoiceIteratorValue, str]: ...
class ModelChoiceField(ChoiceField, Generic[_M]):
iterator: type[ModelChoiceIterator[_M]]
empty_label: _StrOrPromise | None
queryset: QuerySet[_M] | None
limit_choices_to: _AllLimitChoicesTo | None
to_field_name: str | None
def __init__(
self,
queryset: Manager[_M] | QuerySet[_M] | None,
*,
empty_label: _StrOrPromise | None = "",
required: bool = True,
widget: Widget | type[Widget] | None = None,
label: _StrOrPromise | None = None,
initial: Any | None = None,
help_text: _StrOrPromise = "",
to_field_name: str | None = None,
limit_choices_to: _AllLimitChoicesTo | None = None,
blank: bool = False,
**kwargs: Any,
) -> None: ...
def validate_no_null_characters(self, value: Any) -> None: ...
def get_limit_choices_to(self) -> _LimitChoicesTo: ...
@override
def __deepcopy__(self, memo: dict[int, Any]) -> Self: ...
def label_from_instance(self, obj: _M) -> str: ...
choices: _PropertyDescriptor[
_ChoicesInput | _ChoicesCallable | CallableChoiceIterator,
_ChoicesInput | CallableChoiceIterator | ModelChoiceIterator[_M],
]
@override
def prepare_value(self, value: Any) -> Any: ...
@override
def to_python(self, value: Any | None) -> _M | None: ...
@override
def validate(self, value: _M | None) -> None: ...
@override
def has_changed(self, initial: Model | int | str | UUID | None, data: int | str | None) -> bool: ...
class ModelMultipleChoiceField(ModelChoiceField[_M]):
widget: _ClassLevelWidgetT
hidden_widget: type[Widget]
def __init__(self, queryset: Manager[_M] | QuerySet[_M] | None, **kwargs: Any) -> None: ...
@override
def to_python(self, value: Any) -> list[_M]: ... # type: ignore[override]
@override
def clean(self, value: Any) -> QuerySet[_M]: ...
@override
def prepare_value(self, value: Any) -> Any: ...
@override
def has_changed(self, initial: Collection[Any] | None, data: Collection[Any] | None) -> bool: ... # type: ignore[override]
def modelform_defines_fields(form_class: type[ModelForm[Any]]) -> bool: ...
__all__ = (
"ALL_FIELDS",
"BaseInlineFormSet",
"BaseModelForm",
"BaseModelFormSet",
"ModelChoiceField",
"ModelForm",
"ModelMultipleChoiceField",
"fields_for_model",
"inlineformset_factory",
"model_to_dict",
"modelform_factory",
"modelformset_factory",
)
typeddjango-django-stubs-fa03b48/django-stubs/forms/renderers.pyi 0000664 0000000 0000000 00000002367 15260643574 0025317 0 ustar 00root root 0000000 0000000 from typing import Any
from django.forms.boundfield import BoundField
from django.http import HttpRequest
from django.template.backends.base import BaseEngine
from django.template.backends.django import DjangoTemplates as DjangoTemplatesR
from django.template.backends.jinja2 import Jinja2 as Jinja2R
from django.template.base import Template
from django.utils.functional import cached_property
from typing_extensions import override
def get_default_renderer() -> BaseRenderer: ...
class BaseRenderer:
form_template_name: str
formset_template_name: str
field_template_name: str
bound_field_class: type[BoundField] | None
def get_template(self, template_name: str) -> Any: ...
def render(self, template_name: str, context: dict[str, Any], request: HttpRequest | None = None) -> str: ...
class EngineMixin:
def get_template(self, template_name: str) -> Any: ...
@cached_property
def engine(self) -> BaseEngine: ...
class DjangoTemplates(EngineMixin, BaseRenderer):
backend: type[DjangoTemplatesR]
class Jinja2(EngineMixin, BaseRenderer):
@cached_property
def backend(self) -> type[Jinja2R]: ...
class TemplatesSetting(BaseRenderer):
@override
def get_template(self, template_name: str) -> Template | None: ...
typeddjango-django-stubs-fa03b48/django-stubs/forms/utils.pyi 0000664 0000000 0000000 00000006001 15260643574 0024453 0 ustar 00root root 0000000 0000000 from collections import UserList
from collections.abc import Mapping, Sequence
from datetime import datetime
from typing import Any, TypeAlias
from django.core.exceptions import ValidationError
from django.core.files.uploadedfile import UploadedFile
from django.forms.renderers import BaseRenderer
from django.utils.datastructures import MultiValueDict
from django.utils.functional import _StrOrPromise
from django.utils.safestring import SafeString
from typing_extensions import override
_DataT: TypeAlias = Mapping[str, Any] # noqa: PYI047
_FilesT: TypeAlias = MultiValueDict[str, UploadedFile[Any]] # noqa: PYI047
def pretty_name(name: str) -> str: ...
def flatatt(attrs: dict[str, Any]) -> SafeString: ...
class RenderableMixin:
def get_context(self) -> dict[str, Any]: ...
def render(
self,
template_name: str | None = None,
context: dict[str, Any] | None = None,
renderer: BaseRenderer | type[BaseRenderer] | None = None,
) -> SafeString: ...
# This is a lie, but this is how it is supposed to be used,
# in reallity it is `__str__ = __html__ = render`:
@override
def __str__(self) -> SafeString: ...
def __html__(self) -> SafeString: ...
class RenderableFieldMixin(RenderableMixin):
def as_field_group(self) -> SafeString: ...
def as_hidden(self) -> SafeString: ...
def as_widget(self) -> SafeString: ...
class RenderableFormMixin(RenderableMixin):
def as_p(self) -> SafeString: ...
def as_table(self) -> SafeString: ...
def as_ul(self) -> SafeString: ...
def as_div(self) -> SafeString: ...
class RenderableErrorMixin(RenderableMixin):
def as_json(self, escape_html: bool = False) -> str: ...
def as_text(self) -> SafeString: ...
def as_ul(self) -> SafeString: ...
class ErrorDict(dict[str, ErrorList], RenderableErrorMixin):
template_name: str
template_name_text: str
template_name_ul: str
renderer: BaseRenderer
def __init__(self, *args: Any, renderer: BaseRenderer | None = None, **kwargs: Any): ...
def as_data(self) -> dict[str, list[ValidationError]]: ...
def get_json_data(self, escape_html: bool = False) -> dict[str, Any]: ...
@override
def get_context(self) -> dict[str, Any]: ...
class ErrorList(UserList[ValidationError | _StrOrPromise], RenderableErrorMixin):
template_name: str
template_name_text: str
template_name_ul: str
error_class: str
renderer: BaseRenderer
def __init__(
self,
initlist: ErrorList | Sequence[str | Exception] | None = None,
error_class: str | None = None,
renderer: BaseRenderer | None = None,
field_id: str | None = None,
) -> None: ...
def as_data(self) -> list[ValidationError]: ...
@override
def copy(self) -> ErrorList: ...
def get_json_data(self, escape_html: bool = False) -> list[dict[str, str]]: ...
@override
def get_context(self) -> dict[str, Any]: ...
def from_current_timezone(value: datetime) -> datetime: ...
def to_current_timezone(value: datetime) -> datetime: ...
typeddjango-django-stubs-fa03b48/django-stubs/forms/widgets.pyi 0000664 0000000 0000000 00000033572 15260643574 0024776 0 ustar 00root root 0000000 0000000 import datetime
from collections.abc import Iterable, Iterator, Mapping, Sequence
from re import Pattern
from typing import Any, Literal, Protocol, Self, TypeAlias, type_check_only
from _typeshed import Self as MetaclassSelf # noqa: TID251
from django.core.files.base import File
from django.db.models.fields.files import FieldFile
from django.forms.renderers import BaseRenderer
from django.forms.utils import _DataT, _FilesT
from django.utils.choices import _Choices
from django.utils.datastructures import _ListOrTuple
from django.utils.safestring import SafeString
from typing_extensions import override
_OptAttrs: TypeAlias = dict[str, Any]
class MediaOrderConflictWarning(RuntimeWarning): ...
class MediaAsset:
element_template: str
def __init__(self, path: str, **attributes: Any) -> None: ...
@override
def __eq__(self, other: object) -> bool: ...
@override
def __hash__(self) -> int: ...
def __html__(self) -> SafeString: ...
def render(self, *, attrs: Any | None = None) -> SafeString: ...
@property
def path(self) -> str: ...
class Script(MediaAsset):
element_template: str
def __init__(self, src: str, **attributes: Any) -> None: ...
class Stylesheet(MediaAsset):
element_template: str
def __init__(self, href: str, **attributes: Any) -> None: ...
class Media:
def __init__(
self,
media: type | None = None,
css: dict[str, Sequence[str]] | None = None,
js: Sequence[str] | None = None,
) -> None: ...
def render(self, *, attrs: Any | None = None) -> SafeString: ...
def render_js(self, *, attrs: Any | None = None) -> list[SafeString]: ...
def render_css(self, *, attrs: Any | None = None) -> Iterable[SafeString]: ...
def absolute_path(self, path: str) -> str: ...
def __getitem__(self, name: str) -> Media: ...
@staticmethod
def merge(*lists: Iterable[Any]) -> list[Any]: ...
def __add__(self, other: Media) -> Media: ...
def __html__(self) -> SafeString: ...
class MediaDefiningClass(type):
def __new__(
mcs: type[MetaclassSelf],
name: str,
bases: tuple[type, ...],
attrs: dict[str, Any],
) -> MetaclassSelf: ...
class Widget(metaclass=MediaDefiningClass):
needs_multipart_form: bool
is_localized: bool
is_required: bool
supports_microseconds: bool
attrs: _OptAttrs
template_name: str | None
use_fieldset: bool
def __init__(self, attrs: _OptAttrs | None = None) -> None: ...
def __deepcopy__(self, memo: dict[int, Any]) -> Self: ...
@property
def is_hidden(self) -> bool: ...
@property
def media(self) -> Media: ...
def subwidgets(self, name: str, value: Any, attrs: _OptAttrs | None = None) -> Iterator[dict[str, Any]]: ...
# format_value subclasses can return any value usable in a template
def format_value(self, value: Any) -> Any: ...
def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ...
def render(
self, name: str, value: Any, attrs: _OptAttrs | None = None, renderer: BaseRenderer | None = None
) -> SafeString: ...
def build_attrs(self, base_attrs: _OptAttrs, extra_attrs: _OptAttrs | None = None) -> dict[str, Any]: ...
def value_from_datadict(self, data: _DataT, files: _FilesT, name: str) -> Any: ...
def value_omitted_from_data(self, data: _DataT, files: _FilesT, name: str) -> bool: ...
def id_for_label(self, id_: str) -> str: ...
def use_required_attribute(self, initial: Any) -> bool: ...
class Input(Widget):
input_type: str | None
template_name: str
@override
def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ...
class TextInput(Input):
input_type: str
template_name: str
class NumberInput(Input):
input_type: str
template_name: str
class EmailInput(Input):
input_type: str
template_name: str
class URLInput(Input):
input_type: str
template_name: str
class ColorInput(Input):
input_type: str
template_name: str
class SearchInput(Input):
input_type: str
template_name: str
class TelInput(Input):
input_type: str
template_name: str
class PasswordInput(Input):
render_value: bool
input_type: str
template_name: str
def __init__(self, attrs: _OptAttrs | None = None, render_value: bool = False) -> None: ...
@override
def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ...
class HiddenInput(Input):
input_type: str
template_name: str
class MultipleHiddenInput(HiddenInput):
template_name: str
@override
def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ...
@override
def value_from_datadict(self, data: _DataT, files: _FilesT, name: str) -> Any: ...
# ModelMultipleChoiceField causes format_value to return a list of PKs generally
@override
def format_value(self, value: Any) -> list[Any]: ...
class FileInput(Input):
allow_multiple_selected: bool
input_type: str
template_name: str
needs_multipart_form: bool
@override
def format_value(self, value: Any) -> None: ...
@override
def value_from_datadict(self, data: _DataT, files: _FilesT, name: str) -> Any: ...
@override
def value_omitted_from_data(self, data: _DataT, files: _FilesT, name: str) -> bool: ...
@override
def use_required_attribute(self, initial: Any) -> bool: ...
FILE_INPUT_CONTRADICTION: object
class ClearableFileInput(FileInput):
clear_checkbox_label: str
initial_text: str
input_text: str
template_name: str
checked: bool
def clear_checkbox_name(self, name: str) -> str: ...
def clear_checkbox_id(self, name: str) -> str: ...
def is_initial(self, value: File[Any] | str | None) -> bool: ...
# ClearableFileInput.format_value violates the Liskov substitution principle
@override
def format_value(self, value: Any) -> FieldFile | None: ... # type: ignore[override]
@override
def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ...
@override
def value_from_datadict(self, data: _DataT, files: _FilesT, name: str) -> Any: ...
@override
def value_omitted_from_data(self, data: _DataT, files: _FilesT, name: str) -> bool: ...
class Textarea(Widget):
template_name: str
def __init__(self, attrs: _OptAttrs | None = None) -> None: ...
class DateTimeBaseInput(TextInput):
format_key: str
format: str | None
supports_microseconds: bool
def __init__(self, attrs: _OptAttrs | None = None, format: str | None = None) -> None: ...
@override
def format_value(self, value: Any) -> str | None: ...
class DateInput(DateTimeBaseInput):
format_key: str
template_name: str
class DateTimeInput(DateTimeBaseInput):
format_key: str
template_name: str
class TimeInput(DateTimeBaseInput):
format_key: str
template_name: str
def boolean_check(v: Any) -> bool: ...
@type_check_only
class _CheckCallable(Protocol):
def __call__(self, value: Any, /) -> bool: ...
class CheckboxInput(Input):
check_test: _CheckCallable
input_type: str
template_name: str
def __init__(self, attrs: _OptAttrs | None = None, check_test: _CheckCallable | None = None) -> None: ...
@override
def format_value(self, value: Any) -> str | None: ...
@override
def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ...
@override
def value_from_datadict(self, data: _DataT, files: _FilesT, name: str) -> bool: ...
@override
def value_omitted_from_data(self, data: _DataT, files: _FilesT, name: str) -> bool: ...
class ChoiceWidget(Widget):
allow_multiple_selected: bool
input_type: str | None
template_name: str | None
option_template_name: str | None
add_id_index: bool
checked_attribute: Any
option_inherits_attrs: bool
choices: _Choices
def __init__(self, attrs: _OptAttrs | None = None, choices: _Choices = ()) -> None: ...
@override
def subwidgets(self, name: str, value: Any, attrs: _OptAttrs | None = None) -> Iterator[dict[str, Any]]: ...
def options(self, name: str, value: list[str], attrs: _OptAttrs | None = None) -> Iterator[dict[str, Any]]: ...
def optgroups(
self, name: str, value: list[str], attrs: _OptAttrs | None = None
) -> list[tuple[str | None, list[dict[str, Any]], int | None]]: ...
def create_option(
self,
name: str,
value: Any,
label: int | str,
selected: bool,
index: int,
subindex: int | None = None,
attrs: _OptAttrs | None = None,
) -> dict[str, Any]: ...
@override
def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ...
@override
def id_for_label(self, id_: str, index: str = "0") -> str: ...
@override
def value_from_datadict(self, data: _DataT, files: _FilesT, name: str) -> Any: ...
@override
def format_value(self, value: Any) -> list[str]: ...
class Select(ChoiceWidget):
input_type: str | None
template_name: str
option_template_name: str
add_id_index: bool
checked_attribute: Any
option_inherits_attrs: bool
@override
def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ...
@override
def use_required_attribute(self, initial: Any) -> bool: ...
class NullBooleanSelect(Select):
def __init__(self, attrs: _OptAttrs | None = None) -> None: ...
# NullBooleanSelect.format_value violates the Liskov substitution principle
@override
def format_value(self, value: Any) -> str: ... # type: ignore[override]
@override
def value_from_datadict(self, data: _DataT, files: _FilesT, name: str) -> bool | None: ...
class SelectMultiple(Select):
allow_multiple_selected: bool
@override
def value_from_datadict(self, data: _DataT, files: _FilesT, name: str) -> Any: ...
@override
def value_omitted_from_data(self, data: _DataT, files: _FilesT, name: str) -> bool: ...
class RadioSelect(ChoiceWidget):
input_type: str
template_name: str
option_template_name: str
@override
def id_for_label(self, id_: str, index: str | None = None) -> str: ...
class CheckboxSelectMultiple(RadioSelect):
input_type: str
template_name: str
option_template_name: str
@override
def use_required_attribute(self, initial: Any) -> bool: ...
@override
def value_omitted_from_data(self, data: _DataT, files: _FilesT, name: str) -> bool: ...
class MultiWidget(Widget):
template_name: str
widgets: Sequence[Widget]
def __init__(
self,
widgets: dict[str, Widget | type[Widget]] | Sequence[Widget | type[Widget]],
attrs: _OptAttrs | None = None,
) -> None: ...
@property
@override
def is_hidden(self) -> bool: ...
@override
def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ...
@override
def id_for_label(self, id_: str) -> str: ...
@override
def value_from_datadict(self, data: _DataT, files: _FilesT, name: str) -> list[Any]: ...
@override
def value_omitted_from_data(self, data: _DataT, files: _FilesT, name: str) -> bool: ...
def decompress(self, value: Any) -> Any | None: ...
@property
@override
def needs_multipart_form(self) -> bool: ... # type: ignore[override]
class SplitDateTimeWidget(MultiWidget):
supports_microseconds: bool
template_name: str
widgets: tuple[DateInput, TimeInput]
def __init__(
self,
attrs: _OptAttrs | None = None,
date_format: str | None = None,
time_format: str | None = None,
date_attrs: dict[str, str] | None = None,
time_attrs: dict[str, str] | None = None,
) -> None: ...
@override
def decompress(self, value: Any) -> tuple[datetime.date | None, datetime.time | None]: ...
class SplitHiddenDateTimeWidget(SplitDateTimeWidget):
template_name: str
def __init__(
self,
attrs: _OptAttrs | None = None,
date_format: str | None = None,
time_format: str | None = None,
date_attrs: dict[str, str] | None = None,
time_attrs: dict[str, str] | None = None,
) -> None: ...
class SelectDateWidget(Widget):
none_value: tuple[Literal[""], str]
month_field: str
day_field: str
year_field: str
template_name: str
input_type: str
select_widget: type[ChoiceWidget]
date_re: Pattern[str]
years: Iterable[int | str]
months: Mapping[int, str]
year_none_value: tuple[Literal[""], str]
month_none_value: tuple[Literal[""], str]
day_none_value: tuple[Literal[""], str]
def __init__(
self,
attrs: _OptAttrs | None = None,
years: Iterable[int | str] | None = None,
months: Mapping[int, str] | None = None,
empty_label: str | _ListOrTuple[str] | None = None,
) -> None: ...
@override
def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ...
@override
def format_value(self, value: Any) -> dict[str, str | int | None]: ...
@override
def id_for_label(self, id_: str) -> str: ...
@override
def value_from_datadict(self, data: _DataT, files: _FilesT, name: str) -> str | Any | None: ...
@override
def value_omitted_from_data(self, data: _DataT, files: _FilesT, name: str) -> bool: ...
__all__ = (
"CheckboxInput",
"CheckboxSelectMultiple",
"ClearableFileInput",
"ColorInput",
"DateInput",
"DateTimeInput",
"EmailInput",
"FileInput",
"HiddenInput",
"Media",
"MediaDefiningClass",
"MultiWidget",
"MultipleHiddenInput",
"NullBooleanSelect",
"NumberInput",
"PasswordInput",
"RadioSelect",
"Script",
"SearchInput",
"Select",
"SelectDateWidget",
"SelectMultiple",
"SplitDateTimeWidget",
"SplitHiddenDateTimeWidget",
"Stylesheet",
"TelInput",
"TextInput",
"Textarea",
"TimeInput",
"URLInput",
"Widget",
)
typeddjango-django-stubs-fa03b48/django-stubs/http/ 0000775 0000000 0000000 00000000000 15260643574 0022424 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/http/__init__.pyi 0000664 0000000 0000000 00000003653 15260643574 0024715 0 ustar 00root root 0000000 0000000 from .cookie import SimpleCookie as SimpleCookie
from .cookie import parse_cookie as parse_cookie
from .request import HttpHeaders as HttpHeaders
from .request import HttpRequest as HttpRequest
from .request import QueryDict as QueryDict
from .request import RawPostDataException as RawPostDataException
from .request import UnreadablePostError as UnreadablePostError
from .response import BadHeaderError as BadHeaderError
from .response import FileResponse as FileResponse
from .response import Http404 as Http404
from .response import HttpResponse as HttpResponse
from .response import HttpResponseBadRequest as HttpResponseBadRequest
from .response import HttpResponseBase as HttpResponseBase
from .response import HttpResponseForbidden as HttpResponseForbidden
from .response import HttpResponseGone as HttpResponseGone
from .response import HttpResponseNotAllowed as HttpResponseNotAllowed
from .response import HttpResponseNotFound as HttpResponseNotFound
from .response import HttpResponseNotModified as HttpResponseNotModified
from .response import HttpResponsePermanentRedirect as HttpResponsePermanentRedirect
from .response import HttpResponseRedirect as HttpResponseRedirect
from .response import HttpResponseServerError as HttpResponseServerError
from .response import JsonResponse as JsonResponse
from .response import StreamingHttpResponse as StreamingHttpResponse
__all__ = [
"BadHeaderError",
"FileResponse",
"Http404",
"HttpHeaders",
"HttpRequest",
"HttpResponse",
"HttpResponseBadRequest",
"HttpResponseBase",
"HttpResponseForbidden",
"HttpResponseGone",
"HttpResponseNotAllowed",
"HttpResponseNotFound",
"HttpResponseNotModified",
"HttpResponsePermanentRedirect",
"HttpResponseRedirect",
"HttpResponseServerError",
"JsonResponse",
"QueryDict",
"RawPostDataException",
"SimpleCookie",
"StreamingHttpResponse",
"UnreadablePostError",
"parse_cookie",
]
typeddjango-django-stubs-fa03b48/django-stubs/http/cookie.pyi 0000664 0000000 0000000 00000000154 15260643574 0024420 0 ustar 00root root 0000000 0000000 from http.cookies import SimpleCookie as SimpleCookie
def parse_cookie(cookie: str) -> dict[str, str]: ...
typeddjango-django-stubs-fa03b48/django-stubs/http/multipartparser.pyi 0000664 0000000 0000000 00000004323 15260643574 0026407 0 ustar 00root root 0000000 0000000 import re
from collections.abc import Iterator, Mapping
from typing import Any, ClassVar, Literal
from django.http.request import QueryDict, _PostDataProtocol
from django.utils.datastructures import ImmutableList, MultiValueDict
class MultiPartParserError(Exception): ...
class InputStreamExhausted(Exception): ...
RAW: Literal["raw"]
FILE: Literal["file"]
FIELD: Literal["field"]
FIELD_TYPES: frozenset[str]
class MultiPartParser:
boundary_re: ClassVar[re.Pattern[str]]
def __init__(
self,
META: Mapping[str, Any],
input_data: _PostDataProtocol,
upload_handlers: list[Any] | ImmutableList[Any],
encoding: str | None = ...,
) -> None: ...
def parse(self) -> tuple[QueryDict, MultiValueDict[Any, Any]]: ...
def handle_file_complete(self, old_field_name: str, counters: list[int]) -> None: ...
def sanitize_file_name(self, file_name: str) -> str | None: ...
def IE_sanitize(self, file_name: str) -> str | None: ...
class LazyStream:
length: int | None
position: int
def __init__(self, producer: BoundaryIter | ChunkIter, length: int | None = ...) -> None: ...
def tell(self) -> int: ...
def read(self, size: int | None = ...) -> bytes: ...
def __next__(self) -> bytes: ...
def close(self) -> None: ...
def __iter__(self) -> LazyStream: ...
def unget(self, bytes: bytes) -> None: ...
class ChunkIter:
flo: _PostDataProtocol
chunk_size: int
def __init__(self, flo: _PostDataProtocol, chunk_size: int = ...) -> None: ...
def __next__(self) -> bytes: ...
def __iter__(self) -> ChunkIter: ...
class InterBoundaryIter:
def __init__(self, stream: LazyStream, boundary: bytes) -> None: ...
def __iter__(self) -> InterBoundaryIter: ...
def __next__(self) -> LazyStream: ...
class BoundaryIter:
def __init__(self, stream: LazyStream, boundary: bytes) -> None: ...
def __iter__(self) -> BoundaryIter: ...
def __next__(self) -> bytes: ...
class Parser:
def __init__(self, stream: LazyStream, boundary: bytes) -> None: ...
def __iter__(self) -> Iterator[tuple[str, dict[str, tuple[str, dict[str, bytes | str]]], LazyStream]]: ...
__all__ = ("InputStreamExhausted", "MultiPartParser", "MultiPartParserError")
typeddjango-django-stubs-fa03b48/django-stubs/http/request.pyi 0000664 0000000 0000000 00000024457 15260643574 0024653 0 ustar 00root root 0000000 0000000 import datetime
from collections.abc import Awaitable, Callable, Iterable, Iterator, Mapping, Sequence
from re import Pattern
from typing import Any, BinaryIO, Literal, NoReturn, Protocol, Self, TypeAlias, overload, type_check_only
from django.contrib.auth.models import _AnyUser
from django.contrib.sessions.backends.base import SessionBase
from django.contrib.sites.models import Site
from django.core.files import uploadedfile, uploadhandler
from django.http.multipartparser import MultiPartParser
from django.urls import ResolverMatch
from django.utils.datastructures import CaseInsensitiveMapping, ImmutableList, MultiValueDict
from django.utils.functional import cached_property
from django.views.debug import ExceptionReporter, SafeExceptionReporterFilter
from typing_extensions import TypeVar, override
RAISE_ERROR: object
host_validation_re: Pattern[str]
@type_check_only
class _PostDataProtocol(Protocol):
def read(self, num_bytes: int | None = ..., /) -> bytes: ...
def readline(self, limit: int | None = ..., /) -> bytes: ...
def readlines(self) -> list[bytes]: ...
def __iter__(self) -> Iterator[bytes]: ...
class UnreadablePostError(OSError): ...
class RawPostDataException(Exception): ...
_UploadHandlerList: TypeAlias = list[uploadhandler.FileUploadHandler] | ImmutableList[uploadhandler.FileUploadHandler]
class HttpHeaders(CaseInsensitiveMapping[str]):
HTTP_PREFIX: str
UNPREFIXED_HEADERS: set[str]
def __init__(self, environ: Mapping[str, Any]) -> None: ...
@classmethod
def parse_header_name(cls, header: str) -> str | None: ...
@classmethod
def to_wsgi_name(cls, header: str) -> str: ...
@classmethod
def to_asgi_name(cls, header: str) -> str: ...
@classmethod
def to_wsgi_names(cls, headers: Mapping[str, Any]) -> dict[str, Any]: ...
@classmethod
def to_asgi_names(cls, headers: Mapping[str, Any]) -> dict[str, Any]: ...
class HttpRequest:
GET: _ImmutableQueryDict
POST: _ImmutableQueryDict
COOKIES: dict[str, str]
META: dict[str, Any]
FILES: MultiValueDict[str, uploadedfile.UploadedFile[Any]]
path: str
path_info: str
method: str | None
resolver_match: ResolverMatch | None
content_type: str | None
content_params: dict[str, str] | None
_body: bytes
_stream: BinaryIO
# Attributes set by middleware:
# https://docs.djangoproject.com/en/stable/ref/request-response/#attributes-set-by-middleware
# django.contrib.sessions.middleware.SessionMiddleware:
session: SessionBase
# django.contrib.sites.middleware.CurrentSiteMiddleware:
site: Site
# django.contrib.auth.middleware.AuthenticationMiddleware:
user: _AnyUser
auser: Callable[[], Awaitable[_AnyUser]]
# django.middleware.locale.LocaleMiddleware:
LANGUAGE_CODE: str
# Attributes set by application code:
# https://docs.djangoproject.com/en/stable/ref/request-response/#attributes-set-by-application-code
current_app: str
urlconf: str | None
exception_reporter_filter: SafeExceptionReporterFilter
exception_reporter_class: type[ExceptionReporter]
def __init__(self) -> None: ...
def get_host(self) -> str: ...
def get_port(self) -> str: ...
def get_full_path(self, force_append_slash: bool = False) -> str: ...
def get_full_path_info(self, force_append_slash: bool = False) -> str: ...
def get_signed_cookie(
self, key: str, default: Any = ..., salt: str = ..., max_age: int | datetime.timedelta | None = ...
) -> str | None: ...
def build_absolute_uri(self, location: str | None = ...) -> str: ...
@property
def scheme(self) -> str | None: ...
def is_secure(self) -> bool: ...
@property
def encoding(self) -> str | None: ...
@encoding.setter
def encoding(self, val: str) -> None: ...
@property
def upload_handlers(self) -> _UploadHandlerList: ...
@upload_handlers.setter
def upload_handlers(self, upload_handlers: _UploadHandlerList) -> None: ...
@property
def multipart_parser_class(self) -> MultiPartParser: ...
@multipart_parser_class.setter
def multipart_parser_class(self, multipart_parser_class: MultiPartParser) -> None: ...
@cached_property
def accepted_types(self) -> list[MediaType]: ...
@cached_property
def accepted_types_by_precedence(self) -> list[MediaType]: ...
def accepted_type(self, media_type: str) -> MediaType | None: ...
def get_preferred_type(self, media_types: Sequence[str]) -> str | None: ...
def parse_file_upload(
self, META: Mapping[str, Any], post_data: _PostDataProtocol
) -> tuple[QueryDict, MultiValueDict[str, uploadedfile.UploadedFile[Any]]]: ...
@cached_property
def headers(self) -> HttpHeaders: ...
@property
def body(self) -> bytes: ...
def _load_post_and_files(self) -> None: ...
def accepts(self, media_type: str) -> bool: ...
def close(self) -> None: ...
# File-like and iterator interface, a minimal subset of BytesIO.
def read(self, n: int | None = -1, /) -> bytes: ...
def readline(self, limit: int | None = -1, /) -> bytes: ...
def __iter__(self) -> Iterator[bytes]: ...
def readlines(self) -> list[bytes]: ...
_Z = TypeVar("_Z")
# mypy uses mro to pick between `__init__` and `__new__` for return types and will prefers `__init__` over `__new__`
# in case of a tie. So to be able to specialize type via `__new__` (which is required for pyright to work),
# we need to use an intermediary class for the `__init__` method.
# See https://github.com/python/mypy/issues/17251
# https://github.com/python/mypy/blob/c724a6a806655f94d0c705a7121e3d671eced96d/mypy/typeops.py#L148-L149
@type_check_only
class _QueryDictMixin:
def __init__(
self,
query_string: str | bytes | None = ...,
mutable: bool = ...,
encoding: str | None = ...,
) -> None: ...
class QueryDict(_QueryDictMixin, MultiValueDict[str, str]):
_mutable: bool
# We can make it mutable only by specifying `mutable=True`.
# It can be done a) with kwarg and b) with pos. arg. `overload` has
# some problems with args/kwargs + Literal, so two signatures are required.
# ('querystring', True, [...])
@overload
def __new__(
cls,
query_string: str | bytes | None,
mutable: Literal[True],
encoding: str | None = ...,
) -> QueryDict: ...
# ([querystring='string',] mutable=True, [...])
@overload
def __new__(
cls,
*,
query_string: str | bytes | None = ...,
mutable: Literal[True],
encoding: str | None = ...,
) -> QueryDict: ...
# Otherwise it's immutable
@overload
def __new__(
cls,
query_string: str | bytes | None = ...,
mutable: Literal[False] = ...,
encoding: str | None = ...,
) -> _ImmutableQueryDict: ...
@classmethod
@override
def fromkeys( # type: ignore[override]
cls,
iterable: Iterable[bytes | str],
value: str | bytes = ...,
mutable: bool = ...,
encoding: str | None = ...,
) -> Self: ...
@property
def encoding(self) -> str: ...
@encoding.setter
def encoding(self, value: str) -> None: ...
@override
def __setitem__(self, key: str | bytes, value: str | bytes) -> None: ...
@override
def __delitem__(self, key: str | bytes) -> None: ...
@override
def setlist(self, key: str | bytes, list_: Iterable[str | bytes]) -> None: ...
@override
def setlistdefault(self, key: str | bytes, default_list: list[str] | None = ...) -> list[str]: ...
@override
def appendlist(self, key: str | bytes, value: str | bytes) -> None: ...
# Fake signature (because *args is used in source, but it fails with more that 1 argument)
@overload # type:ignore[override]
def pop(self, key: str | bytes, /) -> list[str]: ...
@overload
@override
def pop(self, key: str | bytes, default: str | _Z = ..., /) -> list[str] | _Z: ...
@override
def popitem(self) -> tuple[str, list[str]]: ... # type:ignore[override]
@override
def clear(self) -> None: ...
@override
def setdefault(self, key: str | bytes, default: str | bytes | None = ...) -> str: ...
@override
def copy(self) -> QueryDict: ...
def urlencode(self, safe: str | None = ...) -> str: ...
@type_check_only
class _ImmutableQueryDict(QueryDict):
_mutable: Literal[False]
@override
def __setitem__(self, key: str | bytes, value: str | bytes) -> NoReturn: ...
@override
def __delitem__(self, key: str | bytes) -> NoReturn: ...
@override
def setlist(self, key: str | bytes, list_: Iterable[str | bytes]) -> NoReturn: ...
@override
def setlistdefault(self, key: str | bytes, default_list: list[str] | None = ...) -> NoReturn: ...
@override
def appendlist(self, key: str | bytes, value: str | bytes) -> NoReturn: ...
# Fake signature (because *args is used in source, but it fails with more that 1 argument)
@overload
@override
def pop(self, key: str | bytes, /) -> NoReturn: ...
@overload
@override
def pop(self, key: str | bytes, default: str | _Z = ..., /) -> NoReturn: ...
@override
def popitem(self) -> NoReturn: ...
@override
def clear(self) -> NoReturn: ...
@override
def setdefault(self, key: str | bytes, default: str | bytes | None = ...) -> NoReturn: ...
@override
def copy(self) -> QueryDict: ... # type: ignore[override]
@override
def urlencode(self, safe: str | None = ...) -> str: ...
# Fakes for convenience (for `request.GET` and `request.POST`). If dict
# was created by Django, there is no chance to hit `List[object]` (empty list)
# edge case.
@override
def __getitem__(self, key: str) -> str: ...
@override
def dict(self) -> dict[str, str]: ... # type: ignore[override]
class MediaType:
main_type: str
sub_type: str
params: dict[str, bytes]
def __init__(self, media_type_raw_line: str) -> None: ...
def match(self, other: str) -> bool: ...
@cached_property
def quality(self) -> float: ...
@property
def specificity(self) -> int: ...
@cached_property
def range_params(self) -> dict[str, bytes]: ...
@overload
def bytes_to_text(s: None, encoding: str) -> None: ...
@overload
def bytes_to_text(s: bytes | str, encoding: str) -> str: ...
def split_domain_port(host: str) -> tuple[str, str]: ...
def validate_host(host: str, allowed_hosts: Iterable[str]) -> bool: ...
typeddjango-django-stubs-fa03b48/django-stubs/http/response.pyi 0000664 0000000 0000000 00000014354 15260643574 0025014 0 ustar 00root root 0000000 0000000 import datetime
from collections.abc import AsyncIterable, AsyncIterator, Iterable, Iterator, Mapping
from http.cookies import SimpleCookie
from io import BytesIO
from json import JSONEncoder
from typing import Any, Literal, NoReturn, overload, type_check_only
from django.utils.datastructures import CaseInsensitiveMapping, _PropertyDescriptor
from django.utils.functional import _StrOrPromise, cached_property
from typing_extensions import TypeVar, override
class BadHeaderError(ValueError): ...
_Z = TypeVar("_Z")
class ResponseHeaders(CaseInsensitiveMapping[str]):
def __init__(self, data: Mapping[str, str]) -> None: ...
def _convert_to_charset(self, value: bytes | str | int, charset: str, mime_encode: bool = ...) -> str: ...
def __delitem__(self, key: str) -> None: ...
def __setitem__(self, key: str, value: str | bytes | int) -> None: ...
def pop(self, key: str, default: _Z = ...) -> _Z | tuple[str, str]: ...
def setdefault(self, key: str, value: str | bytes | int) -> None: ...
class HttpResponseBase:
status_code: int
streaming: bool
cookies: SimpleCookie
closed: bool
headers: ResponseHeaders
def __init__(
self,
content_type: str | None = ...,
status: int | None = ...,
reason: str | None = ...,
charset: str | None = ...,
headers: Mapping[str, str] | None = ...,
) -> None: ...
@property
def reason_phrase(self) -> str: ...
@reason_phrase.setter
def reason_phrase(self, value: str) -> None: ...
@property
def charset(self) -> str: ...
@charset.setter
def charset(self, value: str) -> None: ...
def serialize_headers(self) -> bytes: ...
__bytes__ = serialize_headers
def __setitem__(self, header: str, value: str | bytes | int) -> None: ...
def __delitem__(self, header: str) -> None: ...
def __getitem__(self, header: str) -> str: ...
def has_header(self, header: str) -> bool: ...
def __contains__(self, header: str) -> bool: ...
def items(self) -> Iterable[tuple[str, str]]: ...
@overload
def get(self, header: str, alternate: str) -> str: ...
@overload
def get(self, header: str, alternate: None = None) -> str | None: ...
def set_cookie(
self,
key: str,
value: str = ...,
max_age: int | datetime.timedelta | None = ...,
expires: str | datetime.datetime | None = ...,
path: str = ...,
domain: str | None = ...,
secure: bool = ...,
httponly: bool = ...,
samesite: Literal["Lax", "Strict", "None", False] | None = ...,
) -> None: ...
def setdefault(self, key: str, value: str) -> None: ...
def set_signed_cookie(self, key: str, value: str, salt: str = ..., **kwargs: Any) -> None: ...
def delete_cookie(
self,
key: str,
path: str = ...,
domain: str | None = ...,
samesite: Literal["Lax", "Strict", "None", False] | None = ...,
) -> None: ...
def make_bytes(self, value: object) -> bytes: ...
def close(self) -> None: ...
def write(self, content: str | bytes) -> None: ...
def flush(self) -> None: ...
def tell(self) -> int: ...
def readable(self) -> bool: ...
def seekable(self) -> bool: ...
def writable(self) -> bool: ...
def writelines(self, lines: Iterable[object]) -> None: ...
# Fake methods that are implemented by all subclasses
@type_check_only
def __iter__(self) -> Iterator[bytes]: ...
@type_check_only
def getvalue(self) -> bytes: ...
class HttpResponse(HttpResponseBase, Iterable[bytes]):
content = _PropertyDescriptor[object, bytes]()
csrf_cookie_set: bool
sameorigin: bool
test_server_port: str
test_was_secure_request: bool
xframe_options_exempt: bool
def __init__(self, content: object = ..., *args: Any, **kwargs: Any) -> None: ...
def serialize(self) -> bytes: ...
__bytes__ = serialize
@override
def __iter__(self) -> Iterator[bytes]: ...
@override
def getvalue(self) -> bytes: ...
@cached_property
def text(self) -> str: ...
class StreamingHttpResponse(HttpResponseBase, Iterable[bytes], AsyncIterable[bytes]):
is_async: bool
streaming_content = _PropertyDescriptor[
Iterable[object] | AsyncIterable[object], Iterator[bytes] | AsyncIterator[bytes]
]()
def __init__(
self, streaming_content: Iterable[object] | AsyncIterable[object] = ..., *args: Any, **kwargs: Any
) -> None: ...
@override
def __iter__(self) -> Iterator[bytes]: ...
@override
def __aiter__(self) -> AsyncIterator[bytes]: ...
@override
def getvalue(self) -> bytes: ...
@property
def content(self) -> NoReturn: ...
@property
def text(self) -> NoReturn: ...
class FileResponse(StreamingHttpResponse):
file_to_stream: BytesIO | None
block_size: int
as_attachment: bool
filename: str
def __init__(self, *args: Any, as_attachment: bool = ..., filename: str = ..., **kwargs: Any) -> None: ...
def set_headers(self, filelike: BytesIO) -> None: ...
class HttpResponseRedirectBase(HttpResponse):
allowed_schemes: list[str]
def __init__(
self,
redirect_to: _StrOrPromise,
preserve_request: bool = False,
*args: Any,
max_length: int = ...,
**kwargs: Any,
) -> None: ...
@property
def url(self) -> str: ...
class HttpResponseRedirect(HttpResponseRedirectBase):
status_code_preserve_request: int
class HttpResponsePermanentRedirect(HttpResponseRedirectBase):
status_code_preserve_request: int
class HttpResponseNotModified(HttpResponse):
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
class HttpResponseBadRequest(HttpResponse): ...
class HttpResponseNotFound(HttpResponse): ...
class HttpResponseForbidden(HttpResponse): ...
class HttpResponseNotAllowed(HttpResponse):
def __init__(self, permitted_methods: Iterable[str], *args: Any, **kwargs: Any) -> None: ...
class HttpResponseGone(HttpResponse): ...
class HttpResponseServerError(HttpResponse): ...
class Http404(Exception): ...
class JsonResponse(HttpResponse):
def __init__(
self,
data: Any,
encoder: type[JSONEncoder] = ...,
safe: bool = ...,
json_dumps_params: dict[str, Any] | None = ...,
**kwargs: Any,
) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/middleware/ 0000775 0000000 0000000 00000000000 15260643574 0023562 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/middleware/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0026032 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/middleware/cache.pyi 0000664 0000000 0000000 00000002115 15260643574 0025347 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.cache import BaseCache
from django.http.request import HttpRequest
from django.http.response import HttpResponse, HttpResponseBase
from django.utils.deprecation import MiddlewareMixin, _AnyGetResponseCallable
class UpdateCacheMiddleware(MiddlewareMixin):
cache_timeout: float
key_prefix: str
cache_alias: str
@property
def cache(self) -> BaseCache: ...
def process_response(self, request: HttpRequest, response: HttpResponseBase | str) -> HttpResponseBase | str: ...
class FetchFromCacheMiddleware(MiddlewareMixin):
key_prefix: str
cache_alias: str
@property
def cache(self) -> BaseCache: ...
def process_request(self, request: HttpRequest) -> HttpResponse | None: ...
class CacheMiddleware(UpdateCacheMiddleware, FetchFromCacheMiddleware):
key_prefix: str
cache_alias: str
cache_timeout: float
def __init__(
self,
get_response: _AnyGetResponseCallable,
cache_timeout: float | None = ...,
page_timeout: float | None = ...,
**kwargs: Any,
) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/middleware/clickjacking.pyi 0000664 0000000 0000000 00000000603 15260643574 0026720 0 ustar 00root root 0000000 0000000 from django.http.request import HttpRequest
from django.http.response import HttpResponse
from django.utils.deprecation import MiddlewareMixin
class XFrameOptionsMiddleware(MiddlewareMixin):
def process_response(self, request: HttpRequest, response: HttpResponse) -> HttpResponse: ...
def get_xframe_options_value(self, request: HttpRequest, response: HttpResponse) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/middleware/common.pyi 0000664 0000000 0000000 00000002215 15260643574 0025575 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar
from django.http.request import HttpRequest
from django.http.response import HttpResponseBase, HttpResponsePermanentRedirect, HttpResponseRedirectBase
from django.utils.deprecation import MiddlewareMixin
class CommonMiddleware(MiddlewareMixin):
response_redirect_class: ClassVar[type[HttpResponseRedirectBase]]
def process_request(self, request: HttpRequest) -> HttpResponsePermanentRedirect | None: ...
def should_redirect_with_slash(self, request: HttpRequest) -> bool: ...
def get_full_path_with_slash(self, request: HttpRequest) -> str: ...
def process_response(self, request: HttpRequest, response: HttpResponseBase) -> HttpResponseBase: ...
class BrokenLinkEmailsMiddleware(MiddlewareMixin):
using: ClassVar[str | None]
def process_response(self, request: HttpRequest, response: HttpResponseBase) -> HttpResponseBase: ...
def send_mail(self, subject: str, message: str, *args: Any, **kwargs: Any) -> None: ...
def is_internal_request(self, domain: str, referer: str) -> bool: ...
def is_ignorable_request(self, request: HttpRequest, uri: str, domain: str, referer: str) -> bool: ...
typeddjango-django-stubs-fa03b48/django-stubs/middleware/csp.pyi 0000664 0000000 0000000 00000000720 15260643574 0025071 0 ustar 00root root 0000000 0000000 from django.http import HttpRequest, HttpResponse
from django.utils.csp import CSP as CSP
from django.utils.csp import LazyNonce
from django.utils.deprecation import MiddlewareMixin
def get_nonce(request: HttpRequest) -> LazyNonce | None: ...
class ContentSecurityPolicyMiddleware(MiddlewareMixin):
def process_request(self, request: HttpRequest) -> None: ...
def process_response(self, request: HttpRequest, response: HttpResponse) -> HttpResponse: ...
typeddjango-django-stubs-fa03b48/django-stubs/middleware/csrf.pyi 0000664 0000000 0000000 00000003427 15260643574 0025250 0 ustar 00root root 0000000 0000000 from collections import defaultdict
from collections.abc import Callable
from logging import Logger
from re import Pattern
from typing import Any
from django.http.request import HttpRequest
from django.http.response import HttpResponseBase, HttpResponseForbidden
from django.utils.deprecation import MiddlewareMixin
from django.utils.functional import cached_property
logger: Logger
invalid_token_chars_re: Pattern[str]
REASON_BAD_ORIGIN: str
REASON_NO_REFERER: str
REASON_BAD_REFERER: str
REASON_NO_CSRF_COOKIE: str
REASON_CSRF_TOKEN_MISSING: str
REASON_MALFORMED_REFERER: str
REASON_INSECURE_REFERER: str
REASON_INCORRECT_LENGTH: str
REASON_INVALID_CHARACTERS: str
CSRF_SECRET_LENGTH: int
CSRF_TOKEN_LENGTH: Any
CSRF_ALLOWED_CHARS: Any
CSRF_SESSION_KEY: str
def get_token(request: HttpRequest) -> str: ...
def rotate_token(request: HttpRequest) -> None: ...
class InvalidTokenFormat(Exception):
reason: str
def __init__(self, reason: str) -> None: ...
class RejectRequest(Exception):
reason: str
def __init__(self, reason: str) -> None: ...
class CsrfViewMiddleware(MiddlewareMixin):
@cached_property
def csrf_trusted_origins_hosts(self) -> list[str]: ...
@cached_property
def allowed_origins_exact(self) -> set[str]: ...
@cached_property
def allowed_origin_subdomains(self) -> defaultdict[str, list[str]]: ...
def process_request(self, request: HttpRequest) -> None: ...
def process_view(
self,
request: HttpRequest,
callback: Callable[..., HttpResponseBase],
callback_args: tuple[Any, ...],
callback_kwargs: dict[str, Any],
) -> HttpResponseForbidden | None: ...
def process_response(self, request: HttpRequest, response: HttpResponseBase) -> HttpResponseBase: ...
def _get_new_csrf_string() -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/middleware/gzip.pyi 0000664 0000000 0000000 00000000634 15260643574 0025261 0 ustar 00root root 0000000 0000000 from re import Pattern
from typing import ClassVar
from django.http.request import HttpRequest
from django.http.response import HttpResponseBase
from django.utils.deprecation import MiddlewareMixin
re_accepts_gzip: Pattern[str]
class GZipMiddleware(MiddlewareMixin):
max_random_bytes: ClassVar[int]
def process_response(self, request: HttpRequest, response: HttpResponseBase) -> HttpResponseBase: ...
typeddjango-django-stubs-fa03b48/django-stubs/middleware/http.pyi 0000664 0000000 0000000 00000000561 15260643574 0025266 0 ustar 00root root 0000000 0000000 from django.http.request import HttpRequest
from django.http.response import HttpResponseBase
from django.utils.deprecation import MiddlewareMixin
class ConditionalGetMiddleware(MiddlewareMixin):
def process_response(self, request: HttpRequest, response: HttpResponseBase) -> HttpResponseBase: ...
def needs_etag(self, response: HttpResponseBase) -> bool: ...
typeddjango-django-stubs-fa03b48/django-stubs/middleware/locale.pyi 0000664 0000000 0000000 00000000745 15260643574 0025552 0 ustar 00root root 0000000 0000000 from typing import ClassVar
from django.http.request import HttpRequest
from django.http.response import HttpResponseBase, HttpResponseRedirectBase
from django.utils.deprecation import MiddlewareMixin
class LocaleMiddleware(MiddlewareMixin):
response_redirect_class: ClassVar[type[HttpResponseRedirectBase]]
def process_request(self, request: HttpRequest) -> None: ...
def process_response(self, request: HttpRequest, response: HttpResponseBase) -> HttpResponseBase: ...
typeddjango-django-stubs-fa03b48/django-stubs/middleware/security.pyi 0000664 0000000 0000000 00000001160 15260643574 0026152 0 ustar 00root root 0000000 0000000 from typing import Any
from django.http.request import HttpRequest
from django.http.response import HttpResponse, HttpResponsePermanentRedirect
from django.utils.deprecation import MiddlewareMixin
class SecurityMiddleware(MiddlewareMixin):
sts_seconds: int
sts_include_subdomains: bool
sts_preload: bool
content_type_nosniff: bool
redirect: bool
redirect_host: str | None
redirect_exempt: list[Any]
def process_request(self, request: HttpRequest) -> HttpResponsePermanentRedirect | None: ...
def process_response(self, request: HttpRequest, response: HttpResponse) -> HttpResponse: ...
typeddjango-django-stubs-fa03b48/django-stubs/py.typed 0000664 0000000 0000000 00000000000 15260643574 0023132 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/shortcuts.pyi 0000664 0000000 0000000 00000003762 15260643574 0024236 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Mapping, Sequence
from typing import Any, Literal, Protocol, overload, type_check_only
from django.db.models import Manager, QuerySet
from django.db.models.base import Model
from django.http import HttpRequest
from django.http.response import HttpResponse, HttpResponsePermanentRedirect, HttpResponseRedirect
from django.utils.functional import _StrOrPromise
from typing_extensions import TypeVar
def render(
request: HttpRequest | None,
template_name: str | Sequence[str],
context: Mapping[str, Any] | None = ...,
content_type: str | None = ...,
status: int | None = ...,
using: str | None = ...,
) -> HttpResponse: ...
@type_check_only
class SupportsGetAbsoluteUrl(Protocol):
def get_absolute_url(self) -> str: ...
@overload
def redirect(
to: Callable[..., Any] | str | SupportsGetAbsoluteUrl,
*args: Any,
permanent: Literal[True],
preserve_request: bool = False,
max_length: int = ...,
**kwargs: Any,
) -> HttpResponsePermanentRedirect: ...
@overload
def redirect(
to: Callable[..., Any] | str | SupportsGetAbsoluteUrl,
*args: Any,
permanent: Literal[False] = False,
preserve_request: bool = False,
**kwargs: Any,
) -> HttpResponseRedirect: ...
@overload
def redirect(
to: Callable[..., Any] | str | SupportsGetAbsoluteUrl, *args: Any, permanent: bool, **kwargs: Any
) -> HttpResponseRedirect | HttpResponsePermanentRedirect: ...
_T = TypeVar("_T", bound=Model)
def get_object_or_404(klass: type[_T] | Manager[_T] | QuerySet[_T], *args: Any, **kwargs: Any) -> _T: ...
async def aget_object_or_404(klass: type[_T] | Manager[_T] | QuerySet[_T], *args: Any, **kwargs: Any) -> _T: ...
def get_list_or_404(klass: type[_T] | Manager[_T] | QuerySet[_T], *args: Any, **kwargs: Any) -> list[_T]: ...
async def aget_list_or_404(klass: type[_T] | Manager[_T] | QuerySet[_T], *args: Any, **kwargs: Any) -> list[_T]: ...
def resolve_url(to: Callable[..., Any] | Model | _StrOrPromise, *args: Any, **kwargs: Any) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/tasks/ 0000775 0000000 0000000 00000000000 15260643574 0022572 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/tasks/__init__.pyi 0000664 0000000 0000000 00000001625 15260643574 0025060 0 ustar 00root root 0000000 0000000 from django.utils.connection import BaseConnectionHandler
from .backends.base import BaseTaskBackend
from .base import DEFAULT_TASK_BACKEND_ALIAS as DEFAULT_TASK_BACKEND_ALIAS
from .base import DEFAULT_TASK_QUEUE_NAME as DEFAULT_TASK_QUEUE_NAME
from .base import Task as Task
from .base import TaskContext as TaskContext
from .base import TaskResult as TaskResult
from .base import TaskResultStatus as TaskResultStatus
from .base import task as task
__all__ = [
"DEFAULT_TASK_BACKEND_ALIAS",
"DEFAULT_TASK_QUEUE_NAME",
"Task",
"TaskContext",
"TaskResult",
"TaskResultStatus",
"default_task_backend",
"task",
"task_backends",
]
class TaskBackendHandler(BaseConnectionHandler[BaseTaskBackend]): ...
task_backends: TaskBackendHandler
# Actually ConnectionProxy, but quacks exactly like BaseTaskBackend, it's not worth distinguishing the two.
default_task_backend: BaseTaskBackend
typeddjango-django-stubs-fa03b48/django-stubs/tasks/backends/ 0000775 0000000 0000000 00000000000 15260643574 0024344 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/tasks/backends/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0026614 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/tasks/backends/base.pyi 0000664 0000000 0000000 00000002020 15260643574 0025773 0 ustar 00root root 0000000 0000000 from abc import ABCMeta, abstractmethod
from typing import Any
from django.tasks.base import Task, TaskResult
from typing_extensions import ParamSpec, TypeVar
_P = ParamSpec("_P")
_R = TypeVar("_R")
class BaseTaskBackend(metaclass=ABCMeta):
task_class: type[Task[..., Any]]
supports_defer: bool
supports_async_task: bool
supports_get_result: bool
supports_priority: bool
alias: str
queues: set[str]
options: dict[str, Any]
def __init__(self, alias: str, params: dict[str, Any]) -> None: ...
def validate_task(self, task: Task[..., Any]) -> None: ...
@abstractmethod
def enqueue(self, task: Task[_P, _R], args: list[Any], kwargs: dict[str, Any]) -> TaskResult[_P, _R]: ...
async def aenqueue(self, task: Task[_P, _R], args: list[Any], kwargs: dict[str, Any]) -> TaskResult[_P, _R]: ...
def get_result(self, result_id: str) -> TaskResult[..., Any]: ...
async def aget_result(self, result_id: str) -> TaskResult[..., Any]: ...
def check(self, **kwargs: Any) -> list[Any]: ...
typeddjango-django-stubs-fa03b48/django-stubs/tasks/backends/dummy.pyi 0000664 0000000 0000000 00000001260 15260643574 0026221 0 ustar 00root root 0000000 0000000 from typing import Any
from django.tasks.base import Task, TaskResult
from typing_extensions import ParamSpec, TypeVar, override
from .base import BaseTaskBackend
_P = ParamSpec("_P")
_R = TypeVar("_R")
class DummyBackend(BaseTaskBackend):
results: list[TaskResult[..., Any]]
def __init__(self, alias: str, params: dict[str, Any]) -> None: ...
@override
def enqueue(self, task: Task[_P, _R], args: list[Any], kwargs: dict[str, Any]) -> TaskResult[_P, _R]: ...
@override
def get_result(self, result_id: str) -> TaskResult[..., Any]: ...
@override
async def aget_result(self, result_id: str) -> TaskResult[..., Any]: ...
def clear(self) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/tasks/backends/immediate.pyi 0000664 0000000 0000000 00000000772 15260643574 0027033 0 ustar 00root root 0000000 0000000 from logging import Logger
from typing import Any
from django.tasks.base import Task, TaskResult
from typing_extensions import ParamSpec, TypeVar, override
from .base import BaseTaskBackend
_P = ParamSpec("_P")
_R = TypeVar("_R")
logger: Logger
class ImmediateBackend(BaseTaskBackend):
worker_id: str
def __init__(self, alias: str, params: dict[str, Any]) -> None: ...
@override
def enqueue(self, task: Task[_P, _R], args: list[Any], kwargs: dict[str, Any]) -> TaskResult[_P, _R]: ...
typeddjango-django-stubs-fa03b48/django-stubs/tasks/base.pyi 0000664 0000000 0000000 00000007622 15260643574 0024236 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from dataclasses import dataclass
from datetime import datetime
from typing import Any, Concatenate, Generic, Literal, overload
from django.db.models.enums import TextChoices as TextChoices
from django.utils.module_loading import import_string as import_string
from django.utils.translation import pgettext_lazy as pgettext_lazy
from typing_extensions import ParamSpec, TypeVar
from .backends.base import BaseTaskBackend
from .exceptions import TaskResultMismatch as TaskResultMismatch
DEFAULT_TASK_BACKEND_ALIAS: str
DEFAULT_TASK_PRIORITY: int
DEFAULT_TASK_QUEUE_NAME: str
TASK_MAX_PRIORITY: int
TASK_MIN_PRIORITY: int
TASK_REFRESH_ATTRS: set[str]
class TaskResultStatus(TextChoices):
READY = ...
RUNNING = ...
FAILED = ...
SUCCESSFUL = ...
_P = ParamSpec("_P")
_R = TypeVar("_R")
@dataclass(frozen=True, slots=True, kw_only=True)
class Task(Generic[_P, _R]):
# Loose: `_P` excludes `TaskContext` when `takes_context=True`, so `func` may have an extra leading param.
func: Callable[..., _R]
priority: int = ...
backend: str = ...
queue_name: str = ...
run_after: datetime | None = None
takes_context: bool = ...
def __post_init__(self) -> None: ...
@property
def name(self) -> str: ...
def using(
self,
*,
priority: int | None = None,
queue_name: str | None = None,
run_after: datetime | None = None,
backend: str | None = None,
) -> Task[_P, _R]: ...
def enqueue(self, *args: _P.args, **kwargs: _P.kwargs) -> TaskResult[_P, _R]: ...
async def aenqueue(self, *args: _P.args, **kwargs: _P.kwargs) -> TaskResult[_P, _R]: ...
def get_result(self, result_id: str) -> TaskResult[_P, _R]: ...
async def aget_result(self, result_id: str) -> TaskResult[_P, _R]: ...
def call(self, *args: _P.args, **kwargs: _P.kwargs) -> _R: ...
async def acall(self, *args: _P.args, **kwargs: _P.kwargs) -> _R: ...
def get_backend(self) -> BaseTaskBackend: ...
@property
def module_path(self) -> str: ...
@overload
def task(
function: Callable[Concatenate[TaskContext[Any, Any], _P], _R],
*,
priority: int | None = None,
queue_name: str | None = None,
backend: str | None = None,
takes_context: Literal[True],
) -> Task[_P, _R]: ...
@overload
def task(
function: Callable[_P, _R],
*,
priority: int | None = None,
queue_name: str | None = None,
backend: str | None = None,
takes_context: Literal[False] = False,
) -> Task[_P, _R]: ...
@overload
def task(
*,
priority: int | None = None,
queue_name: str | None = None,
backend: str | None = None,
takes_context: Literal[True],
) -> Callable[[Callable[Concatenate[TaskContext[Any, Any], _P], _R]], Task[_P, _R]]: ...
@overload
def task(
*,
priority: int | None = None,
queue_name: str | None = None,
backend: str | None = None,
takes_context: Literal[False] = False,
) -> Callable[[Callable[_P, _R]], Task[_P, _R]]: ...
@dataclass(kw_only=True)
class TaskError:
exception_class_path: str
traceback: str
@property
def exception_class(self) -> type[BaseException]: ...
@dataclass(kw_only=True)
class TaskResult(Generic[_P, _R]):
task: Task[_P, _R]
id: str
status: TaskResultStatus
enqueued_at: datetime | None
started_at: datetime | None
finished_at: datetime | None
last_attempted_at: datetime | None
args: list[Any]
kwargs: dict[str, Any]
backend: str
errors: list[TaskError]
worker_ids: list[str]
def __post_init__(self) -> None: ...
@property
def return_value(self) -> _R: ...
@property
def is_finished(self) -> bool: ...
@property
def attempts(self) -> int: ...
def refresh(self) -> None: ...
async def arefresh(self) -> None: ...
@dataclass(kw_only=True)
class TaskContext(Generic[_P, _R]):
task_result: TaskResult[_P, _R]
@property
def attempt(self) -> int: ...
typeddjango-django-stubs-fa03b48/django-stubs/tasks/checks.pyi 0000664 0000000 0000000 00000000405 15260643574 0024554 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from typing import Any
from django.apps.config import AppConfig
from django.core.checks.messages import CheckMessage
def check_tasks(app_configs: Sequence[AppConfig] | None = ..., **kwargs: Any) -> list[CheckMessage]: ...
typeddjango-django-stubs-fa03b48/django-stubs/tasks/exceptions.pyi 0000664 0000000 0000000 00000000455 15260643574 0025502 0 ustar 00root root 0000000 0000000 from django.core.exceptions import ImproperlyConfigured as ImproperlyConfigured
class TaskException(Exception): ...
class InvalidTask(TaskException): ...
class InvalidTaskBackend(ImproperlyConfigured): ...
class TaskResultDoesNotExist(TaskException): ...
class TaskResultMismatch(TaskException): ...
typeddjango-django-stubs-fa03b48/django-stubs/tasks/signals.pyi 0000664 0000000 0000000 00000001354 15260643574 0024760 0 ustar 00root root 0000000 0000000 from logging import Logger
from typing import Any
from django.dispatch import Signal as Signal
from django.tasks.backends.base import BaseTaskBackend
from django.tasks.base import TaskResult
from .base import TaskResultStatus as TaskResultStatus
logger: Logger
task_enqueued: Signal
task_finished: Signal
task_started: Signal
def clear_tasks_handlers(*, setting: str, **kwargs: Any) -> None: ...
def log_task_enqueued(sender: type[BaseTaskBackend], task_result: TaskResult[..., Any], **kwargs: Any) -> None: ...
def log_task_started(sender: type[BaseTaskBackend], task_result: TaskResult[..., Any], **kwargs: Any) -> None: ...
def log_task_finished(sender: type[BaseTaskBackend], task_result: TaskResult[..., Any], **kwargs: Any) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/template/ 0000775 0000000 0000000 00000000000 15260643574 0023260 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/template/__init__.pyi 0000664 0000000 0000000 00000001476 15260643574 0025552 0 ustar 00root root 0000000 0000000 from . import defaultfilters as defaultfilters
# Template parts
from .base import Node as Node
from .base import NodeList as NodeList
from .base import Origin as Origin
from .base import Template as Template
from .base import Variable as Variable
from .base import VariableDoesNotExist as VariableDoesNotExist
from .context import Context as Context
from .context import ContextPopException as ContextPopException
from .context import RequestContext as RequestContext
from .engine import Engine as Engine
from .exceptions import TemplateDoesNotExist as TemplateDoesNotExist
from .exceptions import TemplateSyntaxError as TemplateSyntaxError
from .library import Library as Library
from .utils import EngineHandler as EngineHandler
engines: EngineHandler
__all__ = ("Context", "Engine", "RequestContext", "Template", "engines")
typeddjango-django-stubs-fa03b48/django-stubs/template/autoreload.pyi 0000664 0000000 0000000 00000000456 15260643574 0026147 0 ustar 00root root 0000000 0000000 from pathlib import Path
from typing import Any
def get_template_directories() -> set[Path]: ...
def reset_loaders() -> None: ...
def watch_for_template_changes(sender: object, **kwargs: Any) -> None: ...
def template_changed(sender: object | None, file_path: Path, **kwargs: Any) -> bool | None: ...
typeddjango-django-stubs-fa03b48/django-stubs/template/backends/ 0000775 0000000 0000000 00000000000 15260643574 0025032 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/template/backends/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0027302 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/template/backends/base.pyi 0000664 0000000 0000000 00000001721 15260643574 0026470 0 ustar 00root root 0000000 0000000 from collections.abc import Iterator, Mapping
from typing import Any, Protocol, type_check_only
from django.core.checks.messages import CheckMessage
from django.http.request import HttpRequest
from django.utils.functional import cached_property
class BaseEngine:
name: str
dirs: list[str]
app_dirs: bool
def __init__(self, params: Mapping[str, Any]) -> None: ...
def check(self, **kwargs: Any) -> list[CheckMessage]: ...
@property
def app_dirname(self) -> str: ...
def from_string(self, template_code: str) -> _EngineTemplate: ...
def get_template(self, template_name: str) -> _EngineTemplate: ...
@cached_property
def template_dirs(self) -> tuple[str, ...]: ...
def iter_template_filenames(self, template_name: str) -> Iterator[str]: ...
@type_check_only
class _EngineTemplate(Protocol):
def render(
self,
context: dict[str, Any] | None = ...,
request: HttpRequest | None = ...,
) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/template/backends/django.pyi 0000664 0000000 0000000 00000002356 15260643574 0027025 0 ustar 00root root 0000000 0000000 from collections.abc import Iterator
from typing import Any, NoReturn
from django.template.base import Origin
from django.template.base import Template as _BaseTemplate
from django.template.engine import Engine
from django.template.exceptions import TemplateDoesNotExist
from typing_extensions import override
from .base import BaseEngine, _EngineTemplate
class DjangoTemplates(BaseEngine):
engine: Engine
@override
def from_string(self, template_code: str) -> Template: ...
@override
def get_template(self, template_name: str) -> Template: ...
def get_templatetag_libraries(self, custom_libraries: dict[str, str]) -> dict[str, str]: ...
def copy_exception(exc: TemplateDoesNotExist, backend: DjangoTemplates | None = None) -> TemplateDoesNotExist: ...
def reraise(exc: TemplateDoesNotExist, backend: DjangoTemplates) -> NoReturn: ...
def get_template_tag_modules() -> Iterator[tuple[str, str]]: ...
def get_installed_libraries() -> dict[str, str]: ...
def get_package_libraries(pkg: Any) -> Iterator[str]: ...
class Template(_EngineTemplate):
template: _BaseTemplate
backend: DjangoTemplates
def __init__(self, template: _BaseTemplate, backend: BaseEngine) -> None: ...
@property
def origin(self) -> Origin: ...
typeddjango-django-stubs-fa03b48/django-stubs/template/backends/dummy.pyi 0000664 0000000 0000000 00000001124 15260643574 0026706 0 ustar 00root root 0000000 0000000 import string
from typing import Any
from django.http.request import HttpRequest
from typing_extensions import override
from .base import BaseEngine
class TemplateStrings(BaseEngine):
def __init__(self, params: dict[str, dict[Any, Any] | list[Any] | bool | str]) -> None: ...
@override
def from_string(self, template_code: str) -> Template: ...
@override
def get_template(self, template_name: str) -> Template: ...
class Template(string.Template):
template: str
def render(self, context: dict[str, Any] | None = ..., request: HttpRequest | None = ...) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/template/backends/jinja2.pyi 0000664 0000000 0000000 00000002354 15260643574 0026736 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any
from django.http.request import HttpRequest
from django.template.exceptions import TemplateSyntaxError
from django.utils.functional import cached_property
from jinja2 import Environment
from jinja2 import Template as Jinja2Template
from typing_extensions import override
from .base import BaseEngine
class Jinja2(BaseEngine):
env: Environment
context_processors: list[str]
def __init__(self, params: dict[str, Any]) -> None: ...
@override
def from_string(self, template_code: str) -> Template: ...
@override
def get_template(self, template_name: str) -> Template: ...
@cached_property
def template_context_processors(self) -> list[Callable[[HttpRequest], dict[str, Any]]]: ...
class Template:
template: Jinja2Template
backend: Jinja2
origin: Origin
def __init__(self, template: Jinja2Template, backend: Jinja2) -> None: ...
def render(self, context: dict[str, Any] | None = None, request: HttpRequest | None = None) -> str: ...
class Origin:
name: str
template_name: str | None
def __init__(self, name: str, template_name: str | None) -> None: ...
def get_exception_info(exception: TemplateSyntaxError) -> dict[str, Any]: ...
typeddjango-django-stubs-fa03b48/django-stubs/template/backends/utils.pyi 0000664 0000000 0000000 00000000526 15260643574 0026720 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from django.http.request import HttpRequest
from django.utils.functional import _StrPromise
from django.utils.safestring import SafeString
def csrf_input(request: HttpRequest) -> SafeString: ...
csrf_input_lazy: Callable[[HttpRequest], SafeString]
csrf_token_lazy: Callable[[HttpRequest], _StrPromise]
typeddjango-django-stubs-fa03b48/django-stubs/template/base.pyi 0000664 0000000 0000000 00000014116 15260643574 0024720 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterable, Iterator, Mapping, Sequence
from enum import Enum
from logging import Logger
from re import Pattern
from typing import Any, cast
from django.template.context import Context
from django.template.engine import Engine
from django.template.library import Library
from django.template.loaders.base import Loader
from django.utils.safestring import SafeString
from typing_extensions import override
FILTER_SEPARATOR: str
FILTER_ARGUMENT_SEPARATOR: str
VARIABLE_ATTRIBUTE_SEPARATOR: str
BLOCK_TAG_START: str
BLOCK_TAG_END: str
VARIABLE_TAG_START: str
VARIABLE_TAG_END: str
COMMENT_TAG_START: str
COMMENT_TAG_END: str
SINGLE_BRACE_START: str
SINGLE_BRACE_END: str
UNKNOWN_SOURCE: str
tag_re: Pattern[str]
logger: Logger
class TokenType(Enum):
TEXT = cast(int, ...)
VAR = cast(int, ...)
BLOCK = cast(int, ...)
COMMENT = cast(int, ...)
class VariableDoesNotExist(Exception):
msg: str
params: tuple[Any, ...]
def __init__(self, msg: str, params: tuple[Any, ...] = ...) -> None: ...
class Origin:
name: str
template_name: bytes | str | None
loader: Loader | None
def __init__(self, name: str, template_name: bytes | str | None = None, loader: Loader | None = None) -> None: ...
@property
def loader_name(self) -> str | None: ...
class Template:
name: str | None
origin: Origin
engine: Engine
source: str
nodelist: NodeList
extra_data: dict[str, Any]
def __init__(
self,
template_string: Template | str,
origin: Origin | None = None,
name: str | None = None,
engine: Engine | None = None,
) -> None: ...
def render(self, context: Context) -> SafeString: ...
def compile_nodelist(self) -> NodeList: ...
def get_exception_info(self, exception: Exception, token: Token) -> dict[str, Any]: ...
class PartialTemplate:
nodelist: NodeList
origin: Origin
name: str
def __init__(
self,
nodelist: NodeList,
origin: Origin,
name: str,
source_start: int | None = None,
source_end: int | None = None,
) -> None: ...
def get_exception_info(self, exception: Exception, token: Token) -> dict[str, Any]: ...
def find_partial_source(self, full_source: str) -> str: ...
@property
def source(self) -> str: ...
def render(self, context: Context) -> SafeString: ...
def linebreak_iter(template_source: str) -> Iterator[int]: ...
class Token:
contents: str
token_type: TokenType
lineno: int | None
position: tuple[int, int] | None
def __init__(
self,
token_type: TokenType,
contents: str,
position: tuple[int, int] | None = None,
lineno: int | None = None,
) -> None: ...
def split_contents(self) -> list[str]: ...
class Lexer:
template_string: str
verbatim: bool | str
def __init__(self, template_string: str) -> None: ...
def tokenize(self) -> list[Token]: ...
def create_token(self, token_string: str, position: tuple[int, int] | None, lineno: int, in_tag: bool) -> Token: ...
class DebugLexer(Lexer):
template_string: str
verbatim: bool | str
@override
def tokenize(self) -> list[Token]: ...
class Parser:
tokens: list[Token] | str
tags: dict[str, Callable[..., Any]]
filters: dict[str, Callable[..., Any]]
command_stack: list[tuple[str, Token]]
libraries: dict[str, Library]
origin: Origin | None
extra_data: dict[str, Any]
def __init__(
self,
tokens: list[Token] | str,
libraries: dict[str, Library] | None = None,
builtins: list[Library] | None = None,
origin: Origin | None = None,
) -> None: ...
def parse(self, parse_until: Iterable[str] | None = None) -> NodeList: ...
def skip_past(self, endtag: str) -> None: ...
def extend_nodelist(self, nodelist: NodeList, node: Node, token: Token) -> None: ...
def error(self, token: Token, e: Exception | str) -> Exception: ...
def invalid_block_tag(self, token: Token, command: str, parse_until: Iterable[str] | None = None) -> Any: ...
def unclosed_block_tag(self, parse_until: Iterable[str]) -> Any: ...
def next_token(self) -> Token: ...
def prepend_token(self, token: Token) -> None: ...
def delete_first_token(self) -> None: ...
def add_library(self, lib: Library) -> None: ...
def compile_filter(self, token: str) -> FilterExpression: ...
def find_filter(self, filter_name: str) -> Callable[..., Any]: ...
constant_string: str
filter_raw_string: str
filter_re: Pattern[str]
class FilterExpression:
token: str
filters: list[Any]
var: Any
is_var: bool
def __init__(self, token: str, parser: Parser) -> None: ...
def resolve(self, context: Context, ignore_failures: bool = False) -> Any: ...
@staticmethod
def args_check(name: str, func: Callable[..., Any], provided: list[tuple[bool, Any]]) -> bool: ...
class Variable:
var: dict[Any, Any] | str
literal: SafeString | float | None
lookups: tuple[str, ...] | None
translate: bool
message_context: str | None
def __init__(self, var: dict[Any, Any] | str) -> None: ...
def resolve(self, context: Mapping[str, Mapping[str, Any]] | Context | int | str) -> Any: ...
class Node:
must_be_first: bool
child_nodelists: Any
origin: Origin
token: Token | None
def render(self, context: Context) -> str: ...
def render_annotated(self, context: Context) -> int | str: ...
def get_nodes_by_type(self, nodetype: type[Node]) -> list[Node]: ...
class NodeList(list[Node]):
contains_nontext: bool
def render(self, context: Context) -> SafeString: ...
def get_nodes_by_type(self, nodetype: type[Node]) -> list[Node]: ...
class TextNode(Node):
s: str
def __init__(self, s: str) -> None: ...
def render_value_in_context(value: Any, context: Context) -> str: ...
class VariableNode(Node):
filter_expression: FilterExpression
def __init__(self, filter_expression: FilterExpression) -> None: ...
kwarg_re: Pattern[str]
def token_kwargs(bits: Sequence[str], parser: Parser, support_legacy: bool = False) -> dict[str, FilterExpression]: ...
typeddjango-django-stubs-fa03b48/django-stubs/template/context.pyi 0000664 0000000 0000000 00000006667 15260643574 0025506 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterable, Iterator
from contextlib import AbstractContextManager
from types import TracebackType
from typing import Any, Self, TypeAlias
from django.http.request import HttpRequest
from django.template.base import Node, Origin, Template
from django.template.loader_tags import IncludeNode
from typing_extensions import override
_ContextKeys: TypeAlias = int | str | Node
_ContextValues: TypeAlias = dict[str, Any] | Context
class ContextPopException(Exception): ...
class ContextDict(dict[Any, Any]):
context: BaseContext
def __init__(self, context: BaseContext, *args: Any, **kwargs: Any) -> None: ...
def __enter__(self) -> Self: ...
def __exit__(
self,
exc_type: type[BaseException] | None,
exc_value: BaseException | None,
exc_tb: TracebackType | None,
) -> None: ...
class BaseContext(Iterable[Any]):
def __init__(self, dict_: Any | None = None) -> None: ...
def __copy__(self) -> Self: ...
@override
def __iter__(self) -> Iterator[Any]: ...
def push(self, *args: Any, **kwargs: Any) -> ContextDict: ...
def pop(self) -> ContextDict: ...
def __setitem__(self, key: _ContextKeys, value: Any) -> None: ...
def set_upward(self, key: _ContextKeys, value: int | str) -> None: ...
def __getitem__(self, key: _ContextKeys) -> Any: ...
def __delitem__(self, key: _ContextKeys) -> None: ...
def __contains__(self, key: _ContextKeys) -> bool: ...
def get(self, key: _ContextKeys, otherwise: Any | None = None) -> Any | None: ...
def setdefault(self, key: _ContextKeys, default: list[Origin] | int | None = None) -> list[Origin] | int | None: ...
def new(self, values: _ContextValues | None = None) -> Context: ...
def flatten(self) -> dict[_ContextKeys, dict[_ContextKeys, type[Any] | str] | int | str | None]: ...
class Context(BaseContext):
dicts: Any
autoescape: bool
use_l10n: bool | None
use_tz: bool | None
template_name: str | None
render_context: RenderContext
template: Template | None
def __init__(
self,
dict_: Any | None = None,
autoescape: bool = True,
use_l10n: bool | None = None,
use_tz: bool | None = None,
) -> None: ...
def bind_template(self, template: Template) -> AbstractContextManager[None]: ...
def update(self, other_dict: dict[str, Any] | Context) -> ContextDict: ...
class RenderContext(BaseContext):
dicts: list[dict[IncludeNode | str, str]]
template: Template | None
def push_state(self, template: Template, isolated_context: bool = True) -> AbstractContextManager[None]: ...
class RequestContext(Context):
autoescape: bool
dicts: list[dict[str, str]]
render_context: RenderContext
template_name: str | None
use_l10n: bool | None
use_tz: bool | None
request: HttpRequest
def __init__(
self,
request: HttpRequest,
dict_: dict[str, Any] | None = None,
processors: list[Callable[..., Any]] | None = None,
use_l10n: bool | None = None,
use_tz: bool | None = None,
autoescape: bool = True,
) -> None: ...
template: Template | None
@override
def bind_template(self, template: Template) -> AbstractContextManager[None]: ...
@override
def new(self, values: _ContextValues | None = None) -> RequestContext: ...
def make_context(context: dict[str, Any] | None, request: HttpRequest | None = None, **kwargs: Any) -> Context: ...
typeddjango-django-stubs-fa03b48/django-stubs/template/context_processors.pyi 0000664 0000000 0000000 00000001366 15260643574 0027757 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any
from django.http.request import HttpRequest
from django.utils.functional import SimpleLazyObject
from typing_extensions import TypeVar
_R = TypeVar("_R", bound=HttpRequest)
def csp(request: HttpRequest) -> dict[str, SimpleLazyObject[str] | None]: ...
def csrf(request: HttpRequest) -> dict[str, SimpleLazyObject[str]]: ...
def debug(request: HttpRequest) -> dict[str, Callable[..., Any] | bool]: ...
def i18n(request: HttpRequest) -> dict[str, list[tuple[str, str]] | bool | str]: ...
def tz(request: HttpRequest) -> dict[str, str]: ...
def static(request: HttpRequest) -> dict[str, str]: ...
def media(request: HttpRequest) -> dict[str, str]: ...
def request(request: _R) -> dict[str, _R]: ...
typeddjango-django-stubs-fa03b48/django-stubs/template/defaultfilters.pyi 0000664 0000000 0000000 00000006634 15260643574 0027031 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from datetime import date as _date
from datetime import datetime
from datetime import time as _time
from typing import Any
from django.utils.safestring import SafeString
register: Any
def stringfilter(func: Callable[..., Any]) -> Callable[..., Any]: ...
def addslashes(value: str) -> str: ...
def capfirst(value: str) -> str: ...
def escapejs_filter(value: str) -> SafeString: ...
def json_script(value: Any, element_id: str | None = ...) -> SafeString: ...
def floatformat(text: Any | None, arg: int | str = -1) -> str: ...
def iriencode(value: str) -> str: ...
def linenumbers(value: str, autoescape: bool = True) -> SafeString: ...
def lower(value: str) -> str: ...
def make_list(value: str) -> list[str]: ...
def slugify(value: str) -> SafeString: ...
def stringformat(value: Any, arg: str) -> str: ...
def title(value: str) -> str: ...
def truncatechars(value: str, arg: SafeString | int) -> str: ...
def truncatechars_html(value: str, arg: int | str) -> str: ...
def truncatewords(value: str, arg: int | str) -> str: ...
def truncatewords_html(value: str, arg: int | str) -> str: ...
def upper(value: str) -> str: ...
def urlencode(value: str, safe: SafeString | None = None) -> str: ...
def urlize(value: str, autoescape: bool = True) -> SafeString: ...
def urlizetrunc(value: str, limit: SafeString | int, autoescape: bool = True) -> SafeString: ...
def wordcount(value: str) -> int: ...
def wordwrap(value: str, arg: SafeString | int) -> str: ...
def ljust(value: str, arg: SafeString | int) -> str: ...
def rjust(value: str, arg: SafeString | int) -> str: ...
def center(value: str, arg: SafeString | int) -> str: ...
def cut(value: str, arg: str) -> str: ...
def escape_filter(value: str) -> SafeString: ...
def escapeseq(value: list[str]) -> list[SafeString]: ...
def force_escape(value: str) -> SafeString: ...
def linebreaks_filter(value: str, autoescape: bool = True) -> SafeString: ...
def linebreaksbr(value: str, autoescape: bool = True) -> SafeString: ...
def safe(value: str) -> SafeString: ...
def safeseq(value: list[str]) -> list[SafeString]: ...
def striptags(value: str) -> str: ...
def dictsort(value: Any, arg: int | str) -> Any: ...
def dictsortreversed(value: Any, arg: int | str) -> Any: ...
def first(value: Any) -> Any: ...
def join(value: Any, arg: str, autoescape: bool = True) -> Any: ...
def last(value: list[str]) -> str: ...
def length(value: Any) -> int: ...
def random(value: list[str]) -> str: ...
def slice_filter(value: Any, arg: str | int) -> Any: ...
def unordered_list(value: Any, autoescape: bool = True) -> Any: ...
def add(value: Any, arg: Any) -> Any: ...
def get_digit(value: Any, arg: int) -> Any: ...
def date(value: _date | datetime | str | None, arg: str | None = None) -> str: ...
def time(value: datetime | _time | str | None, arg: str | None = None) -> str: ...
def timesince_filter(value: _date | None, arg: _date | None = None) -> str: ...
def timeuntil_filter(value: _date | None, arg: _date | None = None) -> str: ...
def default(value: int | str | None, arg: int | str) -> int | str: ...
def default_if_none(value: str | None, arg: int | str) -> int | str: ...
def divisibleby(value: int, arg: int) -> bool: ...
def yesno(value: int | None, arg: str | None = None) -> bool | str | None: ...
def filesizeformat(bytes_: float | str) -> str: ...
def pluralize(value: Any, arg: str = "s") -> str: ...
def phone2numeric_filter(value: str) -> str: ...
def pprint(value: Any) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/template/defaulttags.pyi 0000664 0000000 0000000 00000015701 15260643574 0026312 0 ustar 00root root 0000000 0000000 from collections.abc import Iterator, Mapping, Sequence
from datetime import date as real_date
from typing import Any, NamedTuple
from django.forms.widgets import Media
from django.http.request import QueryDict
from django.template.base import FilterExpression, Parser, PartialTemplate, Token
from django.template.context import Context
from django.utils.safestring import SafeString
from typing_extensions import override
from .base import Node, NodeList
from .library import Library
from .smartif import IfParser, Literal
register: Any
class AutoEscapeControlNode(Node):
nodelist: NodeList
setting: bool
def __init__(self, setting: bool, nodelist: NodeList) -> None: ...
class CommentNode(Node): ...
class CsrfTokenNode(Node): ...
class CycleNode(Node):
cyclevars: list[FilterExpression]
variable_name: str | None
silent: bool
def __init__(
self, cyclevars: list[FilterExpression], variable_name: str | None = None, silent: bool = False
) -> None: ...
def reset(self, context: Context) -> None: ...
class DebugNode(Node): ...
class FilterNode(Node):
filter_expr: FilterExpression
nodelist: NodeList
def __init__(self, filter_expr: FilterExpression, nodelist: NodeList) -> None: ...
class FirstOfNode(Node):
vars: list[FilterExpression]
asvar: str | None
def __init__(self, variables: list[FilterExpression], asvar: str | None = None) -> None: ...
class ForNode(Node):
loopvars: list[str] | str
sequence: FilterExpression | str
child_nodelists: Any
is_reversed: bool
nodelist_loop: list[str] | NodeList
nodelist_empty: list[str] | NodeList
def __init__(
self,
loopvars: list[str] | str,
sequence: FilterExpression | str,
is_reversed: bool,
nodelist_loop: list[str] | NodeList,
nodelist_empty: list[str] | NodeList | None = None,
) -> None: ...
class IfChangedNode(Node):
nodelist_false: NodeList
nodelist_true: NodeList
child_nodelists: Any
def __init__(self, nodelist_true: NodeList, nodelist_false: NodeList, *varlist: Any) -> None: ...
class IfNode(Node):
conditions_nodelists: list[tuple[TemplateLiteral | None, NodeList]]
def __init__(self, conditions_nodelists: list[tuple[TemplateLiteral | None, NodeList]]) -> None: ...
def __iter__(self) -> Iterator[Node]: ...
@property
def nodelist(self) -> NodeList: ...
class LoremNode(Node):
common: bool
count: FilterExpression
method: str
def __init__(self, count: FilterExpression, method: str, common: bool) -> None: ...
class GroupedResult(NamedTuple):
grouper: Any
list: list[Any]
class RegroupNode(Node):
expression: FilterExpression
target: FilterExpression
var_name: str
def __init__(self, target: FilterExpression, expression: FilterExpression, var_name: str) -> None: ...
def resolve_expression(self, obj: dict[str, real_date], context: Context) -> int | str: ...
class LoadNode(Node): ...
class NowNode(Node):
format_string: str
asvar: str | None
def __init__(self, format_string: str, asvar: str | None = None) -> None: ...
class PartialDefNode(Node):
partial_name: str
inline: bool
nodelist: NodeList
def __init__(self, partial_name: str, inline: bool, nodelist: NodeList) -> None: ...
class PartialNode(Node):
partial_name: str
partial_mapping: Mapping[str, PartialTemplate]
def __init__(self, partial_name: str, partial_mapping: Mapping[str, PartialTemplate]) -> None: ...
class ResetCycleNode(Node):
node: CycleNode
def __init__(self, node: CycleNode) -> None: ...
class SpacelessNode(Node):
nodelist: NodeList
def __init__(self, nodelist: NodeList) -> None: ...
class TemplateTagNode(Node):
mapping: Any
tagtype: str
def __init__(self, tagtype: str) -> None: ...
class URLNode(Node):
view_name: FilterExpression
args: list[FilterExpression]
kwargs: dict[str, FilterExpression]
asvar: str | None
def __init__(
self,
view_name: FilterExpression,
args: list[FilterExpression],
kwargs: dict[str, FilterExpression],
asvar: str | None,
) -> None: ...
class VerbatimNode(Node):
content: SafeString
def __init__(self, content: SafeString) -> None: ...
class WidthRatioNode(Node):
val_expr: FilterExpression
max_expr: FilterExpression
max_width: FilterExpression
asvar: str | None
def __init__(
self,
val_expr: FilterExpression,
max_expr: FilterExpression,
max_width: FilterExpression,
asvar: str | None = None,
) -> None: ...
class WithNode(Node):
nodelist: NodeList
extra_context: dict[str, Any]
def __init__(
self,
var: str | None,
name: str | None,
nodelist: NodeList | Sequence[Node],
extra_context: dict[str, Any] | None = None,
) -> None: ...
def autoescape(parser: Parser, token: Token) -> AutoEscapeControlNode: ...
def comment(parser: Parser, token: Token) -> CommentNode: ...
def cycle(parser: Parser, token: Token) -> CycleNode: ...
def csrf_token(parser: Parser, token: Token) -> CsrfTokenNode: ...
def debug(parser: Parser, token: Token) -> DebugNode: ...
def do_filter(parser: Parser, token: Token) -> FilterNode: ...
def firstof(parser: Parser, token: Token) -> FirstOfNode: ...
def do_for(parser: Parser, token: Token) -> ForNode: ...
class TemplateLiteral(Literal):
text: str
def __init__(self, value: FilterExpression, text: str) -> None: ...
@override
def display(self) -> str: ...
class TemplateIfParser(IfParser):
current_token: TemplateLiteral
pos: int
tokens: list[TemplateLiteral]
error_class: Any
template_parser: Parser
def __init__(self, parser: Parser, *args: Any, **kwargs: Any) -> None: ...
def do_if(parser: Parser, token: Token) -> IfNode: ...
def ifchanged(parser: Parser, token: Token) -> IfChangedNode: ...
def find_library(parser: Parser, name: str) -> Library: ...
def load_from_library(library: Library, label: str, names: list[str]) -> Library: ...
def load(parser: Parser, token: Token) -> LoadNode: ...
def lorem(parser: Parser, token: Token) -> LoremNode: ...
def now(parser: Parser, token: Token) -> NowNode: ...
def partial_func(parser: Parser, token: Token) -> PartialNode: ...
def partialdef_func(parser: Parser, token: Token) -> PartialDefNode: ...
def querystring(context: Context, query_dict: QueryDict | None = None, **kwargs: Any) -> str: ...
def regroup(parser: Parser, token: Token) -> RegroupNode: ...
def resetcycle(parser: Parser, token: Token) -> ResetCycleNode: ...
def spaceless(parser: Parser, token: Token) -> SpacelessNode: ...
def templatetag(parser: Parser, token: Token) -> TemplateTagNode: ...
def url(parser: Parser, token: Token) -> URLNode: ...
def verbatim(parser: Parser, token: Token) -> VerbatimNode: ...
def widthratio(parser: Parser, token: Token) -> WidthRatioNode: ...
def do_with(parser: Parser, token: Token) -> WithNode: ...
def csp_nonce_attr(context: Context, media: Media | None = None) -> SafeString: ...
typeddjango-django-stubs-fa03b48/django-stubs/template/engine.pyi 0000664 0000000 0000000 00000004564 15260643574 0025261 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Sequence
from typing import Any, ClassVar, TypeAlias
from django.http.request import HttpRequest
from django.template.base import Origin
from django.template.context import Context
from django.template.library import Library
from django.template.loaders.base import Loader
from django.utils.functional import cached_property
from django.utils.safestring import SafeString
from .base import Template
_Loader: TypeAlias = Any
class Engine:
default_builtins: ClassVar[list[str]]
dirs: list[str]
app_dirs: bool
autoescape: bool
context_processors: list[str] | tuple[str, ...]
debug: bool
loaders: Sequence[_Loader]
string_if_invalid: str
file_charset: str
libraries: dict[str, str]
template_libraries: dict[str, Library]
builtins: list[str]
template_builtins: list[Library]
def __init__(
self,
dirs: list[str] | None = None,
app_dirs: bool = False,
context_processors: list[str] | tuple[str, ...] | None = None,
debug: bool = False,
loaders: Sequence[_Loader] | None = None,
string_if_invalid: str = "",
file_charset: str = "utf-8",
libraries: dict[str, str] | None = None,
builtins: list[str] | None = None,
autoescape: bool = True,
) -> None: ...
@staticmethod
def get_default() -> Engine: ...
@cached_property
def template_context_processors(self) -> Sequence[Callable[[HttpRequest], dict[str, Any]]]: ...
def get_template_builtins(self, builtins: list[str]) -> list[Library]: ...
def get_template_libraries(self, libraries: dict[str, str]) -> dict[str, Library]: ...
@cached_property
def template_loaders(self) -> list[Loader]: ...
def get_template_loaders(self, template_loaders: Sequence[_Loader]) -> list[Loader]: ...
def find_template_loader(self, loader: _Loader) -> Loader: ...
def find_template(
self, name: str, dirs: None = None, skip: list[Origin] | None = None
) -> tuple[Template, Origin]: ...
def from_string(self, template_code: str) -> Template: ...
def get_template(self, template_name: str) -> Template: ...
def render_to_string(
self, template_name: str | list[str] | tuple[str, ...], context: dict[str, Any] | Context | None = None
) -> SafeString: ...
def select_template(self, template_name_list: list[str]) -> Template: ...
typeddjango-django-stubs-fa03b48/django-stubs/template/exceptions.pyi 0000664 0000000 0000000 00000001002 15260643574 0026155 0 ustar 00root root 0000000 0000000 from django.template.backends.base import BaseEngine
from django.template.base import Origin
class TemplateDoesNotExist(Exception):
backend: BaseEngine | None
tried: list[tuple[Origin, str]]
chain: list[TemplateDoesNotExist]
def __init__(
self,
msg: Origin | str,
tried: list[tuple[Origin, str]] | None = None,
backend: BaseEngine | None = None,
chain: list[TemplateDoesNotExist] | None = None,
) -> None: ...
class TemplateSyntaxError(Exception): ...
typeddjango-django-stubs-fa03b48/django-stubs/template/library.pyi 0000664 0000000 0000000 00000011030 15260643574 0025442 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Collection, Iterable, Mapping, Sequence, Sized
from typing import Any, overload
from django.template.base import FilterExpression, Parser
from django.template.context import Context
from django.utils.safestring import SafeString
from typing_extensions import TypeVar
from .base import Node, NodeList, Template
class InvalidTemplateLibrary(Exception): ...
_C = TypeVar("_C", bound=Callable[..., Any])
class Library:
filters: dict[str, Callable[..., Any]]
tags: dict[str, Callable[..., Any]]
def __init__(self) -> None: ...
@overload
def tag(self, name: _C) -> _C: ...
@overload
def tag(self, name: str, compile_function: _C) -> _C: ...
@overload
def tag(self, name: str | None = None, compile_function: None = None) -> Callable[[_C], _C]: ...
def tag_function(self, func: _C) -> _C: ...
@overload
def filter(
self,
name: _C,
filter_func: None = None,
*,
is_safe: bool = False,
needs_autoescape: bool = False,
expects_localtime: bool = False,
) -> _C: ...
@overload
def filter(
self,
name: str | None,
filter_func: _C,
*,
is_safe: bool = False,
needs_autoescape: bool = False,
expects_localtime: bool = False,
) -> _C: ...
@overload
def filter(
self,
name: str | None = None,
filter_func: None = None,
*,
is_safe: bool = False,
needs_autoescape: bool = False,
expects_localtime: bool = False,
) -> Callable[[_C], _C]: ...
def filter_function(self, func: _C, **flags: Any) -> _C: ...
@overload
def simple_tag(self, func: _C, takes_context: bool | None = None, name: str | None = None) -> _C: ...
@overload
def simple_tag(
self, func: None = None, takes_context: bool | None = None, name: str | None = None
) -> Callable[[_C], _C]: ...
@overload
def simple_block_tag(
self,
func: _C,
takes_context: bool | None = None,
name: str | None = None,
end_name: str | None = None,
) -> _C: ...
@overload
def simple_block_tag(
self,
func: None = None,
takes_context: bool | None = None,
name: str | None = None,
end_name: str | None = None,
) -> Callable[[_C], _C]: ...
@overload
def inclusion_tag(
self,
filename: Template | str,
func: _C,
takes_context: bool | None = None,
name: str | None = None,
) -> _C: ...
@overload
def inclusion_tag(
self,
filename: Template | str,
func: None = None,
takes_context: bool | None = None,
name: str | None = None,
) -> Callable[[_C], _C]: ...
class TagHelperNode(Node):
func: Any
takes_context: Any
args: Any
kwargs: Any
def __init__(
self,
func: Callable[..., Any],
takes_context: bool | None,
args: list[FilterExpression],
kwargs: dict[str, FilterExpression],
) -> None: ...
def get_resolved_arguments(self, context: Context) -> tuple[list[int], dict[str, SafeString | int]]: ...
class SimpleNode(TagHelperNode):
args: list[FilterExpression]
func: Callable[..., Any]
kwargs: dict[str, FilterExpression]
takes_context: bool | None
target_var: str | None
def __init__(
self,
func: Callable[..., Any],
takes_context: bool | None,
args: list[FilterExpression],
kwargs: dict[str, FilterExpression],
target_var: str | None,
) -> None: ...
class SimpleBlockNode(SimpleNode):
nodelist: NodeList
def __init__(
self,
nodelist: NodeList,
*args: Any,
**kwargs: Any,
) -> None: ...
class InclusionNode(TagHelperNode):
args: list[FilterExpression]
func: Callable[..., Any]
kwargs: dict[str, FilterExpression]
takes_context: bool | None
filename: Template | str
def __init__(
self,
func: Callable[..., Any],
takes_context: bool | None,
args: list[FilterExpression],
kwargs: dict[str, FilterExpression],
filename: Template | str | None,
) -> None: ...
def parse_bits(
parser: Parser,
bits: Iterable[str],
params: Sequence[str],
varargs: str | None,
varkw: str | None,
defaults: Sized | None,
kwonly: Collection[str],
kwonly_defaults: Mapping[str, int] | None,
name: str,
) -> tuple[list[FilterExpression], dict[str, FilterExpression]]: ...
def import_library(name: str) -> Library: ...
typeddjango-django-stubs-fa03b48/django-stubs/template/loader.pyi 0000664 0000000 0000000 00000001243 15260643574 0025251 0 ustar 00root root 0000000 0000000 from collections.abc import Mapping, Sequence
from typing import Any
from django.http.request import HttpRequest
from django.template.exceptions import TemplateDoesNotExist as TemplateDoesNotExist
from django.utils.safestring import SafeString
from .backends.base import _EngineTemplate
def get_template(template_name: str, using: str | None = None) -> _EngineTemplate: ...
def select_template(template_name_list: Sequence[str] | str, using: str | None = None) -> Any: ...
def render_to_string(
template_name: Sequence[str] | str,
context: Mapping[str, Any] | None = None,
request: HttpRequest | None = None,
using: str | None = None,
) -> SafeString: ...
typeddjango-django-stubs-fa03b48/django-stubs/template/loader_tags.pyi 0000664 0000000 0000000 00000004401 15260643574 0026266 0 ustar 00root root 0000000 0000000 import collections
from typing import Any
from django.template.base import FilterExpression, NodeList, Parser, Token
from django.template.context import Context
from django.utils.safestring import SafeString
from typing_extensions import override
from .base import Node, Template
register: Any
BLOCK_CONTEXT_KEY: str
class BlockContext:
blocks: collections.defaultdict[str, list[BlockNode]]
def __init__(self) -> None: ...
def add_blocks(self, blocks: dict[str, BlockNode]) -> None: ...
def pop(self, name: str) -> BlockNode: ...
def push(self, name: str, block: BlockNode) -> None: ...
def get_block(self, name: str) -> BlockNode: ...
class BlockNode(Node):
context: Context
name: str
nodelist: NodeList
parent: Node | None
def __init__(self, name: str, nodelist: NodeList, parent: Node | None = None) -> None: ...
@override
def render(self, context: Context) -> SafeString: ...
def super(self) -> SafeString: ...
class ExtendsNode(Node):
must_be_first: bool
context_key: str
nodelist: NodeList
parent_name: FilterExpression | Node
template_dirs: list[Any] | None
blocks: dict[str, BlockNode]
def __init__(
self, nodelist: NodeList, parent_name: FilterExpression | Node, template_dirs: list[Any] | None = None
) -> None: ...
def find_template(self, template_name: str, context: Context) -> Template: ...
def get_parent(self, context: Context) -> Template: ...
@override
def render(self, context: Context) -> Any: ...
class IncludeNode(Node):
context_key: str
template: FilterExpression
extra_context: dict[str, FilterExpression]
isolated_context: bool
def __init__(
self,
template: FilterExpression,
*args: Any,
extra_context: Any | None = None,
isolated_context: bool = False,
**kwargs: Any,
) -> None: ...
@override
def render(self, context: Context) -> SafeString: ...
def do_block(parser: Parser, token: Token) -> BlockNode: ...
def construct_relative_path(
current_template_name: str | None,
relative_name: str,
allow_recursion: bool = False,
) -> str: ...
def do_extends(parser: Parser, token: Token) -> ExtendsNode: ...
def do_include(parser: Parser, token: Token) -> IncludeNode: ...
typeddjango-django-stubs-fa03b48/django-stubs/template/loaders/ 0000775 0000000 0000000 00000000000 15260643574 0024711 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/template/loaders/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0027161 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/template/loaders/app_directories.pyi 0000664 0000000 0000000 00000000130 15260643574 0030602 0 ustar 00root root 0000000 0000000 from .filesystem import Loader as FilesystemLoader
class Loader(FilesystemLoader): ...
typeddjango-django-stubs-fa03b48/django-stubs/template/loaders/base.pyi 0000664 0000000 0000000 00000000653 15260643574 0026352 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable
from django.template.base import Origin, Template
from django.template.engine import Engine
class Loader:
engine: Engine
def __init__(self, engine: Engine) -> None: ...
def get_template(self, template_name: str, skip: list[Origin] | None = None) -> Template: ...
def get_template_sources(self, template_name: str) -> Iterable[Origin]: ...
def reset(self) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/template/loaders/cached.pyi 0000664 0000000 0000000 00000001206 15260643574 0026642 0 ustar 00root root 0000000 0000000 from collections.abc import Iterator, Sequence
from pathlib import Path
from typing import Any
from django.template.base import Origin
from django.template.engine import Engine
from .base import Loader as BaseLoader
class Loader(BaseLoader):
get_template_cache: dict[str, Any]
loaders: list[BaseLoader]
def __init__(self, engine: Engine, loaders: Sequence[Any]) -> None: ...
def get_dirs(self) -> Iterator[str | Path]: ...
def get_contents(self, origin: Origin) -> str: ...
def cache_key(self, template_name: str, skip: list[Origin] | None = None) -> str: ...
def generate_hash(self, values: list[str]) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/template/loaders/filesystem.pyi 0000664 0000000 0000000 00000001074 15260643574 0027622 0 ustar 00root root 0000000 0000000 from collections.abc import Iterator
from pathlib import Path
from django.template.base import Origin
from django.template.engine import Engine
from typing_extensions import override
from .base import Loader as BaseLoader
class Loader(BaseLoader):
dirs: list[str | Path] | None
def __init__(self, engine: Engine, dirs: list[str | Path] | None = None) -> None: ...
def get_dirs(self) -> list[str | Path]: ...
def get_contents(self, origin: Origin) -> str: ...
@override
def get_template_sources(self, template_name: str) -> Iterator[Origin]: ...
typeddjango-django-stubs-fa03b48/django-stubs/template/loaders/locmem.pyi 0000664 0000000 0000000 00000000503 15260643574 0026706 0 ustar 00root root 0000000 0000000 from django.template.base import Origin
from django.template.engine import Engine
from .base import Loader as BaseLoader
class Loader(BaseLoader):
templates_dict: dict[str, str]
def __init__(self, engine: Engine, templates_dict: dict[str, str]) -> None: ...
def get_contents(self, origin: Origin) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/template/response.pyi 0000664 0000000 0000000 00000004065 15260643574 0025646 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterator, Sequence
from http.cookies import SimpleCookie
from typing import Any, TypeAlias
from django.http import HttpResponse
from django.http.request import HttpRequest
from typing_extensions import override
from .backends.base import _EngineTemplate
_TemplateForResponseT: TypeAlias = Sequence[str] | _EngineTemplate | str
class ContentNotRenderedError(Exception): ...
class SimpleTemplateResponse(HttpResponse):
content: Any
closed: bool
cookies: SimpleCookie
status_code: int
rendering_attrs: Any
template_name: _TemplateForResponseT
context_data: dict[str, Any] | None
using: str | None
def __init__(
self,
template: _TemplateForResponseT,
context: dict[str, Any] | None = ...,
content_type: str | None = ...,
status: int | None = ...,
charset: str | None = ...,
using: str | None = ...,
headers: dict[str, Any] | None = ...,
) -> None: ...
def resolve_template(self, template: _TemplateForResponseT) -> _EngineTemplate: ...
def resolve_context(self, context: dict[str, Any] | None) -> dict[str, Any] | None: ...
@property
def rendered_content(self) -> str: ...
def add_post_render_callback(self, callback: Callable[..., Any]) -> None: ...
def render(self) -> SimpleTemplateResponse: ...
@property
def is_rendered(self) -> bool: ...
@override
def __iter__(self) -> Iterator[Any]: ...
class TemplateResponse(SimpleTemplateResponse):
closed: bool
context_data: dict[str, Any] | None
cookies: SimpleCookie
_request: HttpRequest
status_code: int
template_name: _TemplateForResponseT
using: str | None
rendering_attrs: Any
def __init__(
self,
request: HttpRequest,
template: _TemplateForResponseT,
context: dict[str, Any] | None = ...,
content_type: str | None = ...,
status: int | None = ...,
charset: str | None = ...,
using: str | None = ...,
headers: dict[str, Any] | None = ...,
) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/template/smartif.pyi 0000664 0000000 0000000 00000002264 15260643574 0025454 0 ustar 00root root 0000000 0000000 from typing import Any, TypeAlias
from django.template.defaulttags import TemplateLiteral
from typing_extensions import override
_Token: TypeAlias = list[int] | int | str
class TokenBase:
id: Any
value: Any
first: Any
second: Any
lbp: int
def nud(self, parser: Any) -> None: ...
def led(self, left: Any, parser: Any) -> None: ...
def display(self) -> Any: ...
def infix(bp: Any, func: Any) -> type[TokenBase]: ...
def prefix(bp: Any, func: Any) -> type[TokenBase]: ...
OPERATORS: Any
class Literal(TokenBase):
id: str
value: _Token | None
def __init__(self, value: _Token | None) -> None: ...
@override
def display(self) -> str: ...
def eval(self, context: dict[Any, Any]) -> _Token | None: ...
EndToken: TokenBase
class IfParser:
error_class: Any
tokens: Any
pos: int
current_token: Any
def __init__(self, tokens: list[_Token | None]) -> None: ...
def translate_token(self, token: _Token | None) -> Literal: ...
def next_token(self) -> Literal: ...
def parse(self) -> TemplateLiteral: ...
def expression(self, rbp: int = 0) -> Literal: ...
def create_var(self, value: _Token | None) -> Literal: ...
typeddjango-django-stubs-fa03b48/django-stubs/template/utils.pyi 0000664 0000000 0000000 00000001264 15260643574 0025146 0 ustar 00root root 0000000 0000000 from collections.abc import Iterator
from pathlib import Path
from typing import Any
from django.core.exceptions import ImproperlyConfigured
from django.template.backends.base import BaseEngine
from django.utils.functional import cached_property
class InvalidTemplateEngineError(ImproperlyConfigured): ...
class EngineHandler:
def __init__(self, templates: list[dict[str, Any]] | None = None) -> None: ...
@cached_property
def templates(self) -> dict[str, Any]: ...
def __getitem__(self, alias: str) -> BaseEngine: ...
def __iter__(self) -> Iterator[Any]: ...
def all(self) -> list[BaseEngine]: ...
def get_app_template_dirs(dirname: str) -> tuple[Path, ...]: ...
typeddjango-django-stubs-fa03b48/django-stubs/templatetags/ 0000775 0000000 0000000 00000000000 15260643574 0024137 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/templatetags/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0026407 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/templatetags/cache.pyi 0000664 0000000 0000000 00000001165 15260643574 0025730 0 ustar 00root root 0000000 0000000 from typing import Any
from django.template import Node
from django.template.base import FilterExpression, NodeList, Parser, Token
register: Any
class CacheNode(Node):
nodelist: NodeList
expire_time_var: FilterExpression
fragment_name: str
vary_on: list[FilterExpression]
cache_name: FilterExpression | None
def __init__(
self,
nodelist: NodeList,
expire_time_var: FilterExpression,
fragment_name: str,
vary_on: list[FilterExpression],
cache_name: FilterExpression | None,
) -> None: ...
def do_cache(parser: Parser, token: Token) -> CacheNode: ...
typeddjango-django-stubs-fa03b48/django-stubs/templatetags/i18n.pyi 0000664 0000000 0000000 00000007132 15260643574 0025444 0 ustar 00root root 0000000 0000000 from typing import Any
from django.template import Node
from django.template.base import FilterExpression, NodeList, Parser, Token
from django.template.context import Context
from typing_extensions import override
register: Any
class GetAvailableLanguagesNode(Node):
variable: str
def __init__(self, variable: str) -> None: ...
@override
def render(self, context: Context) -> str: ...
class GetLanguageInfoNode(Node):
lang_code: FilterExpression
variable: str
def __init__(self, lang_code: FilterExpression, variable: str) -> None: ...
@override
def render(self, context: Context) -> str: ...
class GetLanguageInfoListNode(Node):
languages: FilterExpression
variable: str
def __init__(self, languages: FilterExpression, variable: str) -> None: ...
def get_language_info(self, language: Any) -> Any: ...
@override
def render(self, context: Context) -> str: ...
class GetCurrentLanguageNode(Node):
variable: str
def __init__(self, variable: str) -> None: ...
@override
def render(self, context: Context) -> str: ...
class GetCurrentLanguageBidiNode(Node):
variable: str
def __init__(self, variable: str) -> None: ...
@override
def render(self, context: Context) -> str: ...
class TranslateNode(Node):
noop: bool
asvar: str | None
message_context: FilterExpression | None
filter_expression: FilterExpression
def __init__(
self,
filter_expression: FilterExpression,
noop: bool,
asvar: str | None = None,
message_context: FilterExpression | None = None,
) -> None: ...
@override
def render(self, context: Context) -> str: ...
class BlockTranslateNode(Node):
extra_context: dict[str, FilterExpression]
singular: list[Token]
plural: list[Token]
countervar: str | None
counter: FilterExpression | None
message_context: FilterExpression | None
trimmed: bool
asvar: str | None
def __init__(
self,
extra_context: dict[str, FilterExpression],
singular: list[Token],
plural: list[Token] | None = None,
countervar: str | None = None,
counter: FilterExpression | None = None,
message_context: FilterExpression | None = None,
trimmed: bool = False,
asvar: str | None = None,
tag_name: str = "blocktranslate",
) -> None: ...
def render_token_list(self, tokens: list[Token]) -> tuple[str, list[str]]: ...
@override
def render(self, context: Context, nested: bool = False) -> str: ...
class LanguageNode(Node):
nodelist: NodeList
language: FilterExpression
def __init__(self, nodelist: NodeList, language: FilterExpression) -> None: ...
@override
def render(self, context: Context) -> str: ...
def do_get_available_languages(parser: Parser, token: Token) -> GetAvailableLanguagesNode: ...
def do_get_language_info(parser: Parser, token: Token) -> GetLanguageInfoNode: ...
def do_get_language_info_list(parser: Parser, token: Token) -> GetLanguageInfoListNode: ...
def language_name(lang_code: str) -> str: ...
def language_name_translated(lang_code: str) -> str: ...
def language_name_local(lang_code: str) -> str: ...
def language_bidi(lang_code: str) -> bool: ...
def do_get_current_language(parser: Parser, token: Token) -> GetCurrentLanguageNode: ...
def do_get_current_language_bidi(parser: Parser, token: Token) -> GetCurrentLanguageBidiNode: ...
def do_translate(parser: Parser, token: Token) -> TranslateNode: ...
def do_block_translate(parser: Parser, token: Token) -> BlockTranslateNode: ...
def language(parser: Parser, token: Token) -> LanguageNode: ...
typeddjango-django-stubs-fa03b48/django-stubs/templatetags/l10n.pyi 0000664 0000000 0000000 00000000632 15260643574 0025435 0 ustar 00root root 0000000 0000000 from typing import Any
from django.template import Node
from django.template.base import Parser, Token
register: Any
def localize(value: Any) -> str: ...
def unlocalize(value: Any) -> str: ...
class LocalizeNode(Node):
nodelist: list[Node]
use_l10n: bool
def __init__(self, nodelist: list[Node], use_l10n: bool) -> None: ...
def localize_tag(parser: Parser, token: Token) -> LocalizeNode: ...
typeddjango-django-stubs-fa03b48/django-stubs/templatetags/static.pyi 0000664 0000000 0000000 00000002165 15260643574 0026155 0 ustar 00root root 0000000 0000000 from typing import Any
from django import template
from django.template.base import FilterExpression, Parser, Token
from django.template.context import Context
register: Any
class PrefixNode(template.Node):
varname: str | None
name: str
def __init__(self, varname: str | None = None, name: str | None = None) -> None: ...
@classmethod
def handle_token(cls, parser: Parser, token: Token, name: str) -> PrefixNode: ...
@classmethod
def handle_simple(cls, name: str) -> str: ...
def get_static_prefix(parser: Parser, token: Token) -> PrefixNode: ...
def get_media_prefix(parser: Parser, token: Token) -> PrefixNode: ...
class StaticNode(template.Node):
path: FilterExpression
varname: str | None
def __init__(self, varname: str | None = None, path: FilterExpression | None = None) -> None: ...
def url(self, context: Context) -> str: ...
@classmethod
def handle_simple(cls, path: str) -> str: ...
@classmethod
def handle_token(cls, parser: Parser, token: Token) -> StaticNode: ...
def do_static(parser: Parser, token: Token) -> StaticNode: ...
def static(path: str) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/templatetags/tz.pyi 0000664 0000000 0000000 00000002017 15260643574 0025317 0 ustar 00root root 0000000 0000000 from datetime import datetime, tzinfo
from typing import Any
from django.template import Node
from django.template.base import FilterExpression, NodeList, Parser, Token
register: Any
class datetimeobject(datetime): ...
def localtime(value: datetime | str | None) -> Any: ...
def utc(value: datetime | str | None) -> Any: ...
def do_timezone(value: datetime | str | None, arg: tzinfo | str | None) -> Any: ...
class LocalTimeNode(Node):
nodelist: NodeList
use_tz: bool
def __init__(self, nodelist: NodeList, use_tz: bool) -> None: ...
class TimezoneNode(Node):
nodelist: NodeList
tz: FilterExpression
def __init__(self, nodelist: NodeList, tz: FilterExpression) -> None: ...
class GetCurrentTimezoneNode(Node):
variable: str
def __init__(self, variable: str) -> None: ...
def localtime_tag(parser: Parser, token: Token) -> LocalTimeNode: ...
def timezone_tag(parser: Parser, token: Token) -> TimezoneNode: ...
def get_current_timezone_tag(parser: Parser, token: Token) -> GetCurrentTimezoneNode: ...
typeddjango-django-stubs-fa03b48/django-stubs/test/ 0000775 0000000 0000000 00000000000 15260643574 0022424 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/test/__init__.pyi 0000664 0000000 0000000 00000002366 15260643574 0024715 0 ustar 00root root 0000000 0000000 from .client import AsyncClient as AsyncClient
from .client import AsyncRequestFactory as AsyncRequestFactory
from .client import Client as Client
from .client import RequestFactory as RequestFactory
from .testcases import LiveServerTestCase as LiveServerTestCase
from .testcases import SimpleTestCase as SimpleTestCase
from .testcases import TestCase as TestCase
from .testcases import TransactionTestCase as TransactionTestCase
from .testcases import skipIfDBFeature as skipIfDBFeature
from .testcases import skipUnlessAnyDBFeature as skipUnlessAnyDBFeature
from .testcases import skipUnlessDBFeature as skipUnlessDBFeature
from .utils import ignore_warnings as ignore_warnings
from .utils import modify_settings as modify_settings
from .utils import override_settings as override_settings
from .utils import override_system_checks as override_system_checks
from .utils import tag as tag
__all__ = [
"AsyncClient",
"AsyncRequestFactory",
"Client",
"LiveServerTestCase",
"RequestFactory",
"SimpleTestCase",
"TestCase",
"TransactionTestCase",
"ignore_warnings",
"modify_settings",
"override_settings",
"override_system_checks",
"skipIfDBFeature",
"skipUnlessAnyDBFeature",
"skipUnlessDBFeature",
"tag",
]
typeddjango-django-stubs-fa03b48/django-stubs/test/client.pyi 0000664 0000000 0000000 00000040577 15260643574 0024442 0 ustar 00root root 0000000 0000000 from collections.abc import AsyncIterable, AsyncIterator, Awaitable, Callable, Iterable, Iterator, Mapping
from http import HTTPStatus
from http.cookies import SimpleCookie
from io import BytesIO, IOBase
from json import JSONEncoder
from re import Pattern
from typing import Any, Generic, Literal, NoReturn, TypeAlias, TypedDict, type_check_only
from _typeshed import ExcInfo
from asgiref.typing import ASGIVersions
from django.contrib.auth.models import _User
from django.contrib.sessions.backends.base import SessionBase
from django.core.handlers.asgi import ASGIRequest
from django.core.handlers.base import BaseHandler
from django.core.handlers.wsgi import WSGIRequest
from django.http.request import HttpRequest
from django.http.response import HttpResponseBase
from django.template.base import Template
from django.test.utils import ContextList
from django.urls import ResolverMatch
from django.utils.functional import _StrOrPromise, cached_property
from typing_extensions import TypeVar, override
BOUNDARY: str
MULTIPART_CONTENT: str
CONTENT_TYPE_RE: Pattern[str]
JSON_CONTENT_TYPE_RE: Pattern[str]
REDIRECT_STATUS_CODES: frozenset[HTTPStatus]
class RedirectCycleError(Exception):
last_response: HttpResponseBase
redirect_chain: list[tuple[str, int]]
def __init__(self, message: str, last_response: HttpResponseBase) -> None: ...
class FakePayload(IOBase):
read_started: bool
def __init__(self, initial_bytes: bytes | str | None = ...) -> None: ...
def __len__(self) -> int: ...
@override
def read(self, size: int = ..., /) -> bytes: ...
@override
def readline(self, size: int | None = ..., /) -> bytes: ...
@override
def write(self, content: bytes | str, /) -> None: ...
_T = TypeVar("_T")
def closing_iterator_wrapper(iterable: Iterable[_T], close: Callable[[], Any]) -> Iterator[_T]: ...
async def aclosing_iterator_wrapper(iterable: AsyncIterable[_T], close: Callable[[], Any]) -> AsyncIterator[_T]: ...
def conditional_content_removal(request: HttpRequest, response: HttpResponseBase) -> HttpResponseBase: ...
@type_check_only
class _WSGIResponse(HttpResponseBase):
wsgi_request: WSGIRequest
@type_check_only
class _ASGIResponse(HttpResponseBase):
asgi_request: ASGIRequest
class ClientHandler(BaseHandler):
enforce_csrf_checks: bool
def __init__(self, enforce_csrf_checks: bool = ..., *args: Any, **kwargs: Any) -> None: ...
def __call__(self, environ: dict[str, Any]) -> _WSGIResponse: ...
class AsyncClientHandler(BaseHandler):
enforce_csrf_checks: bool
def __init__(self, enforce_csrf_checks: bool = ..., *args: Any, **kwargs: Any) -> None: ...
async def __call__(self, scope: dict[str, Any]) -> _ASGIResponse: ...
def encode_multipart(boundary: str, data: dict[str, Any]) -> bytes: ...
def encode_file(boundary: str, key: str, file: Any) -> list[bytes]: ...
_GetDataType: TypeAlias = (
Mapping[str, str | bytes | int | Iterable[str | bytes | int]]
| Iterable[tuple[str, str | bytes | int | Iterable[str | bytes | int]]]
| None
)
@type_check_only
class _RequestFactory(Generic[_T]):
json_encoder: type[JSONEncoder]
defaults: dict[str, str]
cookies: SimpleCookie
errors: BytesIO
def __init__(
self,
*,
json_encoder: type[JSONEncoder] = ...,
headers: Mapping[str, str] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**defaults: Any,
) -> None: ...
def request(self, **request: Any) -> _T: ...
def get(
self,
path: _StrOrPromise,
data: _GetDataType = ...,
secure: bool = ...,
*,
headers: Mapping[str, str] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _T: ...
def post(
self,
path: _StrOrPromise,
data: Any = ...,
content_type: str = ...,
secure: bool = ...,
*,
headers: Mapping[str, str] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _T: ...
def head(
self,
path: _StrOrPromise,
data: Any = ...,
secure: bool = ...,
*,
headers: Mapping[str, str] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _T: ...
def trace(
self,
path: _StrOrPromise,
secure: bool = ...,
*,
headers: Mapping[str, str] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _T: ...
def options(
self,
path: _StrOrPromise,
data: dict[str, str] | str = ...,
content_type: str = ...,
secure: bool = ...,
*,
headers: Mapping[str, str] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _T: ...
def put(
self,
path: _StrOrPromise,
data: Any = ...,
content_type: str = ...,
secure: bool = ...,
*,
headers: Mapping[str, str] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _T: ...
def patch(
self,
path: _StrOrPromise,
data: Any = ...,
content_type: str = ...,
secure: bool = ...,
*,
headers: Mapping[str, str] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _T: ...
def delete(
self,
path: _StrOrPromise,
data: Any = ...,
content_type: str = ...,
secure: bool = ...,
*,
headers: Mapping[str, str] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _T: ...
def generic(
self,
method: str,
path: _StrOrPromise,
data: Any = ...,
content_type: str | None = ...,
secure: bool = ...,
*,
headers: Mapping[str, str] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _T: ...
class RequestFactory(_RequestFactory[WSGIRequest]): ...
# A non total duplication of `asgiref.typing.HTTPScope`
@type_check_only
class _HTTPScope(TypedDict, total=False):
type: Literal["http"]
asgi: ASGIVersions
http_version: str
method: str
scheme: str
path: str
raw_path: bytes
query_string: bytes
root_path: str
headers: Iterable[tuple[bytes, bytes]]
client: tuple[str, int] | None
server: tuple[str, int | None] | None
state: dict[str, Any]
extensions: dict[str, dict[object, object]] | None
@type_check_only
class _AsyncRequestFactory(_RequestFactory[_T]):
defaults: _HTTPScope # type: ignore[assignment]
class AsyncRequestFactory(_AsyncRequestFactory[ASGIRequest]): ...
# fakes to distinguish WSGIRequest and ASGIRequest
@type_check_only
class _MonkeyPatchedWSGIResponse(_WSGIResponse):
def json(self) -> Any: ...
request: dict[str, Any]
client: Client
templates: list[Template]
# `context` and `context_data` are populated based on whether you use the standard template
# backend or a custom one respectively.
# `context_data` only exists if the response was successful too as the return type changes.
# `HTTPResponse` when API failed and `TemplateResponse` when successful.
# https://docs.djangoproject.com/en/stable/topics/testing/tools/#django.test.Response.context
context: ContextList | dict[str, Any]
# Must match `django.template.response.SimpleTemplateResponse.context_data`
context_data: dict[str, Any] | None
content: bytes
resolver_match: ResolverMatch
redirect_chain: list[tuple[str, int]]
@cached_property
def text(self) -> str: ...
@type_check_only
class _MonkeyPatchedASGIResponse(_ASGIResponse):
def json(self) -> Any: ...
request: dict[str, Any]
client: AsyncClient
templates: list[Template]
# `context` and `context_data` are populated based on whether you use the standard template
# backend or a custom one respectively.
# `context_data` only exists if the response was successful too as the return type changes.
# `HTTPResponse` when API failed and `TemplateResponse` when successful.
# https://docs.djangoproject.com/en/stable/topics/testing/tools/#django.test.Response.context
context: ContextList | dict[str, Any]
# Must match `django.template.response.SimpleTemplateResponse.context_data`
context_data: dict[str, Any] | None
content: bytes
resolver_match: ResolverMatch
redirect_chain: list[tuple[str, int]]
class ClientMixin:
def store_exc_info(self, **kwargs: object) -> None: ...
def check_exception(self, response: HttpResponseBase) -> NoReturn: ...
@property
def session(self) -> SessionBase: ...
async def asession(self) -> SessionBase: ...
def login(self, **credentials: Any) -> bool: ...
async def alogin(self, **credentials: Any) -> bool: ...
def force_login(self, user: _User, backend: str | None = ...) -> None: ...
async def aforce_login(self, user: _User, backend: str | None = ...) -> None: ...
def logout(self) -> None: ...
async def alogout(self) -> None: ...
class Client(ClientMixin, _RequestFactory[_MonkeyPatchedWSGIResponse]):
handler: ClientHandler
raise_request_exception: bool
exc_info: ExcInfo | None
extra: dict[str, Any] | None
headers: Mapping[str, str] | None
def __init__(
self,
enforce_csrf_checks: bool = ...,
raise_request_exception: bool = ...,
*,
headers: Mapping[str, str] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**defaults: Any,
) -> None: ...
@override
def request(self, **request: Any) -> _MonkeyPatchedWSGIResponse: ...
@override
def get( # type: ignore[override]
self,
path: _StrOrPromise,
data: _GetDataType = ...,
follow: bool = ...,
secure: bool = ...,
*,
headers: Mapping[str, str] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _MonkeyPatchedWSGIResponse: ...
@override
def post( # type: ignore[override]
self,
path: _StrOrPromise,
data: Any = ...,
content_type: str = ...,
follow: bool = ...,
secure: bool = ...,
*,
headers: Mapping[str, str] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _MonkeyPatchedWSGIResponse: ...
@override
def head( # type: ignore[override]
self,
path: _StrOrPromise,
data: Any = ...,
follow: bool = ...,
secure: bool = ...,
*,
headers: Mapping[str, str] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _MonkeyPatchedWSGIResponse: ...
@override
def options( # type: ignore[override]
self,
path: _StrOrPromise,
data: dict[str, str] | str = ...,
content_type: str = ...,
follow: bool = ...,
secure: bool = ...,
*,
headers: Mapping[str, str] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _MonkeyPatchedWSGIResponse: ...
@override
def put( # type: ignore[override]
self,
path: _StrOrPromise,
data: Any = ...,
content_type: str = ...,
follow: bool = ...,
secure: bool = ...,
*,
headers: Mapping[str, str] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _MonkeyPatchedWSGIResponse: ...
@override
def patch( # type: ignore[override]
self,
path: _StrOrPromise,
data: Any = ...,
content_type: str = ...,
follow: bool = ...,
secure: bool = ...,
*,
headers: Mapping[str, str] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _MonkeyPatchedWSGIResponse: ...
@override
def delete( # type: ignore[override]
self,
path: _StrOrPromise,
data: Any = ...,
content_type: str = ...,
follow: bool = ...,
secure: bool = ...,
*,
headers: Mapping[str, str] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _MonkeyPatchedWSGIResponse: ...
@override
def trace( # type: ignore[override]
self,
path: _StrOrPromise,
data: Any = ...,
follow: bool = ...,
secure: bool = ...,
*,
headers: Mapping[str, str] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _MonkeyPatchedWSGIResponse: ...
class AsyncClient(ClientMixin, _AsyncRequestFactory[Awaitable[_MonkeyPatchedASGIResponse]]):
handler: AsyncClientHandler
raise_request_exception: bool
exc_info: ExcInfo | None
extra: dict[str, Any] | None
headers: Mapping[str, str] | None
def __init__(
self,
enforce_csrf_checks: bool = ...,
raise_request_exception: bool = ...,
*,
headers: Mapping[str, str] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**defaults: Any,
) -> None: ...
@override
async def request(self, **request: Any) -> _MonkeyPatchedASGIResponse: ...
@override
async def get( # type: ignore[override]
self,
path: _StrOrPromise,
data: _GetDataType = ...,
follow: bool = ...,
secure: bool = ...,
*,
headers: Mapping[str, str] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _MonkeyPatchedASGIResponse: ...
@override
async def post( # type: ignore[override]
self,
path: _StrOrPromise,
data: Any = ...,
content_type: str = ...,
follow: bool = ...,
secure: bool = ...,
*,
headers: Mapping[str, str] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _MonkeyPatchedASGIResponse: ...
@override
async def head( # type: ignore[override]
self,
path: _StrOrPromise,
data: Any = ...,
follow: bool = ...,
secure: bool = ...,
*,
headers: Mapping[str, str] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _MonkeyPatchedASGIResponse: ...
@override
async def options( # type: ignore[override]
self,
path: _StrOrPromise,
data: dict[str, str] | str = ...,
content_type: str = ...,
follow: bool = ...,
secure: bool = ...,
*,
headers: Mapping[str, str] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _MonkeyPatchedASGIResponse: ...
@override
async def put( # type: ignore[override]
self,
path: _StrOrPromise,
data: Any = ...,
content_type: str = ...,
follow: bool = ...,
secure: bool = ...,
*,
headers: Mapping[str, str] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _MonkeyPatchedASGIResponse: ...
@override
async def patch( # type: ignore[override]
self,
path: _StrOrPromise,
data: Any = ...,
content_type: str = ...,
follow: bool = ...,
secure: bool = ...,
*,
headers: Mapping[str, str] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _MonkeyPatchedASGIResponse: ...
@override
async def delete( # type: ignore[override]
self,
path: _StrOrPromise,
data: Any = ...,
content_type: str = ...,
follow: bool = ...,
secure: bool = ...,
*,
headers: Mapping[str, str] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _MonkeyPatchedASGIResponse: ...
@override
async def trace( # type: ignore[override]
self,
path: _StrOrPromise,
data: Any = ...,
follow: bool = ...,
secure: bool = ...,
*,
headers: Mapping[str, str] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _MonkeyPatchedASGIResponse: ...
__all__ = (
"AsyncClient",
"AsyncRequestFactory",
"Client",
"RedirectCycleError",
"RequestFactory",
"encode_file",
"encode_multipart",
)
typeddjango-django-stubs-fa03b48/django-stubs/test/html.pyi 0000664 0000000 0000000 00000002443 15260643574 0024116 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from html.parser import HTMLParser
from re import Pattern
from typing import Any, TypeAlias
ASCII_WHITESPACE: Pattern[str]
BOOLEAN_ATTRIBUTES: set[str]
def normalize_whitespace(string: str) -> str: ...
def normalize_attributes(attributes: list[tuple[str, str | None]]) -> list[tuple[str, str | None]]: ...
_ElementAttribute: TypeAlias = tuple[str, str | None]
class Element:
name: str | None
attributes: list[_ElementAttribute]
children: list[Any]
def __init__(self, name: str | None, attributes: Sequence[_ElementAttribute]) -> None: ...
def append(self, element: Element | str) -> None: ...
def finalize(self) -> None: ...
def __contains__(self, element: Element | str) -> bool: ...
def count(self, element: Element | str) -> int: ...
def __getitem__(self, key: int) -> Any: ...
class RootElement(Element):
def __init__(self) -> None: ...
class HTMLParseError(Exception): ...
class Parser(HTMLParser):
root: Any
open_tags: Any
element_positions: Any
def __init__(self) -> None: ...
def error(self, msg: str) -> HTMLParseError: ...
def format_position(self, position: Any = ..., element: Any = ...) -> str: ...
@property
def current(self) -> Element: ...
def parse_html(html: str) -> Element: ...
typeddjango-django-stubs-fa03b48/django-stubs/test/runner.pyi 0000664 0000000 0000000 00000017262 15260643574 0024470 0 ustar 00root root 0000000 0000000 import logging
import sys
from argparse import ArgumentParser
from collections.abc import Callable, Iterable, Iterator, Sequence
from contextlib import AbstractContextManager
from typing import Any, Literal
from unittest import TestCase, TestLoader, TestResult, TestSuite, TextTestResult, TextTestRunner
from django.db.backends.base.base import BaseDatabaseWrapper
from django.test.testcases import SimpleTestCase
from django.test.testcases import TestCase as DjangoTestCase
from django.test.utils import TimeKeeperProtocol
from typing_extensions import override
class QueryFormatter(logging.Formatter): ...
class DebugSQLTextTestResult(TextTestResult):
logger: logging.Logger
def __init__(self, stream: Any, descriptions: bool, verbosity: int) -> None: ...
handler: logging.StreamHandler[Any]
@override
def startTest(self, test: TestCase) -> None: ...
@override
def stopTest(self, test: TestCase) -> None: ...
@override
def addError(self, test: Any, err: Any) -> None: ...
@override
def addFailure(self, test: Any, err: Any) -> None: ...
class PDBDebugResult(TextTestResult):
def debug(self, error: tuple[type[BaseException], BaseException, Any]) -> None: ...
class DummyList:
__slots__ = ()
def append(self, item: Any) -> None: ...
class RemoteTestResult(TestResult):
events: list[Any]
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
@property
def test_index(self) -> int: ...
def _confirm_picklable(self, obj: Any) -> None: ...
def check_picklable(self, test: Any, err: Any) -> None: ...
def check_subtest_picklable(self, test: Any, subtest: Any) -> None: ...
@override
def startTestRun(self) -> None: ...
@override
def stopTestRun(self) -> None: ...
@override
def startTest(self, test: Any) -> None: ...
@override
def stopTest(self, test: Any) -> None: ...
if sys.version_info >= (3, 12):
@override
def addDuration(self, test: Any, elapsed: Any) -> None: ...
else:
def addDuration(self, test: Any, elapsed: Any) -> None: ...
@override
def addError(self, test: Any, err: Any) -> None: ...
@override
def addFailure(self, test: Any, err: Any) -> None: ...
@override
def addSubTest(self, test: Any, subtest: Any, err: Any) -> None: ...
@override
def addSuccess(self, test: Any) -> None: ...
@override
def addSkip(self, test: Any, reason: Any) -> None: ...
@override
def addExpectedFailure(self, test: Any, err: Any) -> None: ...
@override
def addUnexpectedSuccess(self, test: Any) -> None: ...
@override
def wasSuccessful(self) -> bool: ...
class RemoteTestRunner:
resultclass: Any
failfast: bool
buffer: bool
def __init__(self, failfast: bool = ..., resultclass: Any | None = ..., buffer: bool = ...) -> None: ...
def run(self, test: Any) -> Any: ...
def get_max_test_processes() -> int: ...
def parallel_type(value: str) -> int | Literal["auto"]: ...
class ParallelTestSuite(TestSuite):
init_worker: Callable[..., Any]
process_setup: Callable[..., Any]
process_setup_args: tuple[Any, ...]
run_subsuite: Callable[..., Any]
runner_class: type[RemoteTestRunner]
subsuites: list[TestSuite]
processes: int
failfast: bool
debug_mode: bool
buffer: bool
initial_settings: dict[str, dict[str, Any]] | None
serialized_contents: dict[str, str] | None
used_aliases: set[str] | None
def __init__(
self,
subsuites: list[TestSuite],
processes: int,
failfast: bool = ...,
debug_mode: bool = ...,
buffer: bool = ...,
) -> None: ...
@override
def run(self, result: Any) -> Any: ... # type: ignore[override]
def handle_event(self, result: Any, tests: list[TestSuite], event: Sequence[Any]) -> None: ...
def initialize_suite(self) -> None: ...
class Shuffler:
hash_algorithm: str
seed: int
seed_source: str
def __init__(self, seed: int | None = ...) -> None: ...
@property
def seed_display(self) -> str: ...
def shuffle(self, items: Iterable[Any], key: Callable[[Any], str]) -> list[Any]: ...
class DiscoverRunner:
test_suite: type[TestSuite]
parallel_test_suite: type[ParallelTestSuite]
test_runner: type[TextTestRunner]
test_loader: TestLoader
reorder_by: tuple[type[DjangoTestCase], type[SimpleTestCase]]
pattern: str | None
top_level: str | None
verbosity: int
interactive: bool
failfast: bool
keepdb: bool
reverse: bool
debug_mode: bool
debug_sql: bool
parallel: int
tags: set[str]
exclude_tags: set[str]
pdb: bool
buffer: bool
test_name_patterns: set[str] | None
time_keeper: TimeKeeperProtocol
shuffle: int | Literal[False]
logger: logging.Logger | None
durations: int | None
def __init__(
self,
pattern: str | None = ...,
top_level: str | None = ...,
verbosity: int = ...,
interactive: bool = ...,
failfast: bool = ...,
keepdb: bool = ...,
reverse: bool = ...,
debug_mode: bool = ...,
debug_sql: bool = ...,
parallel: int = ...,
tags: list[str] | None = ...,
exclude_tags: list[str] | None = ...,
test_name_patterns: list[str] | None = ...,
pdb: bool = ...,
buffer: bool = ...,
enable_faulthandler: bool = ...,
timing: bool = ...,
shuffle: int | Literal[False] = ...,
logger: logging.Logger | None = ...,
durations: int | None = ...,
**kwargs: Any,
) -> None: ...
@classmethod
def add_arguments(cls, parser: ArgumentParser) -> None: ...
@property
def shuffle_seed(self) -> int | None: ...
def log(self, msg: str, level: int | None = ...) -> None: ...
def setup_test_environment(self, **kwargs: Any) -> None: ...
def setup_shuffler(self) -> None: ...
def load_with_patterns(self) -> AbstractContextManager[None]: ...
def load_tests_for_label(self, label: str, discover_kwargs: dict[str, str]) -> TestSuite: ...
def build_suite(self, test_labels: Sequence[str] | None = ..., **kwargs: Any) -> TestSuite: ...
def setup_databases(self, **kwargs: Any) -> list[tuple[BaseDatabaseWrapper, str, bool]]: ...
def get_resultclass(self) -> type[TextTestResult] | None: ...
def get_test_runner_kwargs(self) -> dict[str, Any]: ...
def run_checks(self, databases: set[str]) -> None: ...
def run_suite(self, suite: TestSuite, **kwargs: Any) -> TextTestResult: ...
def teardown_databases(self, old_config: list[tuple[BaseDatabaseWrapper, str, bool]], **kwargs: Any) -> None: ...
def teardown_test_environment(self, **kwargs: Any) -> None: ...
def suite_result(self, suite: TestSuite, result: TextTestResult, **kwargs: Any) -> int: ...
def _get_databases(self, suite: TestSuite) -> set[str]: ...
def get_databases(self, suite: TestSuite) -> set[str]: ...
def run_tests(self, test_labels: list[str], **kwargs: Any) -> int: ...
def try_importing(label: str) -> tuple[bool, bool]: ...
def find_top_level(top_level: str) -> str: ...
def shuffle_tests(tests: Iterable[TestCase], shuffler: Shuffler) -> Iterator[TestCase]: ...
def reorder_test_bin(
tests: Sequence[TestCase], shuffler: Shuffler | None = ..., reverse: bool = ...
) -> Iterator[TestCase]: ...
def reorder_tests(
tests: Iterable[TestCase],
classes: Sequence[type[TestCase]],
reverse: bool = ...,
shuffler: Shuffler | None = ...,
) -> Iterator[TestCase]: ...
def partition_suite_by_case(suite: TestSuite) -> list[TestSuite]: ...
def test_match_tags(test: TestCase, tags: set[str], exclude_tags: set[str]) -> bool: ...
def filter_tests_by_tags(tests: Iterable[TestCase], tags: set[str], exclude_tags: set[str]) -> Iterator[TestCase]: ...
typeddjango-django-stubs-fa03b48/django-stubs/test/selenium.pyi 0000664 0000000 0000000 00000004531 15260643574 0024773 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Sequence
from contextlib import AbstractContextManager
from types import TracebackType
from typing import Any, Self, TypeAlias
from _typeshed import Self as MetaclassSelf # noqa: TID251
from django.test import LiveServerTestCase
from typing_extensions import TypeVar
_F = TypeVar("_F", bound=Callable[..., Any])
_WebDriver: TypeAlias = Any
_Options: TypeAlias = Any
class SeleniumTestCaseBase(type):
browsers: Any
selenium_hub: str | None = None
external_host: str | None = None
browser: Any
headless: bool = False
def __new__(
cls: type[MetaclassSelf], name: str, bases: tuple[type, ...], attrs: dict[str, Any]
) -> MetaclassSelf: ...
@classmethod
def import_webdriver(cls, browser: Any) -> type[_WebDriver]: ...
@classmethod
def import_options(cls, browser: Any) -> type[_Options]: ...
@classmethod
def get_capability(cls, browser: Any) -> dict[str, Any]: ...
def create_options(self) -> _Options: ...
def create_webdriver(self) -> _WebDriver: ...
class ChangeWindowSize:
def __init__(self, width: int, height: int, selenium: Any) -> None: ...
def __enter__(self) -> Self: ...
def __exit__(
self,
exc_type: type[BaseException] | None,
exc_value: BaseException | None,
traceback: TracebackType | None,
) -> None: ...
class SeleniumTestCase(LiveServerTestCase, metaclass=SeleniumTestCaseBase):
tags: set[str]
implicit_wait: int
external_host: str | None = None
screenshots: bool = False
selenium: Any
def desktop_size(self) -> AbstractContextManager[None]: ...
def small_screen_size(self) -> AbstractContextManager[None]: ...
def mobile_size(self) -> AbstractContextManager[None]: ...
def rtl(self) -> AbstractContextManager[None]: ...
def dark(self) -> AbstractContextManager[None]: ...
def set_emulated_media(self, *, media: str | None = None, features: list[dict[str, str]] | None = None) -> None: ...
def high_contrast(self) -> AbstractContextManager[None]: ...
def take_screenshot(self, name: str) -> None: ...
def get_browser_logs(self, source: str | None = None, level: str = "ALL") -> list[dict[str, Any]]: ...
def disable_implicit_wait(self) -> AbstractContextManager[None]: ...
def screenshot_cases(method_names: str | Sequence[str]) -> Callable[[_F], _F]: ...
typeddjango-django-stubs-fa03b48/django-stubs/test/signals.pyi 0000664 0000000 0000000 00000002543 15260643574 0024613 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.signals import setting_changed as setting_changed
template_rendered: Any
COMPLEX_OVERRIDE_SETTINGS: Any
def clear_cache_handlers(*, setting: str, **kwargs: Any) -> None: ...
def update_installed_apps(*, setting: str, **kwargs: Any) -> None: ...
def update_connections_time_zone(*, setting: str, **kwargs: Any) -> None: ...
def clear_routers_cache(*, setting: str, **kwargs: Any) -> None: ...
def reset_template_engines(*, setting: str, **kwargs: Any) -> None: ...
def storages_changed(*, setting: str, **kwargs: Any) -> None: ...
def clear_serializers_cache(*, setting: str, **kwargs: Any) -> None: ...
def language_changed(*, setting: str, **kwargs: Any) -> None: ...
def localize_settings_changed(*, setting: str, **kwargs: Any) -> None: ...
def complex_setting_changed(*, setting: str, enter: bool, **kwargs: Any) -> None: ...
def root_urlconf_changed(*, setting: str, **kwargs: Any) -> None: ...
def static_storage_changed(*, setting: str, **kwargs: Any) -> None: ...
def static_finders_changed(*, setting: str, **kwargs: Any) -> None: ...
def form_renderer_changed(*, setting: str, **kwargs: Any) -> None: ...
def auth_password_validators_changed(*, setting: str, **kwargs: Any) -> None: ...
def user_model_swapped(*, setting: str, **kwargs: Any) -> None: ...
def update_logging_config(*, setting: str, **kwargs: Any) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/test/testcases.pyi 0000664 0000000 0000000 00000024540 15260643574 0025152 0 ustar 00root root 0000000 0000000 import threading
import unittest
from collections.abc import Callable, Iterable, Iterator, Mapping, Sequence
from contextlib import AbstractContextManager
from types import TracebackType
from typing import Any, Literal, Self, overload
from _typeshed import Unused
from django.core.exceptions import ImproperlyConfigured
from django.core.handlers.wsgi import WSGIHandler
from django.core.servers.basehttp import ThreadedWSGIServer, WSGIRequestHandler
from django.db import connections as connections
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models.base import Model
from django.db.models.query import QuerySet, RawQuerySet
from django.forms import BaseForm, BaseFormSet
from django.forms.fields import EmailField
from django.http import HttpRequest
from django.http.response import FileResponse, HttpResponseBase
from django.template.base import Template
from django.test.client import AsyncClient, Client
from django.test.html import Element
from django.test.utils import CaptureQueriesContext, ContextList
from django.utils.functional import _StrOrPromise, classproperty
from typing_extensions import override
def to_list(value: Any) -> list[Any]: ...
def assert_and_parse_html(self: Any, html: str, user_msg: str, msg: str) -> Element: ...
class _AssertNumQueriesContext(CaptureQueriesContext):
test_case: SimpleTestCase
num: int
def __init__(self, test_case: Any, num: Any, connection: BaseDatabaseWrapper) -> None: ...
class _AssertTemplateUsedContext:
test_case: SimpleTestCase
template_name: str
rendered_templates: list[Template]
context: ContextList
def __init__(self, test_case: Any, template_name: Any, msg_prefix: str = "", count: int | None = None) -> None: ...
def on_template_render(self, sender: Any, signal: Any, template: Any, context: Any, **kwargs: Any) -> None: ...
@property
def rendered_template_names(self) -> list[str]: ...
def test(self) -> None: ...
def __enter__(self) -> Self: ...
def __exit__(
self,
exc_type: type[BaseException] | None,
exc_value: BaseException | None,
traceback: TracebackType | None,
) -> None: ...
class _AssertTemplateNotUsedContext(_AssertTemplateUsedContext): ...
class _DatabaseFailure:
wrapped: Any
message: str
def __init__(self, wrapped: Any, message: str) -> None: ...
def __call__(self, *args: Unused, **kwargs: Unused) -> None: ...
class SimpleTestCase(unittest.TestCase):
client_class: type[Client]
client: Client
async_client_class: type[AsyncClient]
async_client: AsyncClient
databases: set[str] | Literal["__all__"]
@classmethod
def ensure_connection_patch_method(cls) -> None: ...
@override
def __call__(self, result: unittest.TestResult | None = None) -> None: ...
def settings(self, **kwargs: Any) -> Any: ...
def modify_settings(self, **kwargs: Any) -> Any: ...
def assertRedirects(
self,
response: HttpResponseBase,
expected_url: str,
status_code: int = 302,
target_status_code: int = 200,
msg_prefix: str = "",
fetch_redirect_response: bool = True,
) -> None: ...
def assertURLEqual(
self,
url1: _StrOrPromise,
url2: _StrOrPromise,
msg_prefix: str = "",
) -> None: ...
def assertContains(
self,
response: HttpResponseBase,
text: bytes | int | _StrOrPromise,
count: int | None = None,
status_code: int = 200,
msg_prefix: str = "",
html: bool = False,
) -> None: ...
def assertNotContains(
self,
response: HttpResponseBase,
text: bytes | int | _StrOrPromise,
status_code: int = 200,
msg_prefix: str = "",
html: bool = False,
) -> None: ...
def assertFormError(
self,
form: BaseForm,
field: str | None,
errors: list[str] | str,
msg_prefix: str = "",
) -> None: ...
def assertFormSetError(
self,
formset: BaseFormSet[Any],
form_index: int | None,
field: str | None,
errors: list[str] | str,
msg_prefix: str = "",
) -> None: ...
# with self.assertTemplateUsed("template.html"): ...
@overload
def assertTemplateUsed(
self,
response: str,
template_name: None = None,
msg_prefix: str = "",
count: int | None = None,
) -> _AssertTemplateUsedContext: ...
# with self.assertTemplateUsed(template_name="template.html"): ...
@overload
def assertTemplateUsed(
self,
response: None = None,
template_name: str | None = None,
msg_prefix: str = "",
count: int | None = None,
) -> _AssertTemplateUsedContext: ...
# self.assertTemplateUsed(response, "template.html")
@overload
def assertTemplateUsed(
self,
response: HttpResponseBase,
template_name: str | None = None,
msg_prefix: str = "",
count: int | None = None,
) -> None: ...
# with self.assertTemplateNotUsed("template.html"): ...
@overload
def assertTemplateNotUsed(
self, response: str, template_name: None = None, msg_prefix: str = ""
) -> _AssertTemplateNotUsedContext: ...
# with self.assertTemplateNotUsed(template_name="template.html"): ...
@overload
def assertTemplateNotUsed(
self, response: None = None, template_name: str | None = None, msg_prefix: str = ""
) -> _AssertTemplateNotUsedContext: ...
# self.assertTemplateNotUsed(response, "template.html")
@overload
def assertTemplateNotUsed(
self, response: HttpResponseBase, template_name: str | None = None, msg_prefix: str = ""
) -> None: ...
def assertRaisesMessage(
self, expected_exception: type[Exception], expected_message: str, *args: Any, **kwargs: Any
) -> Any: ...
def assertWarnsMessage(
self, expected_warning: type[Exception], expected_message: str, *args: Any, **kwargs: Any
) -> Any: ...
def assertFieldOutput(
self,
fieldclass: type[EmailField],
valid: dict[str, str],
invalid: dict[str, list[str]],
field_args: Iterable[Any] | None = None,
field_kwargs: Mapping[str, Any] | None = None,
empty_value: str = "",
) -> Any: ...
def assertHTMLEqual(self, html1: str, html2: str, msg: str | None = None) -> None: ...
def assertHTMLNotEqual(self, html1: str, html2: str, msg: str | None = None) -> None: ...
def assertInHTML(self, needle: str, haystack: str, count: int | None = None, msg_prefix: str = "") -> None: ...
def assertNotInHTML(self, needle: str, haystack: str, msg_prefix: str = "") -> None: ...
def assertJSONEqual(
self,
raw: str | bytes | bytearray,
expected_data: dict[str, Any] | list[Any] | str | int | float | bool | None,
msg: str | None = None,
) -> None: ...
def assertJSONNotEqual(
self,
raw: str | bytes | bytearray,
expected_data: dict[str, Any] | list[Any] | str | int | float | bool | None,
msg: str | None = None,
) -> None: ...
def assertXMLEqual(self, xml1: str, xml2: str, msg: str | None = None) -> None: ...
def assertXMLNotEqual(self, xml1: str, xml2: str, msg: str | None = None) -> None: ...
class TransactionTestCase(SimpleTestCase):
reset_sequences: bool
available_apps: Any
fixtures: Any
serialized_rollback: bool
def assertQuerySetEqual(
self,
qs: Iterator[Any] | list[Model] | QuerySet[Any] | RawQuerySet[Any],
values: Iterable[Any],
transform: Callable[[Model], Any] | type[str] | None = None,
ordered: bool = True,
msg: str | None = None,
) -> None: ...
@overload
def assertNumQueries(self, num: int, func: None = None, *, using: str = ...) -> _AssertNumQueriesContext: ...
@overload
def assertNumQueries(
self, num: int, func: Callable[..., Any], *args: Any, using: str = ..., **kwargs: Any
) -> None: ...
class TestCase(TransactionTestCase):
@classmethod
def setUpTestData(cls) -> None: ...
@classmethod
def captureOnCommitCallbacks(
cls, *, using: str = "default", execute: bool = False
) -> AbstractContextManager[list[Callable[[], Any]]]: ...
class CheckCondition:
conditions: Sequence[tuple[Callable[..., Any], str]]
def __init__(self, *conditions: tuple[Callable[..., Any], str]) -> None: ...
def add_condition(self, condition: Callable[..., Any], reason: str) -> CheckCondition: ...
def __get__(self, instance: None, cls: type[TransactionTestCase] | None = ...) -> bool: ...
def connections_support_transactions(aliases: Iterable[str] | None = None) -> bool: ...
def skipIfDBFeature(*features: Any) -> Callable[..., Any]: ...
def skipUnlessDBFeature(*features: Any) -> Callable[..., Any]: ...
def skipUnlessAnyDBFeature(*features: Any) -> Callable[..., Any]: ...
class QuietWSGIRequestHandler(WSGIRequestHandler): ...
class FSFilesHandler(WSGIHandler):
application: Any
base_url: Any
def __init__(self, application: Any) -> None: ...
def file_path(self, url: Any) -> str: ...
def serve(self, request: HttpRequest) -> FileResponse: ...
class _StaticFilesHandler(FSFilesHandler):
def get_base_dir(self) -> str: ...
def get_base_url(self) -> str: ...
class _MediaFilesHandler(FSFilesHandler):
def get_base_dir(self) -> str: ...
def get_base_url(self) -> str: ...
class LiveServerThread(threading.Thread):
host: str
port: int
is_ready: threading.Event
error: ImproperlyConfigured | None
static_handler: type[WSGIHandler]
connections_override: dict[str, BaseDatabaseWrapper] | None
server_class: type[ThreadedWSGIServer]
def __init__(
self,
host: str,
static_handler: type[WSGIHandler],
connections_override: dict[str, BaseDatabaseWrapper] | None = None,
port: int = 0,
) -> None: ...
httpd: ThreadedWSGIServer
def terminate(self) -> None: ...
class LiveServerTestCase(TransactionTestCase):
host: str
port: int
server_thread_class: type[Any]
server_thread: Any
static_handler: Any
@classproperty
def live_server_url(cls: Any) -> str: ...
@classproperty
def allowed_host(cls: Any) -> str: ...
class SerializeMixin:
lockfile: Any
@classmethod
def setUpClass(cls) -> None: ...
__all__ = ("SimpleTestCase", "TestCase", "TransactionTestCase", "skipIfDBFeature", "skipUnlessDBFeature")
typeddjango-django-stubs-fa03b48/django-stubs/test/utils.pyi 0000664 0000000 0000000 00000016312 15260643574 0024312 0 ustar 00root root 0000000 0000000 import decimal
from collections.abc import Callable, Iterable, Iterator, Mapping
from contextlib import AbstractContextManager
from decimal import Decimal
from io import StringIO
from logging import Logger
from types import TracebackType
from typing import Any, Protocol, Self, SupportsIndex, TypeAlias, type_check_only
from django.apps.registry import Apps
from django.conf import LazySettings, Settings
from django.core.checks.registry import CheckRegistry
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models.lookups import Lookup, Transform
from django.db.models.query_utils import RegisterLookupMixin
from django.test.runner import DiscoverRunner
from django.test.testcases import SimpleTestCase
from typing_extensions import TypeVar, override
_TestClass: TypeAlias = type[SimpleTestCase]
_DecoratedTest: TypeAlias = Callable[..., Any] | _TestClass
_DT = TypeVar("_DT", bound=_DecoratedTest)
# Django's TestContextDecorator.__call__ only checks isinstance(decorated, type)
# or callable(decorated) with no fixed signature — decorate_callable wraps using
# *args, **kwargs since the decorated function/method can have varying signatures.
# See: https://github.com/django/django/blob/main/django/test/utils.py
_C = TypeVar("_C", bound=Callable[..., Any]) # Any callable
TZ_SUPPORT: bool
class Approximate:
val: decimal.Decimal | float
places: int
def __init__(self, val: Decimal | float, places: int = ...) -> None: ...
class ContextList(list[dict[str, Any]]):
@override
def __getitem__(self, key: str | SupportsIndex | slice) -> Any: ...
def get(self, key: str, default: Any | None = ...) -> Any: ...
@override
def __contains__(self, key: object) -> bool: ...
def keys(self) -> set[str]: ...
class _TestState: ...
def setup_test_environment(debug: bool | None = ...) -> None: ...
def teardown_test_environment() -> None: ...
def get_runner(settings: LazySettings, test_runner_class: str | None = ...) -> type[DiscoverRunner]: ...
class TestContextDecorator:
attr_name: str | None
kwarg_name: str | None
def __init__(self, attr_name: str | None = ..., kwarg_name: str | None = ...) -> None: ...
def enable(self) -> Any: ...
def disable(self) -> None: ...
def __enter__(self) -> Apps | None: ...
def __exit__(
self,
exc_type: type[BaseException] | None,
exc_value: BaseException | None,
exc_tb: TracebackType | None,
) -> None: ...
def decorate_class(self, cls: _TestClass) -> _TestClass: ...
def decorate_callable(self, func: _C) -> _C: ...
def __call__(self, decorated: _DT) -> _DT: ...
class override_settings(TestContextDecorator):
enable_exception: Exception | None
options: dict[str, Any]
def __init__(self, **kwargs: Any) -> None: ...
wrapped: Settings
def save_options(self, test_func: _DecoratedTest) -> None: ...
@override
def decorate_class(self, cls: type) -> type: ...
class modify_settings(override_settings):
wrapped: Settings
operations: list[tuple[str, dict[str, list[str] | str]]]
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
@override
def save_options(self, test_func: _DecoratedTest) -> None: ...
options: dict[str, list[tuple[str, str] | str]]
class override_system_checks(TestContextDecorator):
registry: CheckRegistry
new_checks: list[Callable[..., Any]]
deployment_checks: list[Callable[..., Any]] | None
def __init__(
self, new_checks: list[Callable[..., Any]], deployment_checks: list[Callable[..., Any]] | None = ...
) -> None: ...
old_checks: set[Callable[..., Any]]
old_deployment_checks: set[Callable[..., Any]]
# Private API removed, iterable-based
class CaptureQueriesContext:
connection: BaseDatabaseWrapper
force_debug_cursor: bool
initial_queries: int
final_queries: int | None
def __init__(self, connection: BaseDatabaseWrapper) -> None: ...
def __iter__(self) -> Iterator[dict[str, str]]: ...
def __getitem__(self, index: int) -> dict[str, str]: ...
def __len__(self) -> int: ...
@property
def captured_queries(self) -> list[dict[str, str]]: ...
def __enter__(self) -> Self: ...
def __exit__(
self,
exc_type: type[BaseException] | None,
exc_value: BaseException | None,
exc_tb: TracebackType | None,
) -> None: ...
class ignore_warnings(TestContextDecorator):
ignore_kwargs: dict[str, Any]
filter_func: Callable[..., Any]
def __init__(self, **kwargs: Any) -> None: ...
catch_warnings: AbstractContextManager[list[Any] | None]
requires_tz_support: Any
def isolate_lru_cache(lru_cache_object: Callable[..., Any]) -> AbstractContextManager[None]: ...
class override_script_prefix(TestContextDecorator):
prefix: str
def __init__(self, prefix: str) -> None: ...
old_prefix: str
class LoggingCaptureMixin:
logger: Logger
old_stream: Any
logger_output: Any
def setUp(self) -> None: ...
def tearDown(self) -> None: ...
class isolate_apps(TestContextDecorator):
installed_apps: tuple[str, ...]
def __init__(self, *installed_apps: Any, **kwargs: Any) -> None: ...
old_apps: Apps
def extend_sys_path(*paths: str) -> AbstractContextManager[None]: ...
def captured_output(stream_name: str) -> AbstractContextManager[StringIO]: ...
def captured_stdin() -> AbstractContextManager[StringIO]: ...
def captured_stdout() -> AbstractContextManager[StringIO]: ...
def captured_stderr() -> AbstractContextManager[StringIO]: ...
def freeze_time(t: float) -> AbstractContextManager[None]: ...
def tag(*tags: str) -> Callable[[_C], _C]: ...
_Signature: TypeAlias = str
_TestDatabase: TypeAlias = tuple[str, list[str]]
@type_check_only
class TimeKeeperProtocol(Protocol):
def timed(self, name: Any) -> AbstractContextManager[None]: ...
def print_results(self) -> None: ...
def dependency_ordered(
test_databases: Iterable[tuple[_Signature, _TestDatabase]], dependencies: Mapping[str, list[str]]
) -> list[tuple[_Signature, _TestDatabase]]: ...
def get_unique_databases_and_mirrors(
aliases: set[str] | None = ...,
) -> tuple[dict[_Signature, _TestDatabase], dict[str, Any]]: ...
def setup_databases(
verbosity: int,
interactive: bool,
*,
time_keeper: TimeKeeperProtocol | None = ...,
keepdb: bool = ...,
debug_sql: bool = ...,
parallel: int = ...,
aliases: Mapping[str, Any] | None = ...,
serialized_aliases: Iterable[str] | None = ...,
**kwargs: Any,
) -> list[tuple[BaseDatabaseWrapper, str, bool]]: ...
def teardown_databases(
old_config: Iterable[tuple[Any, str, bool]], verbosity: int, parallel: int = ..., keepdb: bool = ...
) -> None: ...
def require_jinja2(test_func: _C) -> _C: ...
def register_lookup(
field: type[RegisterLookupMixin], *lookups: type[Lookup | Transform], lookup_name: str | None = ...
) -> AbstractContextManager[None]: ...
def garbage_collect() -> None: ...
__all__ = (
"Approximate",
"CaptureQueriesContext",
"ContextList",
"garbage_collect",
"get_runner",
"ignore_warnings",
"isolate_apps",
"isolate_lru_cache",
"modify_settings",
"override_settings",
"override_system_checks",
"requires_tz_support",
"setup_databases",
"setup_test_environment",
"tag",
"teardown_test_environment",
)
typeddjango-django-stubs-fa03b48/django-stubs/urls/ 0000775 0000000 0000000 00000000000 15260643574 0022432 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/urls/__init__.pyi 0000664 0000000 0000000 00000004052 15260643574 0024715 0 ustar 00root root 0000000 0000000 from typing import TypeAlias
# noinspection PyUnresolvedReferences
from .base import clear_script_prefix as clear_script_prefix
from .base import clear_url_caches as clear_url_caches
from .base import get_script_prefix as get_script_prefix
from .base import get_urlconf as get_urlconf
from .base import is_valid_path as is_valid_path
from .base import resolve as resolve
from .base import reverse as reverse
from .base import reverse_lazy as reverse_lazy
from .base import set_script_prefix as set_script_prefix
from .base import set_urlconf as set_urlconf
from .base import translate_url as translate_url
# noinspection PyUnresolvedReferences
from .conf import include as include
from .conf import path as path
from .conf import re_path as re_path
# noinspection PyUnresolvedReferences
from .converters import register_converter as register_converter
# noinspection PyUnresolvedReferences
from .exceptions import NoReverseMatch as NoReverseMatch
from .exceptions import Resolver404 as Resolver404
# noinspection PyUnresolvedReferences
from .resolvers import LocalePrefixPattern as LocalePrefixPattern
from .resolvers import ResolverMatch as ResolverMatch
from .resolvers import URLPattern as URLPattern
from .resolvers import URLResolver as URLResolver
from .resolvers import get_ns_resolver as get_ns_resolver
from .resolvers import get_resolver as get_resolver
# noinspection PyUnresolvedReferences
from .utils import get_callable as get_callable
from .utils import get_mod_func as get_mod_func
_AnyURL: TypeAlias = URLPattern | URLResolver # noqa: PYI047
__all__ = [
"LocalePrefixPattern",
"NoReverseMatch",
"Resolver404",
"ResolverMatch",
"URLPattern",
"URLResolver",
"clear_script_prefix",
"clear_url_caches",
"get_callable",
"get_mod_func",
"get_ns_resolver",
"get_resolver",
"get_script_prefix",
"get_urlconf",
"include",
"is_valid_path",
"path",
"re_path",
"register_converter",
"resolve",
"reverse",
"reverse_lazy",
"set_script_prefix",
"set_urlconf",
"translate_url",
]
typeddjango-django-stubs-fa03b48/django-stubs/urls/base.pyi 0000664 0000000 0000000 00000003411 15260643574 0024066 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Mapping, Sequence
from typing import Any, Literal, TypeAlias
from django.http.request import QueryDict
from django.http.response import HttpResponseBase
from django.urls.resolvers import ResolverMatch
from django.utils.functional import _StrPromise
# https://github.com/python/typeshed/blob/87f599dc8312ac67b941b5f2b47274534a1a2d3a/stdlib/urllib/parse.pyi#L136-L138
_QueryType: TypeAlias = (
Mapping[Any, Any] | Mapping[Any, Sequence[Any]] | Sequence[tuple[Any, Any]] | Sequence[tuple[Any, Sequence[Any]]]
)
def resolve(path: str | _StrPromise, urlconf: str | None = None) -> ResolverMatch: ...
# NOTE: make sure `reverse` and `reverse_lazy` objects are in sync:
def reverse(
viewname: Callable[..., HttpResponseBase] | str | None,
urlconf: str | None = None,
args: Sequence[Any] | None = None,
kwargs: dict[str, Any] | None = None,
current_app: str | None = None,
*,
query: QueryDict | _QueryType | None = None,
fragment: str | None = None,
) -> str: ...
def reverse_lazy(
viewname: Callable[..., HttpResponseBase] | str | None,
urlconf: str | None = None,
args: Sequence[Any] | None = None,
kwargs: dict[str, Any] | None = None,
current_app: str | None = None,
*,
query: QueryDict | _QueryType | None = None,
fragment: str | None = None,
) -> _StrPromise: ...
def clear_url_caches() -> None: ...
def set_script_prefix(prefix: str) -> None: ...
def get_script_prefix() -> str: ...
def clear_script_prefix() -> None: ...
def set_urlconf(urlconf_name: str | None) -> None: ...
def get_urlconf(default: str | None = None) -> str | None: ...
def is_valid_path(path: str, urlconf: str | None = None) -> Literal[False] | ResolverMatch: ...
def translate_url(url: str, lang_code: str) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/urls/conf.pyi 0000664 0000000 0000000 00000003734 15260643574 0024111 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Coroutine, Sequence
from types import ModuleType
from typing import Any, TypeAlias, overload
from django.urls import URLPattern, URLResolver, _AnyURL
from django.utils.functional import _StrOrPromise
from ..http.response import HttpResponseBase
_URLConf: TypeAlias = str | ModuleType | Sequence[_AnyURL]
_IncludedURLConf: TypeAlias = tuple[Sequence[URLResolver | URLPattern], str | None, str | None]
def include(arg: _URLConf | tuple[_URLConf, str], namespace: str | None = None) -> _IncludedURLConf: ...
# path()
@overload
def path(
route: _StrOrPromise,
view: Callable[..., HttpResponseBase],
kwargs: dict[str, Any] | None = None,
name: str | None = None,
) -> URLPattern: ...
@overload
def path(
route: _StrOrPromise,
view: Callable[..., Coroutine[Any, Any, HttpResponseBase]],
kwargs: dict[str, Any] | None = None,
name: str | None = None,
) -> URLPattern: ...
@overload
def path(
route: _StrOrPromise, view: _IncludedURLConf, kwargs: dict[str, Any] | None = None, name: str | None = None
) -> URLResolver: ...
@overload
def path(
route: _StrOrPromise,
view: Sequence[URLResolver | str],
kwargs: dict[str, Any] | None = None,
name: str | None = None,
) -> URLResolver: ...
# re_path()
@overload
def re_path(
route: _StrOrPromise,
view: Callable[..., HttpResponseBase],
kwargs: dict[str, Any] | None = None,
name: str | None = None,
) -> URLPattern: ...
@overload
def re_path(
route: _StrOrPromise,
view: Callable[..., Coroutine[Any, Any, HttpResponseBase]],
kwargs: dict[str, Any] | None = None,
name: str | None = None,
) -> URLPattern: ...
@overload
def re_path(
route: _StrOrPromise, view: _IncludedURLConf, kwargs: dict[str, Any] | None = None, name: str | None = None
) -> URLResolver: ...
@overload
def re_path(
route: _StrOrPromise,
view: Sequence[URLResolver | str],
kwargs: dict[str, Any] | None = None,
name: str | None = None,
) -> URLResolver: ...
typeddjango-django-stubs-fa03b48/django-stubs/urls/converters.pyi 0000664 0000000 0000000 00000001715 15260643574 0025353 0 ustar 00root root 0000000 0000000 from typing import Any, Protocol, type_check_only
from uuid import UUID
@type_check_only
class _Converter(Protocol):
regex: str
def __init__(self) -> None: ...
def to_python(self, value: str) -> Any: ...
def to_url(self, value: Any) -> str: ...
class IntConverter:
regex: str
def to_python(self, value: str) -> int: ...
def to_url(self, value: str | int) -> str: ...
class StringConverter:
regex: str
def to_python(self, value: str) -> str: ...
def to_url(self, value: str) -> str: ...
class UUIDConverter:
regex: str
def to_python(self, value: str) -> UUID: ...
def to_url(self, value: str | UUID) -> str: ...
class SlugConverter(StringConverter): ...
class PathConverter(StringConverter): ...
DEFAULT_CONVERTERS: dict[str, _Converter]
REGISTERED_CONVERTERS: dict[str, _Converter]
def register_converter(converter: type[_Converter], type_name: str) -> None: ...
def get_converters() -> dict[str, _Converter]: ...
typeddjango-django-stubs-fa03b48/django-stubs/urls/exceptions.pyi 0000664 0000000 0000000 00000000146 15260643574 0025337 0 ustar 00root root 0000000 0000000 from django.http import Http404
class Resolver404(Http404): ...
class NoReverseMatch(Exception): ...
typeddjango-django-stubs-fa03b48/django-stubs/urls/resolvers.pyi 0000664 0000000 0000000 00000011570 15260643574 0025205 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterator, Sequence
from re import Pattern
from types import ModuleType
from typing import Any, TypeAlias, overload
from django.core.checks.messages import CheckMessage
from django.http import HttpRequest, HttpResponse
from django.urls import _AnyURL
from django.utils.datastructures import MultiValueDict
from django.utils.functional import cached_property
class ResolverMatch:
func: Callable[..., Any]
args: tuple[Any, ...]
kwargs: dict[str, Any]
url_name: str | None
app_names: list[str]
app_name: str
namespaces: list[str]
namespace: str
view_name: str
route: str
tried: Any | None
_func_path: str
def __init__(
self,
func: Callable[..., Any],
args: tuple[Any, ...],
kwargs: dict[str, Any],
url_name: str | None = None,
app_names: list[str | None] | None = None,
namespaces: list[str | None] | None = None,
route: str | None = None,
tried: Any | None = None,
captured_kwargs: dict[str, Any] | None = None,
extra_kwargs: dict[str, Any] | None = None,
) -> None: ...
def __getitem__(self, index: int) -> Any: ...
# for tuple unpacking -- python/mypy#2220
def __iter__(self) -> Iterator[Any]: ...
def get_resolver(urlconf: str | None = None) -> URLResolver: ...
def get_ns_resolver(ns_pattern: str, resolver: URLResolver, converters: tuple[Any, ...]) -> URLResolver: ...
_Pattern: TypeAlias = RegexPattern | RoutePattern | LocalePrefixPattern
class LocaleRegexDescriptor:
@overload
def __get__(self, instance: None, cls: type[_Pattern] | None = None) -> LocaleRegexDescriptor: ...
@overload
def __get__(self, instance: _Pattern, cls: type[_Pattern] | None = None) -> Pattern[str]: ...
class CheckURLMixin:
def describe(self) -> str: ...
class RegexPattern(CheckURLMixin):
regex: LocaleRegexDescriptor
name: str | None
converters: dict[str, Any]
def __init__(self, regex: str, name: str | None = None, is_endpoint: bool = False) -> None: ...
def match(self, path: str) -> tuple[str, tuple[Any, ...], dict[str, str]] | None: ...
def check(self) -> list[CheckMessage]: ...
whitespace_set: frozenset[str]
class LocaleRegexRouteDescriptor:
def __get__(self, instance: RoutePattern | None, cls: type | None = None) -> Pattern[str]: ...
class RoutePattern(CheckURLMixin):
regex: LocaleRegexRouteDescriptor
name: str | None
converters: dict[str, Any]
def __init__(self, route: str, name: str | None = None, is_endpoint: bool = False) -> None: ...
def match(self, path: str) -> tuple[str, tuple[Any, ...], dict[str, int | str]] | None: ...
def check(self) -> list[CheckMessage]: ...
class LocalePrefixPattern:
prefix_default_language: bool
converters: dict[str, Any]
def __init__(self, prefix_default_language: bool = True) -> None: ...
@property
def regex(self) -> Pattern[str]: ...
@property
def language_prefix(self) -> str: ...
def match(self, path: str) -> tuple[str, tuple[Any, ...], dict[str, Any]] | None: ...
def check(self) -> list[CheckMessage]: ...
def describe(self) -> str: ...
class URLPattern:
pattern: _Pattern
callback: Callable[..., Any]
default_args: dict[str, Any]
name: str | None
def __init__(
self,
pattern: _Pattern,
callback: Callable[..., Any],
default_args: dict[str, Any] | None = None,
name: str | None = None,
) -> None: ...
def check(self) -> list[CheckMessage]: ...
def resolve(self, path: str) -> ResolverMatch | None: ...
@cached_property
def lookup_str(self) -> str: ...
class URLResolver:
pattern: _Pattern
urlconf_name: str | Sequence[_AnyURL] | ModuleType
callback: None
default_kwargs: dict[str, Any]
namespace: str | None
app_name: str | None
_local: Any
_reverse_dict: MultiValueDict[Any, Any]
def __init__(
self,
pattern: _Pattern,
urlconf_name: str | Sequence[_AnyURL] | ModuleType,
default_kwargs: dict[str, Any] | None = None,
app_name: str | None = None,
namespace: str | None = None,
) -> None: ...
@property
def reverse_dict(self) -> MultiValueDict[Any, Any]: ...
@property
def namespace_dict(self) -> dict[str, tuple[str, URLResolver]]: ...
@property
def app_dict(self) -> dict[str, list[str]]: ...
@cached_property
def urlconf_module(self) -> ModuleType | Sequence[_AnyURL] | None: ...
@cached_property
def url_patterns(self) -> list[_AnyURL]: ...
def check(self) -> list[CheckMessage]: ...
def _populate(self) -> None: ...
def _is_callback(self, name: str) -> bool: ...
def resolve(self, path: str) -> ResolverMatch: ...
def resolve_error_handler(self, view_type: int) -> Callable[[HttpRequest], HttpResponse]: ...
def reverse(self, lookup_view: str, *args: Any, **kwargs: Any) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/urls/utils.pyi 0000664 0000000 0000000 00000000310 15260643574 0024307 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any
def get_callable(lookup_view: Callable[..., Any] | str) -> Callable[..., Any]: ...
def get_mod_func(callback: str) -> tuple[str, str]: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/ 0000775 0000000 0000000 00000000000 15260643574 0022605 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/utils/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0025055 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/utils/_os.pyi 0000664 0000000 0000000 00000000625 15260643574 0024113 0 ustar 00root root 0000000 0000000 from pathlib import Path
from _typeshed import StrPath
def makedirs(name: StrPath, mode: int = 0o777, exist_ok: bool = False, *, parent_mode: int | None = None) -> None: ...
def safe_makedirs(name: StrPath, mode: int = 0o777, exist_ok: bool = False) -> None: ...
def safe_join(base: StrPath, *paths: StrPath) -> str: ...
def symlinks_supported() -> bool: ...
def to_path(value: Path | str) -> Path: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/archive.pyi 0000664 0000000 0000000 00000003021 15260643574 0024745 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable, Sequence
from types import TracebackType
from typing import Any, Self
from typing_extensions import override
class ArchiveException(Exception): ...
class UnrecognizedArchiveFormat(ArchiveException): ...
def extract(path: str, to_path: str) -> None: ...
class Archive:
def __init__(self, file: str) -> None: ...
def __enter__(self) -> Self: ...
def __exit__(
self,
exc_type: type[BaseException] | None,
exc_value: BaseException | None,
traceback: TracebackType | None,
) -> None: ...
def extract(self, to_path: str) -> None: ...
def list(self) -> None: ...
def close(self) -> None: ...
class BaseArchive:
def split_leading_dir(self, path: str) -> Sequence[str]: ...
def has_leading_dir(self, paths: Iterable[str]) -> bool: ...
def target_filename(self, to_path: str, name: str) -> str: ...
def extract(self, to_path: str) -> None: ...
def list(self, *args: Any, **kwargs: Any) -> None: ...
class TarArchive(BaseArchive):
def __init__(self, file: str) -> None: ...
@override
def list(self, *args: Any, **kwargs: Any) -> None: ...
def close(self) -> None: ...
@override
def extract(self, to_path: str) -> None: ...
class ZipArchive(BaseArchive):
def __init__(self, file: str) -> None: ...
@override
def list(self, *args: Any, **kwargs: Any) -> None: ...
@override
def extract(self, to_path: str) -> None: ...
def close(self) -> None: ...
extension_map: dict[str, type[BaseArchive]]
typeddjango-django-stubs-fa03b48/django-stubs/utils/asyncio.pyi 0000664 0000000 0000000 00000000423 15260643574 0024774 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any, overload
from typing_extensions import TypeVar
_C = TypeVar("_C", bound=Callable[..., Any])
@overload
def async_unsafe(message: str) -> Callable[[_C], _C]: ...
@overload
def async_unsafe(message: _C) -> _C: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/autoreload.pyi 0000664 0000000 0000000 00000006003 15260643574 0025466 0 ustar 00root root 0000000 0000000 import threading
import types
from collections import defaultdict
from collections.abc import Callable, Iterable, Iterator
from logging import Logger
from pathlib import Path
from typing import Any
from _typeshed import StrPath
from django.apps.registry import Apps
from django.dispatch import Signal
from django.utils.functional import cached_property
from typing_extensions import ParamSpec, override
_P = ParamSpec("_P")
logger: Logger
autoreload_started: Signal
file_changed: Signal
DJANGO_AUTORELOAD_ENV: str
def is_django_module(module: types.ModuleType) -> bool: ...
def is_django_path(path: StrPath) -> bool: ...
def check_errors(fn: Callable[_P, Any]) -> Callable[_P, None]: ...
def raise_last_exception() -> None: ...
def ensure_echo_on() -> None: ...
def iter_all_python_module_files() -> set[Path]: ...
def iter_modules_and_files(modules: Iterable[types.ModuleType], extra_files: Iterable[StrPath]) -> frozenset[Path]: ...
def common_roots(paths: Iterable[Path]) -> Iterable[Path]: ...
def sys_path_directories() -> Iterator[Path]: ...
def get_child_arguments() -> list[str]: ...
def trigger_reload(filename: str) -> None: ...
def restart_with_reloader() -> int: ...
class BaseReloader:
extra_files: set[Path]
directory_globs: dict[Path, set[str]]
def __init__(self) -> None: ...
def watch_dir(self, path: StrPath, glob: str) -> None: ...
def watched_files(self, include_globs: bool = True) -> Iterator[Path]: ...
def wait_for_apps_ready(self, app_reg: Apps, django_main_thread: threading.Thread) -> bool: ...
def run(self, django_main_thread: threading.Thread) -> None: ...
def run_loop(self) -> None: ...
def tick(self) -> Iterator[None]: ...
@classmethod
def check_availability(cls) -> bool | None: ...
def notify_file_changed(self, path: StrPath) -> None: ...
@property
def should_stop(self) -> bool: ...
def stop(self) -> None: ...
class StatReloader(BaseReloader):
SLEEP_TIME: int
def snapshot_files(self) -> Iterator[tuple[Path, float]]: ...
@classmethod
@override
def check_availability(cls) -> bool: ...
class WatchmanUnavailable(RuntimeError): ...
class WatchmanReloader(BaseReloader):
roots: defaultdict[Any, set[Any]]
processed_request: threading.Event
client_timeout: int
def __init__(self) -> None: ...
@cached_property
def client(self) -> Any: ... # Any: pywatchman.client (optional third-party)
def watched_roots(self, watched_files: Iterable[Path]) -> frozenset[Path]: ...
def update_watches(self) -> None: ...
def request_processed(self, **kwargs: Any) -> None: ...
@override
def stop(self) -> None: ...
def check_server_status(self, inner_ex: BaseException | None = None) -> bool: ...
@classmethod
@override
def check_availability(cls) -> None: ...
def get_reloader() -> BaseReloader: ...
def start_django(reloader: BaseReloader, main_func: Callable[..., Any], *args: Any, **kwargs: Any) -> None: ...
def run_with_reloader(main_func: Callable[..., Any], *args: Any, **kwargs: Any) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/cache.pyi 0000664 0000000 0000000 00000002464 15260643574 0024401 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable
from typing import Any
from django.core.cache.backends.base import BaseCache
from django.http.request import HttpRequest
from django.http.response import HttpResponse, HttpResponseBase
def patch_cache_control(response: HttpResponseBase, **kwargs: Any) -> None: ...
def get_max_age(response: HttpResponseBase) -> int | None: ...
def set_response_etag(response: HttpResponseBase) -> HttpResponseBase: ...
def get_conditional_response(
request: HttpRequest,
etag: str | None = None,
last_modified: int | None = None,
response: HttpResponse | None = None,
) -> HttpResponse | None: ...
def patch_response_headers(response: HttpResponseBase, cache_timeout: int | None = None) -> None: ...
def add_never_cache_headers(response: HttpResponseBase) -> None: ...
def patch_vary_headers(response: HttpResponseBase, newheaders: Iterable[str]) -> None: ...
def has_vary_header(response: HttpResponseBase, header_query: str) -> bool: ...
def get_cache_key(
request: HttpRequest, key_prefix: str | None = None, method: str = "GET", cache: BaseCache | None = None
) -> str | None: ...
def learn_cache_key(
request: HttpRequest,
response: HttpResponseBase,
cache_timeout: float | None = None,
key_prefix: str | None = None,
cache: BaseCache | None = None,
) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/choices.pyi 0000664 0000000 0000000 00000002755 15260643574 0024756 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterable, Iterator, Mapping
from typing import Any, Protocol, TypeAlias, type_check_only
from django.db.models import Choices
from typing_extensions import TypeVar
_Choice: TypeAlias = tuple[Any, Any]
_ChoiceNamedGroup: TypeAlias = tuple[str, Iterable[_Choice]]
_Choices: TypeAlias = Iterable[_Choice | _ChoiceNamedGroup]
_ChoicesMapping: TypeAlias = Mapping[Any, Any]
_ChoicesPrimitive: TypeAlias = _Choices | _ChoicesMapping | type[Choices]
_ChoicesInput: TypeAlias = _ChoicesPrimitive | Callable[[], _ChoicesPrimitive] # noqa: PYI047
@type_check_only
class _ChoicesCallable(Protocol):
def __call__(self) -> _Choices: ...
class BaseChoiceIterator:
def __getitem__(self, index: int) -> _Choice | _ChoiceNamedGroup: ...
def __iter__(self) -> Iterator[_Choice | _ChoiceNamedGroup]: ...
class BlankChoiceIterator(BaseChoiceIterator):
choices: _Choices
blank_choice: _Choices
def __init__(self, choices: _Choices, blank_choice: _Choices) -> None: ...
class CallableChoiceIterator(BaseChoiceIterator):
func: _ChoicesCallable
def __init__(self, func: _ChoicesCallable) -> None: ...
_V = TypeVar("_V")
_L = TypeVar("_L")
def flatten_choices(choices: Iterable[tuple[_V, _L | Iterable[tuple[_V, _L]]]]) -> Iterator[tuple[_V, _L]]: ...
def normalize_choices(value: Any, *, depth: int = 0) -> Any: ...
__all__ = [
"BaseChoiceIterator",
"BlankChoiceIterator",
"CallableChoiceIterator",
"flatten_choices",
"normalize_choices",
]
typeddjango-django-stubs-fa03b48/django-stubs/utils/connection.pyi 0000664 0000000 0000000 00000002701 15260643574 0025467 0 ustar 00root root 0000000 0000000 from collections.abc import Iterator, Sequence
from typing import Any, Generic
from django.db.models.query import _SupportsContains
from django.utils.functional import cached_property
from typing_extensions import TypeVar, override
_T = TypeVar("_T")
class ConnectionProxy(Generic[_T]):
def __init__(self, connections: BaseConnectionHandler[_T], alias: str) -> None: ...
def __getattr__(self, item: str) -> Any: ...
@override
def __setattr__(self, name: str, value: Any) -> None: ...
@override
def __delattr__(self, name: str) -> None: ...
def __contains__(self, key: str) -> bool: ...
@override
def __eq__(self, other: object) -> bool: ...
class ConnectionDoesNotExist(Exception): ...
class BaseConnectionHandler(_SupportsContains[str], Generic[_T]):
settings_name: str | None
exception_class: type[Exception]
thread_critical: bool
@cached_property
def settings(self) -> dict[str, Any]: ...
def __init__(self, settings: Any | None = None) -> None: ...
def configure_settings(self, settings: dict[str, Any] | None) -> dict[str, Any]: ...
def create_connection(self, alias: str) -> _T: ...
def __getitem__(self, alias: str) -> _T: ...
def __setitem__(self, key: str, value: _T) -> None: ...
def __delitem__(self, key: str) -> None: ...
def __iter__(self) -> Iterator[str]: ...
def all(self, initialized_only: bool = False) -> Sequence[_T]: ...
def close_all(self) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/copy.pyi 0000664 0000000 0000000 00000000524 15260643574 0024303 0 ustar 00root root 0000000 0000000 from typing import Any, Protocol, type_check_only
from typing_extensions import TypeVar
_RT_co = TypeVar("_RT_co", covariant=True)
@type_check_only
class _SupportsReplace(Protocol[_RT_co]):
def __replace__(self, /, *_: Any, **changes: Any) -> _RT_co: ...
def replace(obj: _SupportsReplace[_RT_co], /, **changes: Any) -> _RT_co: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/crypto.pyi 0000664 0000000 0000000 00000001746 15260643574 0024660 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from hmac import HMAC
from typing import Any, overload
from typing_extensions import deprecated
RANDOM_STRING_CHARS: str
class InvalidAlgorithm(ValueError): ...
@overload
@deprecated(
"The default argument for algorithm in salted_hmac() will change from 'sha1' to 'sha256' in "
"Django 7.0. Pass an explicit algorithm to silence this warning.",
)
def salted_hmac(
key_salt: bytes | str, value: bytes | str, secret: bytes | str | None = None, *, algorithm: None = None
) -> HMAC: ...
@overload
def salted_hmac(
key_salt: bytes | str, value: bytes | str, secret: bytes | str | None = None, *, algorithm: str = ...
) -> HMAC: ...
def get_random_string(length: int, allowed_chars: str = ...) -> str: ...
def constant_time_compare(val1: bytes | str, val2: bytes | str) -> bool: ...
def pbkdf2(
password: bytes | str,
salt: bytes | str,
iterations: int,
dklen: int = 0,
digest: Callable[[], Any] | None = None,
) -> bytes: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/csp.pyi 0000664 0000000 0000000 00000002142 15260643574 0024114 0 ustar 00root root 0000000 0000000 from collections.abc import Collection, Mapping
from enum import StrEnum as _StrEnum
from django.forms import Media
from django.template import Context
from django.utils.functional import SimpleLazyObject
from django.utils.safestring import SafeString
from typing_extensions import override
CONTEXT_KEY: str
class CSP(_StrEnum):
HEADER_ENFORCE = "Content-Security-Policy"
HEADER_REPORT_ONLY = "Content-Security-Policy-Report-Only"
NONE = "'none'"
REPORT_SAMPLE = "'report-sample'"
SELF = "'self'"
STRICT_DYNAMIC = "'strict-dynamic'"
UNSAFE_EVAL = "'unsafe-eval'"
UNSAFE_HASHES = "'unsafe-hashes'"
UNSAFE_INLINE = "'unsafe-inline'"
WASM_UNSAFE_EVAL = "'wasm-unsafe-eval'"
NONCE = ""
class LazyNonce(SimpleLazyObject[str]):
def __init__(self) -> None: ...
@override
def __bool__(self) -> bool: ...
def nonce_attr(context: Context, media: Media | None = None) -> SafeString: ...
def generate_nonce() -> str: ...
def build_policy(
config: Mapping[str, Collection[str] | str], nonce: SimpleLazyObject[str] | str | None = None
) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/datastructures.pyi 0000664 0000000 0000000 00000014467 15260643574 0026421 0 ustar 00root root 0000000 0000000 from collections.abc import Collection, Iterable, Iterator, Mapping, MutableMapping, MutableSet
from typing import Any, Generic, NoReturn, Protocol, Self, TypeAlias, overload, type_check_only
from _typeshed import Incomplete
from typing_extensions import TypeVar, override
_K = TypeVar("_K")
_V = TypeVar("_V")
_Z = TypeVar("_Z")
_I = TypeVar("_I", covariant=True)
# Unfortunately, there's often check `if isinstance(var, (list, tuple))` in django
# codebase. So we need sometimes to declare exactly list or tuple.
_ListOrTuple: TypeAlias = list[_K] | tuple[_K, ...] | tuple[()] # noqa: PYI047
@type_check_only
class _PropertyDescriptor(Generic[_K, _V]):
"""
This helper property descriptor allows defining asynmetric getter/setters
which mypy currently doesn't support with either:
class HttpResponse:
@property
def content(...): ...
@property.setter
def content(...): ...
or:
class HttpResponse:
def _get_content(...): ...
def _set_content(...): ...
content = property(_get_content, _set_content)
"""
def __get__(self, instance: Any, owner: Any | None) -> _V: ...
def __set__(self, instance: Any, value: _K) -> None: ...
@type_check_only
class _IndexableCollection(Protocol[_I], Collection[_I]): # noqa: PYI046
@overload
def __getitem__(self, index: int) -> _I: ...
@overload
def __getitem__(self, index: slice) -> Self: ...
class OrderedSet(MutableSet[_K]):
dict: dict[_K, None]
def __init__(self, iterable: Iterable[_K] | None = None) -> None: ...
@override
def add(self, item: _K) -> None: ...
@override
def remove(self, item: _K) -> None: ...
@override
def discard(self, item: _K) -> None: ...
@override
def __iter__(self) -> Iterator[_K]: ...
def __reversed__(self) -> Iterator[_K]: ...
@override
def __contains__(self, item: object) -> bool: ...
def __bool__(self) -> bool: ...
@override
def __len__(self) -> int: ...
class MultiValueDictKeyError(KeyError): ...
class MultiValueDict(dict[_K, _V]):
@overload
def __init__(self, key_to_list_mapping: Mapping[_K, list[_V] | None]) -> None: ...
@overload
def __init__(self, key_to_list_mapping: Iterable[tuple[_K, list[_V]]] = ()) -> None: ...
@override
def __getitem__(self, key: _K) -> _V | list[object]: ... # type: ignore[override]
@override
def __setitem__(self, key: _K, value: _V) -> None: ...
def __copy__(self) -> Self: ...
def __deepcopy__(self, memo: MutableMapping[int, Incomplete]) -> Self: ...
@overload
@override
def get(self, key: _K, default: None = None) -> _V | None: ...
@overload
def get(self, key: _K, default: _V) -> _V: ...
@overload
def get(self, key: _K, default: _Z) -> _V | _Z: ...
def getlist(self, key: _K, default: _Z | None = None) -> list[_V] | _Z: ...
def setlist(self, key: _K, list_: list[_V]) -> None: ...
@overload
@override
def setdefault(self: MultiValueDict[_K, _V | None], key: _K, default: None = None) -> _V | None: ...
@overload
def setdefault(self, key: _K, default: _V) -> _V: ...
def setlistdefault(self, key: _K, default_list: list[_V] | None = None) -> list[_V]: ...
def appendlist(self, key: _K, value: _V) -> None: ...
@override
def items(self) -> Iterator[tuple[_K, _V | list[object]]]: ... # type: ignore[override]
def lists(self) -> Iterable[tuple[_K, list[_V]]]: ...
# Fake to make `values` work properly
@override
def values(self) -> Iterator[_V | list[object]]: ... # type: ignore[override]
@override
def copy(self) -> Self: ...
def dict(self) -> dict[_K, _V | list[object]]: ...
# These overrides are needed to convince mypy that this isn't an abstract class
@override
def __delitem__(self, item: _K, /) -> None: ...
@override
def __len__(self) -> int: ...
@override
def __iter__(self) -> Iterator[_K]: ...
class ImmutableList(tuple[_V, ...]):
warning: str
def __new__(cls, *args: object, warning: str = "ImmutableList object is immutable.", **kwargs: object) -> Self: ...
def complain(self, *args: object, **kwargs: object) -> NoReturn: ...
def __delitem__(self, *args: object, **kwargs: object) -> NoReturn: ...
def __delslice__(self, *args: object, **kwargs: object) -> NoReturn: ...
def __iadd__(self, *args: object, **kwargs: object) -> NoReturn: ... # type: ignore[misc]
def __imul__(self, *args: object, **kwargs: object) -> NoReturn: ...
def __setitem__(self, *args: object, **kwargs: object) -> NoReturn: ...
def __setslice__(self, *args: object, **kwargs: object) -> NoReturn: ...
def append(self, *args: object, **kwargs: object) -> NoReturn: ...
def extend(self, *args: object, **kwargs: object) -> NoReturn: ...
def insert(self, *args: object, **kwargs: object) -> NoReturn: ...
def pop(self, *args: object, **kwargs: object) -> NoReturn: ...
def remove(self, *args: object, **kwargs: object) -> NoReturn: ...
def sort(self, *args: object, **kwargs: object) -> NoReturn: ...
def reverse(self, *args: object, **kwargs: object) -> NoReturn: ...
@type_check_only
class _ItemCallable(Protocol[_V]):
"""Don't mess with arguments when assigning in class body in stub"""
def __call__(self, value: _V, /) -> _V: ...
class DictWrapper(dict[str, _V]):
func: _ItemCallable[_V]
prefix: str
@overload
def __init__(self, data: Mapping[str, _V], func: _ItemCallable[_V], prefix: str) -> None: ...
@overload
def __init__(self, data: Iterable[tuple[str, _V]], func: _ItemCallable[_V], prefix: str) -> None: ...
@override
def __getitem__(self, key: str) -> _V: ...
class CaseInsensitiveMapping(Mapping[str, _V]):
_store: dict[str, tuple[str, _V]]
def __init__(self, data: Mapping[str, _V] | Iterable[tuple[str, _V]]) -> None: ...
@override
def __getitem__(self, key: str) -> _V: ...
@override
def __len__(self) -> int: ...
@override
def __eq__(self, other: object) -> bool: ...
@override
def __iter__(self) -> Iterator[str]: ...
def copy(self) -> Self: ...
class DeferredSubDict(Generic[_K, _V]):
parent_dict: dict[Any, dict[_K, _V]]
deferred_key: Any
def __init__(self, parent_dict: dict[Any, dict[_K, _V]], deferred_key: Any) -> None: ...
def __getitem__(self, key: _K) -> _V: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/dateformat.pyi 0000664 0000000 0000000 00000003675 15260643574 0025471 0 ustar 00root root 0000000 0000000 from datetime import date, tzinfo
from datetime import datetime as builtin_datetime
from datetime import time as builtin_time
from re import Pattern
from typing import Literal
re_formatchars: Pattern[str]
re_escaped: Pattern[str]
class Formatter:
def format(self, formatstr: str) -> str: ...
class TimeFormat(Formatter):
data: builtin_datetime | builtin_time
timezone: tzinfo | None
def __init__(self, obj: builtin_datetime | builtin_time) -> None: ...
def a(self) -> str: ...
def A(self) -> str: ...
def e(self) -> str: ...
def f(self) -> int | str: ...
def g(self) -> int: ...
def G(self) -> int: ...
def h(self) -> str: ...
def H(self) -> str: ...
def i(self) -> str: ...
def O(self) -> str: ...
def P(self) -> str: ...
def s(self) -> str: ...
def T(self) -> str: ...
def u(self) -> str: ...
def Z(self) -> int | Literal[""]: ...
class DateFormat(TimeFormat):
data: builtin_datetime | date | builtin_time # type: ignore[assignment]
timezone: tzinfo | None
def __init__(self, obj: builtin_datetime | builtin_time | date) -> None: ...
def b(self) -> str: ...
def c(self) -> str: ...
def d(self) -> str: ...
def D(self) -> str: ...
def E(self) -> str: ...
def F(self) -> str: ...
def I(self) -> str: ...
def j(self) -> int: ...
def l(self) -> str: ...
def L(self) -> bool: ...
def m(self) -> str: ...
def M(self) -> str: ...
def n(self) -> int: ...
def N(self) -> str: ...
def o(self) -> int: ...
def r(self) -> str: ...
def S(self) -> str: ...
def t(self) -> str: ...
def U(self) -> int: ...
def w(self) -> int: ...
def W(self) -> int: ...
def y(self) -> str: ...
def Y(self) -> int: ...
def z(self) -> int: ...
def format(value: builtin_datetime | date | builtin_time, format_string: str) -> str: ...
def time_format(value: builtin_datetime | builtin_time, format_string: str) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/dateparse.pyi 0000664 0000000 0000000 00000000771 15260643574 0025305 0 ustar 00root root 0000000 0000000 from datetime import date, time, timedelta
from datetime import datetime as builtin_datetime
from re import Pattern
date_re: Pattern[str]
time_re: Pattern[str]
datetime_re: Pattern[str]
standard_duration_re: Pattern[str]
iso8601_duration_re: Pattern[str]
postgres_interval_re: Pattern[str]
def parse_date(value: str) -> date | None: ...
def parse_time(value: str) -> time | None: ...
def parse_datetime(value: str) -> builtin_datetime | None: ...
def parse_duration(value: str) -> timedelta | None: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/dates.pyi 0000664 0000000 0000000 00000000234 15260643574 0024427 0 ustar 00root root 0000000 0000000 WEEKDAYS: dict[int, str]
WEEKDAYS_ABBR: dict[int, str]
MONTHS: dict[int, str]
MONTHS_3: dict[int, str]
MONTHS_AP: dict[int, str]
MONTHS_ALT: dict[int, str]
typeddjango-django-stubs-fa03b48/django-stubs/utils/deconstruct.pyi 0000664 0000000 0000000 00000001201 15260643574 0025657 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Sequence
from typing import Any, Self, overload, type_check_only
from typing_extensions import TypeVar
# Contains additions from a class being decorated with '@deconstructible'
@type_check_only
class _Deconstructible:
def __new__(cls, *args: Any, **kwargs: Any) -> Self: ...
def deconstruct(obj) -> tuple[str, Sequence[Any], dict[str, Any]]: ...
_T = TypeVar("_T")
_TCallable = TypeVar("_TCallable", bound=Callable[..., Any])
@overload
def deconstructible(_type: type[_T]) -> type[_T]: ...
@overload
def deconstructible(*, path: str | None = None) -> Callable[[_TCallable], _TCallable]: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/decorators.pyi 0000664 0000000 0000000 00000002711 15260643574 0025476 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterable
from typing import Any, Protocol, TypeAlias, type_check_only
from django.http.response import HttpResponseBase
from django.utils.deprecation import MiddlewareMixin
from django.views.generic.base import View
from typing_extensions import TypeVar
@type_check_only
class _MiddlewareClass(Protocol):
def __call__(self, get_response: Callable[..., Any], *args: Any, **kwargs: Any) -> Any: ...
_ViewType = TypeVar("_ViewType", bound=View | Callable[..., Any]) # Any callable
_CallableType = TypeVar("_CallableType", bound=Callable[..., Any])
_ViewDecorator: TypeAlias = Callable[
[Callable[..., HttpResponseBase]],
Callable[..., HttpResponseBase],
]
_DecoratorFactory: TypeAlias = Callable[..., _ViewDecorator]
classonlymethod = classmethod
def method_decorator(
decorator: _ViewDecorator | _DecoratorFactory | Iterable[_ViewDecorator | _DecoratorFactory],
name: str = "",
) -> Callable[[_ViewType], _ViewType]: ...
def decorator_from_middleware_with_args(middleware_class: _MiddlewareClass) -> _DecoratorFactory: ...
def decorator_from_middleware(middleware_class: _MiddlewareClass) -> _ViewDecorator: ...
def make_middleware_decorator(middleware_class: type[MiddlewareMixin]) -> _DecoratorFactory: ...
def sync_and_async_middleware(func: _CallableType) -> _CallableType: ...
def sync_only_middleware(func: _CallableType) -> _CallableType: ...
def async_only_middleware(func: _CallableType) -> _CallableType: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/deprecation.pyi 0000664 0000000 0000000 00000004541 15260643574 0025631 0 ustar 00root root 0000000 0000000 from collections.abc import Awaitable, Callable, Sequence
from types import FunctionType, MethodType
from typing import Any, ClassVar, Protocol, TypeAlias, type_check_only
from _typeshed import Self as MetaclassSelf # noqa: TID251
from django.http.request import HttpRequest
from django.http.response import HttpResponseBase
from typing_extensions import TypeVar
_C = TypeVar("_C", bound=Callable[..., Any])
def django_file_prefixes() -> tuple[str, ...]: ...
class RemovedInNextVersionWarning(DeprecationWarning): ...
class RemovedInDjango70Warning(PendingDeprecationWarning): ...
RemovedAfterNextVersionWarning: TypeAlias = RemovedInDjango70Warning
def warn_about_external_use(
message: str,
category: type[Warning] | None,
*,
skip_name_prefixes: str | tuple[str, ...] | None = None,
skip_frames: int = 0,
internal_modules: tuple[str, ...] | None = None,
) -> None: ...
def warn_about_implementation(
message: str,
category: type[Warning] | None,
target: FunctionType | MethodType | classmethod[Any, Any, Any] | property | staticmethod[Any, Any] | type,
) -> None: ...
class warn_about_renamed_method:
class_name: str
old_method_name: str
new_method_name: str
deprecation_warning: type[DeprecationWarning]
def __init__(
self, class_name: str, old_method_name: str, new_method_name: str, deprecation_warning: type[DeprecationWarning]
) -> None: ...
def __call__(self, f: _C) -> _C: ...
class RenameMethodsBase(type):
renamed_methods: tuple[tuple[str, str, type[DeprecationWarning]], ...]
def __new__(
cls: type[MetaclassSelf], name: str, bases: tuple[type, ...], attrs: dict[str, Any]
) -> MetaclassSelf: ...
def deprecate_posargs(deprecation_warning: type[Warning], remappable_names: Sequence[str], /) -> Callable[[_C], _C]: ...
@type_check_only
class _AnyGetResponseCallable(Protocol):
def __call__(self, request: HttpRequest, /) -> HttpResponseBase | Awaitable[HttpResponseBase]: ...
class MiddlewareMixin:
sync_capable: ClassVar[bool]
async_capable: ClassVar[bool]
get_response: _AnyGetResponseCallable
async_mode: bool
def __init__(self, get_response: _AnyGetResponseCallable) -> None: ...
def __call__(self, request: HttpRequest) -> HttpResponseBase | Awaitable[HttpResponseBase]: ...
async def __acall__(self, request: HttpRequest) -> HttpResponseBase: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/duration.pyi 0000664 0000000 0000000 00000000306 15260643574 0025154 0 ustar 00root root 0000000 0000000 from datetime import timedelta
def duration_string(duration: timedelta) -> str: ...
def duration_iso_string(duration: timedelta) -> str: ...
def duration_microseconds(delta: timedelta) -> int: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/encoding.pyi 0000664 0000000 0000000 00000006245 15260643574 0025125 0 ustar 00root root 0000000 0000000 import datetime
from decimal import Decimal
from typing import Any, Literal, TypeGuard, overload
from django.utils.functional import Promise
from typing_extensions import TypeVar
class DjangoUnicodeDecodeError(UnicodeDecodeError): ...
_P = TypeVar("_P", bound=Promise)
_S = TypeVar("_S", bound=str)
_B = TypeVar("_B", bound=bytes)
_PT = TypeVar("_PT", bound=int | float | Decimal | datetime.date | datetime.time | None)
@overload
def smart_str(s: object, encoding: str = "utf-8", *, errors: str = "strict") -> str: ...
@overload
def smart_str(s: _P, encoding: str = "utf-8", *, strings_only: Literal[True], errors: str = "strict") -> _P: ... # type: ignore[overload-overlap]
@overload
def smart_str(s: _PT, encoding: str = "utf-8", *, strings_only: Literal[True], errors: str = "strict") -> _PT: ... # type: ignore[overload-overlap]
@overload
def smart_str(s: _S, encoding: str = "utf-8", *, strings_only: Literal[True], errors: str = "strict") -> _S: ...
@overload
def smart_str(s: object, encoding: str = "utf-8", strings_only: bool = False, errors: str = "strict") -> str: ...
def is_protected_type(obj: Any) -> TypeGuard[_PT]: ...
@overload
def force_str(s: object, encoding: str = "utf-8", *, errors: str = "strict") -> str: ...
@overload
def force_str(s: _PT, encoding: str = "utf-8", *, strings_only: Literal[True], errors: str = "strict") -> _PT: ... # type: ignore[overload-overlap]
@overload
def force_str(s: _S, encoding: str = "utf-8", *, strings_only: Literal[True], errors: str = "strict") -> _S: ...
@overload
def force_str(s: object, encoding: str = "utf-8", strings_only: bool = False, errors: str = "strict") -> str: ...
@overload
def smart_bytes(s: object, encoding: str = "utf-8", *, errors: str = "strict") -> bytes: ...
@overload
def smart_bytes(s: _P, encoding: str = "utf-8", *, strings_only: Literal[True], errors: str = "strict") -> _P: ... # type: ignore[overload-overlap]
@overload
def smart_bytes(s: _PT, encoding: str = "utf-8", *, strings_only: Literal[True], errors: str = "strict") -> _PT: ... # type: ignore[overload-overlap]
@overload
def smart_bytes(s: _B, encoding: str = "utf-8", *, strings_only: Literal[True], errors: str = "strict") -> _B: ...
@overload
def smart_bytes(s: object, encoding: str = "utf-8", strings_only: bool = False, errors: str = "strict") -> bytes: ...
@overload
def force_bytes(s: object, encoding: str = "utf-8", *, errors: str = "strict") -> bytes: ...
@overload
def force_bytes(s: _PT, encoding: str = "utf-8", *, strings_only: Literal[True], errors: str = "strict") -> _PT: ... # type: ignore[overload-overlap]
@overload
def force_bytes(s: object, encoding: str = "utf-8", strings_only: bool = False, errors: str = "strict") -> bytes: ...
@overload
def iri_to_uri(iri: None) -> None: ...
@overload
def iri_to_uri(iri: str | Promise) -> str: ...
@overload
def uri_to_iri(uri: None) -> None: ...
@overload
def uri_to_iri(uri: str | bytes) -> str: ...
def escape_uri_path(path: str) -> str: ...
def punycode(domain: str) -> str: ...
def repercent_broken_unicode(path: bytes) -> bytes: ...
@overload
def filepath_to_uri(path: None) -> None: ...
@overload
def filepath_to_uri(path: str) -> str: ...
def get_system_encoding() -> str: ...
DEFAULT_LOCALE_ENCODING: str
typeddjango-django-stubs-fa03b48/django-stubs/utils/feedgenerator.pyi 0000664 0000000 0000000 00000006213 15260643574 0026144 0 ustar 00root root 0000000 0000000 import datetime
from collections.abc import Sequence
from typing import Any, TypeAlias
from django.utils.xmlutils import SimplerXMLGenerator
def rfc2822_date(date: datetime.date) -> str: ...
def rfc3339_date(date: datetime.date) -> str: ...
def get_tag_uri(url: str, date: datetime.date | None) -> str: ...
class Stylesheet:
def __init__(
self,
url: str,
mimetype: str = "",
media: str = "screen",
) -> None: ...
media: str
@property
def url(self) -> str: ...
@property
def mimetype(self) -> str: ...
class SyndicationFeed:
feed: dict[str, Any]
items: list[dict[str, Any]]
def __init__(
self,
title: str,
link: str,
description: str | None,
language: str | None = None,
author_email: str | None = None,
author_name: str | None = None,
author_link: str | None = None,
subtitle: str | None = None,
categories: tuple[str, str] | None = None,
feed_url: str | None = None,
feed_copyright: str | None = None,
feed_guid: str | None = None,
ttl: int | None = None,
stylesheets: list[Stylesheet] | None = None,
**kwargs: Any,
) -> None: ...
def add_item(
self,
title: str,
link: str,
description: str,
author_email: str | None = None,
author_name: str | None = None,
author_link: str | None = None,
pubdate: datetime.datetime | None = None,
comments: str | None = None,
unique_id: str | None = None,
unique_id_is_permalink: bool | None = None,
categories: Sequence[str | None] = (),
item_copyright: str | None = None,
ttl: int | None = None,
updateddate: datetime.datetime | None = None,
enclosures: list[Enclosure] | None = None,
**kwargs: Any,
) -> None: ...
def num_items(self) -> int: ...
def root_attributes(self) -> dict[str, str]: ...
def add_root_elements(self, handler: SimplerXMLGenerator) -> None: ...
def add_stylesheets(self, handler: SimplerXMLGenerator) -> None: ...
def item_attributes(self, item: dict[str, Any]) -> dict[str, str]: ...
def add_item_elements(
self,
handler: SimplerXMLGenerator,
item: dict[str, Any],
) -> None: ...
def write(self, outfile: Any, encoding: str) -> None: ... # Any: file-like object (IO[bytes])
def writeString(self, encoding: str) -> str: ...
def latest_post_date(self) -> datetime.datetime: ...
class Enclosure:
length: int | str
mime_type: str
url: str
def __init__(self, url: str, length: int | str, mime_type: str) -> None: ...
class RssFeed(SyndicationFeed):
content_type: str
def rss_attributes(self) -> dict[str, str]: ...
def write_items(self, handler: SimplerXMLGenerator) -> None: ...
def endChannelElement(self, handler: SimplerXMLGenerator) -> None: ...
class RssUserland091Feed(RssFeed): ...
class Rss201rev2Feed(RssFeed): ...
class Atom1Feed(SyndicationFeed):
content_type: str
ns: str
def write_items(self, handler: SimplerXMLGenerator) -> None: ...
DefaultFeed: TypeAlias = Rss201rev2Feed
typeddjango-django-stubs-fa03b48/django-stubs/utils/formats.pyi 0000664 0000000 0000000 00000003525 15260643574 0025010 0 ustar 00root root 0000000 0000000 import types
from collections.abc import Iterator
from datetime import date, time
from datetime import datetime as builtin_datetime
from decimal import Decimal
from typing import Any, overload
from typing_extensions import TypeVar
ISO_INPUT_FORMATS: dict[str, list[str]]
FORMAT_SETTINGS: frozenset[str]
def reset_format_cache() -> None: ...
def iter_format_modules(lang: str, format_module_path: list[str] | str | None = None) -> Iterator[types.ModuleType]: ...
def get_format_modules(lang: str | None = None) -> list[types.ModuleType]: ...
def get_format(format_type: str, lang: str | None = None, use_l10n: bool | None = None) -> Any: ...
get_format_lazy: Any # Any: lazy wrapper around get_format
def date_format(
value: date | builtin_datetime | str, format: str | None = None, use_l10n: bool | None = None
) -> str: ...
def time_format(
value: time | builtin_datetime | str, format: str | None = None, use_l10n: bool | None = None
) -> str: ...
def number_format(
value: Decimal | float | str,
decimal_pos: int | None = None,
use_l10n: bool | None = None,
force_grouping: bool = False,
) -> str: ...
_T = TypeVar("_T")
# Mypy considers this invalid (overlapping signatures), but thanks to implementation
# details it works as expected (all values from the union are `localize`d to str,
# while type of others is preserved)
@overload
def localize(value: builtin_datetime | date | time | Decimal | float | str, use_l10n: bool | None = None) -> str: ...
@overload
def localize(value: _T, use_l10n: bool | None = None) -> _T: ...
@overload
def localize_input(
value: builtin_datetime | date | time | Decimal | float | str, default: str | None = None
) -> str: ...
@overload
def localize_input(value: _T, default: str | None = None) -> _T: ...
def sanitize_strftime_format(fmt: str) -> str: ...
def sanitize_separators(value: _T) -> _T: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/functional.pyi 0000664 0000000 0000000 00000011342 15260643574 0025473 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterable, Iterator
# Mypy has special handling for functools.cached_property, reuse typeshed's definition instead of defining our own
from functools import cached_property as cached_property
from typing import Any, Generic, Protocol, Self, SupportsIndex, TypeAlias, overload, type_check_only
from django.db.models.base import Model
from typing_extensions import TypeVar, override
_T = TypeVar("_T")
# Promise is only subclassed by a proxy class defined in the lazy function
# so it makes sense for it to have all the methods available in that proxy class
class Promise:
def __init__(self, args: Any, kw: Any) -> None: ...
@override
def __reduce__(self) -> tuple[Any, tuple[Any]]: ...
def __lt__(self, other: Any, /) -> bool: ...
def __mod__(self, rhs: Any) -> Any: ...
def __add__(self, other: Any) -> Any: ...
def __radd__(self, other: Any) -> Any: ...
def __deepcopy__(self, memo: Any) -> Self: ...
@type_check_only
class _StrPromise(Promise):
def __add__(self, s: str, /) -> str: ... # type: ignore[explicit-override]
def __radd__(self, other: str) -> str: ... # type: ignore[explicit-override]
def __contains__(self, o: str, /) -> bool: ...
def __ge__(self, x: str, /) -> bool: ...
def __getitem__(self, i: SupportsIndex | slice, /) -> str: ...
def __gt__(self, x: str, /) -> bool: ...
def __le__(self, x: str, /) -> bool: ...
# __len__ needed here because it defined abstract in Sequence[str]
def __len__(self) -> int: ...
def __lt__(self, x: str, /) -> bool: ... # type: ignore[explicit-override]
def __mod__(self, x: Any, /) -> str: ... # type: ignore[explicit-override]
def __mul__(self, n: SupportsIndex, /) -> str: ...
def __rmul__(self, n: SupportsIndex, /) -> str: ...
# Mypy requires this for the attribute hook to take effect
def __getattribute__(self, name: str, /) -> Any: ... # type: ignore[explicit-override]
_StrOrPromise: TypeAlias = str | _StrPromise # noqa: PYI047
_C = TypeVar("_C", bound=Callable[..., Any])
def lazy(func: _C, *resultclasses: Any) -> _C: ...
def lazystr(text: Any) -> _StrPromise: ...
def keep_lazy(*resultclasses: Any) -> Callable[[_C], _C]: ...
def keep_lazy_text(func: _C) -> _C: ...
empty: object
def new_method_proxy(func: Callable[..., _T]) -> Callable[..., _T]: ...
class LazyObject(Generic[_T]):
def __init__(self) -> None: ...
def __getattr__(self, name: str) -> Any: ...
@override
def __setattr__(self, name: str, value: Any) -> None: ...
@override
def __delattr__(self, name: str) -> None: ...
@override
def __reduce__(self) -> tuple[Callable[..., Any], tuple[Model]]: ...
def __copy__(self) -> Self | _T: ...
def __deepcopy__(self, memo: dict[int, Any]) -> Self | _T: ...
def __bytes__(self) -> bytes: ...
def __bool__(self) -> bool: ...
@override
def __dir__(self) -> list[str]: ...
@override
def __eq__(self, other: object) -> bool: ...
def __lt__(self, other: Any) -> bool: ...
def __gt__(self, other: Any) -> bool: ...
@override
def __hash__(self) -> int: ...
def __getitem__(self, key: Any) -> Any: ...
def __setitem__(self, key: Any, value: Any) -> None: ...
def __delitem__(self, key: Any) -> None: ...
def __iter__(self) -> Iterator[Any]: ...
def __len__(self) -> int: ...
def __contains__(self, item: Any) -> bool: ...
def unpickle_lazyobject(wrapped: Model) -> Model: ...
class SimpleLazyObject(LazyObject[_T]):
def __init__(self, func: Callable[[], _T]) -> None: ...
@override
def __copy__(self) -> Self | _T: ...
def __add__(self, other: Any) -> Any: ...
def __radd__(self, other: Any) -> Any: ...
_Get = TypeVar("_Get", covariant=True)
class classproperty(Generic[_Get]):
fget: Callable[[Any], _Get] | None
def __init__(self, method: Callable[[Any], _Get] | None = None) -> None: ...
def __get__(self, instance: Any | None, cls: type[Any] | None = None) -> _Get: ...
def getter(self, method: Callable[[Any], _Get]) -> classproperty[_Get]: ...
_PartitionMember = TypeVar("_PartitionMember")
def partition(
predicate: Callable[[_PartitionMember], int | bool], values: Iterable[_PartitionMember]
) -> tuple[list[_PartitionMember], list[_PartitionMember]]: ...
@type_check_only
class _Getter(Protocol[_Get]): # noqa: PYI046
"""
Type fake to declare some read-only properties (until `property` builtin is generic).
We can use something like `_Getter[str] | str` in base class to avoid errors
when redefining attribute with property or property with attribute.
"""
@overload
def __get__(self, instance: None, typeobj: type[Any] | None, /) -> Self: ...
@overload
def __get__(self, instance: Any, typeobj: type[Any] | None, /) -> _Get: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/hashable.pyi 0000664 0000000 0000000 00000000102 15260643574 0025070 0 ustar 00root root 0000000 0000000 from typing import Any
def make_hashable(value: Any) -> Any: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/html.pyi 0000664 0000000 0000000 00000006302 15260643574 0024275 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable
from html.parser import HTMLParser
from json import JSONEncoder
from re import Pattern
from typing import Any, overload
from django.utils.functional import _StrOrPromise, cached_property
from django.utils.safestring import SafeData, SafeString
from typing_extensions import deprecated, override
VOID_ELEMENTS: frozenset[str]
MAX_URL_LENGTH: int
MAX_STRIP_TAGS_DEPTH: int
long_open_tag_without_closing_re: Pattern[str]
def escape(text: Any) -> SafeString: ...
def escapejs(value: Any) -> SafeString: ...
def json_script(value: Any, element_id: str | None = None, encoder: type[JSONEncoder] | None = None) -> SafeString: ...
# conditional_escape could use a protocol to be more precise, see https://github.com/typeddjango/django-stubs/issues/1474
def conditional_escape(text: _StrOrPromise | SafeData) -> SafeString: ...
@overload
@deprecated("Calling format_html() without passing args or kwargs is deprecated.")
def format_html(format_string: str) -> SafeString: ...
@overload
def format_html(format_string: str, *args: Any, **kwargs: Any) -> SafeString: ...
def format_html_join(sep: str, format_string: str, args_generator: Iterable[Iterable[Any]]) -> SafeString: ...
def linebreaks(value: Any, autoescape: bool = False) -> str: ...
class MLStripper(HTMLParser):
fed: list[str]
def __init__(self) -> None: ...
@override
def handle_data(self, d: str) -> None: ...
@override
def handle_entityref(self, name: str) -> None: ...
@override
def handle_charref(self, name: str) -> None: ...
def get_data(self) -> str: ...
def strip_tags(value: str) -> str: ...
def strip_spaces_between_tags(value: str) -> str: ...
def smart_urlquote(url: str) -> str: ...
class CountsDict(dict[str, Any]):
word: str
def __init__(self, *args: Any, word: str, **kwargs: Any) -> None: ...
def __missing__(self, key: str) -> Any: ...
class Urlizer:
trailing_punctuation_chars: str
wrapping_punctuation: list[tuple[str, str]]
word_split_re: Pattern[str]
simple_url_re: Pattern[str]
simple_url_2_re: Pattern[str]
mailto_template: str
url_template: str
def __call__(
self,
text: _StrOrPromise | SafeData,
trim_url_limit: int | None = None,
nofollow: bool = False,
autoescape: bool = False,
) -> str: ...
def handle_word(
self,
word: str,
*,
safe_input: bool,
trim_url_limit: int | None = None,
nofollow: bool = False,
autoescape: bool = False,
) -> str: ...
def trim_url(self, x: str, *, limit: int | None) -> str: ...
def trim_punctuation(self, word: str) -> tuple[str, str, str]: ...
@staticmethod
def is_email_simple(value: str) -> bool: ...
@cached_property
def wrapping_punctuation_openings(self) -> str: ...
@cached_property
def trailing_punctuation_chars_no_semicolon(self) -> str: ...
@cached_property
def trailing_punctuation_chars_has_semicolon(self) -> bool: ...
urlizer: Urlizer
def urlize(
text: _StrOrPromise | SafeData, trim_url_limit: int | None = None, nofollow: bool = False, autoescape: bool = False
) -> str: ...
def avoid_wrapping(value: str) -> str: ...
def html_safe(klass: type) -> type: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/http.pyi 0000664 0000000 0000000 00000003250 15260643574 0024307 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable, Iterator, Mapping
from re import Pattern
from typing import Literal, overload
ETAG_MATCH: Pattern[str]
MONTHS: list[str]
RFC1123_DATE: Pattern[str]
RFC850_DATE: Pattern[str]
ASCTIME_DATE: Pattern[str]
RFC3986_GENDELIMS: str
RFC3986_SUBDELIMS: str
MAX_URL_LENGTH: int
MAX_URL_REDIRECT_LENGTH: int
MAX_HEADER_LENGTH: int
def urlencode(
query: (
Mapping[str, str | bytes | int | Iterable[str | bytes | int]]
| Iterable[tuple[str, str | bytes | int | Iterable[str | bytes | int]]]
| None
),
doseq: bool = False,
) -> str: ...
def http_date(epoch_seconds: float | None = None) -> str: ...
def parse_http_date(date: str) -> int: ...
def parse_http_date_safe(date: str) -> int | None: ...
def base36_to_int(s: str) -> int: ...
def int_to_base36(i: int) -> str: ...
def urlsafe_base64_encode(s: bytes) -> str: ...
def urlsafe_base64_decode(s: str) -> bytes: ...
def split_header_value(value: str, sep: str = ",") -> Iterator[str]: ...
def split_directive_names(value: str) -> Iterator[str]: ...
def parse_etags(etag_str: str) -> list[str]: ...
def quote_etag(etag_str: str) -> str: ...
def is_same_domain(host: str, pattern: str) -> bool: ...
def url_has_allowed_host_and_scheme(
url: str | None, allowed_hosts: str | Iterable[str] | None, require_https: bool = False
) -> bool: ...
def escape_leading_slashes(url: str) -> str: ...
def parse_header_parameters(line: str, max_length: int | None = 10000) -> tuple[str, dict[str, str]]: ...
@overload
def content_disposition_header(as_attachment: Literal[True], filename: str) -> str: ...
@overload
def content_disposition_header(as_attachment: bool, filename: str) -> str | None: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/inspect.pyi 0000664 0000000 0000000 00000002147 15260643574 0025001 0 ustar 00root root 0000000 0000000 import functools
import sys
import threading
from collections.abc import Callable
from contextlib import AbstractContextManager
from inspect import FullArgSpec, Signature, _ParameterKind
from types import FunctionType
from typing import Any, TypeGuard
ARG_KINDS: frozenset[_ParameterKind]
if sys.version_info >= (3, 14):
lock: threading.Lock
safe_signature_from_callable: functools.partial[Signature]
def get_func_args(func: Callable[..., Any]) -> list[str]: ...
def get_func_full_args(func: Callable[..., Any]) -> list[tuple[str, str] | tuple[str]]: ...
def func_accepts_kwargs(func: Callable[..., Any]) -> bool: ...
def func_accepts_var_args(func: Callable[..., Any]) -> bool: ...
def method_has_no_args(meth: Callable[..., Any]) -> bool: ...
def func_supports_parameter(func: Callable[..., Any], name: str) -> bool: ...
def is_module_level_function(func: Callable[..., Any]) -> TypeGuard[FunctionType]: ...
def lazy_annotations() -> AbstractContextManager[None]: ...
def getfullargspec(*args: Any, annotation_format: Any | None = None, **kwargs: Any) -> FullArgSpec: ...
def signature(obj: Any) -> Signature: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/ipv6.pyi 0000664 0000000 0000000 00000000434 15260643574 0024215 0 ustar 00root root 0000000 0000000 from ipaddress import IPv6Address
from typing import Any
MAX_IPV6_ADDRESS_LENGTH: int
def clean_ipv6_address(
ip_str: Any, unpack_ipv4: bool = False, error_message: str = ..., max_length: int = 39
) -> str: ...
def is_valid_ipv6_address(ip_addr: str | IPv6Address) -> bool: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/json.pyi 0000664 0000000 0000000 00000000324 15260643574 0024300 0 ustar 00root root 0000000 0000000 from typing import Any, TypeAlias
_JsonPrimitive: TypeAlias = str | int | float | bool | None
_JsonValue: TypeAlias = _JsonPrimitive | list[Any] | dict[str, Any]
def normalize_json(obj: Any) -> _JsonValue: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/log.pyi 0000664 0000000 0000000 00000004521 15260643574 0024113 0 ustar 00root root 0000000 0000000 import logging.config
from collections.abc import Callable
from logging import Logger, LogRecord
from typing import Any, overload
from django.core.management.color import Style
from django.http import HttpRequest, HttpResponse
from django.utils.functional import _StrOrPromise
from typing_extensions import deprecated, override
request_logger: Logger
DEFAULT_LOGGING: Any
def configure_logging(logging_config: str, logging_settings: dict[str, Any]) -> None: ...
class AdminEmailHandler(logging.Handler):
include_html: bool
email_backend: str | None
reporter_class: type[Any]
@overload
def __init__(
self,
include_html: bool = False,
reporter_class: str | None = None,
using: str | None = None,
) -> None: ...
@overload
@deprecated("The 'email_backend' argument is deprecated. Use 'using' instead.")
def __init__(
self,
include_html: bool = False,
email_backend: str | None = None,
reporter_class: str | None = None,
) -> None: ...
def send_mail(self, subject: _StrOrPromise, message: _StrOrPromise, *args: Any, **kwargs: Any) -> None: ...
def format_subject(self, subject: str) -> str: ...
class CallbackFilter(logging.Filter):
callback: Callable[[str | LogRecord], bool]
def __init__(self, callback: Callable[[str | LogRecord], bool]) -> None: ...
@override
def filter(self, record: str | LogRecord) -> bool: ...
class RequireDebugFalse(logging.Filter):
@override
def filter(self, record: str | LogRecord) -> bool: ...
class RequireDebugTrue(logging.Filter):
@override
def filter(self, record: str | LogRecord) -> bool: ...
class ServerFormatter(logging.Formatter):
default_time_format: str
style: Style
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
def uses_server_time(self) -> bool: ...
def log_message(
logger: Logger,
message: str,
*args: object,
level: str | None = None,
status_code: int | None = None,
request: HttpRequest | None = None,
exception: BaseException | None = None,
**extra: object,
) -> None: ...
def log_response(
message: str,
*args: object,
response: HttpResponse | None = None,
request: HttpRequest | None = None,
logger: Logger = ...,
level: str | None = None,
exception: BaseException | None = None,
) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/lorem_ipsum.pyi 0000664 0000000 0000000 00000000364 15260643574 0025666 0 ustar 00root root 0000000 0000000 from typing import Any
COMMON_P: str
WORDS: Any
COMMON_WORDS: Any
def sentence() -> str: ...
def paragraph() -> str: ...
def paragraphs(count: int, common: bool = True) -> list[str]: ...
def words(count: int, common: bool = True) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/module_loading.pyi 0000664 0000000 0000000 00000000470 15260643574 0026313 0 ustar 00root root 0000000 0000000 from typing import Any
def cached_import(module_path: str, class_name: str) -> Any: ...
def import_string(dotted_path: str) -> Any: ...
def autodiscover_modules(*args: Any, **kwargs: Any) -> None: ...
def module_has_submodule(package: Any, module_name: str) -> bool: ...
def module_dir(module: Any) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/numberformat.pyi 0000664 0000000 0000000 00000000500 15260643574 0026024 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable
from decimal import Decimal
def format(
number: Decimal | float | str,
decimal_sep: str,
decimal_pos: int | None = None,
grouping: int | Iterable[int] = 0,
thousand_sep: str = "",
force_grouping: bool = False,
use_l10n: bool | None = None,
) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/regex_helper.pyi 0000664 0000000 0000000 00000001705 15260643574 0026004 0 ustar 00root root 0000000 0000000 from collections.abc import Iterator, Mapping
from re import Pattern
from typing import Any
from typing_extensions import TypeVar
ESCAPE_MAPPINGS: Mapping[str, str | None]
class Choice(list[Any]): ...
class Group(list[Any]): ...
class NonCapture(list[Any]): ...
def normalize(pattern: str) -> list[tuple[str, list[str]]]: ...
def next_char(input_iter: Iterator[str]) -> Iterator[tuple[str, bool]]: ...
def walk_to_end(ch: str, input_iter: Iterator[tuple[str, bool]]) -> None: ...
def get_quantifier(ch: str, input_iter: Iterator[tuple[str, bool]]) -> tuple[int, str | None]: ...
def contains(source: Group | NonCapture | str, inst: type[Group]) -> bool: ...
def flatten_result(
source: list[Choice | Group | str] | Group | NonCapture | None,
) -> tuple[list[str], list[list[str]]]: ...
# Returns SimpleLazyObject, but we can safely ignore it
_P = TypeVar("_P", str, bytes)
def _lazy_re_compile(regex: _P | Pattern[_P], flags: int = 0) -> Pattern[_P]: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/safestring.pyi 0000664 0000000 0000000 00000001253 15260643574 0025476 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any, Self, TypeAlias, overload
from django.utils.functional import _StrOrPromise
from typing_extensions import TypeVar, override
_SD = TypeVar("_SD", bound=SafeData)
class SafeData:
def __html__(self) -> Self: ...
class SafeString(str, SafeData):
@overload
@override
def __add__(self, rhs: SafeString) -> SafeString: ...
@overload
def __add__(self, rhs: str) -> str: ...
SafeText: TypeAlias = SafeString
_C = TypeVar("_C", bound=Callable[..., Any])
@overload
def mark_safe(s: _SD) -> _SD: ...
@overload
def mark_safe(s: _C) -> _C: ...
@overload
def mark_safe(s: _StrOrPromise) -> SafeString: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/termcolors.pyi 0000664 0000000 0000000 00000001160 15260643574 0025517 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Sequence
from typing import Any, Literal
color_names: tuple[str, ...]
foreground: dict[str, str]
background: dict[str, str]
RESET: Literal["0"]
opt_dict: dict[str, str]
def colorize(text: str | None = "", opts: Sequence[str] = (), *, fg: str = ..., bg: str = ...) -> str: ...
def make_style(opts: Sequence[str] = (), *, fg: str = ..., bg: str = ...) -> Callable[[str | None], str]: ...
NOCOLOR_PALETTE: str
DARK_PALETTE: str
LIGHT_PALETTE: str
PALETTES: Any
DEFAULT_PALETTE: str
def parse_color_setting(config_string: str) -> dict[str, dict[str, tuple[str, ...] | str]] | None: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/text.pyi 0000664 0000000 0000000 00000005705 15260643574 0024323 0 ustar 00root root 0000000 0000000 from collections import deque
from collections.abc import AsyncIterable, AsyncIterator, Iterable, Iterator
from html.parser import HTMLParser
from io import BytesIO
from re import Pattern
from typing import Any, ClassVar, overload
from django.db.models.base import Model
from django.utils.functional import SimpleLazyObject, _StrOrPromise, _StrPromise, cached_property
from typing_extensions import TypeVar, override
_StrOrPromiseT = TypeVar("_StrOrPromiseT", bound=_StrOrPromise)
_StrOrPromiseOrNoneT = TypeVar("_StrOrPromiseOrNoneT", bound=_StrOrPromise | None)
def capfirst(x: _StrOrPromiseOrNoneT) -> _StrOrPromiseOrNoneT: ...
re_newlines: Pattern[str]
re_camel_case: Pattern[str]
def wrap(text: _StrOrPromiseT, width: int) -> _StrOrPromiseT: ...
def add_truncation_text(text: str, truncate: str | None = None) -> str: ...
def calculate_truncate_chars_length(length: int, replacement: str | None) -> int: ...
class TruncateHTMLParser(HTMLParser):
TruncationCompleted: ClassVar[type[Exception]]
tags: deque[str]
output: str
remaining: int
replacement: str | None
def __init__(self, *, length: int, replacement: str | None, convert_charrefs: bool = True) -> None: ...
@cached_property
def void_elements(self) -> frozenset[str]: ...
class TruncateCharsHTMLParser(TruncateHTMLParser):
length: int
processed_chars: int
def process(self, data: str) -> tuple[str, str]: ...
class TruncateWordsHTMLParser(TruncateHTMLParser):
def process(self, data: str) -> tuple[str, str]: ...
class Truncator(SimpleLazyObject[str]):
def __init__(self, text: Model | str) -> None: ...
def chars(self, num: int, truncate: str | None = None, html: bool = False) -> str: ...
def words(self, num: int, truncate: str | None = None, html: bool = False) -> str: ...
def get_valid_filename(name: _StrOrPromiseT) -> _StrOrPromiseT: ...
@overload
def get_text_list(list_: list[str], last_word: str = ...) -> str: ...
@overload
def get_text_list(list_: list[_StrOrPromise], last_word: _StrOrPromise = ...) -> _StrOrPromise: ...
def normalize_newlines(text: _StrOrPromiseT) -> _StrOrPromiseT: ...
def phone2numeric(phone: _StrOrPromiseT) -> _StrOrPromiseT: ...
def compress_string(s: bytes, *, max_random_bytes: int | None = None) -> bytes: ...
class StreamingBuffer(BytesIO):
@override
def read(self) -> bytes: ... # type: ignore[override]
def compress_sequence(sequence: Iterable[bytes], *, max_random_bytes: int | None = None) -> Iterator[bytes]: ...
def acompress_sequence(
sequence: AsyncIterable[bytes], *, max_random_bytes: int | None = None
) -> AsyncIterator[bytes]: ...
smart_split_re: Pattern[str]
def smart_split(text: str) -> Iterator[str]: ...
def unescape_string_literal(s: _StrOrPromiseT) -> _StrOrPromiseT: ...
def slugify(value: _StrOrPromiseT, allow_unicode: bool = False) -> _StrOrPromiseT: ...
def camel_case_to_spaces(value: str) -> str: ...
def format_lazy(format_string: _StrOrPromise, *args: Any, **kwargs: Any) -> _StrPromise: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/timesince.pyi 0000664 0000000 0000000 00000000651 15260643574 0025312 0 ustar 00root root 0000000 0000000 from datetime import date
TIME_STRINGS: dict[str, str]
TIME_STRINGS_KEYS: list[str]
TIME_CHUNKS: list[int]
MONTHS_DAYS: tuple[int, ...]
def timesince(
d: date,
now: date | None = None,
reversed: bool = False,
time_strings: dict[str, str] | None = None,
depth: int = 2,
) -> str: ...
def timeuntil(d: date, now: date | None = None, time_strings: dict[str, str] | None = None, depth: int = 2) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/timezone.pyi 0000664 0000000 0000000 00000003463 15260643574 0025170 0 ustar 00root root 0000000 0000000 import zoneinfo
from contextlib import ContextDecorator
from datetime import date, datetime, time, timedelta, timezone, tzinfo
from types import TracebackType
from typing import Literal, overload
def get_fixed_timezone(offset: timedelta | int) -> timezone: ...
def get_default_timezone() -> zoneinfo.ZoneInfo: ...
def get_default_timezone_name() -> str: ...
def get_current_timezone() -> zoneinfo.ZoneInfo: ...
def get_current_timezone_name() -> str: ...
def activate(timezone: tzinfo | str) -> None: ...
def deactivate() -> None: ...
class override(ContextDecorator):
timezone: str | tzinfo | None
old_timezone: tzinfo | None
def __init__(self, timezone: str | tzinfo | None) -> None: ...
def __enter__(self) -> None: ...
def __exit__(
self,
exc_type: type[BaseException] | None,
exc_value: BaseException | None,
traceback: TracebackType | None,
) -> None: ...
def localtime(value: datetime | None = None, timezone: tzinfo | None = None) -> datetime: ...
def localdate(value: datetime | None = None, timezone: tzinfo | None = None) -> date: ...
def now() -> datetime: ...
@overload
def is_aware(value: time) -> Literal[False]: ...
@overload
def is_aware(value: datetime) -> bool: ...
@overload
def is_naive(value: time) -> Literal[True]: ...
@overload
def is_naive(value: datetime) -> bool: ...
def make_aware(value: datetime, timezone: tzinfo | None = None) -> datetime: ...
def make_naive(value: datetime, timezone: tzinfo | None = None) -> datetime: ...
__all__ = [
"activate",
"deactivate",
"get_current_timezone",
"get_current_timezone_name",
"get_default_timezone",
"get_default_timezone_name",
"get_fixed_timezone",
"is_aware",
"is_naive",
"localdate",
"localtime",
"make_aware",
"make_naive",
"now",
"override",
]
typeddjango-django-stubs-fa03b48/django-stubs/utils/translation/ 0000775 0000000 0000000 00000000000 15260643574 0025143 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/utils/translation/__init__.pyi 0000664 0000000 0000000 00000004664 15260643574 0027437 0 ustar 00root root 0000000 0000000 from contextlib import ContextDecorator
from types import TracebackType
from typing import Any
from django.http.request import HttpRequest
from django.utils.functional import _StrPromise
class TranslatorCommentWarning(SyntaxWarning): ...
def gettext_noop(message: str) -> str: ...
def gettext(message: str) -> str: ...
def ngettext(singular: str, plural: str, number: float) -> str: ...
def pgettext(context: str, message: str) -> str: ...
def npgettext(context: str, singular: str, plural: str, number: float) -> str: ...
# lazy evaluated translation functions
def gettext_lazy(message: str) -> _StrPromise: ...
def pgettext_lazy(context: str, message: str) -> _StrPromise: ...
def ngettext_lazy(singular: str, plural: str, number: int | str | None = None) -> _StrPromise: ...
def npgettext_lazy(context: str, singular: str, plural: str, number: int | str | None = None) -> _StrPromise: ...
def activate(language: str) -> None: ...
def deactivate() -> None: ...
class override(ContextDecorator):
language: str | None
deactivate: bool
def __init__(self, language: str | None, deactivate: bool = False) -> None: ...
old_language: str | None
def __enter__(self) -> None: ...
def __exit__(
self,
exc_type: type[BaseException] | None,
exc_value: BaseException | None,
traceback: TracebackType | None,
) -> None: ...
def get_language() -> str: ...
def get_language_bidi() -> bool: ...
def check_for_language(lang_code: str | None) -> bool: ...
def to_language(locale: str) -> str: ...
def to_locale(language: str) -> str: ...
def get_language_from_request(request: HttpRequest, check_path: bool = False) -> str: ...
def get_language_from_path(path: str) -> str | None: ...
def get_supported_language_variant(lang_code: str, *, strict: bool = False) -> str: ...
def templatize(src: str, **kwargs: Any) -> str: ...
def deactivate_all() -> None: ...
def get_language_info(lang_code: str) -> Any: ...
def trim_whitespace(s: str) -> str: ...
def round_away_from_one(value: int) -> int: ...
__all__ = [
"activate",
"check_for_language",
"deactivate",
"deactivate_all",
"get_language",
"get_language_bidi",
"get_language_from_request",
"get_language_info",
"gettext",
"gettext_lazy",
"gettext_noop",
"ngettext",
"ngettext_lazy",
"npgettext",
"npgettext_lazy",
"override",
"pgettext",
"pgettext_lazy",
"templatize",
"to_language",
"to_locale",
]
typeddjango-django-stubs-fa03b48/django-stubs/utils/translation/reloader.pyi 0000664 0000000 0000000 00000000436 15260643574 0027466 0 ustar 00root root 0000000 0000000 from pathlib import Path
from typing import Any
from django.utils.autoreload import BaseReloader
def watch_for_translation_changes(sender: BaseReloader, **kwargs: Any) -> None: ...
def translation_file_changed(sender: BaseReloader | None, file_path: Path, **kwargs: Any) -> bool: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/translation/template.pyi 0000664 0000000 0000000 00000000520 15260643574 0027476 0 ustar 00root root 0000000 0000000 from re import Pattern
TRANSLATOR_COMMENT_MARK: str
dot_re: Pattern[str]
def blankout(src: str, char: str) -> str: ...
context_re: Pattern[str]
inline_re: Pattern[str]
block_re: Pattern[str]
endblock_re: Pattern[str]
plural_re: Pattern[str]
constant_re: Pattern[str]
def templatize(src: str, origin: str | None = None) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/translation/trans_null.pyi 0000664 0000000 0000000 00000001445 15260643574 0030053 0 ustar 00root root 0000000 0000000 from django.http.request import HttpRequest
def gettext(message: str) -> str: ...
gettext_noop = gettext
gettext_lazy = gettext
_ = gettext
def ngettext(singular: str, plural: str, number: int) -> str: ...
ngettext_lazy = ngettext
def pgettext(context: str, message: str) -> str: ...
def npgettext(context: str, singular: str, plural: str, number: int) -> str: ...
def activate(x: str) -> None: ...
def deactivate() -> None: ...
deactivate_all = deactivate
def get_language() -> str: ...
def get_language_bidi() -> bool: ...
def check_for_language(x: str) -> bool: ...
def get_language_from_request(request: HttpRequest, check_path: bool = False) -> str: ...
def get_language_from_path(request: str) -> None: ...
def get_supported_language_variant(lang_code: str, strict: bool = False) -> str: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/translation/trans_real.pyi 0000664 0000000 0000000 00000006024 15260643574 0030022 0 ustar 00root root 0000000 0000000 import gettext as gettext_module
from collections.abc import Iterator
from gettext import NullTranslations
from re import Pattern
# switch to tuple once https://github.com/python/mypy/issues/11098 is fixed
from typing import Any, Literal, Protocol, TypeAlias, type_check_only
from django.http.request import HttpRequest
from typing_extensions import TypeVar, override
CONTEXT_SEPARATOR: Literal["\x04"]
LANGUAGE_CODE_MAX_LENGTH: int
accept_language_re: Pattern[str]
language_code_re: Pattern[str]
language_code_prefix_re: Pattern[str]
@type_check_only
class _PluralCallable(Protocol):
def __call__(self, n: int, /) -> int: ...
def reset_cache(*, setting: str, **kwargs: Any) -> None: ...
# switch to tuple once https://github.com/python/mypy/issues/11098 is fixed
_KeyT: TypeAlias = str | tuple[str, int]
_Z = TypeVar("_Z")
class TranslationCatalog:
_catalogs: list[dict[_KeyT, str]]
def __init__(self, trans: gettext_module.NullTranslations | None = None) -> None: ...
def __getitem__(self, key: _KeyT) -> str: ...
def __setitem__(self, key: _KeyT, value: str) -> None: ...
def __contains__(self, key: _KeyT) -> bool: ...
def items(self) -> Iterator[tuple[_KeyT, str]]: ...
def keys(self) -> Iterator[_KeyT]: ...
def update(self, trans: gettext_module.NullTranslations) -> None: ...
def get(self, key: _KeyT, default: _Z | None = None) -> str | _Z: ...
def plural(self, msgid: str, num: int) -> str: ...
class DjangoTranslation(gettext_module.GNUTranslations):
domain: str
plural: _PluralCallable
def __init__(self, language: str, domain: str | None = None, localedirs: list[str] | None = None) -> None: ...
def merge(self, other: NullTranslations) -> None: ...
def language(self) -> str: ...
def to_language(self) -> str: ...
@override
def ngettext(self, msgid1: str, msgid2: str, n: int) -> str: ...
def translation(language: str) -> DjangoTranslation: ...
def activate(language: str) -> None: ...
def deactivate() -> None: ...
def deactivate_all() -> None: ...
def get_language() -> str: ...
def get_language_bidi() -> bool: ...
def catalog() -> DjangoTranslation: ...
def gettext(message: str) -> str: ...
def pgettext(context: str, message: str) -> str: ...
def gettext_noop(message: str) -> str: ...
def do_ntranslate(singular: str, plural: str, number: float, translation_function: str) -> str: ...
def ngettext(singular: str, plural: str, number: float) -> str: ...
def npgettext(context: str, singular: str, plural: str, number: int) -> str: ...
def all_locale_paths() -> list[str]: ...
def check_for_language(lang_code: str | None) -> bool: ...
def translation_catalog_exists(lang_code: str) -> bool: ...
def get_languages() -> dict[str, str]: ...
def get_supported_language_variant(lang_code: str | None, strict: bool = False) -> str: ...
def get_language_from_path(path: str, strict: bool = False) -> str | None: ...
def get_language_from_request(request: HttpRequest, check_path: bool = False) -> str: ...
def parse_accept_lang_header(lang_string: str) -> tuple[tuple[str, float], ...]: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/tree.pyi 0000664 0000000 0000000 00000002016 15260643574 0024266 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from typing import Any, Self, TypeAlias
from django.db.models.sql.where import NothingNode
from typing_extensions import override
_NodeChildren: TypeAlias = list[Node | NothingNode | Sequence[Any]]
class Node:
children: _NodeChildren
default: str
connector: str
negated: bool
def __init__(
self, children: _NodeChildren | None = None, connector: str | None = None, negated: bool = False
) -> None: ...
@classmethod
def create(
cls, children: _NodeChildren | None = None, connector: str | None = None, negated: bool = False
) -> Self: ...
def copy(self) -> Self: ...
def __copy__(self) -> Self: ...
def __deepcopy__(self, memodict: dict[Any, Any]) -> Self: ...
def __len__(self) -> int: ...
def __bool__(self) -> bool: ...
def __contains__(self, other: tuple[str, int]) -> bool: ...
@override
def __hash__(self) -> int: ...
def add(self, data: Any, conn_type: str) -> Any: ...
def negate(self) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/version.pyi 0000664 0000000 0000000 00000001003 15260643574 0025007 0 ustar 00root root 0000000 0000000 from typing import TypeAlias
PYPY: bool
PY310: bool
PY311: bool
PY312: bool
PY313: bool
PY314: bool
PY315: bool
_VT: TypeAlias = tuple[int, int, int, str, int]
def get_version(version: _VT | None = None) -> str: ...
def get_main_version(version: _VT | None = None) -> str: ...
def get_complete_version(version: _VT | None = None) -> _VT: ...
def get_docs_version(version: _VT | None = None) -> str: ...
def get_git_changeset() -> str | None: ...
def get_version_tuple(version: str) -> tuple[int, int, int]: ...
typeddjango-django-stubs-fa03b48/django-stubs/utils/xmlutils.pyi 0000664 0000000 0000000 00000001104 15260643574 0025205 0 ustar 00root root 0000000 0000000 from xml.sax.saxutils import XMLGenerator
from xml.sax.xmlreader import AttributesImpl
from typing_extensions import override
class UnserializableContentError(ValueError):
def __init__(self, msg: str = "Control characters are not supported in XML 1.0"): ...
class SimplerXMLGenerator(XMLGenerator):
def addQuickElement(self, name: str, contents: str | None = None, attrs: dict[str, str] | None = None) -> None: ...
@override
def characters(self, content: str) -> None: ...
@override
def startElement(self, name: str, attrs: AttributesImpl) -> None: ...
typeddjango-django-stubs-fa03b48/django-stubs/views/ 0000775 0000000 0000000 00000000000 15260643574 0022602 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/views/__init__.pyi 0000664 0000000 0000000 00000000073 15260643574 0025064 0 ustar 00root root 0000000 0000000 from .generic.base import View as View
__all__ = ["View"]
typeddjango-django-stubs-fa03b48/django-stubs/views/csrf.pyi 0000664 0000000 0000000 00000000503 15260643574 0024260 0 ustar 00root root 0000000 0000000 from pathlib import Path
from django.http.request import HttpRequest
from django.http.response import HttpResponseForbidden
CSRF_FAILURE_TEMPLATE_NAME: str
def builtin_template_path(name: str) -> Path: ...
def csrf_failure(request: HttpRequest, reason: str = ..., template_name: str = ...) -> HttpResponseForbidden: ...
typeddjango-django-stubs-fa03b48/django-stubs/views/debug.pyi 0000664 0000000 0000000 00000006077 15260643574 0024425 0 ustar 00root root 0000000 0000000 import re
from collections.abc import Callable, ItemsView, Iterator
from pathlib import Path
from types import TracebackType
from typing import Any
from django.http.request import HttpRequest, QueryDict
from django.http.response import Http404, HttpResponse
from django.template import Engine
from django.utils.safestring import SafeString
DEBUG_ENGINE: Engine
class CallableSettingWrapper:
def __init__(self, callable_setting: Callable[..., Any] | type[Any]) -> None: ...
class ExceptionCycleWarning(UserWarning): ...
def technical_500_response(
request: HttpRequest,
exc_type: type[BaseException] | None,
exc_value: BaseException | None,
tb: TracebackType | None,
status_code: int = ...,
) -> HttpResponse: ...
def get_default_exception_reporter_filter() -> SafeExceptionReporterFilter: ...
def get_exception_reporter_filter(request: HttpRequest | None) -> SafeExceptionReporterFilter: ...
class SafeExceptionReporterFilter:
cleansed_substitute: str
hidden_settings: re.Pattern[str]
def cleanse_setting(self, key: int | str, value: Any) -> Any: ...
def get_safe_settings(self) -> dict[str, Any]: ...
def get_safe_request_meta(self, request: HttpRequest) -> dict[str, Any]: ...
def get_safe_cookies(self, request: HttpRequest) -> dict[str, Any]: ...
def is_active(self, request: HttpRequest | None) -> bool: ...
def get_cleansed_multivaluedict(self, request: HttpRequest, multivaluedict: QueryDict) -> QueryDict: ...
def get_post_parameters(self, request: HttpRequest | None) -> dict[str, Any]: ...
def cleanse_special_types(self, request: HttpRequest | None, value: Any) -> Any: ...
def get_traceback_frame_variables(self, request: Any, tb_frame: Any) -> ItemsView[str, Any]: ...
class ExceptionReporter:
request: HttpRequest | None
filter: SafeExceptionReporterFilter
exc_type: type[BaseException] | None
exc_value: BaseException | None
tb: TracebackType | None
is_email: bool
template_info: Any | None
template_does_not_exist: bool
postmortem: Any | None
@property
def html_template_path(self) -> Path: ...
@property
def text_template_path(self) -> Path: ...
def __init__(
self,
request: HttpRequest | None,
exc_type: type[BaseException] | None,
exc_value: BaseException | None,
tb: TracebackType | None,
is_email: bool = ...,
) -> None: ...
def get_traceback_data(self) -> dict[str, Any]: ...
def get_traceback_html(self) -> SafeString: ...
def get_traceback_text(self) -> SafeString: ...
def get_traceback_frames(self) -> list[Any]: ...
def get_exception_traceback_frames(
self, exc_value: BaseException | None, tb: TracebackType | None
) -> Iterator[dict[str, Any]]: ...
def technical_404_response(request: HttpRequest, exception: Http404) -> HttpResponse: ...
def default_urlconf(request: HttpResponse | None) -> HttpResponse: ...
def builtin_template_path(name: str) -> Path: ...
def get_caller(request: HttpRequest) -> str: ...
def get_exception_reporter_class(request: HttpRequest) -> ExceptionReporter: ...
typeddjango-django-stubs-fa03b48/django-stubs/views/decorators/ 0000775 0000000 0000000 00000000000 15260643574 0024747 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/views/decorators/__init__.pyi 0000664 0000000 0000000 00000000000 15260643574 0027217 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/views/decorators/cache.pyi 0000664 0000000 0000000 00000000571 15260643574 0026540 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any
from typing_extensions import TypeVar
_F = TypeVar("_F", bound=Callable[..., Any])
def cache_page(
timeout: float | None, *, cache: Any | None = ..., key_prefix: Any | None = ...
) -> Callable[[_F], _F]: ...
def cache_control(**kwargs: Any) -> Callable[[_F], _F]: ...
def never_cache(view_func: _F) -> _F: ...
typeddjango-django-stubs-fa03b48/django-stubs/views/decorators/clickjacking.pyi 0000664 0000000 0000000 00000000460 15260643574 0030106 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any
from typing_extensions import TypeVar
_F = TypeVar("_F", bound=Callable[..., Any])
def xframe_options_deny(view_func: _F) -> _F: ...
def xframe_options_sameorigin(view_func: _F) -> _F: ...
def xframe_options_exempt(view_func: _F) -> _F: ...
typeddjango-django-stubs-fa03b48/django-stubs/views/decorators/common.pyi 0000664 0000000 0000000 00000000300 15260643574 0026753 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any
from typing_extensions import TypeVar
_C = TypeVar("_C", bound=Callable[..., Any])
def no_append_slash(view_func: _C) -> _C: ...
typeddjango-django-stubs-fa03b48/django-stubs/views/decorators/csp.pyi 0000664 0000000 0000000 00000000545 15260643574 0026263 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Collection, Mapping
from typing import Any
from typing_extensions import TypeVar
_F = TypeVar("_F", bound=Callable[..., Any])
def csp_override(config: Mapping[str, Collection[str] | str]) -> Callable[[_F], _F]: ...
def csp_report_only_override(config: Mapping[str, Collection[str] | str]) -> Callable[[_F], _F]: ...
typeddjango-django-stubs-fa03b48/django-stubs/views/decorators/csrf.pyi 0000664 0000000 0000000 00000000710 15260643574 0026425 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any
from django.middleware.csrf import CsrfViewMiddleware
from typing_extensions import TypeVar
csrf_protect: Callable[[_F], _F]
class _EnsureCsrfToken(CsrfViewMiddleware): ...
requires_csrf_token: Callable[[_F], _F]
class _EnsureCsrfCookie(CsrfViewMiddleware): ...
ensure_csrf_cookie: Callable[[_F], _F]
_F = TypeVar("_F", bound=Callable[..., Any])
def csrf_exempt(view_func: _F) -> _F: ...
typeddjango-django-stubs-fa03b48/django-stubs/views/decorators/debug.pyi 0000664 0000000 0000000 00000000607 15260643574 0026563 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any, Literal
from typing_extensions import TypeVar
_F = TypeVar("_F", bound=Callable[..., Any])
coroutine_functions_to_sensitive_variables: dict[int, Literal["__ALL__"] | tuple[str, ...]]
def sensitive_variables(*variables: str) -> Callable[[_F], _F]: ...
def sensitive_post_parameters(*parameters: str) -> Callable[[_F], _F]: ...
typeddjango-django-stubs-fa03b48/django-stubs/views/decorators/gzip.pyi 0000664 0000000 0000000 00000000260 15260643574 0026441 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any
from typing_extensions import TypeVar
_C = TypeVar("_C", bound=Callable[..., Any])
gzip_page: Callable[[_C], _C]
typeddjango-django-stubs-fa03b48/django-stubs/views/decorators/http.pyi 0000664 0000000 0000000 00000001354 15260643574 0026454 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Container
from datetime import datetime
from typing import Any
from typing_extensions import TypeVar
_F = TypeVar("_F", bound=Callable[..., Any])
conditional_page: Callable[[_F], _F]
def require_http_methods(request_method_list: Container[str]) -> Callable[[_F], _F]: ...
require_GET: Callable[[_F], _F]
require_POST: Callable[[_F], _F]
require_safe: Callable[[_F], _F]
def condition(
etag_func: Callable[..., str | None] | None = ..., last_modified_func: Callable[..., datetime | None] | None = ...
) -> Callable[[_F], _F]: ...
def etag(etag_func: Callable[..., str | None]) -> Callable[[_F], _F]: ...
def last_modified(last_modified_func: Callable[..., datetime | None]) -> Callable[[_F], _F]: ...
typeddjango-django-stubs-fa03b48/django-stubs/views/decorators/vary.pyi 0000664 0000000 0000000 00000000370 15260643574 0026453 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any
from typing_extensions import TypeVar
_F = TypeVar("_F", bound=Callable[..., Any])
def vary_on_headers(*headers: str) -> Callable[[_F], _F]: ...
def vary_on_cookie(func: _F) -> _F: ...
typeddjango-django-stubs-fa03b48/django-stubs/views/defaults.pyi 0000664 0000000 0000000 00000001447 15260643574 0025142 0 ustar 00root root 0000000 0000000 from django.http.request import HttpRequest
from django.http.response import (
HttpResponseBadRequest,
HttpResponseForbidden,
HttpResponseNotFound,
HttpResponseServerError,
)
ERROR_404_TEMPLATE_NAME: str
ERROR_403_TEMPLATE_NAME: str
ERROR_400_TEMPLATE_NAME: str
ERROR_500_TEMPLATE_NAME: str
ERROR_PAGE_TEMPLATE: str
def page_not_found(
request: HttpRequest, exception: Exception | None, template_name: str = ...
) -> HttpResponseNotFound: ...
def server_error(request: HttpRequest, template_name: str = ...) -> HttpResponseServerError: ...
def bad_request(request: HttpRequest, exception: Exception, template_name: str = ...) -> HttpResponseBadRequest: ...
def permission_denied(
request: HttpRequest, exception: Exception, template_name: str = ...
) -> HttpResponseForbidden: ...
typeddjango-django-stubs-fa03b48/django-stubs/views/generic/ 0000775 0000000 0000000 00000000000 15260643574 0024216 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/django-stubs/views/generic/__init__.pyi 0000664 0000000 0000000 00000002202 15260643574 0026474 0 ustar 00root root 0000000 0000000 from .base import RedirectView as RedirectView
from .base import TemplateView as TemplateView
from .base import View as View
from .dates import ArchiveIndexView as ArchiveIndexView
from .dates import DateDetailView as DateDetailView
from .dates import DayArchiveView as DayArchiveView
from .dates import MonthArchiveView as MonthArchiveView
from .dates import TodayArchiveView as TodayArchiveView
from .dates import WeekArchiveView as WeekArchiveView
from .dates import YearArchiveView as YearArchiveView
from .detail import DetailView as DetailView
from .edit import CreateView as CreateView
from .edit import DeleteView as DeleteView
from .edit import FormView as FormView
from .edit import UpdateView as UpdateView
from .list import ListView as ListView
class GenericViewError(Exception): ...
__all__ = [
"ArchiveIndexView",
"CreateView",
"DateDetailView",
"DayArchiveView",
"DeleteView",
"DetailView",
"FormView",
"GenericViewError",
"ListView",
"MonthArchiveView",
"RedirectView",
"TemplateView",
"TodayArchiveView",
"UpdateView",
"View",
"WeekArchiveView",
"YearArchiveView",
]
typeddjango-django-stubs-fa03b48/django-stubs/views/generic/base.pyi 0000664 0000000 0000000 00000005374 15260643574 0025664 0 ustar 00root root 0000000 0000000 import logging
from collections.abc import Callable, Mapping, Sequence
from typing import Any, Generic
from django.http.request import HttpRequest
from django.http.response import HttpResponse, HttpResponseBase
from django.utils.functional import _Getter
from typing_extensions import TypeVar, override
logger: logging.Logger
class ContextMixin:
extra_context: Mapping[str, Any] | None
def get_context_data(self, **kwargs: Any) -> dict[str, Any]: ...
_ViewResponse = TypeVar("_ViewResponse", bound=HttpResponseBase, default=HttpResponseBase)
class View(Generic[_ViewResponse]):
http_method_names: Sequence[str]
request: HttpRequest
args: Any
kwargs: Any
def __init__(self, **kwargs: Any) -> None: ...
view_is_async: _Getter[bool] | bool
@classmethod
def as_view(cls: Any, **initkwargs: Any) -> Callable[..., _ViewResponse]: ...
def setup(self, request: HttpRequest, *args: Any, **kwargs: Any) -> None: ...
def dispatch(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase: ...
def http_method_not_allowed(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ...
def options(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase: ...
_TemplateResponse = TypeVar("_TemplateResponse", bound=HttpResponse, default=HttpResponse)
class TemplateResponseMixin(Generic[_TemplateResponse]):
template_name: str | None
template_engine: str | None
response_class: type[_TemplateResponse]
content_type: str | None
request: HttpRequest
def render_to_response(self, context: dict[str, Any], **response_kwargs: Any) -> _TemplateResponse: ...
def get_template_names(self) -> list[str]: ...
class TemplateView(TemplateResponseMixin[_TemplateResponse], ContextMixin, View[_TemplateResponse]):
def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> _TemplateResponse: ...
class RedirectView(View):
permanent: bool
url: str | None
pattern_name: str | None
query_string: bool
preserve_request: bool
def get_redirect_url(self, *args: Any, **kwargs: Any) -> str | None: ...
def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase: ...
def head(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase: ...
def post(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase: ...
@override
def options(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase: ...
def delete(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase: ...
def put(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase: ...
def patch(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase: ...
typeddjango-django-stubs-fa03b48/django-stubs/views/generic/dates.pyi 0000664 0000000 0000000 00000011224 15260643574 0026041 0 ustar 00root root 0000000 0000000 import datetime
from collections.abc import Sequence
from typing import Any, TypeAlias
from django.db import models
from django.db.models.query import QuerySet, _OrderByFieldName
from django.http import HttpRequest, HttpResponse
from django.utils.datastructures import _IndexableCollection
from django.utils.functional import _Getter
from django.views.generic.base import View
from django.views.generic.detail import BaseDetailView, SingleObjectTemplateResponseMixin
from django.views.generic.list import MultipleObjectMixin, MultipleObjectTemplateResponseMixin
from typing_extensions import TypeVar, override
_M = TypeVar("_M", bound=models.Model)
_DatedItems: TypeAlias = tuple[_IndexableCollection[datetime.date] | None, _IndexableCollection[_M], dict[str, Any]]
class YearMixin:
year_format: str
year: str | None
def get_year_format(self) -> str: ...
def get_year(self) -> str: ...
def get_next_year(self, date: datetime.date) -> datetime.date | None: ...
def get_previous_year(self, date: datetime.date) -> datetime.date | None: ...
class MonthMixin:
month_format: str
month: str | None
def get_month_format(self) -> str: ...
def get_month(self) -> str: ...
def get_next_month(self, date: datetime.date) -> datetime.date | None: ...
def get_previous_month(self, date: datetime.date) -> datetime.date | None: ...
class DayMixin:
day_format: str
day: str | None
def get_day_format(self) -> str: ...
def get_day(self) -> str: ...
def get_next_day(self, date: datetime.date) -> datetime.date | None: ...
def get_previous_day(self, date: datetime.date) -> datetime.date | None: ...
class WeekMixin:
week_format: str
week: str | None
def get_week_format(self) -> str: ...
def get_week(self) -> str: ...
def get_next_week(self, date: datetime.date) -> datetime.date | None: ...
def get_previous_week(self, date: datetime.date) -> datetime.date | None: ...
class DateMixin:
date_field: str | None
allow_future: bool
def get_date_field(self) -> str: ...
def get_allow_future(self) -> bool: ...
uses_datetime_field: _Getter[bool] | bool
class BaseDateListView(MultipleObjectMixin[_M], DateMixin, View):
date_list_period: str
def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ...
def get_dated_items(self) -> _DatedItems[_M]: ...
@override
def get_ordering(self) -> str | Sequence[_OrderByFieldName]: ...
def get_dated_queryset(self, **lookup: Any) -> models.query.QuerySet[_M]: ...
def get_date_list_period(self) -> str: ...
def get_date_list(
self, queryset: models.query.QuerySet[_M], date_type: str | None = ..., ordering: str = ...
) -> models.query.QuerySet[_M]: ...
class BaseArchiveIndexView(BaseDateListView[_M]):
context_object_name: str
@override
def get_dated_items(self) -> _DatedItems[_M]: ...
class ArchiveIndexView(MultipleObjectTemplateResponseMixin, BaseArchiveIndexView[_M]):
template_name_suffix: str
class BaseYearArchiveView(YearMixin, BaseDateListView[_M]):
date_list_period: str
make_object_list: bool
@override
def get_dated_items(self) -> _DatedItems[_M]: ...
def get_make_object_list(self) -> bool: ...
class YearArchiveView(MultipleObjectTemplateResponseMixin, BaseYearArchiveView[_M]):
template_name_suffix: str
class BaseMonthArchiveView(YearMixin, MonthMixin, BaseDateListView[_M]):
date_list_period: str
@override
def get_dated_items(self) -> _DatedItems[_M]: ...
class MonthArchiveView(MultipleObjectTemplateResponseMixin, BaseMonthArchiveView[_M]):
template_name_suffix: str
class BaseWeekArchiveView(YearMixin, WeekMixin, BaseDateListView[_M]):
@override
def get_dated_items(self) -> _DatedItems[_M]: ...
class WeekArchiveView(MultipleObjectTemplateResponseMixin, BaseWeekArchiveView[_M]):
template_name_suffix: str
class BaseDayArchiveView(YearMixin, MonthMixin, DayMixin, BaseDateListView[_M]):
@override
def get_dated_items(self) -> _DatedItems[_M]: ...
class DayArchiveView(MultipleObjectTemplateResponseMixin, BaseDayArchiveView[_M]):
template_name_suffix: str
class BaseTodayArchiveView(BaseDayArchiveView[_M]):
@override
def get_dated_items(self) -> _DatedItems[_M]: ...
class TodayArchiveView(MultipleObjectTemplateResponseMixin, BaseTodayArchiveView[_M]):
template_name_suffix: str
class BaseDateDetailView(YearMixin, MonthMixin, DayMixin, DateMixin, BaseDetailView[_M]):
@override
def get_object(self, queryset: QuerySet[_M] | None = ...) -> _M: ...
class DateDetailView(SingleObjectTemplateResponseMixin, BaseDateDetailView[_M]):
template_name_suffix: str
def timezone_today() -> datetime.date: ...
typeddjango-django-stubs-fa03b48/django-stubs/views/generic/detail.pyi 0000664 0000000 0000000 00000002324 15260643574 0026204 0 ustar 00root root 0000000 0000000 from typing import Any, Generic, overload
from django.db import models
from django.http import HttpRequest, HttpResponse
from django.views.generic.base import ContextMixin, TemplateResponseMixin, View
from typing_extensions import TypeVar
_M = TypeVar("_M", bound=models.Model)
class SingleObjectMixin(ContextMixin, Generic[_M]):
model: type[_M]
queryset: models.query.QuerySet[_M] | None
slug_field: str
context_object_name: str | None
slug_url_kwarg: str
pk_url_kwarg: str
query_pk_and_slug: bool
def get_object(self, queryset: models.query.QuerySet[_M] | None = ...) -> _M: ...
def get_queryset(self) -> models.query.QuerySet[_M]: ...
def get_slug_field(self) -> str: ...
@overload
def get_context_object_name(self, obj: _M) -> str: ...
@overload
def get_context_object_name(self, obj: Any) -> str | None: ...
class BaseDetailView(SingleObjectMixin[_M], View):
object: _M
def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ...
class SingleObjectTemplateResponseMixin(TemplateResponseMixin):
template_name_field: str | None
template_name_suffix: str
class DetailView(SingleObjectTemplateResponseMixin, BaseDetailView[_M]): ...
typeddjango-django-stubs-fa03b48/django-stubs/views/generic/edit.pyi 0000664 0000000 0000000 00000007260 15260643574 0025673 0 ustar 00root root 0000000 0000000 from typing import Any, Generic, Literal
from django.db import models
from django.forms.forms import BaseForm, Form
from django.forms.models import BaseModelForm, ModelForm
from django.http import HttpRequest, HttpResponse
from django.utils.datastructures import _ListOrTuple
from django.utils.functional import _StrOrPromise
from django.views.generic.base import ContextMixin, TemplateResponseMixin, View
from django.views.generic.detail import BaseDetailView, SingleObjectMixin, SingleObjectTemplateResponseMixin
from typing_extensions import TypeVar, override
_M = TypeVar("_M", bound=models.Model)
_FormT = TypeVar("_FormT", bound=BaseForm)
_DeleteFormT = TypeVar("_DeleteFormT", bound=BaseForm, default=Form)
_ModelFormT = TypeVar("_ModelFormT", bound=BaseModelForm[Any], default=ModelForm[_M])
class FormMixin(ContextMixin, Generic[_FormT]):
initial: dict[str, Any]
form_class: type[_FormT] | None
success_url: _StrOrPromise | None = None
prefix: str | None
def get_initial(self) -> dict[str, Any]: ...
def get_prefix(self) -> str | None: ...
def get_form_class(self) -> type[_FormT]: ...
def get_form(self, form_class: type[_FormT] | None = ...) -> _FormT: ...
def get_form_kwargs(self) -> dict[str, Any]: ...
def get_success_url(self) -> str: ...
def form_valid(self, form: _FormT) -> HttpResponse: ...
def form_invalid(self, form: _FormT) -> HttpResponse: ...
@override
def get_context_data(self, **kwargs: Any) -> dict[str, Any]: ...
class ModelFormMixin(FormMixin[_ModelFormT], SingleObjectMixin[_M], Generic[_M, _ModelFormT]):
fields: _ListOrTuple[str] | Literal["__all__"] | None
@override
def get_form_class(self) -> type[_ModelFormT]: ...
@override
def get_form_kwargs(self) -> dict[str, Any]: ...
@override
def get_success_url(self) -> str: ...
@override
def form_valid(self, form: _ModelFormT) -> HttpResponse: ...
class ProcessFormView(View):
def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ...
def post(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ...
def put(self, *args: Any, **kwargs: Any) -> HttpResponse: ...
class BaseFormView(FormMixin[_FormT], ProcessFormView): ...
class FormView(TemplateResponseMixin, BaseFormView[_FormT]): ...
class BaseCreateView(ModelFormMixin[_M, _ModelFormT], ProcessFormView):
object: _M | None
@override
def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ...
@override
def post(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ...
class CreateView(SingleObjectTemplateResponseMixin, BaseCreateView[_M, _ModelFormT]):
template_name_suffix: str
class BaseUpdateView(ModelFormMixin[_M, _ModelFormT], ProcessFormView):
object: _M
@override
def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ...
@override
def post(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ...
class UpdateView(SingleObjectTemplateResponseMixin, BaseUpdateView[_M, _ModelFormT]):
template_name_suffix: str
class DeletionMixin(Generic[_M]):
success_url: _StrOrPromise | None = None
object: _M
def post(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ...
def delete(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ...
def get_success_url(self) -> str: ...
class BaseDeleteView(DeletionMixin[_M], FormMixin[_DeleteFormT], BaseDetailView[_M], Generic[_M, _DeleteFormT]):
object: _M
class DeleteView(SingleObjectTemplateResponseMixin, BaseDeleteView[_M, _DeleteFormT], Generic[_M, _DeleteFormT]):
object: _M
template_name_suffix: str
typeddjango-django-stubs-fa03b48/django-stubs/views/generic/list.pyi 0000664 0000000 0000000 00000004370 15260643574 0025720 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from typing import Any, Generic, Protocol, overload, type_check_only
from django.core.paginator import Page, Paginator, _SupportsPagination
from django.db.models import Model, QuerySet
from django.db.models.query import _OrderByFieldName
from django.http import HttpRequest, HttpResponse
from django.views.generic.base import ContextMixin, TemplateResponseMixin, View
from typing_extensions import TypeVar, override
_M = TypeVar("_M", bound=Model)
@type_check_only
class _HasModel(Protocol):
@property
def model(self) -> type[Model]: ...
class MultipleObjectMixin(ContextMixin, Generic[_M]):
allow_empty: bool
queryset: QuerySet[_M] | None
model: type[_M] | None
paginate_by: int | None
paginate_orphans: int
context_object_name: str | None
paginator_class: type[Paginator[Any]]
page_kwarg: str
ordering: str | Sequence[_OrderByFieldName] | None
def get_queryset(self) -> QuerySet[_M]: ...
def get_ordering(self) -> str | Sequence[_OrderByFieldName] | None: ...
def paginate_queryset(
self, queryset: _SupportsPagination[_M], page_size: int
) -> tuple[Paginator[Any], Page[Any], _SupportsPagination[_M], bool]: ...
def get_paginate_by(self, queryset: QuerySet[_M]) -> int | None: ...
def get_paginator(
self,
queryset: _SupportsPagination[_M],
per_page: int,
orphans: int = ...,
allow_empty_first_page: bool = ...,
**kwargs: Any,
) -> Paginator[Any]: ...
def get_paginate_orphans(self) -> int: ...
def get_allow_empty(self) -> bool: ...
@overload
def get_context_object_name(self, object_list: _HasModel) -> str: ...
@overload
def get_context_object_name(self, object_list: Any) -> str | None: ...
@override
def get_context_data(
self, *, object_list: _SupportsPagination[_M] | None = ..., **kwargs: Any
) -> dict[str, Any]: ...
class BaseListView(MultipleObjectMixin[_M], View):
object_list: _SupportsPagination[_M]
def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ...
class MultipleObjectTemplateResponseMixin(TemplateResponseMixin):
template_name_suffix: str
class ListView(MultipleObjectTemplateResponseMixin, BaseListView[_M]): ...
typeddjango-django-stubs-fa03b48/django-stubs/views/i18n.pyi 0000664 0000000 0000000 00000002115 15260643574 0024103 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from pathlib import Path
from typing import Any
from django.http.request import HttpRequest
from django.http.response import HttpResponse
from django.utils.translation.trans_real import DjangoTranslation
from django.views.generic import View
LANGUAGE_QUERY_PARAMETER: str
def builtin_template_path(name: str) -> Path: ...
def set_language(request: HttpRequest) -> HttpResponse: ...
def get_formats() -> dict[str, list[str] | int | str]: ...
class JavaScriptCatalog(View):
head: Callable[..., Any]
domain: str
packages: list[str] | None
translation: DjangoTranslation
def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ...
def get_paths(self, packages: list[str]) -> list[str]: ...
def get_plural(self) -> list[str] | None: ...
def get_catalog(self) -> dict[str, list[str] | str]: ...
def get_context_data(self, **kwargs: Any) -> dict[str, Any]: ...
def render_to_response(self, context: dict[str, Any], **response_kwargs: Any) -> HttpResponse: ...
class JSONCatalog(JavaScriptCatalog): ...
typeddjango-django-stubs-fa03b48/django-stubs/views/static.pyi 0000664 0000000 0000000 00000001007 15260643574 0024612 0 ustar 00root root 0000000 0000000 from pathlib import Path
from typing import Any
from django.http import FileResponse, HttpResponse
from django.http.request import HttpRequest
def builtin_template_path(name: str) -> Path: ...
def serve(
request: HttpRequest, path: str, document_root: str | None = None, show_indexes: bool = False
) -> HttpResponse | FileResponse: ...
template_translatable: Any
def directory_index(path: Any, fullpath: Any) -> HttpResponse: ...
def was_modified_since(header: str | None = None, mtime: float = 0) -> bool: ...
typeddjango-django-stubs-fa03b48/ext/ 0000775 0000000 0000000 00000000000 15260643574 0017645 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/ext/LICENSE.md 0000664 0000000 0000000 00000002063 15260643574 0021252 0 ustar 00root root 0000000 0000000 Copyright (c) Maxim Kurnikov.
All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
typeddjango-django-stubs-fa03b48/ext/README.md 0000664 0000000 0000000 00000004573 15260643574 0021135 0 ustar 00root root 0000000 0000000 # Extensions and monkey-patching for django-stubs
[](https://github.com/typeddjango/django-stubs/actions/workflows/test.yml)
[](http://mypy-lang.org/)
[](https://stackoverflow.com/questions/tagged/django-stubs?tab=Active)
This package contains extensions and monkey-patching functions for the [django-stubs](https://github.com/typeddjango/django-stubs) package. Certain features of django-stubs (i.e. generic django classes that don't define the `__class_getitem__` method) require runtime monkey-patching, which can't be done with type stubs. These extensions were split into a separate package so library consumers don't need `mypy` as a runtime dependency ([#526](https://github.com/typeddjango/django-stubs/pull/526#pullrequestreview-525798031)).
## Installation
```bash
pip install django-stubs-ext
```
## Usage
In your Django application, use the following code:
```py
import django_stubs_ext
django_stubs_ext.monkeypatch()
```
This only needs to be called once, so the call to `monkeypatch` should be placed in your top-level settings.
Real-life example [can be found here](https://github.com/wemake-services/wemake-django-template/blob/5bf1569e2710e11befc6991893f94419136d74bd/%7B%7Bcookiecutter.project_name%7D%7D/server/settings/__init__.py#L14-L19).
## Version compatibility
Since django-stubs supports multiple Django versions, this package takes care to only monkey-patch the features needed by your django version, and decides which features to patch at runtime. This is completely safe, as (currently) we only add a `__class_getitem__` method that does nothing:
```py
@classmethod
def __class_getitem__(cls, *args, **kwargs):
return cls
```
## To get help
For help with django-stubs, please view the main repository at
## Contributing
The django-stubs-ext package is part of the [django-stubs](https://github.com/typeddjango/django-stubs) monorepo. If you would like to contribute, please view the django-stubs [contribution guide](https://github.com/typeddjango/django-stubs/blob/master/CONTRIBUTING.md).
You can always also reach out in gitter to discuss your contributions!
typeddjango-django-stubs-fa03b48/ext/django_stubs_ext/ 0000775 0000000 0000000 00000000000 15260643574 0023207 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/ext/django_stubs_ext/__init__.py 0000664 0000000 0000000 00000001424 15260643574 0025321 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from .aliases import FieldOpts as FieldOpts
from .aliases import FieldsetSpec as FieldsetSpec
from .aliases import QuerySetAny as QuerySetAny
from .aliases import StrOrPromise, StrPromise
from .aliases import ValuesQuerySet as ValuesQuerySet
from .annotations import Annotations as Annotations
from .annotations import WithAnnotations as WithAnnotations
from .patch import monkeypatch as monkeypatch
from .types import AnyAttrAllowed as AnyAttrAllowed
from .types import MutableHttpRequest as MutableHttpRequest
__all__ = [
"Annotations",
"AnyAttrAllowed",
"FieldOpts",
"FieldsetSpec",
"MutableHttpRequest",
"QuerySetAny",
"StrOrPromise",
"StrPromise",
"ValuesQuerySet",
"WithAnnotations",
"monkeypatch",
]
typeddjango-django-stubs-fa03b48/ext/django_stubs_ext/aliases.py 0000664 0000000 0000000 00000001710 15260643574 0025201 0 ustar 00root root 0000000 0000000 from __future__ import annotations
import typing
if typing.TYPE_CHECKING:
from django.contrib.admin.options import _FieldOpts as FieldOpts
from django.contrib.admin.options import _FieldsetSpec as FieldsetSpec
from django.db.models.query import _QuerySet
from django.utils.functional import _StrOrPromise as StrOrPromise
from django.utils.functional import _StrPromise as StrPromise
# Deprecated type aliases. Use the QuerySet class directly instead.
QuerySetAny = _QuerySet
ValuesQuerySet = _QuerySet
else:
from django.db.models.query import QuerySet
from django.utils.functional import Promise as StrPromise
StrOrPromise = str | StrPromise
FieldOpts = dict
FieldsetSpec = list
# Deprecated type aliases. Use the QuerySet class directly instead.
QuerySetAny = QuerySet
ValuesQuerySet = QuerySet
__all__ = ["FieldOpts", "FieldsetSpec", "QuerySetAny", "StrOrPromise", "StrPromise", "ValuesQuerySet"]
typeddjango-django-stubs-fa03b48/ext/django_stubs_ext/annotations.py 0000664 0000000 0000000 00000001275 15260643574 0026123 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from collections.abc import Mapping
from typing import Annotated, Any, Generic
from django.db.models.base import Model
from typing_extensions import TypeVar
# Really, we would like to use TypedDict as a bound, but it's not possible
_Annotations = TypeVar("_Annotations", covariant=True, bound=Mapping[str, Any])
class Annotations(Generic[_Annotations]):
"""Use as `Annotations[MyTypedDict]`"""
pass
_T = TypeVar("_T", bound=Model)
WithAnnotations = Annotated[_T, Annotations[_Annotations]]
"""Alias to make it easy to annotate the model `_T` as having annotations
`_Annotations` (a `TypedDict`).
Use as `WithAnnotations[MyModel, MyTypedDict]`.
"""
typeddjango-django-stubs-fa03b48/ext/django_stubs_ext/db/ 0000775 0000000 0000000 00000000000 15260643574 0023574 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/ext/django_stubs_ext/db/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0025673 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/ext/django_stubs_ext/db/models/ 0000775 0000000 0000000 00000000000 15260643574 0025057 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/ext/django_stubs_ext/db/models/__init__.py 0000664 0000000 0000000 00000003712 15260643574 0027173 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from collections.abc import Sequence
from typing import ClassVar
from django.db.models import BaseConstraint, Index
from django.db.models.expressions import Combinable
from django.utils.datastructures import _ListOrTuple
from django_stubs_ext import StrOrPromise
class TypedModelMeta:
"""
Typed base class for Django Model `class Meta:` inner class. At runtime this is just an alias to `object`.
Most attributes are the same as `django.db.models.options.Options`. Options has some additional attributes and
some values are normalized by Django.
"""
abstract: ClassVar[bool] # default: False
app_label: ClassVar[str]
base_manager_name: ClassVar[str]
db_table: ClassVar[str]
db_table_comment: ClassVar[str]
db_tablespace: ClassVar[str]
default_manager_name: ClassVar[str]
default_related_name: ClassVar[str]
get_latest_by: ClassVar[str | Sequence[str]]
managed: ClassVar[bool] # default: True
order_with_respect_to: ClassVar[str]
ordering: ClassVar[Sequence[str | Combinable]]
permissions: ClassVar[_ListOrTuple[tuple[str, StrOrPromise]]]
default_permissions: ClassVar[Sequence[str]] # default: ("add", "change", "delete", "view")
proxy: ClassVar[bool] # default: False
required_db_features: ClassVar[_ListOrTuple[str]]
required_db_vendor: ClassVar[str]
select_on_save: ClassVar[bool] # default: False
indexes: ClassVar[_ListOrTuple[Index]]
unique_together: ClassVar[Sequence[Sequence[str]]]
index_together: ClassVar[Sequence[Sequence[str]]] # Deprecated in Django 4.2
constraints: ClassVar[_ListOrTuple[BaseConstraint]]
verbose_name: ClassVar[StrOrPromise]
verbose_name_plural: ClassVar[StrOrPromise]
else:
TypedModelMeta = object
typeddjango-django-stubs-fa03b48/ext/django_stubs_ext/db/models/manager.py 0000664 0000000 0000000 00000001564 15260643574 0027051 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING
# Re-export stubs-only classes RelatedManger and ManyRelatedManager.
# These are fake, Django defines these inside function body.
if TYPE_CHECKING:
# noinspection PyUnresolvedReferences
from django.db.models.fields.related_descriptors import ManyRelatedManager as ManyRelatedManager
# noinspection PyUnresolvedReferences
from django.db.models.fields.related_descriptors import RelatedManager as RelatedManager
else:
from typing import Protocol
from typing_extensions import TypeVar
_T = TypeVar("_T")
_Through = TypeVar("_Through")
# Define as `Protocol` to prevent them being used with `isinstance()`.
# These actually inherit from `BaseManager`.
class RelatedManager(Protocol[_T]):
pass
class ManyRelatedManager(Protocol[_T, _Through]):
pass
typeddjango-django-stubs-fa03b48/ext/django_stubs_ext/db/router.py 0000664 0000000 0000000 00000001633 15260643574 0025471 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from typing import Any
from django.db.models import Model
class TypedDatabaseRouter:
"""
Typed base class for Django's DATABASE_ROUTERS setting. At runtime this is just an alias to `object`.
All methods are optional.
Django documentation: https://docs.djangoproject.com/en/stable/topics/db/multi-db/#automatic-database-routing
"""
def db_for_read(self, model: type[Model], **hints: Any) -> str | None: ...
def db_for_write(self, model: type[Model], **hints: Any) -> str | None: ...
def allow_relation(self, obj1: Model, obj2: Model, **hints: Any) -> bool | None: ...
def allow_migrate(
self, db: str, app_label: str, model_name: str | None = None, **hints: Any
) -> bool | None: ...
else:
TypedDatabaseRouter = object
typeddjango-django-stubs-fa03b48/ext/django_stubs_ext/patch.py 0000664 0000000 0000000 00000013647 15260643574 0024673 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING, Any, Generic
from django import VERSION
from django.contrib.admin import ModelAdmin
from django.contrib.admin.options import BaseModelAdmin
from django.contrib.messages.views import SuccessMessageMixin
from django.contrib.sessions.backends.db import SessionStore
from django.contrib.sitemaps import Sitemap
from django.contrib.syndication.views import Feed
from django.core.files.utils import FileProxyMixin
from django.core.paginator import Paginator
from django.db.models.expressions import ExpressionWrapper, Func, Subquery
from django.db.models.fields import Field
from django.db.models.fields.related import ForeignKey
from django.db.models.fields.related_descriptors import (
ForwardManyToOneDescriptor,
ReverseManyToOneDescriptor,
ReverseOneToOneDescriptor,
)
from django.db.models.lookups import Lookup
from django.db.models.manager import BaseManager
from django.db.models.options import Options
from django.db.models.query import BaseIterable, ModelIterable, Prefetch, QuerySet, RawQuerySet
from django.forms.formsets import BaseFormSet
from django.forms.models import BaseModelForm, BaseModelFormSet, ModelChoiceField, ModelChoiceIterator, ModelFormOptions
from django.utils.connection import BaseConnectionHandler, ConnectionProxy
from django.utils.datastructures import OrderedSet
from django.utils.functional import LazyObject, classproperty
from django.views import View
from django.views.generic.base import TemplateResponseMixin
from django.views.generic.detail import SingleObjectMixin
from django.views.generic.edit import DeletionMixin, FormMixin
from django.views.generic.list import MultipleObjectMixin
from typing_extensions import TypeVar, override
if TYPE_CHECKING:
from collections.abc import Iterable
__all__ = ["monkeypatch"]
_T = TypeVar("_T")
_VersionSpec = tuple[int, int]
class MPGeneric(Generic[_T]):
"""Create a data class to hold metadata about the generic classes needing monkeypatching.
The `version` param is optional, and a value of `None` means that the monkeypatch is
version-independent.
This is slightly overkill for our purposes, but useful for future-proofing against any
possible issues we may run into with this method.
"""
def __init__(self, cls: type[_T], version: _VersionSpec | None = None) -> None:
"""Set the data fields, basic constructor."""
self.version = version
self.cls = cls
@override
def __repr__(self) -> str:
"""Better representation in tests and debug."""
return "".format(self.cls, self.version or "all")
# certain django classes need to be generic, but lack the __class_getitem__ dunder needed to
# annotate them: https://github.com/typeddjango/django-stubs/issues/507
# this list stores them so `monkeypatch` can fix them when called
_need_generic: list[MPGeneric[Any]] = [
MPGeneric(ModelAdmin),
MPGeneric(SingleObjectMixin),
MPGeneric(FormMixin),
MPGeneric(DeletionMixin),
MPGeneric(MultipleObjectMixin),
MPGeneric(BaseModelAdmin),
MPGeneric(Field),
MPGeneric(Paginator),
MPGeneric(BaseFormSet),
MPGeneric(BaseModelForm),
MPGeneric(BaseModelFormSet),
MPGeneric(ModelChoiceField),
MPGeneric(ModelChoiceIterator),
MPGeneric(Feed),
MPGeneric(Sitemap),
MPGeneric(SuccessMessageMixin),
MPGeneric(FileProxyMixin),
MPGeneric(Lookup),
MPGeneric(BaseConnectionHandler),
MPGeneric(ExpressionWrapper),
MPGeneric(Func),
MPGeneric(Subquery),
MPGeneric(ReverseManyToOneDescriptor),
MPGeneric(ModelIterable),
MPGeneric(View),
MPGeneric(TemplateResponseMixin),
# These types do have native `__class_getitem__` method since django 3.1:
MPGeneric(QuerySet, (3, 1)),
MPGeneric(BaseManager, (3, 1)),
# These types do have native `__class_getitem__` method since django 4.1:
MPGeneric(ForeignKey, (4, 1)),
MPGeneric(RawQuerySet),
MPGeneric(classproperty),
MPGeneric(LazyObject),
MPGeneric(ConnectionProxy),
MPGeneric(ModelFormOptions),
MPGeneric(Options),
MPGeneric(BaseIterable),
MPGeneric(ForwardManyToOneDescriptor),
MPGeneric(ReverseOneToOneDescriptor),
MPGeneric(Prefetch),
MPGeneric(SessionStore),
MPGeneric(OrderedSet),
]
if VERSION >= (6, 0):
from django.core.paginator import AsyncPage, AsyncPaginator, BasePaginator
from django.tasks import Task, TaskContext, TaskResult
from django.utils.datastructures import DeferredSubDict
_need_generic.extend(
[
MPGeneric(Task),
MPGeneric(TaskContext),
MPGeneric(TaskResult),
MPGeneric(BasePaginator),
MPGeneric(AsyncPaginator),
MPGeneric(AsyncPage),
MPGeneric(DeferredSubDict),
]
)
def _make_class_getitem(patched_cls: type) -> Any:
def __class_getitem__(cls: type, item: Any) -> Any:
# A patched class may shadow `Generic.__class_getitem__` in a subclass MRO.
# Delegate to the next implementation when present, otherwise keep the
# existing no-op behavior.
mro = cls.__mro__
for base in mro[mro.index(patched_cls) + 1 : -1]:
getitem = base.__dict__.get("__class_getitem__")
if getitem is not None:
return getitem.__get__(None, cls)(item)
return cls
return classmethod(__class_getitem__)
def monkeypatch(extra_classes: Iterable[type] | None = None) -> None:
"""Monkey patch django as necessary to work properly with mypy."""
# Add the __class_getitem__ dunder.
suited_for_this_version = filter(
lambda spec: spec.version is None or VERSION[:2] <= spec.version,
_need_generic,
)
for el in suited_for_this_version:
el.cls.__class_getitem__ = _make_class_getitem(el.cls)
if extra_classes:
for cls in extra_classes:
cls.__class_getitem__ = _make_class_getitem(cls) # type: ignore[attr-defined]
typeddjango-django-stubs-fa03b48/ext/django_stubs_ext/py.typed 0000664 0000000 0000000 00000000000 15260643574 0024674 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/ext/django_stubs_ext/settings.py 0000664 0000000 0000000 00000000730 15260643574 0025421 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING, Any, NotRequired, TypedDict, type_check_only
if TYPE_CHECKING:
from pathlib import Path
@type_check_only
class TemplatesSetting(TypedDict):
"""Typing helper if you want to type `TEMPLATE` setting."""
BACKEND: str
NAME: NotRequired[str]
DIRS: NotRequired[list[str | Path]]
APP_DIRS: NotRequired[bool]
OPTIONS: NotRequired[dict[str, Any]]
__all__ = ["TemplatesSetting"]
typeddjango-django-stubs-fa03b48/ext/django_stubs_ext/types.py 0000664 0000000 0000000 00000001457 15260643574 0024734 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING, Any, Protocol
from typing_extensions import override
if TYPE_CHECKING:
from django.http.request import HttpRequest, QueryDict
class MutableHttpRequest(HttpRequest):
"""A request with mutable query dictionaries, as used in tests."""
GET: QueryDict # type: ignore[assignment]
POST: QueryDict # type: ignore[assignment]
else:
# The runtime class is Django's regular HttpRequest; mutability is a type-checking distinction only.
from django.http import HttpRequest
MutableHttpRequest = HttpRequest
# Used internally by mypy_django_plugin.
class AnyAttrAllowed(Protocol):
def __getattr__(self, item: str) -> Any: ...
@override
def __setattr__(self, item: str, value: Any) -> None: ...
typeddjango-django-stubs-fa03b48/ext/pyproject.toml 0000664 0000000 0000000 00000002726 15260643574 0022570 0 ustar 00root root 0000000 0000000 [project]
name = "django-stubs-ext"
# NB! For clarity, keep version major.minor.patch in sync with django-stubs.
# It's fine to skip django-stubs-ext releases, but when doing a release, update this to newest django-stubs version.
version = "6.1.2"
description = "Monkey-patching and extensions for django-stubs"
readme = "README.md"
license = "MIT"
license-files = ["LICENSE.md"]
maintainers = [
{ name = "Marti Raudsepp", email = "marti@juffo.org" },
{ name = "Nikita Sobolev", email = "mail@sobolevn.me" },
{ name = "Petter Friberg", email = "petter_friberg@hotmail.com" },
{ name = "Adam Johnson", email = "me@adamj.eu" },
]
authors = [
{ name = "Simula Proxy" },
]
requires-python = ">=3.11"
classifiers = [
"Operating System :: OS Independent",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
"Typing :: Typed",
"Framework :: Django",
"Framework :: Django :: 5.2",
"Framework :: Django :: 6.0",
"Framework :: Django :: 6.1",
]
dependencies = [
"django",
"typing-extensions",
]
[project.urls]
Homepage = "https://github.com/typeddjango/django-stubs"
Funding = "https://github.com/sponsors/typeddjango"
"Release notes" = "https://github.com/typeddjango/django-stubs/releases"
[build-system]
requires = ["uv_build>=0.12.0,<0.13.0"]
build-backend = "uv_build"
[tool.uv.build-backend]
module-name = ["django_stubs_ext"]
module-root = ""
typeddjango-django-stubs-fa03b48/ext/tests/ 0000775 0000000 0000000 00000000000 15260643574 0021007 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/ext/tests/test_aliases.py 0000664 0000000 0000000 00000000315 15260643574 0024040 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import Any
from django_stubs_ext import ValuesQuerySet
def test_extends_values_queryset() -> None:
class MyQS(ValuesQuerySet[Any, Any]):
pass
typeddjango-django-stubs-fa03b48/ext/tests/test_monkeypatching.py 0000664 0000000 0000000 00000007701 15260643574 0025445 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from contextlib import suppress
from typing import TYPE_CHECKING, Generic, Protocol, get_args, get_origin
import pytest
from django.db.models import Model
from django.forms.models import ModelForm
from django.views import View
from typing_extensions import TypeVar
import django_stubs_ext
from django_stubs_ext import patch
from django_stubs_ext.patch import _need_generic, _VersionSpec
if TYPE_CHECKING:
from collections.abc import Iterable
class _MakeGenericClasses(Protocol):
"""Used to represent a type of ``make_generic_classes`` fixture."""
def __call__(
self,
django_version: _VersionSpec | None = None,
extra_classes: Iterable[type] | None = None,
) -> None: ...
@pytest.fixture(scope="function")
def make_generic_classes(
request: pytest.FixtureRequest,
monkeypatch: pytest.MonkeyPatch,
) -> _MakeGenericClasses:
_extra_classes: list[type] = []
def fin() -> None:
for el in _need_generic:
with suppress(AttributeError):
delattr(el.cls, "__class_getitem__")
for cls in _extra_classes:
with suppress(AttributeError):
delattr(cls, "__class_getitem__")
_extra_classes.clear()
def factory(
django_version: _VersionSpec | None = None,
extra_classes: Iterable[type] | None = None,
) -> None:
if extra_classes:
_extra_classes.extend(extra_classes)
if django_version is not None:
monkeypatch.setattr(patch, "VERSION", django_version)
django_stubs_ext.monkeypatch(extra_classes=extra_classes)
request.addfinalizer(fin)
return factory
def test_patched_generics(make_generic_classes: _MakeGenericClasses) -> None:
"""Test that the generics actually get patched."""
make_generic_classes()
for el in _need_generic:
if el.version is None:
assert el.cls[type] is el.cls # `type` is arbitrary
class TestForm(ModelForm[Model]):
pass
def test_patched_extra_classes_generics(make_generic_classes: _MakeGenericClasses) -> None:
"""Test that the generics actually get patched for extra classes."""
class _NotGeneric:
pass
extra_classes = [_NotGeneric]
make_generic_classes(django_version=None, extra_classes=extra_classes)
for cls in extra_classes:
assert cls[type] is cls # type: ignore[misc]
class _TestGeneric(_NotGeneric[Model]): # type: ignore[type-arg]
pass
def test_patched_class_real_generic_subclass(make_generic_classes: _MakeGenericClasses) -> None:
"""Test that real `Generic` subclasses of patched classes keep runtime parametrization."""
make_generic_classes()
assert View[int] is View # type: ignore[type-var, comparison-overlap]
_T = TypeVar("_T")
class _Controller(View, Generic[_T]):
pass
alias = _Controller[int]
assert get_origin(alias) is _Controller
assert get_args(alias) == (int,)
class _Concrete(_Controller[int]):
pass
assert _Concrete.__orig_bases__ == (_Controller[int],) # type: ignore[attr-defined]
class _PlainView(View):
pass
assert _PlainView[int] is _PlainView # type: ignore[misc]
class _CustomGetitem:
def __class_getitem__(cls, item: object) -> object:
return ("custom", cls, item)
class _WithCustom(View, _CustomGetitem):
pass
assert _WithCustom[int] == ("custom", _WithCustom, int) # type: ignore[misc]
@pytest.mark.parametrize(
"django_version",
[
(2, 2),
(3, 0),
(3, 1),
(3, 2),
(4, 0),
(4, 1),
],
)
def test_patched_version_specific(
django_version: _VersionSpec,
make_generic_classes: _MakeGenericClasses,
) -> None:
"""Test version specific types."""
make_generic_classes(django_version)
for el in _need_generic:
if el.version is not None and django_version <= el.version:
assert el.cls[int] is el.cls
typeddjango-django-stubs-fa03b48/ext/tests/typecheck/ 0000775 0000000 0000000 00000000000 15260643574 0022766 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/ext/tests/typecheck/test_aliases.yml 0000664 0000000 0000000 00000000712 15260643574 0026171 0 ustar 00root root 0000000 0000000 - case: alias_values_query_set
main: |
from django_stubs_ext import ValuesQuerySet
from myapp.models import Blog
a: ValuesQuerySet[Blog, Blog]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Blog(models.Model):
created_at = models.DateTimeField()
typeddjango-django-stubs-fa03b48/justfile 0000664 0000000 0000000 00000004345 15260643574 0020623 0 ustar 00root root 0000000 0000000 # List all available recipes
_default:
@just --list --unsorted
# Bootstrap dev environment: install pre-commit hooks and sync dependencies
[group('dev')]
bootstrap:
uv tool install pre-commit
uv sync
pre-commit install --install-hooks
# Run pre-commit hooks on all files
[group('dev')]
lint:
pre-commit run --all-files
# Run all checks before submitting a PR
[group('dev')]
pre-mr-check: lint typecheck-all mypy-self stubtest ext-test test
# Remove mypy cache
[group('dev')]
clean-cache:
rm -rf .mypy_cache
rm -rf .pytest_cache
rm -rf .ruff_cache
# Run mypy on the internal python code.
[group('typecheck')]
mypy-self:
uv run mypy ext scripts mypy_django_plugin
uv run mypy --cache-dir=/dev/null --no-incremental django-stubs
# Run mypy on test cases (default), or on the given files
[group('typecheck')]
mypy *files="tests/assert_type":
uv run mypy {{ files }}
# Run pyright on test cases (default), or on the given files
[group('typecheck')]
pyright *files="tests/assert_type":
uv run pyright {{ files }}
# Run pyrefly on test cases (default), or on the given files
[group('typecheck')]
pyrefly *files="tests/assert_type":
uv run pyrefly check {{ files }}
# Run ty on test cases (default), or on the given files
[group('typecheck')]
ty *files="tests/assert_type":
uv run ty check {{ files }}
# Run all typecheckers on test cases (default), or on the given files
[group('typecheck')]
typecheck-all *files="tests/assert_type":
#!/usr/bin/env bash
failed=()
for checker in pyrefly ty pyright mypy; do
printf '=================================== %s ===================================\n' "$checker"
just "$checker" {{ files }} || failed+=("$checker")
done
[[ ${#failed[@]} -eq 0 ]] || { echo "Failed: ${failed[*]}"; exit 1; }
# Run pytest tests
[group('test')]
test +args="-n auto tests":
uv run pytest {{ args }}
# Run stubtest to check stubs match runtime
[group('test')]
stubtest *args:
uv run ./scripts/stubtest.sh {{ args }}
# Run django-stubs-ext tests
[group('test')]
ext-test:
uv run pytest ext
# Build all packages
[group('build')]
build:
uv build --all-packages
# Check that uv.lock is up to date
[group('build')]
lock-check:
uv lock --check
typeddjango-django-stubs-fa03b48/logo.svg 0000664 0000000 0000000 00000031242 15260643574 0020530 0 ustar 00root root 0000000 0000000
typeddjango-django-stubs-fa03b48/mypy.ini 0000664 0000000 0000000 00000001634 15260643574 0020550 0 ustar 00root root 0000000 0000000 # Regular configuration file (can be used as base in other projects, runs in CI)
[mypy]
# Modified in `tests.yml`
incremental = true
disallow_any_generics = true
strict = true
strict_equality_for_none = true
warn_unreachable = true
enable_error_code =
deprecated,
exhaustive-match,
explicit-override,
ignore-without-code,
possibly-undefined,
redundant-expr,
redundant-self,
truthy-bool,
truthy-iterable,
unimported-reveal,
unused-awaitable,
fixed_format_cache = true
show_traceback = true
plugins =
mypy_django_plugin.main,
mypy.plugins.proper_plugin
# `tests/assert_type` uses bare generics on purpose, to test real world cases.
# The yml tests do too, they are handled in `scripts/tests_extension_hook.py`.
[mypy-tests.assert_type.*]
disallow_any_generics = false
# Our settings:
[mypy.plugins.django-stubs]
django_settings_module = scripts.django_tests_settings
typeddjango-django-stubs-fa03b48/mypy_django_plugin/ 0000775 0000000 0000000 00000000000 15260643574 0022743 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/mypy_django_plugin/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0025042 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/mypy_django_plugin/config.py 0000664 0000000 0000000 00000013170 15260643574 0024564 0 ustar 00root root 0000000 0000000 from __future__ import annotations
import configparser
import os
import textwrap
import tomllib
from functools import partial
from pathlib import Path
from typing import TYPE_CHECKING, Any, NoReturn
if TYPE_CHECKING:
from collections.abc import Callable
INI_USAGE = """
(config)
...
[mypy.plugins.django-stubs]
django_settings_module = str (default: `os.getenv("DJANGO_SETTINGS_MODULE")`)
strict_settings = bool (default: true)
strict_model_abstract_attrs = bool (default: true)
...
"""
TOML_USAGE = """
(config)
...
[tool.django-stubs]
django_settings_module = str (default: `os.getenv("DJANGO_SETTINGS_MODULE")`)
strict_settings = bool (default: true)
strict_model_abstract_attrs = bool (default: true)
...
"""
INVALID_FILE = "mypy config file is not specified or found"
COULD_NOT_LOAD_FILE = "could not load configuration file"
MISSING_SECTION = "no section [{section}] found"
DJANGO_SETTINGS_ENV_VAR = "DJANGO_SETTINGS_MODULE"
MISSING_DJANGO_SETTINGS = (
"missing required 'django_settings_module' config.\n"
f"Either specify this config or set your `{DJANGO_SETTINGS_ENV_VAR}` env var"
)
INVALID_BOOL_SETTING = "invalid {key!r}: the setting must be a boolean"
def exit_with_error(msg: str, is_toml: bool = False) -> NoReturn:
"""Using mypy's argument parser, raise `SystemExit` to fail hard if validation fails.
Considering that the plugin's startup duration is around double as long as mypy's, this aims to
import and construct objects only when that's required - which happens once and terminates the
run. Considering that most of the runs are successful, there's no need for this to linger in the
global scope.
"""
from mypy.main import CapturableArgumentParser
handler = CapturableArgumentParser(
prog="(django-stubs) mypy", usage=textwrap.dedent(TOML_USAGE if is_toml else INI_USAGE)
)
handler.error(msg)
class DjangoPluginConfig:
__slots__ = ("django_settings_module", "strict_model_abstract_attrs", "strict_settings")
django_settings_module: str
strict_settings: bool
def __init__(self, config_file: str | None) -> None:
if not config_file:
exit_with_error(INVALID_FILE)
filepath = Path(config_file)
if not filepath.is_file():
exit_with_error(INVALID_FILE)
if filepath.suffix.lower() == ".toml":
self.parse_toml_file(filepath)
else:
self.parse_ini_file(filepath)
def parse_toml_file(self, filepath: Path) -> None:
toml_exit: Callable[[str], NoReturn] = partial(exit_with_error, is_toml=True)
try:
with filepath.open(mode="rb") as f:
data = tomllib.load(f)
except (tomllib.TOMLDecodeError, OSError):
toml_exit(COULD_NOT_LOAD_FILE)
try:
config: dict[str, Any] = data["tool"]["django-stubs"]
except KeyError:
if not os.getenv(DJANGO_SETTINGS_ENV_VAR):
toml_exit(MISSING_SECTION.format(section="tool.django-stubs"))
config = {}
django_settings_module = config.get("django_settings_module") or os.getenv(DJANGO_SETTINGS_ENV_VAR)
if not django_settings_module:
toml_exit(MISSING_DJANGO_SETTINGS)
self.django_settings_module = django_settings_module
if not isinstance(self.django_settings_module, str):
toml_exit("invalid 'django_settings_module': the setting must be a string")
self.strict_settings = config.get("strict_settings", True)
if not isinstance(self.strict_settings, bool):
toml_exit(INVALID_BOOL_SETTING.format(key="strict_settings"))
self.strict_model_abstract_attrs = config.get("strict_model_abstract_attrs", True)
if not isinstance(self.strict_model_abstract_attrs, bool):
toml_exit(INVALID_BOOL_SETTING.format(key="strict_model_abstract_attrs"))
def parse_ini_file(self, filepath: Path) -> None:
parser = configparser.ConfigParser()
try:
with filepath.open(encoding="utf-8") as f:
parser.read_file(f, source=str(filepath))
except OSError:
exit_with_error(COULD_NOT_LOAD_FILE)
section = "mypy.plugins.django-stubs"
if not parser.has_section(section):
if not os.getenv(DJANGO_SETTINGS_ENV_VAR):
exit_with_error(MISSING_SECTION.format(section=section))
if parser.has_section(section) and parser.has_option(section, "django_settings_module"):
django_settings_module = parser.get(section, "django_settings_module").strip("'\"")
else:
django_settings_module = os.getenv(DJANGO_SETTINGS_ENV_VAR, "")
if not django_settings_module:
exit_with_error(MISSING_DJANGO_SETTINGS)
self.django_settings_module = django_settings_module
try:
self.strict_settings = parser.getboolean(section, "strict_settings", fallback=True)
except ValueError:
exit_with_error(INVALID_BOOL_SETTING.format(key="strict_settings"))
try:
self.strict_model_abstract_attrs = parser.getboolean(section, "strict_model_abstract_attrs", fallback=True)
except ValueError:
exit_with_error(INVALID_BOOL_SETTING.format(key="strict_model_abstract_attrs"))
def to_json(self, extra_data: dict[str, Any]) -> dict[str, Any]:
"""We use this method to reset mypy cache via `report_config_data` hook."""
return {
"django_settings_module": self.django_settings_module,
"strict_settings": self.strict_settings,
"strict_model_abstract_attrs": self.strict_model_abstract_attrs,
**dict(sorted(extra_data.items())),
}
typeddjango-django-stubs-fa03b48/mypy_django_plugin/django/ 0000775 0000000 0000000 00000000000 15260643574 0024205 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/mypy_django_plugin/django/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0026304 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/mypy_django_plugin/django/context.py 0000664 0000000 0000000 00000065071 15260643574 0026254 0 ustar 00root root 0000000 0000000 from __future__ import annotations
import os
import sys
from collections import defaultdict
from contextlib import contextmanager
from functools import cached_property
from typing import TYPE_CHECKING, Any, Literal
from django.core.exceptions import FieldDoesNotExist, FieldError
from django.db import models
from django.db.models.base import Model
from django.db.models.constants import LOOKUP_SEP
from django.db.models.fields import AutoField, CharField, Field
from django.db.models.fields.related import ForeignKey, RelatedField
from django.db.models.fields.reverse_related import ForeignObjectRel
from django.db.models.lookups import Exact, In
from django.db.models.sql.query import Query
from mypy.typeanal import make_optional_type
from mypy.types import AnyType, Instance, ProperType, TypeOfAny, UnionType, get_proper_type
from mypy.types import Type as MypyType
from mypy_django_plugin.exceptions import UnregisteredModelError
from mypy_django_plugin.lib import fullnames, helpers
# This import fails when `psycopg2` is not installed, avoid crashing the plugin.
try:
from django.contrib.postgres.fields import ArrayField
except ImportError:
class ArrayField: # type: ignore[no-redef]
pass
if TYPE_CHECKING:
from collections.abc import Iterable, Iterator, Mapping, Sequence
from django.apps.registry import Apps
from django.conf import LazySettings
from django.db.models.expressions import Expression
from django.db.models.options import _AnyField
from mypy.checker import TypeChecker
from mypy.nodes import TypeInfo
from mypy.plugin import MethodContext
@contextmanager
def temp_environ() -> Iterator[None]:
"""Allow the ability to set os.environ temporarily"""
environ = dict(os.environ)
try:
yield
finally:
os.environ.clear()
os.environ.update(environ)
def initialize_django(settings_module: str) -> tuple[Apps, LazySettings]:
with temp_environ():
os.environ["DJANGO_SETTINGS_MODULE"] = settings_module
# add current directory to sys.path
sys.path.append(os.getcwd())
from django.apps import apps
from django.conf import settings
apps.get_swappable_settings_name.cache_clear() # type: ignore[attr-defined]
apps.clear_cache()
if not settings.configured:
settings._setup() # type: ignore[misc]
apps.populate(settings.INSTALLED_APPS)
assert apps.apps_ready, "Apps are not ready"
assert settings.configured, "Settings are not configured"
return apps, settings
class LookupsAreUnsupported(Exception):
pass
def get_field_type_from_model_type_info(info: TypeInfo | None, field_name: str) -> Instance | None:
if info is None:
return None
field_node = info.get(field_name)
if field_node is None:
return None
field_type = get_proper_type(field_node.type)
if not isinstance(field_type, Instance):
return None
# Field declares a set and a get type arg. Fallback to `None` when we can't find any args.
# Not every model attribute is a field,
# a reverse o2o accessor is a two arg descriptor whose args would be misread as set/get types.
if len(field_type.args) != 2 or not field_type.type.has_base(fullnames.FIELD_FULLNAME):
return None
return field_type
def _get_field_set_type_from_model_type_info(info: TypeInfo | None, field_name: str) -> MypyType | None:
field_type = get_field_type_from_model_type_info(info, field_name)
if field_type is not None:
return field_type.args[0]
return None
def _get_field_get_type_from_model_type_info(info: TypeInfo | None, field_name: str) -> MypyType | None:
field_type = get_field_type_from_model_type_info(info, field_name)
if field_type is not None:
return field_type.args[1]
return None
class DjangoContext:
def __init__(self, django_settings_module: str) -> None:
self.django_settings_module = django_settings_module
apps, settings = initialize_django(self.django_settings_module)
self.apps_registry = apps
self.settings = settings
@cached_property
def model_modules(self) -> dict[str, dict[str, type[Model]]]:
"""All modules that contain Django models."""
modules: dict[str, dict[str, type[Model]]] = defaultdict(dict)
for concrete_model_cls in self.apps_registry.get_models(include_auto_created=True, include_swapped=True):
modules[concrete_model_cls.__module__][concrete_model_cls.__name__] = concrete_model_cls
# collect abstract=True models
for model_cls in concrete_model_cls.mro()[1:]:
if issubclass(model_cls, Model) and hasattr(model_cls, "_meta") and model_cls._meta.abstract:
modules[model_cls.__module__][model_cls.__name__] = model_cls
return modules
def get_model_class_by_fullname(self, fullname: str) -> type[Model] | None:
"""Returns None if Model is abstract"""
module, _, model_cls_name = fullname.rpartition(".")
return self.model_modules.get(module, {}).get(model_cls_name)
def get_model_fields(self, model_cls: type[Model]) -> Iterator[Field[Any, Any]]:
for field in model_cls._meta.get_fields():
if isinstance(field, Field):
yield field
def get_model_foreign_keys(self, model_cls: type[Model]) -> Iterator[ForeignKey[Any, Any]]:
for field in model_cls._meta.get_fields():
if isinstance(field, ForeignKey):
yield field
def get_model_related_fields(self, model_cls: type[Model]) -> Iterator[RelatedField[Any, Any]]:
"""Get model forward relations"""
for field in model_cls._meta.get_fields():
if isinstance(field, RelatedField):
yield field
def get_model_relations(self, model_cls: type[Model]) -> Iterator[ForeignObjectRel]:
"""Get model reverse relations"""
for field in model_cls._meta.get_fields():
if isinstance(field, ForeignObjectRel):
yield field
def get_field_lookup_exact_type(self, api: TypeChecker, field: _AnyField) -> MypyType:
if isinstance(field, RelatedField | ForeignObjectRel):
related_model_cls = self.get_field_related_model_cls(field)
rel_model_info = helpers.lookup_class_typeinfo(api, related_model_cls)
if rel_model_info is None:
return AnyType(TypeOfAny.explicit)
primary_key_field = self.get_primary_key_field(related_model_cls)
primary_key_type = self.get_field_get_type(api, rel_model_info, primary_key_field, method="init")
model_and_primary_key_type = UnionType.make_union([Instance(rel_model_info, []), primary_key_type])
return make_optional_type(model_and_primary_key_type)
field_info = helpers.lookup_class_typeinfo(api, field.__class__)
if field_info is None:
return AnyType(TypeOfAny.explicit)
return helpers.get_private_descriptor_type(field_info, "_pyi_lookup_exact_type", is_nullable=field.null)
def get_related_target_field(
self, related_model_cls: type[Model], field: ForeignKey[Any, Any]
) -> Field[Any, Any] | None:
# ForeignKey only supports one `to_fields` item (ForeignObject supports many)
assert len(field.to_fields) == 1
to_field_name = field.to_fields[0]
if to_field_name:
rel_field = related_model_cls._meta.get_field(to_field_name)
if not isinstance(rel_field, Field):
return None # Not supported
return rel_field
return self.get_primary_key_field(related_model_cls)
def get_primary_key_field(self, model_cls: type[Model]) -> Field[Any, Any]:
for field in model_cls._meta.get_fields():
if isinstance(field, Field):
if field.primary_key:
return field
raise ValueError("No primary key defined")
def get_expected_types(self, api: TypeChecker, model_cls: type[Model], *, method: str) -> dict[str, MypyType]:
contenttypes_in_apps = self.apps_registry.is_installed("django.contrib.contenttypes")
expected_types = {}
# add pk if not abstract=True
if not model_cls._meta.abstract:
primary_key_field = self.get_primary_key_field(model_cls)
field_set_type = self.get_field_set_type(api, primary_key_field, method=method)
expected_types["pk"] = field_set_type
model_info = helpers.lookup_class_typeinfo(api, model_cls)
for field in model_cls._meta.get_fields():
if contenttypes_in_apps:
from django.contrib.contenttypes.fields import GenericForeignKey
if isinstance(field, GenericForeignKey):
# it's generic, so cannot set specific model
field_name = field.name
gfk_info = helpers.lookup_class_typeinfo(api, field.__class__)
if gfk_info is None:
gfk_set_type: MypyType = AnyType(TypeOfAny.unannotated)
else:
gfk_set_type = helpers.get_private_descriptor_type(
gfk_info, "_pyi_private_set_type", is_nullable=True
)
expected_types[field_name] = gfk_set_type
continue
if isinstance(field, Field):
field_name = getattr(field, "attname", field.name)
# Can not determine target_field for recursive relationship when model is abstract
# We add type ignores here because the plugin might have to check bogus code instantiating
# recursive abstract model and we need to not crash and gracefully exit.
if field.related_model == "self" and model_cls._meta.abstract: # type: ignore[comparison-overlap, unreachable]
continue # type: ignore[unreachable]
# Try to retrieve set type from a model's TypeInfo object and fallback to retrieving it manually
# from django-stubs own declaration. This is to align with the setter types declared for
# assignment.
field_set_type = _get_field_set_type_from_model_type_info(
model_info, field_name
) or self.get_field_set_type(api, field, method=method)
expected_types[field_name] = field_set_type
if isinstance(field, ForeignKey):
field_name = field.name
foreign_key_info = helpers.lookup_class_typeinfo(api, field.__class__)
if foreign_key_info is None:
# maybe there's no type annotation for the field
expected_types[field_name] = AnyType(TypeOfAny.unannotated)
continue
try:
related_model = self.get_field_related_model_cls(field)
except UnregisteredModelError:
# Recognise the field but don't say anything about its type..
expected_types[field_name] = AnyType(TypeOfAny.from_error)
continue
if related_model._meta.proxy_for_model is not None:
related_model = related_model._meta.proxy_for_model
related_model_info = helpers.lookup_class_typeinfo(api, related_model)
if related_model_info is None:
expected_types[field_name] = AnyType(TypeOfAny.unannotated)
continue
is_nullable = self.get_field_nullability(field, method)
foreign_key_set_type = helpers.get_private_descriptor_type(
foreign_key_info, "_pyi_private_set_type", is_nullable=is_nullable
)
model_set_type = helpers.convert_any_to_type(foreign_key_set_type, Instance(related_model_info, []))
expected_types[field_name] = model_set_type
return expected_types
@cached_property
def all_registered_model_classes(self) -> set[type[models.Model]]:
model_classes = self.apps_registry.get_models()
all_model_bases = set()
for model_cls in model_classes:
for base_cls in model_cls.mro():
if issubclass(base_cls, models.Model):
all_model_bases.add(base_cls)
return all_model_bases
@cached_property
def _model_class_fullnames_by_label_lower(self) -> Mapping[str, str]:
return {
klass._meta.label_lower: helpers.get_class_fullname(klass)
for klass in self.all_registered_model_classes
if klass is not models.Model
}
def model_class_fullname_for_label(self, label: str) -> str | None:
"""Model names are case-insensitive, app labels are not (as in `Apps.get_model`)."""
app_label, _, model_name = label.partition(".")
return self._model_class_fullnames_by_label_lower.get(f"{app_label}.{model_name.lower()}")
def get_field_nullability(self, field: _AnyField, method: str | None) -> bool:
if method in ("values", "values_list"):
return field.null
nullable = field.null
if not nullable and isinstance(field, CharField) and field.blank:
return True
if method == "__init__":
if (isinstance(field, Field) and field.primary_key) or isinstance(field, ForeignKey):
return True
if method == "create":
if isinstance(field, AutoField):
return True
if isinstance(field, Field) and field.has_default():
return True
return nullable
def get_field_set_type(self, api: TypeChecker, field: _AnyField, *, method: str) -> MypyType:
"""Get a type of __set__ for this specific Django field."""
target_field = field
if isinstance(field, ForeignKey):
try:
# We gotta be careful for exceptions when we're triggering '__get__'.
# Related model could very well be unresolvable
target_field = field.target_field
except ValueError:
return AnyType(TypeOfAny.from_error)
field_info = helpers.lookup_class_typeinfo(api, target_field.__class__)
if field_info is None:
return AnyType(TypeOfAny.from_error)
field_set_type = helpers.get_private_descriptor_type(
field_info, "_pyi_private_set_type", is_nullable=self.get_field_nullability(field, method)
)
if isinstance(target_field, ArrayField):
argument_field_type = self.get_field_set_type(api, target_field.base_field, method=method)
field_set_type = helpers.convert_any_to_type(field_set_type, argument_field_type)
return field_set_type
def get_field_get_type(
self,
api: TypeChecker,
model_info: TypeInfo | None,
field: _AnyField,
*,
method: str,
) -> MypyType:
"""Get a type of __get__ for this specific Django field."""
if isinstance(field, Field):
get_type = _get_field_get_type_from_model_type_info(model_info, getattr(field, "attname", field.name))
if get_type is not None:
return get_type
field_info = helpers.lookup_class_typeinfo(api, field.__class__)
if field_info is None:
return AnyType(TypeOfAny.unannotated)
is_nullable = self.get_field_nullability(field, method)
if isinstance(field, RelatedField):
related_model_cls = self.get_field_related_model_cls(field)
rel_model_info = helpers.lookup_class_typeinfo(api, related_model_cls)
if method in ("values", "values_list"):
primary_key_field = self.get_primary_key_field(related_model_cls)
return self.get_field_get_type(api, rel_model_info, primary_key_field, method=method)
model_info = helpers.lookup_class_typeinfo(api, related_model_cls)
if model_info is None:
return AnyType(TypeOfAny.unannotated)
return Instance(model_info, [])
return helpers.get_private_descriptor_type(field_info, "_pyi_private_get_type", is_nullable=is_nullable)
def get_field_related_model_cls(self, field: RelatedField[Any, Any] | ForeignObjectRel) -> type[Model]:
if isinstance(field, RelatedField):
related_model_cls = field.remote_field.model
else:
related_model_cls = field.field.model
if related_model_cls is None: # type: ignore[comparison-overlap]
raise UnregisteredModelError
if isinstance(related_model_cls, str):
if related_model_cls == "self": # type: ignore[unreachable]
# same model
related_model_cls = field.model
elif "." not in related_model_cls:
# same file model
related_model_fullname = f"{field.model.__module__}.{related_model_cls}"
related_model_cls = self.get_model_class_by_fullname(related_model_fullname)
if related_model_cls is None:
raise UnregisteredModelError
else:
try:
related_model_cls = self.apps_registry.get_model(related_model_cls)
except LookupError as e:
raise UnregisteredModelError from e
return related_model_cls
def _resolve_field_from_parts(
self, field_parts: Iterable[str], model_cls: type[Model]
) -> tuple[_AnyField, type[Model]]:
currently_observed_model = model_cls
field: _AnyField | None = None
for field_part in field_parts:
if field_part == "pk":
field = self.get_primary_key_field(currently_observed_model)
continue
field = currently_observed_model._meta.get_field(field_part)
if isinstance(field, RelatedField):
currently_observed_model = self.get_field_related_model_cls(field)
model_name = currently_observed_model._meta.model_name
if model_name is not None and field_part == (model_name + "_id"):
field = self.get_primary_key_field(currently_observed_model)
if isinstance(field, ForeignObjectRel):
currently_observed_model = self.get_field_related_model_cls(field)
# Guaranteed by `query.solve_lookup_type` before.
assert isinstance(field, Field | ForeignObjectRel)
return field, currently_observed_model
def solve_lookup_type(
self, model_cls: type[Model], lookup: str
) -> tuple[Sequence[str], Sequence[str], Expression | Literal[False]] | None:
query = Query(model_cls)
if (lookup == "pk" or lookup.startswith("pk__")) and query.get_meta().pk is None: # type: ignore[comparison-overlap]
# Primary key lookup when no primary key field is found, model is presumably
# abstract and we can't say anything about 'pk'.
return None
try:
return query.solve_lookup_type(lookup)
# This occurs when the following conditions are met:
# - model_cls._meta.abstract = True
# - part of the lookup is a foreign key defined on model_cls where the 'to' argument is a string
# On abstract models the 'to' parameter is only coalesced into the actual class whenever a subclass of it is
# instantiated, therefore it is never swapped out for abstract base classes.
except AttributeError:
pass
query_parts = lookup.split(LOOKUP_SEP)
try:
field = query.get_meta().get_field(query_parts[0])
except FieldDoesNotExist:
return None
if len(query_parts) == 1:
return [], [query_parts[0]], False
if not isinstance(field, RelatedField | ForeignObjectRel):
return None
related_model = self.get_field_related_model_cls(field)
sub_query = Query(related_model).solve_lookup_type(LOOKUP_SEP.join(query_parts[1:]))
entire_query_parts = [query_parts[0], *sub_query[1]]
return sub_query[0], entire_query_parts, sub_query[2]
def resolve_lookup_into_field(self, model_cls: type[Model], lookup: str) -> tuple[_AnyField | None, type[Model]]:
solved_lookup = self.solve_lookup_type(model_cls, lookup)
if solved_lookup is None:
return None, model_cls
lookup_parts, field_parts, _ = solved_lookup
if lookup_parts:
raise LookupsAreUnsupported()
return self._resolve_field_from_parts(field_parts, model_cls)
def _resolve_lookup_type_from_lookup_class(
self, ctx: MethodContext, lookup_cls: type, field: _AnyField | None = None
) -> MypyType | None:
"""Resolve the expected type for a lookup class (used both for regular fields and annotated fields)
Args:
ctx
lookup_cls: The Django lookup class (e.g., IsNull, Contains)
field: Optional field for resolving Field-dependent types (None for annotated fields)
Returns:
The resolved type, or None if it couldn't be determined
"""
lookup_info = helpers.lookup_class_typeinfo(helpers.get_typechecker_api(ctx), lookup_cls)
if lookup_info is None:
return None
for lookup_base in helpers.iter_bases(lookup_info):
if lookup_base.args and isinstance((lookup_type := get_proper_type(lookup_base.args[0])), Instance):
# if it's Field, consider lookup_type a __get__ of current field
if lookup_type.type.fullname == fullnames.FIELD_FULLNAME:
if field is None:
# No field available (e.g., annotation), can't resolve further
return None
field_info = helpers.lookup_class_typeinfo(helpers.get_typechecker_api(ctx), field.__class__)
if field_info is None:
return None
return get_proper_type(
helpers.get_private_descriptor_type(field_info, "_pyi_private_get_type", is_nullable=field.null)
)
return lookup_type
return None
def _resolve_annotated_field_lookup(
self, ctx: MethodContext, lookup: str, model_instance: Instance
) -> MypyType | None:
"""Resolve the expected type for a lookup on an annotated field.
Args:
ctx
lookup: The full lookup string (e.g., 'total__gte' or 'total').
model_instance: The model instance containing extra_attrs from annotations.
Returns:
The resolved mypy type for the lookup, or None if the base field
is not found in the model's annotations.
"""
if not helpers.is_annotated_model(model_instance.type) or not model_instance.extra_attrs:
return None
lookup_base_field, *annotation_lookup_parts = lookup.split(LOOKUP_SEP)
annotation_type = model_instance.extra_attrs.attrs.get(lookup_base_field)
if not annotation_lookup_parts:
return annotation_type
lookup_cls = Field().get_lookup(annotation_lookup_parts[-1])
if lookup_cls is None:
return annotation_type
if annotation_type is not None and issubclass(lookup_cls, In):
return ctx.api.named_generic_type("typing.Iterable", [annotation_type])
lookup_type = self._resolve_lookup_type_from_lookup_class(ctx, lookup_cls)
return annotation_type if lookup_type is None else lookup_type
def resolve_lookup_expected_type(
self, ctx: MethodContext, model_cls: type[Model], lookup: str, model_instance: Instance
) -> MypyType:
try:
# solve_lookup_type uses Django's Query.solve_lookup_type(), which raises
# FieldError for annotated fields since they don't exist on the actual model...
solved_lookup = self.solve_lookup_type(model_cls, lookup)
except FieldError as exc:
# ...so we handle annotation lookups here
annotation_lookup = self._resolve_annotated_field_lookup(ctx, lookup, model_instance)
if annotation_lookup is not None:
return annotation_lookup
msg = exc.args[0]
if model_instance.extra_attrs:
msg = ", ".join((msg, *model_instance.extra_attrs.attrs.keys()))
ctx.api.fail(msg, ctx.context)
return AnyType(TypeOfAny.from_error)
if solved_lookup is None:
return AnyType(TypeOfAny.implementation_artifact)
lookup_parts, field_parts, is_expression = solved_lookup
if is_expression:
return AnyType(TypeOfAny.explicit)
field, _ = self._resolve_field_from_parts(field_parts, model_cls)
lookup_cls = None
if lookup_parts:
lookup = lookup_parts[-1]
lookup_cls = field.get_lookup(lookup)
if lookup_cls is None:
# unknown lookup
return AnyType(TypeOfAny.explicit)
# The lookup chain may contain intermediate transforms, e.g. 'year' in
# 'start_date__year__in'. The expected type must be resolved against the
# transform's output field rather than the original one, otherwise a
# DateField 'year' transform would incorrectly expect 'date' values
# instead of 'int'. If any transform in the chain cannot be resolved
# to a concrete output field, keep the original field as a fallback.
for transform_name in lookup_parts[:-1]:
transform_cls = field.get_transform(transform_name) if isinstance(field, Field) else None
output_field = getattr(transform_cls, "output_field", None)
if not isinstance(output_field, Field):
break
field = output_field
if lookup_cls is None or issubclass(lookup_cls, Exact):
return self.get_field_lookup_exact_type(helpers.get_typechecker_api(ctx), field)
if issubclass(lookup_cls, In):
exact_type = self.get_field_lookup_exact_type(helpers.get_typechecker_api(ctx), field)
return ctx.api.named_generic_type("typing.Iterable", [exact_type])
resolved_type = self._resolve_lookup_type_from_lookup_class(ctx, lookup_cls, field)
if resolved_type is not None:
return resolved_type
return AnyType(TypeOfAny.explicit)
def resolve_f_expression_type(self, f_expression_type: Instance) -> ProperType:
return AnyType(TypeOfAny.explicit)
@cached_property
def is_contrib_auth_installed(self) -> bool:
return "django.contrib.auth" in self.settings.INSTALLED_APPS
typeddjango-django-stubs-fa03b48/mypy_django_plugin/errorcodes.py 0000664 0000000 0000000 00000000261 15260643574 0025463 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from mypy.errorcodes import ErrorCode
MANAGER_MISSING = ErrorCode("django-manager-missing", "Couldn't resolve manager for model", "Django")
typeddjango-django-stubs-fa03b48/mypy_django_plugin/exceptions.py 0000664 0000000 0000000 00000000176 15260643574 0025502 0 ustar 00root root 0000000 0000000 from __future__ import annotations
class UnregisteredModelError(Exception):
"""The requested model is not registered"""
typeddjango-django-stubs-fa03b48/mypy_django_plugin/lib/ 0000775 0000000 0000000 00000000000 15260643574 0023511 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/mypy_django_plugin/lib/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0025610 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/mypy_django_plugin/lib/field_validation.py 0000664 0000000 0000000 00000005507 15260643574 0027367 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING
from django.core.exceptions import FieldDoesNotExist
if TYPE_CHECKING:
from django.db.models.base import Model
from django.db.models.options import _AnyField
from mypy.plugin import MethodContext
def try_get_field(
ctx: MethodContext, model_cls: type[Model], field_name: str, *, resolve_pk: bool = False
) -> _AnyField | None:
opts = model_cls._meta
resolved_name = opts.pk.name if resolve_pk and field_name == "pk" else field_name
try:
return opts.get_field(resolved_name)
except FieldDoesNotExist as e:
ctx.api.fail(str(e), ctx.context)
return None
def check_field_concrete(ctx: MethodContext, field: _AnyField, field_name: str, method: str) -> bool:
if not field.concrete or field.many_to_many:
ctx.api.fail(f'"{method}()" can only be used with concrete fields. Got "{field_name}"', ctx.context)
return False
return True
def check_field_unique(
ctx: MethodContext, model_cls: type[Model], field: _AnyField, field_name: str, method: str
) -> bool:
unique_fields = [c.fields[0] for c in model_cls._meta.total_unique_constraints if len(c.fields) == 1]
if not getattr(field, "unique", None) and field_name not in unique_fields:
ctx.api.fail(f'"{method}()"\'s field_name must be a unique field but "{field_name}" isn\'t', ctx.context)
return False
return True
def check_field_not_pk(
ctx: MethodContext,
model_cls: type[Model],
field: _AnyField,
field_name: str,
method: str,
*,
attr_name: str | None = None,
) -> bool:
opts = model_cls._meta
all_pk_fields = set(getattr(opts, "pk_fields", [opts.pk]))
for parent in getattr(opts, "all_parents", opts.get_parent_list()):
all_pk_fields.update(getattr(parent._meta, "pk_fields", [parent._meta.pk]))
if field in all_pk_fields:
param_str = f' in "{attr_name}="' if attr_name else ""
ctx.api.fail(f'"{method}()" does not support primary key fields{param_str}. Got "{field_name}"', ctx.context)
return False
return True
def validate_non_pk_concrete_field(
ctx: MethodContext, model_cls: type[Model], field_name: str, method: str, *, attr_name: str | None = None
) -> bool:
"""Check that ``field_name`` is a concrete, non-primary-key field of ``model_cls``.
Mirrors Django's ``Options._non_pk_concrete_field_names``: the set of fields that may
appear in a database ``UPDATE`` (e.g. ``bulk_update`` fields, ``save(update_fields=...)``).
Foreign key attnames such as ``author_id`` are accepted.
"""
return (
(field := try_get_field(ctx, model_cls, field_name)) is not None
and check_field_concrete(ctx, field, field_name, method)
and check_field_not_pk(ctx, model_cls, field, field_name, method, attr_name=attr_name)
)
typeddjango-django-stubs-fa03b48/mypy_django_plugin/lib/fullnames.py 0000664 0000000 0000000 00000007500 15260643574 0026053 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import Final
ABSTRACT_BASE_USER_MODEL_FULLNAME: Final = "django.contrib.auth.base_user.AbstractBaseUser"
ABSTRACT_USER_MODEL_FULLNAME: Final = "django.contrib.auth.models.AbstractUser"
PERMISSION_MIXIN_CLASS_FULLNAME: Final = "django.contrib.auth.models.PermissionsMixin"
APPS_FULLNAME: Final = "django.apps.registry.Apps"
STATE_APPS_FULLNAME: Final = "django.db.migrations.state.StateApps"
MODEL_METACLASS_FULLNAME: Final = "django.db.models.base.ModelBase"
MODEL_CLASS_FULLNAME: Final = "django.db.models.base.Model"
FIELD_FULLNAME: Final = "django.db.models.fields.Field"
ARRAY_FIELD_FULLNAME: Final = "django.contrib.postgres.fields.array.ArrayField"
FOREIGN_OBJECT_FULLNAME: Final = "django.db.models.fields.related.ForeignObject"
FOREIGN_KEY_FULLNAME: Final = "django.db.models.fields.related.ForeignKey"
ONETOONE_FIELD_FULLNAME: Final = "django.db.models.fields.related.OneToOneField"
MANYTOMANY_FIELD_FULLNAME: Final = "django.db.models.fields.related.ManyToManyField"
DUMMY_SETTINGS_BASE_CLASS: Final = "django.conf._DjangoConfLazyObject"
AUTH_USER_MODEL_FULLNAME: Final = "django.conf.settings.AUTH_USER_MODEL"
QUERYSET_CLASS_FULLNAME: Final = "django.db.models.query.QuerySet"
BASE_MANAGER_CLASS_FULLNAME: Final = "django.db.models.manager.BaseManager"
MANAGER_CLASS_FULLNAME: Final = "django.db.models.manager.Manager"
RELATED_MANAGER_CLASS: Final = "django.db.models.fields.related_descriptors.RelatedManager"
PREFETCH_CLASS_FULLNAME: Final = "django.db.models.query.Prefetch"
GENERIC_PREFETCH_CLASS_FULLNAME: Final = "django.contrib.contenttypes.prefetch.GenericPrefetch"
CHOICES_CLASS_FULLNAME: Final = "django.db.models.enums.Choices"
CHOICES_TYPE_METACLASS_FULLNAME: Final = "django.db.models.enums.ChoicesType"
WITH_ANNOTATIONS_FULLNAME: Final = "django_stubs_ext.annotations.WithAnnotations"
ANNOTATIONS_FULLNAME: Final = "django_stubs_ext.annotations.Annotations"
ANNOTATED_TYPES_FULLNAMES: Final = {
"typing.Annotated",
"typing_extensions.Annotated",
WITH_ANNOTATIONS_FULLNAME,
}
BASEFORM_CLASS_FULLNAME: Final = "django.forms.forms.BaseForm"
FORM_MIXIN_CLASS_FULLNAME: Final = "django.views.generic.edit.FormMixin"
REVERSE_ONE_TO_ONE_DESCRIPTOR: Final = "django.db.models.fields.related_descriptors.ReverseOneToOneDescriptor"
REVERSE_MANY_TO_ONE_DESCRIPTOR: Final = "django.db.models.fields.related_descriptors.ReverseManyToOneDescriptor"
MANY_TO_MANY_DESCRIPTOR: Final = "django.db.models.fields.related_descriptors.ManyToManyDescriptor"
MANY_RELATED_MANAGER: Final = "django.db.models.fields.related_descriptors.ManyRelatedManager"
RELATED_FIELDS_CLASSES: Final = frozenset(
(
FOREIGN_OBJECT_FULLNAME,
FOREIGN_KEY_FULLNAME,
ONETOONE_FIELD_FULLNAME,
)
)
OPTIONS_CLASS_FULLNAME: Final = "django.db.models.options.Options"
QUERYDICT_CLASS_FULLNAME: Final = "django.http.request.QueryDict"
COMBINABLE_EXPRESSION_FULLNAME: Final = "django.db.models.expressions.Combinable"
F_EXPRESSION_FULLNAME: Final = "django.db.models.expressions.F"
FUNC_EXPRESSION_FULLNAME: Final = "django.db.models.expressions.Func"
AGGREGATE_CLASS_FULLNAME: Final = "django.db.models.aggregates.Aggregate"
ANY_ATTR_ALLOWED_CLASS_FULLNAME: Final = "django_stubs_ext.AnyAttrAllowed"
TYPED_MODEL_META_FULLNAME: Final = "django_stubs_ext.db.models.TypedModelMeta"
STR_PROMISE_FULLNAME: Final = "django.utils.functional._StrPromise"
OBJECT_DOES_NOT_EXIST: Final = "django.core.exceptions.ObjectDoesNotExist"
OBJECT_NOT_UPDATED: Final = "django.core.exceptions.ObjectNotUpdated"
MULTIPLE_OBJECTS_RETURNED: Final = "django.core.exceptions.MultipleObjectsReturned"
DJANGO_ABSTRACT_MODELS: Final = frozenset(
(
ABSTRACT_BASE_USER_MODEL_FULLNAME,
ABSTRACT_USER_MODEL_FULLNAME,
PERMISSION_MIXIN_CLASS_FULLNAME,
"django.contrib.sessions.base_session.AbstractBaseSession",
)
)
typeddjango-django-stubs-fa03b48/mypy_django_plugin/lib/helpers.py 0000664 0000000 0000000 00000064433 15260643574 0025537 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING, Any, NamedTuple, Self, TypedDict, cast
from mypy import checker
from mypy.checker import TypeChecker
from mypy.checkmember import analyze_member_access as _mypy_analyze_member_access
from mypy.lookup import lookup_fully_qualified
from mypy.maptype import map_instance_to_supertype
from mypy.mro import calculate_mro
from mypy.nodes import (
GDEF,
MDEF,
ArgKind,
AssignmentStmt,
Block,
CallExpr,
ClassDef,
Context,
Expression,
MemberExpr,
MypyFile,
NameExpr,
Node,
RefExpr,
StrExpr,
SymbolTable,
SymbolTableNode,
TypeInfo,
Var,
)
from mypy.plugin import (
AttributeContext,
CheckerPluginInterface,
ClassDefContext,
DynamicClassDefContext,
FunctionContext,
MethodContext,
)
from mypy.semanal import SemanticAnalyzer
from mypy.typeanal import make_optional_type
from mypy.types import (
AnyType,
CallableType,
ExtraAttrs,
Instance,
LiteralType,
NoneTyp,
ProperType,
TupleType,
Type,
TypedDictType,
TypeOfAny,
UnionType,
get_proper_type,
)
from mypy.types import Type as MypyType
from mypy.typevars import fill_typevars, fill_typevars_with_any
from mypy.version import __version__ as mypy_version
from mypy_django_plugin.lib import fullnames
mypy_version_info = tuple(map(int, mypy_version.partition("+")[0].split(".")))
if TYPE_CHECKING:
from collections.abc import Iterable, Iterator, Mapping
from django.db.models.base import Model
from mypy_django_plugin.django.context import DjangoContext
class DjangoTypeMetadata(TypedDict, total=False):
is_abstract_model: bool
is_annotated_model: bool
from_queryset_manager: str
reverse_managers: dict[str, str]
m2m_throughs: dict[str, str]
m2m_managers: dict[str, str]
manager_to_model: str
def get_django_metadata(model_info: TypeInfo) -> DjangoTypeMetadata:
return cast("DjangoTypeMetadata", model_info.metadata.setdefault("django", {}))
def get_reverse_manager_info(
api: TypeChecker | SemanticAnalyzer, model_info: TypeInfo, derived_from: str
) -> TypeInfo | None:
manager_fullname = get_django_metadata(model_info).get("reverse_managers", {}).get(derived_from)
if not manager_fullname:
return None
return lookup_fully_qualified_typeinfo(api, manager_fullname)
def set_reverse_manager_info(model_info: TypeInfo, derived_from: str, fullname: str) -> None:
get_django_metadata(model_info).setdefault("reverse_managers", {})[derived_from] = fullname
def get_many_to_many_manager_info(
api: TypeChecker | SemanticAnalyzer, *, to: TypeInfo, derived_from: str
) -> TypeInfo | None:
manager_fullname = get_django_metadata(to).get("m2m_managers", {}).get(derived_from)
if not manager_fullname:
return None
return lookup_fully_qualified_typeinfo(api, manager_fullname)
def set_many_to_many_manager_info(to: TypeInfo, derived_from: str, manager_info: TypeInfo) -> None:
get_django_metadata(to).setdefault("m2m_managers", {})[derived_from] = manager_info.fullname
def mark_as_annotated_model(model: TypeInfo) -> None:
get_django_metadata(model)["is_annotated_model"] = True
def is_annotated_model(model: TypeInfo) -> bool:
return get_django_metadata(model).get("is_annotated_model", False)
def get_or_create_annotated_type(api: SemanticAnalyzer, model_info: TypeInfo, annotations_info: TypeInfo) -> TypeInfo:
"""Look up or create the `Model@AnnotatedWith` synthetic class for *model_info*."""
annotated_model_name = model_info.name + "@AnnotatedWith"
annotated_model = lookup_fully_qualified_typeinfo(api, model_info.fullname + "@AnnotatedWith")
if annotated_model is None:
model_type = fill_typevars_with_any(model_info)
assert isinstance(model_type, Instance)
annotations_type = fill_typevars(annotations_info)
assert isinstance(annotations_type, Instance)
model_module = api.modules[model_info.module_name]
annotated_model = add_new_class_for_module(
model_module, name=annotated_model_name, bases=[model_type, annotations_type]
)
annotated_model.defn.type_vars = annotations_info.defn.type_vars
annotated_model.add_type_vars()
mark_as_annotated_model(annotated_model)
return annotated_model
class IncompleteDefnException(Exception):
pass
def lookup_fully_qualified_typeinfo(api: TypeChecker | SemanticAnalyzer, fullname: str) -> TypeInfo | None:
sym = lookup_fully_qualified(fullname, api.modules)
node = sym.node if sym is not None else None
if not isinstance(node, TypeInfo):
return None
return node
def lookup_class_typeinfo(api: TypeChecker, klass: type | None) -> TypeInfo | None:
if klass is None:
return None
fullname = get_class_fullname(klass)
return lookup_fully_qualified_typeinfo(api, fullname)
def get_class_fullname(klass: type) -> str:
return klass.__module__ + "." + klass.__qualname__
def get_min_argument_count(ctx: MethodContext | FunctionContext) -> int:
"""
Return the number of non-star arguments passed to the function.
Excludes *args and **kwargs since their count is indeterminate.
"""
return sum(not kind.is_star() for kinds in ctx.arg_kinds for kind in kinds)
class DjangoModel(NamedTuple):
"""A small wrapper around a django model runtime object and associated mypy type info"""
# The Django model at runtime
cls: type[Model]
# The associated Mypy Instance
typ: Instance
# Is an annotated variant of a model ie `MyModel@AnnotatedWith`. See `AddAnnotateUtilities`
is_annotated: bool
@property
def info(self) -> TypeInfo:
return self.typ.type
@classmethod
def from_model_type(cls, model_type: Instance, django_context: DjangoContext) -> Self | None:
model_info = model_type.type
is_annotated = is_annotated_model(model_info)
model_cls = (
django_context.get_model_class_by_fullname(model_info.bases[0].type.fullname)
if is_annotated
else django_context.get_model_class_by_fullname(model_info.fullname)
)
if model_cls is None:
return None
return cls(cls=model_cls, typ=model_type, is_annotated=is_annotated)
def extract_model_type_from_queryset(queryset_type: Instance) -> Instance | None:
"""Extract the django model `Instance` associated to a queryset `Instance`"""
for base_type in [queryset_type, *queryset_type.type.bases]:
if (
# Queryset/Manager subclasses providing the model type as a type param
# Ex:
# class MyQuerySet(models.QuerySet[MyModel]):
# ...
not len(base_type.args)
# Manager generated by `ProcessManyToManyFields.create_many_related_manager`
# type param is the Through model, not the model associated with the queryset.
# We need to skip in that case to get it from the parent `ManyRelatedManager` Instance.
or base_type.type.has_base(fullnames.MANY_RELATED_MANAGER)
):
continue
model = get_proper_type(base_type.args[0])
if isinstance(model, Instance) and is_model_type(model.type):
return model
return None
def get_model_info_from_qs_ctx(
ctx: MethodContext,
django_context: DjangoContext,
) -> DjangoModel | None:
"""
Extract DjangoModel details from a queryset/manager `MethodContext`
"""
if not (isinstance(ctx.type, Instance) and (model_type := extract_model_type_from_queryset(ctx.type))):
return None
return DjangoModel.from_model_type(model_type, django_context)
def _get_class_init_type(call: CallExpr) -> CallableType | None:
callee_node: Node | None = call.callee
if isinstance(callee_node, RefExpr):
callee_node = callee_node.node
if (
isinstance(callee_node, TypeInfo)
and (init_sym := callee_node.get("__init__"))
and isinstance((init_type := get_proper_type(init_sym.type)), CallableType)
):
return init_type
return None
def get_class_init_argument_by_name(call: CallExpr, name: str) -> Expression | None:
"""Adaptation of `mypy.plugins.common._get_argument` for class initializers"""
callee_type = _get_class_init_type(call)
if not callee_type:
return None
argument = callee_type.argument_by_name(name)
if not argument:
return None
assert argument.name
for i, (attr_name, attr_value) in enumerate(
zip(call.arg_names, call.args, strict=False),
start=1, # Start at one to skip first `self` arg
):
if argument.pos is not None and not attr_name and i == argument.pos:
return attr_value
if attr_name == argument.name:
return attr_value
return None
def get_call_argument_by_name(ctx: FunctionContext | MethodContext, name: str) -> Expression | None:
"""
Return the expression for the specific argument.
This helper supports named and positional arguments and should only be used with non-star arguments.
Ex:
Given `def my_func(a: int, b: str), `get_call_argument_by_name(ctx, "b")` works for`
- `my_func(1, b="x")`
- `my_func(1, "x")`
"""
# try and pull the named argument from the caller first
for kinds, argnames, args in zip(ctx.arg_kinds, ctx.arg_names, ctx.args, strict=False):
for kind, argname, arg in zip(kinds, argnames, args, strict=False):
if kind == ArgKind.ARG_NAMED and argname == name:
return arg
if name not in ctx.callee_arg_names:
return None
idx = ctx.callee_arg_names.index(name)
args = ctx.args[idx]
if len(args) != 1:
# Either an error or no value passed.
return None
return args[0]
def get_bool_call_argument_by_name(ctx: FunctionContext | MethodContext, name: str, *, default: bool) -> bool:
"""
Return the boolean value for an argument or the default if it's not found.
"""
arg_value = get_call_argument_by_name(ctx, name)
if arg_value is not None:
parsed_value = parse_bool(arg_value)
if parsed_value is not None:
return parsed_value
return default
def get_call_argument_type_by_name(ctx: FunctionContext | MethodContext, name: str) -> MypyType | None:
"""Return the type for the specific argument.
This helper should only be used with non-star arguments.
"""
if name not in ctx.callee_arg_names:
return None
idx = ctx.callee_arg_names.index(name)
arg_types = ctx.arg_types[idx]
if len(arg_types) != 1:
# Either an error or no value passed.
return None
return arg_types[0]
def is_optional(typ: MypyType) -> bool:
typ = get_proper_type(typ)
return isinstance(typ, UnionType) and any(isinstance(get_proper_type(item), NoneTyp) for item in typ.items)
# Duplicating mypy.semanal_shared.parse_bool because importing it directly caused ImportError (#1784)
def parse_bool(expr: Expression) -> bool | None:
if isinstance(expr, NameExpr):
if expr.fullname == "builtins.True":
return True
if expr.fullname == "builtins.False":
return False
return None
def get_literal_str_type(typ: Type) -> str | None:
"""Extract the str value of a string like type if possible"""
typ = get_proper_type(typ)
if (isinstance(typ, LiteralType) and isinstance((literal_value := typ.value), str)) or (
isinstance(typ, Instance)
and isinstance(typ.last_known_value, LiteralType)
and isinstance((literal_value := typ.last_known_value.value), str)
):
return literal_value
return None
def has_any_of_bases(info: TypeInfo, bases: Iterable[str]) -> bool:
for base_fullname in bases:
if info.has_base(base_fullname):
return True
return False
def iter_bases(info: TypeInfo) -> Iterator[Instance]:
for base in info.bases:
yield base
yield from iter_bases(base.type)
def get_private_descriptor_type(type_info: TypeInfo, private_field_name: str, is_nullable: bool) -> MypyType:
"""Return declared type of type_info's private_field_name (used for private Field attributes)"""
sym = type_info.get(private_field_name)
if sym is None:
return AnyType(TypeOfAny.explicit)
node = sym.node
if isinstance(node, Var):
descriptor_type = node.type
if descriptor_type is None:
return AnyType(TypeOfAny.explicit)
if is_nullable:
descriptor_type = make_optional_type(descriptor_type)
return descriptor_type
return AnyType(TypeOfAny.explicit)
class FieldTypeArgs(NamedTuple):
set: ProperType
get: ProperType
def get_field_type_args(field_type: Instance) -> FieldTypeArgs | None:
"""Extract (_ST, _GT) from a Field instance by mapping to the base Field class."""
base_field_info = next((base for base in field_type.type.mro if base.fullname == fullnames.FIELD_FULLNAME), None)
if base_field_info is None:
return None
mapped = map_instance_to_supertype(field_type, base_field_info)
return FieldTypeArgs(set=get_proper_type(mapped.args[0]), get=get_proper_type(mapped.args[1]))
def get_nested_meta_node_for_current_class(info: TypeInfo) -> TypeInfo | None:
metaclass_sym = info.names.get("Meta")
if metaclass_sym is not None and isinstance(metaclass_sym.node, TypeInfo):
return metaclass_sym.node
return None
def create_type_info(name: str, module: str, bases: list[Instance]) -> TypeInfo:
# make new class expression
classdef = ClassDef(name, Block([]))
classdef.fullname = module + "." + name
# make new TypeInfo
new_typeinfo = TypeInfo(SymbolTable(), classdef, module)
new_typeinfo.bases = bases
calculate_mro(new_typeinfo)
new_typeinfo.metaclass_type = new_typeinfo.calculate_metaclass_type()
classdef.info = new_typeinfo
return new_typeinfo
def add_new_class_for_module(
module: MypyFile,
name: str,
bases: list[Instance],
fields: dict[str, MypyType] | None = None,
no_serialize: bool = False,
) -> TypeInfo:
new_class_unique_name = checker.gen_unique_name(name, module.names)
new_typeinfo = create_type_info(new_class_unique_name, module.fullname, bases)
# add fields
if fields:
for field_name, field_type in fields.items():
var = Var(field_name, type=field_type)
var.info = new_typeinfo
var._fullname = new_typeinfo.fullname + "." + field_name
new_typeinfo.names[field_name] = SymbolTableNode(
MDEF, var, plugin_generated=True, no_serialize=no_serialize
)
module.names[new_class_unique_name] = SymbolTableNode(
GDEF, new_typeinfo, plugin_generated=True, no_serialize=no_serialize
)
return new_typeinfo
def build_reparametrized_subclass(
module: MypyFile, base_info: TypeInfo, name: str, *, unique_name: bool, line: int = -1
) -> TypeInfo:
"""
Create a `TypeInfo` subclassing generic `base_info`, generic over the same type vars.
"""
base_instance = fill_typevars(base_info)
assert isinstance(base_instance, Instance)
if unique_name:
info = add_new_class_for_module(module, name, bases=[base_instance])
else:
info = create_type_info(name, module.fullname, bases=[base_instance])
info.defn.type_vars = base_info.defn.type_vars.copy()
info.add_type_vars()
info.set_line(line)
info.defn.set_line(line)
return info
def get_current_module(api: TypeChecker) -> MypyFile:
"""
Scope is guaranteed to be initialized with the module as the first element of the stack.
Inspired from https://github.com/python/mypy/blob/15b8ca967cc6187effcab23e6613da2db4546584/mypy/checker.py#L5788
"""
current_module = api.scope.stack[0]
assert isinstance(current_module, MypyFile)
return current_module
def make_oneoff_named_tuple(
api: TypeChecker, name: str, fields: dict[str, MypyType], extra_bases: list[Instance] | None = None
) -> TupleType:
current_module = get_current_module(api)
if extra_bases is None:
extra_bases = []
namedtuple_info = add_new_class_for_module(
current_module, name, bases=[api.named_generic_type("typing.NamedTuple", []), *extra_bases], fields=fields
)
return TupleType(list(fields.values()), fallback=Instance(namedtuple_info, []))
def extend_oneoff_named_tuple(
api: TypeChecker, name: str, original: TupleType, extra_fields: Mapping[str, MypyType]
) -> TupleType:
existing_fields = {
field_name: sym.node.type or AnyType(TypeOfAny.special_form)
for field_name, sym in original.partial_fallback.type.names.items()
if sym.plugin_generated and isinstance(sym.node, Var)
}
return make_oneoff_named_tuple(api, name, {**existing_fields, **extra_fields})
def make_tuple(api: TypeChecker, fields: list[MypyType]) -> TupleType:
# fallback for tuples is any builtins.tuple instance
fallback = api.named_generic_type("builtins.tuple", [AnyType(TypeOfAny.special_form)])
return TupleType(fields, fallback=fallback)
def convert_any_to_type(typ: MypyType, referred_to_type: MypyType) -> MypyType:
proper_type = get_proper_type(typ)
if isinstance(proper_type, UnionType):
converted_items = []
for item in proper_type.items:
converted_items.append(convert_any_to_type(item, referred_to_type))
return UnionType.make_union(converted_items, line=typ.line, column=typ.column)
if isinstance(proper_type, Instance):
args = []
for default_arg in proper_type.args:
default_arg = get_proper_type(default_arg)
if isinstance(default_arg, AnyType):
args.append(referred_to_type)
else:
args.append(default_arg)
return proper_type.copy_modified(args=args)
if isinstance(proper_type, AnyType):
return referred_to_type
return typ
def _get_fallback_typeddict(api: SemanticAnalyzer | CheckerPluginInterface) -> Instance:
if isinstance(api, CheckerPluginInterface):
return api.named_generic_type("typing._TypedDict", [])
return api.named_type("typing._TypedDict", [])
def make_typeddict(
api: SemanticAnalyzer | CheckerPluginInterface,
fields: dict[str, MypyType],
) -> TypedDictType:
"""Create a TypedDict from a python dict of field names and types."""
return TypedDictType(
items=fields,
required_keys=set(fields.keys()),
readonly_keys=set(),
fallback=_get_fallback_typeddict(api),
)
def merge_typeddict(
api: SemanticAnalyzer | CheckerPluginInterface,
left: TypedDictType,
right: TypedDictType,
) -> TypedDictType:
"""Merge two TypedDictType type into one with anonymous fallback."""
return TypedDictType(
items={**left.items, **right.items},
required_keys={*left.required_keys, *right.required_keys},
readonly_keys={*left.readonly_keys, *right.readonly_keys},
fallback=_get_fallback_typeddict(api),
)
def resolve_string_attribute_value(attr_expr: Expression, django_context: DjangoContext) -> str | None:
if isinstance(attr_expr, StrExpr):
return attr_expr.value
if isinstance(attr_expr, NameExpr) and isinstance(attr_expr.node, Var) and attr_expr.node.type is not None:
return get_literal_str_type(attr_expr.node.type)
# support extracting from settings, in general case it's unresolvable yet
if isinstance(attr_expr, MemberExpr):
member_name = attr_expr.name
if isinstance(attr_expr.expr, NameExpr) and attr_expr.expr.fullname == "django.conf.settings":
if hasattr(django_context.settings, member_name):
return getattr(django_context.settings, member_name) # type: ignore[no-any-return]
return None
def get_semanal_api(ctx: ClassDefContext | DynamicClassDefContext) -> SemanticAnalyzer:
if not isinstance(ctx.api, SemanticAnalyzer):
raise ValueError("Not a SemanticAnalyzer")
return ctx.api
def get_typechecker_api(ctx: AttributeContext | MethodContext | FunctionContext) -> TypeChecker:
if not isinstance(ctx.api, TypeChecker):
raise ValueError("Not a TypeChecker")
return ctx.api
def check_types_compatible(
ctx: FunctionContext | MethodContext, *, expected_type: MypyType, actual_type: MypyType, error_message: str
) -> None:
api = get_typechecker_api(ctx)
api.check_subtype(actual_type, expected_type, ctx.context, error_message, "got", "expected")
def add_new_sym_for_info(
info: TypeInfo, name: str, sym_type: MypyType, *, no_serialize: bool = False, is_classvar: bool = False
) -> None:
# type=: type of the variable itself
var = Var(name=name, type=sym_type)
# var.info: type of the object variable is bound to
var.info = info
var._fullname = info.fullname + "." + name
var.is_initialized_in_class = True
var.is_inferred = True
var.is_classvar = is_classvar
info.names[name] = SymbolTableNode(MDEF, var, plugin_generated=True, no_serialize=no_serialize)
def is_abstract_model(model: TypeInfo) -> bool:
if model.fullname in fullnames.DJANGO_ABSTRACT_MODELS:
return True
if not is_model_type(model):
return False
metadata = get_django_metadata(model)
if metadata.get("is_abstract_model") is not None:
return metadata["is_abstract_model"]
meta = model.names.get("Meta")
# Check if 'abstract' is declared in this model's 'class Meta' as
# 'abstract = True' won't be inherited from a parent model.
if meta is not None and isinstance(meta.node, TypeInfo) and "abstract" in meta.node.names:
for stmt in meta.node.defn.defs.body:
if (
# abstract =
isinstance(stmt, AssignmentStmt)
and len(stmt.lvalues) == 1
and isinstance(stmt.lvalues[0], NameExpr)
and stmt.lvalues[0].name == "abstract"
):
# abstract = True (builtins.bool)
rhs_is_true = parse_bool(stmt.rvalue) is True
# abstract: Literal[True]
stmt_type = get_proper_type(stmt.type)
is_literal_true = isinstance(stmt_type, LiteralType) and stmt_type.value is True
metadata["is_abstract_model"] = rhs_is_true or is_literal_true
return metadata["is_abstract_model"]
metadata["is_abstract_model"] = False
return False
def resolve_lazy_reference(
reference: str, *, api: TypeChecker | SemanticAnalyzer, django_context: DjangoContext, ctx: Context
) -> TypeInfo | None:
"""
Attempts to resolve a lazy reference(e.g. ".") to a 'TypeInfo' instance.
"""
if "." not in reference:
# -- needs prefix of . We can't implicitly solve
# what app label this should be, yet.
return None
# Reference conforms to the structure of a lazy reference: '.'
fullname = django_context.model_class_fullname_for_label(reference)
if fullname is not None:
model_info = lookup_fully_qualified_typeinfo(api, fullname)
if model_info is not None:
return model_info
if isinstance(api, SemanticAnalyzer) and not api.final_iteration:
# Getting this far, where Django matched the reference but we still can't
# find it, we want to defer
api.defer()
else:
api.fail("Could not match lazy reference with any model", ctx)
return None
def is_model_type(info: TypeInfo) -> bool:
return info.metaclass_type is not None and info.metaclass_type.type.has_base(fullnames.MODEL_METACLASS_FULLNAME)
def get_model_from_expression(
expr: Expression,
*,
self_model: TypeInfo,
api: TypeChecker | SemanticAnalyzer,
django_context: DjangoContext,
) -> Instance | None:
"""
Attempts to resolve an expression to a 'TypeInfo' instance. Any lazy reference
argument(e.g. ".") to a Django model is also attempted.
"""
if isinstance(expr, RefExpr) and isinstance(expr.node, TypeInfo):
if is_model_type(expr.node):
return Instance(expr.node, [])
if isinstance(expr, StrExpr) and expr.value == "self":
return Instance(self_model, [])
lazy_reference = None
if isinstance(expr, StrExpr):
lazy_reference = expr.value
elif (
isinstance(expr, MemberExpr)
and isinstance(expr.expr, NameExpr)
and f"{expr.expr.fullname}.{expr.name}" == fullnames.AUTH_USER_MODEL_FULLNAME
):
lazy_reference = django_context.settings.AUTH_USER_MODEL
if lazy_reference is not None:
model_info = resolve_lazy_reference(lazy_reference, api=api, django_context=django_context, ctx=expr)
if model_info is not None:
return Instance(model_info, [])
return None
def fill_manager(manager: TypeInfo, typ: MypyType) -> Instance:
return Instance(manager, [typ] if manager.is_generic() else [])
def merge_extra_attrs(
base_extra_attrs: ExtraAttrs | None,
*,
new_attrs: dict[str, MypyType] | None = None,
new_immutable: set[str] | None = None,
) -> ExtraAttrs:
"""
Create a new `ExtraAttrs` by merging new attributes/immutable fields into a base.
If base_extra_attrs is None, creates a fresh ExtraAttrs with only the new values.
"""
if base_extra_attrs:
return ExtraAttrs(
attrs={**base_extra_attrs.attrs, **new_attrs} if new_attrs is not None else base_extra_attrs.attrs.copy(),
immutable=(
base_extra_attrs.immutable | new_immutable
if new_immutable is not None
else base_extra_attrs.immutable.copy()
),
mod_name=None,
)
return ExtraAttrs(
attrs=new_attrs or {},
immutable=new_immutable,
mod_name=None,
)
def analyze_member_access(
name: str,
typ: MypyType,
context: Context,
*,
is_lvalue: bool,
is_super: bool,
is_operator: bool,
original_type: MypyType,
chk: TypeChecker,
) -> MypyType:
# TODO: [mypy 1.16+] Remove this workaround for passing `msg` to `analyze_member_access()`.
extra: dict[str, Any] = {}
if mypy_version_info < (1, 16):
extra["msg"] = chk.msg
return _mypy_analyze_member_access(
name,
typ,
context,
is_lvalue=is_lvalue,
is_super=is_super,
is_operator=is_operator,
original_type=original_type,
chk=chk,
**extra,
)
typeddjango-django-stubs-fa03b48/mypy_django_plugin/main.py 0000664 0000000 0000000 00000044525 15260643574 0024253 0 ustar 00root root 0000000 0000000 from __future__ import annotations
import importlib.metadata
import itertools
import sys
from functools import cache, cached_property, partial
from typing import TYPE_CHECKING, Any, Final
from mypy.build import PRI_MED, PRI_MYPY
from mypy.modulefinder import mypy_path
from mypy.nodes import Import, ImportFrom, MypyFile, TypeInfo
from mypy.plugin import (
AnalyzeTypeContext,
AttributeContext,
ClassDefContext,
DynamicClassDefContext,
FunctionContext,
MethodContext,
Plugin,
ReportConfigContext,
)
from typing_extensions import override
from mypy_django_plugin.config import DjangoPluginConfig
from mypy_django_plugin.django.context import DjangoContext
from mypy_django_plugin.exceptions import UnregisteredModelError
from mypy_django_plugin.lib import fullnames, helpers
from mypy_django_plugin.transformers import (
apps,
choices,
fields,
forms,
init_create,
manytomany,
manytoone,
meta,
orm_lookups,
querysets,
save,
settings,
)
from mypy_django_plugin.transformers.auth import get_user_model
from mypy_django_plugin.transformers.functional import resolve_str_promise_attribute
from mypy_django_plugin.transformers.managers import (
add_as_manager_to_queryset_class,
create_new_manager_class_from_from_queryset_method,
reparametrize_any_field_hook,
reparametrize_any_manager_hook,
reparametrize_any_queryset_hook,
resolve_manager_method,
)
from mypy_django_plugin.transformers.models import (
MetaclassAdjustments,
handle_annotated_type,
process_model_class,
set_auth_user_model_boolean_fields,
)
from mypy_django_plugin.transformers.request import check_querydict_is_mutable
if TYPE_CHECKING:
from collections.abc import Callable
from mypy.options import Options
from mypy.types import Type as MypyType
_APPS_MODULES: Final = frozenset({"django.apps", "django.apps.registry"})
class NewSemanalDjangoPlugin(Plugin):
def __init__(self, options: Options) -> None:
super().__init__(options)
self.plugin_config = DjangoPluginConfig(options.config_file)
# Add paths from MYPYPATH env var
sys.path.extend(mypy_path())
# Add paths from mypy_path config option
sys.path.extend(options.mypy_path)
self.django_context = DjangoContext(self.plugin_config.django_settings_module)
def _get_typeinfo_or_none(self, class_name: str) -> TypeInfo | None:
sym = self.lookup_fully_qualified(class_name)
if sym is not None and isinstance(sym.node, TypeInfo):
return sym.node
return None
def _new_dependency(self, module: str, priority: int = PRI_MYPY) -> tuple[int, str, int]:
fake_lineno = -1
return (priority, module, fake_lineno)
def _file_imports_apps_module(self, file: MypyFile) -> bool:
for import_node in file.imports:
if isinstance(import_node, Import):
if any(module in _APPS_MODULES for module, _ in import_node.ids):
return True
elif isinstance(import_node, ImportFrom) and import_node.id in _APPS_MODULES:
return True
return False
@override
def get_additional_deps(self, file: MypyFile) -> list[tuple[int, str, int]]:
# for settings
if file.fullname == "django.conf" and self.django_context.django_settings_module:
return [self._new_dependency(self.django_context.django_settings_module, PRI_MED)]
# for values / values_list
if file.fullname == "django.db.models":
return [self._new_dependency("typing"), self._new_dependency("django_stubs_ext")]
# for `get_user_model()`
if file.fullname == "django.contrib.auth" or file.fullname in {"django.http", "django.http.request"}:
auth_user_model_name = self.django_context.settings.AUTH_USER_MODEL
try:
auth_user_module = self.django_context.apps_registry.get_model(auth_user_model_name).__module__
except LookupError:
# get_user_model() model app is not installed
return []
return [self._new_dependency(auth_user_module), self._new_dependency("django_stubs_ext")]
deps: set[tuple[int, str, int]] = set()
# A file using `apps.get_model()` may depend on any model module.
# Skip stubs to keep Django's own build graph untouched.
if not file.is_stub and self._file_imports_apps_module(file):
deps.update(
self._new_dependency(module) for module in self.django_context.model_modules if module != file.fullname
)
# ensure that all mentions to='someapp.SomeModel' are loaded with corresponding related Fields
defined_model_classes = self.django_context.model_modules.get(file.fullname)
if not defined_model_classes:
return list(deps)
for model_class in defined_model_classes.values():
for field in itertools.chain(
# forward relations
self.django_context.get_model_related_fields(model_class),
# reverse relations - `related_objects` is private API (according to docstring)
model_class._meta.related_objects,
):
try:
related_model_cls = self.django_context.get_field_related_model_cls(field) # type: ignore[arg-type]
except UnregisteredModelError:
continue
related_model_module = related_model_cls.__module__
if related_model_module != file.fullname:
deps.add(self._new_dependency(related_model_module))
return [
*deps,
# For `QuerySet.annotate`
self._new_dependency("django_stubs_ext"),
# For `TypedModelMeta` lookup in model transformers
self._new_dependency("django_stubs_ext.db.models"),
# For `Manager.from_queryset`
self._new_dependency("django.db.models.query"),
]
@override
def get_function_hook(self, fullname: str) -> Callable[[FunctionContext], MypyType] | None:
info = self._get_typeinfo_or_none(fullname)
if not info:
return None
if info.has_base(fullnames.FIELD_FULLNAME):
return partial(fields.transform_into_proper_return_type, django_context=self.django_context)
if helpers.is_model_type(info):
return partial(init_create.typecheck_model_init, django_context=self.django_context)
if info.has_base(fullnames.BASE_MANAGER_CLASS_FULLNAME):
return querysets.determine_proper_manager_type
if info.has_base(fullnames.PREFETCH_CLASS_FULLNAME):
return partial(querysets.specialize_prefetch_type, django_context=self.django_context)
if info.has_base(fullnames.FUNC_EXPRESSION_FULLNAME):
return querysets.reparameterize_func_output_field
return None
@cached_property
def manager_and_queryset_method_hooks(self) -> dict[str, Callable[[MethodContext], MypyType]]:
typecheck_filtering_method = partial(orm_lookups.typecheck_queryset_filter, django_context=self.django_context)
return {
"values": partial(querysets.extract_proper_type_queryset_values, django_context=self.django_context),
"values_list": partial(
querysets.extract_proper_type_queryset_values_list, django_context=self.django_context
),
"alias": partial(querysets.extract_proper_type_queryset_annotate, django_context=self.django_context),
"annotate": partial(querysets.extract_proper_type_queryset_annotate, django_context=self.django_context),
"create": partial(init_create.typecheck_model_create, django_context=self.django_context),
"acreate": partial(init_create.typecheck_model_acreate, django_context=self.django_context),
"filter": typecheck_filtering_method,
"get": typecheck_filtering_method,
"aget": typecheck_filtering_method,
"get_or_create": typecheck_filtering_method,
"aget_or_create": typecheck_filtering_method,
"update_or_create": typecheck_filtering_method,
"aupdate_or_create": typecheck_filtering_method,
"exclude": typecheck_filtering_method,
"prefetch_related": partial(
querysets.extract_prefetch_related_annotations, django_context=self.django_context
),
"select_related": partial(querysets.validate_select_related, django_context=self.django_context),
"bulk_update": partial(
querysets.validate_bulk_update, django_context=self.django_context, method="bulk_update"
),
"abulk_update": partial(
querysets.validate_bulk_update, django_context=self.django_context, method="abulk_update"
),
"bulk_create": partial(
querysets.validate_bulk_create, django_context=self.django_context, method="bulk_create"
),
"abulk_create": partial(
querysets.validate_bulk_create, django_context=self.django_context, method="abulk_create"
),
"order_by": partial(querysets.validate_order_by, django_context=self.django_context),
"earliest": partial(querysets.validate_order_by, django_context=self.django_context),
"aearliest": partial(querysets.validate_order_by, django_context=self.django_context),
"latest": partial(querysets.validate_order_by, django_context=self.django_context),
"alatest": partial(querysets.validate_order_by, django_context=self.django_context),
"defer": partial(querysets.validate_defer_only, django_context=self.django_context, is_defer=True),
"only": partial(querysets.validate_defer_only, django_context=self.django_context, is_defer=False),
"distinct": partial(querysets.validate_distinct, django_context=self.django_context),
"update": partial(querysets.validate_update, django_context=self.django_context),
"aupdate": partial(querysets.validate_update, django_context=self.django_context),
"in_bulk": partial(querysets.validate_in_bulk, django_context=self.django_context),
"ain_bulk": partial(querysets.validate_in_bulk, django_context=self.django_context),
}
@override
def get_method_hook(self, fullname: str) -> Callable[[MethodContext], MypyType] | None:
class_fullname, _, method_name = fullname.rpartition(".")
# Methods called very often -- short circuit for minor speed up
if method_name == "__init_subclass__" or fullname.startswith("builtins."):
return None
if method_name == "__get__":
hooks = {
fullnames.MANYTOMANY_FIELD_FULLNAME: manytomany.refine_many_to_many_related_manager,
fullnames.MANY_TO_MANY_DESCRIPTOR: manytomany.refine_many_to_many_related_manager,
fullnames.REVERSE_MANY_TO_ONE_DESCRIPTOR: manytoone.refine_many_to_one_related_manager,
}
return hooks.get(class_fullname)
info = self._get_typeinfo_or_none(class_fullname)
if not info:
return None
if class_fullname.endswith("QueryDict") and info.has_base(fullnames.QUERYDICT_CLASS_FULLNAME):
return check_querydict_is_mutable
if method_name in self.manager_and_queryset_method_hooks and helpers.has_any_of_bases(
info, [fullnames.QUERYSET_CLASS_FULLNAME, fullnames.MANAGER_CLASS_FULLNAME]
):
return self.manager_and_queryset_method_hooks[method_name]
if method_name in ("save", "asave") and helpers.is_model_type(info):
return partial(save.validate_save_update_fields, django_context=self.django_context, method=method_name)
if method_name == "get_field" and info.has_base(fullnames.OPTIONS_CLASS_FULLNAME):
return partial(meta.return_proper_field_type_from_get_field, django_context=self.django_context)
if (
method_name == "get_model"
and info.has_base(fullnames.APPS_FULLNAME)
# `StateApps` returns historical models rebuilt from migration state whose fields
# differ from the current definitions, so narrowing to the current model is wrong.
and not info.has_base(fullnames.STATE_APPS_FULLNAME)
):
return partial(apps.resolve_model_for_get_model, django_context=self.django_context)
if helpers.has_any_of_bases(info, [fullnames.QUERYSET_CLASS_FULLNAME, fullnames.MANAGER_CLASS_FULLNAME]):
return partial(querysets.merge_annotations_from_custom_method, django_context=self.django_context)
return None
@override
def get_customize_class_mro_hook(self, fullname: str) -> Callable[[ClassDefContext], None] | None:
info = self._get_typeinfo_or_none(fullname)
if not info:
return None
if info.has_base(fullnames.BASE_MANAGER_CLASS_FULLNAME):
return reparametrize_any_manager_hook
if info.has_base(fullnames.QUERYSET_CLASS_FULLNAME):
return reparametrize_any_queryset_hook
if info.has_base(fullnames.FIELD_FULLNAME):
return reparametrize_any_field_hook
return None
@override
def get_metaclass_hook(self, fullname: str) -> Callable[[ClassDefContext], None] | None:
if fullname == fullnames.MODEL_METACLASS_FULLNAME:
return partial(MetaclassAdjustments.adjust_model_class, plugin_config=self.plugin_config)
return None
@override
def get_base_class_hook(self, fullname: str) -> Callable[[ClassDefContext], None] | None:
info = self._get_typeinfo_or_none(fullname)
if not info:
return None
# Base class is a Model class definition
if helpers.is_model_type(info):
return partial(process_model_class, django_context=self.django_context)
# Base class is a Form class definition
if info.has_base(fullnames.BASEFORM_CLASS_FULLNAME):
return forms.make_meta_nested_class_inherit_from_any
# Base class is a QuerySet class definition
if info.has_base(fullnames.QUERYSET_CLASS_FULLNAME):
return add_as_manager_to_queryset_class
return None
@override
def get_attribute_hook(self, fullname: str) -> Callable[[AttributeContext], MypyType] | None:
class_name, _, attr_name = fullname.rpartition(".")
# Lookup of a settings variable
if class_name == fullnames.DUMMY_SETTINGS_BASE_CLASS:
return partial(
settings.get_type_of_settings_attribute,
django_context=self.django_context,
plugin_config=self.plugin_config,
)
info = self._get_typeinfo_or_none(class_name)
if not info:
return None
# Lookup of the '.is_superuser' attribute
if info.has_base(fullnames.PERMISSION_MIXIN_CLASS_FULLNAME) and attr_name == "is_superuser":
return partial(set_auth_user_model_boolean_fields, django_context=self.django_context)
# Lookup of the 'user.is_staff' or 'user.is_active' attribute
if info.has_base(fullnames.ABSTRACT_USER_MODEL_FULLNAME) and attr_name in ("is_staff", "is_active"):
return partial(set_auth_user_model_boolean_fields, django_context=self.django_context)
# Lookup of a method on a dynamically generated manager class
# i.e. a manager class only existing while mypy is running, not collected from the AST
if info.has_base(
fullnames.BASE_MANAGER_CLASS_FULLNAME
) and "from_queryset_manager" in helpers.get_django_metadata(info):
return resolve_manager_method
if info.has_base(fullnames.STR_PROMISE_FULLNAME):
return resolve_str_promise_attribute
if (
info.has_base(fullnames.CHOICES_TYPE_METACLASS_FULLNAME)
and attr_name in {"choices", "labels", "values", "__empty__"}
) or (info.has_base(fullnames.CHOICES_CLASS_FULLNAME) and attr_name in {"label", "value"}):
return choices.transform_into_proper_attr_type
return None
@override
def get_type_analyze_hook(self, fullname: str) -> Callable[[AnalyzeTypeContext], MypyType] | None:
if fullname in fullnames.ANNOTATED_TYPES_FULLNAMES:
return partial(handle_annotated_type, fullname=fullname)
if fullname == "django.contrib.auth.models._User":
return partial(get_user_model, django_context=self.django_context)
return None
@override
def get_dynamic_class_hook(self, fullname: str) -> Callable[[DynamicClassDefContext], None] | None:
# Create a new manager class definition when a manager's '.from_queryset' classmethod is called
class_name, _, method_name = fullname.rpartition(".")
if method_name == "from_queryset":
info = self._get_typeinfo_or_none(class_name)
if info and info.has_base(fullnames.BASE_MANAGER_CLASS_FULLNAME):
return create_new_manager_class_from_from_queryset_method
return None
@cached_property
def _report_config_data(self) -> dict[str, Any]:
# Cache would be cleared if any settings do change.
extra_data = {
# The additional deps depend on the installed apps
"INSTALLED_APPS": list(self.django_context.settings.INSTALLED_APPS),
# The user model determines the `_User` alias expansion
"AUTH_USER_MODEL": self.django_context.settings.AUTH_USER_MODEL,
# The implicit `pk` field type depends on `DEFAULT_AUTO_FIELD`
"DEFAULT_AUTO_FIELD": self.django_context.settings.DEFAULT_AUTO_FIELD,
"django_version": _package_version("django"),
"django_stubs_version": _package_version("django-stubs"),
}
if (django_stubs_ext_version := _package_version("django-stubs-ext")) is not None:
extra_data["django_stubs_ext_version"] = django_stubs_ext_version
return self.plugin_config.to_json(extra_data)
@override
def report_config_data(self, ctx: ReportConfigContext) -> dict[str, Any]:
return self._report_config_data
@cache
def _package_version(package: str) -> str | None:
try:
return importlib.metadata.version(package)
except importlib.metadata.PackageNotFoundError:
return None
def plugin(version: str) -> type[NewSemanalDjangoPlugin]:
return NewSemanalDjangoPlugin
typeddjango-django-stubs-fa03b48/mypy_django_plugin/py.typed 0000664 0000000 0000000 00000000000 15260643574 0024430 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/ 0000775 0000000 0000000 00000000000 15260643574 0025470 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0027567 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/apps.py 0000664 0000000 0000000 00000003535 15260643574 0027013 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING
from mypy.nodes import StrExpr
from mypy.types import Instance, TypeType
from mypy.types import Type as MypyType
from mypy_django_plugin.lib import helpers
if TYPE_CHECKING:
from mypy.plugin import MethodContext
from mypy_django_plugin.django.context import DjangoContext
def _get_model_lazy_reference(ctx: MethodContext) -> str | None:
"""Resolve a `get_model` call to a `.` lazy reference."""
app_label = helpers.get_call_argument_by_name(ctx, "app_label")
model_name = helpers.get_call_argument_by_name(ctx, "model_name")
if not isinstance(app_label, StrExpr):
return None
if model_name is None:
# Shortcut form: `app_label` is already ".".
return app_label.value
if isinstance(model_name, StrExpr):
return f"{app_label.value}.{model_name.value}"
return None
def resolve_model_for_get_model(ctx: MethodContext, django_context: DjangoContext) -> MypyType:
"""Narrow the return type of an `apps.get_model()` call to the referenced model.
apps.get_model("myapp.MyModel") # -> type[myapp.models.MyModel]
apps.get_model("myapp", "MyModel") # -> type[myapp.models.MyModel]
The model name is case-insensitive, so `"myapp.mymodel"` resolves too.
Non-literal arguments keep the permissive `type[Any]` fallback:
apps.get_model(app_label, model_name) # -> type[Any]
"""
if (lazy_reference := _get_model_lazy_reference(ctx)) and (
model_info := helpers.resolve_lazy_reference(
lazy_reference,
api=helpers.get_typechecker_api(ctx),
django_context=django_context,
ctx=ctx.context,
)
):
return TypeType(Instance(model_info, []))
return ctx.default_return_type
typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/auth.py 0000664 0000000 0000000 00000003412 15260643574 0027003 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING
from mypy.nodes import TypeInfo
from mypy.semanal import SemanticAnalyzer
from mypy.typeanal import TypeAnalyser
from mypy.types import PlaceholderType, ProperType
from mypy.types import Type as MypyType
from mypy.typevars import fill_typevars_with_any
from mypy_django_plugin.lib import fullnames, helpers
if TYPE_CHECKING:
from mypy.plugin import AnalyzeTypeContext
from mypy_django_plugin.django.context import DjangoContext
def _get_abstract_base_user(api: SemanticAnalyzer) -> ProperType:
sym = api.lookup_fully_qualified(fullnames.ABSTRACT_BASE_USER_MODEL_FULLNAME)
assert isinstance(sym.node, TypeInfo)
return fill_typevars_with_any(sym.node)
def get_user_model(ctx: AnalyzeTypeContext, django_context: DjangoContext) -> MypyType:
assert isinstance(ctx.api, TypeAnalyser)
assert isinstance(ctx.api.api, SemanticAnalyzer)
if not django_context.is_contrib_auth_installed:
return _get_abstract_base_user(ctx.api.api)
auth_user_model = django_context.settings.AUTH_USER_MODEL
model_info = helpers.resolve_lazy_reference(
auth_user_model, api=ctx.api.api, django_context=django_context, ctx=ctx.context
)
if model_info is None:
fullname = django_context.model_class_fullname_for_label(auth_user_model)
if fullname is not None:
# When we've tried to resolve 'AUTH_USER_MODEL' but got no class back but
# we notice that its value is recognised we'll return a placeholder for
# the class as we expect it to exist later on.
return PlaceholderType(fullname=fullname, args=[], line=ctx.context.line)
return _get_abstract_base_user(ctx.api.api)
return fill_typevars_with_any(model_info)
typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/choices.py 0000664 0000000 0000000 00000025376 15260643574 0027474 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from enum import Enum, auto
from typing import TYPE_CHECKING
from django.db.models.constants import LOOKUP_SEP
from mypy.nodes import MemberExpr, NameExpr, SuperExpr, TypeAlias, TypeInfo, Var
from mypy.typeanal import make_optional_type
from mypy.types import (
AnyType,
Instance,
LiteralType,
Overloaded,
ProperType,
TupleType,
TypeOfAny,
TypeType,
TypeVarType,
UnionType,
get_proper_type,
)
from mypy.types import Type as MypyType
from mypy_django_plugin.lib import fullnames
if TYPE_CHECKING:
from mypy.plugin import AttributeContext
# TODO: [mypy 1.14+] Remove this backport of `TypeInfo.enum_members`.
def _get_enum_members(info: TypeInfo) -> list[str]:
try:
return info.enum_members
except AttributeError: # mypy < 1.14
pass
return [
name
for name, sym in info.names.items()
if (
isinstance(sym.node, Var)
and name not in ("_ignore_", "_order_", "__order__")
and not name.startswith(LOOKUP_SEP)
and sym.node.has_explicit_value
)
]
class _LabelLaziness(Enum):
LAZY = auto()
NON_LAZY = auto()
MIXED = auto()
@classmethod
def make(cls, lazy: bool | None) -> _LabelLaziness:
return cls.LAZY if lazy else cls.NON_LAZY
def _is_lazy_string(ty: MypyType | None) -> bool:
proper_type = get_proper_type(ty)
return isinstance(proper_type, Instance) and proper_type.type.has_base(fullnames.STR_PROMISE_FULLNAME)
def _is_lazy_member(node: TypeInfo, member_name: str) -> bool:
if (sym := node.get(member_name)) is None:
return False
_member_type = get_proper_type(sym.type)
if not isinstance(_member_type, TupleType):
# Member has auto-generated plain string label - enum.auto() or no explicit label.
return False
if _member_type.length() < 2:
# There need to be at least two items in the tuple.
return False
return _is_lazy_string(_member_type.items[-1])
def _label_laziness(node: TypeInfo) -> _LabelLaziness:
"""
Check whether a choices type has lazy strings for labels.
This is used to determine whether a choices type uses lazy strings or non-lazy string for
labels such that a more simple type can be used instead of the default in the stubs.
"""
assert node.is_enum
if (sym := node.get("__empty__")) is not None:
lazy = _is_lazy_string(sym.type)
else:
lazy = None
# TODO: [mypy 1.14+] Use `node.enum_members` and remove `_get_enum_members()` backport.
for member_name in _get_enum_members(node):
member_lazy = _is_lazy_member(node, member_name)
if lazy is None:
lazy = member_lazy
elif lazy != member_lazy:
return _LabelLaziness.MIXED
return _LabelLaziness.make(lazy)
def _try_replace_label(typ: ProperType, label_laziness: _LabelLaziness) -> MypyType:
"""
Attempt to replace a label with a modified version.
If there are no lazy strings for labels, remove the lazy string type, and vice-versa.
"""
if label_laziness is _LabelLaziness.MIXED:
return typ
if not isinstance(typ, UnionType):
# If it's not a union, then it already is likely just `str` and not lazy.
return typ
items = [
t
for t in map(get_proper_type, typ.items)
if isinstance(t, Instance)
and t.type.has_base(fullnames.STR_PROMISE_FULLNAME) == (label_laziness is _LabelLaziness.LAZY)
]
# If we only have one item use that, otherwise make a new union.
return UnionType.make_union(items) if len(items) > 1 else items[0]
def _try_replace_value(typ: ProperType, base_type: Instance | None, has_empty_label: bool) -> MypyType:
"""
Attempt to replace a label with a modified version.
If the value is of any type, then attempt to use the base type of the choices type.
If the choices type has `__empty__` defined, then make the value type optional.
"""
has_unknown_base = isinstance(typ, AnyType)
if has_empty_label and has_unknown_base and base_type is not None:
return make_optional_type(base_type)
if has_empty_label:
return make_optional_type(typ)
if has_unknown_base and base_type is not None:
return base_type
return typ
def _get_enum_type_from_union_of_literals(typ: UnionType) -> MypyType:
"""
Attempts to resolve a single enum type from a union of enum literals.
If this cannot be resolved, the original is returned.
"""
types = set()
for item in typ.items:
item = get_proper_type(item)
if not isinstance(item, LiteralType) or not item.fallback.type.is_enum:
# If anything that isn't a literal of an enum type is encountered, return the original.
return typ
types.add(item.fallback)
# If there is only one enum type seen, return that otherwise return the original.
return types.pop() if len(types) == 1 else typ
def transform_into_proper_attr_type(ctx: AttributeContext) -> MypyType:
"""
A `get_attribute_hook` to make `.choices` and `.values` optional if `__empty__` is defined.
When the `__empty__` label is specified, the `choices` and `values` properties can return a
blank choice/value. This hook will amend the type returned by those properties.
"""
if isinstance(ctx.context, MemberExpr):
expr = ctx.context.expr
name = ctx.context.name
elif isinstance(ctx.context, SuperExpr):
expr = ctx.context
name = ctx.context.name
else:
ctx.api.fail("Unable to resolve type of property", ctx.context)
return AnyType(TypeOfAny.from_error)
node: TypeInfo | None = None
if isinstance(expr, MemberExpr | NameExpr):
if isinstance(expr.node, TypeInfo):
node = expr.node
elif isinstance(expr.node, TypeAlias):
alias = get_proper_type(expr.node.target)
if isinstance(alias, Instance):
node = alias.type
elif isinstance(expr, SuperExpr):
node = expr.info
_node_type: ProperType | None = None
if node is None:
_node_type = get_proper_type(ctx.api.get_expression_type(expr))
if isinstance(_node_type, UnionType):
# If this is a union of enum literals, check if they're all of the same enum type and
# use that type instead. This situation often occurs where there is comparison to an
# enum member in a branch.
_node_type = get_proper_type(_get_enum_type_from_union_of_literals(_node_type))
if isinstance(_node_type, LiteralType) and _node_type.is_enum_literal():
_node_type = _node_type.fallback
if isinstance(_node_type, TypeType):
_node_type = _node_type.item
if isinstance(_node_type, TypeVarType):
_node_type = get_proper_type(_node_type.upper_bound)
if isinstance(_node_type, Instance):
node = _node_type.type
if isinstance(_node_type, Overloaded) and _node_type.is_type_obj():
node = _node_type.type_object()
if node is None:
if isinstance(_node_type, UnionType):
# Suppress the error for a known case where there are multiple base choices types in a
# union. In theory this is something that could be handled by extracting all of the
# base types and making the following code consider all of these types, but that's
# quite a bit of effort.
return ctx.default_attr_type
ctx.api.fail(f"Unable to resolve type of {name} property", ctx.context)
return AnyType(TypeOfAny.from_error)
default_attr_type = get_proper_type(ctx.default_attr_type)
if not node.is_enum or not node.has_base(fullnames.CHOICES_CLASS_FULLNAME):
return default_attr_type
# Enums with more than one base will treat the first base as the mixed-in type.
base_type = node.bases[0] if len(node.bases) > 1 else None
# When `__empty__` is defined, the `.choices` and `.values` properties will include `None` for
# the blank choice which is labelled by the value of `__empty__`.
empty_label = node.get("__empty__")
# When `__empty__` is not a lazy string and the labels on all members are not lazy strings, the
# label can be simplified to only be a simple string type. This keeps the benefits of accurate
# typing when the lazy labels are being used, but reduces the pain of having to manage a union
# of a simple and lazy string type where it's not necessary.
label_laziness = _label_laziness(node)
if (
name == "choices"
and isinstance(default_attr_type, Instance)
and default_attr_type.type.fullname == "builtins.list"
and len(default_attr_type.args) == 1
):
choice_arg = get_proper_type(default_attr_type.args[0])
if isinstance(choice_arg, TupleType) and choice_arg.length() == 2:
value_arg, label_arg = choice_arg.items
label_arg = get_proper_type(label_arg)
value_arg = get_proper_type(value_arg)
new_label_arg = _try_replace_label(label_arg, label_laziness)
new_value_arg = _try_replace_value(value_arg, base_type, empty_label is not None)
if new_label_arg is not label_arg or new_value_arg is not value_arg:
new_choice_arg = choice_arg.copy_modified(items=[new_value_arg, new_label_arg])
return default_attr_type.copy_modified(args=[new_choice_arg])
elif (
name == "labels"
and isinstance(default_attr_type, Instance)
and default_attr_type.type.fullname == "builtins.list"
and len(default_attr_type.args) == 1
):
label_arg = get_proper_type(default_attr_type.args[0])
new_label_arg = _try_replace_label(label_arg, label_laziness)
if new_label_arg is not label_arg:
return default_attr_type.copy_modified(args=[new_label_arg])
elif (
name == "values"
and isinstance(default_attr_type, Instance)
and default_attr_type.type.fullname == "builtins.list"
and len(default_attr_type.args) == 1
):
value_arg = get_proper_type(default_attr_type.args[0])
new_value_arg = _try_replace_value(value_arg, base_type, empty_label is not None)
if new_value_arg is not value_arg:
return default_attr_type.copy_modified(args=[new_value_arg])
elif name == "label":
return _try_replace_label(default_attr_type, label_laziness)
elif name == "__empty__" and empty_label is not None:
return _try_replace_label(default_attr_type, _LabelLaziness.make(_is_lazy_string(empty_label.type)))
elif name == "value":
# Pass in `False` because `.value` will never return `None`.
return _try_replace_value(default_attr_type, base_type, False)
return default_attr_type
typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/fields.py 0000664 0000000 0000000 00000025223 15260643574 0027314 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING, NamedTuple, cast
from django.core.exceptions import FieldDoesNotExist
from django.db.models.fields import AutoField
from django.db.models.fields.related import RelatedField
from mypy.nodes import AssignmentStmt, NameExpr, TypeInfo
from mypy.types import AnyType, Instance, NoneType, ProperType, TypeOfAny, UninhabitedType, UnionType, get_proper_type
from mypy.types import Type as MypyType
from mypy_django_plugin.exceptions import UnregisteredModelError
from mypy_django_plugin.lib import fullnames, helpers
from mypy_django_plugin.transformers import manytomany
if TYPE_CHECKING:
from django.db.models.options import _AnyField
from mypy.plugin import FunctionContext
from mypy_django_plugin.django.context import DjangoContext
def _get_current_field_from_assignment(ctx: FunctionContext, django_context: DjangoContext) -> _AnyField | None:
outer_model_info = helpers.get_typechecker_api(ctx).scope.active_class()
if outer_model_info is None or not helpers.is_model_type(outer_model_info):
return None
field_name = None
for stmt in outer_model_info.defn.defs.body:
if isinstance(stmt, AssignmentStmt):
if stmt.rvalue == ctx.context:
if not isinstance(stmt.lvalues[0], NameExpr):
return None
field_name = stmt.lvalues[0].name
break
if field_name is None:
return None
model_cls = django_context.get_model_class_by_fullname(outer_model_info.fullname)
if model_cls is None:
return None
try:
return model_cls._meta.get_field(field_name)
except FieldDoesNotExist:
return None
def reparametrize_related_field_type(related_field_type: Instance, set_type: MypyType, get_type: MypyType) -> Instance:
args = [
helpers.convert_any_to_type(related_field_type.args[0], set_type),
helpers.convert_any_to_type(related_field_type.args[1], get_type),
]
return related_field_type.copy_modified(args=args)
def fill_descriptor_types_for_related_field(ctx: FunctionContext, django_context: DjangoContext) -> MypyType:
current_field = _get_current_field_from_assignment(ctx, django_context)
if current_field is None:
return AnyType(TypeOfAny.from_error)
assert isinstance(current_field, RelatedField)
try:
related_model_cls = django_context.get_field_related_model_cls(current_field)
except UnregisteredModelError:
return AnyType(TypeOfAny.from_error)
default_related_field_type = set_descriptor_types_for_field(ctx)
# self reference with abstract=True on the model where ForeignKey is defined
current_model_cls = current_field.model
if current_model_cls._meta.abstract and current_model_cls == related_model_cls:
# for all derived non-abstract classes, set variable with this name to
# __get__/__set__ of ForeignKey of derived model
for model_cls in django_context.all_registered_model_classes:
if issubclass(model_cls, current_model_cls) and not model_cls._meta.abstract:
derived_model_info = helpers.lookup_class_typeinfo(helpers.get_typechecker_api(ctx), model_cls)
if derived_model_info is not None:
fk_ref_type = Instance(derived_model_info, [])
derived_fk_type = reparametrize_related_field_type(
default_related_field_type, set_type=fk_ref_type, get_type=fk_ref_type
)
helpers.add_new_sym_for_info(derived_model_info, name=current_field.name, sym_type=derived_fk_type)
related_model = related_model_cls
related_model_to_set = related_model_cls
if related_model_to_set._meta.proxy_for_model is not None:
related_model_to_set = related_model_to_set._meta.proxy_for_model
typechecker_api = helpers.get_typechecker_api(ctx)
related_model_info = helpers.lookup_class_typeinfo(typechecker_api, related_model)
related_model_type: ProperType
if related_model_info is None:
# maybe no type stub
related_model_type = AnyType(TypeOfAny.unannotated)
else:
related_model_type = Instance(related_model_info, [])
related_model_to_set_info = helpers.lookup_class_typeinfo(typechecker_api, related_model_to_set)
related_model_to_set_type: ProperType
if related_model_to_set_info is None:
# maybe no type stub
related_model_to_set_type = AnyType(TypeOfAny.unannotated)
else:
related_model_to_set_type = Instance(related_model_to_set_info, [])
# replace Any with referred_to_type
return reparametrize_related_field_type(
default_related_field_type, set_type=related_model_to_set_type, get_type=related_model_type
)
class FieldDescriptorTypes(NamedTuple):
set: MypyType
get: MypyType
def get_field_descriptor_types(
field_info: TypeInfo, *, is_set_nullable: bool, is_get_nullable: bool
) -> FieldDescriptorTypes:
set_type = helpers.get_private_descriptor_type(field_info, "_pyi_private_set_type", is_nullable=is_set_nullable)
get_type = helpers.get_private_descriptor_type(field_info, "_pyi_private_get_type", is_nullable=is_get_nullable)
return FieldDescriptorTypes(set=set_type, get=get_type)
def set_descriptor_types_for_field_callback(ctx: FunctionContext, django_context: DjangoContext) -> MypyType:
current_field = _get_current_field_from_assignment(ctx, django_context)
if current_field is not None:
if isinstance(current_field, AutoField):
return set_descriptor_types_for_field(ctx, is_set_nullable=True)
return set_descriptor_types_for_field(ctx)
def set_descriptor_types_for_field(
ctx: FunctionContext, *, is_set_nullable: bool = False, is_get_nullable: bool = False
) -> Instance:
default_return_type = cast("Instance", ctx.default_return_type)
is_nullable = helpers.get_bool_call_argument_by_name(ctx, "null", default=False)
is_primary_key = helpers.get_bool_call_argument_by_name(ctx, "primary_key", default=False)
# Allow setting field value to `None` when a field is primary key and has a default that can produce a value
default_expr = helpers.get_call_argument_by_name(ctx, "default")
if default_expr is not None:
is_set_nullable = is_primary_key
set_type, get_type = get_field_descriptor_types(
default_return_type.type,
is_set_nullable=is_set_nullable or is_nullable,
is_get_nullable=is_get_nullable or is_nullable,
)
# reconcile set and get types with the base field class
mapped_types = helpers.get_field_type_args(default_return_type)
assert mapped_types is not None
# bail if either mapped set or get type is Never
if not (isinstance(mapped_types.set, UninhabitedType) or isinstance(mapped_types.get, UninhabitedType)):
# always replace set_type and get_type with (non-Any) mapped types
set_type = helpers.convert_any_to_type(mapped_types.set, set_type)
get_type = get_proper_type(helpers.convert_any_to_type(mapped_types.get, get_type))
# the get_type must be optional if the field is nullable
if (is_get_nullable or is_nullable) and not (
isinstance(get_type, NoneType) or helpers.is_optional(get_type) or isinstance(get_type, AnyType)
):
ctx.api.fail(
f"{default_return_type.type.name} is nullable but its generic get type parameter is not optional",
ctx.context,
)
return default_return_type.copy_modified(args=[set_type, get_type])
def determine_type_of_array_field(ctx: FunctionContext, django_context: DjangoContext) -> MypyType:
default_return_type = set_descriptor_types_for_field(ctx)
base_field_arg_type = get_proper_type(helpers.get_call_argument_type_by_name(ctx, "base_field"))
if not base_field_arg_type or not isinstance(base_field_arg_type, Instance):
return default_return_type
def drop_combinable(_type: MypyType) -> MypyType | None:
_type = get_proper_type(_type)
if isinstance(_type, Instance) and _type.type.has_base(fullnames.COMBINABLE_EXPRESSION_FULLNAME):
return None
if isinstance(_type, UnionType):
items_without_combinable = []
for item in _type.items:
reduced = drop_combinable(item)
if reduced is not None:
items_without_combinable.append(reduced)
if len(items_without_combinable) > 1:
return UnionType(
items_without_combinable,
line=_type.line,
column=_type.column,
is_evaluated=_type.is_evaluated,
uses_pep604_syntax=_type.uses_pep604_syntax,
)
if len(items_without_combinable) == 1:
return items_without_combinable[0]
return None
return _type
# Both base_field and return type should derive from Field and thus expect 2 arguments
assert len(base_field_arg_type.args) == len(default_return_type.args) == 2
args = []
for new_type, default_arg in zip(base_field_arg_type.args, default_return_type.args, strict=False):
# Drop any base_field Combinable type
reduced = drop_combinable(new_type)
if reduced is None:
ctx.api.fail(
f"Can't have ArrayField expecting {fullnames.COMBINABLE_EXPRESSION_FULLNAME!r} as data type",
ctx.context,
)
else:
new_type = reduced
args.append(helpers.convert_any_to_type(default_arg, new_type))
return default_return_type.copy_modified(args=args)
def transform_into_proper_return_type(ctx: FunctionContext, django_context: DjangoContext) -> MypyType:
default_return_type = get_proper_type(ctx.default_return_type)
assert isinstance(default_return_type, Instance)
outer_model_info = helpers.get_typechecker_api(ctx).scope.active_class()
if outer_model_info is None or not helpers.is_model_type(outer_model_info):
return set_descriptor_types_for_field(ctx)
assert isinstance(outer_model_info, TypeInfo)
if default_return_type.type.has_base(fullnames.MANYTOMANY_FIELD_FULLNAME):
return manytomany.fill_model_args_for_many_to_many_field(
ctx=ctx, model_info=outer_model_info, django_context=django_context
)
if helpers.has_any_of_bases(default_return_type.type, fullnames.RELATED_FIELDS_CLASSES):
return fill_descriptor_types_for_related_field(ctx, django_context)
if default_return_type.type.has_base(fullnames.ARRAY_FIELD_FULLNAME):
return determine_type_of_array_field(ctx, django_context)
return set_descriptor_types_for_field_callback(ctx, django_context)
typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/forms.py 0000664 0000000 0000000 00000000733 15260643574 0027173 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING
from mypy_django_plugin.lib import helpers
if TYPE_CHECKING:
from mypy.plugin import ClassDefContext
def make_meta_nested_class_inherit_from_any(ctx: ClassDefContext) -> None:
meta_node = helpers.get_nested_meta_node_for_current_class(ctx.cls.info)
if meta_node is None:
if not ctx.api.final_iteration:
ctx.api.defer()
else:
meta_node.fallback_to_any = True
typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/functional.py 0000664 0000000 0000000 00000002473 15260643574 0030212 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING
from mypy.errorcodes import ATTR_DEFINED
from mypy.nodes import CallExpr, MemberExpr
from mypy.types import AnyType, Instance, TypeOfAny
from mypy.types import Type as MypyType
from mypy_django_plugin.lib import helpers
if TYPE_CHECKING:
from mypy.plugin import AttributeContext
def resolve_str_promise_attribute(ctx: AttributeContext) -> MypyType:
if isinstance(ctx.context, MemberExpr):
method_name = ctx.context.name
elif isinstance(ctx.context, CallExpr) and isinstance(ctx.context.callee, MemberExpr):
method_name = ctx.context.callee.name
else:
ctx.api.fail(f'Cannot resolve the attribute of "{ctx.type}"', ctx.context, code=ATTR_DEFINED)
return AnyType(TypeOfAny.from_error)
str_info = helpers.lookup_fully_qualified_typeinfo(helpers.get_typechecker_api(ctx), "builtins.str")
assert str_info is not None
str_type = Instance(str_info, [])
return helpers.analyze_member_access(
method_name,
str_type,
ctx.context,
is_lvalue=False,
is_super=False,
# operators are already handled with magic methods defined in the stubs for _StrPromise
is_operator=False,
original_type=ctx.type,
chk=helpers.get_typechecker_api(ctx),
)
typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/init_create.py 0000664 0000000 0000000 00000010126 15260643574 0030330 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING
from mypy.errorcodes import CALL_ARG
from mypy.types import Instance, get_proper_type
from mypy.types import Type as MypyType
from mypy_django_plugin.lib import helpers
if TYPE_CHECKING:
from django.db.models.base import Model
from mypy.plugin import FunctionContext, MethodContext
from mypy_django_plugin.django.context import DjangoContext
def get_actual_types(ctx: MethodContext | FunctionContext, expected_keys: list[str]) -> list[tuple[str, MypyType]]:
actual_types = []
# positionals
for pos, (actual_name, actual_type) in enumerate(zip(ctx.arg_names[0], ctx.arg_types[0], strict=False)):
if actual_name is None:
if ctx.callee_arg_names[0] == "kwargs" or pos >= len(expected_keys):
# unpacked dict as kwargs is not supported
continue
actual_name = expected_keys[pos]
actual_types.append((actual_name, actual_type))
# kwargs
if len(ctx.callee_arg_names) > 1:
for actual_name, actual_type in zip(ctx.arg_names[1], ctx.arg_types[1], strict=False):
if actual_name is None:
# unpacked dict as kwargs is not supported
continue
actual_types.append((actual_name, actual_type))
return actual_types
def typecheck_model_method(
ctx: FunctionContext | MethodContext,
django_context: DjangoContext,
model_cls: type[Model],
method: str,
) -> None:
"""Type-checks positional and keyword arguments for Model methods like __init__(), create(), and acreate()."""
typechecker_api = helpers.get_typechecker_api(ctx)
expected_types = django_context.get_expected_types(typechecker_api, model_cls, method=method)
expected_keys = [key for key in expected_types.keys() if key != "pk"]
min_arg_count = helpers.get_min_argument_count(ctx)
for actual_name, actual_type in get_actual_types(ctx, expected_keys):
if actual_name not in expected_types:
ctx.api.fail(f'Unexpected attribute "{actual_name}" for model "{model_cls.__name__}"', ctx.context)
min_arg_count -= 1 # To avoid double error (Unexpected attribute + too many arguments)
continue
helpers.check_types_compatible(
ctx,
expected_type=expected_types[actual_name],
actual_type=actual_type,
error_message=f'Incompatible type for "{actual_name}" of "{model_cls.__name__}"',
)
if min_arg_count > len(expected_keys):
ctx.api.fail(f'Too many arguments for "{model_cls.__name__}"', ctx.context, code=CALL_ARG)
def typecheck_model_init(ctx: FunctionContext, django_context: DjangoContext) -> MypyType:
default_return_type = get_proper_type(ctx.default_return_type)
if (
isinstance(default_return_type, Instance)
and (model_cls := django_context.get_model_class_by_fullname(default_return_type.type.fullname)) is not None
):
typecheck_model_method(ctx, django_context, model_cls, "__init__")
return ctx.default_return_type
def typecheck_model_create(ctx: MethodContext, django_context: DjangoContext) -> MypyType:
default_return_type = get_proper_type(ctx.default_return_type)
if (
isinstance(default_return_type, Instance)
and (model_cls := django_context.get_model_class_by_fullname(default_return_type.type.fullname)) is not None
):
typecheck_model_method(ctx, django_context, model_cls, "create")
return ctx.default_return_type
def typecheck_model_acreate(ctx: MethodContext, django_context: DjangoContext) -> MypyType:
default_return_type = get_proper_type(ctx.default_return_type)
if (
isinstance(default_return_type, Instance)
# default_return_type at this point should be of type Coroutine[Any, Any, ]
and isinstance((model := get_proper_type(default_return_type.args[-1])), Instance)
and (model_cls := django_context.get_model_class_by_fullname(model.type.fullname)) is not None
):
typecheck_model_method(ctx, django_context, model_cls, "acreate")
return ctx.default_return_type
typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/managers.py 0000664 0000000 0000000 00000061420 15260643574 0027642 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING, Final
from mypy.nodes import (
GDEF,
CallExpr,
Decorator,
FuncBase,
FuncDef,
MemberExpr,
Node,
OverloadedFuncDef,
PlaceholderNode,
RefExpr,
StrExpr,
SymbolTableNode,
TypeInfo,
)
from mypy.plugins.common import add_method_to_class
from mypy.semanal_shared import has_placeholder
from mypy.subtypes import find_member
from mypy.types import AnyType, CallableType, Instance, ProperType, TypeOfAny, TypeType, UnionType, get_proper_type
from mypy.types import Type as MypyType
from mypy_django_plugin.lib import fullnames, helpers
if TYPE_CHECKING:
from mypy.checker import TypeChecker
from mypy.plugin import AttributeContext, ClassDefContext, DynamicClassDefContext
from mypy.semanal import SemanticAnalyzer
MANAGER_METHODS_RETURNING_QUERYSET: Final = frozenset(
(
"alias",
"all",
"annotate",
"complex_filter",
"defer",
"difference",
"distinct",
"exclude",
"extra",
"filter",
"intersection",
"none",
"only",
"order_by",
"prefetch_related",
"reverse",
"select_for_update",
"select_related",
"union",
"using",
)
)
def get_method_type_from_dynamic_manager(
api: TypeChecker, method_name: str, manager_instance: Instance
) -> ProperType | None:
"""
Attempt to resolve a method on a manager that was built from '.from_queryset'
"""
manager_type_info = manager_instance.type.get_containing_type_info(method_name)
if (
manager_type_info is None
or "django" not in manager_type_info.metadata
or "from_queryset_manager" not in manager_type_info.metadata["django"]
):
# Manager isn't dynamically added
return None
queryset_fullname = manager_type_info.metadata["django"]["from_queryset_manager"]
assert isinstance(queryset_fullname, str)
queryset_info = helpers.lookup_fully_qualified_typeinfo(api, queryset_fullname)
assert queryset_info is not None
manager_model = get_proper_type(find_member("model", manager_instance, manager_instance))
assert isinstance(manager_model, TypeType), manager_model
# Resolve the method as if it was accessed on the queryset, parametrized with the manager's model.
queryset_instance = Instance(queryset_info, (manager_model.item,) * len(queryset_info.type_vars))
method_type = find_member(method_name, queryset_instance, queryset_instance)
# For methods on the manager that return a queryset we need to override the
# return type to be the actual queryset class, not the base QuerySet that's
# used by the typing stubs.
if method_name in MANAGER_METHODS_RETURNING_QUERYSET and isinstance(
(method_proper_type := get_proper_type(method_type)), CallableType
):
method_type = method_proper_type.copy_modified(ret_type=queryset_instance)
return get_proper_type(method_type) if method_type is not None else None
def _get_funcdef_type(definition: Node | None) -> ProperType | None:
if isinstance(definition, FuncBase):
return definition.type
if isinstance(definition, Decorator):
return definition.func.type
return None
def resolve_manager_method_from_instance(instance: Instance, method_name: str, ctx: AttributeContext) -> MypyType:
api = helpers.get_typechecker_api(ctx)
method_type = get_method_type_from_dynamic_manager(api, method_name, instance)
return method_type if method_type is not None else ctx.default_attr_type
def resolve_manager_method(ctx: AttributeContext) -> MypyType:
"""
A 'get_attribute_hook' that is intended to be invoked whenever the TypeChecker encounters
an attribute on a class that has 'django.db.models.BaseManager' as a base.
"""
# Skip (method) type that is currently something other than Any of type `implementation_artifact`
default_attr_type = get_proper_type(ctx.default_attr_type)
if not isinstance(default_attr_type, AnyType):
return ctx.default_attr_type
if default_attr_type.type_of_any != TypeOfAny.implementation_artifact:
return ctx.default_attr_type
# (Current state is:) We wouldn't end up here when looking up a method from a custom _manager_.
# That's why we only attempt to lookup the method for either a dynamically added or reverse manager.
if isinstance(ctx.context, MemberExpr):
method_name = ctx.context.name
elif isinstance(ctx.context, CallExpr) and isinstance(ctx.context.callee, MemberExpr):
method_name = ctx.context.callee.name
else:
ctx.api.fail("Unable to resolve return type of queryset/manager method", ctx.context)
return AnyType(TypeOfAny.from_error)
if isinstance(ctx.type, Instance):
return resolve_manager_method_from_instance(instance=ctx.type, method_name=method_name, ctx=ctx)
if isinstance(ctx.type, UnionType) and all(isinstance(get_proper_type(item), Instance) for item in ctx.type.items):
resolved = tuple(
resolve_manager_method_from_instance(instance=instance, method_name=method_name, ctx=ctx)
for item in ctx.type.items
if isinstance((instance := get_proper_type(item)), Instance)
)
return UnionType(resolved)
ctx.api.fail(f'Unable to resolve return type of queryset/manager method "{method_name}"', ctx.context)
return AnyType(TypeOfAny.from_error)
def create_new_manager_class_from_from_queryset_method(ctx: DynamicClassDefContext) -> None:
"""
Insert a new manager class node for a: ' = .from_queryset()'.
When the assignment expression lives at module level.
class level cases are resolved in `AddManagers.try_create_manager_from_from_queryset`
"""
semanal_api = helpers.get_semanal_api(ctx)
# TODO: Emit an error when called in a class scope
if semanal_api.is_class_scope():
return
# Don't redeclare the manager class if we've already defined it.
manager_sym = semanal_api.lookup_current_scope(ctx.name)
if manager_sym and isinstance(manager_sym.node, TypeInfo):
# This is just a deferral run where our work is already finished
return
new_manager_info = create_manager_info_from_from_queryset_call(semanal_api, ctx.call, ctx.name)
if new_manager_info is None:
if not ctx.api.final_iteration:
# Only add PlaceholderNode if it doesn't already exist to prevent
# infinite semantic analysis iterations (fixes #2373)
if not (manager_sym and isinstance(manager_sym.node, PlaceholderNode)):
# XXX: hack for python/mypy#17402
ph = PlaceholderNode(ctx.api.qualified_name(ctx.name), ctx.call, ctx.call.line, becomes_typeinfo=True)
ctx.api.add_symbol_table_node(ctx.name, SymbolTableNode(GDEF, ph))
ctx.api.defer()
return
def register_dynamically_created_manager(fullname: str, manager_name: str, manager_base: TypeInfo) -> None:
manager_base.metadata.setdefault("from_queryset_managers", {})
# The `__module__` value of the manager type created by Django's
# `.from_queryset` is `django.db.models.manager`. But we put new type(s) in the
# module currently being processed, so we'll map those together through metadata.
runtime_fullname = ".".join(["django.db.models.manager", manager_name])
manager_base.metadata["from_queryset_managers"][runtime_fullname] = fullname
def create_manager_info_from_from_queryset_call(
api: SemanticAnalyzer, call_expr: CallExpr, name: str | None = None
) -> TypeInfo | None:
"""
Extract manager and queryset TypeInfo from a from_queryset call.
"""
if (
# Check that this is a from_queryset call on a manager subclass
not isinstance(call_expr.callee, MemberExpr)
or not isinstance(call_expr.callee.expr, RefExpr)
or not isinstance(call_expr.callee.expr.node, TypeInfo)
or not call_expr.callee.expr.node.has_base(fullnames.BASE_MANAGER_CLASS_FULLNAME)
or not call_expr.callee.name == "from_queryset"
# Check that the call has one or two arguments and that the first is a
# QuerySet subclass
or not 1 <= len(call_expr.args) <= 2
or not isinstance(call_expr.args[0], RefExpr)
or not isinstance(call_expr.args[0].node, TypeInfo)
or not call_expr.args[0].node.has_base(fullnames.QUERYSET_CLASS_FULLNAME)
):
return None
base_manager_info, queryset_info = call_expr.callee.expr.node, call_expr.args[0].node
if queryset_info.fullname is None: # type: ignore[comparison-overlap]
# In some cases, due to the way the semantic analyzer works, only
# passed_queryset.name is available. But it should be analyzed again,
# so this isn't a problem.
return None # type: ignore[unreachable]
if len(call_expr.args) == 2 and isinstance(call_expr.args[1], StrExpr):
manager_name = call_expr.args[1].value
else:
manager_name = f"{base_manager_info.name}From{queryset_info.name}"
# Always look in global scope, as that's where we'll declare dynamic manager classes
manager_sym = api.globals.get(manager_name)
if (
manager_sym is not None
and isinstance(manager_sym.node, TypeInfo)
and manager_sym.node.has_base(base_manager_info.fullname)
and manager_sym.node.metadata.get("django", {}).get("from_queryset_manager") == queryset_info.fullname
):
# Reuse an identical, already generated, manager
new_manager_info = manager_sym.node
else:
# Create a new `TypeInfo` instance for the manager type
try:
new_manager_info = create_manager_class(
api=api,
base_manager_info=base_manager_info,
name=manager_name,
line=call_expr.line,
with_unique_name=name is not None and name != manager_name,
)
except helpers.IncompleteDefnException:
return None
populate_manager_from_queryset(new_manager_info, queryset_info)
register_dynamically_created_manager(
fullname=new_manager_info.fullname,
manager_name=manager_name,
manager_base=base_manager_info,
)
# Add the new manager to the current module
# TODO: use proper SemanticAnalyzer API for that.
module = api.modules[api.cur_mod_id]
if name is not None and name != new_manager_info.name:
# Unless names are equal, there's 2 symbol names that needs the manager info
module.names[name] = SymbolTableNode(GDEF, new_manager_info, plugin_generated=True)
module.names[new_manager_info.name] = SymbolTableNode(GDEF, new_manager_info, plugin_generated=True)
return new_manager_info
def create_manager_class(
api: SemanticAnalyzer, base_manager_info: TypeInfo, name: str, line: int, with_unique_name: bool
) -> TypeInfo:
# If any of the type vars are undefined we need to defer. This is handled by the caller
if any(has_placeholder(type_var) for type_var in base_manager_info.defn.type_vars):
raise helpers.IncompleteDefnException
return helpers.build_reparametrized_subclass(
api.modules[api.cur_mod_id], base_manager_info, name, unique_name=with_unique_name, line=line
)
def populate_manager_from_queryset(manager_info: TypeInfo, queryset_info: TypeInfo) -> None:
"""
Add methods from the QuerySet class to the manager.
"""
# Stash the queryset fullname which was passed to .from_queryset So that
# our 'resolve_manager_method' attribute hook can fetch the method from
# that QuerySet class
django_metadata = helpers.get_django_metadata(manager_info)
django_metadata["from_queryset_manager"] = queryset_info.fullname
# We collect and mark up all methods before django.db.models.query.QuerySet as class members
for class_mro_info in queryset_info.mro:
if class_mro_info.fullname == fullnames.QUERYSET_CLASS_FULLNAME:
break
for name, sym in class_mro_info.names.items():
if not isinstance(sym.node, FuncDef | OverloadedFuncDef | Decorator):
continue
# private, magic methods are not copied
# https://github.com/django/django/blob/5.0.4/django/db/models/manager.py#L101
if name.startswith("_"):
continue
# Insert the queryset method name as a class member. Note that the type of
# the method is set as Any. Figuring out the type is the job of the
# 'resolve_manager_method' attribute hook, which comes later.
#
# class BaseManagerFromMyQuerySet(BaseManager):
# queryset_method: Any = ...
#
helpers.add_new_sym_for_info(
manager_info,
name=name,
sym_type=AnyType(TypeOfAny.implementation_artifact),
)
# For methods on BaseManager that return a queryset we need to update
# the return type to be the actual queryset subclass used. This is done
# by adding the methods as attributes with type Any to the manager
# class. The actual type of these methods are resolved in
# resolve_manager_method.
for method_name in MANAGER_METHODS_RETURNING_QUERYSET:
helpers.add_new_sym_for_info(
manager_info,
name=method_name,
sym_type=AnyType(TypeOfAny.implementation_artifact),
)
def _get_or_create_manager_class_for_queryset(
semanal_api: SemanticAnalyzer,
queryset_info: TypeInfo,
*,
base_manager_info: TypeInfo,
runtime_manager_base: TypeInfo,
) -> TypeInfo:
"""Get or create the generated manager for `.as_manager()`.
A new manager is populated from the queryset, registered, and inserted into the
module. It subclasses `base_manager_info` but is named and registered after
`runtime_manager_base` — the base Django subclasses at runtime.
Raises `IncompleteDefnException` to defer.
"""
name = f"{runtime_manager_base.name}From{queryset_info.name}"
current_module = semanal_api.modules[semanal_api.cur_mod_id]
existing_sym = current_module.names.get(name)
if (
existing_sym is not None
and isinstance(existing_sym.node, TypeInfo)
and existing_sym.node.has_base(fullnames.MANAGER_CLASS_FULLNAME)
and existing_sym.node.metadata.get("django", {}).get("from_queryset_manager") == queryset_info.fullname
):
# Reuse an identical, already generated, manager
new_manager_info = existing_sym.node
else:
new_manager_info = create_manager_class(
api=semanal_api,
base_manager_info=base_manager_info,
name=name,
line=queryset_info.line,
with_unique_name=True,
)
populate_manager_from_queryset(new_manager_info, queryset_info)
register_dynamically_created_manager(
fullname=new_manager_info.fullname,
manager_name=name,
manager_base=runtime_manager_base,
)
# Insert at module level, keyed by the manager's unique `name` to sidestep
# collisions with other module-level objects.
current_module.names[new_manager_info.name] = SymbolTableNode(GDEF, new_manager_info, plugin_generated=True)
return new_manager_info
def add_as_manager_to_queryset_class(ctx: ClassDefContext) -> None:
"""
Insert a new manager class node for a: ' = .as_manager()'.
Similar to `create_manager_info_from_from_queryset_call`
"""
semanal_api = helpers.get_semanal_api(ctx)
def _defer() -> None:
if not semanal_api.final_iteration:
semanal_api.defer()
queryset_info = semanal_api.type
if queryset_info is None:
return _defer()
# If any of the queryset's type vars have unresolved bounds (placeholders),
# defer to avoid generating methods with unresolved types that crash mypy.
if any(has_placeholder(tv) for tv in queryset_info.defn.type_vars):
return _defer()
existing_as_manager = queryset_info.names.get("as_manager")
if existing_as_manager is not None and existing_as_manager.plugin_generated:
# We generated `as_manager` on a previous pass; nothing left to do.
return
# If `as_manager` is still present, the user declared it (ours returned above).
# Track it so we generate the manager but don't overwrite their method below.
user_defined_as_manager = existing_as_manager is not None
base_as_manager = queryset_info.get("as_manager")
if base_as_manager is None:
return
manager_sym = semanal_api.lookup_fully_qualified_or_none(fullnames.MANAGER_CLASS_FULLNAME)
if manager_sym is None or not isinstance(manager_sym.node, TypeInfo):
return _defer()
manager_base = manager_sym.node
# The generated manager subclasses `base_manager_info`; `runtime_manager_base` is the
# base Django uses at runtime, which drives the generated name (see below).
base_manager_info = manager_base
runtime_manager_base = manager_base
if base_as_manager.fullname != f"{fullnames.QUERYSET_CLASS_FULLNAME}.as_manager":
# `as_manager` is overridden (by a parent queryset's generated method or a
# user override); use its return type as the manager base.
base_as_manager_type = _get_funcdef_type(base_as_manager.node)
if not isinstance(base_as_manager_type, CallableType):
return
# A user override's return annotation may still be unanalyzed here, so
# resolve it explicitly (a no-op if already analyzed); defer if incomplete.
# Suppress resolution errors: a not-yet-analyzed cross-module override may
# reference names private to its defining module — bail out, don't report.
with semanal_api.msg.filter_errors() as resolution_errors:
base_as_manager_ret_type = semanal_api.anal_type(base_as_manager_type.ret_type)
if resolution_errors.has_new_errors():
return
if base_as_manager_ret_type is None:
return _defer()
base_as_manager_ret_type = get_proper_type(base_as_manager_ret_type)
if not isinstance(base_as_manager_ret_type, Instance):
return
base_manager_info = base_as_manager_ret_type.type
# A real override builds the runtime manager as `.from_queryset(cls)()`,
# which Django names f"{Manager}From{QuerySet}". Match that name and register
# under `` so the model's manager resolves; a generated stub has no
# runtime counterpart and stays on the plain `Manager`.
if not base_as_manager.plugin_generated and base_manager_info.has_base(fullnames.MANAGER_CLASS_FULLNAME):
runtime_manager_base = base_manager_info
try:
new_manager_info = _get_or_create_manager_class_for_queryset(
semanal_api,
queryset_info,
base_manager_info=base_manager_info,
runtime_manager_base=runtime_manager_base,
)
except helpers.IncompleteDefnException:
return _defer()
if user_defined_as_manager:
# Leave the user's own `as_manager` signature intact; the model resolves
# its manager via the registration above, not this method's return type.
return
add_method_to_class(
semanal_api,
ctx.cls,
"as_manager",
args=[],
return_type=Instance(new_manager_info, [AnyType(TypeOfAny.from_omitted_generics)]),
is_classmethod=True,
)
def _is_omitted_generic(arg: MypyType) -> bool:
"""True if ``arg`` is the ``Any`` mypy substitutes for an unparametrized generic."""
proper_arg = get_proper_type(arg)
return isinstance(proper_arg, AnyType) and proper_arg.type_of_any is TypeOfAny.from_omitted_generics
def reparametrize_generic_class(
ctx: ClassDefContext,
base_class_fullname: str,
*,
bind_explicit_args: bool = False,
) -> None:
"""
Add implicit generics to classes that are defined without generic.
When ``bind_explicit_args`` is True, also reparametrize partially or
fully-explicit parametrizations by binding each explicit arg as both
the bound and the PEP 696 default of a synthesized covariant TypeVar.
Note that this does not happen if mypy is run with disallow_any_generics = True,
as not specifying the generic type is then considered an error.
"""
if ctx.api.options.disallow_any_generics:
# Let mypy's own "missing type arguments" error stand rather than silently reparametrize.
return
class_info = ctx.api.lookup_fully_qualified_or_none(ctx.cls.fullname)
if class_info is None or class_info.node is None:
return
assert isinstance(class_info.node, TypeInfo)
if class_info.node.type_vars:
# We've already been here or the class is already declared with generic types
return
parent_class = next(
(base for base in class_info.node.bases if base.type.has_base(base_class_fullname)),
None,
)
if parent_class is None or not parent_class.args:
return
# Bind explicit args only when the direct parent is the canonical base class
is_direct_parent = parent_class.type.fullname == base_class_fullname
if not (bind_explicit_args and is_direct_parent):
if not _is_omitted_generic(parent_class.args[0]):
return
type_vars = list(parent_class.type.defn.type_vars)
else:
type_vars = []
for type_var, parent_type_var in zip(parent_class.type.defn.type_vars, parent_class.args, strict=True):
if _is_omitted_generic(parent_type_var):
# Arg was omitted -- reuse the parent's TypeVar so its existing
# PEP 696 default (e.g. ``_Row = TypeVar(default=_Model)``) is preserved.
type_vars.append(type_var)
else:
# Arg was supplied explicitly -- synthesize a TypeVar bounded by the
# user's arg so the subclass stays effectively concrete in user-facing
# contexts (defaults + bound + covariance) while still being generic
# enough for the plugin to flow annotation row types through.
type_vars.append(
type_var.copy_modified(
id=type_var.id,
upper_bound=parent_type_var,
default=parent_type_var,
)
)
# If we end up with placeholders we need to defer so the placeholders are
# resolved in a future iteration
if any(has_placeholder(type_var) for type_var in type_vars):
if not ctx.api.final_iteration:
ctx.api.defer()
else:
return
parent_class.args = tuple(type_vars)
class_info.node.defn.type_vars = type_vars
class_info.node.add_type_vars()
def reparametrize_any_queryset_hook(ctx: ClassDefContext) -> None:
"""
Add implicit generics to QuerySet subclasses that are defined without generic.
This is required for `.annotate` / `.values` call to update the typevars accordingly.
Eg.
class MyQuerySet(models.QuerySet): ...
is interpreted as:
_Model = TypeVar('_Model', bound=Model, covariant=True)
_Row = TypeVar('_Row', covariant=True, default=_Model)
class MyQuerySet(models.QuerySet[_Model, _Row]): ...
And
class BookQuerySet(models.QuerySet["Book"]): ...
is interpreted as:
_Model = TypeVar('_Model', bound=Book, covariant=True, default=Book)
_Row = TypeVar('_Row', bound=Book, covariant=True, default=Book)
class BookQuerySet(models.QuerySet[_Model, _Row]): ...
Note that this does not happen if mypy is run with disallow_any_generics = True,
as not specifying the generic type is then considered an error.
"""
reparametrize_generic_class(ctx, fullnames.QUERYSET_CLASS_FULLNAME, bind_explicit_args=True)
def reparametrize_any_manager_hook(ctx: ClassDefContext) -> None:
"""
Add implicit generics to manager classes that are defined without generic.
Eg.
class MyManager(models.Manager): ...
is interpreted as:
_T = TypeVar('_T', covariant=True)
class MyManager(models.Manager[_T]): ...
Note that this does not happen if mypy is run with disallow_any_generics = True,
as not specifying the generic type is then considered an error.
"""
reparametrize_generic_class(ctx, fullnames.BASE_MANAGER_CLASS_FULLNAME)
def reparametrize_any_field_hook(ctx: ClassDefContext) -> None:
"""
Add implicit generics to Field subclasses that omit the parent's TypeVars.
Eg.
class HTMLField(models.TextField): ...
is interpreted as:
class HTMLField(models.TextField[_ST_Text, _GT_Text]): ...
Without this, mypy treats `HTMLField` as non-Generic and the set/get args
assigned by the field function hook don't propagate through `__get__`.
"""
reparametrize_generic_class(ctx, fullnames.FIELD_FULLNAME)
typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/manytomany.py 0000664 0000000 0000000 00000016111 15260643574 0030236 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING, NamedTuple
from mypy.nodes import AssignmentStmt, NameExpr, Node, TypeInfo
from mypy.types import AnyType, Instance, ProperType, UninhabitedType, get_proper_type
from mypy.types import Type as MypyType
from mypy_django_plugin.lib import fullnames, helpers
if TYPE_CHECKING:
from mypy.plugin import FunctionContext, MethodContext
from mypy_django_plugin.django.context import DjangoContext
class M2MThrough(NamedTuple):
arg: Node | None
model: ProperType
class M2MTo(NamedTuple):
arg: Node
model: ProperType
self: bool # ManyToManyField('self', ...)
class M2MArguments(NamedTuple):
to: M2MTo
through: M2MThrough | None
def _through_arg_is_unset(m2m_field: Instance) -> bool:
"""Whether the 'through' type argument was left unsolved, or fell back on its 'Any' default."""
if len(m2m_field.args) < 2:
return False
through_arg = get_proper_type(m2m_field.args[1])
return isinstance(through_arg, (UninhabitedType, AnyType))
def fill_model_args_for_many_to_many_field(
*,
ctx: FunctionContext,
model_info: TypeInfo,
django_context: DjangoContext,
) -> MypyType:
default_return_type = get_proper_type(ctx.default_return_type)
if not (
ctx.args
and ctx.args[0]
and isinstance(default_return_type, Instance)
and len(default_return_type.args) >= 2
and (args := get_m2m_arguments(ctx=ctx, model_info=model_info, django_context=django_context))
):
return ctx.default_return_type
default_to_arg = get_proper_type(default_return_type.args[0])
to_arg: MypyType
if isinstance(default_to_arg, UninhabitedType):
to_arg = args.to.model
else:
# Avoid overwriting a decent 'to' argument
to_arg = default_return_type.args[0]
if _through_arg_is_unset(default_return_type):
if helpers.is_abstract_model(model_info):
# Many to many on abstract models doesn't create any implicit, concrete
# through model, so we populate it with the upper bound to avoid error messages
through_arg = default_return_type.type.defn.type_vars[1].upper_bound
elif args.through is None:
through_arg = UninhabitedType()
else:
through_arg = args.through.model
else:
# Avoid overwriting a decent 'through' argument
through_arg = default_return_type.args[1]
return default_return_type.copy_modified(args=[to_arg, through_arg])
def get_m2m_arguments(
*,
ctx: FunctionContext,
model_info: TypeInfo,
django_context: DjangoContext,
) -> M2MArguments | None:
checker = helpers.get_typechecker_api(ctx)
to_arg = ctx.args[0][0]
to_model = helpers.get_model_from_expression(
to_arg, self_model=model_info, api=checker, django_context=django_context
)
if to_model is None:
# 'ManyToManyField()' requires the 'to' argument
return None
to = M2MTo(arg=to_arg, model=to_model, self=to_model.type == model_info)
through = None
if len(ctx.args) > 5 and ctx.args[5]:
# 'ManyToManyField(..., through=)' was called
through_arg = ctx.args[5][0]
through_model = helpers.get_model_from_expression(
through_arg, self_model=model_info, api=checker, django_context=django_context
)
if through_model is not None:
through = M2MThrough(arg=through_arg, model=through_model)
elif not helpers.is_abstract_model(model_info):
# No explicit 'through' argument was provided and model is concrete. We need
# to dig up any generated through model for this 'ManyToManyField()' field
through_arg = None
m2m_throughs = helpers.get_django_metadata(model_info).get("m2m_throughs", {})
if m2m_throughs:
field_name = None
for defn in model_info.defn.defs.body:
if (
isinstance(defn, AssignmentStmt)
and defn.rvalue is ctx.context
and len(defn.lvalues) == 1
and isinstance(defn.lvalues[0], NameExpr)
):
field_name = defn.lvalues[0].name
break
if field_name is not None:
through_model_fullname = m2m_throughs.get(field_name)
if through_model_fullname is not None:
through_model_info = helpers.lookup_fully_qualified_typeinfo(checker, through_model_fullname)
if through_model_info is not None:
through = M2MThrough(arg=through_arg, model=Instance(through_model_info, []))
return M2MArguments(to=to, through=through)
def get_related_manager_and_model(ctx: MethodContext) -> tuple[Instance, Instance, Instance] | None:
"""
Returns a 3-tuple consisting of:
1. A `ManyRelatedManager` instance
2. The first type parameter (_To) instance of 1. when it's a model
3. The second type parameter (_Through) instance of 1. when it's a model
When encountering a `ManyRelatedManager` that has populated its 2 first type
parameters with models. Otherwise `None` is returned.
For example: if given a `ManyRelatedManager[A, B]` where `A` and `B` are models the
following 3-tuple is returned: `(ManyRelatedManager[A, B], A, B)`.
"""
default_return_type = get_proper_type(ctx.default_return_type)
if (
isinstance(default_return_type, Instance)
and default_return_type.type.fullname == fullnames.MANY_RELATED_MANAGER
):
# This is a call to '__get__' overload with a model instance of 'ManyToManyDescriptor'.
# Returning a 'ManyRelatedManager'. Which we want to, just like Django, build from the
# default manager of the related model.
many_related_manager = default_return_type
# Require first and second type argument of 'ManyRelatedManager' to be models
if (
len(many_related_manager.args) >= 2
and isinstance((_To := get_proper_type(many_related_manager.args[0])), Instance)
and helpers.is_model_type(_To.type)
and isinstance((_Through := get_proper_type(many_related_manager.args[1])), Instance)
and helpers.is_model_type(_Through.type)
):
return many_related_manager, _To, _Through
return None
def refine_many_to_many_related_manager(ctx: MethodContext) -> MypyType:
"""
Updates the 'ManyRelatedManager' returned by e.g. 'ManyToManyDescriptor' to be a subclass
of 'ManyRelatedManager' and the related model's default manager.
"""
related_objects = get_related_manager_and_model(ctx)
if related_objects is None:
return ctx.default_return_type
_, related_model_instance, through_model_instance = related_objects
checker = helpers.get_typechecker_api(ctx)
related_manager_info = helpers.get_many_to_many_manager_info(
checker, to=related_model_instance.type, derived_from="_default_manager"
)
if related_manager_info is None:
return ctx.default_return_type
return Instance(related_manager_info, [through_model_instance])
typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/manytoone.py 0000664 0000000 0000000 00000004064 15260643574 0030057 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING
from mypy.types import Instance, get_proper_type
from mypy.types import Type as MypyType
from mypy_django_plugin.lib import fullnames, helpers
if TYPE_CHECKING:
from mypy.plugin import MethodContext
def get_model_of_related_manager(ctx: MethodContext) -> Instance | None:
"""
Returns the type parameter (_To) instance of a `RelatedManager` instance when it's a
model. Otherwise `None` is returned.
For example: if given a `RelatedManager[A]` where `A` is a model then `A` is
returned.
"""
default_return_type = get_proper_type(ctx.default_return_type)
if (
isinstance(default_return_type, Instance)
and default_return_type.type.fullname == fullnames.RELATED_MANAGER_CLASS
):
# This is a call to '__get__' overload with a model instance of
# 'ReverseManyToOneDescriptor'. Returning a 'RelatedManager'. Which we want to,
# just like Django, build from the default manager of the related model.
related_manager = default_return_type
# Require first type argument of 'RelatedManager' to be a model
if (
len(related_manager.args) >= 1
and isinstance((_To := get_proper_type(related_manager.args[0])), Instance)
and helpers.is_model_type(_To.type)
):
return _To
return None
def refine_many_to_one_related_manager(ctx: MethodContext) -> MypyType:
"""
Updates the 'RelatedManager' returned by e.g. 'ReverseManyToOneDescriptor' to be a subclass
of 'RelatedManager' and the related model's default manager.
"""
to_model_instance = get_model_of_related_manager(ctx)
if to_model_instance is None:
return ctx.default_return_type
checker = helpers.get_typechecker_api(ctx)
related_manager_info = helpers.get_reverse_manager_info(
checker, to_model_instance.type, derived_from="_default_manager"
)
if related_manager_info is None:
return ctx.default_return_type
return Instance(related_manager_info, [])
typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/meta.py 0000664 0000000 0000000 00000004367 15260643574 0027002 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING
from django.core.exceptions import FieldDoesNotExist
from mypy.nodes import Var
from mypy.types import AnyType, Instance, TypeOfAny, get_proper_type
from mypy.types import Type as MypyType
from mypy_django_plugin.django.context import DjangoContext, get_field_type_from_model_type_info
from mypy_django_plugin.lib import helpers
from mypy_django_plugin.lib.helpers import DjangoModel
if TYPE_CHECKING:
from mypy.plugin import MethodContext
def return_proper_field_type_from_get_field(ctx: MethodContext, django_context: DjangoContext) -> MypyType:
if not (
isinstance(ctx.type, Instance)
and ctx.type.args
and isinstance(model_type := get_proper_type(ctx.type.args[0]), Instance)
and (field_name_expr := helpers.get_call_argument_by_name(ctx, "field_name")) is not None
and (field_name := helpers.resolve_string_attribute_value(field_name_expr, django_context)) is not None
):
return ctx.default_return_type
field_type = get_field_type_from_model_type_info(model_type.type, field_name)
if field_type is not None:
return field_type
# Fields of a model defined further down the module aren't inferred yet; defer to a later pass.
field_sym = model_type.type.get(field_name)
if field_sym is not None and isinstance(field_sym.node, Var) and not field_sym.node.is_ready:
typechecker_api = helpers.get_typechecker_api(ctx)
# Deferral re-checks the enclosing top-level function, so without one there is nothing to defer.
if typechecker_api.scope.top_level_function() is not None:
typechecker_api.handle_cannot_determine_type(field_name, ctx.context)
return ctx.default_return_type
if (django_model := DjangoModel.from_model_type(model_type, django_context)) is None:
return ctx.default_return_type
try:
field = django_model.cls._meta.get_field(field_name)
if field_info := helpers.lookup_class_typeinfo(helpers.get_typechecker_api(ctx), field.__class__):
return Instance(field_info, [])
except FieldDoesNotExist as e:
ctx.api.fail(str(e), ctx.context)
return AnyType(TypeOfAny.from_error)
return ctx.default_return_type
typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/models.py 0000664 0000000 0000000 00000155020 15260643574 0027330 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from collections import deque
from functools import cached_property
from typing import TYPE_CHECKING, Any, cast
from django.db.models.fields import DateField, DateTimeField, Field
from django.db.models.fields.reverse_related import ForeignObjectRel, ManyToManyRel, OneToOneRel
from mypy.nodes import (
ARG_STAR2,
MDEF,
Argument,
AssignmentStmt,
CallExpr,
Context,
FakeInfo,
NameExpr,
RefExpr,
Statement,
SymbolTableNode,
TypeInfo,
Var,
)
from mypy.plugins import common
from mypy.semanal import SemanticAnalyzer
from mypy.semanal_shared import has_placeholder
from mypy.typeanal import TypeAnalyser
from mypy.types import AnyType, Instance, ProperType, TypedDictType, TypeOfAny, TypeType, TypeVarType, get_proper_type
from mypy.types import Type as MypyType
from typing_extensions import override
from mypy_django_plugin.errorcodes import MANAGER_MISSING
from mypy_django_plugin.exceptions import UnregisteredModelError
from mypy_django_plugin.lib import fullnames, helpers
from mypy_django_plugin.lib.fullnames import ANNOTATIONS_FULLNAME
from mypy_django_plugin.transformers.fields import FieldDescriptorTypes, get_field_descriptor_types
from mypy_django_plugin.transformers.managers import (
MANAGER_METHODS_RETURNING_QUERYSET,
create_manager_info_from_from_queryset_call,
)
from mypy_django_plugin.transformers.manytomany import M2MArguments, M2MThrough, M2MTo
if TYPE_CHECKING:
from collections.abc import Iterable
from django.db.models import Manager, Model
from mypy.checker import TypeChecker
from mypy.nodes import MypyFile
from mypy.plugin import AnalyzeTypeContext, AttributeContext, ClassDefContext
from mypy_django_plugin.config import DjangoPluginConfig
from mypy_django_plugin.django.context import DjangoContext
class ModelClassInitializer:
api: SemanticAnalyzer
def __init__(self, ctx: ClassDefContext, django_context: DjangoContext) -> None:
self.api = cast("SemanticAnalyzer", ctx.api)
self.model_classdef = ctx.cls
self.django_context = django_context
self.ctx = ctx
@property
def is_model_abstract(self) -> bool:
return helpers.is_abstract_model(self.model_classdef.info)
def lookup_typeinfo(self, fullname: str) -> TypeInfo | None:
return helpers.lookup_fully_qualified_typeinfo(self.api, fullname)
def lookup_typeinfo_or_incomplete_defn_error(self, fullname: str) -> TypeInfo:
info = self.lookup_typeinfo(fullname)
if info is None:
raise helpers.IncompleteDefnException(f"No {fullname!r} found")
return info
def lookup_class_typeinfo_or_incomplete_defn_error(self, klass: type) -> TypeInfo:
fullname = helpers.get_class_fullname(klass)
return self.lookup_typeinfo_or_incomplete_defn_error(fullname)
def create_new_var(self, name: str, typ: MypyType) -> Var:
# type=: type of the variable itself
var = Var(name=name, type=typ)
# var.info: type of the object variable is bound to
var.info = self.model_classdef.info
var._fullname = self.model_classdef.info.fullname + "." + name
var.is_initialized_in_class = True
var.is_inferred = True
return var
def add_new_var_to_model_class(
self, name: str, typ: MypyType, *, no_serialize: bool = False, is_classvar: bool = False
) -> None:
helpers.add_new_sym_for_info(
self.model_classdef.info, name=name, sym_type=typ, no_serialize=no_serialize, is_classvar=is_classvar
)
@property
def current_module(self) -> MypyFile:
return self.api.modules[self.model_classdef.info.module_name]
def add_new_class_for_current_module(self, name: str, bases: list[Instance]) -> TypeInfo:
return helpers.add_new_class_for_module(self.current_module, name=name, bases=bases)
def run(self) -> None:
model_cls = self.django_context.get_model_class_by_fullname(self.model_classdef.fullname)
if model_cls is None:
return
self.run_with_model_cls(model_cls)
def get_generated_manager_mappings(self, base_manager_fullname: str) -> dict[str, str]:
base_manager_info = self.lookup_typeinfo(base_manager_fullname)
if base_manager_info is None or "from_queryset_managers" not in base_manager_info.metadata:
return {}
return base_manager_info.metadata["from_queryset_managers"]
def get_generated_manager_info(self, manager_fullname: str, base_manager_fullname: str) -> TypeInfo | None:
generated_managers = self.get_generated_manager_mappings(base_manager_fullname)
real_manager_fullname = generated_managers.get(manager_fullname)
if real_manager_fullname:
return self.lookup_typeinfo(real_manager_fullname)
# Not a generated manager
return None
def get_or_create_manager_with_any_fallback(self) -> TypeInfo | None:
"""
Create a Manager subclass with fallback to Any for unknown attributes
and methods. This is used for unresolved managers, where we don't know
the actual type of the manager.
The created class is reused if multiple unknown managers are encountered.
"""
name = "UnknownManager"
# Check if we've already created a fallback manager class for this
# module, and if so reuse that.
manager_info = self.lookup_typeinfo(f"{self.model_classdef.info.module_name}.{name}")
if manager_info and manager_info.metadata.get("django", {}).get("any_fallback_manager"):
return manager_info
fallback_queryset = self.get_or_create_queryset_with_any_fallback()
if fallback_queryset is None:
return None
base_manager_fullname = fullnames.MANAGER_CLASS_FULLNAME
base_manager_info = self.lookup_typeinfo(base_manager_fullname)
if base_manager_info is None:
return None
manager_info = helpers.build_reparametrized_subclass(
self.current_module, base_manager_info, name, unique_name=True
)
manager_info.fallback_to_any = True
# For methods on BaseManager that return a queryset we need to update
# the return type to be the actual queryset subclass used. This is done
# by adding the methods as attributes with type Any to the manager
# class. The actual type of these methods are resolved in
# resolve_manager_method.
for method_name in MANAGER_METHODS_RETURNING_QUERYSET:
helpers.add_new_sym_for_info(
manager_info, name=method_name, sym_type=AnyType(TypeOfAny.implementation_artifact)
)
manager_info.metadata["django"] = {
"any_fallback_manager": True,
"from_queryset_manager": fallback_queryset.fullname,
}
return manager_info
def get_or_create_queryset_with_any_fallback(self) -> TypeInfo | None:
"""
Create a QuerySet subclass with fallback to Any for unknown attributes
and methods. This is used for the manager returned by the method above.
"""
name = "UnknownQuerySet"
# Check if we've already created a fallback queryset class for this
# module, and if so reuse that.
queryset_info = self.lookup_typeinfo(f"{self.model_classdef.info.module_name}.{name}")
if queryset_info and queryset_info.metadata.get("django", {}).get("any_fallback_queryset"):
return queryset_info
base_queryset_info = self.lookup_typeinfo(fullnames.QUERYSET_CLASS_FULLNAME)
if base_queryset_info is None:
return None
queryset_info = helpers.build_reparametrized_subclass(
self.current_module, base_queryset_info, name, unique_name=True
)
queryset_info.metadata["django"] = {
"any_fallback_queryset": True,
}
queryset_info.fallback_to_any = True
return queryset_info
def run_with_model_cls(self, model_cls: type[Model]) -> None:
raise NotImplementedError(f"Implement this in subclass {self.__class__.__name__}")
class AddAnnotateUtilities(ModelClassInitializer):
"""
Creates a model subclass that will be used when the model's manager/queryset calls
'annotate' to hold on to attributes that Django adds to a model instance.
Example:
class MyModel(models.Model):
...
class MyModel@AnnotatedWith(MyModel, django_stubs_ext.Annotations[_Annotations]):
...
"""
@override
def run(self) -> None:
annotations = self.lookup_typeinfo_or_incomplete_defn_error("django_stubs_ext.Annotations")
annotated_model = helpers.get_or_create_annotated_type(self.api, self.model_classdef.info, annotations)
if self.is_model_abstract:
# Below are abstract attributes, and in a stub file mypy requires
# explicit ABCMeta if not all abstract attributes are implemented i.e.
# class is kept abstract. So we add the attributes to get mypy off our
# back
exception_bases = {
model_exc_name: self.lookup_typeinfo_or_incomplete_defn_error(base_exc_name)
for model_exc_name, base_exc_name in [
("DoesNotExist", fullnames.OBJECT_DOES_NOT_EXIST),
("NotUpdated", fullnames.OBJECT_NOT_UPDATED),
("MultipleObjectsReturned", fullnames.MULTIPLE_OBJECTS_RETURNED),
]
}
for model_exc_name, base_exc_type in exception_bases.items():
helpers.add_new_sym_for_info(
annotated_model,
model_exc_name,
TypeType(Instance(base_exc_type, [])),
)
class InjectAnyAsBaseForNestedMeta(ModelClassInitializer):
"""
Replaces
class MyModel(models.Model):
class Meta:
pass
with
class MyModel(models.Model):
class Meta(TypedModelMeta):
pass
to provide proper typing of attributes in Meta inner classes.
If TypedModelMeta is not available, fallback to Any as a base
to get around incompatible Meta inner classes for different models.
"""
@override
def run(self) -> None:
meta_node = helpers.get_nested_meta_node_for_current_class(self.model_classdef.info)
if meta_node is None:
return None
meta_node.fallback_to_any = True
typed_model_meta_info = self.lookup_typeinfo(fullnames.TYPED_MODEL_META_FULLNAME)
if typed_model_meta_info and not meta_node.has_base(fullnames.TYPED_MODEL_META_FULLNAME):
# Insert TypedModelMeta just before `object` to leverage mypy's class-body semantic analysis.
meta_node.mro.insert(-1, typed_model_meta_info)
return None
class AddDefaultPrimaryKey(ModelClassInitializer):
@override
def run_with_model_cls(self, model_cls: type[Model]) -> None:
auto_field = model_cls._meta.auto_field
if auto_field:
self.create_autofield(
auto_field=auto_field,
dest_name=auto_field.attname,
existing_field=not self.model_classdef.info.has_readable_member(auto_field.attname),
)
def create_autofield(
self,
auto_field: Field[Any, Any],
dest_name: str,
existing_field: bool,
) -> None:
if existing_field:
auto_field_fullname = helpers.get_class_fullname(auto_field.__class__)
auto_field_info = self.lookup_typeinfo_or_incomplete_defn_error(auto_field_fullname)
set_type, get_type = get_field_descriptor_types(
auto_field_info,
is_set_nullable=True,
is_get_nullable=False,
)
self.add_new_var_to_model_class(dest_name, Instance(auto_field_info, [set_type, get_type]))
class AddPrimaryKeyAlias(AddDefaultPrimaryKey):
@override
def run_with_model_cls(self, model_cls: type[Model]) -> None:
# We also need to override existing `pk` definition from `stubs`:
auto_field = model_cls._meta.pk
if auto_field is not None: # type: ignore[comparison-overlap]
self.create_autofield(
auto_field=auto_field,
dest_name="pk",
existing_field=self.model_classdef.info.has_readable_member(auto_field.name),
)
class AddRelatedModelsId(ModelClassInitializer):
@override
def run_with_model_cls(self, model_cls: type[Model]) -> None:
for field in self.django_context.get_model_foreign_keys(model_cls):
try:
related_model_cls = self.django_context.get_field_related_model_cls(field)
except UnregisteredModelError:
error_context: Context = self.ctx.cls
field_sym = self.ctx.cls.info.get(field.name)
if field_sym is not None and field_sym.node is not None:
error_context = field_sym.node
self.api.fail(
f"Cannot find model {field.related_model!r} referenced in field {field.name!r}",
ctx=error_context,
)
self.add_new_var_to_model_class(field.attname, AnyType(TypeOfAny.explicit))
continue
if related_model_cls._meta.abstract:
continue
rel_target_field = self.django_context.get_related_target_field(related_model_cls, field)
if not rel_target_field:
continue
try:
field_info = self.lookup_class_typeinfo_or_incomplete_defn_error(rel_target_field.__class__)
except helpers.IncompleteDefnException as exc:
if not self.api.final_iteration:
raise exc
continue
is_nullable = self.django_context.get_field_nullability(field, None)
set_type, get_type = get_field_descriptor_types(
field_info, is_set_nullable=is_nullable, is_get_nullable=is_nullable
)
self.add_new_var_to_model_class(field.attname, Instance(field_info, [set_type, get_type]))
class AddManagers(ModelClassInitializer):
def lookup_manager(self, fullname: str, manager: Manager[Any]) -> TypeInfo | None:
manager_info = self.lookup_typeinfo(fullname)
if manager_info is None:
manager_info = self.get_dynamic_manager(fullname, manager)
return manager_info
def is_manager_dynamically_generated(self, manager_info: TypeInfo | None) -> bool:
if manager_info is None:
return False
return manager_info.metadata.get("django", {}).get("from_queryset_manager") is not None
def reparametrize_dynamically_created_manager(self, manager_name: str, manager_info: TypeInfo | None) -> None:
if not self.is_manager_dynamically_generated(manager_info):
return
assert manager_info is not None
# Reparameterize dynamically created manager with model type
manager_type = helpers.fill_manager(manager_info, Instance(self.model_classdef.info, []))
self.add_new_var_to_model_class(manager_name, manager_type, is_classvar=True)
@override
def run_with_model_cls(self, model_cls: type[Model]) -> None:
manager_info: TypeInfo | None
incomplete_manager_defs = set()
for manager_name, manager in model_cls._meta.managers_map.items():
manager_node = self.model_classdef.info.get(manager_name)
manager_fullname = helpers.get_class_fullname(manager.__class__)
manager_info = self.lookup_manager(manager_fullname, manager)
if manager_node and manager_node.type is not None:
# Manager is already typed -> do nothing unless it's a dynamically generated manager
self.reparametrize_dynamically_created_manager(manager_name, manager_info)
continue
if manager_info is None:
# We couldn't find a manager type, see if we should create one
manager_info = self.try_create_manager_from_from_queryset(manager_name)
if manager_info is None:
incomplete_manager_defs.add(manager_name)
continue
assert self.model_classdef.info.self_type is not None
manager_type = helpers.fill_manager(manager_info, self.model_classdef.info.self_type)
self.add_new_var_to_model_class(manager_name, manager_type, is_classvar=True)
if incomplete_manager_defs:
if not self.api.final_iteration:
# Unless we're on the final round, see if another round could
# figure out all manager types
raise helpers.IncompleteDefnException()
for manager_name in incomplete_manager_defs:
# We act graceful and set the type as the bare minimum we know of
# (Django's default) before finishing. And emit an error, to allow for
# ignoring a more specialised manager not being resolved while still
# setting _some_ type
fallback_manager_info = self.get_or_create_manager_with_any_fallback()
if fallback_manager_info is not None:
assert self.model_classdef.info.self_type is not None
manager_type = helpers.fill_manager(fallback_manager_info, self.model_classdef.info.self_type)
self.add_new_var_to_model_class(manager_name, manager_type, is_classvar=True)
# Find expression for e.g. `objects = SomeManager()`
manager_expr = self.get_manager_expression(manager_name)
manager_fullname = f"{self.model_classdef.fullname}.{manager_name}"
self.api.fail(
f'Could not resolve manager type for "{manager_fullname}"',
manager_expr or self.ctx.cls,
code=MANAGER_MISSING,
)
def get_manager_expression(self, name: str) -> AssignmentStmt | None:
# TODO: What happens if the manager is defined multiple times?
for expr in self.ctx.cls.defs.body:
if (
isinstance(expr, AssignmentStmt)
and isinstance(expr.lvalues[0], NameExpr)
and expr.lvalues[0].name == name
):
return expr
return None
def get_dynamic_manager(self, fullname: str, manager: Manager[Any]) -> TypeInfo | None:
"""
Try to get a dynamically defined manager
"""
# Check if manager is a generated (dynamic class) manager
base_manager_fullname = helpers.get_class_fullname(manager.__class__.__bases__[0])
generated_managers = self.get_generated_manager_mappings(base_manager_fullname)
generated_manager_name: str | None = generated_managers.get(fullname, None)
if generated_manager_name is None:
return None
return self.lookup_typeinfo(generated_manager_name)
def try_create_manager_from_from_queryset(self, name: str) -> TypeInfo | None:
"""
Try to create a manager from a .from_queryset call:
class MyModel(models.Model):
objects = MyManager.from_queryset(MyQuerySet)()
module level cases are resolved in `create_new_manager_class_from_from_queryset_method`
"""
assign_statement = self.get_manager_expression(name)
if assign_statement is None:
return None
expr = assign_statement.rvalue
if not isinstance(expr, CallExpr) or not isinstance(expr.callee, CallExpr):
return None
return create_manager_info_from_from_queryset_call(self.api, expr.callee)
class AddDefaultManagerAttribute(ModelClassInitializer):
@override
def run_with_model_cls(self, model_cls: type[Model]) -> None:
if "_default_manager" in self.model_classdef.info.names:
return None
default_manager_cls = model_cls._meta.default_manager.__class__
default_manager_fullname = helpers.get_class_fullname(default_manager_cls)
try:
default_manager_info = self.lookup_typeinfo_or_incomplete_defn_error(default_manager_fullname)
except helpers.IncompleteDefnException as exc:
# Check if default manager could be a generated manager
base_manager_fullname = helpers.get_class_fullname(default_manager_cls.__bases__[0])
generated_manager_info = self.get_generated_manager_info(default_manager_fullname, base_manager_fullname)
if generated_manager_info is None:
# Manager doesn't appear to be generated. Unless we're on the final round,
# see if another round could help figuring out the default manager type
if not self.api.final_iteration:
raise exc
return None
default_manager_info = generated_manager_info
default_manager = helpers.fill_manager(default_manager_info, Instance(self.model_classdef.info, []))
self.add_new_var_to_model_class("_default_manager", default_manager, is_classvar=True)
class AddReverseLookups(ModelClassInitializer):
@cached_property
def reverse_one_to_one_descriptor(self) -> TypeInfo:
return self.lookup_typeinfo_or_incomplete_defn_error(fullnames.REVERSE_ONE_TO_ONE_DESCRIPTOR)
@cached_property
def reverse_many_to_one_descriptor(self) -> TypeInfo:
return self.lookup_typeinfo_or_incomplete_defn_error(fullnames.REVERSE_MANY_TO_ONE_DESCRIPTOR)
@cached_property
def many_to_many_descriptor(self) -> TypeInfo:
return self.lookup_typeinfo_or_incomplete_defn_error(fullnames.MANY_TO_MANY_DESCRIPTOR)
def process_relation(self, relation: ForeignObjectRel) -> None:
attname = relation.get_accessor_name()
if attname is None:
# No reverse accessor.
return
to_model_cls = self.django_context.get_field_related_model_cls(relation)
to_model_info = self.lookup_class_typeinfo_or_incomplete_defn_error(to_model_cls)
reverse_lookup_declared = attname in self.model_classdef.info.names
if isinstance(relation, OneToOneRel):
if not reverse_lookup_declared:
self.add_new_var_to_model_class(
attname,
Instance(
self.reverse_one_to_one_descriptor,
[Instance(self.model_classdef.info, []), Instance(to_model_info, [])],
),
)
return
if isinstance(relation, ManyToManyRel):
if not reverse_lookup_declared:
# TODO: 'relation' should be based on `TypeInfo` instead of Django runtime.
assert relation.through is not None
if isinstance(relation.through, str):
# A lazy reference Django never resolved, i.e. the through model doesn't exist.
return # type:ignore[unreachable] # this can only happen for broken django setup
through_fullname = helpers.get_class_fullname(relation.through)
through_model_info = self.lookup_typeinfo_or_incomplete_defn_error(through_fullname)
self.add_new_var_to_model_class(
attname,
Instance(
self.many_to_many_descriptor, [Instance(to_model_info, []), Instance(through_model_info, [])]
),
is_classvar=True,
)
return
if not reverse_lookup_declared:
# ManyToOneRel
self.add_new_var_to_model_class(
attname, Instance(self.reverse_many_to_one_descriptor, [Instance(to_model_info, [])]), is_classvar=True
)
related_manager_info = self.lookup_typeinfo_or_incomplete_defn_error(fullnames.RELATED_MANAGER_CLASS)
# TODO: Support other reverse managers than `_default_manager`
default_manager = to_model_info.names.get("_default_manager")
if default_manager is None:
if not self.api.final_iteration:
raise helpers.IncompleteDefnException()
# When we get no default manager we can't customize the reverse manager any
# further and will just fall back to the manager declared on the descriptor.
# If a django model has a Manager class that cannot be resolved statically
# (if it is generated in a way where we cannot import it, like
# `objects = my_manager_factory()`)
#
# See https://github.com/typeddjango/django-stubs/pull/993
# for more information on when this error can occur.
self.ctx.api.fail(
(
f"Couldn't resolve related manager {attname!r} for relation "
f"'{to_model_info.fullname}.{relation.field.name}'."
),
self.ctx.cls,
code=MANAGER_MISSING,
)
return
default_manager_type = get_proper_type(default_manager.type)
if (
# '_default_manager' attribute is a node type we can't process
not isinstance(default_manager_type, Instance)
# Already has a related manager subclassed from the default manager
or helpers.get_reverse_manager_info(self.api, model_info=to_model_info, derived_from="_default_manager")
is not None
# When the default manager isn't custom there's no need to create a new type
# as `RelatedManager` has `models.Manager` as base
or default_manager_type.type.fullname == fullnames.MANAGER_CLASS_FULLNAME
):
return
# Create a reverse manager subclassed from the default manager of the related
# model and 'RelatedManager'
related_manager = Instance(related_manager_info, [Instance(to_model_info, [])])
# The reverse manager is based on the related model's manager, so it makes most sense to add the new
# related manager in that module
new_related_manager_info = helpers.add_new_class_for_module(
module=self.api.modules[to_model_info.module_name],
name=f"{to_model_info.name}_RelatedManager",
bases=[related_manager, default_manager_type],
)
# Stash the new reverse manager type fullname on the related model, so we don't duplicate
# or have to create it again for other reverse relations
helpers.set_reverse_manager_info(
to_model_info,
derived_from="_default_manager",
fullname=new_related_manager_info.fullname,
)
@override
def run_with_model_cls(self, model_cls: type[Model]) -> None:
# add related managers etc.
processing_incomplete = False
for relation in self.django_context.get_model_relations(model_cls):
try:
self.process_relation(relation)
except helpers.IncompleteDefnException:
processing_incomplete = True
if processing_incomplete and not self.api.final_iteration:
raise helpers.IncompleteDefnException
class AddExtraFieldMethods(ModelClassInitializer):
@override
def run_with_model_cls(self, model_cls: type[Model]) -> None:
# get_FOO_display for choices
for field in self.django_context.get_model_fields(model_cls):
if field.choices:
info = self.lookup_typeinfo_or_incomplete_defn_error("builtins.str")
return_type = Instance(info, [])
common.add_method(self.ctx, name=f"get_{field.attname}_display", args=[], return_type=return_type)
# get_next_by, get_previous_by for Date, DateTime
for field in self.django_context.get_model_fields(model_cls):
if isinstance(field, DateField | DateTimeField) and not field.null:
return_type = Instance(self.model_classdef.info, [])
common.add_method(
self.ctx,
name=f"get_next_by_{field.attname}",
args=[
Argument(
Var("kwargs", AnyType(TypeOfAny.implementation_artifact)),
AnyType(TypeOfAny.implementation_artifact),
initializer=None,
kind=ARG_STAR2,
)
],
return_type=return_type,
)
common.add_method(
self.ctx,
name=f"get_previous_by_{field.attname}",
args=[
Argument(
Var("kwargs", AnyType(TypeOfAny.implementation_artifact)),
AnyType(TypeOfAny.implementation_artifact),
initializer=None,
kind=ARG_STAR2,
)
],
return_type=return_type,
)
class ProcessManyToManyFields(ModelClassInitializer):
"""
Processes 'ManyToManyField()' fields and;
- Generates any implicit through tables that Django also generates. It won't do
anything if the model is abstract or for fields where an explicit 'through'
argument has been passed.
- Creates related managers for both ends of the many to many relationship
TODO: Move the 'related_name' contribution from 'AddReverseLookups' to here. As it
makes sense to add it when processing ManyToManyField
"""
def statements(self) -> Iterable[Statement]:
"""
Returns class body statements from the current model and any of its bases that
is an abstract model. Statements from any concrete parent class or parents of
that concrete class will be skipped.
"""
processed_models = set()
# Produce all statements from current class
model_bases = deque([self.model_classdef])
# Do a breadth first search over the current model and its bases, to find all
# abstract parent models that have not been "interrupted" by any concrete model.
while model_bases:
model = model_bases.popleft()
yield from model.defs.body
if isinstance(model.info, FakeInfo):
# While loading from cache ClassDef infos are faked and 'FakeInfo' doesn't have
# all attributes of a 'TypeInfo' set. See #2184
continue
for base in model.info.bases:
# Only produce any additional statements from abstract model bases, as they
# simulate regular python inheritance. Avoid concrete models, and any of their
# parents, as they're handled differently by Django.
if helpers.is_abstract_model(base.type) and base.type.fullname not in processed_models:
model_bases.append(base.type.defn)
processed_models.add(base.type.fullname)
@override
def run(self) -> None:
if self.is_model_abstract:
# TODO: Create abstract through models?
return
for statement in self.statements():
# Check if this part of the class body is an assignment from a 'ManyToManyField' call
# = ManyToManyField(...)
if (
isinstance(statement, AssignmentStmt)
and len(statement.lvalues) == 1
and isinstance(statement.lvalues[0], NameExpr)
and isinstance(statement.rvalue, CallExpr)
and len(statement.rvalue.args) > 0 # Need at least the 'to' argument
and isinstance(statement.rvalue.callee, RefExpr)
and isinstance(statement.rvalue.callee.node, TypeInfo)
and statement.rvalue.callee.node.has_base(fullnames.MANYTOMANY_FIELD_FULLNAME)
):
m2m_field_name = statement.lvalues[0].name
m2m_field_symbol = self.model_classdef.info.get(m2m_field_name)
# The symbol referred to by the assignment expression is expected to be a variable
if m2m_field_symbol is None or not isinstance(m2m_field_symbol.node, Var):
continue
# Resolve argument information of the 'ManyToManyField(...)' call
args = self.resolve_many_to_many_arguments(statement.rvalue, context=statement)
# Ignore calls without required 'to' argument, mypy will complain
if args is None:
continue
# Get the names of the implicit through model that will be generated
through_model_name = f"{self.model_classdef.name}_{m2m_field_name}"
through_model = self.create_through_table_class(
field_name=m2m_field_name,
model_name=through_model_name,
model_fullname=f"{self.model_classdef.info.module_name}.{through_model_name}",
m2m_args=args,
)
if through_model is not None and args.through is None:
# Explicit through models are regular models, they get their managers from the usual initializers.
self.add_through_table_managers(through_model)
container = self.model_classdef.info.get_containing_type_info(m2m_field_name)
if (
through_model is not None
and container is not None
and container.fullname != self.model_classdef.info.fullname
and helpers.is_abstract_model(container)
):
# ManyToManyField is inherited from an abstract parent class, so in
# order to get the to and the through model argument right we
# override the ManyToManyField attribute on the current class
helpers.add_new_sym_for_info(
self.model_classdef.info,
name=m2m_field_name,
sym_type=Instance(self.m2m_field, [args.to.model, Instance(through_model, [])]),
)
# Create a 'ManyRelatedManager' class for the processed model
self.create_many_related_manager(Instance(self.model_classdef.info, []))
if isinstance(args.to.model, Instance):
# Create a 'ManyRelatedManager' class for the related model
self.create_many_related_manager(args.to.model)
@cached_property
def default_pk_instance(self) -> Instance:
default_pk_field = self.lookup_typeinfo(self.django_context.settings.DEFAULT_AUTO_FIELD)
if default_pk_field is None:
raise helpers.IncompleteDefnException()
return Instance(
default_pk_field,
list(get_field_descriptor_types(default_pk_field, is_set_nullable=True, is_get_nullable=False)),
)
@cached_property
def model_pk_instance(self) -> Instance:
return self.get_pk_instance(self.model_classdef.info)
@cached_property
def model_base(self) -> TypeInfo:
info = self.lookup_typeinfo(fullnames.MODEL_CLASS_FULLNAME)
if info is None:
raise helpers.IncompleteDefnException()
return info
@cached_property
def fk_field(self) -> TypeInfo:
info = self.lookup_typeinfo(fullnames.FOREIGN_KEY_FULLNAME)
if info is None:
raise helpers.IncompleteDefnException()
return info
@cached_property
def m2m_field(self) -> TypeInfo:
info = self.lookup_typeinfo(fullnames.MANYTOMANY_FIELD_FULLNAME)
if info is None:
raise helpers.IncompleteDefnException()
return info
@cached_property
def manager_info(self) -> TypeInfo:
info = self.lookup_typeinfo(fullnames.MANAGER_CLASS_FULLNAME)
if info is None:
raise helpers.IncompleteDefnException()
return info
@cached_property
def fk_field_types(self) -> FieldDescriptorTypes:
return get_field_descriptor_types(self.fk_field, is_set_nullable=False, is_get_nullable=False)
@cached_property
def many_related_manager(self) -> TypeInfo:
return self.lookup_typeinfo_or_incomplete_defn_error(fullnames.MANY_RELATED_MANAGER)
def get_pk_instance(self, model: TypeInfo, /) -> Instance:
"""
Get a primary key instance of provided model's type info. If primary key can't be resolved,
return a default declaration.
"""
contains_from_pk_info = model.get_containing_type_info("pk")
if contains_from_pk_info is not None:
pk = contains_from_pk_info.names["pk"].node
if isinstance(pk, Var):
pk_type = get_proper_type(pk.type)
if isinstance(pk_type, Instance):
return pk_type
return self.default_pk_instance
def create_through_table_class(
self, field_name: str, model_name: str, model_fullname: str, m2m_args: M2MArguments
) -> TypeInfo | None:
if not isinstance(m2m_args.to.model, Instance):
return None
if m2m_args.through is not None:
# Call has explicit 'through=', no need to create any implicit through table
return m2m_args.through.model.type if isinstance(m2m_args.through.model, Instance) else None
# If through model is already declared there's nothing more we should do
through_model = self.lookup_typeinfo(model_fullname)
if through_model is not None:
return through_model
# Declare a new, empty, implicitly generated through model class named: '_'
through_model = self.add_new_class_for_current_module(model_name, bases=[Instance(self.model_base, [])])
# We attempt to be a bit clever here and store the generated through model's fullname in
# the metadata of the class containing the 'ManyToManyField' call expression, where its
# identifier is the field name of the 'ManyToManyField'. This would allow the containing
# model to always find the implicit through model, so that it doesn't get lost.
model_metadata = helpers.get_django_metadata(self.model_classdef.info)
model_metadata.setdefault("m2m_throughs", {})
model_metadata["m2m_throughs"][field_name] = through_model.fullname
# Add a 'pk' symbol to the model class
helpers.add_new_sym_for_info(through_model, name="pk", sym_type=self.default_pk_instance.copy_modified())
# Add an 'id' symbol to the model class
helpers.add_new_sym_for_info(through_model, name="id", sym_type=self.default_pk_instance.copy_modified())
# Add the foreign key to the model containing the 'ManyToManyField' call:
# or from_
from_name = f"from_{self.model_classdef.name.lower()}" if m2m_args.to.self else self.model_classdef.name.lower()
helpers.add_new_sym_for_info(
through_model,
name=from_name,
sym_type=Instance(
self.fk_field,
[
helpers.convert_any_to_type(self.fk_field_types.set, Instance(self.model_classdef.info, [])),
helpers.convert_any_to_type(self.fk_field_types.get, Instance(self.model_classdef.info, [])),
],
),
)
# Add the foreign key's '_id' field: _id or from__id
helpers.add_new_sym_for_info(
through_model, name=f"{from_name}_id", sym_type=self.model_pk_instance.copy_modified()
)
# Add the foreign key to the model on the opposite side of the relation
# i.e. the model given as 'to' argument to the 'ManyToManyField' call:
# or to_
to_name = (
f"to_{m2m_args.to.model.type.name.lower()}" if m2m_args.to.self else m2m_args.to.model.type.name.lower()
)
helpers.add_new_sym_for_info(
through_model,
name=to_name,
sym_type=Instance(
self.fk_field,
[
helpers.convert_any_to_type(self.fk_field_types.set, m2m_args.to.model),
helpers.convert_any_to_type(self.fk_field_types.get, m2m_args.to.model),
],
),
)
# Add the foreign key's '_id' field: _id or to__id
other_pk = self.get_pk_instance(m2m_args.to.model.type)
helpers.add_new_sym_for_info(through_model, name=f"{to_name}_id", sym_type=other_pk.copy_modified())
return through_model
def add_through_table_managers(self, through_model: TypeInfo) -> None:
"""The `self.manager_info` lookup might trigger a deferral pass so this has to be idempotent"""
for name in ("objects", "_default_manager"):
if through_model.names.get(name) is None:
helpers.add_new_sym_for_info(
through_model,
name=name,
sym_type=Instance(self.manager_info, [Instance(through_model, [])]),
is_classvar=True,
)
def resolve_many_to_many_arguments(self, call: CallExpr, /, context: Context) -> M2MArguments | None:
"""
Inspect a 'ManyToManyField(...)' call to collect argument data on any 'to' and
'through' arguments.
"""
to_arg = helpers.get_class_init_argument_by_name(call, "to")
if to_arg is None:
# 'to' is a required argument of 'ManyToManyField()', we can't do anything if it's not provided
return None
# Resolve the type of the 'to' argument expression
to_model = helpers.get_model_from_expression(
to_arg, self_model=self.model_classdef.info, api=self.api, django_context=self.django_context
)
if to_model is None:
return None
to = M2MTo(
arg=to_arg,
model=to_model,
self=to_model.type == self.model_classdef.info,
)
# Resolve the type of the 'through' argument expression
through_arg = helpers.get_class_init_argument_by_name(call, "through")
through = None
if through_arg is not None:
through_model = helpers.get_model_from_expression(
through_arg, self_model=self.model_classdef.info, api=self.api, django_context=self.django_context
)
if through_model is not None:
through = M2MThrough(arg=through_arg, model=through_model)
return M2MArguments(to=to, through=through)
def create_many_related_manager(self, model: Instance) -> None:
"""
Creates a generic manager that subclasses both 'ManyRelatedManager' and the
default manager of the given model. These are normally used on both models
involved in a ManyToManyField.
The manager classes are generic over a '_Through' model, meaning that they can
be reused for multiple many to many relations.
"""
if helpers.get_many_to_many_manager_info(self.api, to=model.type, derived_from="_default_manager") is not None:
return
default_manager_node = model.type.names.get("_default_manager")
if default_manager_node is None:
raise helpers.IncompleteDefnException()
default_manager_type = get_proper_type(default_manager_node.type)
if not isinstance(default_manager_type, Instance):
return
# Create a reusable generic subclass that is generic over a 'through' model,
# explicitly declared it'd could have looked something like below
#
# class X(models.Model): ...
# _Through = TypeVar("_Through", bound=models.Model)
# class X_ManyRelatedManager(ManyRelatedManager[X, _Through], type(X._default_manager), Generic[_Through]): ...
through_type_var = self.many_related_manager.defn.type_vars[1]
assert isinstance(through_type_var, TypeVarType)
if has_placeholder(through_type_var):
# 'ManyRelatedManager' hasn't been fully analysed yet, so '_Through' still
# carries a 'PlaceholderType' bound. Copying it into the class we're about to
# create would store an unserializable type on a synthetic class that is never
# re-analysed, so defer instead and pick it up on a later iteration.
raise helpers.IncompleteDefnException()
generic_to_many_related_manager = Instance(self.many_related_manager, [model, through_type_var.copy_modified()])
related_manager_info = helpers.add_new_class_for_module(
module=self.api.modules[model.type.module_name],
name=f"{model.type.name}_ManyRelatedManager",
bases=[generic_to_many_related_manager, default_manager_type],
)
# Reuse the '_Through' `TypeVar` from `ManyRelatedManager` in our subclass
related_manager_info.defn.type_vars = [through_type_var.copy_modified()]
related_manager_info.add_type_vars()
# Track the existence of our manager subclass, by tying it to the model it
# operates on
helpers.set_many_to_many_manager_info(
to=model.type, derived_from="_default_manager", manager_info=related_manager_info
)
class MetaclassAdjustments(ModelClassInitializer):
@classmethod
def adjust_model_class(cls, ctx: ClassDefContext, plugin_config: DjangoPluginConfig) -> None:
"""
For the sake of type checkers other than mypy, some attributes that are
dynamically added by Django's model metaclass has been annotated on
`django.db.models.base.Model`. We remove those attributes and will handle them
through the plugin.
Configurable with `strict_model_abstract_attrs = false` to skip removing any objects from models.
Basically, this code::
from django.db import models
def get_model_count(model_type: type[models.Model]) -> int:
return model_type.objects.count()
- Will raise an error
`"type[models.Model]" has no attribute "objects" [attr-defined]`
when `strict_model_abstract_attrs = true` (default)
- Return without any type errors
when `strict_model_abstract_attrs = false`
But, beware that the code above can fail in runtime, as mypy correctly shows.
Example: `get_model_count(models.Model)`
Turn this setting off at your own risk.
"""
# Mypy does not properly support narrowing in `__getattr__` based on `Literal["objects"]`
# so the current `ModelBase.__getattr__` swallows every unknown attributes errors.
# `objects` is already inserted by the plugin, so the fallback is not necessary for mypy. We can drop it
# TODO: remove once https://github.com/python/mypy/issues/8203 is resolved
metaclass = ctx.cls.info.metaclass_type
if metaclass is not None and "__getattr__" in metaclass.type.names:
del metaclass.type.names["__getattr__"]
if ctx.cls.fullname != fullnames.MODEL_CLASS_FULLNAME:
return
if not plugin_config.strict_model_abstract_attrs:
# `__getattr__` was the only source of `Model.objects`, redeclare it explicitly for this setting.
manager = helpers.lookup_fully_qualified_typeinfo(
helpers.get_semanal_api(ctx), fullnames.MANAGER_CLASS_FULLNAME
)
if manager is not None:
helpers.add_new_sym_for_info(
ctx.cls.info,
name="objects",
sym_type=Instance(manager, [Instance(ctx.cls.info, [])]),
)
return
for attr_name in ["DoesNotExist", "NotUpdated", "MultipleObjectsReturned"]:
attr = ctx.cls.info.names.get(attr_name)
if attr is not None and isinstance(attr.node, Var) and not attr.plugin_generated:
del ctx.cls.info.names[attr_name]
def get_exception_bases(self, name: str) -> list[Instance]:
bases = []
for model_base in self.model_classdef.info.direct_base_classes():
exception_base_sym = model_base.names.get(name)
if (
# Base class is a Model
helpers.is_model_type(model_base)
# But base class is not 'models.Model'
and model_base.fullname != fullnames.MODEL_CLASS_FULLNAME
# Base class also has a generated exception base e.g. 'DoesNotExist'
and exception_base_sym is not None
and exception_base_sym.plugin_generated
and isinstance(exception_base_sym.node, TypeInfo)
):
bases.append(Instance(exception_base_sym.node, []))
return bases
def add_exception_classes(self) -> None:
"""
Adds exception classes `DoesNotExist`, `NotUpdated`, and `MultipleObjectsReturned` to a
model type, aligned with how the model metaclass does it runtime.
If the model is abstract, exceptions will be added as abstract attributes.
"""
for model_exc_name, base_exc_name in [
("DoesNotExist", fullnames.OBJECT_DOES_NOT_EXIST),
("NotUpdated", fullnames.OBJECT_NOT_UPDATED),
("MultipleObjectsReturned", fullnames.MULTIPLE_OBJECTS_RETURNED),
]:
if model_exc_name in self.model_classdef.info.names:
continue
base_exc_type = self.lookup_typeinfo_or_incomplete_defn_error(base_exc_name)
base_exc_inst = Instance(base_exc_type, [])
model_exc_type: Var | TypeInfo
if self.is_model_abstract:
model_exc_type = self.create_new_var(model_exc_name, TypeType(base_exc_inst))
model_exc_type.is_abstract_var = True
else:
model_exc_type = helpers.create_type_info(
model_exc_name,
self.model_classdef.info.fullname,
self.get_exception_bases(model_exc_name) or [base_exc_inst],
)
self.model_classdef.info.names[model_exc_type.name] = SymbolTableNode(
MDEF, model_exc_type, plugin_generated=True
)
@override
def run(self) -> None:
self.add_exception_classes()
def process_model_class(ctx: ClassDefContext, django_context: DjangoContext) -> None:
initializers = [
AddAnnotateUtilities,
InjectAnyAsBaseForNestedMeta,
AddDefaultPrimaryKey,
AddPrimaryKeyAlias,
AddRelatedModelsId,
AddManagers,
AddDefaultManagerAttribute,
AddReverseLookups,
AddExtraFieldMethods,
ProcessManyToManyFields,
MetaclassAdjustments,
]
for initializer_cls in initializers:
try:
initializer_cls(ctx, django_context).run()
except helpers.IncompleteDefnException:
if not ctx.api.final_iteration:
ctx.api.defer()
def set_auth_user_model_boolean_fields(ctx: AttributeContext, django_context: DjangoContext) -> MypyType:
boolinfo = helpers.lookup_class_typeinfo(helpers.get_typechecker_api(ctx), bool)
assert boolinfo is not None
return Instance(boolinfo, [])
def handle_annotated_type(ctx: AnalyzeTypeContext, fullname: str) -> MypyType:
"""
Replaces the 'WithAnnotations' type with a type that can represent an annotated
model.
"""
is_with_annotations = fullname == fullnames.WITH_ANNOTATIONS_FULLNAME
args = ctx.type.args
if not args:
return AnyType(TypeOfAny.from_omitted_generics) if is_with_annotations else ctx.type
type_arg = get_proper_type(ctx.api.analyze_type(args[0]))
if not isinstance(type_arg, Instance) or not helpers.is_model_type(type_arg.type):
if isinstance(type_arg, TypeVarType):
# When the first arg is a TypeVar bounded by a Model (e.g. WithAnnotations[_Model, BarDict]),
# use the upper bound to look up @AnnotatedWith. The method hook
# (merge_annotations_from_custom_method) will later replace it with the actual concrete model.
upper = get_proper_type(type_arg.upper_bound)
if isinstance(upper, Instance) and helpers.is_model_type(upper.type):
type_arg = upper
else:
return type_arg
else:
return type_arg
fields_dict = None
if len(args) > 1:
second_arg_type = get_proper_type(ctx.api.analyze_type(args[1]))
if isinstance(second_arg_type, TypedDictType) and is_with_annotations:
fields_dict = second_arg_type
elif isinstance(second_arg_type, Instance) and second_arg_type.type.fullname == ANNOTATIONS_FULLNAME:
annotations_type_arg = get_proper_type(second_arg_type.args[0])
if isinstance(annotations_type_arg, TypedDictType):
fields_dict = annotations_type_arg
elif not isinstance(annotations_type_arg, AnyType):
ctx.api.fail("Only TypedDicts are supported as type arguments to Annotations", ctx.context)
elif annotations_type_arg.type_of_any == TypeOfAny.from_omitted_generics:
ctx.api.fail("Missing required TypedDict parameter for generic type Annotations", ctx.context)
if fields_dict is None:
return type_arg
assert isinstance(ctx.api, TypeAnalyser)
assert isinstance(ctx.api.api, SemanticAnalyzer)
return get_annotated_type(ctx.api.api, type_arg, fields_dict=fields_dict)
def get_annotated_type(
api: SemanticAnalyzer | TypeChecker, model_type: Instance, fields_dict: TypedDictType
) -> ProperType:
"""
Get a model type that can be used to represent an annotated model
"""
extra_attrs = helpers.merge_extra_attrs(model_type.extra_attrs, new_attrs=fields_dict.items)
annotated_model: TypeInfo | None
if helpers.is_annotated_model(model_type.type):
annotated_model = model_type.type
if model_type.args:
annotations = get_proper_type(model_type.args[0])
if isinstance(annotations, TypedDictType):
fields_dict = helpers.merge_typeddict(api, annotations, fields_dict)
else:
annotated_model = helpers.lookup_fully_qualified_typeinfo(api, model_type.type.fullname + "@AnnotatedWith")
if annotated_model is None and isinstance(api, SemanticAnalyzer):
# Create @AnnotatedWith lazily when it doesn't exist yet. This happens when
# WithAnnotations is used with a TypeVar whose upper bound is a model that
# hasn't been processed by AddAnnotateUtilities (e.g. the base Model class).
annotations_info = helpers.lookup_fully_qualified_typeinfo(api, ANNOTATIONS_FULLNAME)
if annotations_info is not None:
annotated_model = helpers.get_or_create_annotated_type(api, model_type.type, annotations_info)
if annotated_model is None:
return model_type
return Instance(annotated_model, [fields_dict], extra_attrs=extra_attrs)
typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/orm_lookups.py 0000664 0000000 0000000 00000011175 15260643574 0030420 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING
from mypy.nodes import ARG_NAMED, DictExpr, StrExpr
from mypy.types import AnyType, Instance, ProperType, TypeOfAny, UnionType, get_proper_type
from mypy.types import Type as MypyType
from mypy_django_plugin.exceptions import UnregisteredModelError
from mypy_django_plugin.lib import fullnames, helpers
if TYPE_CHECKING:
from mypy.plugin import MethodContext
from mypy_django_plugin.django.context import DjangoContext
def typecheck_queryset_filter(ctx: MethodContext, django_context: DjangoContext) -> MypyType:
django_model = helpers.get_model_info_from_qs_ctx(ctx, django_context)
if django_model is None:
return ctx.default_return_type
# We only typecheck the `**kwargs` formal parameter. Python's grammar guarantees
# `**kwargs` is the last formal parameter when present, which holds for every
# method this hook is registered for (`filter`, `get_or_create`, `update_or_create`, ...).
lookup_kwargs = ctx.arg_names[-1]
provided_lookup_types = ctx.arg_types[-1]
for lookup_kwarg, provided_type in zip(lookup_kwargs, provided_lookup_types, strict=False):
if lookup_kwarg is None:
continue
provided_type = resolve_combinables(get_proper_type(provided_type), django_context)
lookup_type: MypyType
try:
lookup_type = django_context.resolve_lookup_expected_type(
ctx, django_model.cls, lookup_kwarg, django_model.typ
)
except UnregisteredModelError:
lookup_type = AnyType(TypeOfAny.from_error)
# Managers as provided_type is not supported yet
if isinstance(provided_type, Instance) and helpers.has_any_of_bases(
provided_type.type, (fullnames.MANAGER_CLASS_FULLNAME, fullnames.QUERYSET_CLASS_FULLNAME)
):
return ctx.default_return_type
helpers.check_types_compatible(
ctx,
expected_type=lookup_type,
actual_type=provided_type,
error_message=f"Incompatible type for lookup {lookup_kwarg!r}:",
)
_typecheck_defaults_kwarg(ctx, django_model, django_context)
return ctx.default_return_type
def _typecheck_defaults_kwarg(
ctx: MethodContext, django_model: helpers.DjangoModel, django_context: DjangoContext
) -> None:
"""
Validate `defaults=` and `create_defaults=` dict literals passed to
`get_or_create` / `update_or_create` against the model's field setter
types. Only literal `DictExpr` arguments with string-literal keys are
checked; any other shape is silently skipped to avoid false positives.
"""
defaults_positions = [
idx for idx, name in enumerate(ctx.callee_arg_names) if name in ("defaults", "create_defaults")
]
if not defaults_positions:
return
api = helpers.get_typechecker_api(ctx)
expected_types = django_context.get_expected_types(api, django_model.cls, method="create")
model_name = django_model.cls.__name__
for idx in defaults_positions:
if not ctx.args[idx]:
continue
if ctx.arg_kinds[idx][0] != ARG_NAMED:
continue
dict_expr = ctx.args[idx][0]
if not isinstance(dict_expr, DictExpr):
continue
for key_expr, value_expr in dict_expr.items:
if not isinstance(key_expr, StrExpr):
continue
key_name = key_expr.value
if key_name not in expected_types:
ctx.api.fail(
f'Unexpected attribute "{key_name}" for model "{model_name}"',
key_expr,
)
continue
actual_type = api.get_expression_type(value_expr)
helpers.check_types_compatible(
ctx,
expected_type=expected_types[key_name],
actual_type=actual_type,
error_message=f'Incompatible type for "{key_name}" of "{model_name}"',
)
def resolve_combinables(provided_type: ProperType, django_context: DjangoContext) -> ProperType:
if isinstance(provided_type, UnionType):
return UnionType.make_union(
[resolve_combinables(get_proper_type(item), django_context) for item in provided_type.items]
)
if isinstance(provided_type, Instance) and provided_type.type.has_base(fullnames.COMBINABLE_EXPRESSION_FULLNAME):
if provided_type.type.fullname != fullnames.F_EXPRESSION_FULLNAME:
# Combinables aside from F expressions are unsupported
return AnyType(TypeOfAny.explicit)
return django_context.resolve_f_expression_type(provided_type)
return provided_type
typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/querysets.py 0000664 0000000 0000000 00000153353 15260643574 0030120 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING, Literal
from django.core.exceptions import FieldDoesNotExist, FieldError
from django.db.models.constants import LOOKUP_SEP
from django.db.models.fields.related import RelatedField
from django.db.models.fields.related_descriptors import (
ForwardManyToOneDescriptor,
ManyToManyDescriptor,
ReverseManyToOneDescriptor,
ReverseOneToOneDescriptor,
)
from django.db.models.fields.reverse_related import ForeignObjectRel
from django.db.models.sql.query import Query
from mypy.errorcodes import NO_REDEF
from mypy.nodes import (
ARG_NAMED,
ARG_NAMED_OPT,
ARG_POS,
ARG_STAR,
CallExpr,
Decorator,
Expression,
ListExpr,
SetExpr,
StrExpr,
TupleExpr,
Var,
)
from mypy.types import (
AnyType,
CallableType,
Instance,
LiteralType,
ProperType,
TupleType,
TypedDictType,
TypeOfAny,
TypeVarType,
get_proper_type,
)
from mypy.types import Type as MypyType
from mypy_django_plugin.django.context import DjangoContext, LookupsAreUnsupported
from mypy_django_plugin.lib import fullnames, helpers
from mypy_django_plugin.lib.field_validation import (
check_field_concrete,
check_field_unique,
try_get_field,
validate_non_pk_concrete_field,
)
from mypy_django_plugin.transformers.models import get_annotated_type
if TYPE_CHECKING:
from collections.abc import Sequence
from django.db.models.base import Model
from mypy.checker import TypeChecker
from mypy.plugin import FunctionContext, MethodContext
from mypy_django_plugin.lib.helpers import DjangoModel
def determine_proper_manager_type(ctx: FunctionContext) -> MypyType:
"""
Fill the manager TypeVar on instantiation using the enclosing class.
For example:
class MyModel(Model):
objects = MyManager()
Is interpreted as:
class MyModel(Model):
objects: MyManager[MyModel] = MyManager()
"""
default_return_type = get_proper_type(ctx.default_return_type)
assert isinstance(default_return_type, Instance)
outer_model_info = helpers.get_typechecker_api(ctx).scope.active_class()
if (
outer_model_info is None
or not helpers.is_model_type(outer_model_info)
or outer_model_info.self_type is None
or not default_return_type.type.is_generic()
):
return default_return_type
return default_return_type.copy_modified(args=[outer_model_info.self_type])
def get_field_type_from_lookup(
ctx: MethodContext,
django_context: DjangoContext,
model_cls: type[Model],
*,
method: str,
lookup: str,
silent_on_error: bool = False,
) -> MypyType | None:
try:
lookup_field, model_cls = django_context.resolve_lookup_into_field(model_cls, lookup)
except FieldError as exc:
if not silent_on_error:
ctx.api.fail(exc.args[0], ctx.context)
return None
except LookupsAreUnsupported:
return AnyType(TypeOfAny.explicit)
if lookup_field is None:
return AnyType(TypeOfAny.implementation_artifact)
if (isinstance(lookup_field, RelatedField) and lookup_field.column == lookup) or isinstance(
lookup_field, ForeignObjectRel
):
model_cls = django_context.get_field_related_model_cls(lookup_field)
lookup_field = django_context.get_primary_key_field(model_cls)
api = helpers.get_typechecker_api(ctx)
model_info = helpers.lookup_class_typeinfo(api, model_cls)
return django_context.get_field_get_type(api, model_info, lookup_field, method=method)
def get_values_list_row_type(
ctx: MethodContext,
django_context: DjangoContext,
model_cls: type[Model],
*,
annotation_types: dict[str, MypyType],
flat: bool,
named: bool,
) -> MypyType:
field_lookups = resolve_field_lookups(ctx.args[0], django_context)
if field_lookups is None:
return AnyType(TypeOfAny.from_error)
typechecker_api = helpers.get_typechecker_api(ctx)
model_info = helpers.lookup_class_typeinfo(typechecker_api, model_cls)
if len(field_lookups) == 0:
if flat:
primary_key_field = django_context.get_primary_key_field(model_cls)
lookup_type = get_field_type_from_lookup(
ctx, django_context, model_cls, lookup=primary_key_field.attname, method="values_list"
)
assert lookup_type is not None
return lookup_type
if named:
column_types: dict[str, MypyType] = {}
for field in django_context.get_model_fields(model_cls):
column_type = django_context.get_field_get_type(
typechecker_api, model_info, field, method="values_list"
)
column_types[field.attname] = column_type
column_types.update(annotation_types)
return helpers.make_oneoff_named_tuple(typechecker_api, "Row", column_types)
# flat=False, named=False, all fields
if annotation_types:
return typechecker_api.named_generic_type("builtins.tuple", [AnyType(TypeOfAny.special_form)])
field_lookups = []
for field in django_context.get_model_fields(model_cls):
field_lookups.append(field.attname)
if len(field_lookups) > 1 and flat:
typechecker_api.fail("'flat' is not valid when 'values_list' is called with more than one field", ctx.context)
return AnyType(TypeOfAny.from_error)
column_types = {}
for field_lookup in field_lookups:
if annotation_type := annotation_types.get(field_lookup):
column_types[field_lookup] = annotation_type
continue
lookup_field_type = get_field_type_from_lookup(
ctx,
django_context,
model_cls,
lookup=field_lookup,
method="values_list",
silent_on_error=bool(annotation_types),
)
if lookup_field_type is None:
if annotation_types:
lookup_field_type = AnyType(TypeOfAny.from_omitted_generics)
else:
return AnyType(TypeOfAny.from_error)
column_types[field_lookup] = lookup_field_type
if flat:
assert len(column_types) == 1
row_type = next(iter(column_types.values()))
elif named:
row_type = helpers.make_oneoff_named_tuple(typechecker_api, "Row", column_types)
else:
# Since there may have been repeated field lookups, we cannot just use column_types.values here.
# This is not the case in named above, because Django will error if duplicate fields are requested.
resolved_column_types = [column_types[field_lookup] for field_lookup in field_lookups]
row_type = helpers.make_tuple(typechecker_api, resolved_column_types)
return row_type
def extract_proper_type_queryset_values_list(ctx: MethodContext, django_context: DjangoContext) -> MypyType:
django_model = helpers.get_model_info_from_qs_ctx(ctx, django_context)
if django_model is None:
return ctx.default_return_type
default_return_type = get_proper_type(ctx.default_return_type)
if not isinstance(default_return_type, Instance):
return ctx.default_return_type
flat = helpers.get_bool_call_argument_by_name(ctx, "flat", default=False)
named = helpers.get_bool_call_argument_by_name(ctx, "named", default=False)
if flat and named:
ctx.api.fail("'flat' and 'named' can't be used together", ctx.context)
return default_return_type.copy_modified(args=[django_model.typ, AnyType(TypeOfAny.from_error)])
annotation_types = _get_annotation_field_types(django_model.typ) if django_model.is_annotated else {}
row_type = get_values_list_row_type(
ctx,
django_context,
django_model.cls,
annotation_types=annotation_types,
flat=flat,
named=named,
)
ret = default_return_type.copy_modified(args=[django_model.typ, row_type])
if not named and (field_lookups := resolve_field_lookups(ctx.args[0], django_context)):
# For non-named values_list, the row type does not encode column names.
# Attach selected field names to the returned QuerySet instance so that
# subsequent annotate() can make an informed decision about name conflicts.
ret.extra_attrs = helpers.merge_extra_attrs(ret.extra_attrs, new_immutable=set(field_lookups))
return ret
def _aggregate_default_alias(expr: Expression, expr_type: MypyType) -> str | None:
"""Mirror `Aggregate.default_alias`: ``__``.
Django generates a default alias only for aggregates with a single source
expression that has a `name`; complex expressions raise at runtime, so the
plugin matches that and returns ``None`` for anything else.
See https://docs.djangoproject.com/en/dev/topics/db/aggregation/#generating-aggregates-for-each-item-in-a-queryset
"""
if not (
isinstance(expr, CallExpr)
and isinstance(proper := get_proper_type(expr_type), Instance)
and proper.type.has_base(fullnames.AGGREGATE_CLASS_FULLNAME)
):
return None
source: Expression | None = None
for arg, kind in zip(expr.args, expr.arg_kinds, strict=False):
if kind != ARG_POS:
continue
if source is not None:
return None
source = arg
# TODO: consider switching to `helpers.resolve_string_attribute_value` once
# `gather_kwargs` threads `django_context` through — that would also handle
# `Count(NAME_CONST)` and `Count(settings.X)`.
if not isinstance(source, StrExpr):
return None
return f"{source.value}__{proper.type.name.lower()}"
def gather_kwargs(ctx: MethodContext) -> dict[str, MypyType] | None:
kwargs: dict[str, MypyType] = {}
named = (ARG_NAMED, ARG_NAMED_OPT)
for slot in zip(ctx.arg_kinds, ctx.arg_types, ctx.arg_names, ctx.args, strict=False):
for kind, arg_type, name, arg in zip(*slot, strict=False):
if kind in named:
assert name is not None
kwargs[name] = arg_type
elif kind == ARG_POS:
alias = _aggregate_default_alias(arg, arg_type)
if alias is not None:
kwargs[alias] = arg_type
return kwargs
def reparameterize_func_output_field(ctx: FunctionContext) -> MypyType:
"""Reparameterize Func[_OutputField] from the output_field argument.
When a generic Func subclass like Substr is nested directly inside a call with
**kwargs: Any (e.g., QuerySet.annotate()), mypy infers _OutputField=Any because
the target type is unconstrained. This hook corrects the return type by extracting
the actual output_field argument type.
"""
default = get_proper_type(ctx.default_return_type)
if not isinstance(default, Instance) or not default.args:
return ctx.default_return_type
# Only act when the generic arg is Any (i.e., mypy didn't infer it)
if not isinstance(get_proper_type(default.args[0]), AnyType):
return ctx.default_return_type
# Use the output_field argument type to fill the generic param
output_field_type = helpers.get_call_argument_type_by_name(ctx, "output_field")
if output_field_type is not None:
field_type = get_proper_type(output_field_type)
if isinstance(field_type, Instance):
return default.copy_modified(args=[field_type])
return ctx.default_return_type
def _resolve_output_field_type(expr_type: MypyType) -> MypyType | None:
"""Try to resolve the Python type for an expression's output_field.
Handles multiple resolution strategies, in order of priority:
1. Generic type args on the expression (e.g. Substr(output_field=BinaryField()) → bytes)
2. ClassVar output_field declarations (e.g. Count.output_field: ClassVar[IntegerField] → int)
3. @property/@cached_property output_field definitions (e.g. ArrayAgg → list[Any])
Generic args take priority so that expressions like Substr(output_field=BinaryField())
can override the default ClassVar[CharField] when a specific output field type is provided.
"""
proper = get_proper_type(expr_type)
if not isinstance(proper, Instance):
return None
# First, check generic type args for Field subclasses.
# This supports the Generic[_OutputField] pattern (e.g., Subquery[IntegerField], Substr[BinaryField]).
# Generic args take priority over ClassVar so that explicit type params override defaults.
for arg in proper.args:
arg_proper = get_proper_type(arg)
if isinstance(arg_proper, Instance) and arg_proper.type.has_base(fullnames.FIELD_FULLNAME):
type_args = helpers.get_field_type_args(arg_proper)
if type_args is not None and not isinstance(type_args.get, AnyType):
return type_args.get
# Then check static output_field declarations (ClassVar or @property/@cached_property).
output_field_sym = proper.type.get("output_field")
if output_field_sym is None or output_field_sym.node is None:
return None
node = output_field_sym.node
field_type: ProperType | None = None
if isinstance(node, Var) and node.type is not None:
field_type = get_proper_type(node.type)
elif isinstance(node, Decorator) and node.var.is_property:
func_type = node.func.type
if isinstance(func_type, CallableType):
field_type = get_proper_type(func_type.ret_type)
if isinstance(field_type, Instance):
result = helpers.get_private_descriptor_type(field_type.type, "_pyi_private_get_type", is_nullable=False)
if not isinstance(get_proper_type(result), AnyType):
return result
return None
def gather_expression_types(ctx: MethodContext) -> dict[str, MypyType]:
kwargs = gather_kwargs(ctx)
if not kwargs:
return {}
# Try to resolve the output_field type for each expression. For expressions
# with a static ClassVar output_field (e.g. Count → IntegerField → int),
# we can infer the concrete Python type. Otherwise, fall back to Any.
#
# NOTE: It's important that we use 'special_form' for 'Any' as otherwise we can
# get stuck with mypy interpreting an overload ambiguity towards the
# overloaded 'Field.__get__' method when its 'model' argument gets matched. This
# is because the model argument gets matched with a model subclass that is
# parametrized with a type that contains the 'Any' below and then mypy runs in
# to a (false?) ambiguity, due to 'Any', and can't decide what overload/return
# type to select
#
# Example:
# class MyModel(models.Model):
# field = models.CharField()
#
# # Our plugin auto generates the following subclass
# class MyModel_WithAnnotations(MyModel, django_stubs_ext.Annotations[_Annotations]):
# ...
# # Assume
# x = MyModel.objects.annotate(foo=F("id")).get()
# reveal_type(x) # MyModel_WithAnnotations[TypedDict({"foo": Any})]
# # Then, on an attribute access of 'field' like
# reveal_type(x.field)
#
# Now 'CharField.__get__', which is overloaded, is passed 'x' as the 'model'
# argument and mypy consider it ambiguous to decide which overload method to
# select due to the 'Any' in 'TypedDict({"foo": Any})'. But if we specify the
# 'Any' as 'TypeOfAny.special_form' mypy doesn't consider the model instance to
# contain 'Any' and the ambiguity goes away.
result: dict[str, MypyType] = {}
for name, expr_type in kwargs.items():
resolved = _resolve_output_field_type(expr_type)
if resolved is not None and not isinstance(get_proper_type(resolved), AnyType):
result[name] = resolved
else:
result[name] = AnyType(TypeOfAny.special_form)
return result
def _extract_model_type_var_upper_bound(ctx: MethodContext) -> Instance | None:
"""When the queryset's model type arg is a TypeVar bounded by a Model, return the upper bound."""
if not isinstance(ctx.type, Instance):
return None
for base_type in [ctx.type, *ctx.type.type.bases]:
if not len(base_type.args) or base_type.type.has_base(fullnames.MANY_RELATED_MANAGER):
continue
model = get_proper_type(base_type.args[0])
if isinstance(model, TypeVarType):
upper = get_proper_type(model.upper_bound)
if isinstance(upper, Instance) and helpers.is_model_type(upper.type):
return upper
return None
def _resolve_annotate_row_type(
api: TypeChecker,
default_return_type: Instance,
annotated_model: ProperType,
expression_types: dict[str, MypyType],
) -> MypyType:
if len(default_return_type.args) <= 1:
return annotated_model
original_row_type = get_proper_type(default_return_type.args[1])
if isinstance(original_row_type, TypedDictType):
annotation_td = helpers.make_typeddict(
api, {name: AnyType(TypeOfAny.from_omitted_generics) for name in expression_types}
)
return helpers.merge_typeddict(api, original_row_type, annotation_td)
if isinstance(original_row_type, TupleType):
if original_row_type.partial_fallback.type.has_base("typing.NamedTuple"):
# Rebuild the NamedTuple with existing fields + annotation fields.
annotation_fields = {name: AnyType(TypeOfAny.from_omitted_generics) for name in expression_types}
return helpers.extend_oneoff_named_tuple(api, "Row", original_row_type, annotation_fields)
return api.named_generic_type("builtins.tuple", [AnyType(TypeOfAny.from_omitted_generics)])
if isinstance(original_row_type, Instance) and helpers.is_model_type(original_row_type.type):
return annotated_model
return original_row_type
def extract_proper_type_queryset_annotate(ctx: MethodContext, django_context: DjangoContext) -> MypyType:
django_model = helpers.get_model_info_from_qs_ctx(ctx, django_context)
if django_model is None:
# When the queryset's model is a TypeVar (e.g. inside a generic queryset method body),
# use the TypeVar's upper bound to build a temporary annotated type. This allows
# `self.annotate(...)` to return `QS[Model@AnnotatedWith[...]]` which is compatible
# with return types declared as `QS[WithAnnotations[_Model, ...]]`.
upper_bound = _extract_model_type_var_upper_bound(ctx)
if upper_bound is not None:
default_return_type = get_proper_type(ctx.default_return_type)
if isinstance(default_return_type, Instance):
api = helpers.get_typechecker_api(ctx)
expression_types = gather_expression_types(ctx)
if expression_types:
fields_dict = helpers.make_typeddict(api, expression_types)
upper_annotated = get_annotated_type(api, upper_bound, fields_dict=fields_dict)
row_type = _resolve_annotate_row_type(api, default_return_type, upper_annotated, expression_types)
return default_return_type.copy_modified(args=[upper_annotated, row_type])
return AnyType(TypeOfAny.from_omitted_generics)
default_return_type = get_proper_type(ctx.default_return_type)
if not isinstance(default_return_type, Instance):
return ctx.default_return_type
api = helpers.get_typechecker_api(ctx)
expression_types = {
attr_name: typ
for attr_name, typ in gather_expression_types(ctx).items()
if check_valid_attr_value(ctx, django_context, django_model, attr_name)
}
existing_row_extra_attrs: dict[str, MypyType] = {}
if len(default_return_type.args) > 1:
original_row_type = get_proper_type(default_return_type.args[1])
if isinstance(original_row_type, Instance) and original_row_type.extra_attrs:
existing_row_extra_attrs = dict(original_row_type.extra_attrs.attrs)
all_fields = {**existing_row_extra_attrs, **expression_types}
annotated_type: ProperType = django_model.typ
if all_fields:
fields_dict = helpers.make_typeddict(api, all_fields)
annotated_type = get_annotated_type(api, django_model.typ, fields_dict=fields_dict)
row_type = _resolve_annotate_row_type(api, default_return_type, annotated_type, expression_types)
return default_return_type.copy_modified(args=[annotated_type, row_type])
def merge_annotations_from_custom_method(ctx: MethodContext, django_context: DjangoContext) -> MypyType:
"""
Method hook for custom QuerySet/Manager methods that return annotated querysets.
Ensures extra_attrs are set on annotated model Instances (so attribute access works)
and merges annotations from the caller queryset with annotations from the return type.
"""
django_model = helpers.get_model_info_from_qs_ctx(ctx, django_context)
if django_model is None:
return ctx.default_return_type
default_return_type = get_proper_type(ctx.default_return_type)
if not (
isinstance(default_return_type, Instance)
and (ret_model := helpers.extract_model_type_from_queryset(default_return_type))
and helpers.is_annotated_model(ret_model.type)
and ret_model.args
and isinstance(new_td := get_proper_type(ret_model.args[0]), TypedDictType)
):
return ctx.default_return_type
api = helpers.get_typechecker_api(ctx)
annotated_type = get_annotated_type(api, django_model.typ, fields_dict=new_td)
new_args: list[MypyType] = [annotated_type]
if len(default_return_type.args) > 1:
original_row = get_proper_type(default_return_type.args[1])
if isinstance(original_row, Instance) and helpers.is_model_type(original_row.type):
new_args.append(annotated_type)
else:
new_args.append(default_return_type.args[1])
else:
new_args.append(annotated_type)
return default_return_type.copy_modified(args=new_args)
def resolve_field_lookups(lookup_exprs: Sequence[Expression], django_context: DjangoContext) -> list[str] | None:
field_lookups = []
for field_lookup_expr in lookup_exprs:
field_lookup = helpers.resolve_string_attribute_value(field_lookup_expr, django_context)
if field_lookup is None:
return None
field_lookups.append(field_lookup)
return field_lookups
def _get_annotation_field_types(model_type: Instance) -> dict[str, MypyType]:
"""Extract annotation field types from an annotated model's TypedDict type argument."""
if model_type.args:
annotations = get_proper_type(model_type.args[0])
if isinstance(annotations, TypedDictType):
return dict(annotations.items)
return {}
def extract_proper_type_queryset_values(ctx: MethodContext, django_context: DjangoContext) -> MypyType:
"""
Extract proper return type for QuerySet.values(*fields, **expressions) method calls.
See https://docs.djangoproject.com/en/stable/ref/models/querysets/#values
"""
django_model = helpers.get_model_info_from_qs_ctx(ctx, django_context)
if django_model is None:
return ctx.default_return_type
default_return_type = get_proper_type(ctx.default_return_type)
if not isinstance(default_return_type, Instance):
return ctx.default_return_type
field_lookups = resolve_field_lookups(ctx.args[0], django_context)
if field_lookups is None:
return AnyType(TypeOfAny.from_error)
annotation_types = _get_annotation_field_types(django_model.typ) if django_model.is_annotated else {}
# Bare `.values()` case
if len(field_lookups) == 0 and not ctx.args[1]:
for field in django_context.get_model_fields(django_model.cls):
field_lookups.append(field.attname)
field_lookups.extend(annotation_types)
column_types: dict[str, MypyType] = {}
# Collect `*fields` types -- `.values("id", "name")`
for field_lookup in field_lookups:
# Check annotation fields first for annotated querysets
if annotation_type := annotation_types.get(field_lookup):
column_types[field_lookup] = annotation_type
continue
field_lookup_type = get_field_type_from_lookup(
ctx,
django_context,
django_model.cls,
lookup=field_lookup,
method="values",
silent_on_error=django_model.is_annotated,
)
if field_lookup_type is None:
if django_model.is_annotated:
column_types[field_lookup] = AnyType(TypeOfAny.from_omitted_generics)
else:
return default_return_type.copy_modified(args=[django_model.typ, AnyType(TypeOfAny.from_error)])
else:
column_types[field_lookup] = field_lookup_type
# Collect `**expressions` types -- `.values(lower_name=Lower("name"), foo=F("name"))`
column_types.update(gather_expression_types(ctx))
row_type = helpers.make_typeddict(ctx.api, column_types)
return default_return_type.copy_modified(args=[django_model.typ, row_type])
def _infer_prefetch_queryset_type(queryset_expr: Expression, api: TypeChecker) -> Instance | None:
"""Infer the model Instance from `Prefetch(queryset=...)`"""
try:
qs_type = get_proper_type(api.expr_checker.accept(queryset_expr))
except Exception:
return None
if isinstance(qs_type, Instance):
return qs_type
return None
def _resolve_prefetch_string_argument(
type_arg: MypyType,
expr: Expression | None,
django_context: DjangoContext,
arg_name: str,
) -> str | None:
# First try to get value from specialized type arg
arg_value = helpers.get_literal_str_type(type_arg)
if arg_value is not None:
return arg_value
# Fallback: parse inline call expression
if isinstance(expr, CallExpr):
arg_expr = helpers.get_class_init_argument_by_name(expr, arg_name)
if arg_expr:
return helpers.resolve_string_attribute_value(arg_expr, django_context)
return None
def _resolve_prefetch_queryset_argument(
type_arg: MypyType,
expr: Expression | None,
api: TypeChecker,
) -> Instance | None:
# First try to get queryset type from specialized type arg
queryset_type = get_proper_type(type_arg)
if isinstance(queryset_type, Instance):
elem_model = helpers.extract_model_type_from_queryset(queryset_type)
# If we got a valid specific model type, return the queryset type
if elem_model is not None and elem_model.type.fullname != fullnames.MODEL_CLASS_FULLNAME:
return queryset_type
# Fallback: parse inline call expression
if isinstance(expr, CallExpr):
queryset_expr = helpers.get_class_init_argument_by_name(expr, "queryset")
if queryset_expr is not None:
return _infer_prefetch_queryset_type(queryset_expr, api)
return None
def _specialize_string_arg_to_literal(
ctx: FunctionContext, django_context: DjangoContext, arg_name: str, fallback_type: MypyType
) -> MypyType:
"""
Helper to specialize a string argument to a Literal[str] type.
This allows the plugin to extract the actual string value for further processing
and validation in later analysis phases.
"""
if arg_expr := helpers.get_call_argument_by_name(ctx, arg_name):
if arg_value := helpers.resolve_string_attribute_value(arg_expr, django_context):
api = helpers.get_typechecker_api(ctx)
return LiteralType(value=arg_value, fallback=api.named_generic_type("builtins.str", []))
return fallback_type
def specialize_prefetch_type(ctx: FunctionContext, django_context: DjangoContext) -> MypyType:
"""Function hook for `Prefetch(...)` to specialize its `lookup` and `to_attr` generic parameters."""
default = get_proper_type(ctx.default_return_type)
if not isinstance(default, Instance):
return ctx.default_return_type
lookup_type = _specialize_string_arg_to_literal(ctx, django_context, "lookup", default.args[0])
to_attr_type = _specialize_string_arg_to_literal(ctx, django_context, "to_attr", default.args[2])
return default.copy_modified(args=[lookup_type, default.args[1], to_attr_type])
def gather_flat_args(ctx: MethodContext) -> list[tuple[Expression | None, ProperType]]:
"""
Flatten all arguments into a uniform list of (expr, typ) pairs.
This helper iterates over positional and named arguments and expands any starred
arguments when their type is a TupleType with statically known items.
"""
lookups: list[tuple[Expression | None, ProperType]] = []
arg_start_idx = 0
for expr, typ, kind in zip(ctx.args[0], ctx.arg_types[0], ctx.arg_kinds[0], strict=False):
ptyp = get_proper_type(typ)
if kind == ARG_STAR:
# Expand starred tuple items if statically known
if isinstance(ptyp, TupleType):
lookups.append((None, get_proper_type(ptyp.items[arg_start_idx])))
# If not a TupleType (e.g. list/Iterable), we cannot expand statically
arg_start_idx += 1
continue
lookups.append((expr, ptyp))
return lookups
def _get_selected_fields_from_queryset_type(qs_type: Instance) -> set[str] | None:
"""
Derive selected field names from a QuerySet type.
Sources:
- values(): encoded in the row TypedDict keys
- values_list(named=True): row is a NamedTuple; extract field names from fallback TypeInfo
- values_list(named=False): stored in qs_type.extra_attrs.immutable
"""
if len(qs_type.args) > 1:
row_type = get_proper_type(qs_type.args[1])
if isinstance(row_type, Instance) and helpers.is_model_type(row_type.type):
return None
if isinstance(row_type, TypedDictType):
return set(row_type.items.keys())
if isinstance(row_type, TupleType):
if row_type.partial_fallback.type.has_base("typing.NamedTuple"):
return {name for name, sym in row_type.partial_fallback.type.names.items() if sym.plugin_generated}
return set()
return set()
# Fallback to explicit metadata attached to the QuerySet Instance
if qs_type.extra_attrs and qs_type.extra_attrs.immutable and isinstance(qs_type.extra_attrs.immutable, set):
return qs_type.extra_attrs.immutable
return None
def _get_annotated_fields_from_queryset_type(qs_type: Instance) -> set[str]:
"""
Derive annotated field names from a QuerySet type.
Sources:
- args[0].extra_attrs: from .annotate() calls
- args[1].extra_attrs: from WithAnnotations[Model, TypedDict]
"""
fields: set[str] = set()
if len(qs_type.args) >= 1:
model_type = get_proper_type(qs_type.args[0])
if isinstance(model_type, Instance) and model_type.extra_attrs:
fields.update(model_type.extra_attrs.attrs.keys())
if len(qs_type.args) >= 2:
row_type = get_proper_type(qs_type.args[1])
if isinstance(row_type, Instance) and row_type.extra_attrs:
fields.update(row_type.extra_attrs.attrs.keys())
return fields
def check_valid_attr_value(
ctx: MethodContext,
django_context: DjangoContext,
model: DjangoModel,
attr_name: str,
*,
new_attr_names: set[str] | None = None,
) -> bool:
"""
Check if adding `attr_name` would conflict with existing symbols on `model`.
Args:
- model: The Django model being analyzed
- attr_name: The name of the attribute to be added
- new_attr_names: A mapping of field names to types currently being added to the model
"""
deselected_fields: set[str] | None = None
annotated_fields: set[str] = set()
if isinstance(ctx.type, Instance):
selected_fields = _get_selected_fields_from_queryset_type(ctx.type)
if selected_fields is not None:
model_field_names = {f.name for f in django_context.get_model_fields(model.cls)}
deselected_fields = model_field_names - selected_fields
new_attr_names = new_attr_names or set()
new_attr_names.update(selected_fields - model_field_names)
annotated_fields = _get_annotated_fields_from_queryset_type(ctx.type)
is_conflicting_attr_value = bool(
# 1. Conflict with another symbol on the model (If not de-selected via a prior .values/.values_list call).
# Ex:
# User.objects.prefetch_related(Prefetch(..., to_attr="id"))
(model.typ.type.get(attr_name) and (deselected_fields is None or attr_name not in deselected_fields))
# 2. Conflict with a previous annotation.
# Ex:
# User.objects.annotate(foo=...).prefetch_related(Prefetch(...,to_attr="foo"))
# User.objects.prefetch_related(Prefetch(...,to_attr="foo")).prefetch_related(Prefetch(...,to_attr="foo"))
or attr_name in annotated_fields
# 3. Conflict with another symbol added in the current processing.
# Ex:
# User.objects.prefetch_related(
# Prefetch("groups", Group.objects.filter(name="test"), to_attr="new_attr"),
# Prefetch("groups", Group.objects.all(), to_attr="new_attr"), # E: Not OK!
# )
or (new_attr_names is not None and attr_name in new_attr_names)
)
if is_conflicting_attr_value:
ctx.api.fail(
f'Attribute "{attr_name}" already defined on "{model.typ}"',
ctx.context,
code=NO_REDEF,
)
return not is_conflicting_attr_value
def check_valid_prefetch_related_lookup(
ctx: MethodContext,
lookup: str,
django_model: DjangoModel,
django_context: DjangoContext,
*,
is_generic_prefetch: bool = False,
) -> bool:
"""Check if a lookup string resolve to something that can be prefetched"""
current_model_cls = django_model.cls
contenttypes_installed = django_context.apps_registry.is_installed("django.contrib.contenttypes")
for through_attr in lookup.split(LOOKUP_SEP):
rel_obj_descriptor = getattr(current_model_cls, through_attr, None)
if rel_obj_descriptor is None:
# If current_model_cls is "self", we cannot use `__name__` and want "self".
model_name = getattr(current_model_cls, "__name__", current_model_cls)
ctx.api.fail(
(
f'Cannot find "{through_attr}" on "{model_name}" object, '
f'"{lookup}" is an invalid parameter to "prefetch_related()"'
),
ctx.context,
)
return False
if contenttypes_installed and is_generic_prefetch:
try:
from django.contrib.contenttypes.fields import GenericForeignKeyDescriptor
except ImportError: # Django < 6.1
from django.contrib.contenttypes.fields import ( # type: ignore[assignment]
GenericForeignKey as GenericForeignKeyDescriptor,
)
if not isinstance(rel_obj_descriptor, GenericForeignKeyDescriptor):
# If current_model_cls is "self", we cannot use `__name__` and want "self".
model_name = getattr(current_model_cls, "__name__", current_model_cls)
ctx.api.fail(
f'"{through_attr}" on "{model_name}" is not a GenericForeignKey, '
f"GenericPrefetch can only be used with GenericForeignKey fields",
ctx.context,
)
return True
elif isinstance(rel_obj_descriptor, ForwardManyToOneDescriptor):
current_model_cls = rel_obj_descriptor.field.remote_field.model
elif isinstance(rel_obj_descriptor, ReverseOneToOneDescriptor):
current_model_cls = rel_obj_descriptor.related.related_model
elif isinstance(rel_obj_descriptor, ManyToManyDescriptor):
current_model_cls = (
rel_obj_descriptor.rel.related_model if rel_obj_descriptor.reverse else rel_obj_descriptor.rel.model
)
elif isinstance(rel_obj_descriptor, ReverseManyToOneDescriptor):
if contenttypes_installed:
from django.contrib.contenttypes.fields import ReverseGenericManyToOneDescriptor
if isinstance(rel_obj_descriptor, ReverseGenericManyToOneDescriptor):
current_model_cls = rel_obj_descriptor.rel.model
continue
current_model_cls = rel_obj_descriptor.rel.related_model
else:
if contenttypes_installed:
try:
from django.contrib.contenttypes.fields import GenericForeignKeyDescriptor
except ImportError: # Django < 6.1
from django.contrib.contenttypes.fields import ( # type: ignore[assignment]
GenericForeignKey as GenericForeignKeyDescriptor,
)
if isinstance(rel_obj_descriptor, GenericForeignKeyDescriptor):
# Generic foreign keys can point to any model, so we use Model as the base type
return True
ctx.api.fail(
(
f'"{lookup}" does not resolve to an item that supports prefetching '
'- this is an invalid parameter to "prefetch_related()"'
),
ctx.context,
)
return False
return True
def check_conflicting_lookups(
ctx: MethodContext,
observed_attr: str,
qs_types: dict[str, Instance | None],
queryset_type: Instance | None,
) -> bool:
is_conflicting_lookup = bool(observed_attr in qs_types and qs_types[observed_attr] != queryset_type)
if is_conflicting_lookup:
ctx.api.fail(
f'Lookup "{observed_attr}" was already seen with a different queryset',
ctx.context,
code=NO_REDEF,
)
return is_conflicting_lookup
def extract_prefetch_related_annotations(ctx: MethodContext, django_context: DjangoContext) -> MypyType:
"""
Extract annotated attributes via `prefetch_related(Prefetch(..., to_attr=...))`
See https://docs.djangoproject.com/en/stable/ref/models/querysets/#prefetch-objects
"""
api = helpers.get_typechecker_api(ctx)
if not (
isinstance(ctx.type, Instance)
and isinstance((default_return_type := get_proper_type(ctx.default_return_type)), Instance)
and (qs_model := helpers.get_model_info_from_qs_ctx(ctx, django_context)) is not None
and ctx.args
and ctx.arg_types
and ctx.arg_types[0]
# Only process the correct overload, i.e.
# def prefetch_related(self, *lookups: str | Prefetch[_PrefetchedQuerySetT, _ToAttrT]) -> Self: ...
and None not in ctx.callee_arg_names
):
return ctx.default_return_type
new_attrs: dict[str, MypyType] = {} # A mapping of field_name / types to add to the model
qs_types: dict[str, Instance | None] = {} # A mapping of field_name / associated queryset type
for expr, typ in gather_flat_args(ctx):
if not (isinstance(typ, Instance) and typ.type.has_base(fullnames.PREFETCH_CLASS_FULLNAME)):
# Handle plain string lookups (not Prefetch instances)
lookup = helpers.get_literal_str_type(typ)
queryset_type = None
if lookup is not None:
check_valid_prefetch_related_lookup(ctx, lookup, qs_model, django_context)
check_conflicting_lookups(ctx, lookup, qs_types, queryset_type)
qs_types[lookup] = queryset_type
continue
# 1) Extract lookup value from specialized type arg or call expression
lookup = _resolve_prefetch_string_argument(typ.args[0], expr, django_context, "lookup")
# 2) Extract to_attr value from specialized type arg or call expression
to_attr = _resolve_prefetch_string_argument(typ.args[2], expr, django_context, "to_attr")
if to_attr is None and lookup is None:
continue
# 3.a) Determine queryset type from specialized type arg or call expression
queryset_type = _resolve_prefetch_queryset_argument(typ.args[1], expr, api)
# 3.b) Extract model type from queryset type (or from the lookup value)
elem_model: Instance | None = None
if queryset_type is not None and isinstance(queryset_type, Instance):
elem_model = helpers.extract_model_type_from_queryset(queryset_type)
elif lookup:
try:
observed_model_cls = django_context.resolve_lookup_into_field(qs_model.cls, lookup)[1]
if model_info := helpers.lookup_class_typeinfo(api, observed_model_cls):
elem_model = Instance(model_info, [])
except (FieldError, LookupsAreUnsupported):
pass
if to_attr and check_valid_attr_value(
ctx, django_context, qs_model, to_attr, new_attr_names=set(new_attrs.keys())
):
# When traversing multiple relations (e.g. "groups__user_set"), the to_attr is set
# on the last item of the chain (e.g. Group), not on the root model (e.g. User).
# We can't annotate an intermediate model from here, so skip adding the annotation
# to the root model to avoid incorrectly attributing to_attr to it.
if lookup and LOOKUP_SEP in lookup:
continue
new_attrs[to_attr] = api.named_generic_type(
"builtins.list",
[elem_model if elem_model is not None else AnyType(TypeOfAny.special_form)],
)
qs_types[to_attr] = queryset_type
if not to_attr and lookup:
check_valid_prefetch_related_lookup(
ctx,
lookup,
qs_model,
django_context,
is_generic_prefetch=typ.type.has_base(fullnames.GENERIC_PREFETCH_CLASS_FULLNAME),
)
check_conflicting_lookups(ctx, lookup, qs_types, queryset_type)
qs_types[lookup] = queryset_type
if not new_attrs:
return ctx.default_return_type
fields_dict = helpers.make_typeddict(api, new_attrs)
annotated_model = get_annotated_type(api, qs_model.typ, fields_dict=fields_dict)
# Keep row shape; if row is a model instance, update it to annotated
# Todo: consolidate with `extract_proper_type_queryset_annotate` row handling above.
if len(default_return_type.args) > 1:
original_row = get_proper_type(default_return_type.args[1])
row_type: MypyType = original_row
if isinstance(original_row, Instance) and helpers.is_model_type(original_row.type):
row_type = annotated_model
else:
row_type = annotated_model
return default_return_type.copy_modified(args=[annotated_model, row_type])
def _extract_field_names_from_collection(
ctx: MethodContext, django_context: DjangoContext, arg_index: int
) -> list[str] | None:
if not (
len(ctx.args) > arg_index
and ctx.args[arg_index]
and isinstance((collection_expr := ctx.args[arg_index][0]), (ListExpr, TupleExpr, SetExpr))
):
return None
return [
field_name
for field_arg in collection_expr.items
if (field_name := helpers.resolve_string_attribute_value(field_arg, django_context)) is not None
]
def _extract_field_names_from_varargs(ctx: MethodContext) -> list[str]:
return [
lookup_value
for lookup_type in (ctx.arg_types[0] if ctx.arg_types and ctx.arg_types[0] else [])
if (lookup_value := helpers.get_literal_str_type(get_proper_type(lookup_type))) is not None
]
def _get_select_related_field_choices(model_cls: type[Model]) -> set[str]:
"""
Get valid field choices for select_related lookups.
Based on Django's SQLCompiler.get_related_selections._get_field_choices method.
"""
opts = model_cls._meta
# Direct relation fields (forward relations)
direct_choices = (f.name for f in opts.fields if f.is_relation)
# Reverse relation fields (backward relations with unique=True)
reverse_choices = (f.field.related_query_name() for f in opts.related_objects if f.field.unique)
return {*direct_choices, *reverse_choices}
def _validate_select_related_lookup(
ctx: MethodContext,
django_context: DjangoContext,
model_cls: type[Model],
lookup: str,
) -> bool:
"""Validate a single select_related lookup string."""
if not lookup.strip():
ctx.api.fail(
f'Invalid field name "{lookup}" in select_related lookup',
ctx.context,
)
return False
lookup_parts = lookup.split(LOOKUP_SEP)
observed_model = model_cls
for i, part in enumerate(lookup_parts):
valid_choices = _get_select_related_field_choices(observed_model)
if part not in valid_choices:
ctx.api.fail(
f'Invalid field name "{part}" in select_related lookup. '
f"Choices are: {', '.join(sorted(valid_choices)) or '(none)'}",
ctx.context,
)
return False
if i < len(lookup_parts) - 1: # Not the last part
try:
field, observed_model = django_context.resolve_lookup_into_field(observed_model, part)
if field is None:
return False
except (FieldError, LookupsAreUnsupported):
# For good measure, but we should never reach this since we already validated the part name
return False
return True
def validate_select_related(ctx: MethodContext, django_context: DjangoContext) -> MypyType:
"""
Validates that all lookup strings passed to select_related() resolve to actual model fields and relations.
Extracted and adapted from `django.db.models.sql.compiler.SQLCompiler.get_related_selections`
"""
if (django_model := helpers.get_model_info_from_qs_ctx(ctx, django_context)) is None:
return ctx.default_return_type
for lookup_value in _extract_field_names_from_varargs(ctx):
_validate_select_related_lookup(ctx, django_context, django_model.cls, lookup_value)
return ctx.default_return_type
def validate_bulk_update(
ctx: MethodContext, django_context: DjangoContext, method: Literal["bulk_update", "abulk_update"]
) -> MypyType:
"""
Type check the `fields` argument passed to `QuerySet.bulk_update(...)`.
Extracted and adapted from `django.db.models.query.QuerySet.bulk_update`
Mirrors tests from `django/tests/queries/test_bulk_update.py`
"""
if (django_model := helpers.get_model_info_from_qs_ctx(ctx, django_context)) is None or (
field_names := _extract_field_names_from_collection(ctx, django_context, arg_index=1)
) is None:
return ctx.default_return_type
if not field_names:
# Only error if the collection literal itself is empty (not when items are unresolvable).
collection_expr = ctx.args[1][0]
if isinstance(collection_expr, (ListExpr, TupleExpr, SetExpr)) and not collection_expr.items:
ctx.api.fail(f'Field names must be given to "{method}()"', ctx.context)
return ctx.default_return_type
for field_name in field_names:
validate_non_pk_concrete_field(ctx, django_model.cls, field_name, method)
return ctx.default_return_type
def _validate_bulk_create_unique_field(
ctx: MethodContext, model_cls: type[Model], field_name: str, method: str
) -> bool:
return (field := try_get_field(ctx, model_cls, field_name, resolve_pk=True)) is not None and check_field_concrete(
ctx, field, field_name, method
)
def validate_bulk_create(
ctx: MethodContext, django_context: DjangoContext, method: Literal["bulk_create", "abulk_create"]
) -> MypyType:
"""
Type check the `update_fields` and `unique_fields` arguments passed to `QuerySet.bulk_create(...)`.
Extracted and adapted from `django.db.models.query.QuerySet._check_bulk_create_options`
"""
if (django_model := helpers.get_model_info_from_qs_ctx(ctx, django_context)) is None:
return ctx.default_return_type
update_field_names = _extract_field_names_from_collection(ctx, django_context, arg_index=4)
if update_field_names is not None:
for field_name in update_field_names:
validate_non_pk_concrete_field(ctx, django_model.cls, field_name, method, attr_name="update_fields")
unique_field_names = _extract_field_names_from_collection(ctx, django_context, arg_index=5)
if unique_field_names is not None:
for field_name in unique_field_names:
_validate_bulk_create_unique_field(ctx, django_model.cls, field_name, method)
return ctx.default_return_type
def _validate_lookup(ctx: MethodContext, model_cls: type[Model], parts: list[str]) -> None:
# Abstract models don't have a pk field, skip validation
if model_cls._meta.abstract:
return
try:
_, final_field, _, remainder = Query(model_cls).names_to_path(parts, model_cls._meta)
except FieldError as exc:
ctx.api.fail(exc.args[0], ctx.context)
return
if remainder:
# Check if the trailing part is a valid transform (e.g. __year, __month) on the field.
# Transforms are allowed, but lookups (e.g. __exact) are not.
if final_field.get_transform(remainder[0]) is None:
msg = f"Cannot resolve keyword '{remainder[0]}' into field or transform on '{final_field.name}'."
ctx.api.fail(msg, ctx.context)
def _validate_order_by_lookup(ctx: MethodContext, model_cls: type[Model], parts: list[str]) -> None:
if len(parts) == 1 and parts[0] == "?":
return
_validate_lookup(ctx, model_cls, parts)
def validate_order_by(ctx: MethodContext, django_context: DjangoContext) -> MypyType:
if (django_model := helpers.get_model_info_from_qs_ctx(ctx, django_context)) is None:
return ctx.default_return_type
selected_fields = _get_selected_fields_from_queryset_type(ctx.type) if isinstance(ctx.type, Instance) else None
annotated_fields = _get_annotated_fields_from_queryset_type(ctx.type) if isinstance(ctx.type, Instance) else set()
for lookup_value in _extract_field_names_from_varargs(ctx):
parts = lookup_value.removeprefix("-").split(LOOKUP_SEP)
if parts[0] in annotated_fields:
# Skip validation for annotated fields
continue
if selected_fields is not None and parts[0] in selected_fields:
# Skip validation for fields selected via values()/values_list()
continue
_validate_order_by_lookup(ctx, django_model.cls, parts)
return ctx.default_return_type
def _validate_defer_only_fields(
ctx: MethodContext, model_cls: type[Model], field_names: list[str], *, is_defer: bool
) -> None:
if not is_defer and model_cls._meta.abstract:
# Abstract models do not have a primary key field, but Query.add_immediate_loading()
# assumes that one exists when resolving the "pk" alias.
field_names = [field_name for field_name in field_names if field_name != "pk"]
query = Query(model_cls)
query.add_deferred_loading(field_names) if is_defer else query.add_immediate_loading(field_names)
try:
query.get_select_mask()
except (FieldDoesNotExist, FieldError) as exc:
method = "defer" if is_defer else "only"
ctx.api.fail(f'Invalid field in "{method}()": {exc.args[0]}', ctx.context)
def validate_defer_only(ctx: MethodContext, django_context: DjangoContext, *, is_defer: bool) -> MypyType:
if (django_model := helpers.get_model_info_from_qs_ctx(ctx, django_context)) is None or not (
field_names := _extract_field_names_from_varargs(ctx)
):
return ctx.default_return_type
_validate_defer_only_fields(ctx, django_model.cls, field_names, is_defer=is_defer)
return ctx.default_return_type
def validate_distinct(ctx: MethodContext, django_context: DjangoContext) -> MypyType:
if (django_model := helpers.get_model_info_from_qs_ctx(ctx, django_context)) is None:
return ctx.default_return_type
selected_fields = _get_selected_fields_from_queryset_type(ctx.type) if isinstance(ctx.type, Instance) else None
annotated_fields = _get_annotated_fields_from_queryset_type(ctx.type) if isinstance(ctx.type, Instance) else set()
for lookup_value in _extract_field_names_from_varargs(ctx):
parts = lookup_value.split(LOOKUP_SEP)
if parts[0] in annotated_fields:
# Skip validation for annotated fields
continue
if selected_fields is not None and parts[0] in selected_fields:
# Skip validation for fields selected via values()/values_list()
continue
_validate_lookup(ctx, django_model.cls, parts)
return ctx.default_return_type
def gather_update_kwargs(ctx: MethodContext) -> dict[str, MypyType]:
"""Gather named arguments destined for the `**kwargs` collector."""
kwargs: dict[str, MypyType] = {}
named = (ARG_NAMED, ARG_NAMED_OPT)
slots = zip(ctx.callee_arg_names, ctx.arg_kinds, ctx.arg_types, ctx.arg_names, strict=False)
for formal_name, kinds, types, names in slots:
for kind, arg_type, name in zip(kinds, types, names, strict=False):
if kind in named and name is not None and name != formal_name:
kwargs[name] = arg_type
return kwargs
def validate_update(ctx: MethodContext, django_context: DjangoContext) -> MypyType:
if (django_model := helpers.get_model_info_from_qs_ctx(ctx, django_context)) is None or not (
kwargs := gather_update_kwargs(ctx)
):
return ctx.default_return_type
for field_name in kwargs:
field = try_get_field(ctx, django_model.cls, field_name)
if field is not None:
check_field_concrete(ctx, field, field_name, method="update")
return ctx.default_return_type
def validate_in_bulk(ctx: MethodContext, django_context: DjangoContext) -> MypyType:
if (
(django_model := helpers.get_model_info_from_qs_ctx(ctx, django_context)) is None
or (field_name_expr := helpers.get_call_argument_by_name(ctx, "field_name")) is None
or (field_name := helpers.resolve_string_attribute_value(field_name_expr, django_context)) is None
or field_name == "pk"
or (field := try_get_field(ctx, django_model.cls, field_name)) is None
):
return ctx.default_return_type
check_field_unique(ctx, django_model.cls, field, field_name, method="in_bulk")
return ctx.default_return_type
typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/request.py 0000664 0000000 0000000 00000000760 15260643574 0027535 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING
from mypy.types import Type as MypyType
from mypy.types import UninhabitedType, get_proper_type
if TYPE_CHECKING:
from mypy.plugin import MethodContext
def check_querydict_is_mutable(ctx: MethodContext) -> MypyType:
ret_type = get_proper_type(ctx.default_return_type)
if isinstance(ret_type, UninhabitedType):
ctx.api.fail("This QueryDict is immutable.", ctx.context)
return ctx.default_return_type
typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/save.py 0000664 0000000 0000000 00000003002 15260643574 0026773 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING
from mypy.nodes import ListExpr, SetExpr, TupleExpr
from mypy.types import Instance
from mypy.types import Type as MypyType
from mypy_django_plugin.lib import helpers
from mypy_django_plugin.lib.field_validation import validate_non_pk_concrete_field
if TYPE_CHECKING:
from mypy.plugin import MethodContext
from mypy_django_plugin.django.context import DjangoContext
def validate_save_update_fields(ctx: MethodContext, django_context: DjangoContext, method: str) -> MypyType:
"""
Type check the keyword-only `update_fields` argument passed to `Model.save(...)` / `Model.asave(...)`.
"""
if not isinstance(ctx.type, Instance) or not helpers.is_model_type(ctx.type.type):
return ctx.default_return_type
django_model = helpers.DjangoModel.from_model_type(ctx.type, django_context)
if django_model is None:
return ctx.default_return_type
update_fields_expr = helpers.get_call_argument_by_name(ctx, "update_fields")
if not isinstance(update_fields_expr, (ListExpr, TupleExpr, SetExpr)):
# `None`, a `set()` call, or any non-literal collection cannot be checked statically.
return ctx.default_return_type
for field_arg in update_fields_expr.items:
field_name = helpers.resolve_string_attribute_value(field_arg, django_context)
if field_name is not None:
validate_non_pk_concrete_field(ctx, django_model.cls, field_name, method)
return ctx.default_return_type
typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/settings.py 0000664 0000000 0000000 00000003736 15260643574 0027713 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING
from mypy.nodes import MemberExpr
from mypy.types import AnyType, TypeOfAny
from mypy.types import Type as MypyType
from mypy_django_plugin.lib import helpers
if TYPE_CHECKING:
from mypy.plugin import AttributeContext
from mypy_django_plugin.config import DjangoPluginConfig
from mypy_django_plugin.django.context import DjangoContext
def get_type_of_settings_attribute(
ctx: AttributeContext, django_context: DjangoContext, plugin_config: DjangoPluginConfig
) -> MypyType:
if not isinstance(ctx.context, MemberExpr):
return ctx.default_attr_type
setting_name = ctx.context.name
typechecker_api = helpers.get_typechecker_api(ctx)
# first look for the setting in the project settings file, then global settings
settings_module = typechecker_api.modules.get(django_context.django_settings_module)
global_settings_module = typechecker_api.modules.get("django.conf.global_settings")
for module in [settings_module, global_settings_module]:
if module is not None:
sym = module.names.get(setting_name)
if sym is not None:
if sym.type is None:
# When analysing a function, mypy will defer analysis to a later pass
typechecker_api.handle_cannot_determine_type(setting_name, ctx.context)
return ctx.default_attr_type
return sym.type
# Now, we want to check if this setting really exist in runtime.
# If it does, we just return `Any`, not to raise any false-positives.
# But, we cannot reconstruct the exact runtime type.
# See https://github.com/typeddjango/django-stubs/pull/1163
if not plugin_config.strict_settings and hasattr(django_context.settings, setting_name):
return AnyType(TypeOfAny.implementation_artifact)
ctx.api.fail(f"'Settings' object has no attribute {setting_name!r}", ctx.context)
return ctx.default_attr_type
typeddjango-django-stubs-fa03b48/pyproject.toml 0000664 0000000 0000000 00000013062 15260643574 0021763 0 ustar 00root root 0000000 0000000 [project]
name = "django-stubs"
version = "6.1.2"
description = "Mypy stubs for Django"
readme = "README.md"
license = "MIT"
license-files = ["LICENSE.md"]
requires-python = ">=3.11"
authors = [
{ name = "Maksim Kurnikov", email = "maxim.kurnikov@gmail.com" },
]
maintainers = [
{ name = "Marti Raudsepp", email = "marti@juffo.org" },
{ name = "Nikita Sobolev", email = "mail@sobolevn.me" },
{ name = "Petter Friberg", email = "petter_friberg@hotmail.com" },
{ name = "Adam Johnson", email = "me@adamj.eu" },
]
classifiers = [
"Operating System :: OS Independent",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
"Typing :: Typed",
"Framework :: Django",
"Framework :: Django :: 5.2",
"Framework :: Django :: 6.0",
"Framework :: Django :: 6.1",
]
dependencies = [
"django",
"django-stubs-ext>=6.0.2",
# Types:
"types-pyyaml",
"typing-extensions>=4.11.0",
]
[project.optional-dependencies]
compatible-mypy = ["mypy>=1.13,<2.5"]
oracle = ["oracledb"]
redis = ["redis", "types-redis"]
[dependency-groups]
tests = [
# Dev tools:
"pytest==9.1.1",
"pytest-mypy-plugins==4.0.3",
"pytest-shard==0.1.2",
"pytest-xdist==3.8.0",
# Django deps:
"django==5.2.17; python_version < '3.12'",
"django==6.1.1; python_version >= '3.12'",
"mysqlclient==2.3.0",
"psycopg[binary]==3.3.6",
"psycopg2-binary==2.9.13",
"jinja2==3.1.6",
"pyyaml==6.0.3",
# typing:
"django-stubs[compatible-mypy,oracle,redis]",
]
pyright = [
"pyright==1.1.414",
]
pyrefly = [
"pyrefly==1.3.2",
"psycopg2-binary"
]
ty = [
"ty==0.0.83",
"psycopg2-binary"
]
dev = [
{include-group = "tests"},
{include-group = "pyright"},
{include-group = "pyrefly"},
{include-group = "ty"},
]
[project.urls]
Homepage = "https://github.com/typeddjango/django-stubs"
Funding = "https://github.com/sponsors/typeddjango"
"Release notes" = "https://github.com/typeddjango/django-stubs/releases"
[tool.uv.sources]
django-stubs = { workspace = true }
django-stubs-ext = { workspace = true }
[tool.uv.workspace]
members = ["ext"]
[build-system]
requires = ["uv_build>=0.12.0,<0.13.0"]
build-backend = "uv_build"
[tool.uv.build-backend]
module-name = ["django-stubs", "mypy_django_plugin"]
module-root = ""
[tool.pyright]
include = ["tests/assert_type/"]
typeCheckingMode = "strict"
# Extra strict settings
reportImplicitStringConcatenation = "error"
reportUninitializedInstanceVariable = "error"
reportUnnecessaryTypeIgnoreComment = "error"
# Don't use '# type: ignore' to suppress with pyright
enableTypeIgnoreComments = false
# If a test case uses this anti-pattern, there's likely a reason and annoying to `type: ignore`.
# Let Ruff flag it (B006)
reportCallInDefaultInitializer = "none"
# Too strict and not needed for type testing
reportMissingSuperCall = "none"
# Stubs are allowed to use private variables. We may want to test those.
reportPrivateUsage = "none"
# Stubs don't need the actual modules to be installed
reportMissingModuleSource = "none"
[tool.pyrefly]
# Respect only `# pyrefly: ignore` (ignore `# type: ignore`)
enabled-ignores = ["pyrefly"]
[tool.pyrefly.errors]
unused-ignore = true
[tool.ty.terminal]
error-on-warning = true
[tool.ty.analysis]
# Respect only `# ty: ignore` (ignore `# type: ignore`)
respect-type-ignore-comments = false
[tool.codespell]
ignore-words-list = "aadd,acount,asend,indentity,nam"
[tool.ruff]
# Adds to default excludes: https://ruff.rs/docs/settings/#exclude
line-length = 120
target-version = "py311"
[tool.ruff.lint]
# See Rules in Ruff documentation: https://beta.ruff.rs/docs/rules/
select = [
"B", # bugbear
"E", # pycodestyle
"F", # pyflakes
"FURB", # refurb
"INP", # flake8-tidy-imports
"W", # pycodestyle
"I", # isort
"ISC001", # Implicitly concatenated string literals on one line
"ISC002", # Implicitly concatenated string literals over multiple lines
"UP", # pyupgrade
"TID251", # Disallowed imports (flake8-tidy-imports.banned-api)
"PYI", # flake8-pyi
"RUF100", # Equivalent to flake8-noqa NQA103
"PGH004", # Equivalent to flake8-noqa NQA104
"PGH003", # Disallowed blanket `type: ignore` annotations.
"RET504", # Unnecessary assignment to {name} before return statement
"RET505", # Unnecessary {branch} after return statement
"RET506", # Unnecessary {branch} after raise statement
"RET507", # Unnecessary {branch} after continue statement
"RET508", # Unnecessary {branch} after break statement
"RUF", # Ruff specific rules
"TC", # flake8-type-checking
]
ignore = [
"PYI021", # We have a few meaningful docstrings for stubs only constructs/utilities.
"PYI041", # This might not be obvious that `float | int` is mostly equivalent to `float` typing wise | int | str
"PYI043",
]
[tool.ruff.lint.per-file-ignores]
"*.pyi" = [
"B",
"E501",
"E741",
"E743",
"F403", # Use wildcard import
"F405",
"F822",
"F821",
]
"tests/*.py" = ["INP001", "PGH003", "RUF012"]
"ext/tests/*.py" = ["INP001"]
"setup.py" = ["INP001"]
"tests/assert_type/*.py" = ["B", "UP013"]
[tool.ruff.lint.flake8-tidy-imports.banned-api]
"_typeshed.Self".msg = "Use typing_extensions.Self (PEP 673) instead. If you type a metaclass, add a noqa"
"typing.TypeVar".msg = "Only support the `default` parameter in Python 3.13 and above. Use `typing_extensions.TypeVar` instead."
[tool.ruff.lint.isort]
known-first-party = ["django_stubs_ext", "mypy_django_plugin"]
required-imports = ["from __future__ import annotations"]
split-on-trailing-comma = false
typeddjango-django-stubs-fa03b48/pytest.ini 0000664 0000000 0000000 00000000361 15260643574 0021076 0 ustar 00root root 0000000 0000000 [pytest]
testpaths =
./tests
./ext/tests
addopts =
--tb=native
-s
-v
--cache-clear
--mypy-ini-file=mypy.ini
--mypy-extension-hook=scripts.tests_extension_hook.django_plugin_hook
--ignore=tests/assert_type
typeddjango-django-stubs-fa03b48/scripts/ 0000775 0000000 0000000 00000000000 15260643574 0020534 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/scripts/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0022633 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/scripts/django_tests_settings.py 0000664 0000000 0000000 00000001715 15260643574 0025516 0 ustar 00root root 0000000 0000000 # It is used in `mypy.ini` only.
# The following installed apps are required for stubtest to run correctly.
from __future__ import annotations
import pathlib
_REPO_ROOT = pathlib.Path(__file__).resolve().parent.parent
_ASSERT_TYPE_APPS_ROOT = _REPO_ROOT / "tests" / "assert_type"
def _discover_assert_type_apps() -> list[str]:
"""Discover Django apps under `tests/assert_type`.
Each directory containing a `models.py` is registered as an app,
with the directory name as the implicit `app_label`.
"""
return sorted(
".".join(models_py.parent.relative_to(_REPO_ROOT).parts)
for models_py in _ASSERT_TYPE_APPS_ROOT.rglob("models.py")
)
INSTALLED_APPS = [
"django.contrib.auth",
"django.contrib.admin",
"django.contrib.contenttypes",
"django.contrib.flatpages",
"django.contrib.redirects",
"django.contrib.sessions",
"django.contrib.sites",
*_discover_assert_type_apps(),
]
STATIC_URL = "static/"
typeddjango-django-stubs-fa03b48/scripts/stubtest.sh 0000775 0000000 0000000 00000001330 15260643574 0022745 0 ustar 00root root 0000000 0000000 #!/bin/sh
# Run this script with `./scripts/stubtest.sh [additional_stubtest_args]`
set -e
export MYPYPATH='.'
# Getting per version allowlist file:
PYTHON_VERSION="$(python --version 2>&1 | sed 's/Python \([0-9]*\)\.\([0-9]*\)\..*/\1\2/')"
PYTHON_VERSION_ALLOWLIST="scripts/stubtest/allowlist_python${PYTHON_VERSION}.txt"
if [ -f "$PYTHON_VERSION_ALLOWLIST" ]; then
VERSION_SPECIFIC_ALLOWLIST="--allowlist $PYTHON_VERSION_ALLOWLIST"
else
VERSION_SPECIFIC_ALLOWLIST=
fi
# Cleaning existing cache:
rm -rf .mypy_cache
stubtest django \
--mypy-config-file mypy.ini \
--allowlist scripts/stubtest/allowlist.txt \
--allowlist scripts/stubtest/allowlist_todo.txt \
$VERSION_SPECIFIC_ALLOWLIST \
"$@"
typeddjango-django-stubs-fa03b48/scripts/stubtest/ 0000775 0000000 0000000 00000000000 15260643574 0022411 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/scripts/stubtest/allowlist.txt 0000664 0000000 0000000 00000033475 15260643574 0025200 0 ustar 00root root 0000000 0000000 # This is a true allow list with things that we really don't care about.
# `allowlist_todo.txt` is autogenerated by `stubtest --generate-allowlist`
# and might contain actual problems and things that we *do want* to fix.
#
# Please, move things here when you are sure that they really should be ignored.
# Comments about why things are ignored are mandatory.
# We don't need locales:
django.conf.locale.*
# We don't need migrations:
django.contrib.admin.migrations.*
django.contrib.auth.migrations.*
django.contrib.contenttypes.migrations.*
django.contrib.flatpages.migrations.*
django.contrib.redirects.migrations.*
django.contrib.sessions.migrations.*
django.contrib.sites.migrations.*
# `python -m django` entry point: everything is behind `if __name__ == "__main__"`,
# so there is nothing importable to stub. Same as the locale and migration modules above.
django.__main__
# Note: At runtime, these are `LazyObject` or `ConnectionProxy` instances.
# However, to avoid type degradation, we stub them using the underlying target type instead.
#
# Why? Both wrapper classes define `__getattr__(self, name: str) -> Any`.
# Type-hinting as the wrapper would turn every attribute access into `Any`.
django.contrib.admin.sites.site
django.contrib.staticfiles.finders.DefaultStorageFinder.storage
django.contrib.staticfiles.storage.staticfiles_storage
django.core.cache.cache
django.core.files.storage.default_storage
django.db.connection
django.tasks.default_task_backend
# path/re_path are actually functools.partial objects at runtime, but stubs type them as functions
django.urls.conf.path
django.urls.conf.re_path
# '_RelatedManager' entries are plugin generated and these subclasses only exist
# _locally/dynamically_ runtime -- Created via
# 'django.db.models.fields.related_descriptors.create_reverse_many_to_one_manager'
django.contrib.admin.models.LogEntry_RelatedManager
django.contrib.auth.models.Permission_RelatedManager
# '_ManyRelatedManager' entries are plugin generated and these subclasses only exist
# _locally/dynamically_ runtime -- Created via
# 'django.db.models.fields.related_descriptors.create_forward_many_to_many_manager'
django.contrib.auth.models.Group_ManyRelatedManager
django.contrib.auth.models.Permission_ManyRelatedManager
django.contrib.auth.models.User_ManyRelatedManager
django.contrib.flatpages.models.FlatPage_ManyRelatedManager
django.contrib.sites.models.Site_ManyRelatedManager
# BaseArchive abstract methods that take no argument, but typed with arguments to match the Archive and TarArchive Implementations
django.utils.archive.BaseArchive.list
django.utils.archive.BaseArchive.extract
# Runtime default is the cached_property descriptor itself
django.contrib.auth.password_validation.CommonPasswordValidator.__init__
# Promise is lazy, see notes in .pyi
django.utils.functional.Promise.__init__
django.utils.functional.Promise.__add__
django.utils.functional.Promise.__deepcopy__
django.utils.functional.Promise.__radd__
django.utils.functional.Promise.__mod__
# DEFAULT_TRIM_VALUE is a SimpleLazyObject at runtime, which causes stubtest to crash
# when trying to infer its type as a LiteralType (stubtest bug).
django.contrib.gis.geos.prototypes.io.DEFAULT_TRIM_VALUE
# `classonlymethod` is an alias for `@classmethod` which is disjoint:
django.utils.decorators.classonlymethod
# At runtime these return functools.partial via class_or_instance_method descriptor
django.db.models.query_utils.RegisterLookupMixin.get_lookups
django.db.models.query_utils.RegisterLookupMixin.register_lookup
django.db.models.query_utils.RegisterLookupMixin._unregister_lookup
# Lazy regex
django.contrib.admin.utils.UNQUOTE_RE
django.contrib.admindocs.utils.named_group_matcher
django.contrib.admindocs.utils.non_capturing_group_matcher
django.contrib.admindocs.utils.unnamed_group_matcher
django.contrib.gis.db.models.lookups.RelateLookup.pattern_regex
django.contrib.gis.geometry.hex_regex
django.contrib.gis.geometry.json_regex
django.contrib.gis.geometry.wkt_regex
django.contrib.postgres.search.multiple_spaces_re
django.contrib.postgres.search.spec_chars_re
django.core.cache.backends.base.memcached_error_chars_re
django.core.validators.EmailValidator.domain_regex
django.core.validators.EmailValidator.literal_regex
django.core.validators.EmailValidator.user_regex
django.core.validators.slug_re
django.core.validators.slug_unicode_re
django.core.validators.URLValidator.regex
django.core.management.commands.makemessages.plural_forms_re
django.core.management.commands.runserver.naiveip_re
django.db.backends.mysql.base.server_version_re
django.db.backends.mysql.compiler.SQLCompiler.ordering_parts
django.db.backends.sqlite3.base.FORMAT_QMARK_REGEX
django.db.backends.sqlite3.introspection.field_size_re
django.db.models.functions.comparison.Collate.collation_re
django.db.models.sql.compiler.SQLCompiler.ordering_parts
django.forms.fields.IntegerField.re_decimal
django.forms.widgets.SelectDateWidget.date_re
django.http.request.host_validation_re
django.middleware.csrf.invalid_token_chars_re
django.middleware.gzip.re_accepts_gzip
django.template.base.filter_re
django.template.base.kwarg_re
django.test.client.CONTENT_TYPE_RE
django.test.client.JSON_CONTENT_TYPE_RE
django.test.html.ASCII_WHITESPACE
django.utils.dateformat.re_escaped
django.utils.dateformat.re_formatchars
django.utils.dateparse.date_re
django.utils.dateparse.datetime_re
django.utils.dateparse.iso8601_duration_re
django.utils.dateparse.postgres_interval_re
django.utils.dateparse.standard_duration_re
django.utils.dateparse.time_re
django.utils.html.Urlizer.simple_url_2_re
django.utils.html.Urlizer.simple_url_re
django.utils.html.Urlizer.word_split_re
django.utils.html.long_open_tag_without_closing_re
django.utils.http.ASCTIME_DATE
django.utils.http.ETAG_MATCH
django.utils.http.RFC1123_DATE
django.utils.http.RFC850_DATE
django.utils.text.re_newlines
django.utils.text.re_camel_case
django.utils.text.smart_split_re
django.utils.translation.trans_real.language_code_re
django.utils.translation.trans_real.language_code_prefix_re
django.utils.translation.trans_real.accept_language_re
django.utils.translation.template.plural_re
django.utils.translation.template.inline_re
django.utils.translation.template.endblock_re
django.utils.translation.template.dot_re
django.utils.translation.template.context_re
django.utils.translation.template.constant_re
django.utils.translation.template.block_re
django.utils.version.version_component_re
django.views.debug.SafeExceptionReporterFilter.hidden_settings
django.http.multipartparser.MultiPartParser.boundary_re
# AlterTogetherOptionOperation.option_name is set as None,
# but is required in the init, so we type it as str
django.db.migrations.operations.models.AlterTogetherOptionOperation.option_name
# These are set to None in the base class but *must* be overridden
# because they are required in the init, so we type them without the None option.
django.contrib.gis.db.backends.spatialite.base.DatabaseWrapper.ops
django.db.backends.base.base.BaseDatabaseWrapper.SchemaEditorClass
django.db.backends.base.base.BaseDatabaseWrapper.client_class
django.db.backends.base.base.BaseDatabaseWrapper.creation_class
django.db.backends.base.base.BaseDatabaseWrapper.features_class
django.db.backends.base.base.BaseDatabaseWrapper.introspection_class
django.db.backends.base.base.BaseDatabaseWrapper.ops
django.db.backends.base.base.BaseDatabaseWrapper.ops_class
django.db.backends.mysql.base.DatabaseWrapper.ops
django.db.backends.postgresql.base.DatabaseWrapper.ops
django.db.backends.sqlite3.base.DatabaseWrapper.ops
# Attributes defaulting to None messing with mypy
django.contrib.admin.options.InlineModelAdmin.model
django.contrib.admin.options.InlineModelAdmin.template
django.views.generic.detail.SingleObjectMixin.model
django.views.generic.edit.BaseDeleteView.form_class
# Dynamically added via django.core.management.color.make_style
django.core.management.color.Style.ERROR
django.core.management.color.Style.ERROR_OUTPUT
django.core.management.color.Style.HTTP_BAD_REQUEST
django.core.management.color.Style.HTTP_INFO
django.core.management.color.Style.HTTP_NOT_FOUND
django.core.management.color.Style.HTTP_NOT_MODIFIED
django.core.management.color.Style.HTTP_REDIRECT
django.core.management.color.Style.HTTP_SERVER_ERROR
django.core.management.color.Style.HTTP_SUCCESS
django.core.management.color.Style.MIGRATE_HEADING
django.core.management.color.Style.MIGRATE_LABEL
django.core.management.color.Style.NOTICE
django.core.management.color.Style.SQL_COLTYPE
django.core.management.color.Style.SQL_FIELD
django.core.management.color.Style.SQL_KEYWORD
django.core.management.color.Style.SQL_TABLE
django.core.management.color.Style.SUCCESS
django.core.management.color.Style.WARNING
# Custom __str__ that we don't want to overcomplicate:
django.forms.utils.RenderableMixin.__str__
django.forms.utils.RenderableMixin.__html__
# Dynamically added in ManyToManyField.contribute_to_class()
django.db.models.fields.related.ManyToManyField.m2m_db_table
# Dynamically added in ManyToManyField.contribute_to_related_class()
django.db.models.fields.related.ManyToManyField.m2m_column_name
django.db.models.fields.related.ManyToManyField.m2m_field_name
django.db.models.fields.related.ManyToManyField.m2m_reverse_field_name
django.db.models.fields.related.ManyToManyField.m2m_reverse_name
django.db.models.fields.related.ManyToManyField.m2m_reverse_target_field_name
django.db.models.fields.related.ManyToManyField.m2m_target_field_name
# Defined inside a signature (using the walrus operator)
django.core.management.utils.sentinel
# Plugin generated model instances for '.annotate' support
django.contrib.admin.models.LogEntry@AnnotatedWith
django.contrib.auth.base_user.AbstractBaseUser@AnnotatedWith
django.contrib.auth.models.AbstractUser@AnnotatedWith
django.contrib.auth.models.Group@AnnotatedWith
django.contrib.auth.models.Permission@AnnotatedWith
django.contrib.auth.models.PermissionsMixin@AnnotatedWith
django.contrib.auth.models.User@AnnotatedWith
django.contrib.contenttypes.models.ContentType@AnnotatedWith
django.contrib.flatpages.models.FlatPage@AnnotatedWith
django.contrib.gis.db.backends.oracle.models.OracleGeometryColumns@AnnotatedWith
django.contrib.gis.db.backends.oracle.models.OracleSpatialRefSys@AnnotatedWith
django.contrib.gis.db.backends.postgis.models.PostGISGeometryColumns@AnnotatedWith
django.contrib.gis.db.backends.postgis.models.PostGISSpatialRefSys@AnnotatedWith
django.contrib.gis.db.backends.spatialite.models.SpatialiteGeometryColumns@AnnotatedWith
django.contrib.gis.db.backends.spatialite.models.SpatialiteSpatialRefSys@AnnotatedWith
django.contrib.redirects.models.Redirect@AnnotatedWith
django.contrib.sessions.base_session.AbstractBaseSession@AnnotatedWith
django.contrib.sessions.models.Session@AnnotatedWith
django.contrib.sites.models.Site@AnnotatedWith
django.db.migrations.recorder.Migration@AnnotatedWith
# These are `UserModel = get_user_model()` lines, the plugin updates them to correct types
django.contrib.auth.backends.UserModel
django.contrib.auth.forms.UserModel
django.contrib.auth.views.UserModel
# These are dynamically added when using `save(commit=False)`
# See https://docs.djangoproject.com/en/stable/topics/forms/modelforms/#the-save-method
django.forms.models.BaseModelForm.save_m2m
django.forms.models.BaseModelFormSet.save_m2m
# Dynamically generated in https://github.com/django/django/blob/0ee06c04e0256094270db3ffe8b5dafa6a8457a3/django/core/mail/backends/locmem.py#L24
django.core.mail.outbox
# Variable is supposed to be a set but is initialised to an empty dict
django.contrib.gis.db.backends.base.features.BaseSpatialFeatures.unsupported_geojson_options
# We declare more strict types for this in stubs to avoid RuntimeErrors.
# Django uses a `*args` parameter but crash if it contains more than 1 element.
django.http.request.QueryDict.pop
# The `task` decorator supports both `@task` and `@task(...)` forms. Stubs use
# overloads to type each case separately, so `function` doesn't accept `None`.
django.tasks.base.task
# Django incorrectly uses a signature of `(cls, **kwargs)` when it should be `(cls, *args, **kwargs)`.
django.test.selenium.SeleniumTestCase.__init_subclass__
# mypy does not understand __getitem__ unpacking python/mypy#2220
django.urls.resolvers.ResolverMatch.__iter__
# The parameters form_class / choices_form_class are positional at runtime, but
# usage and docs always pass them as keyword args; additionally, all subclasses
# require them to be keyword-only, so require all usage to be keyword-only.
django.db.models.fields.Field.formfield
# `form` is a TypeVar with a PEP 696 default of `ModelForm[_M]`, so omitting it still ties the
# formset to the model. stubtest never resolves TypeVar defaults, so it can't tell that the
# runtime `ModelForm` default satisfies `type[_ModelFormT]`.
django.contrib.contenttypes.forms.generic_inlineformset_factory
django.forms.models.inlineformset_factory
django.forms.models.modelformset_factory
# Stub-only, replicates the runtime `ManagerDescriptor` behavior of raising when
# a manager is accessed on a model instance rather than on the model class
django.db.models.manager.BaseManager.__get__
django.db.models.manager.EmptyManager.__get__
# Field.__get__/__set__ are stub-only for the mypy plugin, they don't exist at runtime
django.contrib.contenttypes.fields.GenericForeignKey.__get__
django.db.models.fields.Field.__get__
django.db.models.fields.Field.__set__
django.db.models.fields.files.FileField.__get__
django.db.models.fields.files.ImageField.__get__
django.db.models.fields.related.ForeignObject.__get__
django.db.models.fields.related.ManyToManyField.__get__
django.db.models.fields.related.OneToOneField.__get__
# These are dynamically added at runtime with loose types
django.utils.functional.LazyObject.__bool__
django.utils.functional.LazyObject.__bytes__
django.utils.functional.LazyObject.__dir__
django.utils.functional.LazyObject.__hash__
django.utils.functional.LazyObject.__iter__
django.utils.functional.LazyObject.__len__
django.utils.functional.LazyObject.__str__
typeddjango-django-stubs-fa03b48/scripts/stubtest/allowlist_python314.txt 0000664 0000000 0000000 00000000300 15260643574 0027006 0 ustar 00root root 0000000 0000000 # Version specific allowlist for Python3.14 only.
# We simplify the Enum subclasses creation logic:
django.db.models.enums.IntegerChoices.__init__
django.db.models.enums.TextChoices.__init__
typeddjango-django-stubs-fa03b48/scripts/stubtest/allowlist_todo.txt 0000664 0000000 0000000 00000011352 15260643574 0026213 0 ustar 00root root 0000000 0000000 # Autogenerated by `stubtest`
# Unsorted: there are real problems and things we can really ignore.
django.contrib.admin.models.LogEntry.action_flag
django.contrib.admin.models.LogEntry.action_time
django.contrib.admin.models.LogEntry.change_message
django.contrib.admin.models.LogEntry.content_type
django.contrib.admin.models.LogEntry.content_type_id
django.contrib.admin.models.LogEntry.get_action_flag_display
django.contrib.admin.models.LogEntry.get_next_by_action_time
django.contrib.admin.models.LogEntry.get_previous_by_action_time
django.contrib.admin.models.LogEntry.id
django.contrib.admin.models.LogEntry.object_id
django.contrib.admin.models.LogEntry.object_repr
django.contrib.admin.models.LogEntry.user
django.contrib.admin.models.LogEntry.user_id
django.contrib.auth.admin.UserAdmin.fieldsets
django.contrib.auth.base_user.AbstractBaseUser.last_login
django.contrib.auth.base_user.AbstractBaseUser.password
django.contrib.auth.models.AbstractUser.date_joined
django.contrib.auth.models.AbstractUser.email
django.contrib.auth.models.AbstractUser.first_name
django.contrib.auth.models.AbstractUser.get_next_by_date_joined
django.contrib.auth.models.AbstractUser.get_previous_by_date_joined
django.contrib.auth.models.AbstractUser.groups
django.contrib.auth.models.AbstractUser.is_active
django.contrib.auth.models.AbstractUser.is_staff
django.contrib.auth.models.AbstractUser.is_superuser
django.contrib.auth.models.AbstractUser.last_login
django.contrib.auth.models.AbstractUser.last_name
django.contrib.auth.models.AbstractUser.objects
django.contrib.auth.models.AbstractUser.password
django.contrib.auth.models.AbstractUser.user_permissions
django.contrib.auth.models.AbstractUser.username
django.contrib.auth.models.Group.id
django.contrib.auth.models.Group.name
django.contrib.auth.models.Group.permissions
django.contrib.auth.models.Permission.codename
django.contrib.auth.models.Permission.content_type
django.contrib.auth.models.Permission.content_type_id
django.contrib.auth.models.Permission.id
django.contrib.auth.models.Permission.name
django.contrib.auth.models.PermissionsMixin.groups
django.contrib.auth.models.PermissionsMixin.is_superuser
django.contrib.auth.models.PermissionsMixin.user_permissions
django.contrib.auth.models.User.date_joined
django.contrib.auth.models.User.email
django.contrib.auth.models.User.first_name
django.contrib.auth.models.User.get_next_by_date_joined
django.contrib.auth.models.User.get_previous_by_date_joined
django.contrib.auth.models.User.groups
django.contrib.auth.models.User.id
django.contrib.auth.models.User.is_active
django.contrib.auth.models.User.is_staff
django.contrib.auth.models.User.is_superuser
django.contrib.auth.models.User.last_login
django.contrib.auth.models.User.last_name
django.contrib.auth.models.User.password
django.contrib.auth.models.User.user_permissions
django.contrib.auth.models.User.username
django.contrib.contenttypes.models.ContentType.app_label
django.contrib.contenttypes.models.ContentType.id
django.contrib.contenttypes.models.ContentType.model
django.contrib.flatpages.models.FlatPage.content
django.contrib.flatpages.models.FlatPage.enable_comments
django.contrib.flatpages.models.FlatPage.id
django.contrib.flatpages.models.FlatPage.registration_required
django.contrib.flatpages.models.FlatPage.sites
django.contrib.flatpages.models.FlatPage.template_name
django.contrib.flatpages.models.FlatPage.title
django.contrib.flatpages.models.FlatPage.url
django.contrib.redirects.models.Redirect.id
django.contrib.redirects.models.Redirect.new_path
django.contrib.redirects.models.Redirect.old_path
django.contrib.redirects.models.Redirect.site
django.contrib.redirects.models.Redirect.site_id
django.contrib.sessions.base_session.AbstractBaseSession.expire_date
django.contrib.sessions.base_session.AbstractBaseSession.get_next_by_expire_date
django.contrib.sessions.base_session.AbstractBaseSession.get_previous_by_expire_date
django.contrib.sessions.base_session.AbstractBaseSession.objects
django.contrib.sessions.base_session.AbstractBaseSession.session_data
django.contrib.sessions.base_session.AbstractBaseSession.session_key
django.contrib.sessions.models.Session.expire_date
django.contrib.sessions.models.Session.get_next_by_expire_date
django.contrib.sessions.models.Session.get_previous_by_expire_date
django.contrib.sessions.models.Session.session_data
django.contrib.sessions.models.Session.session_key
django.contrib.sites.models.Site.domain
django.contrib.sites.models.Site.id
django.contrib.sites.models.Site.name
django.db.migrations.recorder.MigrationRecorder.Migration.get_next_by_applied
django.db.migrations.recorder.MigrationRecorder.Migration.get_previous_by_applied
django.db.migrations.recorder.MigrationRecorder.Migration.id
django.db.models.fields.CharField.description
django.db.models.fields.Field.description
typeddjango-django-stubs-fa03b48/scripts/tests_extension_hook.py 0000664 0000000 0000000 00000005477 15260643574 0025401 0 ustar 00root root 0000000 0000000 from __future__ import annotations
import hashlib
from typing import TYPE_CHECKING
from pytest_mypy_plugins.collect import File
if TYPE_CHECKING:
from pytest_mypy_plugins.item import YamlTestItem
def django_plugin_hook(test_item: YamlTestItem) -> None:
custom_settings = test_item.parsed_test_data.get("custom_settings", "")
installed_apps = test_item.parsed_test_data.get("installed_apps", None)
monkeypatch = test_item.parsed_test_data.get("monkeypatch", False)
# When the result of `Plugin.report_config_data` changes, the mypy cache is invalidated.
# This slows down the test suite because test can be executed in any order, regularly invalidating shared cache.
# To mitigate this, use different cache dirs based on the settings.
config_hash = hashlib.md5(f"{installed_apps}{custom_settings}".encode(), usedforsecurity=False).hexdigest()[:10]
test_item.incremental_cache_dir += config_hash
if installed_apps and custom_settings:
raise ValueError('"installed_apps" and "custom_settings" are not compatible, please use one or the other')
if installed_apps:
# custom_settings is empty, add INSTALLED_APPS
installed_apps_as_str = "(" + ",".join([repr(app) for app in installed_apps]) + ",)"
custom_settings += "INSTALLED_APPS = " + installed_apps_as_str
if "SECRET_KEY" not in custom_settings:
custom_settings = 'SECRET_KEY = "1"\n' + custom_settings
if monkeypatch:
custom_settings = "import django_stubs_ext\ndjango_stubs_ext.monkeypatch()\n" + custom_settings
django_settings_section = "\n[mypy.plugins.django-stubs]\ndjango_settings_module = mysettings"
if not test_item.additional_mypy_config:
test_item.additional_mypy_config = django_settings_section
else:
if "[mypy.plugins.django-stubs]" not in test_item.additional_mypy_config:
test_item.additional_mypy_config += django_settings_section
# yml tests use bare generics on purpose, to test real world cases.
disable_any_generics = "disallow_any_generics = false\n"
if "[mypy]\n" in test_item.additional_mypy_config:
test_item.additional_mypy_config = test_item.additional_mypy_config.replace(
"[mypy]\n", "[mypy]\n" + disable_any_generics, 1
)
else:
test_item.additional_mypy_config = "[mypy]\n" + disable_any_generics + test_item.additional_mypy_config
mysettings_file = File(path="mysettings.py", content=custom_settings)
test_item.files.append(mysettings_file)
if hasattr(test_item.config, "workerinput"):
# Append worker ID to cache directory to prevent race conditions during parallel mypy testing
# Avoids potential file corruption when multiple processes access/write cached files simultaneously
test_item.incremental_cache_dir += test_item.config.workerinput["workerid"]
typeddjango-django-stubs-fa03b48/tests/ 0000775 0000000 0000000 00000000000 15260643574 0020207 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0022306 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/ 0000775 0000000 0000000 00000000000 15260643574 0022551 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0024650 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/apps/ 0000775 0000000 0000000 00000000000 15260643574 0023514 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/apps/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0025613 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/apps/test_config.py 0000664 0000000 0000000 00000002552 15260643574 0026376 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import assert_type
from django.apps.config import AppConfig
from django.utils.functional import cached_property
from typing_extensions import override
class FooConfig(AppConfig):
name = "foo"
default_auto_field = "django.db.models.BigAutoField"
class BarConfig(AppConfig):
name = "foo"
@property
@override
def default_auto_field(self) -> str: # type: ignore[override] # pyrefly: ignore[bad-override]
return "django.db.models.BigAutoField"
class BazConfig(AppConfig):
name = "foo"
@cached_property
@override
def default_auto_field(self) -> str: # type: ignore[override] # pyrefly: ignore[bad-override]
return "django.db.models.BigAutoField"
class FooBarConfig(AppConfig):
name = "foo"
default_auto_field = cached_property(lambda self: "django.db.models.BigAutoField")
# Pyright correctly picks up our fake '_Getter' descriptor on class level. But we
# silence the pyright error since mypy doesn't follow along and the fake descriptor
# is a stubs detail made to round other problems.
assert_type(FooConfig.default_auto_field, str) # pyright: ignore[reportAssertTypeFailure]
assert_type(BarConfig("bar", None).default_auto_field, str)
assert_type(BazConfig("baz", None).default_auto_field, str)
assert_type(FooBarConfig("baz", None).default_auto_field, str)
typeddjango-django-stubs-fa03b48/tests/assert_type/apps/test_registry/ 0000775 0000000 0000000 00000000000 15260643574 0026423 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/apps/test_registry/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0030522 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/apps/test_registry/models.py 0000664 0000000 0000000 00000004720 15260643574 0030263 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import Any, assert_type
from django.apps import apps
from django.apps.registry import apps as registry_apps
from django.contrib.contenttypes.models import ContentType
from django.db import models
from django.db.migrations.state import ProjectState
class First(models.Model):
pass
class Second(models.Model):
pass
def get_model_resolves_literal_references() -> None:
# Mypy plugin is needed to narrow `type[Any]` to type[MyModel]
# TODO: other type checker should also understand that
assert_type(apps.get_model("test_registry.First"), type[First]) # pyright: ignore[reportAssertTypeFailure] # pyrefly: ignore[assert-type] # ty: ignore[type-assertion-failure]
assert_type(apps.get_model("test_registry.first"), type[First]) # pyright: ignore[reportAssertTypeFailure] # pyrefly: ignore[assert-type] # ty: ignore[type-assertion-failure]
assert_type(apps.get_model("test_registry", "First"), type[First]) # pyright: ignore[reportAssertTypeFailure] # pyrefly: ignore[assert-type] # ty: ignore[type-assertion-failure]
assert_type(apps.get_model(app_label="test_registry", model_name="first"), type[First]) # pyright: ignore[reportAssertTypeFailure] # pyrefly: ignore[assert-type] # ty: ignore[type-assertion-failure]
assert_type(apps.get_model(model_name="Second", app_label="test_registry"), type[Second]) # pyright: ignore[reportAssertTypeFailure] # pyrefly: ignore[assert-type] # ty: ignore[type-assertion-failure]
assert_type(registry_apps.get_model("contenttypes.ContentType"), type[ContentType]) # pyright: ignore[reportAssertTypeFailure] # pyrefly: ignore[assert-type] # ty: ignore[type-assertion-failure]
def get_model_of_unknown_or_dynamic_reference_is_permissive() -> None:
# Unknown models can't be resolved: the mypy plugin reports an error
# TODO: other type checker should also raise issues here
assert_type(apps.get_model("test_registry.Missing"), type[Any]) # type: ignore[misc]
assert_type(apps.get_model("TEST_REGISTRY.First"), type[Any]) # type: ignore[misc]
app_label = "test_registry"
model = apps.get_model(app_label, "First")
assert_type(model, type[Any])
model.objects.whatever()
def get_model_of_historical_state_is_not_narrowed() -> None:
# `StateApps` returns historical models rebuilt from migration state, so skip narrowing.
state_apps = ProjectState().apps
assert_type(state_apps.get_model("test_registry.First"), type[Any])
typeddjango-django-stubs-fa03b48/tests/assert_type/conf/ 0000775 0000000 0000000 00000000000 15260643574 0023476 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/conf/settings.py 0000664 0000000 0000000 00000010224 15260643574 0025707 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from pathlib import Path
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from django_stubs_ext.settings import TemplatesSetting
BASE_DIR = Path(__file__).resolve().parent
# Example taken from various doc pages
# https://docs.djangoproject.com/en/stable/ref/settings/#templates
TEMPLATES: list[TemplatesSetting] = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"APP_DIRS": True,
},
]
# https://docs.djangoproject.com/en/stable/ref/templates/api/#the-dirs-option
TEMPLATES_2: list[TemplatesSetting] = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [
"/home/html/templates/lawrence.com",
"/home/html/templates/default",
],
},
]
# https://docs.djangoproject.com/en/stable/ref/templates/api/#template-loaders
TEMPLATES_3: list[TemplatesSetting] = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [BASE_DIR / "templates"],
}
]
TEMPLATES_4: list[TemplatesSetting] = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"OPTIONS": {
"loaders": [
(
"django.template.loaders.filesystem.Loader",
[BASE_DIR / "templates"],
),
],
},
}
]
# https://docs.djangoproject.com/en/stable/ref/templates/api/#django.template.loaders.cached.Loader
TEMPLATES_5: list[TemplatesSetting] = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [BASE_DIR / "templates"],
"OPTIONS": {
"loaders": [
(
"django.template.loaders.cached.Loader",
[
"django.template.loaders.filesystem.Loader",
"django.template.loaders.app_directories.Loader",
"path.to.custom.Loader",
],
),
],
},
}
]
# https://docs.djangoproject.com/en/stable/ref/templates/api/#django.template.loaders.cached.Loader
TEMPLATES_6: list[TemplatesSetting] = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"OPTIONS": {
"loaders": [
(
"django.template.loaders.locmem.Loader",
{
"index.html": "content here",
},
),
],
},
}
]
# https://docs.djangoproject.com/en/stable/topics/templates/#configuration
TEMPLATES_7: list[TemplatesSetting] = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [],
"APP_DIRS": True,
"OPTIONS": {
# ... some options here ...
},
},
]
# https://docs.djangoproject.com/en/stable/topics/templates/#django.template.backends.base.Template.render
TEMPLATES_8: list[TemplatesSetting] = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [
"/home/html/example.com",
"/home/html/default",
],
},
{
"BACKEND": "django.template.backends.jinja2.Jinja2",
"DIRS": [
"/home/html/jinja2",
],
},
]
# Custom jinja backend
TEMPLATES_9: list[TemplatesSetting] = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [BASE_DIR / "templates" / "django"],
"APP_DIRS": True,
},
{
"BACKEND": "django.template.backends.jinja2.Jinja2",
"DIRS": [BASE_DIR / "templates" / "jinja"],
"OPTIONS": {
"context_processors": [
"django.template.context_processors.debug",
"django.template.context_processors.request",
"django.contrib.auth.context_processors.auth",
"django.contrib.messages.context_processors.messages",
],
"environment": "example.jinja.environment",
"extensions": [
"jinja2.ext.do",
"jinja2.ext.i18n",
"jinja2.ext.loopcontrols",
],
},
},
]
typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/ 0000775 0000000 0000000 00000000000 15260643574 0024211 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0026310 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/admin/ 0000775 0000000 0000000 00000000000 15260643574 0025301 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/admin/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0027400 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/admin/test_decorators.py 0000664 0000000 0000000 00000013127 15260643574 0031063 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING
from django.contrib import admin
from django.db import models
if TYPE_CHECKING:
from django.db.models import QuerySet
from django.http import FileResponse, HttpRequest, HttpResponse
class DisplayModel(models.Model):
@admin.display
def display_bare(self) -> str:
raise NotImplementedError
@admin.display(ordering="field", description="Something", empty_value="...")
def display_fancy(self) -> bool:
raise NotImplementedError
@property
@admin.display
def display_property(self) -> str:
raise NotImplementedError
@admin.display
def freestanding_display_bare(obj: DisplayModel) -> str:
raise NotImplementedError
@admin.display(boolean=True)
def freestanding_display_fancy(obj: DisplayModel) -> bool:
raise NotImplementedError
@admin.register(DisplayModel, DisplayModel, site=None)
class DisplayModelAdmin(admin.ModelAdmin[DisplayModel]):
list_display = [
"display_property",
"display_fancy",
"display_bare",
"admin_display_bare",
"admin_display_fancy",
freestanding_display_bare,
freestanding_display_fancy,
]
@admin.display
def admin_display_bare(self, obj: DisplayModel) -> str:
raise NotImplementedError
@admin.display(boolean=True, ordering="field", description="Something")
def admin_display_fancy(self, obj: DisplayModel) -> bool:
raise NotImplementedError
# 'boolean' and 'empty_value' are mutually exclusive arguments
admin.display(lambda: 1, boolean=True, empty_value="str") # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload] # ty: ignore[no-matching-overload]
admin.display(lambda: 1, boolean=False, empty_value="str") # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload] # ty: ignore[no-matching-overload]
admin.display(boolean=True, empty_value="str") # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload] # ty: ignore[no-matching-overload]
admin.display(boolean=False, empty_value="str") # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload] # ty: ignore[no-matching-overload]
# Valid combinations (function form)
admin.display(lambda: 1, boolean=True, empty_value=None)
admin.display(lambda: 1, boolean=False, empty_value=None)
admin.display(lambda: 1, boolean=True)
admin.display(lambda: 1, boolean=False)
admin.display(lambda: 1, boolean=None, empty_value="str")
admin.display(lambda: 1, boolean=None, empty_value=None)
admin.display(lambda: 1, empty_value="str")
admin.display(lambda: 1, empty_value=None)
admin.display(lambda: 1)
# Valid combinations (decorator form)
admin.display(boolean=True, empty_value=None)
admin.display(boolean=False, empty_value=None)
admin.display(boolean=True)
admin.display(boolean=False)
admin.display(boolean=None, empty_value="str")
admin.display(boolean=None, empty_value=None)
admin.display(empty_value="str")
admin.display(empty_value=None)
admin.display()
class ActionModel(models.Model): ...
@admin.action
def freestanding_action_bare(
modeladmin: ActionModelAdmin, request: HttpRequest, queryset: QuerySet[ActionModel]
) -> None:
raise NotImplementedError
@admin.action(description="Some text here", permissions=["test"])
def freestanding_action_fancy(
modeladmin: ActionModelAdmin, request: HttpRequest, queryset: QuerySet[ActionModel]
) -> None:
raise NotImplementedError
@admin.action
def freestanding_action_http_response(
modeladmin: ActionModelAdmin, request: HttpRequest, queryset: QuerySet[ActionModel]
) -> HttpResponse:
raise NotImplementedError
@admin.action
def freestanding_action_file_response(
modeladmin: ActionModelAdmin, request: HttpRequest, queryset: QuerySet[ActionModel]
) -> FileResponse:
raise NotImplementedError
@admin.register(ActionModel)
class ActionModelAdmin(admin.ModelAdmin[ActionModel]):
actions = [ # pyrefly: ignore[bad-assignment]
freestanding_action_bare,
freestanding_action_fancy,
"method_action_bare",
"method_action_fancy",
freestanding_action_http_response,
freestanding_action_file_response,
]
@admin.action
def method_action_bare(self, request: HttpRequest, queryset: QuerySet[ActionModel]) -> None:
raise NotImplementedError
@admin.action(description="Some text here", permissions=["test"])
def method_action_fancy(self, request: HttpRequest, queryset: QuerySet[ActionModel]) -> None:
raise NotImplementedError
@admin.action(description="Some text here", permissions=["test"])
def method_action_http_response(self, request: HttpRequest, queryset: QuerySet[ActionModel]) -> HttpResponse:
raise NotImplementedError
@admin.action(description="Some text here", permissions=["test"])
def method_action_file_response(self, request: HttpRequest, queryset: QuerySet[ActionModel]) -> FileResponse:
raise NotImplementedError
# This is actually wrong: @admin.register(ActionModel) should use ActionModel as the type parameter,
# not DisplayModel. However, we don't have a way to represent this error in the type system yet.
@admin.register(ActionModel)
class WrongModelAdmin(admin.ModelAdmin[DisplayModel]):
pass
@admin.register(ActionModel) # ty: ignore[invalid-argument-type] # pyright: ignore[reportArgumentType, reportUntypedClassDecorator]
class UnrelatedClass: # type: ignore[type-var]
pass
typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/admin/test_filters.py 0000664 0000000 0000000 00000004761 15260643574 0030372 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from collections.abc import Iterator, Mapping
from typing import TYPE_CHECKING, assert_type
from django.contrib.admin.filters import FieldListFilter, ListFilter, SimpleListFilter, _ListFilterChoices
from typing_extensions import override
if TYPE_CHECKING:
from django.contrib.admin.views.main import ChangeList
class MyFieldListFilter(FieldListFilter):
def populate(self) -> None:
# Arbitrary method to showcase that subclasses can store arbitrary values
# (e.g. list[list[str]] for __in keys) without `type: ignore`,
# since `ListFilter.used_parameters` is `dict[str, object]`.
self.used_parameters["state__in"] = [["active", "pending"]]
def test_used_parameters(
simple_filter: SimpleListFilter,
field_filter: FieldListFilter,
custom_filter: MyFieldListFilter,
) -> None:
# SimpleListFilter narrows used_parameters to dict[str, str]
assert_type(simple_filter.used_parameters, dict[str, str])
# FieldListFilter inherits dict[str, object] from ListFilter
assert_type(field_filter.used_parameters, dict[str, object])
# Custom subclasses inherit dict[str, object] too
assert_type(custom_filter.used_parameters, dict[str, object])
# Custom ListFilter subclass with a completely different choices() schema.
# The loosened base return type (Mapping[str, object]) allows this.
# This can be useful for user who customized the builtin admin template (`admin/filter.html`) with something
# expecting a different type
class MyChoicesListFilter(ListFilter):
@override
def choices(self, changelist: ChangeList) -> Iterator[Mapping[str, object]]:
yield {"label": "All items", "icon": "star", "count": 42, "active": True}
def test_choices(
changelist: ChangeList,
base_filter: ListFilter,
simple_filter: SimpleListFilter,
field_filter: FieldListFilter,
my_choices_list_filter: MyChoicesListFilter,
) -> None:
# Base ListFilter.choices() returns the loosened type: Iterator[Mapping[str, object]]
assert_type(base_filter.choices(changelist), Iterator[Mapping[str, object]])
# SimpleListFilter and FieldListFilter narrow the return type via @override
assert_type(simple_filter.choices(changelist), Iterator[_ListFilterChoices])
assert_type(field_filter.choices(changelist), Iterator[_ListFilterChoices])
# Custom subclass with a completely different schema works without type errors
assert_type(my_choices_list_filter.choices(changelist), Iterator[Mapping[str, object]])
typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/admin/test_options.py 0000664 0000000 0000000 00000017535 15260643574 0030420 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING, Any
from django.contrib import admin, messages
from django.contrib.admin.sites import AdminSite
from django.core.paginator import Paginator
from django.db import models
from django.forms import ModelForm, Textarea
from django.http.request import HttpRequest
from django.utils.translation import gettext_lazy as _
from typing_extensions import override
if TYPE_CHECKING:
from django.db.models.query import QuerySet
from django.http.response import HttpResponse
# "Happy path" test for model admin, trying to cover as many valid
# configurations as possible.
class FullAdminModel(models.Model):
pass
def full_admin_action(
modeladmin: FullModelAdmin, request: HttpRequest, queryset: QuerySet[FullAdminModel, FullAdminModel]
) -> None:
pass
class FullAdminModelForm(ModelForm[FullAdminModel]):
pass
class FullModelAdmin(admin.ModelAdmin[FullAdminModel]):
# BaseModelAdmin
autocomplete_fields = ("strs",)
raw_id_fields = ["strs"]
fields = (
"a field",
["a", "list of", "fields"],
)
exclude = ("a", "b")
fieldsets = [
(None, {"fields": ["a", "b"]}),
("group", {"fields": ("c",), "classes": ("a",), "description": "foo"}),
(_("lazy"), {"fields": ["bar"]}),
]
form = FullAdminModelForm
filter_vertical = ("fields",)
filter_horizontal = ("plenty", "of", "fields")
radio_fields = {
"some_field": admin.VERTICAL,
"another_field": admin.HORIZONTAL,
}
prepopulated_fields = {"slug": ("title",)}
formfield_overrides = {models.TextField: {"widget": Textarea}}
readonly_fields = ("date_modified",)
ordering = ("-pk", "date_modified")
sortable_by = ["pk"]
view_on_site = True
show_full_result_count = False
# ModelAdmin
list_display = ("pk",)
list_display_links = ("str",)
list_filter = ("str", admin.SimpleListFilter, ("str", admin.FieldListFilter))
list_select_related = True
list_per_page = 1
list_max_show_all = 2
list_editable = ("a", "b")
search_fields = ("c", "d")
date_hierarchy = "f"
save_as = False
save_as_continue = True
save_on_top = False
paginator = Paginator
presserve_filters = False
inlines = (admin.TabularInline, admin.StackedInline)
add_form_template = "template"
change_form_template = "template"
change_list_template = "template"
delete_confirmation_template = "template"
delete_selected_confirmation_template = "template"
object_history_template = "template"
popup_response_template = "template"
actions = (full_admin_action, "a_method_action") # pyrefly: ignore[bad-assignment]
actions_on_top = True
actions_on_bottom = False
actions_selection_counter = True
admin_site = AdminSite()
# test generic ModelAdmin
# https://github.com/typeddjango/django-stubs/pull/504
# this will fail if `model` has a type other than the generic specified in the class declaration
model = FullAdminModel
def a_method_action(self, request: HttpRequest, queryset: QuerySet[FullAdminModel]) -> None:
pass
def a_method_action_with_message_user(self, request: HttpRequest, queryset: QuerySet[FullAdminModel]) -> None:
self.message_user(request, _("Error message"), messages.ERROR)
class AnotherModel(models.Model):
pass
admin.site.register(FullAdminModel, FullModelAdmin)
admin.site.register(AnotherModel, FullModelAdmin) # type: ignore[misc] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] # pyright:ignore[reportArgumentType]
# This admin is here to make sure we're not running into a mypy issue which is
# worked around using a somewhat complicated _ListOrTuple union type. Once the
# issue is solved upstream this test should pass even with the workaround
# replaced by a simpler Sequence type.
# https://github.com/python/mypy/issues/8921
class FieldsetWorkaroundAdmin(admin.ModelAdmin[Any]):
fieldsets = (
(
None,
{
"fields": ("name",),
},
),
)
class ViewOnSiteCallableAdmin(admin.ModelAdmin[Any]):
@override
def view_on_site(self, obj: ViewOnSiteCallableAdmin) -> str: # pyright: ignore[reportIncompatibleVariableOverride] # pyrefly: ignore[bad-override-mutable-attribute]
return "http://example.org"
class MissingFieldsetFieldsAdmin(admin.ModelAdmin[Any]):
fieldsets = [
(None, {}), # type: ignore[typeddict-item] # pyright: ignore[reportAssignmentType] # pyrefly: ignore[bad-typed-dict-key]
]
class InvalidRadioFieldsValueAdmin(admin.ModelAdmin[Any]):
radio_fields = {"some_field": 0} # type: ignore[dict-item] # pyright: ignore[reportAssignmentType] # pyrefly: ignore[bad-assignment]
class InvalidRadioFieldsKeyAdmin(admin.ModelAdmin[Any]):
radio_fields = {1: admin.VERTICAL} # type: ignore[dict-item] # pyright: ignore[reportAssignmentType] # pyrefly: ignore[bad-assignment]
class InvalidFormfieldOverridesAdmin(admin.ModelAdmin[Any]):
formfield_overrides = {
"not a field": { # type: ignore[dict-item] # pyright: ignore[reportAssignmentType] # pyrefly: ignore[bad-assignment]
"widget": Textarea,
}
}
class InvalidActionSignatureModel(models.Model): ...
def invalid_action(modeladmin: None) -> None:
pass
class InvalidActionSignatureAdmin(admin.ModelAdmin[InvalidActionSignatureModel]):
actions = [invalid_action] # type: ignore[list-item] # pyright: ignore[reportAssignmentType] # pyrefly: ignore[bad-assignment]
class InvalidGenericModel(models.Model):
pass
class InvalidGenericModelAdmin(admin.ModelAdmin[InvalidGenericModel]):
model = int # type: ignore[assignment] # pyright: ignore[reportAssignmentType] # pyrefly: ignore[bad-assignment]
class InlineParentModel(models.Model):
pass
class InlineChildModel(models.Model):
parent = models.ForeignKey(InlineParentModel, on_delete=models.CASCADE) # pyright: ignore[reportUnknownVariableType]
class ParentObjInline(admin.StackedInline[InlineChildModel, InlineParentModel]):
model = InlineChildModel
@override
def get_readonly_fields(
self, request: HttpRequest, obj: InlineParentModel | None = None
) -> list[str] | tuple[str, ...]:
return super().get_readonly_fields(request, obj)
# Passing wrong types to inline methods that expect parent objects
inline_req = HttpRequest()
inline_instance = ParentObjInline(InlineParentModel, admin.AdminSite())
inline_instance.get_fields(inline_req, 1) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
inline_instance.get_inlines(inline_req, 1) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
inline_instance.get_readonly_fields(inline_req, 1) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
class ValidActionModel(models.Model): ...
@admin.action(description="Trigger an action from a global action function.")
def valid_action_function(
modeladmin: admin.ModelAdmin[ValidActionModel],
request: HttpRequest,
queryset: QuerySet[ValidActionModel],
) -> None:
raise NotImplementedError
@admin.register(ValidActionModel)
class ActionAdmin(admin.ModelAdmin[ValidActionModel]):
@admin.action(description="Trigger an action from a model admin action method.")
def valid_action_method(
self,
request: HttpRequest,
queryset: QuerySet[ValidActionModel],
) -> HttpResponse:
raise NotImplementedError
# Normally a method would be passed by name as a string, but defining `actions` after the
# method makes it possible to ensure that it is typed correctly.
actions = [valid_action_function, valid_action_method]
typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/admin/test_utils.py 0000664 0000000 0000000 00000011571 15260643574 0030057 0 ustar 00root root 0000000 0000000 from __future__ import annotations
import datetime
from typing import assert_type
from django import http
from django.contrib import admin
from django.contrib.admin.options import _DisplayT
from django.contrib.admin.utils import (
build_q_object_from_lookup_parameters,
flatten,
flatten_fieldsets,
prepare_lookup_value,
)
from django.db import models
from django.db.models import F, Q
from django.db.models.functions import Upper
@admin.display(description="Name")
def upper_case_name(obj: Person) -> str:
return f"{obj.first_name} {obj.last_name}".upper() # pyright: ignore[reportUnknownMemberType]
class Person(models.Model):
first_name = models.CharField(max_length=None) # pyright: ignore[reportUnknownVariableType]
last_name = models.CharField(max_length=None) # pyright: ignore[reportUnknownVariableType]
birthday = models.DateField() # pyright: ignore[reportUnknownVariableType]
class PersonListAdmin(admin.ModelAdmin[Person]):
fields = [["first_name", "last_name"], "birthday"]
list_display = [upper_case_name, "birthday"]
class PersonTupleAdmin(admin.ModelAdmin[Person]):
fields = (("first_name", "last_name"), "birthday")
list_display = (upper_case_name, "birthday")
class PersonFieldsetListAdmin(admin.ModelAdmin[Person]):
fieldsets = [
(
"Personal Details",
{
"description": "Personal details of a person.",
"fields": [["first_name", "last_name"], "birthday"],
},
)
]
class PersonFieldsetTupleAdmin(admin.ModelAdmin[Person]):
fieldsets = (
(
"Personal Details",
{
"description": "Personal details of a person.",
"fields": (("first_name", "last_name"), "birthday"),
},
),
)
request = http.HttpRequest()
admin_site = admin.AdminSite()
person_list_admin = PersonListAdmin(Person, admin_site)
person_tuple_admin = PersonTupleAdmin(Person, admin_site)
person_fieldset_list_admin = PersonFieldsetListAdmin(Person, admin_site)
person_fieldset_tuple_admin = PersonFieldsetTupleAdmin(Person, admin_site)
# For some reason, pyright cannot see that these are not `None` so we need to ignore these for mypy.
assert person_list_admin.fields is not None # type: ignore[comparison-overlap]
assert person_tuple_admin.fields is not None # type: ignore[comparison-overlap]
assert person_fieldset_list_admin.fieldsets is not None # type: ignore[comparison-overlap]
assert person_fieldset_tuple_admin.fieldsets is not None # type: ignore[comparison-overlap]
assert_type(flatten(person_list_admin.fields), list[str]) # ty: ignore[no-matching-overload,type-assertion-failure]
assert_type(flatten(person_list_admin.get_fields(request)), list[str])
assert_type(flatten(person_tuple_admin.fields), list[str])
assert_type(flatten(person_tuple_admin.get_fields(request)), list[str])
assert_type(flatten(person_list_admin.list_display), list[_DisplayT[Person]]) # ty: ignore[no-matching-overload,type-assertion-failure]
assert_type(flatten(person_list_admin.get_list_display(request)), list[_DisplayT[Person]]) # ty: ignore[type-assertion-failure]
assert_type(flatten(person_tuple_admin.list_display), list[_DisplayT[Person]])
assert_type(flatten(person_tuple_admin.get_list_display(request)), list[_DisplayT[Person]]) # ty: ignore[type-assertion-failure]
assert_type(flatten_fieldsets(person_fieldset_list_admin.fieldsets), list[str]) # ty: ignore[invalid-argument-type]
assert_type(flatten_fieldsets(person_fieldset_list_admin.get_fieldsets(request)), list[str])
assert_type(flatten_fieldsets(person_fieldset_tuple_admin.fieldsets), list[str]) # ty: ignore[invalid-argument-type]
assert_type(flatten_fieldsets(person_fieldset_tuple_admin.get_fieldsets(request)), list[str])
class PersonOrderingAdmin(admin.ModelAdmin[Person]):
ordering = [Upper("first_name")]
class PersonMixedOrderingAdmin(admin.ModelAdmin[Person]):
ordering = ["-last_name", Upper("first_name")]
class PersonFExpressionAdmin(admin.ModelAdmin[Person]):
ordering = [F("birthday").desc(nulls_last=True)]
# prepare_lookup_value: list[str] input recurses on each element,
# returning list[str] (pass-through) or list[bool] (__isnull keys)
assert_type(prepare_lookup_value("field", ["a", "b"]), list[str] | list[bool])
# str input: split (__in) -> list[str], bool (__isnull), or str (pass-through)
assert_type(prepare_lookup_value("field", "value"), str | bool | list[str])
# Non-str, non-list values pass through unchanged (e.g. datetime from date_hierarchy
# in ChangeList.get_filters)
assert_type(prepare_lookup_value("field", datetime.datetime.now()), datetime.datetime)
# Values are not limited to list[str] — any iterable of objects is accepted
assert_type(
build_q_object_from_lookup_parameters(
{
"a": ["str"],
"b": [datetime.datetime(2023, 1, 1)],
"c": [True],
}
),
Q,
)
typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/auth/ 0000775 0000000 0000000 00000000000 15260643574 0025152 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/auth/test_base_user.py 0000664 0000000 0000000 00000000417 15260643574 0030535 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import assert_type
from django.contrib.auth.models import User
def get_backend() -> str:
return "django.contrib.auth.backends.ModelBackend"
user = User()
user.backend = get_backend()
assert_type(user.backend, str)
typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/auth/test_decorators.py 0000664 0000000 0000000 00000001163 15260643574 0030731 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING
from django.contrib.auth.decorators import user_passes_test
from django.urls import reverse, reverse_lazy
if TYPE_CHECKING:
from django.http import HttpRequest, HttpResponse
reversed_url = reverse("url")
lazy_url = reverse_lazy("namespace:url")
@user_passes_test(lambda user: user.is_active, login_url=reversed_url)
def my_view1(request: HttpRequest) -> HttpResponse:
raise NotImplementedError
@user_passes_test(lambda user: user.is_active, login_url=lazy_url)
def my_view2(request: HttpRequest) -> HttpResponse:
raise NotImplementedError
typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/auth/test_hashers.py 0000664 0000000 0000000 00000001214 15260643574 0030216 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import assert_type
from django.contrib.auth.hashers import check_password
def setter(password: str | None) -> None: ...
def perfect_setter(password: str) -> None: ...
def bad_setter(password: int) -> None: ...
assert_type(check_password("password", "encoded"), bool)
assert_type(check_password("password", "encoded", setter), bool)
assert_type(check_password("password", "encoded", perfect_setter), bool)
check_password("password", "encoded", bad_setter) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/auth/test_models.py 0000664 0000000 0000000 00000000434 15260643574 0030047 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import assert_type
from django.contrib.auth.models import AbstractBaseUser, UserManager
class MyUser(AbstractBaseUser):
pass
class Manager(UserManager[MyUser]):
pass
assert_type(Manager().create_user("username"), MyUser)
typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/postgres/ 0000775 0000000 0000000 00000000000 15260643574 0026057 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/postgres/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0030156 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/postgres/test_aggregates.py 0000664 0000000 0000000 00000003202 15260643574 0031576 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import cast
from django.contrib.postgres.aggregates import ArrayAgg
from django.db.models import BooleanField, Exists, ExpressionWrapper, F, Model, Q, QuerySet
from django.db.models.lookups import GreaterThan
queryset = cast("QuerySet[Model]", object())
# ArrayAgg: order_by accepts single str/Combinable or sequence of either
ArrayAgg("title", order_by="title")
ArrayAgg("title", order_by="-title")
ArrayAgg("title", order_by=F("title"))
ArrayAgg("title", order_by=F("title").desc())
ArrayAgg("title", order_by=["-title", F("title")])
ArrayAgg("title", order_by=("-title", F("title").desc()))
# Aggregate kwargs forwarded through OrderableAggMixin
ArrayAgg("title", distinct=True, filter=Q(active=True), order_by="-title", default=[])
ArrayAgg("title", filter=Exists(queryset))
ArrayAgg("title", filter=GreaterThan(F("id"), 0))
ArrayAgg("title", filter=ExpressionWrapper(Exists(queryset), output_field=BooleanField()))
ArrayAgg("title", order_by=123) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
ArrayAgg("title", order_by=[123]) # type: ignore[list-item] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
ArrayAgg("title", filter=F("a")) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
ArrayAgg("title", filter="active") # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/postgres/test_indexes.py 0000664 0000000 0000000 00000004144 15260643574 0031132 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from django.contrib.postgres.indexes import BrinIndex, BTreeIndex, GinIndex, GistIndex, HashIndex, OpClass, SpGistIndex
from django.db import models
from django.db.models import Index
from django.db.models.functions import Lower
# BrinIndex
BrinIndex(fields=["foo"])
BrinIndex(models.F("bar"), name="test")
BrinIndex("foo", models.F("bar"), Lower("baz"), name="test")
BrinIndex("foo", name="test", opclasses=["bar"])
BrinIndex("foo", name="test", condition=models.Q(foo=1))
BrinIndex("foo", name="test", include=["bar"])
# BTreeIndex
BTreeIndex(fields=["foo"])
BTreeIndex(models.F("bar"), name="test")
BTreeIndex("foo", models.F("bar"), Lower("baz"), name="test")
BTreeIndex("foo", name="test", opclasses=["bar"])
BTreeIndex("foo", name="test", condition=models.Q(foo=1))
BTreeIndex("foo", name="test", include=["bar"])
# GinIndex
GinIndex(fields=["foo"])
GinIndex(models.F("bar"), name="test")
GinIndex("foo", models.F("bar"), Lower("baz"), name="test")
GinIndex("foo", name="test", opclasses=["bar"])
GinIndex("foo", name="test", condition=models.Q(foo=1))
GinIndex("foo", name="test", include=["bar"])
# GistIndex
GistIndex(fields=["foo"])
GistIndex(models.F("bar"), name="test")
GistIndex("foo", models.F("bar"), Lower("baz"), name="test")
GistIndex("foo", name="test", opclasses=["bar"])
GistIndex("foo", name="test", condition=models.Q(foo=1))
GistIndex("foo", name="test", include=["bar"])
# HashIndex
HashIndex(fields=["foo"])
HashIndex(models.F("bar"), name="test")
HashIndex("foo", models.F("bar"), Lower("baz"), name="test")
HashIndex("foo", name="test", opclasses=["bar"])
HashIndex("foo", name="test", condition=models.Q(foo=1))
HashIndex("foo", name="test", include=["bar"])
# SpGistIndex
SpGistIndex(fields=["foo"])
SpGistIndex(models.F("bar"), name="test")
SpGistIndex("foo", models.F("bar"), Lower("baz"), name="test")
SpGistIndex("foo", name="test", opclasses=["bar"])
SpGistIndex("foo", name="test", condition=models.Q(foo=1))
SpGistIndex("foo", name="test", include=["bar"])
# OpClass
Index(
OpClass(Lower("username"), name="varchar_pattern_ops"),
name="lower_username_idx",
)
typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/staticfiles/ 0000775 0000000 0000000 00000000000 15260643574 0026523 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/staticfiles/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0030622 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/staticfiles/test_finders.py 0000664 0000000 0000000 00000002576 15260643574 0031600 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import assert_type
from django.contrib.staticfiles import finders
from django.contrib.staticfiles.finders import AppDirectoriesFinder, BaseFinder, DefaultStorageFinder, FileSystemFinder
# find (single)
assert_type(finders.find("filepath"), str | None)
for finder in finders.get_finders():
assert_type(finder, BaseFinder)
assert_type(finder.find("filepath"), str | None)
assert_type(FileSystemFinder().find("filepath"), str | None)
assert_type(AppDirectoriesFinder().find("filepath"), str | None)
assert_type(DefaultStorageFinder().find("filepath"), str | None)
# find (all)
assert_type(finders.find("filepath", find_all=True), list[str])
for finder in finders.get_finders():
assert_type(finder.find("filepath", find_all=True), list[str]) # ty: ignore[type-assertion-failure]
assert_type(FileSystemFinder().find("filepath", find_all=True), list[str]) # ty: ignore[type-assertion-failure]
assert_type(AppDirectoriesFinder().find("filepath", find_all=True), list[str]) # ty: ignore[type-assertion-failure]
assert_type(DefaultStorageFinder().find("filepath", find_all=True), list[str]) # ty: ignore[type-assertion-failure]
# FileSystemFinder-specific
assert_type(FileSystemFinder().find_location(".", "filepath"), str | None)
# AppDirectoriesFinder-specific
assert_type(AppDirectoriesFinder().find_in_app("app", "filepath"), str | None)
typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/staticfiles/test_storage.py 0000664 0000000 0000000 00000001161 15260643574 0031577 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING
from django.contrib.staticfiles.storage import HashedFilesMixin
from typing_extensions import override
if TYPE_CHECKING:
from django.core.files.base import File
# Ensure subclassing narrowing the content arg in contravariant position is allowed
class ZulipStorage(HashedFilesMixin):
@override
def hashed_name(self, name: str, content: File[bytes] | None = None, filename: str | None = None) -> str:
return name
@override
def file_hash(self, name: str, content: File[bytes] | None = None) -> str | None:
return None
typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/test_contenttypes/ 0000775 0000000 0000000 00000000000 15260643574 0030007 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/test_contenttypes/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0032106 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/test_contenttypes/models.py 0000664 0000000 0000000 00000002472 15260643574 0031651 0 ustar 00root root 0000000 0000000 from __future__ import annotations
import sys
from typing import Any, assert_type
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from django.db import models
# `GenericForeignKeyDescriptor` is only available in Django 6.1+ but we test against Django 5.2.x
# on Python < 3.12, so only run these tests for newer Python versions to avoid lots of issues with
# different type checkers complaining when attempting to fall back to `GenericForeignKey`
# when `ImportError` is raised.
if sys.version_info >= (3, 12):
from django.contrib.contenttypes.fields import GenericForeignKeyDescriptor
class TaggedItem(models.Model):
tag = models.SlugField() # pyright: ignore[reportUnknownVariableType]
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) # pyright: ignore[reportUnknownVariableType]
object_id = models.PositiveBigIntegerField() # pyright: ignore[reportUnknownVariableType]
content_object = GenericForeignKey("content_type", "object_id")
def test_generic_foreign_key_descriptor() -> None:
assert_type(TaggedItem().content_object, Any | None) # pyrefly: ignore[assert-type]
assert_type(TaggedItem.content_object, GenericForeignKeyDescriptor) # pyrefly: ignore[assert-type]
typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/test_models.py 0000664 0000000 0000000 00000005757 15260643574 0027123 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from datetime import datetime
from typing import assert_type
from django.contrib.admin.models import LogEntry
from django.contrib.auth.models import Group, Permission, User
from django.contrib.contenttypes.models import ContentType
from django.contrib.flatpages.models import FlatPage
from django.contrib.redirects.models import Redirect
from django.contrib.sessions.models import Session
from django.contrib.sites.models import Site
def log_entry_fields_are_inferred() -> None:
entry = LogEntry()
assert_type(entry.action_time, datetime)
assert_type(entry.user, User) # pyright: ignore[reportAssertTypeFailure] # pyrefly: ignore[assert-type] # ty: ignore[type-assertion-failure]
assert_type(entry.content_type, ContentType | None) # pyrefly: ignore[assert-type]
assert_type(entry.object_id, str | None) # pyrefly: ignore[assert-type]
assert_type(entry.object_repr, str)
assert_type(entry.action_flag, int)
assert_type(entry.change_message, str)
def flatpage_fields_are_inferred() -> None:
page = FlatPage()
assert_type(page.url, str)
assert_type(page.title, str)
assert_type(page.content, str)
assert_type(page.enable_comments, bool)
assert_type(page.template_name, str)
assert_type(page.registration_required, bool)
assert_type(page.sites.get(), Site)
def redirect_fields_are_inferred() -> None:
redirect = Redirect()
assert_type(redirect.site, Site) # pyrefly: ignore[assert-type]
assert_type(redirect.old_path, str)
assert_type(redirect.new_path, str)
def site_fields_are_inferred() -> None:
site = Site()
assert_type(site.domain, str)
assert_type(site.name, str)
def content_type_fields_are_inferred() -> None:
content_type = ContentType()
assert_type(content_type.app_label, str)
assert_type(content_type.model, str)
def session_fields_are_inferred() -> None:
session = Session()
assert_type(session.session_key, str)
assert_type(session.session_data, str)
assert_type(session.expire_date, datetime)
def permission_fields_are_inferred() -> None:
permission = Permission()
assert_type(permission.name, str)
assert_type(permission.content_type, ContentType) # pyrefly: ignore[assert-type]
assert_type(permission.codename, str)
def group_fields_are_inferred() -> None:
group = Group()
assert_type(group.name, str)
assert_type(group.permissions.get(), Permission)
def user_fields_are_inferred() -> None:
user = User()
assert_type(user.password, str)
assert_type(user.last_login, datetime | None) # pyrefly: ignore[assert-type]
assert_type(user.username, str)
assert_type(user.first_name, str)
assert_type(user.last_name, str)
assert_type(user.email, str)
assert_type(user.is_staff, bool)
assert_type(user.is_active, bool)
assert_type(user.is_superuser, bool)
assert_type(user.date_joined, datetime)
assert_type(user.groups.get(), Group)
assert_type(user.user_permissions.get(), Permission)
typeddjango-django-stubs-fa03b48/tests/assert_type/core/ 0000775 0000000 0000000 00000000000 15260643574 0023501 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/core/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0025600 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/core/files/ 0000775 0000000 0000000 00000000000 15260643574 0024603 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/core/files/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0026702 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/core/files/test_storage.py 0000664 0000000 0000000 00000001050 15260643574 0027654 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from django.core.files.base import File
from django.core.files.storage import Storage
from django.core.validators import FileExtensionValidator
from typing_extensions import override
# Ensure subclassing narrowing the return type is allowed
class MyStorage(Storage):
@override
def open(self, name: str, mode: str = "rb") -> File[bytes]:
return File(open(name, mode))
class MyValidator(FileExtensionValidator):
@override
def __call__(self, value: File[bytes]) -> None:
return None
typeddjango-django-stubs-fa03b48/tests/assert_type/core/handlers/ 0000775 0000000 0000000 00000000000 15260643574 0025301 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/core/handlers/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0027400 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/core/handlers/test_wsgi.py 0000664 0000000 0000000 00000000301 15260643574 0027655 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from wsgiref.simple_server import make_server
from django.core.handlers.wsgi import WSGIHandler
make_server(
"0.0.0.0",
8080,
WSGIHandler(),
)
typeddjango-django-stubs-fa03b48/tests/assert_type/core/mail/ 0000775 0000000 0000000 00000000000 15260643574 0024423 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/core/mail/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0026522 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/core/mail/test_message.py 0000664 0000000 0000000 00000001234 15260643574 0027460 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from email.message import EmailMessage as StdlibEmailMessage
from email.mime.image import MIMEImage
from email.mime.text import MIMEText
from typing import Any, assert_type
from django.core.mail.message import EmailMessage
message = EmailMessage()
assert_type(message, EmailMessage)
assert_type(message.message(), StdlibEmailMessage)
message.attach("myfilename", "mycontent", "text/plain")
mime_text = MIMEText("mytext")
assert_type(mime_text, MIMEText)
message.attach(mime_text)
mime_image = MIMEImage(b"mydata", "png")
assert_type(mime_image, MIMEImage)
message.attach(mime_image)
assert_type(message.attachments, list[Any])
typeddjango-django-stubs-fa03b48/tests/assert_type/core/test_checks.py 0000664 0000000 0000000 00000002152 15260643574 0026352 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from collections.abc import Sequence
from typing import TYPE_CHECKING, assert_type
from django.core.checks import CheckMessage, Warning, register
if TYPE_CHECKING:
from django.apps.config import AppConfig
@register("foo", deploy=True)
def check_foo(
app_configs: Sequence[AppConfig] | None,
databases: Sequence[str] | None,
**kwargs: object,
) -> list[CheckMessage]:
if databases and "databass" in databases:
return [Warning("Naughty list")]
return []
assert_type(check_foo.tags, Sequence[str])
@register
def check_bar(*, app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]:
raise NotImplementedError
assert_type(check_bar.tags, Sequence[str])
@register
def check_baz(**kwargs: object) -> list[CheckMessage]:
raise NotImplementedError
assert_type(check_baz.tags, Sequence[str])
@register() # type: ignore[type-var] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-specialization] # ty: ignore[invalid-argument-type]
def wrong_args(bla: int) -> list[CheckMessage]:
raise NotImplementedError
typeddjango-django-stubs-fa03b48/tests/assert_type/core/test_exceptions.py 0000664 0000000 0000000 00000001017 15260643574 0027272 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from django.core.exceptions import ValidationError
ValidationError(
{
"list": ["list error 1", "list error 2"],
"plain_str": "message",
"plain_error": ValidationError("message"),
"list_error": [
ValidationError("list error 1", code="test"),
ValidationError("list error 2", code="test"),
],
}
)
ValidationError(
[
"message 1",
ValidationError("message 2"),
["nested 1", "nested 2"],
]
)
typeddjango-django-stubs-fa03b48/tests/assert_type/db/ 0000775 0000000 0000000 00000000000 15260643574 0023136 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/db/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0025235 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/db/migrations/ 0000775 0000000 0000000 00000000000 15260643574 0025312 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/db/migrations/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0027411 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/db/migrations/test_classvar.py 0000664 0000000 0000000 00000001735 15260643574 0030547 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING, ClassVar
from django.db import migrations
if TYPE_CHECKING:
from django.db.migrations.operations.base import Operation
class ExplicitMigration(migrations.Migration):
operations: ClassVar[list[Operation]] = [] # pyright: ignore[reportIncompatibleVariableOverride]
initial: ClassVar[bool] = True # pyright: ignore[reportIncompatibleVariableOverride]
# Non-ClassVar annotations are incorrect
class ExplicitIncorrectMigration(migrations.Migration):
operations: list[Operation] = [] # type: ignore[misc] # pyright: ignore[reportIncompatibleVariableOverride] # pyrefly: ignore[bad-override] # ty: ignore[invalid-attribute-override]
initial: bool = True # type: ignore[misc] # pyright: ignore[reportIncompatibleVariableOverride] # pyrefly: ignore[bad-override] # ty: ignore[invalid-attribute-override]
class ImplicitMigration(migrations.Migration):
operations = []
initial = True
typeddjango-django-stubs-fa03b48/tests/assert_type/db/migrations/test_operations.py 0000664 0000000 0000000 00000003706 15260643574 0031114 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from django.db.migrations import RunSQL
RunSQL(sql="SOME SQL")
RunSQL(sql=("SOME SQLS", "SOME SQLS"), reverse_sql=("SOME SQLS", "SOME SQLS"))
RunSQL(sql=["SOME SQLS", "SOME SQLS"], reverse_sql=["SOME SQLS", "SOME SQLS"])
RunSQL(
sql=["SOME SQLS", ("SOME SQLS %s", ("SQL PARAM AS A TUPLE",))],
reverse_sql=["SOME SQLS", ("SOME SQLS %s", ("SQL PARAM AS A TUPLE",))],
)
RunSQL(
sql=["SOME SQLS", ("SOME SQLS NO PARAM", None)],
reverse_sql=["SOME SQLS", ("SOME SQLS NO PARAM", None)],
)
RunSQL(
sql=["SOME SQLS", ("SOME SQLS %(VAL)s", {"VAL": "FOO"})],
reverse_sql=["SOME SQLS", ("SOME SQLS %(VAL)s", {"VAL": "FOO"})],
)
RunSQL(
sql=["SOME SQLS", ("SOME SQLS %s, %s", ["PARAM", "ANOTHER PARAM"])],
reverse_sql=["SOME SQLS", ("SOME SQLS %s, %s", ["PARAM", "ANOTHER PARAM"])],
)
RunSQL("INSERT INTO musician (name) VALUES ('Reinhardt');")
RunSQL([("INSERT INTO musician (name) VALUES ('Reinhardt');", None)])
RunSQL([("INSERT INTO musician (name) VALUES (%s);", ["Reinhardt"])])
query = "UPDATE posts SET category = %s WHERE category = ANY(%s);"
RunSQL([(query, ["new category", ["retired category", "another retired category"]])])
RunSQL(sql=["SOME SQLS", ("SOME SQLS %s, %s", [object(), "ANOTHER PARAM"])])
# Error cases
RunSQL(sql=("SOME SQL", {})) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
RunSQL(sql=("SOME SQL", 1)) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
RunSQL(sql=("SOME SQL", None)) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
RunSQL(sql=("SOME SQLS %(VAL)s", {1: "FOO"})) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/ 0000775 0000000 0000000 00000000000 15260643574 0024421 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0026520 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/_enums.py 0000664 0000000 0000000 00000002005 15260643574 0026256 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import Literal, assert_type
from django.db.models import TextChoices
class Direction(TextChoices):
NORTH = "N", "North"
EAST = "E", "East"
SOUTH = "S", "South"
WEST = "W", "West"
# Note: Suppress errors from pyright and ty as the mypy plugin narrows the type of labels if non-lazy.
assert_type(Direction.names, list[str])
assert_type(Direction.labels, list[str]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(Direction.values, list[str])
assert_type(Direction.choices, list[tuple[str, str]]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(Direction.NORTH, Literal[Direction.NORTH])
assert_type(Direction.NORTH.name, Literal["NORTH"])
assert_type(Direction.NORTH.label, str) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(Direction.NORTH.value, str)
assert_type(Direction.NORTH.do_not_call_in_templates, Literal[True])
typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/fields/ 0000775 0000000 0000000 00000000000 15260643574 0025667 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/fields/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0027766 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/fields/test_files.py 0000664 0000000 0000000 00000000653 15260643574 0030406 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import assert_type
from django.db import models
from django.db.models.fields.files import FieldFile, ImageFieldFile
class MyModel(models.Model):
file = models.FileField()
image = models.ImageField()
instance = MyModel()
assert_type(instance.file, FieldFile) # pyrefly: ignore[assert-type]
assert_type(instance.image, ImageFieldFile) # pyrefly: ignore[assert-type]
typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/fields/test_related.py 0000664 0000000 0000000 00000001246 15260643574 0030723 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from django.db import models
class Author(models.Model):
pass
class Book(models.Model):
author = models.ForeignKey(Author, on_delete=models.CASCADE, swappable=False) # pyright: ignore[reportUnknownVariableType]
class Profile(models.Model):
user = models.OneToOneField(Author, on_delete=models.CASCADE, swappable=False) # pyright: ignore[reportUnknownVariableType]
class Review(models.Model):
book = models.ForeignKey(Book, on_delete=models.DB_CASCADE) # pyright: ignore[reportUnknownVariableType]
author = models.OneToOneField(Author, on_delete=models.DB_SET_NULL) # pyright: ignore[reportUnknownVariableType]
typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/fields/test_related_descriptors.py 0000664 0000000 0000000 00000002746 15260643574 0033352 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import ClassVar, assert_type
from django.db import models
from django.db.models.fields.related_descriptors import RelatedManager, ReverseManyToOneDescriptor
from typing_extensions import TypeVar
_To = TypeVar("_To", bound=models.Model)
class Other(models.Model):
explicit_descriptor: ClassVar[ReverseManyToOneDescriptor[MyModel]]
class MyModel(models.Model):
rel = models.ForeignKey[Other, Other](Other, on_delete=models.CASCADE, related_name="explicit_descriptor")
assert_type(Other().explicit_descriptor, RelatedManager[MyModel])
class CustomDescriptor(ReverseManyToOneDescriptor[MyModel]):
def custom_method(self) -> int:
raise NotImplementedError
class WithCustomDescriptor(models.Model):
custom_descriptor: ClassVar[CustomDescriptor]
# Class-level access returns `Self`, preserving descriptor subclasses and their members
assert_type(WithCustomDescriptor.custom_descriptor, CustomDescriptor)
assert_type(WithCustomDescriptor.custom_descriptor.custom_method(), int)
class PassThroughDescriptor(ReverseManyToOneDescriptor[_To]): ...
class WithPassThroughDescriptor(models.Model):
passthrough_descriptor: ClassVar[PassThroughDescriptor[MyModel]]
# Class-level access returns `Self`, preserving a generic subclass and its parameterization
assert_type(WithPassThroughDescriptor.passthrough_descriptor, PassThroughDescriptor[MyModel])
assert_type(MyModel._default_manager.__class__, type[models.Manager[MyModel]])
typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/functions/ 0000775 0000000 0000000 00000000000 15260643574 0026431 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/functions/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0030530 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/functions/test_window.py 0000664 0000000 0000000 00000000566 15260643574 0031360 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from django.db.models import F, Value
from django.db.models.functions import Lag, Lead, NthValue
Lag("field")
Lag(F("field"))
Lead("field")
Lead(F("field"))
NthValue("field", nth=2)
NthValue(F("field"), nth=2)
Lag("field", default=42)
Lag("field", default="string")
Lag("field", default=Value("value"))
Lag("field", default=F("other"))
typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_aggregates.py 0000664 0000000 0000000 00000005615 15260643574 0030152 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import cast
from django.db.models import (
BooleanField,
Count,
Exists,
ExpressionWrapper,
F,
Model,
Q,
QuerySet,
StdDev,
StringAgg,
Variance,
)
from django.db.models.aggregates import Aggregate
from django.db.models.lookups import GreaterThan
Aggregate("title", order_by="title")
Aggregate("title", order_by="-title")
Aggregate("title", order_by=F("title"))
Aggregate("title", order_by=F("title").desc())
Aggregate("title", order_by=["-title", F("title")])
Aggregate("title", order_by=("-title", F("title").desc()))
Aggregate("title", order_by=None)
queryset = cast("QuerySet[Model]", object())
# Count: filter is positional-or-keyword (unique to Count)
Count("id", distinct=True)
Count("id", filter=Q(active=True))
Count("id", filter=Exists(queryset))
Count("id", filter=GreaterThan(F("id"), 0))
Count("id", filter=ExpressionWrapper(Exists(queryset), output_field=BooleanField()))
Count("id", Q(active=True)) # filter as positional
Count(123) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
Count("id", filter="active") # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
Count("id", filter=F("a")) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
# StdDev: second positional is `sample: bool`, not filter; filter/default are keyword-only
StdDev("score", filter=Q(active=True), default=0)
StdDev([]) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
StdDev("score", Q(active=True)) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
# Variance: same shape as StdDev
Variance("score", filter=Q(active=True), default=0)
Variance({}) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
# StringAgg: full Aggregate kwarg surface (distinct, filter, default, order_by)
StringAgg("title", delimiter=",", order_by="title")
StringAgg("title", delimiter=",", order_by=F("title"))
StringAgg("title", delimiter=",", order_by=["-title", F("title")])
StringAgg("title", delimiter=",", distinct=True, filter=Q(active=True), order_by="-title", default="")
StringAgg("title", delimiter=",", filter=F("a")) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
StringAgg("title", delimiter=",", order_by=123) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_base.py 0000664 0000000 0000000 00000002144 15260643574 0026745 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING, assert_type
from django.db import models
from typing_extensions import override
if TYPE_CHECKING:
from collections.abc import Iterable
from django.db.models.query import QuerySet
class MyModel(models.Model):
class Meta:
app_label = "myapp"
class OtherModel(models.Model):
class Meta:
app_label = "myapp"
# Override with QuerySet[Model] — valid
class OverrideWithModel(models.Model):
@override
def refresh_from_db(
self,
using: str | None = None,
fields: Iterable[str] | None = None,
from_queryset: QuerySet[models.Model] | None = None,
) -> None: ...
class Meta:
app_label = "myapp"
def test_correct_queryset(m: MyModel, qs: QuerySet[MyModel]) -> None:
m.refresh_from_db(from_queryset=qs)
assert_type(m.refresh_from_db(), None)
def test_wrong_queryset(m: MyModel, qs: QuerySet[OtherModel]) -> None:
m.refresh_from_db(from_queryset=qs) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type]
typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_constraints.py 0000664 0000000 0000000 00000001213 15260643574 0030376 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from django.db.models import CheckConstraint, Q, UniqueConstraint
from django.db.models.functions import Lower
UniqueConstraint(Lower("name").desc(), "category", name="unique_lower_name_category")
UniqueConstraint(fields=["name"], name="unique_name")
# There's no overload case for passing both expression and 'fields'
UniqueConstraint( # type: ignore[call-overload]
Lower("name"),
fields=["name"], # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
name="unique_mess",
)
CheckConstraint(name="positive_price", condition=Q(price__gt=0))
typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_enums.py 0000664 0000000 0000000 00000040614 15260643574 0027166 0 ustar 00root root 0000000 0000000 from __future__ import annotations
import enum
from typing import Any, Literal, assert_type
from django.db.models import Choices, IntegerChoices, Model, TextChoices
from django.utils.functional import _StrOrPromise, _StrPromise
from django.utils.translation import gettext_lazy as _
from typing_extensions import TypeVar, override
# Choices in a separate model to test that the plugin resolves types correctly.
from tests.assert_type.db.models import _enums as imported
T_Choices = TypeVar("T_Choices", bound=IntegerChoices)
def get_choices_using_property(choices: type[T_Choices]) -> list[tuple[int, str]]:
return choices.choices # pyright: ignore[reportReturnType] # ty: ignore[invalid-return-type]
def get_labels_using_property(choices: type[T_Choices]) -> list[str]:
return choices.labels # pyright: ignore[reportReturnType] # ty: ignore[invalid-return-type]
def get_values_using_property(choices: type[T_Choices]) -> list[int]:
return choices.values
def get_labels_using_comprehension(choices: type[T_Choices]) -> list[str]:
return [choice.label for choice in choices] # pyright: ignore[reportReturnType] # ty: ignore[invalid-return-type]
def get_values_using_comprehension(choices: type[T_Choices]) -> list[int]:
return [choice.value for choice in choices]
class Suit(IntegerChoices):
DIAMOND = 1, _("Diamond")
SPADE = 2, _("Spade")
HEART = 3, _("Heart")
CLUB = 4, _("Club")
class YearInSchool(TextChoices):
FRESHMAN = "FR", _("Freshman")
SOPHOMORE = "SO", _("Sophomore")
JUNIOR = "JR", _("Junior")
SENIOR = "SR", _("Senior")
GRADUATE = "GR", _("Graduate")
class Vehicle(IntegerChoices):
CAR = 1, "Carriage"
TRUCK = 2
JET_SKI = 3
__empty__ = _("(Unknown)")
class Gender(TextChoices):
MALE = "M"
FEMALE = "F"
NOT_SPECIFIED = "X"
__empty__ = "(Undeclared)"
class Medal(TextChoices):
GOLD = enum.auto()
SILVER = enum.auto()
BRONZE = enum.auto()
class Separator(bytes, Choices):
FS = b"\x1c", "File Separator"
GS = b"\x1d", "Group Separator"
RS = b"\x1e", "Record Separator"
US = b"\x1f", "Unit Separator"
class Constants(float, Choices):
PI = 3.141592653589793, "π"
TAU = 6.283185307179586, "τ"
__empty__ = "NULL"
class BaseEmptyChoices(Choices):
__empty__ = "Python's None"
class VoidChoices(BaseEmptyChoices):
ABYSS = enum.auto()
CHASM = enum.auto()
# Choice type that has been aliased to test that the plugin resolves types correctly.
CompassPoint = imported.Direction
# Choice type that has been aliased by type to test that the plugin resolves types correctly.
Award: type[TextChoices] = Medal
# Checks unions of enum literals to test that the plugin resolves types correctly.
def get_suit_with_color(suit: Suit) -> str:
if suit == Suit.DIAMOND or suit == Suit.HEART:
return f"{suit.label} is red."
return f"{suit.label} is black."
# Checks a single enum literal to test that the plugin resolves types correctly.
def is_suit_a_diamond(suit: Suit) -> str:
if suit == Suit.DIAMOND:
return f"{suit.label}: Yes!"
return f"{suit.label}: No!"
# Choice type that overrides a property and uses `super()` to test the plugin resolve types correctly.
class ShoutyTextChoices(TextChoices):
@property
@override
def label(self) -> str:
return super().label.upper()
class DeckModel(Model):
# Alias with the same name.
Suit = Suit
# Alias with a different name.
House = Suit
class Joker(TextChoices):
BLACK = "B"
RED = "R"
# Assertions for an integer choices type that uses a lazy translatable string for all labels.
assert_type(Suit.names, list[str])
assert_type(Suit.labels, list[_StrPromise]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(Suit.values, list[int])
assert_type(Suit.choices, list[tuple[int, _StrPromise]]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(Suit.CLUB, Literal[Suit.CLUB])
assert_type(Suit.CLUB.name, Literal["CLUB"])
assert_type(Suit.CLUB.label, _StrPromise) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(Suit.CLUB.value, int)
assert_type(Suit.CLUB.do_not_call_in_templates, Literal[True])
# Assertions for a text choices type that uses a lazy translatable string for all labels.
assert_type(YearInSchool.names, list[str])
assert_type(YearInSchool.labels, list[_StrPromise]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(YearInSchool.values, list[str])
assert_type(YearInSchool.choices, list[tuple[str, _StrPromise]]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(YearInSchool.SENIOR, Literal[YearInSchool.SENIOR])
assert_type(YearInSchool.SENIOR.name, Literal["SENIOR"])
assert_type(YearInSchool.SENIOR.label, _StrPromise) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(YearInSchool.SENIOR.value, str)
assert_type(YearInSchool.SENIOR.do_not_call_in_templates, Literal[True])
# Assertions for an integer choices type that defines `__empty__`, generates most labels, etc.
# Note: Suppress errors from pyright as the mypy plugin handles making types optional.
assert_type(Vehicle.names, list[str])
assert_type(Vehicle.labels, list[_StrOrPromise])
assert_type(Vehicle.values, list[int | None]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(Vehicle.choices, list[tuple[int | None, _StrOrPromise]]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(Vehicle.CAR, Literal[Vehicle.CAR])
assert_type(Vehicle.CAR.name, Literal["CAR"])
assert_type(Vehicle.CAR.label, _StrOrPromise)
assert_type(Vehicle.CAR.value, int)
assert_type(Vehicle.CAR.do_not_call_in_templates, Literal[True])
assert_type(Vehicle.__empty__, _StrPromise) # pyright: ignore[reportAssertTypeFailure]
# Assertions for an text choices type that defines `__empty__` and uses plain strings for all labels.
# Note: Suppress errors from pyright as the mypy plugin handles making types optional.
# Note: Suppress errors from pyright as the mypy plugin narrows the type of labels if non-lazy.
assert_type(Gender.names, list[str])
assert_type(Gender.labels, list[str]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(Gender.values, list[str | None]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(Gender.choices, list[tuple[str | None, str]]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(Gender.MALE, Literal[Gender.MALE])
assert_type(Gender.MALE.name, Literal["MALE"])
assert_type(Gender.MALE.label, str) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(Gender.MALE.value, str)
assert_type(Gender.MALE.do_not_call_in_templates, Literal[True])
assert_type(Gender.__empty__, str) # pyright: ignore[reportAssertTypeFailure]
# Assertions for a text choices type that uses `enum.auto()`.
# Note: Suppress errors from pyright as the mypy plugin narrows the type of labels if non-lazy.
assert_type(Medal.names, list[str])
assert_type(Medal.labels, list[str]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(Medal.values, list[str])
assert_type(Medal.choices, list[tuple[str, str]]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(Medal.GOLD, Literal[Medal.GOLD])
assert_type(Medal.GOLD.name, Literal["GOLD"])
assert_type(Medal.GOLD.label, str) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(Medal.GOLD.value, str)
assert_type(Medal.GOLD.do_not_call_in_templates, Literal[True])
# Assertions for a choices type that uses a custom base type.
# Note: Suppress errors from pyright as the mypy plugin handles propagating custom base types.
# Note: Suppress errors from pyright as the mypy plugin narrows the type of labels if non-lazy.
assert_type(Separator.names, list[str])
assert_type(Separator.labels, list[str]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(Separator.values, list[bytes]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(Separator.choices, list[tuple[bytes, str]]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(Separator.FS, Literal[Separator.FS])
assert_type(Separator.FS.name, Literal["FS"])
assert_type(Separator.FS.label, str) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(Separator.FS.value, bytes) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(Separator.FS.do_not_call_in_templates, Literal[True])
# Assertions for a choices type uses a custom base type and defines `__empty__`.
# Note: Suppress errors from pyright as the mypy plugin handles making types optional.
# Note: Suppress errors from pyright as the mypy plugin handles propagating custom base types.
# Note: Suppress errors from pyright as the mypy plugin narrows the type of labels if non-lazy.
assert_type(Constants.names, list[str])
assert_type(Constants.labels, list[str]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(Constants.values, list[float | None]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(Constants.choices, list[tuple[float | None, str]]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(Constants.PI, Literal[Constants.PI])
assert_type(Constants.PI.name, Literal["PI"])
assert_type(Constants.PI.label, str) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(Constants.PI.value, float) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(Constants.PI.do_not_call_in_templates, Literal[True])
assert_type(Constants.__empty__, str) # pyright: ignore[reportAssertTypeFailure]
# Assertions for a choices type where `__empty__` is defined on a base class.
# Note: Suppress errors from pyright as the mypy plugin handles making types optional.
# Note: Suppress errors from pyright as the mypy plugin narrows the type of labels if non-lazy.
assert_type(VoidChoices.names, list[str])
assert_type(VoidChoices.labels, list[str]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(VoidChoices.values, list[int | None]) # type: ignore[assert-type] # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(VoidChoices.values, list[Any | None]) # pyright: ignore[reportAssertTypeFailure] # pyrefly: ignore[assert-type] # ty: ignore[type-assertion-failure]
assert_type(VoidChoices.choices, list[tuple[int | None, str]]) # type: ignore[assert-type] # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(VoidChoices.choices, list[tuple[Any | None, str]]) # pyright: ignore[reportAssertTypeFailure] # pyrefly: ignore[assert-type] # ty: ignore[type-assertion-failure]
assert_type(VoidChoices.ABYSS, Literal[VoidChoices.ABYSS])
assert_type(VoidChoices.ABYSS.name, Literal["ABYSS"])
assert_type(VoidChoices.ABYSS.label, str) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(VoidChoices.ABYSS.value, int) # type: ignore[assert-type] # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(VoidChoices.ABYSS.value, Any) # pyrefly: ignore[assert-type]
assert_type(VoidChoices.ABYSS.do_not_call_in_templates, Literal[True])
assert_type(VoidChoices.__empty__, str) # pyright: ignore[reportAssertTypeFailure]
# Assertions for a choices type imported from another module to test the plugin resolves correctly.
# Note: Suppress errors from pyright as the mypy plugin narrows the type of labels if non-lazy.
assert_type(imported.Direction.names, list[str])
assert_type(imported.Direction.labels, list[str]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(imported.Direction.values, list[str])
assert_type(imported.Direction.choices, list[tuple[str, str]]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(imported.Direction.NORTH, Literal[imported.Direction.NORTH])
assert_type(imported.Direction.NORTH.name, Literal["NORTH"])
assert_type(imported.Direction.NORTH.label, str) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(imported.Direction.NORTH.value, str)
assert_type(imported.Direction.NORTH.do_not_call_in_templates, Literal[True])
# Assertions for a choices type aliased from another to test the plugin resolves correctly.
# Note: Suppress errors from pyright as the mypy plugin narrows the type of labels if non-lazy.
assert_type(CompassPoint.names, list[str])
assert_type(CompassPoint.labels, list[str]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(CompassPoint.values, list[str])
assert_type(CompassPoint.choices, list[tuple[str, str]]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(CompassPoint.NORTH, Literal[imported.Direction.NORTH])
assert_type(CompassPoint.NORTH.name, Literal["NORTH"])
assert_type(CompassPoint.NORTH.label, str) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(CompassPoint.NORTH.value, str)
assert_type(CompassPoint.NORTH.do_not_call_in_templates, Literal[True])
# Assertions for a choices type aliased by type to test the plugin resolves correctly.
# Note: Suppress errors from pyright as the mypy plugin narrows the type of labels if non-lazy.
assert_type(Award.names, list[str])
assert_type(Award.labels, list[str]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(Award.values, list[str])
assert_type(Award.choices, list[tuple[str, str]]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
# Assertions for mixing multiple choices types with consistent base types - only `IntegerChoices`.
x0 = (Suit, Vehicle)
assert_type([member.label for choices in x0 for member in choices], list[_StrOrPromise])
assert_type([member.value for choices in x0 for member in choices], list[int])
# Assertions for mixing multiple choices types with consistent base types - only `TextChoices`.
x1 = (Medal, Gender)
assert_type([member.label for choices in x1 for member in choices], list[str]) # type: ignore[assert-type] # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type( # pyrefly: ignore[assert-type]
[member.label for choices in x1 for member in choices], list[_StrOrPromise]
)
assert_type([member.value for choices in x1 for member in choices], list[str])
# Assertions for mixing multiple choices types with different base types - `IntegerChoices` and `TextChoices`.
x2 = (Medal, Suit)
assert_type([member.label for choices in x2 for member in choices], list[_StrOrPromise])
assert_type([member.value for choices in x2 for member in choices], list[int | str])
# Assertions for mixing multiple choices types with consistent base types - custom types.
x3 = (Constants, Separator)
assert_type([member.label for choices in x3 for member in choices], list[str]) # type: ignore[assert-type] # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type( # pyrefly: ignore[assert-type]
[member.label for choices in x3 for member in choices], list[_StrOrPromise]
)
assert_type([member.value for choices in x3 for member in choices], list[bytes | float]) # type: ignore[assert-type] # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type( # pyrefly: ignore[assert-type]
[member.value for choices in x3 for member in choices], list[Any]
)
# Assertions for choices objects defined and aliased in a model.
assert_type(DeckModel.Suit.choices, list[tuple[int, _StrPromise]]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(DeckModel.House.choices, list[tuple[int, _StrPromise]]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
assert_type(DeckModel.Joker.choices, list[tuple[str, str]]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_expressions.py 0000664 0000000 0000000 00000002607 15260643574 0030421 0 ustar 00root root 0000000 0000000 from __future__ import annotations
import datetime
from decimal import Decimal
from typing import assert_type
from django.db.models import F
from django.db.models.expressions import CombinedExpression
now = datetime.datetime.now()
delta = datetime.timedelta(seconds=10)
assert_type(F("x") + now, CombinedExpression)
assert_type(now + F("x"), CombinedExpression)
assert_type(F("x") + delta, CombinedExpression)
assert_type(delta + F("x"), CombinedExpression)
assert_type(F("x") + 1, CombinedExpression)
assert_type(1 + F("x"), CombinedExpression)
assert_type(F("x") + 1.5, CombinedExpression)
assert_type(F("x") + Decimal(1), CombinedExpression)
assert_type(F("x") + F("y"), CombinedExpression)
assert_type(F("x") + "_suffix", CombinedExpression)
assert_type("prefix_" + F("x"), CombinedExpression)
assert_type(F("x") + None, CombinedExpression)
assert_type(None + F("x"), CombinedExpression)
assert_type(F("x") - now, CombinedExpression)
assert_type(now - F("x"), CombinedExpression)
assert_type(F("x") - delta, CombinedExpression)
assert_type(delta - F("x"), CombinedExpression)
assert_type(F("x") - 1, CombinedExpression)
assert_type(1 - F("x"), CombinedExpression)
assert_type(F("x") - 1.5, CombinedExpression)
assert_type(F("x") - Decimal(1), CombinedExpression)
assert_type(F("x") - F("y"), CombinedExpression)
assert_type(F("x") - None, CombinedExpression)
assert_type(None - F("x"), CombinedExpression)
typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_indexes.py 0000664 0000000 0000000 00000000631 15260643574 0027471 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from django.db import models
from django.db.models.functions import Lower
models.Index(fields=["foo"])
models.Index(models.F("bar"), name="test")
models.Index("foo", models.F("bar"), Lower("baz"), name="test")
models.Index("foo", name="test", opclasses=["bar"])
models.Index("foo", name="test", condition=models.Q(foo=1))
models.Index("foo", name="test", include=["bar"])
typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_lookups.py 0000664 0000000 0000000 00000002211 15260643574 0027522 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING, Any, assert_type
from django.db.models import Lookup
if TYPE_CHECKING:
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models.fields.json import CaseInsensitiveMixin
from django.db.models.sql.compiler import SQLCompiler
# Lookup can be used without explicit type argument (defaults to Any).
# Regression test for https://github.com/typeddjango/django-stubs/issues/2649.
def test_lookup_optional_type_arg(lookup: Lookup, typed_lookup: Lookup[int]) -> None:
assert_type(lookup, Lookup)
assert_type(typed_lookup, Lookup[int])
class MyLookup(Lookup): ...
class MyTypedLookup(Lookup[Any]): ...
def test_subclass_without_type_arg(lookup: MyLookup, typed: MyTypedLookup) -> None:
# MyLookup(Lookup) is equivalent to MyLookup(Lookup[Any])
assert_type(lookup, MyLookup)
assert_type(typed, MyTypedLookup)
def test_case_insensitive_mixin(
mixin: CaseInsensitiveMixin, compiler: SQLCompiler, connection: BaseDatabaseWrapper
) -> None:
assert_type(mixin.process_lhs(compiler, connection), tuple[str, tuple[str | int, ...]])
typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_manager_access/ 0000775 0000000 0000000 00000000000 15260643574 0030413 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_manager_access/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0032512 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_manager_access/models.py 0000664 0000000 0000000 00000007140 15260643574 0032252 0 ustar 00root root 0000000 0000000 """Managers are only accessible on the model class, never on an instance."""
from __future__ import annotations
from typing import assert_type
from django.contrib.auth.models import AnonymousUser, Group
from django.db import models
from django.db.models.manager import EmptyManager
from django_stubs_ext.db.models.manager import RelatedManager
class CategoryManager(models.Manager["Category"]):
pass
class Category(models.Model):
objects = CategoryManager()
secondary = CategoryManager()
class Post(models.Model):
"""No declared manager, `objects` only resolves through `ModelBase.__getattr__`."""
class Article(models.Model):
# Reverse accessors are bound to instances, so they must be annotated with `RelatedManager`, not a bare `Manager`.
mistyped_category_set: models.Manager[Category] # pyright: ignore[reportUninitializedInstanceVariable]
category_set: RelatedManager[Category] # pyright: ignore[reportUninitializedInstanceVariable]
def declared_manager_access_on_instance_is_banned() -> None:
Category().objects # type: ignore[arg-type] # pyright: ignore[reportAttributeAccessIssue, reportUnknownMemberType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-attribute-access]
Category().secondary # type: ignore[arg-type] # pyright: ignore[reportAttributeAccessIssue, reportUnknownMemberType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-attribute-access]
def default_manager_access_on_instance_is_banned() -> None:
# `ModelBase.__getattr__` lives on the metaclass, so instances can't reach it. mypy sees the
# per-model attribute the plugin declares instead, and rejects it through `BaseManager.__get__`
Post().objects # type: ignore[arg-type] # pyright: ignore[reportAttributeAccessIssue, reportUnknownMemberType] # pyrefly: ignore[missing-attribute] # ty: ignore[unresolved-attribute]
def manager_access_on_class_is_allowed() -> None:
# A declared manager keeps its own type, exactly like any other class attribute
assert_type(Category.objects, CategoryManager)
assert_type(Category.secondary, CategoryManager)
assert_type(Post.objects, models.Manager[Post])
def unknown_attribute_is_still_an_error() -> None:
# `Literal["objects"]` must not turn `__getattr__` into a catch-all
Category.not_defined # type: ignore[attr-defined] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-attribute-access]
Category().not_defined # type: ignore[attr-defined] # pyright: ignore[reportAttributeAccessIssue, reportUnknownMemberType] # pyrefly: ignore[missing-attribute] # ty: ignore[unresolved-attribute]
def related_manager_access_on_instance_is_allowed() -> None:
assert_type(Article().category_set, RelatedManager[Category])
def bare_manager_annotation_on_instance_is_banned() -> None:
# A reverse accessor annotated as `Manager` is unreachable from the instance that owns it
Article().mistyped_category_set # type: ignore[arg-type] # pyright: ignore[reportAttributeAccessIssue, reportUnknownMemberType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-attribute-access]
def empty_manager_access_through_property_is_allowed() -> None:
# `EmptyManager` reaches instances through `AnonymousUser.groups`, a plain property
assert_type(AnonymousUser().groups, EmptyManager[Group])
def meta_manager_access_on_instance_is_allowed() -> None:
# `Options` hands out managers from an instance the same way
assert_type(Category()._meta.base_manager, models.Manager[Category])
assert_type(Category()._meta.default_manager, models.Manager[Category] | None)
typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_manager_overrides/ 0000775 0000000 0000000 00000000000 15260643574 0031154 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_manager_overrides/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0033253 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_manager_overrides/models.py 0000664 0000000 0000000 00000005260 15260643574 0033014 0 ustar 00root root 0000000 0000000 """Overriding `Manager.create()` with a narrowed return type.
Regression test for https://github.com/typeddjango/django-stubs/issues/578.
"""
from __future__ import annotations
from typing import Any, assert_type
from django.db import models
from typing_extensions import override
# ---------------------------------------------------------------------------
# Unparametrized manager: the plugin re-parametrizes it with the model it's on
# ---------------------------------------------------------------------------
class ArticleManager(models.Manager): # pyright: ignore[reportMissingTypeArgument]
# Without a type parameter, the inherited `create()` returns the unsolved `_T`, so narrowing it is an error.
# Only mypy checks the override against `_T`, the other type checkers treat it as unknown.
@override
def create(self, **kwargs: Any) -> Article: # type: ignore[override]
return super().create(**kwargs) # type: ignore[return-value] # pyright: ignore[reportUnknownVariableType]
class Article(models.Model):
objects = ArticleManager()
def override_manager_create_no_type_param() -> None:
assert_type(Article.objects.create(), Article)
# ---------------------------------------------------------------------------
# Manager parametrized with the model it's assigned to
# ---------------------------------------------------------------------------
class BookManager(models.Manager["Book"]):
@override
def create(self, **kwargs: Any) -> Book:
return super().create(**kwargs)
class Book(models.Model):
objects = BookManager()
def override_manager_create_with_type_param() -> None:
assert_type(Book.objects.create(), Book)
# ---------------------------------------------------------------------------
# Manager parametrized with another model than the one it's assigned to
# ---------------------------------------------------------------------------
class ReviewManager(models.Manager["Author"]):
# The type parameter, not the model the manager ends up on, drives what the inherited `create()` returns.
@override
def create(self, **kwargs: Any) -> Review: # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] # pyrefly: ignore[bad-override] # ty: ignore[invalid-method-override]
return super().create(**kwargs) # type: ignore[return-value] # pyright: ignore[reportReturnType] # pyrefly: ignore[bad-return] # ty: ignore[invalid-return-type]
class Review(models.Model):
objects = ReviewManager() # pyright: ignore[reportGeneralTypeIssues]
class Author(models.Model):
pass
def override_manager_create_with_incoherent_type_param() -> None:
assert_type(Review.objects.create(), Review)
typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_managers.py 0000664 0000000 0000000 00000002025 15260643574 0027626 0 ustar 00root root 0000000 0000000 """Regression test for https://github.com/typeddjango/django-stubs/issues/2911.
A TypeVar with a forward-referenced bound used in a QuerySet subclass
caused 'Must not defer during final iteration' crash in mypy.
"""
from __future__ import annotations
from typing import assert_type
from django.db import models
from django.db.models.query import QuerySet
from typing_extensions import TypeVar
T = TypeVar("T", bound="MyModel")
class MyModelQuerySet(QuerySet[T]):
pass
class MyModel(models.Model):
class Meta:
app_label = "myapp"
class CustomManager(models.Manager["OtherModel"]):
def manager_method(self) -> str:
return ""
class OtherQuerySet(models.QuerySet["OtherModel"]): ...
class OtherModel(models.Model):
class Meta:
app_label = "myapp"
# `from_queryset` returns `type[Self]`, preserving manager subclasses and their members
assert_type(CustomManager.from_queryset(OtherQuerySet), type[CustomManager])
assert_type(CustomManager.from_queryset(OtherQuerySet)().manager_method(), str)
typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_model_base.py 0000664 0000000 0000000 00000002315 15260643574 0030125 0 ustar 00root root 0000000 0000000 """The `ModelBase` metaclass properties, reached whenever a model class is only known as `type[_T]`."""
from __future__ import annotations
from typing import Generic, assert_type
from django.db import models
from typing_extensions import TypeVar
_T = TypeVar("_T", bound=models.Model)
class MyModel(models.Model):
class Meta:
app_label = "myapp"
class Base(Generic[_T]):
def __init__(self, model_cls: type[_T]) -> None:
self.model_cls = model_cls
def test_unbound(self) -> None:
# pyright reports `Manager[Model*]`: a conditional type still tied to `_T`, but not identical to it
assert_type(self.model_cls._default_manager, models.Manager[_T]) # pyright: ignore[reportAssertTypeFailure]
assert_type(self.model_cls._base_manager, models.Manager[_T]) # pyright: ignore[reportAssertTypeFailure]
class Child(Base[MyModel]):
def test_bound(self) -> None:
assert_type(self.model_cls._default_manager, models.Manager[MyModel])
assert_type(self.model_cls._base_manager, models.Manager[MyModel])
assert_type(Base(MyModel).model_cls._default_manager, models.Manager[MyModel])
assert_type(Base(MyModel).model_cls._base_manager, models.Manager[MyModel])
typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_ordering.py 0000664 0000000 0000000 00000005161 15260643574 0027646 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from django.contrib.auth.models import User
from django.db.models import F, OrderBy
from django.db.models.sql.query import Query
qs = User.objects.all()
qs.order_by("username")
qs.order_by(F("username"))
qs.order_by("-date_joined", F("last_login").desc())
# Test OrderBy expressions (success cases)
qs.order_by(OrderBy(F("username")))
qs.order_by(OrderBy(F("date_joined"), descending=True))
qs.order_by("username", OrderBy(F("last_login"), descending=True))
qs.extra(order_by=["username"])
qs.extra(order_by=[F("username")])
qs.extra(order_by=["username", F("date_joined").desc()])
qs.extra(order_by=[OrderBy(F("username"))])
qs.extra(order_by=["username", OrderBy(F("date_joined"), descending=True)])
query = Query(User)
query.add_ordering("username")
query.add_ordering(F("date_joined"))
query.add_ordering("-last_login", F("username").desc())
query.add_ordering(OrderBy(F("username")))
query.add_ordering("username", OrderBy(F("date_joined"), descending=True))
query.add_extra(
select=None,
select_params=None,
where=None,
params=None,
tables=None,
order_by=["username", F("date_joined").desc(), OrderBy(F("last_login"))],
)
# failure cases
qs.order_by(123) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
qs.order_by(["username"]) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
qs.order_by({"username": "asc"}) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
qs.extra(order_by=[123]) # type: ignore[list-item] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
qs.extra(order_by=["username", 456]) # type: ignore[list-item] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
query.add_ordering(123) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
query.add_ordering(["username"]) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
query.add_extra(
select=None,
select_params=None,
where=None,
params=None,
tables=None,
order_by=[123, "username"], # type: ignore[list-item] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
)
typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_query.py 0000664 0000000 0000000 00000004107 15260643574 0027201 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING, assert_type
from django.db.models.query import QuerySet, RawQuerySet, aprefetch_related_objects, prefetch_related_objects
if TYPE_CHECKING:
from collections.abc import Sequence
from django.contrib.auth.models import AnonymousUser
from django.db.models import Model
models_list: list[Model] = []
prefetch_related_objects(models_list, "pk")
models_tuple: tuple[Model, ...] = ()
prefetch_related_objects(models_tuple, "pk")
models_sequence: Sequence[Model] = []
prefetch_related_objects(models_sequence, "pk")
# failure cases
models_set: set[Model] = set()
prefetch_related_objects(models_set, "pk") # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
models_frozenset: frozenset[Model] = frozenset()
prefetch_related_objects(models_frozenset, "pk") # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
async def test_async() -> None:
await aprefetch_related_objects(models_list, "pk")
await aprefetch_related_objects(models_tuple, "pk")
await aprefetch_related_objects(models_sequence, "pk")
# failure cases
await aprefetch_related_objects(models_set, "pk") # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
await aprefetch_related_objects(models_frozenset, "pk") # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
def test_in_operator(
qs: QuerySet[Model],
raw_qs: RawQuerySet[Model],
obj: Model,
user_or_anon: Model | AnonymousUser,
obj_or_none: Model | None,
) -> None:
assert_type(obj in qs, bool)
assert_type(obj in raw_qs, bool)
assert_type(user_or_anon in qs, bool)
assert_type(obj_or_none in qs, bool)
assert_type(None in qs, bool)
assert_type("test" in qs, bool)
assert_type(42 in qs, bool)
typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_queryset_row_type/ 0000775 0000000 0000000 00000000000 15260643574 0031271 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_queryset_row_type/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0033370 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_queryset_row_type/models.py 0000664 0000000 0000000 00000004125 15260643574 0033130 0 ustar 00root root 0000000 0000000 from __future__ import annotations
import datetime
from collections.abc import Iterator
from typing import Any, assert_type
from django.db import models
from django.db.models.query import QuerySet, RawQuerySet
from django.utils import timezone
class Blog(models.Model):
created_at = models.DateTimeField() # pyright: ignore[reportUnknownVariableType]
def queryset_methods_keep_the_row_type(qs: QuerySet[Blog], manager: models.Manager[Blog]) -> None:
assert_type(qs.get(id=1), Blog)
assert_type(iter(qs), Iterator[Blog])
assert_type(qs.iterator(), Iterator[Blog])
assert_type(qs.first(), Blog | None)
assert_type(qs.earliest(), Blog)
assert_type(qs[0], Blog)
assert_type(qs[:9], QuerySet[Blog, Blog])
assert_type(qs.create(), Blog)
assert_type(qs.get_or_create(), tuple[Blog, bool])
assert_type(qs.exists(), bool)
assert_type(qs.none(), QuerySet[Blog, Blog])
assert_type(qs.update_or_create(), tuple[Blog, bool])
assert_type(qs.explain(), str)
assert_type(qs.raw(qs.explain()), RawQuerySet[Blog])
assert_type(qs.distinct(), QuerySet[Blog, Blog])
assert_type(qs.distinct("created_at"), QuerySet[Blog, Blog])
assert_type(qs & qs, QuerySet[Blog, Blog])
# .dates / .datetimes swap the row type
assert_type(manager.dates("created_at", "day"), QuerySet[Blog, datetime.date])
assert_type(manager.datetimes("created_at", "day"), QuerySet[Blog, datetime.datetime])
# defer / only
assert_type(qs.defer("created_at"), QuerySet[Blog, Blog])
assert_type(qs.defer(None), QuerySet[Blog, Blog])
assert_type(qs.only("created_at"), QuerySet[Blog, Blog])
qs.only(None) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
# bulk methods
assert_type(qs.count(), int)
assert_type(qs.update(created_at=timezone.now()), int)
assert_type(qs.in_bulk(), dict[Any, Blog])
assert_type(qs.bulk_update(list(qs), fields=["created_at"]), int)
assert_type(qs.bulk_create([]), list[Blog])
assert_type(qs.delete(), tuple[int, dict[str, int]])
typeddjango-django-stubs-fa03b48/tests/assert_type/db/test_connection.py 0000664 0000000 0000000 00000001335 15260643574 0026710 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import assert_type
from django.db import connection, connections
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.backends.utils import CursorWrapper
with connection.cursor() as cursor:
assert_type(cursor, CursorWrapper)
cursor.execute("SELECT %s", [123])
# psycopg2 composable SQL
from psycopg2.sql import SQL, Identifier # type: ignore[import-untyped]
with connection.cursor() as cursor:
cursor.execute(SQL("INSERT INTO {} VALUES (%s)").format(Identifier("my_table")), [123])
assert_type(connections["test"], BaseDatabaseWrapper)
for conn in connections.all():
with conn.cursor() as cursor:
assert_type(cursor, CursorWrapper)
typeddjango-django-stubs-fa03b48/tests/assert_type/db/test_transaction.py 0000664 0000000 0000000 00000003364 15260643574 0027102 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import assert_type
from django.db.transaction import atomic, non_atomic_requests
from django.http import HttpRequest, HttpResponse
# atomic as context manager
with atomic():
pass
with atomic(using="mydb"):
pass
with atomic(using="mydb", savepoint=False):
pass
with atomic(using="mydb", savepoint=False, durable=True):
pass
# atomic as bare decorator preserves function type
@atomic
def func(x: int) -> list[object]:
return []
assert_type(func(1), list[object])
# atomic with args preserves function type
@atomic(using="bla", savepoint=False)
def func2(x: int) -> list[object]:
return []
assert_type(func2(1), list[object])
# non_atomic_requests bare preserves function type
@non_atomic_requests
def view_func(request: HttpRequest) -> HttpResponse:
raise NotImplementedError
assert_type(view_func(HttpRequest()), HttpResponse)
# non_atomic_requests with extra args
@non_atomic_requests
def view_func2(request: HttpRequest, arg: str) -> HttpResponse:
raise NotImplementedError
assert_type(view_func2(HttpRequest(), "test"), HttpResponse)
# atomic as decorator on class methods
class ClassWithAtomicMethod:
@atomic
def atomic_method1(self, abc: int) -> str:
return ""
@atomic(savepoint=True)
def atomic_method2(self) -> None:
pass
@atomic(using="db", savepoint=True)
def atomic_method3(self, myparam: str) -> int:
return 0
assert_type(ClassWithAtomicMethod().atomic_method1(1), str)
assert_type(ClassWithAtomicMethod().atomic_method3("x"), int)
ClassWithAtomicMethod().atomic_method1("abc") # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
typeddjango-django-stubs-fa03b48/tests/assert_type/forms/ 0000775 0000000 0000000 00000000000 15260643574 0023677 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/forms/modelformsets/ 0000775 0000000 0000000 00000000000 15260643574 0026562 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/forms/modelformsets/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0030661 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/forms/modelformsets/models.py 0000664 0000000 0000000 00000003242 15260643574 0030420 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING, assert_type
from django.db import models
from django.forms.models import BaseInlineFormSet, BaseModelFormSet, ModelForm
if TYPE_CHECKING:
from django.contrib.contenttypes.forms import BaseGenericInlineFormSet
from django.forms.models import ModelChoiceField, ModelChoiceIterator
class Author(models.Model):
pass
class Book(models.Model):
pass
def test_form_parameter_defaults_to_model_form() -> None:
"""`_ModelFormT` defaults to `ModelForm[_M]`, so the form parameter can be omitted."""
class AuthorForm(ModelForm[Author]): ...
implicit: BaseModelFormSet[Author] = BaseModelFormSet()
explicit: BaseModelFormSet[Author, AuthorForm] = BaseModelFormSet()
# `ty` doesn't substitute `_M` in the default yet, it infers `list[ModelForm[Unknown]]`.
assert_type(implicit.saved_forms, "list[ModelForm[Author]]")
assert_type(explicit.saved_forms, "list[AuthorForm]")
def test_inline_form_parameter_defaults_to_model_form(
inline: BaseInlineFormSet[Book, Author],
generic_inline: BaseGenericInlineFormSet[Book],
) -> None:
assert_type(inline.saved_forms, "list[ModelForm[Book]]")
assert_type(inline.save(), "list[Book]")
assert_type(generic_inline.saved_forms, "list[ModelForm[Book]]")
def test_model_choice_iterator(field: ModelChoiceField[Author], iterator: ModelChoiceIterator[Author]) -> None:
"""`ModelChoiceIterator` is generic over the model of its field."""
assert_type(field.iterator, "type[ModelChoiceIterator[Author]]")
assert_type(iterator.field, "ModelChoiceField[Author]")
assert_type(iterator.queryset, "models.QuerySet[Author]")
typeddjango-django-stubs-fa03b48/tests/assert_type/forms/test_add_error.py 0000664 0000000 0000000 00000005472 15260643574 0027261 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import assert_type
from django.core.exceptions import ValidationError
from django.forms import BaseForm
from django.utils.functional import lazystr
form = BaseForm()
assert_type(form.add_error(None, "error"), None)
assert_type(form.add_error("field", "error"), None)
assert_type(form.add_error(None, lazystr("error")), None)
assert_type(form.add_error("field", lazystr("error")), None)
assert_type(form.add_error(None, ValidationError("error")), None)
assert_type(form.add_error("field", ValidationError("error")), None)
assert_type(form.add_error(None, ["error"]), None)
assert_type(form.add_error("field", ["error"]), None)
assert_type(form.add_error(None, [lazystr("error")]), None)
assert_type(form.add_error("field", [lazystr("error")]), None)
assert_type(form.add_error(None, [ValidationError("error")]), None)
assert_type(form.add_error("field", [ValidationError("error")]), None)
assert_type(form.add_error(None, {"field": "error"}), None)
assert_type(form.add_error(None, {"field": lazystr("error")}), None)
assert_type(form.add_error(None, {"field": ValidationError("error")}), None)
assert_type(form.add_error(None, {"field": ["error"]}), None)
assert_type(form.add_error(None, {"field": [lazystr("error")]}), None)
assert_type(form.add_error(None, {"field": [ValidationError("error")]}), None)
assert_type(form.add_error(None, ValidationError(["error"])), None)
assert_type(form.add_error("field", ValidationError(["error"])), None)
assert_type(form.add_error(None, ValidationError({"field": "error"})), None)
form.add_error("field", {"field": "error"}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload] # ty: ignore[no-matching-overload]
form.add_error("field", {"field": lazystr("error")}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload] # ty: ignore[no-matching-overload]
form.add_error("field", {"field": ValidationError("error")}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload] # ty: ignore[no-matching-overload]
form.add_error("field", {"field": ["error"]}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload] # ty: ignore[no-matching-overload]
form.add_error("field", {"field": [lazystr("error")]}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload] # ty: ignore[no-matching-overload]
form.add_error("field", {"field": [ValidationError("error")]}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload] # ty: ignore[no-matching-overload]
typeddjango-django-stubs-fa03b48/tests/assert_type/forms/test_fields.py 0000664 0000000 0000000 00000004065 15260643574 0026563 0 ustar 00root root 0000000 0000000 from __future__ import annotations
import json
from collections.abc import Collection
from re import Match, Pattern
from typing import Any, assert_type
from django import forms
from django.forms import DateField, JSONField
from django.forms.fields import DateTimeFormatsIterator
# 1. Test for BaseTemporalField (via DateField)
def test_temporal_field_input_formats() -> None:
field = DateField(input_formats=["%Y-%m-%d"])
# Verify that 'Collection' is correctly implemented
assert_type(field.input_formats, Collection[str] | DateTimeFormatsIterator | None)
# 2. "Real World" Example: Using it in a Django Form
class MyForm(forms.Form):
start_date = DateField(input_formats=["%Y-%m-%d"])
def test_form_field_type_access() -> None:
form = MyForm()
# Fetch the field explicitly from base_fields
field = form.base_fields["start_date"]
# Apply type narrowing to resolve Mypy errors
if isinstance(field, DateField):
assert_type(field.input_formats, Collection[str] | DateTimeFormatsIterator | None)
# 3. "Real World" Example: Subclassing
class CustomDateField(DateField):
def __init__(self, *args: Any, **kwargs: Any) -> None:
super().__init__(input_formats=["%d/%m/%Y"], *args, **kwargs)
def test_subclass_field_type() -> None:
custom_field = CustomDateField()
assert_type(custom_field.input_formats, Collection[str] | DateTimeFormatsIterator | None)
# 4. Test for JSONField Encoder/Decoder
class MyEncoder(json.JSONEncoder):
pass
class MyDecoder(json.JSONDecoder):
pass
def test_json_field_serialization_types() -> None:
field = JSONField(encoder=MyEncoder, decoder=MyDecoder)
assert_type(field.encoder, type[json.JSONEncoder] | None)
assert_type(field.decoder, type[json.JSONDecoder] | None)
def test_lazy_regex_pattern_methods_are_typed() -> None:
field = forms.IntegerField()
assert_type(field.re_decimal, Pattern[str])
assert_type(field.re_decimal.match("1.0"), Match[str] | None)
assert_type(field.re_decimal.sub("", "1.000"), str)
assert_type(field.re_decimal.pattern, str)
typeddjango-django-stubs-fa03b48/tests/assert_type/forms/test_fields_choices.py 0000664 0000000 0000000 00000005275 15260643574 0030264 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING
from django import forms
from django.db import models
from typing_extensions import TypeVar
if TYPE_CHECKING:
from collections.abc import Callable, Mapping, Sequence
_T = TypeVar("_T")
def to_named_seq(func: Callable[[], _T]) -> Callable[[], Sequence[tuple[str, _T]]]:
def inner() -> Sequence[tuple[str, _T]]:
return [("title", func())]
return inner
def to_named_mapping(func: Callable[[], _T]) -> Callable[[], Mapping[str, _T]]:
def inner() -> Mapping[str, _T]:
return {"title": func()}
return inner
def str_tuple() -> Sequence[tuple[str, str]]:
return (("foo", "bar"), ("fuzz", "bazz"))
def str_mapping() -> Mapping[str, str]:
return {"foo": "bar", "fuzz": "bazz"}
def int_tuple() -> Sequence[tuple[int, str]]:
return ((1, "bar"), (2, "bazz"))
def int_mapping() -> Mapping[int, str]:
return {3: "bar", 4: "bazz"}
class ExternalIntegerChoices(models.IntegerChoices):
FIRST = 1
def choices_type() -> type[models.Choices]:
return ExternalIntegerChoices
# Invalid choices
class BadForm(forms.Form):
my_choice = forms.ChoiceField(choices="test") # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
# Valid choices
class TestForm(forms.Form):
class TextChoices(models.TextChoices):
FIRST = "foo", "bar"
SECOND = "foo2", "bar"
class IntegerChoices(models.IntegerChoices):
FIRST = 1, "bar"
SECOND = 2, "bar"
char1 = forms.ChoiceField(choices=TextChoices) # ty: ignore[invalid-argument-type]
char2 = forms.ChoiceField(choices=str_tuple)
char3 = forms.ChoiceField(choices=str_mapping)
char4 = forms.ChoiceField(choices=str_tuple())
char5 = forms.ChoiceField(choices=str_mapping())
char6 = forms.ChoiceField(choices=to_named_seq(str_tuple))
char7 = forms.ChoiceField(choices=to_named_mapping(str_mapping))
char8 = forms.ChoiceField(choices=to_named_seq(str_tuple)())
char9 = forms.ChoiceField(choices=to_named_mapping(str_mapping)())
int1 = forms.ChoiceField(choices=IntegerChoices) # ty: ignore[invalid-argument-type]
int2 = forms.ChoiceField(choices=int_tuple)
int3 = forms.ChoiceField(choices=int_mapping)
int4 = forms.ChoiceField(choices=int_tuple())
int5 = forms.ChoiceField(choices=int_mapping())
int6 = forms.ChoiceField(choices=to_named_seq(int_tuple))
int7 = forms.ChoiceField(choices=to_named_seq(int_mapping))
int8 = forms.ChoiceField(choices=to_named_seq(int_tuple)())
int9 = forms.ChoiceField(choices=to_named_seq(int_mapping)())
int10 = forms.ChoiceField(choices=choices_type)
typeddjango-django-stubs-fa03b48/tests/assert_type/forms/test_forms.py 0000664 0000000 0000000 00000002142 15260643574 0026435 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING, Any, assert_type
from django.contrib.messages.views import SuccessMessageMixin
from django.views.generic.edit import FormMixin
if TYPE_CHECKING:
from django.forms import Form
def test_in_operator(form: Form, field: str) -> None:
# Valid: str field name
assert_type(field in form, bool)
# Invalid: non-str types should error
_ = 123 in form # type: ignore[operator] # pyright: ignore[reportOperatorIssue] # pyrefly: ignore[unsupported-operation] # ty: ignore[unsupported-operator]
_ = None in form # type: ignore[operator] # pyright: ignore[reportOperatorIssue] # pyrefly: ignore[unsupported-operation] # ty: ignore[unsupported-operator]
_ = b"field" in form # type: ignore[operator] # pyright: ignore[reportOperatorIssue] # pyrefly: ignore[unsupported-operation] # ty: ignore[unsupported-operator]
# SuccessMessageMixin is compatible with FormMixin
class FormFirstView(FormMixin[Any], SuccessMessageMixin[Any]):
pass
class SuccessMessageFirstView(SuccessMessageMixin[Any], FormMixin[Any]):
pass
typeddjango-django-stubs-fa03b48/tests/assert_type/forms/test_formsets.py 0000664 0000000 0000000 00000000450 15260643574 0027151 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING, assert_type
if TYPE_CHECKING:
from django.forms import Form
from django.forms.formsets import BaseFormSet
def test_in_operator(formset: BaseFormSet[Form], form: Form) -> None:
assert_type(form in formset, bool)
typeddjango-django-stubs-fa03b48/tests/assert_type/forms/test_widgets.py 0000664 0000000 0000000 00000000702 15260643574 0026755 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import Any, assert_type
from django import forms
from typing_extensions import override
# User-defined widgets may return any value usable in a template from `format_value`
class IntWidget(forms.Widget):
@override
def format_value(self, value: Any) -> int:
return int(value)
def test_format_value_override(widget: IntWidget) -> None:
assert_type(widget.format_value("1"), int)
typeddjango-django-stubs-fa03b48/tests/assert_type/http/ 0000775 0000000 0000000 00000000000 15260643574 0023530 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/http/test_redirect.py 0000664 0000000 0000000 00000000606 15260643574 0026744 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from django.conf import settings
from django.http import HttpResponseRedirect
from django.urls import reverse, reverse_lazy
reversed_url = reverse("url")
lazy_url = reverse_lazy("namespace:url")
HttpResponseRedirect(reversed_url)
HttpResponseRedirect(lazy_url)
HttpResponseRedirect(settings.LOGIN_URL)
HttpResponseRedirect(settings.LOGIN_REDIRECT_URL)
typeddjango-django-stubs-fa03b48/tests/assert_type/http/test_request.py 0000664 0000000 0000000 00000003121 15260643574 0026626 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from collections.abc import Iterable, Iterator
from typing import assert_type
from django.http import QueryDict
from django.http.request import _ImmutableQueryDict
from django_stubs_ext import MutableHttpRequest
q = QueryDict("", False)
# Test constructor overloads -- Mutable
assert_type(QueryDict("querystring", True), QueryDict)
assert_type(QueryDict("querystring", mutable=True), QueryDict)
# Test constructor overloads -- Immutable
assert_type(QueryDict(), _ImmutableQueryDict)
assert_type(QueryDict("querystring"), _ImmutableQueryDict)
assert_type(QueryDict("querystring", False), _ImmutableQueryDict)
assert_type(QueryDict("querystring", mutable=False), _ImmutableQueryDict)
# Test ImmutableQueryDict
q = QueryDict()
assert_type(q["a"], str)
assert_type(q.get("a"), str | None)
assert_type(q.items(), Iterator[tuple[str, str | list[object]]])
assert_type(q.getlist("a"), list[str]) # ty: ignore[type-assertion-failure]
assert_type(q.lists(), Iterable[tuple[str, list[str]]])
# Test MutableQueryDict
mut_q = QueryDict(mutable=True)
mut_q["a"] = "3"
mut_q["a"] = ["1", "2"] # type: ignore[assignment] # pyright: ignore[reportArgumentType] # pyrefly: ignore[unsupported-operation] # ty: ignore[invalid-assignment]
assert_type(mut_q.pop("a"), list[str])
assert_type(mut_q.pop("a", 12), list[str] | int) # ty: ignore[type-assertion-failure]
assert_type(mut_q.popitem(), tuple[str, list[str]])
# Test MutableHttpRequest helper
request = MutableHttpRequest()
assert_type(request, MutableHttpRequest)
request.GET["foo"] = "bar"
request.POST.setdefault("foo", "bar")
typeddjango-django-stubs-fa03b48/tests/assert_type/http/test_response.py 0000664 0000000 0000000 00000001576 15260643574 0027010 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from collections.abc import AsyncIterable, AsyncIterator, Iterator
from typing import assert_type
from django.http.response import HttpResponse, StreamingHttpResponse
# HttpResponse
# ============
response = HttpResponse()
# We can assign any objects, but get bytes back:
response.content = "abc"
assert_type(response.content, bytes)
assert_type(response.text, str)
# StreamingHttpResponse
# =====================
streaming_response = StreamingHttpResponse()
# We can assign any `Iterable`s ...
streaming_response.streaming_content = [1, 2]
streaming_response.streaming_content = iter(["a", "b"])
def async_iterable() -> AsyncIterable[int]:
raise NotImplementedError
streaming_response.streaming_content = async_iterable()
# ... but get `Iterator` back:
assert_type(streaming_response.streaming_content, Iterator[bytes] | AsyncIterator[bytes])
typeddjango-django-stubs-fa03b48/tests/assert_type/middleware/ 0000775 0000000 0000000 00000000000 15260643574 0024666 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/middleware/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0026765 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/middleware/test_middleware.py 0000664 0000000 0000000 00000006336 15260643574 0030424 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from collections.abc import Awaitable
from typing import TYPE_CHECKING, assert_type
from django.contrib.auth.middleware import AuthenticationMiddleware, RemoteUserMiddleware
from django.contrib.redirects.middleware import RedirectFallbackMiddleware
from django.contrib.sessions.middleware import SessionMiddleware
from django.http.response import (
FileResponse,
HttpResponse,
HttpResponseBase,
HttpResponseGone,
HttpResponsePermanentRedirect,
HttpResponseRedirect,
HttpResponseRedirectBase,
)
from django.middleware.cache import CacheMiddleware
from django.middleware.common import CommonMiddleware
from django.middleware.locale import LocaleMiddleware
from typing_extensions import override
if TYPE_CHECKING:
from django.http.request import HttpRequest
class CustomCommonMiddleware(CommonMiddleware):
response_redirect_class = HttpResponsePermanentRedirect
class BrokenCustomCommonMiddleware(CommonMiddleware):
response_redirect_class = FileResponse # type:ignore[assignment] # pyright: ignore[reportAssignmentType] # pyrefly: ignore[bad-assignment]
class CustomLocaleMiddleware(LocaleMiddleware):
response_redirect_class = HttpResponseRedirect
class BrokenCustomLocaleMiddleware(CommonMiddleware):
response_redirect_class = FileResponse # type:ignore[assignment] # pyright: ignore[reportAssignmentType] # pyrefly: ignore[bad-assignment]
class CustomRedirectFallbackMiddleware(RedirectFallbackMiddleware):
response_redirect_class = HttpResponseRedirect
response_gone_class = HttpResponseGone
class CustomRedirectFallbackMiddleware2(RedirectFallbackMiddleware):
response_redirect_class = HttpResponseRedirectBase
response_gone_class = HttpResponse
class BrokenCustomRedirectFallbackMiddleware(RedirectFallbackMiddleware):
response_redirect_class = HttpResponse # type:ignore[assignment] # pyright: ignore[reportAssignmentType] # pyrefly: ignore[bad-assignment]
response_gone_class = 12 # type:ignore[assignment] # pyright: ignore[reportAssignmentType] # pyrefly: ignore[bad-assignment]
class ResponseGoneFallbackMiddleware(RedirectFallbackMiddleware):
@override
def process_response(self, request: HttpRequest, response: HttpResponse) -> HttpResponse:
return self.response_gone_class()
def test_middleware_composition(request: HttpRequest) -> None:
def sync_get_response(request: HttpRequest, /) -> HttpResponse:
return HttpResponse()
async def async_get_response(request: HttpRequest, /) -> HttpResponse:
return HttpResponse()
# Plain sync and async views are accepted.
AuthenticationMiddleware(sync_get_response)
AuthenticationMiddleware(async_get_response)
# A middleware instance is accepted (regression test for #3537).
composed = SessionMiddleware(AuthenticationMiddleware(sync_get_response))
assert_type(composed(request), HttpResponseBase | Awaitable[HttpResponseBase])
remote = RemoteUserMiddleware(SessionMiddleware(sync_get_response))
assert_type(remote(request), HttpResponseBase | Awaitable[HttpResponseBase])
cache = CacheMiddleware(AuthenticationMiddleware(sync_get_response))
assert_type(cache(request), HttpResponseBase | Awaitable[HttpResponseBase])
typeddjango-django-stubs-fa03b48/tests/assert_type/tasks/ 0000775 0000000 0000000 00000000000 15260643574 0023676 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/tasks/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0025775 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/tasks/test_tasks.py 0000664 0000000 0000000 00000002121 15260643574 0026430 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import Any, assert_type
from django.tasks import task
from django.tasks.base import Task, TaskContext, TaskResult
@task
def test_task(x: int) -> int:
return x + 1
assert_type(test_task.call(1), int)
@task(priority=5)
def test_task_with_priority(x: int) -> int:
return x + 1
assert_type(test_task_with_priority.call(1), int)
@task(takes_context=True)
def test_task_with_context(context: TaskContext[Any, Any], x: int, /) -> int:
return x + 1
assert_type(test_task_with_context, Task[[int], int])
assert_type(test_task_with_context.enqueue(1), TaskResult[[int], int])
assert_type(test_task_with_context.call(1), int)
@task(takes_context=True, priority=5)
def test_task_with_context_and_priority(context: TaskContext[Any, Any], x: int, /) -> int:
return x + 1
assert_type(test_task_with_context_and_priority, Task[[int], int])
assert_type(test_task_with_context_and_priority.enqueue(1), TaskResult[[int], int])
assert_type(test_task_with_context.get_backend().enqueue(test_task_with_context, [1], {}), TaskResult[[int], int])
typeddjango-django-stubs-fa03b48/tests/assert_type/template/ 0000775 0000000 0000000 00000000000 15260643574 0024364 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/template/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0026463 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/template/backends/ 0000775 0000000 0000000 00000000000 15260643574 0026136 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/template/backends/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0030235 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/template/backends/test_utils.py 0000664 0000000 0000000 00000000713 15260643574 0030710 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import assert_type
from django.http import HttpRequest
from django.template.backends.utils import csrf_input_lazy, csrf_token_lazy
from django.utils.functional import _StrPromise
from django.utils.safestring import SafeString
request = HttpRequest()
input_result = csrf_input_lazy(request)
assert_type(input_result, SafeString)
token_result = csrf_token_lazy(request)
assert_type(token_result, _StrPromise)
typeddjango-django-stubs-fa03b48/tests/assert_type/template/test_library.py 0000664 0000000 0000000 00000007562 15260643574 0027453 0 ustar 00root root 0000000 0000000 from __future__ import annotations
import datetime
from typing import Any, assert_type
from django import template
from django.template.base import Parser, Token, TokenType
from django.template.defaulttags import CycleNode
register = template.Library()
# register.filter (bare)
@register.filter
def lower(value: str) -> str:
return value.lower()
assert_type(lower("test"), str)
# register.filter (named)
@register.filter(name="tolower")
def lower2(value: str) -> str:
return value.lower()
assert_type(lower2("test"), str)
# register.filter with all flags
@register.filter(name="plain", is_safe=True, needs_autoescape=False, expects_localtime=False)
def plain_filter(value: str) -> str:
return value
assert_type(plain_filter("x"), str)
# Negative: non-bool values for flag kwargs are rejected
register.filter("bad_is_safe", is_safe="yes") # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload] # ty: ignore[no-matching-overload]
register.filter("bad_needs_autoescape", needs_autoescape="no") # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload] # ty: ignore[no-matching-overload]
register.filter("bad_expects_localtime", expects_localtime=None) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload] # ty: ignore[no-matching-overload]
# Negative: unknown kwargs are rejected
register.filter("unknown_flag", safe=True) # type: ignore[call-overload] # pyright: ignore[reportCallIssue] # pyrefly: ignore[no-matching-overload] # ty: ignore[no-matching-overload]
# register.simple_tag (bare)
@register.simple_tag
def current_time(format_string: str) -> str:
return datetime.datetime.now().strftime(format_string)
assert_type(current_time("%H"), str)
# register.simple_tag with takes_context
@register.simple_tag(takes_context=True)
def current_time_ctx(context: dict[str, Any], format_string: str) -> str:
return "test"
assert_type(current_time_ctx({}, "%H"), str)
# register.simple_tag (named)
@register.simple_tag(name="minustwo")
def some_function(value: int) -> int:
return value - 2
assert_type(some_function(5), int)
# register.simple_tag via call
def f(s: str) -> str:
return s * 2
assert_type(register.simple_tag(f, name="double")("x"), str)
# register.simple_block_tag
assert_type(register.simple_block_tag(f, name="double")("x"), str)
@register.simple_block_tag
def block_tag_bare(format_string: str) -> str:
return datetime.datetime.now().strftime(format_string)
assert_type(block_tag_bare("%H"), str)
@register.simple_block_tag(name="minustwo")
def block_tag_named(value: int) -> int:
return value - 2
assert_type(block_tag_named(5), int)
# register.tag (bare)
@register.tag
def cycle(parser: Parser, token: Token) -> CycleNode:
return CycleNode([])
assert_type(cycle(Parser([]), Token(token_type=TokenType.TEXT, contents="")), CycleNode)
# register.tag (named)
@register.tag(name="cycle")
def cycle_impl(parser: Parser, token: Token) -> CycleNode:
return CycleNode([])
assert_type(cycle_impl(Parser([]), Token(token_type=TokenType.TEXT, contents="")), CycleNode)
# register.inclusion_tag
@register.inclusion_tag("results.html")
def format_results(results: list[str]) -> str:
return ", ".join(results)
assert_type(format_results(["a", "b"]), str)
# register.inclusion_tag with takes_context
@register.inclusion_tag("results.html", takes_context=True)
def format_results_ctx(context: dict[str, Any], results: list[str]) -> str:
return ", ".join(results)
assert_type(format_results_ctx({}, ["a", "b"]), str)
# register.inclusion_tag via call
def format_results_func(results: list[str]) -> str:
return ", ".join(results)
assert_type(register.inclusion_tag("results.html", format_results_func)(["a"]), str)
typeddjango-django-stubs-fa03b48/tests/assert_type/test/ 0000775 0000000 0000000 00000000000 15260643574 0023530 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/test/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0025627 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/test/client.py 0000664 0000000 0000000 00000001256 15260643574 0025364 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from django.test import Client
from django.urls import reverse, reverse_lazy
url_reverse = reverse("some:namespace")
url_lazy = reverse_lazy("some:namespace")
url_str = "/abc/def"
client = Client()
client.get(url_reverse)
client.get(url_lazy)
client.get(url_str)
client.post(url_reverse)
client.post(url_lazy)
client.post(url_str)
client.patch(url_reverse)
client.patch(url_lazy)
client.patch(url_str)
client.put(url_reverse)
client.put(url_lazy)
client.put(url_str)
client.delete(url_reverse)
client.delete(url_lazy)
client.delete(url_str)
client.generic("GET", url_reverse)
client.generic("POST", url_lazy)
client.generic("DELETE", url_str)
typeddjango-django-stubs-fa03b48/tests/assert_type/test/test_client.py 0000664 0000000 0000000 00000003165 15260643574 0026424 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import Any, assert_type
from django.core.handlers.asgi import ASGIRequest
from django.core.handlers.wsgi import WSGIRequest
from django.template.base import Template
from django.test.client import AsyncClient, AsyncRequestFactory, Client, RequestFactory
from django.test.utils import ContextList
# Client response attributes
client = Client()
response = client.get("foo")
assert_type(response.wsgi_request, WSGIRequest)
assert_type(response.request, dict[str, Any])
assert_type(response.templates, list[Template])
assert_type(response.client, Client)
assert_type(response.context, ContextList | dict[str, Any])
assert_type(response.context_data, dict[str, Any] | None)
assert_type(response.content, bytes)
assert_type(response.redirect_chain, list[tuple[str, int]])
assert_type(response.text, str)
response.json()
# Async client response attributes
async def test_async_client() -> None:
async_client = AsyncClient()
response = await async_client.get("foo")
assert_type(response.asgi_request, ASGIRequest)
assert_type(response.request, dict[str, Any])
assert_type(response.templates, list[Template])
assert_type(response.client, AsyncClient)
assert_type(response.context, ContextList | dict[str, Any])
assert_type(response.context_data, dict[str, Any] | None)
assert_type(response.content, bytes)
assert_type(response.redirect_chain, list[tuple[str, int]])
response.json()
# Request factories
factory = RequestFactory()
assert_type(factory.get("foo"), WSGIRequest)
async_factory = AsyncRequestFactory()
assert_type(async_factory.get("foo"), ASGIRequest)
typeddjango-django-stubs-fa03b48/tests/assert_type/test/test_testcase.py 0000664 0000000 0000000 00000002656 15260643574 0026765 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import assert_type
from django.core.handlers.wsgi import WSGIRequest
from django.test.client import Client
from django.test.testcases import TestCase, _AssertTemplateNotUsedContext, _AssertTemplateUsedContext
class ExampleTestCase(TestCase):
def test_method(self) -> None:
assert_type(self.client, Client)
resp = self.client.post("/url", {"doit": "srs"}, "application/json", False, True, extra="value")
assert_type(resp.status_code, int)
resp.json()
assert_type(resp.wsgi_request, WSGIRequest)
def test_assert_template_used(self) -> None:
response = self.client.get("/url")
assert_type(self.assertTemplateUsed(response, "template.html"), None)
with self.assertTemplateUsed("template.html") as ctx:
assert_type(ctx, _AssertTemplateUsedContext)
with self.assertTemplateUsed(template_name="template.html") as ctx:
assert_type(ctx, _AssertTemplateUsedContext)
def test_assert_template_not_used(self) -> None:
response = self.client.get("/url")
assert_type(self.assertTemplateNotUsed(response, "template.html"), None)
with self.assertTemplateNotUsed("template.html") as ctx:
assert_type(ctx, _AssertTemplateNotUsedContext)
with self.assertTemplateNotUsed(template_name="template.html") as ctx:
assert_type(ctx, _AssertTemplateNotUsedContext)
typeddjango-django-stubs-fa03b48/tests/assert_type/test/test_utils.py 0000664 0000000 0000000 00000001023 15260643574 0026275 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING, assert_type
from django.test import override_settings
if TYPE_CHECKING:
from django.test.utils import CaptureQueriesContext
def test_in_operator(ctx: CaptureQueriesContext, query: dict[str, str]) -> None:
assert_type(query in ctx, bool)
def test_iteration(ctx: CaptureQueriesContext) -> None:
for query in ctx:
assert_type(query, dict[str, str])
@override_settings(FOO="bar")
def test() -> None:
pass
assert_type(test(), None)
typeddjango-django-stubs-fa03b48/tests/assert_type/test_shortcuts.py 0000664 0000000 0000000 00000001630 15260643574 0026220 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import Any, assert_type
from django.http.request import HttpRequest
from django.http.response import HttpResponse, HttpResponsePermanentRedirect, HttpResponseRedirect
from django.shortcuts import redirect, render
from typing_extensions import TypedDict
# render function arguments
TestContext = TypedDict("TestContext", {"user": Any})
test_context: TestContext = {"user": "test"}
assert_type(render(HttpRequest(), "", test_context), HttpResponse)
# redirect return annotation
assert_type(redirect(to="", permanent=True), HttpResponsePermanentRedirect)
assert_type(redirect(to="", permanent=False), HttpResponseRedirect)
assert_type(redirect(to=""), HttpResponseRedirect)
var: bool = True
assert_type(redirect(to="", permanent=var), HttpResponseRedirect | HttpResponsePermanentRedirect) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure]
typeddjango-django-stubs-fa03b48/tests/assert_type/urls/ 0000775 0000000 0000000 00000000000 15260643574 0023536 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/urls/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0025635 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/urls/test_conf.py 0000664 0000000 0000000 00000005277 15260643574 0026107 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING, assert_type
from django.conf.urls.i18n import urlpatterns as i18n_urlpatterns
from django.conf.urls.static import static
from django.contrib import admin
from django.contrib.auth.views import LoginView
from django.contrib.flatpages import urls as flatpages_urls
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.urls import URLPattern, URLResolver, _AnyURL, include, path, re_path
from django.utils.translation import gettext_lazy as _
if TYPE_CHECKING:
from django.http import HttpResponse
# Test 'path' accepts mix of pattern and resolver object
include1: tuple[list[_AnyURL], None, None] = ([], None, None)
assert_type(path("test/", include1), URLResolver)
# Test 'path' accepts pattern resolver union subset
include2: tuple[list[URLPattern], None, None] = ([], None, None)
assert_type(path("test/", include2), URLResolver)
# Test 'path'
assert_type(path("admin/", admin.site.urls), URLResolver)
assert_type(path(_("admin/"), admin.site.urls, name="admin"), URLResolver)
assert_type(path("login/", LoginView.as_view(), name="login1"), URLPattern)
assert_type(path(_("login/"), LoginView.as_view(), name="login2"), URLPattern)
def v1() -> HttpResponse:
raise NotImplementedError
async def v2() -> HttpResponse:
raise NotImplementedError
assert_type(path("v1/", v1), URLPattern)
assert_type(path("v2/", v2), URLPattern)
assert_type(re_path("^v1/", v1), URLPattern)
assert_type(re_path("^v2/", v2), URLPattern)
# Test 'include'
patterns1: list[_AnyURL] = []
assert_type(re_path(_("^foo/"), include(patterns1)), URLResolver)
assert_type(re_path("^foo/", include(patterns1, namespace="foo")), URLResolver)
assert_type(re_path("^foo/", include((patterns1, "foo"), namespace="foo")), URLResolver)
assert_type(re_path("^foo/", include(patterns1, "foo")), URLResolver)
assert_type(path("flat/", include(flatpages_urls)), URLResolver)
assert_type(path("flat/", include((flatpages_urls, "static"))), URLResolver)
assert_type(path("i18n/", include(i18n_urlpatterns)), URLResolver)
assert_type(path("i18n/", include((i18n_urlpatterns, "i18n"))), URLResolver)
assert_type(path("admindocs/", include("django.contrib.admindocs.urls")), URLResolver)
assert_type(path("admindocs/", include(("django.contrib.admindocs.urls", "i18n"))), URLResolver)
assert_type(path("", include(staticfiles_urlpatterns(prefix="static/"))), URLResolver)
# Test 'static'
assert_type(static("/media/"), list[URLPattern])
assert_type(static("/media/", document_root="/tmp/media"), list[URLPattern])
def custom_serve(request: object, path: str) -> HttpResponse:
raise NotImplementedError
assert_type(static("/media/", view=custom_serve), list[URLPattern])
typeddjango-django-stubs-fa03b48/tests/assert_type/urls/test_converters.py 0000664 0000000 0000000 00000001561 15260643574 0027344 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from django.urls import register_converter
from django.urls.converters import IntConverter
# Builtin converter
register_converter(IntConverter, "bigint")
# Custom converter
class BigIntConverter:
regex = r"[0-9]+"
def to_python(self, value: str) -> int:
return int(value)
def to_url(self, value: int) -> str:
return str(value)
register_converter(BigIntConverter, "bigint")
# Incorrect types: to_python must accept str, to_url must return str
class BadConverter:
regex = r"[0-9]+"
def to_python(self, value: int) -> str:
return str(value)
def to_url(self, value: str) -> int:
return int(value)
register_converter(BadConverter, "bigint") # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
typeddjango-django-stubs-fa03b48/tests/assert_type/urls/test_resolvers.py 0000664 0000000 0000000 00000000622 15260643574 0027173 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from django.urls.resolvers import ResolverMatch
def f(x: ResolverMatch) -> None:
_func, _args, _kwargs = x # does not error
# would be nice but we can't really get this without tuple specialization
# as `__getitem__` is implemented as `return (..., ...)[...]`
# assert_type(_func, Callable)
typeddjango-django-stubs-fa03b48/tests/assert_type/utils/ 0000775 0000000 0000000 00000000000 15260643574 0023711 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/utils/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0026010 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/utils/test_connection.py 0000664 0000000 0000000 00000000417 15260643574 0027463 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING, assert_type
if TYPE_CHECKING:
from django.db.utils import ConnectionHandler
def test_in_operator(connections: ConnectionHandler, alias: str) -> None:
assert_type(alias in connections, bool)
typeddjango-django-stubs-fa03b48/tests/assert_type/utils/test_datastructures.py 0000664 0000000 0000000 00000003432 15260643574 0030401 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import assert_type
from django.utils.datastructures import MultiValueDict
# Constructors
var1: MultiValueDict[str, str] = MultiValueDict()
d2: dict[str, list[str | int]] = {"foo": ["Foo"], "bar": [2, 3]}
var2 = MultiValueDict(d2)
d3: tuple[tuple[str, list[str | int]], ...] = (("foo", ["Foo"]), ("bar", [2, 3]))
var3: MultiValueDict[str, str | int] = MultiValueDict(d3)
assert_type(var1, MultiValueDict[str, str])
assert_type(var2, MultiValueDict[str, str | int])
assert_type(var3, MultiValueDict[str, str | int])
# __getitem__, get, getlist
d = MultiValueDict({"foo": ["Foo"]})
d.setlist("bar", [])
assert_type(d["foo"], str | list[object])
assert_type(d["bar"], str | list[object])
assert_type(d.get("bar"), str | None)
assert_type(d.get("bar", 1), str | int) # ty: ignore[type-assertion-failure]
assert_type(d.getlist("bar"), list[str]) # ty: ignore[type-assertion-failure]
assert_type(d.getlist("bar", [1]), list[str] | list[int])
assert_type(d.getlist("baz", True), list[str] | bool) # ty: ignore[type-assertion-failure]
# setters
assert_type(d.setlistdefault("baz"), list[str])
d.setlistdefault("baz", [1]) # type: ignore[list-item] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
assert_type(d.setlistdefault("baz", []), list[str])
d.appendlist("baz", "Baz")
d.appendlist("baz", 1) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
# iterators
assert_type(list(d.items()), list[tuple[str, str | list[object]]])
assert_type(list(d.keys()), list[str])
assert_type(list(d.values()), list[str | list[object]])
assert_type(d.dict(), dict[str, str | list[object]]) # ty: ignore[type-assertion-failure]
typeddjango-django-stubs-fa03b48/tests/assert_type/utils/test_decorators.py 0000664 0000000 0000000 00000002757 15260643574 0027502 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from collections.abc import Callable
from typing import TYPE_CHECKING, Any, assert_type
from django.contrib.auth.decorators import login_required
from django.http.response import HttpResponseBase
from django.middleware.cache import CacheMiddleware
from django.utils.decorators import (
classonlymethod,
decorator_from_middleware,
decorator_from_middleware_with_args,
method_decorator,
)
from django.views.generic.base import View
from typing_extensions import override
if TYPE_CHECKING:
from django.http.request import HttpRequest
decorator = decorator_from_middleware(CacheMiddleware)
assert_type(
decorator,
Callable[[Callable[..., HttpResponseBase]], Callable[..., HttpResponseBase]],
)
factory = decorator_from_middleware_with_args(CacheMiddleware)
assert_type(
factory,
Callable[..., Callable[[Callable[..., HttpResponseBase]], Callable[..., HttpResponseBase]]],
)
# classonlymethod
class Bananaman:
@classonlymethod
def count_bananas(cls) -> int:
return 12
assert_type(Bananaman.count_bananas(), int)
# method_decorator on class
@method_decorator(login_required, name="dispatch")
class DecoratedView(View): ...
assert_type(DecoratedView(), DecoratedView)
# method_decorator on function
class TestView(View):
@method_decorator(login_required)
@override
def dispatch(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase:
return super().dispatch(request, *args, **kwargs)
typeddjango-django-stubs-fa03b48/tests/assert_type/utils/test_deprecation.py 0000664 0000000 0000000 00000000731 15260643574 0027620 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import TYPE_CHECKING
from django.utils.deprecation import MiddlewareMixin
from typing_extensions import override
if TYPE_CHECKING:
from collections.abc import Awaitable
from django.http import HttpRequest, HttpResponseBase
class MyMiddleware(MiddlewareMixin):
@override
def __call__(self, request: HttpRequest) -> HttpResponseBase | Awaitable[HttpResponseBase]:
return self.get_response(request)
typeddjango-django-stubs-fa03b48/tests/assert_type/utils/test_encoding.py 0000664 0000000 0000000 00000004041 15260643574 0027107 0 ustar 00root root 0000000 0000000 from __future__ import annotations
import datetime as dt
from typing import Any, assert_type
from django.utils.encoding import force_bytes, force_str, smart_bytes, smart_str
not_literal_int: int = 123
def test_any_input() -> None:
x: Any = None
assert_type(force_bytes(x), bytes)
assert_type(force_str(x), str)
assert_type(smart_bytes(x), bytes)
assert_type(smart_str(x), str)
class S(str):
pass
def test_force_bytes() -> None:
assert_type(force_bytes(123), bytes)
assert_type(force_bytes(not_literal_int, strings_only=True), int)
def test_force_str() -> None:
assert_type(force_str(123), str)
assert_type(force_str(not_literal_int, strings_only=True), int)
assert_type(force_str(dt.time(9, 50), strings_only=True), dt.time)
assert_type(force_str(dt.date(2026, 5, 31), strings_only=True), dt.date)
assert_type(force_str(dt.datetime.now(dt.UTC), strings_only=True), dt.datetime)
assert_type(force_str("foo"), str)
assert_type(force_str("foo", strings_only=True), str) # ty: ignore[type-assertion-failure]
assert_type(force_str(S("foo"), strings_only=True), S)
def test_smart_bytes() -> None:
assert_type(smart_bytes(123), bytes)
assert_type(smart_bytes(not_literal_int, strings_only=True), int)
assert_type(smart_bytes(dt.time(9, 50), strings_only=True), dt.time)
assert_type(smart_bytes(dt.date(2026, 5, 31), strings_only=True), dt.date)
assert_type(smart_bytes(dt.datetime.now(dt.UTC), strings_only=True), dt.datetime)
def test_smart_str() -> None:
assert_type(smart_str(123), str)
assert_type(smart_str(not_literal_int, strings_only=True), int)
assert_type(smart_str(dt.time(9, 50), strings_only=True), dt.time)
assert_type(smart_str(dt.date(2026, 5, 31), strings_only=True), dt.date)
assert_type(smart_str(dt.datetime.now(dt.UTC), strings_only=True), dt.datetime)
assert_type(smart_str("foo"), str)
assert_type(smart_str("foo", strings_only=True), str) # ty: ignore[type-assertion-failure]
assert_type(smart_str(S("foo"), strings_only=True), S)
typeddjango-django-stubs-fa03b48/tests/assert_type/utils/test_functional.py 0000664 0000000 0000000 00000006040 15260643574 0027464 0 ustar 00root root 0000000 0000000 from __future__ import annotations
import copy
from typing import TYPE_CHECKING, Any, ClassVar, assert_type
from django.contrib.auth.models import User
from django.utils.functional import Promise, SimpleLazyObject, cached_property, classproperty, lazystr
from typing_extensions import override
if TYPE_CHECKING:
from django_stubs_ext import StrOrPromise
# cached_property: class vs instance attributes
class Foo:
@cached_property
def attr(self) -> list[str]:
raise NotImplementedError
@cached_property # type: ignore[misc] # pyright: ignore[reportArgumentType] # ty: ignore[invalid-argument-type]
def attr2(self, arg2: str) -> list[str]:
raise NotImplementedError
f = Foo()
assert_type(f.attr, list[str])
f.attr.func # type: ignore[attr-defined] # pyright: ignore[reportAttributeAccessIssue,reportUnknownMemberType] # pyrefly: ignore[missing-attribute] # ty: ignore[unresolved-attribute]
# May be overridden by @property
class Bar(Foo):
@property
@override
def attr(self) -> list[str]: # pyright: ignore[reportIncompatibleVariableOverride]
raise NotImplementedError
# May be overridden by ClassVar
class Quux(Foo):
attr: ClassVar[list[str]] = [] # pyright: ignore[reportIncompatibleVariableOverride] # pyrefly: ignore[bad-override]
# ClassVar may not be overridden by cached_property
class Baz(Quux):
@cached_property
@override
def attr(self) -> list[str]: # type: ignore[override] # pyright: ignore[reportIncompatibleVariableOverride] # pyrefly: ignore[bad-override] # ty: ignore[invalid-attribute-override]
raise NotImplementedError
# str promise proxy
s = lazystr("asd")
assert_type(s.format("asd"), str) # pyright: ignore[reportAssertTypeFailure] # pyrefly: ignore[assert-type] # ty: ignore[type-assertion-failure]
assert_type(s.capitalize(), str) # pyright: ignore[reportAssertTypeFailure] # pyrefly: ignore[assert-type] # ty: ignore[type-assertion-failure]
assert_type(s + "bar", str)
assert_type("foo" + s, str)
assert_type(s % "asd", str)
s.nonsense # type: ignore[attr-defined]
def test_str_or_promise(f2: StrOrPromise) -> None:
assert_type(f2.format("asd"), str) # pyright: ignore[reportAssertTypeFailure] # pyrefly: ignore[assert-type] # ty: ignore[type-assertion-failure]
assert_type(f2 + "asd", str)
assert_type("asd" + f2, str)
def foo(content: str) -> None:
raise NotImplementedError
def bar(content: Promise) -> None:
raise NotImplementedError
foo(s) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type]
bar(s)
lazy_user: SimpleLazyObject[User] = SimpleLazyObject(User)
assert_type(lazy_user, SimpleLazyObject[User])
assert_type(copy.copy(lazy_user), SimpleLazyObject[User])
assert_type(copy.deepcopy(lazy_user), SimpleLazyObject[User])
class Bam:
@classproperty
def attr(cls: Any) -> str:
raise NotImplementedError
assert_type(Bam.attr, str)
class Sub(Bam):
def method(self) -> None:
assert_type(self.attr, str)
typeddjango-django-stubs-fa03b48/tests/assert_type/utils/test_safestring.py 0000664 0000000 0000000 00000001226 15260643574 0027470 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import assert_type
from django.utils.safestring import SafeString, mark_safe
from django.utils.translation import gettext_lazy
s = "hello"
assert_type(mark_safe(s), SafeString)
assert_type(mark_safe(s) + mark_safe(s), SafeString)
assert_type(s + mark_safe(s), str)
s += mark_safe(s)
assert_type(s, str)
ms = mark_safe(s)
ms += mark_safe(s)
assert_type(ms, SafeString)
# mark_safe accepts lazy strings
lazy_s = gettext_lazy("hello")
assert_type(mark_safe(lazy_s), SafeString)
# mark_safe as decorator preserves function type
@mark_safe
def func(s: str) -> str:
return s
assert_type(func("test"), str)
typeddjango-django-stubs-fa03b48/tests/assert_type/utils/test_text.py 0000664 0000000 0000000 00000001115 15260643574 0026304 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import assert_type
from django.utils.functional import _StrPromise
from django.utils.text import format_lazy
from django.utils.translation import gettext_lazy
result = format_lazy("{}", "test")
assert_type(result, _StrPromise)
result_lazy_fmt = format_lazy(gettext_lazy("Hello {}"), "world")
assert_type(result_lazy_fmt, _StrPromise)
result_multi = format_lazy("{} {} {}", "a", "b", "c")
assert_type(result_multi, _StrPromise)
result_kwargs = format_lazy("{name}: {value}", name="key", value=42)
assert_type(result_kwargs, _StrPromise)
typeddjango-django-stubs-fa03b48/tests/assert_type/utils/test_timezone.py 0000664 0000000 0000000 00000001377 15260643574 0027164 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from datetime import date, datetime, time
from typing import Literal, assert_type
from django.utils.timezone import is_aware, is_naive
# is_naive
is_naive(date(2020, 1, 1)) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload] # ty: ignore[no-matching-overload]
assert_type(is_naive(datetime(2020, 1, 1)), bool)
assert_type(is_naive(time()), Literal[True])
# is_aware
is_aware(date(2020, 1, 1)) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload] # ty: ignore[no-matching-overload]
assert_type(is_aware(datetime(2020, 1, 1)), bool)
assert_type(is_aware(time()), Literal[False])
typeddjango-django-stubs-fa03b48/tests/assert_type/utils/test_translation.py 0000664 0000000 0000000 00000001500 15260643574 0027654 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import assert_type
from django.utils.functional import _StrPromise
from django.utils.translation import ngettext, ngettext_lazy, npgettext, npgettext_lazy
# ngettext / npgettext accept float
assert_type(ngettext("apple", "apples", 1.0), str)
assert_type(npgettext("fruit", "apple", "apples", 1.0), str)
# lazy variants also accept str and None (deferred number resolution)
assert_type(ngettext_lazy("apple", "apples", 1), _StrPromise)
assert_type(ngettext_lazy("apple", "apples", "count"), _StrPromise)
assert_type(ngettext_lazy("apple", "apples"), _StrPromise)
assert_type(npgettext_lazy("fruit", "apple", "apples", 1), _StrPromise)
assert_type(npgettext_lazy("fruit", "apple", "apples", "count"), _StrPromise)
assert_type(npgettext_lazy("fruit", "apple", "apples"), _StrPromise)
typeddjango-django-stubs-fa03b48/tests/assert_type/views/ 0000775 0000000 0000000 00000000000 15260643574 0023706 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/views/__init__.py 0000664 0000000 0000000 00000000000 15260643574 0026005 0 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/assert_type/views/test_base.py 0000664 0000000 0000000 00000005200 15260643574 0026226 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import Any, assert_type
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin, UserPassesTestMixin
from django.http import HttpRequest, HttpResponse, HttpResponseBase, JsonResponse
from django.shortcuts import redirect
from django.template.response import TemplateResponse
from django.test import RequestFactory
from django.views.generic import TemplateView
from typing_extensions import override
request = RequestFactory().get("/")
class BareTemplateView(TemplateView):
template_name = "template.html"
class NarrowedTemplateView(TemplateView[TemplateResponse]):
template_name = "template.html"
def bare_is_permissive(view: BareTemplateView) -> None:
assert_type(BareTemplateView.as_view()(request), HttpResponse)
assert_type(view.get(request), HttpResponse)
assert_type(view.render_to_response({}), HttpResponse)
def parametrising_narrows_the_response(view: NarrowedTemplateView) -> None:
response = NarrowedTemplateView.as_view()(request)
assert_type(response, TemplateResponse)
assert_type(response.rendered_content, str)
assert_type(view.get(request), TemplateResponse)
assert_type(view.render_to_response({}), TemplateResponse)
def dispatch_is_never_narrowed(view: NarrowedTemplateView) -> None:
assert_type(view.dispatch(request), HttpResponseBase)
assert_type(view.http_method_not_allowed(request), HttpResponse)
assert_type(view.options(request), HttpResponseBase)
class LoginRequired(LoginRequiredMixin, TemplateView):
template_name = "template.html"
class PermissionRequired(PermissionRequiredMixin, NarrowedTemplateView):
template_name = "template.html"
permission_required = "app.some_permission"
class UserPassesTest(UserPassesTestMixin, TemplateView):
template_name = "template.html"
@override
def test_func(self) -> bool:
return True
class RedirectingGet(TemplateView):
template_name = "template.html"
@override
def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse:
if request.user.is_anonymous:
return redirect("/login/")
return super().get(request, *args, **kwargs)
class UnionGet(TemplateView):
template_name = "template.html"
@override
def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse | JsonResponse:
return JsonResponse({})
class WideningDispatch(TemplateView):
template_name = "template.html"
@override
def dispatch(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase:
return super().dispatch(request, *args, **kwargs)
typeddjango-django-stubs-fa03b48/tests/assert_type/views/test_decorators.py 0000664 0000000 0000000 00000001461 15260643574 0027466 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import assert_type
from django.http import HttpRequest, HttpResponse
from django.views.decorators.csp import csp_override, csp_report_only_override
@csp_override(
{
"default-src": ["'self'"],
"script-src": ["'self'", "'unsafe-inline'"],
"report-uri": "/path/to/reports-endpoint/",
}
)
def my_view(request: HttpRequest) -> HttpResponse:
raise NotImplementedError
@csp_report_only_override(
{
"default-src": ["'self'"],
"script-src": ["'self'", "'unsafe-inline'"],
"report-uri": "/path/to/reports-endpoint/",
}
)
def my_view2(request: HttpRequest) -> HttpResponse:
raise NotImplementedError
assert_type(my_view(HttpRequest()), HttpResponse)
assert_type(my_view2(HttpRequest()), HttpResponse)
typeddjango-django-stubs-fa03b48/tests/assert_type/views/test_function_based_views.py 0000664 0000000 0000000 00000011271 15260643574 0031521 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from collections.abc import AsyncIterator, Iterator
from typing import TYPE_CHECKING, assert_type
from django.http.response import HttpResponse, StreamingHttpResponse
from django.utils.translation import gettext_lazy as _
if TYPE_CHECKING:
from django.http.request import HttpRequest
# HttpResponse with various content types
def empty_response(request: HttpRequest) -> HttpResponse:
return HttpResponse()
def str_response(request: HttpRequest) -> HttpResponse:
return HttpResponse("It works!")
def bytes_response(request: HttpRequest) -> HttpResponse:
return HttpResponse(b"It works!")
def object_response(request: HttpRequest) -> HttpResponse:
return HttpResponse(_("It works!"))
# HttpResponse.content is always bytes
response = HttpResponse()
assert_type(response.content, bytes)
response.content = "It works!"
assert_type(response.content, bytes)
response.content = b"It works!"
assert_type(response.content, bytes)
response.content = _("It works!")
assert_type(response.content, bytes)
assert_type(response.text, str)
# StreamingHttpResponse with various content types
def empty_streaming(request: HttpRequest) -> StreamingHttpResponse:
return StreamingHttpResponse()
def str_streaming(request: HttpRequest) -> StreamingHttpResponse:
return StreamingHttpResponse(["It works!"])
def bytes_streaming(request: HttpRequest) -> StreamingHttpResponse:
return StreamingHttpResponse([b"It works!"])
def object_streaming(request: HttpRequest) -> StreamingHttpResponse:
return StreamingHttpResponse([_("It works!")])
def mixed_streaming(request: HttpRequest) -> StreamingHttpResponse:
return StreamingHttpResponse([_("Yes"), "/", _("No")])
# StreamingHttpResponse.streaming_content after various assignments
streaming_response = StreamingHttpResponse()
assert_type(streaming_response.streaming_content, Iterator[bytes] | AsyncIterator[bytes])
streaming_response.streaming_content = ["It works!"]
assert_type(streaming_response.streaming_content, Iterator[bytes] | AsyncIterator[bytes])
streaming_response.streaming_content = [b"It works!"]
assert_type(streaming_response.streaming_content, Iterator[bytes] | AsyncIterator[bytes])
streaming_response.streaming_content = [_("It works!")]
assert_type(streaming_response.streaming_content, Iterator[bytes] | AsyncIterator[bytes])
streaming_response.streaming_content = [_("Yes"), "/", _("No")]
assert_type(streaming_response.streaming_content, Iterator[bytes] | AsyncIterator[bytes])
# Async streaming constructors
def async_str_response(request: HttpRequest) -> StreamingHttpResponse:
async def str_iterator() -> AsyncIterator[str]:
yield "It works!"
return StreamingHttpResponse(str_iterator())
def async_bytes_response(request: HttpRequest) -> StreamingHttpResponse:
async def bytes_iterator() -> AsyncIterator[bytes]:
yield b"It works!"
return StreamingHttpResponse(bytes_iterator())
def async_object_response(request: HttpRequest) -> StreamingHttpResponse:
async def object_iterator() -> AsyncIterator[object]:
yield _("It works!")
return StreamingHttpResponse(object_iterator())
def async_mixed_response(request: HttpRequest) -> StreamingHttpResponse:
async def mixed_iterator() -> AsyncIterator[object]:
yield _("Yes")
yield "/"
yield _("No")
return StreamingHttpResponse(mixed_iterator())
# Async streaming_content assignment
def async_streaming_content_str() -> None:
response = StreamingHttpResponse()
async def str_iterator() -> AsyncIterator[str]:
yield "It works!"
response.streaming_content = str_iterator()
assert_type(response.streaming_content, Iterator[bytes] | AsyncIterator[bytes])
def async_streaming_content_bytes() -> None:
response = StreamingHttpResponse()
async def bytes_iterator() -> AsyncIterator[bytes]:
yield b"It works!"
response.streaming_content = bytes_iterator()
assert_type(response.streaming_content, Iterator[bytes] | AsyncIterator[bytes]) # type: ignore[assert-type] # mypy narrows to AsyncIterator[bytes]
def async_streaming_content_object() -> None:
response = StreamingHttpResponse()
async def object_iterator() -> AsyncIterator[object]:
yield _("It works!")
response.streaming_content = object_iterator()
assert_type(response.streaming_content, Iterator[bytes] | AsyncIterator[bytes])
def async_streaming_content_mixed() -> None:
response = StreamingHttpResponse()
async def mixed_iterator() -> AsyncIterator[object]:
yield _("Yes")
yield "/"
yield _("No")
response.streaming_content = mixed_iterator()
assert_type(response.streaming_content, Iterator[bytes] | AsyncIterator[bytes])
typeddjango-django-stubs-fa03b48/tests/assert_type/views/test_generic.py 0000664 0000000 0000000 00000004623 15260643574 0026740 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from typing import assert_type
from django import forms
from django.db import models
from django.db.models import F
from django.db.models.functions import Upper
from django.views.generic.detail import SingleObjectMixin
from django.views.generic.edit import CreateView, DeleteView, UpdateView
from django.views.generic.list import ListView
class MyModel(models.Model): ...
class MyDetailView(SingleObjectMixin[MyModel]): ...
detail_view = MyDetailView()
assert_type(detail_view.model, type[MyModel])
assert_type(detail_view.queryset, models.QuerySet[MyModel, MyModel] | None)
assert_type(detail_view.get_context_object_name(MyModel()), str)
assert_type(detail_view.get_context_object_name(1), str | None)
class MyListView(ListView[MyModel]): ...
list_view = MyListView()
assert_type(list_view.model, type[MyModel] | None)
assert_type(list_view.queryset, models.QuerySet[MyModel, MyModel] | None)
assert_type(list_view.get_context_object_name(models.QuerySet[MyModel]()), str)
assert_type(list_view.get_context_object_name(MyModel()), str | None)
assert_type(list_view.get_context_object_name(1), str | None)
class ConfirmForm(forms.Form): ...
class MyDeleteView(DeleteView[MyModel, ConfirmForm]): ...
delete_view = MyDeleteView()
assert_type(delete_view.get_form_class(), type[ConfirmForm])
assert_type(delete_view.get_form(), ConfirmForm)
# When no form type parameter is given, the form types default to what Django provides at runtime.
class SimpleCreateView(CreateView[MyModel]):
model = MyModel
fields = "__all__"
simple_create_view = SimpleCreateView()
assert_type(simple_create_view.get_form_class(), type[forms.ModelForm[MyModel]])
assert_type(simple_create_view.get_form(), forms.ModelForm[MyModel])
class SimpleUpdateView(UpdateView[MyModel]):
model = MyModel
fields = "__all__"
simple_update_view = SimpleUpdateView()
assert_type(simple_update_view.get_form_class(), type[forms.ModelForm[MyModel]])
assert_type(simple_update_view.get_form(), forms.ModelForm[MyModel])
class SimpleDeleteView(DeleteView[MyModel]):
model = MyModel
simple_delete_view = SimpleDeleteView()
assert_type(simple_delete_view.get_form_class(), type[forms.Form])
assert_type(simple_delete_view.get_form(), forms.Form)
class MyOrderedListView(ListView[MyModel]):
ordering = [Upper("id")]
class MyMixedOrderingListView(ListView[MyModel]):
ordering = ["-id", F("id").asc()]
typeddjango-django-stubs-fa03b48/tests/test_error_handling.py 0000664 0000000 0000000 00000023062 15260643574 0024620 0 ustar 00root root 0000000 0000000 from __future__ import annotations
import os
import tempfile
import uuid
from contextlib import contextmanager
from typing import TYPE_CHECKING, Any
from unittest import mock
import pytest
from mypy_django_plugin.config import DjangoPluginConfig
if TYPE_CHECKING:
from collections.abc import Generator
TEMPLATE = """
(config)
...
[mypy.plugins.django-stubs]
django_settings_module = str (default: `os.getenv("DJANGO_SETTINGS_MODULE")`)
strict_settings = bool (default: true)
strict_model_abstract_attrs = bool (default: true)
...
(django-stubs) mypy: error: {}
"""
TEMPLATE_TOML = """
(config)
...
[tool.django-stubs]
django_settings_module = str (default: `os.getenv("DJANGO_SETTINGS_MODULE")`)
strict_settings = bool (default: true)
strict_model_abstract_attrs = bool (default: true)
...
(django-stubs) mypy: error: {}
"""
@contextmanager
def write_to_file(file_contents: str, suffix: str | None = None) -> Generator[str, None, None]:
with tempfile.NamedTemporaryFile(mode="w+", suffix=suffix) as config_file:
config_file.write(file_contents)
config_file.seek(0)
yield config_file.name
@pytest.mark.parametrize(
("config_file_contents", "message_part"),
[
pytest.param(
["[not-really-django-stubs]"],
"no section [mypy.plugins.django-stubs] found",
id="missing-section",
),
pytest.param(
["[mypy.plugins.django-stubs]", "\tnot_django_not_settings_module = badbadmodule"],
(
"missing required 'django_settings_module' config.\n"
"Either specify this config or set your `DJANGO_SETTINGS_MODULE` env var"
),
id="missing-settings-module",
),
pytest.param(
["[mypy.plugins.django-stubs]"],
(
"missing required 'django_settings_module' config.\n"
"Either specify this config or set your `DJANGO_SETTINGS_MODULE` env var"
),
id="no-settings-given",
),
pytest.param(
["[mypy.plugins.django-stubs]", "django_settings_module = some.module", "strict_settings = bad"],
"invalid 'strict_settings': the setting must be a boolean",
id="invalid-strict_settings",
),
pytest.param(
[
"[mypy.plugins.django-stubs]",
"django_settings_module = some.module",
"strict_model_abstract_attrs = bad",
],
"invalid 'strict_model_abstract_attrs': the setting must be a boolean",
id="invalid-strict_model_abstract_attrs",
),
],
)
def test_misconfiguration_handling(capsys: Any, config_file_contents: list[str], message_part: str) -> None:
"""Invalid configuration raises `SystemExit` with a precise error message."""
contents = "\n".join(config_file_contents).expandtabs(4)
with write_to_file(contents) as filename:
with pytest.raises(SystemExit, match="2"):
DjangoPluginConfig(filename)
error_message = "usage: " + TEMPLATE.format(message_part)
assert error_message == capsys.readouterr().err
@pytest.mark.parametrize(
"filename",
[
pytest.param(uuid.uuid4().hex, id="not matching an existing file"),
pytest.param("", id="as empty string"),
pytest.param(None, id="as none"),
],
)
def test_handles_filename(capsys: Any, filename: str) -> None:
with pytest.raises(SystemExit, match="2"):
DjangoPluginConfig(filename)
error_message = "usage: " + TEMPLATE.format("mypy config file is not specified or found")
assert error_message == capsys.readouterr().err
@pytest.mark.parametrize(
("config_file_contents", "message_part"),
[
pytest.param(
"""
[tool.django-stubs]
django_settings_module = 123
""",
"invalid 'django_settings_module': the setting must be a string",
id="django_settings_module not string",
),
pytest.param(
"""
[tool.not-really-django-stubs]
django_settings_module = "my.module"
""",
"no section [tool.django-stubs] found",
id="missing django-stubs section",
),
pytest.param(
"""
[tool.django-stubs]
not_django_not_settings_module = "badbadmodule"
""",
(
"missing required 'django_settings_module' config.\n"
"Either specify this config or set your `DJANGO_SETTINGS_MODULE` env var"
),
id="missing django_settings_module",
),
pytest.param(
"tool.django-stubs]",
"could not load configuration file",
id="invalid toml",
),
pytest.param(
"""
[tool.django-stubs]
django_settings_module = "some.module"
strict_settings = "a"
""",
"invalid 'strict_settings': the setting must be a boolean",
id="invalid strict_settings type",
),
pytest.param(
"""
[tool.django-stubs]
django_settings_module = "some.module"
strict_model_abstract_attrs = "a"
""",
"invalid 'strict_model_abstract_attrs': the setting must be a boolean",
id="invalid strict_model_abstract_attrs type",
),
],
)
def test_toml_misconfiguration_handling(capsys: Any, config_file_contents: str, message_part: str) -> None:
with write_to_file(config_file_contents, suffix=".toml") as filename:
with pytest.raises(SystemExit, match="2"):
DjangoPluginConfig(filename)
error_message = "usage: " + TEMPLATE_TOML.format(message_part)
assert error_message == capsys.readouterr().err
@pytest.mark.parametrize("boolean_value", ["true", "false"])
def test_correct_toml_configuration(boolean_value: str) -> None:
config_file_contents = f"""
[tool.django-stubs]
some_other_setting = "setting"
django_settings_module = "my.module"
strict_settings = {boolean_value}
"""
with write_to_file(config_file_contents, suffix=".toml") as filename:
config = DjangoPluginConfig(filename)
assert config.django_settings_module == "my.module"
assert config.strict_settings is (boolean_value == "true")
@pytest.mark.parametrize("boolean_value", ["true", "True", "false", "False"])
def test_correct_configuration(boolean_value: str) -> None:
"""Django settings module gets extracted given valid configuration."""
config_file_contents = "\n".join(
[
"[mypy.plugins.django-stubs]",
"some_other_setting = setting",
"django_settings_module = my.module",
f"strict_settings = {boolean_value}",
]
)
with write_to_file(config_file_contents) as filename:
config = DjangoPluginConfig(filename)
assert config.django_settings_module == "my.module"
assert config.strict_settings is (boolean_value.lower() == "true")
@pytest.mark.parametrize("boolean_value", ["true", "false"])
def test_correct_toml_configuration_with_django_setting_from_env(boolean_value: str) -> None:
config_file_contents = f"""
[tool.django-stubs]
some_other_setting = "setting"
strict_settings = {boolean_value}
"""
django_settings_env_value = "my.module"
with write_to_file(config_file_contents, suffix=".toml") as filename:
with mock.patch.dict(os.environ, {"DJANGO_SETTINGS_MODULE": django_settings_env_value}):
config = DjangoPluginConfig(filename)
assert config.django_settings_module == django_settings_env_value
assert config.strict_settings is (boolean_value == "true")
@pytest.mark.parametrize("boolean_value", ["true", "True", "false", "False"])
def test_correct_configuration_with_django_setting_from_env(boolean_value: str) -> None:
"""Django settings module gets extracted given valid configuration."""
config_file_contents = "\n".join(
[
"[mypy.plugins.django-stubs]",
"some_other_setting = setting",
f"strict_settings = {boolean_value}",
]
)
django_settings_env_value = "my.module"
with write_to_file(config_file_contents) as filename:
with mock.patch.dict(os.environ, {"DJANGO_SETTINGS_MODULE": django_settings_env_value}):
config = DjangoPluginConfig(filename)
assert config.django_settings_module == django_settings_env_value
assert config.strict_settings is (boolean_value.lower() == "true")
def test_toml_missing_section_with_env_var() -> None:
"""Missing [tool.django-stubs] section works when DJANGO_SETTINGS_MODULE is set."""
config_file_contents = """
[tool.mypy]
plugins = ["mypy_django_plugin.main"]
"""
with write_to_file(config_file_contents, suffix=".toml") as filename:
with mock.patch.dict(os.environ, {"DJANGO_SETTINGS_MODULE": "my.module"}):
config = DjangoPluginConfig(filename)
assert config.django_settings_module == "my.module"
assert config.strict_settings is True
def test_ini_missing_section_with_env_var() -> None:
"""Missing [mypy.plugins.django-stubs] section works when DJANGO_SETTINGS_MODULE is set."""
config_file_contents = "\n".join(
[
"[mypy]",
"plugins = mypy_django_plugin.main",
]
)
with write_to_file(config_file_contents) as filename:
with mock.patch.dict(os.environ, {"DJANGO_SETTINGS_MODULE": "my.module"}):
config = DjangoPluginConfig(filename)
assert config.django_settings_module == "my.module"
assert config.strict_settings is True
typeddjango-django-stubs-fa03b48/tests/test_generic_consistency.py 0000664 0000000 0000000 00000007743 15260643574 0025670 0 ustar 00root root 0000000 0000000 from __future__ import annotations
import ast
import glob
import importlib
import os
from pathlib import Path
from typing import Any, final
from unittest import mock
import django
from typing_extensions import override
# The root directory of the django-stubs package
STUBS_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "django-stubs"))
@final
class GenericInheritanceVisitor(ast.NodeVisitor):
"""AST visitor collecting type variables and classes with parameterized bases in the stubs."""
def __init__(self) -> None:
self.module = ""
# Type variables are collected from `X = TypeVar(...)` assignments. `AnyStr` is declared
# in `typing` itself, not in the stubs, so it must be seeded manually.
self.type_vars: set[str] = {"AnyStr"}
# (module, class_name) -> {names parameterizing its bases}.
# A class is generic if one of those names is a type variable
self.candidate_classes: dict[tuple[str, str], set[str]] = {}
@override
def visit_Assign(self, node: ast.Assign) -> None:
func = node.value.func if isinstance(node.value, ast.Call) else None
if isinstance(func, ast.Name) and func.id in {"TypeVar", "ParamSpec", "TypeVarTuple"}:
self.type_vars.update(target.id for target in node.targets if isinstance(target, ast.Name))
@override
def visit_ClassDef(self, node: ast.ClassDef) -> None:
for base in node.bases:
if isinstance(base, ast.Subscript):
self.candidate_classes.setdefault((self.module, node.name), set()).update(
name.id for name in ast.walk(base.slice) if isinstance(name, ast.Name)
)
self.generic_visit(node)
def test_generic_classes_are_subscriptable_at_runtime() -> None:
"""
Ensure `ext/django_stubs_ext/patch.py` stays up-to-date with the stubs.
Every class that is generic in the stubs must be subscriptable at runtime once `monkeypatch()` is called.
"""
with mock.patch.dict(os.environ, {"DJANGO_SETTINGS_MODULE": "scripts.django_tests_settings"}):
django.setup()
_monkeypatch()
visitor = GenericInheritanceVisitor()
for file_path in glob.glob("**/*.pyi", root_dir=STUBS_ROOT, recursive=True):
visitor.module = "django." + file_path.replace(".pyi", "").replace("/", ".").removesuffix(".__init__")
visitor.visit(ast.parse(Path(STUBS_ROOT, file_path).read_text()))
errors = []
for (module_name, cls_name), base_args in visitor.candidate_classes.items():
if not base_args & visitor.type_vars:
# Bases are only parameterized by concrete types (e.g. `Iterable[bytes]`)
continue
try:
django_module = importlib.import_module(module_name)
except ModuleNotFoundError:
continue
if (cls := getattr(django_module, cls_name, None)) is None:
# `type_check_only`, or doesn't exist in the Django version being tested
continue
try:
cls[Any]
except TypeError:
errors.append(f"{module_name}.{cls_name} is not patched in `ext/django_stubs_ext/patch.py`")
assert not errors, "\n".join(errors)
def _monkeypatch() -> None:
"""
Symbols in `django.contrib.auth.forms` are very hard to patch automatically
because we end up importing the User model and it crashes if `django.setup()` was not called beforehand.
It can also very easily introduce circular imports so we require the user to monkeypatch it manually.
See README.md for more details
"""
import django_stubs_ext
if django.VERSION >= (5, 1):
from django.contrib.auth.forms import SetPasswordMixin, SetUnusablePasswordMixin
extra_classes: list[type] = [SetPasswordMixin, SetUnusablePasswordMixin]
else:
from django.contrib.auth.forms import AdminPasswordChangeForm, SetPasswordForm
extra_classes = [SetPasswordForm, AdminPasswordChangeForm]
django_stubs_ext.monkeypatch(extra_classes=extra_classes)
typeddjango-django-stubs-fa03b48/tests/typecheck/ 0000775 0000000 0000000 00000000000 15260643574 0022166 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/typecheck/conf/ 0000775 0000000 0000000 00000000000 15260643574 0023113 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/typecheck/conf/test_settings.yml 0000664 0000000 0000000 00000004621 15260643574 0026540 0 ustar 00root root 0000000 0000000 - case: test_setting_circular_import
main: |
from myapp import lib
mypy_config: |
[mypy.plugins.django-stubs]
django_settings_module = myapp.settings
files:
- path: myapp/__init__.py
- path: myapp/settings.py
content: |
from myapp.lib import function_returning_int, const_with_circular_import, const_unresolvable_circular
IMMEDIATE_VALUE = 123
CIRCULAR_WITH_HINT: int = function_returning_int()
CIRCULAR_WITHOUT_HINT_FUNCTION = function_returning_int()
CIRCULAR_WITHOUT_HINT_CONST = const_with_circular_import
UNRESOLVABLE_CIRCULAR = const_unresolvable_circular
- path: myapp/lib.py
content: |
from typing import TYPE_CHECKING
from typing_extensions import reveal_type
import django.conf
settings = django.conf.settings
def test() -> None:
reveal_type(settings.IMMEDIATE_VALUE) # N: Revealed type is "int"
reveal_type(settings.CIRCULAR_WITH_HINT) # N: Revealed type is "int"
reveal_type(settings.CIRCULAR_WITHOUT_HINT_FUNCTION) # N: Revealed type is "int"
reveal_type(settings.CIRCULAR_WITHOUT_HINT_CONST) # N: Revealed type is "int"
reveal_type(settings.UNRESOLVABLE_CIRCULAR) # N: Revealed type is "Any"
def function_returning_int() -> int:
return 42
if TYPE_CHECKING:
const_with_circular_import = settings.IMMEDIATE_VALUE
const_unresolvable_circular = settings.UNRESOLVABLE_CIRCULAR # E: Cannot determine type of "UNRESOLVABLE_CIRCULAR" [has-type]
else:
const_with_circular_import = 0
const_unresolvable_circular = ...
- case: test_setting_login_urls
main: |
from typing_extensions import reveal_type
from django.conf import settings
reveal_type(settings.LOGIN_URL) # N: Revealed type is "str | django.utils.functional._StrPromise"
reveal_type(settings.LOGIN_REDIRECT_URL) # N: Revealed type is "str | django.utils.functional._StrPromise"
reveal_type(settings.LOGOUT_REDIRECT_URL) # N: Revealed type is "str | django.utils.functional._StrPromise | None"
typeddjango-django-stubs-fa03b48/tests/typecheck/contrib/ 0000775 0000000 0000000 00000000000 15260643574 0023626 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/typecheck/contrib/auth/ 0000775 0000000 0000000 00000000000 15260643574 0024567 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/typecheck/contrib/auth/test_auth.yml 0000664 0000000 0000000 00000015055 15260643574 0027320 0 ustar 00root root 0000000 0000000 - case: test_objects_using_auth_user_model_picks_up_configured_type
main: |
from typing_extensions import reveal_type
from django.contrib.auth import authenticate, aauthenticate, get_user, get_user_model, login
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.decorators import user_passes_test
from django.contrib.auth.models import AnonymousUser
from django.http import HttpRequest, HttpResponse
from myapp.models import MyUser
reveal_type(authenticate()) # N: Revealed type is "myapp.models.MyUser | None"
async def f() -> None:
reveal_type(await aauthenticate()) # N: Revealed type is "myapp.models.MyUser | None"
reveal_type(get_user_model()) # N: Revealed type is "type[myapp.models.MyUser]"
reveal_type(login) # N: Revealed type is "def (request: django.http.request.HttpRequest, user: myapp.models.MyUser | None, backend: type[django.contrib.auth.backends.BaseBackend] | str | None =)"
reveal_type(get_user) # N: Revealed type is "def (request: django.http.request.HttpRequest | django.test.client.Client) -> myapp.models.MyUser | django.contrib.auth.models.AnonymousUser"
reveal_type(ModelBackend().authenticate(None)) # N: Revealed type is "myapp.models.MyUser | None"
def check_user(user: MyUser | AnonymousUser) -> bool: return True
@user_passes_test(check_user)
def view(request: HttpRequest) -> HttpResponse:
raise NotImplementedError
custom_settings: |
INSTALLED_APPS = ("django.contrib.contenttypes", "django.contrib.auth", "myapp")
AUTH_USER_MODEL = "myapp.MyUser"
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyUser(models.Model):
...
- case: test_objects_using_auth_user_model_uses_builtin_auth_user_per_default
main: |
from typing_extensions import reveal_type
from django.contrib.auth import authenticate, aauthenticate, get_user, get_user_model, login
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.decorators import user_passes_test
from django.contrib.auth.models import AnonymousUser, User
from django.http import HttpRequest, HttpResponse
reveal_type(authenticate()) # N: Revealed type is "django.contrib.auth.models.User | None"
async def f() -> None:
reveal_type(await aauthenticate()) # N: Revealed type is "django.contrib.auth.models.User | None"
reveal_type(get_user_model()) # N: Revealed type is "type[django.contrib.auth.models.User]"
reveal_type(login) # N: Revealed type is "def (request: django.http.request.HttpRequest, user: django.contrib.auth.models.User | None, backend: type[django.contrib.auth.backends.BaseBackend] | str | None =)"
reveal_type(get_user) # N: Revealed type is "def (request: django.http.request.HttpRequest | django.test.client.Client) -> django.contrib.auth.models.User | django.contrib.auth.models.AnonymousUser"
reveal_type(ModelBackend().authenticate(None)) # N: Revealed type is "django.contrib.auth.models.User | None"
def check_user(user: User | AnonymousUser) -> bool: return True
@user_passes_test(check_user)
def view(request: HttpRequest) -> HttpResponse:
raise NotImplementedError
custom_settings: |
INSTALLED_APPS = ("django.contrib.contenttypes", "django.contrib.auth", "myapp")
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyUser(models.Model):
...
- case: test_objects_for_auth_user_model_returns_stub_types_when_contrib_auth_is_not_installed
main: |
from typing_extensions import reveal_type
from django.contrib.auth import authenticate, aauthenticate, get_user, get_user_model, login
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.base_user import AbstractBaseUser
from django.contrib.auth.decorators import user_passes_test
from django.contrib.auth.models import AnonymousUser
from django.http import HttpRequest, HttpResponse
reveal_type(authenticate()) # N: Revealed type is "django.contrib.auth.base_user.AbstractBaseUser | None"
async def f() -> None:
reveal_type(await aauthenticate()) # N: Revealed type is "django.contrib.auth.base_user.AbstractBaseUser | None"
reveal_type(get_user_model()) # N: Revealed type is "type[django.contrib.auth.base_user.AbstractBaseUser]"
reveal_type(login) # N: Revealed type is "def (request: django.http.request.HttpRequest, user: django.contrib.auth.base_user.AbstractBaseUser | None, backend: type[django.contrib.auth.backends.BaseBackend] | str | None =)"
reveal_type(get_user) # N: Revealed type is "def (request: django.http.request.HttpRequest | django.test.client.Client) -> django.contrib.auth.base_user.AbstractBaseUser | django.contrib.auth.models.AnonymousUser"
reveal_type(ModelBackend().authenticate(None)) # N: Revealed type is "django.contrib.auth.base_user.AbstractBaseUser | None"
def check_user(user: AbstractBaseUser | AnonymousUser) -> bool: return True
@user_passes_test(check_user)
def view(request: HttpRequest) -> HttpResponse:
raise NotImplementedError
custom_settings: |
INSTALLED_APPS = ("django.contrib.contenttypes", "myapp")
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyUser(models.Model):
...
- case: test_abstract_user_meta_inheritance
main: |
from django.contrib.auth.models import AbstractUser
class CustomUser(AbstractUser):
class Meta(AbstractUser.Meta):
pass
custom_settings: |
INSTALLED_APPS = ("django.contrib.contenttypes", "django.contrib.auth")
- case: test_auth_form_meta_inheritance
main: |
from django.contrib.auth.forms import BaseUserCreationForm, UserChangeForm
class CustomUserCreationForm(BaseUserCreationForm):
class Meta(BaseUserCreationForm.Meta):
pass
class CustomUserChangeForm(UserChangeForm):
class Meta(UserChangeForm.Meta):
pass
custom_settings: |
INSTALLED_APPS = ("django.contrib.contenttypes", "django.contrib.auth")
typeddjango-django-stubs-fa03b48/tests/typecheck/contrib/auth/test_decorators.yml 0000664 0000000 0000000 00000015341 15260643574 0030522 0 ustar 00root root 0000000 0000000 - case: login_required
main: |
from typing import Any
from typing_extensions import reveal_type
from django.core.handlers.asgi import ASGIRequest
from django.core.handlers.wsgi import WSGIRequest
from django.contrib.auth.decorators import login_required
from django.http import HttpRequest, HttpResponse
# Bare:
@login_required
def view_func1(request: HttpRequest) -> HttpResponse:
raise NotImplementedError
reveal_type(view_func1) # N: Revealed type is "def (request: django.http.request.HttpRequest) -> django.http.response.HttpResponse"
@login_required
async def view_func2(request: HttpRequest) -> HttpResponse:
raise NotImplementedError
reveal_type(view_func2) # N: Revealed type is "def (request: django.http.request.HttpRequest) -> typing.Coroutine[Any, Any, django.http.response.HttpResponse]"
# Fancy:
@login_required(redirect_field_name='a', login_url='b')
def view_func3(request: WSGIRequest, arg: str) -> HttpResponse:
raise NotImplementedError
reveal_type(view_func3) # N: Revealed type is "def (request: django.core.handlers.wsgi.WSGIRequest, arg: str) -> django.http.response.HttpResponse"
@login_required(redirect_field_name='a', login_url='b')
async def view_func4(request: ASGIRequest, arg: str) -> HttpResponse:
raise NotImplementedError
reveal_type(view_func4) # N: Revealed type is "def (request: django.core.handlers.asgi.ASGIRequest, arg: str) -> typing.Coroutine[Any, Any, django.http.response.HttpResponse]"
# This is non-conventional usage, but covered in Django tests, so we allow it.
def view_func5(request: HttpRequest) -> HttpResponse:
raise NotImplementedError
wrapped_view = login_required(view_func5, redirect_field_name='a', login_url='b')
reveal_type(wrapped_view) # N: Revealed type is "def (request: django.http.request.HttpRequest) -> django.http.response.HttpResponse"
# Wrong:
@login_required() # E: Value of type variable "_VIEW" of function cannot be "Callable[[Any], str]" [type-var]
def view_func6(request: Any) -> str:
raise NotImplementedError
custom_settings: |
INSTALLED_APPS = ("django.contrib.contenttypes", "django.contrib.auth", "myapp")
AUTH_USER_MODEL = "myapp.MyUser"
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyUser(models.Model):
...
- case: login_required_default_settings
main: |
from typing import Any
from typing_extensions import reveal_type
from django.core.handlers.asgi import ASGIRequest
from django.core.handlers.wsgi import WSGIRequest
from django.contrib.auth.decorators import login_required
from django.http import HttpRequest, HttpResponse
@login_required
def view_func1(request: HttpRequest) -> HttpResponse:
raise NotImplementedError
reveal_type(view_func1) # N: Revealed type is "def (request: django.http.request.HttpRequest) -> django.http.response.HttpResponse"
@login_required
async def view_func2(request: HttpRequest) -> HttpResponse:
raise NotImplementedError
reveal_type(view_func2) # N: Revealed type is "def (request: django.http.request.HttpRequest) -> typing.Coroutine[Any, Any, django.http.response.HttpResponse]"
@login_required() # E: Value of type variable "_VIEW" of function cannot be "Callable[[Any], str]" [type-var]
def view_func3(request: Any) -> str:
raise NotImplementedError
- case: user_passes_test
main: |
from typing_extensions import reveal_type
from django.contrib.auth.decorators import user_passes_test
from django.http import HttpRequest, HttpResponse
@user_passes_test(lambda u: u.is_authenticated and u.is_active)
def view_func1(request: HttpRequest) -> HttpResponse:
raise NotImplementedError
reveal_type(view_func1) # N: Revealed type is "def (request: django.http.request.HttpRequest) -> django.http.response.HttpResponse"
@user_passes_test(lambda u: u.get_username().startswith('super'))
async def view_func2(request: HttpRequest) -> HttpResponse:
raise NotImplementedError
reveal_type(view_func2) # N: Revealed type is "def (request: django.http.request.HttpRequest) -> typing.Coroutine[Any, Any, django.http.response.HttpResponse]"
# Wrong:
@user_passes_test # E: Argument 1 to "user_passes_test" has incompatible type "Callable[[HttpRequest], HttpResponse]"; expected "Callable[[User | AnonymousUser], bool]" [arg-type]
def view_func3(request: HttpRequest) -> HttpResponse:
raise NotImplementedError
@user_passes_test(lambda u: u.get_username().startswith('super')) # E: Value of type variable "_VIEW" of function cannot be "Callable[[str], str]" [type-var]
def view_func4(request: str) -> str:
raise NotImplementedError
custom_settings: |
INSTALLED_APPS = ("django.contrib.contenttypes", "django.contrib.auth")
- case: permission_required
main: |
from typing import Any
from typing_extensions import reveal_type
from django.contrib.auth.decorators import permission_required
from django.http import HttpRequest, HttpResponse
@permission_required('polls.can_vote')
def view_func1(request: HttpRequest) -> HttpResponse:
raise NotImplementedError
reveal_type(view_func1) # N: Revealed type is "def (request: django.http.request.HttpRequest) -> django.http.response.HttpResponse"
@permission_required(['polls.can_vote', 'polls.can_close'], login_url='/abc')
async def view_func2(request: HttpRequest) -> HttpResponse:
raise NotImplementedError
reveal_type(view_func2) # N: Revealed type is "def (request: django.http.request.HttpRequest) -> typing.Coroutine[Any, Any, django.http.response.HttpResponse]"
# Wrong:
@permission_required('polls.can_vote') # E: Value of type variable "_VIEW" of function cannot be "Callable[[Any], str]" [type-var]
def view_func3(request: Any) -> str:
raise NotImplementedError
@permission_required # E: Argument 1 to "permission_required" has incompatible type "Callable[[HttpRequest], HttpResponse]"; expected "Iterable[str] | str" [arg-type]
def view_func4(request: HttpRequest) -> HttpResponse:
raise NotImplementedError
custom_settings: |
INSTALLED_APPS = ("django.contrib.contenttypes", "django.contrib.auth")
typeddjango-django-stubs-fa03b48/tests/typecheck/contrib/auth/test_misc.yml 0000664 0000000 0000000 00000002642 15260643574 0027310 0 ustar 00root root 0000000 0000000 - case: test_request_session
main: |
from django.contrib.auth import get_user
from django.contrib.sessions.middleware import SessionMiddleware
from django.http import HttpRequest, HttpResponse
def get_response(request: HttpRequest, /) -> HttpResponse:
return HttpResponse()
request = HttpRequest()
SessionMiddleware(get_response).process_request(request)
get_user(request)
- case: test_client_session
main: |
from django.contrib.auth import get_user
from django.test import Client
get_user(Client())
- case: test_user_fields
main: |
from django.contrib.auth.models import AnonymousUser, User
anonymous: AnonymousUser
anonymous_is_staff: bool = anonymous.is_staff
anonymous_is_active: bool = anonymous.is_active
anonymous_is_superuser: bool = anonymous.is_superuser
anonymous_is_authenticated: bool = anonymous.is_authenticated
user: User
user_is_staff: bool = user.is_staff
user_is_active: bool = user.is_active
user_is_superuser: bool = user.is_superuser
user_is_authenticated: bool = user.is_authenticated
union: User | AnonymousUser
union_is_staff: bool = union.is_staff
union_is_active: bool = union.is_active
union_is_superuser: bool = union.is_superuser
union_is_authenticated: bool = union.is_authenticated
typeddjango-django-stubs-fa03b48/tests/typecheck/contrib/contenttypes/ 0000775 0000000 0000000 00000000000 15260643574 0026365 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/typecheck/contrib/contenttypes/test_models.yml 0000664 0000000 0000000 00000001155 15260643574 0031434 0 ustar 00root root 0000000 0000000 - case: test_contenttypes_models
main: |
from typing_extensions import reveal_type
from django.contrib.contenttypes.models import ContentType
c = ContentType.objects.create(app_label='abc', model='abc')
reveal_type(c.id) # N: Revealed type is "int"
reveal_type(c.app_label) # N: Revealed type is "str"
reveal_type(c.model) # N: Revealed type is "str"
ContentType.objects.create(app_label=[]) # E: Incompatible type for "app_label" of "ContentType" (got "list[Any]", expected "str | int | Combinable") [misc]
custom_settings: |
INSTALLED_APPS = ("django.contrib.contenttypes",)
typeddjango-django-stubs-fa03b48/tests/typecheck/contrib/gis/ 0000775 0000000 0000000 00000000000 15260643574 0024410 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/typecheck/contrib/gis/test_fields.yml 0000664 0000000 0000000 00000004174 15260643574 0027446 0 ustar 00root root 0000000 0000000 - case: fields_getter_and_setter
main: |
from typing_extensions import reveal_type
from django.contrib.gis.geos import Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon, GeometryCollection
from myapp.models import MyModel
model = MyModel()
reveal_type(model.point) # N: Revealed type is "django.contrib.gis.geos.point.Point"
model.point = Point()
reveal_type(model.line_string) # N: Revealed type is "django.contrib.gis.geos.linestring.LineString"
model.line_string = LineString()
reveal_type(model.polygon) # N: Revealed type is "django.contrib.gis.geos.polygon.Polygon"
model.polygon = Polygon()
reveal_type(model.multi_point) # N: Revealed type is "django.contrib.gis.geos.collections.MultiPoint"
model.multi_point = MultiPoint()
reveal_type(model.multi_line_string) # N: Revealed type is "django.contrib.gis.geos.collections.MultiLineString"
model.multi_line_string = MultiLineString()
reveal_type(model.multi_polygon) # N: Revealed type is "django.contrib.gis.geos.collections.MultiPolygon"
model.multi_polygon = MultiPolygon()
reveal_type(model.geometry_collection) # N: Revealed type is "django.contrib.gis.geos.collections.GeometryCollection"
model.geometry_collection = GeometryCollection()
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db.models import Model
from django.contrib.gis.db.models.fields import PointField, LineStringField, PolygonField, MultiPointField, MultiLineStringField, MultiPolygonField, GeometryCollectionField
class MyModel(Model):
point = PointField()
line_string = LineStringField()
polygon = PolygonField()
multi_point = MultiPointField()
multi_line_string = MultiLineStringField()
multi_polygon = MultiPolygonField()
geometry_collection = GeometryCollectionField()
typeddjango-django-stubs-fa03b48/tests/typecheck/contrib/gis/test_functions.yml 0000664 0000000 0000000 00000002006 15260643574 0030200 0 ustar 00root root 0000000 0000000 - case: distance_and_area_annotations_yield_measures
main: |
from typing_extensions import reveal_type
from django.contrib.gis.db.models.functions import Area, Distance
from django.contrib.gis.geos import Point
from myapp.models import MyModel
near = MyModel.objects.annotate(distance=Distance("point", Point(0, 0)))
reveal_type(near.get().distance) # N: Revealed type is "django.contrib.gis.measure.Distance"
sized = MyModel.objects.annotate(area=Area("polygon"))
reveal_type(sized.get().area) # N: Revealed type is "django.contrib.gis.measure.Area"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.contrib.gis.db.models.fields import PointField, PolygonField
from django.db.models import Model
class MyModel(Model):
point = PointField()
polygon = PolygonField()
typeddjango-django-stubs-fa03b48/tests/typecheck/contrib/postgres/ 0000775 0000000 0000000 00000000000 15260643574 0025474 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/typecheck/contrib/postgres/test_fields.yml 0000664 0000000 0000000 00000002507 15260643574 0030530 0 ustar 00root root 0000000 0000000 - case: union_combinable_reduced_to_non_union
main: |
from myapp.models import MyModel
array_val: list[int] = [1]
MyModel(array=array_val) # E: Incompatible type for "array" of "MyModel" (got "list[int]", expected "Sequence[str] | Combinable") [misc]
non_init = MyModel()
non_init.array = array_val # E: Incompatible types in assignment (expression has type "list[int]", variable has type "Sequence[str] | Combinable") [assignment]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from django.contrib.postgres.fields import ArrayField
class MyModel(models.Model):
array = ArrayField(base_field=models.TextField())
- case: postgres_forms_simple_array_field
main: |
from myapp.forms import MyForm
MyForm()
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/forms.py
content: |
from django import forms
from django.contrib.postgres.forms import SimpleArrayField
class MyForm(forms.Form):
lots_of_dates = SimpleArrayField(forms.DateField(), required=False)
typeddjango-django-stubs-fa03b48/tests/typecheck/contrib/sitemaps/ 0000775 0000000 0000000 00000000000 15260643574 0025453 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/typecheck/contrib/sitemaps/test_generic_sitemap.yml 0000664 0000000 0000000 00000006760 15260643574 0032404 0 ustar 00root root 0000000 0000000 - case: test_items_custom_model
main: |
from django.contrib.sitemaps import GenericSitemap, Sitemap
from django.contrib.sitemaps.views import sitemap
from django.db.models import QuerySet
from django.urls import path, reverse
from typing_extensions import override
from myapp.models import Offer
class OfferSitemap(Sitemap[Offer]):
priority = 1
changefreq = "always"
@override
def items(self) -> QuerySet[Offer]:
return Offer.objects.all()
@override
def location(self, item: Offer) -> str:
return reverse(
"myapp:detail-offer",
kwargs={
"provider_name": item.provider,
"offer_name": item.trc, # E: "Offer" has no attribute "trc" [attr-defined]
},
)
class WrongOfferSitemap(Sitemap[Offer]):
@override
def items(self) -> str:
return "Yes"
@override
def location(self, item: str) -> int:
return 1
info_dict = {"queryset": Offer.objects.all()}
broken_info_dict = {"queryset": [1, 2]}
urlpatterns = [
path(
'sitemap.xml', sitemap,
{'sitemaps': {'offers': GenericSitemap[Offer](info_dict, priority=0.6)}},
name='django.contrib.sitemaps.views.sitemap'
),
path(
'broken_sitemap.xml', sitemap,
{'sitemaps': {'offers': GenericSitemap[Offer](broken_info_dict, priority=0.6)}},
name='django.contrib.sitemaps.views.broken_sitemap'
),
]
out: |
main:28: error: Return type "str" of "items" incompatible with return type "Iterable[Offer]" in supertype "django.contrib.sitemaps.Sitemap" [override]
main:32: error: Return type "int" of "location" incompatible with return type "str" in supertype "django.contrib.sitemaps.Sitemap" [override]
main:32: error: Argument 1 of "location" is incompatible with supertype "django.contrib.sitemaps.Sitemap"; supertype defines the argument type as "Offer" [override]
main:32: note: This violates the Liskov substitution principle
main:32: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#incompatible-overrides
main:46: error: Argument 1 to "GenericSitemap" has incompatible type "dict[str, list[int]]"; expected "Mapping[str, datetime | QuerySet[Offer, Offer] | str]" [arg-type]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Offer(models.Model):
provider = models.ForeignKey("self", on_delete=models.CASCADE)
url_name = models.CharField()
- case: test_items_string_sequence
main: |
from django.contrib.sitemaps import Sitemap
from django.urls import reverse
from typing_extensions import override
class StaticViewSitemap(Sitemap[str]):
priority = 1
changefreq = "always"
@override
def items(self) -> list[str]:
return ["home", "about", "contact", "recommendations", "privacy-policy", "blog"]
@override
def location(self, item: str) -> str:
return reverse(item)
typeddjango-django-stubs-fa03b48/tests/typecheck/db/ 0000775 0000000 0000000 00000000000 15260643574 0022553 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/typecheck/db/models/ 0000775 0000000 0000000 00000000000 15260643574 0024036 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/typecheck/db/models/test_fields_choices.yml 0000664 0000000 0000000 00000014712 15260643574 0030570 0 ustar 00root root 0000000 0000000 - case: db_models_charfield_invalid_choices
main: |
from django.db import models
class MyModel(models.Model):
char1 = models.CharField(max_length=200, choices='test')
out: |
main:4: error: Argument "choices" to "CharField" has incompatible type "str"; expected "Iterable[tuple[Any, Any] | tuple[str, Iterable[tuple[Any, Any]]]] | Mapping[Any, Any] | type[Choices] | Callable[[], Iterable[tuple[Any, Any] | tuple[str, Iterable[tuple[Any, Any]]]] | Mapping[Any, Any] | type[Choices]] | None" [arg-type]
main:4: note: Following member(s) of "str" have conflicts:
main:4: note: Expected:
main:4: note: def __iter__(self) -> Iterator[tuple[Any, Any] | tuple[str, Iterable[tuple[Any, Any]]]]
main:4: note: Got:
main:4: note: def __iter__(self) -> Iterator[str]
- case: db_models_integerfield_invalid_choices
main: |
from django.db import models
class MyModel(models.Model):
int1 = models.IntegerField(choices='test')
out: |
main:4: error: Argument "choices" to "IntegerField" has incompatible type "str"; expected "Iterable[tuple[Any, Any] | tuple[str, Iterable[tuple[Any, Any]]]] | Mapping[Any, Any] | type[Choices] | Callable[[], Iterable[tuple[Any, Any] | tuple[str, Iterable[tuple[Any, Any]]]] | Mapping[Any, Any] | type[Choices]] | None" [arg-type]
main:4: note: Following member(s) of "str" have conflicts:
main:4: note: Expected:
main:4: note: def __iter__(self) -> Iterator[tuple[Any, Any] | tuple[str, Iterable[tuple[Any, Any]]]]
main:4: note: Got:
main:4: note: def __iter__(self) -> Iterator[str]
- case: db_models_valid_choices
main: |
from collections.abc import Callable, Mapping, Sequence
from django.db import models
from typing_extensions import TypeVar, assert_type
_T = TypeVar("_T")
def to_named_seq(func: Callable[[], _T]) -> Callable[[], Sequence[tuple[str, _T]]]:
def inner() -> Sequence[tuple[str, _T]]:
return [("title", func())]
return inner
def to_named_mapping(func: Callable[[], _T]) -> Callable[[], Mapping[str, _T]]:
def inner() -> Mapping[str, _T]:
return {"title": func()}
return inner
def str_tuple() -> Sequence[tuple[str, str]]:
return (("foo", "bar"), ("fuzz", "bazz"))
def str_mapping() -> Mapping[str, str]:
return {"foo": "bar", "fuzz": "bazz"}
def int_tuple() -> Sequence[tuple[int, str]]:
return ((1, "bar"), (2, "bazz"))
def int_mapping() -> Mapping[int, str]:
return {3: "bar", 4: "bazz"}
class ExternalIntegerChoices(models.IntegerChoices):
FIRST = 1
def choices_type() -> type[models.Choices]:
return ExternalIntegerChoices
class TestModel(models.Model):
class TextChoices(models.TextChoices):
FIRST = "foo", "bar"
SECOND = "foo2", "bar"
class IntegerChoices(models.IntegerChoices):
FIRST = 1, "bar"
SECOND = 2, "bar"
char1 = models.CharField(max_length=5, choices=TextChoices, default="foo")
char2 = models.CharField(max_length=5, choices=str_tuple, default="foo")
char3 = models.CharField(max_length=5, choices=str_mapping, default="foo")
char4 = models.CharField(max_length=5, choices=str_tuple(), default="foo")
char5 = models.CharField(max_length=5, choices=str_mapping(), default="foo")
char6 = models.CharField(max_length=5, choices=to_named_seq(str_tuple), default="foo")
char7 = models.CharField(max_length=5, choices=to_named_mapping(str_mapping), default="foo")
char8 = models.CharField(max_length=5, choices=to_named_seq(str_tuple)(), default="foo")
char9 = models.CharField(max_length=5, choices=to_named_mapping(str_mapping)(), default="foo")
int1 = models.IntegerField(choices=IntegerChoices, default=1)
int2 = models.IntegerField(choices=int_tuple, default=1)
int3 = models.IntegerField(choices=int_mapping, default=1)
int4 = models.IntegerField(choices=int_tuple(), default=1)
int5 = models.IntegerField(choices=int_mapping(), default=1)
int6 = models.IntegerField(choices=to_named_seq(int_tuple), default=1)
int7 = models.IntegerField(choices=to_named_seq(int_mapping), default=1)
int8 = models.IntegerField(choices=to_named_seq(int_tuple)(), default=1)
int9 = models.IntegerField(choices=to_named_seq(int_mapping)(), default=1)
int10 = models.IntegerField(choices=choices_type)
generated1 = models.GeneratedField(
expression=models.Value("foo"),
output_field=models.CharField(max_length=5),
choices=TextChoices,
db_persist=False,
)
generated2 = models.GeneratedField(
expression=models.Value("foo"),
output_field=models.CharField(max_length=5),
choices=str_tuple,
db_persist=False,
)
generated3 = models.GeneratedField(
expression=models.Value("foo"),
output_field=models.CharField(max_length=5),
choices=str_mapping,
db_persist=False,
)
generated4 = models.GeneratedField(
expression=models.Value("foo"),
output_field=models.CharField(max_length=5),
choices=str_tuple(),
db_persist=False,
)
generated5 = models.GeneratedField(
expression=models.Value("foo"),
output_field=models.CharField(max_length=5),
choices=str_mapping(),
db_persist=False,
)
generated6 = models.GeneratedField(
expression=models.Value("foo"),
output_field=models.CharField(max_length=5),
choices=to_named_seq(str_tuple),
db_persist=False,
)
generated7 = models.GeneratedField(
expression=models.Value("foo"),
output_field=models.CharField(max_length=5),
choices=to_named_mapping(str_mapping),
db_persist=False,
)
generated8 = models.GeneratedField(
expression=models.Value("foo"),
output_field=models.CharField(max_length=5),
choices=to_named_seq(str_tuple)(),
db_persist=False,
)
generated9 = models.GeneratedField(
expression=models.Value("foo"),
output_field=models.CharField(max_length=5),
choices=to_named_mapping(str_mapping)(),
db_persist=False,
)
typeddjango-django-stubs-fa03b48/tests/typecheck/db/models/test_init.yml 0000664 0000000 0000000 00000002320 15260643574 0026560 0 ustar 00root root 0000000 0000000 - case: field_to_many_and_to_one_attrs_bool_or_none_in_field_base_class
main: |
from django.db.models import Field
field: Field
my_bool: bool
my_bool = field.one_to_many
my_bool = field.one_to_one
my_bool = field.many_to_many
my_bool = field.many_to_one
# Narrowing the types should give us bool
assert field.one_to_many is not None
my_bool = field.one_to_many
assert field.one_to_one is not None
my_bool = field.one_to_one
assert field.many_to_many is not None
my_bool = field.many_to_many
assert field.many_to_one is not None
my_bool = field.many_to_one
out: |
main:6: error: Incompatible types in assignment (expression has type "bool | None", variable has type "bool") [assignment]
main:7: error: Incompatible types in assignment (expression has type "bool | None", variable has type "bool") [assignment]
main:8: error: Incompatible types in assignment (expression has type "bool | None", variable has type "bool") [assignment]
main:9: error: Incompatible types in assignment (expression has type "bool | None", variable has type "bool") [assignment]
typeddjango-django-stubs-fa03b48/tests/typecheck/db/models/test_query.yml 0000664 0000000 0000000 00000006012 15260643574 0026764 0 ustar 00root root 0000000 0000000 - case: django_db_models_query_module_has_ModelIterable
main: |
from django.db.models.query import ModelIterable
from django.db.models import Model
class IntModelIterable(ModelIterable[int]):
pass
class NoTypeParameterModelIterable(ModelIterable):
pass
class ModelModelIterable(ModelIterable[Model]):
pass
class MyModel(Model):
pass
class MyModelModelIterable(ModelIterable[MyModel]):
pass
out: |
main:4: error: Type argument "int" of "ModelIterable" must be a subtype of "Model" [type-var]
- case: django_db_models_query_module_has_ValuesListIterable
main: |
from django.db.models.query import ValuesListIterable
class IntValuesListIterable(ValuesListIterable[tuple[int,int]]):
pass
class StringsValuesListIterable(ValuesListIterable[tuple[str,str,str]]):
pass
class MultiTypeValuesListIterable(ValuesListIterable[tuple[str,int,float]]):
pass
class NonTupleValuesListIterable(ValuesListIterable[int]):
pass
out: |
main:10: error: Type argument "int" of "ValuesListIterable" must be a subtype of "tuple[Any, ...]" [type-var]
- case: django_db_models_query_module_has_NamedValuesListIterable
main: |
from django.db.models.query import NamedValuesListIterable
out: |
- case: QuerySet_has__iterable_class_defined
main: |
from django.db.models.query import QuerySet, ValuesIterable, ModelIterable
iterable_class = QuerySet._iterable_class
QuerySet._iterable_class = ValuesIterable
QuerySet._iterable_class = ModelIterable
QuerySet._iterable_class = int
out: |
main:5: error: Incompatible types in assignment (expression has type "type[int]", variable has type "type[BaseIterable[Any]]") [assignment]
- case: QuerySet_type_vars
main: |
from typing_extensions import reveal_type
from django.db.models.query import QuerySet
from django.contrib.auth.models import User
from django_stubs_ext import ValuesQuerySet
a: QuerySet[User]
reveal_type(a) # N: Revealed type is "django.db.models.query.QuerySet[django.contrib.auth.models.User, django.contrib.auth.models.User]"
reveal_type(a.get()) # N: Revealed type is "django.contrib.auth.models.User"
b: QuerySet[User, int]
reveal_type(b) # N: Revealed type is "django.db.models.query.QuerySet[django.contrib.auth.models.User, int]"
reveal_type(b.get()) # N: Revealed type is "int"
c: ValuesQuerySet[User, int]
reveal_type(c) # N: Revealed type is "django.db.models.query.QuerySet[django.contrib.auth.models.User, int]"
reveal_type(c.get()) # N: Revealed type is "int"
d: QuerySet[int] # E: Type argument "int" of "QuerySet" must be a subtype of "Model" [type-var]
e: ValuesQuerySet[int] # E: Type argument "int" of "QuerySet" must be a subtype of "Model" [type-var]
typeddjango-django-stubs-fa03b48/tests/typecheck/fields/ 0000775 0000000 0000000 00000000000 15260643574 0023434 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/typecheck/fields/test_base.yml 0000664 0000000 0000000 00000021424 15260643574 0026133 0 ustar 00root root 0000000 0000000 - case: test_model_fields_classes_present_as_primitives
main: |
from typing_extensions import reveal_type
from myapp.models import User
user = User(small_int=1, name='user', slug='user', text='user')
reveal_type(user.id) # N: Revealed type is "int"
reveal_type(user.small_int) # N: Revealed type is "int"
reveal_type(user.name) # N: Revealed type is "str"
reveal_type(user.slug) # N: Revealed type is "str"
reveal_type(user.text) # N: Revealed type is "str"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
id = models.AutoField(primary_key=True)
small_int = models.SmallIntegerField()
name = models.CharField(max_length=255)
slug = models.SlugField(max_length=255)
text = models.TextField()
- case: test_model_field_classes_from_existing_locations
main: |
from typing_extensions import reveal_type
from myapp.models import Booking
booking = Booking()
reveal_type(booking.id) # N: Revealed type is "int"
reveal_type(booking.time_range) # N: Revealed type is "Any"
reveal_type(booking.some_decimal) # N: Revealed type is "decimal.Decimal"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from django.contrib.postgres import fields as pg_fields
from decimal import Decimal
class Booking(models.Model):
id = models.AutoField(primary_key=True)
time_range = pg_fields.DateTimeRangeField(null=False)
some_decimal = models.DecimalField(max_digits=10, decimal_places=5)
- case: test_add_id_field_if_no_primary_key_defined
disable_cache: true
main: |
from typing_extensions import reveal_type
from myapp.models import User
reveal_type(User().id) # N: Revealed type is "int"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
pass
- case: test_do_not_add_id_if_field_with_primary_key_True_defined
disable_cache: true
main: |
from typing_extensions import reveal_type
from myapp.models import User
reveal_type(User().my_pk) # N: Revealed type is "int"
User().id # E: "User" has no attribute "id" [attr-defined]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
my_pk = models.IntegerField(primary_key=True)
- case: blank_and_null_char_field_allows_none
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
MyModel(nulltext="")
MyModel(nulltext=None)
MyModel().nulltext=None
reveal_type(MyModel().nulltext) # N: Revealed type is "str | None"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyModel(models.Model):
nulltext=models.CharField(max_length=1, blank=True, null=True)
- case: blank_and_not_null_charfield_does_not_allow_none
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
MyModel(notnulltext=None) # E: Incompatible type for "notnulltext" of "MyModel" (got "None", expected "str | int | Combinable") [misc]
MyModel(notnulltext="")
MyModel().notnulltext = None # E: Incompatible types in assignment (expression has type "None", variable has type "str | int | Combinable") [assignment]
reveal_type(MyModel().notnulltext) # N: Revealed type is "str"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyModel(models.Model):
notnulltext=models.CharField(max_length=1, blank=True, null=False)
- case: if_field_called_on_class_return_field_itself
main: |
from typing_extensions import reveal_type
from myapp.models import MyUser
reveal_type(MyUser.name.field) # N: Revealed type is "django.db.models.fields.CharField[str | int | django.db.models.expressions.Combinable, str]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyUser(models.Model):
name = models.CharField(max_length=100)
- case: fields_on_non_model_classes_resolve_to_field_type
main: |
from typing_extensions import reveal_type
from django.db import models
class MyClass:
myfield: models.IntegerField[int, int]
reveal_type(MyClass.myfield) # N: Revealed type is "django.db.models.fields._FieldDescriptor[django.db.models.fields.IntegerField[int, int]]"
reveal_type(MyClass.myfield.field) # N: Revealed type is "django.db.models.fields.IntegerField[int, int]"
reveal_type(MyClass().myfield) # N: Revealed type is "django.db.models.fields.IntegerField[int, int]"
- case: fields_inside_mixins_used_in_model_subclasses_resolved_as_primitives
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel, AuthMixin
reveal_type(MyModel().username) # N: Revealed type is "str"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class AuthMixin(models.Model):
class Meta:
abstract = True
username = models.CharField(max_length=100)
class MyModel(AuthMixin, models.Model):
pass
- case: can_narrow_field_type
main: |
from typing import cast, NewType
from typing_extensions import reveal_type
from django.db import models
Year = NewType("Year", int)
class Book(models.Model):
published = cast(models.Field[Year, Year], models.IntegerField())
book = Book()
reveal_type(book.published) # N: Revealed type is "main.Year"
book.published = 2006 # E: Incompatible types in assignment (expression has type "int", variable has type "Year") [assignment]
book.published = Year(2006)
reveal_type(book.published) # N: Revealed type is "main.Year"
def accepts_int(arg: int) -> None: ...
accepts_int(book.published)
- case: test_binary_field_return_types
main: |
from typing_extensions import reveal_type
from django.db import models
class EncodedMessage(models.Model):
message = models.BinaryField()
obj = EncodedMessage(b'\x010')
reveal_type(obj.message) # N: Revealed type is "bytes | memoryview[int]"
- case: test_small_auto_field_class_presents_as_int
main: |
from typing_extensions import reveal_type
from django.db import models
class MyModel(models.Model):
small = models.SmallAutoField(primary_key=True)
obj = MyModel()
reveal_type(obj.small) # N: Revealed type is "int"
- case: test_ignores_renamed_field
main: |
# Ref: https://github.com/typeddjango/django-stubs/issues/1261
# Django modifies the model so it doesn't have 'modelname', but we don't follow
# along. But the 'name=' argument to a field isn't a documented feature.
from typing_extensions import reveal_type
from myapp.models import RenamedField
instance = RenamedField()
reveal_type(instance.modelname) # N: Revealed type is "int"
instance.fieldname # E: "RenamedField" has no attribute "fieldname" [attr-defined]
instance.modelname = 1
instance.fieldname = 1 # E: "RenamedField" has no attribute "fieldname" [attr-defined]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class RenamedField(models.Model):
modelname = models.IntegerField(name="fieldname", choices=((1, 'One'),))
typeddjango-django-stubs-fa03b48/tests/typecheck/fields/test_custom_fields.yml 0000664 0000000 0000000 00000012621 15260643574 0030060 0 ustar 00root root 0000000 0000000 - case: test_custom_model_fields_with_generic_type
main: |
from typing_extensions import reveal_type
from myapp.models import User, CustomFieldValue
user = User()
reveal_type(user.id) # N: Revealed type is "int"
reveal_type(user.my_custom_field1) # N: Revealed type is "myapp.models.CustomFieldValue"
reveal_type(user.my_custom_field2) # N: Revealed type is "myapp.models.CustomFieldValue"
reveal_type(user.my_custom_field3) # N: Revealed type is "bool"
reveal_type(user.my_custom_field4) # N: Revealed type is "myapp.models.CustomFieldValue"
reveal_type(user.my_custom_field5) # N: Revealed type is "myapp.models.CustomFieldValue"
reveal_type(user.my_custom_field6) # N: Revealed type is "myapp.models.CustomFieldValue"
reveal_type(user.my_custom_field7) # N: Revealed type is "bool"
reveal_type(user.my_custom_field8) # N: Revealed type is "myapp.models.CustomFieldValue"
reveal_type(user.my_custom_field9) # N: Revealed type is "myapp.models.CustomFieldValue"
reveal_type(user.my_custom_field10) # N: Revealed type is "bool"
reveal_type(user.my_custom_field11) # N: Revealed type is "bool"
reveal_type(user.my_custom_field12) # N: Revealed type is "myapp.models.CustomFieldValue | None"
reveal_type(user.my_custom_field13) # N: Revealed type is "myapp.models.CustomFieldValue | None"
reveal_type(user.my_custom_field14) # N: Revealed type is "bool | None"
reveal_type(user.my_custom_field15) # N: Revealed type is "None"
reveal_type(user.my_custom_field_any1) # N: Revealed type is "Any"
reveal_type(user.my_custom_field_any2) # N: Revealed type is "Any"
reveal_type(user.my_custom_field_any3) # N: Revealed type is "Any | None"
reveal_type(user.my_custom_field_any4) # N: Revealed type is "Any"
monkeypatch: true
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from django.db.models import fields
from typing import Any, Generic
from typing_extensions import TypeVar
_ST = TypeVar("_ST", contravariant=True)
_GT = TypeVar("_GT", covariant=True)
T = TypeVar("T")
class CustomFieldValue: ...
class GenericField(fields.Field[_ST, _GT]): ...
class SingleTypeField(fields.Field[T, T]): ...
class CustomValueField(fields.Field[CustomFieldValue | int, CustomFieldValue]): ...
class AdditionalTypeVarField(fields.Field[_ST, _GT], Generic[_ST, _GT, T]): ...
class CustomSmallIntegerField(fields.SmallIntegerField[_ST, _GT]): ...
class FieldImplicitAny(fields.Field): ...
class FieldExplicitAny(fields.Field[Any, Any]): ...
class User(models.Model):
id = models.AutoField(primary_key=True)
my_custom_field1 = GenericField[CustomFieldValue | int, CustomFieldValue]()
my_custom_field2 = CustomValueField()
my_custom_field3 = SingleTypeField[bool]()
my_custom_field4 = AdditionalTypeVarField[CustomFieldValue | int, CustomFieldValue, bool]()
my_custom_field_any1 = FieldImplicitAny()
my_custom_field_any2 = FieldExplicitAny()
# test null=True on fields with non-optional generic types throw error
my_custom_field5 = GenericField[CustomFieldValue | int, CustomFieldValue](null=True) # E: GenericField is nullable but its generic get type parameter is not optional [misc]
my_custom_field6 = CustomValueField(null=True) # E: CustomValueField is nullable but its generic get type parameter is not optional [misc]
my_custom_field7 = SingleTypeField[bool](null=True) # E: SingleTypeField is nullable but its generic get type parameter is not optional [misc]
my_custom_field8 = AdditionalTypeVarField[CustomFieldValue | int, CustomFieldValue, bool](null=True) # E: AdditionalTypeVarField is nullable but its generic get type parameter is not optional [misc]
my_custom_field9 = fields.Field[CustomFieldValue | int, CustomFieldValue](null=True) # E: Field is nullable but its generic get type parameter is not optional [misc]
# test overriding fields that set _pyi_private_set_type or _pyi_private_get_type
my_custom_field10 = fields.SmallIntegerField[bool, bool]()
my_custom_field11 = CustomSmallIntegerField[bool, bool]()
# test null=True on fields with non-optional generic types throw no errors
my_custom_field12 = fields.Field[CustomFieldValue | int, CustomFieldValue | None](null=True)
my_custom_field13 = GenericField[CustomFieldValue | int, CustomFieldValue | None](null=True)
my_custom_field14 = SingleTypeField[bool | None](null=True)
my_custom_field15 = fields.Field[None, None](null=True)
# test null=True on Any does not raise
my_custom_field_any3 = FieldImplicitAny(null=True)
my_custom_field_any4 = FieldExplicitAny(null=True)
typeddjango-django-stubs-fa03b48/tests/typecheck/fields/test_generic_foreign_key.yml 0000664 0000000 0000000 00000003733 15260643574 0031221 0 ustar 00root root 0000000 0000000 - case: generic_foreign_key_could_point_to_any_model_and_is_always_optional
main: |
from typing_extensions import reveal_type
from myapp.models import Tag, User
myuser = User()
Tag(content_object=None)
Tag(content_object=myuser)
Tag.objects.create(content_object=None)
Tag.objects.create(content_object=myuser)
reveal_type(Tag().content_object) # N: Revealed type is "Any | None"
installed_apps:
- myapp
- django.contrib.contenttypes
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from django.contrib.contenttypes import fields
class User(models.Model):
pass
class Tag(models.Model):
content_object = fields.GenericForeignKey()
- case: generic_foreign_key_subclass_could_point_to_any_model_and_is_always_optional
main: |
from typing_extensions import reveal_type
from myapp.models import Tag, User
myuser = User()
Tag(content_object=None)
Tag(content_object=myuser)
Tag.objects.create(content_object=None)
Tag.objects.create(content_object=myuser)
reveal_type(Tag().content_object) # N: Revealed type is "Any | None"
installed_apps:
- myapp
- django.contrib.contenttypes
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from django.contrib.contenttypes import fields
class User(models.Model):
pass
class Tag(models.Model):
content_object = fields.GenericForeignKey()
# Simulate a GenericForeignKey subclass without type infos.
Tag.content_object.__class__ = type('MyGenericForeignKey', (fields.GenericForeignKey,), {})
typeddjango-django-stubs-fa03b48/tests/typecheck/fields/test_nullable.yml 0000664 0000000 0000000 00000016535 15260643574 0027026 0 ustar 00root root 0000000 0000000 - case: autofield_can_be_set_to_none
main: |
from myapp.models import MyModel, MyModelExplicitPK
m = MyModel()
m.id = 3
m.id = None
m2 = MyModel(id=None)
MyModel.objects.create(id=None)
MyModel.objects.all().update(id=None) # Should give an error since there's a not-null constraint
def foo(a: int) -> bool:
return True
m2 = MyModel()
foo(m2.id)
# At runtime, this would be an error, unless m.save() was called to populate the `id` field.
# but the plugin cannot catch this.
foo(m.id)
exp = MyModelExplicitPK()
exp.id = 3
exp.id = None
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyModel(models.Model):
pass
class MyModelExplicitPK(models.Model):
id = models.AutoField(primary_key=True)
- case: nullable_field_with_strict_optional_true
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel().text) # N: Revealed type is "str"
reveal_type(MyModel().text_nullable) # N: Revealed type is "str | None"
MyModel().text = None # E: Incompatible types in assignment (expression has type "None", variable has type "str | int | Combinable") [assignment]
MyModel().text_nullable = None
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyModel(models.Model):
text_nullable = models.CharField(max_length=100, null=True)
text = models.CharField(max_length=100)
- case: nullable_array_field
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel().lst) # N: Revealed type is "list[str] | None"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from django.contrib.postgres.fields import ArrayField
class MyModel(models.Model):
lst = ArrayField(base_field=models.CharField(max_length=100), null=True)
- case: nullable_foreign_key
main: |
from typing_extensions import reveal_type
from myapp.models import Publisher, Book
reveal_type(Book().publisher) # N: Revealed type is "myapp.models.Publisher | None"
Book().publisher = 11 # E: Incompatible types in assignment (expression has type "int", variable has type "Publisher | Combinable | None") [assignment]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Publisher(models.Model):
pass
class Book(models.Model):
publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE, null=True)
- case: nullable_self_foreign_key
main: |
from typing_extensions import reveal_type
from myapp.models import Inventory
parent = Inventory()
core = Inventory(parent_id=parent.id)
reveal_type(core.parent_id) # N: Revealed type is "int | None"
reveal_type(core.parent) # N: Revealed type is "myapp.models.Inventory | None"
Inventory(parent=None)
Inventory(parent_id=None)
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Inventory(models.Model):
parent = models.ForeignKey('self', on_delete=models.SET_NULL, null=True)
- case: nullable_subclass_inherits_null_overload
main: |
from typing_extensions import reveal_type
from myapp.models import Article
reveal_type(Article().body) # N: Revealed type is "str"
reveal_type(Article().body_nullable) # N: Revealed type is "str | None"
reveal_type(Article().count) # N: Revealed type is "int"
reveal_type(Article().count_nullable) # N: Revealed type is "int | None"
monkeypatch: true
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing_extensions import TypeVar
from django.db import models
_ST = TypeVar("_ST", contravariant=True)
_GT = TypeVar("_GT", covariant=True)
class HtmlField(models.TextField[_ST, _GT]): ...
class IntWrap(models.IntegerField[_ST, _GT]): ...
class Article(models.Model):
body = HtmlField()
body_nullable = HtmlField(null=True)
count = IntWrap()
count_nullable = IntWrap(null=True)
- case: direct_field_null_true_does_not_trigger_nullability_check
main: |
from typing_extensions import reveal_type
from django.db import models
from django.db.models import OuterRef, Subquery
from myapp.models import Article
field = models.IntegerField(null=True)
reveal_type(field) # N: Revealed type is "django.db.models.fields.IntegerField[float | int | str | django.db.models.expressions.Combinable | None, int | None]"
Article.objects.annotate(
other_id=Subquery(
Article.objects.filter(id=OuterRef("id")).values_list("id", flat=True)[:1],
output_field=models.IntegerField(null=True),
)
)
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Article(models.Model):
pass
- case: field_null_true_expression_does_not_trigger_nullability_check
main: |
from typing_extensions import reveal_type
from django.db import models
def take_field(f: models.Field) -> None:
return None
take_field(models.IntegerField(null=True))
take_field(models.IntegerField(null=False))
- case: nullable_field_subclass_without_explicit_type_vars
main: |
from typing_extensions import reveal_type
from myapp.models import Article
reveal_type(Article().body) # N: Revealed type is "str"
reveal_type(Article().body_nullable) # N: Revealed type is "str | None"
reveal_type(Article().count_nullable) # N: Revealed type is "int | None"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class HTMLField(models.TextField): ...
class IntWrap(models.IntegerField): ...
class Article(models.Model):
body = HTMLField()
body_nullable = HTMLField(null=True)
count_nullable = IntWrap(null=True)
typeddjango-django-stubs-fa03b48/tests/typecheck/fields/test_postgres_fields.yml 0000664 0000000 0000000 00000002566 15260643574 0030423 0 ustar 00root root 0000000 0000000 - case: array_field_descriptor_access
main: |
from typing_extensions import reveal_type
from myapp.models import User
user = User(array=[])
reveal_type(user.array) # N: Revealed type is "list[Any]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from django.contrib.postgres.fields import ArrayField
class User(models.Model):
array = ArrayField(base_field=models.Field())
- case: array_field_base_field_parsed_into_generic_typevar
main: |
from typing_extensions import reveal_type
from myapp.models import User
user = User()
reveal_type(user.members) # N: Revealed type is "list[int]"
reveal_type(user.members_as_text) # N: Revealed type is "list[str]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from django.contrib.postgres.fields import ArrayField
class User(models.Model):
members = ArrayField(base_field=models.IntegerField())
members_as_text = ArrayField(base_field=models.CharField(max_length=255))
typeddjango-django-stubs-fa03b48/tests/typecheck/fields/test_related.yml 0000664 0000000 0000000 00000242330 15260643574 0026642 0 ustar 00root root 0000000 0000000 - case: test_foreign_key_field_with_related_name
main: |
from typing_extensions import reveal_type
from myapp.models import Book, Publisher
book = Book()
reveal_type(book.publisher) # N: Revealed type is "myapp.models.Publisher"
publisher = Publisher()
reveal_type(publisher.books) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.Book]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Publisher(models.Model):
pass
class Book(models.Model):
publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE,
related_name='books')
- case: foreign_key_field_creates_attribute_with_underscore_id
main: |
from typing_extensions import reveal_type
from myapp.models import Book
book = Book()
reveal_type(book.publisher_id) # N: Revealed type is "int"
reveal_type(book.owner_id) # N: Revealed type is "int"
installed_apps:
- django.contrib.auth
- django.contrib.contenttypes
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Publisher(models.Model):
pass
class Book(models.Model):
publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE)
owner = models.ForeignKey(db_column='model_id', to='auth.User', on_delete=models.CASCADE)
- case: foreign_key_field_custom_to_field
main: |
from typing_extensions import reveal_type
from myapp.models import Book, Publisher
from uuid import UUID
book = Book()
book.publisher = Publisher()
reveal_type(book.publisher_id) # N: Revealed type is "uuid.UUID"
book.publisher_id = '821850bb-c105-426f-b340-3974419d00ca'
book.publisher_id = UUID('821850bb-c105-426f-b340-3974419d00ca')
book.publisher_id = [1] # E: Incompatible types in assignment (expression has type "list[int]", variable has type "str | UUID") [assignment]
book.publisher_id = Publisher() # E: Incompatible types in assignment (expression has type "Publisher", variable has type "str | UUID") [assignment]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Publisher(models.Model):
id = models.BigAutoField(primary_key=True)
uuid = models.UUIDField(unique=True)
class Book(models.Model):
publisher = models.ForeignKey(to=Publisher, to_field='uuid', on_delete=models.CASCADE)
- case: foreign_key_field_different_order_of_params
main: |
from typing_extensions import reveal_type
from myapp.models import Book, Publisher
book = Book()
reveal_type(book.publisher) # N: Revealed type is "myapp.models.Publisher"
reveal_type(book.publisher2) # N: Revealed type is "myapp.models.Publisher"
publisher = Publisher()
reveal_type(publisher.books) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.Book]"
reveal_type(publisher.books2) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.Book]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Publisher(models.Model):
pass
class Book(models.Model):
publisher = models.ForeignKey(on_delete=models.CASCADE, to=Publisher,
related_name='books')
publisher2 = models.ForeignKey(to=Publisher, related_name='books2', on_delete=models.CASCADE)
- case: foreign_key_subclass
main: |
from typing_extensions import reveal_type
from myapp.models import A
reveal_type(A.objects.get().b) # N: Revealed type is "myapp.models.B"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing_extensions import TypeVar
from django.db import models
_ST = TypeVar("_ST", contravariant=True)
_GT = TypeVar("_GT", covariant=True)
class MyForeignKey(models.ForeignKey[_ST, _GT]): ...
class B(models.Model): ...
class A(models.Model):
b = models.ForeignKey(B, on_delete=models.CASCADE)
- case: to_parameter_as_string_with_application_name__model_imported
main: |
from typing_extensions import reveal_type
from myapp2.models import Book
book = Book()
reveal_type(book.publisher) # N: Revealed type is "myapp.models.Publisher"
installed_apps:
- myapp
- myapp2
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Publisher(models.Model):
pass
- path: myapp2/__init__.py
- path: myapp2/models.py
content: |
from django.db import models
class Book(models.Model):
publisher = models.ForeignKey(to='myapp.Publisher', on_delete=models.CASCADE)
- case: one_to_one_field_no_related_name
main: |
from typing_extensions import reveal_type
from myapp.models import User, Profile
reveal_type(User().profile) # N: Revealed type is "myapp.models.Profile"
reveal_type(Profile().user) # N: Revealed type is "myapp.models.User"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
pass
class Profile(models.Model):
user = models.OneToOneField(to=User, on_delete=models.CASCADE)
- case: test_circular_dependency_in_imports_with_foreign_key
main: |
from myapp import models
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing_extensions import reveal_type
from django.db import models
class App(models.Model):
def method(self) -> None:
reveal_type(self.views) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.View]"
reveal_type(self.members) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.Member]"
reveal_type(self.sheets) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.Sheet]"
reveal_type(self.profile) # N: Revealed type is "myapp.models.Profile"
class View(models.Model):
app = models.ForeignKey(to=App, related_name='views', on_delete=models.CASCADE)
class Member(models.Model):
app = models.ForeignKey(related_name='members', on_delete=models.CASCADE, to=App)
class Sheet(models.Model):
app = models.ForeignKey(App, related_name='sheets', on_delete=models.CASCADE)
class Profile(models.Model):
app = models.OneToOneField(App, related_name='profile', on_delete=models.CASCADE)
- case: test_circular_dependency_in_imports_with_string_based
main: |
from typing_extensions import reveal_type
from myapp.models import View
reveal_type(View().app.views) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.View]"
View().app.unknown # E: "App" has no attribute "unknown" [attr-defined]
installed_apps:
- myapp
- myapp2
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from myapp2.models import App
class View(models.Model):
app = models.ForeignKey(to=App, related_name='views', on_delete=models.CASCADE)
- path: myapp2/__init__.py
- path: myapp2/models.py
content: |
from typing_extensions import reveal_type
from django.db import models
class App(models.Model):
def method(self) -> None:
reveal_type(self.views) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.View]"
- case: models_related_managers_work_with_direct_model_inheritance_and_with_inheritance_from_other_model
main: |
from typing_extensions import reveal_type
from myapp.models import App
reveal_type(App().views) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.View]"
reveal_type(App().views2) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.View2]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class App(models.Model):
pass
class View(models.Model):
app = models.ForeignKey(to=App, on_delete=models.CASCADE, related_name='views')
class View2(View):
app2 = models.ForeignKey(to=App, on_delete=models.CASCADE, related_name='views2')
- case: models_imported_inside_init_file_foreign_key
main: |
from typing_extensions import reveal_type
from myapp2.models import View
reveal_type(View().app.views) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp2.models.View]"
installed_apps:
- myapp
- myapp2
files:
- path: myapp/__init__.py
- path: myapp/models/__init__.py
content: |
from .app import App as App
- path: myapp/models/app.py
content: |
from django.db import models
class App(models.Model):
pass
- path: myapp2/__init__.py
- path: myapp2/models.py
content: |
from django.db import models
from myapp.models import App
class View(models.Model):
app = models.ForeignKey(to='myapp.App', related_name='views', on_delete=models.CASCADE)
- case: models_imported_inside_init_file_one_to_one_field
main: |
from typing_extensions import reveal_type
from myapp2.models import Profile
reveal_type(Profile().user) # N: Revealed type is "myapp.models.user.User"
reveal_type(Profile().user.profile) # N: Revealed type is "myapp2.models.Profile"
reveal_type(Profile.user.field) # N: Revealed type is "django.db.models.fields.related.OneToOneField[myapp.models.user.User | django.db.models.expressions.Combinable, myapp.models.user.User]"
installed_apps:
- myapp
- myapp2
files:
- path: myapp/__init__.py
- path: myapp/models/__init__.py
content: |
from .user import User as User
- path: myapp/models/user.py
content: |
from django.db import models
class User(models.Model):
pass
- path: myapp2/__init__.py
- path: myapp2/models.py
content: |
from django.db import models
from myapp.models import User
class Profile(models.Model):
user = models.OneToOneField(to='myapp.User', related_name='profile', on_delete=models.CASCADE)
- case: models_triple_circular_reference
main: |
from typing_extensions import reveal_type
from myapp.models import App
reveal_type(App().owner) # N: Revealed type is "myapp.models.user.User"
reveal_type(App().owner.profile) # N: Revealed type is "myapp.models.profile.Profile"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models/__init__.py
content: |
from .user import User as User
from .profile import Profile as Profile
from .app import App as App
- path: myapp/models/user.py
content: |
from django.db import models
class User(models.Model):
pass
- path: myapp/models/profile.py
content: |
from django.db import models
class Profile(models.Model):
user = models.OneToOneField(to='myapp.User', related_name='profile', on_delete=models.CASCADE)
- path: myapp/models/app.py
content: |
from django.db import models
class App(models.Model):
owner = models.ForeignKey(to='myapp.User', on_delete=models.CASCADE, related_name='apps')
- case: many_to_many_field_converts_to_queryset_of_model_type
main: |
from typing_extensions import reveal_type
from myapp.models import App, Member
reveal_type(Member().apps) # N: Revealed type is "myapp.models.App_ManyRelatedManager[myapp.models.Member_apps]"
reveal_type(Member().apps.get()) # N: Revealed type is "myapp.models.App"
reveal_type(Member().apps.app_method()) # N: Revealed type is "str"
Member().apps.add(App())
reveal_type(App().members) # N: Revealed type is "myapp.models.Member_ManyRelatedManager[myapp.models.Member_apps]"
reveal_type(App().members.get()) # N: Revealed type is "myapp.models.Member"
reveal_type(App().members.member_method()) # N: Revealed type is "int"
App().members.add(Member())
reveal_type(Member.apps.field) # N: Revealed type is "django.db.models.fields.related.ManyToManyField[myapp.models.App, myapp.models.Member_apps]"
reveal_type(App.members) # N: Revealed type is "django.db.models.fields.related_descriptors.ManyToManyDescriptor[myapp.models.Member, myapp.models.Member_apps]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class AppQuerySet(models.QuerySet["App"]):
def app_method(self) -> str:
return "abc"
class App(models.Model):
objects = AppQuerySet.as_manager()
class MemberQuerySet(models.QuerySet["Member"]):
def member_method(self) -> int:
return 1
class Member(models.Model):
apps = models.ManyToManyField(to=App, related_name='members')
objects = MemberQuerySet.as_manager()
- case: many_to_many_works_with_string_if_imported
main: |
from typing_extensions import reveal_type
from myapp.models import Member
reveal_type(Member().apps) # N: Revealed type is "myapp2.models.App_ManyRelatedManager[myapp.models.Member_apps]"
installed_apps:
- myapp
- myapp2
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Member(models.Model):
apps = models.ManyToManyField(to='myapp2.App', related_name='members')
- path: myapp2/__init__.py
- path: myapp2/models.py
content: |
from django.db import models
class App(models.Model):
pass
- case: foreign_key_with_self
main: |
from typing_extensions import reveal_type
from myapp.models import User
reveal_type(User().parent) # N: Revealed type is "myapp.models.User"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
parent = models.ForeignKey('self', on_delete=models.CASCADE)
- case: many_to_many_with_self
main: |
from typing_extensions import reveal_type
from myapp.models import User
reveal_type(User().friends) # N: Revealed type is "myapp.models.User_ManyRelatedManager[myapp.models.User_friends]"
reveal_type(User().friends.get()) # N: Revealed type is "myapp.models.User"
reveal_type(User.friends.through.objects.get()) # N: Revealed type is "myapp.models.User_friends"
reveal_type(User.friends.through._default_manager) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.User_friends]"
reveal_type(User.friends.through().from_user) # N: Revealed type is "myapp.models.User"
reveal_type(User.friends.through().from_user_id) # N: Revealed type is "int"
reveal_type(User.friends.through().to_user) # N: Revealed type is "myapp.models.User"
reveal_type(User.friends.through().to_user_id) # N: Revealed type is "int"
reveal_type(User.friends.through) # N: Revealed type is "type[myapp.models.User_friends]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
friends = models.ManyToManyField('self')
- case: implicit_through_model_gets_managers_despite_deferrals
main: |
from typing_extensions import reveal_type
from django.contrib.auth.models import Group
reveal_type(Group.permissions.through.objects) # N: Revealed type is "django.db.models.manager.Manager[django.contrib.auth.models.Group_permissions]"
reveal_type(Group.permissions.through._default_manager) # N: Revealed type is "django.db.models.manager.Manager[django.contrib.auth.models.Group_permissions]"
custom_settings: |
INSTALLED_APPS = ('django.contrib.contenttypes', 'django.contrib.auth', 'myapp')
# 'django.contrib.auth.models' is analyzed *before* 'myapp' (which imports it), so
# this 'DEFAULT_AUTO_FIELD' lookup fails and triggers a deferral right after the
# implicit through models of 'django.contrib.auth' were created.
DEFAULT_AUTO_FIELD = 'myapp.models.MyAutoField'
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from django.contrib.auth.models import Group # noqa: F401
class MyAutoField(models.BigAutoField):
...
- case: explicit_through_model_keeps_its_own_default_manager
main: |
from typing_extensions import reveal_type
from myapp.models import Authorship, Book
reveal_type(Authorship.objects) # N: Revealed type is "myapp.models.ManagerFromAuthorshipQuerySet[myapp.models.Authorship]"
reveal_type(Authorship._default_manager) # N: Revealed type is "myapp.models.ManagerFromAuthorshipQuerySet[myapp.models.Authorship]"
reveal_type(Book().authorships.active()) # N: Revealed type is "myapp.models.AuthorshipQuerySet[myapp.models.Authorship, myapp.models.Authorship]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing_extensions import Self
from django.db import models
class Book(models.Model):
authors = models.ManyToManyField('myapp.Author', through='myapp.Authorship')
class Author(models.Model):
...
class AuthorshipQuerySet(models.QuerySet['Authorship']):
def active(self) -> Self:
return self
class Authorship(models.Model):
book = models.ForeignKey(Book, on_delete=models.CASCADE, related_name='authorships')
author = models.ForeignKey(Author, on_delete=models.CASCADE)
objects = models.Manager.from_queryset(AuthorshipQuerySet)()
- case: recursively_checking_for_base_model_in_to_parameter
main: |
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class BaseModel(models.Model):
pass
class ParkingSpot(BaseModel):
pass
class Booking(BaseModel):
parking_spot = models.ForeignKey(to=ParkingSpot, null=True, on_delete=models.SET_NULL)
- case: if_no_related_name_is_passed_create_default_related_managers
main: |
from typing_extensions import reveal_type
from myapp.models import Publisher
reveal_type(Publisher().book_set) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.Book]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Publisher(models.Model):
pass
class Book(models.Model):
publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE)
- case: underscore_id_attribute_has_set_type_of_primary_key_if_explicit
main: |
import datetime
from typing_extensions import reveal_type
from myapp.models import Book, Book2
reveal_type(Book().publisher_id) # N: Revealed type is "str"
Book(publisher_id=1)
Book(publisher_id='hello')
Book(publisher_id=datetime.datetime.now()) # E: Incompatible type for "publisher_id" of "Book" (got "datetime", expected "str | int | Combinable") [misc]
Book.objects.create(publisher_id=1)
Book.objects.create(publisher_id='hello')
reveal_type(Book2().publisher_id) # N: Revealed type is "int"
Book2(publisher_id=1)
Book2(publisher_id=[]) # E: Incompatible type for "publisher_id" of "Book2" (got "list[Any]", expected "float | int | str | Combinable") [misc]
Book2.objects.create(publisher_id=1)
Book2.objects.create(publisher_id=[]) # E: Incompatible type for "publisher_id" of "Book2" (got "list[Any]", expected "float | int | str | Combinable") [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
import datetime
class Publisher(models.Model):
mypk = models.CharField(max_length=100, primary_key=True)
class Book(models.Model):
publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE)
class Publisher2(models.Model):
mypk = models.IntegerField(primary_key=True)
class Book2(models.Model):
publisher = models.ForeignKey(to=Publisher2, on_delete=models.CASCADE)
- case: if_model_is_defined_as_name_of_the_class_look_for_it_in_the_same_app
main: |
from typing_extensions import reveal_type
from myapp.models import Book
reveal_type(Book().publisher) # N: Revealed type is "myapp.models.publisher.Publisher"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models/__init__.py
content: |
from .publisher import Publisher as Publisher
from .book import Book as Book
- path: myapp/models/publisher.py
content: |
from django.db import models
class Publisher(models.Model):
pass
- path: myapp/models/book.py
content: |
from django.db import models
class Book(models.Model):
publisher = models.ForeignKey(to='Publisher', on_delete=models.CASCADE)
- case: fail_if_no_model_in_the_same_app_models_init_py
main: |
from myapp.models import Book
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models/__init__.py
content: |
from .book import Book as Book
- path: myapp/models/publisher.py
content: |
from django.db import models
class Publisher(models.Model):
pass
- path: myapp/models/book.py
content: |
from django.db import models
class Book(models.Model):
publisher = models.ForeignKey(to='Publisher', on_delete=models.CASCADE) # E: Cannot find model 'Publisher' referenced in field 'publisher' [misc]
- case: test_foreign_key_field_without_backwards_relation
main: |
from typing_extensions import reveal_type
from myapp.models import Book, Publisher
book = Book()
reveal_type(book.publisher) # N: Revealed type is "myapp.models.Publisher"
publisher = Publisher()
reveal_type(publisher.books)
reveal_type(publisher.books2) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.Book]"
out: |
main:7: error: "Publisher" has no attribute "books"; maybe "books2"? [attr-defined]
main:7: note: Revealed type is "Any"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Publisher(models.Model):
pass
class Book(models.Model):
publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE,
related_name='+')
publisher2 = models.ForeignKey(to=Publisher, on_delete=models.CASCADE,
related_name='books2')
- case: to_parameter_could_be_resolved_if_passed_from_settings
main: |
from typing_extensions import reveal_type
from myapp.models import Book
book = Book()
reveal_type(book.publisher) # N: Revealed type is "myapp.models.Publisher"
custom_settings: |
INSTALLED_APPS = ('django.contrib.contenttypes', 'myapp')
BOOK_RELATED_MODEL = 'myapp.Publisher'
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.conf import settings
from django.db import models
class Publisher(models.Model):
pass
class Book(models.Model):
publisher = models.ForeignKey(to=settings.BOOK_RELATED_MODEL, on_delete=models.CASCADE,
related_name='books')
- case: foreign_key_with_custom_app_name
main: |
from typing_extensions import reveal_type
from myapp.models import MyMain
reveal_type(MyMain().user) # N: Revealed type is "myapp2.models.MyUser"
installed_apps:
- myapp
- myapp2.apps.MyApp2Config
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyMain(models.Model):
user = models.ForeignKey('myapp2__user.MyUser', on_delete=models.CASCADE)
- path: myapp2/__init__.py
- path: myapp2/models.py
content: |
from django.db import models
class MyUser(models.Model):
pass
- path: myapp2/apps.py
content: |
from django.apps.config import AppConfig
class MyApp2Config(AppConfig):
name = 'myapp2'
label = 'myapp2__user'
- case: related_field_to_extracted_from_function
main: |
from typing_extensions import reveal_type
from myapp.models import Profile
reveal_type(Profile().user) # N: Revealed type is "myapp.models.User"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
pass
def get_user_model_name() -> str:
return 'myapp.User'
class Profile(models.Model):
user = models.ForeignKey(to=get_user_model_name(), on_delete=models.CASCADE)
- case: related_manager_name_defined_by_pattern
main: |
from typing_extensions import reveal_type
from myapp.models import Publisher
reveal_type(Publisher().books) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.Book]"
reveal_type(Publisher().articles) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.Article]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Publisher(models.Model):
pass
class Entry(models.Model):
class Meta:
abstract = True
publisher = models.ForeignKey(to=Publisher, related_name='%(class)ss', on_delete=models.CASCADE)
class Book(Entry):
pass
class Article(Entry):
pass
- case: test_related_fields_returned_as_descriptors_from_model_class
main: |
from typing_extensions import reveal_type
from myapp.models import Author, Blog, Publisher, Profile
reveal_type(Author.blogs) # N: Revealed type is "django.db.models.fields.related_descriptors.ManyToManyDescriptor[myapp.models.Blog, myapp.models.Author_blogs]"
reveal_type(Author.blogs.through) # N: Revealed type is "type[myapp.models.Author_blogs]"
reveal_type(Author().blogs) # N: Revealed type is "myapp.models.Blog_ManyRelatedManager[myapp.models.Author_blogs]"
reveal_type(Blog.publisher) # N: Revealed type is "django.db.models.fields.related_descriptors.ForwardManyToOneDescriptor[django.db.models.fields.related.ForeignKey[myapp.models.Publisher | django.db.models.expressions.Combinable, myapp.models.Publisher]]"
reveal_type(Publisher.profile) # N: Revealed type is "django.db.models.fields.related_descriptors.ForwardOneToOneDescriptor[django.db.models.fields.related.OneToOneField[myapp.models.Profile | django.db.models.expressions.Combinable, myapp.models.Profile]]"
reveal_type(Author.file) # N: Revealed type is "django.db.models.fields.files.FileDescriptor"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Profile(models.Model):
pass
class Publisher(models.Model):
profile = models.OneToOneField(Profile, on_delete=models.CASCADE)
class Blog(models.Model):
publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
class Author(models.Model):
blogs = models.ManyToManyField(Blog)
file = models.FileField()
- case: test_foreign_key_from_superclass_inherits_correctly
main: |
from typing_extensions import reveal_type
from myapp.models import MyUser, Book, Article, LibraryEntity
reveal_type(Book().registered_by_user) # N: Revealed type is "myapp.models.MyUser"
reveal_type(Article().registered_by_user) # N: Revealed type is "myapp.models.MyUser"
user = MyUser()
reveal_type(user.book_set) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.Book]"
reveal_type(user.article_set) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.Article]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyUser(models.Model):
pass
class LibraryEntity(models.Model):
class Meta:
abstract = True
registered_by_user = models.ForeignKey(MyUser, on_delete=models.CASCADE)
class Book(LibraryEntity):
pass
class Article(LibraryEntity):
pass
- case: test_foreign_key_from_superclass_inherits_correctly_when_also_inheriting_manager
main: |
from typing_extensions import reveal_type
from myapp.models import MyUser, Book, Article, LibraryEntity
reveal_type(Book().registered_by_user) # N: Revealed type is "myapp.models.MyUser"
reveal_type(Article().registered_by_user) # N: Revealed type is "myapp.models.MyUser"
user = MyUser()
reveal_type(user.book_set) # N: Revealed type is "myapp.models.Book_RelatedManager"
reveal_type(user.article_set) # N: Revealed type is "myapp.models.Article_RelatedManager"
reveal_type(user.book_set.add) # N: Revealed type is "def (*objs: myapp.models.Book | int, bulk: bool =)"
reveal_type(user.article_set.add) # N: Revealed type is "def (*objs: myapp.models.Article | int, bulk: bool =)"
reveal_type(user.book_set.filter) # N: Revealed type is "def (*args: Any, **kwargs: Any) -> myapp.models.LibraryEntityQuerySet[myapp.models.Book, myapp.models.Book]"
reveal_type(user.book_set.get()) # N: Revealed type is "myapp.models.Book"
reveal_type(user.article_set.filter) # N: Revealed type is "def (*args: Any, **kwargs: Any) -> myapp.models.LibraryEntityQuerySet[myapp.models.Article, myapp.models.Article]"
reveal_type(user.article_set.get()) # N: Revealed type is "myapp.models.Article"
reveal_type(user.book_set.queryset_method()) # N: Revealed type is "int"
reveal_type(user.article_set.queryset_method()) # N: Revealed type is "int"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyUser(models.Model):
pass
class LibraryEntityQuerySet(models.QuerySet):
def queryset_method(self) -> int:
return 1
LibraryEntityManager = models.Manager.from_queryset(LibraryEntityQuerySet)
class LibraryEntity(models.Model):
class Meta:
abstract = True
objects = LibraryEntityManager()
registered_by_user = models.ForeignKey(MyUser, on_delete=models.CASCADE)
class Book(LibraryEntity):
pass
class Article(LibraryEntity):
pass
- case: foreign_key_relationship_for_models_with_custom_manager
main: |
from myapp.models import Transaction
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from django.db.models.manager import Manager
class TransactionQuerySet(models.QuerySet):
pass
TransactionManager = Manager.from_queryset(TransactionQuerySet)
class Transaction(models.Model):
pk = 0
objects = TransactionManager()
def test(self) -> None:
self.transactionlog_set
class TransactionLog(models.Model):
transaction = models.ForeignKey(Transaction, on_delete=models.CASCADE)
Transaction().test()
- case: foreign_key_relationship_for_models_with_custom_manager_unsolvable
main: |
from myapp.models import Transaction
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing_extensions import reveal_type
from django.db import models
from django.db.models.manager import Manager
class TransactionQuerySet(models.QuerySet):
def custom(self) -> None:
raise NotImplementedError
def TransactionManager() -> Manager:
return Manager.from_queryset(TransactionQuerySet)()
class Transaction(models.Model):
objects = TransactionManager()
def test(self) -> None:
reveal_type(self.transactionlog_set)
# We use a fallback Any type:
reveal_type(Transaction.objects)
reveal_type(Transaction.objects.custom())
class TransactionLog(models.Model):
transaction = models.ForeignKey(Transaction, on_delete=models.CASCADE)
out: |
myapp/models:14: note: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.TransactionLog]"
myapp/models:16: note: Revealed type is "myapp.models.ManagerFromTransactionQuerySet[myapp.models.Transaction]"
myapp/models:17: note: Revealed type is "None"
- case: resolve_primary_keys_for_foreign_keys_with_abstract_self_model
main: |
from typing_extensions import reveal_type
from myapp.models import User
reveal_type(User().parent) # N: Revealed type is "myapp.models.AbstractUser"
reveal_type(User().parent_id) # N: Revealed type is "int"
reveal_type(User().parent2) # N: Revealed type is "myapp.models.AbstractUser | None"
reveal_type(User().parent2_id) # N: Revealed type is "int | None"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class AbstractUser(models.Model):
parent = models.ForeignKey('self', on_delete=models.CASCADE)
parent2 = models.ForeignKey('self', null=True, on_delete=models.CASCADE)
class Meta:
abstract = True
class User(AbstractUser):
pass
- case: nullable_foreign_key_with_init_overridden
main: |
from typing_extensions import reveal_type
from myapp.models import A
reveal_type(A.objects.get().b) # N: Revealed type is "myapp.models.B | None"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing import Any
from typing_extensions import TypeVar
from django.db import models
_ST = TypeVar("_ST", contravariant=True)
_GT = TypeVar("_GT", covariant=True)
class FK(models.ForeignKey[_ST, _GT]):
def __init__(self, *args: Any, **kwargs: Any) -> None:
kwargs.setdefault('on_delete', models.CASCADE)
super().__init__(*args, **kwargs)
class B(models.Model): ...
class A(models.Model):
b = FK(B, null=True, on_delete=models.CASCADE)
- case: related_manager_is_a_subclass_of_default_manager
main: |
from typing_extensions import reveal_type
from myapp.models import User, Order, Product
reveal_type(User().orders) # N: Revealed type is "myapp.models.Order_RelatedManager"
reveal_type(User().orders.get()) # N: Revealed type is "myapp.models.Order"
reveal_type(User().orders.manager_method()) # N: Revealed type is "int"
reveal_type(Product.objects.queryset_method()) # N: Revealed type is "int"
reveal_type(Order().products) # N: Revealed type is "myapp.models.Product_RelatedManager"
reveal_type(Order().products.get()) # N: Revealed type is "myapp.models.Product"
reveal_type(Order().products.queryset_method()) # N: Revealed type is "int"
cond: bool
if cond:
manager = User().products
else:
manager = Order().products
reveal_type(manager) # N: Revealed type is "myapp.models.Product_RelatedManager"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
pass
class OrderManager(models.Manager):
def manager_method(self) -> int:
raise NotImplementedError
class Order(models.Model):
objects = OrderManager()
user = models.ForeignKey(to=User, on_delete=models.CASCADE, related_name='orders')
class ProductQueryset(models.QuerySet):
def queryset_method(self) -> int:
raise NotImplementedError
ProductManager = models.Manager.from_queryset(ProductQueryset)
class Product(models.Model):
objects = ProductManager()
order = models.ForeignKey(to=Order, on_delete=models.CASCADE, related_name='products')
user = models.ForeignKey(to=User, on_delete=models.CASCADE, related_name='products')
- case: related_manager_shared_between_multiple_relations
main: |
from typing_extensions import reveal_type
from myapp.models.store import Store
from myapp.models.user import User
reveal_type(Store().purchases) # N: Revealed type is "myapp.models.purchase.Purchase_RelatedManager"
reveal_type(Store().purchases.queryset_method()) # N: Revealed type is "myapp.models.querysets.PurchaseQuerySet[myapp.models.purchase.Purchase, myapp.models.purchase.Purchase]"
reveal_type(Store().purchases.filter()) # N: Revealed type is "myapp.models.querysets.PurchaseQuerySet[myapp.models.purchase.Purchase, myapp.models.purchase.Purchase]"
reveal_type(Store().purchases.get()) # N: Revealed type is "myapp.models.purchase.Purchase"
reveal_type(Store().purchases.filter().queryset_method()) # N: Revealed type is "myapp.models.querysets.PurchaseQuerySet[myapp.models.purchase.Purchase, myapp.models.purchase.Purchase]"
reveal_type(User().purchases) # N: Revealed type is "myapp.models.purchase.Purchase_RelatedManager"
reveal_type(User().purchases.queryset_method()) # N: Revealed type is "myapp.models.querysets.PurchaseQuerySet[myapp.models.purchase.Purchase, myapp.models.purchase.Purchase]"
reveal_type(User().purchases.filter()) # N: Revealed type is "myapp.models.querysets.PurchaseQuerySet[myapp.models.purchase.Purchase, myapp.models.purchase.Purchase]"
reveal_type(User().purchases.get()) # N: Revealed type is "myapp.models.purchase.Purchase"
reveal_type(User().purchases.filter().queryset_method()) # N: Revealed type is "myapp.models.querysets.PurchaseQuerySet[myapp.models.purchase.Purchase, myapp.models.purchase.Purchase]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models/__init__.py
content: |
from .purchase import Purchase
from .store import Store
from .user import User
- path: myapp/models/store.py
content: |
from django.db import models
class Store(models.Model):
...
- path: myapp/models/user.py
content: |
from django.db import models
class User(models.Model):
...
- path: myapp/models/querysets.py
content: |
from django.db.models import QuerySet
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from .purchase import Purchase
class PurchaseQuerySet(QuerySet['Purchase']):
def queryset_method(self) -> "PurchaseQuerySet":
return self.all()
- path: myapp/models/purchase.py
content: |
from django.db import models
from django.db.models.manager import Manager
from .querysets import PurchaseQuerySet
from .store import Store
from .user import User
PurchaseManager = Manager.from_queryset(PurchaseQuerySet)
class Purchase(models.Model):
objects = PurchaseManager()
store = models.ForeignKey(to=Store, on_delete=models.CASCADE, related_name='purchases')
user = models.ForeignKey(to=User, on_delete=models.CASCADE, related_name='purchases')
- case: explicitly_declared_related_manager_is_not_overridden
main: |
from typing_extensions import reveal_type
from myapp.models import User
reveal_type(User().purchases) # N: Revealed type is "int"
User().purchases.filter() # E: "int" has no attribute "filter" [attr-defined]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from django.db.models.manager import Manager
class User(models.Model):
purchases: int
class PurchaseQuerySet(models.QuerySet['Purchase']):
def queryset_method(self) -> "PurchaseQuerySet":
return self.all()
PurchaseManager = Manager.from_queryset(PurchaseQuerySet)
class Purchase(models.Model):
objects = PurchaseManager()
user = models.ForeignKey(to=User, on_delete=models.CASCADE, related_name='purchases')
- case: related_manager_no_conflict_from_star_import
main: |
import myapp.models
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models/__init__.py
content: |
from myapp.models.a import *
# make sure generated related manager from address to user doesn't have
# the same name with related manager from profile to user
from myapp.models.b import *
- path: myapp/models/a.py
content: |
from django.db import models
class Address(models.Model):
pass
- path: myapp/models/b.py
content: |
from django.db import models
from .a import Address
class Profile(models.Model):
pass
class UserQuerySet(models.QuerySet):
pass
UserManager = models.Manager.from_queryset(UserQuerySet)
class User(models.Model):
address = models.ForeignKey(Address, on_delete=models.CASCADE)
profile = models.ForeignKey(Profile, on_delete=models.CASCADE)
objects = UserManager()
- case: many_to_many_field_can_be_used_in_alias
main: |
from collections.abc import Sequence
from typing_extensions import TypeAlias, TypeVar
from django.db import models
T = TypeVar("T", bound=models.Model)
ManyToManyFieldAlias: TypeAlias = models.ManyToManyField[T, T]
- case: callable_reverse_manager
main: |
from typing_extensions import reveal_type
from myapp.models import SalesMan
sales_man = SalesMan()
reveal_type(sales_man.client) # N: Revealed type is "myapp.models.CustomUser_ManyRelatedManager[myapp.models.SalesMan_client]"
reveal_type(sales_man.client(manager="staffs")) # N: Revealed type is "django.db.models.fields.related_descriptors.ManyRelatedManager[myapp.models.CustomUser, myapp.models.SalesMan_client]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class CustomUser(models.Model):
staffs = models.Manager()
class SalesMan(models.Model):
client = models.ManyToManyField(CustomUser)
- case: test_fails_if_app_label_is_unknown_in_relation_field
main: |
from installed.models import InstalledModel
InstalledModel.objects.filter(non_installed__isnull=True)
installed_apps:
- installed
files:
- path: installed/__init__.py
- path: installed/models.py
content: |
from django.db import models
class InstalledModel(models.Model):
non_installed = models.ForeignKey( # E: Cannot find model 'not_installed.NonInstalledModel' referenced in field 'non_installed' [misc]
"not_installed.NonInstalledModel", on_delete=models.CASCADE
)
- case: test_foreign_key_to_as_string
main: |
from myapp.models import Book, Publisher
publisher = Publisher.objects.create(name="Example Publisher")
book = Book.objects.create(name="Book", publisher=publisher)
Book.objects.filter(publisher=publisher)
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models/__init__.py
content: |
from django.db import models
from django.db.models.query import QuerySet
class Publisher(models.Model):
name = models.CharField()
class PrintedGood(models.Model):
publisher = models.ForeignKey(to="myapp.Publisher", on_delete=models.CASCADE)
class Meta:
abstract = True
class Book(PrintedGood):
name = models.CharField()
- case: test_foreign_key_to_as_string_filter_on_abstract
main: |
from myapp.models import Book, Publisher
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models/__init__.py
content: |
from django.db import models
from django.db.models.query import QuerySet
class Publisher(models.Model):
name = models.CharField()
class MyModel(models.Model):
pass
class PrintedGood(MyModel):
publisher = models.ForeignKey(to="myapp.Publisher", on_delete=models.CASCADE)
@property
def siblings(self) -> QuerySet['PrintedGood']:
return self.__class__.objects.filter(publisher=self.publisher)
class Meta:
abstract = True
class Book(PrintedGood):
name = models.CharField()
- case: test_explicit_reverse_many_to_one_descriptor
main: |
from typing_extensions import reveal_type
from myapp.models import Other
reveal_type(Other.explicit_descriptor) # N: Revealed type is "django.db.models.fields.related_descriptors.ReverseManyToOneDescriptor[myapp.models.MyModel]"
reveal_type(Other().explicit_descriptor) # N: Revealed type is "myapp.models.MyModel_RelatedManager"
reveal_type(Other().explicit_descriptor.custom_method()) # N: Revealed type is "int"
installed_apps:
- myapp
monkeypatch: true
files:
- path: myapp/__init__.py
- path: myapp/models/__init__.py
content: |
from typing import ClassVar
from django.db import models
from django.db.models.fields.related_descriptors import ReverseManyToOneDescriptor
class Other(models.Model):
explicit_descriptor: ClassVar[ReverseManyToOneDescriptor["MyModel"]]
class CustomManager(models.Manager["MyModel"]):
def custom_method(self) -> int:
raise NotImplementedError
class MyModel(models.Model):
rel = models.ForeignKey(
Other, on_delete=models.CASCADE, related_name="explicit_descriptor"
)
objects = CustomManager()
- case: test_reverse_one_to_one_descriptor
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel, Other
reveal_type(MyModel.first.RelatedObjectDoesNotExist)
reveal_type(Other.mymodel)
reveal_type(Other.mymodel.get_queryset(instance=MyModel()))
reveal_type(Other.mymodel.RelatedObjectDoesNotExist)
reveal_type(Other.has_explicit_name.RelatedObjectDoesNotExist)
try:
other = Other.objects.get()
reveal_type(other.mymodel)
except Other.mymodel.RelatedObjectDoesNotExist:
...
else:
other.mymodel = MyModel()
other.mymodel = Other()
other.mymodel = None
other.has_explicit_name = MyModel()
other.has_explicit_name = Other()
other.has_explicit_name = None
out: |
main:3: note: Revealed type is "type[django.core.exceptions.ObjectDoesNotExist]"
main:4: note: Revealed type is "django.db.models.fields.related_descriptors.ReverseOneToOneDescriptor[myapp.models.Other, myapp.models.MyModel]"
main:5: note: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel, myapp.models.MyModel]"
main:6: note: Revealed type is "type[django.core.exceptions.ObjectDoesNotExist]"
main:7: note: Revealed type is "type[django.core.exceptions.ObjectDoesNotExist]"
main:10: note: Revealed type is "myapp.models.MyModel"
main:15: error: Incompatible types in assignment (expression has type "Other", variable has type "MyModel | None") [assignment]
main:18: error: Incompatible types in assignment (expression has type "Other", variable has type "MyModel | None") [assignment]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models/__init__.py
content: |
from django.db import models
class Other(models.Model):
...
class MyModel(models.Model):
first = models.OneToOneField(Other, on_delete=models.CASCADE)
second = models.OneToOneField(
Other, on_delete=models.CASCADE, related_name="has_explicit_name"
)
- case: test_many_to_many
skip: __import__("django").VERSION < (6, 0)
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel, Other
reveal_type(MyModel.auto_through.through.objects.get())
reveal_type(MyModel().auto_through.get())
reveal_type(Other().autos.get())
reveal_type(MyModel.custom_through.through.objects.get())
reveal_type(MyModel().custom_through.get())
reveal_type(MyModel.custom_through.through.objects.custom_qs_method())
reveal_type(Other().customs.get())
auto_through = MyModel.auto_through.through.objects.get()
reveal_type(auto_through.id)
reveal_type(auto_through.pk)
reveal_type(auto_through.mymodel)
reveal_type(auto_through.mymodel_id)
reveal_type(auto_through.other)
reveal_type(auto_through.other_id)
reveal_type(MyModel.auto_through.through)
reveal_type(MyModel.auto_through.through.mymodel)
reveal_type(MyModel.auto_through.through._default_manager)
reveal_type(MyModel.other_again.through)
reveal_type(Other.autos)
reveal_type(Other.autos.through)
reveal_type(Other.autos.through.objects.get())
reveal_type(Other().autos.custom_qs_method())
reveal_type(Other().customs.custom_qs_method())
reveal_type(Other().autos.add)
reveal_type(Other.autos.through.objects)
reveal_type(Other.autos.through._default_manager)
reveal_type(MyModel().auto_through)
reveal_type(MyModel().auto_through.through)
reveal_type(MyModel().auto_through.through.mymodel_id)
reveal_type(MyModel().other_again)
reveal_type(MyModel().other_again.through)
reveal_type(MyModel().other_again.through.mymodel_id)
reveal_type(MyModel().custom_through)
reveal_type(MyModel().custom_through.through)
reveal_type(MyModel().custom_through.through.my_model_id)
out: |
main:3: note: Revealed type is "myapp.models.MyModel_auto_through"
main:4: note: Revealed type is "myapp.models.Other"
main:5: note: Revealed type is "myapp.models.MyModel"
main:7: note: Revealed type is "myapp.models.CustomThrough"
main:8: note: Revealed type is "myapp.models.Other"
main:9: note: Revealed type is "int"
main:10: note: Revealed type is "myapp.models.MyModel"
main:13: note: Revealed type is "int"
main:14: note: Revealed type is "int"
main:15: note: Revealed type is "myapp.models.MyModel"
main:16: note: Revealed type is "int"
main:17: note: Revealed type is "myapp.models.Other"
main:18: note: Revealed type is "int"
main:20: note: Revealed type is "type[myapp.models.MyModel_auto_through]"
main:21: note: Revealed type is "django.db.models.fields.related_descriptors.ForwardManyToOneDescriptor[django.db.models.fields.related.ForeignKey[myapp.models.MyModel | django.db.models.expressions.Combinable, myapp.models.MyModel]]"
main:22: note: Revealed type is "django.db.models.manager.Manager[myapp.models.MyModel_auto_through]"
main:24: note: Revealed type is "type[myapp.models.MyModel_other_again]"
main:25: note: Revealed type is "django.db.models.fields.related_descriptors.ManyToManyDescriptor[myapp.models.MyModel, myapp.models.MyModel_auto_through]"
main:26: note: Revealed type is "type[myapp.models.MyModel_auto_through]"
main:27: note: Revealed type is "myapp.models.MyModel_auto_through"
main:29: note: Revealed type is "str"
main:30: note: Revealed type is "str"
main:31: note: Revealed type is "def (*objs: myapp.models.MyModel | int, through_defaults: typing.Mapping[str, Any] | None =)"
main:33: note: Revealed type is "django.db.models.manager.Manager[myapp.models.MyModel_auto_through]"
main:34: note: Revealed type is "django.db.models.manager.Manager[myapp.models.MyModel_auto_through]"
main:36: note: Revealed type is "myapp.models.Other_ManyRelatedManager[myapp.models.MyModel_auto_through]"
main:37: note: Revealed type is "type[myapp.models.MyModel_auto_through]"
main:38: note: Revealed type is "django.db.models.fields._FieldDescriptor[django.db.models.fields.BigAutoField[float | int | str | django.db.models.expressions.Combinable | None, int]]"
main:39: note: Revealed type is "myapp.models.Other_ManyRelatedManager[myapp.models.MyModel_other_again]"
main:40: note: Revealed type is "type[myapp.models.MyModel_other_again]"
main:41: note: Revealed type is "django.db.models.fields._FieldDescriptor[django.db.models.fields.BigAutoField[float | int | str | django.db.models.expressions.Combinable | None, int]]"
main:42: note: Revealed type is "myapp.models.Other_ManyRelatedManager[myapp.models.CustomThrough]"
main:43: note: Revealed type is "type[myapp.models.CustomThrough]"
main:44: note: Revealed type is "django.db.models.fields._FieldDescriptor[django.db.models.fields.BigAutoField[float | int | str | django.db.models.expressions.Combinable, int]]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models/__init__.py
content: |
from django.db import models
class Other(models.Model):
...
class CustomThroughQuerySet(models.QuerySet["CustomThrough"]):
def custom_qs_method(self) -> int:
return 1
CustomThroughManager = models.Manager.from_queryset(CustomThroughQuerySet)
class CustomThrough(models.Model):
other = models.ForeignKey(Other, on_delete=models.CASCADE)
my_model = models.ForeignKey("myapp.MyModel", on_delete=models.CASCADE)
objects = CustomThroughManager()
class MyModelQuerySet(models.QuerySet["MyModel"]):
def custom_qs_method(self) -> str:
return "abc"
MyModelManager = models.Manager.from_queryset(MyModelQuerySet)
class MyModel(models.Model):
auto_through = models.ManyToManyField(Other, related_name="autos")
# Have multiple M2Ms with implicit through
other_again = models.ManyToManyField(Other, related_name="others_again")
custom_through = models.ManyToManyField(Other, through=CustomThrough, related_name="customs")
objects = MyModelManager()
- case: test_many_to_many_with_lazy_references
main: |
from typing_extensions import reveal_type
from first.models import First
reveal_type(First().thirds.get())
reveal_type(First.thirds.through.objects.get())
reveal_type(First.thirds.through.objects.get().first)
reveal_type(First.thirds.through.objects.get().third)
from third.models import Third
reveal_type(Third().fourths.get())
reveal_type(Third.fourths.through.objects.get())
out: |
main:3: note: Revealed type is "third.models.Third"
main:4: note: Revealed type is "second.models.Second"
main:5: note: Revealed type is "first.models.First"
main:6: note: Revealed type is "third.models.Third"
main:9: note: Revealed type is "third.models.Fourth"
main:10: note: Revealed type is "third.models.Third_fourths"
installed_apps:
- first
- second
- third
files:
- path: first/__init__.py
- path: first/models/__init__.py
content: |
from django.db import models
class First(models.Model):
thirds = models.ManyToManyField("third.Third", through="second.Second")
- path: second/__init__.py
- path: second/models/__init__.py
content: |
from django.db import models
class Second(models.Model):
first = models.ForeignKey("first.First", on_delete=models.CASCADE)
third = models.ForeignKey("third.Third", on_delete=models.CASCADE)
- path: third/__init__.py
- path: third/models/__init__.py
content: |
from django.db import models
class Third(models.Model):
fourths = models.ManyToManyField("third.Fourth", blank=True)
class Fourth(models.Model):
...
- case: test_many_to_many_with_unresolvable_through_model
main: |
from typing_extensions import reveal_type
from myapp.models import First, Other
reveal_type(Other().first_set)
reveal_type(First().others)
out: |
main:3: error: "Other" has no attribute "first_set" [attr-defined]
main:3: note: Revealed type is "Any"
main:4: note: Revealed type is "django.db.models.fields.related_descriptors.ManyRelatedManager[myapp.models.Other, Never]"
myapp/models:4: error: Could not match lazy reference with any model [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class First(models.Model):
others = models.ManyToManyField("myapp.Other", through="myapp.Missing")
class Other(models.Model):
...
- case: test_many_to_many_lazy_references_with_implicit_app_label
main: |
from typing_extensions import reveal_type
from myapp.models import Child
reveal_type(Child.parents)
reveal_type(Child().parents)
out: |
main:3: note: Revealed type is "django.db.models.fields.related_descriptors.ManyToManyDescriptor[Any, Any]"
main:4: note: Revealed type is "django.db.models.fields.related_descriptors.ManyRelatedManager[Any, Any]"
myapp/models/child:5: error: Need type annotation for "parents" [var-annotated]
myapp/models/child:6: error: Need type annotation for "other_parents" [var-annotated]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models/__init__.py
content: |
from .child import Child as Child
from .parent import Parent as Parent
- path: myapp/models/parent.py
content: |
from django.db import models
class Parent(models.Model):
...
- path: myapp/models/child.py
content: |
from django.db import models
class Child(models.Model):
# Reference without explicit app label
parents = models.ManyToManyField("Parent")
other_parents = models.ManyToManyField(to="Parent")
- case: test_relations_with_bad_arguments
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
def f(arg: type[MyModel]) -> MyModel:
instance = arg(field=1, unknown=2)
reveal_type(instance.field) # N: Revealed type is "Any"
reveal_type(instance.unknown) # N: Revealed type is "Any"
reveal_type(instance.bad) # N: Revealed type is "django.db.models.fields.related_descriptors.ManyRelatedManager[Any, Any]"
return instance
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyModel(models.Model):
field = models.ForeignKey("slef", on_delete=models.CASCADE) # E: Cannot find model 'slef' referenced in field 'field' [misc]
unknown = models.OneToOneField("unknown", on_delete=models.CASCADE) # E: Cannot find model 'unknown' referenced in field 'unknown' [misc]
bad = models.ManyToManyField("bad") # E: Need type annotation for "bad" [var-annotated]
- case: test_reverse_of_inherited_many_to_many_fields
main: |
from typing_extensions import reveal_type
from myapp.models import Other
other = Other()
reveal_type(other.abstract_of_concrete_parent) # N: Revealed type is "myapp.models.ConcreteParent_ManyRelatedManager[myapp.models.ConcreteParent_m2m_1]"
reveal_type(other.concrete_parent) # N: Revealed type is "myapp.models.ConcreteParent_ManyRelatedManager[myapp.models.ConcreteParent_m2m_2]"
reveal_type(other.abstract_of_abstract_parent) # N: Revealed type is "myapp.models.MyModel_ManyRelatedManager[myapp.models.MyModel_m2m_3]"
reveal_type(other.abstract_parent) # N: Revealed type is "myapp.models.MyModel_ManyRelatedManager[myapp.models.MyModel_m2m_4]"
reveal_type(other.mymodel) # N: Revealed type is "myapp.models.MyModel_ManyRelatedManager[myapp.models.MyModel_m2m_5]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Other(models.Model):
...
class AbstractOfConcreteParent(models.Model):
m2m_1 = models.ManyToManyField(Other, related_name="abstract_of_concrete_parent")
class Meta:
abstract = True
class ConcreteParent(AbstractOfConcreteParent):
m2m_2 = models.ManyToManyField(Other, related_name="concrete_parent")
class AbstractOfAbstractParent(models.Model):
m2m_3 = models.ManyToManyField(Other, related_name="abstract_of_abstract_parent")
class Meta:
abstract = True
class AbstractParent(AbstractOfAbstractParent):
m2m_4 = models.ManyToManyField(Other, related_name="abstract_parent")
class Meta:
abstract = True
class MyModel(ConcreteParent, AbstractParent):
m2m_5 = models.ManyToManyField(Other, related_name="mymodel")
- case: test_m2m_related_managers_supports_renamed_imports
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
from other.models import Other
reveal_type(MyModel.m2m_1.through.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.MyModel_m2m_1]"
reveal_type(Other.auto_through.through.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.MyModel_m2m_1]"
reveal_type(MyModel.m2m_2.through.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.Through]"
reveal_type(Other.custom_through.through.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.Through]"
installed_apps:
- other
- myapp
files:
- path: other/__init__.py
- path: other/models.py
content: |
from django.db import models
class Other(models.Model):
...
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from other import models as other_models
class Through(models.Model):
mymodel = models.ForeignKey("myapp.MyModel", on_delete=models.CASCADE)
other = models.ForeignKey(other_models.Other, on_delete=models.CASCADE)
class MyModel(models.Model):
m2m_1 = models.ManyToManyField(other_models.Other, related_name="auto_through")
m2m_2 = models.ManyToManyField(other_models.Other, related_name="custom_through", through=Through)
- case: test_m2m_from_abstract_model
main: |
from typing_extensions import reveal_type
from myapp.models import First, Second
reveal_type(First().others) # N: Revealed type is "myapp.models.Other_ManyRelatedManager[myapp.models.First_others]"
reveal_type(First().others.get()) # N: Revealed type is "myapp.models.Other"
reveal_type(First.others) # N: Revealed type is "django.db.models.fields.related_descriptors.ManyToManyDescriptor[myapp.models.Other, myapp.models.First_others]"
reveal_type(First.others.through) # N: Revealed type is "type[myapp.models.First_others]"
reveal_type(First.others.through.objects.get()) # N: Revealed type is "myapp.models.First_others"
reveal_type(Second().others) # N: Revealed type is "myapp.models.Other_ManyRelatedManager[myapp.models.Second_others]"
reveal_type(Second().others.get()) # N: Revealed type is "myapp.models.Other"
reveal_type(Second.others) # N: Revealed type is "django.db.models.fields.related_descriptors.ManyToManyDescriptor[myapp.models.Other, myapp.models.Second_others]"
reveal_type(Second.others.through) # N: Revealed type is "type[myapp.models.Second_others]"
reveal_type(Second.others.through.objects.get()) # N: Revealed type is "myapp.models.Second_others"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Other(models.Model):
...
class Parent(models.Model):
others = models.ManyToManyField(Other)
class Meta:
abstract = True
class First(Parent):
...
class Second(Parent):
...
- case: test_m2m_self_on_abstract_model
main: |
from typing_extensions import reveal_type
from myapp.models import First, Second
reveal_type(First().others) # N: Revealed type is "myapp.models.First_ManyRelatedManager[myapp.models.First_others]"
reveal_type(First().others.get()) # N: Revealed type is "myapp.models.First"
reveal_type(First.others) # N: Revealed type is "django.db.models.fields.related_descriptors.ManyToManyDescriptor[myapp.models.First, myapp.models.First_others]"
reveal_type(First.others.through) # N: Revealed type is "type[myapp.models.First_others]"
reveal_type(First.others.through.objects.get()) # N: Revealed type is "myapp.models.First_others"
reveal_type(Second().others) # N: Revealed type is "myapp.models.Second_ManyRelatedManager[myapp.models.Second_others]"
reveal_type(Second().others.get()) # N: Revealed type is "myapp.models.Second"
reveal_type(Second.others) # N: Revealed type is "django.db.models.fields.related_descriptors.ManyToManyDescriptor[myapp.models.Second, myapp.models.Second_others]"
reveal_type(Second.others.through) # N: Revealed type is "type[myapp.models.Second_others]"
reveal_type(Second.others.through.objects.get()) # N: Revealed type is "myapp.models.Second_others"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Parent(models.Model):
others = models.ManyToManyField("self")
class Meta:
abstract = True
class First(Parent):
...
class Second(Parent):
...
- case: test_m2m_models_manager_filter_kwargs_checked
main: |
from myapp.models import MyModel, Other
MyModel.objects.filter(xyz__isnull=False) # E: Cannot resolve keyword 'xyz' into field. Choices are: id, others [misc]
MyModel.objects.get(xyz__isnull=False) # E: Cannot resolve keyword 'xyz' into field. Choices are: id, others [misc]
MyModel.objects.exclude(xyz__isnull=False) # E: Cannot resolve keyword 'xyz' into field. Choices are: id, others [misc]
other = Other()
other.mymodel_set.filter(xyz__isnull=True) # E: Cannot resolve keyword 'xyz' into field. Choices are: id, others [misc]
other.mymodel_set.get(xyz__isnull=True) # E: Cannot resolve keyword 'xyz' into field. Choices are: id, others [misc]
other.mymodel_set.exclude(xyz__isnull=True) # E: Cannot resolve keyword 'xyz' into field. Choices are: id, others [misc]
MyModel.others.through.objects.filter(xyz__isnull=False) # E: Cannot resolve keyword 'xyz' into field. Choices are: id, mymodel, mymodel_id, other, other_id [misc]
MyModel.others.through.objects.get(xyz__isnull=False) # E: Cannot resolve keyword 'xyz' into field. Choices are: id, mymodel, mymodel_id, other, other_id [misc]
MyModel.others.through.objects.exclude(xyz__isnull=False) # E: Cannot resolve keyword 'xyz' into field. Choices are: id, mymodel, mymodel_id, other, other_id [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Other(models.Model):
...
class MyModel(models.Model):
others = models.ManyToManyField(Other)
- case: test_reverse_m2m_relation_checks_other_model
main: |
from typing_extensions import reveal_type
from myapp.models import Author
# With builtin manager/queryset
Author().book_set.filter(featured=True)
Author().book_set.filter(xyz=True) # E: Cannot resolve keyword 'xyz' into field. Choices are: authors, featured, id [misc]
reveal_type(Author().book_set.values_list("featured")) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Book, tuple[bool]]"
Author().book_set.values_list("xyz") # E: Cannot resolve keyword 'xyz' into field. Choices are: authors, featured, id [misc]
reveal_type(Author().book_set.values("featured")) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Book, TypedDict({'featured': bool})]"
Author().book_set.values("xyz") # E: Cannot resolve keyword 'xyz' into field. Choices are: authors, featured, id [misc]
reveal_type(Author().book_set.filter(featured=True).values_list("featured")) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Book, tuple[bool]]"
Author().book_set.filter(featured=True).values_list("xyz") # E: Cannot resolve keyword 'xyz' into field. Choices are: authors, featured, id [misc]
reveal_type(Author().book_set.filter(featured=True).values("featured")) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Book, TypedDict({'featured': bool})]"
Author().book_set.filter(featured=True).values("xyz") # E: Cannot resolve keyword 'xyz' into field. Choices are: authors, featured, id [misc]
# With a custom manager/queryset
Author().other_set.filter(featured=True)
Author().other_set.filter(xyz=True) # E: Cannot resolve keyword 'xyz' into field. Choices are: authors, featured, id [misc]
reveal_type(Author().other_set.values_list("featured")) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Other, tuple[bool]]"
Author().other_set.values_list("xyz") # E: Cannot resolve keyword 'xyz' into field. Choices are: authors, featured, id [misc]
reveal_type(Author().other_set.values("featured")) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Other, TypedDict({'featured': bool})]"
Author().other_set.values("xyz") # E: Cannot resolve keyword 'xyz' into field. Choices are: authors, featured, id [misc]
reveal_type(Author().other_set.filter(featured=True).values_list("featured")) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Other, tuple[bool]]"
Author().other_set.filter(featured=True).values_list("xyz") # E: Cannot resolve keyword 'xyz' into field. Choices are: authors, featured, id [misc]
reveal_type(Author().other_set.filter(featured=True).values("featured")) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Other, TypedDict({'featured': bool})]"
Author().other_set.filter(featured=True).values("xyz") # E: Cannot resolve keyword 'xyz' into field. Choices are: authors, featured, id [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing_extensions import Self
from django.db import models
class Author(models.Model):
...
class Book(models.Model):
featured = models.BooleanField(default=False)
authors = models.ManyToManyField(Author)
class OtherQuerySet(models.QuerySet["Other"]):
def custom(self) -> Self:
raise NotImplementedError
OtherManager = models.Manager.from_queryset(OtherQuerySet)
class Other(models.Model):
featured = models.BooleanField()
authors = models.ManyToManyField(Author)
objects = OtherManager()
- case: test_many_to_many_field_null
main: |
from typing_extensions import reveal_type
from django.db import models
class Person(models.Model):
friends = models.ManyToManyField("self", null=True, blank=True)
p: Person
reveal_type(p.friends) # N: Revealed type is "django.db.models.fields.related_descriptors.ManyRelatedManager[main.Person, main.Person_friends]"
typeddjango-django-stubs-fa03b48/tests/typecheck/managers/ 0000775 0000000 0000000 00000000000 15260643574 0023763 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/ 0000775 0000000 0000000 00000000000 15260643574 0026027 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_aggregate.yml 0000664 0000000 0000000 00000001322 15260643574 0031535 0 ustar 00root root 0000000 0000000 - case: aggregate_filter_accepts_exists_expression
main: |
from django.db.models import Count, Exists, OuterRef
from myapp.models import Blog, Entry
Blog.objects.aggregate(
entry_count=Count("id", filter=Exists(Entry.objects.filter(blog_id=OuterRef("id")))),
)
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Blog(models.Model):
name = models.CharField(max_length=100)
class Entry(models.Model):
blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_annotate.yml 0000664 0000000 0000000 00000137602 15260643574 0031433 0 ustar 00root root 0000000 0000000 - case: annotate_using_with_annotations
main: |
from typing_extensions import Annotated, reveal_type
from myapp.models import User
from django_stubs_ext import WithAnnotations, Annotations
from django.db.models.expressions import Value
annotated_user = User.objects.annotate(foo=Value("")).get()
unannotated_user = User.objects.get(id=1)
print(annotated_user.asdf) # E: "User@AnnotatedWith[TypedDict({'foo': Any})]" has no attribute "asdf" [attr-defined]
print(unannotated_user.asdf) # E: "User" has no attribute "asdf" [attr-defined]
def func(user: Annotated[User, Annotations]) -> None: # E: Missing required TypedDict parameter for generic type Annotations [misc]
user.asdf # E: "User" has no attribute "asdf" [attr-defined]
# Due to the error on 'func' it should fall back to expecting 'User'
reveal_type(func) # N: Revealed type is "def (user: myapp.models.User)"
func(unannotated_user)
func(annotated_user)
def func2(user: WithAnnotations[User]) -> None:
user.asdf # E: "User" has no attribute "asdf" [attr-defined]
# With only one argument to 'WithAnnotations' it should fall back to expecting 'User'
reveal_type(func2) # N: Revealed type is "def (user: myapp.models.User)"
func2(unannotated_user)
func2(annotated_user)
def func3(user: WithAnnotations) -> None:
raise NotImplementedError
# With no arguments to 'WithAnnotations' it should become 'Any'
reveal_type(func3) # N: Revealed type is "def (user: Any)"
func3(unannotated_user)
func3(annotated_user)
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
username = models.CharField(max_length=100)
- case: annotate_using_with_annotations_typeddict
main: |
from typing import Any
from typing_extensions import Annotated, TypedDict, reveal_type
from myapp.models import User
from django_stubs_ext import WithAnnotations, Annotations
from django.db.models.expressions import Value
class MyDict(TypedDict):
foo: str
def func(user: Annotated[User, Annotations[MyDict]]) -> str:
print(user.asdf) # E: "User@AnnotatedWith[MyDict]" has no attribute "asdf" [attr-defined]
return user.foo
unannotated_user = User.objects.get(id=1)
annotated_user = User.objects.annotate(foo=Value("")).get()
other_annotated_user = User.objects.annotate(other=Value("")).get()
func(unannotated_user) # E: Argument 1 to "func" has incompatible type "User"; expected "User@AnnotatedWith[MyDict]" [arg-type]
x: WithAnnotations[User]
# Declaring nothing annotated returns a user
reveal_type(x) # N: Revealed type is "myapp.models.User"
func(x) # E: Argument 1 to "func" has incompatible type "User"; expected "User@AnnotatedWith[MyDict]" [arg-type]
func(annotated_user)
func(other_annotated_user) # E: Argument 1 to "func" has incompatible type "User@AnnotatedWith[TypedDict({'other': Any})]"; expected "User@AnnotatedWith[MyDict]" [arg-type]
def func2(user: WithAnnotations[User, MyDict]) -> str:
print(user.asdf) # E: "User@AnnotatedWith[MyDict]" has no attribute "asdf" [attr-defined]
return user.foo
func2(unannotated_user) # E: Argument 1 to "func2" has incompatible type "User"; expected "User@AnnotatedWith[MyDict]" [arg-type]
func2(annotated_user)
func2(other_annotated_user) # E: Argument 1 to "func2" has incompatible type "User@AnnotatedWith[TypedDict({'other': Any})]"; expected "User@AnnotatedWith[MyDict]" [arg-type]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
username = models.CharField(max_length=100)
- case: annotate_using_with_annotations_typeddict_subtypes
main: |
from typing_extensions import Annotated, TypedDict
from myapp.models import User
from django_stubs_ext import WithAnnotations, Annotations
class BroadDict(TypedDict):
foo: str
bar: str
class NarrowDict(TypedDict):
foo: str
class OtherDict(TypedDict):
other: str
def func(user: WithAnnotations[User, NarrowDict]) -> str:
return user.foo
x: WithAnnotations[User, NarrowDict]
func(x)
y: WithAnnotations[User, BroadDict]
func(y)
z: WithAnnotations[User, OtherDict]
func(z) # E: Argument 1 to "func" has incompatible type "User@AnnotatedWith[OtherDict]"; expected "User@AnnotatedWith[NarrowDict]" [arg-type]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
username = models.CharField(max_length=100)
- case: annotate_basic
main: |
from typing_extensions import reveal_type
from myapp.models import User
from django.db.models.expressions import F
qs = User.objects.annotate(foo=F('id'))
reveal_type(qs) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.User@AnnotatedWith[TypedDict({'foo': Any})], myapp.models.User@AnnotatedWith[TypedDict({'foo': Any})]]"
annotated = qs.get()
reveal_type(annotated) # N: Revealed type is "myapp.models.User@AnnotatedWith[TypedDict({'foo': Any})]"
reveal_type(annotated.foo) # N: Revealed type is "Any"
print(annotated.bar) # E: "User@AnnotatedWith[TypedDict({'foo': Any})]" has no attribute "bar" [attr-defined]
reveal_type(annotated.username) # N: Revealed type is "str"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
username = models.CharField(max_length=100)
- case: annotate_positional_aggregate_uses_default_alias
main: |
from typing_extensions import reveal_type
from myapp.models import User
from django.db.models import Count
# Positional Aggregate gets Django's default_alias: __.
user = User.objects.annotate(Count('id')).get()
reveal_type(user.id__count) # N: Revealed type is "int"
# Multiple positional aggregates produce multiple default aliases.
multi = User.objects.annotate(Count('id'), Count('username')).get()
reveal_type(multi.id__count) # N: Revealed type is "int"
reveal_type(multi.username__count) # N: Revealed type is "int"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
username = models.CharField(max_length=100)
- case: annotate_model_usage_across_methods
main: |
from myapp.models import User, Animal
from django.db.models import Count
qs = User.objects.annotate(Count('id'))
annotated_user = qs.get()
def animals_only(param: Animal) -> None:
raise NotImplementedError
animals_only(annotated_user) # E: Argument 1 to "animals_only" has incompatible type "User@AnnotatedWith[TypedDict({'id__count': int})]"; expected "Animal" [arg-type]
def users_allowed(param: User) -> None:
# But this function accepts only the original User type, so any attr access is not allowed within this function
param.foo # E: "User" has no attribute "foo" [attr-defined]
# Passing in the annotated User to a function taking a (unannotated) User is OK
users_allowed(annotated_user)
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
username = models.CharField(max_length=100)
class Animal(models.Model):
barks = models.BooleanField()
- case: annotate_twice_works
main: |
from typing_extensions import reveal_type
from myapp.models import User
from django.db.models.expressions import F
# Django annotations are additive
qs = User.objects.annotate(foo=F('id'))
qs = qs.annotate(bar=F('id'))
annotated = qs.get()
reveal_type(annotated) # N: Revealed type is "myapp.models.User@AnnotatedWith[TypedDict({'foo': Any, 'bar': Any})]"
reveal_type(annotated.foo) # N: Revealed type is "Any"
reveal_type(annotated.bar) # N: Revealed type is "Any"
reveal_type(annotated.username) # N: Revealed type is "str"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
username = models.CharField(max_length=100)
- case: annotate_using_queryset_across_methods
main: |
from myapp.models import User
from django_stubs_ext import WithAnnotations
from django.db.models import QuerySet
from django.db.models.expressions import F
from typing_extensions import TypedDict, reveal_type
qs = User.objects.filter(id=1)
class FooDict(TypedDict):
foo: str
def add_annotation(qs: QuerySet[User]) -> QuerySet[WithAnnotations[User, FooDict]]:
return qs.annotate(foo=F('id'))
def add_wrong_annotation(qs: QuerySet[User]) -> QuerySet[WithAnnotations[User, FooDict]]:
return qs.annotate(bar=F('id')) # E: Incompatible return value type (got "QuerySet[User@AnnotatedWith[TypedDict({'bar': Any})], User@AnnotatedWith[TypedDict({'bar': Any})]]", expected "QuerySet[User@AnnotatedWith[FooDict], User@AnnotatedWith[FooDict]]") [return-value]
qs = add_annotation(qs)
reveal_type(qs.get().foo) # N: Revealed type is "str"
qs.get().bar # E: "User@AnnotatedWith[FooDict]" has no attribute "bar" [attr-defined]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
username = models.CharField(max_length=100)
- case: annotate_rejects_lookups_of_non_existent_field
main: |
from myapp.models import User
from django.db.models.expressions import F
User.objects.annotate(abc=F('id')).filter(abc=1).values_list()
User.objects.annotate(abc=F('id')).filter(unknown_field=1).values_list() # E: Cannot resolve keyword 'unknown_field' into field. Choices are: id, abc [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
pass
- case: annotate_values_or_values_list_before_or_after_annotate_broadens_type
main: |
from typing_extensions import reveal_type
from myapp.models import Blog
from django.db.models.expressions import F
values_list_double_annotate = Blog.objects.annotate(foo=F('id')).annotate(bar=F('id')).values_list('foo', 'bar').get()
reveal_type(values_list_double_annotate) # N: Revealed type is "tuple[Any, Any]"
values_list_named = Blog.objects.annotate(foo=F('id'), bar=F('isad')).values_list('foo', 'text', named=True).get()
# We have to assume we don't know any of the tuple member types.
reveal_type(values_list_named) # N: Revealed type is "tuple[Any, str, fallback=main.Row]"
values_list_named.unknown # E: "Row" has no attribute "unknown" [attr-defined]
reveal_type(values_list_named.foo) # N: Revealed type is "Any"
reveal_type(values_list_named.text) # N: Revealed type is "str"
values_list_flat_known = Blog.objects.annotate(foo=F('id')).values_list('text', flat=True).get()
# Even though it's annotated, we still know the lookup's type.
reveal_type(values_list_flat_known) # N: Revealed type is "str"
values_list_flat_unknown = Blog.objects.annotate(foo=F('id')).values_list('foo', flat=True).get()
# We don't know the type of an unknown lookup
reveal_type(values_list_flat_unknown) # N: Revealed type is "Any"
values_list_no_params = Blog.objects.annotate(foo=F('id')).values_list().get()
reveal_type(values_list_no_params) # N: Revealed type is "tuple[Any, ...]"
values_list_flat_no_params = Blog.objects.annotate(foo=F('id')).values_list(flat=True).get()
reveal_type(values_list_flat_no_params) # N: Revealed type is "int"
values_list_named_no_params = Blog.objects.annotate(foo=F('id')).values_list(named=True).get()
reveal_type(values_list_named_no_params.foo) # N: Revealed type is "Any"
reveal_type(values_list_named_no_params.text) # N: Revealed type is "str"
# .values/.values_list BEFORE .annotate
# The following should happen to the TypeVars:
# 1st typevar (Model): Blog => django_stubs_ext.WithAnnotations[Blog]
# 2nd typevar (Row): The values() dict keys are preserved and extended with the
# annotation aliases, mirroring Django's `.values(...).annotate(...)` behavior.
qs1 = Blog.objects.values('text').annotate(foo=F('id'))
reveal_type(qs1) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog@AnnotatedWith[TypedDict({'foo': Any})], TypedDict({'text': str, 'foo': Any})]"
qs2 = Blog.objects.values_list('text').annotate(foo=F('id'))
reveal_type(qs2) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog@AnnotatedWith[TypedDict({'foo': Any})], tuple[Any, ...]]"
qs3 = Blog.objects.values_list('text', named=True).annotate(foo=F('id'))
reveal_type(qs3) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog@AnnotatedWith[TypedDict({'foo': Any})], tuple[str, Any, fallback=main.Row3]]"
qs3_chained = Blog.objects.values_list('text', named=True).annotate(foo=F('id')).annotate(bar=F('num_posts'))
qs3_chained_row = qs3_chained.get()
reveal_type(qs3_chained_row.text) # N: Revealed type is "str"
reveal_type(qs3_chained_row.foo) # N: Revealed type is "Any"
reveal_type(qs3_chained_row.bar) # N: Revealed type is "Any"
qs4 = Blog.objects.values_list('text', flat=True).annotate(foo=F('id'))
reveal_type(qs4) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog@AnnotatedWith[TypedDict({'foo': Any})], str]"
before_values_no_params = Blog.objects.values().annotate(foo=F('id')).get()
reveal_type(before_values_no_params) # N: Revealed type is "TypedDict({'id': int, 'num_posts': int, 'text': str, 'foo': Any})"
before_values_list_no_params = Blog.objects.values_list().annotate(foo=F('id')).get()
reveal_type(before_values_list_no_params) # N: Revealed type is "tuple[Any, ...]"
before_values_list_flat_no_params = Blog.objects.values_list(flat=True).annotate(foo=F('id')).get()
reveal_type(before_values_list_flat_no_params) # N: Revealed type is "int"
before_values_list_named_no_params = Blog.objects.values_list(named=True).annotate(foo=F('id')).get()
reveal_type(before_values_list_named_no_params.foo) # N: Revealed type is "Any"
reveal_type(before_values_list_named_no_params.text) # N: Revealed type is "str"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Blog(models.Model):
num_posts = models.IntegerField()
text = models.CharField(max_length=100)
- case: annotate_then_values_list_flat_slice_preserves_row_type
main: |
from typing import Iterable
from typing_extensions import reveal_type
from myapp.models import Blog
from django.db.models import F
qs = Blog.objects.annotate(a=F("id")).values_list("id", flat=True)
reveal_type(qs) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog@AnnotatedWith[TypedDict({'a': Any})], int]"
reveal_type(qs[:]) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog@AnnotatedWith[TypedDict({'a': Any})], int]"
def get_blog_ids() -> Iterable[int]:
return Blog.objects.annotate(a=F("id")).values_list("id", flat=True)[:]
# Also preserve non-flat tuple row types and TypedDict row types from values().
reveal_type(Blog.objects.annotate(a=F("id")).values_list("id", "text")[:]) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog@AnnotatedWith[TypedDict({'a': Any})], tuple[int, str]]"
reveal_type(Blog.objects.annotate(a=F("id")).values("id")[:]) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog@AnnotatedWith[TypedDict({'a': Any})], TypedDict({'id': int})]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Blog(models.Model):
text = models.CharField(max_length=100)
- case: test_annotate_with_filter
main: |
from django.db import models
from myapp.models import Blog
qs = Blog.objects.annotate(xyz=models.Count("entry"))
qs.filter(xyz=1)
qs.filter(annotate_wrong__gt=5)
# The `__in` lookup expects an iterable of the field type.
# Regression test for https://github.com/typeddjango/django-stubs/issue/xxxx
qs.filter(xyz__in=[1, 2, 3])
qs.filter(xyz__in=(1, 2, 3))
qs.filter(xyz__in=range(4))
qs.filter(xyz__in=123)
qs.filter(xyz__in=None)
qs.filter(xyz__in="abc")
qs.filter(xyz__in=(Blog(),))
qs.filter(xyz__in=[Blog()]) # Doesn't error because mypy sees the provided type as `list[Any]`.
blogs: list[Blog] = [Blog()]
qs.filter(xyz__in=blogs) # But this does error as `blogs` is explicitly `list[Blog]`.
qs2 = qs.alias(alias_entries=models.Count("entry"))
qs2.filter(alias_entries__gt=5)
qs2.filter(alias_wrong__gt=5, annotate_wrong__gt=5)
Blog.objects.annotate().filter(xyz=1)
(
Blog.objects.filter(xyz=1)
.annotate(xyz=models.Count("entry"))
.filter(xyz=1)
)
out: |
main:6: error: Cannot resolve keyword 'annotate_wrong' into field. Choices are: entry, id, xyz [misc]
main:13: error: Incompatible type for lookup 'xyz__in': (got "int", expected "Iterable[int]") [misc]
main:14: error: Incompatible type for lookup 'xyz__in': (got "None", expected "Iterable[int]") [misc]
main:15: error: Incompatible type for lookup 'xyz__in': (got "str", expected "Iterable[int]") [misc]
main:15: note: Following member(s) of "str" have conflicts:
main:15: note: Expected:
main:15: note: def __iter__(self) -> Iterator[int]
main:15: note: Got:
main:15: note: def __iter__(self) -> Iterator[str]
main:16: error: Incompatible type for lookup 'xyz__in': (got "tuple[Blog]", expected "Iterable[int]") [misc]
main:19: error: Incompatible type for lookup 'xyz__in': (got "list[Blog]", expected "Iterable[int]") [misc]
main:23: error: Cannot resolve keyword 'alias_wrong' into field. Choices are: entry, id, xyz, alias_entries [misc]
main:23: error: Cannot resolve keyword 'annotate_wrong' into field. Choices are: entry, id, xyz, alias_entries [misc]
main:25: error: Cannot resolve keyword 'xyz' into field. Choices are: entry, id [misc]
main:27: error: Cannot resolve keyword 'xyz' into field. Choices are: entry, id [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Blog(models.Model):
pass
class Entry(models.Model):
blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
- case: test_annotate_allows_any_lookups_in_filter
main: |
from typing_extensions import reveal_type
from django.db import models
from myapp.models import Blog
qs = Blog.objects.annotate(distance=0)
reveal_type(qs)
reveal_type(qs.filter(distance=10))
reveal_type(qs.filter(distance__lt=10))
qs.filter(distance__lt__lt=10)
qs.filter(distance__unknown_lookup=10)
out: |
main:6: note: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog@AnnotatedWith[TypedDict({'distance': Any})], myapp.models.Blog@AnnotatedWith[TypedDict({'distance': Any})]]"
main:7: note: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog@AnnotatedWith[TypedDict({'distance': Any})], myapp.models.Blog@AnnotatedWith[TypedDict({'distance': Any})]]"
main:8: note: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog@AnnotatedWith[TypedDict({'distance': Any})], myapp.models.Blog@AnnotatedWith[TypedDict({'distance': Any})]]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Blog(models.Model): pass
- case: test_annotate_existing_field
installed_apps:
- django.contrib.auth
- django.contrib.contenttypes
main: |
from typing import Any
from typing_extensions import TypedDict
from django.db import models
from django.db.models import Prefetch, F, QuerySet
from django.contrib.auth.models import User, Group
from django_stubs_ext.annotations import WithAnnotations
# Error on existing field / remapped field / previous annotation
User.objects.annotate(username=F("username")) # E: Attribute "username" already defined on "django.contrib.auth.models.User" [no-redef]
User.objects.values(foo=F("id")).annotate(foo=F("username")) # E: Attribute "foo" already defined on "django.contrib.auth.models.User" [no-redef]
User.objects.annotate(computed=F('id')).annotate(computed=F('username')) # E: Attribute "computed" already defined on "django.contrib.auth.models.User@AnnotatedWith[TypedDict({'computed': Any})]" [no-redef]
# Should be ok if filtered with `values` / `values_list`
User.objects.values_list("id").annotate(username=F("username"))
User.objects.values("id").annotate(username=F("username"))
User.objects.values_list("id", named=True).annotate(username=F("username"))
def get_with_values_list() -> QuerySet[User, tuple[int]]:
return User.objects.values_list("id")
get_with_values_list().annotate(username=F("username"))
class OnlyIdDict(TypedDict):
id: int
def get_with_values() -> QuerySet[User, OnlyIdDict]:
return User.objects.values("id")
get_with_values().annotate(username=F("username"))
# But still cause issue if overlapping with other symbols (methods, ...)
User.objects.values_list("id").annotate(get_full_name=F("username")) # E: Attribute "get_full_name" already defined on "django.contrib.auth.models.User" [no-redef]
User.objects.values("id").annotate(get_full_name=F("username")) # E: Attribute "get_full_name" already defined on "django.contrib.auth.models.User" [no-redef]
# No false positive on approximative row types
tuple_any_row: models.QuerySet[User, tuple[Any, ...]]
tuple_any_row.annotate(username=F("username"))
any_row: models.QuerySet[User, Any]
any_row.annotate(username=F("username"))
dict_row: models.QuerySet[User, dict]
dict_row.annotate(username=F("username"))
# Ensure collisions with methods are still errors in approximate contexts
get_with_values_list().annotate(get_full_name=F("username")) # E: Attribute "get_full_name" already defined on "django.contrib.auth.models.User" [no-redef]
tuple_any_row.annotate(get_full_name=F("username")) # E: Attribute "get_full_name" already defined on "django.contrib.auth.models.User" [no-redef]
any_row.annotate(get_full_name=F("username")) # E: Attribute "get_full_name" already defined on "django.contrib.auth.models.User" [no-redef]
dict_row.annotate(get_full_name=F("username")) # E: Attribute "get_full_name" already defined on "django.contrib.auth.models.User" [no-redef]
# Named values_list
# Test name collision with model methods in named values_list - should still error
User.objects.values_list("id", named=True).annotate(get_full_name=F("username")) # E: Attribute "get_full_name" already defined on "django.contrib.auth.models.User" [no-redef]
User.objects.values_list("username", named=True).annotate(get_full_name=F("first_name")) # E: Attribute "get_full_name" already defined on "django.contrib.auth.models.User" [no-redef]
User.objects.values_list("id", named=True).annotate(is_anonymous=F("username")) # E: Attribute "is_anonymous" already defined on "django.contrib.auth.models.User" [no-redef]
# Test name collision with model fields when field is NOT in values_list - should be OK
User.objects.values_list("id", named=True).annotate(username=F("first_name"))
User.objects.values_list("first_name", named=True).annotate(username=F("last_name"))
# Test name collision with model fields when field IS in values_list - should error
User.objects.values_list("username", named=True).annotate(username=F("first_name")) # E: Attribute "username" already defined on "django.contrib.auth.models.User" [no-redef]
User.objects.values_list("id", "username", named=True).annotate(username=F("first_name")) # E: Attribute "username" already defined on "django.contrib.auth.models.User" [no-redef]
# Regression test for https://github.com/typeddjango/django-stubs/issues/3098
# __isnull lookup on annotated fields should expect bool, not the annotation type
- case: test_annotated_field_lookup_type_checking_ok
main: |
from uuid import UUID
from typing_extensions import TypedDict
from django.db.models import QuerySet
from django_stubs_ext import WithAnnotations
from myapp.models import MyModel
class MyAnnotations(TypedDict):
scan_id: UUID | None
AnnotatedModel = WithAnnotations[MyModel, MyAnnotations]
def filter_annotated(qs: QuerySet[AnnotatedModel]) -> QuerySet[AnnotatedModel]:
# __isnull lookup should accept bool, not UUID
return qs.filter(scan_id__isnull=True)
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyModel(models.Model):
name = models.CharField(max_length=100)
# Test that lookups on annotated fields check argument types
- case: test_annotated_field_lookup_type_checking_error
main: |
from typing_extensions import TypedDict
from django.db.models import QuerySet
from django_stubs_ext import WithAnnotations
from myapp.models import MyModel
class MyAnnotations(TypedDict):
total: int
AnnotatedModel = WithAnnotations[MyModel, MyAnnotations]
def filter_annotated(qs: QuerySet[AnnotatedModel]) -> QuerySet[AnnotatedModel]:
# Invalid: str argument for __gt lookup should error
qs.filter(total__gt=10)
return qs.filter(total__gt="not a number") # E: Incompatible type for lookup 'total__gt': (got "str", expected "int") [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyModel(models.Model):
name = models.CharField(max_length=100)
- case: annotate_on_implicitly_generic_custom_queryset
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
from django.db.models import Count
qs = MyModel.objects.all().annotate(num_items=Count("id"))
obj = qs.get()
reveal_type(obj.num_items) # N: Revealed type is "int"
obj.nonexistent # E: "MyModel@AnnotatedWith[TypedDict({'num_items': int})]" has no attribute "nonexistent" [attr-defined]
# Custom queryset methods remain available after annotate
qs.custom_method()
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from typing_extensions import Self
class MyQuerySet(models.QuerySet):
def custom_method(self) -> Self:
return self.filter(name="test")
MyManager = models.Manager.from_queryset(MyQuerySet)
class MyModel(models.Model):
name = models.CharField(max_length=100)
objects = MyManager()
- case: annotate_resolves_output_field_type_from_classvar
main: |
from typing_extensions import reveal_type
from myapp.models import User
from django.db.models import Count, Exists, OuterRef
from django.db.models.functions import Length, Now, Right, TruncDate, TruncTime
# Count has output_field: ClassVar[IntegerField] → int
user_count = User.objects.annotate(user_count=Count('id')).get().user_count
reveal_type(user_count) # N: Revealed type is "int"
# Exists has output_field: ClassVar[BooleanField] → bool
has_users = User.objects.annotate(has_users=Exists(User.objects.filter(pk=OuterRef('pk')))).get().has_users
reveal_type(has_users) # N: Revealed type is "bool"
# Length has output_field: ClassVar[IntegerField] → int
name_len = User.objects.annotate(name_len=Length('username')).get().name_len
reveal_type(name_len) # N: Revealed type is "int"
# Now has output_field: ClassVar[DateTimeField] → datetime
current_time = User.objects.annotate(current_time=Now()).get().current_time
reveal_type(current_time) # N: Revealed type is "datetime.datetime"
# Right (inherits from Left) has output_field: ClassVar[CharField] → str
suffix = User.objects.annotate(suffix=Right('username', 3)).get().suffix
reveal_type(suffix) # N: Revealed type is "str"
# TruncDate has output_field: ClassVar[DateField] → date
created_date = User.objects.annotate(created_date=TruncDate('created_at')).get().created_date
reveal_type(created_date) # N: Revealed type is "datetime.date"
# TruncTime has output_field: ClassVar[TimeField] → time
created_time = User.objects.annotate(created_time=TruncTime('created_at')).get().created_time
reveal_type(created_time) # N: Revealed type is "datetime.time"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
username = models.CharField(max_length=100)
created_at = models.DateTimeField()
- case: annotate_resolves_output_field_from_property
main: |
from typing_extensions import reveal_type
from myapp.models import User
from django.contrib.postgres.aggregates import ArrayAgg
from django.contrib.postgres.expressions import ArraySubquery
# ArrayAgg has output_field as @property → ArrayField → list[Any]
usernames = User.objects.annotate(usernames=ArrayAgg('username')).get().usernames
reveal_type(usernames) # N: Revealed type is "list[Any]"
# ArraySubquery has output_field as @cached_property → ArrayField → list[Any]
sub_ids = User.objects.annotate(sub_ids=ArraySubquery(User.objects.values('id'))).get().sub_ids
reveal_type(sub_ids) # N: Revealed type is "list[Any]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
username = models.CharField(max_length=100)
- case: annotate_resolves_output_field_from_subquery_generic
main: |
from typing_extensions import reveal_type
from myapp.models import User
from django.db.models import Subquery, OuterRef, IntegerField, CharField, Exists
# Subquery with explicit output_field=IntegerField() → int
int_subquery = Subquery(User.objects.filter(pk=OuterRef('pk')).values('id')[:1], output_field=IntegerField())
val_int = User.objects.annotate(val=int_subquery).get().val
reveal_type(val_int) # N: Revealed type is "int"
# Subquery with explicit output_field=CharField() → str
char_subquery = Subquery(User.objects.filter(pk=OuterRef('pk')).values('username')[:1], output_field=CharField())
val_str = User.objects.annotate(val=char_subquery).get().val
reveal_type(val_str) # N: Revealed type is "str"
# Subquery with nullable output_field → int | None
nullable_sub = Subquery(User.objects.filter(pk=OuterRef('pk')).values('id')[:1], output_field=IntegerField(null=True))
val_nullable = User.objects.annotate(val=nullable_sub).get().val
reveal_type(val_nullable) # N: Revealed type is "int | None"
# Subquery without output_field → Any
plain_subquery = Subquery(User.objects.filter(pk=OuterRef('pk')).values('id')[:1])
val_any = User.objects.annotate(val=plain_subquery).get().val
reveal_type(val_any) # N: Revealed type is "Any"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
username = models.CharField(max_length=100)
- case: annotate_resolves_output_field_from_func_generic
main: |
from typing_extensions import reveal_type
from myapp.models import User
from django.db.models import BinaryField
from django.db.models.functions import Substr, Left, Right
# Substr with explicit output_field=BinaryField() via variable
sub = Substr("username", 1, 100, output_field=BinaryField())
val = User.objects.annotate(preview=sub).get().preview
reveal_type(val) # N: Revealed type is "bytes | memoryview[int]"
# Substr with explicit output_field=BinaryField() inlined
val2 = User.objects.annotate(preview=Substr("username", 1, 100, output_field=BinaryField())).get().preview
reveal_type(val2) # N: Revealed type is "bytes | memoryview[int]"
# Left with explicit output_field=BinaryField()
left_expr = Left("username", 5, output_field=BinaryField())
left_val = User.objects.annotate(prefix=left_expr).get().prefix
reveal_type(left_val) # N: Revealed type is "bytes | memoryview[int]"
# Right with explicit output_field=BinaryField()
right_expr = Right("username", 5, output_field=BinaryField())
right_val = User.objects.annotate(suffix=right_expr).get().suffix
reveal_type(right_val) # N: Revealed type is "bytes | memoryview[int]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
username = models.CharField(max_length=100)
- case: test_values_and_values_list_on_with_annotations_queryset
main: |
from typing_extensions import TypedDict, reveal_type
from django.db.models import QuerySet
from django_stubs_ext import WithAnnotations
from myapp.models import MyModel
class MyAnnotations(TypedDict):
extra_id: int | None
AnnotatedModel = WithAnnotations[MyModel, MyAnnotations]
def get_qs() -> QuerySet[AnnotatedModel]:
raise NotImplementedError
qs = get_qs()
# .values() with annotation field should produce a TypedDict
values_result = qs.values("extra_id").get()
reveal_type(values_result) # N: Revealed type is "TypedDict({'extra_id': int | None})"
# .values() with model field should still work
model_field_values = qs.values("name").get()
reveal_type(model_field_values) # N: Revealed type is "TypedDict({'name': str})"
# .values() with both model and annotation fields
mixed_values = qs.values("name", "extra_id").get()
reveal_type(mixed_values) # N: Revealed type is "TypedDict({'name': str, 'extra_id': int | None})"
# .values() with no params on annotated queryset includes model + annotation fields
bare_values = qs.values().get()
reveal_type(bare_values) # N: Revealed type is "TypedDict({'id': int, 'name': str, 'extra_id': int | None})"
# .values_list() with annotation field should resolve its type
vl_annotation = qs.values_list("extra_id").get()
reveal_type(vl_annotation) # N: Revealed type is "tuple[int | None]"
# .values_list() with model field should still work
vl_model = qs.values_list("name").get()
reveal_type(vl_model) # N: Revealed type is "tuple[str]"
# .values_list() with both model and annotation fields
vl_mixed = qs.values_list("name", "extra_id").get()
reveal_type(vl_mixed) # N: Revealed type is "tuple[str, int | None]"
# .values_list(flat=True) with annotation field
vl_flat = qs.values_list("extra_id", flat=True).get()
reveal_type(vl_flat) # N: Revealed type is "int | None"
# .values_list(named=True) with annotation field
vl_named = qs.values_list("name", "extra_id", named=True).get()
reveal_type(vl_named.name) # N: Revealed type is "str"
reveal_type(vl_named.extra_id) # N: Revealed type is "int | None"
# .values_list(named=True) with no params merges model + annotation fields
vl_named_bare = qs.values_list(named=True).get()
reveal_type(vl_named_bare.name) # N: Revealed type is "str"
reveal_type(vl_named_bare.extra_id) # N: Revealed type is "int | None"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyModel(models.Model):
name = models.CharField(max_length=100)
# Regression test from https://github.com/typeddjango/django-stubs/issues/1049
- case: custom_queryset_with_annotations_issue_1049
main: |
from typing_extensions import reveal_type
from myapp.models import Accommodation, SomeQuerySet
from django.db.models import Value
queryset = SomeQuerySet().annotate(hello=Value(True)).filter(is_on_shelf=True).annotate(hi=Value(False))
reveal_type(queryset) # N: Revealed type is "myapp.models.SomeQuerySet[myapp.models.Accommodation@AnnotatedWith[TypedDict({'hello': Any, 'hi': Any})], myapp.models.Accommodation@AnnotatedWith[TypedDict({'hello': Any, 'hi': Any})]]"
reveal_type(queryset.first()) # N: Revealed type is "myapp.models.Accommodation@AnnotatedWith[TypedDict({'hello': Any, 'hi': Any})] | None"
reveal_type(queryset.get(pk=1)) # N: Revealed type is "myapp.models.Accommodation@AnnotatedWith[TypedDict({'hello': Any, 'hi': Any})]"
reveal_type(queryset[0]) # N: Revealed type is "myapp.models.Accommodation@AnnotatedWith[TypedDict({'hello': Any, 'hi': Any})]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Accommodation(models.Model):
is_on_shelf = models.BooleanField()
class SomeQuerySet(models.QuerySet["Accommodation"]):
pass
- case: annotate_does_not_leak_across_functions
main: |
from typing_extensions import reveal_type
from myapp.models import consume
reveal_type(consume()) # N: Revealed type is "myapp.models.Book | None"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing_extensions import reveal_type
from django.db import models
from django.db.models import F
class BookQuerySet(models.QuerySet["Book"]):
pass
class Book(models.Model):
name = models.CharField(max_length=100)
author = models.CharField(max_length=100)
objects = models.Manager.from_queryset(BookQuerySet)()
def leak() -> None:
Book.objects.annotate(dupe_author=F("name"))
def consume() -> "Book | None":
book: Book | None = None
if True:
book = Book.objects.filter(name="foo").first()
reveal_type(book) # N: Revealed type is "myapp.models.Book | None"
if not book:
book = Book(name="foo", author="bar")
return book
- case: custom_queryset_method_with_annotations
main: |
from typing_extensions import reveal_type
from myapp.models import FooModel
from django.db.models.expressions import F
# Simple method
qs = FooModel.objects.with_bar()
reveal_type(qs) # N: Revealed type is "myapp.models.FooQuerySet[myapp.models.FooModel@AnnotatedWith[TypedDict(myapp.models.BarDict, {'bar': str})], myapp.models.FooModel@AnnotatedWith[TypedDict(myapp.models.BarDict, {'bar': str})]]"
obj = qs.get()
reveal_type(obj.bar) # N: Revealed type is "str"
reveal_type(obj.name) # N: Revealed type is "str"
obj.nonexistent # E: "FooModel@AnnotatedWith[BarDict]" has no attribute "nonexistent" [attr-defined]
# Chained methods
qs2 = FooModel.objects.with_bar().with_baz()
reveal_type(qs2) # N: Revealed type is "myapp.models.FooQuerySet[myapp.models.FooModel@AnnotatedWith[TypedDict({'bar': str, 'baz': int})], myapp.models.FooModel@AnnotatedWith[TypedDict({'bar': str, 'baz': int})]]"
obj2 = qs2[0]
reveal_type(obj2.bar) # N: Revealed type is "str"
reveal_type(obj2.baz) # N: Revealed type is "int"
reveal_type(obj2.name) # N: Revealed type is "str"
# Chained with regular methods
filtered = FooModel.objects.with_bar().filter(name="x")
maybe = filtered.first()
reveal_type(maybe) # N: Revealed type is "myapp.models.FooModel@AnnotatedWith[TypedDict(myapp.models.BarDict, {'bar': str})] | None"
if maybe:
reveal_type(maybe.bar) # N: Revealed type is "str"
reveal_type(maybe.name) # N: Revealed type is "str"
# Built-in .annotate() then custom method
mixed = FooModel.objects.annotate(extra=F("id")).with_bar()
mixed_obj = mixed.get()
reveal_type(mixed_obj.extra) # N: Revealed type is "Any"
reveal_type(mixed_obj.bar) # N: Revealed type is "str"
# Instance extraction propagate annotations correctly
qs3 = FooModel.objects.with_bar()
reveal_type(qs3.get().bar) # N: Revealed type is "str"
reveal_type(qs3[0].bar) # N: Revealed type is "str"
first = qs3.first()
if first:
reveal_type(first.bar) # N: Revealed type is "str"
for item in qs3:
reveal_type(item.bar) # N: Revealed type is "str"
break
# later annotation overrides
collision = FooModel.objects.with_bar().with_bar_int()
reveal_type(collision.get().bar) # N: Revealed type is "int"
# Custom method without WithAnnotations: noop
plain = FooModel.objects.active()
reveal_type(plain) # N: Revealed type is "myapp.models.FooQuerySet[myapp.models.FooModel]"
# Custom then .annotate() then custom: all three layers merge
triple = FooModel.objects.with_bar().annotate(extra=F("id")).with_baz()
triple_obj = triple.get()
reveal_type(triple_obj.bar) # N: Revealed type is "str"
reveal_type(triple_obj.extra) # N: Revealed type is "Any"
reveal_type(triple_obj.baz) # N: Revealed type is "int"
# Works on queryset too
triple = FooModel.objects.all().with_bar().annotate(extra=F("id")).with_baz()
triple_obj = triple.get()
reveal_type(triple_obj.bar) # N: Revealed type is "str"
reveal_type(triple_obj.extra) # N: Revealed type is "Any"
reveal_type(triple_obj.baz) # N: Revealed type is "int"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing_extensions import TypedDict, TypeVar, Self
from django.db import models
from django_stubs_ext import WithAnnotations
class BarDict(TypedDict):
bar: str
class BazDict(TypedDict):
baz: int
class BarIntDict(TypedDict):
bar: int
_Model = TypeVar("_Model", bound=models.Model, covariant=True)
class FooQuerySet(models.QuerySet[_Model]):
def with_bar(self) -> "FooQuerySet[WithAnnotations[_Model, BarDict]]":
return self.annotate(bar=models.Value("x"))
def with_baz(self) -> "FooQuerySet[WithAnnotations[_Model, BazDict]]":
return self.annotate(baz=models.Value(1))
def with_bar_int(self) -> "FooQuerySet[WithAnnotations[_Model, BarIntDict]]":
return self.annotate(bar=models.Value(1))
def active(self) -> Self:
return self.filter(active=True)
FooManager = models.Manager.from_queryset(FooQuerySet)
class FooModel(models.Model):
name = models.CharField(max_length=100)
objects = FooManager()
# Regression test from https://github.com/typeddjango/django-stubs/issues/2681#issuecomment-3610917062
- case: custom_queryset_with_annotations_issue_2681_comment
main: |
from typing_extensions import reveal_type
from myapp.models import FooModel
reveal_type(FooModel.objects.with_bar()) # N: Revealed type is "myapp.models.FooQuerySet[myapp.models.FooModel@AnnotatedWith[TypedDict(myapp.models.BarDict, {'bar': str})], myapp.models.FooModel@AnnotatedWith[TypedDict(myapp.models.BarDict, {'bar': str})]]"
reveal_type(FooModel.objects.with_bar().with_baz()) # N: Revealed type is "myapp.models.FooQuerySet[myapp.models.FooModel@AnnotatedWith[TypedDict({'bar': str, 'baz': str})], myapp.models.FooModel@AnnotatedWith[TypedDict({'bar': str, 'baz': str})]]"
obj = FooModel.objects.with_bar().with_baz().get()
reveal_type(obj.bar) # N: Revealed type is "str"
reveal_type(obj.baz) # N: Revealed type is "str"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing_extensions import TypedDict, TypeVar
from django.db import models
from django.db.models import Manager
from django_stubs_ext import WithAnnotations
class BarDict(TypedDict):
bar: str
class BazDict(TypedDict):
baz: str
_Model = TypeVar("_Model", bound=models.Model, covariant=True)
class FooQuerySet(models.QuerySet[_Model]):
def with_bar(self) -> "FooQuerySet[WithAnnotations[_Model, BarDict]]":
return self.annotate(bar=models.Value("bar"))
def with_baz(self) -> "FooQuerySet[WithAnnotations[_Model, BazDict]]":
return self.annotate(baz=models.Value("baz"))
FooManager = Manager.from_queryset(FooQuerySet)
class FooModel(models.Model):
objects = FooManager()
- case: values_then_annotate_on_generic_queryset_typevar
main: |
from typing import Any
from typing_extensions import reveal_type, TypeVar
from django.db import models
_Model = TypeVar("_Model", bound=models.Model)
def latest_max(qs: models.QuerySet[_Model]) -> dict[str, Any] | None:
annotated = qs.values("id").annotate(foo=models.Max("id"))
reveal_type(annotated) # N: Revealed type is "django.db.models.query.QuerySet[django.db.models.base.Model, dict[str, Any]]"
return annotated.first()
typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_as_manager.yml 0000664 0000000 0000000 00000070002 15260643574 0031705 0 ustar 00root root 0000000 0000000 - case: self_return_management
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel, MyModelWithoutSelf
reveal_type(MyModel.objects.example_simple()) # N: Revealed type is "myapp.models.MyQuerySet[myapp.models.MyModel]"
reveal_type(MyModel.objects.example_list()) # N: Revealed type is "list[myapp.models.MyQuerySet[myapp.models.MyModel]]"
reveal_type(MyModel.objects.example_simple().just_int()) # N: Revealed type is "int"
reveal_type(MyModel.objects.example_dict()) # N: Revealed type is "dict[str, myapp.models.MyQuerySet[myapp.models.MyModel]]"
reveal_type(MyModelWithoutSelf.objects.method()) # N: Revealed type is "myapp.models.QuerySetWithoutSelf[myapp.models.MyModelWithoutSelf, myapp.models.MyModelWithoutSelf]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from typing import ClassVar
from typing_extensions import Self, TypeVar
M = TypeVar("M", bound=models.Model, covariant=True)
class BaseQuerySet(models.QuerySet[M]):
def example_dict(self) -> dict[str, Self]:
raise NotImplementedError
class MyQuerySet(BaseQuerySet[M]):
def example_simple(self) -> Self:
raise NotImplementedError
def example_list(self) -> list[Self]:
raise NotImplementedError
def just_int(self) -> int:
raise NotImplementedError
class MyModel(models.Model):
objects = MyQuerySet.as_manager()
class QuerySetWithoutSelf(models.QuerySet["MyModelWithoutSelf"]):
def method(self) -> "QuerySetWithoutSelf":
return self
class MyModelWithoutSelf(models.Model):
objects = QuerySetWithoutSelf.as_manager()
- case: overridden_as_manager_still_generates_manager
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromMyQuerySet[myapp.models.MyModel]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from typing import Any
from typing_extensions import override
class MyQuerySet(models.QuerySet):
@classmethod
@override
def as_manager(cls) -> "models.Manager[Any]":
return super().as_manager()
class MyModel(models.Model):
objects = MyQuerySet.as_manager()
- case: overridden_as_manager_returning_custom_manager
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.CustomManagerFromMyQuerySet[myapp.models.MyModel]"
reveal_type(MyModel.objects.manager_method()) # N: Revealed type is "str"
reveal_type(MyModel.objects.queryset_method()) # N: Revealed type is "int"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from typing_extensions import override
class CustomManager(models.Manager):
def manager_method(self) -> str:
return ""
class MyQuerySet(models.QuerySet["MyModel"]):
def queryset_method(self) -> int:
return 0
@classmethod
@override
def as_manager(cls) -> "CustomManager":
return CustomManager.from_queryset(cls)()
class MyModel(models.Model):
objects = MyQuerySet.as_manager()
- case: overridden_as_manager_in_other_module_with_module_private_typevar
main: |
from myapp.models import MyModel
installed_apps:
- django.contrib.contenttypes
- myapp
files:
- path: lib/__init__.py
- path: lib/query.py
content: |
from typing import TypeVar
from django.db import models
from typing_extensions import override
_T = TypeVar("_T", bound=models.Model)
class LibQuerySet(models.QuerySet[_T]):
@classmethod
@override
def as_manager(cls) -> "models.Manager[_T]":
return models.Manager.from_queryset(cls)()
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.contrib.contenttypes.models import ContentType
from django.db import models
from lib.query import LibQuerySet
class MyModel(models.Model):
ctype = models.ForeignKey(ContentType, on_delete=models.CASCADE)
class MyQuerySet(LibQuerySet):
pass
- case: declares_manager_type_like_django
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromMyQuerySet[myapp.models.MyModel]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyQuerySet(models.QuerySet):
...
class MyModel(models.Model):
objects = MyQuerySet.as_manager()
- case: includes_django_methods_returning_queryset
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel.objects.none) # N: Revealed type is "def () -> myapp.models.MyQuerySet[myapp.models.MyModel]"
reveal_type(MyModel.objects.all) # N: Revealed type is "def () -> myapp.models.MyQuerySet[myapp.models.MyModel]"
reveal_type(MyModel.objects.filter) # N: Revealed type is "def (*args: Any, **kwargs: Any) -> myapp.models.MyQuerySet[myapp.models.MyModel]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing_extensions import TypeVar
from django.db import models
M = TypeVar("M", bound=models.Model, covariant=True)
class MyQuerySet(models.QuerySet[M]):
...
class MyModel(models.Model):
objects = MyQuerySet.as_manager()
- case: model_gets_generated_manager_as_default_manager
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]"
reveal_type(MyModel.objects.queryset_method()) # N: Revealed type is "str"
reveal_type(MyModel._default_manager) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class ModelQuerySet(models.QuerySet):
def queryset_method(self) -> str:
return 'hello'
class MyModel(models.Model):
objects = ModelQuerySet.as_manager()
- case: resolves_name_collision_with_other_module_level_object
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel, ManagerFromModelQuerySet
reveal_type(ManagerFromModelQuerySet) # N: Revealed type is "int"
reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet1[myapp.models.MyModel]"
reveal_type(MyModel._default_manager) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet1[myapp.models.MyModel]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
ManagerFromModelQuerySet = 1
class ModelQuerySet(models.QuerySet):
...
class MyModel(models.Model):
objects = ModelQuerySet.as_manager()
- case: includes_custom_queryset_methods
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel.objects.custom_queryset_method()) # N: Revealed type is "myapp.models.ModelQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
reveal_type(MyModel.objects.all().custom_queryset_method()) # N: Revealed type is "myapp.models.ModelQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
reveal_type(MyModel.objects.returns_int_sequence()) # N: Revealed type is "typing.Sequence[int]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from collections.abc import Sequence
from django.db import models
class ModelQuerySet(models.QuerySet["MyModel"]):
def custom_queryset_method(self) -> "ModelQuerySet":
return self.all()
def returns_int_sequence(self) -> Sequence[int]:
return [1]
class MyModel(models.Model):
objects = ModelQuerySet.as_manager()
- case: includes_custom_queryset_methods_on_unions
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel1, MyModel2
kls: type[MyModel1 | MyModel2] = MyModel1
reveal_type(kls.objects.custom_queryset_method()) # N: Revealed type is "myapp.models.ModelQuerySet1[myapp.models.MyModel1, myapp.models.MyModel1] | myapp.models.ModelQuerySet2[myapp.models.MyModel2, myapp.models.MyModel2]"
reveal_type(kls.objects.all().custom_queryset_method()) # N: Revealed type is "myapp.models.ModelQuerySet1[myapp.models.MyModel1, myapp.models.MyModel1] | myapp.models.ModelQuerySet2[myapp.models.MyModel2, myapp.models.MyModel2]"
reveal_type(kls.objects.returns_thing()) # N: Revealed type is "int | str"
reveal_type(kls.objects.get()) # N: Revealed type is "myapp.models.MyModel1 | myapp.models.MyModel2"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from collections.abc import Sequence
from django.db import models
class ModelQuerySet1(models.QuerySet["MyModel1"]):
def custom_queryset_method(self) -> "ModelQuerySet1":
return self.all()
def returns_thing(self) -> int:
return 1
class ModelQuerySet2(models.QuerySet["MyModel2"]):
def custom_queryset_method(self) -> "ModelQuerySet2":
return self.all()
def returns_thing(self) -> str:
return "asdf"
class MyModel1(models.Model):
objects = ModelQuerySet1.as_manager()
class MyModel2(models.Model):
objects = ModelQuerySet2.as_manager()
- case: handles_call_outside_of_model_class_definition
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel, MyModelManager
reveal_type(MyModelManager) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[Any]"
reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]"
reveal_type(MyModel.objects.all()) # N: Revealed type is "myapp.models.ModelQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class ModelQuerySet(models.QuerySet["MyModel"]):
...
MyModelManager = ModelQuerySet.as_manager()
class MyModel(models.Model):
objects = MyModelManager
- case: handles_name_collision_when_declared_outside_of_model_class_body
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel, ManagerFromModelQuerySet
reveal_type(ManagerFromModelQuerySet) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet1[Any]"
reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet1[myapp.models.MyModel]"
reveal_type(MyModel.objects.all()) # N: Revealed type is "myapp.models.ModelQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class ModelQuerySet(models.QuerySet["MyModel"]):
...
ManagerFromModelQuerySet = ModelQuerySet.as_manager()
class MyModel(models.Model):
objects = ManagerFromModelQuerySet
- case: handles_type_var_in_subclasses_of_subclasses_of_queryset
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel, MyOtherModel
reveal_type(MyModel.objects.example_2()) # N: Revealed type is "myapp.models.MyModel"
reveal_type(MyModel.objects.example()) # N: Revealed type is "myapp.models.MyModel"
reveal_type(MyModel.objects.example_2()) # N: Revealed type is "myapp.models.MyModel"
reveal_type(MyModel.objects.override()) # N: Revealed type is "myapp.models.MyModel"
reveal_type(MyModel.objects.override2()) # N: Revealed type is "myapp.models.MyModel"
reveal_type(MyModel.objects.dummy_override()) # N: Revealed type is "myapp.models.MyModel"
reveal_type(MyModel.objects.example_mixin(MyModel())) # N: Revealed type is "myapp.models.MyModel"
reveal_type(MyModel.objects.example_other_mixin()) # N: Revealed type is "myapp.models.MyModel"
reveal_type(MyModel.objects.example_union()) # N: Revealed type is "myapp.models.MyModel | list[myapp.models.MyModel]"
reveal_type(MyOtherModel.objects.example()) # N: Revealed type is "myapp.models.MyOtherModel"
reveal_type(MyOtherModel.objects.example_2()) # N: Revealed type is "myapp.models.MyOtherModel"
reveal_type(MyOtherModel.objects.override()) # N: Revealed type is "myapp.models.MyOtherModel"
reveal_type(MyOtherModel.objects.override2()) # N: Revealed type is "myapp.models.MyOtherModel"
reveal_type(MyOtherModel.objects.dummy_override()) # N: Revealed type is "myapp.models.MyOtherModel"
reveal_type(MyOtherModel.objects.example_mixin(MyOtherModel())) # N: Revealed type is "myapp.models.MyOtherModel"
reveal_type(MyOtherModel.objects.example_other_mixin()) # N: Revealed type is "myapp.models.MyOtherModel"
reveal_type(MyOtherModel.objects.test_self()) # N: Revealed type is "myapp.models._MyModelQuerySet2[myapp.models.MyOtherModel]"
reveal_type(MyOtherModel.objects.test_sub_self()) # N: Revealed type is "myapp.models._MyModelQuerySet2[myapp.models.MyOtherModel]"
reveal_type(MyOtherModel.objects.example_union()) # N: Revealed type is "myapp.models.MyOtherModel | list[myapp.models.MyOtherModel]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing import Generic
from django.db import models
from typing_extensions import Self, TypeVar, override as typing_override
T = TypeVar("T", bound=models.Model)
T_2 = TypeVar("T_2", bound=models.Model)
class SomeMixin:
def example_mixin(self, a: T) -> T:
raise NotImplementedError
class OtherMixin(models.QuerySet[T]):
def example_other_mixin(self) -> T:
raise NotImplementedError
def example_union(self) -> T | list[T]:
raise NotImplementedError
class _MyModelQuerySet(OtherMixin[T], models.QuerySet[T], Generic[T]):
def example(self) -> T:
raise NotImplementedError
def override(self) -> T:
raise NotImplementedError
def override2(self) -> T:
raise NotImplementedError
def dummy_override(self) -> int:
raise NotImplementedError
def test_sub_self(self) -> Self:
raise NotImplementedError
class _MyModelQuerySet2(SomeMixin, _MyModelQuerySet[T_2]):
def example_2(self) -> T_2:
raise NotImplementedError
@typing_override
def override(self) -> T_2:
raise NotImplementedError
@typing_override
def override2(self) -> T_2:
raise NotImplementedError
@typing_override
def dummy_override(self) -> T_2: # type: ignore[override]
raise NotImplementedError
def test_self(self) -> Self:
raise NotImplementedError
class MyModelQuerySet(_MyModelQuerySet2["MyModel"]):
@typing_override
def override(self) -> "MyModel":
raise NotImplementedError
class MyModel(models.Model):
objects = MyModelQuerySet.as_manager()
class MyOtherModel(models.Model):
objects = _MyModelQuerySet2.as_manager()
- case: handles_type_vars
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel, BaseQuerySet
reveal_type(MyModel.objects.example()) # N: Revealed type is "myapp.models.MyModel"
reveal_type(MyModel.objects.example_list()) # N: Revealed type is "list[myapp.models.MyModel]"
reveal_type(MyModel.objects.example_type()) # N: Revealed type is "type[myapp.models.MyModel]"
reveal_type(MyModel.objects.example_tuple_simple()) # N: Revealed type is "tuple[myapp.models.MyModel]"
reveal_type(MyModel.objects.example_tuple_list()) # N: Revealed type is "tuple[myapp.models.MyModel, ...]"
reveal_type(MyModel.objects.example_tuple_double()) # N: Revealed type is "tuple[int, myapp.models.MyModel]"
reveal_type(MyModel.objects.example_class()) # N: Revealed type is "myapp.models.Example[myapp.models.MyModel]"
reveal_type(MyModel.objects.example_type_class()) # N: Revealed type is "type[myapp.models.Example[myapp.models.MyModel]]"
reveal_type(MyModel.objects.example_collection()) # N: Revealed type is "typing.Collection[myapp.models.MyModel]"
reveal_type(MyModel.objects.example_set()) # N: Revealed type is "set[myapp.models.MyModel]"
reveal_type(MyModel.objects.example_dict()) # N: Revealed type is "dict[str, myapp.models.MyModel]"
reveal_type(MyModel.objects.example_list_dict()) # N: Revealed type is "list[dict[str, myapp.models.MyModel]]"
class TestQuerySet(BaseQuerySet[str]): ... # E: Type argument "str" of "BaseQuerySet" must be a subtype of "Model" [type-var]
reveal_type(MyModel.objects.example_t(5)) # N: Revealed type is "int"
MyModel.objects.example_arg(5, "5") # E: Argument 1 to "example_arg" of "BaseQuerySet" has incompatible type "int"; expected "MyModel" [arg-type]
reveal_type(MyModel.objects.example_arg(MyModel(), "5")) # N: Revealed type is "myapp.models.MyModel"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from __future__ import annotations
from collections.abc import Collection
from typing import Generic
from typing_extensions import TypeVar
from django.db import models
_CTE = TypeVar("_CTE", bound=models.Model)
T = TypeVar("T")
class Example(Generic[_CTE]): ...
class BaseQuerySet(models.QuerySet[_CTE], Generic[_CTE]):
def example(self) -> _CTE:
raise NotImplementedError
def example_list(self) -> list[_CTE]:
raise NotImplementedError
def example_type(self) -> type[_CTE]:
raise NotImplementedError
def example_tuple_simple(self) -> tuple[_CTE]:
raise NotImplementedError
def example_tuple_list(self) -> tuple[_CTE, ...]:
raise NotImplementedError
def example_tuple_double(self) -> tuple[int, _CTE]:
raise NotImplementedError
def example_class(self) -> Example[_CTE]:
raise NotImplementedError
def example_type_class(self) -> type[Example[_CTE]]:
raise NotImplementedError
def example_collection(self) -> Collection[_CTE]:
raise NotImplementedError
def example_set(self) -> set[_CTE]:
raise NotImplementedError
def example_dict(self) -> dict[str, _CTE]:
raise NotImplementedError
def example_list_dict(self) -> list[dict[str, _CTE]]:
raise NotImplementedError
def example_t(self, a: T) -> T:
raise NotImplementedError
def example_arg(self, a: _CTE, b: str) -> _CTE:
raise NotImplementedError
class MyModelQuerySet(BaseQuerySet["MyModel"]):
...
class MyModel(models.Model):
objects = MyModelQuerySet.as_manager()
- case: reuses_generated_type_when_called_identically_for_multiple_managers
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel.objects_1) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]"
reveal_type(MyModel.objects_2) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]"
reveal_type(MyModel.objects_1.all()) # N: Revealed type is "myapp.models.ModelQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
reveal_type(MyModel.objects_2.all()) # N: Revealed type is "myapp.models.ModelQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class ModelQuerySet(models.QuerySet["MyModel"]):
...
class MyModel(models.Model):
objects_1 = ModelQuerySet.as_manager()
objects_2 = ModelQuerySet.as_manager()
- case: generates_new_manager_class_when_name_colliding_with_explicit_manager
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet1[myapp.models.MyModel]"
reveal_type(MyModel.objects.custom_method()) # N: Revealed type is "int"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class ManagerFromModelQuerySet(models.Manager):
...
class ModelQuerySet(models.QuerySet["MyModel"]):
def custom_method(self) -> int:
return 1
class MyModel(models.Model):
objects = ModelQuerySet.as_manager()
- case: handles_type_collision_with_from_queryset
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel, FromQuerySet
reveal_type(FromQuerySet) # N: Revealed type is "def [_T <: django.db.models.base.Model] () -> myapp.models.ManagerFromModelQuerySet[_T]"
reveal_type(MyModel.from_queryset) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]"
reveal_type(MyModel.as_manager) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class ModelQuerySet(models.QuerySet["MyModel"]):
...
FromQuerySet = models.Manager.from_queryset(ModelQuerySet)
class MyModel(models.Model):
from_queryset = FromQuerySet()
as_manager = ModelQuerySet.as_manager()
- case: nested_queryset_class_definition
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromMyQuerySet[myapp.models.MyModel]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyModel(models.Model):
class MyQuerySet(models.QuerySet):
pass
objects = MyQuerySet.as_manager()
- case: queryset_as_manager_foreignkey_cycle
main: |
from typing_extensions import reveal_type
from payments.models import Payout
reveal_type(Payout.objects) # N: Revealed type is "payments.models.ManagerFromPayoutQuerySet[payments.models.Payout]"
custom_settings: |
INSTALLED_APPS = ("django.contrib.contenttypes", "django.contrib.auth", "payments", "accounts")
AUTH_USER_MODEL = "accounts.Account"
files:
- path: payments/__init__.py
- path: payments/models.py
content: |
from __future__ import annotations
from typing_extensions import Self
from django.contrib.auth import get_user_model
from django.db import models
UserModel = get_user_model()
class Transaction(models.Model):
user = models.ForeignKey(
UserModel, on_delete=models.CASCADE, related_name="transactions"
)
class PayoutQuerySet(models.QuerySet["Payout"]):
def unapplied(self) -> Self:
return self
class Payout(models.Model):
triggered_by = models.ForeignKey(
Transaction, on_delete=models.CASCADE, related_name="payouts"
)
objects = PayoutQuerySet.as_manager()
- path: accounts/__init__.py
- path: accounts/models.py
content: |
from django.contrib.auth.models import AbstractUser
class Account(AbstractUser): pass
typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_basic_methods.yml 0000664 0000000 0000000 00000051215 15260643574 0032421 0 ustar 00root root 0000000 0000000 - case: queryset_missing_method
main: |
from typing_extensions import reveal_type
from myapp.models import User
reveal_type(User.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.User]"
User.objects.not_existing_method() # E: "Manager[User]" has no attribute "not_existing_method" [attr-defined]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
pass
- case: queryset_method_of_union
main: |
from typing_extensions import TypedDict, reveal_type
from django.contrib.auth.models import User
from django.db import models
from myapp.models import MyModel1, MyModel2
kls: type[MyModel1 | MyModel2] = MyModel1
reveal_type(kls.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.MyModel1] | django.db.models.manager.Manager[myapp.models.MyModel2]"
reveal_type(kls.objects.all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, myapp.models.MyModel1] | django.db.models.query.QuerySet[myapp.models.MyModel2, myapp.models.MyModel2]"
reveal_type(kls.objects.get()) # N: Revealed type is "myapp.models.MyModel1 | myapp.models.MyModel2"
# Regular QuerySet
foos = MyModel1.objects.all()
bars = MyModel2.objects.all()
reveal_type(foos.union(bars)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, myapp.models.MyModel1]"
reveal_type(foos.intersection(bars)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, myapp.models.MyModel1]"
reveal_type(foos.difference(bars)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, myapp.models.MyModel1]"
# `values_list()` QuerySet
foos_list = MyModel1.objects.all().values_list("name")
bars_list = MyModel2.objects.all().values_list("name")
reveal_type(foos_list.union(bars_list)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, tuple[str]]"
reveal_type(foos_list.intersection(bars_list)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, tuple[str]]"
reveal_type(foos_list.difference(bars_list)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, tuple[str]]"
def union_values_list() -> models.QuerySet[models.Model, tuple[str]]:
union = foos_list.union(bars_list)
return union
# `values()` QuerySet -- One field, same name
foos_dict = MyModel1.objects.all().values("name")
bars_dict = MyModel2.objects.all().values("name")
reveal_type(foos_dict.union(bars_dict)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': str})]"
reveal_type(foos_dict.intersection(bars_dict)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': str})]"
reveal_type(foos_dict.difference(bars_dict)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': str})]"
# `values()` QuerySet -- One field, different name, the first one takes precedence.
# cf https://docs.djangoproject.com/en/stable/ref/models/querysets/#django.db.models.query.QuerySet.union
foos_dict2 = MyModel1.objects.all().values("name")
bars_dict2 = MyModel2.objects.all().values("id")
reveal_type(foos_dict2.union(bars_dict2)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': str})]"
reveal_type(foos_dict2.intersection(bars_dict2)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': str})]"
reveal_type(foos_dict2.difference(bars_dict2)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': str})]"
# `values()` QuerySet -- Multiple field, same names
foos_dict3 = MyModel1.objects.all().values("name", "id")
bars_dict3 = MyModel2.objects.all().values("name", "id")
reveal_type(foos_dict3.union(bars_dict3)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': str, 'id': int})]"
reveal_type(foos_dict3.intersection(bars_dict3)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': str, 'id': int})]"
reveal_type(foos_dict3.difference(bars_dict3)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': str, 'id': int})]"
# Mixing `values()` and `values_list()` is apparently ok and takes the type of the first queryset
foos_dict4 = MyModel1.objects.all().values("name", "id")
bars_list4 = MyModel2.objects.all().values_list("name", "id")
reveal_type(foos_dict4.union(bars_list4)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': str, 'id': int})]"
reveal_type(foos_dict4.intersection(bars_list4)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': str, 'id': int})]"
reveal_type(foos_dict4.difference(bars_list4)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': str, 'id': int})]"
# TODO: Should be an error (mixed number of selected columns) -- runtime raises 'The used SELECT statements have a different number of columns'
foos_dict5 = MyModel1.objects.all().values("name", "id")
bars_dict5 = MyModel2.objects.all().values("name")
reveal_type(foos_dict5.union(bars_dict5)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': str, 'id': int})]"
reveal_type(foos_dict5.intersection(bars_dict5)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': str, 'id': int})]"
reveal_type(foos_dict5.difference(bars_dict5)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': str, 'id': int})]"
# TODO: Should be an error (mixed number of columns) -- runtime raises 'The used SELECT statements have a different number of columns'
model2_qs = MyModel2.objects.all()
user_qs = User.objects.all()
reveal_type(model2_qs.union(bars_dict5)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel2, myapp.models.MyModel2]"
reveal_type(model2_qs.intersection(bars_dict5)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel2, myapp.models.MyModel2]"
reveal_type(model2_qs.difference(bars_dict5)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel2, myapp.models.MyModel2]"
installed_apps:
- django.contrib.auth
- django.contrib.contenttypes
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyModel1(models.Model):
name = models.TextField(blank=False, null=False)
class MyModel2(models.Model):
name = models.TextField(blank=False, null=False)
- case: select_related_returns_queryset
main: |
from typing_extensions import reveal_type
from myapp.models import Book
reveal_type(Book.objects.select_related())
reveal_type(Book.objects.filter(pk=1).select_related())
Book.objects.select_related()
Book.objects.all().select_related()
Book.objects.select_related(None)
Book.objects.all().select_related(None)
Book.objects.select_related("author", "dd") # E: Invalid field name "dd" in select_related lookup. Choices are: author [misc]
Book.objects.all().select_related("author", "dd") # E: Invalid field name "dd" in select_related lookup. Choices are: author [misc]
Book.objects.select_related("None", None)
Book.objects.all().select_related("None", None)
Book.objects.select_related(1)
Book.objects.all().select_related(1)
Book.objects.select_related(True)
Book.objects.all().select_related(True)
out: |
main:3: note: Revealed type is "django.db.models.query.QuerySet[myapp.models.Book, myapp.models.Book]"
main:4: note: Revealed type is "django.db.models.query.QuerySet[myapp.models.Book, myapp.models.Book]"
main:13: error: No overload variant of "select_related" of "Manager" matches argument types "str", "None" [call-overload]
main:13: note: Possible overload variants:
main:13: note: def select_related(self, None, /) -> QuerySet[Book, Book]
main:13: note: def select_related(self, *fields: str) -> QuerySet[Book, Book]
main:14: error: No overload variant of "select_related" of "QuerySet" matches argument types "str", "None" [call-overload]
main:14: note: Possible overload variants:
main:14: note: def select_related(self, None, /) -> QuerySet[Book, Book]
main:14: note: def select_related(self, *fields: str) -> QuerySet[Book, Book]
main:15: error: No overload variant of "select_related" of "Manager" matches argument type "int" [call-overload]
main:15: note: Possible overload variants:
main:15: note: def select_related(self, None, /) -> QuerySet[Book, Book]
main:15: note: def select_related(self, *fields: str) -> QuerySet[Book, Book]
main:16: error: No overload variant of "select_related" of "QuerySet" matches argument type "int" [call-overload]
main:16: note: Possible overload variants:
main:16: note: def select_related(self, None, /) -> QuerySet[Book, Book]
main:16: note: def select_related(self, *fields: str) -> QuerySet[Book, Book]
main:17: error: No overload variant of "select_related" of "Manager" matches argument type "bool" [call-overload]
main:17: note: Possible overload variants:
main:17: note: def select_related(self, None, /) -> QuerySet[Book, Book]
main:17: note: def select_related(self, *fields: str) -> QuerySet[Book, Book]
main:18: error: No overload variant of "select_related" of "QuerySet" matches argument type "bool" [call-overload]
main:18: note: Possible overload variants:
main:18: note: def select_related(self, None, /) -> QuerySet[Book, Book]
main:18: note: def select_related(self, *fields: str) -> QuerySet[Book, Book]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Person(models.Model):
pass
class Book(models.Model):
author = models.ForeignKey(Person, on_delete=models.CASCADE)
- case: prefetch_related_returns_queryset
main: |
from typing_extensions import reveal_type
from myapp.models import Book
reveal_type(Book.objects.prefetch_related())
reveal_type(Book.objects.filter(pk=1).prefetch_related())
Book.objects.prefetch_related()
Book.objects.all().prefetch_related()
Book.objects.prefetch_related(None)
Book.objects.all().prefetch_related(None)
Book.objects.prefetch_related("author", "dd") # E: Cannot find "dd" on "Book" object, "dd" is an invalid parameter to "prefetch_related()" [misc]
Book.objects.all().prefetch_related("author", "dd") # E: Cannot find "dd" on "Book" object, "dd" is an invalid parameter to "prefetch_related()" [misc]
Book.objects.prefetch_related("None", None)
Book.objects.all().prefetch_related("None", None)
Book.objects.prefetch_related(1)
Book.objects.all().prefetch_related(1)
Book.objects.prefetch_related(True)
Book.objects.all().prefetch_related(True)
out: |
main:3: note: Revealed type is "django.db.models.query.QuerySet[myapp.models.Book, myapp.models.Book]"
main:4: note: Revealed type is "django.db.models.query.QuerySet[myapp.models.Book, myapp.models.Book]"
main:13: error: No overload variant of "prefetch_related" of "Manager" matches argument types "str", "None" [call-overload]
main:13: note: Possible overload variants:
main:13: note: def prefetch_related(self, None, /) -> QuerySet[Book, Book]
main:13: note: def [_LookupT: str, _PrefetchedQuerySetT: QuerySet[Model, Model], _ToAttrT: str] prefetch_related(self, *lookups: str | Prefetch[_LookupT, _PrefetchedQuerySetT, _ToAttrT]) -> QuerySet[Book, Book]
main:14: error: No overload variant of "prefetch_related" of "QuerySet" matches argument types "str", "None" [call-overload]
main:14: note: Possible overload variants:
main:14: note: def prefetch_related(self, None, /) -> QuerySet[Book, Book]
main:14: note: def [_LookupT: str, _PrefetchedQuerySetT: QuerySet[Model, Model], _ToAttrT: str] prefetch_related(self, *lookups: str | Prefetch[_LookupT, _PrefetchedQuerySetT, _ToAttrT]) -> QuerySet[Book, Book]
main:15: error: No overload variant of "prefetch_related" of "Manager" matches argument type "int" [call-overload]
main:15: note: Possible overload variants:
main:15: note: def prefetch_related(self, None, /) -> QuerySet[Book, Book]
main:15: note: def [_LookupT: str, _PrefetchedQuerySetT: QuerySet[Model, Model], _ToAttrT: str] prefetch_related(self, *lookups: str | Prefetch[_LookupT, _PrefetchedQuerySetT, _ToAttrT]) -> QuerySet[Book, Book]
main:16: error: No overload variant of "prefetch_related" of "QuerySet" matches argument type "int" [call-overload]
main:16: note: Possible overload variants:
main:16: note: def prefetch_related(self, None, /) -> QuerySet[Book, Book]
main:16: note: def [_LookupT: str, _PrefetchedQuerySetT: QuerySet[Model, Model], _ToAttrT: str] prefetch_related(self, *lookups: str | Prefetch[_LookupT, _PrefetchedQuerySetT, _ToAttrT]) -> QuerySet[Book, Book]
main:17: error: No overload variant of "prefetch_related" of "Manager" matches argument type "bool" [call-overload]
main:17: note: Possible overload variants:
main:17: note: def prefetch_related(self, None, /) -> QuerySet[Book, Book]
main:17: note: def [_LookupT: str, _PrefetchedQuerySetT: QuerySet[Model, Model], _ToAttrT: str] prefetch_related(self, *lookups: str | Prefetch[_LookupT, _PrefetchedQuerySetT, _ToAttrT]) -> QuerySet[Book, Book]
main:18: error: No overload variant of "prefetch_related" of "QuerySet" matches argument type "bool" [call-overload]
main:18: note: Possible overload variants:
main:18: note: def prefetch_related(self, None, /) -> QuerySet[Book, Book]
main:18: note: def [_LookupT: str, _PrefetchedQuerySetT: QuerySet[Model, Model], _ToAttrT: str] prefetch_related(self, *lookups: str | Prefetch[_LookupT, _PrefetchedQuerySetT, _ToAttrT]) -> QuerySet[Book, Book]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Person(models.Model):
pass
class Book(models.Model):
author = models.ForeignKey(Person, on_delete=models.CASCADE)
- case: prefetch_related_returns_raw_queryset
main: |
from myapp.models import Book
raw_qs = Book.objects.raw("SELECT 1")
raw_qs_from_manager = Book.objects.raw("SELECT 1")
raw_qs_from_manager.prefetch_related()
raw_qs.prefetch_related()
raw_qs_from_manager.prefetch_related(None)
raw_qs.prefetch_related(None)
raw_qs_from_manager.prefetch_related("author", "dd") # Should be Error on invalid lookup 'dd' !
raw_qs.prefetch_related("author", "dd") # Should be Error on invalid lookup 'dd' !
raw_qs_from_manager.prefetch_related("None", None)
raw_qs.prefetch_related("None", None)
raw_qs_from_manager.prefetch_related(1)
raw_qs.prefetch_related(1)
raw_qs_from_manager.prefetch_related(True)
raw_qs.prefetch_related(True)
out: |
main:12: error: No overload variant of "prefetch_related" of "RawQuerySet" matches argument types "str", "None" [call-overload]
main:12: note: Possible overload variants:
main:12: note: def prefetch_related(self, None, /) -> RawQuerySet[Book]
main:12: note: def [_LookupT: str, _PrefetchedQuerySetT: QuerySet[Model, Model], _ToAttrT: str] prefetch_related(self, *lookups: str | Prefetch[_LookupT, _PrefetchedQuerySetT, _ToAttrT]) -> RawQuerySet[Book]
main:13: error: No overload variant of "prefetch_related" of "RawQuerySet" matches argument types "str", "None" [call-overload]
main:13: note: Possible overload variants:
main:13: note: def prefetch_related(self, None, /) -> RawQuerySet[Book]
main:13: note: def [_LookupT: str, _PrefetchedQuerySetT: QuerySet[Model, Model], _ToAttrT: str] prefetch_related(self, *lookups: str | Prefetch[_LookupT, _PrefetchedQuerySetT, _ToAttrT]) -> RawQuerySet[Book]
main:14: error: No overload variant of "prefetch_related" of "RawQuerySet" matches argument type "int" [call-overload]
main:14: note: Possible overload variants:
main:14: note: def prefetch_related(self, None, /) -> RawQuerySet[Book]
main:14: note: def [_LookupT: str, _PrefetchedQuerySetT: QuerySet[Model, Model], _ToAttrT: str] prefetch_related(self, *lookups: str | Prefetch[_LookupT, _PrefetchedQuerySetT, _ToAttrT]) -> RawQuerySet[Book]
main:15: error: No overload variant of "prefetch_related" of "RawQuerySet" matches argument type "int" [call-overload]
main:15: note: Possible overload variants:
main:15: note: def prefetch_related(self, None, /) -> RawQuerySet[Book]
main:15: note: def [_LookupT: str, _PrefetchedQuerySetT: QuerySet[Model, Model], _ToAttrT: str] prefetch_related(self, *lookups: str | Prefetch[_LookupT, _PrefetchedQuerySetT, _ToAttrT]) -> RawQuerySet[Book]
main:16: error: No overload variant of "prefetch_related" of "RawQuerySet" matches argument type "bool" [call-overload]
main:16: note: Possible overload variants:
main:16: note: def prefetch_related(self, None, /) -> RawQuerySet[Book]
main:16: note: def [_LookupT: str, _PrefetchedQuerySetT: QuerySet[Model, Model], _ToAttrT: str] prefetch_related(self, *lookups: str | Prefetch[_LookupT, _PrefetchedQuerySetT, _ToAttrT]) -> RawQuerySet[Book]
main:17: error: No overload variant of "prefetch_related" of "RawQuerySet" matches argument type "bool" [call-overload]
main:17: note: Possible overload variants:
main:17: note: def prefetch_related(self, None, /) -> RawQuerySet[Book]
main:17: note: def [_LookupT: str, _PrefetchedQuerySetT: QuerySet[Model, Model], _ToAttrT: str] prefetch_related(self, *lookups: str | Prefetch[_LookupT, _PrefetchedQuerySetT, _ToAttrT]) -> RawQuerySet[Book]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Person(models.Model):
pass
class Book(models.Model):
author = models.ForeignKey(Person, on_delete=models.CASCADE)
- case: prefetch_related_traversing_multiple_relations
main: |
from typing_extensions import reveal_type
from django.db.models import Prefetch, F
from django.contrib.auth.models import User, Group
# When prefetching a relation that is traversing multiple relations
# The `to_attr` arg is set on the last item of the chain, not the initial one.
# We should NOT annotate the root model (User) with the to_attr.
user = (
User.objects
.prefetch_related(Prefetch("groups__user_set", User.objects.all(), to_attr="users"))
.get()
)
reveal_type(user) # N: Revealed type is "django.contrib.auth.models.User"
reveal_type(user.groups) # N: Revealed type is "django.contrib.auth.models.Group_ManyRelatedManager[django.contrib.auth.models.User_groups]"
last_group = user.groups.get()
reveal_type(last_group) # N: Revealed type is "django.contrib.auth.models.Group"
# Ideally we would like the type to be inferred as list[User] here
last_group.users # E: "Group" has no attribute "users"; maybe "user_set"? [attr-defined]
installed_apps:
- django.contrib.auth
- django.contrib.contenttypes
typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_bulk_create.yml 0000664 0000000 0000000 00000025636 15260643574 0032105 0 ustar 00root root 0000000 0000000 - case: bulk_create_valid_fields
installed_apps:
- myapp
main: |
from myapp.models import Article, Author, Category
from typing import Literal
# Valid update_fields
articles = [Article(title="Test")]
Article.objects.bulk_create(articles, update_fields=["title"])
Article.objects.bulk_create(articles, update_fields=["content"])
Article.objects.bulk_create(articles, update_fields=["published"])
# Valid update_fields with multiple fields
Article.objects.bulk_create(articles, update_fields=("title", "content"))
Article.objects.bulk_create(articles, update_fields={"title", "content", "published"})
# Valid update_fields with foreign key field
Article.objects.bulk_create(articles, update_fields=["author"])
Article.objects.bulk_create(articles, update_fields=["author_id"])
Article.objects.bulk_create(articles, update_fields=["category"])
Article.objects.bulk_create(articles, update_fields=["category_id"])
# Valid unique_fields
Article.objects.bulk_create(articles, unique_fields=["id"])
Article.objects.bulk_create(articles, unique_fields=["title"])
Article.objects.bulk_create(articles, unique_fields=["author"])
Article.objects.bulk_create(articles, unique_fields=["author_id"])
# Valid unique_fields with 'pk' alias
Article.objects.bulk_create(articles, unique_fields=["pk"])
Article.objects.bulk_create(articles, unique_fields=("pk", "title"))
# Valid combination of update_fields and unique_fields
Article.objects.bulk_create(
articles,
update_fields=["title", "content"],
unique_fields=["id"]
)
Article.objects.bulk_create(
articles,
update_fields=["content"],
unique_fields=["pk", "title"]
)
# Valid on different models
authors = [Author(name="Test")]
Author.objects.bulk_create(authors, update_fields=["name"])
Author.objects.bulk_create(authors, unique_fields=["id"])
categories = [Category(name="Test")]
Category.objects.bulk_create(categories, update_fields=["name"])
Category.objects.bulk_create(categories, unique_fields=["pk"])
# Variables with Literal types
update_field: Literal["title"] = "title"
unique_field: Literal["id"] = "id"
Article.objects.bulk_create(articles, update_fields=[update_field], unique_fields=[unique_field])
# Dynamic lists (no validation, passes through)
def get_fields() -> list[str]:
return ["title"]
Article.objects.bulk_create(articles, update_fields=get_fields(), unique_fields=get_fields())
# Async version
async def test_async_bulk_create() -> None:
articles = [Article(title="Test")]
await Article.objects.abulk_create(articles, update_fields=["title"])
await Article.objects.abulk_create(articles, unique_fields=["pk"])
await Article.objects.abulk_create(
articles,
update_fields=["content"],
unique_fields=["id"]
)
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
class Category(models.Model):
name = models.CharField(max_length=100)
parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True)
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
published = models.BooleanField(default=False)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
tags = models.ManyToManyField('myapp.Tag')
class Tag(models.Model):
name = models.CharField(max_length=50)
- case: bulk_create_invalid_fields
installed_apps:
- myapp
main: |
from myapp.models import Article, Author, Category
from typing import Literal
articles = [Article(title="Test")]
# Invalid field names in update_fields
Article.objects.bulk_create(articles, update_fields=["nonexistent"]) # E: Article has no field named 'nonexistent' [misc]
Article.objects.bulk_create(articles, update_fields=["invalid_field"]) # E: Article has no field named 'invalid_field' [misc]
# Cannot update primary key fields in update_fields
Article.objects.bulk_create(articles, update_fields=["id"]) # E: "bulk_create()" does not support primary key fields in "update_fields=". Got "id" [misc]
# ManyToMany is not a concrete updatable field
Article.objects.bulk_create(articles, update_fields={"tags"}) # E: "bulk_create()" can only be used with concrete fields. Got "tags" [misc]
# Invalid field names in unique_fields
Article.objects.bulk_create(articles, unique_fields=["nonexistent"]) # E: Article has no field named 'nonexistent' [misc]
Article.objects.bulk_create(articles, unique_fields=["invalid_field"]) # E: Article has no field named 'invalid_field' [misc]
# ManyToMany is not allowed in unique_fields either
Article.objects.bulk_create(articles, unique_fields={"tags"}) # E: "bulk_create()" can only be used with concrete fields. Got "tags" [misc]
# Mixed valid and invalid fields in update_fields
Article.objects.bulk_create(articles, update_fields={"title", "nonexistent"}) # E: Article has no field named 'nonexistent' [misc]
Article.objects.bulk_create(articles, update_fields=("id", "title")) # E: "bulk_create()" does not support primary key fields in "update_fields=". Got "id" [misc]
# Mixed valid and invalid fields in unique_fields
Article.objects.bulk_create(articles, unique_fields={"title", "nonexistent"}) # E: Article has no field named 'nonexistent' [misc]
# Whitespace-only field names
Article.objects.bulk_create(articles, update_fields=[""]) # E: Article has no field named '' [misc]
Article.objects.bulk_create(articles, unique_fields=[" "]) # E: Article has no field named ' ' [misc]
# Nested field lookups are not supported
Article.objects.bulk_create(articles, update_fields=["author__name"]) # E: Article has no field named 'author__name' [misc]
Article.objects.bulk_create(articles, unique_fields=["category__parent__name"]) # E: Article has no field named 'category__parent__name' [misc]
# Multiple invalid fields
Article.objects.bulk_create(articles, update_fields=["nonexistent1", "nonexistent2"]) # E: Article has no field named 'nonexistent1' [misc] # E: Article has no field named 'nonexistent2' [misc]
Article.objects.bulk_create(articles, unique_fields=["nonexistent1", "nonexistent2"]) # E: Article has no field named 'nonexistent1' [misc] # E: Article has no field named 'nonexistent2' [misc]
# Literal type variables are validated
invalid_field: Literal["nonexistent"] = "nonexistent"
Article.objects.bulk_create(articles, update_fields=[invalid_field]) # E: Article has no field named 'nonexistent' [misc]
Article.objects.bulk_create(articles, unique_fields=[invalid_field]) # E: Article has no field named 'nonexistent' [misc]
pk_field: Literal["id"] = "id"
Article.objects.bulk_create(articles, update_fields=[pk_field]) # E: "bulk_create()" does not support primary key fields in "update_fields=". Got "id" [misc]
# Test with different models
authors = [Author(name="Test")]
Author.objects.bulk_create(authors, update_fields=["id"]) # E: "bulk_create()" does not support primary key fields in "update_fields=". Got "id" [misc]
Author.objects.bulk_create(authors, update_fields=["invalid"]) # E: Author has no field named 'invalid' [misc]
Author.objects.bulk_create(authors, unique_fields=["invalid"]) # E: Author has no field named 'invalid' [misc]
categories = [Category(name="Test")]
Category.objects.bulk_create(categories, update_fields=["id"]) # E: "bulk_create()" does not support primary key fields in "update_fields=". Got "id" [misc]
Category.objects.bulk_create(categories, update_fields=["invalid"]) # E: Category has no field named 'invalid' [misc]
Category.objects.bulk_create(categories, unique_fields=["invalid"]) # E: Category has no field named 'invalid' [misc]
# Async version
async def test_async_bulk_create_invalid() -> None:
articles = [Article(title="Test")]
# Invalid field names in update_fields
await Article.objects.abulk_create(articles, update_fields=["invalid_field"]) # E: Article has no field named 'invalid_field' [misc]
# Cannot update primary key fields in update_fields
await Article.objects.abulk_create(articles, update_fields=["id"]) # E: "abulk_create()" does not support primary key fields in "update_fields=". Got "id" [misc]
# Invalid field names in unique_fields
await Article.objects.abulk_create(articles, unique_fields=["invalid_field"]) # E: Article has no field named 'invalid_field' [misc]
# ManyToMany is not allowed
await Article.objects.abulk_create(articles, update_fields={"tags"}) # E: "abulk_create()" can only be used with concrete fields. Got "tags" [misc]
await Article.objects.abulk_create(articles, unique_fields={"tags"}) # E: "abulk_create()" can only be used with concrete fields. Got "tags" [misc]
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
class Category(models.Model):
name = models.CharField(max_length=100)
parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True)
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
published = models.BooleanField(default=False)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
tags = models.ManyToManyField('myapp.Tag')
class Tag(models.Model):
name = models.CharField(max_length=50)
typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_bulk_update.yml 0000664 0000000 0000000 00000026001 15260643574 0032107 0 ustar 00root root 0000000 0000000 - case: bulk_update_valid_fields
installed_apps:
- myapp
main: |
from myapp.models import Article, Author, Category
# Valid single field updates
articles = Article.objects.all()
Article.objects.bulk_update(articles, ["title"])
Article.objects.bulk_update(articles, ["content"])
Article.objects.bulk_update(articles, ["published"])
# Valid multiple field updates
Article.objects.bulk_update(articles, ("title", "content"))
Article.objects.bulk_update(articles, {"title", "content", "published"})
# Valid foreign key field updates (by field name and attname)
Article.objects.bulk_update(articles, ["author"])
Article.objects.bulk_update(articles, ["author_id"])
Article.objects.bulk_update(articles, ["category"])
Article.objects.bulk_update(articles, ["category_id"])
# Valid updates on different models
authors = Author.objects.all()
Author.objects.bulk_update(authors, ["name"])
Author.objects.bulk_update(authors, ["email"])
categories = Category.objects.all()
Category.objects.bulk_update(categories, ["name"])
Category.objects.bulk_update(categories, ["parent"])
Category.objects.bulk_update(categories, ["parent_id"])
# Variables containing field names
field_name = "title"
Article.objects.bulk_update(articles, [field_name])
# Dynamic field lists
def get_fields() -> list[str]:
return ["title"]
Article.objects.bulk_update(articles, get_fields())
async def test_async_bulk_update() -> None:
# Valid single field updates
articles = Article.objects.all()
await Article.objects.abulk_update(articles, {"published"})
# Valid multiple field updates
await Article.objects.abulk_update(articles, ("title", "content", "published"))
# Valid foreign key field updates (by field name and attname)
await Article.objects.abulk_update(articles, ["category_id"])
# Valid updates on different models
authors = Author.objects.all()
await Author.objects.abulk_update(authors, ["email"])
categories = Category.objects.all()
await Category.objects.abulk_update(categories, ["parent_id"])
# Variables containing field names
field_name = "title"
await Article.objects.abulk_update(articles, [field_name])
# Dynamic field lists
def get_fields() -> list[str]:
return ["title"]
await Article.objects.abulk_update(articles, get_fields())
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Category(models.Model):
name = models.CharField(max_length=100)
parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True)
class Author(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
class Tag(models.Model):
name = models.CharField(max_length=50)
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
published = models.BooleanField(default=False)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
tags = models.ManyToManyField(Tag)
- case: bulk_update_invalid_fields
installed_apps:
- myapp
main: |
from myapp.models import Article, Author, Category
from typing import Literal
articles = Article.objects.all()
# Empty fields list
Article.objects.bulk_update() # E: Missing positional arguments "objs", "fields" in call to "bulk_update" of "Manager" [call-arg]
Article.objects.bulk_update(articles, []) # E: Field names must be given to "bulk_update()" [misc]
# Invalid field names (Django's FieldError)
Article.objects.bulk_update(articles, ["nonexistent"]) # E: Article has no field named 'nonexistent' [misc]
Article.objects.bulk_update(articles, ["invalid_field"]) # E: Article has no field named 'invalid_field' [misc]
# Cannot update primary key fields
Article.objects.bulk_update(articles, ["id"]) # E: "bulk_update()" does not support primary key fields. Got "id" [misc]
# Mixed valid and invalid fields
Article.objects.bulk_update(articles, {"title", "nonexistent"}) # E: Article has no field named 'nonexistent' [misc]
Article.objects.bulk_update(articles, ("id", "title")) # E: "bulk_update()" does not support primary key fields. Got "id" [misc]
# Whitespace-only field names
Article.objects.bulk_update(articles, [""]) # E: Article has no field named '' [misc]
Article.objects.bulk_update(articles, [" "]) # E: Article has no field named ' ' [misc]
# ManyToMany is not a concrete updatable field
Article.objects.bulk_update(articles, {"tags"}) # E: "bulk_update()" can only be used with concrete fields. Got "tags" [misc]
# Nested field lookups are not supported
Article.objects.bulk_update(articles, ["author__name"]) # E: Article has no field named 'author__name' [misc]
Article.objects.bulk_update(articles, ["category__parent__name"]) # E: Article has no field named 'category__parent__name' [misc]
# Multiple invalid fields
Article.objects.bulk_update(articles, ["nonexistent1", "nonexistent2"]) # E: Article has no field named 'nonexistent1' [misc] # E: Article has no field named 'nonexistent2' [misc]
# Primary key with valid fields
Article.objects.bulk_update(articles, ["title", "id", "content"]) # E: "bulk_update()" does not support primary key fields. Got "id" [misc]
# Literal type variables are validated
invalid_field: Literal["nonexistent"] = "nonexistent"
Article.objects.bulk_update(articles, [invalid_field]) # E: Article has no field named 'nonexistent' [misc]
pk_field: Literal["id"] = "id"
Article.objects.bulk_update(articles, [pk_field]) # E: "bulk_update()" does not support primary key fields. Got "id" [misc]
# Test with different models
authors = Author.objects.all()
Author.objects.bulk_update(authors, ["id"]) # E: "bulk_update()" does not support primary key fields. Got "id" [misc]
Author.objects.bulk_update(authors, ["invalid"]) # E: Author has no field named 'invalid' [misc]
categories = Category.objects.all()
Category.objects.bulk_update(categories, ["id"]) # E: "bulk_update()" does not support primary key fields. Got "id" [misc]
Category.objects.bulk_update(categories, ["invalid"]) # E: Category has no field named 'invalid' [misc]
# Async version
async def test_async_bulk_update_invalid() -> None:
articles = Article.objects.all()
# Empty fields list
await Article.objects.abulk_update() # E: Missing positional arguments "objs", "fields" in call to "abulk_update" of "Manager" [call-arg]
await Article.objects.abulk_update(articles, []) # E: Field names must be given to "abulk_update()" [misc]
# Invalid field names (Django's FieldError)
await Article.objects.abulk_update(articles, ["invalid_field"]) # E: Article has no field named 'invalid_field' [misc]
# Cannot update primary key fields
await Article.objects.abulk_update(articles, ["id"]) # E: "abulk_update()" does not support primary key fields. Got "id" [misc]
# Mixed valid and invalid fields
await Article.objects.abulk_update(articles, ["id", "title"]) # E: "abulk_update()" does not support primary key fields. Got "id" [misc]
# Whitespace-only field names
await Article.objects.abulk_update(articles, [" "]) # E: Article has no field named ' ' [misc]
# ManyToMany is not a concrete updatable field
await Article.objects.abulk_update(articles, ["tags"]) # E: "abulk_update()" can only be used with concrete fields. Got "tags" [misc]
# Nested field lookups are not supported
await Article.objects.abulk_update(articles, ["author__name"]) # E: Article has no field named 'author__name' [misc]
await Article.objects.abulk_update(articles, ["category__parent__name"]) # E: Article has no field named 'category__parent__name' [misc]
# Multiple invalid fields
await Article.objects.abulk_update(articles, ("nonexistent1", "nonexistent2")) # E: Article has no field named 'nonexistent1' [misc] # E: Article has no field named 'nonexistent2' [misc]
# Primary key with valid fields
await Article.objects.abulk_update(articles, ["title", "id", "content"]) # E: "abulk_update()" does not support primary key fields. Got "id" [misc]
# Literal type variables are validated
invalid_field: Literal["nonexistent"] = "nonexistent"
await Article.objects.abulk_update(articles, {invalid_field}) # E: Article has no field named 'nonexistent' [misc]
pk_field: Literal["id"] = "id"
await Article.objects.abulk_update(articles, [pk_field]) # E: "abulk_update()" does not support primary key fields. Got "id" [misc]
# Test with different models
authors = Author.objects.all()
await Author.objects.abulk_update(authors, ["invalid"]) # E: Author has no field named 'invalid' [misc]
categories = Category.objects.all()
await Category.objects.abulk_update(categories, ["invalid"]) # E: Category has no field named 'invalid' [misc]
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Category(models.Model):
name = models.CharField(max_length=100)
parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True)
class Author(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
published = models.BooleanField(default=False)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
tags = models.ManyToManyField('myapp.Tag')
class Tag(models.Model):
name = models.CharField(max_length=50)
typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_defer_only.yml 0000664 0000000 0000000 00000033027 15260643574 0031744 0 ustar 00root root 0000000 0000000 - case: defer_valid_fields
installed_apps:
- myapp
main: |
from myapp.models import Article, Author
from django.db.models import F
# Simple fields
Article.objects.defer("id")
Article.objects.defer("title")
Article.objects.defer("content")
Article.objects.defer("published")
# Multiple fields in one call
Article.objects.defer("title", "content")
# FK field (by name and attname)
Article.objects.defer("author")
Article.objects.defer("author_id")
# FK traversal
Article.objects.defer("author__name")
Article.objects.defer("author__email")
# M2M (silently ignored by Django)
Article.objects.defer("tags")
# Clear deferrals
Article.objects.defer(None)
# Non-literal strings (skipped by validation)
field: str = "foo"
Article.objects.defer(field)
# Chained defer() calls are additive — each is valid
Article.objects.defer("title").defer("content")
Article.objects.defer("content").filter(published=True).defer("title")
# Re-deferring an already-deferred field is harmless
Article.objects.defer("title").defer("title")
# defer(None) clears all accumulated deferrals
Article.objects.defer("title").defer("content").defer(None)
# Valid double-underscore traversal alongside select_related()
Article.objects.select_related().defer("author__name")
Article.objects.select_related("author").defer("author__email")
Article.objects.select_related("author").defer("author__name", "author__email")
# Multi-level FK traversal with select_related
Article.objects.select_related("author__profile").defer("author__profile__bio")
# only() followed by defer() to exclude one of the loaded fields
Article.objects.only("title", "content").defer("content")
# defer() followed by only()
Article.objects.defer("content").only("title")
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Profile(models.Model):
bio = models.TextField()
class Author(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
profile = models.ForeignKey(Profile, null=True, on_delete=models.SET_NULL)
class Tag(models.Model):
name = models.CharField(max_length=50)
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
published = models.BooleanField(default=False)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
tags = models.ManyToManyField(Tag)
- case: defer_invalid_fields
installed_apps:
- myapp
main: |
from myapp.models import Article, Author
from django.db.models import F
from typing import Literal
# Non-existent field
Article.objects.defer("nonexistent") # E: Invalid field in "defer()": Article has no field named 'nonexistent' [misc]
# Invalid chained lookup
Article.objects.defer("author__nonexistent") # E: Invalid field in "defer()": Author has no field named 'nonexistent' [misc]
# Nested lookup on non-relation field
Article.objects.defer("title__something") # E: Invalid field in "defer()": something [misc]
# Annotated fields cannot be deferred
Article.objects.annotate(foo=F("id")).defer("foo") # E: Invalid field in "defer()": Article has no field named 'foo' [misc]
Article.objects.annotate(bar=F("id")).defer("bar", "title") # E: Invalid field in "defer()": Article has no field named 'bar' [misc]
Article.objects.annotate(foo=F("id")).defer("nonexistent") # E: Invalid field in "defer()": Article has no field named 'nonexistent' [misc]
# Literal typed invalid
field: Literal["nonexistent"] = "nonexistent"
Article.objects.defer(field) # E: Invalid field in "defer()": Article has no field named 'nonexistent' [misc]
# Invalid field in a chain — error still raised
Article.objects.filter(published=True).defer("nonexistent") # E: Invalid field in "defer()": Article has no field named 'nonexistent' [misc]
# First defer valid, second invalid
Article.objects.defer("title").defer("nonexistent") # E: Invalid field in "defer()": Article has no field named 'nonexistent' [misc]
# Invalid after defer(None) reset
Article.objects.defer(None).defer("nonexistent") # E: Invalid field in "defer()": Article has no field named 'nonexistent' [misc]
# Invalid traversal even with select_related
Article.objects.select_related("author").defer("author__nonexistent") # E: Invalid field in "defer()": Author has no field named 'nonexistent' [misc]
# Attempting to defer the primary key (pk alias and concrete field name)
Article.objects.defer("pk") # E: Invalid field in "defer()": Article has no field named 'pk' [misc]
# Invalid field in only() when combined with defer()
Article.objects.only("nonexistent").defer("content") # E: Invalid field in "only()": Article has no field named 'nonexistent' [misc]
Article.objects.only("title").defer("nonexistent") # E: Invalid field in "defer()": Article has no field named 'nonexistent' [misc]
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
published = models.BooleanField(default=False)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
- case: only_valid_fields
installed_apps:
- myapp
main: |
from myapp.models import Article, Author
from django.db.models import F
# Simple fields
Article.objects.only("pk")
Article.objects.only("id")
Article.objects.only("title")
Article.objects.only("content")
Article.objects.only("published")
# Multiple fields
Article.objects.only("title", "content")
# FK field (by name and attname)
Article.objects.only("author")
Article.objects.only("author_id")
# FK traversal
Article.objects.only("author__name")
Article.objects.only("author__email")
# M2M
Article.objects.only("tags")
# Non-literal strings (skipped by validation)
field: str = "foo"
Article.objects.only(field)
# Chained only() calls — each is independently valid
Article.objects.only("title").only("content")
Article.objects.only("title", "content").only("published")
Article.objects.only("title").filter(published=True).only("content")
# Valid double-underscore traversal with select_related
Article.objects.select_related("author").only("title", "author__name")
Article.objects.select_related("author").only("author__email")
# Multi-level FK traversal with select_related
Article.objects.select_related("author__profile").only("title", "author__profile__bio")
# Two separate FK relations in one only() call
Article.objects.only("author__name", "editor__username")
Article.objects.only("title", "author__name", "editor__username")
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Profile(models.Model):
bio = models.TextField()
class Author(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
profile = models.ForeignKey(Profile, null=True, on_delete=models.SET_NULL)
class Editor(models.Model):
username = models.CharField(max_length=50)
class Tag(models.Model):
name = models.CharField(max_length=50)
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
published = models.BooleanField(default=False)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
editor = models.ForeignKey(Editor, null=True, on_delete=models.SET_NULL)
tags = models.ManyToManyField(Tag)
- case: only_pk_on_abstract_model_no_crash
installed_apps:
- myapp
main: |
from django.db.models import QuerySet
from myapp.models import AbstractArticle
from typing_extensions import reveal_type
def test(qs: QuerySet[AbstractArticle]) -> None:
reveal_type(qs.only("pk")) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.AbstractArticle, myapp.models.AbstractArticle]"
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class AbstractArticle(models.Model):
title = models.CharField(max_length=200)
class Meta:
abstract = True
class Article(AbstractArticle):
pass
- case: only_invalid_fields
installed_apps:
- myapp
main: |
from myapp.models import Article, Author
from django.db.models import F
from typing import Literal
# Non-existent field
Article.objects.only("nonexistent") # E: Invalid field in "only()": Article has no field named 'nonexistent' [misc]
# Invalid chained lookup
Article.objects.only("author__nonexistent") # E: Invalid field in "only()": Author has no field named 'nonexistent' [misc]
# Nested lookup on non-relation field
Article.objects.only("title__something") # E: Invalid field in "only()": something [misc]
# Annotated field skipped, valid real field alongside it
Article.objects.annotate(foo=F("id")).only("foo") # E: Invalid field in "only()": Article has no field named 'foo' [misc]
Article.objects.annotate(bar=F("id")).only("bar", "title") # E: Invalid field in "only()": Article has no field named 'bar' [misc]
Article.objects.annotate(foo=F("id")).only("nonexistent",) # E: Invalid field in "only()": Article has no field named 'nonexistent' [misc]
# Literal typed invalid
field: Literal["nonexistent"] = "nonexistent"
Article.objects.only(field) # E: Invalid field in "only()": Article has no field named 'nonexistent' [misc]
# Invalid field in a chained only() call
Article.objects.only("nonexistent").only("content") # E: Invalid field in "only()": Article has no field named 'nonexistent' [misc]
Article.objects.only("title").only("nonexistent") # E: Invalid field in "only()": Article has no field named 'nonexistent' [misc]
# Invalid traversal with select_related
Article.objects.select_related("author").only("title", "author__nonexistent") # E: Invalid field in "only()": Author has no field named 'nonexistent' [misc]
# Multi-level invalid traversal
Article.objects.select_related("author__profile").only("author__profile__nonexistent") # E: Invalid field in "only()": Profile has no field named 'nonexistent' [misc]
# Two FK relations — first invalid, second valid
Article.objects.only("author__nonexistent", "editor__username") # E: Invalid field in "only()": Author has no field named 'nonexistent' [misc]
# Two FK relations — first valid, second invalid
Article.objects.only("author__name", "editor__nonexistent") # E: Invalid field in "only()": Editor has no field named 'nonexistent' [misc]
# Both FK paths invalid — two errors expected
Article.objects.only("author__bad") # E: Invalid field in "only()": Author has no field named 'bad' [misc]
Article.objects.only("editor__bad") # E: Invalid field in "only()": Editor has no field named 'bad' [misc]
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Profile(models.Model):
bio = models.TextField()
class Author(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
profile = models.ForeignKey(Profile, null=True, on_delete=models.SET_NULL)
class Editor(models.Model):
username = models.CharField(max_length=50)
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
published = models.BooleanField(default=False)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
editor = models.ForeignKey(Editor, null=True, on_delete=models.SET_NULL)
typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_distinct.yml 0000664 0000000 0000000 00000007741 15260643574 0031443 0 ustar 00root root 0000000 0000000 - case: distinct_valid_fields
installed_apps:
- myapp
main: |
from myapp.models import Article, Author
from django.db.models import F
from django.db.models.functions import Lower
# Bare distinct (no field names)
Article.objects.distinct()
# Simple fields
Article.objects.distinct("title")
Article.objects.distinct("pk")
Article.objects.distinct("id")
# FK traversal
Article.objects.distinct("author__name")
# Multiple fields
Article.objects.distinct("title", "author__name")
# FK id field
Article.objects.distinct("author_id")
# Transform
Article.objects.distinct("created__date")
# Annotated fields
Article.objects.annotate(foo=F("id")).distinct("foo")
# Fields selected via values()/values_list(), including aliases
Article.objects.values("title").distinct("title")
Article.objects.values(lower_title=Lower("title")).distinct("lower_title")
# Non-literal strings (skipped by validation)
field: str = "foo"
Article.objects.distinct(field)
# Reverse FK traversal
Author.objects.distinct("article__title")
# Chained
Article.objects.filter(published=True).distinct("title")
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
published = models.BooleanField(default=False)
created = models.DateTimeField(auto_now_add=True)
author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name="article")
- case: distinct_invalid_fields
installed_apps:
- myapp
main: |
from myapp.models import Article, Author
from typing import Literal
# Non-existent field
Article.objects.distinct("nonexistent") # E: Cannot resolve keyword 'nonexistent' into field. Choices are: author, author_id, content, id, published, title [misc]
# Invalid chained lookup
Article.objects.distinct("author__nonexistent") # E: Cannot resolve keyword 'nonexistent' into field or transform on 'author'. [misc]
# Lookup suffix on a valid field
Article.objects.distinct("title__exact") # E: Cannot resolve keyword 'exact' into field or transform on 'title'. [misc]
# Literal typed invalid
field: Literal["nonexistent"] = "nonexistent"
Article.objects.distinct(field) # E: Cannot resolve keyword 'nonexistent' into field. Choices are: author, author_id, content, id, published, title [misc]
# Invalid field at depth > 2
Article.objects.distinct("author__name__nonexistent") # E: Cannot resolve keyword 'nonexistent' into field or transform on 'name'. [misc]
# Unlike order_by, distinct does not support the "-" descending prefix
Article.objects.distinct("-title") # E: Cannot resolve keyword '-title' into field. Choices are: author, author_id, content, id, published, title [misc]
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
published = models.BooleanField(default=False)
author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name="article")
typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_filter.yml 0000664 0000000 0000000 00000045050 15260643574 0031102 0 ustar 00root root 0000000 0000000 - case: filtering_with_proper_types
main: |
from myapp.models import User
User.objects.filter(username='maksim')
User.objects.get(username='maksim')
User.objects.exclude(username='maksim')
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
username = models.CharField(max_length=100)
- case: no_such_field_for_filter
main: |
from myapp.models import User
User.objects.filter(unknown_field=True) # E: Cannot resolve keyword 'unknown_field' into field. Choices are: id [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
pass
- case: filter_with_invalid_type
main: |
from myapp.models import User
User.objects.filter(age=User()) # E: Incompatible type for lookup 'age': (got "User", expected "str | int") [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from django.db import models
class User(models.Model):
age = models.IntegerField()
# Regression test for #2831
- case: filter_with_decimal
main: |
from myapp.models import MyModel
from decimal import Decimal
MyModel.objects.filter(a=1)
MyModel.objects.filter(a="1.0")
MyModel.objects.filter(a=Decimal(1.0))
MyModel.objects.filter(a=1.0) # E: Incompatible type for lookup 'a': (got "float", expected "str | int | Decimal") [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyModel(models.Model):
a = models.DecimalField()
- case: filter_with_multiple_fields
main: |
from myapp.models import User
User.objects.filter(age=User(), gender=User())
installed_apps:
- myapp
out: |
main:2: error: Incompatible type for lookup 'age': (got "User", expected "str | int") [misc]
main:2: error: Incompatible type for lookup 'gender': (got "User", expected "str | int") [misc]
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
age = models.IntegerField()
gender = models.IntegerField()
- case: valid_filter_with_lookup
main: |
from myapp.models import User
# Simple lookups which expect the same type.
User.objects.filter(username__contains='hello')
User.objects.filter(age__gt=1)
# The `__in` lookup expects an iterable of the field type.
# Regression test for https://github.com/typeddjango/django-stubs/issue/xxxx
User.objects.filter(age__in=[1, 2, 3])
User.objects.filter(age__in=(1, 2, 3))
User.objects.filter(age__in=range(4))
User.objects.filter(age__in=123) # E: Incompatible type for lookup 'age__in': (got "int", expected "Iterable[str | int]") [misc]
User.objects.filter(age__in=None) # E: Incompatible type for lookup 'age__in': (got "None", expected "Iterable[str | int]") [misc]
User.objects.filter(age__in="abc") # Doesn't error because `Iterable[str]` is valid so `str` is valid.
User.objects.filter(age__in=(User(),)) # E: Incompatible type for lookup 'age__in': (got "tuple[User]", expected "Iterable[str | int]") [misc]
User.objects.filter(age__in=[User()]) # Doesn't error because mypy sees the provided type as `list[Any]`.
users: list[User] = [User()]
User.objects.filter(age__in=users) # E: Incompatible type for lookup 'age__in': (got "list[User]", expected "Iterable[str | int]") [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
username = models.CharField(max_length=100)
age = models.IntegerField()
- case: invalid_filter_with_lookup
main: |
from myapp.models import User
User.objects.filter(username__contains=1) # E: Incompatible type for lookup 'username__contains': (got "int", expected "str") [misc]
User.objects.filter(username__icontains=1) # E: Incompatible type for lookup 'username__icontains': (got "int", expected "str") [misc]
User.objects.filter(username__isnull=1) # E: Incompatible type for lookup 'username__isnull': (got "int", expected "bool") [misc]
User.objects.filter(created_at=User()) # E: Incompatible type for lookup 'created_at': (got "User", expected "str | datetime") [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
username = models.CharField(max_length=100)
age = models.IntegerField()
created_at = models.DateTimeField()
- case: strings_are_allowed_for_exact_for_dates
main: |
from myapp.models import User
User.objects.filter(created_at='2018')
User.objects.filter(created_at__exact='2018')
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
created_at = models.DateTimeField()
- case: related_model_foreign_key_lookups
main: |
from myapp.models import Blog, Publisher
blog = Blog()
publisher = Publisher()
Blog.objects.filter(publisher=publisher)
Blog.objects.filter(publisher_id=1)
Blog.objects.filter(publisher__id=1)
Blog.objects.filter(publisher=blog) # E: Incompatible type for lookup 'publisher': (got "Blog", expected "Publisher | int | None") [misc]
Blog.objects.filter(publisher_id=blog) # E: Incompatible type for lookup 'publisher_id': (got "Blog", expected "str | int") [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Publisher(models.Model):
pass
class Blog(models.Model):
publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE, related_name='blogs')
- case: related_model_reverse_foreign_key_lookup
main: |
from myapp.models import Blog, Publisher, Category
blog = Blog()
publisher = Publisher()
# With related_name
Publisher.objects.filter(blogs=Blog())
Publisher.objects.filter(blogs__id=1)
Publisher.objects.filter(blogs=publisher) # E: Incompatible type for lookup 'blogs': (got "Publisher", expected "Blog | int | None") [misc]
Publisher.objects.filter(blogs__id=publisher) # E: Incompatible type for lookup 'blogs__id': (got "Publisher", expected "str | int") [misc]
# Without related_name
Category.objects.filter(blog=Blog())
Category.objects.filter(blog__id=1)
Category.objects.filter(blog=publisher) # E: Incompatible type for lookup 'blog': (got "Publisher", expected "Blog | int | None") [misc]
Category.objects.filter(blog__id=publisher) # E: Incompatible type for lookup 'blog__id': (got "Publisher", expected "str | int") [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Publisher(models.Model):
pass
class Category(models.Model):
pass
class Blog(models.Model):
publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE, related_name='blogs')
category = models.ForeignKey(Category, on_delete=models.CASCADE)
- case: many_to_many_lookups
main: |
from myapp.models import Book, Author
book = Book()
author = Author()
Book.objects.filter(authors=author)
Book.objects.filter(authors=book) # E: Incompatible type for lookup 'authors': (got "Book", expected "Author | int | None") [misc]
Book.objects.filter(authors='hello') # E: Incompatible type for lookup 'authors': (got "str", expected "Author | int | None") [misc]
Author.objects.filter(books=book)
Author.objects.filter(books=author) # E: Incompatible type for lookup 'books': (got "Author", expected "Book | int | None") [misc]
Author.objects.filter(books='hello') # E: Incompatible type for lookup 'books': (got "str", expected "Book | int | None") [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Book(models.Model):
pass
class Author(models.Model):
books = models.ManyToManyField(Book, related_name='authors')
- case: one_to_one_lookups
main: |
from myapp.models import User, Profile
user = User()
profile = Profile()
User.objects.filter(profile=profile)
User.objects.filter(profile=user) # E: Incompatible type for lookup 'profile': (got "User", expected "Profile | int | None") [misc]
User.objects.filter(profile='hello') # E: Incompatible type for lookup 'profile': (got "str", expected "Profile | int | None") [misc]
Profile.objects.filter(user=user)
Profile.objects.filter(user=profile) # E: Incompatible type for lookup 'user': (got "Profile", expected "User | int | None") [misc]
Profile.objects.filter(user='hello') # E: Incompatible type for lookup 'user': (got "str", expected "User | int | None") [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
pass
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
- case: lookup_with_union_of_model_and_outer_ref
main: |
from django.db.models import Exists, OuterRef, QuerySet
from myapp.models import Profile, User
def profiles_for(user: User | OuterRef) -> "QuerySet[Profile]":
return Profile.objects.filter(user=user)
profiles_for(User())
users_with_profile = User.objects.filter(Exists(profiles_for(OuterRef("pk"))))
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
pass
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
# TODO
- case: f_expression_simple_case
main: |
from myapp.models import User
from django.db import models
User.objects.filter(username=models.F('username2'))
User.objects.filter(username=models.F('age'))
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
username = models.TextField()
username2 = models.TextField()
age = models.IntegerField()
# TODO
- case: f_expression_with_expression_math_is_not_supported
main: |
from myapp.models import User
from django.db import models
User.objects.filter(username=models.F('username2') + 'hello')
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
username = models.TextField()
username2 = models.TextField()
age = models.IntegerField()
- case: alias_and_annotate_can_be_used_with_dynamic_new_fields
main: |
from django.db import models
from myapp.models import Blog
Blog.objects.alias(alias_entries=models.Count("entry")).annotate(
annotate_entries=models.Count("entry"),
).filter(alias_entries__gt=5, annotate_entries__gt=5)
Blog.objects.alias(alias_entries=models.Count("entry")).filter(alias_entries=5)
Blog.objects.alias(alias_entries=models.Count("entry")).filter(alias_entries__gt=5)
Blog.objects.alias( # E: Cannot resolve keyword 'alias_e' into field. Choices are: entry, id, alias_entries [misc]
alias_entries=models.Count("entry")
).filter(
# Wrong name:
alias_e=5
)
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Blog(models.Model):
pass
class Entry(models.Model):
blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
# Regression test for #1172
- case: chained_filter_lookups
main: |
from myapp.models import Cheese
Cheese.objects.filter(field=True).filter(field2=True)
qs = Cheese.objects.all()
qs.filter(field=True)
out: |
main:3: error: Cannot resolve keyword 'field' into field. Choices are: a, id [misc]
main:3: error: Cannot resolve keyword 'field2' into field. Choices are: a, id [misc]
main:5: error: Cannot resolve keyword 'field' into field. Choices are: a, id [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Cheese(models.Model):
a = models.BooleanField()
- case: lookups_from_custom_queryset
main: |
from myapp.models import MyModel
qs = MyModel.objects.all()
qs.filter(unknown_field=True) # E: Cannot resolve keyword 'unknown_field' into field. Choices are: age, id [misc]
qs.filter(age=MyModel()) # E: Incompatible type for lookup 'age': (got "MyModel", expected "str | int") [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyQuerySet(models.QuerySet["MyModel"]):
...
class MyModel(models.Model):
age = models.IntegerField()
objects = MyQuerySet.as_manager()
- case: async_filtering_with_aget
main: |
from myapp.models import User
async def test_async_get() -> None:
# Valid aget calls
user = await User.objects.aget(username='maksim')
user2 = await User.objects.aget(age=25)
user3 = await User.objects.aget(username__contains='hello')
user4 = await User.objects.aget(age__gt=1)
# Invalid field
await User.objects.aget(unknown_field=True) # E: Cannot resolve keyword 'unknown_field' into field. Choices are: age, id, username [misc]
# Invalid type
await User.objects.aget(age=User()) # E: Incompatible type for lookup 'age': (got "User", expected "str | int") [misc]
# Invalid lookup type
await User.objects.aget(username__contains=1) # E: Incompatible type for lookup 'username__contains': (got "int", expected "str") [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
username = models.CharField(max_length=100)
age = models.IntegerField()
- case: transform_then_lookup_uses_transform_output_type
main: |
from datetime import date
from myapp.models import Event
def by_int_years(years: list[int]) -> None:
# `year` transform outputs an int, so lookups on it expect ints
Event.objects.filter(start_date__year__in=years)
Event.objects.filter(start_date__year__exact=2000)
# a bare transform lookup (`__year`) is the same as `__year__exact`
Event.objects.filter(start_date__year=2000)
def by_date_years(years: list[date]) -> None:
Event.objects.filter(start_date__year__in=years) # E: Incompatible type for lookup 'start_date__year__in': (got "list[date]", expected "Iterable[str | int]") [misc]
Event.objects.filter(start_date__year__in=range(5))
Event.objects.filter(start_date__year__in=123) # E: Incompatible type for lookup 'start_date__year__in': (got "int", expected "Iterable[str | int]") [misc]
def by_date(day: date) -> None:
Event.objects.filter(start_date__year__exact=day) # E: Incompatible type for lookup 'start_date__year__exact': (got "date", expected "str | int") [misc]
def by_days(days: list[date]) -> None:
# `date` truncates a datetime, so `created_at__date` outputs a date again
Event.objects.filter(created_at__date__in=days)
def by_numbers(numbers: list[int]) -> None:
Event.objects.filter(created_at__date__in=numbers) # E: Incompatible type for lookup 'created_at__date__in': (got "list[int]", expected "Iterable[str | date]") [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Event(models.Model):
start_date = models.DateField()
created_at = models.DateTimeField()
typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_from_queryset.yml 0000664 0000000 0000000 00000146127 15260643574 0032530 0 ustar 00root root 0000000 0000000 - case: from_queryset_self_return_management
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel, MyModelWithoutSelf
reveal_type(MyModel.objects.example_simple()) # N: Revealed type is "myapp.models.MyQuerySet[myapp.models.MyModel]"
reveal_type(MyModel.objects.example_list()) # N: Revealed type is "list[myapp.models.MyQuerySet[myapp.models.MyModel]]"
reveal_type(MyModel.objects.example_simple().just_int()) # N: Revealed type is "int"
reveal_type(MyModel.objects.example_dict()) # N: Revealed type is "dict[str, myapp.models.MyQuerySet[myapp.models.MyModel]]"
reveal_type(MyModel.objects.test_custom_manager()) # N: Revealed type is "myapp.models.CustomManagerFromMyQuerySet[myapp.models.MyModel]"
reveal_type(MyModelWithoutSelf.objects.method()) # N: Revealed type is "myapp.models.QuerySetWithoutSelf[myapp.models.MyModelWithoutSelf, myapp.models.MyModelWithoutSelf]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from django.db.models.manager import Manager
from typing_extensions import Self, TypeVar
M = TypeVar("M", covariant=True, bound=models.Model)
class CustomManager(Manager[M]):
def test_custom_manager(self) -> Self:
raise NotImplementedError
class BaseQuerySet(models.QuerySet[M]):
def example_dict(self) -> dict[str, Self]:
raise NotImplementedError
class MyQuerySet(BaseQuerySet[M]):
def example_simple(self) -> Self:
raise NotImplementedError
def example_list(self) -> list[Self]:
raise NotImplementedError
def just_int(self) -> int:
raise NotImplementedError
NewManager = CustomManager.from_queryset(MyQuerySet)
class MyModel(models.Model):
objects = NewManager()
class QuerySetWithoutSelf(models.QuerySet["MyModelWithoutSelf"]):
def method(self) -> "QuerySetWithoutSelf":
return self
ManagerWithoutSelf = Manager.from_queryset(QuerySetWithoutSelf)
class MyModelWithoutSelf(models.Model):
objects = ManagerWithoutSelf()
- case: from_queryset_model_inheritance
main: |
from typing_extensions import reveal_type
from myapp.models import Base, Sub
reveal_type(Base.objects) # N: Revealed type is "myapp.models.MyManager[myapp.models.Base]"
reveal_type(Sub.objects) # N: Revealed type is "myapp.models.MyManager[myapp.models.Sub]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing import ClassVar
from typing_extensions import Self
from django.db.models import Model
from django.db.models.manager import Manager
from django.db.models.query import QuerySet
MyManager = Manager.from_queryset(QuerySet, "MyManager")
class Base(Model):
objects: ClassVar[MyManager[Self]] = MyManager()
class Sub(Base):
pass
- case: from_queryset_with_base_manager
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]"
reveal_type(MyModel.objects.get()) # N: Revealed type is "myapp.models.MyModel"
reveal_type(MyModel.objects.queryset_method()) # N: Revealed type is "str"
reveal_type(MyModel.objects.filter(id=1).queryset_method()) # N: Revealed type is "str"
reveal_type(MyModel.objects.filter(id=1)) # N: Revealed type is "myapp.models.ModelQuerySet[myapp.models.MyModel]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing_extensions import TypeVar
from django.db import models
from django.db.models.manager import Manager
M = TypeVar("M", bound=models.Model, covariant=True)
class ModelQuerySet(models.QuerySet[M]):
def queryset_method(self) -> str:
return 'hello'
NewManager = Manager.from_queryset(ModelQuerySet)
class MyModel(models.Model):
objects = NewManager()
- case: from_queryset_queryset_imported_from_other_module
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]"
reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]"
reveal_type(MyModel.objects.get()) # N: Revealed type is "myapp.models.MyModel"
reveal_type(MyModel.objects.queryset_method()) # N: Revealed type is "myapp.querysets.ModelQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
reveal_type(MyModel.objects.queryset_method_2()) # N: Revealed type is "typing.Iterable[myapp.querysets.Custom]"
reveal_type(MyModel.objects.queryset_method_3()) # N: Revealed type is "str"
reveal_type(MyModel.objects.queryset_method_4([])) # N: Revealed type is "None"
reveal_type(MyModel.objects.filter(id=1).queryset_method()) # N: Revealed type is "myapp.querysets.ModelQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
reveal_type(MyModel.objects.filter(id=1)) # N: Revealed type is "myapp.querysets.ModelQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/querysets.py
content: |
from collections.abc import Iterable, Sequence
from typing import TYPE_CHECKING
from django.db import models
if TYPE_CHECKING:
from .models import MyModel
class Custom:
...
class ModelQuerySet(models.QuerySet["MyModel"]):
def queryset_method(self) -> "ModelQuerySet":
return self.filter()
def queryset_method_2(self) -> Iterable[Custom]:
return []
def queryset_method_3(self) -> str:
return 'hello'
def queryset_method_4(self, arg: Sequence) -> None:
return None
- path: myapp/models.py
content: |
from django.db import models
from django.db.models.manager import Manager
from .querysets import ModelQuerySet
NewManager = Manager.from_queryset(ModelQuerySet)
class MyModel(models.Model):
objects = NewManager()
- case: from_queryset_custom_manager_subclass
main: |
from typing_extensions import reveal_type
from myapp.models import NewManager
reveal_type(NewManager().example()) # N: Revealed type is "myapp.models.MyModel"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/querysets.py
content: |
from typing import TYPE_CHECKING
from typing_extensions import TypeVar
from django.db import models
from django.db.models.manager import Manager
if TYPE_CHECKING:
from .models import MyModel
_CTE = TypeVar("_CTE", bound=models.Model)
class _MyModelQuerySet(models.QuerySet[_CTE]):
def example(self) -> _CTE:
raise NotImplementedError
class MyModelQuerySet(_MyModelQuerySet["MyModel"]): ...
- path: myapp/models.py
content: |
from django.db import models
from django.db.models.manager import Manager
from .querysets import MyModelQuerySet
class TypedManager(Manager["MyModel"]): ...
NewManager = TypedManager.from_queryset(MyModelQuerySet)
class MyModel(models.Model):
objects = NewManager()
- case: handles_subclasses_of_queryset
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel.objects.example()) # N: Revealed type is "myapp.models.MyModel"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/querysets.py
content: |
from typing import TYPE_CHECKING
from typing_extensions import TypeVar
from django.db import models
from django.db.models.manager import Manager
if TYPE_CHECKING:
from .models import MyModel
_CTE = TypeVar("_CTE", bound=models.Model)
class _MyModelQuerySet(models.QuerySet[_CTE]):
def example(self) -> _CTE:
raise NotImplementedError
class MyModelQuerySet(_MyModelQuerySet["MyModel"]):
...
- path: myapp/models.py
content: |
from django.db import models
from django.db.models.manager import Manager
from .querysets import MyModelQuerySet
NewManager = Manager.from_queryset(MyModelQuerySet)
class MyModel(models.Model):
objects = NewManager()
- case: from_queryset_generated_manager_imported_from_other_module
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel.objects) # N: Revealed type is "myapp.querysets.ManagerFromModelQuerySet[myapp.models.MyModel]"
reveal_type(MyModel.objects.get()) # N: Revealed type is "myapp.models.MyModel"
reveal_type(MyModel.objects.queryset_method()) # N: Revealed type is "myapp.querysets.ModelQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
reveal_type(MyModel.objects.queryset_method_2()) # N: Revealed type is "typing.Iterable[myapp.querysets.Custom]"
reveal_type(MyModel.objects.queryset_method_3()) # N: Revealed type is "str"
reveal_type(MyModel.objects.queryset_method_4([])) # N: Revealed type is "None"
reveal_type(MyModel.objects.filter(id=1).queryset_method()) # N: Revealed type is "myapp.querysets.ModelQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
reveal_type(MyModel.objects.filter(id=1)) # N: Revealed type is "myapp.querysets.ModelQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/querysets.py
content: |
from collections.abc import Iterable, Sequence
from typing import TYPE_CHECKING
from django.db import models
from django.db.models.manager import Manager
if TYPE_CHECKING:
from .models import MyModel
class Custom:
...
class ModelQuerySet(models.QuerySet["MyModel"]):
def queryset_method(self) -> "ModelQuerySet":
return self.filter()
def queryset_method_2(self) -> Iterable[Custom]:
return []
def queryset_method_3(self) -> str:
return 'hello'
def queryset_method_4(self, arg: Sequence) -> None:
return None
NewManager = Manager.from_queryset(ModelQuerySet)
- path: myapp/models.py
content: |
from django.db import models
from .querysets import NewManager
class MyModel(models.Model):
objects = NewManager()
- case: from_queryset_annotates_manager_variable_as_type
main: |
from typing_extensions import reveal_type
from myapp.models import NewManager
reveal_type(NewManager) # N: Revealed type is "def [_T <: django.db.models.base.Model] () -> myapp.models.ManagerFromModelQuerySet[_T]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class ModelQuerySet(models.QuerySet):
...
NewManager = models.Manager.from_queryset(ModelQuerySet)
- case: from_queryset_with_manager
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]"
reveal_type(MyModel.objects.get()) # N: Revealed type is "myapp.models.MyModel"
reveal_type(MyModel.objects.queryset_method()) # N: Revealed type is "str"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class ModelQuerySet(models.QuerySet):
def queryset_method(self) -> str:
return 'hello'
NewManager = models.Manager.from_queryset(ModelQuerySet)
class MyModel(models.Model):
objects = NewManager()
- case: from_queryset_with_manager_of_union
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel1, MyModel2
kls: type[MyModel1 | MyModel2] = MyModel1
reveal_type(kls.objects) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet1[myapp.models.MyModel1] | myapp.models.ManagerFromModelQuerySet2[myapp.models.MyModel2]"
reveal_type(kls.objects.all()) # N: Revealed type is "myapp.models.ModelQuerySet1[myapp.models.MyModel1, myapp.models.MyModel1] | myapp.models.ModelQuerySet2[myapp.models.MyModel2, myapp.models.MyModel2]"
reveal_type(kls.objects.get()) # N: Revealed type is "myapp.models.MyModel1 | myapp.models.MyModel2"
reveal_type(kls.objects.queryset_method()) # N: Revealed type is "int | str"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class ModelQuerySet1(models.QuerySet["MyModel1"]):
def queryset_method(self) -> int:
return 1
class ModelQuerySet2(models.QuerySet["MyModel2"]):
def queryset_method(self) -> str:
return 'hello'
NewManager1 = models.Manager.from_queryset(ModelQuerySet1)
class MyModel1(models.Model):
objects = NewManager1()
NewManager2 = models.Manager.from_queryset(ModelQuerySet2)
class MyModel2(models.Model):
objects = NewManager2()
- case: from_queryset_returns_intersection_of_manager_and_queryset
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel, NewManager
reveal_type(NewManager()) # N: Revealed type is "myapp.models.ModelBaseManagerFromModelQuerySet[Never]"
reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ModelBaseManagerFromModelQuerySet[myapp.models.MyModel]"
reveal_type(MyModel.objects.get()) # N: Revealed type is "myapp.models.MyModel"
reveal_type(MyModel.objects.manager_only_method()) # N: Revealed type is "int"
reveal_type(MyModel.objects.manager_and_queryset_method()) # N: Revealed type is "str"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class ModelBaseManager(models.Manager):
def manager_only_method(self) -> int:
return 1
class ModelQuerySet(models.QuerySet):
def manager_and_queryset_method(self) -> str:
return 'hello'
NewManager = ModelBaseManager.from_queryset(ModelQuerySet)
class MyModel(models.Model):
objects = NewManager()
- case: from_queryset_with_class_name_provided
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel, NewManager, OtherModel, OtherManager
reveal_type(NewManager()) # N: Revealed type is "myapp.models.NewManager[Never]"
reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.NewManager[myapp.models.MyModel]"
reveal_type(MyModel.objects.get()) # N: Revealed type is "myapp.models.MyModel"
reveal_type(MyModel.objects.manager_only_method()) # N: Revealed type is "int"
reveal_type(MyModel.objects.manager_and_queryset_method()) # N: Revealed type is "str"
reveal_type(OtherManager()) # N: Revealed type is "myapp.models.X[Never]"
reveal_type(OtherModel.objects) # N: Revealed type is "myapp.models.X[myapp.models.OtherModel]"
reveal_type(OtherModel.objects.manager_only_method()) # N: Revealed type is "int"
reveal_type(OtherModel.objects.manager_and_queryset_method()) # N: Revealed type is "str"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class ModelBaseManager(models.Manager):
def manager_only_method(self) -> int:
return 1
class ModelQuerySet(models.QuerySet):
def manager_and_queryset_method(self) -> str:
return 'hello'
NewManager = ModelBaseManager.from_queryset(ModelQuerySet, class_name='NewManager')
class MyModel(models.Model):
objects = NewManager()
OtherManager = ModelBaseManager.from_queryset(ModelQuerySet, class_name='X')
class OtherModel(models.Model):
objects = OtherManager()
- case: from_queryset_with_class_inheritance
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]"
reveal_type(MyModel.objects.get()) # N: Revealed type is "myapp.models.MyModel"
reveal_type(MyModel.objects.queryset_method()) # N: Revealed type is "str"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from django.db.models.manager import Manager
class BaseQuerySet(models.QuerySet):
def queryset_method(self) -> str:
return 'hello'
class ModelQuerySet(BaseQuerySet):
pass
NewManager = Manager.from_queryset(ModelQuerySet)
class MyModel(models.Model):
objects = NewManager()
- case: from_queryset_with_manager_in_another_directory_and_imports
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel.objects) # N: Revealed type is "myapp.managers.ManagerFromModelQuerySet[myapp.models.MyModel]"
reveal_type(MyModel.objects.get()) # N: Revealed type is "myapp.models.MyModel"
reveal_type(MyModel.objects.queryset_method) # N: Revealed type is "def (param: str | None =) -> str | None"
reveal_type(MyModel.objects.queryset_method('str')) # N: Revealed type is "str | None"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from myapp.managers import NewManager
class MyModel(models.Model):
objects = NewManager()
- path: myapp/managers.py
content: |
from django.db import models
class ModelQuerySet(models.QuerySet):
def queryset_method(self, param: str | None = None) -> str | None:
return param
NewManager = models.Manager.from_queryset(ModelQuerySet)
- case: from_queryset_with_inherited_manager_and_typing_no_return
disable_cache: true
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel.objects) # N: Revealed type is "myapp.managers.ManagerFromModelQuerySet[myapp.models.MyModel]"
reveal_type(MyModel.objects.get()) # N: Revealed type is "myapp.models.MyModel"
reveal_type(MyModel.objects.base_queryset_method) # N: Revealed type is "def (param: int | str) -> Never"
reveal_type(MyModel.objects.base_queryset_method(2)) # N: Revealed type is "Never"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from myapp.managers import NewManager
class MyModel(models.Model):
objects = NewManager()
- path: myapp/managers.py
content: |
from django.db import models
from myapp.base_queryset import BaseQuerySet
class ModelQuerySet(BaseQuerySet):
pass
NewManager = models.Manager.from_queryset(ModelQuerySet)
- path: myapp/base_queryset.py
content: |
from typing import NoReturn
from django.db import models
class BaseQuerySet(models.QuerySet):
def base_queryset_method(self, param: int | str) -> NoReturn:
raise ValueError
- case: from_queryset_with_decorated_queryset_methods
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]"
reveal_type(MyModel.objects.queryset_method()) # N: Revealed type is "str"
reveal_type(MyModel.objects.queryset_method_2()) # N: Revealed type is "int"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models, transaction
class ModelQuerySet(models.QuerySet):
@transaction.atomic
def queryset_method(self) -> str:
return 'hello'
@transaction.atomic
@transaction.atomic
def queryset_method_2(self) -> int:
return 2
NewManager = models.Manager.from_queryset(ModelQuerySet)
class MyModel(models.Model):
objects = NewManager()
- case: from_queryset_with_static_and_class_queryset_methods
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel.objects.static_method) # N: Revealed type is "def (x: int =) -> str"
reveal_type(MyModel.objects.static_method(2)) # N: Revealed type is "str"
reveal_type(MyModel.objects.static_method_required_arg(2)) # N: Revealed type is "str"
MyModel.objects.static_method_required_arg() # E: Missing positional argument "x" in call to "static_method_required_arg" of "ModelQuerySet" [call-arg]
reveal_type(MyModel.objects.class_method(2)) # N: Revealed type is "str"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class ModelQuerySet(models.QuerySet):
@staticmethod
def static_method(x: int = 1) -> str:
return 'hello'
@staticmethod
def static_method_required_arg(x: int) -> str:
return 'hello'
@classmethod
def class_method(cls, x: int = 1) -> str:
return 'hello'
NewManager = models.Manager.from_queryset(ModelQuerySet)
class MyModel(models.Model):
objects = NewManager()
- case: from_queryset_model_gets_generated_manager_as_default_manager
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]"
reveal_type(MyModel.objects.queryset_method()) # N: Revealed type is "str"
reveal_type(MyModel._default_manager) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]"
# Overloads
reveal_type(MyModel.objects.overloaded_method(1)) # N: Revealed type is "int"
reveal_type(MyModel.objects.overloaded_method('a')) # N: Revealed type is "str"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing import overload
from django.db import models
class ModelQuerySet(models.QuerySet):
def queryset_method(self) -> str:
return 'hello'
@overload
def overloaded_method(self, arg: int) -> int:
raise NotImplementedError
@overload
def overloaded_method(self, arg: str) -> str:
raise NotImplementedError
def overloaded_method(self, arg: int | str) -> int | str:
return arg
NewManager = models.Manager.from_queryset(ModelQuerySet)
class MyModel(models.Model):
objects = NewManager()
- case: from_queryset_can_resolve_explicit_any_methods
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.MyManagerFromModelQuerySet[myapp.models.MyModel]"
reveal_type(MyModel.objects.queryset_method(1)) # N: Revealed type is "Any"
reveal_type(MyModel.objects.queryset_method) # N: Revealed type is "def (qarg: Any) -> Any"
reveal_type(MyModel.objects.manager_method(2)) # N: Revealed type is "Any"
reveal_type(MyModel.objects.manager_method) # N: Revealed type is "def (marg: Any) -> Any"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from typing import Any
class ModelQuerySet(models.QuerySet):
def queryset_method(self, qarg: Any) -> Any:
return 'hello'
class MyManager(models.Manager):
def manager_method(self, marg: Any) -> Any:
return 'hello'
NewManager = MyManager.from_queryset(ModelQuerySet)
class MyModel(models.Model):
objects = NewManager()
- case: test_queryset_in_model_class_body
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.MyManagerFromMyQuerySet"
reveal_type(MyModel._default_manager) # N: Revealed type is "myapp.models.MyManagerFromMyQuerySet"
reveal_type(MyModel.objects.all) # N: Revealed type is "def () -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
reveal_type(MyModel.objects.custom) # N: Revealed type is "def () -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
reveal_type(MyModel.objects.all().filter) # N: Revealed type is "def (*args: Any, **kwargs: Any) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
reveal_type(MyModel.objects.custom().filter) # N: Revealed type is "def (*args: Any, **kwargs: Any) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
reveal_type(MyModel.objects2) # N: Revealed type is "myapp.models.MyManagerFromMyQuerySet"
reveal_type(MyModel._default_manager) # N: Revealed type is "myapp.models.MyManagerFromMyQuerySet"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyManager(models.Manager["MyModel"]):
pass
class MyQuerySet(models.QuerySet["MyModel"]):
def custom(self) -> "MyQuerySet":
raise NotImplementedError
class MyModel(models.Model):
objects = MyManager.from_queryset(MyQuerySet)()
objects2 = MyManager.from_queryset(MyQuerySet)()
- case: test_queryset_in_model_class_body_subclass
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.BaseManagerFromBaseQuerySet"
reveal_type(MyModel.objects.get()) # N: Revealed type is "myapp.models.BaseModel"
reveal_type(MyModel.objects.filter()) # N: Revealed type is "myapp.models.BaseQuerySet[myapp.models.BaseModel, myapp.models.BaseModel]"
reveal_type(MyModel.objects.filter().get()) # N: Revealed type is "myapp.models.BaseModel"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class BaseManager(models.Manager["BaseModel"]):
pass
class BaseQuerySet(models.QuerySet["BaseModel"]):
def custom(self) -> "BaseQuerySet":
raise NotImplementedError
class BaseModel(models.Model):
objects = BaseManager.from_queryset(BaseQuerySet)()
class MyModel(BaseModel):
pass
- case: from_queryset_includes_methods_returning_queryset
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel.objects.alias) # N: Revealed type is "def (*args: Any, **kwargs: Any) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
reveal_type(MyModel.objects.all) # N: Revealed type is "def () -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
reveal_type(MyModel.objects.annotate) # N: Revealed type is "def (*args: Any, **kwargs: Any) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
reveal_type(MyModel.objects.complex_filter) # N: Revealed type is "def (filter_obj: Any) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
reveal_type(MyModel.objects.defer) # N: Revealed type is "Overload(def (None) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel], def (*fields: str) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel])"
reveal_type(MyModel.objects.difference) # N: Revealed type is "def (*other_qs: django.db.models.query.QuerySet[django.db.models.base.Model, Any]) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
reveal_type(MyModel.objects.distinct) # N: Revealed type is "def (*field_names: str) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
reveal_type(MyModel.objects.exclude) # N: Revealed type is "def (*args: Any, **kwargs: Any) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
reveal_type(MyModel.objects.extra) # N: Revealed type is "def (select: dict[str, Any] | None =, where: typing.Sequence[str] | None =, params: typing.Sequence[Any] | None =, tables: typing.Sequence[str] | None =, order_by: typing.Sequence[str | django.db.models.expressions.Combinable] | None =, select_params: typing.Sequence[Any] | None =) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
reveal_type(MyModel.objects.filter) # N: Revealed type is "def (*args: Any, **kwargs: Any) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
reveal_type(MyModel.objects.intersection) # N: Revealed type is "def (*other_qs: django.db.models.query.QuerySet[django.db.models.base.Model, Any]) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
reveal_type(MyModel.objects.none) # N: Revealed type is "def () -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
reveal_type(MyModel.objects.only) # N: Revealed type is "def (*fields: str) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
reveal_type(MyModel.objects.order_by) # N: Revealed type is "def (*field_names: str | django.db.models.expressions.Combinable) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
reveal_type(MyModel.objects.prefetch_related) # N: Revealed type is "Overload(def (None) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel], def [_LookupT <: str, _PrefetchedQuerySetT <: django.db.models.query.QuerySet[django.db.models.base.Model, django.db.models.base.Model] = django.db.models.query.QuerySet[django.db.models.base.Model, django.db.models.base.Model], _ToAttrT <: str = str] (*lookups: str | django.db.models.query.Prefetch[_LookupT, _PrefetchedQuerySetT, _ToAttrT]) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel])"
reveal_type(MyModel.objects.reverse) # N: Revealed type is "def () -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
reveal_type(MyModel.objects.select_for_update) # N: Revealed type is "def (nowait: bool =, skip_locked: bool =, of: typing.Sequence[str] =, no_key: bool =) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
reveal_type(MyModel.objects.select_related) # N: Revealed type is "Overload(def (None) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel], def (*fields: str) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel])"
reveal_type(MyModel.objects.union) # N: Revealed type is "def (*other_qs: django.db.models.query.QuerySet[django.db.models.base.Model, Any], all: bool =) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
reveal_type(MyModel.objects.using) # N: Revealed type is "def (alias: str | None) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from django.db.models.manager import Manager
class MyQuerySet(models.QuerySet["MyModel"]):
...
MyManager = Manager.from_queryset(MyQuerySet)
class MyModel(models.Model):
objects = MyManager()
# This tests a regression where mypy would generate phantom warnings about
# undefined types due to unresolved types when copying methods from QuerySet to
# a manager dynamically created using Manager.from_queryset().
#
# For details see: https://github.com/typeddjango/django-stubs/issues/1022
- case: from_queryset_custom_auth_user_model
# Cache needs to be disabled to consistently reproduce the bug
disable_cache: true
main: |
from users.models import User
custom_settings: |
AUTH_USER_MODEL = "users.User"
INSTALLED_APPS = ("django.contrib.auth", "django.contrib.contenttypes", "users")
files:
- path: users/__init__.py
- path: users/models.py
content: |
from django.contrib.auth.models import AbstractBaseUser
from django.db import models
from .querysets import UserQuerySet
UserManager = models.Manager.from_queryset(UserQuerySet)
class User(AbstractBaseUser):
email = models.EmailField(unique=True)
objects = UserManager()
USERNAME_FIELD = "email"
- path: users/querysets.py
content: |
from django.db import models
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from .models import User
class UserQuerySet(models.QuerySet["User"]):
pass
- case: reuses_type_when_called_twice_identically
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel, FirstManager, SecondManager
reveal_type(FirstManager) # N: Revealed type is "def [_T <: django.db.models.base.Model] () -> myapp.models.ManagerFromModelQuerySet[_T]"
reveal_type(SecondManager) # N: Revealed type is "def [_T <: django.db.models.base.Model] () -> myapp.models.ManagerFromModelQuerySet[_T]"
reveal_type(MyModel.first) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]"
reveal_type(MyModel.second) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from django.db.models.manager import Manager
class ModelQuerySet(models.QuerySet["MyModel"]):
...
FirstManager = Manager.from_queryset(ModelQuerySet)
SecondManager = Manager.from_queryset(ModelQuerySet)
class MyModel(models.Model):
first = FirstManager()
second = SecondManager()
- case: handles_name_collision_with_generated_type
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel, ManagerFromModelQuerySet
reveal_type(ManagerFromModelQuerySet()) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[Never]"
reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from django.db.models.manager import Manager
class ModelQuerySet(models.QuerySet["MyModel"]):
...
ManagerFromModelQuerySet = Manager.from_queryset(ModelQuerySet)
class MyModel(models.Model):
objects = ManagerFromModelQuerySet()
- case: resolves_name_collision_with_other_module_level_object
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel, Generated, ManagerFromModelQuerySet
reveal_type(ManagerFromModelQuerySet) # N: Revealed type is "int"
reveal_type(Generated()) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet2[Never]"
reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet2[myapp.models.MyModel]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from django.db.models.manager import Manager
class ModelQuerySet(models.QuerySet["MyModel"]):
...
ManagerFromModelQuerySet = 1
Generated = Manager.from_queryset(ModelQuerySet)
class MyModel(models.Model):
objects = Generated()
- case: accepts_explicit_none_as_class_name
main: |
from typing_extensions import reveal_type
from myapp.models import PositionalNone, NoneAsKwarg
reveal_type(PositionalNone) # N: Revealed type is "def [_T <: django.db.models.base.Model] () -> myapp.models.ManagerFromModelQuerySet[_T]"
reveal_type(NoneAsKwarg) # N: Revealed type is "def [_T <: django.db.models.base.Model] () -> myapp.models.ManagerFromModelQuerySet[_T]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from django.db.models.manager import Manager
class ModelQuerySet(models.QuerySet):
...
PositionalNone = Manager.from_queryset(ModelQuerySet, None)
NoneAsKwarg = Manager.from_queryset(ModelQuerySet, class_name=None)
- case: uses_fallback_class_name_when_argument_is_not_string_expression
main: |
from typing_extensions import reveal_type
from myapp.models import StrCallable
reveal_type(StrCallable) # N: Revealed type is "def [_T <: django.db.models.base.Model] () -> myapp.models.ManagerFromModelQuerySet[_T]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from django.db.models.manager import Manager
class ModelQuerySet(models.QuerySet):
...
StrCallable = Manager.from_queryset(ModelQuerySet, class_name=str(1))
- case: queryset_inheritable_does_not_clobber_super_init
main: |
from typing_extensions import reveal_type
from myapp.models import BaseManager
reveal_type(BaseManager().ttl) # N: Revealed type is "int"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing import Any, TYPE_CHECKING
from django.db import models
from django.db.models.manager import Manager
from django.db.models.query import QuerySet
if TYPE_CHECKING:
from django.db.models.manager import _T
from django.db.models.query import _Model, _Row
class MyQuerySet(QuerySet["_Model", "_Row"]):
def __init__(self, *a: Any, **k: Any) -> None:
super().__init__(*a, **k)
_base = Manager.from_queryset(MyQuerySet)
class BaseManager(_base["_T"]):
def __init__(self, *a: Any, ttl: int = 0, **k: Any) -> None:
self.ttl = ttl
super().__init__(*a, **k)
- case: test_from_queryset_with_deferral
main: |
from typing_extensions import reveal_type
from myapp.models import Concrete
reveal_type(Concrete.objects.qs_meth()) # N: Revealed type is "int"
reveal_type(Concrete.objects.manager_meth()) # N: Revealed type is "str"
mypy_config: |
[mypy.plugins.django-stubs]
django_settings_module = myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing import ClassVar
from typing_extensions import Self, TypeVar
from django.db import models
from django.db.models.manager import Manager
M = TypeVar("M", bound=models.Model, covariant=True)
# bogus forward-`metaclass=` to trigger second semanal pass similar to #2224
class CustomQuerySet(models.QuerySet[M], metaclass=MCS):
def qs_meth(self) -> int:
return 1
_base = Manager.from_queryset(CustomQuerySet)
class CustomBase(_base[M]):
def manager_meth(self) -> str:
return 'hi'
class Concrete(models.Model):
objects: ClassVar[CustomBase[Self]] = CustomBase()
class MCS(type): pass
- case: test_from_queryset_with_concrete_subclass
main: |
from typing_extensions import reveal_type
from myapp.models import Concrete
reveal_type(Concrete.objects) # N: Revealed type is "myapp.models.ConcreteManager"
reveal_type(Concrete.objects.get()) # N: Revealed type is "myapp.models.Concrete"
reveal_type(Concrete.objects.all()) # N: Revealed type is "myapp.models.CustomQuerySet[myapp.models.Concrete, myapp.models.Concrete]"
reveal_type(Concrete.objects.all().get()) # N: Revealed type is "myapp.models.Concrete"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing import ClassVar
from typing_extensions import Self, TypeVar
from django.db.models import Model, QuerySet
from django.db.models.manager import Manager
M = TypeVar("M", bound=Model, covariant=True)
D = TypeVar("D", covariant=True, default=M)
class CustomQuerySet(QuerySet[M, D]): pass
_base = Manager.from_queryset(CustomQuerySet)
class CustomBase(_base[M]): ...
class BaseModel(Model):
objects: ClassVar[CustomBase[Self]] = CustomBase()
class ConcreteManager(CustomBase["Concrete"]): ...
class Concrete(BaseModel):
objects: ClassVar[ConcreteManager] = ConcreteManager()
- case: test_queryset_arg_as_unsupported_expressions
main: |
from typing import Generic
from typing_extensions import TypeAlias, TypeVar, reveal_type
from django.db import models
from django.db.models.manager import Manager
class QS1(models.QuerySet[models.Model]):
...
class QS2(models.QuerySet[models.Model]):
...
Alias: TypeAlias = QS1 | QS2
reveal_type(Manager[models.Model].from_queryset(Alias))
T = TypeVar("T")
class NonQSGeneric(Generic[T]):
...
reveal_type(Manager[models.Model].from_queryset(NonQSGeneric[int]))
out: |
main:12: note: Revealed type is "type[django.db.models.manager.Manager[django.db.models.base.Model]]"
main:12: error: Argument 1 to "from_queryset" of "BaseManager" has incompatible type "UnionType[QS1[Model, Model], QS2[Model, Model]]"; expected "type[QuerySet[Model, Model]]" [arg-type]
main:17: note: Revealed type is "type[django.db.models.manager.Manager[django.db.models.base.Model]]"
main:17: error: Argument 1 to "from_queryset" of "BaseManager" has incompatible type "type[NonQSGeneric[int]]"; expected "type[QuerySet[Model, Model]]" [arg-type]
- case: test_reverse_manager_with_foreign_key
main: |
from typing_extensions import reveal_type
from myapp.models import B
reveal_type(B().a_set.filter(field="something")) # N: Revealed type is "myapp.models.QS[myapp.models.A, myapp.models.A]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class B(models.Model): ...
class QS(models.QuerySet["A"]): ...
Manager = models.Manager.from_queryset(QS)
class A(models.Model):
field = models.CharField()
b = models.ForeignKey(B, on_delete=models.CASCADE)
objects = Manager()
# Regression test for #2373: Ensure from_queryset handles repeated deferrals
# correctly. When create_manager_info_from_from_queryset_call returns None due
# to forward references, PlaceholderNode should only be added once, not on
# every iteration.
- case: test_from_queryset_repeated_deferral_with_forward_metaclass
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel.objects.custom_method())
out: |
main:3: error: Access to generic instance variables via class is ambiguous [misc]
main:3: note: Revealed type is "str"
mypy_config: |
[mypy.plugins.django-stubs]
django_settings_module = myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing_extensions import TypeVar
from django.db import models
from django.db.models.manager import Manager
M = TypeVar("M", bound=models.Model, covariant=True)
# Forward reference to metaclass triggers deferral, causing
# create_manager_info_from_from_queryset_call to return None
# on initial passes. The fix ensures PlaceholderNode is not
# re-added on each iteration, preventing progress flag from
# being set repeatedly.
class CustomQuerySet(models.QuerySet[M], metaclass=ForwardMCS):
def custom_method(self) -> str:
return "test"
CustomManager = Manager.from_queryset(CustomQuerySet)
class MyModel(models.Model):
objects = CustomManager()
# Forward-referenced metaclass defined after use
class ForwardMCS(type):
pass
- case: subclass_queryset_without_type_parameters_disallow_any_generics
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel.objects)
reveal_type(MyModel.objects.get())
installed_apps:
- myapp
mypy_config: |
[mypy-myapp.models]
disallow_any_generics = true
out: |
main:3: note: Revealed type is "myapp.models.ManagerFromMyQuerySet[myapp.models.MyModel]"
main:4: note: Revealed type is "myapp.models.MyModel"
myapp/models:3: error: Missing type arguments for generic type "QuerySet" [type-arg]
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyQuerySet(models.QuerySet):
pass
MyManager = models.Manager.from_queryset(MyQuerySet)
class MyModel(models.Model):
objects = MyManager()
typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_get_or_create.yml 0000664 0000000 0000000 00000007163 15260643574 0032422 0 ustar 00root root 0000000 0000000 - case: get_or_create_typechecks_kwargs
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
# Return type is preserved
reveal_type(MyModel.objects.get_or_create(num=1)) # N: Revealed type is "tuple[myapp.models.MyModel, bool]"
# Valid field kwarg and lookup expression
MyModel.objects.get_or_create(num=1)
MyModel.objects.get_or_create(num__gte=1)
# `defaults` alongside lookup kwargs
MyModel.objects.get_or_create(num=1, defaults={"num": 2})
# Unknown field is rejected
MyModel.objects.get_or_create(unknown_field=True) # E: Cannot resolve keyword 'unknown_field' into field. Choices are: id, num [misc]
# Invalid type for a known field is rejected
MyModel.objects.get_or_create(num=MyModel()) # E: Incompatible type for lookup 'num': (got "MyModel", expected "str | int") [misc]
# Async variant shares the same validation
async def main() -> None:
await MyModel.objects.aget_or_create(num=1)
await MyModel.objects.aget_or_create(unknown_field=True) # E: Cannot resolve keyword 'unknown_field' into field. Choices are: id, num [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyModel(models.Model):
num = models.IntegerField()
- case: get_or_create_typechecks_defaults
main: |
from myapp.models import MyModel
# Unknown key in defaults is rejected
MyModel.objects.get_or_create(num=1, defaults={"unknown_field": True}) # E: Unexpected attribute "unknown_field" for model "MyModel" [misc]
# Incompatible value type in defaults is rejected
MyModel.objects.get_or_create(num=1, defaults={"num": MyModel()}) # E: Incompatible type for "num" of "MyModel" (got "MyModel", expected "float | int | str | Combinable") [misc]
# Valid defaults: no errors
MyModel.objects.get_or_create(num=1, defaults={"num": 2, "name": "hello"})
# Non-literal defaults variable is silently accepted (no false positives)
some_defaults: dict[str, object] = {"unknown_field": True}
MyModel.objects.get_or_create(num=1, defaults=some_defaults)
# `**kwargs` variable unpacking is silently accepted
kwargs = {"defaults": {"unknown_field": True}}
MyModel.objects.get_or_create(num=1, **kwargs)
# `**dict_literal` unpacking is also silently accepted; only a direct
# `defaults=` dict literal is validated.
MyModel.objects.get_or_create(num=1, **{"defaults": {"unknown_field": True}})
# `**other_fields` inside a `defaults=` dict literal: literal keys are
# still validated, the unpacked portion is skipped.
other_fields = {"num": 2}
MyModel.objects.get_or_create(num=1, defaults={"unknown_field": True, **other_fields}) # E: Unexpected attribute "unknown_field" for model "MyModel" [misc]
# Async variant shares the same validation
async def main() -> None:
await MyModel.objects.aget_or_create(num=1, defaults={"unknown_field": True}) # E: Unexpected attribute "unknown_field" for model "MyModel" [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyModel(models.Model):
num = models.IntegerField()
name = models.CharField(max_length=100)
typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_in_bulk.yml 0000664 0000000 0000000 00000007177 15260643574 0031250 0 ustar 00root root 0000000 0000000 - case: in_bulk_valid
installed_apps:
- myapp
main: |
from myapp.models import Article
# Default (no field_name — uses pk)
Article.objects.in_bulk()
# Explicit pk
Article.objects.in_bulk(field_name="pk")
# Unique field
Article.objects.in_bulk(field_name="slug")
# Field unique through a single-field UniqueConstraint
Article.objects.in_bulk(field_name="code")
# Non-literal field_name (skipped by validation)
field: str = "title"
Article.objects.in_bulk(field_name=field)
# With id_list
Article.objects.in_bulk([1, 2, 3])
Article.objects.in_bulk([1, 2], field_name="pk")
# Async variant with valid field
async def test_async() -> None:
await Article.objects.ain_bulk(field_name="slug")
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
slug = models.SlugField(unique=True)
code = models.CharField(max_length=10)
category = models.CharField(max_length=10)
published = models.BooleanField(default=False)
class Meta:
constraints = [
models.UniqueConstraint(fields=["code"], name="unique_code"),
models.UniqueConstraint(fields=["category", "title"], name="unique_category_title"),
]
- case: in_bulk_invalid
installed_apps:
- myapp
main: |
from myapp.models import Article
from django.db.models import F
# Non-existent field
Article.objects.in_bulk(field_name="nonexistent") # E: Article has no field named 'nonexistent' [misc]
# Non-unique field
Article.objects.in_bulk(field_name="title") # E: "in_bulk()"'s field_name must be a unique field but "title" isn't [misc]
# Field only unique as part of a multi-field UniqueConstraint
Article.objects.in_bulk(field_name="category") # E: "in_bulk()"'s field_name must be a unique field but "category" isn't [misc]
# Annotated field (not supported at runtime, `Options.get_field` raises `FieldDoesNotExist`)
Article.objects.annotate(foo=F("slug")).in_bulk(field_name="foo") # E: Article has no field named 'foo' [misc]
# Async variant with invalid field
async def test_async() -> None:
await Article.objects.ain_bulk(field_name="nonexistent") # E: Article has no field named 'nonexistent' [misc]
await Article.objects.ain_bulk(field_name="title") # E: "in_bulk()"'s field_name must be a unique field but "title" isn't [misc]
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
slug = models.SlugField(unique=True)
code = models.CharField(max_length=10)
category = models.CharField(max_length=10)
published = models.BooleanField(default=False)
class Meta:
constraints = [
models.UniqueConstraint(fields=["code"], name="unique_code"),
models.UniqueConstraint(fields=["category", "title"], name="unique_category_title"),
]
typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_iteration.yml 0000664 0000000 0000000 00000001775 15260643574 0031621 0 ustar 00root root 0000000 0000000 - case: sync_for
main: |
from typing_extensions import reveal_type
from myapp.models import User
for user in User.objects.all():
reveal_type(user) # N: Revealed type is "myapp.models.User"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
pass
- case: async_for
main: |
from typing_extensions import reveal_type
from myapp.models import User
async def main() -> None:
async for user in User.objects.all():
reveal_type(user) # N: Revealed type is "myapp.models.User"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
pass
typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_order_by.yml 0000664 0000000 0000000 00000030340 15260643574 0031416 0 ustar 00root root 0000000 0000000 - case: order_by_valid_fields
installed_apps:
- myapp
main: |
from myapp.models import Article, Author
from django.db.models import F, OrderBy
# Simple fields
Article.objects.order_by("title")
Article.objects.order_by("pk")
Article.objects.order_by("id")
# Descending
Article.objects.order_by("-title")
Article.objects.order_by("-pk")
# Random ordering
Article.objects.order_by("?")
# FK traversal
Article.objects.order_by("author__name")
Article.objects.order_by("-author__name")
# Multiple fields
Article.objects.order_by("title", "-author__name")
# Annotated fields
Article.objects.annotate(foo=F("id")).order_by("foo")
# Non-literal strings (skipped by validation)
field: str = "title"
Article.objects.order_by(field)
# F expressions and OrderBy objects (not string literals, skipped)
Article.objects.order_by(F("title"))
Article.objects.order_by(OrderBy(F("title")))
# earliest / latest
Article.objects.earliest("title")
Article.objects.latest("title")
Article.objects.earliest("author__name")
Article.objects.latest("-title")
# FK id field
Article.objects.order_by("author_id")
# Clear ordering with no arguments
Article.objects.order_by()
# Chained order_by calls (second overrides first)
Article.objects.order_by("title").order_by("-author__name")
# Reverse FK traversal (Author -> Article)
Author.objects.order_by("article__title")
Author.objects.order_by("-article__title")
# values() / values_list() then order_by
Article.objects.values("title").order_by("title")
Article.objects.values_list("title", flat=True).order_by("title")
# values() with annotation then order_by
Article.objects.values(name=F("author__name")).order_by("name")
# values() alias preserved through a subsequent annotate()
Article.objects.values(name=F("id")).annotate(foo=F("id")).order_by("name")
Article.objects.values(name=F("id")).annotate(foo=F("id")).order_by("foo")
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
published = models.BooleanField(default=False)
author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name="article")
- case: order_by_invalid_fields
installed_apps:
- myapp
main: |
from myapp.models import Article, Author
from typing import Literal
# Non-existent field
Article.objects.order_by("nonexistent") # E: Cannot resolve keyword 'nonexistent' into field. Choices are: author, author_id, content, id, published, title [misc]
# Invalid chained lookup
Article.objects.order_by("author__nonexistent") # E: Cannot resolve keyword 'nonexistent' into field or transform on 'author'. [misc]
# Descending invalid
Article.objects.order_by("-nonexistent") # E: Cannot resolve keyword 'nonexistent' into field. Choices are: author, author_id, content, id, published, title [misc]
# Literal typed invalid
field: Literal["nonexistent"] = "nonexistent"
Article.objects.order_by(field) # E: Cannot resolve keyword 'nonexistent' into field. Choices are: author, author_id, content, id, published, title [misc]
# Literal typed descending invalid
field2: Literal["-nonexistent"] = "-nonexistent"
Article.objects.order_by(field2) # E: Cannot resolve keyword 'nonexistent' into field. Choices are: author, author_id, content, id, published, title [misc]
# Literal typed invalid FK traversal
field3: Literal["author__nonexistent"] = "author__nonexistent"
Article.objects.order_by(field3) # E: Cannot resolve keyword 'nonexistent' into field or transform on 'author'. [misc]
# earliest / latest with invalid fields
Article.objects.earliest("nonexistent") # E: Cannot resolve keyword 'nonexistent' into field. Choices are: author, author_id, content, id, published, title [misc]
Article.objects.latest("nonexistent") # E: Cannot resolve keyword 'nonexistent' into field. Choices are: author, author_id, content, id, published, title [misc]
# Async variants
async def test_async() -> None:
await Article.objects.aearliest("nonexistent") # E: Cannot resolve keyword 'nonexistent' into field. Choices are: author, author_id, content, id, published, title [misc]
await Article.objects.alatest("nonexistent") # E: Cannot resolve keyword 'nonexistent' into field. Choices are: author, author_id, content, id, published, title [misc]
# Lookup suffix on a valid field — __exact is a lookup, not a traversal
Article.objects.order_by("title__exact") # E: Cannot resolve keyword 'exact' into field or transform on 'title'. [misc]
# Invalid field at depth > 2
Article.objects.order_by("author__name__nonexistent") # E: Cannot resolve keyword 'nonexistent' into field or transform on 'name'. [misc]
# values() then order_by with invalid field
Article.objects.values("title").order_by("nonexistent") # E: Cannot resolve keyword 'nonexistent' into field. Choices are: author, author_id, content, id, published, title [misc]
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
published = models.BooleanField(default=False)
author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name="article")
# Regression test for https://github.com/typeddjango/django-stubs/issues/3184
# Abstract models have _meta.pk = None, which caused an AttributeError crash
# in Django's Query.names_to_path() when validating order_by lookups.
- case: order_by_abstract_model_no_crash
installed_apps:
- myapp
main: |
from myapp.models import AbstractModel
from django.db.models import QuerySet
def test(qs: QuerySet[AbstractModel]) -> None:
qs.order_by("pk")
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class AbstractModel(models.Model):
class Meta:
abstract = True
class ConcreteModel(AbstractModel):
pass
- case: order_by_with_field_transforms
installed_apps:
- myapp
main: |
from myapp.models import Article
Article.objects.order_by("created__year", "created__month")
Article.objects.order_by("-created__year")
Article.objects.order_by("author__created__year")
Article.objects.values("created__month", "created__year").order_by("created__year")
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Author(models.Model):
created = models.DateTimeField(auto_now_add=True)
class Article(models.Model):
created = models.DateTimeField(auto_now_add=True)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
- case: order_by_with_jsonfield_key_transforms
installed_apps:
- myapp
main: |
from myapp.models import Item
Item.objects.order_by("data__field")
Item.objects.order_by("-data__field")
Item.objects.order_by("data__nested__key")
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Item(models.Model):
data = models.JSONField()
- case: order_by_with_annotations_typeddict
installed_apps:
- myapp
main: |
from typing import TYPE_CHECKING, TypedDict
from django.db.models import QuerySet, Value, IntegerField
from django_stubs_ext import WithAnnotations
from myapp.models import Item
class ExtraAnnotation(TypedDict):
extra_id: int | None
if TYPE_CHECKING:
ItemWithExtraAnnotation = WithAnnotations[Item, ExtraAnnotation]
else:
ItemWithExtraAnnotation = Item
ItemWithExtraAnnotationQuerySet = QuerySet[Item, ItemWithExtraAnnotation]
def annotate_extra(qs: QuerySet[Item]) -> ItemWithExtraAnnotationQuerySet:
return qs.annotate(extra_id=Value(None, output_field=IntegerField()))
qs = annotate_extra(Item.objects.all())
qs.order_by("extra_id")
qs.order_by("-extra_id")
qs.order_by("name", "extra_id")
qs.order_by("nonexistent") # E: Cannot resolve keyword 'nonexistent' into field. Choices are: id, name [misc]
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Item(models.Model):
name = models.CharField(max_length=100)
- case: order_by_combined_annotate_and_withannotations
installed_apps:
- myapp
main: |
from typing import TYPE_CHECKING, TypedDict
from django.db.models import QuerySet, F
from django_stubs_ext import WithAnnotations
from myapp.models import Item
class DeclaredAnnotation(TypedDict):
declared_field: int
if TYPE_CHECKING:
ItemWithDeclared = WithAnnotations[Item, DeclaredAnnotation]
else:
ItemWithDeclared = Item
def get_qs() -> QuerySet[Item, ItemWithDeclared]:
return Item.objects.all() # type: ignore[return-value]
qs = get_qs().annotate(runtime_field=F("id"))
qs.order_by("declared_field")
qs.order_by("runtime_field")
qs.order_by("declared_field", "-runtime_field", "name")
qs.order_by("nonexistent") # E: Cannot resolve keyword 'nonexistent' into field. Choices are: id, name [misc]
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Item(models.Model):
name = models.CharField(max_length=100)
- case: order_by_with_multiple_withannotations_fields
installed_apps:
- myapp
main: |
from typing import TYPE_CHECKING, TypedDict
from django.db.models import QuerySet
from django_stubs_ext import WithAnnotations
from myapp.models import Item
class MultipleAnnotations(TypedDict):
field_a: int
field_b: str
field_c: float
if TYPE_CHECKING:
ItemWithMultiple = WithAnnotations[Item, MultipleAnnotations]
else:
ItemWithMultiple = Item
def get_qs() -> QuerySet[Item, ItemWithMultiple]:
return Item.objects.all() # type: ignore[return-value]
qs = get_qs()
qs.order_by("field_a")
qs.order_by("-field_b")
qs.order_by("field_c")
qs.order_by("field_a", "-field_b", "field_c", "name")
qs.order_by("nonexistent") # E: Cannot resolve keyword 'nonexistent' into field. Choices are: id, name [misc]
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Item(models.Model):
name = models.CharField(max_length=100)
typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_prefetch_related.yml 0000664 0000000 0000000 00000106372 15260643574 0033122 0 ustar 00root root 0000000 0000000 - case: prefetch_related_to_attr
installed_apps:
- myapp
main: |
from myapp.models import Article, Tag
from django.db.models import Prefetch, F, QuerySet
from django.db import models
from typing_extensions import Literal, TypedDict, reveal_type
from django_stubs_ext import WithAnnotations
### Noop (to_attr not provided)
reveal_type(Article.objects.prefetch_related(Prefetch("tags")).all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article, myapp.models.Article]"
reveal_type(Article.objects.prefetch_related(Prefetch("tags", Tag.objects.all())).all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article, myapp.models.Article]"
reveal_type(Prefetch("tags")) # N: Revealed type is "django.db.models.query.Prefetch[Literal['tags'], django.db.models.query.QuerySet[django.db.models.base.Model, django.db.models.base.Model], str]"
reveal_type(Prefetch("tags", Tag.objects.all())) # N: Revealed type is "django.db.models.query.Prefetch[Literal['tags'], django.db.models.query.QuerySet[myapp.models.Tag, myapp.models.Tag], str]"
# Prefetch created in a function with no to_attr
def get_prefetch_no_to_attr() -> Prefetch[Literal["tags"], QuerySet[Tag]]:
return Prefetch("tags", Tag.objects.all())
reveal_type(Article.objects.prefetch_related(get_prefetch_no_to_attr()).all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article, myapp.models.Article]"
# Prefetch created in a function with no to_attr and no queryset
def get_prefetch_no_to_attr_no_qs() -> Prefetch[Literal["tags"]]:
return Prefetch("tags")
reveal_type(Article.objects.prefetch_related(get_prefetch_no_to_attr_no_qs()).all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article, myapp.models.Article]"
# On the QuerySet
article_qs = Article.objects.all().prefetch_related(Prefetch("tags", Tag.objects.all(), to_attr="every_tags"))
reveal_type(article_qs) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag]})]]"
reveal_type(article_qs.get().every_tags) # N: Revealed type is "list[myapp.models.Tag]"
reveal_type(
Tag.objects.all().prefetch_related( # N: Revealed type is "list[myapp.models.Article]"
Prefetch("tags", Article.objects.all(), to_attr="every_articles")
).get().every_articles
)
# On the Manager
reveal_type(
Article.objects.prefetch_related( # N: Revealed type is "list[myapp.models.Tag]"
Prefetch("tags", Tag.objects.all(), to_attr="every_tags")
).get().every_tags
)
reveal_type(
Tag.objects.prefetch_related( # N: Revealed type is "list[myapp.models.Article]"
Prefetch("tags", Article.objects.all(), to_attr="every_articles")
).get().every_articles
)
# Member expr
reveal_type(
Article.objects.prefetch_related( # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag]})]]"
models.Prefetch("tags", Tag.objects.all(), to_attr="every_tags")
).all()
)
# pos args only
reveal_type(
Article.objects.prefetch_related( # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag]})]]"
models.Prefetch("tags", Tag.objects.all(), "every_tags")
).all()
)
# Multiple Prefetch items: both `to_attr` annotations should be present
multi_qs = Article.objects.all().prefetch_related(
Prefetch("tags", Tag.objects.all(), to_attr="ts"),
Prefetch("tags", Tag.objects.all(), to_attr="ts2"),
)
reveal_type(multi_qs) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article@AnnotatedWith[TypedDict({'ts': list[myapp.models.Tag], 'ts2': list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'ts': list[myapp.models.Tag], 'ts2': list[myapp.models.Tag]})]]"
reveal_type(multi_qs.get().ts) # N: Revealed type is "list[myapp.models.Tag]"
reveal_type(multi_qs.get().ts2) # N: Revealed type is "list[myapp.models.Tag]"
# Mixed inline `Prefetch` and plain lookup string in one call; string should be ignored
mixed_plain = Article.objects.prefetch_related(
"tags",
Prefetch("tags", Article.objects.all(), to_attr="arts3"),
)
reveal_type(mixed_plain) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article@AnnotatedWith[TypedDict({'arts3': list[myapp.models.Article]})], myapp.models.Article@AnnotatedWith[TypedDict({'arts3': list[myapp.models.Article]})]]"
# Intermediary variable -- function scope
def foo() -> None:
tag_prefetch = Prefetch("tags", Tag.objects.all(), to_attr="every_tags")
reveal_type(Article.objects.prefetch_related(tag_prefetch).all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag]})]]"
# Intermediary variable -- module scope
tag_prefetch = Prefetch("tags", Tag.objects.all(), to_attr="every_tags")
reveal_type(Article.objects.prefetch_related(tag_prefetch).all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag]})]]"
# Prefetch created in a function
def get_invalid_prefetch() -> Prefetch[Literal["tags"], QuerySet[Tag], Literal["every_tags"]]:
return Prefetch("tags", Tag.objects.all(), to_attr="foo") # E: Incompatible return value type (got "Prefetch[Literal['tags'], QuerySet[Tag, Tag], Literal['foo']]", expected "Prefetch[Literal['tags'], QuerySet[Tag, Tag], Literal['every_tags']]") [return-value] # E: Argument "to_attr" to "Prefetch" has incompatible type "Literal['foo']"; expected "Literal['every_tags'] | None" [arg-type]
def get_prefetch() -> Prefetch[Literal["tags"], QuerySet[Tag], Literal["every_tags"]]:
return Prefetch("tags", Tag.objects.all(), to_attr="every_tags")
reveal_type(Article.objects.prefetch_related(get_prefetch()).all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag]})]]"
# Prefetch created in a function with to_attr as an intermediary variable
def get_prefetch_with_var() -> Prefetch[Literal["tags"], QuerySet[Tag], Literal["every_tags"]]:
to_attr = "every_tags"
return Prefetch("tags", Tag.objects.all(), to_attr) # E: Argument 3 to "Prefetch" has incompatible type "str"; expected "Literal['every_tags'] | None" [arg-type]
reveal_type(Article.objects.prefetch_related(get_prefetch_with_var()).all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag]})]]"
# Mixed inline `Prefetch` and variable `Prefetch` in one call
mixed_qs = Article.objects.prefetch_related(
tag_prefetch,
Prefetch("tags", Article.objects.all(), to_attr="arts2"),
)
reveal_type(mixed_qs) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag], 'arts2': list[myapp.models.Article]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag], 'arts2': list[myapp.models.Article]})]]"
# Prefetch with `to_attr` arg but without the `queryset` arg
reveal_type(Article.objects.prefetch_related(models.Prefetch("tags", to_attr="just_tags")).get().just_tags) # N: Revealed type is "list[myapp.models.Tag]"
# Prefetch with annotated `queryset`
reveal_type(Article.objects.prefetch_related( # N: Revealed type is "list[myapp.models.Tag@AnnotatedWith[TypedDict({'foo': Any})]]"
models.Prefetch("tags", Tag.objects.annotate(foo=F("id")).all(), to_attr="just_tags")).get().just_tags
)
class MyDict(TypedDict):
foo: str
def get_prefetch_with_annotations() -> Prefetch[Literal["tags"], QuerySet[WithAnnotations[Tag, MyDict]], Literal["every_tags"]]:
return Prefetch("tags", Tag.objects.annotate(foo=F("id")), "every_tags")
reveal_type(Article.objects.prefetch_related(get_prefetch_with_annotations()).all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag@AnnotatedWith[TypedDict(main.MyDict, {'foo': str})]]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag@AnnotatedWith[TypedDict(main.MyDict, {'foo': str})]]})]]"
reveal_type(Article.objects.prefetch_related(get_prefetch_with_annotations()).get().every_tags[0].foo) # N: Revealed type is "str"
# *args prefetch
first_prefetch = Prefetch("tags", Tag.objects.all(), to_attr="every_tags")
second_prefetch = Prefetch("tags", Tag.objects.all(), to_attr="every_tags2")
third_prefetch = Prefetch("tags", Tag.objects.all(), to_attr="every_tags3")
fourth_prefetch = Prefetch("tags", Tag.objects.all(), to_attr="every_tags4")
prefetch_objs = (first_prefetch, second_prefetch)
reveal_type(Article.objects.prefetch_related(*prefetch_objs).all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag], 'every_tags2': list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag], 'every_tags2': list[myapp.models.Tag]})]]"
reveal_type(Article.objects.prefetch_related(third_prefetch, *prefetch_objs).all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article@AnnotatedWith[TypedDict({'every_tags3': list[myapp.models.Tag], 'every_tags': list[myapp.models.Tag], 'every_tags2': list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags3': list[myapp.models.Tag], 'every_tags': list[myapp.models.Tag], 'every_tags2': list[myapp.models.Tag]})]]"
reveal_type(Article.objects.prefetch_related(*prefetch_objs, third_prefetch).all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag], 'every_tags2': list[myapp.models.Tag], 'every_tags3': list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag], 'every_tags2': list[myapp.models.Tag], 'every_tags3': list[myapp.models.Tag]})]]"
reveal_type(Article.objects.prefetch_related(fourth_prefetch, *prefetch_objs, third_prefetch).all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article@AnnotatedWith[TypedDict({'every_tags4': list[myapp.models.Tag], 'every_tags': list[myapp.models.Tag], 'every_tags2': list[myapp.models.Tag], 'every_tags3': list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags4': list[myapp.models.Tag], 'every_tags': list[myapp.models.Tag], 'every_tags2': list[myapp.models.Tag], 'every_tags3': list[myapp.models.Tag]})]]"
# *args prefetch from helper function
def _get_prefetches() -> tuple[
Prefetch[Literal["tags"], QuerySet[Tag], Literal["every_tags"]],
Prefetch[Literal["tags"], QuerySet[Tag], Literal["every_tags2"]],
]:
return prefetch_objs
reveal_type(Article.objects.prefetch_related(*_get_prefetches()).all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag], 'every_tags2': list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag], 'every_tags2': list[myapp.models.Tag]})]]"
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Tag(models.Model): ...
class Article(models.Model):
tags = models.ManyToManyField(to=Tag, related_name="articles", blank=True)
- case: prefetch_related_and_annotate
installed_apps:
- django.contrib.auth
- django.contrib.contenttypes
main: |
from django.db.models import Prefetch, F
from django.contrib.auth.models import User, Group
from typing_extensions import reveal_type
user = (
User.objects
.annotate(annotated_user=F("username"))
.prefetch_related(Prefetch("groups", Group.objects.all(), to_attr="to_attr_groups"))
.get()
)
reveal_type(user.annotated_user) # N: Revealed type is "Any"
reveal_type(user.to_attr_groups) # N: Revealed type is "list[django.contrib.auth.models.Group]"
- case: prefetch_related_to_attr_conflict_with_annotate
installed_apps:
- django.contrib.auth
- django.contrib.contenttypes
main: |
from django.db.models import Prefetch, F
from django.contrib.auth.models import User, Group
# When mixing `.annotate(foo=...)` and `prefetch_related(Prefetch(...,to_attr=foo))`
# The last annotate in the chain takes precedence (even if it is prior to the prefetch_related)
annotate_into_prefetch = (
User.objects # E: Attribute "foo" already defined on "django.contrib.auth.models.User@AnnotatedWith[TypedDict({'foo': Any})]" [no-redef]
.annotate(foo=F("username"))
.prefetch_related(Prefetch("groups", Group.objects.all(), to_attr="foo"))
.get()
)
prefetch_into_annotate = (
User.objects # E: Attribute "foo" already defined on "django.contrib.auth.models.User@AnnotatedWith[TypedDict({'foo': list[django.contrib.auth.models.Group]})]" [no-redef]
.prefetch_related(Prefetch("groups", Group.objects.all(), to_attr="foo"))
.annotate(foo=F("username"))
.get()
)
- case: prefetch_related_to_attr_conflict_with_withannotations
installed_apps:
- myapp
main: |
from django.db.models import Prefetch, QuerySet, Value, IntegerField
from myapp.models import Article, Tag
from typing import TYPE_CHECKING, TypedDict
from django_stubs_ext import WithAnnotations
class ExtraAnnotation(TypedDict):
extra_id: int | None
if TYPE_CHECKING:
ArticleWithExtra = WithAnnotations[Article, ExtraAnnotation]
else:
ArticleWithExtra = Article
ArticleWithExtraQuerySet = QuerySet[Article, ArticleWithExtra]
def annotate_extra(qs: QuerySet[Article]) -> ArticleWithExtraQuerySet:
return qs.annotate(extra_id=Value(None, output_field=IntegerField()))
qs = annotate_extra(Article.objects.all())
qs.prefetch_related(Prefetch("tags", Tag.objects.all(), to_attr="extra_id")) # E: Attribute "extra_id" already defined on "myapp.models.Article" [no-redef]
qs.prefetch_related(Prefetch("tags", Tag.objects.all(), to_attr="prefetched_tags"))
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Tag(models.Model): ...
class Article(models.Model):
tags = models.ManyToManyField(to=Tag, related_name="articles", blank=True)
- case: prefetch_related_to_attr_conflict_with_model_attr
installed_apps:
- myapp
main: |
from django.db.models import Prefetch, F
from myapp.models import Article, Tag
Article.objects.prefetch_related(Prefetch("tags", Tag.objects.all(), to_attr="pk")) # E: Attribute "pk" already defined on "myapp.models.Article" [no-redef]
Article.objects.prefetch_related(Prefetch("tags", Tag.objects.all(), to_attr="id")) # E: Attribute "id" already defined on "myapp.models.Article" [no-redef]
Article.objects.prefetch_related(Prefetch("tags", Tag.objects.all(), to_attr="tags")) # E: Attribute "tags" already defined on "myapp.models.Article" [no-redef]
Article.objects.prefetch_related(Prefetch("tags", Tag.objects.all(), to_attr="my_property")) # E: Attribute "my_property" already defined on "myapp.models.Article" [no-redef]
Article.objects.prefetch_related(Prefetch("tags", Tag.objects.all(), to_attr="my_method")) # E: Attribute "my_method" already defined on "myapp.models.Article" [no-redef]
Article.objects.prefetch_related(Prefetch("tags", Tag.objects.all(), to_attr="my_classmethod")) # E: Attribute "my_classmethod" already defined on "myapp.models.Article" [no-redef]
Article.objects.prefetch_related(Prefetch("tags", Tag.objects.all(), to_attr="my_staticmethod")) # E: Attribute "my_staticmethod" already defined on "myapp.models.Article" [no-redef]
Tag.objects.prefetch_related(Prefetch("articles", Article.objects.all(), to_attr="articles")) # E: Attribute "articles" already defined on "myapp.models.Tag" [no-redef]
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Tag(models.Model): ...
class Article(models.Model):
tags = models.ManyToManyField(to=Tag, related_name="articles", blank=True)
@property
def my_property(self) -> int:
raise NotImplementedError
def my_method(self) -> int:
raise NotImplementedError
@staticmethod
def my_staticmethod() -> int:
raise NotImplementedError
@classmethod
def my_classmethod(cls) -> int:
raise NotImplementedError
- case: raw_queryset_prefetch_related_signatures
main: |
from typing_extensions import reveal_type
from myapp.models import Person, Book
from django.db.models import Prefetch
raw_qs = Book.objects.raw("SELECT 1")
reveal_type(raw_qs.prefetch_related()) # N: Revealed type is "django.db.models.query.RawQuerySet[myapp.models.Book]"
reveal_type(raw_qs.prefetch_related(None)) # N: Revealed type is "django.db.models.query.RawQuerySet[myapp.models.Book]"
reveal_type(raw_qs.prefetch_related("author")) # N: Revealed type is "django.db.models.query.RawQuerySet[myapp.models.Book]"
reveal_type(raw_qs.prefetch_related(Prefetch("author"))) # N: Revealed type is "django.db.models.query.RawQuerySet[myapp.models.Book]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Person(models.Model): ...
class Book(models.Model):
author = models.ForeignKey(Person, on_delete=models.CASCADE)
- case: prefetch_related_conflicting_prefetches_on_same_attr
installed_apps:
- django.contrib.auth
- django.contrib.contenttypes
main: |
from django.db.models import Prefetch
from django.contrib.auth.models import User, Group
User.objects.prefetch_related( # E: Attribute "new_attr" already defined on "django.contrib.auth.models.User" [no-redef]
Prefetch("groups", Group.objects.filter(name="test"), to_attr="new_attr"),
Prefetch("groups", Group.objects.all(), to_attr="new_attr"),
)
User.objects.prefetch_related( # E: Attribute "new_attr" already defined on "django.contrib.auth.models.User@AnnotatedWith[TypedDict({'new_attr': list[django.contrib.auth.models.Group]})]" [no-redef]
Prefetch("groups", Group.objects.all(), to_attr="new_attr"),
).prefetch_related(
Prefetch("groups", Group.objects.all(), to_attr="new_attr"),
)
# Mostly mirror https://github.com/django/django/blob/0a67611b81567687cd24d2be1c0e390931f06262/tests/prefetch_related/tests.py#L574-L619
- case: prefetch_related_ambiguous_prefetches
installed_apps:
- django.contrib.auth
- django.contrib.contenttypes
main: |
from django.db.models import Prefetch
from django.contrib.auth.models import User, Group
User.objects.prefetch_related("groups", Prefetch("groups")) # Ok
User.objects.prefetch_related("groups", "groups__user_set") # Ok
User.objects.prefetch_related("groups__user_set", Prefetch("groups", to_attr="groups_lst")) # Ok
User.objects.prefetch_related("groups", Prefetch("groups", Group.objects.filter(name="test"), to_attr="another_attr")) # Ok
User.objects.prefetch_related("groups", Prefetch("groups", Group.objects.filter(name="test"))) # E: Lookup "groups" was already seen with a different queryset [no-redef]
User.objects.prefetch_related(Prefetch("groups"), Prefetch("groups", Group.objects.filter(name="test"))) # E: Lookup "groups" was already seen with a different queryset [no-redef]
User.objects.prefetch_related(Prefetch("groups", Group.objects.filter(name="test")), "groups") # E: Lookup "groups" was already seen with a different queryset [no-redef]
- case: prefetch_related_check_valid_lookup
main: |
from django.db.models import Prefetch, F
from myapp.models import Article, Tag, Author, Category
from django.contrib.auth.models import User
Tag.objects.prefetch_related("tagged_items__content_object")
Article.objects.prefetch_related("tags")
Article.objects.prefetch_related("tags__articles")
Article.objects.prefetch_related("tags__articles__tags")
Article.objects.prefetch_related("related_articles__tags")
Article.objects.prefetch_related("subject")
Author.objects.prefetch_related("article_set")
Author.objects.prefetch_related("article_set__tags")
Article.objects.prefetch_related("xyz") # E: Cannot find "xyz" on "Article" object, "xyz" is an invalid parameter to "prefetch_related()" [misc]
Article.objects.prefetch_related("id") # E: "id" does not resolve to an item that supports prefetching - this is an invalid parameter to "prefetch_related()" [misc]
## M2M -- forward / backward
Article.objects.prefetch_related("tags__xyz") # E: Cannot find "xyz" on "Tag" object, "tags__xyz" is an invalid parameter to "prefetch_related()" [misc]
Article.objects.prefetch_related("tags__id") # E: "tags__id" does not resolve to an item that supports prefetching - this is an invalid parameter to "prefetch_related()" [misc]
Tag.objects.prefetch_related("articles__xyz") # E: Cannot find "xyz" on "Article" object, "articles__xyz" is an invalid parameter to "prefetch_related()" [misc]
Tag.objects.prefetch_related("articles__id") # E: "articles__id" does not resolve to an item that supports prefetching - this is an invalid parameter to "prefetch_related()" [misc]
## FK -- forward / backward
Article.objects.prefetch_related("author__xyz") # E: Cannot find "xyz" on "Author" object, "author__xyz" is an invalid parameter to "prefetch_related()" [misc]
Author.objects.prefetch_related("article_set__xyz") # E: Cannot find "xyz" on "Article" object, "article_set__xyz" is an invalid parameter to "prefetch_related()" [misc]
Article.objects.prefetch_related("author__id") # E: "author__id" does not resolve to an item that supports prefetching - this is an invalid parameter to "prefetch_related()" [misc]
Author.objects.prefetch_related("article_set__id") # E: "article_set__id" does not resolve to an item that supports prefetching - this is an invalid parameter to "prefetch_related()" [misc]
## OneToOne -- forward / backward
Author.objects.prefetch_related("user__xyz") # E: Cannot find "xyz" on "User" object, "user__xyz" is an invalid parameter to "prefetch_related()" [misc]
User.objects.prefetch_related("author_profile__xyz") # E: Cannot find "xyz" on "Author" object, "author_profile__xyz" is an invalid parameter to "prefetch_related()" [misc]
Author.objects.prefetch_related("user__id") # E: "user__id" does not resolve to an item that supports prefetching - this is an invalid parameter to "prefetch_related()" [misc]
User.objects.prefetch_related("author_profile__id") # E: "author_profile__id" does not resolve to an item that supports prefetching - this is an invalid parameter to "prefetch_related()" [misc]
## Generic FK -- forward / backward
Article.objects.prefetch_related("subject")
# Generic foreign keys can point to any model, so we cannot validate lookups after
Article.objects.prefetch_related("subject__xyz")
Article.objects.prefetch_related("subject__id")
## GenericRelation -- forward / backward
Tag.objects.prefetch_related("tagged_items")
Category.objects.prefetch_related("tagged_items")
Tag.objects.prefetch_related("tagged_items__content_object")
Tag.objects.prefetch_related("tagged_items__xyz") # E: Cannot find "xyz" on "TaggedItem" object, "tagged_items__xyz" is an invalid parameter to "prefetch_related()" [misc]
Tag.objects.prefetch_related("tagged_items__id") # E: "tagged_items__id" does not resolve to an item that supports prefetching - this is an invalid parameter to "prefetch_related()" [misc]
installed_apps:
- myapp
- django.contrib.auth
- django.contrib.contenttypes
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
class Category(models.Model):
tagged_items = GenericRelation('TaggedItem')
class Tag(models.Model):
category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name="tags")
tagged_items = GenericRelation('TaggedItem')
class Author(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="author_profile")
class TaggedItem(models.Model):
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
class Article(models.Model):
author = models.ForeignKey(Author, on_delete=models.CASCADE)
tags = models.ManyToManyField(Tag, related_name="articles", blank=True)
category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name="articles")
related_articles = models.ManyToManyField("self", related_name="articles", blank=True)
subject_content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
subject_id = models.PositiveIntegerField()
subject = GenericForeignKey("subject_content_type", "subject_id")
- case: django_contrib_contenttypes_generic_prefetch
installed_apps:
- django.contrib.contenttypes
- myapp
main: |
from django.contrib.contenttypes.prefetch import GenericPrefetch
from myapp.models import Bookmark, Animal, TaggedItem, Dog, Cat
from typing_extensions import reveal_type
# Basic GenericPrefetch usage
prefetch = GenericPrefetch(
"content_object", [Bookmark.objects.all(), Animal.objects.only("name")]
)
reveal_type(prefetch) # N: Revealed type is "django.contrib.contenttypes.prefetch.GenericPrefetch[Literal['content_object'], list[django.db.models.query.QuerySet[django.db.models.base.Model, django.db.models.base.Model]], str]"
# GenericPrefetch usage with custom querysets
prefetch_custom = GenericPrefetch(
"content_object", [Dog.objects.all(), Cat.objects.all()]
)
reveal_type(prefetch_custom) # N: Revealed type is "django.contrib.contenttypes.prefetch.GenericPrefetch[Literal['content_object'], list[myapp.models.CustomQuerySet[django.db.models.base.Model, django.db.models.base.Model]], str]"
prefetch_custom_mixed = GenericPrefetch(
"content_object", [Bookmark.objects.all(), Animal.objects.only("name"), Dog.objects.all(), Cat.objects.all()]
)
reveal_type(prefetch_custom_mixed) # N: Revealed type is "django.contrib.contenttypes.prefetch.GenericPrefetch[Literal['content_object'], list[django.db.models.query.QuerySet[django.db.models.base.Model, django.db.models.base.Model]], str]"
# Using GenericPrefetch with prefetch_related
qs = TaggedItem.objects.prefetch_related(prefetch).all()
reveal_type(qs) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.TaggedItem, myapp.models.TaggedItem]"
# GenericPrefetch with to_attr
prefetch_with_attr = GenericPrefetch(
"content_object",
[Bookmark.objects.all(), Animal.objects.only("name")],
to_attr="prefetched_object"
)
qs_with_attr = TaggedItem.objects.prefetch_related(prefetch_with_attr).all()
reveal_type(qs_with_attr) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.TaggedItem@AnnotatedWith[TypedDict({'prefetched_object': list[Any]})], myapp.models.TaggedItem@AnnotatedWith[TypedDict({'prefetched_object': list[Any]})]]"
reveal_type(qs_with_attr.get().prefetched_object) # N: Revealed type is "list[Any]"
# GenericPrefetch on invalid field (not a GenericForeignKey)
regular_fk_prefetch = GenericPrefetch(
"content_type",
[Bookmark.objects.all(), Animal.objects.only("name")],
)
TaggedItem.objects.prefetch_related(regular_fk_prefetch).all() # E: "content_type" on "TaggedItem" is not a GenericForeignKey, GenericPrefetch can only be used with GenericForeignKey fields [misc]
regular_field_prefetch = GenericPrefetch(
"tag",
[Bookmark.objects.all(), Animal.objects.only("name")],
)
TaggedItem.objects.prefetch_related(regular_field_prefetch).all() # E: "tag" on "TaggedItem" is not a GenericForeignKey, GenericPrefetch can only be used with GenericForeignKey fields [misc]
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey
class Bookmark(models.Model):
url = models.URLField()
class Animal(models.Model):
name = models.CharField(max_length=100)
class CustomQuerySet(models.QuerySet):
pass
CustomManager = models.Manager.from_queryset(CustomQuerySet)
class Dog(models.Model):
objects = CustomManager()
class Cat(models.Model):
objects = CustomManager()
class TaggedItem(models.Model):
tag = models.CharField(max_length=100)
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
- case: uninstalled_django_contrib_contenttypes_generic_prefetch
installed_apps:
- myapp
main: |
from django.contrib.contenttypes.prefetch import GenericPrefetch
from myapp.models import Bookmark, Animal, TaggedItem
from typing_extensions import reveal_type
# Basic GenericPrefetch usage
prefetch = GenericPrefetch(
"content_object", [Bookmark.objects.all(), Animal.objects.only("name")]
)
reveal_type(prefetch) # N: Revealed type is "django.contrib.contenttypes.prefetch.GenericPrefetch[Literal['content_object'], list[django.db.models.query.QuerySet[django.db.models.base.Model, django.db.models.base.Model]], str]"
# Using GenericPrefetch with prefetch_related
qs = TaggedItem.objects.prefetch_related(prefetch).all() # E: Cannot find "content_object" on "TaggedItem" object, "content_object" is an invalid parameter to "prefetch_related()" [misc]
reveal_type(qs) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.TaggedItem, myapp.models.TaggedItem]"
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Bookmark(models.Model):
url = models.URLField()
class Animal(models.Model):
name = models.CharField(max_length=100)
class TaggedItem(models.Model):
tag = models.CharField(max_length=100)
- case: prefetch_related_from_queryset_incompatible_type
installed_apps:
- myapp
main: |
from myapp.models import Object, RelatedObject
from django.db.models import Prefetch
Object.objects.prefetch_related(Prefetch("related_objects")).all()
Object.objects.prefetch_related(Prefetch("related_objects", queryset=RelatedObject.objects.select_related("other_object"))).all()
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
import typing
from django.db import models
T = typing.TypeVar("T", bound="models.Model")
class BaseManager(models.Manager[T]): ...
class BaseObject(models.Model):
objects = BaseManager["BaseObject"]()
class ObjectQuerySet(models.QuerySet["Object"]): ...
class ObjectManager(BaseManager["Object"]): ...
class Object(BaseObject):
objects: typing.ClassVar = ObjectManager.from_queryset(ObjectQuerySet)()
class OtherObject(models.Model): ...
class RelatedObject(models.Model):
object = models.ForeignKey(Object, on_delete=models.CASCADE, related_name="related_objects")
other_object = models.ForeignKey(OtherObject, on_delete=models.CASCADE)
typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_querysetany.yml 0000664 0000000 0000000 00000002774 15260643574 0032214 0 ustar 00root root 0000000 0000000 - case: queryset_isinstance_check
main: |
from typing import Any
from typing_extensions import reveal_type
from django.db.models.query import QuerySet
from django_stubs_ext import QuerySetAny
def foo(q: QuerySet[Any]) -> None:
pass
def bar(q: QuerySetAny) -> None:
pass
def baz(obj: object) -> None:
if isinstance(obj, QuerySetAny):
reveal_type(obj) # N: Revealed type is "django.db.models.query.QuerySet[Any, Any]"
foo(obj)
bar(obj)
if isinstance(obj, QuerySet):
reveal_type(obj) # N: Revealed type is "django.db.models.query.QuerySet[Any, Any]"
foo(obj)
bar(obj)
- case: queryset_list
main: |
from django.db.models.query import QuerySet
from django_stubs_ext import QuerySetAny
from myapp.models import User, Book
def try_append(queryset_instance: QuerySetAny, queryset: QuerySet[User], queryset_book: QuerySet[Book]) -> None:
user_querysets: list[QuerySet[User]] = []
user_querysets.append(queryset_instance)
user_querysets.append(queryset)
user_querysets.append(queryset_book) # E: Argument 1 to "append" of "list" has incompatible type "QuerySet[Book, Book]"; expected "QuerySet[User, User]" [arg-type]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
pass
class Book(models.Model):
pass
typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_select_related.yml 0000664 0000000 0000000 00000014704 15260643574 0032576 0 ustar 00root root 0000000 0000000 - case: select_related_valid_lookups
installed_apps:
- myapp
main: |
from myapp.models import Article, Author, Category, Blog, Post
# Valid forward relations
Article.objects.select_related("author")
Article.objects.select_related("category")
# Valid reverse relations (unique=True)
Author.objects.select_related("profile")
# Valid chained lookups
Article.objects.select_related("author__profile")
Article.objects.select_related("category__parent")
Post.objects.select_related("blog__owner")
Post.objects.select_related("category__parent__parent")
# Multiple valid lookups
Article.objects.select_related("author", "category")
Article.objects.select_related("author__profile", "category")
# Self-referential relationships
Category.objects.select_related("parent")
Category.objects.select_related("parent__parent")
# Variables containing strings
author_lookup = "aaa"
Article.objects.select_related(author_lookup)
# Dynamic lookups (should not be validated)
def get_lookup() -> str:
return "author"
Article.objects.select_related(get_lookup())
# Chaining select_related calls
qs1 = Article.objects.select_related("author")
qs2 = qs1.select_related("category")
Article.objects.select_related("author").select_related("category")
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Category(models.Model):
parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True)
class Author(models.Model):
pass
class AuthorProfile(models.Model):
author = models.OneToOneField(Author, on_delete=models.CASCADE, related_name='profile')
class Blog(models.Model):
owner = models.ForeignKey(Author, on_delete=models.CASCADE)
class Article(models.Model):
title = models.CharField(max_length=200) # Keep for testing non-relation field
author = models.ForeignKey(Author, on_delete=models.CASCADE)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
class Post(models.Model):
blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
- case: select_related_invalid_lookups
installed_apps:
- myapp
main: |
from myapp.models import Article, Author, Category, Post
from typing import Literal
# Invalid field names
Article.objects.select_related("nonexistent") # E: Invalid field name "nonexistent" in select_related lookup. Choices are: author, category [misc]
Article.objects.select_related("title") # E: Invalid field name "title" in select_related lookup. Choices are: author, category [misc]
# Invalid chained lookups
Article.objects.select_related("author__nonexistent") # E: Invalid field name "nonexistent" in select_related lookup. Choices are: profile [misc]
Article.objects.select_related("category__invalid") # E: Invalid field name "invalid" in select_related lookup. Choices are: parent [misc]
# Reverse many-to-many (not allowed)
Category.objects.select_related("article_set") # E: Invalid field name "article_set" in select_related lookup. Choices are: parent [misc]
# Mixed valid and invalid in same call
Post.objects.select_related("blog", "invalid") # E: Invalid field name "invalid" in select_related lookup. Choices are: author, blog, category [misc]
# Intermediary variable not validated if non literal
invalid_lookup = "nonexistent"
Article.objects.select_related(invalid_lookup) # No error - variables not validated
# Intermediary variable validated if literal
invalid_lookup2: Literal["nonexistent"] = "nonexistent"
Article.objects.select_related(invalid_lookup2) # E: Invalid field name "nonexistent" in select_related lookup. Choices are: author, category [misc]
# Chaining with invalid lookups
qs3 = Article.objects.select_related("author").select_related("invalid") # E: Invalid field name "invalid" in select_related lookup. Choices are: author, category [misc]
Article.objects.select_related("author").select_related("invalid") # E: Invalid field name "invalid" in select_related lookup. Choices are: author, category [misc]
# Multiple arguments with invalid lookups
Article.objects.select_related("author", "invalid", "category") # E: Invalid field name "invalid" in select_related lookup. Choices are: author, category [misc]
# Whitespace-only lookup (invalid)
Article.objects.select_related("") # E: Invalid field name "" in select_related lookup [misc]
Article.objects.select_related(" ") # E: Invalid field name " " in select_related lookup [misc]
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Category(models.Model):
parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True)
class Author(models.Model):
pass
class AuthorProfile(models.Model):
author = models.OneToOneField(Author, on_delete=models.CASCADE, related_name='profile')
class Blog(models.Model):
owner = models.ForeignKey(Author, on_delete=models.CASCADE)
class Article(models.Model):
title = models.CharField(max_length=200) # Keep for testing non-relation field
author = models.ForeignKey(Author, on_delete=models.CASCADE)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
class Post(models.Model):
blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_union_type.yml 0000664 0000000 0000000 00000002533 15260643574 0032005 0 ustar 00root root 0000000 0000000 - case: union_queryset_custom_method
main: |
from typing_extensions import reveal_type
from django.db.models import QuerySet
from myapp.models import User, Order
instance: Order | User = User()
model_cls = type(instance)
reveal_type(model_cls) # N: Revealed type is "type[myapp.models.Order] | type[myapp.models.User]"
reveal_type(model_cls.objects) # N: Revealed type is "myapp.models.ManagerFromMyQuerySet[myapp.models.Order] | myapp.models.ManagerFromMyQuerySet[myapp.models.User]"
reveal_type(model_cls.objects.my_method()) # N: Revealed type is "myapp.models.MyQuerySet[Any, Any]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from __future__ import annotations
from django.db import models
class MyQuerySet(models.QuerySet):
def my_method(self) -> MyQuerySet:
raise NotImplementedError
UserManager = models.Manager.from_queryset(MyQuerySet)
class User(models.Model):
objects = UserManager()
OrderManager = models.Manager.from_queryset(MyQuerySet)
class Order(models.Model):
objects = OrderManager()
typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_update.yml 0000664 0000000 0000000 00000011366 15260643574 0031102 0 ustar 00root root 0000000 0000000 - case: update_valid_fields
installed_apps:
- myapp
main: |
from typing import Any
from myapp.models import Article, Author
from django.db.models import F
# Simple field
Article.objects.update(title="new title")
# Multiple fields
Article.objects.update(title="new title", published=True)
# FK id field (concrete)
Article.objects.update(author_id=1)
# FK by object
author = Author.objects.get(pk=1)
Article.objects.update(author=author)
# Expression value
Article.objects.update(title=F("content"))
# Unpacked kwargs (skipped by validation, field names are not statically known)
Article.objects.update(**{"title": "new title"})
fields: dict[str, Any] = {"title": "new title"}
Article.objects.update(**fields)
# Chained with filter
Article.objects.filter(published=False).update(published=True)
# Async variant
async def test_async() -> None:
await Article.objects.aupdate(title="new title")
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Tag(models.Model):
name = models.CharField(max_length=50)
class Author(models.Model):
name = models.CharField(max_length=100)
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
published = models.BooleanField(default=False)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
tags = models.ManyToManyField(Tag)
- case: update_invalid_fields
installed_apps:
- myapp
main: |
from myapp.models import Article, Author
from django.db.models import F
# Non-existent field
Article.objects.update(nonexistent=1) # E: Article has no field named 'nonexistent' [misc]
# M2M field (not concrete)
Article.objects.update(tags=1) # E: "update()" can only be used with concrete fields. Got "tags" [misc]
# "pk" alias (not supported by `Options.get_field` at runtime)
Article.objects.update(pk=1) # E: Article has no field named 'pk' [misc]
# Reverse relation (not concrete)
Author.objects.update(article=1) # E: "update()" can only be used with concrete fields. Got "article" [misc]
# Annotated field (not supported at runtime, `Options.get_field` raises `FieldDoesNotExist`)
Article.objects.annotate(foo=F("title")).update(foo="new") # E: Article has no field named 'foo' [misc]
# Async variant with invalid field
async def test_async() -> None:
await Article.objects.aupdate(nonexistent=1) # E: Article has no field named 'nonexistent' [misc]
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Tag(models.Model):
name = models.CharField(max_length=50)
class Author(models.Model):
name = models.CharField(max_length=100)
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
published = models.BooleanField(default=False)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
tags = models.ManyToManyField(Tag)
- case: update_override_with_declared_kwargs
installed_apps:
- myapp
main: |
from myapp.models import Article
# Kwargs declared explicitly by an `update()` override are consumed by
# the override; only ones destined for `**kwargs` are model fields.
Article.objects.update(title="new title", author_name="foo")
Article.objects.update(nonexistent=1, author_name="foo") # E: Article has no field named 'nonexistent' [misc]
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing import Any
from django.db import models
from typing_extensions import override
class ArticleQuerySet(models.QuerySet["Article"]):
@override
def update(self, *, author_name: str | None = None, **kwargs: Any) -> int:
return super().update(**kwargs)
class Article(models.Model):
title = models.CharField(max_length=200)
objects = ArticleQuerySet.as_manager()
typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_update_or_create.yml 0000664 0000000 0000000 00000010551 15260643574 0033120 0 ustar 00root root 0000000 0000000 - case: update_or_create_typechecks_kwargs
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
# Return type is preserved
reveal_type(MyModel.objects.update_or_create(num=1)) # N: Revealed type is "tuple[myapp.models.MyModel, bool]"
# Valid field kwarg, lookup expression, defaults and create_defaults
MyModel.objects.update_or_create(num=1)
MyModel.objects.update_or_create(num__gte=1)
MyModel.objects.update_or_create(num=1, defaults={"num": 2}, create_defaults={"num": 3})
# Unknown field is rejected
MyModel.objects.update_or_create(unknown_field=True) # E: Cannot resolve keyword 'unknown_field' into field. Choices are: id, num [misc]
# Invalid type for a known field is rejected
MyModel.objects.update_or_create(num=MyModel()) # E: Incompatible type for lookup 'num': (got "MyModel", expected "str | int") [misc]
# Async variant shares the same validation
async def main() -> None:
await MyModel.objects.aupdate_or_create(num=1)
await MyModel.objects.aupdate_or_create(unknown_field=True) # E: Cannot resolve keyword 'unknown_field' into field. Choices are: id, num [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyModel(models.Model):
num = models.IntegerField()
- case: update_or_create_typechecks_defaults
main: |
from myapp.models import MyModel
# Unknown key in defaults is rejected
MyModel.objects.update_or_create(num=1, defaults={"unknown_field": True}) # E: Unexpected attribute "unknown_field" for model "MyModel" [misc]
# Incompatible value type in defaults is rejected
MyModel.objects.update_or_create(num=1, defaults={"num": MyModel()}) # E: Incompatible type for "num" of "MyModel" (got "MyModel", expected "float | int | str | Combinable") [misc]
# Valid defaults: no errors
MyModel.objects.update_or_create(num=1, defaults={"num": 2, "name": "hello"})
# Unknown key in create_defaults is rejected
MyModel.objects.update_or_create(num=1, create_defaults={"unknown_field": True}) # E: Unexpected attribute "unknown_field" for model "MyModel" [misc]
# Incompatible value type in create_defaults is rejected
MyModel.objects.update_or_create(num=1, create_defaults={"num": MyModel()}) # E: Incompatible type for "num" of "MyModel" (got "MyModel", expected "float | int | str | Combinable") [misc]
# Valid create_defaults: no errors
MyModel.objects.update_or_create(num=1, create_defaults={"num": 3, "name": "hi"})
# Both defaults and create_defaults validated in a single call
MyModel.objects.update_or_create(
num=1,
defaults={"unknown_in_defaults": True}, # E: Unexpected attribute "unknown_in_defaults" for model "MyModel" [misc]
create_defaults={"unknown_in_create_defaults": True}, # E: Unexpected attribute "unknown_in_create_defaults" for model "MyModel" [misc]
)
# `**kwargs` variable unpacking is silently accepted
kwargs = {
"defaults": {"unknown_field": True},
"create_defaults": {"unknown_field": True},
}
MyModel.objects.update_or_create(num=1, **kwargs)
# `**dict_literal` unpacking is also silently accepted; only a direct
# `defaults=` / `create_defaults=` dict literal is validated.
MyModel.objects.update_or_create(
num=1,
**{"defaults": {"unknown_field": True}, "create_defaults": {"unknown_field": True}},
)
# Async variant shares the same validation
async def main() -> None:
await MyModel.objects.aupdate_or_create(
num=1,
defaults={"unknown_field": True}, # E: Unexpected attribute "unknown_field" for model "MyModel" [misc]
)
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyModel(models.Model):
num = models.IntegerField()
name = models.CharField(max_length=100)
typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_values.yml 0000664 0000000 0000000 00000022313 15260643574 0031111 0 ustar 00root root 0000000 0000000 - case: queryset_values_method_returns_typeddict
main: |
from typing_extensions import reveal_type
from myapp.models import Blog
values = Blog.objects.values('num_posts', 'text').get()
reveal_type(values) # N: Revealed type is "TypedDict({'num_posts': int, 'text': str})"
reveal_type(values["num_posts"]) # N: Revealed type is "int"
reveal_type(values["text"]) # N: Revealed type is "str"
values_pk = Blog.objects.values('pk').get()
reveal_type(values_pk) # N: Revealed type is "TypedDict({'pk': int})"
reveal_type(values_pk["pk"]) # N: Revealed type is "int"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Blog(models.Model):
num_posts = models.IntegerField()
text = models.CharField(max_length=100)
- case: queryset_values_all_values
main: |
from typing_extensions import reveal_type
from myapp.models import Blog
all_values_dict = Blog.objects.values().get()
reveal_type(all_values_dict) # N: Revealed type is "TypedDict({'id': int, 'num_posts': int, 'text': str})"
reveal_type(all_values_dict["id"]) # N: Revealed type is "int"
reveal_type(all_values_dict["num_posts"]) # N: Revealed type is "int"
reveal_type(all_values_dict["text"]) # N: Revealed type is "str"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Publisher(models.Model):
pass
class Blog(models.Model):
num_posts = models.IntegerField()
text = models.CharField(max_length=100)
- case: queryset_foreign_key_object_always_a_primary_key
main: |
from typing_extensions import reveal_type
from myapp.models import Blog
values1 = Blog.objects.values('publisher').get()
reveal_type(values1) # N: Revealed type is "TypedDict({'publisher': int})"
reveal_type(values1['publisher']) # N: Revealed type is "int"
values2 = Blog.objects.values('publisher_id').get()
reveal_type(values2) # N: Revealed type is "TypedDict({'publisher_id': int})"
reveal_type(values2["publisher_id"]) # N: Revealed type is "int"
# all values return _id version
all_values = Blog.objects.values().get()
reveal_type(all_values) # N: Revealed type is "TypedDict({'id': int, 'publisher_id': int})"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Publisher(models.Model):
pass
class Blog(models.Model):
publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE)
- case: values_with_related_model_fields
main: |
from typing_extensions import reveal_type
from myapp.models import Entry
values = Entry.objects.values('blog__num_articles', 'blog__publisher__name').get()
reveal_type(values) # N: Revealed type is "TypedDict({'blog__num_articles': int, 'blog__publisher__name': str})"
pk_values = Entry.objects.values('blog__pk', 'blog__publisher__pk').get()
reveal_type(pk_values) # N: Revealed type is "TypedDict({'blog__pk': int, 'blog__publisher__pk': int})"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Publisher(models.Model):
name = models.CharField(max_length=100)
class Blog(models.Model):
num_articles = models.IntegerField()
publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE)
class Entry(models.Model):
blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
- case: select_all_related_model_values_for_every_current_value
main: |
from typing_extensions import reveal_type
from myapp.models import Publisher
related_model_values = Publisher.objects.values('id', 'blog__name').get()
reveal_type(related_model_values) # N: Revealed type is "TypedDict({'id': int, 'blog__name': str})"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Publisher(models.Model):
pass
class Blog(models.Model):
name = models.CharField(max_length=100)
publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
- case: values_of_many_to_many_field
main: |
from typing_extensions import reveal_type
from myapp.models import Author, Book
reveal_type(Book.objects.values('authors')) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Book, TypedDict({'authors': int})]"
reveal_type(Author.objects.values('books')) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Author, TypedDict({'books': int})]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Author(models.Model):
pass
class Book(models.Model):
authors = models.ManyToManyField(Author, related_name='books')
- case: queryset_values_blank_charfield
main: |
from typing_extensions import reveal_type
from myapp.models import Blog
values = Blog.objects.values('text').get()
reveal_type(values) # N: Revealed type is "TypedDict({'text': str})"
reveal_type(values["text"]) # N: Revealed type is "str"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Blog(models.Model):
num_posts = models.IntegerField()
text = models.CharField(max_length=100, blank=True)
- case: queryset_values_with_expressions
main: |
from typing_extensions import reveal_type
from django.db.models import F
from django.db.models.functions import Lower
from myapp.models import Blog
reveal_type(Blog.objects.values("id"))
reveal_type(Blog.objects.values("id", "num_posts", "text"))
reveal_type(Blog.objects.values(foo=F("id")))
reveal_type(Blog.objects.values("id", foo=F("id")))
reveal_type(Blog.objects.values("id", lower_text=Lower("text")))
out: |
main:6: note: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog, TypedDict({'id': int})]"
main:7: note: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog, TypedDict({'id': int, 'num_posts': int, 'text': str})]"
main:8: note: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog, TypedDict({'foo': Any})]"
main:9: note: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog, TypedDict({'id': int, 'foo': Any})]"
main:10: note: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog, TypedDict({'id': int, 'lower_text': Any})]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Blog(models.Model):
num_posts = models.IntegerField()
text = models.CharField(max_length=100)
- case: queryset_values_m2m_fk_with_expressions
main: |
from typing_extensions import reveal_type
from django.db.models import F
from django.db.models.functions import Lower
from myapp.models import Book
reveal_type(Book.objects.values(premium_price=F("premiumbookdetails__price")))
reveal_type(Book.objects.values(team_name=F("authors__name")))
out: |
main:6: note: Revealed type is "django.db.models.query.QuerySet[myapp.models.Book, TypedDict({'premium_price': Any})]"
main:7: note: Revealed type is "django.db.models.query.QuerySet[myapp.models.Book, TypedDict({'team_name': Any})]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
authors = models.ManyToManyField(Author, related_name='books')
class PremiumBookDetails(models.Model):
book = models.OneToOneField(Book, on_delete=models.CASCADE)
price = models.DecimalField(max_digits=10, decimal_places=2)
typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_values_list.yml 0000664 0000000 0000000 00000037734 15260643574 0032161 0 ustar 00root root 0000000 0000000 - case: values_list_simple_field_returns_queryset_of_tuples
main: |
from typing_extensions import reveal_type
from myapp.models import MyUser
reveal_type(MyUser.objects.values_list('name').get()) # N: Revealed type is "tuple[str]"
reveal_type(MyUser.objects.values_list('id', 'name').get()) # N: Revealed type is "tuple[int, str]"
values_tuple = MyUser.objects.values_list('name', 'age').get()
reveal_type(values_tuple[0]) # N: Revealed type is "str"
reveal_type(values_tuple[1]) # N: Revealed type is "int"
# no fields specified return all fields
all_values_tuple = MyUser.objects.values_list().get()
reveal_type(all_values_tuple) # N: Revealed type is "tuple[int, str, int]"
# pk as field
pk_values = MyUser.objects.values_list('pk').get()
reveal_type(pk_values) # N: # N: Revealed type is "tuple[int]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyUser(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
- case: values_list_field_repetition
main: |
from typing_extensions import reveal_type
from myapp.models import MyUser
# Values tuples can have the same field repeated
values_tuple = MyUser.objects.values_list('name', 'age', 'name').get()
reveal_type(values_tuple) # N: Revealed type is "tuple[str, int, str]"
reveal_type(values_tuple[0]) # N: Revealed type is "str"
reveal_type(values_tuple[1]) # N: Revealed type is "int"
reveal_type(values_tuple[2]) # N: Revealed type is "str"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyUser(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
- case: values_list_types_are_field_types
main: |
from typing_extensions import reveal_type
from myapp.models import Concrete
ret = list(Concrete.objects.values_list('id', 'data'))
reveal_type(ret) # N: Revealed type is "list[tuple[int, dict[str, str]]]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from __future__ import annotations
from django.db import models
class JSONField(models.TextField): pass # incomplete
class Concrete(models.Model):
id = models.IntegerField()
data: models.Field[dict[str, str], dict[str, str]] = JSONField()
- case: values_list_supports_queryset_methods
main: |
from typing_extensions import reveal_type
from myapp.models import MyUser
from django.db.models.functions import Length
query = MyUser.objects.values_list('name')
reveal_type(query.order_by("name").get()) # N: Revealed type is "tuple[str]"
reveal_type(query.distinct("name").get()) # N: Revealed type is "tuple[str]"
reveal_type(query.distinct().get()) # N: Revealed type is "tuple[str]"
reveal_type(query.all().get()) # N: Revealed type is "tuple[str]"
reveal_type(query.filter(age__gt=16).get()) # N: Revealed type is "tuple[str]"
reveal_type(query.exclude(age__lte=16).get()) # N: Revealed type is "tuple[str]"
reveal_type(query.annotate(name_length=Length("name")).get()) # N: Revealed type is "tuple[Any, ...]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyUser(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
- case: values_list_related_model_fields
main: |
from typing_extensions import reveal_type
from myapp.models import Post, Blog
values_tuple = Post.objects.values_list('blog', 'blog__num_posts', 'blog__publisher', 'blog__publisher__name').get()
reveal_type(values_tuple[0]) # N: Revealed type is "int"
reveal_type(values_tuple[1]) # N: Revealed type is "int"
reveal_type(values_tuple[2]) # N: Revealed type is "int"
reveal_type(values_tuple[3]) # N: Revealed type is "str"
reverse_fields_list = Blog.objects.values_list('post__text').get()
reveal_type(reverse_fields_list) # N: Revealed type is "tuple[str]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Publisher(models.Model):
name = models.CharField(max_length=100)
class Blog(models.Model):
num_posts = models.IntegerField()
publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE)
class Post(models.Model):
text = models.CharField(max_length=100)
blog = models.ForeignKey(to=Blog, on_delete=models.CASCADE)
- case: values_list_flat_true_methods
main: |
from typing_extensions import reveal_type
from myapp.models import MyUser, MyUser2
reveal_type(MyUser.objects.values_list('name', flat=True).get()) # N: Revealed type is "str"
reveal_type(MyUser.objects.values_list('name', 'age', flat=True).get())
# flat=True without specified fields returns primary key values
reveal_type(MyUser.objects.values_list(flat=True)[0]) # N: Revealed type is "int"
reveal_type(MyUser2.objects.values_list(flat=True)[0]) # N: Revealed type is "str"
out: |
main:4: error: 'flat' is not valid when 'values_list' is called with more than one field [misc]
main:4: note: Revealed type is "Any"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyUser(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
class MyUser2(models.Model):
name = models.CharField(max_length=100, primary_key=True)
- case: values_list_named_true
main: |
from typing_extensions import reveal_type
from myapp.models import MyUser
values_named_tuple = MyUser.objects.values_list('name', 'age', named=True).get()
reveal_type(values_named_tuple) # N: Revealed type is "tuple[str, int, fallback=main.Row]"
reveal_type(values_named_tuple.name) # N: Revealed type is "str"
reveal_type(values_named_tuple.age) # N: Revealed type is "int"
# no fields specified, returns all fields namedtuple
all_values_named_tuple = MyUser.objects.values_list(named=True).get()
reveal_type(all_values_named_tuple.id) # N: Revealed type is "int"
reveal_type(all_values_named_tuple.name) # N: Revealed type is "str"
reveal_type(all_values_named_tuple.age) # N: Revealed type is "int"
reveal_type(all_values_named_tuple.is_admin) # N: Revealed type is "bool"
# pk as field
pk_values = MyUser.objects.values_list('pk', named=True).get()
reveal_type(pk_values) # N: Revealed type is "tuple[int, fallback=main.Row2]"
reveal_type(pk_values.pk) # N: # N: Revealed type is "int"
# values_list(named=True) inside function
def func() -> None:
from myapp.models import MyUser
reveal_type(MyUser.objects.values_list('name', named=True).get()) # N: Revealed type is "tuple[str, fallback=main.Row3]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyUser(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
is_admin = models.BooleanField()
- case: values_list_flat_true_named_true_error
main: |
from typing_extensions import reveal_type
from myapp.models import MyUser
reveal_type(MyUser.objects.values_list('name', flat=True, named=True).get())
out: |
main:3: error: 'flat' and 'named' can't be used together [misc]
main:3: note: Revealed type is "Any"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyUser(models.Model):
name = models.CharField(max_length=100)
- case: invalid_lookups
main: |
from typing_extensions import reveal_type
from myapp.models import Blog
reveal_type(Blog.objects.values_list('unknown').get())
reveal_type(Blog.objects.values_list('unknown', flat=True).get())
reveal_type(Blog.objects.values_list('unknown', named=True).get())
reveal_type(Blog.objects.values_list('publisher__unknown').get())
out: |
main:3: error: Cannot resolve keyword 'unknown' into field. Choices are: id, publisher, publisher_id [misc]
main:3: note: Revealed type is "Any"
main:4: error: Cannot resolve keyword 'unknown' into field. Choices are: id, publisher, publisher_id [misc]
main:4: note: Revealed type is "Any"
main:5: error: Cannot resolve keyword 'unknown' into field. Choices are: id, publisher, publisher_id [misc]
main:5: note: Revealed type is "Any"
main:6: note: Revealed type is "tuple[Any]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Publisher(models.Model):
pass
class Blog(models.Model):
publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE)
- case: named_true_with_related_model_fields
main: |
from typing_extensions import reveal_type
from myapp.models import Entry, Blog
values = Entry.objects.values_list('blog__num_articles', 'blog__publisher__name', named=True).get()
reveal_type(values.blog__num_articles) # N: Revealed type is "int"
reveal_type(values.blog__publisher__name) # N: Revealed type is "str"
pk_values = Entry.objects.values_list('blog__pk', 'blog__publisher__pk', named=True).get()
reveal_type(pk_values.blog__pk) # N: Revealed type is "int"
reveal_type(pk_values.blog__publisher__pk) # N: Revealed type is "int"
# reverse relation
reverse_values = Blog.objects.values_list('entry__text', named=True).get()
reveal_type(reverse_values.entry__text) # N: Revealed type is "str"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Publisher(models.Model):
name = models.CharField(max_length=100)
class Blog(models.Model):
num_articles = models.IntegerField()
publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE)
class Entry(models.Model):
text = models.CharField(max_length=100)
blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
- case: values_list_flat_true_with_ids
main: |
from typing_extensions import reveal_type
from myapp.models import Blog, Publisher
reveal_type(Blog.objects.values_list('id', flat=True)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog, int]"
reveal_type(Blog.objects.values_list('publisher', flat=True)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog, int]"
reveal_type(Blog.objects.values_list('publisher_id', flat=True)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog, int]"
# is Iterable[int]
reveal_type(list(Blog.objects.values_list('id', flat=True))) # N: Revealed type is "list[int]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Publisher(models.Model):
pass
class Blog(models.Model):
publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE)
- case: subclass_of_queryset_has_proper_typings_on_methods
main: |
from typing_extensions import reveal_type
from myapp.models import TransactionQuerySet
reveal_type(TransactionQuerySet()) # N: Revealed type is "myapp.models.TransactionQuerySet[myapp.models.Transaction, myapp.models.Transaction]"
reveal_type(TransactionQuerySet().values()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Transaction, TypedDict({'id': int, 'total': int})]"
reveal_type(TransactionQuerySet().values_list()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Transaction, tuple[int, int]]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class TransactionQuerySet(models.QuerySet['Transaction']):
pass
class Transaction(models.Model):
total = models.IntegerField()
- case: values_list_of_many_to_many_field
main: |
from typing_extensions import reveal_type
from myapp.models import Author, Book
reveal_type(Book.objects.values_list('authors')) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Book, tuple[int]]"
reveal_type(Author.objects.values_list('books')) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Author, tuple[int]]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Author(models.Model):
pass
class Book(models.Model):
authors = models.ManyToManyField(Author, related_name='books')
- case: queryset_values_list_blank_charfield
main: |
from typing_extensions import reveal_type
from myapp.models import Blog
values = Blog.objects.values_list('text').get()
reveal_type(values) # N: Revealed type is "tuple[str]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Blog(models.Model):
num_posts = models.IntegerField()
text = models.CharField(max_length=100, blank=True)
- case: handles_field_with_same_name_on_other_model
main: |
from typing_extensions import reveal_type
from myapp.models import A
reveal_type(A.objects.values_list("name", "b__name").get()) # N: Revealed type is "tuple[int, str]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class B(models.Model):
name = models.CharField()
class A(models.Model):
b = models.ForeignKey(B, on_delete=models.CASCADE)
name = models.IntegerField()
typeddjango-django-stubs-fa03b48/tests/typecheck/managers/test_managers.yml 0000664 0000000 0000000 00000106110 15260643574 0027341 0 ustar 00root root 0000000 0000000 - case: test_every_model_has_objects_queryset_available
main: |
from typing_extensions import reveal_type
from myapp.models import User
reveal_type(User.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.User]"
reveal_type(User.objects.get()) # N: Revealed type is "myapp.models.User"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
pass
- case: every_model_has_its_own_objects_queryset
main: |
from typing_extensions import reveal_type
from myapp.models import Parent, Child
reveal_type(Parent.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.Parent]"
reveal_type(Child.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.Child]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Parent(models.Model):
pass
class Child(Parent):
pass
- case: if_custom_manager_defined_it_is_set_to_default_manager
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel._default_manager) # N: Revealed type is "myapp.models.CustomManager[myapp.models.MyModel]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing_extensions import TypeVar
from django.db import models
_T = TypeVar('_T', bound=models.Model)
class CustomManager(models.Manager[_T]):
pass
class MyModel(models.Model):
manager = CustomManager['MyModel']()
- case: if_default_manager_name_is_passed_set_default_manager_to_it
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel._default_manager) # N: Revealed type is "myapp.models.Manager2[myapp.models.MyModel]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing_extensions import TypeVar
from django.db import models
from django_stubs_ext.db.models import TypedModelMeta
_T = TypeVar('_T', bound=models.Model)
class Manager1(models.Manager[_T]):
pass
class Manager2(models.Manager[_T]):
pass
class MyModel(models.Model):
class Meta(TypedModelMeta):
default_manager_name = 'm2'
m1 = Manager1['MyModel']()
m2 = Manager2['MyModel']()
- case: test_leave_as_is_if_objects_is_set_and_fill_typevars_with_outer_class
main: |
from typing_extensions import reveal_type
from myapp.models import MyUser
reveal_type(MyUser.objects) # N: Revealed type is "myapp.models.UserManager"
reveal_type(MyUser.objects.get()) # N: Revealed type is "myapp.models.MyUser"
reveal_type(MyUser.objects.get_or_404()) # N: Revealed type is "myapp.models.MyUser"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class UserManager(models.Manager['MyUser']):
def get_or_404(self) -> 'MyUser':
raise NotImplementedError
class MyUser(models.Model):
objects = UserManager()
- case: model_imported_from_different_file
main: |
from typing_extensions import reveal_type
from myapp.models import Inventory, Band
reveal_type(Inventory.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.main.Inventory]"
reveal_type(Band.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.Band]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models/__init__.py
content: |
from django.db import models
from .main import Inventory as Inventory
class Band(models.Model):
pass
- path: myapp/models/main.py
content: |
from django.db import models
class Inventory(models.Model):
pass
- case: managers_that_defined_on_other_models_do_not_influence
main: |
from typing_extensions import reveal_type
from myapp.models import AbstractPerson, Book
reveal_type(AbstractPerson.abstract_persons) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.AbstractPerson]"
reveal_type(Book.published_objects) # N: Revealed type is "myapp.models.PublishedBookManager"
Book.published_objects.create(title='hello')
reveal_type(Book.annotated_objects) # N: Revealed type is "myapp.models.AnnotatedBookManager"
Book.annotated_objects.create(title='hello')
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class AbstractPerson(models.Model):
abstract_persons = models.Manager['AbstractPerson']()
class PublishedBookManager(models.Manager['Book']):
pass
class AnnotatedBookManager(models.Manager['Book']):
pass
class Book(models.Model):
title = models.CharField(max_length=50)
published_objects = PublishedBookManager()
annotated_objects = AnnotatedBookManager()
- case: managers_inherited_from_abstract_classes_multiple_inheritance
main: |
from typing_extensions import reveal_type
from myapp.models import AbstractBase1, AbstractBase2, Child
reveal_type(Child.manager1)
reveal_type(Child.restricted)
reveal_type(AbstractBase1.manager1)
reveal_type(AbstractBase2.restricted)
out: |
main:3: note: Revealed type is "myapp.models.CustomManager1"
main:4: note: Revealed type is "myapp.models.CustomManager2"
main:5: note: Revealed type is "myapp.models.CustomManager1"
main:6: note: Revealed type is "myapp.models.CustomManager2"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class CustomManager1(models.Manager['AbstractBase1']):
pass
class AbstractBase1(models.Model):
class Meta:
abstract = True
name = models.CharField(max_length=50)
manager1 = CustomManager1()
class CustomManager2(models.Manager['AbstractBase2']):
pass
class AbstractBase2(models.Model):
class Meta:
abstract = True
value = models.CharField(max_length=50)
restricted = CustomManager2()
class Child(AbstractBase1, AbstractBase2):
pass
- case: managers_inherited_from_abstract_classes_multiple_inheritance_with_generic
main: |
from typing_extensions import reveal_type
from myapp.models import AbstractBase1, AbstractBase2, Child
reveal_type(Child.manager1) # N: Revealed type is "myapp.models.CustomManager1[myapp.models.Child]"
reveal_type(Child.manager1.get()) # N: Revealed type is "myapp.models.Child"
reveal_type(Child.restricted) # N: Revealed type is "myapp.models.CustomManager2[myapp.models.Child]"
reveal_type(Child.restricted.get()) # N: Revealed type is "myapp.models.Child"
reveal_type(AbstractBase1.manager1) # N: Revealed type is "myapp.models.CustomManager1[myapp.models.AbstractBase1]"
reveal_type(AbstractBase1.manager1.get()) # N: Revealed type is "myapp.models.AbstractBase1"
reveal_type(AbstractBase2.restricted) # N: Revealed type is "myapp.models.CustomManager2[myapp.models.AbstractBase2]"
reveal_type(AbstractBase2.restricted.get()) # N: Revealed type is "myapp.models.AbstractBase2"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing import Generic
from typing_extensions import TypeVar
from django.db import models
T1 = TypeVar("T1", bound="AbstractBase1")
class CustomManager1(models.Manager[T1], Generic[T1]): ...
class AbstractBase1(models.Model):
class Meta:
abstract = True
name = models.CharField(max_length=50)
manager1 = CustomManager1()
T2 = TypeVar("T2", bound="AbstractBase2")
class CustomManager2(models.Manager[T2], Generic[T2]): ...
class AbstractBase2(models.Model):
class Meta:
abstract = True
value = models.CharField(max_length=50)
restricted = CustomManager2()
class Child(AbstractBase1, AbstractBase2): ...
- case: model_has_a_manager_of_the_same_type
main: |
from typing_extensions import reveal_type
from myapp.models import UnrelatedModel, MyModel
reveal_type(UnrelatedModel.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.UnrelatedModel]"
reveal_type(UnrelatedModel.objects.first()) # N: Revealed type is "myapp.models.UnrelatedModel | None"
reveal_type(MyModel.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.MyModel]"
reveal_type(MyModel.objects.first()) # N: Revealed type is "myapp.models.MyModel | None"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class UnrelatedModel(models.Model):
objects = models.Manager['UnrelatedModel']()
class MyModel(models.Model):
pass
- case: manager_without_annotation_of_the_model_gets_it_from_outer_one
main: |
from typing_extensions import reveal_type
from myapp.models import UnrelatedModel2, MyModel2
reveal_type(UnrelatedModel2.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.UnrelatedModel2]"
reveal_type(UnrelatedModel2.objects.first()) # N: Revealed type is "myapp.models.UnrelatedModel2 | None"
reveal_type(MyModel2.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.MyModel2]"
reveal_type(MyModel2.objects.first()) # N: Revealed type is "myapp.models.MyModel2 | None"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class UnrelatedModel2(models.Model):
objects = models.Manager()
class MyModel2(models.Model):
pass
- case: inherited_manager_has_the_proper_type_of_model
main: |
from typing_extensions import reveal_type
from myapp.models import ParentOfMyModel3, MyModel3
reveal_type(ParentOfMyModel3.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.ParentOfMyModel3]"
reveal_type(ParentOfMyModel3.objects.first()) # N: Revealed type is "myapp.models.ParentOfMyModel3 | None"
reveal_type(MyModel3.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.MyModel3]"
reveal_type(MyModel3.objects.first()) # N: Revealed type is "myapp.models.MyModel3 | None"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class ParentOfMyModel3(models.Model):
objects = models.Manager()
class MyModel3(ParentOfMyModel3):
pass
- case: inheritance_with_explicit_type_on_child_manager
main: |
from typing_extensions import reveal_type
from myapp.models import ParentOfMyModel4, MyModel4
reveal_type(ParentOfMyModel4.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.ParentOfMyModel4]"
reveal_type(ParentOfMyModel4.objects.first()) # N: Revealed type is "myapp.models.ParentOfMyModel4 | None"
reveal_type(MyModel4.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.MyModel4]"
reveal_type(MyModel4.objects.first()) # N: Revealed type is "myapp.models.MyModel4 | None"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing import ClassVar
from django.db import models
class ParentOfMyModel4(models.Model):
objects = models.Manager()
class MyModel4(ParentOfMyModel4):
objects: ClassVar[models.Manager["MyModel4"]] = models.Manager["MyModel4"]()
# TODO: make it work someday
#- case: inheritance_of_two_models_with_custom_objects_manager
# main: |
# from typing_extensions import reveal_type
# from myapp.models import MyBaseUser, MyUser
# reveal_type(MyBaseUser.objects) # N: Revealed type is "myapp.models.MyBaseManager[myapp.models.MyBaseUser]"
# reveal_type(MyBaseUser.objects.get()) # N: Revealed type is "myapp.models.MyBaseUser"
#
# reveal_type(MyUser.objects) # N: Revealed type is "myapp.models.MyManager[myapp.models.MyUser]"
# reveal_type(MyUser.objects.get()) # N: Revealed type is "myapp.models.MyUser"
# installed_apps:
# - myapp
# files:
# - path: myapp/__init__.py
# - path: myapp/models.py
# content: |
# from django.db import models
#
# class MyBaseManager(models.Manager):
# pass
# class MyBaseUser(models.Model):
# objects = MyBaseManager()
#
# class MyManager(models.Manager):
# pass
# class MyUser(MyBaseUser):
# objects = MyManager()
- case: custom_manager_returns_proper_model_types
main: |
from typing_extensions import reveal_type
from myapp.models import User
reveal_type(User.objects) # N: Revealed type is "myapp.models.MyManager[myapp.models.User]"
reveal_type(User.objects.select_related()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.User, myapp.models.User]"
reveal_type(User.objects.get()) # N: Revealed type is "myapp.models.User"
reveal_type(User.objects.get_instance()) # N: Revealed type is "int"
reveal_type(User.objects.get_instance_untyped('hello')) # N: Revealed type is "Any"
from myapp.models import ChildUser
reveal_type(ChildUser.objects) # N: Revealed type is "myapp.models.MyManager[myapp.models.ChildUser]"
reveal_type(ChildUser.objects.select_related()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.ChildUser, myapp.models.ChildUser]"
reveal_type(ChildUser.objects.get()) # N: Revealed type is "myapp.models.ChildUser"
reveal_type(ChildUser.objects.get_instance()) # N: Revealed type is "int"
reveal_type(ChildUser.objects.get_instance_untyped('hello')) # N: Revealed type is "Any"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing import Any
from django.db import models
class MyManager(models.Manager):
def get_instance(self) -> int:
raise NotImplementedError
def get_instance_untyped(self, name: str): # type: ignore[no-untyped-def]
raise NotImplementedError
class User(models.Model):
objects = MyManager()
class ChildUser(models.Model):
objects = MyManager()
- case: custom_manager_annotate_method_before_type_declaration
main: |
from typing_extensions import reveal_type
from myapp.models import ModelA, ModelB, ManagerA
reveal_type(ModelA.objects) # N: Revealed type is "myapp.models.ManagerA[myapp.models.ModelA]"
reveal_type(ModelA.objects.do_something) # N: Revealed type is "def (other_obj: myapp.models.ModelB) -> str"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class ManagerA(models.Manager):
def do_something(self, other_obj: "ModelB") -> str:
return 'test'
class ModelA(models.Model):
title = models.TextField()
objects = ManagerA()
class ModelB(models.Model):
movie = models.TextField()
- case: regression_manager_scope_foreign
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel.on_site) # N: Revealed type is "django.contrib.sites.managers.CurrentSiteManager[myapp.models.MyModel]"
installed_apps:
- myapp
- django.contrib.sites
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from django.contrib.sites.models import Site
from django.contrib.sites.managers import CurrentSiteManager
class MyModel(models.Model):
site = models.ForeignKey(Site, on_delete=models.CASCADE)
on_site = CurrentSiteManager()
- case: test_emits_error_for_unresolved_managers
main: |
from myapp import models
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing_extensions import reveal_type
from django.db import models
def LocalManager() -> models.Manager:
"""
Returns a manager instance of an inlined manager type that can't
be resolved.
"""
class InnerManager(models.Manager):
...
return InnerManager()
class User(models.Model):
name = models.TextField()
class Booking(models.Model):
renter = models.ForeignKey(User, on_delete=models.PROTECT)
owner = models.ForeignKey(User, on_delete=models.PROTECT, related_name='bookingowner_set')
objects = LocalManager()
class TwoUnresolvable(models.Model):
objects = LocalManager()
second_objects = LocalManager()
class AbstractUnresolvable(models.Model):
objects = LocalManager()
class Meta:
abstract = True
class InvisibleUnresolvable(AbstractUnresolvable):
text = models.TextField()
def process_booking(user: User) -> None:
reveal_type(User.objects)
reveal_type(User._default_manager)
reveal_type(Booking.objects)
reveal_type(Booking._default_manager)
reveal_type(TwoUnresolvable.objects)
reveal_type(TwoUnresolvable.second_objects)
reveal_type(TwoUnresolvable._default_manager)
reveal_type(InvisibleUnresolvable.objects)
reveal_type(InvisibleUnresolvable._default_manager)
reveal_type(user.bookingowner_set)
reveal_type(user.booking_set)
# Check QuerySet methods on UnknownManager
reveal_type(Booking.objects.all)
reveal_type(Booking.objects.custom)
reveal_type(Booking.objects.all().filter)
reveal_type(Booking.objects.all().custom)
reveal_type(Booking.objects.first())
reveal_type(Booking.objects.get())
reveal_type([booking for booking in Booking.objects.all()])
reveal_type([booking for booking in Booking.objects.all().filter()])
# Check QuerySet methods for unresolvable manager
reveal_type(user.booking_set.all)
reveal_type(user.booking_set.custom)
reveal_type(user.booking_set.all().filter)
reveal_type(user.booking_set.all().custom)
reveal_type(user.booking_set.all().first())
out: |
myapp/models:14: error: Couldn't resolve related manager 'booking_set' for relation 'myapp.models.Booking.renter'. [django-manager-missing]
myapp/models:14: error: Couldn't resolve related manager 'bookingowner_set' for relation 'myapp.models.Booking.owner'. [django-manager-missing]
myapp/models:21: error: Could not resolve manager type for "myapp.models.Booking.objects" [django-manager-missing]
myapp/models:24: error: Could not resolve manager type for "myapp.models.TwoUnresolvable.objects" [django-manager-missing]
myapp/models:25: error: Could not resolve manager type for "myapp.models.TwoUnresolvable.second_objects" [django-manager-missing]
myapp/models:28: error: Could not resolve manager type for "myapp.models.AbstractUnresolvable.objects" [django-manager-missing]
myapp/models:37: note: Revealed type is "django.db.models.manager.Manager[myapp.models.User]"
myapp/models:38: note: Revealed type is "django.db.models.manager.Manager[myapp.models.User]"
myapp/models:40: note: Revealed type is "myapp.models.UnknownManager[myapp.models.Booking]"
myapp/models:41: note: Revealed type is "django.db.models.manager.Manager[myapp.models.Booking]"
myapp/models:43: note: Revealed type is "myapp.models.UnknownManager[myapp.models.TwoUnresolvable]"
myapp/models:44: note: Revealed type is "myapp.models.UnknownManager[myapp.models.TwoUnresolvable]"
myapp/models:45: note: Revealed type is "django.db.models.manager.Manager[myapp.models.TwoUnresolvable]"
myapp/models:47: note: Revealed type is "myapp.models.UnknownManager[myapp.models.InvisibleUnresolvable]"
myapp/models:48: note: Revealed type is "django.db.models.manager.Manager[myapp.models.InvisibleUnresolvable]"
myapp/models:50: note: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.Booking]"
myapp/models:51: note: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.Booking]"
myapp/models:54: note: Revealed type is "def () -> myapp.models.UnknownQuerySet[myapp.models.Booking, myapp.models.Booking]"
myapp/models:55: note: Revealed type is "Any"
myapp/models:56: note: Revealed type is "def (*args: Any, **kwargs: Any) -> myapp.models.UnknownQuerySet[myapp.models.Booking, myapp.models.Booking]"
myapp/models:57: note: Revealed type is "Any"
myapp/models:58: note: Revealed type is "myapp.models.Booking | None"
myapp/models:59: note: Revealed type is "myapp.models.Booking"
myapp/models:60: note: Revealed type is "list[myapp.models.Booking]"
myapp/models:61: note: Revealed type is "list[myapp.models.Booking]"
myapp/models:65: note: Revealed type is "def () -> django.db.models.query.QuerySet[myapp.models.Booking, myapp.models.Booking]"
myapp/models:66: error: "RelatedManager[Booking]" has no attribute "custom" [attr-defined]
myapp/models:66: note: Revealed type is "Any"
myapp/models:67: note: Revealed type is "def (*args: Any, **kwargs: Any) -> django.db.models.query.QuerySet[myapp.models.Booking, myapp.models.Booking]"
myapp/models:68: error: "QuerySet[Booking, Booking]" has no attribute "custom" [attr-defined]
myapp/models:68: note: Revealed type is "Any"
myapp/models:69: note: Revealed type is "myapp.models.Booking | None"
- case: subclass_manager_without_type_parameters
main: |
from typing_extensions import reveal_type
from myapp.models import MySubModel
reveal_type(MySubModel.objects) # N: Revealed type is "myapp.models.MySubManager[myapp.models.MySubModel]"
reveal_type(MySubModel.objects.get()) # N: Revealed type is "myapp.models.MySubModel"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing import ClassVar
from typing_extensions import Self, TypeVar
from django.db import models
T = TypeVar("T", bound="MyModel")
class MyManager(models.Manager[T]):
pass
class MySubManager(MyManager):
pass
class MyModel(models.Model):
pass
class MySubModel(MyModel):
objects: ClassVar[MySubManager[Self]] = MySubManager()
- case: subclass_manager_without_type_parameters_disallow_any_generics
main: |
from typing_extensions import reveal_type
from myapp.models import MySubModel
reveal_type(MySubModel.objects)
reveal_type(MySubModel.objects.get())
installed_apps:
- myapp
mypy_config: |
[mypy-myapp.models]
disallow_any_generics = true
out: |
main:3: note: Revealed type is "myapp.models.MySubManager"
main:4: note: Revealed type is "Any"
myapp/models:10: error: Missing type arguments for generic type "MyManager" [type-arg]
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing import ClassVar
from typing_extensions import TypeVar
from django.db import models
T = TypeVar("T", bound="MyModel")
class MyManager(models.Manager[T]):
pass
class MySubManager(MyManager):
pass
class MyModel(models.Model):
pass
class MySubModel(MyModel):
objects: ClassVar[MySubManager] = MySubManager()
- case: nested_manager_class_definition
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel.objects)
reveal_type(MyModel.objects.get())
installed_apps:
- myapp
out: |
main:3: note: Revealed type is "myapp.models.MyModel.MyManager[myapp.models.MyModel]"
main:4: note: Revealed type is "myapp.models.MyModel"
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing import Any
from django.db import models
class MyModel(models.Model):
class MyManager(models.Manager):
def get_instance(self) -> int:
raise NotImplementedError
objects = MyManager()
- case: test_typechecks_filter_methods_of_queryset_type
main: |
from myapp.models import MyModel
MyModel.objects.filter(id=1).filter(invalid=1) # E: Cannot resolve keyword 'invalid' into field. Choices are: id [misc]
MyModel.objects.filter(id=1).get(invalid=1) # E: Cannot resolve keyword 'invalid' into field. Choices are: id [misc]
MyModel.objects.filter(id=1).exclude(invalid=1) # E: Cannot resolve keyword 'invalid' into field. Choices are: id [misc]
MyModel.objects.filter(id=1).create(invalid=1) # E: Unexpected attribute "invalid" for model "MyModel" [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyModel(models.Model): ...
- case: test_does_not_populate_an_unexpected_type_argument
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel.populated_manager) # N: Revealed type is "myapp.models.PopulatedManager"
reveal_type(MyModel.populated_manager.get()) # N: Revealed type is "myapp.models.MyModel"
reveal_type(MyModel.populated_manager.filter()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel, myapp.models.MyModel]"
reveal_type(MyModel.populated_manager_from_generic_queryset) # N: Revealed type is "myapp.models.PopulatedManagerFromQuerySet"
reveal_type(MyModel.populated_manager_from_generic_queryset.get()) # N: Revealed type is "myapp.models.MyModel"
reveal_type(MyModel.populated_manager_from_generic_queryset.filter()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel, myapp.models.MyModel]"
reveal_type(MyModel.populated_manager_from_populated_queryset) # N: Revealed type is "myapp.models.PopulatedManagerFromPopulatedQuerySet"
reveal_type(MyModel.populated_manager_from_populated_queryset.get()) # N: Revealed type is "myapp.models.MyModel"
reveal_type(MyModel.populated_manager_from_populated_queryset.filter()) # N: Revealed type is "myapp.models.PopulatedQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
reveal_type(MyModel.generic_manager) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.MyModel]"
reveal_type(MyModel.generic_manager.get()) # N: Revealed type is "myapp.models.MyModel"
reveal_type(MyModel.generic_manager.filter()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel, myapp.models.MyModel]"
reveal_type(MyModel.generic_manager_from_generic_queryset) # N: Revealed type is "myapp.models.ManagerFromQuerySet[myapp.models.MyModel]"
reveal_type(MyModel.generic_manager_from_generic_queryset.get()) # N: Revealed type is "myapp.models.MyModel"
reveal_type(MyModel.generic_manager_from_generic_queryset.filter()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel, myapp.models.MyModel]"
reveal_type(MyModel.generic_manager_from_populated_queryset) # N: Revealed type is "myapp.models.ManagerFromPopulatedQuerySet[myapp.models.MyModel]"
reveal_type(MyModel.generic_manager_from_populated_queryset.get()) # N: Revealed type is "myapp.models.MyModel"
reveal_type(MyModel.generic_manager_from_populated_queryset.filter()) # N: Revealed type is "myapp.models.PopulatedQuerySet[myapp.models.MyModel, myapp.models.MyModel]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class PopulatedManager(models.Manager["MyModel"]): ...
class PopulatedQuerySet(models.QuerySet["MyModel"]): ...
PopulatedManagerFromGenericQuerySet = PopulatedManager.from_queryset(models.QuerySet)
PopulatedManagerFromPopulatedQuerySet = PopulatedManager.from_queryset(PopulatedQuerySet)
GenericManagerFromGenericQuerySet = models.Manager.from_queryset(models.QuerySet)
GenericManagerFromPopulatedQuerySet = models.Manager.from_queryset(PopulatedQuerySet)
class MyModel(models.Model):
populated_manager = PopulatedManager()
populated_manager_from_generic_queryset = PopulatedManagerFromGenericQuerySet()
populated_manager_from_populated_queryset = PopulatedManagerFromPopulatedQuerySet()
generic_manager = models.Manager()
generic_manager_from_generic_queryset = GenericManagerFromGenericQuerySet()
generic_manager_from_populated_queryset = GenericManagerFromPopulatedQuerySet()
# Regression test for #2304
- case: test_objects_managers_is_kept_with_specific_import_graph
main: |
from typing_extensions import reveal_type
from zerver.models import RealmFilter
reveal_type(RealmFilter.objects) # N: Revealed type is "django.db.models.manager.Manager[zerver.models.linkifiers.RealmFilter]"
installed_apps:
- django.contrib.auth
- django.contrib.contenttypes
- confirmation
- zerver
files:
- path: confirmation/__init__.py
- path: confirmation/models.py
content: |
from django.db import models
from zerver.models import Realm
class Confirmation(models.Model):
realm = models.ForeignKey(Realm, on_delete=models.CASCADE)
- path: zerver/__init__.py
- path: zerver/models/__init__.py
content: |
from zerver.models.linkifiers import RealmFilter as RealmFilter
from zerver.models.realms import Realm as Realm
from zerver.models.streams import Stream as Stream
from zerver.models.users import UserProfile as UserProfile
RealmFilter.objects
- path: zerver/models/linkifiers.py
content: |
from django.db import models
class RealmFilter(models.Model):
pass
- path: zerver/models/realms.py
content: |
from django.db import models
class Realm(models.Model):
pass
- path: zerver/models/streams.py
content: |
from django.db import models
from zerver.models.realms import Realm
from zerver.models.users import UserProfile
class Stream(models.Model):
realm = models.ForeignKey(Realm, on_delete=models.RESTRICT)
creator = models.ForeignKey(UserProfile, on_delete=models.RESTRICT)
- path: zerver/models/users.py
content: |
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
class UserProfile(AbstractBaseUser, PermissionsMixin):
pass
typeddjango-django-stubs-fa03b48/tests/typecheck/models/ 0000775 0000000 0000000 00000000000 15260643574 0023451 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/typecheck/models/test_abstract.yml 0000664 0000000 0000000 00000017562 15260643574 0027051 0 ustar 00root root 0000000 0000000 - case: test_filter_on_abstract_user_pk
main: |
from typing_extensions import reveal_type
from django.contrib.auth.models import AbstractUser
AbstractUser.objects.get(pk=1)
AbstractUser.objects.get(pk__in=[1])
au: AbstractUser
reveal_type(au.pk) # N: Revealed type is "Any"
installed_apps:
- django.contrib.auth
- django.contrib.contenttypes
- case: test_filter_on_abstract_user_pk_wrong_name
main: |
from django.contrib.auth.models import AbstractUser
AbstractUser.objects.get(pkey=1) # ER: Cannot resolve keyword 'pkey' into field..*
installed_apps:
- django.contrib.auth
- django.contrib.contenttypes
- case: test_fetch_pk_with_custom_manager_on_abstract_model
main: |
from myapp.models import MyModel
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing_extensions import reveal_type
from django.db import models
class BaseManager(models.Manager):
pass
class BaseModel(models.Model):
objects = BaseManager()
class Meta:
abstract = True
def lock(self) -> None:
reveal_type(type(self).objects.values_list("pk")) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.BaseModel, tuple[Any]]"
class MyModel(BaseModel):
field = models.IntegerField()
- case: test_can_instantiate_with_recursive_relation_on_abstract_model
main: |
from myapp.models import Concrete, Recursive
first = Concrete.objects.create(parent=None)
Concrete.objects.create(parent=first)
Recursive.objects.create(parent=None)
Recursive(parent=Recursive(parent=None))
Concrete(parent=Concrete(parent=None))
out: |
main:4: error: "type[Recursive]" has no attribute "objects" [attr-defined]
main:5: error: Cannot instantiate abstract class "Recursive" with abstract attributes "DoesNotExist", "MultipleObjectsReturned" and "NotUpdated" [abstract]
main:5: error: Unexpected attribute "parent" for model "Recursive" [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Recursive(models.Model):
parent = models.ForeignKey("self", null=True, on_delete=models.CASCADE)
class Meta:
abstract = True
class Concrete(Recursive):
...
- case: test_abstract_model_type_cannot_be_used_as_runtime_arg
main: |
from myapp.models import Abstract, Concrete, LiteralAbstract
from typing import Generic, overload
from typing_extensions import TypeVar
Abstract() # E: Cannot instantiate abstract class "Abstract" with abstract attributes "DoesNotExist", "MultipleObjectsReturned" and "NotUpdated" [abstract]
LiteralAbstract() # E: Cannot instantiate abstract class "LiteralAbstract" with abstract attributes "DoesNotExist", "MultipleObjectsReturned" and "NotUpdated" [abstract]
def f(klass: type[Abstract]) -> None:
return None
f(Abstract) # E: Only concrete class can be given where "type[Abstract]" is expected [type-abstract]
f(Concrete)
def second_arg(arg: str, klass: type[Abstract]) -> None:
return None
second_arg("abc", Abstract) # E: Only concrete class can be given where "type[Abstract]" is expected [type-abstract]
second_arg(Abstract, Concrete) # E: Argument 1 to "second_arg" has incompatible type "type[Abstract]"; expected "str" [arg-type]
T = TypeVar("T", bound=Abstract)
def g(klass: type[T]) -> None:
return None
g(Abstract) # E: Only concrete class can be given where "type[Abstract]" is expected [type-abstract]
g(Concrete)
@overload
def o(klass: type[T], arg: str) -> None: ...
@overload
def o(klass: type[T], arg: int) -> None: ...
def o(klass: type[T], arg: str | int) -> None:
return None
o(Abstract, "a") # E: Only concrete class can be given where "type[Abstract]" is expected [type-abstract]
o(Abstract, 1) # E: Only concrete class can be given where "type[Abstract]" is expected [type-abstract]
o(Concrete, 1)
class M:
def method(self, klass: type[Abstract]) -> None:
return None
@overload
def overloaded(self, arg: int, klass: type[Abstract]) -> None:
...
@overload
def overloaded(self, arg: str, klass: type[Abstract]) -> None:
...
def overloaded(self, arg: str | int, klass: type[Abstract]) -> None:
return None
M().method(Abstract) # E: Only concrete class can be given where "type[Abstract]" is expected [type-abstract]
M().overloaded(1, Abstract) # E: Only concrete class can be given where "type[Abstract]" is expected [type-abstract]
M().overloaded("1", Abstract) # E: Only concrete class can be given where "type[Abstract]" is expected [type-abstract]
class G(Generic[T]):
def method(self, klass: type[T]) -> None:
return None
G[Abstract]().method(Abstract) # E: Only concrete class can be given where "type[Abstract]" is expected [type-abstract]
# Additional plugin coverage
unknown(Abstract) # E: Name "unknown" is not defined [name-defined]
M().unknown(Abstract) # E: "M" has no attribute "unknown" [attr-defined]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from typing import Literal, ClassVar
class Abstract(models.Model):
field = models.CharField()
class Meta:
abstract = True
class Concrete(Abstract):
...
class LiteralAbstract(models.Model):
class Meta:
abstract: ClassVar[Literal[True]]
- case: test_use_abstract_model
main: |
from myapp.models import create_animal, create_animal_generic, Cat, Animal, ExplicitConcrete
create_animal(Cat, "Garfield")
create_animal(Animal, "Animal") # E: Only concrete class can be given where "type[Animal]" is expected [type-abstract]
create_animal_generic(Cat, "Grumpy")
create_animal_generic(Animal, "Animal") # E: Only concrete class can be given where "type[Animal]" is expected [type-abstract]
Animal() # E: Cannot instantiate abstract class "Animal" with abstract attributes "DoesNotExist", "MultipleObjectsReturned" and "NotUpdated" [abstract]
ExplicitConcrete()
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing import Protocol
from typing_extensions import TypeVar, reveal_type
from django.db import models
from django_stubs_ext.db.models import TypedModelMeta
class Animal(models.Model):
name = models.CharField(max_length=100)
class Meta(TypedModelMeta):
abstract = True
class Cat(Animal): # Concrete model
pass
class ExplicitConcrete(Animal):
class Meta:
abstract = False
def f() -> None:
x: type[Animal]
x()
return None
def create_animal(klass: type[Animal], name: str) -> Animal:
obj = klass(name=name)
obj.save()
return obj
T = TypeVar("T", bound=Animal)
def create_animal_generic(klass: type[T], name: str) -> T:
reveal_type(klass) # N: Revealed type is "type[T]"
return klass._default_manager.create(name=name)
typeddjango-django-stubs-fa03b48/tests/typecheck/models/test_contrib_models.yml 0000664 0000000 0000000 00000021622 15260643574 0030241 0 ustar 00root root 0000000 0000000 - case: contrib_auth_model_fields
main: |
from typing_extensions import reveal_type
from django.contrib.auth.models import User
reveal_type(User().username) # N: Revealed type is "str"
reveal_type(User().password) # N: Revealed type is "str"
reveal_type(User().first_name) # N: Revealed type is "str"
reveal_type(User().last_name) # N: Revealed type is "str"
reveal_type(User().email) # N: Revealed type is "str"
reveal_type(User().is_staff) # N: Revealed type is "bool"
reveal_type(User().is_active) # N: Revealed type is "bool"
reveal_type(User().date_joined) # N: Revealed type is "datetime.datetime"
reveal_type(User().last_login) # N: Revealed type is "datetime.datetime | None"
reveal_type(User().is_authenticated) # N: Revealed type is "Literal[True]"
reveal_type(User().is_anonymous) # N: Revealed type is "Literal[False]"
reveal_type(User().groups.get()) # N: Revealed type is "django.contrib.auth.models.Group"
reveal_type(User().user_permissions.get()) # N: Revealed type is "django.contrib.auth.models.Permission"
reveal_type(User.groups) # N: Revealed type is "django.db.models.fields.related_descriptors.ManyToManyDescriptor[django.contrib.auth.models.Group, django.contrib.auth.models.User_groups]"
reveal_type(User.user_permissions) # N: Revealed type is "django.db.models.fields.related_descriptors.ManyToManyDescriptor[django.contrib.auth.models.Permission, django.db.models.base.Model]"
from django.contrib.auth.models import AnonymousUser
reveal_type(AnonymousUser().is_authenticated) # N: Revealed type is "Literal[False]"
reveal_type(AnonymousUser().is_anonymous) # N: Revealed type is "Literal[True]"
from django.contrib.auth.models import Permission
reveal_type(Permission().name) # N: Revealed type is "str"
reveal_type(Permission().codename) # N: Revealed type is "str"
from django.contrib.auth.models import PermissionsMixin
p: type[PermissionsMixin]
reveal_type(p().is_superuser) # N: Revealed type is "bool"
from django.contrib.auth.models import Group
reveal_type(Group().name) # N: Revealed type is "str"
reveal_type(Group().permissions.get()) # N: Revealed type is "django.contrib.auth.models.Permission"
reveal_type(Group.permissions) # N: Revealed type is "django.db.models.fields.related_descriptors.ManyToManyDescriptor[django.contrib.auth.models.Permission, django.contrib.auth.models.Group_permissions]"
- case: can_override_abstract_user_manager
main: |
from typing_extensions import reveal_type
from myapp.models import MyBaseUser, MyUser
reveal_type(MyBaseUser.objects) # N: Revealed type is "myapp.models.MyBaseUserManager"
reveal_type(MyBaseUser.objects.all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyBaseUser, myapp.models.MyBaseUser]"
reveal_type(MyUser.objects) # N: Revealed type is "myapp.models.MyUserManager"
reveal_type(MyUser.objects.all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyUser, myapp.models.MyUser]"
installed_apps:
- django.contrib.auth
- django.contrib.contenttypes
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
from django.contrib.auth.models import AbstractUser, UserManager
from typing import ClassVar
class MyBaseUserManager(BaseUserManager["MyBaseUser"]):
...
class MyBaseUser(AbstractBaseUser):
objects = MyBaseUserManager()
class MyUserManager(UserManager["MyUser"]):
...
class MyUser(AbstractUser):
objects: ClassVar[MyUserManager] = MyUserManager()
- case: can_combine_permissions_mixin_and_abstract_base_user
main: |
from typing_extensions import reveal_type
from django.contrib.auth.base_user import AbstractBaseUser
from django.contrib.auth.models import PermissionsMixin
from myapp.models import AuthUser
reveal_type(AuthUser._meta)
reveal_type(AuthUser()._meta)
reveal_type(PermissionsMixin._meta)
reveal_type(AbstractBaseUser._meta)
out: |
main:5: note: Revealed type is "django.db.models.options.Options[myapp.models.AuthUser]"
main:6: note: Revealed type is "django.db.models.options.Options[myapp.models.AuthUser]"
main:7: note: Revealed type is "django.db.models.options.Options[django.contrib.auth.models.PermissionsMixin]"
main:8: note: Revealed type is "django.db.models.options.Options[django.contrib.auth.base_user.AbstractBaseUser]"
installed_apps:
- django.contrib.auth
- django.contrib.contenttypes
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.contrib.auth.base_user import AbstractBaseUser
from django.contrib.auth.models import PermissionsMixin
class AuthUser(AbstractBaseUser, PermissionsMixin):
class Meta:
abstract = False
db_table = "auth_user"
- case: test_relation_specified_by_auth_user_model
main: |
from typing_extensions import reveal_type
from other.models import Other
reveal_type(Other().users.get())
reveal_type(Other.users.through)
reveal_type(Other.users.through().myuser)
reveal_type(Other.users.through.objects.get().myuser)
reveal_type(Other().user)
reveal_type(Other().unq_user)
out: |
main:3: note: Revealed type is "myapp.models.MyUser"
main:4: note: Revealed type is "type[other.models.Other_users]"
main:5: note: Revealed type is "myapp.models.MyUser"
main:6: note: Revealed type is "myapp.models.MyUser"
main:8: note: Revealed type is "myapp.models.MyUser"
main:10: note: Revealed type is "myapp.models.MyUser"
custom_settings: |
INSTALLED_APPS = ('django.contrib.contenttypes', 'django.contrib.auth', 'myapp', 'other')
AUTH_USER_MODEL='myapp.MyUser'
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyUser(models.Model):
...
- path: other/__init__.py
- path: other/models.py
content: |
from django.conf import settings
from django.db import models
class Other(models.Model):
users = models.ManyToManyField(settings.AUTH_USER_MODEL)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
unq_user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
- case: test_relate_to_auth_user_model_when_auth_not_installed
main: |
from typing_extensions import reveal_type
from other.models import Other
reveal_type(Other().user)
out: |
main:3: note: Revealed type is "myapp.models.MyUser"
custom_settings: |
INSTALLED_APPS = ('django.contrib.contenttypes', 'myapp', 'other')
AUTH_USER_MODEL='myapp.MyUser'
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyUser(models.Model):
...
- path: other/__init__.py
- path: other/models.py
content: |
from django.conf import settings
from django.db import models
class Other(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
- case: test_permissions_inherited_reverse_relations
main: |
from typing_extensions import reveal_type
from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType
reveal_type(Permission().user_set) # N: Revealed type is "django.contrib.auth.models.User_ManyRelatedManager[django.contrib.auth.models.User_user_permissions]"
reveal_type(Group().user_set) # N: Revealed type is "django.contrib.auth.models.User_ManyRelatedManager[django.contrib.auth.models.User_groups]"
reveal_type(ContentType.permission_set) # N: Revealed type is "django.db.models.fields.related_descriptors.ReverseManyToOneDescriptor[django.contrib.auth.models.Permission]"
reveal_type(ContentType().permission_set) # N: Revealed type is "django.contrib.auth.models.Permission_RelatedManager"
custom_settings: |
INSTALLED_APPS = ('django.contrib.contenttypes', 'django.contrib.auth')
AUTH_USER_MODEL='auth.User'
typeddjango-django-stubs-fa03b48/tests/typecheck/models/test_create.yml 0000664 0000000 0000000 00000017464 15260643574 0026512 0 ustar 00root root 0000000 0000000 - case: default_manager_create_is_typechecked
main: |
from myapp.models import User
User.objects.create(pk=1, name='Max', age=10)
User.objects.create(age=[]) # E: Incompatible type for "age" of "User" (got "list[Any]", expected "float | int | str | Combinable") [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
- case: model_recognises_parent_attributes
main: |
from typing_extensions import reveal_type
from myapp.models import Child
c = Child.objects.create(name='Maxim', lastname='Maxim2')
reveal_type(c.id) # N: Revealed type is "int"
reveal_type(c.name) # N: Revealed type is "str"
reveal_type(c.lastname) # N: Revealed type is "str"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Parent(models.Model):
name = models.CharField(max_length=100)
class Child(Parent):
lastname = models.CharField(max_length=100)
- case: deep_multiple_inheritance_with_create
main: |
from myapp.models import Child4
Child4.objects.create(name1='n1', name2='n2', value=1, value4=4)
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Parent1(models.Model):
name1 = models.CharField(max_length=50)
class Parent2(models.Model):
id2 = models.AutoField(primary_key=True)
name2 = models.CharField(max_length=50)
class Child1(Parent1, Parent2):
value = models.IntegerField()
class Child4(Child1):
value4 = models.IntegerField()
- case: mro_is_walked_for_field_annotations
main: |
from myapp.models import Child
Child.objects.create(dct={"hello": "world"}) # no errors
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from __future__ import annotations
from django.db import models
class JSONField(models.TextField): pass # incomplete
class Base(models.Model):
dct: models.Field[dict[str, str], dict[str, str]] = JSONField()
class Child(Base): pass
- case: optional_id_fields_for_create_is_error_if_not_autofield
skip: __import__("django").VERSION < (6, 0)
main: |
from myapp.models import Publisher, Book
Book.objects.create(id=None) # E: Incompatible type for "id" of "Book" (got "None", expected "float | int | str | Combinable") [misc]
Book.objects.create(publisher=None) # E: Incompatible type for "publisher" of "Book" (got "None", expected "Publisher | Combinable") [misc]
Book.objects.create(publisher_id=None) # E: Incompatible type for "publisher_id" of "Book" (got "None", expected "float | int | str | Combinable") [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Publisher(models.Model):
pass
class Book(models.Model):
id = models.IntegerField(primary_key=True)
publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
- case: none_for_primary_key_is_allowed_if_field_is_autogenerated
main: |
from myapp.models import Book
Book.objects.create(id=None)
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Book(models.Model):
pass
- case: when_default_for_primary_key_is_specified_allow_none_to_be_set
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
first = MyModel(id=None)
reveal_type(first.id) # N: Revealed type is "int"
first = MyModel.objects.create(id=None)
reveal_type(first.id) # N: Revealed type is "int"
first = MyModel()
first.id = None
reveal_type(first.id) # N: Revealed type is "int"
from myapp.models import MyModel2
MyModel2(id=None) # E: Incompatible type for "id" of "MyModel2" (got "None", expected "float | int | str | Combinable") [misc]
MyModel2.objects.create(id=None) # E: Incompatible type for "id" of "MyModel2" (got "None", expected "float | int | str | Combinable") [misc]
second = MyModel2()
second.id = None # E: Incompatible types in assignment (expression has type "None", variable has type "float | int | str | Combinable") [assignment]
reveal_type(second.id) # N: Revealed type is "int"
# default set but no primary key doesn't allow None
from myapp.models import MyModel3
MyModel3(default=None) # E: Incompatible type for "default" of "MyModel3" (got "None", expected "float | int | str | Combinable") [misc]
MyModel3.objects.create(default=None) # E: Incompatible type for "default" of "MyModel3" (got "None", expected "float | int | str | Combinable") [misc]
third = MyModel3()
third.default = None # E: Incompatible types in assignment (expression has type "None", variable has type "float | int | str | Combinable") [assignment]
reveal_type(third.default) # N: Revealed type is "int"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
def return_int() -> int:
return 0
class MyModel(models.Model):
id = models.IntegerField(primary_key=True, default=return_int)
class MyModel2(models.Model):
id = models.IntegerField(primary_key=True)
class MyModel3(models.Model):
default = models.IntegerField(default=return_int)
- case: default_manager_acreate_is_typechecked
main: |
import asyncio
from typing_extensions import reveal_type
from myapp.models import User
async def amain() -> None:
reveal_type(await User.objects.acreate(pk=1, name='Max', age=10)) # N: Revealed type is "myapp.models.User"
await User.objects.acreate(age=[]) # E: Incompatible type for "age" of "User" (got "list[Any]", expected "float | int | str | Combinable") [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class User(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
- case: too_many_keyword_arguments_on_create
main: |
from myapp.models import MyUser
MyUser.objects.create(id=1, foo="bbb") # E: Unexpected attribute "foo" for model "MyUser" [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyUser(models.Model):
pass
typeddjango-django-stubs-fa03b48/tests/typecheck/models/test_extra_methods.yml 0000664 0000000 0000000 00000005277 15260643574 0030114 0 ustar 00root root 0000000 0000000 - case: if_field_has_choices_set_model_has_get_FIELDNAME_display_method
main: |
from typing_extensions import reveal_type
from myapp.models import MyUser
user = MyUser(name='user', gender='M')
user.get_name_display() # E: "MyUser" has no attribute "get_name_display"; maybe "get_gender_display"? [attr-defined]
reveal_type(user.get_gender_display()) # N: Revealed type is "str"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
GENDER_CHOICES = (
('M', 'Male'),
('F', 'Female'),
)
class MyUser(models.Model):
name = models.CharField(max_length=100)
gender = models.CharField(max_length=100, choices=GENDER_CHOICES)
- case: date_datetime_fields_have_get_next_by_get_previous_by
disable_cache: true
parametrized:
- allow_any: "true"
- allow_any: "false"
mypy_config: |
[mypy-myapp.models]
disallow_any_generics = {{ allow_any }}
disallow_any_explicit = {{ allow_any }}
main: |
from typing_extensions import reveal_type
from myapp.models import MyUser
reveal_type(MyUser().get_next_by_date()) # N: Revealed type is "myapp.models.MyUser"
reveal_type(MyUser().get_next_by_datetime()) # N: Revealed type is "myapp.models.MyUser"
reveal_type(MyUser().get_previous_by_date()) # N: Revealed type is "myapp.models.MyUser"
reveal_type(MyUser().get_previous_by_datetime()) # N: Revealed type is "myapp.models.MyUser"
# accept arbitrary kwargs
MyUser().get_next_by_date(arg1=1, arg2=2)
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyUser(models.Model):
date = models.DateField()
datetime = models.DateTimeField()
- case: get_next_by_get_previous_by_absent_if_null_true
main: |
from myapp.models import MyUser
MyUser().get_next_by_date() # E: "MyUser" has no attribute "get_next_by_date" [attr-defined]
MyUser().get_previous_by_date() # E: "MyUser" has no attribute "get_previous_by_date" [attr-defined]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyUser(models.Model):
date = models.DateField(null=True)
typeddjango-django-stubs-fa03b48/tests/typecheck/models/test_inheritance.yml 0000664 0000000 0000000 00000012365 15260643574 0027533 0 ustar 00root root 0000000 0000000 - case: test_meta_nested_class_allows_subclassing_in_multiple_inheritance
main: |
from typing import Any
from django.db import models
class Mixin1(models.Model):
class Meta:
abstract = True
class Mixin2(models.Model):
class Meta:
abstract = True
class User(Mixin1, Mixin2):
pass
- case: test_inheritance_from_abstract_model_does_not_fail_if_field_with_id_exists
main: |
from django.db import models
class Abstract(models.Model):
class Meta:
abstract = True
class User(Abstract):
id = models.AutoField(primary_key=True)
- case: test_typechecking_for_model_subclasses
main: |
from myapp.models import A, B, C
def service(a: A) -> int:
raise NotImplementedError
b_instance = B()
service(b_instance) # E: Argument 1 to "service" has incompatible type "B"; expected "A" [arg-type]
a_instance = A()
c_instance = C()
service(a_instance)
service(c_instance)
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class A(models.Model):
pass
class B(models.Model):
b_attr = 1
class C(A):
pass
- case: fail_if_no_such_attribute_on_model
main: |
from typing_extensions import reveal_type
from myapp.models import B
b_instance = B()
reveal_type(b_instance.b_attr) # N: Revealed type is "int"
b_instance.non_existent_attribute # E: "B" has no attribute "non_existent_attribute" [attr-defined]
b_instance.non_existent_attribute = 2 # E: "B" has no attribute "non_existent_attribute" [attr-defined]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class B(models.Model):
b_attr = 1
- case: fields_recognized_if_base_model_is_subclass_of_models_model
main: |
from typing_extensions import reveal_type
from myapp.models import User
reveal_type(User().username) # N: Revealed type is "str"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from myapp.utils import MyBaseModel
class User(MyBaseModel):
username = models.CharField(max_length=100)
- path: myapp/utils.py
content: |
from django.db.models import Model
class MyBaseModel(Model):
pass
- case: django_contrib_gis_base_model_mixin_inheritance
main: |
from typing_extensions import reveal_type
from myapp.models import User
reveal_type(User().name) # N: Revealed type is "str"
reveal_type(User().updated_at) # N: Revealed type is "datetime.datetime"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from django.contrib.gis.db import models as gis_models
class Mixin1(gis_models.Model):
class Meta:
abstract = True
class Mixin2(gis_models.Model):
updated_at = models.DateTimeField(auto_now=True)
class Meta:
abstract = True
class User(Mixin1, Mixin2):
name = models.TextField()
- case: test_manager_typevar_through_bounds
main: |
from typing_extensions import reveal_type
from myapp.models import ResultProcessorConcrete
reveal_type(ResultProcessorConcrete().f()) # N: Revealed type is "myapp.models.Concrete"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from __future__ import annotations
from django.db.models import Model
from django.db.models.manager import Manager
from typing import ClassVar, Generic
from typing_extensions import Self, TypeVar
M = TypeVar("M", bound=Model, covariant=True)
class BaseManager(Manager[M]): ...
class Base(Model):
custom_objects: ClassVar[BaseManager[Self]] = BaseManager()
class Bound(Base): pass
T = TypeVar("T", bound=Bound)
class ResultProcessorBase(Generic[T]):
@property
def model_cls(self) -> type[T]:
raise NotImplementedError
def f(self) -> T:
return self.model_cls.custom_objects.get()
class Concrete(Bound): pass
class ResultProcessorConcrete(ResultProcessorBase[Concrete]):
pass
typeddjango-django-stubs-fa03b48/tests/typecheck/models/test_init.yml 0000664 0000000 0000000 00000032553 15260643574 0026206 0 ustar 00root root 0000000 0000000 - case: arguments_to_init_unexpected_attributes
main: |
from myapp.models import MyUser
user = MyUser(name=1, age=12)
out: |
main:2: error: Unexpected attribute "name" for model "MyUser" [misc]
main:2: error: Unexpected attribute "age" for model "MyUser" [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyUser(models.Model):
pass
- case: plain_function_which_returns_model
main: |
from myapp.models import MyUser
def func(i: int) -> MyUser:
raise NotImplementedError
func("hello") # E: Argument 1 to "func" has incompatible type "str"; expected "int" [arg-type]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyUser(models.Model):
pass
- case: arguments_to_init_from_class_incompatible_type
main: |
from myapp.models import MyUser
user = MyUser(name='hello', age=[])
out: |
main:2: error: Incompatible type for "age" of "MyUser" (got "list[Any]", expected "float | int | str | Combinable") [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyUser(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
- case: arguments_to_init_combined_from_base_classes
main: |
from myapp.models import BaseUser, ChildUser
user = ChildUser(name='Max', age=12, lastname='Lastname')
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class BaseUser(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
class ChildUser(BaseUser):
lastname = models.CharField(max_length=100)
- case: fields_from_abstract_user_propagate_to_init
main: |
from myapp.models import MyUser
user = MyUser(name='Maxim', number=1)
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class AbstractUser(models.Model):
class Meta:
abstract = True
name = models.CharField(max_length=100)
class MyUser(AbstractUser):
number = models.IntegerField()
- case: pk_refers_to_primary_key_and_could_be_passed_to_init
main: |
from myapp.models import MyUser1, MyUser2
user2 = MyUser1(pk='hello')
user3 = MyUser2(pk=1, name='maxim')
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyUser1(models.Model):
mypk = models.CharField(primary_key=True)
class MyUser2(models.Model):
name = models.CharField(max_length=100)
- case: typechecking_of_pk
main: |
from myapp.models import MyUser1
user = MyUser1(pk=[]) # E: Incompatible type for "pk" of "MyUser1" (got "list[Any]", expected "float | int | str | Combinable | None") [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyUser1(models.Model):
mypk = models.IntegerField(primary_key=True)
- case: set_foreign_key_by_its_primary_key
skip: __import__("django").VERSION < (6, 0)
main: |
from datetime import datetime
now = datetime.now()
from myapp.models import Publisher, PublisherDatetime, Book
Book(publisher_id=1, publisher_dt_id=now)
Book(publisher_id=[], publisher_dt_id=now) # E: Incompatible type for "publisher_id" of "Book" (got "list[Any]", expected "float | int | str | Combinable") [misc]
Book(publisher_id=1, publisher_dt_id=1) # E: Incompatible type for "publisher_dt_id" of "Book" (got "int", expected "str | datetime | date | Combinable") [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Publisher(models.Model):
pass
class PublisherDatetime(models.Model):
dt_pk = models.DateTimeField(primary_key=True)
class Book(models.Model):
publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
publisher_dt = models.ForeignKey(PublisherDatetime, on_delete=models.CASCADE)
- case: setting_value_to_an_array_of_ints
main: |
from myapp.models import MyModel
array_val: tuple[int, ...] = (1,)
MyModel(array=array_val)
array_val2: list[int] = [1]
MyModel(array=array_val2)
class NotAValid:
pass
array_val3: list[NotAValid] = [NotAValid()]
MyModel(array=array_val3) # E: Incompatible type for "array" of "MyModel" (got "list[NotAValid]", expected "Sequence[float | int | str] | Combinable") [misc]
non_init = MyModel()
non_init.array = array_val
non_init.array = array_val2
non_init.array = array_val3 # E: Incompatible types in assignment (expression has type "list[NotAValid]", variable has type "Sequence[float | int | str] | Combinable") [assignment]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from django.contrib.postgres.fields import ArrayField
class MyModel(models.Model):
array = ArrayField(base_field=models.IntegerField())
- case: if_no_explicit_primary_key_id_can_be_passed
main: |
from myapp.models import MyModel
MyModel(id=1, name='maxim')
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyModel(models.Model):
name = models.CharField(max_length=100)
- case: arguments_can_be_passed_as_positionals
main: |
from myapp.models import MyModel, MyModel2
MyModel(1)
MyModel2(1, 12)
MyModel2(1, []) # E: Incompatible type for "name" of "MyModel2" (got "list[Any]", expected "float | int | str | Combinable") [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyModel(models.Model):
pass
class MyModel2(models.Model):
name = models.IntegerField()
- case: charfield_with_integer_choices
main: |
from myapp.models import MyModel
MyModel(day=1)
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyModel(models.Model):
day = models.CharField(max_length=3, choices=((1, 'Fri'), (2, 'Sat')))
- case: optional_id_fields_allowed_in_init
main: |
from myapp.models import Book, Publisher
Book(id=None)
Book(publisher=None)
Book(publisher_id=None)
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Publisher(models.Model):
name = models.CharField(primary_key=True, max_length=100)
class Book(models.Model):
publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE, null=True)
- case: init_in_abstract_model_classmethod_should_not_throw_error_for_valid_fields
main: |
from myapp.models import MyModel
MyModel.base_init()
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from typing_extensions import Self
class AbstractModel(models.Model):
class Meta:
abstract = True
text = models.CharField(max_length=100)
@classmethod
def base_init(cls) -> Self:
return cls(text='mytext')
class MyModel(AbstractModel):
pass
- case: field_set_type_honors_type_redefinition
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
non_init = MyModel()
reveal_type(non_init.redefined_set_type)
reveal_type(non_init.redefined_union_set_type)
reveal_type(non_init.redefined_array_set_type)
reveal_type(non_init.default_set_type)
reveal_type(non_init.unset_set_type)
non_init.redefined_set_type = "invalid"
non_init.redefined_union_set_type = "invalid"
array_val: list[str] = ["invalid"]
non_init.redefined_array_set_type = array_val
non_init.default_set_type = []
non_init.unset_set_type = []
MyModel(
redefined_set_type="invalid",
redefined_union_set_type="invalid",
redefined_array_set_type=33,
default_set_type=[],
unset_set_type=[],
)
out: |
main:4: note: Revealed type is "int"
main:5: note: Revealed type is "int"
main:6: note: Revealed type is "list[int]"
main:7: note: Revealed type is "int"
main:8: note: Revealed type is "Any"
main:9: error: Incompatible types in assignment (expression has type "str", variable has type "int") [assignment]
main:10: error: Incompatible types in assignment (expression has type "str", variable has type "int | float") [assignment]
main:12: error: Incompatible types in assignment (expression has type "list[str]", variable has type "Sequence[int | float]") [assignment]
main:13: error: Incompatible types in assignment (expression has type "list[Never]", variable has type "float | int | str | Combinable") [assignment]
main:15: error: Incompatible type for "redefined_set_type" of "MyModel" (got "str", expected "int") [misc]
main:15: error: Incompatible type for "redefined_union_set_type" of "MyModel" (got "str", expected "int | float") [misc]
main:15: error: Incompatible type for "redefined_array_set_type" of "MyModel" (got "int", expected "Sequence[int | float]") [misc]
main:15: error: Incompatible type for "default_set_type" of "MyModel" (got "list[Any]", expected "float | int | str | Combinable") [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.contrib.postgres.fields import ArrayField
from django.db import models
from collections.abc import Sequence
from typing import cast
class MyModel(models.Model):
redefined_set_type = cast("models.Field[int, int]", models.IntegerField())
redefined_union_set_type = cast("models.Field[int | float, int]", models.IntegerField())
redefined_array_set_type = cast(
"ArrayField[Sequence[int | float], list[int]]",
ArrayField(base_field=models.IntegerField()),
)
default_set_type = models.IntegerField()
unset_set_type = cast("models.Field", models.IntegerField())
- case: too_many_positional_arguments_on_init
main: |
from myapp.models import MyUser
default_args: list[int]
default_kwargs: dict[str, int]
MyUser(1, "BB") # E: Too many arguments for "MyUser" [call-arg]
MyUser("bbb", id=2) # E: Too many arguments for "MyUser" [call-arg]
MyUser(1, "BB", *default_args) # E: Too many arguments for "MyUser" [call-arg]
MyUser(1, "BB", **default_kwargs) # E: Too many arguments for "MyUser" [call-arg]
# Should be ok because we cannot easily determine arg count
MyUser(*"BB")
MyUser(1, *["BB"])
MyUser(1, *("BB",))
MyUser(1, *default_args)
MyUser(1, **default_kwargs)
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyUser(models.Model):
pass
typeddjango-django-stubs-fa03b48/tests/typecheck/models/test_meta_options.yml 0000664 0000000 0000000 00000026400 15260643574 0027736 0 ustar 00root root 0000000 0000000 - case: meta_attribute_has_a_type_of_current_model
main: |
from typing_extensions import reveal_type
from myapp.models import MyUser
reveal_type(MyUser._meta) # N: Revealed type is "django.db.models.options.Options[myapp.models.MyUser]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyUser(models.Model):
pass
- case: get_field_returns_proper_field_type
main: |
from typing_extensions import reveal_type
from myapp.models import MyUser
reveal_type(MyUser._meta.get_field('base_name')) # N: Revealed type is "django.db.models.fields.CharField[str | int | django.db.models.expressions.Combinable, str]"
reveal_type(MyUser.base_name.field) # N: Revealed type is "django.db.models.fields.CharField[str | int | django.db.models.expressions.Combinable, str]"
reveal_type(MyUser._meta.get_field('name')) # N: Revealed type is "django.db.models.fields.CharField[str | int | django.db.models.expressions.Combinable, str]"
reveal_type(MyUser.name.field) # N: Revealed type is "django.db.models.fields.CharField[str | int | django.db.models.expressions.Combinable, str]"
reveal_type(MyUser._meta.get_field('age')) # N: Revealed type is "django.db.models.fields.IntegerField[float | int | str | django.db.models.expressions.Combinable, int]"
reveal_type(MyUser.age.field) # N: Revealed type is "django.db.models.fields.IntegerField[float | int | str | django.db.models.expressions.Combinable, int]"
reveal_type(MyUser._meta.get_field('to_user')) # N: Revealed type is "django.db.models.fields.related.ForeignKey[myapp.models.MyUser | django.db.models.expressions.Combinable, myapp.models.MyUser]"
reveal_type(MyUser.to_user.field) # N: Revealed type is "django.db.models.fields.related.ForeignKey[myapp.models.MyUser | django.db.models.expressions.Combinable, myapp.models.MyUser]"
MyUser._meta.get_field('unknown') # E: MyUser has no field named 'unknown' [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyBaseUser(models.Model):
base_name = models.CharField(max_length=100)
class MyUser(MyBaseUser):
name = models.CharField(max_length=100)
age = models.IntegerField()
to_user = models.ForeignKey('self', on_delete=models.SET_NULL)
- case: get_field_with_abstract_inheritance
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
MyModel._meta.get_field('non_existant') # E: MyModel has no field named 'non_existant' [misc]
reveal_type(MyModel._meta.get_field('field')) # N: Revealed type is "django.contrib.postgres.fields.array.ArrayField[typing.Sequence[float | int | str] | django.db.models.expressions.Combinable, list[int]]"
field: str
reveal_type(MyModel._meta.get_field(field)) # N: Revealed type is "django.db.models.fields.Field[Any, Any] | django.db.models.fields.reverse_related.ForeignObjectRel"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from django.contrib.postgres.fields import ArrayField
from django_stubs_ext.db.models import TypedModelMeta
class AbstractModel(models.Model):
class Meta(TypedModelMeta):
abstract = True
class MyModel(AbstractModel):
field = ArrayField(models.IntegerField(), default=[])
- case: get_field_reverse_relations
main: |
from typing_extensions import reveal_type
from myapp.models import ModelA
reveal_type(ModelA._meta.get_field("model_b")) # N: Revealed type is "django.db.models.fields.reverse_related.ManyToOneRel"
reveal_type(ModelA.modelb_set.field) # N: Revealed type is "django.db.models.fields.related.ForeignKey[myapp.models.ModelB, myapp.models.ModelB]"
reveal_type(ModelA._meta.get_field("model_b_bis")) # N: Revealed type is "django.db.models.fields.reverse_related.ManyToOneRel"
reveal_type(ModelA.model_b_bis.field) # N: Revealed type is "django.db.models.fields.related.ForeignKey[myapp.models.ModelB, myapp.models.ModelB]"
# The reverse o2o accessor is a two arg descriptor, not a field
reveal_type(ModelA._meta.get_field("modelc")) # N: Revealed type is "django.db.models.fields.reverse_related.OneToOneRel"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class ModelA(models.Model): ...
class ModelB(models.Model):
model_a = models.ForeignKey(ModelA, on_delete=models.CASCADE, related_query_name="model_b")
model_a_bis = models.ForeignKey(ModelA, on_delete=models.CASCADE, related_name="model_b_bis")
class ModelC(models.Model):
model_a = models.OneToOneField(ModelA, on_delete=models.CASCADE)
# Regression test for #2833
- case: get_field_with_model_defined_later_in_module
main: |
from myapp.models import MyModel
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing_extensions import reveal_type
from django.db import models
def get_field_before_model_is_defined() -> None:
# Definition order is the test: this body is checked before `MyModel`'s fields are inferred.
reveal_type(MyModel._meta.get_field('short_id')) # N: Revealed type is "django.db.models.fields.IntegerField[float | int | str | django.db.models.expressions.Combinable, int]"
# A module-level lambda has nothing to defer, so this falls back to the runtime lookup.
unresolvable = lambda: reveal_type(MyModel._meta.get_field('short_id')) # N: Revealed type is "django.db.models.fields.IntegerField"
class MyModel(models.Model):
short_id = models.IntegerField()
- case: base_model_meta_incompatible_types
main: |
from django.db import models
from django.contrib.postgres.fields import ArrayField
from django_stubs_ext.db.models import TypedModelMeta
class MyModel(models.Model):
example = models.CharField(max_length=100)
class Meta(TypedModelMeta):
abstract = 7 # E: Incompatible types in assignment (expression has type "int", base class "TypedModelMeta" defined the type as "bool") [assignment]
verbose_name = ['test'] # E: Incompatible types in assignment (expression has type "list[str]", base class "TypedModelMeta" defined the type as "str | _StrPromise") [assignment]
unique_together = {1: 2} # E: Incompatible types in assignment (expression has type "dict[int, int]", base class "TypedModelMeta" defined the type as "Sequence[Sequence[str]]") [assignment]
unknown_attr = True # can't check this
class MyModelMultipleBaseMeta(models.Model):
class Meta(MyModel.Meta, TypedModelMeta):
abstract = 7 # E: Incompatible types in assignment (expression has type "int", base class "TypedModelMeta" defined the type as "bool") [assignment]
- case: auto_base_model_meta_incompatible_types
main: |
from myapp.models import MyModelWithAutoTypedMeta
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyModelWithAutoTypedMeta(models.Model):
example = models.CharField(max_length=100)
class Meta:
abstract = 0 # E: Incompatible types in assignment (expression has type "int", base class "TypedModelMeta" defined the type as "bool") [assignment]
verbose_name = ['test'] # E: Incompatible types in assignment (expression has type "list[str]", base class "TypedModelMeta" defined the type as "str | _StrPromise") [assignment]
unique_together = {1: 2} # E: Incompatible types in assignment (expression has type "dict[int, int]", base class "TypedModelMeta" defined the type as "Sequence[Sequence[str]]") [assignment]
class DefinitelyNotAModel:
class Meta:
abstract = 7
verbose_name = ['test']
unique_together = {1: 2}
unknown_attr = True
- case: auto_base_model_meta_incompatible_types_multiple_inheritance
main: |
from myapp.models import MyModel, MyModel2, MyModel3
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyModel(models.Model):
class Meta:
abstract = 5 # E: Incompatible types in assignment (expression has type "int", base class "TypedModelMeta" defined the type as "bool") [assignment]
class MyModel2(models.Model):
class Meta:
abstract = 5 # E: Incompatible types in assignment (expression has type "int", base class "TypedModelMeta" defined the type as "bool") [assignment]
class MyModel3(models.Model):
class Meta(MyModel.Meta, MyModel2.Meta):
abstract = 0 # OK because both base classes currently define this as int
verbose_name = ['test'] # E: Incompatible types in assignment (expression has type "list[str]", base class "TypedModelMeta" defined the type as "str | _StrPromise") [assignment]
unique_together = {1: 2} # E: Incompatible types in assignment (expression has type "dict[int, int]", base class "TypedModelMeta" defined the type as "Sequence[Sequence[str]]") [assignment]
- case: instantiate_abstract_model
main: |
from myapp.models import AbstractModel, MyModel
# Should not raise:
MyModel(field=1)
MyModel.objects.create(field=2)
AbstractModel._default_manager.create()
# Errors:
AbstractModel() # E: Cannot instantiate abstract class "AbstractModel" with abstract attributes "DoesNotExist", "MultipleObjectsReturned" and "NotUpdated" [abstract]
AbstractModel.objects.create() # E: "type[AbstractModel]" has no attribute "objects" [attr-defined]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class AbstractModel(models.Model):
base = models.TextField()
class Meta:
abstract = True
class MyModel(AbstractModel):
field = models.IntegerField()
typeddjango-django-stubs-fa03b48/tests/typecheck/models/test_metaclass.yml 0000664 0000000 0000000 00000032655 15260643574 0027222 0 ustar 00root root 0000000 0000000 - case: test_contributions_from_modelbase_metaclass
main: |
from typing_extensions import reveal_type
from myapp.models import Abstract1, Abstract2, Concrete1, Concrete2, Concrete3
from django.db import models
models.Model.DoesNotExist # E: "type[Model]" has no attribute "DoesNotExist" [attr-defined]
models.Model.NotUpdated # E: "type[Model]" has no attribute "NotUpdated" [attr-defined]
models.Model.MultipleObjectsReturned # E: "type[Model]" has no attribute "MultipleObjectsReturned" [attr-defined]
reveal_type(Abstract1.DoesNotExist) # N: Revealed type is "type[django.core.exceptions.ObjectDoesNotExist]"
reveal_type(Abstract2.DoesNotExist) # N: Revealed type is "type[django.core.exceptions.ObjectDoesNotExist]"
reveal_type(Concrete1.DoesNotExist) # N: Revealed type is "def (*args: object) -> myapp.models.Concrete1.DoesNotExist"
reveal_type(Concrete2.DoesNotExist) # N: Revealed type is "def (*args: object) -> myapp.models.Concrete2.DoesNotExist"
reveal_type(Abstract1.NotUpdated) # N: Revealed type is "type[django.core.exceptions.ObjectNotUpdated]"
reveal_type(Abstract2.NotUpdated) # N: Revealed type is "type[django.core.exceptions.ObjectNotUpdated]"
reveal_type(Concrete1.NotUpdated) # N: Revealed type is "def (*args: object) -> myapp.models.Concrete1.NotUpdated"
reveal_type(Concrete2.NotUpdated) # N: Revealed type is "def (*args: object) -> myapp.models.Concrete2.NotUpdated"
reveal_type(Abstract1.MultipleObjectsReturned) # N: Revealed type is "type[django.core.exceptions.MultipleObjectsReturned]"
reveal_type(Abstract2.MultipleObjectsReturned) # N: Revealed type is "type[django.core.exceptions.MultipleObjectsReturned]"
reveal_type(Concrete1.MultipleObjectsReturned) # N: Revealed type is "def (*args: object) -> myapp.models.Concrete1.MultipleObjectsReturned"
reveal_type(Concrete2.MultipleObjectsReturned) # N: Revealed type is "def (*args: object) -> myapp.models.Concrete2.MultipleObjectsReturned"
reveal_type(super(Concrete1, Concrete1()).DoesNotExist()) # N: Revealed type is "django.core.exceptions.ObjectDoesNotExist"
reveal_type(super(Concrete2, Concrete2()).DoesNotExist()) # N: Revealed type is "myapp.models.Concrete1.DoesNotExist"
reveal_type(super(Concrete1, Concrete1()).NotUpdated()) # N: Revealed type is "django.core.exceptions.ObjectNotUpdated"
reveal_type(super(Concrete2, Concrete2()).NotUpdated()) # N: Revealed type is "myapp.models.Concrete1.NotUpdated"
a: type[Concrete1.DoesNotExist]
a = Concrete1.DoesNotExist
a = Concrete2.DoesNotExist
a = Concrete3.DoesNotExist
b: type[Concrete2.DoesNotExist]
b = Concrete1.DoesNotExist # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete1.DoesNotExist]", variable has type "type[myapp.models.Concrete2.DoesNotExist]") [assignment]
b = Concrete2.DoesNotExist
b = Concrete3.DoesNotExist
c: type[Concrete3.DoesNotExist]
c = Concrete1.DoesNotExist # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete1.DoesNotExist]", variable has type "type[myapp.models.Concrete3.DoesNotExist]") [assignment]
c = Concrete2.DoesNotExist # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete2.DoesNotExist]", variable has type "type[myapp.models.Concrete3.DoesNotExist]") [assignment]
c = Concrete3.DoesNotExist
d: type[Concrete1.NotUpdated]
d = Concrete1.NotUpdated
d = Concrete2.NotUpdated
d = Concrete3.NotUpdated
e: type[Concrete2.NotUpdated]
e = Concrete1.NotUpdated # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete1.NotUpdated]", variable has type "type[myapp.models.Concrete2.NotUpdated]") [assignment]
e = Concrete2.NotUpdated
e = Concrete3.NotUpdated
f: type[Concrete3.NotUpdated]
f = Concrete1.NotUpdated # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete1.NotUpdated]", variable has type "type[myapp.models.Concrete3.NotUpdated]") [assignment]
f = Concrete2.NotUpdated # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete2.NotUpdated]", variable has type "type[myapp.models.Concrete3.NotUpdated]") [assignment]
f = Concrete3.NotUpdated
g: type[Concrete1.MultipleObjectsReturned]
g = Concrete1.MultipleObjectsReturned
g = Concrete2.MultipleObjectsReturned
g = Concrete3.MultipleObjectsReturned
h: type[Concrete2.MultipleObjectsReturned]
h = Concrete1.MultipleObjectsReturned # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete1.MultipleObjectsReturned]", variable has type "type[myapp.models.Concrete2.MultipleObjectsReturned]") [assignment]
h = Concrete2.MultipleObjectsReturned
h = Concrete3.MultipleObjectsReturned
i: type[Concrete3.MultipleObjectsReturned]
i = Concrete1.MultipleObjectsReturned # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete1.MultipleObjectsReturned]", variable has type "type[myapp.models.Concrete3.MultipleObjectsReturned]") [assignment]
i = Concrete2.MultipleObjectsReturned # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete2.MultipleObjectsReturned]", variable has type "type[myapp.models.Concrete3.MultipleObjectsReturned]") [assignment]
i = Concrete3.MultipleObjectsReturned
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Abstract1(models.Model):
class Meta:
abstract = True
class Abstract2(Abstract1):
class Meta:
abstract = True
class Concrete1(Abstract2):
...
class Concrete2(Concrete1):
...
class Concrete3(Concrete2):
...
- case: test_contributions_from_modelbase_metaclass_no_processing
mypy_config: |
[mypy.plugins.django-stubs]
django_settings_module = mysettings
strict_model_abstract_attrs = false
main: |
from typing_extensions import reveal_type
from myapp.models import Abstract1, Abstract2, Concrete1, Concrete2, Concrete3
from django.db import models
reveal_type(models.Model.DoesNotExist) # N: Revealed type is "type[django.core.exceptions.ObjectDoesNotExist]"
reveal_type(models.Model.NotUpdated) # N: Revealed type is "type[django.core.exceptions.ObjectNotUpdated]"
reveal_type(models.Model.MultipleObjectsReturned) # N: Revealed type is "type[django.core.exceptions.MultipleObjectsReturned]"
reveal_type(models.Model.objects) # N: Revealed type is "django.db.models.manager.Manager[django.db.models.base.Model]"
reveal_type(Abstract1.DoesNotExist) # N: Revealed type is "type[django.core.exceptions.ObjectDoesNotExist]"
reveal_type(Abstract2.DoesNotExist) # N: Revealed type is "type[django.core.exceptions.ObjectDoesNotExist]"
reveal_type(Concrete1.DoesNotExist) # N: Revealed type is "def (*args: object) -> myapp.models.Concrete1.DoesNotExist"
reveal_type(Concrete2.DoesNotExist) # N: Revealed type is "def (*args: object) -> myapp.models.Concrete2.DoesNotExist"
reveal_type(Abstract1.NotUpdated) # N: Revealed type is "type[django.core.exceptions.ObjectNotUpdated]"
reveal_type(Abstract2.NotUpdated) # N: Revealed type is "type[django.core.exceptions.ObjectNotUpdated]"
reveal_type(Concrete1.NotUpdated) # N: Revealed type is "def (*args: object) -> myapp.models.Concrete1.NotUpdated"
reveal_type(Concrete2.NotUpdated) # N: Revealed type is "def (*args: object) -> myapp.models.Concrete2.NotUpdated"
reveal_type(Abstract1.MultipleObjectsReturned) # N: Revealed type is "type[django.core.exceptions.MultipleObjectsReturned]"
reveal_type(Abstract2.MultipleObjectsReturned) # N: Revealed type is "type[django.core.exceptions.MultipleObjectsReturned]"
reveal_type(Concrete1.MultipleObjectsReturned) # N: Revealed type is "def (*args: object) -> myapp.models.Concrete1.MultipleObjectsReturned"
reveal_type(Concrete2.MultipleObjectsReturned) # N: Revealed type is "def (*args: object) -> myapp.models.Concrete2.MultipleObjectsReturned"
reveal_type(super(Concrete1, Concrete1()).DoesNotExist()) # N: Revealed type is "django.core.exceptions.ObjectDoesNotExist"
reveal_type(super(Concrete2, Concrete2()).DoesNotExist()) # N: Revealed type is "myapp.models.Concrete1.DoesNotExist"
reveal_type(super(Concrete1, Concrete1()).NotUpdated()) # N: Revealed type is "django.core.exceptions.ObjectNotUpdated"
reveal_type(super(Concrete2, Concrete2()).NotUpdated()) # N: Revealed type is "myapp.models.Concrete1.NotUpdated"
a: type[Concrete1.DoesNotExist]
a = Concrete1.DoesNotExist
a = Concrete2.DoesNotExist
a = Concrete3.DoesNotExist
b: type[Concrete2.DoesNotExist]
b = Concrete1.DoesNotExist # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete1.DoesNotExist]", variable has type "type[myapp.models.Concrete2.DoesNotExist]") [assignment]
b = Concrete2.DoesNotExist
b = Concrete3.DoesNotExist
c: type[Concrete3.DoesNotExist]
c = Concrete1.DoesNotExist # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete1.DoesNotExist]", variable has type "type[myapp.models.Concrete3.DoesNotExist]") [assignment]
c = Concrete2.DoesNotExist # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete2.DoesNotExist]", variable has type "type[myapp.models.Concrete3.DoesNotExist]") [assignment]
c = Concrete3.DoesNotExist
d: type[Concrete1.NotUpdated]
d = Concrete1.NotUpdated
d = Concrete2.NotUpdated
d = Concrete3.NotUpdated
e: type[Concrete2.NotUpdated]
e = Concrete1.NotUpdated # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete1.NotUpdated]", variable has type "type[myapp.models.Concrete2.NotUpdated]") [assignment]
e = Concrete2.NotUpdated
e = Concrete3.NotUpdated
f: type[Concrete3.NotUpdated]
f = Concrete1.NotUpdated # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete1.NotUpdated]", variable has type "type[myapp.models.Concrete3.NotUpdated]") [assignment]
f = Concrete2.NotUpdated # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete2.NotUpdated]", variable has type "type[myapp.models.Concrete3.NotUpdated]") [assignment]
f = Concrete3.NotUpdated
g: type[Concrete1.MultipleObjectsReturned]
g = Concrete1.MultipleObjectsReturned
g = Concrete2.MultipleObjectsReturned
g = Concrete3.MultipleObjectsReturned
h: type[Concrete2.MultipleObjectsReturned]
h = Concrete1.MultipleObjectsReturned # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete1.MultipleObjectsReturned]", variable has type "type[myapp.models.Concrete2.MultipleObjectsReturned]") [assignment]
h = Concrete2.MultipleObjectsReturned
h = Concrete3.MultipleObjectsReturned
i: type[Concrete3.MultipleObjectsReturned]
i = Concrete1.MultipleObjectsReturned # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete1.MultipleObjectsReturned]", variable has type "type[myapp.models.Concrete3.MultipleObjectsReturned]") [assignment]
i = Concrete2.MultipleObjectsReturned # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete2.MultipleObjectsReturned]", variable has type "type[myapp.models.Concrete3.MultipleObjectsReturned]") [assignment]
i = Concrete3.MultipleObjectsReturned
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Abstract1(models.Model):
class Meta:
abstract = True
class Abstract2(Abstract1):
class Meta:
abstract = True
class Concrete1(Abstract2):
...
class Concrete2(Concrete1):
...
class Concrete3(Concrete2):
...
- case: test_custom_model_base_metaclass
main: |
from typing_extensions import reveal_type
from myapp.models import This, Other
this = This(field=Other())
reveal_type(this.field) # N: Revealed type is "myapp.models.Other"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from django.db.models.base import ModelBase
class MyBase(ModelBase): ...
class MyModel(models.Model, metaclass=MyBase): ...
class Other(MyModel): ...
class This(MyModel):
field = models.ForeignKey(Other, on_delete=models.CASCADE)
typeddjango-django-stubs-fa03b48/tests/typecheck/models/test_primary_key.yml 0000664 0000000 0000000 00000005416 15260643574 0027574 0 ustar 00root root 0000000 0000000 - case: test_access_to_id_field_through_self_if_no_primary_key_defined
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
x = MyModel.objects.get(id=1)
reveal_type(x.id) # N: Revealed type is "int"
reveal_type(x.pk) # N: Revealed type is "int"
MyModel.objects.get(pk=1)
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing_extensions import override, reveal_type
from django.db import models
class MyModel(models.Model):
@override
def __str__(self) -> str:
reveal_type(self.id) # N: Revealed type is "int"
reveal_type(self.pk) # N: Revealed type is "int"
return ''
- case: test_access_to_id_field_through_self_if_primary_key_is_defined
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
x = MyModel.objects.get(id='a')
reveal_type(x.id) # N: Revealed type is "str"
reveal_type(x.pk) # N: Revealed type is "str"
MyModel.objects.get(pk='a')
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing_extensions import override, reveal_type
from django.db import models
class MyModel(models.Model):
id = models.CharField(max_length=10, primary_key=True)
@override
def __str__(self) -> str:
reveal_type(self.id) # N: Revealed type is "str"
reveal_type(self.pk) # N: Revealed type is "str"
return self.id
- case: test_access_to_id_field_through_self_if_primary_key_has_different_name
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
x = MyModel.objects.get(primary='a')
reveal_type(x.primary) # N: Revealed type is "str"
reveal_type(x.pk) # N: Revealed type is "str"
x.id # E: "MyModel" has no attribute "id" [attr-defined]
MyModel.objects.get(pk='a')
MyModel.objects.get(id='a') # E: Cannot resolve keyword 'id' into field. Choices are: primary [misc]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing_extensions import override, reveal_type
from django.db import models
class MyModel(models.Model):
primary = models.CharField(max_length=10, primary_key=True)
@override
def __str__(self) -> str:
reveal_type(self.primary) # N: Revealed type is "str"
reveal_type(self.pk) # N: Revealed type is "str"
self.id # E: "MyModel" has no attribute "id" [attr-defined]
return self.primary
typeddjango-django-stubs-fa03b48/tests/typecheck/models/test_proxy_models.yml 0000664 0000000 0000000 00000001762 15260643574 0027765 0 ustar 00root root 0000000 0000000 - case: foreign_key_to_proxy_model_accepts_first_non_proxy_model
main: |
from typing_extensions import reveal_type
from myapp.models import Blog, Publisher, PublisherProxy
Blog(publisher=Publisher())
Blog.objects.create(publisher=Publisher())
Blog().publisher = Publisher()
reveal_type(Blog().publisher) # N: Revealed type is "myapp.models.PublisherProxy"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from django_stubs_ext.db.models import TypedModelMeta
class Publisher(models.Model):
pass
class PublisherProxy(Publisher):
class Meta(TypedModelMeta):
proxy = True
class Blog(models.Model):
publisher = models.ForeignKey(to=PublisherProxy, on_delete=models.CASCADE)
typeddjango-django-stubs-fa03b48/tests/typecheck/models/test_related_fields.yml 0000664 0000000 0000000 00000016055 15260643574 0030210 0 ustar 00root root 0000000 0000000 - case: test_related_name_custom_manager
main: |
from typing_extensions import reveal_type
from app1.models import Model1
from app2.models import Model2
reveal_type(Model1().test) # N: Revealed type is "app3.models.Model3_RelatedManager"
reveal_type(Model2().test) # N: Revealed type is "app3.models.Model3_RelatedManager"
reveal_type(Model1().test2) # N: Revealed type is "app3.models.Model4_RelatedManager"
reveal_type(Model2().test2) # N: Revealed type is "app3.models.Model4_RelatedManager"
installed_apps:
- base
- users
- app1
- app2
- app3
files:
- path: base/__init__.py
- path: base/models.py
content: |
from django.db import models
class OwnedModel(models.Model):
owner = models.ForeignKey("users.User", on_delete=models.CASCADE)
class Meta:
abstract = True
- path: users/__init__.py
- path: users/models.py
content: |
from django.db import models
class User(models.Model):
pass
- path: app1/__init__.py
- path: app1/models.py
content: |
from django.db import models
from base.models import OwnedModel
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from app3.models import Model3
class CustomQuerySet(models.QuerySet):
pass
Model1Manager = models.Manager.from_queryset(CustomQuerySet)
class Model1(OwnedModel):
objects = Model1Manager()
- path: app2/__init__.py
- path: app2/models.py
content: |
from django.db import models
from base.models import OwnedModel
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from app3.models import Model3
class CustomQuerySet(models.QuerySet):
pass
Model2Manager = models.Manager.from_queryset(CustomQuerySet)
class Model2(OwnedModel):
objects = Model2Manager()
- path: app3/__init__.py
- path: app3/models.py
content: |
from django.db import models
from app1.models import Model1
from app2.models import Model2
from base.models import OwnedModel
class CustomQuerySet(models.QuerySet):
pass
Model3Manager = models.Manager.from_queryset(CustomQuerySet)
class Model3(OwnedModel):
a = models.ForeignKey(Model1, related_name="test", on_delete=models.CASCADE)
b = models.ForeignKey(Model2, related_name="test", on_delete=models.CASCADE)
objects = Model3Manager()
Model4Manager = models.Manager.from_queryset(CustomQuerySet)
class Model4(OwnedModel):
a = models.ForeignKey(Model1, related_name="test2", on_delete=models.CASCADE)
b = models.ForeignKey(Model2, related_name="test2", on_delete=models.CASCADE)
objects = Model4Manager()
- case: test_related_name_foreign_object_multi_column
main: |
from typing_extensions import reveal_type
from app1.models import Model1, Model2
reveal_type(Model2.model_1.field) # N: Revealed type is "django.db.models.fields.related.ForeignObject[app1.models.Model1, app1.models.Model1]"
reveal_type(Model2().model_1) # N: Revealed type is "app1.models.Model1"
reveal_type(Model1.model_2s) # N: Revealed type is "django.db.models.fields.related_descriptors.ReverseManyToOneDescriptor[app1.models.Model2]"
reveal_type(Model1().model_2s) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[app1.models.Model2]"
installed_apps:
- app1
files:
- path: app1/__init__.py
- path: app1/models.py
content: |
from django.db import models
from django.db.models.fields.related import ForeignObject
class Model1(models.Model):
type = models.TextField()
ref = models.TextField()
class Model2(models.Model):
name = models.TextField()
model_1_type = models.TextField()
model_2_ref = models.TextField()
model_1 = ForeignObject(
Model1,
to_fields=["type", "ref"],
from_fields=["model_1_type", "model_2_ref"],
on_delete=models.CASCADE,
related_name="model_2s",
)
- case: test_processes_other_relations_when_one_field_is_broken
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
reveal_type(MyModel().others) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.Other]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyModel(models.Model):
# Plugin doesn't handle lazy reference without app label
broken = models.ManyToManyField("MyModel", related_name="mymodels") # type: ignore[var-annotated]
class Other(models.Model):
field = models.ForeignKey(MyModel, related_name="others", on_delete=models.CASCADE)
- case: test_related_fields_with_two_generic_parameters
main: |
from typing_extensions import reveal_type
from myapp.models import Address, School, Student
reveal_type(Student().school) # N: Revealed type is "myapp.models.School"
reveal_type(Student().address) # N: Revealed type is "myapp.models.Address"
s = Student()
s.school = School()
s.address = Address()
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class School(models.Model):
pass
class Address(models.Model):
pass
class Student(models.Model):
school = models.ForeignKey["School","School"](to="School", on_delete=models.CASCADE)
address = models.OneToOneField["Address","Address"](to="Address", on_delete=models.CASCADE)
- case: test_related_fields_with_one_generic_parameter
main: |
from typing_extensions import reveal_type
from myapp.models import Address, School, Student
reveal_type(Student().school) # N: Revealed type is "myapp.models.School"
reveal_type(Student().address) # N: Revealed type is "myapp.models.Address"
s = Student()
s.school = School()
s.address = Address()
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class School(models.Model):
pass
class Address(models.Model):
pass
class Student(models.Model):
school = models.ForeignKey["School"](to="School", on_delete=models.CASCADE)
address = models.OneToOneField["Address"](to="Address", on_delete=models.CASCADE)
typeddjango-django-stubs-fa03b48/tests/typecheck/models/test_save.yml 0000664 0000000 0000000 00000011721 15260643574 0026173 0 ustar 00root root 0000000 0000000 - case: save_update_fields_valid
installed_apps:
- myapp
main: |
from myapp.models import Article
article = Article()
# Concrete fields accepted as list, tuple and set literals
article.save(update_fields=["title"])
article.save(update_fields=("title", "content"))
article.save(update_fields={"title", "content", "published"})
# Foreign keys accepted both by field name and by attname
article.save(update_fields=["author", "author_id"])
# Empty collection, None and an absent argument are all valid no-ops
article.save(update_fields=[])
article.save(update_fields=None)
article.save()
# Non-literal collections cannot be checked statically (bad name not flagged)
fields = ["nonexistent"]
article.save(update_fields=fields)
# asave is checked the same way
async def test_async_save() -> None:
await Article().asave(update_fields=["title", "author_id"])
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Category(models.Model):
name = models.CharField(max_length=100)
class Author(models.Model):
name = models.CharField(max_length=100)
class Tag(models.Model):
name = models.CharField(max_length=50)
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
published = models.BooleanField(default=False)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
tags = models.ManyToManyField(Tag)
- case: save_update_fields_invalid
installed_apps:
- myapp
main: |
from myapp.models import Article, Author
from typing import Literal
article = Article()
# Unknown field name
article.save(update_fields=["nonexistent"]) # E: Article has no field named 'nonexistent' [misc]
# Primary key is not an updatable field
article.save(update_fields=["id"]) # E: "save()" does not support primary key fields. Got "id" [misc]
# ManyToMany is not a concrete field
article.save(update_fields={"tags"}) # E: "save()" can only be used with concrete fields. Got "tags" [misc]
# Related lookups are not field names
article.save(update_fields=["author__name"]) # E: Article has no field named 'author__name' [misc]
# Every invalid field in a collection is reported
article.save(update_fields=["nonexistent1", "nonexistent2"]) # E: Article has no field named 'nonexistent1' [misc] # E: Article has no field named 'nonexistent2' [misc]
# Literal-typed values are resolved and checked
pk_field: Literal["id"] = "id"
article.save(update_fields=[pk_field]) # E: "save()" does not support primary key fields. Got "id" [misc]
# Non-field attributes are not model fields
article.save(update_fields=["get_display_title"]) # E: Article has no field named 'get_display_title' [misc]
article.save(update_fields=["is_recent"]) # E: Article has no field named 'is_recent' [misc]
article.save(update_fields=["CATEGORY"]) # E: Article has no field named 'CATEGORY' [misc]
article.save(update_fields=["extra_objects"]) # E: Article has no field named 'extra_objects' [misc]
# The model is resolved from the instance, so the message names the right model
Author().save(update_fields=["invalid"]) # E: Author has no field named 'invalid' [misc]
# asave is checked too, reporting its own name
async def test_async_save_invalid() -> None:
await Article().asave(update_fields=["id"]) # E: "asave()" does not support primary key fields. Got "id" [misc]
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing import ClassVar
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
class Tag(models.Model):
name = models.CharField(max_length=50)
class Article(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
tags = models.ManyToManyField(Tag)
CATEGORY: ClassVar[str] = "news"
extra_objects = models.Manager()
def get_display_title(self) -> str:
return self.title
@property
def is_recent(self) -> bool:
return True
typeddjango-django-stubs-fa03b48/tests/typecheck/models/test_state.yml 0000664 0000000 0000000 00000001017 15260643574 0026352 0 ustar 00root root 0000000 0000000 - case: state_attribute_has_a_type_of_model_state
main: |
from typing_extensions import reveal_type
from myapp.models import MyUser
user = MyUser(pk=1)
reveal_type(user._state) # N: Revealed type is "django.db.models.base.ModelState"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyUser(models.Model):
pass
typeddjango-django-stubs-fa03b48/tests/typecheck/test_annotated.yml 0000664 0000000 0000000 00000002070 15260643574 0025724 0 ustar 00root root 0000000 0000000 # Regression test for #893
- case: annotated_should_not_interfere
main: |
from dataclasses import dataclass
from typing_extensions import Annotated, TypedDict, reveal_type
from myapp.models import Blog
class IntegerType:
def __init__(self, min_value: int, max_value: int) -> None:
pass
@dataclass(unsafe_hash=True)
class RatingComposite:
max_value: Annotated[int, IntegerType(min_value=1, max_value=10)] = 5
class Obj(TypedDict):
foo: int
class X:
x: Annotated[Blog, Obj]
reveal_type(X().x) # N: Revealed type is "myapp.models.Blog"
reveal_type(X().x.foo) # E: "Blog" has no attribute "foo" [attr-defined] # N: Revealed type is "Any"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Blog(models.Model):
text = models.CharField(max_length=100)
typeddjango-django-stubs-fa03b48/tests/typecheck/test_config.yml 0000664 0000000 0000000 00000005023 15260643574 0025215 0 ustar 00root root 0000000 0000000 - case: pyproject_toml_config
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
mymodel = MyModel(user_id=1)
reveal_type(mymodel.id) # N: Revealed type is "int"
reveal_type(mymodel.user) # N: Revealed type is "django.contrib.auth.models.User"
reveal_type(MyModel.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.MyModel]"
mypy_config: |
[mypy.plugins.django-stubs]
django_settings_module = mysettings
custom_settings: |
SECRET_KEY = '1'
INSTALLED_APPS = ('django.contrib.contenttypes', 'django.contrib.auth', 'myapp')
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing import TYPE_CHECKING
from typing_extensions import reveal_type
from django.db import models
class MyModel(models.Model):
user = models.ForeignKey('auth.User', on_delete=models.CASCADE)
if TYPE_CHECKING:
reveal_type(MyModel().user) # N: Revealed type is "django.contrib.auth.models.User"
- case: generate_pyproject_toml_and_settings_file_from_installed_apps_key
main: |
from typing_extensions import reveal_type
from myapp.models import MyModel
mymodel = MyModel(user_id=1)
reveal_type(mymodel.id) # N: Revealed type is "int"
installed_apps:
- django.contrib.auth
- django.contrib.contenttypes
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyModel(models.Model):
user = models.ForeignKey('auth.User', on_delete=models.CASCADE)
- case: add_mypy_path_to_package_search
main: |
import extra_module
mypy_config: |
[mypy]
mypy_path = ./extras
[mypy.plugins.django-stubs]
django_settings_module = mysettings
files:
- path: extras/extra_module.py
content: |
def extra_fn() -> None:
pass
- case: add_mypypath_env_var_to_package_search
main: |
import extra_module
mypy_config: |
[mypy.plugins.django-stubs]
django_settings_module = mysettings
files:
- path: extras/extra_module.py
content: |
def extra_fn() -> None:
pass
env:
- MYPYPATH=./extras
typeddjango-django-stubs-fa03b48/tests/typecheck/test_forms.yml 0000664 0000000 0000000 00000015747 15260643574 0025114 0 ustar 00root root 0000000 0000000 - case: no_incompatible_meta_nested_class_false_positive
main: |
from django import forms
from myapp.models import Article, Category
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = '__all__'
class CategoryForm(forms.ModelForm):
class Meta:
model = Category
fields = '__all__'
class CompositeForm(ArticleForm, CategoryForm):
pass
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Article(models.Model):
pass
class Category(models.Model):
pass
- case: no_incompatible_meta_nested_class_false_positive_through_indirect_bases
main: |
from myapp.forms import ArticleFormBase, CategoryFormBase
class ArticleForm(ArticleFormBase):
class Meta:
fields = '__all__'
class CategoryForm(CategoryFormBase):
class Meta:
exclude = ('id',)
class CompositeForm(ArticleForm, CategoryForm):
pass
files:
- path: myapp/__init__.py
- path: myapp/forms.py
content: |
from django import forms
class FormBase(forms.ModelForm):
pass
class ArticleFormBase(FormBase):
pass
class CategoryFormBase(FormBase):
pass
- case: formview_methods_on_forms_return_proper_types
main: |
from typing import Any
from typing_extensions import reveal_type
from django import forms
from django.http import HttpRequest, HttpResponse
from django.views.generic.edit import FormView
from typing_extensions import override
class MyForm(forms.ModelForm):
pass
class MyForm2(forms.ModelForm):
pass
# FormView generic param provided
class MyView(FormView[MyForm]):
form_class = MyForm
@override
def post(self, request: HttpRequest, *args: Any, **kwds: Any) -> HttpResponse:
form_class = self.get_form_class()
reveal_type(form_class) # N: Revealed type is "type[main.MyForm]"
reveal_type(self.get_form(None)) # N: Revealed type is "main.MyForm"
reveal_type(self.get_form()) # N: Revealed type is "main.MyForm"
reveal_type(self.get_form(form_class)) # N: Revealed type is "main.MyForm"
reveal_type(self.get_form(MyForm2)) # N: Revealed type is "main.MyForm" # E: Argument 1 to "get_form" of "FormMixin" has incompatible type "type[MyForm2]"; expected "type[MyForm] | None" [arg-type]
return HttpResponse()
# FormView generic param omitted -- fallback to TypeVar default
class MyView2(FormView):
form_class = MyForm
@override
def post(self, request: HttpRequest, *args: Any, **kwds: Any) -> HttpResponse:
form_class = self.get_form_class()
reveal_type(form_class) # N: Revealed type is "type[Any]"
reveal_type(self.get_form(None)) # N: Revealed type is "Any"
reveal_type(self.get_form()) # N: Revealed type is "Any"
reveal_type(self.get_form(form_class)) # N: Revealed type is "Any"
reveal_type(self.get_form(MyForm2)) # N: Revealed type is "Any"
return HttpResponse()
- case: formview_form_valid_proper_type
main: |
from django.http import HttpRequest, HttpResponse
from django.forms import models
from django.views.generic.edit import FormView
from typing_extensions import override
class RegistrationForm(models.ModelForm): ...
class RegistrationViewNoGeneric(FormView):
form_class = RegistrationForm
template_name = 'web_app/registration.html'
@override
def form_valid(self, form: RegistrationForm) -> HttpResponse:
form.save()
return super().form_valid(form)
class RegistrationViewWithGeneric(FormView[RegistrationForm]):
form_class = RegistrationForm
template_name = 'web_app/registration.html'
@override
def form_valid(self, form: RegistrationForm) -> HttpResponse:
form.save()
return super().form_valid(form)
- case: updateview_form_valid_has_form_save
main: |
from typing_extensions import reveal_type
from django import forms
from django.http import HttpResponse
from django.views.generic.edit import UpdateView
from typing_extensions import override
class MyForm(forms.ModelForm):
pass
class MyView(UpdateView):
form_class = MyForm
@override
def form_valid(self, form: forms.BaseModelForm) -> HttpResponse:
reveal_type(form.save) # N: Revealed type is "def (commit: bool =) -> Any"
return HttpResponse()
- case: generic_modelchoicefield_label_from_instance
main: |
from django import forms
from myapp.models import Article, Category
from typing_extensions import override
class ArticleChoiceField(forms.ModelChoiceField[Article]):
@override
def label_from_instance(self, obj: Article) -> str:
return obj.name
class BrokenArticleChoiceField(forms.ModelChoiceField[Article]):
@override
def label_from_instance(self, obj: Article) -> str:
obj.title # E: "Article" has no attribute "title" [attr-defined]
return 'a'
class ArticleMultipleChoiceField(forms.ModelMultipleChoiceField[Article]):
@override
def label_from_instance(self, obj: Article) -> str:
return obj.name
class ChooseArticleForm(forms.Form):
articles = ArticleMultipleChoiceField(
queryset=Article.objects.none(),
)
best_article = ArticleChoiceField(
queryset=Article.objects.none(),
)
best_category = ArticleChoiceField(
queryset=Category.objects.none(), # E: Argument "queryset" to "ArticleChoiceField" has incompatible type "QuerySet[Category, Category]"; expected "Manager[Article] | QuerySet[Article, Article] | None" [arg-type]
)
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Category(models.Model):
title = models.CharField(max_length=128)
class Article(models.Model):
name = models.CharField(max_length=128)
typeddjango-django-stubs-fa03b48/tests/typecheck/test_formsets.yml 0000664 0000000 0000000 00000001717 15260643574 0025620 0 ustar 00root root 0000000 0000000 - case: inlineformset_factory
main: |
from typing import Any
from typing_extensions import reveal_type
from django import forms
from myapp.models import Article, Category
ArticleFS: type[forms.BaseInlineFormSet[Article, Category, Any]] = forms.inlineformset_factory(Category, Article)
ArticleFS(instance=Article()) # E: Argument "instance" to "BaseInlineFormSet" has incompatible type "Article"; expected "Category | None" [arg-type]
fs = ArticleFS(instance=Category())
reveal_type(fs.instance) # N: Revealed type is "myapp.models.Category"
reveal_type(fs.get_queryset()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article, myapp.models.Article]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Article(models.Model):
pass
class Category(models.Model):
pass
typeddjango-django-stubs-fa03b48/tests/typecheck/test_request.yml 0000664 0000000 0000000 00000011334 15260643574 0025442 0 ustar 00root root 0000000 0000000 - case: request_object_has_user_of_type_auth_user_model
main: |
from typing_extensions import reveal_type
from django.http.request import HttpRequest
reveal_type(HttpRequest().user) # N: Revealed type is "myapp.models.MyUser | django.contrib.auth.models.AnonymousUser"
# check that other fields work ok
reveal_type(HttpRequest().method) # N: Revealed type is "str | None"
custom_settings: |
INSTALLED_APPS = ('django.contrib.contenttypes', 'django.contrib.auth', 'myapp')
AUTH_USER_MODEL='myapp.MyUser'
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyUser(models.Model):
pass
- case: request_object_user_can_be_discriminated
main: |
from typing_extensions import reveal_type
from django.http.request import HttpRequest
request = HttpRequest()
reveal_type(request.user) # N: Revealed type is "django.contrib.auth.models.User | django.contrib.auth.models.AnonymousUser"
if not request.user.is_anonymous:
reveal_type(request.user) # N: Revealed type is "django.contrib.auth.models.User"
if request.user.is_authenticated:
reveal_type(request.user) # N: Revealed type is "django.contrib.auth.models.User"
reveal_type(request.user.groups.all().get()) # N: Revealed type is "django.contrib.auth.models.Group"
custom_settings: |
INSTALLED_APPS = ('django.contrib.contenttypes', 'django.contrib.auth')
- case: request_object_user_without_auth_and_contenttypes_apps
main: |
from typing_extensions import reveal_type
from django.http.request import HttpRequest
request = HttpRequest()
reveal_type(request.user) # N: Revealed type is "django.contrib.auth.base_user.AbstractBaseUser | django.contrib.auth.models.AnonymousUser"
if request.user.is_authenticated:
reveal_type(request.user) # N: Revealed type is "django.contrib.auth.base_user.AbstractBaseUser"
- case: request_object_user_without_auth_but_with_contenttypes_apps
main: |
from typing_extensions import reveal_type
from django.http.request import HttpRequest
request = HttpRequest()
reveal_type(request.user) # N: Revealed type is "django.contrib.auth.base_user.AbstractBaseUser | django.contrib.auth.models.AnonymousUser"
if request.user.is_authenticated:
reveal_type(request.user) # N: Revealed type is "django.contrib.auth.base_user.AbstractBaseUser"
custom_settings: |
INSTALLED_APPS = ('django.contrib.contenttypes',)
- case: subclass_request_not_changed_user_type
main: |
from typing_extensions import reveal_type
from django.http.request import HttpRequest
class MyRequest(HttpRequest):
foo: int # Just do something
request = MyRequest()
reveal_type(request.user) # N: Revealed type is "django.contrib.auth.models.User | django.contrib.auth.models.AnonymousUser"
custom_settings: |
INSTALLED_APPS = ('django.contrib.contenttypes', 'django.contrib.auth')
- case: subclass_request_changed_user_type
main: |
from typing_extensions import reveal_type
from django.http.request import HttpRequest
from django.contrib.auth.models import User
class MyRequest(HttpRequest):
user: User # Override the type of user
request = MyRequest()
reveal_type(request) # N: Revealed type is "main.MyRequest"
reveal_type(request.user) # N: Revealed type is "django.contrib.auth.models.User"
custom_settings: |
INSTALLED_APPS = ('django.contrib.contenttypes', 'django.contrib.auth')
- case: request_get_post
main: |
from typing_extensions import reveal_type
from django.http.request import HttpRequest
request = HttpRequest()
reveal_type(request) # N: Revealed type is "django.http.request.HttpRequest"
reveal_type(request.GET) # N: Revealed type is "django.http.request._ImmutableQueryDict"
request.GET['foo'] = 'bar' # E: This QueryDict is immutable. [misc]
- case: request_get_post_func_ret
main: |
from typing_extensions import reveal_type
from django.http.request import HttpRequest
def mk_request() -> HttpRequest:
return HttpRequest()
req = mk_request()
reveal_type(req) # N: Revealed type is "django.http.request.HttpRequest"
reveal_type(req.GET) # N: Revealed type is "django.http.request._ImmutableQueryDict"
req.GET.setdefault('foo', 'bar') # E: This QueryDict is immutable. [misc]
x = 1 # E: Statement is unreachable [unreachable]
typeddjango-django-stubs-fa03b48/tests/typecheck/test_settings.yml 0000664 0000000 0000000 00000010103 15260643574 0025603 0 ustar 00root root 0000000 0000000 - case: settings_loaded_from_different_files
disable_cache: true
main: |
from typing_extensions import reveal_type
from django.conf import settings
# standard settings
reveal_type(settings.AUTH_USER_MODEL) # N: Revealed type is "str"
reveal_type(settings.ROOT_DIR) # N: Revealed type is "str"
reveal_type(settings.APPS_DIR) # N: Revealed type is "pathlib.Path"
reveal_type(settings.NUMBERS) # N: Revealed type is "list[str]"
reveal_type(settings.DICT) # N: Revealed type is "dict[Any, Any]"
custom_settings: |
from base import *
SECRET_KEY = 112233
NUMBERS = ['one', 'two']
DICT = {} # type: ignore[var-annotated]
files:
- path: base.py
content: |
from pathlib import Path
ROOT_DIR = '/etc'
APPS_DIR = Path(ROOT_DIR)
- case: global_settings_are_always_loaded
main: |
from typing_extensions import reveal_type
from django.conf import settings
reveal_type(settings.AUTH_USER_MODEL) # N: Revealed type is "str"
reveal_type(settings.AUTHENTICATION_BACKENDS) # N: Revealed type is "typing.Sequence[str]"
installed_apps: []
- case: fail_if_there_is_no_setting
main: |
from django.conf import settings
settings.NOT_EXISTING # E: 'Settings' object has no attribute 'NOT_EXISTING' [misc]
- case: override_default_setting_with_different_type_in_the_different_module
custom_settings: |
from settings.basic_settings import *
main: |
from typing_extensions import reveal_type
from django.conf import settings
reveal_type(settings.MEDIA_ROOT) # N: Revealed type is "pathlib.Path"
reveal_type(settings.MEDIA_ROOT / 'part') # N: Revealed type is "pathlib.Path"
files:
- path: settings/__init__.py
- path: settings/basic_settings.py
content: |
from pathlib import Path
MEDIA_ROOT = Path()
- case: settings_hasattr
main: |
from typing_extensions import reveal_type
from django.conf import settings
if hasattr(settings, 'AUTH_USER_MODEL') and settings.AUTH_USER_MODEL:
reveal_type(settings.AUTH_USER_MODEL)
if hasattr(settings, 'NON_EXISTENT_SETTING') and settings.NON_EXISTENT_SETTING:
reveal_type(settings.NON_EXISTENT_SETTING)
out: |
main:4: note: Revealed type is "str"
main:5: error: 'Settings' object has no attribute 'NON_EXISTENT_SETTING' [misc]
main:6: error: 'Settings' object has no attribute 'NON_EXISTENT_SETTING' [misc]
main:6: note: Revealed type is "Any"
- case: settings_loaded_from_runtime_magic
disable_cache: true
main: |
from typing_extensions import reveal_type
from django.conf import settings
# Global:
reveal_type(settings.SECRET_KEY) # N: Revealed type is "str"
# Custom:
reveal_type(settings.A) # N: Revealed type is "Any"
reveal_type(settings.B) # E: 'Settings' object has no attribute 'B' [misc] # N: Revealed type is "Any"
custom_settings: |
# Some code that mypy cannot analyze, but values exist in runtime:
exec('A = 1')
mypy_config: |
[mypy.plugins.django-stubs]
django_settings_module = mysettings
strict_settings = false
- case: settings_loaded_from_runtime_magic_strict_default
disable_cache: true
main: |
from typing_extensions import reveal_type
from django.conf import settings
# Global:
reveal_type(settings.SECRET_KEY) # N: Revealed type is "str"
# Custom:
reveal_type(settings.A) # E: 'Settings' object has no attribute 'A' [misc] # N: Revealed type is "Any"
reveal_type(settings.B) # E: 'Settings' object has no attribute 'B' [misc] # N: Revealed type is "Any"
custom_settings: |
# Some code that mypy cannot analyze, but values exist in runtime:
exec('A = 1')
mypy_config: |
[mypy.plugins.django-stubs]
django_settings_module = mysettings
typeddjango-django-stubs-fa03b48/tests/typecheck/test_shortcuts.yml 0000664 0000000 0000000 00000003421 15260643574 0026006 0 ustar 00root root 0000000 0000000 - case: get_object_or_404_returns_proper_types
main: |
from typing_extensions import reveal_type
from django.shortcuts import get_object_or_404, get_list_or_404
from myapp.models import MyModel
reveal_type(get_object_or_404(MyModel)) # N: Revealed type is "myapp.models.MyModel"
reveal_type(get_object_or_404(MyModel.objects)) # N: Revealed type is "myapp.models.MyModel"
reveal_type(get_object_or_404(MyModel.objects.get_queryset())) # N: Revealed type is "myapp.models.MyModel"
reveal_type(get_list_or_404(MyModel)) # N: Revealed type is "list[myapp.models.MyModel]"
reveal_type(get_list_or_404(MyModel.objects)) # N: Revealed type is "list[myapp.models.MyModel]"
reveal_type(get_list_or_404(MyModel.objects.get_queryset())) # N: Revealed type is "list[myapp.models.MyModel]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyModel(models.Model):
pass
- case: get_user_model_returns_proper_class
main: |
from typing_extensions import reveal_type
from django.contrib.auth import get_user_model
UserModel = get_user_model()
reveal_type(UserModel.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.MyUser]"
custom_settings: |
INSTALLED_APPS = ('django.contrib.contenttypes', 'django.contrib.auth', 'myapp')
AUTH_USER_MODEL = 'myapp.MyUser'
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyUser(models.Model):
pass
typeddjango-django-stubs-fa03b48/tests/typecheck/views/ 0000775 0000000 0000000 00000000000 15260643574 0023323 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/typecheck/views/generic/ 0000775 0000000 0000000 00000000000 15260643574 0024737 5 ustar 00root root 0000000 0000000 typeddjango-django-stubs-fa03b48/tests/typecheck/views/generic/test_detail.yml 0000664 0000000 0000000 00000004555 15260643574 0027774 0 ustar 00root root 0000000 0000000 - case: generic_detail_view
main: |
from django.views.generic import DetailView
from django.db.models import QuerySet
from typing_extensions import override
from myapp.models import MyModel
class MyDetailView(DetailView[MyModel]):
model = MyModel
queryset = MyModel.objects.all()
@override
def get_queryset(self) -> QuerySet[MyModel]:
self.get_object(super().get_queryset())
return super().get_queryset()
custom_settings: |
INSTALLED_APPS = ('myapp',)
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyModel(models.Model):
...
- case: generic_detail_view_wrong
main: |
from django.views.generic import DetailView
from django.db.models import QuerySet
from typing_extensions import override
from myapp.models import MyModel, Other
class MyDetailView(DetailView[Other]):
model = MyModel
queryset = MyModel.objects.all()
@override
def get_queryset(self) -> QuerySet[MyModel]:
self.get_object(super().get_queryset())
return super().get_queryset()
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyModel(models.Model):
...
class Other(models.Model):
...
out: |
main:8: error: Incompatible types in assignment (expression has type "type[MyModel]", base class "SingleObjectMixin" defined the type as "type[Other]") [assignment]
main:9: error: Incompatible types in assignment (expression has type "QuerySet[MyModel, MyModel]", base class "SingleObjectMixin" defined the type as "QuerySet[Other, Other] | None") [assignment]
main:12: error: Return type "QuerySet[MyModel, MyModel]" of "get_queryset" incompatible with return type "QuerySet[Other, Other]" in supertype "django.views.generic.detail.SingleObjectMixin" [override]
main:14: error: Incompatible return value type (got "QuerySet[Other, Other]", expected "QuerySet[MyModel, MyModel]") [return-value]
typeddjango-django-stubs-fa03b48/tests/typecheck/views/generic/test_edit.yml 0000664 0000000 0000000 00000007643 15260643574 0027460 0 ustar 00root root 0000000 0000000 - case: login_form_form_valid_typechecks
main: |
from django.contrib.auth.views import LoginView
from django.contrib.auth import login as auth_login
from django.http import HttpResponseRedirect
from django.contrib.auth.forms import AuthenticationForm
from typing_extensions import override
class MyLoginView(LoginView):
@override
def form_valid(self, form: AuthenticationForm) -> HttpResponseRedirect:
"""Ensure that form can have type AuthenticationForm."""
form.get_user()
return HttpResponseRedirect(self.get_success_url())
- case: dispatch_http_response
main: |
from typing import Any
from django.http import HttpRequest, HttpResponse
from django.views.generic.base import View
from typing_extensions import override
class MyView(View):
@override
def dispatch(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse:
response: HttpResponse
return response
- case: dispatch_streaming_http_response
main: |
from typing import Any
from django.http import HttpRequest, StreamingHttpResponse
from django.views.generic.base import View
from typing_extensions import override
class MyView(View):
@override
def dispatch(self, request: HttpRequest, *args: Any, **kwargs: Any) -> StreamingHttpResponse:
response: StreamingHttpResponse
return response
- case: generic_form_views
main: |
from typing_extensions import reveal_type
from django.views.generic.edit import CreateView, UpdateView
from django import forms
from myapp.models import Article
class ArticleModelForm(forms.ModelForm[Article]):
class Meta:
model = Article
class MyCreateView(CreateView[Article, ArticleModelForm]):
def some(self) -> None:
reveal_type(self.get_form_class()) # N: Revealed type is "type[main.ArticleModelForm]"
class MyUpdateView(UpdateView[Article, ArticleModelForm]):
def some(self) -> None:
reveal_type(self.get_form_class()) # N: Revealed type is "type[main.ArticleModelForm]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Article(models.Model):
pass
- case: generic_form_views_different_form_classes
main: |
from typing_extensions import reveal_type
from django.views.generic.edit import CreateView
from django import forms
from myapp.models import Article
class ArticleModelForm(forms.ModelForm[Article]):
class Meta:
model = Article
class SubArticleModelForm(ArticleModelForm):
pass
class AnotherArticleModelForm(forms.ModelForm[Article]):
class Meta:
model = Article
class MyCreateView(CreateView[Article, ArticleModelForm]):
def some(self) -> None:
reveal_type(self.get_form()) # N: Revealed type is "main.ArticleModelForm"
reveal_type(self.get_form(SubArticleModelForm)) # N: Revealed type is "main.ArticleModelForm"
reveal_type(self.get_form(AnotherArticleModelForm)) # N: Revealed type is "main.ArticleModelForm" # E: Argument 1 to "get_form" of "FormMixin" has incompatible type "type[AnotherArticleModelForm]"; expected "type[ArticleModelForm] | None" [arg-type]
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Article(models.Model):
pass
typeddjango-django-stubs-fa03b48/tests/typecheck/views/generic/test_list.yml 0000664 0000000 0000000 00000004174 15260643574 0027502 0 ustar 00root root 0000000 0000000 - case: generic_list_view
main: |
from django.views.generic import ListView
from django.db.models import QuerySet
from typing_extensions import override
from myapp.models import MyModel
class MyListView(ListView[MyModel]):
model = MyModel
queryset = MyModel.objects.all()
@override
def get_queryset(self) -> QuerySet[MyModel]:
raise NotImplementedError
custom_settings: |
INSTALLED_APPS = ('myapp',)
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyModel(models.Model):
...
- case: generic_list_view_wrong
main: |
from django.views.generic import ListView
from django.db.models import QuerySet
from typing_extensions import override
from myapp.models import MyModel, Other
class MyListView(ListView[Other]):
model = MyModel
queryset = MyModel.objects.all()
@override
def get_queryset(self) -> QuerySet[MyModel]:
raise NotImplementedError
custom_settings: |
INSTALLED_APPS = ('myapp',)
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyModel(models.Model):
...
class Other(models.Model):
...
out: |
main:8: error: Incompatible types in assignment (expression has type "type[MyModel]", base class "MultipleObjectMixin" defined the type as "type[Other] | None") [assignment]
main:9: error: Incompatible types in assignment (expression has type "QuerySet[MyModel, MyModel]", base class "MultipleObjectMixin" defined the type as "QuerySet[Other, Other] | None") [assignment]
main:12: error: Return type "QuerySet[MyModel, MyModel]" of "get_queryset" incompatible with return type "QuerySet[Other, Other]" in supertype "django.views.generic.list.MultipleObjectMixin" [override]
typeddjango-django-stubs-fa03b48/tests/typecheck/views/generic/test_template.yml 0000664 0000000 0000000 00000001040 15260643574 0030327 0 ustar 00root root 0000000 0000000 - case: generic_template_view_mutable_extra_context
main: |
from django.views.generic import TemplateView
class MyTemplateView(TemplateView):
template_name = "template.html"
extra_context = {}
- case: generic_template_view_immutable_extra_context
main: |
from types import MappingProxyType
from django.views.generic import TemplateView
class MyTemplateView(TemplateView):
template_name = "template.html"
extra_context = MappingProxyType({})
typeddjango-django-stubs-fa03b48/uv.lock 0000664 0000000 0000000 00001250271 15260643574 0020361 0 ustar 00root root 0000000 0000000 version = 1
revision = 3
requires-python = ">=3.11"
resolution-markers = [
"python_full_version >= '3.15'",
"python_full_version >= '3.12' and python_full_version < '3.15'",
"python_full_version < '3.12'",
]
[manifest]
members = [
"django-stubs",
"django-stubs-ext",
]
[[package]]
name = "asgiref"
version = "3.12.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/e6/26/3b59f2bdae5f640389becb1f673cded775287f5fc4f816309d9ca9a3f93d/asgiref-3.12.1.tar.gz", hash = "sha256:59dcb51c272ad209d59bed5708a64a333083e86017d7fcdd67498eeab7784340", size = 42378, upload-time = "2026-07-14T09:56:18.087Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/c0/1b/54f4ad77cd8a584fa70746c47df988e002cf1ee1eba43364d46f87803647/asgiref-3.12.1-py3-none-any.whl", hash = "sha256:fe386d1c2bff7259ea95929266d12a8cf9a8b5a1c2598402967d8792e7a7c094", size = 25478, upload-time = "2026-07-14T09:56:16.926Z" },
]
[[package]]
name = "ast-serialize"
version = "0.12.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/c2/1c/7257e6ec9382843915ce475558ce4492ccb5ed39122c256bb369c27e2ebf/ast_serialize-0.12.1.tar.gz", hash = "sha256:5285a390caf1c44368ae270f037f797b91427d138b7d43cad0f1fda4c83518d9", size = 954408, upload-time = "2026-10-03T12:25:00.221Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/4a/f7/e976169da322c009bb083a52d21e88fbfe5f071e1806e8c8361ab4ac477a/ast_serialize-0.12.1-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:e73255c9227fd74eac8a9b55c4049e8ad7b66d1f690bf827c98a86b2e594def7", size = 897232, upload-time = "2026-10-03T12:23:21.945Z" },
{ url = "https://files.pythonhosted.org/packages/e1/89/5545f6f4d38dd41b4e2a20050967ccd722508bc90fab0dfba463d8c8b994/ast_serialize-0.12.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:4655ef993e69e01bb47d2d99647de9bbb74af03938438656832cd010d95de348", size = 1235397, upload-time = "2026-10-03T12:23:23.835Z" },
{ url = "https://files.pythonhosted.org/packages/22/19/e9b839ef9b57626e15e20dd7cf764a9a6b50f9750f86d0a49bc3a971fb72/ast_serialize-0.12.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:bac5a99a2c91dd823be9b8c44645694fccbb0750773cc5b27889a9f6f22fce89", size = 1216331, upload-time = "2026-10-03T12:23:25.557Z" },
{ url = "https://files.pythonhosted.org/packages/26/2a/d054d4ff8ba42472a22e3da6eb6dee0e69a32c477b5077eefdbada99f554/ast_serialize-0.12.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6485e681625ed7a094221f16a7ff2ef154946112266a05cf83bde50c959ef345", size = 1281194, upload-time = "2026-10-03T12:23:27.349Z" },
{ url = "https://files.pythonhosted.org/packages/7e/0c/c73eddfa180a7a4c1613c0f3d3ef020b05dca9b922ac08212463c33ad11f/ast_serialize-0.12.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a513bc6f60980d01767f7cbe39b17ce0373e722824a74ce28d6cea49ee3c8460", size = 1287170, upload-time = "2026-10-03T12:23:29.333Z" },
{ url = "https://files.pythonhosted.org/packages/94/77/39dc75d8b718844859b64a9067c9df0cfce218ca45ea215fb24a1fda3cf7/ast_serialize-0.12.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:82866f3523d53ffca8d2a69a750bec52908b69f728012e40959bebce2620453c", size = 1531238, upload-time = "2026-10-03T12:23:30.954Z" },
{ url = "https://files.pythonhosted.org/packages/b9/c0/6a6a6f94f45a288c4bac2eb8379a3d9654574a0f9249380ce3b07f6d64bb/ast_serialize-0.12.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:243054a05a5190f5d087b5c8b16423e7f1cefa4991bac26e9c8ace18074b75b6", size = 1307154, upload-time = "2026-10-03T12:23:32.645Z" },
{ url = "https://files.pythonhosted.org/packages/f9/3d/80f843892bd0f7c0d95ec5422ba3dc315c1ce011e6f08b06d5f71bd82c25/ast_serialize-0.12.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d9fbe5a3e8acddfc2fddff3dbbc7ea0e9798b3df3428f851b8abc52a3806f31", size = 1301506, upload-time = "2026-10-03T12:23:34.63Z" },
{ url = "https://files.pythonhosted.org/packages/df/cc/49a5fe852706f545e3e005584c5be89456bc637a8c9179aeaa8b9f26e8e4/ast_serialize-0.12.1-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:d3d516da3463071d27e64caf54d88cba25cf4ad4afcc807e0bcf67743719f03e", size = 1297616, upload-time = "2026-10-03T12:23:36.377Z" },
{ url = "https://files.pythonhosted.org/packages/49/5c/1208c91d6e00cc43cc276bd6233c40c9b4ec3ef8537c83281dd5372cbdb8/ast_serialize-0.12.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d6711adf11136c77e3a35517de9488a5081d1012874fae99c2876b64f4daace", size = 1354884, upload-time = "2026-10-03T12:23:38.035Z" },
{ url = "https://files.pythonhosted.org/packages/a9/80/2b5fc912ff0be64d8d61ff5dc7dc405c6311297a0e2039b848b7d14333f2/ast_serialize-0.12.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:cbe239bee4bd609186daf60b95b7b0f47146c7f7f55f6da83807d747d6fe753f", size = 1457911, upload-time = "2026-10-03T12:23:39.679Z" },
{ url = "https://files.pythonhosted.org/packages/b2/f8/d720429bf8933efbd0cc2038c0a50b6267a585d503500845c44bc6c8ff66/ast_serialize-0.12.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:5bbf582286c9dc6b4c544ef645dc99e4b3aa09db28892bc60344141f6926641f", size = 1563023, upload-time = "2026-10-03T12:23:41.585Z" },
{ url = "https://files.pythonhosted.org/packages/7e/0a/99e6cc92bdbae5db60f84a14a0fb1ae77b6087e451d77808d87558162c9a/ast_serialize-0.12.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:99e33c93efb5254a70c525b46038212371dfe5693d48eb2d0d5f17d936a263d7", size = 1556601, upload-time = "2026-10-03T12:23:43.361Z" },
{ url = "https://files.pythonhosted.org/packages/7a/05/59de9e16a2e333da534f30776d0f5e426034b64c67c17843425e3cc827d1/ast_serialize-0.12.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:aa6c17a2b7f07e81fa8cfcc4aa7c832b3e57733853aebea113ab502f9b0963db", size = 1665039, upload-time = "2026-10-03T12:23:45.257Z" },
{ url = "https://files.pythonhosted.org/packages/33/83/35ed67a127167b484b42a071df440f84b14c0d20ea8f69dbed5cc96bfd98/ast_serialize-0.12.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f896fa38e0af38821e1ab1425c5dee89e359623e165765bdeae7d0eb6909e76d", size = 1472263, upload-time = "2026-10-03T12:23:46.811Z" },
{ url = "https://files.pythonhosted.org/packages/c4/b0/3ab8613bbb690297f1bb687d780a248c486df0f4131b6a82044fcb49e438/ast_serialize-0.12.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:af699e81fd7ce80b8b03945826d8ea23dd36d072f10d4613402da597ba4ee9c6", size = 1499242, upload-time = "2026-10-03T12:23:48.531Z" },
{ url = "https://files.pythonhosted.org/packages/9d/a0/a28894d3b06f8775cea8989f371bd9f72ce562c32bc807770e7fb920ce17/ast_serialize-0.12.1-cp314-cp314t-win32.whl", hash = "sha256:10b59afc108eb285146acb23d1b5ec0fc58bb3c09cb2ab8876402df06c373c3b", size = 1119488, upload-time = "2026-10-03T12:23:50.419Z" },
{ url = "https://files.pythonhosted.org/packages/c1/b2/0c44952f4ba4e14bb7f60a5858e2960dfefb9884e6ff007aaf64337dba5c/ast_serialize-0.12.1-cp314-cp314t-win_amd64.whl", hash = "sha256:72e871f6995a066c1b19104f8a6b5832b1163adb9a8267c2aa4711fbb0f4d1f3", size = 1157434, upload-time = "2026-10-03T12:23:52.383Z" },
{ url = "https://files.pythonhosted.org/packages/1f/1e/cb594c63f46a01d53629af1c4f9e42cd02afcea1c2fe483e12f22743ebac/ast_serialize-0.12.1-cp314-cp314t-win_arm64.whl", hash = "sha256:3398e458047d21c9bc1b323fe5aab77c608dc9ddb65b2d44deebaff503a1f1eb", size = 1129094, upload-time = "2026-10-03T12:23:54.133Z" },
{ url = "https://files.pythonhosted.org/packages/16/05/ca16884f9498386f3646bb18be59f0e31d44e992d252d7d6f5e4f8ae1ee2/ast_serialize-0.12.1-cp315-abi3.abi3t-macosx_10_12_x86_64.whl", hash = "sha256:410233de149ab8414cb27c6fc73e9d2baa35d6f971672d540d752060d980ffb4", size = 1235686, upload-time = "2026-10-03T12:23:55.863Z" },
{ url = "https://files.pythonhosted.org/packages/29/f2/34e87ed30e292cf365523712c4bcfef1967d9c3c2749de21b1f93b1fe0f3/ast_serialize-0.12.1-cp315-abi3.abi3t-macosx_11_0_arm64.whl", hash = "sha256:b9a2310845302f1a6bd45ae8a67d5760211103a8d66410b854bfa440d107e093", size = 1215598, upload-time = "2026-10-03T12:23:57.48Z" },
{ url = "https://files.pythonhosted.org/packages/f8/dc/c498f41c957b6ff31b97ed8ceccf3a84f85af7debca1125183cab95bb58b/ast_serialize-0.12.1-cp315-abi3.abi3t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ff65f40f49d5e1a1a043ba366081d59a4e26a9f5c1b07eb1170e172115da7ca", size = 1281911, upload-time = "2026-10-03T12:23:58.954Z" },
{ url = "https://files.pythonhosted.org/packages/dc/60/70ccefae9d88058c4c234bf0aed93f54aca36eb74087736e76e9515aee96/ast_serialize-0.12.1-cp315-abi3.abi3t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:536d783c4d91331f094e0a892221e619be5ffbe6fb6640885f14d7f226ec90ca", size = 1287296, upload-time = "2026-10-03T12:24:00.429Z" },
{ url = "https://files.pythonhosted.org/packages/08/e9/4fc697879c7128e29f9dab2ed19a9b586a56b621e5ea4aee2ae28c18e116/ast_serialize-0.12.1-cp315-abi3.abi3t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c42d2d65f388d1960c5796231eb9bf5a988c46228633eb489605c4549ad16c52", size = 1532339, upload-time = "2026-10-03T12:24:02.053Z" },
{ url = "https://files.pythonhosted.org/packages/8a/9e/9e2bd489731602a94dbd0c576ebe1cc487a2d0f6127be743f44711166f0d/ast_serialize-0.12.1-cp315-abi3.abi3t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a5628a12acc875fe7a167910f18d101dd101c2a7b1e6c2b6f7289ffaff25805c", size = 1308988, upload-time = "2026-10-03T12:24:03.61Z" },
{ url = "https://files.pythonhosted.org/packages/3f/69/e9cae837bd766a66db6953ffb5fc7f04b1945e02b0a9e4c6a0b6acb08f17/ast_serialize-0.12.1-cp315-abi3.abi3t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e855adfa5bb982b2e6fe09056b2d584f6dd4fce085d91a07d1155683751b6b5", size = 1303412, upload-time = "2026-10-03T12:24:05.62Z" },
{ url = "https://files.pythonhosted.org/packages/b2/1e/5ef8c62d5031d93187ed0d8dade5d942de9920c3fbd678c7652362b9a7a2/ast_serialize-0.12.1-cp315-abi3.abi3t-manylinux_2_31_riscv64.whl", hash = "sha256:fafe1471e8aca6c87b4913b7b54ff97197adf702fbe28692284b929dfa62ff96", size = 1298466, upload-time = "2026-10-03T12:24:07.242Z" },
{ url = "https://files.pythonhosted.org/packages/c2/f3/25ded60844a1a437edc840e597b6f81daf91dc4a26035416e14298d3a091/ast_serialize-0.12.1-cp315-abi3.abi3t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a5cac246474d2a703147d1605a6ac5ba0fa9e0a443cf1cf42513adf4df02686f", size = 1355617, upload-time = "2026-10-03T12:24:09.125Z" },
{ url = "https://files.pythonhosted.org/packages/05/68/a0d3cc8d8042208a2cbef7b26483f4941b44dd5dd717bb19f20e4a4c0d66/ast_serialize-0.12.1-cp315-abi3.abi3t-musllinux_1_2_aarch64.whl", hash = "sha256:6e25cd319fb0d7b39fcac666784ec86708ccbc78d07a698b1400cf5ed40c045b", size = 1458949, upload-time = "2026-10-03T12:24:10.772Z" },
{ url = "https://files.pythonhosted.org/packages/df/a0/5e4d355c48a9f125b8bec7b1b98d4d2dcd8324ff1d4dfcb03678a03c1414/ast_serialize-0.12.1-cp315-abi3.abi3t-musllinux_1_2_armv7l.whl", hash = "sha256:657a7354ea16ed4d29f8127ed477c6fee3915c111d135f020ca835a991438e90", size = 1562328, upload-time = "2026-10-03T12:24:12.404Z" },
{ url = "https://files.pythonhosted.org/packages/8a/5f/3d40f6a7908200f2f0ed9ce1bad130d00e06d0405baa7918d4a4299b25dd/ast_serialize-0.12.1-cp315-abi3.abi3t-musllinux_1_2_i686.whl", hash = "sha256:9eb9de7e59621acdb3e66984f374272b33d56d15a04763e2fd0604211e1c8303", size = 1557751, upload-time = "2026-10-03T12:24:14.455Z" },
{ url = "https://files.pythonhosted.org/packages/3f/13/d53e5a7e299d6dbaeab23a424eea2c98c821b46ed7b05abbe14743beeb63/ast_serialize-0.12.1-cp315-abi3.abi3t-musllinux_1_2_ppc64le.whl", hash = "sha256:09cc4d3103c1fc97f6845ba307af1db9cde5226bef47f8843220dde83f2276ba", size = 1666238, upload-time = "2026-10-03T12:24:16.171Z" },
{ url = "https://files.pythonhosted.org/packages/37/5b/7638ee3ae35a64e4467160a37dc7565cddfe2a87f06cef2fd07c93cfd503/ast_serialize-0.12.1-cp315-abi3.abi3t-musllinux_1_2_riscv64.whl", hash = "sha256:c9e2a592706fd791c2271ce9c8f4e38c98d3ea0b4a86b511e09a4fe3ac44ab37", size = 1472620, upload-time = "2026-10-03T12:24:18.053Z" },
{ url = "https://files.pythonhosted.org/packages/fc/e7/6e9e621e0e4a3be5a9a5f8b6961982964d2367013dbe64feb5adaa43e56d/ast_serialize-0.12.1-cp315-abi3.abi3t-musllinux_1_2_x86_64.whl", hash = "sha256:f4ac042e95a575432c1730ca4cb9183066a2074886a599f46c1f1b0955fb8198", size = 1500141, upload-time = "2026-10-03T12:24:20.036Z" },
{ url = "https://files.pythonhosted.org/packages/4a/4f/3217da5b671711c09cc6be580095839cad539983662a6599405bd75c1a19/ast_serialize-0.12.1-cp315-abi3.abi3t-win32.whl", hash = "sha256:b3cd105995942cc6163a229674a86161ba1305f646493efd59bd6723a357ee14", size = 1118382, upload-time = "2026-10-03T12:24:21.599Z" },
{ url = "https://files.pythonhosted.org/packages/80/1e/6074cf29dca8ceff27d50e845c88e7a2eaaa7f0b6f3972909e878d844737/ast_serialize-0.12.1-cp315-abi3.abi3t-win_amd64.whl", hash = "sha256:a9cd24a26126088693ca054547ea0a391398a29cf1a3a2bec1009b4b6acc8b82", size = 1158034, upload-time = "2026-10-03T12:24:23.316Z" },
{ url = "https://files.pythonhosted.org/packages/92/a0/81ce428f9f3f1ca45f8b62c9711c30452bf8190476e8685cea0f72d8d008/ast_serialize-0.12.1-cp315-abi3.abi3t-win_arm64.whl", hash = "sha256:9649cd903db0dc047906c6dd740784a2ba665d54f7e43ba31457edbce76c9493", size = 1129437, upload-time = "2026-10-03T12:24:25.044Z" },
{ url = "https://files.pythonhosted.org/packages/3a/d9/1c08adb90728607d0d07d188df4558ae863d688b4458087efe9fafeca458/ast_serialize-0.12.1-cp315-cp315-pyemscripten_2026_5_wasm32.whl", hash = "sha256:5ef62601db3ce5c23445132262a193075e211fb2fc87b46b7550dd351fac0976", size = 897419, upload-time = "2026-10-03T12:24:26.699Z" },
{ url = "https://files.pythonhosted.org/packages/80/fb/1eabd2c0673283054468b1c6cb539aeb877636d6c84b280279f2d7a177a9/ast_serialize-0.12.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:98d91cd3a6cb76a39512ee090a539d1e3206b732ad8150eb38918cffa1ddf515", size = 1241515, upload-time = "2026-10-03T12:24:28.493Z" },
{ url = "https://files.pythonhosted.org/packages/1b/d7/c56955934a431a0fa3e4e9aa7af4a53ceab2a61241005427545208945eb4/ast_serialize-0.12.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:8a32f184ce3e4b1d0b06d642a1243281cf55b99e0323680b1b8f904029fd7700", size = 1228048, upload-time = "2026-10-03T12:24:30.556Z" },
{ url = "https://files.pythonhosted.org/packages/1e/4e/2b2ca4602baf92f842316ea617423402089df4fbd2ea42571ba28725ba46/ast_serialize-0.12.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e62126ac2be2d9340ac1b3ee7a0466a883ecbed634cff0929c88ca0b671483b7", size = 1292087, upload-time = "2026-10-03T12:24:32.45Z" },
{ url = "https://files.pythonhosted.org/packages/d9/49/9ebd05218a87ca31f4f855d5e3df14239bba3c58f2aed9d02c7cba5d94f5/ast_serialize-0.12.1-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0f93a70fa9826c04ea9f2c3a880f87f4cca09a828144ed5084682abd28110980", size = 1295355, upload-time = "2026-10-03T12:24:34.423Z" },
{ url = "https://files.pythonhosted.org/packages/dc/09/6db7c4327e7a56aba805f7190d377a159fc0bf6bdefb410dc7860624dfa3/ast_serialize-0.12.1-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1858887be56a64a2aea899423dfe43787c34c75c18b0d7497de8e618d54b2790", size = 1541231, upload-time = "2026-10-03T12:24:36.05Z" },
{ url = "https://files.pythonhosted.org/packages/ed/85/7ab6097e5fe23cd4657b0e5a2fabb4f789f91e441a3ee40b3ca8b79be238/ast_serialize-0.12.1-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:89a2bc39a820bc7785b60c53a5742b4e8dd4c1a599294e2dd68fae545883d44a", size = 1317324, upload-time = "2026-10-03T12:24:37.737Z" },
{ url = "https://files.pythonhosted.org/packages/c0/60/58961e7fd129e226ce36788fe328d20034f3105f5d3380df690050517737/ast_serialize-0.12.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50a9eaedf1db4857dad7cc47dd757ed70bfcc40b89d44d516c4a2f0d5033bd76", size = 1311809, upload-time = "2026-10-03T12:24:39.306Z" },
{ url = "https://files.pythonhosted.org/packages/15/c7/09d973db87d4575cba470fd80a3fa489322f7d6882546e43a4b21012468e/ast_serialize-0.12.1-cp39-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:c30b609e8fea426b310543126de876592236a25aa8ebd59f1e2b323dd52a4085", size = 1306678, upload-time = "2026-10-03T12:24:40.891Z" },
{ url = "https://files.pythonhosted.org/packages/84/27/84f69c22bcdaa5256b4fe43ff972fc117668fff8e68495807d5792eadcce/ast_serialize-0.12.1-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7b1ad06513022cfa1337744959255af0ef16119d2beb1e547b67f37ad9433d4a", size = 1362009, upload-time = "2026-10-03T12:24:42.809Z" },
{ url = "https://files.pythonhosted.org/packages/43/46/76ee342ef22cd6d82ccd6089d5e2f7163246de73d1816ccb4b6ec0550db6/ast_serialize-0.12.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6add54b495e37ae3cf3a1f0d5eaba364814eb72e93026adc41b7791e4b0d45d3", size = 1467959, upload-time = "2026-10-03T12:24:44.496Z" },
{ url = "https://files.pythonhosted.org/packages/31/4d/18e48154bbf6058eed8d9b54fcebb2e130f8a380db1a2a202b4faac48626/ast_serialize-0.12.1-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:5fc136cd08001b817ad0b3e7426f50a7d2b8982dc7c6491f0af78af4c3dd8672", size = 1571157, upload-time = "2026-10-03T12:24:46.156Z" },
{ url = "https://files.pythonhosted.org/packages/34/76/6b16ddf0510e713613a5f5441b13407c1bde6158df04946b9f1fdc65add3/ast_serialize-0.12.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:45a9e6b700bbd973d49942668a5cdbeffa693f2e250b8a5409abd1fa9d351854", size = 1566873, upload-time = "2026-10-03T12:24:48.542Z" },
{ url = "https://files.pythonhosted.org/packages/75/33/9f6169ae7f60c2da4baec03450073d3f1edb39e95ab538be0d25a7d2f72e/ast_serialize-0.12.1-cp39-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:a1d8267f83c613ea0a31f2518df074bd62e98a4b3a4892f6a529d74e08e02dba", size = 1673030, upload-time = "2026-10-03T12:24:50.566Z" },
{ url = "https://files.pythonhosted.org/packages/11/51/0d78755bd61d6cf8980f0cfdc7fa8ede38df46a5423c9f7a3da0cff587ec/ast_serialize-0.12.1-cp39-abi3-musllinux_1_2_riscv64.whl", hash = "sha256:9a0cbab9796e6ce841197feeba4008faa96b4cc7741129542fd81c882d7a4f01", size = 1480052, upload-time = "2026-10-03T12:24:52.277Z" },
{ url = "https://files.pythonhosted.org/packages/01/ae/ad4c0e5129991f2761f388420c5ded37cb134ec5882e3e59043d33c1ad87/ast_serialize-0.12.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b4282695f1d51a3c6ef76560351bad5af880eff7d755aefea325bffb9bf68c25", size = 1508940, upload-time = "2026-10-03T12:24:53.846Z" },
{ url = "https://files.pythonhosted.org/packages/38/6b/3299182794d38815ae6e9c7ede9bb8f2e4aa93c3578bed201c1ea746643a/ast_serialize-0.12.1-cp39-abi3-win32.whl", hash = "sha256:119d1b0cadaba4a6e475f9bbe79eecc79351e373142eabe7c353f0250d70aebb", size = 1125618, upload-time = "2026-10-03T12:24:55.405Z" },
{ url = "https://files.pythonhosted.org/packages/86/14/5d4fb733c18a1d69e237c067b183842f3a7ea1c999a51ddc87093a281c88/ast_serialize-0.12.1-cp39-abi3-win_amd64.whl", hash = "sha256:3d6ed63d4fc1ec867b8cb522d58c36df0e8f05e487bea0ffd102043a37636d72", size = 1165798, upload-time = "2026-10-03T12:24:57.052Z" },
{ url = "https://files.pythonhosted.org/packages/f1/f4/b54123680025c0b7253117418f023d1b2487f1102552acbdd9d8ee96b622/ast_serialize-0.12.1-cp39-abi3-win_arm64.whl", hash = "sha256:610a41351de68199de9a1434499083b4256c0df7658ec1cfc0a0a7b20b08d317", size = 1136560, upload-time = "2026-10-03T12:24:58.689Z" },
]
[[package]]
name = "async-timeout"
version = "5.0.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/a5/ae/136395dfbfe00dfc94da3f3e136d0b13f394cba8f4841120e34226265780/async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3", size = 9274, upload-time = "2024-11-06T16:41:39.6Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/fe/ba/e2081de779ca30d473f21f5b30e0e737c438205440784c7dfc81efc2b029/async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c", size = 6233, upload-time = "2024-11-06T16:41:37.9Z" },
]
[[package]]
name = "attrs"
version = "26.1.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32", size = 952055, upload-time = "2026-03-19T14:22:25.026Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309", size = 67548, upload-time = "2026-03-19T14:22:23.645Z" },
]
[[package]]
name = "cffi"
version = "2.1.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pycparser", marker = "implementation_name != 'PyPy'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/9e/ef/008a1939e372c06329a3fce4279c02f328488f3526744906eeec3da7ad5f/cffi-2.1.1.tar.gz", hash = "sha256:dd31f52ea1086513bb9df30f8fcee9b8918323ae067a3d5b78bc826a000712be", size = 530807, upload-time = "2026-08-03T21:21:18.939Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/70/d2/16d99a0c4948febc0ebd133a13b2f688ff7f8cb04da971e1128872ce0c03/cffi-2.1.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:c8d2c9fd1f2d16f780d15127abb050d13d1a76c03a4bd87d7e4980e45e511e12", size = 183838, upload-time = "2026-08-03T21:19:29.637Z" },
{ url = "https://files.pythonhosted.org/packages/cd/95/31b535a9f0220ae9f357de4a08d57ce89cb417653c2fd9f075f50822a388/cffi-2.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:398aff33cee2767e3e781d2554c54bd0dff386bb437581e0d8011fde1a942ec1", size = 184168, upload-time = "2026-08-03T21:19:30.764Z" },
{ url = "https://files.pythonhosted.org/packages/ad/5a/4707a0dc1f203f5dde5a907b0d4e3c25d71120241048bd5bc6f1bb9d4e71/cffi-2.1.1-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:154852545011f779917b11c78db2358d095da62a9a172b78ad0a583ee5adc0d0", size = 211805, upload-time = "2026-08-03T21:19:31.867Z" },
{ url = "https://files.pythonhosted.org/packages/ad/66/c19feabb28485b6e0bbaaafa90837a1ef5d302e90f2178bd33f17a49879b/cffi-2.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3311ed60d36f83378794e1009ac6258bafbf81f7888b4caa7b35a521e3f95813", size = 218716, upload-time = "2026-08-03T21:19:32.896Z" },
{ url = "https://files.pythonhosted.org/packages/a7/92/500760486c8baab49a7a8a58ba7fc3355ec3974b454b8a09e528efde9e1d/cffi-2.1.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6e192623c49c94421616a5778fba35cf0d5a8d000650c1967ef4448ee5cdd990", size = 205569, upload-time = "2026-08-03T21:19:34.142Z" },
{ url = "https://files.pythonhosted.org/packages/a5/a7/a67c733254d6e7373f7822f8082d8d6beade791e0cf12a7611f376fa61c7/cffi-2.1.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a6e721d4b0e45d5b65e87534470e67b18dcd092c83f68fba09f152b9cbc061af", size = 204907, upload-time = "2026-08-03T21:19:35.174Z" },
{ url = "https://files.pythonhosted.org/packages/f7/a4/4399daaf8f7dfee9d7c3327fdb0426ee041cc63edc358b93911ceb2bfc7a/cffi-2.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:34e261f78cb6ceaaa36f42f2613f4380d94d9c759a9c73c769ee6e0247364632", size = 217807, upload-time = "2026-08-03T21:19:36.286Z" },
{ url = "https://files.pythonhosted.org/packages/28/f7/dabe6da2466ecbd82dc62e7342dc6b1065dad990c06f00f0ede9ebf2a0ed/cffi-2.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7225e4514edb64eb6740324353e0da0711954fd8d7da4576755b1c6e09b697cd", size = 221252, upload-time = "2026-08-03T21:19:37.416Z" },
{ url = "https://files.pythonhosted.org/packages/ce/87/616202d8e51342c07d2534c510111c4cc37201775ce8f60802c9335d1edd/cffi-2.1.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df913725b79db7bcf03448f36b7bf8815363417d5b58deecf9305e3e30f0f21a", size = 214214, upload-time = "2026-08-03T21:19:38.507Z" },
{ url = "https://files.pythonhosted.org/packages/b4/c6/ab025d75d2c26c19b087c0124e75ee31cb65032f4fe345d356d8c507ab97/cffi-2.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f5cfbc5fe74540d335175b656c725d74d90e3730c626d92575eea35029d9afaa", size = 219408, upload-time = "2026-08-03T21:19:39.809Z" },
{ url = "https://files.pythonhosted.org/packages/db/e2/7e8109f65445bdc673a7b54f02c677de462db75674220fd1335efc8eb598/cffi-2.1.1-cp311-cp311-win32.whl", hash = "sha256:f8ec5e643a9a937f64e1999eb9f75d072263751912dc5cd06d3c85f8f44be7c3", size = 174470, upload-time = "2026-08-03T21:19:41.246Z" },
{ url = "https://files.pythonhosted.org/packages/73/c0/77ba02423c2f7d7091143c45cd49e0e6575c4c1967394bb542bd923a9b74/cffi-2.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:42f6930c31dc7f50732c9ae793c2786c7b6b044195967bbdde40bb9be81c4cc0", size = 185096, upload-time = "2026-08-03T21:19:42.615Z" },
{ url = "https://files.pythonhosted.org/packages/7c/47/9f1f85f9672ceda4984dc6c4f8824e8558992a2972c3d3c81fb8eb28d4ba/cffi-2.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:c7659f22557c5a0bc4855cd635f55edec690cc008a40768527762cb9fb263455", size = 179941, upload-time = "2026-08-03T21:19:43.747Z" },
{ url = "https://files.pythonhosted.org/packages/10/69/43965eccfdead3b9220015fd1320e117be8c6ed01a62ffab76eeb752f5d5/cffi-2.1.1-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:c8c69575568085ba0b1b10c0249d779a214aea6f6522e949a0fc9fb0fcb449d0", size = 184821, upload-time = "2026-08-03T21:19:44.887Z" },
{ url = "https://files.pythonhosted.org/packages/54/7d/16e5a096677b5e313ca80cd5e5170efa3ea44624a82bb111925522da64b1/cffi-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f81b3b8f3d4e343550fa4baa0e479bba9f2d29ce9c2e9b51d1ce1718d7442fcf", size = 184719, upload-time = "2026-08-03T21:19:46.129Z" },
{ url = "https://files.pythonhosted.org/packages/56/e6/8941622732edec876dd17d0453dce07317ae96db34f2ec1436c9d3785986/cffi-2.1.1-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:811bd1e21d32de12efca32393a0ab3f5133b54fce9bd44b8bd77ab07da14bf6a", size = 214799, upload-time = "2026-08-03T21:19:47.218Z" },
{ url = "https://files.pythonhosted.org/packages/44/de/f98430906df1545ffde0d543dd124a7a439bc2cd32b36b9c53f805df7333/cffi-2.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:68e62fe11f30d5ca8289242866f0a5291402d8529ca2178ab8afc5c9694ae890", size = 222389, upload-time = "2026-08-03T21:19:48.331Z" },
{ url = "https://files.pythonhosted.org/packages/6a/5b/717f1526b9957b34456313c31645c5b82b8fb5c3fe9e4752999be7128bfc/cffi-2.1.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:4a7c934f7360e8cd64fe9efadcbd10c7c6364f531e432b9a4bf5ccbc9e0e8b50", size = 210249, upload-time = "2026-08-03T21:19:49.543Z" },
{ url = "https://files.pythonhosted.org/packages/64/b3/f8aa4f3e34986c7e4ec45072d1b1b9dd295b6b18007b45518d79726dd725/cffi-2.1.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:3143d81e29e1e20a9ce10901ec369012947876596f75a222235965f2b7ae832e", size = 208775, upload-time = "2026-08-03T21:19:50.918Z" },
{ url = "https://files.pythonhosted.org/packages/b1/db/dceb9dd5b231e1da801793f8acc9f3c52a7e1afe40bb1aae37e02b0faad5/cffi-2.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c1453022f490d2459a11819d83ad1d586e9ff65a12ac3e705ffebd46d3685dcf", size = 221822, upload-time = "2026-08-03T21:19:52.054Z" },
{ url = "https://files.pythonhosted.org/packages/a0/d2/6cd24ae3be000a634109c247d1475d62e5616d0dc78c82770942ec384248/cffi-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:208f941bb9d18e768138677f0a6d2ce01f590df56043dda1df1535ac57c88517", size = 225232, upload-time = "2026-08-03T21:19:53.109Z" },
{ url = "https://files.pythonhosted.org/packages/cb/52/3fa190537004dd7f0ab860a6dc7c0175b8667f68d1e618a46f5498d30250/cffi-2.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:210019b6c7cf07f081b4c54635c8cf744377001350e29cc0f81c4377b4797735", size = 223597, upload-time = "2026-08-03T21:19:54.515Z" },
{ url = "https://files.pythonhosted.org/packages/80/fb/0bb75b7039588c074b37ae99f40d9bfddf990ecb2fbc346ebccd2e56b9be/cffi-2.1.1-cp312-cp312-win32.whl", hash = "sha256:046bfc24911b37851ee1b51aab8bffe713d89c68c6a057b09484ce9fd5f69b4e", size = 175292, upload-time = "2026-08-03T21:19:55.566Z" },
{ url = "https://files.pythonhosted.org/packages/d9/79/615cc094e2fb508cade7de88d3b4f6c4ec2bab695c97bce9153dc65aadf5/cffi-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:f53e442b08449d42821fa4a4fba000095af9f62742a500f978a9f557ec44339a", size = 185919, upload-time = "2026-08-03T21:19:56.89Z" },
{ url = "https://files.pythonhosted.org/packages/70/c6/d0ea84713fe46b243a436a18fcd47d639732747e21635c8a27191b06dc30/cffi-2.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:7bde5e4cc5c10140859842b9d383af292b22639a4dffb725314baf45968cef80", size = 180093, upload-time = "2026-08-03T21:19:58.155Z" },
{ url = "https://files.pythonhosted.org/packages/9d/f4/035513d4117049066b4779dc3b7c0c0fdad175fa13731c9f4003f1cd1478/cffi-2.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:b5bdfd1c873d4e093aabc0ca84c4ca6dbc4f752afb5c86f146d9742580c9da2e", size = 194248, upload-time = "2026-08-03T21:19:59.399Z" },
{ url = "https://files.pythonhosted.org/packages/76/af/2aeb4dbb5fc41a04161ae9ff1518de7cec08e164f44a8ce6a4cf7fd2cd1d/cffi-2.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:31348097ff5bbe827ccc41795d4dd099d9f0625e7def00ee653c137a490c2a6c", size = 196908, upload-time = "2026-08-03T21:20:00.746Z" },
{ url = "https://files.pythonhosted.org/packages/a7/46/2e5fdde8555706dd98139a910ca11be02809f3f605ce956f655d0214e100/cffi-2.1.1-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:9d2055050ea716bd38b7f7f1579c275386646b4894c155a3e2f3cd62ed41b7c6", size = 184805, upload-time = "2026-08-03T21:20:02.02Z" },
{ url = "https://files.pythonhosted.org/packages/55/41/4c7042f317b9217502988f0873af87e16ad606dc20f84e546e3e6ce9764c/cffi-2.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19ee6127ee34de7d83ce3d371ebc5ed91addbdcc39f9ab15ce4eb35a4e534971", size = 184764, upload-time = "2026-08-03T21:20:03.141Z" },
{ url = "https://files.pythonhosted.org/packages/43/1f/1c3d90d91811c8f86ced9ed637956c54bfe5b79ca98fe976d7f8c8979f6b/cffi-2.1.1-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:6a8dddef476fab96d066d578fc88526767b836ab5ab21754e1d5bf3879c31c7c", size = 214722, upload-time = "2026-08-03T21:20:04.377Z" },
{ url = "https://files.pythonhosted.org/packages/37/6f/3b5ce4c3b2192d250f04908f2bfd91ef34552ec8f7716a5d4abdb8d67bb2/cffi-2.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f16c709686a78c727bbbf059f92b0bf41c6fc60deec706d2dc19f529175a6125", size = 222369, upload-time = "2026-08-03T21:20:05.544Z" },
{ url = "https://files.pythonhosted.org/packages/02/10/4b3c75dde3d9663c9e02ba05c2668b954f671d4bbe346413ca8c696b295a/cffi-2.1.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:fcd22650c908d7b7da162bbfaab594a1227a15d1643a98c68b122ac642fa2264", size = 210175, upload-time = "2026-08-03T21:20:06.75Z" },
{ url = "https://files.pythonhosted.org/packages/df/62/14f74b9543e605d17701dc797b815958b8bb70b7624ce1b832ddad48ed6c/cffi-2.1.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:aa9511c62d14da7aacc9b4bf51f3f697a621e83b2d6919008243c3aad168eea3", size = 208670, upload-time = "2026-08-03T21:20:08.04Z" },
{ url = "https://files.pythonhosted.org/packages/95/95/86342356ff5953b3fb06f7ef7c5bee212d45e770abc7218d451b9148313c/cffi-2.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a931079504ecc49efed7744c476a5c343a92fabf66dec2db95edb1b2fdc770e2", size = 221824, upload-time = "2026-08-03T21:20:09.274Z" },
{ url = "https://files.pythonhosted.org/packages/eb/ff/7b3429ff53aafe931ed8a5fc69f481bbef7ba6de87ddcbb63d08f483f613/cffi-2.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a2d7755bef5a12ed488f4ef1f1b69ee9191d7396083b755a5d2295f6edb4768b", size = 225148, upload-time = "2026-08-03T21:20:10.7Z" },
{ url = "https://files.pythonhosted.org/packages/34/34/a95870b9221e09cf4f2ce3178b1a210abdfe63a1bd357da940418d7b8d15/cffi-2.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e0bcb7e0f677f543555d2adff3bf19c05f66cdb4796e5ff602442ab2fe3c4ef7", size = 223564, upload-time = "2026-08-03T21:20:12.165Z" },
{ url = "https://files.pythonhosted.org/packages/70/ea/839b50531021a647fb5e929f72cf97bc1ff702b5472166164b5b6e76b851/cffi-2.1.1-cp313-cp313-win32.whl", hash = "sha256:334644fbac4eff73d985a17a91226df55d0f394160c4cfb880e084c8f7161cac", size = 175263, upload-time = "2026-08-03T21:20:13.559Z" },
{ url = "https://files.pythonhosted.org/packages/60/a6/8b149b2c3f2e11aaa1618ef64500b45f50f22c57a977a4dff1aff1f91042/cffi-2.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:1aa5645c30469b09530c4ebca77ebf8f17618293c58f8549cb1a543a50236e7d", size = 185688, upload-time = "2026-08-03T21:20:14.69Z" },
{ url = "https://files.pythonhosted.org/packages/01/9a/11f687cb39d6a3504060d5242f04f48c735afb4d3d533958a20594890cb2/cffi-2.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:63bbfd5ded17c4840ac07cd8f1c21ba9d9708141f840b324f422f41b207e3973", size = 180078, upload-time = "2026-08-03T21:20:15.917Z" },
{ url = "https://files.pythonhosted.org/packages/d3/7b/d6bbf82b8b96e7391438898c42f5bd96dd02030fd5b64937d248220003e2/cffi-2.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:7dbb61fe3a7699468030f71bbe5f8a0e326a151daa91beb11a6fc1f980c55e1c", size = 194064, upload-time = "2026-08-03T21:20:17.148Z" },
{ url = "https://files.pythonhosted.org/packages/94/e6/bcc91b283be94735e268487a054004f0aa19947b6348fa367db53230abc8/cffi-2.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:f24fb43132a4c6b4cb4eb029492919b2db645be6808d738f244fd146c03c32cb", size = 196720, upload-time = "2026-08-03T21:20:18.268Z" },
{ url = "https://files.pythonhosted.org/packages/d9/99/c4b0c17cacdc9c3b8f280026286a9826d6a208c0f047591a3c3ce99b91fd/cffi-2.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d28630f5854ab07ab1fd4aba756de52326c82e6be15d414b12793f1975048b54", size = 184964, upload-time = "2026-08-03T21:20:19.708Z" },
{ url = "https://files.pythonhosted.org/packages/b3/a9/9db617d05d7367c1ad0ab00b3aa6e6f9281edd689b4ee9ea0e5a84e89c97/cffi-2.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:661c298b4821edebead0c91edd2b00374d67ad7c5a1f7a91d4442633b79d6a72", size = 184962, upload-time = "2026-08-03T21:20:20.833Z" },
{ url = "https://files.pythonhosted.org/packages/67/b8/b42132ca113dc567d37684437b46ca1dafc885902b02a110a02d5b511857/cffi-2.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58acb8ab8e295e6c5ea12f888cbb13cf21511ef2a3303a23f4325c29d17fe5c1", size = 222328, upload-time = "2026-08-03T21:20:22.118Z" },
{ url = "https://files.pythonhosted.org/packages/80/10/c5c0cbf0a657aecf59ef511409734230bf556f05a0d6c9eed7aa5c0a0166/cffi-2.1.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:456a61fa52d579ebf9df2e9552ead5129855dbaff6c1e5a9b1bc408809bdc062", size = 209985, upload-time = "2026-08-03T21:20:23.401Z" },
{ url = "https://files.pythonhosted.org/packages/d5/6c/bfa0b87b03b9238148beca990292843c9396ba069b54496596594173de7b/cffi-2.1.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a4f00aa42f75d6e4595e8866e748cc1705adc0cddfeb2ca86d0d03993d63ba03", size = 208530, upload-time = "2026-08-03T21:20:24.628Z" },
{ url = "https://files.pythonhosted.org/packages/e9/02/4e7d553a7ac4b4238b38b3c1b80d486e9d4436f8d2acbf87a0997fe3f402/cffi-2.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b0431303acaea1089ad4b3e9ce4e6518193def1118d4073ca848635ee4ea2e96", size = 221525, upload-time = "2026-08-03T21:20:25.758Z" },
{ url = "https://files.pythonhosted.org/packages/82/1d/a4aaf9babd75acb4d5f223bff71533bee748dd770a382619a798960ee9ba/cffi-2.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:64faea20f4e2613363a1a9b9c7dd73058f3ecd00133a511e72ad7c511658f527", size = 225053, upload-time = "2026-08-03T21:20:26.985Z" },
{ url = "https://files.pythonhosted.org/packages/81/10/5dc0e7bdd18e22107054288283380fc97a06ae3f1656a106908d666a3c88/cffi-2.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5c58fe613dc5e5336357eff555824a314d8e43282600435c8d1cb6a7a2fedd13", size = 223213, upload-time = "2026-08-03T21:20:28.277Z" },
{ url = "https://files.pythonhosted.org/packages/0b/e9/d0061c364cde06ee43168a0d076ac1da512cbc380d44767b844ba34fe2b6/cffi-2.1.1-cp314-cp314-win32.whl", hash = "sha256:1a18a57b58cfb21fc28d72e876acf10eaed67a1ed96226f92af4df681d571c4c", size = 177682, upload-time = "2026-08-03T21:20:44.288Z" },
{ url = "https://files.pythonhosted.org/packages/a7/06/1c3e01e3ba14c39f6d10bfbac52753b7e22259e38088e5cfe1d704918690/cffi-2.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:3222ba5d678f80a030e6afbcc33dc1ae5cb45facabb61cee2c7016b8432fde48", size = 187949, upload-time = "2026-08-03T21:20:45.623Z" },
{ url = "https://files.pythonhosted.org/packages/87/5b/da4e39efe18eeb89cf580ea9cfc66b6a7c3eadb808fc0cc1d3a295cb5a5d/cffi-2.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:ab36d55f9ed2d067327667c2fea18dda018eb628dd6347aa01dda6cf1f5d3836", size = 182947, upload-time = "2026-08-03T21:20:46.955Z" },
{ url = "https://files.pythonhosted.org/packages/23/59/40338bf421c5accea1d45158170c87006ef1cd371b05c077e76476949728/cffi-2.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7750c6449dff7864bb9bb27ddfb0267756189201a3afc911d82b3caacd70dfc3", size = 188504, upload-time = "2026-08-03T21:20:29.495Z" },
{ url = "https://files.pythonhosted.org/packages/7d/47/5ecf1023850036e674c77ec4de86182d309ae344e39e7cba984b7df5d647/cffi-2.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0beceaabe56af686895136a2de78db54ecd8e4046b236b8fd6d6cb61389e9bf2", size = 188259, upload-time = "2026-08-03T21:20:31.291Z" },
{ url = "https://files.pythonhosted.org/packages/2a/9c/92934c3bea9f785b23eba304538c0b4d37a2a96d2431eb3a1bc87a11aa19/cffi-2.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:49cbc70e6542d4ccccb936558d1064a8012541e78f821f955cff24e357776c94", size = 223864, upload-time = "2026-08-03T21:20:32.571Z" },
{ url = "https://files.pythonhosted.org/packages/4d/45/ba4c93527bc38616a8bd36488acb69a2212d60486794f0c1f318949bbb76/cffi-2.1.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e2d65b31f36619cda3999b78b2aa9632e76b78448e7a56fc4240824200e7c4fc", size = 211538, upload-time = "2026-08-03T21:20:33.808Z" },
{ url = "https://files.pythonhosted.org/packages/80/e9/b6ef565e452acb932fb0cb5443f44a78efbd1233e566f02b5a83855e9115/cffi-2.1.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:28907ab9bfb6aa13184cfc17c6b8e1023c5ab6fd7076d8c20a35e59fe04f8f29", size = 210688, upload-time = "2026-08-03T21:20:34.974Z" },
{ url = "https://files.pythonhosted.org/packages/9a/95/eff5f0cee78d2eabc7eebffec40d3fc1876b5f3c95582e018bb4b99601f2/cffi-2.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51b31d1c98274844cfd7838ce00bfc27c7423a4dc00fc0772fc3331c2cc90676", size = 223803, upload-time = "2026-08-03T21:20:36.564Z" },
{ url = "https://files.pythonhosted.org/packages/fa/01/579d39fb8bef00a335a23d83757b44feb24cd6345a2c451b64cb67b9c362/cffi-2.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e7cecbaadb83884793e05828cee59b210b24583b9c7425d0ba6a754fe22eb4e", size = 226763, upload-time = "2026-08-03T21:20:37.816Z" },
{ url = "https://files.pythonhosted.org/packages/8d/b0/0b44f47c60b01b57b6e2bbd92343f13a85a1d93bc46ccf6e47e244acd99c/cffi-2.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:25792eac27877609e7bb06d42ff88278a6624fff2ba9bbb523c09616b117e80f", size = 225688, upload-time = "2026-08-03T21:20:38.959Z" },
{ url = "https://files.pythonhosted.org/packages/eb/d2/3b7176cb570a1d3e27faf67b72f591af508036e0d8b2be2ef9af9e8c84bb/cffi-2.1.1-cp314-cp314t-win32.whl", hash = "sha256:8ef53b2de9bcb9197d31854256575d59dbac0cba72ac627bb291ef5eceb74be4", size = 182868, upload-time = "2026-08-03T21:20:40.388Z" },
{ url = "https://files.pythonhosted.org/packages/56/78/31f00c1bcd97c9bbf55f1bfdf5bc809a5de8887473e90bb9960dca825e80/cffi-2.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:616f097f2fe415bc92a247f02e11f634e1f9e9a83d327e3c915c15089c87869e", size = 194104, upload-time = "2026-08-03T21:20:41.725Z" },
{ url = "https://files.pythonhosted.org/packages/7b/1b/58496f2ed0a35de575250c02a43ab3cc2c04d494a88fed31c1cabc0fd176/cffi-2.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ad2c86c495b899d862ea0f4b42891b8713a3bd45dd4105c7fd51c2a72f39f3a5", size = 186402, upload-time = "2026-08-03T21:20:43.042Z" },
{ url = "https://files.pythonhosted.org/packages/c1/8f/9ebe220eab48a093d1a5a5e339ab0dc7316eef3bb04d63c42f0251b61f50/cffi-2.1.1-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:dddad92b554513a31f272570678ba307fb9f618f05e3d4a5eacafff9eae03e1d", size = 194043, upload-time = "2026-08-03T21:20:48.179Z" },
{ url = "https://files.pythonhosted.org/packages/ff/69/844bad3ece306c4782c2ecb93597035b6690d48704b803914c199da1e8b3/cffi-2.1.1-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:da0e573f9f97159390c89d9f1a9e41908b66d408cc5b58d08cf3847d844c531b", size = 196737, upload-time = "2026-08-03T21:20:49.457Z" },
{ url = "https://files.pythonhosted.org/packages/1b/8a/af668013284634733f02d683458a0728739c7d6ddb5e14cb0c20832266fe/cffi-2.1.1-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:fb92203a88b3d3053034db775110081c49d28be6551923805e039924093761e4", size = 184933, upload-time = "2026-08-03T21:20:50.639Z" },
{ url = "https://files.pythonhosted.org/packages/0c/75/2f5207ff6d1a613133b23a5203cc0c2a628313b5eb3974d7956ae3c57950/cffi-2.1.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:2ae64be792b8966f2c69538199728b290e34726562896df1e5dc8ffd8d8188e8", size = 185002, upload-time = "2026-08-03T21:20:52.173Z" },
{ url = "https://files.pythonhosted.org/packages/e2/31/9e1313b0a6e30e91b3b3d3fff51ae99c857c07738e3afcce1f7334e1b7ab/cffi-2.1.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:507a24c282e0f42f8ed737cf048572cbf580468da5555764a8331735e9c736b6", size = 222271, upload-time = "2026-08-03T21:20:53.462Z" },
{ url = "https://files.pythonhosted.org/packages/50/e3/f6234a833e6e08c7007003074723c406559eecf9b48dfc97471e5a8eb7a0/cffi-2.1.1-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:246fa40ce8645a614ff682e0b70f37134e460eaf93a775e0cbe3cca585a67a80", size = 209919, upload-time = "2026-08-03T21:20:54.783Z" },
{ url = "https://files.pythonhosted.org/packages/0d/fc/5f74e293fced6edb51af3a46c4ccf6c23c9943774ecb375ddbd522c76add/cffi-2.1.1-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:471cee653ae88de62096552e6d24ccb4a5adb8c8c9f10b5054d0122c15bf2779", size = 208529, upload-time = "2026-08-03T21:20:56.066Z" },
{ url = "https://files.pythonhosted.org/packages/44/16/29e6d01b388bef055ecd6ca8244b3f4d336bd09e92d5d892187b9601084e/cffi-2.1.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aeae0e330c9f6acd681f647d46cefd30c29f93e3392882e792e82080c9691399", size = 221630, upload-time = "2026-08-03T21:20:57.336Z" },
{ url = "https://files.pythonhosted.org/packages/a4/18/fa7f1f6857d5eb88a4ca99ffcbfb7c387a287ccc154c64a73e86314745d7/cffi-2.1.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:42a494cee34437f05546455144f2b5d9ac09b1face62bcfce597d2e521066688", size = 225134, upload-time = "2026-08-03T21:20:58.675Z" },
{ url = "https://files.pythonhosted.org/packages/e0/9f/e8e3dfa04a1b4c241f8c91faacad872b4d4efd051d49764ad4e2fd4b9fea/cffi-2.1.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:cc572dace3f60ef98d7b12ff411d20f5362feb31a0439eab0085bbfd349982d7", size = 223197, upload-time = "2026-08-03T21:20:59.968Z" },
{ url = "https://files.pythonhosted.org/packages/f8/7e/8debeb04f1ab9fe2a6963964cd6f1aaf7192627b83926586a6a4e089c9fa/cffi-2.1.1-cp315-cp315-win32.whl", hash = "sha256:4f42141fc14250de6dde5ee7ea4432be017252d91f19c5ad043c084cea629cac", size = 177683, upload-time = "2026-08-03T21:21:14.901Z" },
{ url = "https://files.pythonhosted.org/packages/e0/31/5158704cc474ab65c1647932e88be78dc0873f47130e253be38bcaf13d01/cffi-2.1.1-cp315-cp315-win_amd64.whl", hash = "sha256:e6e8cff14d6fb0be70a09c0bdc58096f501952d04624ebf867e0e56da2df8960", size = 187897, upload-time = "2026-08-03T21:21:16.108Z" },
{ url = "https://files.pythonhosted.org/packages/cc/4b/b3a2da8570c704ffc0f9762cdc3ec0f02c8573798e0b5cf7f11c82bbb70f/cffi-2.1.1-cp315-cp315-win_arm64.whl", hash = "sha256:27350daa11d4f10c540e6e89dada4c54feb7256ad03e9a4dc075ebad7ba360d1", size = 182935, upload-time = "2026-08-03T21:21:17.271Z" },
{ url = "https://files.pythonhosted.org/packages/d0/ef/5443574510a1207e6f6bc38ba6e1f1de36cb48fef07b2728bb896a21f430/cffi-2.1.1-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:c26608d2222fb1e94487e4a387d85f13eb55d5ed725cb25a0c589ac4ee60e7bc", size = 188464, upload-time = "2026-08-03T21:21:01.163Z" },
{ url = "https://files.pythonhosted.org/packages/7e/ae/a56fa8c4686ad50e148fcbc8d3ae0d03915ff5c30d795058988c24118cef/cffi-2.1.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:4be96343e422f2dfcd12ab5c9f5aebe03f82f737c6bffeca6830b3875cb44aab", size = 188262, upload-time = "2026-08-03T21:21:02.382Z" },
{ url = "https://files.pythonhosted.org/packages/53/b2/6187f46f2912276a3ae284076109cc5c8680482f11f766ccf26db4a86427/cffi-2.1.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:937c0052c05a31ca1daf18de3158eed4dbfcb9cc107adbea227728d647be701e", size = 223779, upload-time = "2026-08-03T21:21:03.553Z" },
{ url = "https://files.pythonhosted.org/packages/8a/f6/c3ad28bd19f77047a03084424fbd4cbe997303267c14423737324be0385d/cffi-2.1.1-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:df423d40ee8654634421812bc3b196da3f9bd7d32929da813f8394c4348a5358", size = 211520, upload-time = "2026-08-03T21:21:04.863Z" },
{ url = "https://files.pythonhosted.org/packages/a0/cd/ccac9013a5bd9fd764de118674ab9c805b5ca10c19270d90ee273f8b2240/cffi-2.1.1-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a730a083190634c65cca36ba5f489531576ebd79bcd5c8e172130f6453127231", size = 210673, upload-time = "2026-08-03T21:21:06.223Z" },
{ url = "https://files.pythonhosted.org/packages/52/86/2976131c639aead931c5bee5aba67e4b09fbeb8018b6f282f70803f923a7/cffi-2.1.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:363e05fa78e15116c3c32c210ee36884fd6b9afa6d440e47112c3bd511d64cb6", size = 223835, upload-time = "2026-08-03T21:21:07.539Z" },
{ url = "https://files.pythonhosted.org/packages/ac/0c/33a7aeab2f9c76918c52e084beb39c570db3588133412929e8ec06fab90b/cffi-2.1.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:770de9db11e84213beec501cfcaa013b019820ca881e03344dea5844f7876d94", size = 226705, upload-time = "2026-08-03T21:21:08.774Z" },
{ url = "https://files.pythonhosted.org/packages/e3/26/2cde30fdde421130bfc18f70395731a6e6b2053c6a1978a5258ff04e72fa/cffi-2.1.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:7da0c5eff80f0197f3b3d1232ec5a682a9325f4ae9016a78f5f5ca35f9ced1f5", size = 225539, upload-time = "2026-08-03T21:21:09.911Z" },
{ url = "https://files.pythonhosted.org/packages/6d/cd/a361394c94b2129d604bb846f624a8e88255a3ee33129c434a00d715e64f/cffi-2.1.1-cp315-cp315t-win32.whl", hash = "sha256:06c72bb76605a4b0cd0aad6930b69d4baf7dd5d806cfc409b824191099700e66", size = 182707, upload-time = "2026-08-03T21:21:11.226Z" },
{ url = "https://files.pythonhosted.org/packages/9b/b5/ba2b299993c26577d529b6ae29841f9e15b9fcf004d65f423f4fcf94ade9/cffi-2.1.1-cp315-cp315t-win_amd64.whl", hash = "sha256:d9c275eaacd24aa73f94ffd6de08fc3f932424d8b6c376f4bed7cde376fe7bc3", size = 193772, upload-time = "2026-08-03T21:21:12.39Z" },
{ url = "https://files.pythonhosted.org/packages/aa/29/35e016098c814cd93de9cd320c66b5bfba14dc6ecedd3cb518fa7c408c69/cffi-2.1.1-cp315-cp315t-win_arm64.whl", hash = "sha256:d18e5ac0f2f03f4f518d3e23db0f0cad7faa1da8620e9c09461d443bbf6e6692", size = 186360, upload-time = "2026-08-03T21:21:13.636Z" },
]
[[package]]
name = "colorama"
version = "0.4.6"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
]
[[package]]
name = "cryptography"
version = "50.0.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "cffi", marker = "platform_python_implementation != 'PyPy'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/9d/af/182eb91b0df3fe75c4d9f26fe70684569566745f6ba7e5c9c73a862c5252/cryptography-50.0.2.tar.gz", hash = "sha256:7b46165bb56eb4704e2eaaf86f3c940d19154535d9b0ca7d6d590b04060e00d5", size = 880623, upload-time = "2026-09-30T15:30:04.884Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/e5/56/d194340cc4a57535e82e1bee9e89667ac4b7c13b5d3f59686deae3094dd5/cryptography-50.0.2-cp311-abi3-macosx_11_0_arm64.whl", hash = "sha256:fa8f5efb344d6908a1ce62f4a24e2e5780f825d6f53f5f50ec5ffacac72936cb", size = 3914904, upload-time = "2026-09-30T14:43:44.339Z" },
{ url = "https://files.pythonhosted.org/packages/d9/69/c9bd862c3bf43d6399c433caf002df16e2dffd4be49bdf515cda38038711/cryptography-50.0.2-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:79def8d059362e7831389ed3be0ecdf58a89386e1271e35dd9f5af84e81bffd0", size = 4731146, upload-time = "2026-09-30T14:43:47.113Z" },
{ url = "https://files.pythonhosted.org/packages/21/69/64cef1f702bf6657e0cc186ed1a2891d50d29fb41586b254e1c07adea261/cryptography-50.0.2-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:630ebfea3bf689d075f82316324ff7433dc447fe6bc1bfc76524b74b4a9567d2", size = 4719841, upload-time = "2026-09-30T14:43:49.01Z" },
{ url = "https://files.pythonhosted.org/packages/38/6b/61a3f8d8c5e1e49a6cddccafc4015cc1c0021360ab0acb4080e7a423644a/cryptography-50.0.2-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f9f6143a8c75945eb960d9eb98905a441394abfa24afaae239d514ffb2586480", size = 4738340, upload-time = "2026-09-30T14:43:50.932Z" },
{ url = "https://files.pythonhosted.org/packages/7b/2e/7212ca32fd43dc91f2f41db20160b268098874b4c9a0e7be94d6835f5b2e/cryptography-50.0.2-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:a582ab2ae1d34f67112cadc86702774c9ea4374df6bca6afe672817203c99134", size = 5367029, upload-time = "2026-09-30T14:43:52.911Z" },
{ url = "https://files.pythonhosted.org/packages/1a/f1/b474e930c4d910328780e3940da76f5aa5cbc48ce1fc14e44d239d9ea9db/cryptography-50.0.2-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:4061c0079120205fb760c58acab6443e217307dcf05e3702cf970e0689972856", size = 4753050, upload-time = "2026-09-30T14:43:55.272Z" },
{ url = "https://files.pythonhosted.org/packages/7c/52/9af10e80ac16b0fcc2123f9cbd5e7afbd0fd5075bb7a607c592258a39cda/cryptography-50.0.2-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:ac9ed99d81760c62fe89d5f0815cdfa1ba9a35141cf30f1c2d044f04b4803d2e", size = 4376724, upload-time = "2026-09-30T14:43:57.24Z" },
{ url = "https://files.pythonhosted.org/packages/71/37/6202e488cc1eb625ea110c292c6bda92823176e023f427d8d5660ce8d632/cryptography-50.0.2-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:87e9ce85beb6b328ba370cc6e6aea483c92617b4c95b1d33a49297eb662bfb04", size = 4737859, upload-time = "2026-09-30T14:43:59.541Z" },
{ url = "https://files.pythonhosted.org/packages/8f/30/e86d7d518489b0ae2497091a35287abcb1a2ce4037837a34afbe9b1d6964/cryptography-50.0.2-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:f265528741e048bce55c3463ed721fb0aa45a5888d8add8cfeccb3035451bbdc", size = 5324103, upload-time = "2026-09-30T14:44:01.901Z" },
{ url = "https://files.pythonhosted.org/packages/d3/69/2c833a049475e0a3444e94c7d0aca0aa51d166374a449b09e92ac98138de/cryptography-50.0.2-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9dab55f57c74c3cad24c323bacbbd04be4705ba6eb0d92e920b1fc4837ed5079", size = 4752576, upload-time = "2026-09-30T14:44:04.545Z" },
{ url = "https://files.pythonhosted.org/packages/6c/5d/906970b83bbfc1f5bbfb677a143c181f2801f23b6a7204a3b47c42c97e65/cryptography-50.0.2-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25784ce8b9621c90c643efb9e1e2162ab3b0224cae446ad5e70e7fcb1ce18b51", size = 4870819, upload-time = "2026-09-30T14:44:06.884Z" },
{ url = "https://files.pythonhosted.org/packages/68/e3/f2298d3bb55e0c4a91841ec4d01b3f020ba8c5fbf15ccdcc6dcf03f97025/cryptography-50.0.2-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:85d0d9a31b9098e98534226d5686b47264b95e62ce459dc2e62fdfc809f9fe93", size = 5030152, upload-time = "2026-09-30T14:44:09.443Z" },
{ url = "https://files.pythonhosted.org/packages/9a/4f/adfc442765721292fff86d314ce385d3249d22db42295c0dd057727b60f3/cryptography-50.0.2-cp311-abi3-win_amd64.whl", hash = "sha256:7afa5a6602a9f29af1f3a2965f831bae7c9d5d597b7cbb716d41ab3b7d89879c", size = 3824692, upload-time = "2026-09-30T14:44:11.671Z" },
{ url = "https://files.pythonhosted.org/packages/ce/cb/52eb3770c0d0be2702a98c6e96065ddc0a2877cf0845aa9c23397c142cd4/cryptography-50.0.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f785f6161f202ab04d8ca194158968798e480ca058943907972da5f12e2881e8", size = 3892731, upload-time = "2026-09-30T14:44:13.485Z" },
{ url = "https://files.pythonhosted.org/packages/19/8e/aa1fc533d4546b127b45de8aa024eb5933d23eff9debfe25931e56861095/cryptography-50.0.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0ecbc5652bdb6fc9eaf89a7d196e20941adfe812f43bc4ca05d9150496821047", size = 4710431, upload-time = "2026-09-30T14:44:15.427Z" },
{ url = "https://files.pythonhosted.org/packages/6a/64/72bc3f75176e7e406b748a3e3830432b8c51297b38368713df04dc04898a/cryptography-50.0.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ab50ee449bf968271e820086f10a33d101dd060370abc10bcd22279be2656539", size = 4694824, upload-time = "2026-09-30T14:44:17.69Z" },
{ url = "https://files.pythonhosted.org/packages/4e/c6/62c77550edfa5ca3f14bf44a1e6739b9fa09d6e998a11d97ed8213bccc98/cryptography-50.0.2-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:a9f7355e6fab51f6c369b86fb7571cffa05edee2c2121e0380a37fb9ac1cd5c1", size = 4716967, upload-time = "2026-09-30T14:44:19.661Z" },
{ url = "https://files.pythonhosted.org/packages/f4/37/cce70f150c432914460157a6ecc161752e053aa5ec0ef3b3f7dc6e31039a/cryptography-50.0.2-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:94e5e9f108ee10471288214d3d233fbfbb492840a8457eb85178d643ddeb32c7", size = 5328676, upload-time = "2026-09-30T14:44:21.744Z" },
{ url = "https://files.pythonhosted.org/packages/aa/9a/6f2f0304d634ceafdeaf23e84537336664ac419b5d07611675c2ad3f6b7a/cryptography-50.0.2-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:241449bf940a5d27309bd317e6f9a2af6932113818bb2b8f5c59ddc7ef16da18", size = 4727698, upload-time = "2026-09-30T14:44:24.178Z" },
{ url = "https://files.pythonhosted.org/packages/1d/de/66bcf9244d118663b2e1aaded8990f4640e3d7b7411870a5765f252074d2/cryptography-50.0.2-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:d8947001be83df1394050758ce0e745dd74fb134eef0a4b5124208dfc3a68c37", size = 4354821, upload-time = "2026-09-30T14:44:26.263Z" },
{ url = "https://files.pythonhosted.org/packages/bd/e6/db28a28c7b6c676addce89136de3d8db49ea825a8c863472e36e42ead4ad/cryptography-50.0.2-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:4a20ce1e5cb4284a86692fdcba7cb8754185c6b2e5c56fcef3751cf451d3cdc2", size = 4716748, upload-time = "2026-09-30T14:44:28.447Z" },
{ url = "https://files.pythonhosted.org/packages/30/96/01546c7f69ea0e2ab790a2e4f0934a4052fb9b388147fbf83c2fd72f1e57/cryptography-50.0.2-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:84f964e537f916e2cc85199e5a88742e964939b575ac8598b3f9d6cc416cdaf1", size = 5285085, upload-time = "2026-09-30T14:44:30.704Z" },
{ url = "https://files.pythonhosted.org/packages/6c/01/03263395f74d50b071e9e66daace3f8bef80493e5d410726f2ba8554736b/cryptography-50.0.2-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:828d49b0ff5a0e3975865571c5d91dbbdd0d38d8289b249a163e9425413a5e05", size = 4727268, upload-time = "2026-09-30T14:44:32.92Z" },
{ url = "https://files.pythonhosted.org/packages/eb/94/2bfe8f29ec0cc9c0d99359c4161adf32858e4934b72c6d100d2ac0bbe962/cryptography-50.0.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:deb9fde5c60e437ee4821bc9bc39ff31b42135c27e1dc61ef0a629389c1de62e", size = 4849503, upload-time = "2026-09-30T14:44:34.969Z" },
{ url = "https://files.pythonhosted.org/packages/54/44/e80651ecbf0e42b62e2bb5f5768916e07eea72e1297338956a61df361f88/cryptography-50.0.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8c71ba2cd31fc93748c38e1b613200ff1c2665cbfd5341fe3a61cfde35a1430e", size = 5004057, upload-time = "2026-09-30T14:44:37.064Z" },
{ url = "https://files.pythonhosted.org/packages/f8/cc/1d33befb3cd7ea7e77d2d73f43f2066471da1b21f24a6156efcaabf6d2e8/cryptography-50.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:78198641e5be9521beea5aa782bb551a58068d10e6eb04c9c680c1b69f2e7d45", size = 3795868, upload-time = "2026-09-30T14:44:39.71Z" },
{ url = "https://files.pythonhosted.org/packages/2d/49/93f6a6e7a87c9aa68d44d3e1cdb5fe8f60c90d5d2f46acae9a56892816b8/cryptography-50.0.2-cp315-abi3.abi3t-macosx_11_0_arm64.whl", hash = "sha256:edc3342adf8f697fc5f59c887a304356f147b397809440ed64e2fa6af2f50f37", size = 4133708, upload-time = "2026-09-30T14:44:41.807Z" },
{ url = "https://files.pythonhosted.org/packages/8c/75/32ac2a56243d778805c16ca6a32b8f74fb757df7e28d7ecb560afafb59cf/cryptography-50.0.2-cp315-abi3.abi3t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d370b8d1dfcdf7130178137f6fbee6140774a1acc6cacefc4b42643ec11d0a3a", size = 4956267, upload-time = "2026-09-30T14:44:43.693Z" },
{ url = "https://files.pythonhosted.org/packages/aa/a4/2c8d734e43d97f0842ee9f1b7b4bfb3d0cf5e19edebf43c2afe6675c2320/cryptography-50.0.2-cp315-abi3.abi3t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f2f9bd7f90c64fe89253f0a2c05e3c4856072660429ce8831b4235bf29403a67", size = 4966465, upload-time = "2026-09-30T14:44:45.769Z" },
{ url = "https://files.pythonhosted.org/packages/c2/58/ee288c829a6f41f6235ae9dd33d82fd19b45442b65b4c8a3da36963d9f7a/cryptography-50.0.2-cp315-abi3.abi3t-manylinux_2_28_aarch64.whl", hash = "sha256:e275096ea1e60cc595cda2836fd4a6c725d1125108b868be17f53684d164e2cc", size = 4959356, upload-time = "2026-09-30T14:44:48.211Z" },
{ url = "https://files.pythonhosted.org/packages/92/20/9ded6d51ddd9897f6b6e81fb9ebea7951d7cc5d6c890b0ed8abf77a51a80/cryptography-50.0.2-cp315-abi3.abi3t-manylinux_2_28_ppc64le.whl", hash = "sha256:b13478603dcd0a2479ff8e87e2c19a7d525734686fe3c49542472293a204212d", size = 5548822, upload-time = "2026-09-30T14:44:50.86Z" },
{ url = "https://files.pythonhosted.org/packages/02/a8/8df951850d6b31d2a00218f19e2b3f999523437ed7a819df7fa427942fca/cryptography-50.0.2-cp315-abi3.abi3t-manylinux_2_28_x86_64.whl", hash = "sha256:58a0c478eeca76fe5e07993c5a0703def34a6dc6a0cda4f5564639b33112ffe7", size = 5001199, upload-time = "2026-09-30T14:44:53.379Z" },
{ url = "https://files.pythonhosted.org/packages/8b/f9/36b3022218ce75b7cdf068fb95f809f9bd0d820e4955ef43b90c255cc7ac/cryptography-50.0.2-cp315-abi3.abi3t-manylinux_2_31_armv7l.whl", hash = "sha256:d38cdff612d06fa6a32840d5e1b1f7a27cee4a349aa9085d94a67789d6bfd408", size = 4629333, upload-time = "2026-09-30T14:44:55.635Z" },
{ url = "https://files.pythonhosted.org/packages/8c/72/20f99a219f6af47cdd1cbd978c243b92d71496e168a746138af44ded4f29/cryptography-50.0.2-cp315-abi3.abi3t-manylinux_2_34_aarch64.whl", hash = "sha256:fdd28f912fccfec1846a94e2e1e8f9b0012f557f0c46fe4f3eb0d7a87afcf90b", size = 4958822, upload-time = "2026-09-30T14:44:59.639Z" },
{ url = "https://files.pythonhosted.org/packages/f2/20/196f112617fb08eb4d608a2a6c422373d46f9cc2857f38fc0667033c0899/cryptography-50.0.2-cp315-abi3.abi3t-manylinux_2_34_ppc64le.whl", hash = "sha256:cbc8738fd8526d80f35cb3a40d41f41a2e7030bb3b18b09a6778ef63d291c2fd", size = 5506351, upload-time = "2026-09-30T14:45:02.267Z" },
{ url = "https://files.pythonhosted.org/packages/24/95/83378121ef3eaaaf71d4b781577ff794acb39b9e1b87a3f156898c8497ed/cryptography-50.0.2-cp315-abi3.abi3t-manylinux_2_34_x86_64.whl", hash = "sha256:e105ab60406787da31fccc883fc0f733af1efd78f0136a4599692c4083a73d0c", size = 5000859, upload-time = "2026-09-30T14:45:05.009Z" },
{ url = "https://files.pythonhosted.org/packages/22/f7/70fd7ae4d1dbfa7ba29b02e1b9068771519a86027756510b700ce81086a8/cryptography-50.0.2-cp315-abi3.abi3t-musllinux_1_2_aarch64.whl", hash = "sha256:6f8700550aa1474a91e5dc07049c46f98b423b5b1ddd0483e0b51362eeeaf5be", size = 5092151, upload-time = "2026-09-30T15:29:15.932Z" },
{ url = "https://files.pythonhosted.org/packages/d4/be/688367b74de86984bd58d8efacfc7c9e68b89a6a22ced0fb4f38db50254a/cryptography-50.0.2-cp315-abi3.abi3t-musllinux_1_2_x86_64.whl", hash = "sha256:c71be1cbfa5cd9a41ee452acf1eccd82b2c05950358b106ec8ceb83411d1a020", size = 5286120, upload-time = "2026-09-30T15:29:18.309Z" },
{ url = "https://files.pythonhosted.org/packages/39/d1/55f8a3f2ef5d1529e16835ef10cf0fe3d559ce237b46dddc440c0bba3649/cryptography-50.0.2-cp315-abi3.abi3t-win_amd64.whl", hash = "sha256:c423ab384a46c4dff7217b2ea5ba2e11cffdeab6441acd04cf65a369caf0366c", size = 4111557, upload-time = "2026-09-30T15:29:20.155Z" },
{ url = "https://files.pythonhosted.org/packages/23/ad/ac987755d00e1e64273760228d2635ae38dae2be83e3c6e0d3289d91dec3/cryptography-50.0.2-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:0ec5f09541743261e66e291b4a0cbf0fb2997aeaab6d9e9c740b9dba1b58d1c2", size = 3943588, upload-time = "2026-09-30T15:29:22.265Z" },
{ url = "https://files.pythonhosted.org/packages/d5/8d/6d585339bedf85d45044c85d8412dac53f2bb6f918e8b7777efba1787844/cryptography-50.0.2-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c5e67125c7dca78d199ec4e116aa93dbb83494808ecbb8211a2cb09b1bf41dbd", size = 4756166, upload-time = "2026-09-30T15:29:24.58Z" },
{ url = "https://files.pythonhosted.org/packages/bf/f1/1c1f6874e8550cfddd4b688ceb38cefb6ed15ceed224d56f133f3d88c214/cryptography-50.0.2-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ee247f5c245c9a2fe7c8e2214e295918838e44e00a45a6718451e4004219e767", size = 4749145, upload-time = "2026-09-30T15:29:26.807Z" },
{ url = "https://files.pythonhosted.org/packages/c1/63/61b15dc1a8de03fe0adbe3fd7608b3ad5c73bf50993bbcb1faaa930afe33/cryptography-50.0.2-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dfe9763530994147d9af1def057a5b9658b00e8f8fe8743d144d1e0911c2e454", size = 4763638, upload-time = "2026-09-30T15:29:28.588Z" },
{ url = "https://files.pythonhosted.org/packages/fc/35/b345bdfa40c9126df1a9d33236aa98418367931b8725f84fc3ae2b98dc59/cryptography-50.0.2-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:58ddb5a8e3179d12f19e4ea34d2d32e9d63a4baa142c875c1eb59f41b7243acd", size = 5382217, upload-time = "2026-09-30T15:29:30.589Z" },
{ url = "https://files.pythonhosted.org/packages/4f/87/ef344a9e616871f2519c22d6afcda79ddd5d35e9592d95eb6e677608d055/cryptography-50.0.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f21e8a22c8605750c7af886bab299a363721264061b4ac0a30efb73cfd58efc5", size = 4781387, upload-time = "2026-09-30T15:29:32.605Z" },
{ url = "https://files.pythonhosted.org/packages/90/5b/f2fdb13cd0b96f6f932c8627bb292a45f11c64d21620a8e120aee9a3b848/cryptography-50.0.2-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:9c8402a82ea0dc4ceeab793db05f0fafa8ca139ca34fcde5df0f596103c74107", size = 4403790, upload-time = "2026-09-30T15:29:34.374Z" },
{ url = "https://files.pythonhosted.org/packages/bc/ce/7e4f662b1e3c393513569e402cfc85ac7da0bd3d5435e122a3140219eb2d/cryptography-50.0.2-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:0ddc924c04591c2811ca024d62ecad4f7f6f08af8939c211438f48a16bd23602", size = 4764319, upload-time = "2026-09-30T15:29:36.149Z" },
{ url = "https://files.pythonhosted.org/packages/3c/3f/86ff33ce34cc0de6847fb96e035a1a760d81652e38643f617c02ad32ef7a/cryptography-50.0.2-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:a6557e5f38e065ca9fbdaf7cfc7435ecb1d113aa81a022d1b51921ee7432e227", size = 5338560, upload-time = "2026-09-30T15:29:39.053Z" },
{ url = "https://files.pythonhosted.org/packages/40/cf/6b5c8e2fd9202d98988ab7cb5cc5c991704c4ad55f492ff408e4969f83f1/cryptography-50.0.2-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:1981f1db4630889b9ef7803fadef12b056f428cb6b85c27ba57b774793b6093c", size = 4780973, upload-time = "2026-09-30T15:29:41.251Z" },
{ url = "https://files.pythonhosted.org/packages/10/bf/8d6ebc7dded797bd0f0160d52188021211f011a2b164ef0ae1dac4587465/cryptography-50.0.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7a8701d6b584d76e909e3d305b7d126b41439876a5aaf76cddc67fc230eafa2e", size = 4897738, upload-time = "2026-09-30T15:29:43.106Z" },
{ url = "https://files.pythonhosted.org/packages/d4/aa/f3f6e0de7e6253b8baa8b2d8fb9d50924fa75cee3d4624bd4bc1208ee923/cryptography-50.0.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ce47f66801c20ec6c6632453bb5960fe38939e9306970b48b3a5a26de7745d94", size = 5058280, upload-time = "2026-09-30T15:29:44.827Z" },
{ url = "https://files.pythonhosted.org/packages/f6/b6/a1faf3a27ae9405fb34b1713cc73b2d8a26b04d5c561578fa2e6ef3e5bb9/cryptography-50.0.2-cp39-abi3-win_amd64.whl", hash = "sha256:4e81d95e5bafc2d6e34e4bed780e53e4d5b9a2f928573428aa4d35fbec1eb0de", size = 3854095, upload-time = "2026-09-30T15:29:46.782Z" },
{ url = "https://files.pythonhosted.org/packages/1d/7a/f08d34ce09d60f89ebd391e2ebc6ba2b995e6dd7552f41820f8085f94e53/cryptography-50.0.2-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:92e665960f25fcdc73725b9cec7a3824f279ba97a98653afe9ffac2e43668f67", size = 4716035, upload-time = "2026-09-30T15:29:48.681Z" },
{ url = "https://files.pythonhosted.org/packages/45/67/e18fb65592451a2acb76e9f2fbe14e0f47a8318b4c5430f1633851d03daa/cryptography-50.0.2-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:eef4c2f3423810b3070ab391f85436d2f8bbfcb286ac15cbc73190b3563b1f1a", size = 4726917, upload-time = "2026-09-30T15:29:50.608Z" },
{ url = "https://files.pythonhosted.org/packages/83/28/38fdce17e60f6b825e69fc3b7f75e70a6612759980704697e1de4cbfaf6e/cryptography-50.0.2-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:7c6d0330c472d96f6a6afe24d80dfdf15176c33096f0a4397ae4c60f3dd3be48", size = 4715341, upload-time = "2026-09-30T15:29:52.522Z" },
{ url = "https://files.pythonhosted.org/packages/b6/b1/d9121a717e0f893c64bd6ca7702614778d7df2a5c309128a002421788516/cryptography-50.0.2-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:1ba34f04897fcdaa73f74145c25f3ec146fbd56593853e88adc2e811303c5f42", size = 4726322, upload-time = "2026-09-30T15:29:54.263Z" },
{ url = "https://files.pythonhosted.org/packages/36/8b/e6d153808bf353e152abd2fd4d8f09670d956ac78379ac46e60d7efbf04c/cryptography-50.0.2-pp311-pypy311_pp80-macosx_11_0_arm64.whl", hash = "sha256:3dc4fd8058cea1644971207d530e1a03a184a805ffc8ebdddf0599d78a331b81", size = 3873097, upload-time = "2026-09-30T15:29:56.097Z" },
{ url = "https://files.pythonhosted.org/packages/ca/1d/1271f287ff7170ddafc2aad36260c4eec20ccd2fea70f38455e9d56d427b/cryptography-50.0.2-pp311-pypy311_pp80-win_amd64.whl", hash = "sha256:7b75de3c8b3be1cdb1052747c929440c3eea46c1bc2cb8a6e3a48388e9b7b452", size = 3805376, upload-time = "2026-09-30T15:29:58.729Z" },
]
[[package]]
name = "decorator"
version = "5.3.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/60/8b/32f9823da46cde7df2087faa08cd98d01b908f8dcab982cdba9c84e85355/decorator-5.3.1.tar.gz", hash = "sha256:4cbcdd55a6efadb9dbea26b858f4fb3264567b52d69ca0d25b721b553f60ea82", size = 58084, upload-time = "2026-05-18T06:03:28.057Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/05/7f/798705f5296a58ca505d600456748d1be48078eac8a7050d8a98bc9edb89/decorator-5.3.1-py3-none-any.whl", hash = "sha256:f47fe6fdbd2edd623ecfe36875d37aba411624e2670dd395dddae1358689bb3c", size = 10365, upload-time = "2026-05-18T06:03:26.517Z" },
]
[[package]]
name = "django"
version = "5.2.17"
source = { registry = "https://pypi.org/simple" }
resolution-markers = [
"python_full_version < '3.12'",
]
dependencies = [
{ name = "asgiref" },
{ name = "sqlparse" },
{ name = "tzdata", marker = "sys_platform == 'win32'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/d5/d8/43e9d000519adceb189620b6869ff88031e046df91c2e9da72f8f6918399/django-5.2.17.tar.gz", hash = "sha256:9d4d93be539a18ab80d058eb515900e10951e04c537c5a6b394fc49528d3251f", size = 10889740, upload-time = "2026-08-04T15:04:03.173Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/df/f8/ce120525ca78f12b07daf65786679c5d0b54a75285a8958d3ae55e39da35/django-5.2.17-py3-none-any.whl", hash = "sha256:f04fb3b36ee119e1af4fa1d397d5fd6cf12700f49321e84d4f4c642c5b1973db", size = 8315563, upload-time = "2026-08-04T15:03:59.1Z" },
]
[[package]]
name = "django"
version = "6.1.1"
source = { registry = "https://pypi.org/simple" }
resolution-markers = [
"python_full_version >= '3.15'",
"python_full_version >= '3.12' and python_full_version < '3.15'",
]
dependencies = [
{ name = "asgiref" },
{ name = "sqlparse" },
{ name = "tzdata", marker = "sys_platform == 'win32'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/f8/d4/8314b5bdef20832f0ac6ae3b3e4d4924e4759fa3b4af27609dd747e7a6be/django-6.1.1.tar.gz", hash = "sha256:7ab93536d8e677aa14554c56426290c69480bf2ee68d7513d4a22f57d6bfeb84", size = 11284905, upload-time = "2026-09-02T17:20:45.621Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/8d/ca/c1040a4fd15754ede7df15fd72fc2e123045b473b253ab5f5284e11c651e/django-6.1.1-py3-none-any.whl", hash = "sha256:585fb82bf15053c42cf52e67c2f1b54a032dca384759315fd6678ab1870d1d72", size = 8419512, upload-time = "2026-09-02T17:20:39.153Z" },
]
[[package]]
name = "django-stubs"
version = "6.1.2"
source = { editable = "." }
dependencies = [
{ name = "django", version = "5.2.17", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" },
{ name = "django", version = "6.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
{ name = "django-stubs-ext" },
{ name = "types-pyyaml" },
{ name = "typing-extensions" },
]
[package.optional-dependencies]
compatible-mypy = [
{ name = "mypy" },
]
oracle = [
{ name = "oracledb" },
]
redis = [
{ name = "redis" },
{ name = "types-redis" },
]
[package.dev-dependencies]
dev = [
{ name = "django", version = "5.2.17", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" },
{ name = "django", version = "6.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
{ name = "django-stubs", extra = ["compatible-mypy", "oracle", "redis"] },
{ name = "jinja2" },
{ name = "mysqlclient" },
{ name = "psycopg", extra = ["binary"] },
{ name = "psycopg2-binary" },
{ name = "pyrefly" },
{ name = "pyright" },
{ name = "pytest" },
{ name = "pytest-mypy-plugins" },
{ name = "pytest-shard" },
{ name = "pytest-xdist" },
{ name = "pyyaml" },
{ name = "ty" },
]
pyrefly = [
{ name = "psycopg2-binary" },
{ name = "pyrefly" },
]
pyright = [
{ name = "pyright" },
]
tests = [
{ name = "django", version = "5.2.17", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" },
{ name = "django", version = "6.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
{ name = "django-stubs", extra = ["compatible-mypy", "oracle", "redis"] },
{ name = "jinja2" },
{ name = "mysqlclient" },
{ name = "psycopg", extra = ["binary"] },
{ name = "psycopg2-binary" },
{ name = "pytest" },
{ name = "pytest-mypy-plugins" },
{ name = "pytest-shard" },
{ name = "pytest-xdist" },
{ name = "pyyaml" },
]
ty = [
{ name = "psycopg2-binary" },
{ name = "ty" },
]
[package.metadata]
requires-dist = [
{ name = "django" },
{ name = "django-stubs-ext", editable = "ext" },
{ name = "mypy", marker = "extra == 'compatible-mypy'", specifier = ">=1.13,<2.5" },
{ name = "oracledb", marker = "extra == 'oracle'" },
{ name = "redis", marker = "extra == 'redis'" },
{ name = "types-pyyaml" },
{ name = "types-redis", marker = "extra == 'redis'" },
{ name = "typing-extensions", specifier = ">=4.11.0" },
]
provides-extras = ["compatible-mypy", "oracle", "redis"]
[package.metadata.requires-dev]
dev = [
{ name = "django", marker = "python_full_version < '3.12'", specifier = "==5.2.17" },
{ name = "django", marker = "python_full_version >= '3.12'", specifier = "==6.1.1" },
{ name = "django-stubs", extras = ["compatible-mypy", "oracle", "redis"], editable = "." },
{ name = "jinja2", specifier = "==3.1.6" },
{ name = "mysqlclient", specifier = "==2.3.0" },
{ name = "psycopg", extras = ["binary"], specifier = "==3.3.6" },
{ name = "psycopg2-binary" },
{ name = "psycopg2-binary", specifier = "==2.9.13" },
{ name = "pyrefly", specifier = "==1.3.2" },
{ name = "pyright", specifier = "==1.1.414" },
{ name = "pytest", specifier = "==9.1.1" },
{ name = "pytest-mypy-plugins", specifier = "==4.0.3" },
{ name = "pytest-shard", specifier = "==0.1.2" },
{ name = "pytest-xdist", specifier = "==3.8.0" },
{ name = "pyyaml", specifier = "==6.0.3" },
{ name = "ty", specifier = "==0.0.83" },
]
pyrefly = [
{ name = "psycopg2-binary" },
{ name = "pyrefly", specifier = "==1.3.2" },
]
pyright = [{ name = "pyright", specifier = "==1.1.414" }]
tests = [
{ name = "django", marker = "python_full_version < '3.12'", specifier = "==5.2.17" },
{ name = "django", marker = "python_full_version >= '3.12'", specifier = "==6.1.1" },
{ name = "django-stubs", extras = ["compatible-mypy", "oracle", "redis"], editable = "." },
{ name = "jinja2", specifier = "==3.1.6" },
{ name = "mysqlclient", specifier = "==2.3.0" },
{ name = "psycopg", extras = ["binary"], specifier = "==3.3.6" },
{ name = "psycopg2-binary", specifier = "==2.9.13" },
{ name = "pytest", specifier = "==9.1.1" },
{ name = "pytest-mypy-plugins", specifier = "==4.0.3" },
{ name = "pytest-shard", specifier = "==0.1.2" },
{ name = "pytest-xdist", specifier = "==3.8.0" },
{ name = "pyyaml", specifier = "==6.0.3" },
]
ty = [
{ name = "psycopg2-binary" },
{ name = "ty", specifier = "==0.0.83" },
]
[[package]]
name = "django-stubs-ext"
version = "6.1.2"
source = { editable = "ext" }
dependencies = [
{ name = "django", version = "5.2.17", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" },
{ name = "django", version = "6.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
{ name = "typing-extensions" },
]
[package.metadata]
requires-dist = [
{ name = "django" },
{ name = "typing-extensions" },
]
[[package]]
name = "execnet"
version = "2.1.2"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/bf/89/780e11f9588d9e7128a3f87788354c7946a9cbb1401ad38a48c4db9a4f07/execnet-2.1.2.tar.gz", hash = "sha256:63d83bfdd9a23e35b9c6a3261412324f964c2ec8dcd8d3c6916ee9373e0befcd", size = 166622, upload-time = "2025-11-12T09:56:37.75Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl", hash = "sha256:67fba928dd5a544b783f6056f449e5e3931a5c378b128bc18501f7ea79e296ec", size = 40708, upload-time = "2025-11-12T09:56:36.333Z" },
]
[[package]]
name = "iniconfig"
version = "2.3.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" },
]
[[package]]
name = "jinja2"
version = "3.1.6"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "markupsafe" },
]
sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" },
]
[[package]]
name = "jsonschema"
version = "4.26.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "attrs" },
{ name = "jsonschema-specifications" },
{ name = "referencing" },
{ name = "rpds-py" },
]
sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", size = 90630, upload-time = "2026-01-07T13:41:05.306Z" },
]
[[package]]
name = "jsonschema-specifications"
version = "2025.9.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "referencing" },
]
sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" },
]
[[package]]
name = "librt"
version = "0.16.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/04/f5/9dc696772d241814bacac7880bac32f2930b5a6ebc1f85317b83161a011c/librt-0.16.0.tar.gz", hash = "sha256:ac38d6d8d66bf3d744148dbbc0b8e193e195a51e364ed55e224631f5721891fc", size = 219839, upload-time = "2026-09-29T00:55:32.891Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/ba/0e/b04fd2d76b6a78a02286938251b2c119fb36ddece92c76cb4886ef7d44b8/librt-0.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fe4372c52d4849096c6cc1cda2817d293ec51440c890474ed59ef38d46556f18", size = 148058, upload-time = "2026-09-29T00:44:40.903Z" },
{ url = "https://files.pythonhosted.org/packages/a3/fc/e1ed24aadb32d38603c0c07f579d739eb4d90e64e90d525b024e4a999b4d/librt-0.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c72c5295a84bd249526da9bdca38f2e176d15c31c13bb0063c5053f4ca023421", size = 153073, upload-time = "2026-09-29T00:44:42.165Z" },
{ url = "https://files.pythonhosted.org/packages/be/38/133ab655409420e0c34a9a9836a7f4e5ae75fba758d7fe177099130d58ba/librt-0.16.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be56ba9c884143495b517f23fe794ae367d58cd89ea0fdd6d437e3c024a87f9f", size = 493052, upload-time = "2026-09-29T00:44:44.043Z" },
{ url = "https://files.pythonhosted.org/packages/94/42/aaa663bc9421f5bf7bbbe9d3316d7219749698ec7688ac3b519770a89c04/librt-0.16.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:ef46c1a29ffb8c72e882e22618ec618778eacd0578fb22c6e7cf9c11d15f357b", size = 485506, upload-time = "2026-09-29T00:44:45.479Z" },
{ url = "https://files.pythonhosted.org/packages/7b/59/83a6eb5087ba8b45b083859e2085256963e06d4c2531944cdd962670bfb5/librt-0.16.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d3c94211ee0c4f8d649ec06b7c115c0ec4eadb873a0e3154ca15cef3f814b071", size = 498708, upload-time = "2026-09-29T00:44:46.916Z" },
{ url = "https://files.pythonhosted.org/packages/a0/e4/15a8d62b2bc12935080ec7277e2e0b9b233047781eb784a51d3e25af669a/librt-0.16.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:94aed6a8308818b91677957d1bd03188869cd7aeb23c5dba7912a6c0402f7602", size = 515981, upload-time = "2026-09-29T00:44:48.316Z" },
{ url = "https://files.pythonhosted.org/packages/46/4f/287cc282ac5dd815204c0779e79401bb0a568c3a1335fb319bf0838fb566/librt-0.16.0-cp311-cp311-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:349c0bcb87ebd07481b6ff781e25cdc699723dbe2212e57dabb27f7a13b7b87d", size = 508670, upload-time = "2026-09-29T00:44:49.726Z" },
{ url = "https://files.pythonhosted.org/packages/bf/5b/ab7292add898ade0d2b5b75d32a923aae315861671aa5c39f5491309f7ae/librt-0.16.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:001bfd59a7d45b17e3e75f2a8c6405280b35e7b84471792778e718c4f368950e", size = 530393, upload-time = "2026-09-29T00:44:51.356Z" },
{ url = "https://files.pythonhosted.org/packages/7a/9e/8e6bcf027d4bcbc16a4e864b3d158a1d3e5f55ffa53af0238020cad89271/librt-0.16.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:28e038895b998d7a0c7798922ce8a1dc157675df5cf1c9ef0aca809ed804b7a1", size = 534302, upload-time = "2026-09-29T00:44:52.893Z" },
{ url = "https://files.pythonhosted.org/packages/96/a4/8c5ab4f3b3a8e905ff8305d76976a2e666f52fe049edd398aed2402beb36/librt-0.16.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0dbe4096a7ecc00fa835d24510ad8545a4efef738dac96e0e63516783ccde905", size = 536150, upload-time = "2026-09-29T00:44:54.421Z" },
{ url = "https://files.pythonhosted.org/packages/ea/5e/7c4bc267e3cd4b8bd288de9f62d61fff203829c9cc649ea2aa12e9218cf0/librt-0.16.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5cd5b092441053364af968ea12084692cb9d4a22f3ce9524e377880bf028761e", size = 514316, upload-time = "2026-09-29T00:44:55.998Z" },
{ url = "https://files.pythonhosted.org/packages/e0/75/c8bc6b50f43c73819334233f5a3259c81216742cef56d2140c3dd377c3f0/librt-0.16.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3ddeb3c9dedb461bb457c6c7d9aa7fbf35329da313d1a7543d00c8d0f3473c96", size = 557731, upload-time = "2026-09-29T00:44:57.581Z" },
{ url = "https://files.pythonhosted.org/packages/93/fb/e241f91bc8de6c7ac1c6a20ea6dd381bc52312b44d711ffcd97140db1e57/librt-0.16.0-cp311-cp311-win32.whl", hash = "sha256:e05108e0849966f53a8d2d3112a7af881d0efaa479bc735bba91108f9f2350a7", size = 104922, upload-time = "2026-09-29T00:44:59.078Z" },
{ url = "https://files.pythonhosted.org/packages/d1/38/c892383d2bb1a6a80b2ec8ede84970a265a792c56614a06282bf3008517c/librt-0.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:5f49cff01bd608ef7d97104cb035c75455e79c2d70bf4a506cf773338ac1860d", size = 125093, upload-time = "2026-09-29T00:49:01.621Z" },
{ url = "https://files.pythonhosted.org/packages/e4/56/8bbde1ed0b21480163617648f638fdaec9374cf5e9c846ebcee34ec02a42/librt-0.16.0-cp311-cp311-win_arm64.whl", hash = "sha256:1d28ae980ae2218f9c5b95d191e947296f918c9bf0b400d467a9430275bbe678", size = 115910, upload-time = "2026-09-29T00:52:40.131Z" },
{ url = "https://files.pythonhosted.org/packages/ad/76/bbdaeb87b7c47b5c7343e90222b9bfa4e4a8a83f647e02933ad0129225b1/librt-0.16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fe52bf4641069e7978a14253b036cb9002def1926317e710f2e249f8a8c47742", size = 151028, upload-time = "2026-09-29T00:52:41.508Z" },
{ url = "https://files.pythonhosted.org/packages/fd/0c/ab8ed3dab0085931aec4a792c7eaac8dc6c5ff4691fda3a5360d9d8a9cd2/librt-0.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5bcc2c4726ced915b00de0c9856a4eeabfb3fddb93e10e0b8f735b7709358b6d", size = 155283, upload-time = "2026-09-29T00:52:42.873Z" },
{ url = "https://files.pythonhosted.org/packages/eb/36/494e79d460c80c1f030661e8287c9eca5e1ad652dc2b2180b6cd42abce0a/librt-0.16.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff7baa55f8e7c69851419e50a666015d02a74198716fd45c0125a2112e0a389f", size = 503185, upload-time = "2026-09-29T00:52:44.638Z" },
{ url = "https://files.pythonhosted.org/packages/9b/34/a8464038dd9db6e4381fa2b6eb73dc9a50888d77102c4c139304ac35cddc/librt-0.16.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:b95d5d92ab83d39e760a52091bb1baba664f3a2351e39b1e16801e5747c2f0e9", size = 496738, upload-time = "2026-09-29T00:52:46.441Z" },
{ url = "https://files.pythonhosted.org/packages/6a/53/e0e5e334ef0c6ed27039d323819368b9ef6712be87d55ee2bf9799398afd/librt-0.16.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b6d085d70bce51d43c5c7c36d63490770180d8779e71c49305c87b4213918de7", size = 513818, upload-time = "2026-09-29T00:52:48.068Z" },
{ url = "https://files.pythonhosted.org/packages/ad/f7/7ce72cbf19d0addd05090b339152fd0548a02562c2866a603e6e3b3da2df/librt-0.16.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:36e53948e99bbe3ffea257124cfcae1cfb01831555c9a9c903c9f9a72db7fd07", size = 531952, upload-time = "2026-09-29T00:52:49.816Z" },
{ url = "https://files.pythonhosted.org/packages/83/22/0b1bcb6a8e723c8b4fd60dfc8ae8ec6461c54073fbc8685efeb8d900d407/librt-0.16.0-cp312-cp312-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:54d11f726aae9df5a6ffbbf0a03a52449bbac84a53ef03669cb41cdfd4ae41bf", size = 524465, upload-time = "2026-09-29T00:52:51.354Z" },
{ url = "https://files.pythonhosted.org/packages/64/2e/e9c23b8b9df1813da1be205deca9606beb7ddd033972246cd426d05374a0/librt-0.16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4323193ac0cd025f85af531df8ba91bf24d1973b401697347a6282e8fd3fcf5e", size = 543191, upload-time = "2026-09-29T00:52:53.284Z" },
{ url = "https://files.pythonhosted.org/packages/bc/e5/6a8b21b342c03ed7e230fa3afbfd2edc58e6e87ef1f0d11fa2b9a748c252/librt-0.16.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e42f8e098b9c5396fefa05fb1cc7e33b0e08fc51da106b5de4a45fd22aac6743", size = 546979, upload-time = "2026-09-29T00:52:54.932Z" },
{ url = "https://files.pythonhosted.org/packages/84/9e/b5129023eced1be01e01c22757f53be551d463b1bb7264f787927404c1d6/librt-0.16.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:39ec1d5a14e37baf1450a6cabf03fe552340808bf1ad9d71824ab90117716459", size = 555317, upload-time = "2026-09-29T00:52:56.869Z" },
{ url = "https://files.pythonhosted.org/packages/71/89/28bba5938c725fe91f06bf93f7fa6c6b150229df53a87b454b0d5c2a796e/librt-0.16.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d1aabe3925cbb4a08d15b7b20ba4011b53019da0c4173a25155139b7b1baed65", size = 535846, upload-time = "2026-09-29T00:52:58.475Z" },
{ url = "https://files.pythonhosted.org/packages/22/92/63773026614f888c5d4e370e395ce42ca604b89f70b3acdfedbf94851b80/librt-0.16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:300c3ffdc459f4a779a8411ecb188e3ac0b1ff3a3a7b099642555dedae06c69b", size = 573700, upload-time = "2026-09-29T00:53:00.127Z" },
{ url = "https://files.pythonhosted.org/packages/66/8f/347d4677eefb57cd9f8e01d95a1dcee9a91b4e44e664173c32ff6f3752e5/librt-0.16.0-cp312-cp312-win32.whl", hash = "sha256:c17194318e4c0c0348b36f36c2ec7534436fe0a4c15582403162a4f08c80797a", size = 106158, upload-time = "2026-09-29T00:53:02.031Z" },
{ url = "https://files.pythonhosted.org/packages/f0/2c/5193dc81127cd5ddfad031391b046bf32dda219b38463ab872407ca30646/librt-0.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:25a58a19ea8d83b68209f04912df765e9260635ef77646542ed4b4abe6bc7940", size = 126176, upload-time = "2026-09-29T00:53:03.445Z" },
{ url = "https://files.pythonhosted.org/packages/ff/3d/9668a400c8dd81d162eba38b33fa49fa6205f1a64493570a13fbb815c3ee/librt-0.16.0-cp312-cp312-win_arm64.whl", hash = "sha256:f7be7cf555bc30ec12622e9447299cc4a9b8ff307548b634794353db0c2065dc", size = 116572, upload-time = "2026-09-29T00:53:04.815Z" },
{ url = "https://files.pythonhosted.org/packages/46/cd/ae5e0e9dba45d1399aa04a5395bcc0bead40d9fa06dc903634a7b4d7473d/librt-0.16.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c5e6144e68b577f157519f2ba88ca20e3ed61c29b00e5cdfa76cd2d45acf059a", size = 151036, upload-time = "2026-09-29T00:53:06.284Z" },
{ url = "https://files.pythonhosted.org/packages/41/5a/48a16e323c5f9447a94cce7b59babf60fa04e62c3365ecf060c77ed8b320/librt-0.16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:33f41443a1f4e1f099331b3d8120e409fbff84b9760bc1cc9ea496f37ddaa5cc", size = 155211, upload-time = "2026-09-29T00:53:07.72Z" },
{ url = "https://files.pythonhosted.org/packages/3f/29/0f59299eb4251a409b2e690ad4b7d9f8a676db829d7817ec961f32b44f7e/librt-0.16.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e510b7770bee609617a3374a96548eb114cae048023e3f049ee449e7ff2db32", size = 502587, upload-time = "2026-09-29T00:53:09.191Z" },
{ url = "https://files.pythonhosted.org/packages/de/ba/d6fb4ef8d1537c396079d72289f16be7cd35a366e5065c51253fea2760b6/librt-0.16.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:efc49c462d4516b8a58b00b490078fa64689fd1fe66970cc190131d7afb8027e", size = 496146, upload-time = "2026-09-29T00:53:11.016Z" },
{ url = "https://files.pythonhosted.org/packages/52/fc/8c50dd4d7cc97c0ee8f252c8a3104980f234391cf1519b554e8b9de08b60/librt-0.16.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:92caf82ebef5e12d21c72242b70d1e92536f1711cf2a727a4c276de4b4469087", size = 513336, upload-time = "2026-09-29T00:53:12.655Z" },
{ url = "https://files.pythonhosted.org/packages/a9/59/16c409c56f708eda2db9a0553662845d45e3871c77d70a240dae3f3bdc56/librt-0.16.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:17bac7f7a16b328fff77e440287693eb017abde913595b5827ebccbc21ecd8a6", size = 531689, upload-time = "2026-09-29T00:53:14.39Z" },
{ url = "https://files.pythonhosted.org/packages/88/82/d34772a6c29d1446dcca6e64d74062efd508523ab351aa16625a4689d5cc/librt-0.16.0-cp313-cp313-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5b976054553670829985ed767feb78fb6bcede0175327c4844dd5c281c1be659", size = 524537, upload-time = "2026-09-29T00:53:16.064Z" },
{ url = "https://files.pythonhosted.org/packages/77/8f/24c5631313746131ccee53bc91fdc8374f9cf25e0082a1fee9c93bb98acc/librt-0.16.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0058f9d68721094105917254c72ac0569117bb7b13b9769cf45d26d89f9d21cd", size = 543231, upload-time = "2026-09-29T00:53:17.939Z" },
{ url = "https://files.pythonhosted.org/packages/f2/cb/5f8e0d41dbd8b499c2265e939c31acc9ba59845565bf99539ad1c06aebcf/librt-0.16.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:30b7beaf3f4487b7d8adef1f158b49067cb4d5a19fa7a3bf31a4e7a820e435c5", size = 546499, upload-time = "2026-09-29T00:53:19.666Z" },
{ url = "https://files.pythonhosted.org/packages/be/61/063052de441d1385f59cea4223f184bf9e5d125de1ae3239b490aa1e486e/librt-0.16.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:468df902df016a06eb0e40b0747dc8d14e47d7a38b18b63b1fb167d85cb94d63", size = 555261, upload-time = "2026-09-29T00:53:21.292Z" },
{ url = "https://files.pythonhosted.org/packages/14/11/a2ada0529372268d6401afa9d457a095b68cd7753532b6f7f33049a19b43/librt-0.16.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:aea7b1f2b125dad5de85f049136651bff256c883c65e6b9209b2da0a1ac3cdef", size = 536029, upload-time = "2026-09-29T00:53:23.07Z" },
{ url = "https://files.pythonhosted.org/packages/23/9d/5bb6d38853382986dca702fc7e06c8256d30f5fa0676d882773b744610dc/librt-0.16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a8afb6557920860b7a3a596eb804cf37e09e7cf8a803db2478c202acc72d8c2e", size = 573748, upload-time = "2026-09-29T00:53:24.696Z" },
{ url = "https://files.pythonhosted.org/packages/99/f6/0025cde35ff7f607684dc775a2b2d732cce2561cec050a6ee1fb2e1fc6fe/librt-0.16.0-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:77c7a2b4fe2c1369e0d5aa1cade26740a7b14be32fbc9a5535d617d20065c39d", size = 79861, upload-time = "2026-09-29T00:53:26.089Z" },
{ url = "https://files.pythonhosted.org/packages/93/93/303b8592909bd583f83f02818ffbea3f7647ca1e22b1cd5465d04b8145fe/librt-0.16.0-cp313-cp313-win32.whl", hash = "sha256:02d89c813d5ff74b17df72d3a34819d132cd168e56b81bf755b809bd9e46b8c4", size = 106236, upload-time = "2026-09-29T00:53:27.43Z" },
{ url = "https://files.pythonhosted.org/packages/cf/24/80bbb463c60ed18e29cb26aba386ddb76609580e4e7160710e550587018c/librt-0.16.0-cp313-cp313-win_amd64.whl", hash = "sha256:14ed6ebe3e4f85f326d7920011ad30ff49ed9334e62cf88caef9ba973d9e3a92", size = 126180, upload-time = "2026-09-29T00:53:28.7Z" },
{ url = "https://files.pythonhosted.org/packages/43/80/b1a6fbdd7da825cdd55c71aa81eb6cfa82c513c360774152eacb50b4a771/librt-0.16.0-cp313-cp313-win_arm64.whl", hash = "sha256:83d4041a3d9b2fd053a8a4e1f22878b3e5833e2712956382d5c048d791454e91", size = 116557, upload-time = "2026-09-29T00:53:30.012Z" },
{ url = "https://files.pythonhosted.org/packages/1e/93/9e0cf7da129a93c3dc7f45bc3cd4a660f2aaa995aa8a6f95c2583ef41239/librt-0.16.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:931a0bb0fcac88f263e269e46eb30ba8e21402cd3c62ca40cb97034c0693fab1", size = 149844, upload-time = "2026-09-29T00:53:31.391Z" },
{ url = "https://files.pythonhosted.org/packages/8f/26/8a90d2a8f2b2e471bb486b7aec117b8ae622715ed6c39853aec48ea20073/librt-0.16.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1bc17e54e5305f8d40b7ca203671ff5a9e59c1d0f8ea0f625dcca53a3984de11", size = 154111, upload-time = "2026-09-29T00:53:32.718Z" },
{ url = "https://files.pythonhosted.org/packages/35/ce/67abb46258da4d3e42ff5b141db6f38c59357bef84c7979f183b22f924f1/librt-0.16.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:877698bf6bca5721d8be345f2fe09778e40ecadea8b58c73075f2b1a53666bf2", size = 494234, upload-time = "2026-09-29T00:53:34.466Z" },
{ url = "https://files.pythonhosted.org/packages/12/f9/ea7162414a16f8f1bbd3b493ad6d22b926c5471916e078350bdbca8c4e5f/librt-0.16.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:5981c011b306781ce561e18e14230a14524a3d8109b97553666c942c18f31a96", size = 491173, upload-time = "2026-09-29T00:53:36.124Z" },
{ url = "https://files.pythonhosted.org/packages/b1/09/9b3e869060dd33f9989b80ba4fea306f6db8cecefcdfe6d7346ef0603f65/librt-0.16.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:afced3dfc17cd805ecf7a3d77996a71cf5f2c75aa66eb0c21a9930f4fc992f86", size = 505547, upload-time = "2026-09-29T00:53:37.686Z" },
{ url = "https://files.pythonhosted.org/packages/50/07/79007d2165f649ea93e08c0962d1d62c70af9cde77965255095bf9d96f9a/librt-0.16.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ca8052401c55d7511dda6760719fda7618067e83535d7d0010096d216c34b667", size = 523057, upload-time = "2026-09-29T00:53:39.301Z" },
{ url = "https://files.pythonhosted.org/packages/61/0c/8fbaff66d0ba376d8864653f5acce1569bae27e89648671f26f7eca67ab8/librt-0.16.0-cp314-cp314-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1e511762a074005bb0aa569166779834e75e438370226930d0ce1866d4b6a33b", size = 515158, upload-time = "2026-09-29T00:53:41.012Z" },
{ url = "https://files.pythonhosted.org/packages/df/2e/23ff0dece76f07a4124413a57682efa0bbeb5765ac0122bc0955513f82ca/librt-0.16.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f1e8591bd8a5a628cd7f07954c6a1592359a878bf032957a8e9057a41d644311", size = 534183, upload-time = "2026-09-29T00:53:42.451Z" },
{ url = "https://files.pythonhosted.org/packages/26/c4/e11dea21d9a29486eba78887380374189d472734fa32cc50cb37ca44d3d0/librt-0.16.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a4aaefb4ba6c07e1aeebb2795c8958148f1d6f9af3b555b53d23d766edb6d67a", size = 540663, upload-time = "2026-09-29T00:53:44.272Z" },
{ url = "https://files.pythonhosted.org/packages/44/75/e873ae158a8b7f5359be33e7fd6c1fbe02d9a78a3e89a77de6b0e837f476/librt-0.16.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:d92db7a0f6aee44f1baee94750457e8d2d1c6ccea41842de6268d34e8dc7eddd", size = 545908, upload-time = "2026-09-29T00:53:45.812Z" },
{ url = "https://files.pythonhosted.org/packages/ba/36/8939d3f6a93e11bd9592e6fe28d2b44f1c2dc4bed6e22e72359a91e18ffb/librt-0.16.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:378dfaffb38e59c24a87cde5713cd865d51ff7383fa12947f3907f306ea1ca55", size = 523302, upload-time = "2026-09-29T00:53:47.596Z" },
{ url = "https://files.pythonhosted.org/packages/71/14/35309f44a077f0f42ade0e2e7cd88c0cea760c661af205c01ea90d3c0e1f/librt-0.16.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3e0c39bdc85370422e8b637be76eb1fd07d30967551b03e62267dd156f553152", size = 565911, upload-time = "2026-09-29T00:53:49.278Z" },
{ url = "https://files.pythonhosted.org/packages/78/0c/df6255b94967f3159ebc46f08d8e783c12da6ee269ddb74b2efed63c640c/librt-0.16.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:1b384b90ab79a7bc30b566895809a636e0666f21f3cf12b54823d025b7e83839", size = 79119, upload-time = "2026-09-29T00:53:50.938Z" },
{ url = "https://files.pythonhosted.org/packages/6b/44/d30d5a5461378c9d33f36736c6791c3b4c4ba4b1ffe0da7350aedcb2c9a0/librt-0.16.0-cp314-cp314-win32.whl", hash = "sha256:52327da75a94012e7f932f913d20d3876bed3c102be00e6c3e8600ff7bdd58a7", size = 100140, upload-time = "2026-09-29T00:53:52.205Z" },
{ url = "https://files.pythonhosted.org/packages/c2/98/769712f356a1e897df3581bb0c3100375d054a000de26099360ea65b5111/librt-0.16.0-cp314-cp314-win_amd64.whl", hash = "sha256:3f0b8114c44b2ac06ff5dacd08e07e8e807ff4f46083f2a1602685122559be41", size = 120464, upload-time = "2026-09-29T00:53:53.495Z" },
{ url = "https://files.pythonhosted.org/packages/bf/d3/ae2abccc8bdc8b063c1613a77686e17b74e9d3d60cfe6f12c63fa2821b9f/librt-0.16.0-cp314-cp314-win_arm64.whl", hash = "sha256:8caf96a4ef8fb27d0ac0d1ad8337d26a240acd4a02fe4345d0a8f264753e8f99", size = 110889, upload-time = "2026-09-29T00:53:54.817Z" },
{ url = "https://files.pythonhosted.org/packages/e4/26/0737d4be058dd6376eade7dd8b380d4b869b6394cee929393a5a431c45bb/librt-0.16.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:953107e2f68d0f3512c48f898b0dbf0ce5cc52bba0f318d847c985dc555ee4cc", size = 159838, upload-time = "2026-09-29T00:53:56.22Z" },
{ url = "https://files.pythonhosted.org/packages/01/96/9bc96531d7c620e9949af904470f02e3fa8f35129ab8e8f281c51eaa3788/librt-0.16.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ad37d5b9abd49c9a655dcda7ea52a8a752884062ef1ee71ae17c2f2a0f81fe6a", size = 162018, upload-time = "2026-09-29T00:53:57.532Z" },
{ url = "https://files.pythonhosted.org/packages/0e/fa/b0289dcb186eb3f97221ba00da5f4bd3ba7fa5e99752d48aa8d336615334/librt-0.16.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c4aa329c17bd1aaea4f6e89335d8ccd494b3a5830b6654462273e50e11023f0", size = 703983, upload-time = "2026-09-29T00:53:59.024Z" },
{ url = "https://files.pythonhosted.org/packages/d9/ab/05ebbbde7530fc5eeb58fbd1581522a9f64f132fa703c4c595eed6e14760/librt-0.16.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:0ead24d2562a49473dddd9efef8581f020007eb0054389c3ee3ffad38b1ca4c9", size = 683847, upload-time = "2026-09-29T00:54:00.671Z" },
{ url = "https://files.pythonhosted.org/packages/a3/75/f52aeecd4dbadbddf80725ba7de126d8bd5d0eb66247eae17a81ed90dd4d/librt-0.16.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:02118f56a9c36ddd07dfd9b919d9ecc117ba20a90987d56aa4c429fa34509188", size = 698045, upload-time = "2026-09-29T00:54:02.247Z" },
{ url = "https://files.pythonhosted.org/packages/e6/55/fa277a835cd6eb42380591ceb85f48c5b4d2b2d7e2cb9869e1e17d24d237/librt-0.16.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4e29522c62e28595ff7e324c6834ade51127707f0e255b18d1c1cf03d39c1048", size = 724640, upload-time = "2026-09-29T00:54:04.078Z" },
{ url = "https://files.pythonhosted.org/packages/25/e4/2cf64354f3fde8ebd591b3b48f96510bee24ac5f7d1e567adbbe210abdbd/librt-0.16.0-cp314-cp314t-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3ff4b2367926b69c6215635902cccb04048e73094e9862900d27cb2c6bbff143", size = 731748, upload-time = "2026-09-29T00:54:05.741Z" },
{ url = "https://files.pythonhosted.org/packages/f8/c9/c180af3e94e01aa529fa93d7733fec2abc47f222345400cf21d5481d5f8a/librt-0.16.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c6f1b27bf1632a7e016af9f145f82be95e1edd7721a646505c21059257cb5a04", size = 754960, upload-time = "2026-09-29T00:54:07.38Z" },
{ url = "https://files.pythonhosted.org/packages/95/d6/01073aa78c58f356b10d9c57b3fe9abb143df338142bcd316df417b89db0/librt-0.16.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:5696d7f52e7b37217cb3a8f92c744fe835942602fdd4c1a8bc4741d3bfdce15e", size = 747000, upload-time = "2026-09-29T00:54:09.06Z" },
{ url = "https://files.pythonhosted.org/packages/f7/d8/1de3783908658d697a8cfc00582f61299ffba7796d7260c112e4700b1109/librt-0.16.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:6072e92dd876ff6ceeb6cf371e35e51f479349837391341f479b08df4564242b", size = 749569, upload-time = "2026-09-29T00:54:10.702Z" },
{ url = "https://files.pythonhosted.org/packages/b7/32/e817f66c96d6caa8bb8435ff93c4c220624d59efc506be59ab98fcd01d0c/librt-0.16.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:39ca4f2f2fe05de8e63493da592d84311adabe5bef52b193851981da9816b302", size = 729483, upload-time = "2026-09-29T00:54:12.25Z" },
{ url = "https://files.pythonhosted.org/packages/7c/c9/23992ccd2b9d22798fdd0f61353183a47414e651da782ad83eb680f50833/librt-0.16.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f9807485a908f00355820f18e91e045ffdcdc5adb68aaec40a1e2b88c5f7bba1", size = 776584, upload-time = "2026-09-29T00:54:13.837Z" },
{ url = "https://files.pythonhosted.org/packages/67/3b/e8af957f08e6e2e8e566b099e43d2748418aa565df6ee1d9d3331209fdfe/librt-0.16.0-cp314-cp314t-win32.whl", hash = "sha256:94be5cb7bca4df6201f4183e9e4fa2086c655283d20b38cd84500a69057575a7", size = 104402, upload-time = "2026-09-29T00:54:15.568Z" },
{ url = "https://files.pythonhosted.org/packages/ca/1c/946e6443d7cd32347a086043395e421e52fd603c9163d2ec970ceab8eed6/librt-0.16.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d46ca272b251d033dd4527b0dec5f261a28a52bd5fa0f99c117b0a1f8588cc2d", size = 126227, upload-time = "2026-09-29T00:54:17.165Z" },
{ url = "https://files.pythonhosted.org/packages/c2/a3/bc4f9959d3c62bcbf9e5fd3470a8bbd8bf33224ed4c25d7fba173201b8ac/librt-0.16.0-cp314-cp314t-win_arm64.whl", hash = "sha256:b9d6d4b14e92d876f8026b54c20c445f36425214c1081dc76f74e40db386b82b", size = 116493, upload-time = "2026-09-29T00:54:18.567Z" },
{ url = "https://files.pythonhosted.org/packages/b6/4b/10fdb42dfab4c1533e1570e686b18e86ff4328b406361b39fb3016667638/librt-0.16.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:6fe436af2eaf630474f491af5d032cbe45f93fcff5c3b9fe4ab194a7255b20ff", size = 149829, upload-time = "2026-09-29T00:54:19.933Z" },
{ url = "https://files.pythonhosted.org/packages/8e/30/a90ca13f1d3d91af1680000a4038536907018fbd51764767287a05d28b8b/librt-0.16.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:8ff5d26c529336be9bd7ae04483235d77778ee7d6444a95353102b542601ce81", size = 154522, upload-time = "2026-09-29T00:54:21.306Z" },
{ url = "https://files.pythonhosted.org/packages/5c/dd/bcf364eacfa070bb1fc88d503111ae7177914197ba1fa717c748926e7930/librt-0.16.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:909d8e3c1faee44cb762b1c519ff8613dcc5ceae5c99987a00917b5a31fd1d6a", size = 497593, upload-time = "2026-09-29T00:54:22.798Z" },
{ url = "https://files.pythonhosted.org/packages/18/c1/2c4e81e347bdabfe8346bfc6dc37ae5e154d61c88e30848ec0606025a5e0/librt-0.16.0-cp315-cp315-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:6d4a64283ee61824b5790de882bc68e2d9d7a5143537cb7a966f7354f71646d4", size = 480459, upload-time = "2026-09-29T00:54:24.364Z" },
{ url = "https://files.pythonhosted.org/packages/ab/d7/fef2a3cb8400701be496f6e459876f650b3451f407e30cb243de571ae615/librt-0.16.0-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5810ba811297fdf37a1531a57667cb8ace0842013ca8606bf9eb7c24cf4be154", size = 507814, upload-time = "2026-09-29T00:54:25.997Z" },
{ url = "https://files.pythonhosted.org/packages/e1/6f/53762927a32e9dc9eb1d1c1f3528da281290c86d96929a8af652f671266e/librt-0.16.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e56aaf8c167548dc8e5d6f3bd0f48dcdd299a23c73be3f744aab79d99e9c7f5d", size = 525114, upload-time = "2026-09-29T00:54:27.747Z" },
{ url = "https://files.pythonhosted.org/packages/6c/67/0b9d031f303c4e8c691a9a8ef9d272f13b530c11cc563b819df621b6a348/librt-0.16.0-cp315-cp315-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8f36c58e33b304b525c6c9c5076399c6ebf1109e17b9051a05a407b091b9215b", size = 520465, upload-time = "2026-09-29T00:54:29.331Z" },
{ url = "https://files.pythonhosted.org/packages/ae/d5/2056a3a85864e882eb17a203a10ddb26fa748bc9718ec67e79059ab46cae/librt-0.16.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:242e00b3d4fa37c3d3c1ca5f5c9adb7d909ddb1eac9c41f2787320d00caa0af2", size = 537257, upload-time = "2026-09-29T00:54:30.915Z" },
{ url = "https://files.pythonhosted.org/packages/54/57/e0d79790c163cbc0909e209a6f62e30bb713b647f905a176cdc64848fd4d/librt-0.16.0-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:0253721561787b8df8443eb347b7a6461015354e5bdd37ee38a41fef220d2bb0", size = 527442, upload-time = "2026-09-29T00:54:32.478Z" },
{ url = "https://files.pythonhosted.org/packages/aa/50/1c0c95aba7af51f4752ea34fbf2eb79b36e7cae3a72536248e8c735de735/librt-0.16.0-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:3e483a8d69ede8067db70c0e83007423b6925de6fd53afed01d66160f2e9398c", size = 548139, upload-time = "2026-09-29T00:54:34.183Z" },
{ url = "https://files.pythonhosted.org/packages/98/91/a8a43dd5138d4f55f88846b8f0c85454a4fad69952cebfcff9948f831290/librt-0.16.0-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:69ba927445cfaaffb4081003ef5224c55a5c2ab67ef956f416ef744916e44121", size = 529708, upload-time = "2026-09-29T00:54:35.761Z" },
{ url = "https://files.pythonhosted.org/packages/2d/41/d5226881ab2b7c20d9d587b37bdd4a0ec8775a96d00ca87ac9f385587db4/librt-0.16.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:d6a365f2ab45a984d0e00eee0dd17f599ceab8cadab6ea07b6111c8132fc0e42", size = 567781, upload-time = "2026-09-29T00:54:37.409Z" },
{ url = "https://files.pythonhosted.org/packages/bb/bf/2345ba57a626e8c78c4ddcc724636a8df5a593fe46c1ee76bbf477e32b0d/librt-0.16.0-cp315-cp315-pyemscripten_2026_5_wasm32.whl", hash = "sha256:f01f3805f2dae4781c0c34b440e31740d082950bdaf89a6f601ad589a28af57a", size = 79177, upload-time = "2026-09-29T00:54:38.792Z" },
{ url = "https://files.pythonhosted.org/packages/1e/40/99e77936cc9207f629b077bf7cbc5e2f0827cddd7c29792f04ef881bd2c3/librt-0.16.0-cp315-cp315-win32.whl", hash = "sha256:b0e3e721c75d2e79a76d4422c79d7ba705fe1bbafec907037fe7a657a480a0e3", size = 100127, upload-time = "2026-09-29T00:54:40.251Z" },
{ url = "https://files.pythonhosted.org/packages/56/1e/801fe26bc622061b9dfd010e166d94142cb774b733217e6d98d1c0cf2638/librt-0.16.0-cp315-cp315-win_amd64.whl", hash = "sha256:bc02954b1295de798bbdb0b4e2d8a28c2117de8b5c73dcbeb27dc32572dfb971", size = 120480, upload-time = "2026-09-29T00:54:41.722Z" },
{ url = "https://files.pythonhosted.org/packages/bb/a9/d533983055bd36e112627384c2c038845d1df882540b8bcefb566475640b/librt-0.16.0-cp315-cp315-win_arm64.whl", hash = "sha256:c5db585d43449a5f54303d4b2774e45e1babd975cfe1630a3d708c0b80c3e560", size = 110915, upload-time = "2026-09-29T00:54:43.052Z" },
{ url = "https://files.pythonhosted.org/packages/55/fe/d62238fa9c653b0e0613290349467cb65711b5800e8e474f45e942a0ad95/librt-0.16.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:f06c689cb14afd9b612727553a5ec5a40febf113ca41c4413a2b0b334285884b", size = 159714, upload-time = "2026-09-29T00:54:44.497Z" },
{ url = "https://files.pythonhosted.org/packages/f3/ac/f31efe7818700be72ba4f9af8a80fa67c39808c8d26dacc55dc1f6f35172/librt-0.16.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:13b4e8aba90b0b1c82474e9844aa9ffe7ad3faa484350e1da64cb8188d903134", size = 162086, upload-time = "2026-09-29T00:54:45.968Z" },
{ url = "https://files.pythonhosted.org/packages/d9/16/4d7487bf86a9d7e8e18f37ba5538789233ea693637379b75701bd35ec9de/librt-0.16.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a269c46ae327d8e6f8c1f85f7516cb52c0fa48127565a1105a4f4a05ff2a0b4", size = 712727, upload-time = "2026-09-29T00:54:47.486Z" },
{ url = "https://files.pythonhosted.org/packages/77/74/50cd550ccc1a517b9ed62347625c01ddf8c4afad66490312677c011458f6/librt-0.16.0-cp315-cp315t-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:a33e0dae1f8592146a4764d54ce842b278732d21a84e17c3bbe6b1bc158a2248", size = 681106, upload-time = "2026-09-29T00:54:49.126Z" },
{ url = "https://files.pythonhosted.org/packages/df/5d/7293f712975ee6fdd2251411fd9ef1c62bc99c7b83ecbe62dbc999b1fab7/librt-0.16.0-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:47ada6ea32636492c61aa8ad27ae3b9404bfe7a97e3ba946d1984236cc741da0", size = 705921, upload-time = "2026-09-29T00:54:50.905Z" },
{ url = "https://files.pythonhosted.org/packages/67/f7/8aab946f11d59d1bece9ffc65d994b200c789a8ca5a95c17e17e609f912a/librt-0.16.0-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43bd6e642d8a248c114327f98dd25ac5a7cb5aa168ef02f0559b91874df16b8", size = 731786, upload-time = "2026-09-29T00:54:52.584Z" },
{ url = "https://files.pythonhosted.org/packages/43/76/1c42ab31e7cb8384ebf6d3af607213c495222474f4940443ae7639ab7685/librt-0.16.0-cp315-cp315t-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c3d1bb7841a816ace6449bb26d3f9560dbfa20e71c568d23f0f62bf1e68f50b1", size = 744964, upload-time = "2026-09-29T00:54:54.217Z" },
{ url = "https://files.pythonhosted.org/packages/6f/2e/4b19982d933d2dfced671e840b219e4c1cd3f507df6e6dabb51bbd4e3850/librt-0.16.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:3931f7a3db322e7f44e02a280e3949326ce9579ad388ee8d691dc7c76da9fb70", size = 765305, upload-time = "2026-09-29T00:54:55.815Z" },
{ url = "https://files.pythonhosted.org/packages/b8/1b/e872583de2dcb3ac7746e7a2321aeeb168274f3952a87dc66e05ddb29faf/librt-0.16.0-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:f4462528b6000afe8f16907b5c7c2553abf1df005ba5140e6eb394541c3624c3", size = 744959, upload-time = "2026-09-29T00:54:57.532Z" },
{ url = "https://files.pythonhosted.org/packages/10/de/a18c6bcfb297af2674233e90b3c3661c3a0af0f1434a0c966d2ef708a835/librt-0.16.0-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:80039ba9b6a7d5f1a0175a4cca6bbefead87bd854c80abad1cb30afe47a830db", size = 758138, upload-time = "2026-09-29T00:54:59.484Z" },
{ url = "https://files.pythonhosted.org/packages/22/1c/0df1d732539c297bb1a093e1fe3204d2faf76a9022cf4e1d1c2fce059790/librt-0.16.0-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:7a1d272724b581bb6bc769dfdafed6da2ecc9886ba2450311de55a4ac2e1e9cd", size = 744268, upload-time = "2026-09-29T00:55:01.179Z" },
{ url = "https://files.pythonhosted.org/packages/a2/f7/ccaf31331f20c91a5bd9bd48ffc3f743f9c81bb5720cc7b2a720ca204f0a/librt-0.16.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:fbe4fb8c5445f7496d7f7f6bb0807875d09d47e6771ffa175fb2df2895fb86ba", size = 785783, upload-time = "2026-09-29T00:55:02.938Z" },
{ url = "https://files.pythonhosted.org/packages/c1/ea/7421d9e6db894cd6cd788b604b3394a163ded6b942052b6f96c23ccf08e1/librt-0.16.0-cp315-cp315t-win32.whl", hash = "sha256:375bfe6b572a8f6cfc398709356046173bf27e64c4c5edaf5f7062f051fb4bf9", size = 104355, upload-time = "2026-09-29T00:55:04.533Z" },
{ url = "https://files.pythonhosted.org/packages/85/6d/7c31a506eb847bc58aeb2402d58e17605e821f68ab5df5e66fe274a6df41/librt-0.16.0-cp315-cp315t-win_amd64.whl", hash = "sha256:bd3150023d3dc2bc70f3784e59ffa1140d56ddba3d8125b3d6f9f85221279bfc", size = 126134, upload-time = "2026-09-29T00:55:06.017Z" },
{ url = "https://files.pythonhosted.org/packages/36/69/7a5d10ac409c4da0355e054a14371871da9b5557fcc42772cd00181c6cce/librt-0.16.0-cp315-cp315t-win_arm64.whl", hash = "sha256:8ceafb70f2a4f0826f11031942e59c0728fd98da112dc346d4352bde1e486866", size = 116391, upload-time = "2026-09-29T00:55:07.484Z" },
]
[[package]]
name = "markupsafe"
version = "3.0.4"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/38/9b/e422a865e1d5d57d0e509b4e0bf1c1a70a7f6382c29a5aa428df994c8bc8/markupsafe-3.0.4.tar.gz", hash = "sha256:2e9ad7dd851bf45fab9f75cbff4cb493fee9979e8d8c7c9c3ee119022518edd6", size = 153777, upload-time = "2026-10-02T23:07:22.29Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/32/55/18dbb4778b30ada5ce071608503cc3edc9e14e13d868c17a6d178fc30f7a/markupsafe-3.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9e25feb9e330b63edb0278a0acdf85e50d0cb0fbf49c3084abbe4e24ae195346", size = 11520, upload-time = "2026-10-02T23:04:36.299Z" },
{ url = "https://files.pythonhosted.org/packages/6c/14/0b05f79b4733e264a18d08fe08fa1df7347630ff32a6cb82180d9dccec55/markupsafe-3.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7d3391b2188d18737cb2fa147028b1096236eaa7e156446c650a489fa2cadc91", size = 12063, upload-time = "2026-10-02T23:04:37.291Z" },
{ url = "https://files.pythonhosted.org/packages/ca/3a/63ba10b6c1463216b3e4df669a9f0e5a3b0c3071557d2e8229e3968c79fb/markupsafe-3.0.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:849dd2bb0e5e4ab2b71c7191726a4a8d5aa8a610daa584728cbee0b710ddc4ef", size = 24321, upload-time = "2026-10-02T23:04:38.262Z" },
{ url = "https://files.pythonhosted.org/packages/1a/2e/5f015261b76ad633d187ef6f388b413aedd64a8773c4df59e530a0be5525/markupsafe-3.0.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:befb4158af32106b9a93db8d6d1d1cbbd418c0d5aca0cabb7b1780abf0c89169", size = 28845, upload-time = "2026-10-02T23:04:39.295Z" },
{ url = "https://files.pythonhosted.org/packages/33/cf/26e594b26be40c2f1fec63ccf8a8b99d0335a5b2cbe84835c7d82a994375/markupsafe-3.0.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:71f88e749ea29f67f21f3b36433c1dc54c7729ed2a6d9e2da2e0d9e0d7b224eb", size = 24701, upload-time = "2026-10-02T23:04:40.348Z" },
{ url = "https://files.pythonhosted.org/packages/81/a5/a513b76c139a3915b43404324e55c0b7979ae4f0d39eb6f075b0282e90a8/markupsafe-3.0.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6da83a088f8ef93b2d483a8232a4dbf4d69d3d8496b568a03c56becac43e1808", size = 22961, upload-time = "2026-10-02T23:04:41.372Z" },
{ url = "https://files.pythonhosted.org/packages/46/cf/4c66192c100b4542bcbe392ae06696b670f66927be3ac38a213234778ff9/markupsafe-3.0.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8f0fac8b13d14bb06c68195f849371924ae53dd7b1c00fed24650f704383b692", size = 21920, upload-time = "2026-10-02T23:04:42.429Z" },
{ url = "https://files.pythonhosted.org/packages/cb/17/ac3662678bfbad649893117ada2ba44dc30bf56884e84f13154a792b10f1/markupsafe-3.0.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4a7cdc2a420ca01058182da4253329764d4bfa055564d1eced90e6ba1e8b1d3d", size = 23726, upload-time = "2026-10-02T23:04:43.531Z" },
{ url = "https://files.pythonhosted.org/packages/f7/af/fe47cee339180a69ebca3c57fb3483d0f5cbd1e8337d1871fb1d9c1aebee/markupsafe-3.0.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:83b3944fea42a8400edf92fd1770fb8d0d4f7de651353bd2d8525a92dba69a21", size = 22539, upload-time = "2026-10-02T23:04:44.618Z" },
{ url = "https://files.pythonhosted.org/packages/12/32/d55440ba140442800e02d799c9cb5ab597bf6ebdb1177b5ea39a11f797bd/markupsafe-3.0.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8138eb83940ec7299024d92d4dee45f601b9e6c5ffde9d25f4e35e326203c707", size = 23963, upload-time = "2026-10-02T23:04:45.656Z" },
{ url = "https://files.pythonhosted.org/packages/50/9d/9c86042cb364c2ad4c971e6d1247929effd25f714cd7ee11b05e6316445b/markupsafe-3.0.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:811d02d5122171c1941357efd8f9bf4ffe907b7f0a1a4e729a880e4be3f46e3e", size = 21506, upload-time = "2026-10-02T23:04:46.671Z" },
{ url = "https://files.pythonhosted.org/packages/75/ef/5b824f03ba40c3b3652b6272d083d2fc4fcdd440de519a3a39ba2c3e7262/markupsafe-3.0.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:50b5bedc9ed8a94fc8857a42ef4f84a81ea88f8d4f05dc8705fb23ee6d8dcca7", size = 22955, upload-time = "2026-10-02T23:04:47.698Z" },
{ url = "https://files.pythonhosted.org/packages/1e/e8/44cfcb5ea40e5e43cec7793ef90704ed0c475280839076c4345757eb8e59/markupsafe-3.0.4-cp311-cp311-win32.whl", hash = "sha256:2e5a7cd7fdd14fcb1ae5d7d8bf23d24fbd1daefd1fbca2580132e1ea75f098b5", size = 14094, upload-time = "2026-10-02T23:04:48.788Z" },
{ url = "https://files.pythonhosted.org/packages/91/89/f2b509f7bf79352e40117824c1070dbeafd4df67031d3fa98165a3134228/markupsafe-3.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:fdb4ca07ab75ffadab4a8b135ad59cdbb3156b99310f3d565370da74a15d6bd3", size = 14328, upload-time = "2026-10-02T23:04:49.801Z" },
{ url = "https://files.pythonhosted.org/packages/2b/5a/ccf22672a0f64dc682306e288f0dabcb06c7a201f3bb6e6cbf86d9e8ad03/markupsafe-3.0.4-cp311-cp311-win_arm64.whl", hash = "sha256:569d65055d367e3dcdf30c3f41119467b73d9ee9faf332bdf40402644f5ac08e", size = 14188, upload-time = "2026-10-02T23:04:50.847Z" },
{ url = "https://files.pythonhosted.org/packages/81/09/4c59d56b8461ae8eb0d8ba34bb25b7e618547044679d58a82ef9b2479fc1/markupsafe-3.0.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:61631e08084be9e21a8967ec3139c7616ed7c5e9368e05c86d1b39562c8a57b6", size = 11658, upload-time = "2026-10-02T23:04:51.876Z" },
{ url = "https://files.pythonhosted.org/packages/a2/f0/d6613774d86fbf6d145751d43c59875e47a6f9f17daee0aef173bd36d90e/markupsafe-3.0.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0930db9bdc62d22944e10b066448bb65dc9abe9112880c7cab8da54db4284d5f", size = 12050, upload-time = "2026-10-02T23:04:52.931Z" },
{ url = "https://files.pythonhosted.org/packages/0d/f2/8f18e0b806eb13c1f8d07d917a720831ead54253a6dec011fbc78098a6f8/markupsafe-3.0.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6a45c3d514f2436064db00d7fc8778d888f0236ebfed649b53d13a59e69ad51b", size = 24363, upload-time = "2026-10-02T23:04:53.895Z" },
{ url = "https://files.pythonhosted.org/packages/60/ce/fa07dbe8a5675558fa36dea033e19995bc783de2dec5f540ccb9030b06aa/markupsafe-3.0.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1e1451fab512d1bcc3dc26988ec1edb0b82c2db909132872cd9356070a6b63df", size = 28525, upload-time = "2026-10-02T23:04:54.905Z" },
{ url = "https://files.pythonhosted.org/packages/85/40/be87c01f3868ec217f8a2015089d71c22c8c5a75324822e5ed1cdd87210d/markupsafe-3.0.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bd3ce56ae2cbae3ba82b683bc425cd7e48d2ed8b10f3e818186b6f5646d9271c", size = 24733, upload-time = "2026-10-02T23:04:56.229Z" },
{ url = "https://files.pythonhosted.org/packages/4f/a7/aeedb5140afa41fc74c225e9184ab96723a6e873b6ee1c9fede7283456d8/markupsafe-3.0.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e124f974786f831d6043728e38296969d3579db8896fe004682f5758e613581", size = 22985, upload-time = "2026-10-02T23:04:57.521Z" },
{ url = "https://files.pythonhosted.org/packages/c3/fc/e91352bb08c6a59da3ef0909d457bf95a5f5908fbf151b30a06d9dbcfbb4/markupsafe-3.0.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c02e8f18bdedba082cef725942ac823b9b60656db07f7e265cb31618dfd00d77", size = 22001, upload-time = "2026-10-02T23:04:58.597Z" },
{ url = "https://files.pythonhosted.org/packages/5d/f8/bffee5e7d2a3deb59748a797650a48af7e672025cf641a79344a771ad106/markupsafe-3.0.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9f098115c247e11d138ab83a28fa0323c77015007ea2df73ba5fd714dfefd67c", size = 23793, upload-time = "2026-10-02T23:04:59.686Z" },
{ url = "https://files.pythonhosted.org/packages/ed/59/b853d6628ecb4d658e1d637224846d5e9bb4adf4f8df97f3be9f29dce2ec/markupsafe-3.0.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d5f93ebbeb8032d47e349328ec8662d973d9b05a70b3c35df1f91fe419b84749", size = 22640, upload-time = "2026-10-02T23:05:00.768Z" },
{ url = "https://files.pythonhosted.org/packages/09/b2/1506df394f0f075797c418d0301498f49e43be194e3ffcb49e6fe6ccf022/markupsafe-3.0.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:64511c54db4e4987aef4c41923235927428729e8174c5dba488429be70a998ed", size = 24074, upload-time = "2026-10-02T23:05:01.813Z" },
{ url = "https://files.pythonhosted.org/packages/c7/81/5ed69cda630ac69ef60d06c09ba5a7f84ff66a2e28cf986fd5614ab3c6e6/markupsafe-3.0.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:e1a622f13970d81f95d0c72f9dc090dce9085fccfa4c9f2174377ee32bd15786", size = 21563, upload-time = "2026-10-02T23:05:03.239Z" },
{ url = "https://files.pythonhosted.org/packages/0c/fe/fb1e79be0fea60aa32602ebefc9c35a82bb42b4df157285ab7dfec12341a/markupsafe-3.0.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c9a7f43c0b202b334cc9184af09bb8f21d3a209e038efaf106936fb69e6b026e", size = 23048, upload-time = "2026-10-02T23:05:04.479Z" },
{ url = "https://files.pythonhosted.org/packages/c8/52/7632a53360671a9b750cdbabaf9cdd89f18b42248b8e4cb42c0b0296e459/markupsafe-3.0.4-cp312-cp312-win32.whl", hash = "sha256:f0ec3b750b59375eab5b0fb2b9254810c00a3375be6d789899f1055a1d556237", size = 14108, upload-time = "2026-10-02T23:05:05.513Z" },
{ url = "https://files.pythonhosted.org/packages/3f/bf/62495e180b7000aaf30000fff849e933f74264638057176cf46852500adc/markupsafe-3.0.4-cp312-cp312-win_amd64.whl", hash = "sha256:11935df9bf455ed0c04eb87bcd720f02b1fe5e02128a9430f23aed6f93336fc7", size = 14303, upload-time = "2026-10-02T23:05:06.538Z" },
{ url = "https://files.pythonhosted.org/packages/c5/8e/4c24208776a65878d656996945aacfbfe010d3720d1a98fc0eb8491fc03b/markupsafe-3.0.4-cp312-cp312-win_arm64.whl", hash = "sha256:a4bbd2d87dd233b9fc5812160c3d0ffbe42edc22a26ce0469f58479ede633fe9", size = 14174, upload-time = "2026-10-02T23:05:07.617Z" },
{ url = "https://files.pythonhosted.org/packages/6d/18/4bc5ba32499e87bb2b0ef5b3a9bb9c00a131fa961ddf0be548cb550f548b/markupsafe-3.0.4-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:de8b364c423ef0a4bad9069657d617f9a5d2b2062457a89b1fa16ee199c399c1", size = 12786, upload-time = "2026-10-02T23:05:08.709Z" },
{ url = "https://files.pythonhosted.org/packages/4e/6f/17f0c099bf25f3e31e63cc19244d9f6af861a9a4ab778c203997903cfdd0/markupsafe-3.0.4-cp313-cp313-android_24_x86_64.whl", hash = "sha256:34bdde374c5932765d7dc685c4a1d191a3207852d67e8e0a9eb6ea85156181f1", size = 12510, upload-time = "2026-10-02T23:05:09.93Z" },
{ url = "https://files.pythonhosted.org/packages/11/af/1a141081b905036ee904ec4bd945e1f70b4e1b32d33c4e59e8cf1d58b247/markupsafe-3.0.4-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:6bd9e1788e15bfcf6a9082de42e30387e7b85d211ab21e57a939bb8cfaaf8d96", size = 11583, upload-time = "2026-10-02T23:05:10.884Z" },
{ url = "https://files.pythonhosted.org/packages/e7/0a/a89385ae590232622a03e091805cff12f24fabe6c11e0e8bae096cece81c/markupsafe-3.0.4-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:5066b244f576f91afc8ee3ba029a89f99d39c79b1853fe9d39bea9f0afbec148", size = 11801, upload-time = "2026-10-02T23:05:11.913Z" },
{ url = "https://files.pythonhosted.org/packages/ed/85/ea548dc013962eb73653124bc595635fbf9e0fa41d1f181a967ccb784dfb/markupsafe-3.0.4-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7a83aa6e4805df46fed18e989d3d16f86ef60cb50bbc8d9ce3a6be89165fbf6e", size = 11443, upload-time = "2026-10-02T23:05:12.887Z" },
{ url = "https://files.pythonhosted.org/packages/cc/72/15f2e5ec9cf2eb00d5cdfe968d94e4156a7bd7303832c3f3b2c403a36839/markupsafe-3.0.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2d1b7d9308288661f56672b1b157d75fc536714d3638487bbea17b6318a78248", size = 11665, upload-time = "2026-10-02T23:05:13.829Z" },
{ url = "https://files.pythonhosted.org/packages/ca/e0/4030bea613677e333c8a2c901fd405055f657f9d06acba5b7357984b6ef7/markupsafe-3.0.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:73e77980c7207854f00fc4e71fb1626868d5740ab4012623d55c7a99ad122a72", size = 12061, upload-time = "2026-10-02T23:05:14.807Z" },
{ url = "https://files.pythonhosted.org/packages/f3/a5/28b76a7449eb702966b88bef599e2360b411fbb3afeee8fe560939be06ec/markupsafe-3.0.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7018d4af1cd272e847aa5917983ab5e83e4f6579f9dbfecd4a79c0ca80b144c2", size = 24395, upload-time = "2026-10-02T23:05:15.909Z" },
{ url = "https://files.pythonhosted.org/packages/07/6c/21232811afc3a063b5e934b1ae2efda52f46154ec382f585149c020e61fe/markupsafe-3.0.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c90d5b3d4e944e065a301d741b3c1d784f6bd1f503aa68b4967e32b2ba313d85", size = 27183, upload-time = "2026-10-02T23:05:16.976Z" },
{ url = "https://files.pythonhosted.org/packages/14/38/6ccdfa5b59049cb36fb80cbc80aee9cf1fc9bb77d1335ad435f2070b08cf/markupsafe-3.0.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:18a801868a884f216e784d7d14db2a4077143ce7610440aee2ce8f734e7cfcde", size = 24772, upload-time = "2026-10-02T23:05:18.209Z" },
{ url = "https://files.pythonhosted.org/packages/63/e0/cec6865dfe88cb48fedd4b20aed6af5158e41092adcbf3e028bcc6ec2108/markupsafe-3.0.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:434139499bb20b502ed3baa1f169e618f924a97e7a777fea1a49446d80106cf6", size = 23017, upload-time = "2026-10-02T23:05:19.286Z" },
{ url = "https://files.pythonhosted.org/packages/ee/76/6ed4940bb7648a9aac457c14f870cfdd5105f139a0fb1f29cd61fafa47d1/markupsafe-3.0.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9e227f3dbe6bde7491cf0a9965d00b88c6b1a4a95d11480ddf88bb96d397c19f", size = 22036, upload-time = "2026-10-02T23:05:20.352Z" },
{ url = "https://files.pythonhosted.org/packages/a1/4f/ed476226d4fe46a09090a36025bf319296810028df55eb12f1253b540f3a/markupsafe-3.0.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b8cd1f918b26fd7b1832ece557cc18f2d8747309ff8b3f0ef9d4250c5ad67a39", size = 23786, upload-time = "2026-10-02T23:05:21.576Z" },
{ url = "https://files.pythonhosted.org/packages/9a/35/66ff30450e35ef5fba9ebc930c9411747e537fd9447b65e44f5007e2b84d/markupsafe-3.0.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:a5fcffb37e602b0b3c1638a97746b9b96125caa9bcf6fa41d337a9261de231ee", size = 22672, upload-time = "2026-10-02T23:05:22.922Z" },
{ url = "https://files.pythonhosted.org/packages/32/0b/72f45ce4b4efcbca4b80cf1b06703eff0be8d37e82abb78f66c85a7ead1e/markupsafe-3.0.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5989cb26b2e1efc6a42216a9f6b5ee495ce5ace2e5b352a9af489976b32d1ee2", size = 24107, upload-time = "2026-10-02T23:05:24.175Z" },
{ url = "https://files.pythonhosted.org/packages/d2/03/71776e5fdcba04614b384cc102e8a4198208579d896fd1394cb7cb9aa900/markupsafe-3.0.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:add96447a86d205ab616665d53b2950ee81083757f56e6ea833c8b2917646b46", size = 21615, upload-time = "2026-10-02T23:05:25.215Z" },
{ url = "https://files.pythonhosted.org/packages/ab/5f/801ce02a02e7aee0f784b1ec7843026178f6adeb9c93ac67eb1992a9a84d/markupsafe-3.0.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2628d3a8cb648ecebb3c5d6b0a1052d400e4d8b7ac0fb786be8d285b50040d17", size = 23076, upload-time = "2026-10-02T23:05:26.423Z" },
{ url = "https://files.pythonhosted.org/packages/4a/85/c43776625428f3bb4a61e8633940400e3efe6409e3c6f5bff26de5e45618/markupsafe-3.0.4-cp313-cp313-win32.whl", hash = "sha256:672d207103e6b16ca098611b0f9efad6bc00afd47c03d6ef62186495ca677dc0", size = 14118, upload-time = "2026-10-02T23:05:27.716Z" },
{ url = "https://files.pythonhosted.org/packages/6f/36/163da64de88a13db79214ef75fa041be7fa13bdb42261cf5b7484de14bfb/markupsafe-3.0.4-cp313-cp313-win_amd64.whl", hash = "sha256:1f1f9477e174582b0a1b583d60b66e1f2cf5d3fe12cee985e4aedf44766600e5", size = 14313, upload-time = "2026-10-02T23:05:28.749Z" },
{ url = "https://files.pythonhosted.org/packages/9f/a8/9b662783ffaa1149221432a923cee562f78b9cbbb8baa3df9b3753e63e1e/markupsafe-3.0.4-cp313-cp313-win_arm64.whl", hash = "sha256:06de8ef6331f6e822c28d577dc8bf43fe398800477c49498f38fc38b67ff33fc", size = 14189, upload-time = "2026-10-02T23:05:29.917Z" },
{ url = "https://files.pythonhosted.org/packages/5c/c3/a944f3b0df22bd129e96915b9f4e98d2eeca6516687d7618304a966c3c74/markupsafe-3.0.4-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:4ed644d75aa94a2baf7ec3a96eaa160ea58c742eb9d27c6506053c5c40fc84ed", size = 12787, upload-time = "2026-10-02T23:05:30.971Z" },
{ url = "https://files.pythonhosted.org/packages/d4/d6/a44863f69d88b6c7e27889108f70d47aed259edf89d5df3c5fca1eac87d6/markupsafe-3.0.4-cp314-cp314-android_24_x86_64.whl", hash = "sha256:6d2a9efe686f9de00d0d1ea32a4a5a86d558a2277501bd78d964214eab625e59", size = 12525, upload-time = "2026-10-02T23:05:32.263Z" },
{ url = "https://files.pythonhosted.org/packages/17/8f/168ba80e532dd6a93f96f8f706f1ad41d7990b6e1aeedc1cc0d211a33497/markupsafe-3.0.4-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:8781a792a070cf2bd1b86d3aa943894115faaba6e88122a7bf32d62072742453", size = 11589, upload-time = "2026-10-02T23:05:33.251Z" },
{ url = "https://files.pythonhosted.org/packages/32/b3/aa2c95a574d3af39403a469b295886eb9b6d448da568cbebb5a2cbfdc2e5/markupsafe-3.0.4-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:971a3bbb75d97ae4e2e8f7d4834236f86f85f0c85e04ab2e191db1123b04f80b", size = 11801, upload-time = "2026-10-02T23:05:34.315Z" },
{ url = "https://files.pythonhosted.org/packages/60/d0/34b810107d83840e768bf485de795893ebbae35b26ab061b487adfa0a692/markupsafe-3.0.4-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:8909c2f1c6dd65e054ac4b573a91c8384d1492281e55d82d159d653f7a13adf6", size = 11447, upload-time = "2026-10-02T23:05:35.302Z" },
{ url = "https://files.pythonhosted.org/packages/6c/ab/2f8488f0f817a39fca068d2b17daf446bf5cdb3eae28c3720af534d873b4/markupsafe-3.0.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:4cf3468d5ec187ffffcaca8e61929a37448f215dafc1386a12c750a72fe53634", size = 11722, upload-time = "2026-10-02T23:05:36.363Z" },
{ url = "https://files.pythonhosted.org/packages/ad/40/e2d117b048d47282ade906fbfd92814cbee5647afc13fda88a3406039372/markupsafe-3.0.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:52704c5d36eb6dda8866493decd61111fff86244c9b1ad225ca01b9e91e5970f", size = 12061, upload-time = "2026-10-02T23:05:37.397Z" },
{ url = "https://files.pythonhosted.org/packages/9a/a8/73a81135e85ba66217f5af7facb03bbb386807e1a729ab64532e4c802652/markupsafe-3.0.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1caa2fa5a6184fb233153b35f654e6687bd555476f6170f29d8ee9be1a8b0af9", size = 24434, upload-time = "2026-10-02T23:05:38.407Z" },
{ url = "https://files.pythonhosted.org/packages/ac/ca/fa9216dd01efee2dfdacafe7df32b4d0170fbac694b0c258a193d6e53999/markupsafe-3.0.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:387d8cd30e69b3f0a72877b9ae717033396404e19095b17fe89753a981fda44f", size = 27183, upload-time = "2026-10-02T23:05:39.581Z" },
{ url = "https://files.pythonhosted.org/packages/fa/4e/a469509e538d37af51103b17b073126973f2b1cbf197ff32c7ddf025cfe5/markupsafe-3.0.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:051417f74bcaaefa316276e0ff723f541616ca51043d070da00249d9bddd3e3c", size = 24813, upload-time = "2026-10-02T23:05:40.671Z" },
{ url = "https://files.pythonhosted.org/packages/8f/db/d7282caf7ab03af44d5d6fdbaa019b35c7d7f1c90588b839c07cba640d6a/markupsafe-3.0.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8e9f292fcda89b324f2f5c91d13f1424a153e40fc2756f38ee23b15835ff300", size = 23049, upload-time = "2026-10-02T23:05:41.864Z" },
{ url = "https://files.pythonhosted.org/packages/30/f3/b6a425206e6964efda6acee544d0eb01d1501784d0b8e2dcc74986f33b17/markupsafe-3.0.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:df1ae86ff54725a01fa1a0510b914ca53a161b7050be74f6204e24aded5971d0", size = 22088, upload-time = "2026-10-02T23:05:43.014Z" },
{ url = "https://files.pythonhosted.org/packages/ea/8a/84d3582fc1f0d5bd466cdf2eebf175e172158a6e70701aacec1de1b35430/markupsafe-3.0.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8965520ac587c94a4ac48b729be3d8b8de00af39699b17585dfb599babe77977", size = 23846, upload-time = "2026-10-02T23:05:44.098Z" },
{ url = "https://files.pythonhosted.org/packages/1c/65/db101cce51b7ba4864ac491a9859d297dd1adf0e55b103fee9db9c47c527/markupsafe-3.0.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:340cbb1957ba99929cbf19a75626d36ba1ae21d1730b287d1cf7f824a20c4fc7", size = 22674, upload-time = "2026-10-02T23:05:45.23Z" },
{ url = "https://files.pythonhosted.org/packages/e0/49/ddee9813d71db0c7a5c9d97c832125e6758a0c844777f1cf076569bb0e22/markupsafe-3.0.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:3a93d9616ddecfb393727a0041a562cf0b15a244e20f2bd25efc7949be4c4f17", size = 24104, upload-time = "2026-10-02T23:05:46.398Z" },
{ url = "https://files.pythonhosted.org/packages/aa/0e/7d8518d726726870a2399d69fd30d0fa36c5e57a2132c336b58d7c491073/markupsafe-3.0.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:d2e56fd3b00222722abfb3f5f0759ddbae4b90811b5ad4343c64030ad1bde70c", size = 21637, upload-time = "2026-10-02T23:05:47.48Z" },
{ url = "https://files.pythonhosted.org/packages/b4/b0/b505e8a361ba557dbf3b3aa7331ea39b00d2022a26e925ff8463b9714bb3/markupsafe-3.0.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:0d9c47709875fdb321452056622e930c52afbc07a7d780762fbb8b4d91ce6fa4", size = 23081, upload-time = "2026-10-02T23:05:48.611Z" },
{ url = "https://files.pythonhosted.org/packages/1c/ea/9cc3cea873f980c75cbdb6f4277ce30ee955de38be0b3d02f14c108e0698/markupsafe-3.0.4-cp314-cp314-win32.whl", hash = "sha256:38fc55594dab834470b6733dead2ee9e3f657fb0608c769dcafa0ba5ab52f45c", size = 14272, upload-time = "2026-10-02T23:05:49.707Z" },
{ url = "https://files.pythonhosted.org/packages/80/f0/5792ff768a410f93ee3f84fc19345295ffc352d2c936b424cb37e514714c/markupsafe-3.0.4-cp314-cp314-win_amd64.whl", hash = "sha256:c1bc67752d5f21013cfe430df4062441714eab79f65a6a05e01505957e9c35fe", size = 14501, upload-time = "2026-10-02T23:05:50.788Z" },
{ url = "https://files.pythonhosted.org/packages/5f/cf/3d074a8edffcc6899355232ff2543ae8d929733239596423b7db79698bc9/markupsafe-3.0.4-cp314-cp314-win_arm64.whl", hash = "sha256:7e1636da3d8dfc220b6dd10264db5f2b165e4888c4518594898fbe381049af8a", size = 14364, upload-time = "2026-10-02T23:05:51.857Z" },
{ url = "https://files.pythonhosted.org/packages/d9/31/87ce42159aae2163cf3bbbd0c44bc87780510eecab1ea3859099aed95dcb/markupsafe-3.0.4-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:805c8b84534fa10891890f0e4be39f3a99e94615d93e8836bf9fa1fdca2feeb2", size = 11759, upload-time = "2026-10-02T23:05:52.951Z" },
{ url = "https://files.pythonhosted.org/packages/5f/53/b047207eeb7752e960aca3eb1df5fb7eefa7dd4c62ac49bb156456c8a702/markupsafe-3.0.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:fa95848c929b6a75f6848d3c9793e59db365ee436776e57db835cdbfa79ba977", size = 12096, upload-time = "2026-10-02T23:05:54.066Z" },
{ url = "https://files.pythonhosted.org/packages/ee/51/4326c88a13c7b755657d44b4bb986f8c3d9843ecba7e22d98661d87f9a57/markupsafe-3.0.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e916035e3e9930cbdfdd10abf48861340221857f45509565898e012263f7b289", size = 25699, upload-time = "2026-10-02T23:05:55.15Z" },
{ url = "https://files.pythonhosted.org/packages/f2/bb/990581b7474bfcf2cf34bed6ba5ea23bd87adb9d671213d68e88620e7a6b/markupsafe-3.0.4-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b4d12837e0203bbace818ff4a7461afdcd78bcd782351cea148139180d7bcffe", size = 27804, upload-time = "2026-10-02T23:05:56.29Z" },
{ url = "https://files.pythonhosted.org/packages/6b/89/89491878c28e8291f5aa2fffe2c2d57230d10ae366d55dd810b840513d78/markupsafe-3.0.4-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5086f9975abb1ab531ee6afca1761e4b59a19b446f3f6522ed776963228cfe5a", size = 25912, upload-time = "2026-10-02T23:05:57.416Z" },
{ url = "https://files.pythonhosted.org/packages/30/77/680998b54efdea06fc114565cd739b6d059f826a0279219b218dfa750d29/markupsafe-3.0.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b4a635a0487774f841cb1fb62e907e7195cc95bc761e053184b8acc3ceb20733", size = 23623, upload-time = "2026-10-02T23:05:58.557Z" },
{ url = "https://files.pythonhosted.org/packages/ae/75/2709f5ac5de9467b40b10e2bb8f89cc63dfb74582e09aa734b1124a217de/markupsafe-3.0.4-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb96e6e088d6cf71c1ea977510948320234824cf226e32f6f6e044f7a9c82b34", size = 23301, upload-time = "2026-10-02T23:05:59.94Z" },
{ url = "https://files.pythonhosted.org/packages/a0/c8/39eadc6c5b14c9c7679bfb98f4d4c6a97863b5beb91839aca4d2d6e16e55/markupsafe-3.0.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8b5d563170ff8ba3181caa967c99a3c804d1dedb702c7cb93a6a7c32247da978", size = 24950, upload-time = "2026-10-02T23:06:01.289Z" },
{ url = "https://files.pythonhosted.org/packages/1a/5e/01037f8a43e8ccb0bffb4fbdc5212db05bf080fdd7286cd392332d58128a/markupsafe-3.0.4-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:396ec4e65cc889f69786b3b89478b471cee5a3bcf468b9d9bb03e1a30fb291fc", size = 23330, upload-time = "2026-10-02T23:06:02.441Z" },
{ url = "https://files.pythonhosted.org/packages/d4/f4/23e83ce0596bb0cbe670502d31df8f757bbd01a392aa486fa3b40d1ed399/markupsafe-3.0.4-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:15ba9e28640feef770374b116a6f019c21f52404aeabe516aa7f800587b98cfc", size = 25239, upload-time = "2026-10-02T23:06:03.579Z" },
{ url = "https://files.pythonhosted.org/packages/88/5b/3708897368073cc683d524750474f41a77d2986152c380dcc55b20fdf340/markupsafe-3.0.4-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:d920abdfa61279ba1a2ef9484aab07bf03331f8c08a10120fa332353d06e6932", size = 22767, upload-time = "2026-10-02T23:06:04.699Z" },
{ url = "https://files.pythonhosted.org/packages/c6/61/ebda1307864b409e6b3115757a3d4a09cca46cfb6cc65191b5de226b424b/markupsafe-3.0.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a9f54054101545a9a9cccefddf54316aa6e4491611fcbef9e91b3b6bebec04f6", size = 23668, upload-time = "2026-10-02T23:06:05.9Z" },
{ url = "https://files.pythonhosted.org/packages/09/15/98075cceac3b5ba0dbb8e4762a847be967d2befc349a2cf2d0ac77f62c9d/markupsafe-3.0.4-cp314-cp314t-win32.whl", hash = "sha256:12a606a492de952afcb43b59a14aaaaad120e708d3663dd0fdf2d738d427a691", size = 14301, upload-time = "2026-10-02T23:06:07.109Z" },
{ url = "https://files.pythonhosted.org/packages/0b/a3/768b560fcc4156685cb563d922b217810cfa7bc135773367f62f1f9d2078/markupsafe-3.0.4-cp314-cp314t-win_amd64.whl", hash = "sha256:a18f38cafc329bac5e3c2b96c765b4c96d3d103421ed22ab7988c1e3fce27464", size = 14526, upload-time = "2026-10-02T23:06:08.276Z" },
{ url = "https://files.pythonhosted.org/packages/93/63/da554b4c97a6b0ea3229ca7fe8cbfb620be81613d517f482e85958550537/markupsafe-3.0.4-cp314-cp314t-win_arm64.whl", hash = "sha256:eba154571c16e032112afac0dc2dfe9e63c2ceb7aedd07bb7eecf2ce26d4dd4c", size = 14421, upload-time = "2026-10-02T23:06:09.402Z" },
{ url = "https://files.pythonhosted.org/packages/a9/30/54d11c8ca027114898cab97421fb39e4ffd9ddf47cdbc44df2ec76722da9/markupsafe-3.0.4-cp315-cp315-android_24_arm64_v8a.whl", hash = "sha256:737c9c3981998eba27f11786f84fddcbabc74068b72a4a1f454ea02094b57b65", size = 12791, upload-time = "2026-10-02T23:06:10.485Z" },
{ url = "https://files.pythonhosted.org/packages/10/6d/97c913e253a14bd3cd0e15a5c56d13203b823fa7ee32498342896a072dc4/markupsafe-3.0.4-cp315-cp315-android_24_x86_64.whl", hash = "sha256:489505b03f692c3f376394e49194fa7a7f9e8558d6e293a7056a0032b0c38163", size = 12527, upload-time = "2026-10-02T23:06:11.834Z" },
{ url = "https://files.pythonhosted.org/packages/26/f9/b86d032042a4d597d9e1997f0e5f63a3eedaf11258e0a05760b0a0a826ea/markupsafe-3.0.4-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:077293e425f28ec737dbcad442a71752e28f8ae27cde3d68acd1fb212091cd92", size = 11602, upload-time = "2026-10-02T23:06:13.122Z" },
{ url = "https://files.pythonhosted.org/packages/f2/dc/73c14c1eedf0ac5fa3292ba43435e6c49d2c2050f33cebde541f8f4807f1/markupsafe-3.0.4-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:9348cbb300d224fe3b89793262cb093504d4ae927004468463f745188a193e4a", size = 11817, upload-time = "2026-10-02T23:06:14.227Z" },
{ url = "https://files.pythonhosted.org/packages/8f/69/2c2fcaa5fcee22d72c7819c0d536fd181c74a688e6143845419579cd2863/markupsafe-3.0.4-cp315-cp315-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:b807e598953730f82e4eae3bd30f6a122cf6b31c398c6b504c0e04c13c170429", size = 11446, upload-time = "2026-10-02T23:06:15.574Z" },
{ url = "https://files.pythonhosted.org/packages/88/54/9e5ec76c62e6e2834d5a93623018c943e8b3bb41d663e3fd4c03303b9b85/markupsafe-3.0.4-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:799c39bdf5e2f1292fedd3009f7b3c9e760f10b2420cb9638d56920840ff6db8", size = 11719, upload-time = "2026-10-02T23:06:16.701Z" },
{ url = "https://files.pythonhosted.org/packages/96/24/3ec292b44064c16229e064d770b2625bd8ea941aa61f44905a9fa44942c0/markupsafe-3.0.4-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:ae9dcb8fbe244cb82f8a6458b455b927a03685e383d9bacf1ea5ce180b96dc97", size = 12075, upload-time = "2026-10-02T23:06:17.855Z" },
{ url = "https://files.pythonhosted.org/packages/aa/85/b64fdb1f304848518742136983c24e96d967bfb59a0ea160e92736901ab0/markupsafe-3.0.4-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bced6e2a6dba6a28f7dd3c6ce14df1b2dd495923f16ea484cad03decd463b2b", size = 24656, upload-time = "2026-10-02T23:06:18.963Z" },
{ url = "https://files.pythonhosted.org/packages/9c/18/23997d4c65b355da6390d61cd56e0ab3befd6ba8dda25cb40c602bd0fa6b/markupsafe-3.0.4-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3882fb412298575bae3b9c46868251f15cc69307359f87bb1b382e53d6e5a2c9", size = 27737, upload-time = "2026-10-02T23:06:20.117Z" },
{ url = "https://files.pythonhosted.org/packages/d4/36/35998dead3c6af88c38265a56e58100211f036234ab88eb2283fd4cbce44/markupsafe-3.0.4-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:04e7902ba80ee4bac1d50a549606527a1dcf0476cd81403db41099d3b60ec653", size = 25003, upload-time = "2026-10-02T23:06:21.284Z" },
{ url = "https://files.pythonhosted.org/packages/82/96/ef49135ce260db4ca4a12b119ed468449cd248db6b1468e2112b546d7a2e/markupsafe-3.0.4-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:925f929d6b59a8b3f8b8c6ac363cd0af7eecc81efb3071770b3c6717c450a369", size = 23111, upload-time = "2026-10-02T23:06:22.524Z" },
{ url = "https://files.pythonhosted.org/packages/50/7d/83126e338bd88c17a220668235368ad719fd4638e426739858cbb8508f77/markupsafe-3.0.4-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f68edfc67aabac33708941f26f22a7b8e9f81429bc0cf249fcf7d66b23af8d19", size = 22403, upload-time = "2026-10-02T23:06:23.785Z" },
{ url = "https://files.pythonhosted.org/packages/83/dd/daf7e420de23c8206c365204e7b85e1251d8e19d34196a56336f316e5ed2/markupsafe-3.0.4-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:e5c802729725bd07e2bc3ab7b76dc7e0bbfc53129d8f1eb1c002c24cf774717e", size = 24083, upload-time = "2026-10-02T23:06:25.037Z" },
{ url = "https://files.pythonhosted.org/packages/19/3c/11eecdc06bc44ad5570350085b572ebf049e8f9a38d1ece6d76640b739cd/markupsafe-3.0.4-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:55ffd6ce583d97dc71dc92e930324c8c0d25aea7e3ade6ae54ef77cedb096811", size = 22931, upload-time = "2026-10-02T23:06:26.328Z" },
{ url = "https://files.pythonhosted.org/packages/0d/9e/ac0fd77f2a726e56ecc3ca0235d095feace1358d1b822406c2a2ef26a4dc/markupsafe-3.0.4-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:2cb3dd71fc6be918ad4264346a8ed69485f9b7ed7bf35495d8e22807cd6b8bea", size = 24299, upload-time = "2026-10-02T23:06:27.742Z" },
{ url = "https://files.pythonhosted.org/packages/d7/09/c6bd842ad58ff5b3bc76eeed7e9a42a6f11adc5d090ec697b72c9672731e/markupsafe-3.0.4-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:94f5407f7bc64fa6463906b896f9904beeeb7dd8dc116ee8e9056c8714ff9916", size = 21948, upload-time = "2026-10-02T23:06:29.274Z" },
{ url = "https://files.pythonhosted.org/packages/a3/46/82f586711fed61e86faa1ee1bc317d68cd45a10c8bdbe3f7d1fdf9026ad8/markupsafe-3.0.4-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:2dad610540cb2e6272855c178f08ae9a1c7ac258a7fb71660553a5f104b42741", size = 23150, upload-time = "2026-10-02T23:06:30.583Z" },
{ url = "https://files.pythonhosted.org/packages/19/2d/2dfdce99318abbfa26925195fbc17db188c46a1ec6457be121b6f9cfeb42/markupsafe-3.0.4-cp315-cp315-win32.whl", hash = "sha256:03470d1a8268e692ecf79ecd565593e59d44219377a7ead61f1f1b94c1f7ff6b", size = 14269, upload-time = "2026-10-02T23:06:31.949Z" },
{ url = "https://files.pythonhosted.org/packages/5b/ec/6000fd82e8791e58fcd0456ec20f098957e2b03d5ed02eb73241a577c0ba/markupsafe-3.0.4-cp315-cp315-win_amd64.whl", hash = "sha256:d882a373d8093c2941e01291b7ced96e9cbe4781da9a7751ca7e6c70385e5214", size = 14496, upload-time = "2026-10-02T23:06:33.258Z" },
{ url = "https://files.pythonhosted.org/packages/bc/66/e73bd5016421d5d6e2fb6de7dd609f9de020942ac8c626526bd8c6eeaf82/markupsafe-3.0.4-cp315-cp315-win_arm64.whl", hash = "sha256:353bd63081912ab8cfa6a0c7d185934cdf8426f04c618bba6bc4b394f2069b67", size = 14361, upload-time = "2026-10-02T23:06:34.539Z" },
{ url = "https://files.pythonhosted.org/packages/90/df/cb8c3dc98d313a951df2f8968f44e4cb5643df6d3cab749a530ce2f7d972/markupsafe-3.0.4-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:c61750fadcd119d0825bcb7d7d675dd264dcc89cc05292aab5be68ebdbb374ad", size = 11760, upload-time = "2026-10-02T23:06:35.807Z" },
{ url = "https://files.pythonhosted.org/packages/d6/bb/4af9b3ca0753d654ac75f9531d5bd741bb77ca6e696f36807c475ffc099a/markupsafe-3.0.4-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:1c0df495a977d10460a94941799c72d5b5ab03d3858d949b55b5a66c8f371c99", size = 12108, upload-time = "2026-10-02T23:06:37.089Z" },
{ url = "https://files.pythonhosted.org/packages/3f/d4/b56429313aee5fd59b079c3df5615299959e25e7113eb6d8caadbdd7d38a/markupsafe-3.0.4-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:02fa4acbc6a3fc5c693c34d4dd8c1130b7fe99cc915181b0ddd6f72aeb296002", size = 25762, upload-time = "2026-10-02T23:06:38.419Z" },
{ url = "https://files.pythonhosted.org/packages/65/f5/34c181e891aa4f7d59c918584672e0c5eb7fffe76c1387d1246008bf4081/markupsafe-3.0.4-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:05295589e619b9bed252a86b532b8e27350abc372d18ba89b59375325e91ec1e", size = 28400, upload-time = "2026-10-02T23:06:39.819Z" },
{ url = "https://files.pythonhosted.org/packages/ce/b5/ad14694fd0ac9a5ce30bc6498f2999378f418583dd1679cca5a1b512957e/markupsafe-3.0.4-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:be6cb0c799abb0e2ba3e618e6d28ddddf7e485f6c2ce938dfa237daf3905072c", size = 25946, upload-time = "2026-10-02T23:06:41.381Z" },
{ url = "https://files.pythonhosted.org/packages/d6/a8/26b606445387d0ceb1eb1f21840094b84e4e3c3c3983d80d10b89823b490/markupsafe-3.0.4-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:26e9867520db70d37f7fb421a7f0d8adb40171011fb84ce869afa1a83370dfa8", size = 23634, upload-time = "2026-10-02T23:06:42.748Z" },
{ url = "https://files.pythonhosted.org/packages/39/a2/b8814de672f1f0094d498bf646f2fec9d6356b503d28ef500b71c5095377/markupsafe-3.0.4-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f03460ff076f70ab595bb45a0205ccea1971443575b6920c52e755dec2b3fbfe", size = 23488, upload-time = "2026-10-02T23:06:44.176Z" },
{ url = "https://files.pythonhosted.org/packages/db/c7/287223376fb73335a3cc5d6eb22c6ab01358cf33945a9c39c06b9dac3f4b/markupsafe-3.0.4-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:436e3ffc6310d3c41878c601db29098102fe5d8a467c49da4a4125254e0980f2", size = 25037, upload-time = "2026-10-02T23:06:45.646Z" },
{ url = "https://files.pythonhosted.org/packages/f9/29/4df8355e313426d19e62ba33e0253c009ca12a0894ee77d67fa67255361c/markupsafe-3.0.4-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:4e2c4809c14559aa7ef426f27fb35afbb38104c349a903bf8f3600456764bb38", size = 23543, upload-time = "2026-10-02T23:06:47.264Z" },
{ url = "https://files.pythonhosted.org/packages/71/e5/8377731e8495668dcc768f645e717df18318c841edaf023a99395f6da9b4/markupsafe-3.0.4-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:da2af0d7aebfc2074080d72efa6ab8317c62481ef1f896f65d9999c1c01f4494", size = 25282, upload-time = "2026-10-02T23:06:48.795Z" },
{ url = "https://files.pythonhosted.org/packages/ed/5f/373456e37ceb1478d657d6fe769cbe0a39f0a8dfc1548eeb19c471eefdd9/markupsafe-3.0.4-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:aa2c838cc024642cc04c6854232f32b43e5e22833dd11119c1766c7873b8370d", size = 22993, upload-time = "2026-10-02T23:06:50.31Z" },
{ url = "https://files.pythonhosted.org/packages/d7/93/2cbd5628435afb6f541bbaced4bce0c2edac4b09a142e6e928b8b0da9858/markupsafe-3.0.4-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:b91cc9d336957239ff200f30097e6fea2dc6d6fb3c81e853eaa09eac904fd894", size = 23712, upload-time = "2026-10-02T23:06:51.759Z" },
{ url = "https://files.pythonhosted.org/packages/81/99/157e10966b033b363aeda5263e82596ee232a0b1d082fdbf90aa417ff083/markupsafe-3.0.4-cp315-cp315t-win32.whl", hash = "sha256:e49fb0d1ce92cfa0cb198cc5b1b11cdf9d0638658e2a2db2687e39db7c87fc78", size = 14300, upload-time = "2026-10-02T23:06:53.241Z" },
{ url = "https://files.pythonhosted.org/packages/33/05/55884815414c9706a23deca150b72c25a62109e65b0b6ce232077802c719/markupsafe-3.0.4-cp315-cp315t-win_amd64.whl", hash = "sha256:4f6e0852a0283b1b1fd776eeb7b766a5f440b3e2bd31ab51af3b400585f3965c", size = 14522, upload-time = "2026-10-02T23:06:54.729Z" },
{ url = "https://files.pythonhosted.org/packages/92/f9/ecbde7149e95b8a0f18e16d5d747f7dc06049d5da2e4f77f6f5e4a1f46a8/markupsafe-3.0.4-cp315-cp315t-win_arm64.whl", hash = "sha256:39dbacefc411633db5b4378b066a9aca70a3d7e2922c9e578d825f844026eeba", size = 14417, upload-time = "2026-10-02T23:06:56.246Z" },
]
[[package]]
name = "mypy"
version = "2.4.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "ast-serialize" },
{ name = "librt", marker = "platform_python_implementation != 'PyPy'" },
{ name = "mypy-extensions" },
{ name = "pathspec" },
{ name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/34/4e/64300736cf0a0373a27b94a91b664ee7382e36f77b0621bae6381da3e180/mypy-2.4.0.tar.gz", hash = "sha256:77bdaebd452f43fcfc4cc3ba94352a3ea537cd01e3f2d0879f48673d2ec00d6e", size = 4064425, upload-time = "2026-10-01T20:40:39.229Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/26/67/e53965e67d23d48e78dd603aa7525a8d77e7818c23954cc217ccde5cd5c0/mypy-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5d20e6c7c35fcbf2a0ebdd0eaeacfbc243009dfd33ab7822d54e213912e6dbbd", size = 14315745, upload-time = "2026-10-01T20:39:25.03Z" },
{ url = "https://files.pythonhosted.org/packages/b1/5d/a588ccd57625822d8484d7aff4e9c70f88d042a91c2ec84324a2bc14b3f3/mypy-2.4.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3011537be6cf1de4511c0255a324362a812b58184bbe61e15f59c8b31033bd74", size = 14465652, upload-time = "2026-10-01T20:38:57.19Z" },
{ url = "https://files.pythonhosted.org/packages/05/af/b4978a5566cb829ca563dc08e3ad8d944f116078786ad54ba3dff2bcb64d/mypy-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a96b07a49b7b1d025ce59c1b3acbcf24bead9a83da4523c4a6bde1bb94e7a0e1", size = 15419180, upload-time = "2026-10-01T20:40:27.808Z" },
{ url = "https://files.pythonhosted.org/packages/b2/8c/52c71f31c54d0a749d832cc73b933c6e38c52d9b270d5503e031c73723dc/mypy-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7c4f8f8d1d1c0e2832d8ee7113dd08f6df6c7aad9e863fcbed9f25832be0b8c4", size = 15669212, upload-time = "2026-10-01T20:39:20.443Z" },
{ url = "https://files.pythonhosted.org/packages/e8/55/ba63121494404fd7d3787ec176ccd02820d6ec125ac4e7c4c0b79f2cc6c7/mypy-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:ba05652540bf12828e52abae807b024b09ca144ff4f75e2450a81d69c376425b", size = 11299572, upload-time = "2026-10-01T20:40:03.627Z" },
{ url = "https://files.pythonhosted.org/packages/9c/9c/385c81b5c0d3a2917f077c4da660d0493f9521ccfd4b058e33b860f72d02/mypy-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:6306086b87cf7f8a29aa618d9fd9bffb56c59247166b9660fdb54d86d7714ecd", size = 10869751, upload-time = "2026-10-01T20:40:25.483Z" },
{ url = "https://files.pythonhosted.org/packages/68/ed/e5d7cf4017e74a1c1e1c4058ce8f614fc1e3e7606564f47166e22bfc9f95/mypy-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e05ff2925d8b37ad26c80c1b9dc43ae5d455da2df1e23c24c095a6425917c57e", size = 14378593, upload-time = "2026-10-01T20:38:48.222Z" },
{ url = "https://files.pythonhosted.org/packages/30/7d/12d994886a922f0f1997becc9c6625198d61eeb5962558a886af7dd38d54/mypy-2.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:29243242cf72582b65f9582ad9e56e8cb281566ed3519f4cd70bb8b9f2977e90", size = 14464697, upload-time = "2026-10-01T20:39:11.059Z" },
{ url = "https://files.pythonhosted.org/packages/f3/9e/bcc9af755425ad17790bf11d73c2ea7592914cf309ee1340997670f9d57a/mypy-2.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29eb0b9427a6b11b992e452f6cceb8af724f4dceb47e779d0b35e405e996ea5e", size = 15552257, upload-time = "2026-10-01T20:39:56.269Z" },
{ url = "https://files.pythonhosted.org/packages/af/0c/3343fc4525d6f00d75ad17a93a9f052d5163641cb8911840d4a12cb59ff2/mypy-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e3ebe2f72a2a1156065a9851570ffbf50c0a93cdccadef9c6e05c508a4fd10b1", size = 15800443, upload-time = "2026-10-01T20:38:54.815Z" },
{ url = "https://files.pythonhosted.org/packages/8f/0e/69aac6b8159da7c53e6115a2be1bf48e85503402cadbf506dd708e8b2ad7/mypy-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:236e0d68f6941992b0811128e652590f590db444ab29ad8f1324765b9298b946", size = 11381574, upload-time = "2026-10-01T20:39:49.406Z" },
{ url = "https://files.pythonhosted.org/packages/6e/d3/d32ce4feb5993eec09d2024bef16cedc9b93701b1446b86092f08b24491b/mypy-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:82d0f94c8587ccb472622ee7795280aaa38a06640d5f45b3f16909d6dd86a989", size = 10944729, upload-time = "2026-10-01T20:40:15.203Z" },
{ url = "https://files.pythonhosted.org/packages/44/f2/eb15183c97c69d7cbfac990a6efd33a19ecfd97dab9e714c742fa78a784f/mypy-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7da85fbcff6dac1abcc636707bed38b45598131fb7a605d9719c70b5cc733af8", size = 14213395, upload-time = "2026-10-01T20:40:21.178Z" },
{ url = "https://files.pythonhosted.org/packages/8c/b5/ba91b6ff65e4d6b6ff53b2b3b3ac5f1babf0c7c27d0b43a0196b1c967926/mypy-2.4.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4209da39d85cf240f762af622d8180fcdfcb4727d021f44ade62d613a1a43324", size = 14373009, upload-time = "2026-10-01T20:39:58.86Z" },
{ url = "https://files.pythonhosted.org/packages/d5/c4/484275efc935c0003e55e4e8a33e4b8e99528ee956c12256ece4708f903f/mypy-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6be721bd4bd57576193653b75b4af3461c9d0bf7dd8b528f782e9be210dc75bb", size = 15465557, upload-time = "2026-10-01T20:39:01.794Z" },
{ url = "https://files.pythonhosted.org/packages/50/30/66eb6fdd0875e3c9025a02f0bb0ea2e524b74274b658c37fde0068c4939d/mypy-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e1fde197ae65be856a034a91b70ed747a16562ca69577785f06c661548424bf1", size = 15728673, upload-time = "2026-10-01T20:38:43.724Z" },
{ url = "https://files.pythonhosted.org/packages/58/bc/2aa98fd7f49c42dba8e9c065886fadffdd00f3c654cff3f2a7103a797ac8/mypy-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:295ecf2e57542cd836ca537486951289678c8c7d1ee6ad74ebe29b2168a003cf", size = 11389803, upload-time = "2026-10-01T20:39:37.547Z" },
{ url = "https://files.pythonhosted.org/packages/49/41/17b60df2d946792ef6af43b89351f5c9ddabc69053206b2304945572a744/mypy-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:bc378bdad4e9f12b5bd96466083d1e71acf00594ec9c7b2bdb5e02816f77f303", size = 10951060, upload-time = "2026-10-01T20:39:04.015Z" },
{ url = "https://files.pythonhosted.org/packages/e0/66/924be0b653372ed31ad5c48e26044cc00840e591943a56e61621cf05b60e/mypy-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:058165f564ccf559c68c70fec2091fca5891110480210c22594635e3f6683437", size = 14234230, upload-time = "2026-10-01T20:39:44.535Z" },
{ url = "https://files.pythonhosted.org/packages/56/39/c4f176880a4177123576de6cec6309feea8f42fca2bf2f6584e88054f656/mypy-2.4.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9fa247e02b505a45a2775f69df38d360d197e3790bc60f717595db9eda358b6e", size = 14392944, upload-time = "2026-10-01T20:40:05.78Z" },
{ url = "https://files.pythonhosted.org/packages/bc/1c/26e16977e25ef2494a74f8ffc872a76ec2c3aa43c3156057cbdf88f352c5/mypy-2.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20e9a5cd875837520c43db98dea0b6d0c2197833d95c30127d8f570fb9b1f00b", size = 15441463, upload-time = "2026-10-01T20:40:32.412Z" },
{ url = "https://files.pythonhosted.org/packages/31/9c/9e4b049f0ecefbfd6817ca2a16eea55dd74a07950268edc6cffd29ccfe98/mypy-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9f03a7828cca2b0adcd6662aee8f2711ff8830e1027641fdea3ab0b787483566", size = 15705406, upload-time = "2026-10-01T20:40:34.844Z" },
{ url = "https://files.pythonhosted.org/packages/4a/5e/e861b5f6c5ef9ee6cd24683aed1edecf82a26dbd536049f9b7850b586267/mypy-2.4.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:9279488933040b638c0ab739084c0ca100efeea6db581bf5d7628d8e89de53fe", size = 7897523, upload-time = "2026-10-01T20:39:39.861Z" },
{ url = "https://files.pythonhosted.org/packages/3a/87/61ffee58b25a956532a6006fae84918a2de849ed25f397492b2e815fe7b3/mypy-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:2106b55105ba5ea9be4f53a24517fc5fa927ff1585edc9bc1a975abb72caef89", size = 11576345, upload-time = "2026-10-01T20:39:41.553Z" },
{ url = "https://files.pythonhosted.org/packages/a1/88/a331c20698971c2ce8d1c30f317fd61b5be13a85b1f053e12dfa22ac6568/mypy-2.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:528c8744b8b5e3ecb8774f86af38d2376216816e9908317ad055f3c9c2d74799", size = 11172062, upload-time = "2026-10-01T20:38:59.534Z" },
{ url = "https://files.pythonhosted.org/packages/47/c0/4f7daa73270dced8e86c6f4a911c68082d03a84e6c1ec9bd916028d66131/mypy-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0bb95cf34899e4619c61ab0a8667804e139e580b30d5df12af2102dfe44d0c97", size = 15711208, upload-time = "2026-10-01T20:39:30.597Z" },
{ url = "https://files.pythonhosted.org/packages/2f/05/f1afa303c678be24cf7a266d38fb24b3de4599a024c2f9ba0d5905a3efa3/mypy-2.4.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:86d616fe84c6eab8026f8c50ab5bcb90db780d2ccd233d971e34e92bede9b359", size = 15935442, upload-time = "2026-10-01T20:39:22.781Z" },
{ url = "https://files.pythonhosted.org/packages/9d/d6/6a1a45459b63716e0d035f4892a926d3054f0a8cbfa02551d228a9946083/mypy-2.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3f86fd1313dd69d013e265f1fdcd12ea7a9d606f9875b2a3db946cd334555f3", size = 17240044, upload-time = "2026-10-01T20:39:32.95Z" },
{ url = "https://files.pythonhosted.org/packages/87/85/ae33bee66c13f98d421964d87bf0888be941063bc75c1204a4cf142cf1cc/mypy-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:720434d48542ecfe84d32d287b727569d3fc8f5769acd39051130e490a5c295c", size = 17545856, upload-time = "2026-10-01T20:39:08.827Z" },
{ url = "https://files.pythonhosted.org/packages/df/de/eeff209b65c3e267818d79333bb9f058da6e4e73761461bd94748a2eb628/mypy-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:a6e851b82c0661f69f1630fc16172c68787a6a9cf0991e7c6437d60976cdcd76", size = 12369342, upload-time = "2026-10-01T20:40:10.516Z" },
{ url = "https://files.pythonhosted.org/packages/2b/43/e62d8d5c1dd737aa248968302ff7d6eabf997c3301773ed8bcb64932ca77/mypy-2.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:3bd0e340f0ebe65c548210f53be3fd8192e83964760caf0c28bef368e68b0d37", size = 11849099, upload-time = "2026-10-01T20:39:51.834Z" },
{ url = "https://files.pythonhosted.org/packages/2e/5f/335b8980055118dc131355155883fb676bb2161a0d97e08658e479c776fb/mypy-2.4.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:afa89837d9be67e0cadfa33bca3bb7efdda98c3b07e74dc3b635ebfb1c8a926a", size = 14241302, upload-time = "2026-10-01T20:39:13.227Z" },
{ url = "https://files.pythonhosted.org/packages/18/37/1482fdc49332b145828912b15f16eee0c4ca70a8bce0f6514ece79b14680/mypy-2.4.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fb443e81057896132d3642d6be219e6efd158691ac7883e3ba8fcb469865f05d", size = 14408200, upload-time = "2026-10-01T20:38:52.576Z" },
{ url = "https://files.pythonhosted.org/packages/04/09/dce2e8f6c1b31053c430ef6963f6f7a38ccb49b90c5e01e37ed0129b7d5a/mypy-2.4.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7f38f57d344f8b6accb40e01c3d83cfc590498231724d16c07ffb7940f157818", size = 15444409, upload-time = "2026-10-01T20:39:18.1Z" },
{ url = "https://files.pythonhosted.org/packages/43/c5/91b68306da4cd280cb15be35dbb5ffc343cabd67c4b121b6625bf2d13177/mypy-2.4.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:e76172710bd4e5eeae061abfd68347e5264632e02778be61784671ae3a2132f5", size = 15731186, upload-time = "2026-10-01T20:40:23.426Z" },
{ url = "https://files.pythonhosted.org/packages/64/71/2d0340182a8f27352fb1e25531355951108b506097c433937e9eec452ffd/mypy-2.4.0-cp315-cp315-pyemscripten_2026_5_wasm32.whl", hash = "sha256:f83353e47ab520bf6fd4df8f5897d9fe081211f2fbc4b7d37736a3e3c166cbcf", size = 7897838, upload-time = "2026-10-01T20:38:50.779Z" },
{ url = "https://files.pythonhosted.org/packages/3e/08/32703c117e134c02efa2a82705bb40cee91eaedea10b6530e20eba651b1f/mypy-2.4.0-cp315-cp315-win_amd64.whl", hash = "sha256:970b221ed5842213d98e3c480c08f795ace4b1f81fb21e1b126bd0476bce1c34", size = 11575700, upload-time = "2026-10-01T20:39:53.982Z" },
{ url = "https://files.pythonhosted.org/packages/ab/08/08bb269feafdaad031046ee2d771528a64467e6a180f962afc28c4a3ccd8/mypy-2.4.0-cp315-cp315-win_arm64.whl", hash = "sha256:502b94b0b331f7dafe32fd6b151797ddbb4f32385b362e722c783a025e5954a3", size = 11172908, upload-time = "2026-10-01T20:40:12.91Z" },
{ url = "https://files.pythonhosted.org/packages/fb/3f/c5c92626006ca92c7686adfbece47fc6a0daa0e54753952a9ad13ce0561c/mypy-2.4.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:c9de622fd397495695d0598ddc789222bfcfec9d7c9ec3a1e385c855e3bc5e01", size = 15705970, upload-time = "2026-10-01T20:40:17.79Z" },
{ url = "https://files.pythonhosted.org/packages/10/f3/863365f7997a76a5a1dd42d7902ab05afa4124e8419089cbca1ce2554db1/mypy-2.4.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9f459f0b4f0596d9d51fe7716b404b35287b99e77da98a7af90a65dd5fd61141", size = 15942234, upload-time = "2026-10-01T20:40:37.243Z" },
{ url = "https://files.pythonhosted.org/packages/f6/30/2f45b1f425a2c95dbe1a3f4d076bfd42b76e9615dba5906230703b14e4eb/mypy-2.4.0-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f9b028548b3af480e2b1ed8df14ccaac86f99c9f600d1580770ab7ba3dcd40f0", size = 17218364, upload-time = "2026-10-01T20:39:06.497Z" },
{ url = "https://files.pythonhosted.org/packages/43/8b/5b2bbfc69e84800b78fa2dba16d995b003f93b573558e412c5490d6e6c37/mypy-2.4.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:cb734b2668c1f40d07ce093bbeb4407e9527c67901627b0e1679825be3f09975", size = 17557934, upload-time = "2026-10-01T20:38:46.077Z" },
{ url = "https://files.pythonhosted.org/packages/df/c0/1a5dc601c22041a7bbfe1ff71cf097fbbd4fb49930867c6789baf5102106/mypy-2.4.0-cp315-cp315t-win_amd64.whl", hash = "sha256:172e30b8fea631fe310f0c665477f52d9ea40bb4e99e0c81dc30118563b13710", size = 12350955, upload-time = "2026-10-01T20:40:01.52Z" },
{ url = "https://files.pythonhosted.org/packages/1c/bc/697e9e26fc2a86c094ad67ee1e419971b7f01ded66ee66231b09e9f3e12e/mypy-2.4.0-cp315-cp315t-win_arm64.whl", hash = "sha256:5786ef987b3767e51aaa53f20aec104c0252b42ecda7aef8e8b4cbae279b05c5", size = 11842738, upload-time = "2026-10-01T20:40:30.026Z" },
{ url = "https://files.pythonhosted.org/packages/81/12/46ae8670c98a3cd0286ca5645c2f918f8f6be65edfed81b916010619f668/mypy-2.4.0-py3-none-any.whl", hash = "sha256:d01c5d26a352acc6d5cf3128225477e1e8465e8d3029d4c345807fbf7f3cf093", size = 2800734, upload-time = "2026-10-01T20:39:26.837Z" },
]
[[package]]
name = "mypy-extensions"
version = "1.1.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" },
]
[[package]]
name = "mysqlclient"
version = "2.3.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/ef/8f/b9488795d21a76c1520905feba5afb6233f16510797a28b51f2b2688c93e/mysqlclient-2.3.0.tar.gz", hash = "sha256:bea8294964266f6486f1ca514ccfcdbc54d4fe0d32882b38c1d4594df870be8b", size = 102185, upload-time = "2026-09-14T15:38:30.784Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/bd/9a/49c257f71e187f37ec24cc4a7c071b1788a819054ee3b3133332c074b2cb/mysqlclient-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:6a691aab1a6d22fb04aa08977ced9ecf0c1c781d0d985f7814972c3626db9390", size = 217316, upload-time = "2026-09-14T15:38:15.847Z" },
{ url = "https://files.pythonhosted.org/packages/87/91/cdf42e08f3188ec4efb5e89883afb78cda3db50cd68616bce5814a27b769/mysqlclient-2.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:8b3a5ebc0a2983bc252116dd132ab4c746085fa727b5c98c09edcda09dc09d0f", size = 208447, upload-time = "2026-09-14T15:38:16.867Z" },
{ url = "https://files.pythonhosted.org/packages/61/48/5474ffb47d1f27600737ae6b4860fc4bbc17b7e7f1dec9b8b765a75d66e5/mysqlclient-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:effb81eb6d1f1df6c1d95f63f117bec5007e9c64487e9fa17d5696f2a5338358", size = 217531, upload-time = "2026-09-14T15:38:17.871Z" },
{ url = "https://files.pythonhosted.org/packages/a3/37/9205f687a60196e77d9bc4dd94fdb3c88a24b5cb920fdaf1acf363791bdd/mysqlclient-2.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:7c3c4b3edcc7dc50d23fb5634e0e82bce8ab7de5b83d03fddc1c9979c18607a4", size = 208548, upload-time = "2026-09-14T15:38:18.884Z" },
{ url = "https://files.pythonhosted.org/packages/1d/12/cf11b4df3ee7ca9957487a5e4c99f33611119b086b1d94e14a2ceb21797e/mysqlclient-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:60365cce6765b94eeb621aa0f9505044ec9b4ea191cd68500f0a35b2d6d2758b", size = 217521, upload-time = "2026-09-14T15:38:19.87Z" },
{ url = "https://files.pythonhosted.org/packages/6c/ed/4ef9c56dd78a5b6f4ede1574629e532e3f2b97bdd764a6d172fb7ed20fc4/mysqlclient-2.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:a6beb9ca67a9224ff4b45f7f9118f0932038fa38d59ca2e38ae35b5225984d7d", size = 208546, upload-time = "2026-09-14T15:38:21.073Z" },
{ url = "https://files.pythonhosted.org/packages/6e/5f/f62d1263a942e97ca34ea8bf151c13a638fea7a5a544aa9db3d6dad7671d/mysqlclient-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:5d4c53eb9c5625dd68b6fed32c8cf00ba19cd1c3073645dec309a9d16bd029e2", size = 222543, upload-time = "2026-09-14T15:38:22.036Z" },
{ url = "https://files.pythonhosted.org/packages/9d/e5/1de3e1fc27009a6da30a52167e98f52ab4277d089eaff7152f6156745af9/mysqlclient-2.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:cfe14103280d5a4968fe8a3ace2a8939ef68a1d881aec9872d06746106b49f7f", size = 213120, upload-time = "2026-09-14T15:38:23.063Z" },
{ url = "https://files.pythonhosted.org/packages/b3/ea/d7ebc53af9d3341e5c049795ec5e88946d83cbd26ee468475ae0c3b21d7f/mysqlclient-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:673891700dafbc66a6a8df12059b53a65905ec6e8dec615392fb984299880c0d", size = 222969, upload-time = "2026-09-14T15:38:24.168Z" },
{ url = "https://files.pythonhosted.org/packages/4b/42/9ff798c066e33df9f7b58822a3eaf26185c3cb7e61a8186a56243b006066/mysqlclient-2.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:fe27c63ba9088b28467bf276f93f0b4a9062beabaeeb9692593e774d1146cce2", size = 213680, upload-time = "2026-09-14T15:38:25.259Z" },
{ url = "https://files.pythonhosted.org/packages/d2/0f/29185111b7c0dd264e910c1250f2fd9a452ebad7fb272e750d8ffb18e67c/mysqlclient-2.3.0-cp315-cp315-win_amd64.whl", hash = "sha256:3c601984c286c51080e0d3e9a857bc014713e6338b5f9c0a5df453a341b14022", size = 222537, upload-time = "2026-09-14T15:38:26.308Z" },
{ url = "https://files.pythonhosted.org/packages/32/7b/4a050453adb5d07ee5f979f17409f93be545baae786dd58698f82b08a3e1/mysqlclient-2.3.0-cp315-cp315-win_arm64.whl", hash = "sha256:3d39527a5525b4ebff99721d063f4fe9e459b9e437c7b7698374966d92d4355d", size = 213112, upload-time = "2026-09-14T15:38:27.329Z" },
{ url = "https://files.pythonhosted.org/packages/a2/13/a046e9df6d69778b7de66f3d2ad83e563045992959efafb7b2ef62af0560/mysqlclient-2.3.0-cp315-cp315t-win_amd64.whl", hash = "sha256:24164ba592065ae5ff0149bb5707d05772335935059474fb75d864e5d0f94d63", size = 222969, upload-time = "2026-09-14T15:38:28.468Z" },
{ url = "https://files.pythonhosted.org/packages/f8/13/cf40c2957bebe95fa109feb8a28fe0871ba4bd5e37c77b6128114ec20712/mysqlclient-2.3.0-cp315-cp315t-win_arm64.whl", hash = "sha256:f1ec49f73dad7df8f2da4d9de0f875f03c8bd44fbe77878522204c0646822f63", size = 213723, upload-time = "2026-09-14T15:38:29.69Z" },
]
[[package]]
name = "nodeenv"
version = "1.11.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/9a/8e/105de02c1322cfada6d9710d9146ef8026419d433c9d08359a2d35805811/nodeenv-1.11.0.tar.gz", hash = "sha256:3ce8fe5b71d16e8af7039ca65257354100bc772965d6bc549070649e53b1b146", size = 99301, upload-time = "2026-09-26T11:29:21.367Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/54/c8/12811c9b48fde162bb72b6f2e78fada9a247a09d7bb5be2050a5d099c77b/nodeenv-1.11.0-py2.py3-none-any.whl", hash = "sha256:edaa16e6c14d7cf395d75d4bbd5a26390f4dc06501a33b4e76282b02cc688a25", size = 34277, upload-time = "2026-09-26T11:29:19.933Z" },
]
[[package]]
name = "oracledb"
version = "26.0.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "cryptography" },
{ name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/8c/f3/22113415f48b6608ada31ebb46047b3b8ac361dba393d1b5ed1f768d8f6a/oracledb-26.0.1.tar.gz", hash = "sha256:786397a6b37e94ebfa6c1c6cd026755eb8fccfd39e15bcb64cb5879491882aef", size = 910463, upload-time = "2026-09-22T21:23:20.378Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/ce/91/e63f777028a560908bc3662b1cbbaf8aba3a27dd57304655349fcbd128fe/oracledb-26.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c8635ed9f8d659421679e16d7da56a0d50078d91b40782fb9c27c85f8d6c3075", size = 4806896, upload-time = "2026-09-22T21:23:36.916Z" },
{ url = "https://files.pythonhosted.org/packages/0e/59/149845af7f23cac1138f76ff1f68d0e6e03fe65e67da8084251c98bc4fa7/oracledb-26.0.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1872361b806678c8865e375b8a46b59e2b4923191fb49af37d1dabc9438189f", size = 2633349, upload-time = "2026-09-22T21:23:38.505Z" },
{ url = "https://files.pythonhosted.org/packages/e4/58/caf7db67e8c66e0e099c30b58d257e3a60b1b33c88b331dd2802c9e356df/oracledb-26.0.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5b6949975dcd283dd4904c79c2263bbb32843116eb07f16b266b07b069ca2593", size = 2829714, upload-time = "2026-09-22T21:23:39.971Z" },
{ url = "https://files.pythonhosted.org/packages/2b/e8/979beffc989f146ae5e37cd5b53ebe08231306afcd5ffe245368a2710a39/oracledb-26.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7d1fecfa6e7c39a3ee8aedeca7be2e48f4008d90cdcfa1b49ae9f825827b8156", size = 2685600, upload-time = "2026-09-22T21:23:41.73Z" },
{ url = "https://files.pythonhosted.org/packages/29/57/5eb64f683afa2b56ece4f8d81bd09d60db19ff487c9a92911bff2be6c795/oracledb-26.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7d407685928a87240c54d2ca8cc5e0a89fa44639b459030519f120db461004a0", size = 2856509, upload-time = "2026-09-22T21:23:43.229Z" },
{ url = "https://files.pythonhosted.org/packages/c5/c9/49e89422cfbc04fb93aabaca1008892322ea8c177136e14e86c50131270f/oracledb-26.0.1-cp311-cp311-win32.whl", hash = "sha256:391b61d248ade2f988581a2acadce20f3b3b21886481fc1e5bc57aceab7ab376", size = 1608982, upload-time = "2026-09-22T21:23:44.594Z" },
{ url = "https://files.pythonhosted.org/packages/a3/2d/12b184980a87ed89cf6b23816b3aa6e4ed720a5708ee7af5960f56eee9c6/oracledb-26.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:582d629ca1282653f575a74b57e3c146175a55ea43c1470ddca44c3eef04dddc", size = 2068149, upload-time = "2026-09-22T21:23:46.024Z" },
{ url = "https://files.pythonhosted.org/packages/47/f2/61869d47cf3d74099d9398c56c839a21394b35dd19d05e91a60abb6e7881/oracledb-26.0.1-cp311-cp311-win_arm64.whl", hash = "sha256:b857ecc33ed1ec8141f4e45a7420a4df4fc625dcaa35e32b01dca62400376d5d", size = 1709535, upload-time = "2026-09-22T21:23:47.737Z" },
{ url = "https://files.pythonhosted.org/packages/83/fa/349ee179b3e106f210ac070d199dd341f37e2af9f5faf2563b80d8aa6ab1/oracledb-26.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eea4d0824fa82b03c0d90aad81f10dbbacdaf351979c0130190a362a539e63ae", size = 4908265, upload-time = "2026-09-22T21:23:49.524Z" },
{ url = "https://files.pythonhosted.org/packages/60/68/2dc6a99d385835290825c0d6689097af29637db8754197040b95814bb5cd/oracledb-26.0.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c05707b2ba57d8210bdf062ba3419900591f3369d1532fb116af51445c2993d", size = 2448388, upload-time = "2026-09-22T21:23:50.993Z" },
{ url = "https://files.pythonhosted.org/packages/d5/4b/ce48ed072c2328b429a6bc87a35ddd735945151145d9fe49c1e177b0da83/oracledb-26.0.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:36cbf2be185412fee95be96aa6f187a73fd5181bb03186b53d5b70ac18fa354b", size = 2663296, upload-time = "2026-09-22T21:23:52.426Z" },
{ url = "https://files.pythonhosted.org/packages/f2/c8/73166ff29389c5ce3272fcc534360ab65248f90fcdf175a99b5fa2bb8466/oracledb-26.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d5ad1b6f4db3d8a43182e7734922342fac5901456b34acead92f6fc60cc59882", size = 2493289, upload-time = "2026-09-22T21:23:53.949Z" },
{ url = "https://files.pythonhosted.org/packages/f4/c0/f6b4f82d6dc7f7d7654c0e4889caa1abbe019ec76daa1b4b4ee80859172b/oracledb-26.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aecc4cdd03cb5a5ad51f43680d16d74132ae7df65c991e7bd69bbe2ccc0fd209", size = 2694730, upload-time = "2026-09-22T21:23:55.609Z" },
{ url = "https://files.pythonhosted.org/packages/9b/da/a3ad79e18c5b27b357de005ce9d79dff1ef1646b7c55b6e6557b238f03bd/oracledb-26.0.1-cp312-cp312-win32.whl", hash = "sha256:f55d6fd9ebc3e8bf3bf4828fcd6ae152b363859628d27f92a4764111adfb1001", size = 1578393, upload-time = "2026-09-22T21:23:56.975Z" },
{ url = "https://files.pythonhosted.org/packages/06/c6/8e2ad66bda2cda6d085f3516ad8f7834b1d7d4c9da21f96834467525b551/oracledb-26.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:1c6f2f0d7290b15f1a166c0d24187e7746a6f08ea6e886e521110f1bf8d2002c", size = 1970972, upload-time = "2026-09-22T21:23:58.352Z" },
{ url = "https://files.pythonhosted.org/packages/ba/ce/98c3a83142a562e40135abb8503b59eba7af1135c11c8077986a289f3a35/oracledb-26.0.1-cp312-cp312-win_arm64.whl", hash = "sha256:c31b6f7440047c867a1b41cbaace7867db0750ecab4dc6454c9f501991152deb", size = 1622016, upload-time = "2026-09-22T21:23:59.996Z" },
{ url = "https://files.pythonhosted.org/packages/f4/d7/2a911476339d9fa6eb83e6a4639b007c13af26d7261907ecc2d8722a6712/oracledb-26.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:339dd6c4f0d50dab4026a36ae89d902240b2a879a17cdf18e3feadc113957b4e", size = 4911060, upload-time = "2026-09-22T21:24:01.757Z" },
{ url = "https://files.pythonhosted.org/packages/e9/e8/97e3b2c283ab996efe1d12b6afa86042c746b0ce4e408942bb4b7c35e39a/oracledb-26.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5907bb5c9df123e417ddf358f540554dfc6766064c2feb84121c099bc4e039a3", size = 2445641, upload-time = "2026-09-22T21:24:03.587Z" },
{ url = "https://files.pythonhosted.org/packages/03/f7/bbf75b91248ea489e8393ae84e9985b37c895781c658b6d9e5d83d02c1c1/oracledb-26.0.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:16d08328bf9b02e980ad4d5f3e0e99596f9a42aaf6bd1e244ea85be753f2c292", size = 2646590, upload-time = "2026-09-22T21:24:05.22Z" },
{ url = "https://files.pythonhosted.org/packages/3b/32/cbdacb302a2ca047e36e0f804c493391844aad83822d428184fa1d4203d5/oracledb-26.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:50e42111d5c620f60478e4571a5847c335286e8650e63a8789f8bd51035f90da", size = 2499129, upload-time = "2026-09-22T21:24:06.801Z" },
{ url = "https://files.pythonhosted.org/packages/9a/1e/ce86b581a4f1c8d5844019f84eacc9f4084c882ba676a90c94d7eaeb749e/oracledb-26.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0453f8f1a6748c982dcdac8af09bcd81971979c7ec9d1d151e15595f58d9164b", size = 2675979, upload-time = "2026-09-22T21:24:08.153Z" },
{ url = "https://files.pythonhosted.org/packages/82/7c/49e6af631b84db68d801b6d03ff58c4fa7b767ffa8a8402de643584e9d63/oracledb-26.0.1-cp313-cp313-win32.whl", hash = "sha256:93e6a7cda6ad7b14e2ce8689c9694872b3d69d57015aab070028c9a93faf3bf1", size = 1576622, upload-time = "2026-09-22T21:24:09.492Z" },
{ url = "https://files.pythonhosted.org/packages/59/10/ba7a5ce82fda9bbfcf222930b9a6f9a967c2b3d49f787ba7f4f99b598c6f/oracledb-26.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:6cf0c4d8662072917e2f98598cb97a18e157785bd0f294fbcf770d822ca239a9", size = 1970210, upload-time = "2026-09-22T21:24:10.806Z" },
{ url = "https://files.pythonhosted.org/packages/24/dc/96ce57dad3b1bb3d3c30be936d0f6daea0a02649d8936b878921004b15e1/oracledb-26.0.1-cp313-cp313-win_arm64.whl", hash = "sha256:22bb1e47a01a5259eead9202be8f631682b69be08ee29d8e532ed9b9364bd7bd", size = 1621513, upload-time = "2026-09-22T21:24:12.246Z" },
{ url = "https://files.pythonhosted.org/packages/3e/e6/7cf147ea1daf0c7c86fcd77acce1a09b0d4ab75539a4677a2034f112c860/oracledb-26.0.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c2201184b46bbec476a7ac29a72f14ee4ed75d692ade3b6c5d672fdbca71e6b2", size = 4961776, upload-time = "2026-09-22T21:24:13.967Z" },
{ url = "https://files.pythonhosted.org/packages/2b/7e/1ada40fce6ec550718e6eb1b8be9bfcc6e9697f19b6244ed6e0b89aa8da8/oracledb-26.0.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8bddb6bd7156df750045b419ffc400cfe429276f1a17d83913f10adefd0baa9a", size = 2486660, upload-time = "2026-09-22T21:24:16.397Z" },
{ url = "https://files.pythonhosted.org/packages/65/2a/a4cf6f8081b1ab3498c82e3917b2174843bf22e2fa4c41e98ad1e0b66d47/oracledb-26.0.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b33b22800a9b02ee0ead00e6f3073b810f7dc51c1e82fc9fc5475c09812420df", size = 2664849, upload-time = "2026-09-22T21:24:18.16Z" },
{ url = "https://files.pythonhosted.org/packages/b2/f2/50a32fa2d8c6cbb0e5fb69c262b01e7412ad08e430192404af9d2b9f4bea/oracledb-26.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:124f0072e6c7df277c561ec3a4c42cb2c02c30e9ce15e75a460b4abcfee41046", size = 2544330, upload-time = "2026-09-22T21:24:19.627Z" },
{ url = "https://files.pythonhosted.org/packages/b0/90/9b6dd9bbc1899ca3a982e9012f25be2a70e4795eacc6f8582c340c64fe1c/oracledb-26.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4c5094d5ba60b0f67ce7c74eb0fbc738d827103c0ba2db5f8483db405ab4e9c4", size = 2693190, upload-time = "2026-09-22T21:24:21.228Z" },
{ url = "https://files.pythonhosted.org/packages/92/42/0df9265f2f562283c88590a6bcd442084cef80c832ff598bdbab994a3cb8/oracledb-26.0.1-cp314-cp314-win32.whl", hash = "sha256:03424ccfbd25c402133c2a23c5c1a630e57effda7b962085d91c41d765af1b25", size = 1602133, upload-time = "2026-09-22T21:24:22.733Z" },
{ url = "https://files.pythonhosted.org/packages/db/d4/1b90c5e252a53dbc71833217746f2673e9e2ce0e06115bac1dc42ae347d0/oracledb-26.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:ee8f4736b72f38ade26f9770f7b40e8662bfa825ef48cefcc55cef0c30525d4b", size = 2027835, upload-time = "2026-09-22T21:24:24.105Z" },
{ url = "https://files.pythonhosted.org/packages/d6/4e/9febea61cbf476c2ae5d290fb3f823f1e46668e3ac15b8af5307531e33ad/oracledb-26.0.1-cp314-cp314-win_arm64.whl", hash = "sha256:13b0dfbbc503c6107d6c08b1658df260c2c077bc5574d9545159df0a0301fe7d", size = 1680743, upload-time = "2026-09-22T21:24:25.475Z" },
{ url = "https://files.pythonhosted.org/packages/77/bb/71f7861bfbf586757873259a858f370030a137b4172865992c3cc9a462b1/oracledb-26.0.1-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:9e77a6b3b01a3a2f4b786939f59d862fbe73fbc4c68cdf87aa45a5398725a16c", size = 4960764, upload-time = "2026-09-22T21:24:27.244Z" },
{ url = "https://files.pythonhosted.org/packages/14/c0/86aa68f08e5c1d25b864ac5777c559bf0bc8911e5d8262b70bec5e05cc21/oracledb-26.0.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d722f185f9c05ecccb2702a58a1e5ecfd309ae92cad0c38373e0969e83bf2bd", size = 2488466, upload-time = "2026-09-22T21:24:29.177Z" },
{ url = "https://files.pythonhosted.org/packages/fc/f4/af94230a3c2c6679323f3578a0a5281cfd87f72994f66e6044b5ff6c95e9/oracledb-26.0.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfcf6382bc48e21e448ca2b71644cc75626056a638bca50181acdc8adc69dd3c", size = 2685915, upload-time = "2026-09-22T21:24:30.823Z" },
{ url = "https://files.pythonhosted.org/packages/f5/a7/aa99f8e60961e80795ca926ead66c66d98c3aee78d970320eacdfa843614/oracledb-26.0.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:d42a2e0caea9bcf7d260d430b225d72cff6dffa0d6729be7a8823db2678e0b74", size = 2544920, upload-time = "2026-09-22T21:24:32.667Z" },
{ url = "https://files.pythonhosted.org/packages/e2/65/b636a18a578cffd5819df08ae80deeb931f1215d2d2b18112a37e9d2bbea/oracledb-26.0.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:2a073cc8bd74a7ce32d12f4bc898dd143971981b52ecd2f72c37b4474bff76cb", size = 2713492, upload-time = "2026-09-22T21:24:34.22Z" },
{ url = "https://files.pythonhosted.org/packages/0a/4a/e758838b14540a94599487d0d15ce4390edba5a257e53f2cea66f94bd138/oracledb-26.0.1-cp315-cp315-win32.whl", hash = "sha256:f4188bf8eedfc05ef266835e98ce304fda92d6bc87dd776d5f9a8b510d8b54ba", size = 1601872, upload-time = "2026-09-22T21:24:35.591Z" },
{ url = "https://files.pythonhosted.org/packages/62/b1/51b2a51abd89ba43dc0f9ee14d456a9b002d0b9c31840c7de55387e555eb/oracledb-26.0.1-cp315-cp315-win_amd64.whl", hash = "sha256:9d508d2df7bb9a4802247ec95d06064e2babf8ae9e1f91d89c349bcd30df44ed", size = 2026829, upload-time = "2026-09-22T21:24:37.15Z" },
{ url = "https://files.pythonhosted.org/packages/62/6b/b099ff2c51447cbf0d2f1c33ea7de1abf96d9bf4c3d93b2a5dff48728965/oracledb-26.0.1-cp315-cp315-win_arm64.whl", hash = "sha256:7c9541d7cf2d324e9516c955c033235bbf25b7d96ce41a856b3bff2eab3494ed", size = 1680535, upload-time = "2026-09-22T21:24:38.551Z" },
]
[[package]]
name = "packaging"
version = "26.3"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" },
]
[[package]]
name = "pathspec"
version = "1.1.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/5a/82/42f767fc1c1143d6fd36efb827202a2d997a375e160a71eb2888a925aac1/pathspec-1.1.1.tar.gz", hash = "sha256:17db5ecd524104a120e173814c90367a96a98d07c45b2e10c2f3919fff91bf5a", size = 135180, upload-time = "2026-04-27T01:46:08.907Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/f1/d9/7fb5aa316bc299258e68c73ba3bddbc499654a07f151cba08f6153988714/pathspec-1.1.1-py3-none-any.whl", hash = "sha256:a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189", size = 57328, upload-time = "2026-04-27T01:46:07.06Z" },
]
[[package]]
name = "pluggy"
version = "1.6.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
]
[[package]]
name = "psycopg"
version = "3.3.6"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "typing-extensions", marker = "python_full_version < '3.13'" },
{ name = "tzdata", marker = "sys_platform == 'win32'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/76/26/3ea4ca5eaea1c0debcdf7ee7c1613fbe721dc27a03c461c0817ffd8a0601/psycopg-3.3.6.tar.gz", hash = "sha256:c081f2250df751a943036e42db6df4571c66cd0aabe8291a7a506512b12007d2", size = 168171, upload-time = "2026-09-18T13:22:55.152Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/4e/de/748bd7609c71cae5d737f0ba9192f19329f70180ecda8fff3cac02c5abe3/psycopg-3.3.6-py3-none-any.whl", hash = "sha256:a1db9f7148b06a28606767efaca51fa6f9398c5c0a3810519be69d7000bdb631", size = 215490, upload-time = "2026-09-18T13:15:29.374Z" },
]
[package.optional-dependencies]
binary = [
{ name = "psycopg-binary", marker = "implementation_name != 'pypy'" },
]
[[package]]
name = "psycopg-binary"
version = "3.3.6"
source = { registry = "https://pypi.org/simple" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/70/86/b71166048974d49c6d136b2ed1c0e5bec0b974d8c4de5cbce7e86a9e412a/psycopg_binary-3.3.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:be4f9b3c9338ac5dd217c5847e21521b396c8117f78dc420d495a5c49bbef874", size = 4728002, upload-time = "2026-09-18T13:16:53.393Z" },
{ url = "https://files.pythonhosted.org/packages/12/1d/1e06c0de7ed5aed898acb87544eac6ef0bc7d752a67ec6e5d6b835e9b40c/psycopg_binary-3.3.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f0535693ce476a722b718b002d5d2c27d47e71ca945276ac194409c98e74c492", size = 4775403, upload-time = "2026-09-18T13:16:58.939Z" },
{ url = "https://files.pythonhosted.org/packages/84/02/2ffcbc43f8e4bbc38e5286a22013bcac01898d13cd38325f60dd5428a8af/psycopg_binary-3.3.6-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:3c9e663b2e800e3218994cf948c11bcc2844e6491b34aa80d089baf6531827bf", size = 5594145, upload-time = "2026-09-18T13:17:08.515Z" },
{ url = "https://files.pythonhosted.org/packages/e1/25/031dae2c7d2e7e77dcf5b1962c1e0684fa548d7af0ff6707b6b5e6054ca7/psycopg_binary-3.3.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a2e44a342d2aee40508e28a563d8961c39d9bbd8cae36d8578f0a3c6658aab0f", size = 5267985, upload-time = "2026-09-18T13:17:16.24Z" },
{ url = "https://files.pythonhosted.org/packages/8c/e5/94c89ada3c003a4d858178f3bba49a35e0297ef2aad659b80eb5e380e690/psycopg_binary-3.3.6-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f598f19fa9a91540b5cee17932ffd227b7b53a481605bcc4573c0eafa647300", size = 6860986, upload-time = "2026-09-18T13:17:23.348Z" },
{ url = "https://files.pythonhosted.org/packages/9d/a0/81bf499d095adee8413bd19822a6872fbfa21663ec78014a68d83a8db83c/psycopg_binary-3.3.6-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6ff05561e4a067d35507dc5c90f1deb2ec1c9703ac5cccc1bc26e08a197f9c5a", size = 5106702, upload-time = "2026-09-18T13:17:28.847Z" },
{ url = "https://files.pythonhosted.org/packages/00/75/99d56da64c27bd985fd82c6ecbf7976b724ac638fdd1654ef995323a1a26/psycopg_binary-3.3.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:566dd827f17728efdf7d88a5b066f815170f6fdad13967ae952842d90e6aaa9f", size = 4627090, upload-time = "2026-09-18T13:17:36.668Z" },
{ url = "https://files.pythonhosted.org/packages/3e/0c/0222171d11233332c6a24b1cef1578215f0ffddf3642eb8dd8c4448ad69f/psycopg_binary-3.3.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9b2f11794e017ce340934e35de46181c46ef71ec75ea3d85dd75cd836761c01e", size = 4320353, upload-time = "2026-09-18T13:17:42.526Z" },
{ url = "https://files.pythonhosted.org/packages/62/6f/e1cc2a28dd1228c67c969ba6fd37cd8726b312e2ff51380f847ddb38ccde/psycopg_binary-3.3.6-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:910ace140e3e7b7596898d083f37a8fe90c5c40684252ad4e682364b2cd3deba", size = 4047253, upload-time = "2026-09-18T13:17:47.068Z" },
{ url = "https://files.pythonhosted.org/packages/d8/fd/38b64790ce7a515b1dbd2bab3d119637a858aeb22c380cf4859bc4ce0e42/psycopg_binary-3.3.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37e517c146b185f9c0c6e8d0a0ebbdeeeb67896af28466e032bc810d0c7dc7a7", size = 4353208, upload-time = "2026-09-18T13:17:52.41Z" },
{ url = "https://files.pythonhosted.org/packages/f7/dc/45386530ceb2a8c789a226de9b9b34eca8fccf1feba2e4ef68a6aca50c56/psycopg_binary-3.3.6-cp311-cp311-win_amd64.whl", hash = "sha256:c7f92daa0d2a1c76f07264abddf8cbabd30152a2f09c3270e50f0c7efdf5dcac", size = 3675638, upload-time = "2026-09-18T13:17:58.112Z" },
{ url = "https://files.pythonhosted.org/packages/e6/01/2cdd1824e58b4467ee0b9498664cd28c42d8794db6b1e35b6bcb834f0044/psycopg_binary-3.3.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3f84dab25e0385692ee13274c68678377e0b1a70ab9d14e56264cbf61f60c62d", size = 4707086, upload-time = "2026-09-18T13:18:05.138Z" },
{ url = "https://files.pythonhosted.org/packages/f6/76/de9948ac06895261c84d5b9fbe283d8f3c5bc9f070691b8d9eaa1b51e322/psycopg_binary-3.3.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:612382ac3ed13651c7fa44b5fee9fbf7baaa2ddbc6f500391672682c5f1df9e0", size = 4769607, upload-time = "2026-09-18T13:18:12.83Z" },
{ url = "https://files.pythonhosted.org/packages/76/a9/72436c9915ee4905964689e7f0e182ce7767cc0a0390b3ce703be8177625/psycopg_binary-3.3.6-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:366db6e97e66b37211475f20c4c1324a2dc0dd825e46d4e87f9d599304d276f9", size = 5554134, upload-time = "2026-09-18T13:18:21.175Z" },
{ url = "https://files.pythonhosted.org/packages/0a/42/948bb3d2617795093512613fd96ba380e922992c7908fbc073858147d196/psycopg_binary-3.3.6-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1679a1cb93fbe5a6d1fd58d82cbddcc6fcb8c61446ba7cae6eb2a7b19bc585de", size = 5235723, upload-time = "2026-09-18T13:18:27.071Z" },
{ url = "https://files.pythonhosted.org/packages/99/47/93e823ff1b0088400703410939c9bda3e63ed9c850b3ee088e8769f4c10b/psycopg_binary-3.3.6-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:37d40450659401600e6d043ff586c89a71a69f33cbb8bcdba6cdb2569beecdbe", size = 6833587, upload-time = "2026-09-18T13:18:33.794Z" },
{ url = "https://files.pythonhosted.org/packages/5e/2d/ecc69c847795aa704041a9f5667a6b0938a088cf1853636d762a6938e493/psycopg_binary-3.3.6-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a5165300324efd5a772c48a88ab3a928513ab3979fca76553e62ee815f7b2b9c", size = 5070013, upload-time = "2026-09-18T13:18:39.628Z" },
{ url = "https://files.pythonhosted.org/packages/92/36/6126f0dac21713dcae91404f2a76da18598a6252339a8c669c46370d43b2/psycopg_binary-3.3.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d636338c8f21b0df2f84657b00bc34f9313f826ef93f1155bc743607e4a0c5eb", size = 4597367, upload-time = "2026-09-18T13:18:45.023Z" },
{ url = "https://files.pythonhosted.org/packages/4d/29/7ecfc04243b46c89ffd49924e9c5634ea904ef96c7d0f37e4073623584c1/psycopg_binary-3.3.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a4ee3bdd5468a725f2a4d9aab8a74b6d0279f768c8b5d3aeb102c5307ff3d59c", size = 4275419, upload-time = "2026-09-18T13:18:49.299Z" },
{ url = "https://files.pythonhosted.org/packages/6e/90/2f46d2e0de79706ac170df0a3637fe63c4498fc04f131f6049520b78b806/psycopg_binary-3.3.6-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:289aadd6a00e151203c081f708348ec89f1e483c9b510ef4ac3981f847f01f79", size = 4007358, upload-time = "2026-09-18T13:18:53.944Z" },
{ url = "https://files.pythonhosted.org/packages/03/48/6744e91291b751a8cf12d63d719977974bb94c84ceba913e7ddb2e478e51/psycopg_binary-3.3.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f21d057f3e5f5491067e5b292498073b73847d48799b099803fef100775fcc52", size = 4320156, upload-time = "2026-09-18T13:18:59.258Z" },
{ url = "https://files.pythonhosted.org/packages/1a/9b/94ff7fce53a64d5b286e2ec454e0a025cf3d6e6b4a9189bef16aa5de98b2/psycopg_binary-3.3.6-cp312-cp312-win_amd64.whl", hash = "sha256:e23a66a763fbe83fcc210bc77c27e5a5ea380ebf091c06f34d8561b695e5a40f", size = 3658864, upload-time = "2026-09-18T13:19:06.503Z" },
{ url = "https://files.pythonhosted.org/packages/b4/c3/c072584b69ad44a747b448cfc9766fecb8aae56e372a017e2ef668790057/psycopg_binary-3.3.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ad8f35e67cc16d1fad1fa8c88972dc9b3a3141ea67897399904edab96a301b6", size = 4712284, upload-time = "2026-09-18T13:19:13.451Z" },
{ url = "https://files.pythonhosted.org/packages/0a/b9/4283b785339e8e2318d03048994b093d650ea6289fabaa806b765dc0d449/psycopg_binary-3.3.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:373704aea331d3f3e3402c125a1543f5875e2986ebb54f97d1647942161f803f", size = 4772031, upload-time = "2026-09-18T13:19:18.524Z" },
{ url = "https://files.pythonhosted.org/packages/6f/72/7a1321d359246769fff1affffbd0132785a28f7f63c18524c15a502398f4/psycopg_binary-3.3.6-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:b82491019b884d62318b5f30706c3d7e6d4e5a6cb7eabcb3edc0c1b0fdaceae9", size = 5556392, upload-time = "2026-09-18T13:19:24.418Z" },
{ url = "https://files.pythonhosted.org/packages/de/b0/c6f8a0585a5dacbea74e130bcfc66629390e8f5bbc79d2a8e806e8952150/psycopg_binary-3.3.6-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cec5ea900390897d0b46130f60bc2883bf19c314f9044235217c8be88b0ef269", size = 5237855, upload-time = "2026-09-18T13:19:31.257Z" },
{ url = "https://files.pythonhosted.org/packages/e2/fc/c3a7a8bbef7e945ec584ac61d460a612363ea398511cd0e220242b1d69f1/psycopg_binary-3.3.6-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98c02090d88f2ebc0ec1e8da538f77d225ce0fffecf372aa39262e62a1b054ef", size = 6833856, upload-time = "2026-09-18T13:19:43.622Z" },
{ url = "https://files.pythonhosted.org/packages/a9/f2/8e80b921db728ebb68fc105bd7c4277f908210ad755bd6481d5ea7add740/psycopg_binary-3.3.6-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ee2c4728c691245e24501fcd7a97b5b381236b9985bc445bba88cdce7d1b5784", size = 5070730, upload-time = "2026-09-18T13:19:49.968Z" },
{ url = "https://files.pythonhosted.org/packages/54/6a/5b313e0c5348244f0e973aff3258bf86766656256d5ece8d541a53e35b4a/psycopg_binary-3.3.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f19cc87343eaa55255e76b31259a570072ac95d6ae82c92dd34b97691f5e49dc", size = 4598089, upload-time = "2026-09-18T13:19:56.426Z" },
{ url = "https://files.pythonhosted.org/packages/32/e9/db7f76ec24bf6699e92bf604e5c4bae10664a681a8999ef42aa0faf0f2c6/psycopg_binary-3.3.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fdccb3a0e184b03e9baa673b15a809cf36c339c85dbda0ebc25a698846dfbee8", size = 4278481, upload-time = "2026-09-18T13:20:04.681Z" },
{ url = "https://files.pythonhosted.org/packages/61/83/72c67013656f4d6b547caabffb193e91d57e63f90eefdcc6d045c400e97d/psycopg_binary-3.3.6-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:9892188bb15e5803beb51afe8a25add6b56be391a53058e8bca03b74e1e6bf22", size = 4009229, upload-time = "2026-09-18T13:20:11.905Z" },
{ url = "https://files.pythonhosted.org/packages/82/35/5e4500df2c999eb0faed8b184e6958b834172128274f06167a5deef4c19c/psycopg_binary-3.3.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3af90f92769d8cc10f94515ee7a0aef36ea85ca733a0ce22858f6e0953f41138", size = 4321467, upload-time = "2026-09-18T13:20:17.949Z" },
{ url = "https://files.pythonhosted.org/packages/55/7f/e350e1cf498ba2565c3f87b12f429d2012eb86b76c2b3845a19ee5fbb4d6/psycopg_binary-3.3.6-cp313-cp313-win_amd64.whl", hash = "sha256:0ebfad5d131de9f892ae9e70cc7616207768b6714b66a52d4612b8ceaf78b372", size = 3658179, upload-time = "2026-09-18T13:20:22.691Z" },
{ url = "https://files.pythonhosted.org/packages/6d/b9/60711317c284a442511644ea7185b56ebe627606d6741e732cd16108c47b/psycopg_binary-3.3.6-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:b3f75dee0f9afafabe4edc52c4842f1e1878ed2069bd05b22d6fe961e97e4dba", size = 4720512, upload-time = "2026-09-18T13:20:29.278Z" },
{ url = "https://files.pythonhosted.org/packages/63/da/28befc84454cbc6374550de7746f591f8fe1b6165c1fce249652cc8291c4/psycopg_binary-3.3.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:5927b7ba63153cd8e9862987290a2b783a5c590daf2a4ef981700cc3569166d4", size = 4782318, upload-time = "2026-09-18T13:20:35.401Z" },
{ url = "https://files.pythonhosted.org/packages/a4/8a/0d21c2c833cdc0d4244c77e858e0ed37fa2abec2623be4fd686f617109ce/psycopg_binary-3.3.6-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:0bf08b749cc144f33b44a91b78e3f71c60eb07963746a0df5a100b36ce3d7475", size = 5567460, upload-time = "2026-09-18T13:20:41.902Z" },
{ url = "https://files.pythonhosted.org/packages/49/6d/7692d0d4e656b6cc9868d8acc2e3b42f17a0db4a625400a6d093cb0533a1/psycopg_binary-3.3.6-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:31cd942c23f613276b81a6e6598cefa12960058b0f46e1e874b540c793f6aca5", size = 5246902, upload-time = "2026-09-18T13:20:47.661Z" },
{ url = "https://files.pythonhosted.org/packages/d4/c1/b8a1f18fb1b7558a17f57f7cb3fc8bc93189feea2958925950b3acb15743/psycopg_binary-3.3.6-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4690cf67738f0e0e49a32aeec99bf0e4595cc2b4f1af984a4345394b1dcff91a", size = 6847192, upload-time = "2026-09-18T13:20:56.874Z" },
{ url = "https://files.pythonhosted.org/packages/a5/76/404f33519167c65cca88ec4998776f1dbebccc301ee977f0e62c47fb0826/psycopg_binary-3.3.6-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ad1c785e784cfd87e8436c6b7702f2d321fc39601bbaf29bc63a41a867091638", size = 5079573, upload-time = "2026-09-18T13:21:04.155Z" },
{ url = "https://files.pythonhosted.org/packages/f0/d9/79e8fbc8f37262a415f3550f0bcc5f98037442bf3d12ef6cbae2056655ae/psycopg_binary-3.3.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:79a2a1c3449f6c3409427078ed1cec10de79f3023cb5f2504f0597d350ad46c7", size = 4613633, upload-time = "2026-09-18T13:21:10.664Z" },
{ url = "https://files.pythonhosted.org/packages/d4/47/96225db74be7d2ce04b3a58678b53cda610225055edf5faa775c9f501d8b/psycopg_binary-3.3.6-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:86147cb5d140341c3363fb5bacce31f8d5543902a46699d3c536b101bbceaf9e", size = 4293375, upload-time = "2026-09-18T13:21:16.027Z" },
{ url = "https://files.pythonhosted.org/packages/2a/d2/18e9c779a5efd565250329adaf529ecc2b8b2ed5be5cb0f6ccee208cbfd9/psycopg_binary-3.3.6-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:7308c93cf0b19bbaf8e6ff0a6ad50d3c442385739245fe15a8d593bf841734a6", size = 4019883, upload-time = "2026-09-18T13:21:21.587Z" },
{ url = "https://files.pythonhosted.org/packages/ef/28/0cc654afc6c2cda982767f5679d3646b30b1ec86545bdaa9402202d6776c/psycopg_binary-3.3.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:05a83ac9fd52b9bca7cb5ab04b3691163170bd16f53defa27216ea3aa07ee781", size = 4332607, upload-time = "2026-09-18T13:21:27.63Z" },
{ url = "https://files.pythonhosted.org/packages/f1/3e/0a753a74fbd7aef120f286c016e09d3cc3f1daf7688f4a145d27281260b2/psycopg_binary-3.3.6-cp314-cp314-win_amd64.whl", hash = "sha256:1fbd30e537dab22cafdf080608f10148fe2a5f3a61294ddb5113caac8a623840", size = 3755671, upload-time = "2026-09-18T13:21:33.855Z" },
{ url = "https://files.pythonhosted.org/packages/0e/b1/a372b9c02aea50148e71c9853e19efca8fa5ae2010a8e27243b9b8f790c0/psycopg_binary-3.3.6-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:bf8c8481d026b85dd70c5fa7dde85b2333aed0b32a2602bcd38a900cbd78a49c", size = 4719571, upload-time = "2026-09-18T13:21:41.437Z" },
{ url = "https://files.pythonhosted.org/packages/65/7c/811e3828c6b82e2f10c6c9cdd963cfc66f3e024026e5a69ac18530bad984/psycopg_binary-3.3.6-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:b599defe9190b17e9907c8b4d114c181e702c87efcd1b8a0ad40971cdcc4634a", size = 4781230, upload-time = "2026-09-18T13:21:49.516Z" },
{ url = "https://files.pythonhosted.org/packages/3e/15/9a784eed813ea9e97c294af3ead63d02b7b203502c66380336c50065e441/psycopg_binary-3.3.6-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:b8ece331509f7a975b90501f41e83ad905e4141753fedf3f2711b2bc70a8efbc", size = 5566111, upload-time = "2026-09-18T13:21:58.089Z" },
{ url = "https://files.pythonhosted.org/packages/68/16/47194e002007c27337b11e49bf459c4b19727463f9aff2e1a90917bcc806/psycopg_binary-3.3.6-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c61617eaae0112ca154da87ffb99b73af2c74067acac28dfb9a4455b019dff2e", size = 5249963, upload-time = "2026-09-18T13:22:06.695Z" },
{ url = "https://files.pythonhosted.org/packages/53/84/5dcf9f310b11f0675cd860c6b2c70f58ce61798a3ee3f6f962b53fa358ca/psycopg_binary-3.3.6-cp315-cp315-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c6d19cb4999d03231e8730a5f66c8f5068bc3b532677eb39dab0f600bff3e312", size = 6847925, upload-time = "2026-09-18T13:22:13.088Z" },
{ url = "https://files.pythonhosted.org/packages/f3/06/1957a06dc22963c418c27b284929579de84f29c37ad1abe6dc6ee9e8cf25/psycopg_binary-3.3.6-cp315-cp315-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8cbb54454dbf1bbf2ff08dd7693e8d94ac94b1a20f70f4b3b813d52ecb5cbc1", size = 5087720, upload-time = "2026-09-18T13:22:17.959Z" },
{ url = "https://files.pythonhosted.org/packages/21/43/ac07d042bae99b57bf123bb473632f29af544008094da0ffd285ab8011e2/psycopg_binary-3.3.6-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:dc75da5a20951049f7b773145f998f69d181adad9c58a0ff36e0cf1d73c10e10", size = 4613412, upload-time = "2026-09-18T13:22:26.719Z" },
{ url = "https://files.pythonhosted.org/packages/aa/b1/019156fbeafcefb4cccc9d109de4699493bceb8313c7545c8349e089dfbc/psycopg_binary-3.3.6-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:955e3dd94da361e052d2e49acf591017158dc8f8ed2c8a42c2e3943403c39dc2", size = 4292618, upload-time = "2026-09-18T13:22:33.042Z" },
{ url = "https://files.pythonhosted.org/packages/5d/0f/62113dc6b1df65983a1f2fc816c04b1edfa22f2ae9d4abee74ed267f4a96/psycopg_binary-3.3.6-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:c7753871eb57e6a5f4646f6168590c6653073dea5e9e720b201c8875332df4c8", size = 4027121, upload-time = "2026-09-18T13:22:38.334Z" },
{ url = "https://files.pythonhosted.org/packages/5d/d5/cf0cbd1ea5a7d8167fe2c6953efde19101f7b193bd61a23e6d622ad6854c/psycopg_binary-3.3.6-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:303732e798fe6729f8e12021b9c96107df8e95ecec4dd487c67b98ec2a59435e", size = 4336388, upload-time = "2026-09-18T13:22:45.576Z" },
{ url = "https://files.pythonhosted.org/packages/98/33/e2a5b36edf8aa422f6fa4b894756eb33dc93b36df5f65121280bb8b929c4/psycopg_binary-3.3.6-cp315-cp315-win_amd64.whl", hash = "sha256:2f122603f36050937982abf9668d8bc4769a79f7c93a65013b1c49f1cab7b56b", size = 3756154, upload-time = "2026-09-18T13:22:51.283Z" },
]
[[package]]
name = "psycopg2-binary"
version = "2.9.13"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/ed/76/7b4383014be0fcc6c1c0e24292845a14e1672cf17fca62ca0a2bd5f4563d/psycopg2_binary-2.9.13.tar.gz", hash = "sha256:e324ecf60f952d21dd11413b8bbed0951bbd99579a06fd06f28bfc37737cd373", size = 378112, upload-time = "2026-09-10T00:06:12.199Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/7b/03/639c96ff8ffb933868252308a9917ff4170d8c7f4bd16cd0ea2536814126/psycopg2_binary-2.9.13-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d19aec88857d2a52f99eefcefdbbb45921fb2f777bee5186a355a23d9cf8a0b9", size = 3725651, upload-time = "2026-09-09T23:54:29.277Z" },
{ url = "https://files.pythonhosted.org/packages/53/5e/d50eb688e7e6dfd1499e68cf2d02f44a348b88f381cbc2bebeed15e345f4/psycopg2_binary-2.9.13-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:32cd049095135d2b69e824aea9056745a4aaaa9115a9febbc65584793665d0d0", size = 3817384, upload-time = "2026-09-09T23:54:31.118Z" },
{ url = "https://files.pythonhosted.org/packages/6c/f3/4004cfbbfc52b9b13ffd499f2103eb05246e92828c7237d2c198e028b95c/psycopg2_binary-2.9.13-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6e696297891b56ff0115f0665de6ad774e1e301e4f60745b8d5024001ae7c2f6", size = 4585497, upload-time = "2026-09-09T23:54:33.169Z" },
{ url = "https://files.pythonhosted.org/packages/97/63/057c65532bd12cdf9d4f568e59c2a078a38e9ba8f7f251292968dc781905/psycopg2_binary-2.9.13-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:930e7e58b33a4f9c39e7532d7a40147925cf3372baed4229cbebe0cf3ba9ce6b", size = 4281172, upload-time = "2026-09-09T23:54:35.747Z" },
{ url = "https://files.pythonhosted.org/packages/43/4b/9fd928eaea9ec1e8d74fed83c9e82826f830506ba0d8c58a8fd41ca93656/psycopg2_binary-2.9.13-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3aea95340825f5ff236e7b40f0b5602c2c77a1e95943f71fae34909834043d29", size = 5900973, upload-time = "2026-09-09T23:54:37.866Z" },
{ url = "https://files.pythonhosted.org/packages/f8/2b/59e1519a22622169e2244f12227b3acde6114ea531a349292f455ab8503f/psycopg2_binary-2.9.13-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:27e539b4cafd5e03dcd32921db1b12dd72fe549dd06bae6d4d2a5b5838465f24", size = 4118611, upload-time = "2026-09-09T23:54:39.739Z" },
{ url = "https://files.pythonhosted.org/packages/87/c7/c3d84e330d1584efa0560b756914f9128b1b6fa2aba93fde54bf101d4f65/psycopg2_binary-2.9.13-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a6444ac48e2c04f691c2ddd542b38ba30c89463a2d446b3d74ec7d8fc90c964", size = 3659643, upload-time = "2026-09-09T23:54:41.882Z" },
{ url = "https://files.pythonhosted.org/packages/af/fc/317d248503aa29a5051ee49a7253daffe1c57e43ba174020e00bbd87c479/psycopg2_binary-2.9.13-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8cb734989420c18ca1b71a82da880e11988f5ff3fcdaadd669161de3e98794ac", size = 3305145, upload-time = "2026-09-09T23:54:43.818Z" },
{ url = "https://files.pythonhosted.org/packages/9d/d2/8b23c57591c6d29a463748ffc634401ce14719dba7e78ab91bcbeac70934/psycopg2_binary-2.9.13-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:f47f23db2d70db39cfb714b64fd5df76595b51b2ec0a669710a78f2dceb0c3f8", size = 3051614, upload-time = "2026-09-09T23:54:45.548Z" },
{ url = "https://files.pythonhosted.org/packages/4f/f2/b10a046cc19ab1e01b92226eeb6e8653be7e6691939991b2f347995831b1/psycopg2_binary-2.9.13-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f28b5f2fa8154d0d97e97a664136f58d1639ca008d45d6e09e69fff24826abee", size = 3353133, upload-time = "2026-09-09T23:54:47.285Z" },
{ url = "https://files.pythonhosted.org/packages/40/2c/dd379facaa4bd41d7b04711ff30931ca62981c00a91502250ffb49da08a7/psycopg2_binary-2.9.13-cp311-cp311-win_amd64.whl", hash = "sha256:70d091f5c3a6177fac50c0da20181ce0e0c053f1e43c872d5f75bd6d9429c020", size = 2771441, upload-time = "2026-09-09T23:54:49.016Z" },
{ url = "https://files.pythonhosted.org/packages/fb/d1/d0125c56b865e3bc9f318d84930b2df71a729229dbb0ce12de748a82a6d7/psycopg2_binary-2.9.13-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2bf9f97a6df69a5d89d054b8cf5257a0916096c479800715fbfe7974dbcb3a26", size = 3725735, upload-time = "2026-09-09T23:54:51.182Z" },
{ url = "https://files.pythonhosted.org/packages/54/a5/b5a73d0910555e38ee12c49c1740855f8a1e9776e87d65f0c51e1bab762a/psycopg2_binary-2.9.13-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:07b7bd9f410650c34c3532162cc329f112368d78a3fc8668cb1ea9df61bc11bf", size = 3818000, upload-time = "2026-09-09T23:54:53.229Z" },
{ url = "https://files.pythonhosted.org/packages/3d/43/3e4783f62ae3f4fc19a5acf8d1c394df54458f1336febe188f317556d2a7/psycopg2_binary-2.9.13-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:0463c00f946517f3e69192a59e6601e023ff9de45ad0a875eda3d6b1bebeb7ce", size = 4585760, upload-time = "2026-09-09T23:54:55.313Z" },
{ url = "https://files.pythonhosted.org/packages/8d/c4/a9a67ae65ad3d567eb0fc9cdf9a5a2783b779aecdcdc8945f1807b13d99e/psycopg2_binary-2.9.13-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e3861eba31f8ea8663fd876166b032fd89179e42aa63764d6feb281f13f9eb60", size = 4282380, upload-time = "2026-09-09T23:54:57.362Z" },
{ url = "https://files.pythonhosted.org/packages/b3/db/9d459d3da12e0b841cf1596579455aaa27e9e593e3e9a5a4ded5a55a7c15/psycopg2_binary-2.9.13-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3dc3372b3731b3ef23407fe06b94f640ef87a2bda242fa386033d5589c87514a", size = 5902039, upload-time = "2026-09-09T23:55:01.955Z" },
{ url = "https://files.pythonhosted.org/packages/d6/53/21079c10a581c50b6817498eda7c3481c1b3cdb41482bd08ebfccd3664c4/psycopg2_binary-2.9.13-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0405dd4d97720e7ab177aa02e493f524907c4cb3c445ac173e2627948d3d0528", size = 4119840, upload-time = "2026-09-09T23:55:04.336Z" },
{ url = "https://files.pythonhosted.org/packages/c4/ce/71e8d9e1b4f3e78157b49a5abdff50d915e95f2812550f6c9b4f2e4d5e94/psycopg2_binary-2.9.13-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b6ae51708201f501a171b02419d0c30878a743c369c9054eb1289f0f8d5979e2", size = 3661077, upload-time = "2026-09-09T23:55:06.118Z" },
{ url = "https://files.pythonhosted.org/packages/d9/54/b17616472f09a0fae96f8852692948b7eaa7c971d7629696da0e5932d996/psycopg2_binary-2.9.13-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:81682c227cc1849c4a6adf7b85274229073bb4c9d6ad5697222c695dcea5a8a7", size = 3307202, upload-time = "2026-09-09T23:55:08.061Z" },
{ url = "https://files.pythonhosted.org/packages/77/c7/d9737e222a377dac67a0ce0a2c73e7231a57f5cf18bb35a65d5c8d45d5d2/psycopg2_binary-2.9.13-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:13d955f6054a705a19554364fe9888d0a6e8b0746dc7ebc08a447c7b4fd4145c", size = 3052893, upload-time = "2026-09-09T23:55:10.209Z" },
{ url = "https://files.pythonhosted.org/packages/7d/3d/c406c9f698f518c264381192c2bdf8952ee84e469ffa9f82db1411f57385/psycopg2_binary-2.9.13-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7e2405196a8cfe6cd3e54172a54452dcf85c241eaf2e9dde7190d7469f7f5ef7", size = 3355210, upload-time = "2026-09-09T23:55:11.883Z" },
{ url = "https://files.pythonhosted.org/packages/27/64/6e3a96699770af2d0d49a2002f722c69b656fc27623ff89281cf2b109644/psycopg2_binary-2.9.13-cp312-cp312-win_amd64.whl", hash = "sha256:376ebf7d8aee4b7386b2bac31fdc27911e7e57cd0a88f1e038b8b149398ac008", size = 2767784, upload-time = "2026-09-09T23:55:13.823Z" },
{ url = "https://files.pythonhosted.org/packages/82/0a/795f2869788373cf7d08410341a444196e8ccebbac07a70a8f9a1f60e72f/psycopg2_binary-2.9.13-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4d66bfd44a46eb88cff0287929a4193fb45166b6c1f84bb1b233cc17ece0813c", size = 3725723, upload-time = "2026-09-09T23:55:15.887Z" },
{ url = "https://files.pythonhosted.org/packages/b5/63/5a9633f4563a73beba69b20a846ddd14c1c6ac072f5e8aab0da97ffabc2a/psycopg2_binary-2.9.13-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f818161d2302b3b3e9c75d5a1d0a5c5679e92e45cfec6432b9d5432dde5ff1f1", size = 3817976, upload-time = "2026-09-09T23:55:18.025Z" },
{ url = "https://files.pythonhosted.org/packages/6c/e2/b2e3b3a4331dc8b58e328cda30f3d0cc43a94b7aaf0c8383efd53dd10e95/psycopg2_binary-2.9.13-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:31db6cba66df5231dfd91d9f69188bec3fe6c8baae384e93a0ce792067ee2d98", size = 4585813, upload-time = "2026-09-09T23:55:20.112Z" },
{ url = "https://files.pythonhosted.org/packages/56/5c/87daea77c4132114d1a5da3a4928dd59446c3b3cc73d288cae08cf0b91a6/psycopg2_binary-2.9.13-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f04ada42bcd537adbaf8b7f3140237a204e452a88d0c1831cfce69f7d2e59f4e", size = 4282438, upload-time = "2026-09-09T23:55:22.329Z" },
{ url = "https://files.pythonhosted.org/packages/91/e5/56f9efdc9337acbd1a75798d97163183b63a1babc17602f7163009506c96/psycopg2_binary-2.9.13-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa37089795bd9701576edc2eb5849ce77a439eda9dfdfa47857449332cfa5292", size = 5902064, upload-time = "2026-09-09T23:55:24.37Z" },
{ url = "https://files.pythonhosted.org/packages/e4/15/f7ed0b90b47b73a9087306b42267eccfd919f92c0fb057e46bd2fa2efa4d/psycopg2_binary-2.9.13-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:41c2eb569ebd0e1b02d30d361a46932923b193fe1b5e641fb4d547c75e218955", size = 4119848, upload-time = "2026-09-09T23:55:26.433Z" },
{ url = "https://files.pythonhosted.org/packages/42/08/3091347b9fc5766e979aba6b0756ad14ce867a6bb245f3d69ac71fb768c6/psycopg2_binary-2.9.13-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3f699a5225094a5c61402984e2fc1eca20e940223e76767c88189efb0c313f69", size = 3661129, upload-time = "2026-09-09T23:55:28.449Z" },
{ url = "https://files.pythonhosted.org/packages/34/c4/4f9a84d55484c9794b364548eb6e1fe10a57f123afd19729e5a1cc8ad7fc/psycopg2_binary-2.9.13-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5f04ae99c9fbb94c3197ec88599ed7db921f6adcddfe83687a74c7ead4037c22", size = 3307262, upload-time = "2026-09-09T23:55:30.384Z" },
{ url = "https://files.pythonhosted.org/packages/83/42/6eba8306a61dc890805ae475a9e71790a1c5461ccacbd4f0a1f3f57b40f0/psycopg2_binary-2.9.13-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:81404c37e0344ebcf10aac127d33d35137e5dbab1daf9f3deee46188fd5879c2", size = 3052898, upload-time = "2026-09-09T23:55:32.961Z" },
{ url = "https://files.pythonhosted.org/packages/b3/5d/42a8935ab280e8dcd7c07a655c0c3d25d62e9e242be1961ac14630f1294a/psycopg2_binary-2.9.13-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:feb7b1856f6ca805cc0e08739858f6cdfed8ce903390126af30343c62899a389", size = 3355265, upload-time = "2026-09-09T23:55:35.071Z" },
{ url = "https://files.pythonhosted.org/packages/87/c2/0e0ffb4caeb651631cbc6c8ead83e2a16457750b1d2eb7f5ef111c1f4d36/psycopg2_binary-2.9.13-cp313-cp313-win_amd64.whl", hash = "sha256:691da68ae5dd7c3ac77514357d35ece7b1ba8b5f3e6c92735198aa6159c355c8", size = 2767914, upload-time = "2026-09-09T23:55:37.14Z" },
{ url = "https://files.pythonhosted.org/packages/5f/32/897c074cb99fbdda7d34b0a2546097a59162bb3d04c0d546ae4ec82345e3/psycopg2_binary-2.9.13-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2ca263643ae37998ae04d18e431df34d0d61f12b47640dab585f14b6dbe00798", size = 3725788, upload-time = "2026-09-09T23:55:39.04Z" },
{ url = "https://files.pythonhosted.org/packages/0f/f4/e3a789de34c9ac25d20b25c2be583da16394a2ba0926da1c863653831f41/psycopg2_binary-2.9.13-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4c0214c7da18a28d108aa7108c8a3cca8035c7911ec97ef9ec0827569c9a2720", size = 3818111, upload-time = "2026-09-09T23:55:40.979Z" },
{ url = "https://files.pythonhosted.org/packages/72/29/647724c43ac510dbc59b80e20e85d439deb94f5d5a024153c32330fa041d/psycopg2_binary-2.9.13-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5d89e064bb12b40cad696cf4975e6da86f8c60f14cd06cb6c1bc0a7f5d01761f", size = 4586235, upload-time = "2026-09-09T23:55:43.012Z" },
{ url = "https://files.pythonhosted.org/packages/91/ad/7f52f92cc65c23778daff7eec4ee2099236694a0a4723a5f180d0708b607/psycopg2_binary-2.9.13-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:190c18b97d9ef72f2e88c451b6588af90d6bd7bf54cb94b963280dc86a2c7076", size = 4282424, upload-time = "2026-09-09T23:55:44.843Z" },
{ url = "https://files.pythonhosted.org/packages/3d/2a/1a472059b198942d99651656e2bc610575584478bfe68d297ecabbd4887f/psycopg2_binary-2.9.13-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c00ebe9a2f31151aade0db233dc1446513a95e92c39ce055ee097af0ae86be1c", size = 5902365, upload-time = "2026-09-09T23:55:46.619Z" },
{ url = "https://files.pythonhosted.org/packages/91/1a/171ea5dac7b3a0fa57b3cb59c2ad6d7b8bc60732368fecfd2ed1f1288392/psycopg2_binary-2.9.13-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5085f7ff7b1e890f279577cedeb8c628957869a340fa34a39f7f406500b3c916", size = 4119938, upload-time = "2026-09-09T23:55:49.381Z" },
{ url = "https://files.pythonhosted.org/packages/41/ce/3c6d4ad71853a59eee6a575fe36df4bb40752a9735a27bd62af66b454ed5/psycopg2_binary-2.9.13-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4e55357d1943673d491bbabb171c891704fc6a22441fea539e05a5c27a79ea3c", size = 3661557, upload-time = "2026-09-09T23:55:51.269Z" },
{ url = "https://files.pythonhosted.org/packages/10/a3/1819a01bf951eab2afb5ca2a3d11f50500bf536fecff088154372a8d1985/psycopg2_binary-2.9.13-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:3e60b06ec7f9dc3e5f1106d12706514b6d6b92c3dc438fcdf4e43e65cc660d1b", size = 3307770, upload-time = "2026-09-09T23:55:53.196Z" },
{ url = "https://files.pythonhosted.org/packages/4e/df/22f4aec952cd5b2dd02f438399583ed69f7d04b90e7c31659d9571bbe188/psycopg2_binary-2.9.13-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:dde942b46ce20f6c4464cdf551f3293207f803f4e4354454eb1f5599c3eb1fa1", size = 3052935, upload-time = "2026-09-09T23:55:55.117Z" },
{ url = "https://files.pythonhosted.org/packages/95/42/aab651bc22bafa961806ca3b21027bb0739a2730b0e6f7f0778baeb95e67/psycopg2_binary-2.9.13-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:215777c62ce81c3b487cefdb6a41969944eb982309f91349ff3ca0323d6f17ed", size = 3355387, upload-time = "2026-09-09T23:55:57.366Z" },
{ url = "https://files.pythonhosted.org/packages/bc/af/3b8220633eaf955e95ea7be67d76e81a0d1cd3c76362ea504b91ffa079db/psycopg2_binary-2.9.13-cp314-cp314-win_amd64.whl", hash = "sha256:f3088eb80f58ed933c62d87128741d31e786edc862e23266d3c286763d646de0", size = 2863890, upload-time = "2026-09-09T23:55:59.056Z" },
{ url = "https://files.pythonhosted.org/packages/6e/f1/377d17fc8425220d17552691cd2b97aa232da92173f5dead71278b83f8ab/psycopg2_binary-2.9.13-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:38397def2d794ffde9db80f63d6820253e61b17483112652a318355f51a56f50", size = 3725913, upload-time = "2026-09-09T23:56:00.736Z" },
{ url = "https://files.pythonhosted.org/packages/67/64/27208e67cd6e663f69bf7bf905cf69db066a015c90ac9ca948a56a8e9d78/psycopg2_binary-2.9.13-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:dff5c70ed9789ccb0d97ff4a7da51dc523a255c4ec95df188fa5d44adcae4ea8", size = 3818303, upload-time = "2026-09-09T23:56:02.551Z" },
{ url = "https://files.pythonhosted.org/packages/6b/98/67d2f34a1d18367b5f655bdd101759f8474286c74ffe701b7d6e3abd7fda/psycopg2_binary-2.9.13-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:08d3b81a6a91775c937abf97d4c58fc9142e8e35fb91c387d24f81d15c98e6cf", size = 4586508, upload-time = "2026-09-09T23:56:04.706Z" },
{ url = "https://files.pythonhosted.org/packages/bb/47/46c227deaf322dceafa0b7b321b4e5de9cc797014b7a353349b2e09b1118/psycopg2_binary-2.9.13-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:541a487a9ccd72b5e38f37f27b0ce78cb7eb3e336e7b5277d45463010c03a7a8", size = 4282383, upload-time = "2026-09-09T23:56:06.678Z" },
{ url = "https://files.pythonhosted.org/packages/f4/3c/e8705ffa381160d842eaf06a8446e8416f1a2497dd70a7e62277f3be6e7a/psycopg2_binary-2.9.13-cp315-cp315-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:562fe2a43b30e781848dce63d9080c15414c777c96df348c4342558338cc7bf3", size = 5902765, upload-time = "2026-09-09T23:56:08.634Z" },
{ url = "https://files.pythonhosted.org/packages/53/cc/359821c18317228b8032456a3740c98045b719ed003a594b9ebac9330b86/psycopg2_binary-2.9.13-cp315-cp315-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dddfe650e7dda464d676c27fbedb5061f1ad05e1604627f54c770d7f799d36e9", size = 4122849, upload-time = "2026-09-09T23:56:10.671Z" },
{ url = "https://files.pythonhosted.org/packages/17/e5/4d935acb6d3258c7a767b3d527e54c0b537649101b55002a5dbcfe747e2a/psycopg2_binary-2.9.13-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:4ff0f575cbb14f30445858dcfdd751e043486f5290915df78a9818bc74042eff", size = 3662084, upload-time = "2026-09-09T23:56:12.316Z" },
{ url = "https://files.pythonhosted.org/packages/89/56/9e9bbc7c773c5de7bb25dd35d7f041c2a6f0fcfa9207a1ceaf01a1bc687c/psycopg2_binary-2.9.13-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:d79530b4c1af657d5620a1d21b8e39f2996aa06821d5564d05b22d6b8cd413d0", size = 3308077, upload-time = "2026-09-09T23:56:15.262Z" },
{ url = "https://files.pythonhosted.org/packages/36/fa/ed742cd4e5dbddcb44702f9c4a97f7f5b62d97e3d9d00907ecc8ac750ef4/psycopg2_binary-2.9.13-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:6ede8595767e19d30a7e8a84a7d47bfde6176d45d194fed08dbb68d1584a780b", size = 3055143, upload-time = "2026-09-09T23:56:17.168Z" },
{ url = "https://files.pythonhosted.org/packages/d5/3a/5c2cb71a844ee236be2ce91b286d797e34a21489909357c7cfba0f5c0197/psycopg2_binary-2.9.13-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:0ebcf3c4266a695df9d0ef51296155f60c86ac51cf82f0d0dd2e827255a891c5", size = 3355374, upload-time = "2026-09-09T23:56:18.793Z" },
{ url = "https://files.pythonhosted.org/packages/e8/30/3991c9fdcca90a5a1e55435292f4d74d176da2be15f3998f6858da3658cc/psycopg2_binary-2.9.13-cp315-cp315-win_amd64.whl", hash = "sha256:1752b9821f1377404d65ac43af03d59a1eccc57fb2c1eb8305f9a3fe8eb7a8ba", size = 2867246, upload-time = "2026-09-09T23:56:20.501Z" },
]
[[package]]
name = "pycparser"
version = "3.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" },
]
[[package]]
name = "pygments"
version = "2.21.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/49/2e/ced460408999b33da6b31b0021b0f37d329e202d4169aeb164493778f25b/pygments-2.21.0.tar.gz", hash = "sha256:610ca751c9bc2492b38eb9a38a7fbc93edbbb2d7182edaf34e66ae493dee5c8c", size = 5005329, upload-time = "2026-08-17T08:02:48.824Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/71/46/17f022dd3e953bf20a04a028a21ec746d942f8d2af30fa0f124fa0e6a684/pygments-2.21.0-py3-none-any.whl", hash = "sha256:2363c69b61c4a97c838da3b130dcd6468f4848992b21a82f2a63ec34377137d9", size = 1250147, upload-time = "2026-08-17T08:02:44.912Z" },
]
[[package]]
name = "pyrefly"
version = "1.3.2"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/4d/78/b6ec12acb586606618c71ebe1008af59e1ca50e667895f1946fa7b656619/pyrefly-1.3.2.tar.gz", hash = "sha256:30a68ff5429a1546ec08a2d913dfe442c9553a2940d274de18833d8eda939b5e", size = 6679591, upload-time = "2026-09-28T22:10:06.292Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/24/01/144a78839822abad55628881bcb45f8173e6d8b87976897c9105884b5a6b/pyrefly-1.3.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:626dbaee16ae1169a10a4ba3293583b5ab0320102f35efaad9e03457a2fc646c", size = 15088488, upload-time = "2026-09-28T22:09:40.743Z" },
{ url = "https://files.pythonhosted.org/packages/23/aa/599756bd42e6533ee9261ebd288f846ab453b00debaef2b4789893967809/pyrefly-1.3.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:2d5fc704dbf0e990dc4f15cb1ead64f1a325ae27383a50c76cfcaf0387f926bb", size = 14429996, upload-time = "2026-09-28T22:09:43.316Z" },
{ url = "https://files.pythonhosted.org/packages/90/0c/4b0678889136b1514ecd25cec11974d5bfdaeaaf9f5fe8a766ca45ec4ab5/pyrefly-1.3.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89dbe8a33e735fa96023c33ce5dfd81af9b0bdd2ee771e8d69b2ebffc7e0fbc7", size = 14871810, upload-time = "2026-09-28T22:09:45.42Z" },
{ url = "https://files.pythonhosted.org/packages/a6/4e/a96236391c6bb0d8b50af85e0ea6c0c56206f739931ac3031f9e000325ee/pyrefly-1.3.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ec0c31715d48bff279f548b85a93b5bc43d2c7bd1492a8cd703a9185cb089e5", size = 16113462, upload-time = "2026-09-28T22:09:47.619Z" },
{ url = "https://files.pythonhosted.org/packages/ad/c3/d4d0966aa7008ebd8481a6d05aa53202ad40c9597705eeee87ba6e0e2025/pyrefly-1.3.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b3de468bed691e40dc6271284c8dcc05e649d7ed45280ef3d07332741efe34c", size = 16043341, upload-time = "2026-09-28T22:09:50.083Z" },
{ url = "https://files.pythonhosted.org/packages/4f/d1/52d9ea1b7048c7316d9ff7594c170b1c06d37547a75d140c8deea7b9ddfd/pyrefly-1.3.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb94365fe5f854cb4fe82f600c4e2453160d328610b12981004851ee0b6e8aeb", size = 15437183, upload-time = "2026-09-28T22:09:52.56Z" },
{ url = "https://files.pythonhosted.org/packages/08/ec/24f83e4a397fa9d5c416bb4d378ee1bb18fe48bdd5698fe541636f5352f3/pyrefly-1.3.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:4f730d2e515ac25827fc68f343a7aa02b1072e0062df6a430346a4ffdfb5db2f", size = 14892976, upload-time = "2026-09-28T22:09:54.916Z" },
{ url = "https://files.pythonhosted.org/packages/29/c7/a473f8e9ec31ba0682ebe44f4e51167a22a4cbdc8bfd87365b9aca23be20/pyrefly-1.3.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:60f440e1626bd5cc4a41ee90cecba80796ed01ebd6c15d9f933efb8d07ffe2b8", size = 15469689, upload-time = "2026-09-28T22:09:57.541Z" },
{ url = "https://files.pythonhosted.org/packages/d0/df/779092365e8e469fc8e7349e1c26c35b8a73df9e6be80a00265fc26a2b2b/pyrefly-1.3.2-py3-none-win32.whl", hash = "sha256:b31684189de44a25a5bf00bdf3ad16be44a7b14654702d6018bce1043357202c", size = 14135550, upload-time = "2026-09-28T22:09:59.757Z" },
{ url = "https://files.pythonhosted.org/packages/9d/20/466333e7f2891f8c357b5c226559c39ba8dde4f90be09189ecc771a086f5/pyrefly-1.3.2-py3-none-win_amd64.whl", hash = "sha256:693960cdb247d1f76b9e09b3f2554dae20034f7d442ccd4e9b3e8962a3622363", size = 15067523, upload-time = "2026-09-28T22:10:02.099Z" },
{ url = "https://files.pythonhosted.org/packages/18/32/ee66df92c692c0686d82c9ecef3876ccb0386aa318bf507016f0121a8f78/pyrefly-1.3.2-py3-none-win_arm64.whl", hash = "sha256:f7424b21331670522980ff13e08bd143659879a4d92f4832282c7d7c41a9b5d6", size = 14348271, upload-time = "2026-09-28T22:10:04.253Z" },
]
[[package]]
name = "pyright"
version = "1.1.414"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "nodeenv" },
{ name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/e1/1b/244c7b710031ada80f27e579ec20d28a2285dfc318fed0339866b1047f12/pyright-1.1.414.tar.gz", hash = "sha256:523c0a97c60da6333234955c277730c9cf4f5bd6d5399e7b7d2b0fc5d3599524", size = 4154638, upload-time = "2026-09-10T12:26:53.181Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/d7/ba/18b6e682ead424ad24bcc134339ae5d1b931cd9ae260540592a058a91279/pyright-1.1.414-py3-none-any.whl", hash = "sha256:2a6b4b3298c9eec174c5ed83bd338de6eee82df2992f3e1930e6199d381be36f", size = 6225049, upload-time = "2026-09-10T12:26:51.427Z" },
]
[[package]]
name = "pytest"
version = "9.1.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "colorama", marker = "sys_platform == 'win32'" },
{ name = "iniconfig" },
{ name = "packaging" },
{ name = "pluggy" },
{ name = "pygments" },
]
sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" },
]
[[package]]
name = "pytest-mypy-plugins"
version = "4.0.3"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "decorator" },
{ name = "jinja2" },
{ name = "jsonschema" },
{ name = "mypy" },
{ name = "packaging" },
{ name = "pytest" },
{ name = "pyyaml" },
{ name = "regex" },
{ name = "tomlkit" },
]
sdist = { url = "https://files.pythonhosted.org/packages/41/38/519349835619e0441c12f37e000e999adc7d57c50e7745d432ed5b4548d4/pytest_mypy_plugins-4.0.3.tar.gz", hash = "sha256:bfe491a363dfa7d183e1a9d19615d8aaff79262eea2bc3dca87b4f8223cfe7e8", size = 30583, upload-time = "2026-05-14T07:43:23.834Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/6d/d3/f918e0fd29f27fcec312a313fd0d1d49c7636ba1d6cc558b1364984a4ef7/pytest_mypy_plugins-4.0.3-py3-none-any.whl", hash = "sha256:0494fbd3c0332026eee191f96f0b3e2aa3edfb0cc31bd6989607923bb52343ad", size = 21491, upload-time = "2026-05-14T07:43:22.174Z" },
]
[[package]]
name = "pytest-shard"
version = "0.1.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pytest" },
]
sdist = { url = "https://files.pythonhosted.org/packages/c6/ca/3efa6f3b84dab83220db45997e785be726684c2c2c4267bffb7d80101c7f/pytest-shard-0.1.2.tar.gz", hash = "sha256:b86a967fbfd1c8e50295095ccda031b7e890862ee06531d5142844f4c1d1cd67", size = 3579, upload-time = "2020-12-11T19:52:55.083Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/65/7a/dbeb4c54e9fc3b59622f410091365f354a69cda1af10c3b83ac0ca6e6f4f/pytest_shard-0.1.2-py3-none-any.whl", hash = "sha256:407a1df385cebe1feb9b4d2e7eeee8b044f8a24f0919421233159a17c59be2b9", size = 4608, upload-time = "2020-12-11T19:52:54.226Z" },
]
[[package]]
name = "pytest-xdist"
version = "3.8.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "execnet" },
{ name = "pytest" },
]
sdist = { url = "https://files.pythonhosted.org/packages/78/b4/439b179d1ff526791eb921115fca8e44e596a13efeda518b9d845a619450/pytest_xdist-3.8.0.tar.gz", hash = "sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1", size = 88069, upload-time = "2025-07-01T13:30:59.346Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl", hash = "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88", size = 46396, upload-time = "2025-07-01T13:30:56.632Z" },
]
[[package]]
name = "pyyaml"
version = "6.0.3"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" },
{ url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" },
{ url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" },
{ url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" },
{ url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" },
{ url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" },
{ url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" },
{ url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" },
{ url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" },
{ url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" },
{ url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" },
{ url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" },
{ url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" },
{ url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" },
{ url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" },
{ url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" },
{ url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" },
{ url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" },
{ url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" },
{ url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" },
{ url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" },
{ url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" },
{ url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" },
{ url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" },
{ url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" },
{ url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" },
{ url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" },
{ url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" },
{ url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" },
{ url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" },
{ url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" },
{ url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" },
{ url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" },
{ url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" },
{ url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" },
{ url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" },
{ url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" },
{ url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" },
{ url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" },
{ url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" },
{ url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" },
{ url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" },
{ url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" },
{ url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" },
{ url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" },
{ url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" },
{ url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" },
]
[[package]]
name = "redis"
version = "8.1.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "async-timeout", marker = "python_full_version < '3.11.3'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/a8/99/604f0b666d4c616d891cf77ebb9db6bb21601344c051aebf1b72b9ff915f/redis-8.1.0.tar.gz", hash = "sha256:6e1a19beef9225c83efd689c7e6b7da2d5215b1f42cd13b7fc3714d0a09c7b25", size = 5254356, upload-time = "2026-07-30T08:51:00.269Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/66/9d/c5731f6e3608663d4d3656fd8d3aecee8b509c3082818f5a13eae925baea/redis-8.1.0-py3-none-any.whl", hash = "sha256:a4fe1aac3d3b3cc791d4b3d5931c5a956045dc951ee74d1c913ee3ac4d2ee9fb", size = 560618, upload-time = "2026-07-30T08:50:58.497Z" },
]
[[package]]
name = "referencing"
version = "0.37.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "attrs" },
{ name = "rpds-py" },
{ name = "typing-extensions", marker = "python_full_version < '3.13'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" },
]
[[package]]
name = "regex"
version = "2026.9.29"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/fc/f2/af1da9d3ceed77bfcdce40427d49ba0be94e4fe84245e3bfef68c10e75b6/regex-2026.9.29.tar.gz", hash = "sha256:8b5fcc4771732191b2b7d1dd68d8f0353f47f8d90b6150f6dce58bf1112442cb", size = 419199, upload-time = "2026-09-29T00:49:58.298Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/e8/6b/6dea87689c3a06a6e79d254bf824e6f3e3d724b5ba027c6112559aa6cd2c/regex-2026.9.29-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6abb75ab16bc3281714a5b99548a2225db70dba1f995f6d7f7419b76eb5a8fbe", size = 495413, upload-time = "2026-09-29T00:46:14.51Z" },
{ url = "https://files.pythonhosted.org/packages/3a/a5/0c791a0e83ad1013d262c13247c4c77e0f4a8d05bdc167df96aba6681c0d/regex-2026.9.29-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b7b893976e7fe42053da64f2aa27239c24252fd2ec6df471e1be197c0addc3b1", size = 295145, upload-time = "2026-09-29T00:46:16.292Z" },
{ url = "https://files.pythonhosted.org/packages/b1/07/9bf3607d8d13a12e436ab9d63f9791e10706827d535695b23964ad79fd79/regex-2026.9.29-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:066d0e3dbfdd739bce2bf8c2a41dd16f73e3d8adc2eb06dd803a36a307f56075", size = 292123, upload-time = "2026-09-29T00:46:17.646Z" },
{ url = "https://files.pythonhosted.org/packages/64/6b/32c2e6fc617e1d3f247e250fea31a9a35b1265bd32f585968aa13b9999b9/regex-2026.9.29-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7020ed44df30b3aa492c00ee3b52d0548c1f30c2c6c5bb13ae897680900d3413", size = 799537, upload-time = "2026-09-29T00:46:18.976Z" },
{ url = "https://files.pythonhosted.org/packages/bf/72/f041177f3c7a4606f7c81a95fe7eea03e2a0c4e8bff9e439a01432cbc9f2/regex-2026.9.29-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ae4613d7d9dda60fcba95f846cc6f808017f1843f392cf9daad14a6534493d71", size = 873255, upload-time = "2026-09-29T00:46:20.684Z" },
{ url = "https://files.pythonhosted.org/packages/d0/4e/a78948e11dd715e0e46716c2e0f3404b3fe6a44e2a2e9abdc7d965cab2b3/regex-2026.9.29-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bec37990e3d6121f29ecfb594bd8f1bf009e9f7926daba2e50e3b27d3892a783", size = 914570, upload-time = "2026-09-29T00:46:22.599Z" },
{ url = "https://files.pythonhosted.org/packages/8a/70/aa08d1d2b294894b365e5f8ba5380fe3f8546acdb81f10639dfd74209c37/regex-2026.9.29-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:612b709381c0355b70d89cdb51b7f670591ed5cbbc0e3b5337488019dc667b65", size = 804978, upload-time = "2026-09-29T00:46:23.981Z" },
{ url = "https://files.pythonhosted.org/packages/21/32/1b03534c4715aca3b564416d28d518083ed4dab3bc913267600d2256140d/regex-2026.9.29-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a760da040b47767b4b873adfb7c3b691e9ba2fc60f113f9d0b88f1a62f323e85", size = 779297, upload-time = "2026-09-29T00:46:25.318Z" },
{ url = "https://files.pythonhosted.org/packages/76/a7/378f6f558d9e4444af315a307c5953565a511d1e3666f1bb7bdc82012b6b/regex-2026.9.29-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:49ee178ca31c94621294bf9b8b676a92a2e6bba8af0529591753719e57edb621", size = 786961, upload-time = "2026-09-29T00:46:26.963Z" },
{ url = "https://files.pythonhosted.org/packages/59/13/79f0b1846f5f342f92ddbd4b27b18bcb86da96d902c1a0be26520bde98d7/regex-2026.9.29-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:5eeb8edc6110d9194a4d0d54610f64c37a31c605b5dbb7e407fc6ec7fa34a4a1", size = 863234, upload-time = "2026-09-29T00:46:28.58Z" },
{ url = "https://files.pythonhosted.org/packages/97/19/05af70dec9f2eed6ba34e08d2dcc6a48e7ae5e307659d5fe4201a5d7bbee/regex-2026.9.29-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:ccb64d887a9db1cd76dbc0f92051a1a478a2a67e7f56c62d915cb881d7734704", size = 766487, upload-time = "2026-09-29T00:46:29.941Z" },
{ url = "https://files.pythonhosted.org/packages/01/e1/9c7486d4afe8fdd1fe0ad60139f8aa91427381f409af6a29b609d8fdcb3a/regex-2026.9.29-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9e4482589065c8ecd761cff522dcd85f2d39e62f551e37e025d1c7d54772def3", size = 854792, upload-time = "2026-09-29T00:46:31.358Z" },
{ url = "https://files.pythonhosted.org/packages/26/c7/49d008ff5f741d9a9799d7315556f3a12b983ff0fcd2cdfb62904bedafbf/regex-2026.9.29-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d60030baaa7bfbb02d650c126cdcddcb6e33dbff14d819434c8fa2fdcaeeeba5", size = 793050, upload-time = "2026-09-29T00:46:32.775Z" },
{ url = "https://files.pythonhosted.org/packages/cb/a1/46ba549e65562ca04608b24179b8a7bb6f146ae0e7c6d7f5e70f3339c8ba/regex-2026.9.29-cp311-cp311-win32.whl", hash = "sha256:18ae8eed4526e35bdb754d61562b90bf5c00a67fdcf3cc1380dd59597486631b", size = 268940, upload-time = "2026-09-29T00:46:34.179Z" },
{ url = "https://files.pythonhosted.org/packages/4d/4a/aab232183c70fdcf77bcf0c51819da02ec522e393e6a0bf00bcf2142e21f/regex-2026.9.29-cp311-cp311-win_amd64.whl", hash = "sha256:1043aedf5917caa861bcb25a9c11460049656bdf0017a90a309fa8f255467725", size = 280641, upload-time = "2026-09-29T00:46:35.484Z" },
{ url = "https://files.pythonhosted.org/packages/33/b1/7c05954af0f51de376df2ba97f7f78a8b79334c7e5b3d2d9f2aead1f4d3d/regex-2026.9.29-cp311-cp311-win_arm64.whl", hash = "sha256:352cf115a810b357caa35193ab656ecf5ef41056855e82f292c99e8514f8d954", size = 279411, upload-time = "2026-09-29T00:46:37.193Z" },
{ url = "https://files.pythonhosted.org/packages/84/48/3fdcde9a0baa84d7d25571223265d6e434e114763b438601d54a8028bf3e/regex-2026.9.29-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:dc79d36d0618752265f0d575915bdc5c5130ecb9c9f6b3bcefeae32e4bdfafcf", size = 497903, upload-time = "2026-09-29T00:46:38.938Z" },
{ url = "https://files.pythonhosted.org/packages/2e/1c/4ee3e97c76f53940488dfe7a7e18705e78daac8cd7fb161d246b9e328449/regex-2026.9.29-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3a21a9509d0ee88e7a70e1ad228cd2f0e0fd1e187458db132e8a8d18c97daf9d", size = 296416, upload-time = "2026-09-29T00:46:40.406Z" },
{ url = "https://files.pythonhosted.org/packages/37/14/f3f0ba083d2094392d5eabf56db5ea6ba469fd6e927afd187042054ea68a/regex-2026.9.29-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f57dc6b8fef170f105d2cf5cdce254f47b137d7755086cf7050f47e16582abba", size = 293633, upload-time = "2026-09-29T00:46:41.959Z" },
{ url = "https://files.pythonhosted.org/packages/c9/72/67e7a8ce17f1aea49df215564048efb49cc8c2b31a0e0fc30f36838f8516/regex-2026.9.29-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f93bc1c3486ef3747e07c9d7c1d0a147b8fbaab975f80e348aed6f71309dfaca", size = 805885, upload-time = "2026-09-29T00:46:43.373Z" },
{ url = "https://files.pythonhosted.org/packages/f6/78/25436bcfd4d2260b4b4090094d55d7ab53ec8a1ab4865a0b8bcb33c7d5c0/regex-2026.9.29-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9e1d3a4cb7993b708f0ada8d0c84590efd853f169e7147d2202c9da503180242", size = 878344, upload-time = "2026-09-29T00:46:45.328Z" },
{ url = "https://files.pythonhosted.org/packages/97/e6/a09ec3a23ae41d6179880e67f0aace9284b2d95f2d7b326eff203f8eec5e/regex-2026.9.29-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:dabee8f4935e731fb46b2a3091bdda0d3d94b3bbfb907d2b4f12eefce4009619", size = 919181, upload-time = "2026-09-29T00:46:47.041Z" },
{ url = "https://files.pythonhosted.org/packages/26/83/d2fbd2e4e3afb1167daa825187d196f313cbaa1a4768f311fb041bb0e3d2/regex-2026.9.29-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:39ab5894d971f9ac68baa6eca5c50387db579cfcacf36ae8df3feceb1815e6d0", size = 807783, upload-time = "2026-09-29T00:46:48.894Z" },
{ url = "https://files.pythonhosted.org/packages/46/0b/eb429a7016610d44fc89a597163f8c9127505f0d7dc724dc9effbb6a3ac0/regex-2026.9.29-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c1a9a6651197fbed6f0212591418b9def774fc3f8324f78d1bf0e6a63e5f8aa1", size = 783465, upload-time = "2026-09-29T00:46:50.64Z" },
{ url = "https://files.pythonhosted.org/packages/1b/07/58a3c0153c7476898430f6a7cf3d9062a1d17fbea4f43399ecaf411c7b4c/regex-2026.9.29-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:87fb80cbe3557e27e7b28b995c2b2eedf689b8886f941ab93e0e288f0976518a", size = 793519, upload-time = "2026-09-29T00:46:52.396Z" },
{ url = "https://files.pythonhosted.org/packages/2a/e8/161b94d39164520e21a7befe0245569bf7fda4c7cf1fc4e2df2b5def49da/regex-2026.9.29-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3c5c2ef13797466aa64170cbb66ad98a32351dd4127694cea7199f80f213750d", size = 869293, upload-time = "2026-09-29T00:46:54.128Z" },
{ url = "https://files.pythonhosted.org/packages/8f/07/3b02ed829aa2decdc1955d222bd1e2f99d1c8bb4873bbb9a66b2f0a36bff/regex-2026.9.29-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:59b49507f47479e299a9e1bc41b5cb83a7afda0540625f1dbae886615978acbf", size = 770239, upload-time = "2026-09-29T00:46:56.106Z" },
{ url = "https://files.pythonhosted.org/packages/42/5b/ba61f6fe062eb8562e742367d177bb75370434138ef6c9d2a27114f8d613/regex-2026.9.29-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0dd8af32e9f7b56b7f95cc1fd79b23054c3bdc172392ae560acc24d57b7ffe71", size = 861973, upload-time = "2026-09-29T00:46:57.665Z" },
{ url = "https://files.pythonhosted.org/packages/cc/27/767259b20e8a842948990f5e99138d6c077248fd42f8b5468b1d9ca4b814/regex-2026.9.29-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:db5e82ba15c142425b8406690032df89e39cca4a2e8afbbb9a3d84edc2373ac3", size = 796470, upload-time = "2026-09-29T00:46:59.236Z" },
{ url = "https://files.pythonhosted.org/packages/a0/05/2566c4ba849b68a8ab81a6bf428fa79d20aae7ddee83979103c0381df254/regex-2026.9.29-cp312-cp312-win32.whl", hash = "sha256:d0c3082bf79bcd6a614d55916590ad4b8f93200e10b97f463ea5d9d07c9b5f23", size = 269327, upload-time = "2026-09-29T00:47:01.135Z" },
{ url = "https://files.pythonhosted.org/packages/93/19/489bc8db91196381c935752df01ba3f607140daece33b78d88573f028e64/regex-2026.9.29-cp312-cp312-win_amd64.whl", hash = "sha256:fdd88ed5e20b1bcdd234421e454962c971aa44b653bdb7f1ea9ef683e90fb649", size = 280334, upload-time = "2026-09-29T00:47:04.436Z" },
{ url = "https://files.pythonhosted.org/packages/0b/47/fb88ba779d0e5e7d4b0ec1aceeb13845948a2cb876bd572a2d1dfdba090b/regex-2026.9.29-cp312-cp312-win_arm64.whl", hash = "sha256:4fe97894d1b306c919b4e50def1e6f6c522f4d03a7283811f4d108f1ce5d3ac2", size = 279614, upload-time = "2026-09-29T00:47:06.541Z" },
{ url = "https://files.pythonhosted.org/packages/79/d5/6080f7d1a6e7e36aa720f806ac93c035ba39c209ae6cc510e8ef4c0279c6/regex-2026.9.29-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f1a0d5117230dd46b399a30a38afa44f79c99f3168988fdc4f425c3f928b39df", size = 497622, upload-time = "2026-09-29T00:47:08.251Z" },
{ url = "https://files.pythonhosted.org/packages/00/71/c87fc7a2e21a42f9d57489db32951c37eef56d153840459a80d464f0321d/regex-2026.9.29-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f0fe9834e5aeccaf19a0d8feb296d66a24be1a7c9922002f842a682cd5abb787", size = 296281, upload-time = "2026-09-29T00:47:09.764Z" },
{ url = "https://files.pythonhosted.org/packages/11/9e/aa0f4cde3bc4688c1d58b0cd8415edd708339bc0bc401a195b0b1e8c8f0c/regex-2026.9.29-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c90fcf7804ea0a54b896ce0f2b9565350220b8d4890fd0db461a476a4c687963", size = 293472, upload-time = "2026-09-29T00:47:11.723Z" },
{ url = "https://files.pythonhosted.org/packages/90/d4/e835c487850ed922a8d6074f953b888c8ea99775c76b9ed5f8a4d72eab92/regex-2026.9.29-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e11edba5bc344a32b029a7af9d4b3173982dd79eeafa0b9dbd787364414b0509", size = 805966, upload-time = "2026-09-29T00:47:13.235Z" },
{ url = "https://files.pythonhosted.org/packages/2c/57/ba8809847fbae8d2cbc71367c6ded510a7ec88bf52493c65efc1acf4effb/regex-2026.9.29-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bb90e7177944b6684738c1fc36aabd2dd00d1de3be7dbe09f91e196f1bc0dc81", size = 878346, upload-time = "2026-09-29T00:47:14.877Z" },
{ url = "https://files.pythonhosted.org/packages/1a/52/e3da19fc3cc15ef67ab67e121e87887c3bccfdb683a7a9ec557c460ca5b7/regex-2026.9.29-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d06fcdecc10fc7954d7c8f27a03c96055fe525274dc84a7b0dbdc3d6b9e03dab", size = 919250, upload-time = "2026-09-29T00:47:16.622Z" },
{ url = "https://files.pythonhosted.org/packages/9a/8e/c1ed81f55f992f6aa0b699a592a50c1ce9e6d44ff1aee2c14c0537dcef9c/regex-2026.9.29-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d49c18f1ea294cf4adde2e5ac256e98c82ea9d708462ce4bf799dffa7cfe8a2c", size = 807902, upload-time = "2026-09-29T00:47:18.268Z" },
{ url = "https://files.pythonhosted.org/packages/ad/bc/5a6886eb470e41040e21e05b75024a18b6ebfe7ea400b72094a60f949101/regex-2026.9.29-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3e778bfccd63075167709136afbc251c1f683758d5bf49c803c60ac3f894ce6b", size = 783514, upload-time = "2026-09-29T00:47:19.921Z" },
{ url = "https://files.pythonhosted.org/packages/cb/52/6d951d453b023c6edb880f1ba474291b53b8ce1cc438b96a9db6d791d991/regex-2026.9.29-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:686ac5350fceae63830bb98805fcb8039325bf4c06d9f6f048ff65229d5bffa5", size = 793466, upload-time = "2026-09-29T00:47:21.552Z" },
{ url = "https://files.pythonhosted.org/packages/99/b9/d5a41adc08360f5eee0dc4846c578f002366947211fc8af5a69a64ee7b9f/regex-2026.9.29-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:26ec4ccce55aa533fbd603d08911b01101a8fcfec987845ac3ae2c7087b2bde3", size = 869464, upload-time = "2026-09-29T00:47:23.276Z" },
{ url = "https://files.pythonhosted.org/packages/4b/32/d76c9d91f5d798e2e9e67f6f85ec4ae35445ac425f7454797311cecb80ca/regex-2026.9.29-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:a655d34b2a6943af32401f3d94f72e9d731f6ad16285815550bf2b4ee69d420a", size = 770278, upload-time = "2026-09-29T00:47:25.193Z" },
{ url = "https://files.pythonhosted.org/packages/24/00/aeebdb540c620a0f7317f6d6fad80a47729ecf0599a24b5c34ec155351f5/regex-2026.9.29-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0c992c19cd45058a4b92f68f139c93db168b48fb1f322c9a7cd620806afb6b51", size = 861949, upload-time = "2026-09-29T00:47:27.005Z" },
{ url = "https://files.pythonhosted.org/packages/12/62/d0314bcedfd3586197e4596931fa220260eb2385bf53184e5b9ae67db24b/regex-2026.9.29-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ebb8912f565b8cdbbf27debfe00df04202c20e2f651b9e32767930c5eace3621", size = 796602, upload-time = "2026-09-29T00:47:29.233Z" },
{ url = "https://files.pythonhosted.org/packages/ae/c7/d5a8c13a613facb03e0fb55c1ebaaf7bb35d8e2c1abe8bef8dca809fc1d9/regex-2026.9.29-cp313-cp313-win32.whl", hash = "sha256:4d7d93613b01b0199961330e49cfc52d479b3d5776c56c691db31130c0a07d91", size = 269306, upload-time = "2026-09-29T00:47:31.14Z" },
{ url = "https://files.pythonhosted.org/packages/80/a7/bf93a3a6afa5f7bc16b7afb94ae581b01cae620b8ad56bd8f9572a985959/regex-2026.9.29-cp313-cp313-win_amd64.whl", hash = "sha256:61956f074ecd123f55adca68ee3eab46e6a07ad3f8e64e6db95dfacb444f55c4", size = 280307, upload-time = "2026-09-29T00:47:32.709Z" },
{ url = "https://files.pythonhosted.org/packages/b2/7d/388274e53605a86297f433a08102a7bbdcf9379d47683d307ccaefd88e2c/regex-2026.9.29-cp313-cp313-win_arm64.whl", hash = "sha256:bfc71e6d970419c1309b3640305298643e2a734cad3f7cfb6d2ddee4175ab53d", size = 279599, upload-time = "2026-09-29T00:47:34.674Z" },
{ url = "https://files.pythonhosted.org/packages/93/1f/d9dc6f02f569625faf67a4daec926cd5023472dcd69bb44286dccd5a5ab3/regex-2026.9.29-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:957bb708e8057ab1649ba566456429d691ec9b90d1c9ad1af1ba7ffbbeaf05f2", size = 497598, upload-time = "2026-09-29T00:47:36.541Z" },
{ url = "https://files.pythonhosted.org/packages/9c/83/9b693a3fd1451381e812031a8961ec5b3b8f0c8cc6871f14c5223642804d/regex-2026.9.29-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c9b602fae1e00b7c035d661ce85575365719192a7b46784bd71cf64c68053aa0", size = 296250, upload-time = "2026-09-29T00:47:38.233Z" },
{ url = "https://files.pythonhosted.org/packages/dd/5f/52bc2abc3fef040cd9de76ab29c918d6a717a454ae2b9dd7938b0c95656d/regex-2026.9.29-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0166844493626c5015c6088ee15c9ca2fd060ca15b7641d1657da6a58432ae33", size = 293518, upload-time = "2026-09-29T00:47:39.957Z" },
{ url = "https://files.pythonhosted.org/packages/dc/fc/cf50671215ee0057046980b4571ef8646a005819bb67f0957e779ed107a5/regex-2026.9.29-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b97a38fb4c732b6832db6bf108963adbcd82ef1268ba2025dce390f45af75efa", size = 806037, upload-time = "2026-09-29T00:47:41.676Z" },
{ url = "https://files.pythonhosted.org/packages/14/4b/dddef8fc15c63e4347cc9efb138d0cd306f30e6c98acbcc81a8f780083b9/regex-2026.9.29-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a540abfab208e1b7ef2df231c40ef3b6cbb30a0aad6204e9b6a81c10a6794628", size = 878881, upload-time = "2026-09-29T00:47:43.755Z" },
{ url = "https://files.pythonhosted.org/packages/9f/cb/38daabed32d28f7e58a06e9344ce00dc67952e9996bc578ed6a29fe1240e/regex-2026.9.29-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ddfa987262763c3c22a8367d2a49c244b018a74c3a8e3ab1a864119ad45c5633", size = 918684, upload-time = "2026-09-29T00:47:45.594Z" },
{ url = "https://files.pythonhosted.org/packages/a9/4d/041d9458a645fee4fce4d642a89d27271a3cfcd91095104f6dde44da70bf/regex-2026.9.29-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2f7f7aa47b229f2b39a2ae2596d2ad5625d77b5eb9856fac2dab3eb506cdd0a0", size = 807176, upload-time = "2026-09-29T00:47:47.372Z" },
{ url = "https://files.pythonhosted.org/packages/bf/c4/4383eed7aa5aef67616cb1b3f3ad06b7c624c4e6cced48630cd5ce133d85/regex-2026.9.29-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d9b77b25b4f395f92de6099ab08e8ae2bc7e51dfe157f22900902243a5cc90c7", size = 784315, upload-time = "2026-09-29T00:47:49.518Z" },
{ url = "https://files.pythonhosted.org/packages/5c/a6/0086ad31cebb183c637d3198547075aa493afde308e1ff61fccccb29ba6e/regex-2026.9.29-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:34b6925af9853bf461950e6508910f179fd6e9b1a7ec8548e069606b7e51a26b", size = 793748, upload-time = "2026-09-29T00:47:51.279Z" },
{ url = "https://files.pythonhosted.org/packages/d5/a0/f9005cba3f629a859573fc5d1224ea4e1f97919ec8581d018e03a351a604/regex-2026.9.29-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:addd736a0547d553283adaf4e05d7104e7f2c7b0b092e9b4d28756825f14531f", size = 870302, upload-time = "2026-09-29T00:47:53.368Z" },
{ url = "https://files.pythonhosted.org/packages/01/4f/e1a3e46bb5315a4e18b01a990e7a28e2a16595609d50c442baf2815a3c65/regex-2026.9.29-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:fe3fa1dd453ed5c7f5ea23a26218329790ed7197a99b90e94330e313959a7f52", size = 770299, upload-time = "2026-09-29T00:47:55.606Z" },
{ url = "https://files.pythonhosted.org/packages/2c/fe/f303b4acfda44e1ff1379368748c1ef2dad04a6a8e9c0ecbc970b19d97ca/regex-2026.9.29-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:0cc63b5e47c12a48d90c7e9d7de6a035dd14f62868aaedbb4e0ff8ba2b8bfe7b", size = 861570, upload-time = "2026-09-29T00:47:57.617Z" },
{ url = "https://files.pythonhosted.org/packages/60/b6/b4f7e99249f596017c60ccad5faf9310fc8e3e59bb2244940a90a1b0bdff/regex-2026.9.29-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:724184b4aafed865e4f13ca313fdcb43024300c028ec67319cfa16847d84685e", size = 795967, upload-time = "2026-09-29T00:47:59.922Z" },
{ url = "https://files.pythonhosted.org/packages/fb/d3/fc865a4638d9f6762192b6bab5b7aa1f33a90e9e99578c2e111e2a63c8c3/regex-2026.9.29-cp314-cp314-win32.whl", hash = "sha256:c6c8fabf1dafc1f1ddcbb67896d3f93efb092e8c4b6322d7389b944e76a484e5", size = 274758, upload-time = "2026-09-29T00:48:01.8Z" },
{ url = "https://files.pythonhosted.org/packages/31/e2/c2b466924ccbeb874862968ca638051b15a8fd29d994a0e99004a5cbf78e/regex-2026.9.29-cp314-cp314-win_amd64.whl", hash = "sha256:1c2a0026062abcc321a53db4a185ceba0b59a66b5d37b0808917a88b55a5257f", size = 283817, upload-time = "2026-09-29T00:48:03.614Z" },
{ url = "https://files.pythonhosted.org/packages/c6/42/ea0f8dbaa924fa75c6338935eaee2f44dab369b27f02db1e03d74344b049/regex-2026.9.29-cp314-cp314-win_arm64.whl", hash = "sha256:121a76a0985db80ceae9e171c337f8c927868e37d01b54e3ce87bc87f9c6a208", size = 283663, upload-time = "2026-09-29T00:48:05.624Z" },
{ url = "https://files.pythonhosted.org/packages/44/48/d58e5081119f5c223bbb37d2340acde3d069e1df8e8cd166c37502eee4da/regex-2026.9.29-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:e31f72490b7c12f7790e1e25c3afffd20503ee1bfb43461d7838b871ff244b19", size = 501393, upload-time = "2026-09-29T00:48:07.833Z" },
{ url = "https://files.pythonhosted.org/packages/72/3c/c49945287d4f9efee7d41f98072f8ad880efb8f430595a612fbdea996a4e/regex-2026.9.29-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:80ea96f5c1a30bf09007d48466521d9c294bebe197c708c3359096e3e3691632", size = 298237, upload-time = "2026-09-29T00:48:09.684Z" },
{ url = "https://files.pythonhosted.org/packages/f9/1f/688cb61c3d4cf7bcc1ed444b5cc49399eba3e51c469ae285cf87fea3022e/regex-2026.9.29-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:554bffadcbcb6d5f4e5fb10a61cc52084b9a63d1dab5f10bcd2c4343972e8e2c", size = 295936, upload-time = "2026-09-29T00:48:11.454Z" },
{ url = "https://files.pythonhosted.org/packages/26/a3/de43ac6b877b7d09c19a3a426b1bd5acdd209eaaf68f406466f80439ccf6/regex-2026.9.29-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:864e9b87ac33c3fb9fb4ad48166d4fdb579c351d5c77deb0d34bccb36a775cd9", size = 816905, upload-time = "2026-09-29T00:48:13.321Z" },
{ url = "https://files.pythonhosted.org/packages/62/14/9940763201c51d537786304984c67d0fc3d2ed18837ffb6f09a869f6b6c9/regex-2026.9.29-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:044265d77d94f5e3cb2fd72c76723807c429cb8c533e9d4672d0334a6f14f588", size = 881527, upload-time = "2026-09-29T00:48:15.313Z" },
{ url = "https://files.pythonhosted.org/packages/d3/e1/c842d8df0b23245ebf202f8ab9c39fd48e2db39959454ec39a41c8c72082/regex-2026.9.29-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2089fe39c406784d90101c726755ffa1497bb74638fd434300d2b88006186de8", size = 923115, upload-time = "2026-09-29T00:48:17.328Z" },
{ url = "https://files.pythonhosted.org/packages/d8/c1/98622479e3c354a446a75232e522d747d2b3df23092dcd8a5309380a2020/regex-2026.9.29-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0def9fb6abac55492d6d51cddb7225d07d6f279e774e0adc08569a54a5fc8d46", size = 820674, upload-time = "2026-09-29T00:48:19.32Z" },
{ url = "https://files.pythonhosted.org/packages/6c/d0/5808c95f9c79ed27b5eedaafc3df6239ec56a49f2e23ea8f831b18427c82/regex-2026.9.29-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:888d60953908dcf761aa320c3e390ab8556efbdb551ace63921de90f6ae0848d", size = 793306, upload-time = "2026-09-29T00:48:21.615Z" },
{ url = "https://files.pythonhosted.org/packages/bf/d3/021ca2638671ad20603bcd9b4d5bfa35d2610cd216a043ea7f0b44ea39f6/regex-2026.9.29-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ed511a0708e2297e1d6431e7fb217e3402791e491e02da800658ace4973df1bb", size = 803103, upload-time = "2026-09-29T00:48:23.871Z" },
{ url = "https://files.pythonhosted.org/packages/6b/2d/755c6d13ef9c657378013676c391c7a402166b3f419a464a3e058dcbe533/regex-2026.9.29-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:e1172147d28d8fbcf8cb8d26c41506169f5ad8fe9ec969cb116835a19d4d8eca", size = 872175, upload-time = "2026-09-29T00:48:26.255Z" },
{ url = "https://files.pythonhosted.org/packages/6c/fc/e1cab183b9dafe8597f58c1c766da9bf96204d3b2f232bcf3eeb75ff7b6c/regex-2026.9.29-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:92f05c9c42bde5785dc48770bc2194d9f7442544156f951e19cd31b096cec562", size = 777362, upload-time = "2026-09-29T00:48:28.389Z" },
{ url = "https://files.pythonhosted.org/packages/06/7c/e10ea17fba31fb4a1f9d13ed53a2d2a9066a2aea58d7557e263f6d99e7b0/regex-2026.9.29-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:f37964e4a5e993d2fd45147741e9dff7f34a2d8c00ab94c4ea0514a4677f959e", size = 865606, upload-time = "2026-09-29T00:48:30.4Z" },
{ url = "https://files.pythonhosted.org/packages/8e/6e/69824d9aee1fd41c54ea7264654a47c8d9d84d8a228e11c2bcf4c201ed81/regex-2026.9.29-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:951733b1bbdb71e377cec567b409f1a7881b47cfcad84121aa74cb575fa425ea", size = 807945, upload-time = "2026-09-29T00:48:32.375Z" },
{ url = "https://files.pythonhosted.org/packages/89/22/857050a86e21ce60193e02a8ef662521f2e263a645c8b1b905fc136b61a7/regex-2026.9.29-cp314-cp314t-win32.whl", hash = "sha256:65b408d8fcb273e3499e7ef2ce796810da1becd208c7fb4373692a242d79d461", size = 276758, upload-time = "2026-09-29T00:48:34.72Z" },
{ url = "https://files.pythonhosted.org/packages/4d/96/56808fe029553d7d4c703414f2a527faad2ea2bfa9ca094a2e7f8762b530/regex-2026.9.29-cp314-cp314t-win_amd64.whl", hash = "sha256:bf48516e35cf848390ea68850aba53e7c333720d2945b4d2c25b69fc5171723f", size = 286527, upload-time = "2026-09-29T00:48:36.864Z" },
{ url = "https://files.pythonhosted.org/packages/01/aa/074e2cfb3d8101a6a764aba5f7c5d1e21de087483e35bdc0c4ce2eb60364/regex-2026.9.29-cp314-cp314t-win_arm64.whl", hash = "sha256:9173db3be74a35cb6731701094b98120f7ee4876a287882a59cdea1fa7da342f", size = 285954, upload-time = "2026-09-29T00:48:38.901Z" },
{ url = "https://files.pythonhosted.org/packages/a7/dc/d84990386c9dfdf8c377f00f371b241fdc9a2c8aea0e3d66941b2e51be0b/regex-2026.9.29-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:c3589f40749acce747510bf5d589d54e376cb0930ea58b35effac97e5312b0c1", size = 497836, upload-time = "2026-09-29T00:48:40.858Z" },
{ url = "https://files.pythonhosted.org/packages/c2/ab/a569ebde875fa12ff8c6c9a30e07503620f195e4be4d54c3d3ee8eecc283/regex-2026.9.29-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:32ab11df9677ca80bcbb5fe4eb1da9109a5019239a054836efc6fa1c64e683cf", size = 296244, upload-time = "2026-09-29T00:48:42.952Z" },
{ url = "https://files.pythonhosted.org/packages/f3/3e/7d548e82a108e7c8b2d5246650e397a2f8db599f9b2e975466939c5b4e70/regex-2026.9.29-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:7c03031610e3e6ed1768a2b7a8fc84637c1257b50c5eacaf094c6e17a84fc563", size = 293748, upload-time = "2026-09-29T00:48:44.985Z" },
{ url = "https://files.pythonhosted.org/packages/40/34/a8e19a52f452bbb07b32a2bef70dcdf90c2737049749f74cc12d7486fb4f/regex-2026.9.29-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:42e82e578c904445d4c8a35b8f28052cf567593215fa5db06266fbc6f77aaa2e", size = 807840, upload-time = "2026-09-29T00:48:46.948Z" },
{ url = "https://files.pythonhosted.org/packages/88/7b/11fbd4640b3bb82b72822a63c20ade4013d562d291703a9debeedc24e682/regex-2026.9.29-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0b65c72739f981377c9c22e0c5c3cd7f42da7bd8a3c9209330fac772c7d893ed", size = 879330, upload-time = "2026-09-29T00:48:49.168Z" },
{ url = "https://files.pythonhosted.org/packages/f3/55/de58c74f1f4e31586d83eb39c56872d686c4e0d0966d151884c833b94ced/regex-2026.9.29-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4408b2b27a95ca8cc48b7411945753773353b5c93b307754781086c99d3a576f", size = 919251, upload-time = "2026-09-29T00:48:51.322Z" },
{ url = "https://files.pythonhosted.org/packages/81/42/a8c480f6dd5ac59fa28ddae79afd9d7ac7e596fdb61813adc65bb6e674b8/regex-2026.9.29-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a714befaacbd10092ffe4cea0d3c5f008fb9efe9bc322c715bcdfdee414b9a3d", size = 808808, upload-time = "2026-09-29T00:48:53.529Z" },
{ url = "https://files.pythonhosted.org/packages/68/60/0bc0d1ec8b37ad64be6fa30e035251f11de9667a0fac9e82ee74517d81be/regex-2026.9.29-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:33026515aebc0e70d1c89978e53e8d695d35d9e472f8d5b34465ba3c74028650", size = 789907, upload-time = "2026-09-29T00:48:56.036Z" },
{ url = "https://files.pythonhosted.org/packages/da/84/116a3ef19b3acfe81077f0bf2cbc7714a5e94bc8935b7243ab61cb0f1c3c/regex-2026.9.29-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:31b003f9a070335e2a8233ee9b14a3ca8e6d792012ae011f741bf0aaf11744c5", size = 795770, upload-time = "2026-09-29T00:48:58.284Z" },
{ url = "https://files.pythonhosted.org/packages/96/ba/e38c3f203e7e7e18c957d48e6cb6dbf96c11e95a44efa4a480522afc5d6d/regex-2026.9.29-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:c03c6eb6ece86dfdcbb34799efaa339b093132e1aceed491ba5e08fe06cdf699", size = 870671, upload-time = "2026-09-29T00:49:00.506Z" },
{ url = "https://files.pythonhosted.org/packages/2f/0f/9ee0b0cb76c55f63684bd7fff554978e8773b4fc86e2bcb2d50772dc1086/regex-2026.9.29-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:a5300757f8a68f5b6cc33f57338d72a0e3589c5cc9ad5f8504ea06f028be582a", size = 778631, upload-time = "2026-09-29T00:49:02.984Z" },
{ url = "https://files.pythonhosted.org/packages/b6/19/e6e3eeb226af5872c4958002f6edef4e4f40ea4cc5f5665023f2019eb045/regex-2026.9.29-cp315-cp315-musllinux_1_2_s390x.whl", hash = "sha256:80c7cadd3fd2bfde5df8aa0787e315812cad0c313a753095d02f4c2b6c01677b", size = 862187, upload-time = "2026-09-29T00:49:05.264Z" },
{ url = "https://files.pythonhosted.org/packages/5b/62/823c102e106bb2711d6b7dfe5981552fe4467b2969c46a20c5c383cf498c/regex-2026.9.29-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:3f1e6cb402a89457582cd696f982559217d13484a193202c394015297968c86d", size = 798423, upload-time = "2026-09-29T00:49:07.644Z" },
{ url = "https://files.pythonhosted.org/packages/37/e0/e927776258fa70b2f6feffc3be584ffc85ba4c1e20a320f0aee9a632fc7d/regex-2026.9.29-cp315-cp315-win32.whl", hash = "sha256:a64b85a4760337cfefdb27d42da6ed8b58e8cde3f2d57b6ef43e76ef6ea9ef47", size = 274757, upload-time = "2026-09-29T00:49:10.513Z" },
{ url = "https://files.pythonhosted.org/packages/77/04/358de85d1860238e1b4fa98fc2c80c990124a25d2e14739e28cc02c25562/regex-2026.9.29-cp315-cp315-win_amd64.whl", hash = "sha256:b3e445b66c80b4eb4234e855ce94d9adc183eedbd632816228d89930b91b2c5b", size = 283824, upload-time = "2026-09-29T00:49:12.849Z" },
{ url = "https://files.pythonhosted.org/packages/92/d3/d5c5b264784a5ab2b0f8cf620c1eeb4dbf3440d306761905e7d99345bef5/regex-2026.9.29-cp315-cp315-win_arm64.whl", hash = "sha256:8f39588af4731c8923c26810eb3b33f76f17633985e40f59c3cd45a33805a895", size = 283664, upload-time = "2026-09-29T00:49:15.331Z" },
{ url = "https://files.pythonhosted.org/packages/02/dc/f63ec2c201445ce1150fe780f5c56f16a10124d9a9da3a93161dbb0d8892/regex-2026.9.29-cp315-cp315t-macosx_10_15_universal2.whl", hash = "sha256:fb99cc9d45f48895d9d67f6a0b8a57f08d39c174d9f25ad97a313e0470267b1c", size = 501549, upload-time = "2026-09-29T00:49:17.705Z" },
{ url = "https://files.pythonhosted.org/packages/9a/5c/d2a698dc6bfc11fbce03f1cb0249c13284e93b79ed11f893edf6fac431c9/regex-2026.9.29-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:720537c7ea6f80dc61913184edb0ce2497a306b39ef19f28505b322553d52bdb", size = 298187, upload-time = "2026-09-29T00:49:20.171Z" },
{ url = "https://files.pythonhosted.org/packages/85/b7/88dcdb38cd3935d4ee9e9ce9b8e56cb3b3518d1f020acfa7dd62ad289bf8/regex-2026.9.29-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:0fd2c901cc307a745ad4bc87f20060d7a0825a3371d1e93488af22e7a387f78f", size = 296157, upload-time = "2026-09-29T00:49:22.342Z" },
{ url = "https://files.pythonhosted.org/packages/d3/8e/ba6c01dde33a69fc294b38b43f6677baaa5735a6248f39708031a738158a/regex-2026.9.29-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b11b589e00095ec69cf79841a76360f9b079e95b0368a25b5ebb951ab0c157ff", size = 818468, upload-time = "2026-09-29T00:49:24.612Z" },
{ url = "https://files.pythonhosted.org/packages/2a/f1/2586693e3a2d6b1247852593d37a6c17b42a92ee44f7cdcb9a0c1494e64a/regex-2026.9.29-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d7cab119d0df0b9413f106b4d7fc34f2872d3574ed3806fb48959c830b1537da", size = 882825, upload-time = "2026-09-29T00:49:26.996Z" },
{ url = "https://files.pythonhosted.org/packages/30/51/084f3e7bdcd0e9c33665c938cf5d134dc3548cbb4a75f0197ec7bfd754b1/regex-2026.9.29-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b89efc38431793d28b7cd91227e2f952ad7c48df19132b17f43a5fec3c14143b", size = 923314, upload-time = "2026-09-29T00:49:29.822Z" },
{ url = "https://files.pythonhosted.org/packages/5a/f1/066c6fc23b7dc229789c21c880b5ba5ad689fb95fed12e078266f55a1f9b/regex-2026.9.29-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:80a5ea3b4fd9d6a5b9a44f7976a9acaaab35aa3c1f6b29e5bd857dfabaded223", size = 822222, upload-time = "2026-09-29T00:49:32.404Z" },
{ url = "https://files.pythonhosted.org/packages/0a/56/592cd46fdb8f2f8682a1d7fd1310e4d0bcb93fbd0e6bbe4141ac28240227/regex-2026.9.29-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:19959129885356df0e97556856f77eb2888380dac18bed075a7c05c5128c618d", size = 794882, upload-time = "2026-09-29T00:49:35.076Z" },
{ url = "https://files.pythonhosted.org/packages/ee/4d/d65384bb071c864b01aa8314e3a6a687845ebd57588390976edc960c218b/regex-2026.9.29-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:6a1a824fbed817e0a891103886b68f063b1e83cc51bc97192a90a60195a9291f", size = 805887, upload-time = "2026-09-29T00:49:37.395Z" },
{ url = "https://files.pythonhosted.org/packages/65/b6/358de0d8f40d5178e4f7e7e121cfd5b961c812b77a055d11f5079e3f8fd7/regex-2026.9.29-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:1ba8c6a416569ce0d37e83e28a254a61dc99a419084dfb6476cea02d997f74fa", size = 872901, upload-time = "2026-09-29T00:49:39.927Z" },
{ url = "https://files.pythonhosted.org/packages/00/06/6bfded72d043240c6b52bbb5e16f639d81affbf7484b4fe2ec45f3d4afc9/regex-2026.9.29-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:446654b29bfaa30500d80947eda42cef1449dc8a87f4e3cf061cc8485d3a1f0b", size = 782970, upload-time = "2026-09-29T00:49:42.581Z" },
{ url = "https://files.pythonhosted.org/packages/5a/20/9f418a50baa78b3ed8308fcb0cc49e472dd000b7ef935a7295af202ea744/regex-2026.9.29-cp315-cp315t-musllinux_1_2_s390x.whl", hash = "sha256:bf3c49863c23a1ad6da9c30351aed6cff8d5ddbeb63c5c8420ae54e98c7d0138", size = 865441, upload-time = "2026-09-29T00:49:45.238Z" },
{ url = "https://files.pythonhosted.org/packages/2c/29/817c7eacdeaf8463123e949bd394c39ad024eea1ec38ddf5ad141da2f3bd/regex-2026.9.29-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:01000ddf0e3ffef97f2413ceb514f6313040106b6d18a03ee00a4fe35c1eb1db", size = 809431, upload-time = "2026-09-29T00:49:47.878Z" },
{ url = "https://files.pythonhosted.org/packages/63/0b/83aab3b5b739947f744135a7a3a446e25433ebc92b05e01aae197ccbfdda/regex-2026.9.29-cp315-cp315t-win32.whl", hash = "sha256:c4e38dd8f39c43a91d2410ad2b85610701b0979342c3df1d69eaf8e838c757d8", size = 276964, upload-time = "2026-09-29T00:49:50.524Z" },
{ url = "https://files.pythonhosted.org/packages/72/f2/6314b5fc68789b5dcc38885bc6e3d6986b34fb3372b7231088ee5cecaa05/regex-2026.9.29-cp315-cp315t-win_amd64.whl", hash = "sha256:e2c89e9b762c57f59d5e99ee8b20202adb892e35f8d3485741340999ca55058e", size = 286487, upload-time = "2026-09-29T00:49:53.224Z" },
{ url = "https://files.pythonhosted.org/packages/56/bc/97b2245c8c7b2dd01f2db74f2bea003cd33c15009b4996a2447f46b5325c/regex-2026.9.29-cp315-cp315t-win_arm64.whl", hash = "sha256:e8c65ef3862a8ad6e86492b6ed9327805dd66904c012bd3649dc67d822ed6c34", size = 285955, upload-time = "2026-09-29T00:49:55.655Z" },
]
[[package]]
name = "rpds-py"
version = "2026.9.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/42/68/3bd46b8a5e01d3c2ebdf9c5e9497912e3fe0cde02bac21a7130ca866e403/rpds_py-2026.9.1.tar.gz", hash = "sha256:4793ef7f78268b124b73fa933440f01d258bbae01de9fa53e9080c9ab0425a12", size = 63948, upload-time = "2026-10-04T16:32:36.469Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/f5/6d/ddb8dfcf41892ba9c672d27988592c038d30db61708230313831b6780a1b/rpds_py-2026.9.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:2711d29b653b3bce48a63d18b9c6b53274669e6d6c4094dddeb4d9a0e45128b2", size = 344947, upload-time = "2026-10-04T16:28:55.207Z" },
{ url = "https://files.pythonhosted.org/packages/9e/b2/632c3d034961149eff606e3e357547620a9ab37b849ae5815f67838753fd/rpds_py-2026.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3231c4c0e521dafa5be0c9f114ee2c2ad46650836f2d72caa86801950c3e7044", size = 346770, upload-time = "2026-10-04T16:28:56.884Z" },
{ url = "https://files.pythonhosted.org/packages/6d/45/4df346410bb873d03ec60c3b891d1fceb8cabde1971d29844bbb625cc296/rpds_py-2026.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e01b3c878c8641913e688edd1b3f08658c6783d29cf6b826bd3c0d1ae7a1ffaa", size = 377795, upload-time = "2026-10-04T16:28:58.193Z" },
{ url = "https://files.pythonhosted.org/packages/ba/b8/a70f302207e4f29f873c01a986fcac5def49b9c8224328cef1ad7da6b7a9/rpds_py-2026.9.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3e524c7874ac72884d28e16dd5b8d839fd09e0fe76b020d3fbca23212a7b8c52", size = 383137, upload-time = "2026-10-04T16:28:59.411Z" },
{ url = "https://files.pythonhosted.org/packages/13/e3/3aa28a48a01169d0e20728bf0e5ebbea3ae2774285b40853ae49b3ef332a/rpds_py-2026.9.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:761fdae6728ceb99ab182fad2f0cc1e262f610834dc891aea1d1a2a2e634776f", size = 496789, upload-time = "2026-10-04T16:29:01.011Z" },
{ url = "https://files.pythonhosted.org/packages/3e/a7/414e8d088602d66ad6f47c65bf07fe5090992a8574cdd4571c1a83b647ed/rpds_py-2026.9.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6b723eb406dec5bc9ec516c73ab9c3239a3284e017f7eb89ee2b3258bd504fb7", size = 395929, upload-time = "2026-10-04T16:29:02.465Z" },
{ url = "https://files.pythonhosted.org/packages/2d/5c/aac3b960fd55d37b49f77c0eebbe043eaf36762ebd48e7b46951e59c1c05/rpds_py-2026.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:136a1c3fe4402b7008bc81cb62ee538481795b61a7e83df88dff3b3f02b726ff", size = 375426, upload-time = "2026-10-04T16:29:03.944Z" },
{ url = "https://files.pythonhosted.org/packages/d3/80/77987a41c40be7202a78d9aed4a650bfb05792237cfd3b9e22638d990fe5/rpds_py-2026.9.1-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:839dde845559254f34885267c6878f60d61d5205180226d976fe488d45fa128e", size = 381497, upload-time = "2026-10-04T16:29:05.308Z" },
{ url = "https://files.pythonhosted.org/packages/b8/d0/640b02eb1ecd71a913c1178b6235287b31006266bca9a26862e80e497b54/rpds_py-2026.9.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:56cd8b3f77d7b6812f533b662186a1f28316931166ddc00fb893b1b0db7e9888", size = 405740, upload-time = "2026-10-04T16:29:06.578Z" },
{ url = "https://files.pythonhosted.org/packages/3e/8c/d034195d45d215625a23f2ae85dbbdb86a49a93a51272061c97c80b9d316/rpds_py-2026.9.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:074a4d198bc34d9a8ea425114fc3ded6d11ec01f6a314a8db67454a5152d8834", size = 555850, upload-time = "2026-10-04T16:29:08.115Z" },
{ url = "https://files.pythonhosted.org/packages/de/f8/532f1addfc86207bc3cf23749638bb0d457bce891595012ed8a08d0543b8/rpds_py-2026.9.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6beb738155fe8ab8091afdfa5a3226b21c2b1593f1e50ebb90eb25b44dbc0391", size = 618661, upload-time = "2026-10-04T16:29:09.554Z" },
{ url = "https://files.pythonhosted.org/packages/50/5b/b0f2c9833a36a5b1f6ac5cb0e635fabacf713266f46ceefba2102da0bf51/rpds_py-2026.9.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:57492a550a1d88d29d003247e5f78dd8cf04a701fac0e4c8db8745a6d2504e0a", size = 583530, upload-time = "2026-10-04T16:29:11.072Z" },
{ url = "https://files.pythonhosted.org/packages/bf/20/464ed4b98d3c8c6a334f3b5e24d3886de04b05658a95fc40a37e0e6e4775/rpds_py-2026.9.1-cp311-cp311-win32.whl", hash = "sha256:d95a354e02393eada6d7351184671aced9d4cce109dabf927cb7aa99624352a1", size = 208125, upload-time = "2026-10-04T16:29:12.408Z" },
{ url = "https://files.pythonhosted.org/packages/df/c9/384a9b62f8cd89c8e3e609b8c9052c140e8c01d807261e0517c904b8bf29/rpds_py-2026.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:ce4d4f52e2a4324396caddbd45a97d8d7be5f42edd25d2355282a9c34f9b2f7f", size = 226045, upload-time = "2026-10-04T16:29:13.751Z" },
{ url = "https://files.pythonhosted.org/packages/4f/3b/0a691f0dcb2301fa9c736346da2d0d4991778373283301c5c12b8f952f3d/rpds_py-2026.9.1-cp311-cp311-win_arm64.whl", hash = "sha256:fdcd198979b4ecffcc1beba366a7fbcf4eb41243691a82fe52ceb0b902f09c12", size = 222636, upload-time = "2026-10-04T16:29:14.989Z" },
{ url = "https://files.pythonhosted.org/packages/5d/34/a828586ea3329fbb50895b50e9cf98ca3d924a9f41a0b26d443bff1b3794/rpds_py-2026.9.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:50906f5aea24b5a865cbd0a589698288631d9f3a54c3a937c83aefa95a0d14af", size = 346822, upload-time = "2026-10-04T16:29:16.258Z" },
{ url = "https://files.pythonhosted.org/packages/90/81/ac6a0d064982251856ce009c9e1dd51a34110b3c055aa7d1aad18b4899a3/rpds_py-2026.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e21c1429e205828ea886a2293a4a2c8e01f4c25d9893ca330e97a6cf73f52e7b", size = 341380, upload-time = "2026-10-04T16:29:17.706Z" },
{ url = "https://files.pythonhosted.org/packages/42/ff/bf7d54f362748fd6a49277b9d6531c394074110fedf50ad791ec59133fbb/rpds_py-2026.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2693b2728bbcc48d09a981a356954b0c47c53ff25b545856f28a889ea619f69a", size = 373053, upload-time = "2026-10-04T16:29:19.063Z" },
{ url = "https://files.pythonhosted.org/packages/60/de/74b0ccdbbd28687b9b5fdb34c1cabed88352182facaced9d6f5486b8b9ed/rpds_py-2026.9.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8601470267d938bcb7f3ab1a336100af51a4fd5b6ed030ef52461bb3ef5e7e07", size = 377742, upload-time = "2026-10-04T16:29:20.543Z" },
{ url = "https://files.pythonhosted.org/packages/c2/6d/b979775a3057b2a5c26d75ecbff60a20a24ef081db6dd76836fca3f20247/rpds_py-2026.9.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3890a6aa36e6baa53d5258a2a25d3ef8b37ad165a6ab27a892d7c3e3a432cd69", size = 487289, upload-time = "2026-10-04T16:29:21.958Z" },
{ url = "https://files.pythonhosted.org/packages/1d/5d/7c34734ce3ece943d9d6ee0122a74a21bbc75b47acb5b7053c83f6efb1ed/rpds_py-2026.9.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6b5b393eda5ea42cca1c1a6665f2a4882b4fd5d1777e41ce0545a107fb008c9d", size = 390710, upload-time = "2026-10-04T16:29:23.378Z" },
{ url = "https://files.pythonhosted.org/packages/1d/6d/b26eb1e75395925b3a142ed351cbed2ec8212f5c9d937aee3df32c701baa/rpds_py-2026.9.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:addeda51556dac7c1a2f14cda62db8b621cd12afba3091d03a96c72932387eab", size = 371261, upload-time = "2026-10-04T16:29:25.1Z" },
{ url = "https://files.pythonhosted.org/packages/7c/98/b2fdfe10301a9e27af21e634337fbba7baac0bc17fe44619a17c26bba2cb/rpds_py-2026.9.1-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:d9edf30457d74eebfd76b045535e36f1cd89062566a128a0db2145ca042d787e", size = 376075, upload-time = "2026-10-04T16:29:26.748Z" },
{ url = "https://files.pythonhosted.org/packages/c5/b1/c4b8d954e49c3c69cf8063c0c9e0919c99f3d2cecc46311606a1cbe835dc/rpds_py-2026.9.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:815d26356930846a40c7bc1366e7b1b0320ab8a063e66c11298a208bed0fd237", size = 399358, upload-time = "2026-10-04T16:29:28.282Z" },
{ url = "https://files.pythonhosted.org/packages/b3/59/9559a7293c97dff0cbb293efffbd36644103883ecc27741af8ef90c84ca8/rpds_py-2026.9.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3b5a6f40f0a1486b4b36c888123afc67acdbd9f33235927acf5ff295429a0ba3", size = 550267, upload-time = "2026-10-04T16:29:29.851Z" },
{ url = "https://files.pythonhosted.org/packages/6c/9d/6dc60e49511de4c8b00e74f9c1d43aed4d27f712cdb1ade92f2c199cbf64/rpds_py-2026.9.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b5b8b0753718d258fd454283fbd57e14545d3b40583fa672e27cb4f987626bcc", size = 614018, upload-time = "2026-10-04T16:29:31.54Z" },
{ url = "https://files.pythonhosted.org/packages/fb/bc/92a4ecf27301b886232a413360f6b348a81d55ffef654f2ebda5970ebc3d/rpds_py-2026.9.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:46d80bc76b51a6c24f9944368c28d38b8bcbcea1da4f2f8d3ebc31a67e8c6ec6", size = 578509, upload-time = "2026-10-04T16:29:33.01Z" },
{ url = "https://files.pythonhosted.org/packages/08/53/efb97f2e6589b7ab8394385a73870e0b2ab2a195281c117b21fd6d7d4855/rpds_py-2026.9.1-cp312-cp312-win32.whl", hash = "sha256:befc2d6a953e563f8a7bfd87a42c22ebf8a3e980dcb7b6a4d17b70b0e914e8a3", size = 205401, upload-time = "2026-10-04T16:29:34.451Z" },
{ url = "https://files.pythonhosted.org/packages/1c/84/1700cc748d0eaa747486e4e82882d2575224e6e9a3148df583058850c629/rpds_py-2026.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:5ce8943f79c2210f7abcc28e86367b03b28d95027fd01c46d2472373ae70c86f", size = 222923, upload-time = "2026-10-04T16:29:35.709Z" },
{ url = "https://files.pythonhosted.org/packages/c3/89/0302215373c2f8b4408b0fdfee955368cc378a98ff59508d47a7e0dc2dbf/rpds_py-2026.9.1-cp312-cp312-win_arm64.whl", hash = "sha256:501909f2e4a1e2dee528ef766fe3c469060ebc17e54a8383d404ba07a81a6f02", size = 218415, upload-time = "2026-10-04T16:29:37.263Z" },
{ url = "https://files.pythonhosted.org/packages/83/ea/ee88fd9e756ff93fb6b1182a47ec09504a242620e33ce1d20679efefe841/rpds_py-2026.9.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:a36b70596407634ca82d4b989a3729074a008537a0522e4c8046a67c729103e9", size = 346229, upload-time = "2026-10-04T16:29:38.82Z" },
{ url = "https://files.pythonhosted.org/packages/57/71/a097d6552f837500fc36e6b23d09cfb9890c3cc47531f9ca64e149799615/rpds_py-2026.9.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eba5d173f7d5708b22a93815017a4611873ed54db9f268077c0dd1ed99cfc858", size = 340514, upload-time = "2026-10-04T16:29:40.405Z" },
{ url = "https://files.pythonhosted.org/packages/bd/b7/497e85768bf4e0d8ddbaa096a4cac31d1509251dee2728a8490aa367e0b5/rpds_py-2026.9.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:457866b85daf5034296666168b84a69e0b2e89dc4f1af102b46f6448a60b9063", size = 372611, upload-time = "2026-10-04T16:29:41.778Z" },
{ url = "https://files.pythonhosted.org/packages/52/4b/74ab4108916250b6e198e0d3af05bc6835eb046315f22f7a0ceb49667c5a/rpds_py-2026.9.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a3a52a3ba86436ab3aef510fbe21512abc2ddd1993005dfe50514bd2284ef025", size = 377712, upload-time = "2026-10-04T16:29:43.242Z" },
{ url = "https://files.pythonhosted.org/packages/0c/8e/067e77d9d7b3cc793c9d909b7e97e7aadbbb1fb094093b6876902cc96d38/rpds_py-2026.9.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d7841166b7fa64c9c56404617ae4341448847482d45933b13135d26c130519e5", size = 488106, upload-time = "2026-10-04T16:29:44.692Z" },
{ url = "https://files.pythonhosted.org/packages/3c/b4/c5aae6c2dde269bf955f6b7d35065c655a57e47750d9668052ad67e74dda/rpds_py-2026.9.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:926bdd3e3b5998ddf70cc64bc8cf57209571f9044542913afb673799fec77dd0", size = 390795, upload-time = "2026-10-04T16:29:46.129Z" },
{ url = "https://files.pythonhosted.org/packages/a0/36/76fab39973ee11e7f9f357c55138197bb01c86f6502cb76487e3b4f42db0/rpds_py-2026.9.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7868b85224291c6cb6759f9b5adb9745f486d226f62b16a614dd5a2a5ab2b35b", size = 370794, upload-time = "2026-10-04T16:29:47.603Z" },
{ url = "https://files.pythonhosted.org/packages/3d/fe/cd2a80e6d7b871937a60e935c5d507aa390d143f4ff3636f640b9733d5df/rpds_py-2026.9.1-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:3cd182d7291d29b92c521a0069d9c01ba6193628a9a105531d11b40a6d731a33", size = 375673, upload-time = "2026-10-04T16:29:49.223Z" },
{ url = "https://files.pythonhosted.org/packages/6c/18/7464a9953724e55a3b3206062fa0ffdeaa519584c6aabf65d3956d94f131/rpds_py-2026.9.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e6ea1cda8d8c688278430e4268a42f5e5da3bdd74578dfadc0820c3f1766ce83", size = 398758, upload-time = "2026-10-04T16:29:50.601Z" },
{ url = "https://files.pythonhosted.org/packages/c0/86/1534b436700fd49ff411063b7c4d7e938adfabf90895b6cf1622d5a7d1f6/rpds_py-2026.9.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5943980471829f6de242a20b109de3111ba6b77e3af0ffc587028ac854b05e6c", size = 550370, upload-time = "2026-10-04T16:29:52.002Z" },
{ url = "https://files.pythonhosted.org/packages/57/1c/e1fa82a8a01e3c5820f3ba98a8b2673f642128eb368fa88871b01dd2c909/rpds_py-2026.9.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:76d3af9732d2dab69f28179b40ba2d87e2f1d5824b4a694780aa787d685e8f36", size = 613106, upload-time = "2026-10-04T16:29:53.655Z" },
{ url = "https://files.pythonhosted.org/packages/29/55/b20b8c4c3dde8755bfcd5b08492a02d0cd2e26929aedf6199ca2a377d42a/rpds_py-2026.9.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:78326f4cb4427a56ba4996c0762b63be45f06b85f086526420d2b3a66e40f84d", size = 578235, upload-time = "2026-10-04T16:29:55.157Z" },
{ url = "https://files.pythonhosted.org/packages/55/42/df3f7bbc3f7ab37a8a9db8d6c2ff2c985422899f1f7926afbf7ec3c0b8b4/rpds_py-2026.9.1-cp313-cp313-win32.whl", hash = "sha256:172e47169583f46ce118cbec68e6795d0da0f4606b488b6434f8276bca0a058c", size = 205293, upload-time = "2026-10-04T16:29:56.669Z" },
{ url = "https://files.pythonhosted.org/packages/31/9c/ba5a9569d719bfdd6ce863df4133ac6a1658cf1b07cc3534c31db729fbbc/rpds_py-2026.9.1-cp313-cp313-win_amd64.whl", hash = "sha256:3e93b2cd69a9830be33e03945cd7cda940a0a8bfcfbff41d6144f0cb0d3d8bd9", size = 222409, upload-time = "2026-10-04T16:29:58.049Z" },
{ url = "https://files.pythonhosted.org/packages/35/72/f28ca566f6c23c35bbf7445f65eb0364577b25a026305995e24f78b83d94/rpds_py-2026.9.1-cp313-cp313-win_arm64.whl", hash = "sha256:d151e148117294133bf8af7eeace085e7e87432db15ab6adf640330298a47f6f", size = 217681, upload-time = "2026-10-04T16:29:59.449Z" },
{ url = "https://files.pythonhosted.org/packages/8a/f2/67b94be1532767803415c1c5a1fd88ea487643d74a673cec1ba140af77bb/rpds_py-2026.9.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:c9d1aca01f49170fdcf5c92761b1fafe97f554b721ca4570c5949fff778f0d4b", size = 347178, upload-time = "2026-10-04T16:30:00.865Z" },
{ url = "https://files.pythonhosted.org/packages/04/37/b751de2b59b0197a1d92a5dd491de88e8a5e928c2e6562581974f1e85263/rpds_py-2026.9.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3f0e9ac28fc067d4d34b88ae43c48e9489455c97fee9633d851f7eeed5a05d35", size = 341878, upload-time = "2026-10-04T16:30:02.564Z" },
{ url = "https://files.pythonhosted.org/packages/72/e2/5873bc4643c250db9e05d48dc0c93763d4aa68bc3b81164cb1af3b45b284/rpds_py-2026.9.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07deecbfce94c78473018bc7d10b337cc651d12df87a1eb2cb3e4024bc9c33d0", size = 373963, upload-time = "2026-10-04T16:30:04.026Z" },
{ url = "https://files.pythonhosted.org/packages/51/03/5acf7632158247f3f6386ff0af3a1ee48167d575037e8d0920594b76d92b/rpds_py-2026.9.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:821b2755db9194409254012f429c56643416fb96ef9be090be82ec8826b7f477", size = 377975, upload-time = "2026-10-04T16:30:05.555Z" },
{ url = "https://files.pythonhosted.org/packages/e6/00/63fda451b8bffa5808fc8bb311ee7c073b340974b09f273c7b2a145d3d62/rpds_py-2026.9.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c91c210ae7645626c608400e3519b4a642f837cce09ca830db3beb2e9f274d4", size = 490347, upload-time = "2026-10-04T16:30:07.156Z" },
{ url = "https://files.pythonhosted.org/packages/a1/ae/c093ffd070ba0fb02f76c565d06fecc65ad6e4afdbae78f7031076d3cdac/rpds_py-2026.9.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:54ac2158a6f96cfbabff0b2eedaf94b90c5ec7ca8317fcadc61e1c2b2e0ff6ef", size = 392962, upload-time = "2026-10-04T16:30:08.77Z" },
{ url = "https://files.pythonhosted.org/packages/22/9d/d08a1128ab199b2f0cf25bfeb0639bd05119fff4b7c47bec24ef9a8ec23f/rpds_py-2026.9.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eac2f5dbafd585dfe31f86a23ebf0d3ba480a9d49ebc87947267b5608d4ea0cd", size = 371623, upload-time = "2026-10-04T16:30:10.501Z" },
{ url = "https://files.pythonhosted.org/packages/53/c7/4758ddcbb75609414bbccfcb11d612436f9b3ee821bd2f33f0f1604ee648/rpds_py-2026.9.1-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:8aa5dda18d39b6143eb24809d158f9252c88f402749b6f1b62a506cc7d96cc35", size = 376997, upload-time = "2026-10-04T16:30:12.124Z" },
{ url = "https://files.pythonhosted.org/packages/87/e4/947bd7f608ff60faf46dc9d389c3dffd0e3d767d78a0be19978448ef0ce7/rpds_py-2026.9.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5c90e7fa02e8f5de0d10c17595c568ada48c5302e749462c0ea1a4c362111a86", size = 400169, upload-time = "2026-10-04T16:30:13.804Z" },
{ url = "https://files.pythonhosted.org/packages/4b/35/fe93e020a0543b5670472c18d7e6af3197c08da571240ce1965c84f85c0f/rpds_py-2026.9.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e6d198bad4e49dd6732fbd636e2fc5c082f45c8cad0b4acb756b00c82c76072e", size = 551615, upload-time = "2026-10-04T16:30:15.332Z" },
{ url = "https://files.pythonhosted.org/packages/0d/4f/5d2a0136bb03b2a56a39dc6ff92d58a6e3e53a2e17079238b86228882f16/rpds_py-2026.9.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:96beca19ec79de272e8668585380ff9092c47077c1d7a1e098e00bbd921f4785", size = 614655, upload-time = "2026-10-04T16:30:16.92Z" },
{ url = "https://files.pythonhosted.org/packages/09/1c/3f1025aaf70d9bf7272cc41f8b64ee76b48bf01726248138430e16f23b38/rpds_py-2026.9.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a5cf77eb04f20b720be95265a3e00eb2a14814074255cc27069c551b2db53118", size = 579602, upload-time = "2026-10-04T16:30:18.555Z" },
{ url = "https://files.pythonhosted.org/packages/53/0d/5c72e6204f76610608706da32b6b7e11ef7e10317558a7bb15a122e008dc/rpds_py-2026.9.1-cp314-cp314-win32.whl", hash = "sha256:a03d57b86d2a51d0a66c92177e2be154ad015f357791d306e714569999cdb4cc", size = 206315, upload-time = "2026-10-04T16:30:20.05Z" },
{ url = "https://files.pythonhosted.org/packages/a4/0b/489d48abbcc7d70cf3fbf662d9d22abf1f4650761c0a9ae05260800800d3/rpds_py-2026.9.1-cp314-cp314-win_amd64.whl", hash = "sha256:837c6b305e26fe0f75b15c92cf3b2ba29e0ae19dc40b1c557b026cb426347d0c", size = 222852, upload-time = "2026-10-04T16:30:21.604Z" },
{ url = "https://files.pythonhosted.org/packages/91/16/bbb05a7e6a10cf79ba639be7f799d770ee15f64175cc61d081b218dd402a/rpds_py-2026.9.1-cp314-cp314-win_arm64.whl", hash = "sha256:fce4b85234a0cbad67bf8e6e1201ee815d172c9aebad75f25645bc4d834f8e31", size = 218709, upload-time = "2026-10-04T16:30:23.036Z" },
{ url = "https://files.pythonhosted.org/packages/22/ac/ac507a0a4ec478ca470440a09583db4be5259ba7670aeba0620822f1e57a/rpds_py-2026.9.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:3a72c11530d71abfb66c8d7696a2f86c43e63fca8b948f1a784ac490f4ec688e", size = 349596, upload-time = "2026-10-04T16:30:24.558Z" },
{ url = "https://files.pythonhosted.org/packages/e9/f2/817a46b658d5070f477f722c298ee9a24525b0e4017347964146ef5fdd0e/rpds_py-2026.9.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:068c37bba854ec2fe42f7365c640af11dd9895890ccbf2df5070d0c059bd7f96", size = 343114, upload-time = "2026-10-04T16:30:26.048Z" },
{ url = "https://files.pythonhosted.org/packages/6c/42/6ade976b13ac1b4cb3bf2eb603f1be2fe74df19a29988d4c2b386be59d6f/rpds_py-2026.9.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fca4eb6df565e2a928f1c7dad92d27db8f9df0f449e76423ed5d7e713ed445", size = 374197, upload-time = "2026-10-04T16:30:27.699Z" },
{ url = "https://files.pythonhosted.org/packages/d9/70/77cdf1d3f1a07faabe936016ae623aec7981f73108a8fe7a203ed2e21998/rpds_py-2026.9.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c933c6678c6f116ff8af47a4c6db0868b8ace74af0343016c0ef00f00272ea69", size = 378025, upload-time = "2026-10-04T16:30:29.451Z" },
{ url = "https://files.pythonhosted.org/packages/3f/6b/18a44a3beaa9b7931acb04af7bd9539836477c630a794452d4826d6185d4/rpds_py-2026.9.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:028ad274ea951dac64491b5d1e65712a4aeabfdbdb9fccf797b57bd899b0c495", size = 491969, upload-time = "2026-10-04T16:30:30.995Z" },
{ url = "https://files.pythonhosted.org/packages/73/27/fb39cfd6bddaf741b024f813890374578ff8ac1f1adc473659c048b03b05/rpds_py-2026.9.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:740d0a99cf9de0b17a3943388e9294a59becf75e7c43421f387bd3c7a9901f7c", size = 393905, upload-time = "2026-10-04T16:30:32.628Z" },
{ url = "https://files.pythonhosted.org/packages/ed/71/0fa7bb77b57af0d710273964180d11b503f62b8a5c358eb2d8c3f62feff6/rpds_py-2026.9.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0da298fb372dc192610a4b9ecbc68a0cd8b675bbbd1fc519d01b41cfd658333e", size = 374569, upload-time = "2026-10-04T16:30:34.257Z" },
{ url = "https://files.pythonhosted.org/packages/54/22/f41cfac269af3b449513ef1bc3d7f32fde52abbbd2d01c7e76b47743acd9/rpds_py-2026.9.1-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:eb61be926bb81567c1f48bdc8aa22b9855048dc2efd53871f9f7e6e9a5632346", size = 377482, upload-time = "2026-10-04T16:30:35.997Z" },
{ url = "https://files.pythonhosted.org/packages/b4/fc/312b49006e7f8f9ca5f96647577b8aa6f3df30519c46bd448f5c425af0b2/rpds_py-2026.9.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:42e75466f83cd43f6026c81eab74246efb2bdadafb307b85700632d06c68f299", size = 400040, upload-time = "2026-10-04T16:30:37.76Z" },
{ url = "https://files.pythonhosted.org/packages/cf/a6/18cca7a878dc7fa95165a83343fd4d7b65643fd22e54e47340a451121d5c/rpds_py-2026.9.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:617f59cde379b4f648a09797b7f683d04b90a46344cddab85639da5aff0f5531", size = 551849, upload-time = "2026-10-04T16:30:39.443Z" },
{ url = "https://files.pythonhosted.org/packages/e4/6d/1f5685e20f39604691bdc3c05aaa6b8bd2f954e9e996477adf2376768e33/rpds_py-2026.9.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3edae8c5ddfdb6985d49ae9d150516e5076888879022f91a26c2de9276ce0bdb", size = 614842, upload-time = "2026-10-04T16:30:41.231Z" },
{ url = "https://files.pythonhosted.org/packages/c6/25/98652109fd9f7e10268dd4571aa52b81987001b806f37ef1a18260de714a/rpds_py-2026.9.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0f045bb053c9057720d72c56dffe30dffdc05997b2897a827b9325f0ab6623fa", size = 582606, upload-time = "2026-10-04T16:30:43.345Z" },
{ url = "https://files.pythonhosted.org/packages/19/03/11ca09099bab5f53373a80a334c424ec917c13d050760a59499d2af5171e/rpds_py-2026.9.1-cp314-cp314t-win32.whl", hash = "sha256:bf35d0568abda97233239ce32896d3ad53fccc537832c104e30c94aa5fb93569", size = 203341, upload-time = "2026-10-04T16:30:44.954Z" },
{ url = "https://files.pythonhosted.org/packages/6f/8a/88909e3ffd9f47f5b58211473875d8c3c09079f0058c46fb72c55a702a26/rpds_py-2026.9.1-cp314-cp314t-win_amd64.whl", hash = "sha256:1e8d4d79d828299bf44a55db22a9388ab967b49d17132c88eab0f4360b48da8e", size = 222843, upload-time = "2026-10-04T16:30:46.486Z" },
{ url = "https://files.pythonhosted.org/packages/f6/b7/a662f367d4896dd0a10cef2fc91f10b7f08af1c10858e287e019563f338d/rpds_py-2026.9.1-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:1d77b649e6f7cdf12ca5c2a98dad0ad37f9ea9b6f960408a92f0cb12bb3d04d9", size = 347463, upload-time = "2026-10-04T16:30:48.203Z" },
{ url = "https://files.pythonhosted.org/packages/ae/3f/ad45d03df4f84ebae5439577ee81f3999d182711e82235c8037b6528890e/rpds_py-2026.9.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:00ba2d8c7dd4ee537978ddf4b3fbd712bef2d8751603f7f3146b3f4287768e25", size = 342051, upload-time = "2026-10-04T16:30:49.872Z" },
{ url = "https://files.pythonhosted.org/packages/7e/31/3dcd68c13d4bcc59c1f7eb33ac8e80698f06f3eb0d8a1e06419836071c20/rpds_py-2026.9.1-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec450527cbf485e13c8d3602a54f428ab0432fdade0ede75efd74b735421c871", size = 374143, upload-time = "2026-10-04T16:30:51.508Z" },
{ url = "https://files.pythonhosted.org/packages/cf/0d/68c1f058a250fbd1380ebda9fc227cbf50117adf8ffe8161ef383ea79f68/rpds_py-2026.9.1-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:306ee1850d8105b5baf977e78d45fcadd12c1a54678d614c9baf217708446e91", size = 378604, upload-time = "2026-10-04T16:30:53.206Z" },
{ url = "https://files.pythonhosted.org/packages/d7/d6/2d4c59b85397cb4800594fadf692688ccf5ce556adc930e7a5bf21061a5e/rpds_py-2026.9.1-cp315-cp315-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ef6b65b03247c54692ad4fd9ee97cb772781927db72e3cb05e70b3db6d1ff14f", size = 490790, upload-time = "2026-10-04T16:30:54.925Z" },
{ url = "https://files.pythonhosted.org/packages/da/04/7e05dc3aebaf52f4e026766bd668fdd09a9d0e23f64a14686b36b3501892/rpds_py-2026.9.1-cp315-cp315-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a575404ebc9cf2e91edd32eaf570ec1430eb900d4f56724ba7dd4bc1fc9c176d", size = 393146, upload-time = "2026-10-04T16:30:56.625Z" },
{ url = "https://files.pythonhosted.org/packages/57/ca/e2e9a0a46a74ed51a0498ba1fe10f4ea6b2d9a155f372a2f91e51f18cf10/rpds_py-2026.9.1-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c16ab111bc27c646ba8aa005d0527754edc538ebb636f0b1bf8e244b48d1945", size = 372022, upload-time = "2026-10-04T16:30:58.295Z" },
{ url = "https://files.pythonhosted.org/packages/ba/cb/8f8774df5134e23424372838bcc5c7ed4127d723e1ff52f7bebd4dcb2563/rpds_py-2026.9.1-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:7664419f27db41d4f1c43a78dccda7dd6e8ef2428df3ee01d0c2a07a6b071297", size = 377092, upload-time = "2026-10-04T16:30:59.984Z" },
{ url = "https://files.pythonhosted.org/packages/90/02/8d7095d73bf9114219be40230baa5df00611e0a82ed9517779ff9c19f82b/rpds_py-2026.9.1-cp315-cp315-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4b26b03d9d2658ee2fa234f8f4f19f38a09773fe5261028025032e26d4d35af0", size = 400830, upload-time = "2026-10-04T16:31:01.721Z" },
{ url = "https://files.pythonhosted.org/packages/ec/02/8206856f8f363cd042a8315dc86b3912f5dcb6d3c66bbb24b69c2bfb0775/rpds_py-2026.9.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:be3e47e2d91aa3942ff9bf4077a505226005abfc39b6f7554a91c1b9393986b9", size = 551478, upload-time = "2026-10-04T16:31:03.472Z" },
{ url = "https://files.pythonhosted.org/packages/41/6b/36211f1bb1f0b0313f496d92f5905b74ea107f27cb16fa3355a82f04575e/rpds_py-2026.9.1-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:6307a0da524939decb8ca4a3933b8ab62525794411d6984fca6726e732804af6", size = 615173, upload-time = "2026-10-04T16:31:05.281Z" },
{ url = "https://files.pythonhosted.org/packages/35/77/cda0c4a6f055446b692f0ed5692f73707cafd3dff82672ede31b1a9b59de/rpds_py-2026.9.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:159a7aab5c5e8b112c8830f54717ce56da1252ebdbb526f5be2df2309280b9e7", size = 579653, upload-time = "2026-10-04T16:31:07.065Z" },
{ url = "https://files.pythonhosted.org/packages/74/ec/d8385f446240aed643b9e92a5055cff3015cc04a13c61f73b2883c478ed5/rpds_py-2026.9.1-cp315-cp315-win32.whl", hash = "sha256:dbc2673f9223d420c91145599b3ba45a8a50c207d1976908e5fb5ddb0c9b9429", size = 206498, upload-time = "2026-10-04T16:31:08.989Z" },
{ url = "https://files.pythonhosted.org/packages/6d/a5/71b5cd00e0521e3b6b81828baea368c62b6b700ebdd9554cd7d41ddf12fa/rpds_py-2026.9.1-cp315-cp315-win_amd64.whl", hash = "sha256:75c38c50ab9aca840225d9a9a3810bf11d04bd5c1f186cabbb8aee56db3e9b15", size = 223121, upload-time = "2026-10-04T16:31:10.84Z" },
{ url = "https://files.pythonhosted.org/packages/33/58/dba857c3bc8221b31b62eb170a3080f4f191de79f047200389b7ed1b06a7/rpds_py-2026.9.1-cp315-cp315-win_arm64.whl", hash = "sha256:a431156bb41865fc14cd5d79bb9d7bbed83110b0159e34e62ae30951f96c0009", size = 218741, upload-time = "2026-10-04T16:31:12.592Z" },
{ url = "https://files.pythonhosted.org/packages/5b/d0/320ab28ccc1415eeb509d68682b0014fb74690cd49f1c2d29a232475af50/rpds_py-2026.9.1-cp315-cp315t-macosx_10_12_x86_64.whl", hash = "sha256:ef0d8c843e2827d6c120ab4687e9423fb1d893db1df27b7c1506615bcb9734a0", size = 349719, upload-time = "2026-10-04T16:31:14.48Z" },
{ url = "https://files.pythonhosted.org/packages/56/88/f5b12f1358f443c08b7ce3cc8391d82d335f4872580e2e097847fd36087a/rpds_py-2026.9.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:45bc6bccf78b20fd834237d18db64965d7ee68ba7f60440a26c7ab71e7b8d51a", size = 343267, upload-time = "2026-10-04T16:31:16.827Z" },
{ url = "https://files.pythonhosted.org/packages/f7/0c/c765b0059d532acb3b9c45d781ccc22f15a96dbe443d00903f643ba9df10/rpds_py-2026.9.1-cp315-cp315t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d55198263bb51f557550c6ed2e6d1cb6a6fed6eb5c9120b741c5926bef8a45d", size = 374555, upload-time = "2026-10-04T16:31:18.931Z" },
{ url = "https://files.pythonhosted.org/packages/6b/8a/cafddfda77564a10cd21184640c3bffda6a2b8d20972fb5dedd5e0166328/rpds_py-2026.9.1-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a8763f20692da7df39b0afdd1ba3042b004c50a45994f76c2d9a25641f7673db", size = 378346, upload-time = "2026-10-04T16:31:20.75Z" },
{ url = "https://files.pythonhosted.org/packages/b9/01/5e626016eff72c183bf6c96539240cace15d402468647a453ec08415b2fc/rpds_py-2026.9.1-cp315-cp315t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e43d4a1f673e8a1cbd8533e809e02b4bf9d4f2280269bb640436556312121250", size = 492373, upload-time = "2026-10-04T16:31:22.614Z" },
{ url = "https://files.pythonhosted.org/packages/3b/9c/15a2469e9389242f46896b3f0a01d68caea8a5a35c011fcb05ef333aae73/rpds_py-2026.9.1-cp315-cp315t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea394a937f17a54c51239348bdbe2e3518124c8d4a8951ba04a311d3095bd18f", size = 394371, upload-time = "2026-10-04T16:31:24.768Z" },
{ url = "https://files.pythonhosted.org/packages/63/f5/c100ff77e1e6366e947c75969c258fdfc4b7bc5bbfe7351e62ffbf2a1228/rpds_py-2026.9.1-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdeaa99ce822dca76cfb1b993e9120c5ea212f2eb66d48950ad63c349668a018", size = 375132, upload-time = "2026-10-04T16:31:26.588Z" },
{ url = "https://files.pythonhosted.org/packages/dd/f4/fe0269c9de253e99c81cabc12b8971a5feaa083debdaff1221e06264d9e3/rpds_py-2026.9.1-cp315-cp315t-manylinux_2_31_riscv64.whl", hash = "sha256:b4f062343e7ad3fa94f2c66e5ae667dee47ee74dd41a9057c4fbe163236a123d", size = 377642, upload-time = "2026-10-04T16:31:28.677Z" },
{ url = "https://files.pythonhosted.org/packages/05/65/b34a7b257baccff8f4a24a722933166d4941d5ebdc9c3f4bc4ffcd5ce4f4/rpds_py-2026.9.1-cp315-cp315t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:22ffd29a63d71fb1b81552c21f2c2b734949b7ac751a9be70675a939a900839b", size = 400855, upload-time = "2026-10-04T16:31:30.802Z" },
{ url = "https://files.pythonhosted.org/packages/98/32/844e54176b6071b90b38a564e6940bc6eb8f97b2890dc709c19db9dec0f4/rpds_py-2026.9.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:08dae4a4095150a7c4545a1fb40b98e1ab1744fbc2770d92c977b9dadaa49ab6", size = 552573, upload-time = "2026-10-04T16:31:32.709Z" },
{ url = "https://files.pythonhosted.org/packages/17/73/6041d20729dffbfdf155c02d65be58bc225a1c1fb548fd87c23ef306138f/rpds_py-2026.9.1-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:9a0460d43603d1fd9ef59c30278531e15d78581721ddb538fa560aa7817ea4ad", size = 615840, upload-time = "2026-10-04T16:31:34.565Z" },
{ url = "https://files.pythonhosted.org/packages/af/9e/418094adaee6b056ce199051b255448ed872829051e341b2294c80da0977/rpds_py-2026.9.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:1c2d1f6da5128eabf34e963d7163a818846075a52568250d006c4c953b40f903", size = 582764, upload-time = "2026-10-04T16:31:36.665Z" },
{ url = "https://files.pythonhosted.org/packages/3d/9b/1698ebf6b840ddfe8b472198abbed6ace35c6e398faeecd6c47dae742a4e/rpds_py-2026.9.1-cp315-cp315t-win32.whl", hash = "sha256:5c6ee90dee3e85e055ddfd502d611643d9b0fd94c818220bda84ec3dacd9b27b", size = 203795, upload-time = "2026-10-04T16:31:38.53Z" },
{ url = "https://files.pythonhosted.org/packages/8a/e2/91f70d804c61f8eac39a417e82aa1024f655ab9e8bdd7393b196242bc41b/rpds_py-2026.9.1-cp315-cp315t-win_amd64.whl", hash = "sha256:fe5ad0664ec772b02c45859041aa17655709cced7a31005817fbbbd988c25567", size = 223037, upload-time = "2026-10-04T16:31:40.468Z" },
{ url = "https://files.pythonhosted.org/packages/f3/ad/f0eba548e297987964ef8088403db875b333963bf8189f3f563b6936b20e/rpds_py-2026.9.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c0d2cb595a420b34d5086db0add011e26e2c09d6a024afbac4228bf8f863a30", size = 384112, upload-time = "2026-10-04T16:31:42.643Z" },
{ url = "https://files.pythonhosted.org/packages/33/89/891fa4d81f1eae7fe262ecd0aba2c51de94a116c7f3ccfb034fa75f4c537/rpds_py-2026.9.1-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f3d6ed6a98cfd19155996605474982cc470d7601746a6439078f1a5a3fa8b050", size = 389662, upload-time = "2026-10-04T16:31:44.642Z" },
{ url = "https://files.pythonhosted.org/packages/4f/46/912cf623b2263f9c9c2d04e8508fc38dbe89983faeba5fb36ca4558ae550/rpds_py-2026.9.1-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8171b44a054e5c67fd748ada04187f1250bf35b95f85e52ab64bcf3331a923bb", size = 504637, upload-time = "2026-10-04T16:31:46.667Z" },
{ url = "https://files.pythonhosted.org/packages/9b/5c/7f3cfa7c5f01765c9f47c8398210ed0c1eb686c0e99c223cb1c6776d3fb9/rpds_py-2026.9.1-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fda1d96e542c37b6c804547dbf489c129fe7c97183a76a5ec275909ba1a063df", size = 402607, upload-time = "2026-10-04T16:31:49.068Z" },
{ url = "https://files.pythonhosted.org/packages/f0/76/2e915d4115ee453c33e6af17bc1df7e22ddc52974e178eeeb92a78c09983/rpds_py-2026.9.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:270bdcdaac5d5b6f73c5e22e7e135c7f2a50e789f71d9e241d5be8d90026e19a", size = 382762, upload-time = "2026-10-04T16:31:51.24Z" },
{ url = "https://files.pythonhosted.org/packages/0d/e5/844382925d7b84a4074ad79fc2b9d05eb6231ea243b34f247e68e519b606/rpds_py-2026.9.1-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:84a6ecc0c940169190d2c23bd969debd48c94dbc855acd60188a68d71d421608", size = 389563, upload-time = "2026-10-04T16:31:53.549Z" },
{ url = "https://files.pythonhosted.org/packages/81/82/d6e3951602dc2e24790ef9d299aa24bf5e2493df5043f2c6da00480cc447/rpds_py-2026.9.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ab4b2fda7c2b542f7f9d886cc6a838c5079d2b76f72e6081411faba11adde2c9", size = 416842, upload-time = "2026-10-04T16:31:55.76Z" },
{ url = "https://files.pythonhosted.org/packages/ea/1c/8d248e4ea671d525ab7daa0703ad81cc2175076fa0ccd7ef088facbd2b01/rpds_py-2026.9.1-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:44b32a7c4f0da3d28af31c259e38ddcff096f855e205ed0671d02fcf44f1ea1c", size = 562434, upload-time = "2026-10-04T16:31:57.874Z" },
{ url = "https://files.pythonhosted.org/packages/ad/38/e7ac0db898120d15dea25e3661b1242a40cb3b23d1f4db86c15a01fe0ba1/rpds_py-2026.9.1-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:a3dbc5ed9514908d5046107d7b1346bde71eea61de6e0e4919c19354f97e769f", size = 627909, upload-time = "2026-10-04T16:31:59.977Z" },
{ url = "https://files.pythonhosted.org/packages/03/c8/37e555514932cb1ee36c75349187aa882a98dee5d5654c761699ed8a0d27/rpds_py-2026.9.1-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6eae33003518fd4cb4f83a218d5371469dd3001aa3b87128c005b07762f7fe5e", size = 593658, upload-time = "2026-10-04T16:32:02.14Z" },
{ url = "https://files.pythonhosted.org/packages/12/5c/5f69a91add94a8a33acea68a2b034a464946a654ff7296af9d957ef0d6a5/rpds_py-2026.9.1-pp311-pypy311_pp80-macosx_10_12_x86_64.whl", hash = "sha256:0483515261947e4e8b8e1375bf7463e7eb6ccfb3d86e7b554d90cd5285f20f32", size = 351769, upload-time = "2026-10-04T16:32:04.675Z" },
{ url = "https://files.pythonhosted.org/packages/41/22/35ea8bf3b2682b90ab687c74e4828418ff12298a5b0b0a0c033f61c86a30/rpds_py-2026.9.1-pp311-pypy311_pp80-macosx_11_0_arm64.whl", hash = "sha256:4cfaf02209061880210819934de2f4f6aa83dc04dafe6770276acc240a56da31", size = 351719, upload-time = "2026-10-04T16:32:06.834Z" },
{ url = "https://files.pythonhosted.org/packages/a3/90/a9ba81408369d34c1aca73319c15adc91ed45c1d21e9e8ee4832ffb7fe0b/rpds_py-2026.9.1-pp312-pypy312_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6cdc537c8633d7fd92a82e2e0d2ab74320a3f63d5e59fb9cf08711e08fe151c4", size = 381109, upload-time = "2026-10-04T16:32:08.994Z" },
{ url = "https://files.pythonhosted.org/packages/b3/44/5192a0bed94cec86bd2a5e1cc5a1bb8f7eec3aec907eacd2deb13e87e326/rpds_py-2026.9.1-pp312-pypy312_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:10e208f2425d973938afcd56e28a7c4be32e27b6a60b5d381f49fb9d8acf9759", size = 388222, upload-time = "2026-10-04T16:32:11.321Z" },
{ url = "https://files.pythonhosted.org/packages/92/cd/5356549711448f18b52f7a11ffbe90f1228774996fbf3c6cd1b18d22abaf/rpds_py-2026.9.1-pp312-pypy312_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c0dbbcc19735fe5f8b0a54c07659d154a9e69f47e15d0a6ab7299215daf62cb", size = 500384, upload-time = "2026-10-04T16:32:13.478Z" },
{ url = "https://files.pythonhosted.org/packages/7a/88/ddda9d28adfe33119c75b2e733d4ba7e326f41d7e1b1093951771768ca48/rpds_py-2026.9.1-pp312-pypy312_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:684fd492fff4fead00587544e059be2bbcb6f93454f21fa2a91b66fc7508be82", size = 401661, upload-time = "2026-10-04T16:32:15.653Z" },
{ url = "https://files.pythonhosted.org/packages/32/c3/bb59ba16a6b4a57995d15b8c04c00f28df3b938c4dcdde48fbe0f73edb0c/rpds_py-2026.9.1-pp312-pypy312_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1028417bb44037eb3069c1009bd7b7277212876cda22fbe565b0bca9fab6d2c", size = 380748, upload-time = "2026-10-04T16:32:17.727Z" },
{ url = "https://files.pythonhosted.org/packages/f5/b8/0580faa1c5a32ddc160130dd7ae54d2d007272a89a40a6b5db3e50f9f585/rpds_py-2026.9.1-pp312-pypy312_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:492e5e428cbe126221611f47e068f01660352feec4ad18bc0f5ea9b2ae88fb14", size = 385731, upload-time = "2026-10-04T16:32:19.855Z" },
{ url = "https://files.pythonhosted.org/packages/bf/70/f73564642bbe3322c7eeef2c2f258cf040b71c41a430b532e59d04a1b838/rpds_py-2026.9.1-pp312-pypy312_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:88b5268892fde430d5531f95bc560b6efbbd67c929662c586afd729a96e7461c", size = 412131, upload-time = "2026-10-04T16:32:22.285Z" },
{ url = "https://files.pythonhosted.org/packages/8c/5d/17fff2e1f8f68721a2afb5cb48f7e442c751bb6b4883157c5abaf618cd08/rpds_py-2026.9.1-pp312-pypy312_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:01445c8d194aa032a08e944f16567672da1c62dbdbefd8b6d0693032e290cf68", size = 558193, upload-time = "2026-10-04T16:32:24.4Z" },
{ url = "https://files.pythonhosted.org/packages/2a/d0/869ab6fb08531f97aae4a780b4d61b4190d8aef48fe054ee28bcf7114466/rpds_py-2026.9.1-pp312-pypy312_pp73-musllinux_1_2_i686.whl", hash = "sha256:eef6a03b0b6d08d0835ccfa8ec8d1bc70525e3801387567137b50c557695e6da", size = 622448, upload-time = "2026-10-04T16:32:26.844Z" },
{ url = "https://files.pythonhosted.org/packages/ba/a5/9672e532fe02cd3b92c78cfd8743abca939d96853006c63835009a1ecb6f/rpds_py-2026.9.1-pp312-pypy312_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6b9bf3135b4ad5981df9a73d71a35272d650a2985ae9c2746357b24d59de2448", size = 591126, upload-time = "2026-10-04T16:32:29.274Z" },
{ url = "https://files.pythonhosted.org/packages/80/ef/3a9f8e4279c7920af561deed4cb7ebebed2794a8f608cf404d5eef14a105/rpds_py-2026.9.1-pp312-pypy312_pp80-macosx_10_12_x86_64.whl", hash = "sha256:56c6952a9b15047466d0c2347c446a761d4527f89976156341e68f0ce5cc08b0", size = 357108, upload-time = "2026-10-04T16:32:31.641Z" },
{ url = "https://files.pythonhosted.org/packages/b7/55/4b2fa381a583760aea5c92841e4e928a358e1c6511b129219e9c2826a226/rpds_py-2026.9.1-pp312-pypy312_pp80-macosx_11_0_arm64.whl", hash = "sha256:b242c27c8f836305a4a72df9cdd564386ac57b807bd252a063223331c9316b37", size = 346877, upload-time = "2026-10-04T16:32:34.061Z" },
]
[[package]]
name = "sqlparse"
version = "0.6.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/5f/d3/3f06a1006f2261d1342aefb3c71eed02f5d4ca5bdbecd86ebc12ad38306e/sqlparse-0.6.0.tar.gz", hash = "sha256:113c35c75365ab9cc9c7231d68c6428fb11c085fc8e9eb1ad659b7ddbf6cd2b9", size = 178477, upload-time = "2026-08-13T19:16:06.396Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/d9/50/f00935da0ec7cbf325f8dc4f772ae46fbc7b672dd62876e73f0a94adda57/sqlparse-0.6.0-py3-none-any.whl", hash = "sha256:b861c0288ce2fa56209a9a6412d2e066ac664b3873b89c26c9d8415e8e32996f", size = 50070, upload-time = "2026-08-13T19:16:04.062Z" },
]
[[package]]
name = "tomlkit"
version = "0.15.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/94/96/e07752635b98536177fa1f37671c8f3cdde2e724c6bcf6034b2cfb571565/tomlkit-0.15.1.tar.gz", hash = "sha256:e25bbf38843005246210a12982776f27f99cb9be67160e14434d0c0d21ee1e97", size = 180129, upload-time = "2026-07-17T01:48:04.562Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/13/bc/8c13eb66537dce1d2bd3a57132902f38d0e7f5bb46fa9f4daed9fe9d76ee/tomlkit-0.15.1-py3-none-any.whl", hash = "sha256:177a05aece5a8ca5266fd3c448abb47b8d352f09d477d3ca8332db4d89b24304", size = 49449, upload-time = "2026-07-17T01:48:05.728Z" },
]
[[package]]
name = "ty"
version = "0.0.83"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/3b/7d/2fd9575bce2d14e2281bec82d0713dee68329b0dc944e9c06c2e36b761fe/ty-0.0.83.tar.gz", hash = "sha256:db118de73c05ac476faceb4d42d59782feaeddfc4d721fd3ae8b807a0a2ae4e4", size = 7373076, upload-time = "2026-09-21T22:47:29.207Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/bf/85/7259431bade2317d8b82fa27220ae4618c21396acf0ca28a7bd75e92afd7/ty-0.0.83-py3-none-linux_armv6l.whl", hash = "sha256:836bc08bad96ecc7e38baf1a6ddaec15aa8c8b46ae99a96365397b5f6481b7a5", size = 13905669, upload-time = "2026-09-21T22:46:36.677Z" },
{ url = "https://files.pythonhosted.org/packages/d2/30/9527386ade8dd71fc52f65cde3c094411af7ad0d505f9063ef0841998702/ty-0.0.83-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0f1fb029fe076c7dca404d98e38fdb5fdbc2038a09407f89d43be1fdd9b2c459", size = 13499505, upload-time = "2026-09-21T22:46:40.114Z" },
{ url = "https://files.pythonhosted.org/packages/a0/54/63080d8cfd59a53810499a69a2ebc995724be27618b70d7f099e73ace317/ty-0.0.83-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3515776d01ee3b1be974dafa73d449d0bc711afbc12ba341f82f70bc641ff4ee", size = 13498980, upload-time = "2026-09-21T22:46:43.197Z" },
{ url = "https://files.pythonhosted.org/packages/49/78/e647f190bd9513d09db30d45309e9b5df070b5caa44af2de3290fab59fbe/ty-0.0.83-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5b80d66c7f9c8d60f25ccfd40c6eaebe8fd7c9005074904e0e164dd89c13d03", size = 13494705, upload-time = "2026-09-21T22:46:46.106Z" },
{ url = "https://files.pythonhosted.org/packages/2e/12/aef645b13c5bd15e3e5993537dbc23f7d65475f3cf1755d07b4d3e56850d/ty-0.0.83-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:57eae4aa55dab1af5d1423227c6517ccab1e658fe265c8e5a58caa584ca2876b", size = 13661466, upload-time = "2026-09-21T22:46:49.392Z" },
{ url = "https://files.pythonhosted.org/packages/d4/c4/11872e823653c568468ef7f0c3b23aed7ad2d33652e20144d28d5bfad58a/ty-0.0.83-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dea3680911340ecf93dff5786dbeefd69c9399df685a22751e1fbd27e6007b50", size = 14479677, upload-time = "2026-09-21T22:46:52.277Z" },
{ url = "https://files.pythonhosted.org/packages/8e/db/5b0d0d24d16d24d781f29ee842ee718903e453dc4068acb02bef860d5540/ty-0.0.83-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8453786c274f48e2a89b78e8a505a4f449323f357f2ce26a9b90a4bd68176f67", size = 14972208, upload-time = "2026-09-21T22:46:55.242Z" },
{ url = "https://files.pythonhosted.org/packages/54/04/0077a53bcf6ceb41365a45d8091b52094c91a5f4b071c2a6d705ed8bb65b/ty-0.0.83-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7701bdae3b52271cf0835abe4202aa3b23b735425d8c5a3e6a8ca1c68d39ead8", size = 14660550, upload-time = "2026-09-21T22:46:58.256Z" },
{ url = "https://files.pythonhosted.org/packages/d4/ff/b6c879f1c3121387edd19ebdb1fb02af30691f88f632278a5d467fb5f348/ty-0.0.83-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa95b4376447e5309fe3ccc98ee75916a9082714e6a029b99427ca62021dc94a", size = 14147376, upload-time = "2026-09-21T22:47:01.167Z" },
{ url = "https://files.pythonhosted.org/packages/0d/bc/82e730247d53cb02acd5a91237c0c62f215b2e0379689a550176d307ed89/ty-0.0.83-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:2a4550a08fc1899a33e4a08787a73ec9daa99d292268df4f0a5f1c24c63854c3", size = 14567502, upload-time = "2026-09-21T22:47:04.344Z" },
{ url = "https://files.pythonhosted.org/packages/67/13/bb6f57923231f51b626931625ada71e219d64541f8fadf96065bc5034358/ty-0.0.83-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:feb72080f0835fa2b27485e3b11fa50dc57c30e0ba73808a3f7d64b56db83f6f", size = 13443051, upload-time = "2026-09-21T22:47:07.316Z" },
{ url = "https://files.pythonhosted.org/packages/50/20/9862431662d4453527cd52cf0f30d5975cd1801aa39e570bf45fb299be77/ty-0.0.83-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:3e5206def2d6e1df93c75ed8dc763255233ccc3153647509d125bada10ad770a", size = 13678908, upload-time = "2026-09-21T22:47:10.714Z" },
{ url = "https://files.pythonhosted.org/packages/d7/e3/94ebbe1573b76660fa09f2dbce96da6d0bb69a2d29c7b6ad538b452979d4/ty-0.0.83-py3-none-musllinux_1_2_i686.whl", hash = "sha256:bdf5dfa157f5c127ba096fe0561b47877e6e79562c7fc2b35906ba5e9f6bb723", size = 13937248, upload-time = "2026-09-21T22:47:14.133Z" },
{ url = "https://files.pythonhosted.org/packages/2f/c0/3ea45c2ec3a82fddb7137e457ccb2a452446905430d225adaa4990cdc338/ty-0.0.83-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:626d6ad00f05a5d9b7ea80de44b12931d0c0fb50e64eab20b7fcc13e9aff2a68", size = 14290826, upload-time = "2026-09-21T22:47:16.874Z" },
{ url = "https://files.pythonhosted.org/packages/d8/b2/c941ce83a59e46ef31dd04bdf6067530e7ec77d5f0cdd1e223fbc6fc351b/ty-0.0.83-py3-none-win32.whl", hash = "sha256:0391017dac6ba3e452e0322301f50bba12fbccadac07d7fd888c46951ad37638", size = 13105291, upload-time = "2026-09-21T22:47:19.807Z" },
{ url = "https://files.pythonhosted.org/packages/b2/8a/5eef9458505698b144643cbd2062f465c5d860d8cf86a8710d74505ad9a0/ty-0.0.83-py3-none-win_amd64.whl", hash = "sha256:1b67d86f5bbad4076ae1a2ff23a6a4493219885d72d4b148cb0193e090390060", size = 13901557, upload-time = "2026-09-21T22:47:23.429Z" },
{ url = "https://files.pythonhosted.org/packages/9f/27/a06061513f1de25569c2e8898018bd552ab7b31afa7cfe818703269b3350/ty-0.0.83-py3-none-win_arm64.whl", hash = "sha256:a916a3d7d68fe30b7aacdb9fe16d461fa944d722e59e96ea0fa9d206a1b6625f", size = 13627960, upload-time = "2026-09-21T22:47:26.305Z" },
]
[[package]]
name = "types-cffi"
version = "2.1.0.20260827"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "types-setuptools" },
]
sdist = { url = "https://files.pythonhosted.org/packages/04/bb/dbb844365103e4dc6ea52cdae0946c3ca55a7b8587e6f351710d7ee5bb78/types_cffi-2.1.0.20260827.tar.gz", hash = "sha256:53d1604771ad4ff09a1a90d6f6980ab36bebb6c39476dcc5bbf4896fa510d736", size = 18150, upload-time = "2026-08-27T12:07:21.754Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/0c/fc/690c243ddac627901f1448f5cb29ca3b5463774a00ac932862c60d7ce5cf/types_cffi-2.1.0.20260827-py3-none-any.whl", hash = "sha256:851b6ffa5b962c577a2330b98ac0b60c56c904d086726276946388f58a0cffaf", size = 20525, upload-time = "2026-08-27T12:07:20.836Z" },
]
[[package]]
name = "types-pyopenssl"
version = "24.1.0.20240722"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "cryptography" },
{ name = "types-cffi" },
]
sdist = { url = "https://files.pythonhosted.org/packages/93/29/47a346550fd2020dac9a7a6d033ea03fccb92fa47c726056618cc889745e/types-pyOpenSSL-24.1.0.20240722.tar.gz", hash = "sha256:47913b4678a01d879f503a12044468221ed8576263c1540dcb0484ca21b08c39", size = 8458, upload-time = "2024-07-22T02:32:22.558Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/98/05/c868a850b6fbb79c26f5f299b768ee0adc1f9816d3461dcf4287916f655b/types_pyOpenSSL-24.1.0.20240722-py3-none-any.whl", hash = "sha256:6a7a5d2ec042537934cfb4c9d4deb0e16c4c6250b09358df1f083682fe6fda54", size = 7499, upload-time = "2024-07-22T02:32:21.232Z" },
]
[[package]]
name = "types-pyyaml"
version = "6.0.12.20260906"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/90/6e/abec85b9013db5b934b0280a6dd104904d84f7bcbaab2e2f3def87ac7463/types_pyyaml-6.0.12.20260906.tar.gz", hash = "sha256:f59c1cc05010b833d2d72287bbaa72610106b28d42d89a907313117faba85212", size = 18649, upload-time = "2026-09-06T06:35:35.362Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/15/c0/fc0644b7ddcfb969e95845837143cb5173ddd6e06ee4ba5fc493cd9329b7/types_pyyaml-6.0.12.20260906-py3-none-any.whl", hash = "sha256:bca893ff0d51df5c9053137d5d0e6ccd36e939a196356f1d5c16372422f5137b", size = 21282, upload-time = "2026-09-06T06:35:34.372Z" },
]
[[package]]
name = "types-redis"
version = "4.6.0.20241004"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "cryptography" },
{ name = "types-pyopenssl" },
]
sdist = { url = "https://files.pythonhosted.org/packages/3a/95/c054d3ac940e8bac4ca216470c80c26688a0e79e09f520a942bb27da3386/types-redis-4.6.0.20241004.tar.gz", hash = "sha256:5f17d2b3f9091ab75384153bfa276619ffa1cf6a38da60e10d5e6749cc5b902e", size = 49679, upload-time = "2024-10-04T02:43:59.224Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/55/82/7d25dce10aad92d2226b269bce2f85cfd843b4477cd50245d7d40ecf8f89/types_redis-4.6.0.20241004-py3-none-any.whl", hash = "sha256:ef5da68cb827e5f606c8f9c0b49eeee4c2669d6d97122f301d3a55dc6a63f6ed", size = 58737, upload-time = "2024-10-04T02:43:57.968Z" },
]
[[package]]
name = "types-setuptools"
version = "84.0.0.20260812"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/4f/cd/3b2a3362a526f91c33f785a291462b2ec448ae531101c62372fc30a21f53/types_setuptools-84.0.0.20260812.tar.gz", hash = "sha256:09bedc248ebbb7a232c9419dfcdca329706e61bf2aa5743e9424d027f1d956b4", size = 46545, upload-time = "2026-08-12T03:52:42.316Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/8a/e5/3a41cab4066465593facd660b2683c017f3d88d3297cdd26db0677b8e479/types_setuptools-84.0.0.20260812-py3-none-any.whl", hash = "sha256:799c08e4bc6a288e8a0b538afb5f5ff320a08927ba8dbedb30c74ee3ba5d867b", size = 70320, upload-time = "2026-08-12T03:52:41.154Z" },
]
[[package]]
name = "typing-extensions"
version = "4.16.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" },
]
[[package]]
name = "tzdata"
version = "2026.5"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/d9/68/f1b440335057bfce71b6e50a9d09445aa2ecbd08359a337976627b8409e7/tzdata-2026.5.tar.gz", hash = "sha256:8cc73c0a0bfca7dbfa59235d60b2eff82231dee33f53d206db1acd9173cfc0a7", size = 200404, upload-time = "2026-10-03T09:23:14.143Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/94/21/1e5995a1c920cce14e4bffae20c665ec10e7ed03ab25e006cd741092b718/tzdata-2026.5-py2.py3-none-any.whl", hash = "sha256:b683bd1b6659ddcd810ff02ad09ba821d4bf1065072805063eb35c49617905ac", size = 347996, upload-time = "2026-10-03T09:23:12.535Z" },
]