pax_global_header 0000666 0000000 0000000 00000000064 15134010516 0014506 g ustar 00root root 0000000 0000000 52 comment=2825810e143a0377e3261fef658e1a59f7e0cf90
django-stubs-5.2.9/ 0000775 0000000 0000000 00000000000 15134010516 0014123 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/.editorconfig 0000664 0000000 0000000 00000000442 15134010516 0016600 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
django-stubs-5.2.9/.gitattributes 0000664 0000000 0000000 00000000132 15134010516 0017012 0 ustar 00root root 0000000 0000000 scripts/allowlist_*.txt linguist-language=ini
pyrightconfig*.json linguist-language=jsonc
django-stubs-5.2.9/.github/ 0000775 0000000 0000000 00000000000 15134010516 0015463 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/.github/ISSUE_TEMPLATE/ 0000775 0000000 0000000 00000000000 15134010516 0017646 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/.github/ISSUE_TEMPLATE/bug.md 0000664 0000000 0000000 00000001124 15134010516 0020743 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:
django-stubs-5.2.9/.github/pull_request_template.md 0000664 0000000 0000000 00000001016 15134010516 0022422 0 ustar 00root root 0000000 0000000 # I have made things!
## Related issues
django-stubs-5.2.9/.github/renovate.json 0000664 0000000 0000000 00000000672 15134010516 0020206 0 ustar 00root root 0000000 0000000 {
"dependencyDashboard": true,
"mode": "full",
"lockFileMaintenance": {
"enabled": true,
"automerge": true,
"automergeType": "branch",
"schedule": ["* * * * 1"],
"automergeSchedule": ["* * * * 2"]
},
"packageRules": [
{
"matchPackageNames": ["mypy"],
"rangeStrategy": "widen"
},
{
"matchPackageNames": ["python"],
"allowedVersions": "3.10"
}
]
}
django-stubs-5.2.9/.github/workflows/ 0000775 0000000 0000000 00000000000 15134010516 0017520 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/.github/workflows/mypy_primer.yml 0000664 0000000 0000000 00000005674 15134010516 0022633 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@v6
with:
path: django-stubs_to_test
fetch-depth: 0
- uses: actions/setup-python@v6
with:
python-version: "3.14"
- name: Install uv
uses: astral-sh/setup-uv@v7
- 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@v6
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@v6
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@v6
with:
name: mypy_primer_diffs
pattern: mypy_primer_diffs-*
delete-merged: true
django-stubs-5.2.9/.github/workflows/mypy_primer_comment.yml 0000664 0000000 0000000 00000007474 15134010516 0024355 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@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.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@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.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@d56df214f3902ffb330ca629acf5051a4e22aee2 # v1.49.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@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.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
})
}
django-stubs-5.2.9/.github/workflows/release.yml 0000664 0000000 0000000 00000002316 15134010516 0021665 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@v7
with:
python-version: "3.13"
- uses: actions/checkout@v6
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@v1.13.0
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@v7
with:
python-version: "3.13"
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Build package
run: uv build --package=django-stubs
- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@v1.13.0
django-stubs-5.2.9/.github/workflows/test.yml 0000664 0000000 0000000 00000015753 15134010516 0021235 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.10', '3.11', '3.12', '3.13']
fail-fast: false
steps:
- uses: actions/checkout@v6
- name: Install uv
uses: astral-sh/setup-uv@v7
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
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 --strict mypy_django_plugin
- name: Run mypy on ext code
run: uv run mypy --strict ext
- name: Run mypy on scripts and utils
run: uv run mypy --strict 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 --strict tests
test:
timeout-minutes: 15
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ['3.10', '3.11', '3.12', '3.13']
shard: [0, 1, 2, 3]
fail-fast: false
steps:
- uses: actions/checkout@v6
- name: Setup system dependencies
run: |
sudo apt-get update
sudo apt-get install binutils libproj-dev gdal-bin
- name: Install uv
uses: astral-sh/setup-uv@v7
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
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=4 --shard-id=${{ matrix.shard }} -n auto tests
test-older-django:
timeout-minutes: 15
runs-on: ubuntu-latest
strategy:
matrix:
shard: [0, 1, 2, 3]
fail-fast: false
steps:
- uses: actions/checkout@v6
- name: Setup system dependencies
run: |
sudo apt-get update
sudo apt-get install binutils libproj-dev gdal-bin
- name: Install uv
uses: astral-sh/setup-uv@v7
- name: Set up Python
uses: actions/setup-python@v6
with:
# NOTE: Keep renovate.json python "allowedVersions" in sync
python-version: '3.10'
- name: Install dependencies
run: uv sync --no-dev --group tests
- name: Downgrade Django
run: uv pip install django==5.0.0
# Exit 1 only if ont of the pytest error is a mypy crash
- name: Run pytest tests
run: "! uv run pytest --num-shards=4 --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']
fail-fast: false
steps:
- uses: actions/checkout@v6
- name: Setup system dependencies
run: |
sudo apt-get update
sudo apt-get install binutils libproj-dev gdal-bin
- name: Install uv
uses: astral-sh/setup-uv@v7
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
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@v6
- name: Install uv
uses: astral-sh/setup-uv@v7
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
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 stubs
uses: jakebailey/pyright-action@v2
with:
version: PATH
annotate: false
continue-on-error: true # TODO: remove this part
- name: Run pyright on the test cases
uses: jakebailey/pyright-action@v2
with:
version: PATH
project: ./pyrightconfig.testcases.json
run-pyrefly:
timeout-minutes: 10
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ['3.12']
fail-fast: false
steps:
- uses: actions/checkout@v6
- name: Install uv
uses: astral-sh/setup-uv@v7
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
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
matrix-test:
timeout-minutes: 10
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python-version: ['3.10', '3.11', '3.12', '3.13']
django-version: ['5.0', '5.1', '5.2']
steps:
- uses: actions/checkout@v6
- name: Setup system dependencies
run: |
sudo apt-get update
sudo apt-get install binutils libproj-dev gdal-bin
- name: Install uv
uses: astral-sh/setup-uv@v7
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
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@v6
with:
fetch-tags: true
- name: Install uv & Python
uses: astral-sh/setup-uv@v7
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
django-stubs-5.2.9/.gitignore 0000664 0000000 0000000 00000000252 15134010516 0016112 0 ustar 00root root 0000000 0000000 *.egg-info
.DS_Store
.idea/
.vscode/
.mypy_cache/
.pytest_cache/
.ruff_cache/
.venv/
__pycache__/
django-source/
out/
pip-wheel-metadata/
stubgen/
build/
dist/
ext/dist/
django-stubs-5.2.9/.pre-commit-config.yaml 0000664 0000000 0000000 00000002226 15134010516 0020406 0 ustar 00root root 0000000 0000000 # See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: 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: v0.14.11
hooks:
- id: ruff-check
args: ["--fix", "--exit-non-zero-on-fix"]
- id: ruff-format
- repo: https://github.com/codespell-project/codespell
rev: v2.4.1
hooks:
- id: codespell
additional_dependencies:
- tomli
- repo: https://github.com/astral-sh/uv-pre-commit
rev: 0.9.24
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
django-stubs-5.2.9/CONTRIBUTING.md 0000664 0000000 0000000 00000016353 15134010516 0016364 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).
### 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/)
Once it's done, simply run the following command to automatically setup a virtual environment and install dev dependencies:
```bash
uv sync
source .venv/bin/activate
```
Finally, install the pre-commit hooks:
```bash
pre-commit install
```
### Testing and Linting
We use `mypy`, `pytest`, `ruff`, and `black` for quality control. `ruff` and `black` are executed using pre-commit when you make a commit.
To ensure there are not formatting or typing issues in the entire repository you can run:
```bash
pre-commit run --all-files
```
NOTE: This command will not only lint but also modify files - so make sure to commit whatever changes you've made before hand.
You can also run pre-commit per file or for a specific path, simply replace "--all-files" with a target (see [this guide](https://codeburst.io/tool-your-django-project-pre-commit-hooks-e1799d84551f) for more info).
To execute the unit tests, simply run:
```bash
pytest -n auto
```
If you get some unexpected results or want to be sure that tests run is not affected by previous one, remove `mypy` cache:
```bash
rm -r .mypy_cache
```
### Testing stubs with `stubtest`
Run `./scripts/stubtest.sh` to test that stubs and sources are in-line.
We have some special files to allow errors:
1. `scripts/stubtest/allowlist.txt` where we store things that we really don't care about: hacks, django internal utility modules, things that are handled by our plugin, things that are not representable by type system, etc
2. `scripts/stubtest/allowlist_todo.txt` where we store all errors there are right now. Basically, this is a TODO list: we need to work through this list and fix things (or move entries to real `allowlist.txt`). In the end, ideally we can remove this file.
3. `scripts/stubtest/allowlist_todo_django52.txt` where we store new errors from the Django 5.0 to 5.2 upgrade. This is an extra TODO list.
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, run a quick test to see if it causes a runtime error.
If it does, please add the new generic class to the `_need_generic` list in the [`django_stubs_ext.patch` module](https://github.com/typeddjango/django-stubs/blob/master/ext/django_stubs_ext/patch.py).
## 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.
django-stubs-5.2.9/LICENSE.md 0000664 0000000 0000000 00000002063 15134010516 0015530 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.
django-stubs-5.2.9/README.md 0000664 0000000 0000000 00000045756 15134010516 0015423 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.
## 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 |
|----------------|--------------|----------------|------------------------|----------------|
| 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 |
| 5.1.3 | 1.13+ | 5.1 | 4.2 | 3.9 - 3.13 |
| 5.1.2 | 1.13+ | 5.1 | 4.2 | 3.9 - 3.13 |
| 5.1.1 | 1.13.x | 5.1 | 4.2 | 3.8 - 3.12 |
| 5.1.0 | 1.11.x | 5.1 | 4.2 | 3.8 - 3.12 |
| 5.0.4 | 1.11.x | 5.0 | 4.2 | 3.8 - 3.12 |
| 5.0.3 | 1.11.x | 5.0 | 4.2 | 3.8 - 3.12 |
| 5.0.2 | 1.10.x | 5.0 | 4.2 | 3.8 - 3.12 |
| 5.0.1 | 1.10.x | 5.0 | 4.2 | 3.8 - 3.12 |
| 5.0.0 | 1.10.x | 5.0 | 4.2, 4.1 | 3.8 - 3.12 |
| 4.2.7 | 1.7.x | 4.2 | 4.1, 3.2 | 3.8 - 3.12 |
| 4.2.6 | 1.6.x | 4.2 | 4.1, 3.2 | 3.8 - 3.12 |
| 4.2.5 | 1.6.x | 4.2 | 4.1, 3.2 | 3.8 - 3.12 |
| 4.2.4 | 1.5.x | 4.2 | 4.1, 3.2 | 3.8 - 3.11 |
| 4.2.3 | 1.4.x | 4.2 | 4.1, 3.2 | 3.8 - 3.11 |
| 4.2.2 | 1.4.x | 4.2 | 4.1, 3.2 | 3.8 - 3.11 |
| 4.2.1 | 1.3.x | 4.2 | 4.1, 3.2 | 3.8 - 3.11 |
| 4.2.0 | 1.2.x | 4.2 | 4.1, 4.0, 3.2 | 3.7 - 3.11 |
| 1.16.0 | 1.1.x | 4.1 | 4.0, 3.2 | 3.7 - 3.11 |
| 1.15.0 | 1.0.x | 4.1 | 4.0, 3.2 | 3.7 - 3.11 |
| 1.14.0 | 0.990+ | 4.1 | 4.0, 3.2 | 3.7 - 3.11 |
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`,
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/5.2/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/5.2/ref/request-response/#django.http.HttpRequest) has the attribute `user` that resolves to the type
```python
Union[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
```
### 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/5.2/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
# 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/5.2/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`, 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.
### 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.
## 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!
django-stubs-5.2.9/django-stubs/ 0000775 0000000 0000000 00000000000 15134010516 0016523 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/__init__.pyi 0000664 0000000 0000000 00000000340 15134010516 0021002 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: ...
django-stubs-5.2.9/django-stubs/apps/ 0000775 0000000 0000000 00000000000 15134010516 0017466 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/apps/__init__.pyi 0000664 0000000 0000000 00000000157 15134010516 0021753 0 ustar 00root root 0000000 0000000 from .config import AppConfig as AppConfig
from .registry import apps as apps
__all__ = ["AppConfig", "apps"]
django-stubs-5.2.9/django-stubs/apps/config.pyi 0000664 0000000 0000000 00000002170 15134010516 0021456 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: ...
django-stubs-5.2.9/django-stubs/apps/registry.pyi 0000664 0000000 0000000 00000003670 15134010516 0022067 0 ustar 00root root 0000000 0000000 import threading
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
_pending_operations: dict[tuple[str, str], list]
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, *model_keys: Any) -> None: ...
def do_pending_operations(self, model: type[Model]) -> None: ...
apps: Apps
django-stubs-5.2.9/django-stubs/conf/ 0000775 0000000 0000000 00000000000 15134010516 0017450 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/conf/__init__.pyi 0000664 0000000 0000000 00000003011 15134010516 0021725 0 ustar 00root root 0000000 0000000 from typing import Any, Literal, type_check_only
from django.utils.functional import LazyObject
from typing_extensions import Self
# 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"]
# RemovedInDjango60Warning.
FORMS_URLFIELD_ASSUME_HTTPS_DEPRECATED_MSG: str
# required for plugin to be able to distinguish this specific instance of LazySettings from others
@type_check_only
class _DjangoConfLazyObject(LazyObject):
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: ...
def __setattr__(self, name: str, value: Any) -> None: ...
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: ...
django-stubs-5.2.9/django-stubs/conf/global_settings.pyi 0000664 0000000 0000000 00000043673 15134010516 0023370 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from re import Pattern
# This is defined here as a do-nothing function because we can't import
# django.utils.translation -- that module depends on the settings.
from typing import Any, Literal, Protocol, TypeAlias, TypedDict, type_check_only
from django.utils.functional import _StrOrPromise
from typing_extensions import NotRequired
from django_stubs_ext.settings import TemplatesSetting
_Admins: TypeAlias = 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]
# 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")`
# Host for sending email.
EMAIL_HOST: str
# 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
# 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
# RemovedInDjango60Warning: It's a transitional setting helpful in early
# adoption of "https" as the new default value of forms.URLField.assume_scheme.
# Set to True to assume "https" during the Django 5.x release cycle.
FORMS_URLFIELD_ASSUME_HTTPS: 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/dev/ref/templates/builtins/#date
DATE_FORMAT: str
# Default formatting for datetime objects. See all available format strings here:
# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
DATETIME_FORMAT: str
# Default formatting for time objects. See all available format strings here:
# https://docs.djangoproject.com/en/dev/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/dev/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/dev/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/dev/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/dev/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 #
###########
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
django-stubs-5.2.9/django-stubs/conf/locale/ 0000775 0000000 0000000 00000000000 15134010516 0020707 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/conf/locale/__init__.pyi 0000664 0000000 0000000 00000000062 15134010516 0023167 0 ustar 00root root 0000000 0000000 from typing import Any
LANG_INFO: dict[str, Any]
django-stubs-5.2.9/django-stubs/conf/urls/ 0000775 0000000 0000000 00000000000 15134010516 0020435 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/conf/urls/__init__.pyi 0000664 0000000 0000000 00000000457 15134010516 0022725 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
django-stubs-5.2.9/django-stubs/conf/urls/i18n.pyi 0000664 0000000 0000000 00000000347 15134010516 0021743 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]
django-stubs-5.2.9/django-stubs/conf/urls/static.pyi 0000664 0000000 0000000 00000000301 15134010516 0022441 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any
from django.urls.resolvers import URLPattern
def static(prefix: str, view: Callable = ..., **kwargs: Any) -> list[URLPattern]: ...
django-stubs-5.2.9/django-stubs/contrib/ 0000775 0000000 0000000 00000000000 15134010516 0020163 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0022433 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/admin/ 0000775 0000000 0000000 00000000000 15134010516 0021253 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/admin/__init__.pyi 0000664 0000000 0000000 00000003244 15134010516 0023540 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 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",
"AdminSite",
"AllValuesFieldListFilter",
"BooleanFieldListFilter",
"ChoicesFieldListFilter",
"DateFieldListFilter",
"EmptyFieldListFilter",
"FieldListFilter",
"ListFilter",
"ModelAdmin",
"RelatedFieldListFilter",
"RelatedOnlyFieldListFilter",
"ShowFacets",
"SimpleListFilter",
"StackedInline",
"TabularInline",
"action",
"autodiscover",
"display",
"register",
"site",
]
django-stubs-5.2.9/django-stubs/contrib/admin/actions.pyi 0000664 0000000 0000000 00000000471 15134010516 0023440 0 ustar 00root root 0000000 0000000 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, request: HttpRequest, queryset: QuerySet) -> TemplateResponse | None: ...
django-stubs-5.2.9/django-stubs/contrib/admin/apps.pyi 0000664 0000000 0000000 00000000210 15134010516 0022732 0 ustar 00root root 0000000 0000000 from django.apps import AppConfig
class SimpleAdminConfig(AppConfig):
default_site: str
class AdminConfig(SimpleAdminConfig): ...
django-stubs-5.2.9/django-stubs/contrib/admin/checks.pyi 0000664 0000000 0000000 00000002066 15134010516 0023242 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
def check_admin_app(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[CheckMessage]: ...
def check_dependencies(**kwargs: Any) -> list[CheckMessage]: ...
class BaseModelAdminChecks:
def check(self, admin_obj: BaseModelAdmin, **kwargs: Any) -> list[CheckMessage]: ...
class ModelAdminChecks(BaseModelAdminChecks):
def check(self, admin_obj: BaseModelAdmin, **kwargs: Any) -> list[CheckMessage]: ...
class InlineModelAdminChecks(BaseModelAdminChecks):
def check(self, inline_obj: BaseModelAdmin, **kwargs: Any) -> list[CheckMessage]: ... # type: ignore[override]
def must_be(type: Any, option: Any, obj: Any, id: Any) -> list[CheckMessage]: ...
def must_inherit_from(parent: Any, option: Any, obj: Any, id: Any) -> list[CheckMessage]: ...
def refer_to_missing_field(field: Any, option: Any, obj: Any, id: Any) -> list[CheckMessage]: ...
django-stubs-5.2.9/django-stubs/contrib/admin/decorators.pyi 0000664 0000000 0000000 00000002564 15134010516 0024152 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Sequence
from typing import Any, TypeVar, overload
from django.contrib.admin import 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
_ModelAdmin = TypeVar("_ModelAdmin", bound=ModelAdmin[Any])
_F = TypeVar("_F", bound=Callable[..., Any])
@overload
def action(
function: _F,
*,
permissions: Sequence[str] | None = ...,
description: _StrOrPromise | None = ...,
) -> _F: ...
@overload
def action(
function: None = None,
*,
permissions: Sequence[str] | None = ...,
description: _StrOrPromise | None = ...,
) -> Callable[[_F], _F]: ...
@overload
def display(
function: _F,
*,
boolean: bool | 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: str | None = ...,
) -> Callable[[_F], _F]: ...
def register(
*models: type[Model], site: AdminSite | None = ...
) -> Callable[[type[_ModelAdmin]], type[_ModelAdmin]]: ...
django-stubs-5.2.9/django-stubs/contrib/admin/exceptions.pyi 0000664 0000000 0000000 00000000373 15134010516 0024162 0 ustar 00root root 0000000 0000000 from django.core.exceptions import SuspiciousOperation
class DisallowedModelAdminLookup(SuspiciousOperation): ...
class DisallowedModelAdminToField(SuspiciousOperation): ...
class AlreadyRegistered(Exception): ...
class NotRegistered(Exception): ...
django-stubs-5.2.9/django-stubs/contrib/admin/filters.pyi 0000664 0000000 0000000 00000010331 15134010516 0023444 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterable, Iterator
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
class _ListFilterChoices(TypedDict):
selected: bool
query_string: str
display: _StrOrPromise
class ListFilter:
title: _StrOrPromise | None
template: str
request: HttpRequest
used_parameters: dict[str, bool | datetime | str]
def __init__(
self, request: HttpRequest, params: dict[str, str], model: type[Model], model_admin: ModelAdmin
) -> None: ...
def has_output(self) -> bool: ...
def choices(self, changelist: ChangeList) -> Iterator[_ListFilterChoices]: ...
def queryset(self, request: HttpRequest, queryset: QuerySet) -> QuerySet | 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):
parameter_name: str | None
lookup_choices: list[tuple[str, _StrOrPromise]]
def value(self) -> str | None: ...
def lookups(self, request: HttpRequest, model_admin: ModelAdmin) -> Iterable[tuple[str, _StrOrPromise]] | None: ...
class FieldListFilter(FacetsMixin, ListFilter):
list_separator: ClassVar[str]
field: Field
field_path: str
title: _StrOrPromise
def __init__(
self,
field: Field,
request: HttpRequest,
params: dict[str, str],
model: type[Model],
model_admin: ModelAdmin,
field_path: str,
) -> None: ...
@classmethod
def register(
cls, test: Callable[[Field], Any], list_filter_class: type[FieldListFilter], take_priority: bool = ...
) -> None: ...
@classmethod
def create(
cls,
field: Field,
request: HttpRequest,
params: dict[str, str],
model: type[Model],
model_admin: ModelAdmin,
field_path: str,
) -> FieldListFilter: ...
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, request: HttpRequest, model_admin: ModelAdmin
) -> _ListOrTuple[str]: ...
def field_choices(
self, field: RelatedField, request: HttpRequest, model_admin: ModelAdmin
) -> 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
class RelatedOnlyFieldListFilter(RelatedFieldListFilter): ...
class EmptyFieldListFilter(FieldListFilter):
lookup_kwarg: str
lookup_val: str | None
def get_lookup_condition(self) -> Q: ...
django-stubs-5.2.9/django-stubs/contrib/admin/forms.pyi 0000664 0000000 0000000 00000000355 15134010516 0023127 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
django-stubs-5.2.9/django-stubs/contrib/admin/helpers.pyi 0000664 0000000 0000000 00000013164 15134010516 0023445 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 ModelAdmin
from django.db.models import Model
from django.db.models.fields import AutoField
from django.forms import BaseForm
from django.forms.boundfield import BoundField
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
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: ModelAdmin | None
readonly_fields: Sequence[str]
form: ModelForm
fieldsets: list[tuple[Any, dict[str, list[str]]]]
def __init__(
self,
form: ModelForm,
fieldsets: list[tuple[Any, dict[str, list[str]]]],
prepopulated_fields: Mapping[str, Iterable[str]],
readonly_fields: Sequence[str] | None = ...,
model_admin: ModelAdmin | None = ...,
) -> None: ...
def __iter__(self) -> Iterator[Fieldset]: ...
@property
def errors(self) -> ErrorDict: ...
@property
def non_field_errors(self) -> Callable[[], ErrorList]: ...
@property
def media(self) -> Media: ...
class Fieldset:
form: ModelForm
classes: str
description: str | None
model_admin: ModelAdmin | None
readonly_fields: Sequence[str]
def __init__(
self,
form: ModelForm,
name: Any | None = ...,
readonly_fields: Sequence[str] = ...,
fields: Sequence[str] = ...,
classes: Iterable[str] = ...,
description: str | None = ...,
model_admin: ModelAdmin | None = ...,
) -> None: ...
@cached_property
def is_collapsible(self) -> bool: ...
@property
def media(self) -> Media: ...
def __iter__(self) -> Iterator[Fieldline]: ...
class Fieldline:
form: ModelForm
fields: Sequence[str]
has_visible_field: bool
model_admin: ModelAdmin | None
readonly_fields: Sequence[str]
def __init__(
self,
form: ModelForm,
field: str | Sequence[str],
readonly_fields: Sequence[str] | None = ...,
model_admin: ModelAdmin | 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, 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
class AdminReadonlyField:
field: _FieldDictT
form: ModelForm
model_admin: ModelAdmin | None
is_first: bool
is_checkbox: bool
is_readonly: bool
empty_value_display: Any
def __init__(
self,
form: ModelForm,
field: Callable[[Model], Any] | str,
is_first: bool,
model_admin: ModelAdmin | None = ...,
) -> None: ...
def label_tag(self) -> SafeString: ...
def contents(self) -> SafeString: ...
class InlineAdminFormSet:
opts: Any
formset: Any
fieldsets: Any
model_admin: ModelAdmin | 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 | 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 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,
fieldsets: Any,
prepopulated_fields: Any,
original: bool | None,
readonly_fields: Sequence[str] | None = ...,
model_admin: ModelAdmin | None = ...,
view_on_site_url: str | None = ...,
) -> None: ...
def __iter__(self) -> Iterator[InlineFieldset]: ...
def needs_explicit_pk_field(self) -> bool | AutoField: ...
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: ...
def __iter__(self) -> Iterator[Fieldline]: ...
class AdminErrorList(forms.utils.ErrorList):
def __init__(self, form: ModelForm, inline_formsets: Any) -> None: ...
django-stubs-5.2.9/django-stubs/contrib/admin/migrations/ 0000775 0000000 0000000 00000000000 15134010516 0023427 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/admin/migrations/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0025677 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/admin/models.pyi 0000664 0000000 0000000 00000003427 15134010516 0023267 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable
from typing import Any, ClassVar, Literal, overload
from uuid import UUID
from django.db import models
from django.db.models.base import Model
from typing_extensions import deprecated
ADDITION: int
CHANGE: int
DELETION: int
ACTION_FLAG_CHOICES: Any
class LogEntryManager(models.Manager[LogEntry]):
@deprecated("log_action() is deprecated and will be removed in Django 6.0. Use log_actions() instead.")
def log_action(
self,
user_id: int | str | UUID,
content_type_id: int,
object_id: int | str | UUID,
object_repr: str,
action_flag: int,
change_message: Any = ...,
) -> 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
user: models.ForeignKey
content_type: models.ForeignKey
object_id: models.TextField
object_repr: models.CharField
action_flag: models.PositiveSmallIntegerField
change_message: models.TextField
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: ...
django-stubs-5.2.9/django-stubs/contrib/admin/options.pyi 0000664 0000000 0000000 00000042406 15134010516 0023477 0 ustar 00root root 0000000 0000000 import enum
from collections.abc import Callable, Iterable, Iterator, Mapping, Sequence
from typing import Any, ClassVar, Generic, Literal, TypeAlias, TypeVar, cast, overload, 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
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 Self, TypedDict, deprecated
IS_POPUP_VAR: str
TO_FIELD_VAR: str
IS_FACETS_VAR: str
HORIZONTAL: Literal[1]
VERTICAL: Literal[2]
_Direction: TypeAlias = Literal[1, 2]
class ShowFacets(enum.Enum):
NEVER = cast(str, ...)
ALLOW = cast(str, ...)
ALWAYS = cast(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], Mapping[str, Any]]]
readonly_fields: ClassVar[_ListOrTuple[str]]
ordering: ClassVar[_ListOrTuple[str] | None]
sortable_by: ClassVar[_ListOrTuple[str] | None]
show_full_result_count: ClassVar[bool]
checks_class: ClassVar[Any]
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, request: HttpRequest, **kwargs: Any) -> FormField | None: ...
def formfield_for_choice_field(
self, db_field: Field, request: HttpRequest, **kwargs: Any
) -> TypedChoiceField | None: ...
def get_field_queryset(self, db: str | None, db_field: RelatedField, request: HttpRequest) -> QuerySet | None: ...
def formfield_for_foreignkey(
self, db_field: ForeignKey, request: HttpRequest, **kwargs: Any
) -> ModelChoiceField | None: ...
def formfield_for_manytomany(
self, db_field: ManyToManyField, request: HttpRequest, **kwargs: Any
) -> ModelMultipleChoiceField | 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]]: ...
def get_ordering(self, request: HttpRequest) -> _ListOrTuple[str]: ...
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]: ...
@overload
@deprecated("None value for the request parameter will be removed in Django 6.0.")
def lookup_allowed(self, lookup: str, value: str, request: None = None) -> bool: ...
@overload
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: ...
@property
def view_on_site(self) -> Callable[[_ModelT], str | None] | bool: ...
_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]]]
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]: ...
def get_urls(self) -> list[URLPattern]: ...
@property
def urls(self) -> list[URLPattern]: ...
@property
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,
per_page: int,
orphans: int = ...,
allow_empty_first_page: bool = ...,
) -> Paginator: ...
def log_addition(self, request: HttpRequest, obj: _ModelT, message: Any) -> LogEntry: ...
def log_change(self, request: HttpRequest, obj: _ModelT, message: Any) -> LogEntry: ...
@deprecated("log_deletion() is deprecated and will be removed in Django 6.0. Use log_deletions() instead.")
def log_deletion(self, request: HttpRequest, obj: _ModelT, object_repr: str) -> LogEntry: ...
def log_deletions(self, request: HttpRequest, queryset: QuerySet[_ModelT]) -> list[LogEntry] | LogEntry: ...
def action_checkbox(self, obj: _ModelT) -> SafeString: ...
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 | 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, 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], 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) -> 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) -> 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[_ChildModelT], Generic[_ChildModelT, _ParentModelT]):
model: type[_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
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]]]: ...
def get_queryset(self, request: HttpRequest) -> QuerySet[_ChildModelT]: ...
def has_add_permission(self, request: HttpRequest, obj: _ParentModelT | None) -> bool: ... # type: ignore[override]
def has_change_permission(self, request: HttpRequest, obj: _ParentModelT | None = ...) -> bool: ... # type: ignore[override]
def has_delete_permission(self, request: HttpRequest, obj: _ParentModelT | None = ...) -> bool: ... # type: ignore[override]
def has_view_permission(self, request: HttpRequest, obj: _ParentModelT | None = ...) -> bool: ... # type: ignore[override]
class StackedInline(InlineModelAdmin[_ChildModelT, _ParentModelT]):
template: str
class TabularInline(InlineModelAdmin[_ChildModelT, _ParentModelT]):
template: str
django-stubs-5.2.9/django-stubs/contrib/admin/sites.pyi 0000664 0000000 0000000 00000010164 15134010516 0023127 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterable, Sequence
from typing import Any, TypeAlias, TypeVar
from weakref import WeakSet
from django.apps.config import AppConfig
from django.contrib.admin.models import LogEntry
from django.contrib.admin.options import ModelAdmin
from django.contrib.auth.forms import AuthenticationForm
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
all_sites: WeakSet[AdminSite]
_ViewType = TypeVar("_ViewType", bound=Callable[..., HttpResponseBase])
_ModelT = TypeVar("_ModelT", bound=Model)
_ActionCallback: TypeAlias = Callable[[ModelAdmin, HttpRequest, QuerySet], TemplateResponse | None]
class AdminSite:
site_title: _StrOrPromise
site_header: _StrOrPromise
index_title: _StrOrPromise
site_url: str | None
login_form: type[AuthenticationForm] | 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]
_global_actions: dict[str, _ActionCallback]
_actions: dict[str, _ActionCallback]
def __init__(self, name: str = ...) -> None: ...
def check(self, app_configs: Sequence[AppConfig] | None) -> list[CheckMessage]: ...
def register(
self,
model_or_iterable: type[Model] | Iterable[type[Model]],
admin_class: type[ModelAdmin] | 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: _ActionCallback, name: str | None = ...) -> None: ...
def disable_action(self, name: str) -> None: ...
def get_action(self, name: str) -> _ActionCallback: ...
@property
def actions(self) -> Iterable[tuple[str, _ActionCallback]]: ...
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): ...
site: AdminSite
django-stubs-5.2.9/django-stubs/contrib/admin/templatetags/ 0000775 0000000 0000000 00000000000 15134010516 0023745 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/admin/templatetags/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0026215 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/admin/templatetags/admin_list.pyi 0000664 0000000 0000000 00000003664 15134010516 0026624 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 | None) -> Iterator[SafeString]: ...
class ResultList(list):
form: ModelForm | None
def __init__(self, form: ModelForm | 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: ...
django-stubs-5.2.9/django-stubs/contrib/admin/templatetags/admin_modify.pyi 0000664 0000000 0000000 00000001262 15134010516 0027130 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: ...
django-stubs-5.2.9/django-stubs/contrib/admin/templatetags/admin_urls.pyi 0000664 0000000 0000000 00000000767 15134010516 0026637 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, arg: SafeString) -> str: ...
def admin_urlquote(value: int | str | UUID) -> int | str | UUID: ...
def add_preserved_filters(
context: dict[str, Options | str] | RequestContext,
url: str,
popup: bool = ...,
to_field: str | None = ...,
) -> str: ...
django-stubs-5.2.9/django-stubs/contrib/admin/templatetags/base.pyi 0000664 0000000 0000000 00000001135 15134010516 0025402 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
class InclusionAdminNode(InclusionNode):
args: list[Any]
func: Callable
kwargs: dict[str, Any]
takes_context: bool
template_name: str
def __init__(
self, parser: Parser, token: Token, func: Callable, template_name: str, takes_context: bool = ...
) -> None: ...
def render(self, context: Context) -> SafeString: ...
django-stubs-5.2.9/django-stubs/contrib/admin/templatetags/log.pyi 0000664 0000000 0000000 00000000671 15134010516 0025255 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
register: Any
class AdminLogNode(template.Node):
limit: str
user: str
varname: str
def __init__(self, limit: str, varname: str, user: str | None) -> None: ...
def render(self, context: Context) -> str: ...
def get_admin_log(parser: Parser, token: Token) -> AdminLogNode: ...
django-stubs-5.2.9/django-stubs/contrib/admin/tests.pyi 0000664 0000000 0000000 00000003165 15134010516 0023145 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.deprecation import MiddlewareMixin
from django.utils.functional import _StrOrPromise
class CSPMiddleware(MiddlewareMixin): ...
class AdminSeleniumTestCase(SeleniumTestCase, StaticLiveServerTestCase):
def wait_until(self, callback: Callable, timeout: int = ...) -> None: ...
def wait_for_and_switch_to_popup(self, num_windows: int = ..., timeout: int = ...) -> None: ...
def wait_for(self, css_selector: str, timeout: int = ...) -> None: ...
def wait_for_text(self, css_selector: str, text: str, timeout: int = ...) -> None: ...
def wait_for_value(self, css_selector: str, text: str, timeout: int = ...) -> None: ...
def wait_until_visible(self, css_selector: str, timeout: int = ...) -> None: ...
def wait_until_invisible(self, css_selector: str, timeout: int = ...) -> None: ...
def wait_page_ready(self, timeout: int = ...) -> None: ...
def wait_page_loaded(self, timeout: int = ...) -> AbstractContextManager[None]: ...
def admin_login(self, username: str, password: str, login_url: _StrOrPromise = ...) -> None: ...
def select_option(self, selector: str, value: Any) -> None: ...
def deselect_option(self, selector: str, value: Any) -> None: ...
def assertSelectOptions(self, selector: str, values: Any) -> None: ...
def assertSelectedOptions(self, selector: str, values: Any) -> None: ...
def is_disabled(self, selector: str) -> bool: ...
django-stubs-5.2.9/django-stubs/contrib/admin/utils.pyi 0000664 0000000 0000000 00000010726 15134010516 0023144 0 ustar 00root root 0000000 0000000 import datetime
from collections import defaultdict
from collections.abc import Callable, Iterable, Sequence
from typing import Any, Literal, TypeVar, overload, type_check_only
from uuid import UUID
from _typeshed import Unused
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
_T = TypeVar("_T")
class FieldIsAForeignKeyColumnName(Exception): ...
def lookup_spawns_duplicates(opts: Options, lookup_path: str) -> bool: ...
def get_last_value_from_parameters(parameters: dict[str, list[str] | str], key: str) -> str | None: ...
def prepare_lookup_value(
key: str, value: list[bool | datetime.datetime | str] | datetime.datetime | str, separator: str
) -> list[bool | datetime.datetime | str] | bool | datetime.datetime | str: ...
def build_q_object_from_lookup_parameters(parameters: dict[str, list[str]]) -> 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]]
def add_edge(self, source: Model | None, target: Model) -> None: ...
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: ...
def related_objects(
self, related_model: type[Model], related_fields: Iterable[Field], objs: _IndexableCollection[Model]
) -> QuerySet[Model]: ...
@overload
def nested(self, format_callback: None = None) -> list[Model]: ...
@overload
def nested(self, format_callback: Callable[[Model], _T]) -> list[_T]: ...
def can_fast_delete(self, *args: Unused, **kwargs: Unused) -> Literal[False]: ...
@type_check_only
class _ModelFormatDict(TypedDict):
verbose_name: str
verbose_name_plural: str
def model_format_dict(obj: Model | type[Model] | QuerySet | Options[Model]) -> _ModelFormatDict: ...
def model_ngettext(obj: Options | QuerySet, n: int | None = ...) -> str: ...
def lookup_field(
name: Callable | str, obj: Model, model_admin: BaseModelAdmin | None = ...
) -> tuple[Field | None, str | None, Any]: ...
@overload
def label_for_field(
name: Callable | str,
model: type[Model],
model_admin: BaseModelAdmin | None = ...,
return_attr: Literal[True] = True,
form: BaseForm | None = ...,
) -> tuple[str, Callable | str | None]: ...
@overload
def label_for_field(
name: Callable | str,
model: type[Model],
model_admin: BaseModelAdmin | 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, 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 | 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]: ...
def construct_change_message(
form: Form, formsets: Iterable[BaseFormSet], add: bool
) -> list[dict[str, dict[str, list[str]]]]: ...
django-stubs-5.2.9/django-stubs/contrib/admin/views/ 0000775 0000000 0000000 00000000000 15134010516 0022410 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/admin/views/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0024660 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/admin/views/autocomplete.pyi 0000664 0000000 0000000 00000000566 15134010516 0025643 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.admin.options import ModelAdmin
from django.db.models import Model
from django.http.request import HttpRequest
from django.views.generic.list import BaseListView
class AutocompleteJsonView(BaseListView):
model_admin: ModelAdmin
term: Any
def has_perm(self, request: HttpRequest, obj: Model | None = ...) -> bool: ...
django-stubs-5.2.9/django-stubs/contrib/admin/views/decorators.pyi 0000664 0000000 0000000 00000000715 15134010516 0025303 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import TypeVar, overload
from django.utils.functional import _StrOrPromise
_C = TypeVar("_C", bound=Callable)
@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: ...
django-stubs-5.2.9/django-stubs/contrib/admin/views/main.pyi 0000664 0000000 0000000 00000006570 15134010516 0024067 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.expressions import Expression
from django.db.models.options import Options
from django.db.models.query import QuerySet
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
lookup_opts: Options
root_queryset: QuerySet
list_display: _ListDisplayT
list_display_links: _ListDisplayT
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
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 | None
def __init__(
self,
request: HttpRequest,
model: type[Model],
list_display: _ListDisplayT,
list_display_links: _ListDisplayT,
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,
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 | str) -> Expression | str | None: ...
def get_ordering(self, request: HttpRequest, queryset: QuerySet) -> list[Expression | str]: ...
def get_ordering_field_columns(self) -> dict[int, Literal["desc", "asc"]]: ...
def get_queryset(self, request: HttpRequest, exclude_parameters: list[str | None] | None = ...) -> QuerySet: ...
filter_specs: list[ListFilter]
has_filters: bool
has_active_filters: bool
clear_all_filters_qs: str
def apply_select_related(self, qs: QuerySet) -> QuerySet: ...
def has_related_field_in_list_display(self) -> bool: ...
def url_for_result(self, result: Model) -> str: ...
django-stubs-5.2.9/django-stubs/contrib/admin/widgets.pyi 0000664 0000000 0000000 00000013506 15134010516 0023451 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, _OptAttrs
from django.utils.choices import _Choices
from django.utils.functional import _StrOrPromise
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 BaseAdminDateWidget(forms.DateInput):
def __init__(self, attrs: _OptAttrs | None = ..., format: str | None = ...) -> None: ...
class AdminDateWidget(BaseAdminDateWidget):
template_name: str
class BaseAdminTimeWidget(forms.TimeInput):
def __init__(self, attrs: _OptAttrs | None = ..., format: str | None = ...) -> None: ...
class AdminTimeWidget(BaseAdminTimeWidget):
template_name: str
class AdminSplitDateTime(forms.SplitDateTimeWidget):
template_name: str
def __init__(self, attrs: _OptAttrs | None = ...) -> None: ...
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]: ...
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: ...
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]: ...
def format_value(self, value: Any) -> str | None: ...
def value_from_datadict(self, data: Mapping[str, Any], files: Mapping[str, Iterable[File]], 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
def is_hidden(self) -> bool: ...
@property
def choices(self) -> ModelChoiceIterator: ...
@choices.setter
def choices(self, value: ModelChoiceIterator) -> None: ...
def get_related_url(self, info: tuple[str, str], action: str, *args: Any) -> str: ...
def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ...
def value_from_datadict(self, data: Mapping[str, Any], files: Mapping[str, Iterable[File]], name: str) -> Any: ...
def value_omitted_from_data(
self, data: Mapping[str, Any], files: Mapping[str, Iterable[File]], name: str
) -> bool: ...
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: ...
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: ...
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): ...
django-stubs-5.2.9/django-stubs/contrib/admindocs/ 0000775 0000000 0000000 00000000000 15134010516 0022124 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/admindocs/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0024374 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/admindocs/apps.pyi 0000664 0000000 0000000 00000000201 15134010516 0023603 0 ustar 00root root 0000000 0000000 from typing import Any
from django.apps import AppConfig
class AdminDocsConfig(AppConfig):
name: str
verbose_name: Any
django-stubs-5.2.9/django-stubs/contrib/admindocs/middleware.pyi 0000664 0000000 0000000 00000000750 15134010516 0024766 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: ...
django-stubs-5.2.9/django-stubs/contrib/admindocs/urls.pyi 0000664 0000000 0000000 00000000074 15134010516 0023635 0 ustar 00root root 0000000 0000000 from django.urls import _AnyURL
urlpatterns: list[_AnyURL]
django-stubs-5.2.9/django-stubs/contrib/admindocs/utils.pyi 0000664 0000000 0000000 00000001761 15134010516 0024014 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) -> 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: Any
unnamed_group_matcher: Any
def replace_named_groups(pattern: str) -> str: ...
def replace_unnamed_groups(pattern: str) -> str: ...
def strip_p_tags(value: str) -> SafeString: ...
django-stubs-5.2.9/django-stubs/contrib/admindocs/views.pyi 0000664 0000000 0000000 00000002327 15134010516 0024010 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.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) -> 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 | str) -> str: ...
def extract_views_from_urlpatterns(
urlpatterns: Iterable[_AnyURL], base: str = ..., namespace: str | None = ...
) -> list[tuple[Callable, Pattern[str], str | None, str | None]]: ...
def simplify_regex(pattern: str) -> str: ...
django-stubs-5.2.9/django-stubs/contrib/auth/ 0000775 0000000 0000000 00000000000 15134010516 0021124 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/auth/__init__.pyi 0000664 0000000 0000000 00000003013 15134010516 0023403 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) -> str: ...
def update_session_auth_hash(request: HttpRequest, user: _User) -> None: ...
async def aupdate_session_auth_hash(request: HttpRequest, user: _User) -> None: ...
django-stubs-5.2.9/django-stubs/contrib/auth/admin.pyi 0000664 0000000 0000000 00000001213 15134010516 0022734 0 ustar 00root root 0000000 0000000 from typing import Any, TypeVar
from django.contrib import admin
from django.contrib.auth.models import AbstractUser, Group
from django.http.request import HttpRequest
from django.http.response import HttpResponse
_AbstractUserT = TypeVar("_AbstractUserT", bound=AbstractUser)
csrf_protect_m: Any
sensitive_post_parameters_m: Any
class GroupAdmin(admin.ModelAdmin[Group]): ...
class UserAdmin(admin.ModelAdmin[_AbstractUserT]):
change_user_password_template: Any
add_fieldsets: Any
add_form: Any
change_password_form: Any
def user_change_password(self, request: HttpRequest, id: str, form_url: str = ...) -> HttpResponse: ...
django-stubs-5.2.9/django-stubs/contrib/auth/apps.pyi 0000664 0000000 0000000 00000000104 15134010516 0022605 0 ustar 00root root 0000000 0000000 from django.apps import AppConfig
class AuthConfig(AppConfig): ...
django-stubs-5.2.9/django-stubs/contrib/auth/backends.pyi 0000664 0000000 0000000 00000005525 15134010516 0023430 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
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):
def authenticate(
self, request: HttpRequest | None, username: str | None = ..., password: str | None = ..., **kwargs: Any
) -> _User | None: ...
async def aauthenticate(
self, request: HttpRequest | None, username: str | None = ..., password: str | None = ..., **kwargs: Any
) -> _User | None: ...
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 user_can_authenticate(self, user: _AnyUser | None) -> 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
def authenticate(self, request: HttpRequest | None, remote_user: str) -> _User | None: ... # type: ignore[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, user: _UserType, created: bool = ...) -> _UserType: ...
async def aconfigure_user(self, request: HttpRequest, user: _UserType, created: bool = ...) -> _UserType: ...
class AllowAllUsersRemoteUserBackend(RemoteUserBackend): ...
django-stubs-5.2.9/django-stubs/contrib/auth/base_user.pyi 0000664 0000000 0000000 00000003215 15134010516 0023620 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable
from typing import Any, ClassVar, Literal, TypeVar, 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
_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]]
password = models.CharField(max_length=128)
last_login = models.DateTimeField(blank=True, null=True)
is_active: bool | BooleanField[bool | Combinable, bool]
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) -> bool: ...
async def acheck_password(self, raw_password: str) -> 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: ...
django-stubs-5.2.9/django-stubs/contrib/auth/checks.pyi 0000664 0000000 0000000 00000000750 15134010516 0023111 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_user_model(app_configs: Sequence[AppConfig] | None = ..., **kwargs: Any) -> list[CheckMessage]: ...
def check_models_permissions(app_configs: Sequence[AppConfig] | None = ..., **kwargs: Any) -> list[CheckMessage]: ...
def check_middleware(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[CheckMessage]: ...
django-stubs-5.2.9/django-stubs/contrib/auth/context_processors.pyi 0000664 0000000 0000000 00000001226 15134010516 0025616 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]: ...
django-stubs-5.2.9/django-stubs/contrib/auth/decorators.pyi 0000664 0000000 0000000 00000002122 15134010516 0024011 0 ustar 00root root 0000000 0000000 from collections.abc import Awaitable, Callable, Iterable
from typing import TypeVar, overload
from django.contrib.auth.models import _AnyUser
from django.http.response import HttpResponseBase
from django.utils.functional import _StrOrPromise
_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]: ...
# There are two ways of calling @login_required: @with(arguments) and @bare
@overload
def login_required(
redirect_field_name: str | None = ..., login_url: _StrOrPromise | None = ...
) -> Callable[[_VIEW], _VIEW]: ...
@overload
def login_required(
function: _VIEW, redirect_field_name: str | None = ..., login_url: _StrOrPromise | None = ...
) -> _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]: ...
django-stubs-5.2.9/django-stubs/contrib/auth/forms.pyi 0000664 0000000 0000000 00000012142 15134010516 0022775 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable
from logging import Logger
from typing import Any, 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
logger: Logger
UserModel = _UserModel
class ReadOnlyPasswordHashWidget(forms.Widget):
template_name: str
read_only: bool
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):
def to_python(self, value: Any | None) -> Any | None: ...
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: ...
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
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
def save(self, commit: bool = ...) -> _UserType: ...
class UserCreationForm(BaseUserCreationForm[_UserType]):
def clean_username(self) -> str: ...
class UserChangeForm(forms.ModelForm[_UserType]):
password: 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
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: ...
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, 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):
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
def changed_data(self) -> list[str]: ...
class AdminUserCreationForm(SetUnusablePasswordMixin, UserCreationForm):
usable_password: forms.ChoiceField = ...
django-stubs-5.2.9/django-stubs/contrib/auth/handlers/ 0000775 0000000 0000000 00000000000 15134010516 0022724 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/auth/handlers/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0025174 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/auth/handlers/modwsgi.pyi 0000664 0000000 0000000 00000000306 15134010516 0025117 0 ustar 00root root 0000000 0000000 from typing import Any
UserModel: Any
def check_password(environ: dict[Any, Any], username: str, password: str) -> Any: ...
def groups_for_user(environ: dict[Any, Any], username: str) -> Any: ...
django-stubs-5.2.9/django-stubs/contrib/auth/hashers.pyi 0000664 0000000 0000000 00000004433 15134010516 0023310 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any
from django.utils.functional import _StrOrPromise
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 | None = ..., preferred: str = ...) -> bool: ...
async def acheck_password(
password: str | None, encoded: str, setter: Callable | 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(**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: ...
class BasePasswordHasher:
algorithm: str | None
library: str | tuple[str, str] | None
rounds: int
time_cost: int
memory_cost: int
parallelism: int
digest: Any
iterations: int
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):
def encode(self, password: str, salt: str, iterations: int | None = ...) -> str: ...
def decode(self, encoded: str) -> dict[str, str | int]: ...
class PBKDF2SHA1PasswordHasher(PBKDF2PasswordHasher): ...
class Argon2PasswordHasher(BasePasswordHasher): ...
class BCryptSHA256PasswordHasher(BasePasswordHasher):
def decode(self, encoded: str) -> dict[str, str | int]: ...
class BCryptPasswordHasher(BCryptSHA256PasswordHasher): ...
class MD5PasswordHasher(BasePasswordHasher):
def decode(self, encoded: str) -> dict[str, str]: ...
django-stubs-5.2.9/django-stubs/contrib/auth/management/ 0000775 0000000 0000000 00000000000 15134010516 0023240 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/auth/management/__init__.pyi 0000664 0000000 0000000 00000000626 15134010516 0025526 0 ustar 00root root 0000000 0000000 from typing import Any
from django.apps.config import AppConfig
from django.apps.registry import Apps
def create_permissions(
app_config: AppConfig,
verbosity: int = ...,
interactive: bool = ...,
using: str = ...,
apps: Apps = ...,
**kwargs: Any,
) -> None: ...
def get_system_username() -> str: ...
def get_default_username(check_db: bool = ..., database: str = ...) -> str: ...
django-stubs-5.2.9/django-stubs/contrib/auth/management/commands/ 0000775 0000000 0000000 00000000000 15134010516 0025041 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/auth/management/commands/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0027311 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/auth/management/commands/changepassword.pyi 0000664 0000000 0000000 00000000175 15134010516 0030577 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.management.base import BaseCommand
UserModel: Any
class Command(BaseCommand): ...
django-stubs-5.2.9/django-stubs/contrib/auth/management/commands/createsuperuser.pyi 0000664 0000000 0000000 00000001123 15134010516 0031002 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
stdin: Any
def get_input_data(self, field: Field, message: str, default: str | None = ...) -> str | None: ...
@cached_property
def username_is_unique(self) -> bool: ...
django-stubs-5.2.9/django-stubs/contrib/auth/middleware.pyi 0000664 0000000 0000000 00000004003 15134010516 0023761 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, _AsyncGetResponseCallable, _GetResponseCallable
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: _GetResponseCallable | _AsyncGetResponseCallable
is_async: bool
def __init__(self, get_response: _GetResponseCallable | _AsyncGetResponseCallable) -> 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: ...
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]
django-stubs-5.2.9/django-stubs/contrib/auth/migrations/ 0000775 0000000 0000000 00000000000 15134010516 0023300 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/auth/migrations/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0025550 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/auth/mixins.pyi 0000664 0000000 0000000 00000002335 15134010516 0023161 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: ...
def dispatch(self, request: http.HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase: ...
django-stubs-5.2.9/django-stubs/contrib/auth/models.pyi 0000664 0000000 0000000 00000014637 15134010516 0023145 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable
from typing import Any, ClassVar, Literal, TypeAlias, TypeVar
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.manager import EmptyManager
from django.utils.functional import _StrOrPromise
from typing_extensions import Self
# 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(max_length=255)
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
codename = models.CharField(max_length=100)
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(max_length=150)
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()
groups = models.ManyToManyField(Group)
user_permissions = models.ManyToManyField(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[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
username = models.CharField(max_length=150)
first_name = models.CharField(max_length=30, blank=True)
last_name = models.CharField(max_length=150, blank=True)
email = models.EmailField(blank=True)
is_staff = models.BooleanField()
is_active = models.BooleanField()
date_joined = models.DateTimeField()
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 = ..., **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 save(self) -> None: ...
def delete(self) -> None: ...
def set_password(self, raw_password: str) -> None: ...
def check_password(self, raw_password: str) -> Any: ...
@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: ...
django-stubs-5.2.9/django-stubs/contrib/auth/password_validation.pyi 0000664 0000000 0000000 00000004215 15134010516 0025725 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
@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: ...
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:
DEFAULT_PASSWORD_LIST_PATH: 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: ...
django-stubs-5.2.9/django-stubs/contrib/auth/signals.pyi 0000664 0000000 0000000 00000000170 15134010516 0023305 0 ustar 00root root 0000000 0000000 from django.dispatch.dispatcher import Signal
user_logged_in: Signal
user_login_failed: Signal
user_logged_out: Signal
django-stubs-5.2.9/django-stubs/contrib/auth/tokens.pyi 0000664 0000000 0000000 00000001245 15134010516 0023154 0 ustar 00root root 0000000 0000000 from datetime import date, datetime
from typing import Any
from django.contrib.auth.models import _User
class PasswordResetTokenGenerator:
key_salt: str
secret: str | bytes
secret_fallbacks: list[str | bytes]
algorithm: str
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: Any
django-stubs-5.2.9/django-stubs/contrib/auth/urls.pyi 0000664 0000000 0000000 00000000074 15134010516 0022635 0 ustar 00root root 0000000 0000000 from django.urls import _AnyURL
urlpatterns: list[_AnyURL]
django-stubs-5.2.9/django-stubs/contrib/auth/validators.pyi 0000664 0000000 0000000 00000000231 15134010516 0024013 0 ustar 00root root 0000000 0000000 from django.core.validators import RegexValidator
class ASCIIUsernameValidator(RegexValidator): ...
class UnicodeUsernameValidator(RegexValidator): ...
django-stubs-5.2.9/django-stubs/contrib/auth/views.pyi 0000664 0000000 0000000 00000004773 15134010516 0023017 0 ustar 00root root 0000000 0000000 from typing import Any, TypeVar
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth.models import _User, _UserModel
from django.http.request import HttpRequest
from django.http.response import HttpResponse, HttpResponseRedirect
from django.views.generic.base import TemplateView
from django.views.generic.edit import FormView
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) -> str: ...
def get_success_url_allowed_hosts(self) -> set[str]: ...
def get_default_redirect_url(self) -> str: ...
class LoginView(RedirectURLMixin, FormView[_AuthForm]):
authentication_form: Any
redirect_field_name: Any
redirect_authenticated_user: bool
extra_context: Any
def get_redirect_url(self) -> str: ...
class LogoutView(RedirectURLMixin, TemplateView):
next_page: str | None
redirect_field_name: str
extra_context: Any
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: Any
def get_context_data(self, **kwargs: Any) -> dict[str, Any]: ...
class PasswordResetView(PasswordContextMixin, FormView):
email_template_name: str
extra_email_context: Any
from_email: Any
html_email_template_name: Any
subject_template_name: str
title: Any
token_generator: Any
INTERNAL_RESET_SESSION_TOKEN: str
class PasswordResetDoneView(PasswordContextMixin, TemplateView):
title: Any
class PasswordResetConfirmView(PasswordContextMixin, FormView):
post_reset_login: bool
post_reset_login_backend: Any
reset_url_token: str
title: Any
token_generator: Any
validlink: bool
user: Any
def get_user(self, uidb64: str) -> _User | None: ...
class PasswordResetCompleteView(PasswordContextMixin, TemplateView):
title: Any
class PasswordChangeView(PasswordContextMixin, FormView):
title: Any
class PasswordChangeDoneView(PasswordContextMixin, TemplateView):
title: Any
django-stubs-5.2.9/django-stubs/contrib/contenttypes/ 0000775 0000000 0000000 00000000000 15134010516 0022722 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/contenttypes/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0025172 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/contenttypes/admin.pyi 0000664 0000000 0000000 00000001436 15134010516 0024541 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):
template: str
formset: type[BaseGenericInlineFormSet] # type: ignore[assignment]
class GenericStackedInline(GenericInlineModelAdmin): ...
class GenericTabularInline(GenericInlineModelAdmin): ...
django-stubs-5.2.9/django-stubs/contrib/contenttypes/apps.pyi 0000664 0000000 0000000 00000000114 15134010516 0024404 0 ustar 00root root 0000000 0000000 from django.apps import AppConfig
class ContentTypesConfig(AppConfig): ...
django-stubs-5.2.9/django-stubs/contrib/contenttypes/checks.pyi 0000664 0000000 0000000 00000000614 15134010516 0024706 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_generic_foreign_keys(app_configs: Sequence[AppConfig] | None = None, **kwargs: Any) -> list[CheckMessage]: ...
def check_model_name_lengths(app_configs: Sequence[AppConfig] | None = None, **kwargs: Any) -> list[CheckMessage]: ...
django-stubs-5.2.9/django-stubs/contrib/contenttypes/fields.pyi 0000664 0000000 0000000 00000010463 15134010516 0024717 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any
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
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 typing_extensions import deprecated
class GenericForeignKey(FieldCacheMixin):
# django-stubs implementation only fields
_pyi_private_set_type: Any | Combinable
_pyi_private_get_type: Any
# attributes
auto_created: bool
concrete: bool
editable: bool
hidden: bool
is_relation: bool
many_to_many: bool
many_to_one: bool
one_to_many: bool
one_to_one: bool
related_model: Any
remote_field: Any
ct_field: str
fk_field: str
for_concrete_model: bool
rel: None
column: None
def __init__(self, ct_field: str = ..., fk_field: str = ..., for_concrete_model: bool = ...) -> None: ...
name: Any
model: Any
def contribute_to_class(self, cls: type[Model], name: str, **kwargs: Any) -> None: ...
def get_attname_column(self) -> tuple[str, None]: ...
def get_filter_kwargs_for_object(self, obj: Model) -> dict[str, ContentType | None]: ...
def get_forward_related_filter(self, obj: Model) -> dict[str, int]: ...
def check(self, **kwargs: Any) -> list[CheckMessage]: ...
def get_content_type(
self, obj: Model | None = ..., id: int | None = ..., using: str | None = ..., model: type[Model] | None = ...
) -> ContentType: ...
@deprecated(
"get_prefetch_queryset() is deprecated and will be removed in Django 6.0. Use get_prefetch_querysets() instead."
)
def get_prefetch_queryset(
self, instances: list[Model] | QuerySet, queryset: QuerySet | None = ...
) -> tuple[list[Model], Callable, Callable, bool, str, bool]: ...
def get_prefetch_querysets(
self, instances: list[Model] | QuerySet, querysets: list[QuerySet] | None = ...
) -> tuple[list[Model], Callable, Callable, bool, str, bool]: ...
def __get__(self, instance: Model | None, cls: type[Model] | None = ...) -> 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 = ...,
related_query_name: str | None = ...,
limit_choices_to: dict[str, Any] | Callable[[], Any] | None = ...,
) -> None: ...
class GenericRelation(ForeignObject[Any, Any]):
rel_class: Any
mti_inherited: bool
object_id_field_name: str
content_type_field_name: str
for_concrete_model: bool
to_fields: Any
def __init__(
self,
to: type[Model] | str,
object_id_field: str = ...,
content_type_field: str = ...,
for_concrete_model: bool = ...,
related_query_name: str | None = ...,
limit_choices_to: dict[str, Any] | Callable[[], Any] | None = ...,
**kwargs: Any,
) -> None: ...
def resolve_related_fields(self) -> list[tuple[Field, Field]]: ...
def get_path_info(self, filtered_relation: FilteredRelation | None = ...) -> list[PathInfo]: ...
def get_reverse_path_info(self, filtered_relation: FilteredRelation | None = ...) -> list[PathInfo]: ...
def contribute_to_class(self, cls: type[Model], name: str, **kwargs: Any) -> None: ... # type: ignore[override]
def get_content_type(self) -> ContentType: ...
def get_extra_restriction(
self, where_class: type[WhereNode], alias: str | None, remote_alias: str
) -> WhereNode: ...
def bulk_related_objects(self, objs: list[Model], using: str = ...) -> QuerySet: ...
class ReverseGenericManyToOneDescriptor(ReverseManyToOneDescriptor): ...
def create_generic_related_manager(superclass: Any, rel: Any) -> type[Any]: ... # GenericRelatedObjectManager
django-stubs-5.2.9/django-stubs/contrib/contenttypes/forms.pyi 0000664 0000000 0000000 00000002615 15134010516 0024577 0 ustar 00root root 0000000 0000000 from typing import Any, TypeVar
from django.db.models import Model
from django.forms.models import BaseModelFormSet, ModelForm
_M = TypeVar("_M", bound=Model)
_ModelFormT = TypeVar("_ModelFormT", bound=ModelForm)
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: ...
def initial_form_count(self) -> int: ...
@classmethod
def get_default_prefix(cls) -> str: ...
def save_new(self, form: Any, commit: bool = ...) -> _M: ...
def generic_inlineformset_factory(
model: type[_M],
form: type[_ModelFormT] = ...,
formset: 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]]: ...
django-stubs-5.2.9/django-stubs/contrib/contenttypes/management/ 0000775 0000000 0000000 00000000000 15134010516 0025036 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/contenttypes/management/__init__.pyi 0000664 0000000 0000000 00000002445 15134010516 0027325 0 ustar 00root root 0000000 0000000 from typing import Any
from django.apps.config import AppConfig
from django.apps.registry import Apps
from django.contrib.contenttypes.models import ContentType
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
from django.db.models.base import Model
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: StateApps = ..., using: str = "default", **kwargs: Any
) -> None: ...
def get_contenttypes_and_models(
app_config: AppConfig, using: str, ContentType: type[ContentType]
) -> tuple[dict[str, ContentType], dict[str, type[Model]]]: ...
def create_contenttypes(
app_config: AppConfig,
verbosity: int = 2,
interactive: bool = True,
using: str = "default",
apps: Apps = ...,
**kwargs: Any,
) -> None: ...
django-stubs-5.2.9/django-stubs/contrib/contenttypes/management/commands/ 0000775 0000000 0000000 00000000000 15134010516 0026637 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/contenttypes/management/commands/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0031107 0 ustar 00root root 0000000 0000000 remove_stale_contenttypes.pyi 0000664 0000000 0000000 00000000553 15134010516 0034612 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/contenttypes/management/commands from typing import Any, Literal
from _typeshed import Unused
from django.core.management import BaseCommand
from django.db.models.deletion import Collector
class Command(BaseCommand):
def handle(self, **options: Any) -> None: ...
class NoFastDeleteCollector(Collector):
def can_fast_delete(self, *args: Unused, **kwargs: Unused) -> Literal[False]: ...
django-stubs-5.2.9/django-stubs/contrib/contenttypes/migrations/ 0000775 0000000 0000000 00000000000 15134010516 0025076 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/contenttypes/migrations/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0027346 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/contenttypes/models.pyi 0000664 0000000 0000000 00000002114 15134010516 0024726 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.query import QuerySet
class ContentTypeManager(models.Manager[ContentType]):
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 = ...) -> ContentType: ...
def get_for_models(self, *models: Any, for_concrete_models: bool = ...) -> 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(max_length=100)
model = models.CharField(max_length=100)
objects: ClassVar[ContentTypeManager]
@property
def 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: ...
def natural_key(self) -> tuple[str, str]: ...
django-stubs-5.2.9/django-stubs/contrib/contenttypes/prefetch.pyi 0000664 0000000 0000000 00000002142 15134010516 0025244 0 ustar 00root root 0000000 0000000 from typing import Any, Generic, TypeVar
from django.db.models import Model, Prefetch
from django.db.models.query import QuerySet
# 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=list[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, Generic[_LookupT, _PrefetchedQuerySetsT, _ToAttrT]):
def __init__(self, lookup: _LookupT, querysets: _PrefetchedQuerySetsT, to_attr: _ToAttrT | None = None) -> None: ...
def __getstate__(self) -> dict[str, Any]: ...
def get_current_querysets(self, level: int) -> _PrefetchedQuerySetsT | None: ...
django-stubs-5.2.9/django-stubs/contrib/contenttypes/views.pyi 0000664 0000000 0000000 00000000325 15134010516 0024602 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: ...
django-stubs-5.2.9/django-stubs/contrib/flatpages/ 0000775 0000000 0000000 00000000000 15134010516 0022131 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/flatpages/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0024401 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/flatpages/admin.pyi 0000664 0000000 0000000 00000000453 15134010516 0023746 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]
django-stubs-5.2.9/django-stubs/contrib/flatpages/apps.pyi 0000664 0000000 0000000 00000000201 15134010516 0023610 0 ustar 00root root 0000000 0000000 from typing import Any
from django.apps import AppConfig
class FlatPagesConfig(AppConfig):
name: str
verbose_name: Any
django-stubs-5.2.9/django-stubs/contrib/flatpages/forms.pyi 0000664 0000000 0000000 00000000210 15134010516 0023773 0 ustar 00root root 0000000 0000000 from typing import Any
from django import forms
class FlatpageForm(forms.ModelForm):
url: Any
def clean_url(self) -> str: ...
django-stubs-5.2.9/django-stubs/contrib/flatpages/middleware.pyi 0000664 0000000 0000000 00000000445 15134010516 0024774 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: ...
django-stubs-5.2.9/django-stubs/contrib/flatpages/migrations/ 0000775 0000000 0000000 00000000000 15134010516 0024305 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/flatpages/migrations/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0026555 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/flatpages/models.pyi 0000664 0000000 0000000 00000000622 15134010516 0024137 0 ustar 00root root 0000000 0000000 from django.contrib.sites.models import Site
from django.db import models
class FlatPage(models.Model):
url: models.CharField
title: models.CharField
content: models.TextField
enable_comments: models.BooleanField
template_name: models.CharField
registration_required: models.BooleanField
sites: models.ManyToManyField[Site, Site]
def get_absolute_url(self) -> str: ...
django-stubs-5.2.9/django-stubs/contrib/flatpages/sitemaps.pyi 0000664 0000000 0000000 00000000121 15134010516 0024473 0 ustar 00root root 0000000 0000000 from django.contrib.sitemaps import Sitemap
class FlatPageSitemap(Sitemap): ...
django-stubs-5.2.9/django-stubs/contrib/flatpages/templatetags/ 0000775 0000000 0000000 00000000000 15134010516 0024623 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/flatpages/templatetags/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0027073 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/flatpages/templatetags/flatpages.pyi 0000664 0000000 0000000 00000000744 15134010516 0027321 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
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: ...
def render(self, context: Context) -> str: ...
def get_flatpages(parser: Parser, token: Token) -> FlatpageNode: ...
django-stubs-5.2.9/django-stubs/contrib/flatpages/urls.pyi 0000664 0000000 0000000 00000000074 15134010516 0023642 0 ustar 00root root 0000000 0000000 from django.urls import _AnyURL
urlpatterns: list[_AnyURL]
django-stubs-5.2.9/django-stubs/contrib/flatpages/views.pyi 0000664 0000000 0000000 00000000465 15134010516 0024016 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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/ 0000775 0000000 0000000 00000000000 15134010516 0020745 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/gis/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0023215 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/gis/admin/ 0000775 0000000 0000000 00000000000 15134010516 0022035 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/gis/admin/__init__.pyi 0000664 0000000 0000000 00000001626 15134010516 0024324 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",
]
django-stubs-5.2.9/django-stubs/contrib/gis/admin/options.pyi 0000664 0000000 0000000 00000000347 15134010516 0024257 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.admin import ModelAdmin
from django.contrib.gis.forms import BaseGeometryWidget
class GISModelAdmin(ModelAdmin):
gis_widget: BaseGeometryWidget
gis_widget_kwargs: dict[str, Any]
django-stubs-5.2.9/django-stubs/contrib/gis/apps.pyi 0000664 0000000 0000000 00000000103 15134010516 0022425 0 ustar 00root root 0000000 0000000 from django.apps import AppConfig
class GISConfig(AppConfig): ...
django-stubs-5.2.9/django-stubs/contrib/gis/db/ 0000775 0000000 0000000 00000000000 15134010516 0021332 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/gis/db/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0023602 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/ 0000775 0000000 0000000 00000000000 15134010516 0023104 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0025354 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/base/ 0000775 0000000 0000000 00000000000 15134010516 0024016 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/base/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0026266 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/base/adapter.pyi 0000664 0000000 0000000 00000000310 15134010516 0026153 0 ustar 00root root 0000000 0000000 from typing import Any
class WKTAdapter:
wkt: Any
srid: Any
def __init__(self, geom: Any) -> None: ...
def __eq__(self, other: object) -> bool: ...
def __hash__(self) -> int: ...
django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/base/features.pyi 0000664 0000000 0000000 00000003136 15134010516 0026362 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_left_right_lookups: 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_bbcontains_lookup(self) -> bool: ...
@property
def supports_contained_lookup(self) -> bool: ...
@property
def supports_crosses_lookup(self) -> bool: ...
@property
def supports_distances_lookups(self) -> bool: ...
@property
def supports_dwithin_lookup(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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/base/models.pyi 0000664 0000000 0000000 00000001504 15134010516 0026024 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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/base/operations.pyi 0000664 0000000 0000000 00000002622 15134010516 0026726 0 ustar 00root root 0000000 0000000 from typing import Any
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: ...
geography: bool
geometry: bool
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(self, f: Any, value: Any, compiler: Any) -> Any: ...
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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/mysql/ 0000775 0000000 0000000 00000000000 15134010516 0024251 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/mysql/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0026521 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/mysql/base.pyi 0000664 0000000 0000000 00000000373 15134010516 0025711 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
django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/mysql/features.pyi 0000664 0000000 0000000 00000001234 15134010516 0026612 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
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
def supports_geometry_field_unique_index(self) -> bool: ... # type: ignore[override]
django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/mysql/introspection.pyi 0000664 0000000 0000000 00000000515 15134010516 0027675 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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/mysql/operations.pyi 0000664 0000000 0000000 00000002505 15134010516 0027161 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
class MySQLOperations(BaseSpatialOperations, DatabaseOperations):
name: str
geom_func_prefix: str
Adapter: Any
@cached_property
def mariadb(self) -> bool: ... # type: ignore[override]
@cached_property
def mysql(self) -> bool: ... # type: ignore[override]
@cached_property
def select(self) -> str: ... # type: ignore[override]
@cached_property
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
def unsupported_functions(self) -> set[str]: ... # type: ignore[override]
def geo_db_type(self, f: Any) -> Any: ...
def get_distance(self, f: Any, value: Any, lookup_type: Any) -> list[Any]: ...
def get_geometry_converter(self, expression: Any) -> Callable[[Any, Any, Any], GEOSGeometryBase | None]: ...
django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/mysql/schema.pyi 0000664 0000000 0000000 00000001470 15134010516 0026236 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
logger: Logger
class MySQLGISSchemaEditor(DatabaseSchemaEditor):
sql_add_spatial_index: str
sql_drop_spatial_index: str
geometry_sql: Any
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
def skip_default(self, field: Field) -> bool: ...
def column_sql(
self, model: type[Model], field: Field, include_default: bool = ...
) -> tuple[None, None] | tuple[str, list[Any]]: ...
def create_model(self, model: type[Model]) -> None: ...
def add_field(self, model: type[Model], field: Field) -> None: ...
def remove_field(self, model: type[Model], field: Field) -> None: ...
django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/oracle/ 0000775 0000000 0000000 00000000000 15134010516 0024351 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/oracle/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0026621 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/oracle/adapter.pyi 0000664 0000000 0000000 00000000342 15134010516 0026513 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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/oracle/base.pyi 0000664 0000000 0000000 00000000376 15134010516 0026014 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
django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/oracle/features.pyi 0000664 0000000 0000000 00000000674 15134010516 0026721 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
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
django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/oracle/introspection.pyi 0000664 0000000 0000000 00000000437 15134010516 0030000 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.oracle.introspection import DatabaseIntrospection
class OracleIntrospection(DatabaseIntrospection):
@property
def data_types_reverse(self) -> Any: ...
def get_geometry_type(self, table_name: Any, description: Any) -> Any: ...
django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/oracle/models.pyi 0000664 0000000 0000000 00000001327 15134010516 0026362 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar
from django.contrib.gis.db import models
from django.contrib.gis.db.backends.base.models import SpatialRefSysMixin
from django.db.models.manager import Manager
from typing_extensions import Self
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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/oracle/operations.pyi 0000664 0000000 0000000 00000002640 15134010516 0027261 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
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
function_names: Any
select: str
gis_operators: Any
unsupported_functions: 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(self, f: Any, value: Any, compiler: Any) -> Any: ...
def spatial_aggregate_name(self, agg_name: Any) -> Any: ...
def geometry_columns(self) -> Any: ...
def spatial_ref_sys(self) -> Any: ...
def modify_insert_params(self, placeholder: Any, params: Any) -> Any: ...
def get_geometry_converter(self, expression: Any) -> Any: ...
def get_area_att_for_field(self, field: Any) -> Any: ...
django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/oracle/schema.pyi 0000664 0000000 0000000 00000001756 15134010516 0026345 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
class OracleGISSchemaEditor(DatabaseSchemaEditor):
sql_add_geometry_metadata: str
sql_add_spatial_index: str
sql_drop_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: ...
def column_sql(
self, model: type[Model], field: Field, include_default: bool = ...
) -> tuple[None, None] | tuple[str, list[Any]]: ...
def create_model(self, model: type[Model]) -> None: ...
def delete_model(self, model: type[Model]) -> None: ...
def add_field(self, model: type[Model], field: Field) -> None: ...
def remove_field(self, model: type[Model], field: Field) -> None: ...
def run_geometry_sql(self) -> None: ...
django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/postgis/ 0000775 0000000 0000000 00000000000 15134010516 0024574 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/postgis/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0027044 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/postgis/adapter.pyi 0000664 0000000 0000000 00000000541 15134010516 0026737 0 ustar 00root root 0000000 0000000 from typing import Any
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: ...
def __eq__(self, other: object) -> bool: ...
def __hash__(self) -> int: ...
def getquoted(self) -> Any: ...
django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/postgis/base.pyi 0000664 0000000 0000000 00000000537 15134010516 0026236 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.postgresql.base import DatabaseWrapper as Psycopg2DatabaseWrapper
class DatabaseWrapper(Psycopg2DatabaseWrapper):
SchemaEditorClass: Any
features: Any
ops: Any
introspection: Any
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
def prepare_database(self) -> None: ...
django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/postgis/const.pyi 0000664 0000000 0000000 00000000275 15134010516 0026451 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
django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/postgis/features.pyi 0000664 0000000 0000000 00000000627 15134010516 0027142 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_left_right_lookups: bool
supports_raster: bool
supports_empty_geometries: bool
django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/postgis/introspection.pyi 0000664 0000000 0000000 00000000550 15134010516 0030217 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.postgresql.introspection import DatabaseIntrospection
class PostGISIntrospection(DatabaseIntrospection):
postgis_oid_lookup: Any
ignored_tables: Any
def get_field_type(self, data_type: Any, description: Any) -> Any: ...
def get_geometry_type(self, table_name: Any, description: Any) -> Any: ...
django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/postgis/models.pyi 0000664 0000000 0000000 00000001375 15134010516 0026610 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar
from django.contrib.gis.db.backends.base.models import SpatialRefSysMixin
from django.db import models
from typing_extensions import Self
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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/postgis/operations.pyi 0000664 0000000 0000000 00000005022 15134010516 0027501 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.utils.functional import cached_property
BILATERAL: Literal["bilateral"]
class PostGISOperator(SpatialOperator):
geography: Any
raster: bool | Literal["bilateral"]
def __init__(self, geography: bool = ..., raster: bool | Literal["bilateral"] = ..., **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
def output_field(self) -> GeometryField: ...
class PostGISOperations(BaseSpatialOperations, DatabaseOperations):
name: str
postgis: bool
geography: 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
@property
def function_names(self) -> Any: ...
@property
def spatial_version(self) -> Any: ...
def geo_db_type(self, f: Any) -> Any: ...
def get_distance(self, f: Any, dist_val: Any, lookup_type: Any) -> Any: ...
def get_geom_placeholder(self, f: Any, value: Any, compiler: Any) -> Any: ...
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: ...
def spatial_aggregate_name(self, agg_name: Any) -> Any: ...
def geometry_columns(self) -> Any: ...
def spatial_ref_sys(self) -> Any: ...
def parse_raster(self, value: Any) -> Any: ...
def distance_expr_for_lookup(self, lhs: Any, rhs: Any, **kwargs: Any) -> Any: ...
def get_geometry_converter(self, expression: Any) -> Any: ...
def get_area_att_for_field(self, field: Any) -> Any: ...
django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/postgis/pgraster.pyi 0000664 0000000 0000000 00000000367 15134010516 0027154 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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/postgis/schema.pyi 0000664 0000000 0000000 00000000524 15134010516 0026560 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_wrapper: str
sql_alter_column_to_3d: str
sql_alter_column_to_2d: str
def geo_quote_name(self, name: Any) -> Any: ...
django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/spatialite/ 0000775 0000000 0000000 00000000000 15134010516 0025243 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/spatialite/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0027513 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/spatialite/adapter.pyi 0000664 0000000 0000000 00000000266 15134010516 0027412 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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/spatialite/base.pyi 0000664 0000000 0000000 00000001503 15134010516 0026677 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.sqlite3.base import DatabaseWrapper as SQLiteDatabaseWrapper
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: ...
def get_new_connection(self, conn_params: Any) -> Any: ...
def prepare_database(self) -> None: ...
django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/spatialite/client.pyi 0000664 0000000 0000000 00000000177 15134010516 0027251 0 ustar 00root root 0000000 0000000 from django.db.backends.sqlite3.client import DatabaseClient
class SpatiaLiteClient(DatabaseClient):
executable_name: str
django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/spatialite/features.pyi 0000664 0000000 0000000 00000000641 15134010516 0027605 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
class DatabaseFeatures(BaseSpatialFeatures, SQLiteDatabaseFeatures):
supports_3d_storage: bool
@cached_property
def supports_area_geodetic(self) -> bool: ... # type: ignore[override]
django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/spatialite/introspection.pyi 0000664 0000000 0000000 00000000703 15134010516 0030666 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.sqlite3.introspection import DatabaseIntrospection, FlexibleFieldLookupDict
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: ...
def get_constraints(self, cursor: Any, table_name: Any) -> Any: ...
django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/spatialite/models.pyi 0000664 0000000 0000000 00000001407 15134010516 0027253 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar
from django.contrib.gis.db.backends.base.models import SpatialRefSysMixin
from django.db import models
from typing_extensions import Self
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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/spatialite/operations.pyi 0000664 0000000 0000000 00000002501 15134010516 0030147 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
class SpatialiteNullCheckOperator(SpatialOperator): ...
class SpatiaLiteOperations(BaseSpatialOperations, DatabaseOperations):
name: str
spatialite: bool
Adapter: Any
collect: str
extent: str
makeline: str
unionagg: str
gis_operators: Any
disallowed_aggregates: Any
select: str
function_names: Any
@cached_property
def unsupported_functions(self) -> set[str]: ... # type: ignore[override]
@property
def spatial_version(self) -> Any: ...
def geo_db_type(self, f: Any) -> None: ...
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 spatialite_version(self) -> Any: ...
def spatialite_version_tuple(self) -> Any: ...
def spatial_aggregate_name(self, agg_name: Any) -> Any: ...
def geometry_columns(self) -> Any: ...
def spatial_ref_sys(self) -> Any: ...
def get_geometry_converter(self, expression: Any) -> Any: ...
django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/spatialite/schema.pyi 0000664 0000000 0000000 00000002417 15134010516 0027232 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
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: ...
def column_sql(
self, model: type[Model], field: Field, include_default: bool = False
) -> tuple[None, None] | tuple[str, list[Any]]: ...
def remove_geometry_metadata(self, model: type[Model], field: Field) -> None: ...
def create_model(self, model: type[Model]) -> None: ...
def delete_model(self, model: type[Model], **kwargs: Any) -> None: ...
def add_field(self, model: type[Model], field: Field) -> None: ...
def remove_field(self, model: type[Model], field: Field) -> None: ...
def alter_db_table(
self,
model: type[Model],
old_db_table: str,
new_db_table: str,
) -> None: ...
django-stubs-5.2.9/django-stubs/contrib/gis/db/backends/utils.pyi 0000664 0000000 0000000 00000001240 15134010516 0024764 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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/db/models/ 0000775 0000000 0000000 00000000000 15134010516 0022615 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/gis/db/models/__init__.pyi 0000664 0000000 0000000 00000006401 15134010516 0025100 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",
"CASCADE",
"DEFERRED",
"DO_NOTHING",
"NOT_PROVIDED",
"PROTECT",
"RESTRICT",
"SET",
"SET_DEFAULT",
"SET_NULL",
"Aggregate",
"AutoField",
"Avg",
"BaseConstraint",
"BigAutoField",
"BigIntegerField",
"BinaryField",
"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",
"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",
"Subquery",
"Sum",
"TextChoices",
"TextField",
"TimeField",
"Transform",
"URLField",
"UUIDField",
"Union",
"UniqueConstraint",
"Value",
"ValueRange",
"Variance",
"When",
"Window",
"WindowFrame",
"WindowFrameExclusion",
"aprefetch_related_objects",
"prefetch_related_objects",
"signals",
]
django-stubs-5.2.9/django-stubs/contrib/gis/db/models/aggregates.pyi 0000664 0000000 0000000 00000001542 15134010516 0025453 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
__all__ = ["Collect", "Extent", "Extent3D", "MakeLine", "Union"]
class GeoAggregate(Aggregate):
is_extent: bool
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
def __init__(self, expression: Any, **extra: Any) -> None: ...
class Extent3D(GeoAggregate):
name: 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
django-stubs-5.2.9/django-stubs/contrib/gis/db/models/fields.pyi 0000664 0000000 0000000 00000014622 15134010516 0024613 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable
from typing import Any, NamedTuple, TypeVar
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.utils.choices import _Choices
from django.utils.functional import _StrOrPromise
# __set__ value type
_ST = TypeVar("_ST")
# __get__ return type
_GT = TypeVar("_GT")
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 = ...,
srid: int = ...,
spatial_index: bool = ...,
*,
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: ...
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(self, value: Any, compiler: Any, connection: Any) -> Any: ...
def get_srid(self, obj: Any) -> Any: ...
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: ...
def get_prep_value(self, value: Any) -> Any: ...
class GeometryField(BaseSpatialField[_ST, _GT]):
dim: int
def __init__(
self,
verbose_name: _StrOrPromise | None = ...,
dim: int = ...,
geography: bool = ...,
*,
extent: tuple[float, float, float, float] = ...,
tolerance: float = ...,
srid: int = ...,
spatial_index: bool = ...,
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: ...
def formfield( # type: ignore[override]
self,
*,
form_class: type[forms.GeometryField] | None = ...,
geom_type: str = ...,
srid: Any = ...,
**kwargs: Any,
) -> forms.GeometryField: ...
def contribute_to_class(self, cls: type[Model], name: str, **kwargs: Any) -> None: ... # type: ignore[override]
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):
def get_internal_type(self) -> Any: ...
class RasterField(BaseSpatialField):
def db_type(self, connection: Any) -> Any: ...
def from_db_value(self, value: Any, expression: Any, connection: Any) -> Any: ...
def contribute_to_class(self, cls: type[Model], name: str, **kwargs: Any) -> None: ... # type: ignore[override]
def get_transform(self, name: Any) -> Any: ...
django-stubs-5.2.9/django-stubs/contrib/gis/db/models/functions.pyi 0000664 0000000 0000000 00000015752 15134010516 0025362 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, 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
NUMERIC_TYPES: Any
class GeoFuncMixin:
function: str | None = None
geom_param_pos: Any
@property
def geo_field(self) -> Any: ...
class GeoFunc(GeoFuncMixin, Func): ...
class GeomOutputGeoFunc(GeoFunc):
@cached_property
def output_field(self) -> GeometryField: ...
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
def output_field(self) -> AreaField: ...
def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class Azimuth(GeoFunc):
output_field: ClassVar[FloatField]
arity: int
geom_param_pos: Any
class AsGeoJSON(GeoFunc):
output_field: ClassVar[TextField]
def __init__(
self, expression: Any, bbox: bool = ..., crs: bool = ..., precision: int = ..., **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]
def __init__(self, expression: Any, version: int = ..., precision: int = ..., **extra: Any) -> None: ...
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class AsKML(GeoFunc):
output_field: ClassVar[TextField]
def __init__(self, expression: Any, precision: int = ..., **extra: Any) -> None: ...
class AsSVG(GeoFunc):
output_field: ClassVar[TextField]
def __init__(self, expression: Any, relative: bool = ..., precision: int = ..., **extra: Any) -> None: ...
class AsWKB(GeoFunc):
output_field: ClassVar[BinaryField]
arity: int
class AsWKT(GeoFunc):
output_field: ClassVar[TextField]
arity: int
class BoundingCircle(OracleToleranceMixin, GeomOutputGeoFunc):
def __init__(self, expression: Any, num_seg: int = ..., **extra: Any) -> None: ...
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class Centroid(OracleToleranceMixin, GeomOutputGeoFunc):
arity: int
class ClosestPoint(GeomOutputGeoFunc):
arity: int
geom_param_pos: tuple[int, int]
class Difference(OracleToleranceMixin, GeomOutputGeoFunc):
arity: int
geom_param_pos: Any
class DistanceResultMixin:
@cached_property
def output_field(self) -> DistanceField: ...
def source_is_geography(self) -> Any: ...
class Distance(DistanceResultMixin, OracleToleranceMixin, GeoFunc):
geom_param_pos: Any
spheroid: Any
def __init__(self, expr1: Any, expr2: Any, spheroid: Any | None = ..., **extra: Any) -> None: ...
def as_postgresql(
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any
) -> _AsSqlType: ...
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]
def __init__(self, expression: Any, precision: Any | None = ..., **extra: Any) -> None: ...
def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class GeometryDistance(GeoFunc):
output_field: ClassVar[FloatField]
arity: int
function: str
arg_joiner: str
geom_param_pos: Any
class Intersection(OracleToleranceMixin, GeomOutputGeoFunc):
arity: int
geom_param_pos: Any
class IsEmpty(GeoFuncMixin, StandardTransform):
lookup_name: str
output_field: ClassVar[BooleanField]
class IsValid(OracleToleranceMixin, GeoFuncMixin, StandardTransform):
lookup_name: str
output_field: ClassVar[BooleanField]
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 = ..., **extra: Any) -> None: ...
def as_postgresql(
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any
) -> _AsSqlType: ...
def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class LineLocatePoint(GeoFunc):
output_field: ClassVar[FloatField]
arity: int
geom_param_pos: Any
class MakeValid(GeomOutputGeoFunc): ...
class MemSize(GeoFunc):
output_field: ClassVar[IntegerField]
arity: int
class NumGeometries(GeoFunc):
output_field: ClassVar[IntegerField]
arity: int
class NumPoints(GeoFunc):
output_field: ClassVar[IntegerField]
arity: int
class Perimeter(DistanceResultMixin, OracleToleranceMixin, GeoFunc):
arity: int
def as_postgresql(
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any
) -> _AsSqlType: ...
def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class PointOnSurface(OracleToleranceMixin, GeomOutputGeoFunc):
arity: int
class Reverse(GeoFunc):
arity: int
class Scale(SQLiteDecimalToFloatMixin, GeomOutputGeoFunc):
def __init__(self, expression: Any, x: Any, y: Any, z: float = ..., **extra: Any) -> None: ...
class SnapToGrid(SQLiteDecimalToFloatMixin, GeomOutputGeoFunc):
def __init__(self, expression: Any, *args: Any, **extra: Any) -> None: ...
class SymDifference(OracleToleranceMixin, GeomOutputGeoFunc):
arity: int
geom_param_pos: Any
class Transform(GeomOutputGeoFunc):
def __init__(self, expression: Any, srid: Any, **extra: Any) -> None: ...
class Translate(Scale):
def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class Union(OracleToleranceMixin, GeomOutputGeoFunc):
arity: int
geom_param_pos: Any
django-stubs-5.2.9/django-stubs/contrib/gis/db/models/lookups.pyi 0000664 0000000 0000000 00000005613 15134010516 0025041 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.models import Lookup, Transform
class RasterBandTransform(Transform): ...
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 = ...) -> None: ...
def get_db_prep_lookup(self, value: Any, connection: Any) -> Any: ...
rhs: Any
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: Any
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
def process_rhs_params(self) -> None: ...
def process_distance(self, compiler: Any, connection: Any) -> Any: ...
class DWithinLookup(DistanceLookupBase):
lookup_name: str
sql_template: str
def process_distance(self, compiler: Any, connection: Any) -> Any: ...
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
django-stubs-5.2.9/django-stubs/contrib/gis/db/models/proxy.pyi 0000664 0000000 0000000 00000000531 15134010516 0024520 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.models.query_utils import DeferredAttribute
class SpatialProxy(DeferredAttribute):
def __init__(self, klass: Any, field: Any, load_func: Any | None = ...) -> None: ...
def __get__(self, instance: Any, cls: Any | None = ...) -> Any: ...
def __set__(self, instance: Any, value: Any) -> Any: ...
django-stubs-5.2.9/django-stubs/contrib/gis/db/models/sql/ 0000775 0000000 0000000 00000000000 15134010516 0023414 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/gis/db/models/sql/__init__.pyi 0000664 0000000 0000000 00000000320 15134010516 0025671 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"]
django-stubs-5.2.9/django-stubs/contrib/gis/db/models/sql/conversion.pyi 0000664 0000000 0000000 00000001475 15134010516 0026333 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db import models
class AreaField(models.FloatField):
geo_field: Any
def __init__(self, geo_field: Any) -> None: ...
def get_prep_value(self, value: Any) -> Any: ...
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: ...
def get_internal_type(self) -> Any: ...
class DistanceField(models.FloatField):
geo_field: Any
def __init__(self, geo_field: Any) -> None: ...
def get_prep_value(self, value: Any) -> Any: ...
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: ...
def get_internal_type(self) -> Any: ...
django-stubs-5.2.9/django-stubs/contrib/gis/feeds.pyi 0000664 0000000 0000000 00000001542 15134010516 0022560 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
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):
def rss_attributes(self) -> dict[str, str]: ...
class GeoAtom1Feed(Atom1Feed, GeoFeedMixin): ...
class W3CGeoFeed(Rss201rev2Feed, GeoFeedMixin):
def rss_attributes(self) -> dict[str, str]: ...
class Feed(BaseFeed): ...
django-stubs-5.2.9/django-stubs/contrib/gis/forms/ 0000775 0000000 0000000 00000000000 15134010516 0022073 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/gis/forms/__init__.pyi 0000664 0000000 0000000 00000001202 15134010516 0024350 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
django-stubs-5.2.9/django-stubs/contrib/gis/forms/fields.pyi 0000664 0000000 0000000 00000001450 15134010516 0024064 0 ustar 00root root 0000000 0000000 from typing import Any
from django import forms
class GeometryField(forms.Field):
widget: Any
geom_type: str
srid: Any
def __init__(self, *, srid: Any | None = ..., geom_type: Any | None = ..., **kwargs: Any) -> None: ...
def to_python(self, value: Any) -> Any: ...
def clean(self, value: Any) -> Any: ...
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
django-stubs-5.2.9/django-stubs/contrib/gis/forms/widgets.pyi 0000664 0000000 0000000 00000001670 15134010516 0024270 0 ustar 00root root 0000000 0000000 from logging import Logger
from typing import Any
from django.forms.widgets import Widget
logger: Logger
class BaseGeometryWidget(Widget):
geom_type: str
map_srid: int
map_width: int
map_height: int
display_raw: bool
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: ...
def get_context(self, name: Any, value: Any, attrs: Any) -> Any: ...
class OpenLayersWidget(BaseGeometryWidget):
template_name: str
map_srid: int
class Media:
css: Any
js: Any
def serialize(self, value: Any) -> Any: ...
def deserialize(self, value: Any) -> Any: ...
class OSMWidget(OpenLayersWidget):
template_name: str
default_lon: int
default_lat: int
default_zoom: int
def __init__(self, attrs: Any | None = ...) -> None: ...
django-stubs-5.2.9/django-stubs/contrib/gis/gdal/ 0000775 0000000 0000000 00000000000 15134010516 0021654 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/gis/gdal/__init__.pyi 0000664 0000000 0000000 00000002537 15134010516 0024145 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",
)
django-stubs-5.2.9/django-stubs/contrib/gis/gdal/base.pyi 0000664 0000000 0000000 00000000211 15134010516 0023303 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
django-stubs-5.2.9/django-stubs/contrib/gis/gdal/datasource.pyi 0000664 0000000 0000000 00000001076 15134010516 0024535 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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/gdal/driver.pyi 0000664 0000000 0000000 00000000504 15134010516 0023671 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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/gdal/envelope.pyi 0000664 0000000 0000000 00000001260 15134010516 0024213 0 ustar 00root root 0000000 0000000 from ctypes import Structure
from typing import Any
class OGREnvelope(Structure): ...
class Envelope:
def __init__(self, *args: Any) -> None: ...
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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/gdal/error.pyi 0000664 0000000 0000000 00000000310 15134010516 0023522 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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/gdal/feature.pyi 0000664 0000000 0000000 00000001663 15134010516 0024040 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
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: ...
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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/gdal/field.pyi 0000664 0000000 0000000 00000002664 15134010516 0023472 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.gis.gdal.base import GDALBase
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
def value(self) -> Any: ...
@property
def type(self) -> Any: ...
class OFTReal(Field):
@property
def value(self) -> Any: ...
class OFTString(Field): ...
class OFTWideString(Field): ...
class OFTBinary(Field): ...
class OFTDate(Field):
@property
def value(self) -> Any: ...
class OFTDateTime(Field):
@property
def value(self) -> Any: ...
class OFTTime(Field):
@property
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
django-stubs-5.2.9/django-stubs/contrib/gis/gdal/geometries.pyi 0000664 0000000 0000000 00000012123 15134010516 0024541 0 ustar 00root root 0000000 0000000 from typing import Any, AnyStr
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
class OGRGeometry(GDALBase):
destructor: Any
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: ...
def __eq__(self, other: object) -> bool: ...
@property
def dimension(self) -> int: ...
coord_dim: 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: ...
srid: int | None
@property
def geos(self) -> GEOSGeometry: ...
@property
def gml(self) -> str: ...
@property
def hex(self) -> bytes: ...
@property
def json(self) -> str: ...
geojson: 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 tuple(self) -> tuple[tuple[float, ...]]: ...
coords: Any
@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) -> OGRGeometry: ...
exterior_ring: OGRGeometry
@property
def coords(self) -> tuple[tuple[tuple[float, ...]]]: ...
@property
def tuple(self) -> tuple[tuple[tuple[float, ...]]]: ...
@property
def point_count(self) -> int: ...
@property
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
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): ...
GEO_CLASSES: Any
django-stubs-5.2.9/django-stubs/contrib/gis/gdal/geomtype.pyi 0000664 0000000 0000000 00000000460 15134010516 0024230 0 ustar 00root root 0000000 0000000 from typing import Any
class OGRGeomType:
wkb25bit: int
num: int
def __init__(self, type_input: Any) -> None: ...
def __eq__(self, other: object) -> bool: ...
@property
def name(self) -> str: ...
@property
def django(self) -> str: ...
def to_multi(self) -> None: ...
django-stubs-5.2.9/django-stubs/contrib/gis/gdal/layer.pyi 0000664 0000000 0000000 00000003317 15134010516 0023517 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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/gdal/libgdal.pyi 0000664 0000000 0000000 00000001531 15134010516 0023775 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
django-stubs-5.2.9/django-stubs/contrib/gis/gdal/prototypes/ 0000775 0000000 0000000 00000000000 15134010516 0024104 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/gis/gdal/prototypes/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0026354 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/gis/gdal/prototypes/ds.pyi 0000664 0000000 0000000 00000002262 15134010516 0025237 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
django-stubs-5.2.9/django-stubs/contrib/gis/gdal/prototypes/errcheck.pyi 0000664 0000000 0000000 00000001701 15134010516 0026414 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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/gdal/prototypes/generation.pyi 0000664 0000000 0000000 00000002065 15134010516 0026765 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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/gdal/prototypes/geom.pyi 0000664 0000000 0000000 00000002056 15134010516 0025561 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
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
django-stubs-5.2.9/django-stubs/contrib/gis/gdal/prototypes/raster.pyi 0000664 0000000 0000000 00000001661 15134010516 0026133 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
django-stubs-5.2.9/django-stubs/contrib/gis/gdal/prototypes/srs.pyi 0000664 0000000 0000000 00000001146 15134010516 0025440 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
django-stubs-5.2.9/django-stubs/contrib/gis/gdal/raster/ 0000775 0000000 0000000 00000000000 15134010516 0023154 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/gis/gdal/raster/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0025424 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/gis/gdal/raster/band.pyi 0000664 0000000 0000000 00000003041 15134010516 0024601 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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/gdal/raster/base.pyi 0000664 0000000 0000000 00000000341 15134010516 0024607 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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/gdal/raster/const.pyi 0000664 0000000 0000000 00000000450 15134010516 0025024 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
django-stubs-5.2.9/django-stubs/contrib/gis/gdal/raster/source.pyi 0000664 0000000 0000000 00000004533 15134010516 0025204 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.utils.functional import cached_property
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 | c_void_p, write: bool = ...) -> None: ...
def __del__(self) -> 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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/gdal/srs.pyi 0000664 0000000 0000000 00000004257 15134010516 0023216 0 ustar 00root root 0000000 0000000 from enum import IntEnum
from typing import Any, AnyStr, cast
from django.contrib.gis.gdal.base import GDALBase
from typing_extensions import Self
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 proj(self) -> str: ...
@property
def proj4(self) -> str: ...
class CoordTransform(GDALBase):
destructor: Any
ptr: Any
def __init__(self, source: SpatialReference, target: SpatialReference) -> None: ...
django-stubs-5.2.9/django-stubs/contrib/gis/geoip2.pyi 0000664 0000000 0000000 00000004653 15134010516 0022665 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
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
from typing_extensions import Self, deprecated
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: ...
@deprecated("coords() is deprecated and will be removed in Django 6.0. Use lon_lat() instead.")
def coords(self, query: _QueryType, ordering: Sequence[str] = ...) -> _CoordType: ...
def lon_lat(self, query: _QueryType) -> _CoordType: ...
def lat_lon(self, query: _QueryType) -> _CoordType: ...
def geos(self, query: _QueryType) -> Point: ...
@classmethod
@deprecated("open() is deprecated and will be removed in Django 6.0. Use GeoIP2() instead.")
def open(cls, full_path: StrPath | None, cache: int) -> Self: ...
__all__ = ["HAS_GEOIP2"]
django-stubs-5.2.9/django-stubs/contrib/gis/geometry.pyi 0000664 0000000 0000000 00000000141 15134010516 0023317 0 ustar 00root root 0000000 0000000 from re import Pattern
hex_regex: Pattern[str]
wkt_regex: Pattern[str]
json_regex: Pattern[str]
django-stubs-5.2.9/django-stubs/contrib/gis/geos/ 0000775 0000000 0000000 00000000000 15134010516 0021702 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/gis/geos/__init__.pyi 0000664 0000000 0000000 00000001563 15134010516 0024171 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
django-stubs-5.2.9/django-stubs/contrib/gis/geos/base.pyi 0000664 0000000 0000000 00000000271 15134010516 0023337 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]
django-stubs-5.2.9/django-stubs/contrib/gis/geos/collections.pyi 0000664 0000000 0000000 00000001134 15134010516 0024742 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): ...
django-stubs-5.2.9/django-stubs/contrib/gis/geos/coordseq.pyi 0000664 0000000 0000000 00000002344 15134010516 0024247 0 ustar 00root root 0000000 0000000 from collections.abc import Iterator
from typing import Any
from django.contrib.gis.geos.base import GEOSBase
from typing_extensions import Self
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: ...
@property
def size(self) -> int: ...
@property
def dims(self) -> int: ...
@property
def hasz(self) -> bool: ...
def clone(self) -> Self: ...
@property
def kml(self) -> str: ...
@property
def tuple(self) -> tuple[Any, ...]: ...
@property
def is_counterclockwise(self) -> bool: ...
django-stubs-5.2.9/django-stubs/contrib/gis/geos/error.pyi 0000664 0000000 0000000 00000000044 15134010516 0023554 0 ustar 00root root 0000000 0000000 class GEOSException(Exception): ...
django-stubs-5.2.9/django-stubs/contrib/gis/geos/factory.pyi 0000664 0000000 0000000 00000000466 15134010516 0024102 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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/geos/geometry.pyi 0000664 0000000 0000000 00000012411 15134010516 0024257 0 ustar 00root root 0000000 0000000 from typing import Any
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 Self
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: ...
def __eq__(self, other: object) -> bool: ...
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: ...
def normalize(self) -> None: ...
@property
def empty(self) -> bool: ...
@property
def hasz(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: ...
geojson: 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 = ...) -> None: ...
django-stubs-5.2.9/django-stubs/contrib/gis/geos/io.pyi 0000664 0000000 0000000 00000001005 15134010516 0023030 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
class WKBReader(_WKBReader):
def read(self, wkb: bytes | str) -> GEOSGeometry: ...
class WKTReader(_WKTReader):
def read(self, wkt: bytes | str) -> GEOSGeometry: ...
__all__ = ["WKBReader", "WKBWriter", "WKTReader", "WKTWriter"]
django-stubs-5.2.9/django-stubs/contrib/gis/geos/libgeos.pyi 0000664 0000000 0000000 00000001600 15134010516 0024046 0 ustar 00root root 0000000 0000000 from ctypes import Structure
from logging import Logger
from typing import Any
logger: Logger
def load_geos() -> Any: ...
NOTICEFUNC: Any
def notice_h(fmt: Any, lst: Any) -> None: ...
ERRORFUNC: Any
def error_h(fmt: Any, lst: Any) -> None: ...
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: ...
@property
def func(self) -> Any: ...
def geos_version() -> bytes: ...
def geos_version_tuple() -> tuple[int, ...]: ...
django-stubs-5.2.9/django-stubs/contrib/gis/geos/linestring.pyi 0000664 0000000 0000000 00000001376 15134010516 0024612 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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/geos/mutable_list.pyi 0000664 0000000 0000000 00000002146 15134010516 0025114 0 ustar 00root root 0000000 0000000 from typing import Any
from typing_extensions import Self
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: ...
def __eq__(self, other: object) -> bool: ...
def __lt__(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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/geos/point.pyi 0000664 0000000 0000000 00000001460 15134010516 0023557 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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/geos/polygon.pyi 0000664 0000000 0000000 00000001311 15134010516 0024110 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, ...]]]: ...
django-stubs-5.2.9/django-stubs/contrib/gis/geos/prepared.pyi 0000664 0000000 0000000 00000001341 15134010516 0024226 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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/geos/prototypes/ 0000775 0000000 0000000 00000000000 15134010516 0024132 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/gis/geos/prototypes/__init__.pyi 0000664 0000000 0000000 00000010231 15134010516 0026411 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
django-stubs-5.2.9/django-stubs/contrib/gis/geos/prototypes/coordseq.pyi 0000664 0000000 0000000 00000001433 15134010516 0026475 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.gis.geos.libgeos import GEOSFuncFactory
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
def errcheck(result: Any, func: Any, cargs: Any) -> 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_setx: Any
cs_sety: Any
cs_setz: Any
cs_getsize: Any
cs_getdims: Any
cs_is_ccw: Any
django-stubs-5.2.9/django-stubs/contrib/gis/geos/prototypes/errcheck.pyi 0000664 0000000 0000000 00000000732 15134010516 0026445 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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/geos/prototypes/geom.pyi 0000664 0000000 0000000 00000001430 15134010516 0025602 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
django-stubs-5.2.9/django-stubs/contrib/gis/geos/prototypes/io.pyi 0000664 0000000 0000000 00000005706 15134010516 0025274 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: ...
class _WKTReader(IOBase):
ptr_type: Any
destructor: Any
def read(self, wkt: Any) -> Any: ...
class _WKBReader(IOBase):
ptr_type: Any
destructor: Any
def read(self, wkb: Any) -> 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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/geos/prototypes/misc.pyi 0000664 0000000 0000000 00000000467 15134010516 0025617 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"]
django-stubs-5.2.9/django-stubs/contrib/gis/geos/prototypes/predicates.pyi 0000664 0000000 0000000 00000001425 15134010516 0027002 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_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
django-stubs-5.2.9/django-stubs/contrib/gis/geos/prototypes/prepared.pyi 0000664 0000000 0000000 00000000662 15134010516 0026463 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
django-stubs-5.2.9/django-stubs/contrib/gis/geos/prototypes/threadsafe.pyi 0000664 0000000 0000000 00000000760 15134010516 0026766 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
django-stubs-5.2.9/django-stubs/contrib/gis/geos/prototypes/topology.pyi 0000664 0000000 0000000 00000001141 15134010516 0026526 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
django-stubs-5.2.9/django-stubs/contrib/gis/measure.pyi 0000664 0000000 0000000 00000002552 15134010516 0023135 0 ustar 00root root 0000000 0000000 from decimal import Decimal
from typing import Any, TypeAlias
from typing_extensions import Self
_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: ...
def __eq__(self, other: object) -> bool: ...
def __lt__(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"]
django-stubs-5.2.9/django-stubs/contrib/gis/ptr.pyi 0000664 0000000 0000000 00000000374 15134010516 0022301 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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/serializers/ 0000775 0000000 0000000 00000000000 15134010516 0023301 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/gis/serializers/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0025551 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/gis/serializers/geojson.pyi 0000664 0000000 0000000 00000000755 15134010516 0025477 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.serializers.json import Serializer as JSONSerializer
class Serializer(JSONSerializer):
def start_serialization(self) -> None: ...
def end_serialization(self) -> None: ...
geometry_field: Any
def start_object(self, obj: Any) -> None: ...
def get_dump_object(self, obj: Any) -> Any: ...
def handle_field(self, obj: Any, field: Any) -> None: ...
class Deserializer:
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
django-stubs-5.2.9/django-stubs/contrib/gis/shortcuts.pyi 0000664 0000000 0000000 00000000364 15134010516 0023531 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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/sitemaps/ 0000775 0000000 0000000 00000000000 15134010516 0022572 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/gis/sitemaps/__init__.pyi 0000664 0000000 0000000 00000000262 15134010516 0025054 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"]
django-stubs-5.2.9/django-stubs/contrib/gis/sitemaps/kml.pyi 0000664 0000000 0000000 00000000510 15134010516 0024074 0 ustar 00root root 0000000 0000000 from typing import Any
from django.contrib.sitemaps import Sitemap
class KMLSitemap(Sitemap):
geo_format: str
locations: Any
def __init__(self, locations: Any | None = ...) -> None: ...
def items(self) -> Any: ...
def location(self, obj: Any) -> Any: ...
class KMZSitemap(KMLSitemap):
geo_format: str
django-stubs-5.2.9/django-stubs/contrib/gis/sitemaps/views.pyi 0000664 0000000 0000000 00000000540 15134010516 0024451 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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/utils/ 0000775 0000000 0000000 00000000000 15134010516 0022105 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/gis/utils/__init__.pyi 0000664 0000000 0000000 00000001026 15134010516 0024366 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"]
django-stubs-5.2.9/django-stubs/contrib/gis/utils/layermapping.pyi 0000664 0000000 0000000 00000005063 15134010516 0025324 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, 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]
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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/utils/ogrinfo.pyi 0000664 0000000 0000000 00000000201 15134010516 0024264 0 ustar 00root root 0000000 0000000 from django.contrib.gis.gdal import DataSource
def ogrinfo(data_source: str | DataSource, num_features: int = ...) -> None: ...
django-stubs-5.2.9/django-stubs/contrib/gis/utils/ogrinspect.pyi 0000664 0000000 0000000 00000000500 15134010516 0025000 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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/utils/srs.pyi 0000664 0000000 0000000 00000000307 15134010516 0023437 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: ...
django-stubs-5.2.9/django-stubs/contrib/gis/views.pyi 0000664 0000000 0000000 00000000312 15134010516 0022621 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: ...
django-stubs-5.2.9/django-stubs/contrib/humanize/ 0000775 0000000 0000000 00000000000 15134010516 0022003 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/humanize/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0024253 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/humanize/apps.pyi 0000664 0000000 0000000 00000000200 15134010516 0023461 0 ustar 00root root 0000000 0000000 from typing import Any
from django.apps import AppConfig
class HumanizeConfig(AppConfig):
name: str
verbose_name: Any
django-stubs-5.2.9/django-stubs/contrib/humanize/templatetags/ 0000775 0000000 0000000 00000000000 15134010516 0024475 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/humanize/templatetags/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0026745 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/humanize/templatetags/humanize.pyi 0000664 0000000 0000000 00000001535 15134010516 0027044 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]]
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: ...
django-stubs-5.2.9/django-stubs/contrib/messages/ 0000775 0000000 0000000 00000000000 15134010516 0021772 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/messages/__init__.pyi 0000664 0000000 0000000 00000001262 15134010516 0024255 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
django-stubs-5.2.9/django-stubs/contrib/messages/api.pyi 0000664 0000000 0000000 00000002706 15134010516 0023273 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",
)
django-stubs-5.2.9/django-stubs/contrib/messages/apps.pyi 0000664 0000000 0000000 00000000301 15134010516 0023452 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
django-stubs-5.2.9/django-stubs/contrib/messages/constants.pyi 0000664 0000000 0000000 00000000170 15134010516 0024527 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]
django-stubs-5.2.9/django-stubs/contrib/messages/context_processors.pyi 0000664 0000000 0000000 00000000341 15134010516 0026461 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]: ...
django-stubs-5.2.9/django-stubs/contrib/messages/middleware.pyi 0000664 0000000 0000000 00000000535 15134010516 0024635 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: ...
django-stubs-5.2.9/django-stubs/contrib/messages/storage/ 0000775 0000000 0000000 00000000000 15134010516 0023436 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/messages/storage/__init__.pyi 0000664 0000000 0000000 00000000250 15134010516 0025715 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: ...
django-stubs-5.2.9/django-stubs/contrib/messages/storage/base.pyi 0000664 0000000 0000000 00000001612 15134010516 0025073 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
django-stubs-5.2.9/django-stubs/contrib/messages/storage/cookie.pyi 0000664 0000000 0000000 00000001660 15134010516 0025435 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
class MessageEncoder(json.JSONEncoder):
allow_nan: bool
check_circular: bool
ensure_ascii: bool
skipkeys: bool
sort_keys: bool
message_key: str
class MessageDecoder(json.JSONDecoder):
def process_messages(self, obj: Any) -> Any: ...
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
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: ...
django-stubs-5.2.9/django-stubs/contrib/messages/storage/fallback.pyi 0000664 0000000 0000000 00000000344 15134010516 0025721 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: ...
django-stubs-5.2.9/django-stubs/contrib/messages/storage/session.pyi 0000664 0000000 0000000 00000000724 15134010516 0025647 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: ...
django-stubs-5.2.9/django-stubs/contrib/messages/test.pyi 0000664 0000000 0000000 00000000462 15134010516 0023476 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: ...
django-stubs-5.2.9/django-stubs/contrib/messages/utils.pyi 0000664 0000000 0000000 00000000054 15134010516 0023654 0 ustar 00root root 0000000 0000000 def get_level_tags() -> dict[int, str]: ...
django-stubs-5.2.9/django-stubs/contrib/messages/views.pyi 0000664 0000000 0000000 00000000653 15134010516 0023656 0 ustar 00root root 0000000 0000000 from typing import Generic, TypeVar
from django.forms.forms import BaseForm
from django.http.response import HttpResponse
from django.utils.functional import _StrOrPromise
_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: ...
django-stubs-5.2.9/django-stubs/contrib/postgres/ 0000775 0000000 0000000 00000000000 15134010516 0022031 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/postgres/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0024301 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/postgres/aggregates/ 0000775 0000000 0000000 00000000000 15134010516 0024142 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/postgres/aggregates/__init__.pyi 0000664 0000000 0000000 00000001540 15134010516 0026424 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
django-stubs-5.2.9/django-stubs/contrib/postgres/aggregates/general.pyi 0000664 0000000 0000000 00000004167 15134010516 0026312 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar
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.sql.compiler import SQLCompiler, _AsSqlType
from typing_extensions import Self
from .mixins import OrderableAggMixin
class ArrayAgg(OrderableAggMixin, Aggregate):
@property
def output_field(self) -> ArrayField: ...
def resolve_expression(
self,
query: Any = ...,
allow_joins: bool = ...,
reuse: set[str] | None = ...,
summarize: bool = ...,
for_save: bool = ...,
) -> Self: ...
def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... # type: ignore[override]
class BitAnd(Aggregate): ...
class BitOr(Aggregate): ...
class BitXor(Aggregate): ...
class BoolAnd(Aggregate):
output_field: ClassVar[BooleanField]
class BoolOr(Aggregate):
output_field: ClassVar[BooleanField]
class JSONBAgg(OrderableAggMixin, Aggregate):
output_field: ClassVar[JSONField]
def resolve_expression(
self,
query: Any = ...,
allow_joins: bool = ...,
reuse: set[str] | None = ...,
summarize: bool = ...,
for_save: bool = ...,
) -> Self: ...
def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... # type: ignore[override]
class StringAgg(OrderableAggMixin, Aggregate):
output_field: ClassVar[TextField]
def __init__(self, expression: BaseExpression | Combinable | str, delimiter: Any, **extra: Any) -> None: ...
def resolve_expression(
self,
query: Any = ...,
allow_joins: bool = ...,
reuse: set[str] | None = ...,
summarize: bool = ...,
for_save: bool = ...,
) -> Self: ...
def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... # type: ignore[override]
__all__ = ["ArrayAgg", "BitAnd", "BitOr", "BitXor", "BoolAnd", "BoolOr", "JSONBAgg", "StringAgg"]
django-stubs-5.2.9/django-stubs/contrib/postgres/aggregates/mixins.pyi 0000664 0000000 0000000 00000001412 15134010516 0026172 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.expressions import BaseExpression, Combinable, Expression, OrderByList
from django.db.models.sql.compiler import SQLCompiler, _AsSqlType
class OrderableAggMixin:
order_by: OrderByList
def __init__(
self,
*expressions: BaseExpression | Combinable | str,
ordering: Sequence[str] = ...,
order_by: Sequence[str] = ...,
**extra: Any,
) -> None: ...
def get_source_expressions(self) -> list[Expression]: ...
def set_source_expressions(self, exprs: Sequence[Combinable]) -> None: ...
def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
django-stubs-5.2.9/django-stubs/contrib/postgres/aggregates/statistics.pyi 0000664 0000000 0000000 00000002140 15134010516 0027054 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]
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] # 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",
]
django-stubs-5.2.9/django-stubs/contrib/postgres/apps.pyi 0000664 0000000 0000000 00000000416 15134010516 0023520 0 ustar 00root root 0000000 0000000 from typing import Any
from django.apps import AppConfig
RANGE_TYPES: Any
def uninstall_if_needed(setting: Any, value: Any, enter: Any, **kwargs: Any) -> None: ...
class PostgresConfig(AppConfig):
name: str
verbose_name: Any
def ready(self) -> None: ...
django-stubs-5.2.9/django-stubs/contrib/postgres/constraints.pyi 0000664 0000000 0000000 00000002305 15134010516 0025123 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable, Sequence
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
class ExclusionConstraintExpression(IndexExpression): ...
class ExclusionConstraint(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: ...
def validate(
self, model: type[Model], instance: Model, exclude: Iterable[str] | None = None, using: str = "default"
) -> None: ...
__all__ = ["ExclusionConstraint"]
django-stubs-5.2.9/django-stubs/contrib/postgres/expressions.pyi 0000664 0000000 0000000 00000000713 15134010516 0025137 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
class ArraySubquery(Subquery):
template: str
def __init__(self, queryset: Query | QuerySet[Any], **kwargs: Any) -> None: ...
@cached_property
def output_field(self) -> ArrayField: ...
django-stubs-5.2.9/django-stubs/contrib/postgres/fields/ 0000775 0000000 0000000 00000000000 15134010516 0023277 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/postgres/fields/__init__.pyi 0000664 0000000 0000000 00000001322 15134010516 0025557 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
django-stubs-5.2.9/django-stubs/contrib/postgres/fields/array.pyi 0000664 0000000 0000000 00000004616 15134010516 0025147 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable, Sequence
from typing import Any, ClassVar, TypeVar
from _typeshed import Unused
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.utils.choices import _Choices
from django.utils.functional import _StrOrPromise
# __set__ value type
_ST = TypeVar("_ST")
# __get__ return type
_GT = TypeVar("_GT")
class ArrayField(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
size: int | None
default_validators: Sequence[_ValidatorCallable]
from_db_value: Any
def __init__(
self,
base_field: Field,
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: ...
@property
def description(self) -> str: ... # type: ignore[override]
def cast_db_type(self, connection: BaseDatabaseWrapper) -> str: ...
def get_placeholder(self, value: Unused, compiler: Unused, connection: BaseDatabaseWrapper) -> str: ...
def get_transform(self, name: str) -> type[Transform] | None: ...
__all__ = ["ArrayField"]
django-stubs-5.2.9/django-stubs/contrib/postgres/fields/citext.pyi 0000664 0000000 0000000 00000000350 15134010516 0025320 0 ustar 00root root 0000000 0000000 from django.db.models.fields import CharField, EmailField, TextField
class CICharField(CharField): ...
class CIEmailField(EmailField): ...
class CITextField(TextField): ...
__all__ = ["CICharField", "CIEmailField", "CITextField"]
django-stubs-5.2.9/django-stubs/contrib/postgres/fields/hstore.pyi 0000664 0000000 0000000 00000002020 15134010516 0025320 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar
from django.contrib.postgres.fields.array import ArrayField
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
class HStoreField(CheckFieldDefaultMixin, Field):
def get_transform(self, name: str) -> Any: ...
class KeyTransform(Transform):
output_field: ClassVar[TextField]
def __init__(self, key_name: str, *args: Any, **kwargs: Any) -> None: ...
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]
class ValuesTransform(Transform):
output_field: ClassVar[ArrayField]
__all__ = ["HStoreField"]
django-stubs-5.2.9/django-stubs/contrib/postgres/fields/jsonb.pyi 0000664 0000000 0000000 00000000174 15134010516 0025137 0 ustar 00root root 0000000 0000000 from django.db.models import JSONField as BuiltinJSONField
class JSONField(BuiltinJSONField): ...
__all__ = ["JSONField"]
django-stubs-5.2.9/django-stubs/contrib/postgres/fields/ranges.pyi 0000664 0000000 0000000 00000006472 15134010516 0025312 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar, Literal, TypeVar
from _typeshed import Unused
from django.contrib.postgres import forms
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]
class RangeBoundary(models.Expression):
lower: str
upper: str
def __init__(self, inclusive_lower: bool = ..., inclusive_upper: bool = ...) -> 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(models.Field[Any, _RangeT]):
empty_strings_allowed: bool
base_field: type[models.Field]
range_type: type[_RangeT]
def get_prep_value(self, value: Any) -> Any | None: ...
def get_placeholder(self, value: Unused, compiler: Unused, connection: BaseDatabaseWrapper) -> str: ...
def to_python(self, value: Any) -> Any: ...
class IntegerRangeField(RangeField[NumericRange]):
base_field: type[models.IntegerField]
form_field: type[forms.IntegerRangeField]
class BigIntegerRangeField(RangeField[NumericRange]):
base_field: type[models.BigIntegerField]
form_field: type[forms.IntegerRangeField]
class DecimalRangeField(RangeField[NumericRange]):
base_field: type[models.DecimalField]
form_field: type[forms.DecimalRangeField]
class DateTimeRangeField(RangeField[DateTimeTZRange]):
base_field: type[models.DateTimeField]
form_field: type[forms.DateTimeRangeField]
class DateRangeField(RangeField[DateRange]):
base_field: type[models.DateField]
form_field: type[forms.DateRangeField]
class DateTimeRangeContains(PostgresOperatorLookup): ...
class RangeContainedBy(PostgresOperatorLookup):
type_mapping: dict[str, str]
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
def output_field(self) -> models.Field: ...
class RangeEndsWith(models.Transform):
@property
def output_field(self) -> models.Field: ...
class IsEmpty(models.Transform):
output_field: ClassVar[models.BooleanField]
class LowerInclusive(models.Transform):
output_field: ClassVar[models.BooleanField]
class LowerInfinite(models.Transform):
output_field: ClassVar[models.BooleanField]
class UpperInclusive(models.Transform):
output_field: ClassVar[models.BooleanField]
class UpperInfinite(models.Transform):
output_field: ClassVar[models.BooleanField]
__all__ = [
"BigIntegerRangeField",
"DateRangeField",
"DateTimeRangeField",
"DecimalRangeField",
"IntegerRangeField",
"RangeBoundary",
"RangeField",
"RangeOperators",
]
django-stubs-5.2.9/django-stubs/contrib/postgres/fields/utils.pyi 0000664 0000000 0000000 00000000152 15134010516 0025160 0 ustar 00root root 0000000 0000000 from typing import Any
class AttributeSetter:
def __init__(self, name: Any, value: Any) -> None: ...
django-stubs-5.2.9/django-stubs/contrib/postgres/forms/ 0000775 0000000 0000000 00000000000 15134010516 0023157 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/postgres/forms/__init__.pyi 0000664 0000000 0000000 00000001134 15134010516 0025440 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
django-stubs-5.2.9/django-stubs/contrib/postgres/forms/array.pyi 0000664 0000000 0000000 00000004436 15134010516 0025027 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 ..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: ...
def clean(self, value: Any) -> Sequence[Any]: ...
def prepare_value(self, value: Any) -> Any: ...
def to_python(self, value: Any) -> Sequence[Any]: ... # type: ignore[override]
def validate(self, value: Sequence[Any]) -> None: ...
def run_validators(self, value: Sequence[Any]) -> None: ...
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
def is_hidden(self) -> bool: ...
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 get_context(self, name: str, value: Any, attrs: _OptAttrs | None = None) -> dict[str, Any]: ...
@property
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: ...
def to_python(self, value: Any) -> Sequence[Any]: ...
def clean(self, value: Any) -> Sequence[Any]: ...
def has_changed(self, initial: Any, data: Any) -> bool: ...
django-stubs-5.2.9/django-stubs/contrib/postgres/forms/hstore.pyi 0000664 0000000 0000000 00000001015 15134010516 0025203 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
class HStoreField(forms.CharField):
widget: _ClassLevelWidgetT
default_error_messages: ClassVar[_ErrorMessagesDict]
def prepare_value(self, value: Any) -> Any: ...
def to_python(self, value: Any) -> dict[str, str | None]: ... # type: ignore[override]
def has_changed(self, initial: Any, data: Any) -> bool: ...
__all__ = ["HStoreField"]
django-stubs-5.2.9/django-stubs/contrib/postgres/forms/ranges.pyi 0000664 0000000 0000000 00000003362 15134010516 0025165 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]
class RangeWidget(MultiWidget):
def __init__(self, base_widget: forms.Widget | type[forms.Widget], attrs: _OptAttrs | None = None) -> None: ...
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: ...
def prepare_value(self, value: Any) -> Any: ...
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",
]
django-stubs-5.2.9/django-stubs/contrib/postgres/functions.pyi 0000664 0000000 0000000 00000000337 15134010516 0024567 0 ustar 00root root 0000000 0000000 from typing import ClassVar
from django.db.models import DateTimeField, Func, UUIDField
class RandomUUID(Func):
output_field: ClassVar[UUIDField]
class TransactionNow(Func):
output_field: ClassVar[DateTimeField]
django-stubs-5.2.9/django-stubs/contrib/postgres/indexes.pyi 0000664 0000000 0000000 00000010152 15134010516 0024212 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
class PostgresIndex(Index):
@cached_property
def max_name_length(self) -> int: ... # type: ignore[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"]
django-stubs-5.2.9/django-stubs/contrib/postgres/lookups.pyi 0000664 0000000 0000000 00000001555 15134010516 0024256 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 .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):
def process_lhs(self, qn: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... # type: ignore[override]
class TrigramSimilar(PostgresOperatorLookup): ...
class TrigramWordSimilar(PostgresOperatorLookup): ...
class TrigramStrictWordSimilar(PostgresOperatorLookup): ...
django-stubs-5.2.9/django-stubs/contrib/postgres/operations.pyi 0000664 0000000 0000000 00000003641 15134010516 0024743 0 ustar 00root root 0000000 0000000 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
def __init__(self, name: str) -> None: ...
def extension_exists(self, schema_editor: BaseDatabaseSchemaEditor, extension: str) -> bool: ...
class BloomExtension(CreateExtension):
def __init__(self) -> None: ...
class BtreeGinExtension(CreateExtension):
def __init__(self) -> None: ...
class BtreeGistExtension(CreateExtension):
def __init__(self) -> None: ...
class CITextExtension(CreateExtension):
def __init__(self) -> None: ...
class CryptoExtension(CreateExtension):
def __init__(self) -> None: ...
class HStoreExtension(CreateExtension):
def __init__(self) -> None: ...
class TrigramExtension(CreateExtension):
def __init__(self) -> None: ...
class UnaccentExtension(CreateExtension):
def __init__(self) -> 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: ...
django-stubs-5.2.9/django-stubs/contrib/postgres/search.pyi 0000664 0000000 0000000 00000011374 15134010516 0024027 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar, 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
from django.db.models.lookups import Lookup
from django.db.models.sql.compiler import SQLCompiler, _AsSqlType
from typing_extensions import Self
_Expression: TypeAlias = str | Combinable | SearchQueryCombinable
class SearchVectorExact(Lookup):
def process_rhs(self, qn: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
def as_sql(self, qn: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
class SearchVectorField(Field): ...
class SearchQueryField(Field): ...
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]
def __init__(
self, *expressions: _Expression, config: _Expression | None = None, weight: Any | None = None
) -> None: ...
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 | 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]
SEARCH_TYPES: dict[str, str]
def __init__(
self,
value: _Expression,
output_field: Field | None = None,
*,
config: _Expression | None = None,
invert: bool = False,
search_type: str = "plain",
) -> None: ...
def as_sql( # type: ignore[override]
self,
compiler: SQLCompiler,
connection: BaseDatabaseWrapper,
function: str | None = None,
template: str | None = None,
) -> _AsSqlType: ...
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 | None = None,
) -> None: ...
class SearchRank(Func):
output_field: ClassVar[FloatField]
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]
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: ...
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]
def __init__(self, expression: _Expression, string: str, **extra: Any) -> None: ...
class TrigramWordBase(Func):
output_field: ClassVar[FloatField]
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): ...
django-stubs-5.2.9/django-stubs/contrib/postgres/serializers.pyi 0000664 0000000 0000000 00000000230 15134010516 0025103 0 ustar 00root root 0000000 0000000 from django.db.migrations.serializer import BaseSerializer
class RangeSerializer(BaseSerializer):
def serialize(self) -> tuple[str, set[str]]: ...
django-stubs-5.2.9/django-stubs/contrib/postgres/signals.pyi 0000664 0000000 0000000 00000000577 15134010516 0024225 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: ...
django-stubs-5.2.9/django-stubs/contrib/postgres/utils.pyi 0000664 0000000 0000000 00000000261 15134010516 0023713 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.exceptions import ValidationError
def prefix_validation_error(error: Any, prefix: Any, code: Any, params: Any) -> ValidationError: ...
django-stubs-5.2.9/django-stubs/contrib/postgres/validators.pyi 0000664 0000000 0000000 00000001324 15134010516 0024724 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): ...
django-stubs-5.2.9/django-stubs/contrib/redirects/ 0000775 0000000 0000000 00000000000 15134010516 0022147 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/redirects/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0024417 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/redirects/admin.pyi 0000664 0000000 0000000 00000000341 15134010516 0023760 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar
from django.contrib import admin
class RedirectAdmin(admin.ModelAdmin):
list_display: Any
list_filter: ClassVar[Any]
search_fields: ClassVar[Any]
radio_fields: ClassVar[Any]
django-stubs-5.2.9/django-stubs/contrib/redirects/apps.pyi 0000664 0000000 0000000 00000000201 15134010516 0023626 0 ustar 00root root 0000000 0000000 from typing import Any
from django.apps import AppConfig
class RedirectsConfig(AppConfig):
name: str
verbose_name: Any
django-stubs-5.2.9/django-stubs/contrib/redirects/middleware.pyi 0000664 0000000 0000000 00000000756 15134010516 0025017 0 ustar 00root root 0000000 0000000 from typing import ClassVar
from django.http.request import HttpRequest
from django.http.response import HttpResponse, HttpResponseBase, HttpResponseRedirectBase
from django.utils.deprecation import MiddlewareMixin
class RedirectFallbackMiddleware(MiddlewareMixin):
response_gone_class: ClassVar[type[HttpResponseBase]]
response_redirect_class: ClassVar[type[HttpResponseRedirectBase]]
def process_response(self, request: HttpRequest, response: HttpResponse) -> HttpResponse: ...
django-stubs-5.2.9/django-stubs/contrib/redirects/migrations/ 0000775 0000000 0000000 00000000000 15134010516 0024323 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/redirects/migrations/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0026573 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/redirects/models.pyi 0000664 0000000 0000000 00000000226 15134010516 0024155 0 ustar 00root root 0000000 0000000 from django.db import models
class Redirect(models.Model):
site: models.ForeignKey
old_path: models.CharField
new_path: models.CharField
django-stubs-5.2.9/django-stubs/contrib/sessions/ 0000775 0000000 0000000 00000000000 15134010516 0022031 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/sessions/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0024301 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/sessions/apps.pyi 0000664 0000000 0000000 00000000200 15134010516 0023507 0 ustar 00root root 0000000 0000000 from typing import Any
from django.apps import AppConfig
class SessionsConfig(AppConfig):
name: str
verbose_name: Any
django-stubs-5.2.9/django-stubs/contrib/sessions/backends/ 0000775 0000000 0000000 00000000000 15134010516 0023603 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/sessions/backends/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0026053 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/sessions/backends/base.pyi 0000664 0000000 0000000 00000007375 15134010516 0025254 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
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: ...
@property
def key_salt(self) -> str: ...
@overload
async def aget(self, key: str) -> Any | None: ...
@overload
async def aget(self, key: str, default: Any) -> Any: ...
@overload
async def apop(self, key: str) -> Any: ...
@overload
async def apop(self, key: str, default: Any) -> Any: ...
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
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]: ...
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: ...
django-stubs-5.2.9/django-stubs/contrib/sessions/backends/cache.pyi 0000664 0000000 0000000 00000000504 15134010516 0025370 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: ...
django-stubs-5.2.9/django-stubs/contrib/sessions/backends/cached_db.pyi 0000664 0000000 0000000 00000000565 15134010516 0026210 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: ...
django-stubs-5.2.9/django-stubs/contrib/sessions/backends/db.pyi 0000664 0000000 0000000 00000001261 15134010516 0024713 0 ustar 00root root 0000000 0000000 from typing import Any, Generic, TypeVar
from django.contrib.sessions.backends.base import SessionBase
from django.contrib.sessions.base_session import AbstractBaseSession
from django.utils.functional import cached_property
_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: ...
django-stubs-5.2.9/django-stubs/contrib/sessions/backends/file.pyi 0000664 0000000 0000000 00000000317 15134010516 0025246 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: ...
django-stubs-5.2.9/django-stubs/contrib/sessions/backends/signed_cookies.pyi 0000664 0000000 0000000 00000000251 15134010516 0027311 0 ustar 00root root 0000000 0000000 from django.contrib.sessions.backends.base import SessionBase
class SessionStore(SessionBase):
async def aexists(self, session_key: str | None = None) -> bool: ...
django-stubs-5.2.9/django-stubs/contrib/sessions/base_session.pyi 0000664 0000000 0000000 00000001460 15134010516 0025232 0 ustar 00root root 0000000 0000000 from datetime import datetime
from typing import Any, ClassVar, TypeVar
from django.contrib.sessions.backends.base import SessionBase
from django.db import models
from typing_extensions import Self
_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: datetime) -> _T: ...
class AbstractBaseSession(models.Model):
session_key = models.CharField(primary_key=True)
session_data = models.TextField()
expire_date = models.DateTimeField()
objects: ClassVar[BaseSessionManager[Self]]
@classmethod
def get_session_store_class(cls) -> type[SessionBase] | None: ...
def get_decoded(self) -> dict[str, Any]: ...
django-stubs-5.2.9/django-stubs/contrib/sessions/exceptions.pyi 0000664 0000000 0000000 00000000322 15134010516 0024732 0 ustar 00root root 0000000 0000000 from django.core.exceptions import BadRequest, SuspiciousOperation
class InvalidSessionKey(SuspiciousOperation): ...
class SuspiciousSession(SuspiciousOperation): ...
class SessionInterrupted(BadRequest): ...
django-stubs-5.2.9/django-stubs/contrib/sessions/management/ 0000775 0000000 0000000 00000000000 15134010516 0024145 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/sessions/management/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0026415 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/sessions/management/commands/ 0000775 0000000 0000000 00000000000 15134010516 0025746 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/sessions/management/commands/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0030216 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/sessions/management/commands/clearsessions.pyi 0000664 0000000 0000000 00000000233 15134010516 0031344 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.management.base import BaseCommand
class Command(BaseCommand):
def handle(self, **options: Any) -> None: ...
django-stubs-5.2.9/django-stubs/contrib/sessions/middleware.pyi 0000664 0000000 0000000 00000000677 15134010516 0024703 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: ...
django-stubs-5.2.9/django-stubs/contrib/sessions/migrations/ 0000775 0000000 0000000 00000000000 15134010516 0024205 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/sessions/migrations/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0026455 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/sessions/models.pyi 0000664 0000000 0000000 00000000363 15134010516 0024041 0 ustar 00root root 0000000 0000000 from typing import TypeVar
from django.contrib.sessions.base_session import AbstractBaseSession, BaseSessionManager
_T = TypeVar("_T", bound=Session)
class SessionManager(BaseSessionManager[_T]): ...
class Session(AbstractBaseSession): ...
django-stubs-5.2.9/django-stubs/contrib/sessions/serializers.pyi 0000664 0000000 0000000 00000000223 15134010516 0025105 0 ustar 00root root 0000000 0000000 from typing import TypeAlias
from django.core.signing import JSONSerializer as BaseJSONSerializer
JSONSerializer: TypeAlias = BaseJSONSerializer
django-stubs-5.2.9/django-stubs/contrib/sitemaps/ 0000775 0000000 0000000 00000000000 15134010516 0022010 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/sitemaps/__init__.pyi 0000664 0000000 0000000 00000003322 15134010516 0024272 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable, Mapping, Sequence
from datetime import datetime
from typing import Any, Generic, TypeVar
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
_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: ...
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: ...
def items(self) -> QuerySet[_ModelT]: ...
def lastmod(self, item: _ModelT) -> datetime | None: ...
def get_latest_lastmod(self) -> datetime | None: ...
django-stubs-5.2.9/django-stubs/contrib/sitemaps/apps.pyi 0000664 0000000 0000000 00000000200 15134010516 0023466 0 ustar 00root root 0000000 0000000 from typing import Any
from django.apps import AppConfig
class SiteMapsConfig(AppConfig):
name: str
verbose_name: Any
django-stubs-5.2.9/django-stubs/contrib/sitemaps/views.pyi 0000664 0000000 0000000 00000001266 15134010516 0023675 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import TypeVar
from django.contrib.sitemaps import Sitemap
from django.http.request import HttpRequest
from django.template.response import TemplateResponse
_C = TypeVar("_C", bound=Callable)
def x_robots_tag(func: _C) -> _C: ...
def index(
request: HttpRequest,
sitemaps: dict[str, type[Sitemap] | Sitemap],
template_name: str = ...,
content_type: str = ...,
sitemap_url_name: str = ...,
) -> TemplateResponse: ...
def sitemap(
request: HttpRequest,
sitemaps: dict[str, type[Sitemap] | Sitemap],
section: str | None = ...,
template_name: str = ...,
content_type: str = ...,
) -> TemplateResponse: ...
django-stubs-5.2.9/django-stubs/contrib/sites/ 0000775 0000000 0000000 00000000000 15134010516 0021312 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/sites/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0023562 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/sites/admin.pyi 0000664 0000000 0000000 00000000236 15134010516 0023126 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar
from django.contrib import admin
class SiteAdmin(admin.ModelAdmin):
list_display: Any
search_fields: ClassVar[Any]
django-stubs-5.2.9/django-stubs/contrib/sites/apps.pyi 0000664 0000000 0000000 00000000105 15134010516 0022774 0 ustar 00root root 0000000 0000000 from django.apps import AppConfig
class SitesConfig(AppConfig): ...
django-stubs-5.2.9/django-stubs/contrib/sites/checks.pyi 0000664 0000000 0000000 00000000363 15134010516 0023277 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 Error
def check_site_id(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[Error]: ...
django-stubs-5.2.9/django-stubs/contrib/sites/management.pyi 0000664 0000000 0000000 00000000446 15134010516 0024155 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: ...
django-stubs-5.2.9/django-stubs/contrib/sites/managers.pyi 0000664 0000000 0000000 00000000323 15134010516 0023630 0 ustar 00root root 0000000 0000000 from typing import TypeVar
from django.db import models
_T = TypeVar("_T", bound=models.Model)
class CurrentSiteManager(models.Manager[_T]):
def __init__(self, field_name: str | None = None) -> None: ...
django-stubs-5.2.9/django-stubs/contrib/sites/middleware.pyi 0000664 0000000 0000000 00000000321 15134010516 0024146 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: ...
django-stubs-5.2.9/django-stubs/contrib/sites/migrations/ 0000775 0000000 0000000 00000000000 15134010516 0023466 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/sites/migrations/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0025736 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/sites/models.pyi 0000664 0000000 0000000 00000001135 15134010516 0023320 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar
from django.db import models
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(max_length=100)
name = models.CharField(max_length=50)
def natural_key(self) -> tuple[str]: ...
def clear_site_cache(sender: type[Site], **kwargs: Any) -> None: ...
django-stubs-5.2.9/django-stubs/contrib/sites/requests.pyi 0000664 0000000 0000000 00000000573 15134010516 0023715 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: ...
django-stubs-5.2.9/django-stubs/contrib/sites/shortcuts.pyi 0000664 0000000 0000000 00000000335 15134010516 0024074 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: ...
django-stubs-5.2.9/django-stubs/contrib/staticfiles/ 0000775 0000000 0000000 00000000000 15134010516 0022475 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/staticfiles/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0024745 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/staticfiles/apps.pyi 0000664 0000000 0000000 00000000170 15134010516 0024161 0 ustar 00root root 0000000 0000000 from typing import Any
from django.apps import AppConfig
class StaticFilesConfig(AppConfig):
ignore_patterns: Any
django-stubs-5.2.9/django-stubs/contrib/staticfiles/checks.pyi 0000664 0000000 0000000 00000000611 15134010516 0024456 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
E005: Error
def check_finders(app_configs: Sequence[AppConfig] | None = None, **kwargs: Any) -> list[CheckMessage]: ...
def check_storages(app_configs: Sequence[AppConfig] | None = None, **kwargs: Any) -> list[CheckMessage]: ...
django-stubs-5.2.9/django-stubs/contrib/staticfiles/finders.pyi 0000664 0000000 0000000 00000005000 15134010516 0024645 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
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: ...
@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 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: ...
@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 BaseStorageFinder(BaseFinder):
storage: Storage
def __init__(self, storage: Storage | None = None, *args: Any, **kwargs: Any) -> None: ...
@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 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: ...
django-stubs-5.2.9/django-stubs/contrib/staticfiles/handlers.pyi 0000664 0000000 0000000 00000003427 15134010516 0025026 0 ustar 00root root 0000000 0000000 import sys
from collections.abc import Awaitable, Callable, Mapping
from typing import Any
from urllib.parse import ParseResult
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, HttpResponseBase
if sys.version_info >= (3, 11):
from wsgiref.types import StartResponse, WSGIEnvironment
else:
from _typeshed.wsgi import StartResponse, WSGIEnvironment
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) -> 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: ...
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: ...
async def __call__(
self,
scope: dict[str, Any],
receive: Callable[[], Awaitable[Mapping[str, Any]]],
send: Callable[[Mapping[str, Any]], Awaitable[None]],
) -> None: ...
django-stubs-5.2.9/django-stubs/contrib/staticfiles/management/ 0000775 0000000 0000000 00000000000 15134010516 0024611 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/staticfiles/management/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0027061 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/staticfiles/management/commands/ 0000775 0000000 0000000 00000000000 15134010516 0026412 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/staticfiles/management/commands/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0030662 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/staticfiles/management/commands/collectstatic.pyi 0000664 0000000 0000000 00000002220 15134010516 0031766 0 ustar 00root root 0000000 0000000 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
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]]: ...
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: ...
django-stubs-5.2.9/django-stubs/contrib/staticfiles/management/commands/findstatic.pyi 0000664 0000000 0000000 00000000316 15134010516 0031265 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.management.base import LabelCommand
class Command(LabelCommand):
def handle_label(self, path: str, **options: Any) -> str | None: ... # type: ignore[override]
django-stubs-5.2.9/django-stubs/contrib/staticfiles/management/commands/runserver.pyi 0000664 0000000 0000000 00000000170 15134010516 0031166 0 ustar 00root root 0000000 0000000 from django.core.management.commands.runserver import Command as RunserverCommand
class Command(RunserverCommand): ...
django-stubs-5.2.9/django-stubs/contrib/staticfiles/storage.pyi 0000664 0000000 0000000 00000004441 15134010516 0024667 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterator
from re import Match
from typing import Any, TypeAlias
from django.core.files.base import File
from django.core.files.storage import FileSystemStorage, Storage
from django.utils._os import _PathCompatible
from django.utils.functional import LazyObject
_PostProcessT: TypeAlias = Iterator[tuple[str, str, bool] | tuple[str, None, RuntimeError]]
class StaticFilesStorage(FileSystemStorage):
def __init__(
self, location: _PathCompatible | None = None, base_url: str | None = None, *args: Any, **kwargs: Any
) -> None: ...
def path(self, name: _PathCompatible) -> 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 | None = None) -> str | None: ...
def hashed_name(self, name: str, content: File | None = None, filename: str | None = None) -> str: ...
def url(self, name: str, force: bool = False) -> str: ...
def url_converter(
self, name: str, hashed_files: dict[str, Any], template: str | None = None
) -> Callable[[Match], 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: ...
def post_process(self, *args: Any, **kwargs: Any) -> _PostProcessT: ...
def stored_name(self, name: str) -> str: ...
class ManifestStaticFilesStorage(ManifestFilesMixin, StaticFilesStorage): ... # type: ignore[misc]
class ConfiguredStorage(LazyObject): ...
staticfiles_storage: Storage
django-stubs-5.2.9/django-stubs/contrib/staticfiles/testing.pyi 0000664 0000000 0000000 00000000144 15134010516 0024674 0 ustar 00root root 0000000 0000000 from django.test import LiveServerTestCase
class StaticLiveServerTestCase(LiveServerTestCase): ...
django-stubs-5.2.9/django-stubs/contrib/staticfiles/urls.pyi 0000664 0000000 0000000 00000000230 15134010516 0024200 0 ustar 00root root 0000000 0000000 from django.urls import URLPattern, _AnyURL
urlpatterns: list[_AnyURL]
def staticfiles_urlpatterns(prefix: str | None = ...) -> list[URLPattern]: ...
django-stubs-5.2.9/django-stubs/contrib/staticfiles/utils.pyi 0000664 0000000 0000000 00000000532 15134010516 0024360 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: ...
django-stubs-5.2.9/django-stubs/contrib/staticfiles/views.pyi 0000664 0000000 0000000 00000000330 15134010516 0024351 0 ustar 00root root 0000000 0000000 from typing import Any
from django.http.request import HttpRequest
from django.http.response import FileResponse
def serve(request: HttpRequest, path: str, insecure: bool = ..., **kwargs: Any) -> FileResponse: ...
django-stubs-5.2.9/django-stubs/contrib/syndication/ 0000775 0000000 0000000 00000000000 15134010516 0022507 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/syndication/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0024757 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/contrib/syndication/apps.pyi 0000664 0000000 0000000 00000000203 15134010516 0024170 0 ustar 00root root 0000000 0000000 from typing import Any
from django.apps import AppConfig
class SyndicationConfig(AppConfig):
name: str
verbose_name: Any
django-stubs-5.2.9/django-stubs/contrib/syndication/views.pyi 0000664 0000000 0000000 00000003541 15134010516 0024372 0 ustar 00root root 0000000 0000000 from typing import Any, Generic, TypeVar
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
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]: ...
django-stubs-5.2.9/django-stubs/core/ 0000775 0000000 0000000 00000000000 15134010516 0017453 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/core/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0021723 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/core/asgi.pyi 0000664 0000000 0000000 00000000142 15134010516 0021116 0 ustar 00root root 0000000 0000000 from django.core.handlers.asgi import ASGIHandler
def get_asgi_application() -> ASGIHandler: ...
django-stubs-5.2.9/django-stubs/core/cache/ 0000775 0000000 0000000 00000000000 15134010516 0020516 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/core/cache/__init__.pyi 0000664 0000000 0000000 00000001705 15134010516 0023003 0 ustar 00root root 0000000 0000000 from typing import Any
from django.utils.connection import BaseConnectionHandler
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]
def create_connection(self, alias: str) -> BaseCache: ...
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",
]
django-stubs-5.2.9/django-stubs/core/cache/backends/ 0000775 0000000 0000000 00000000000 15134010516 0022270 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/core/cache/backends/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0024540 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/core/cache/backends/base.pyi 0000664 0000000 0000000 00000010150 15134010516 0023722 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 | str | None) -> Callable: ...
class BaseCache:
_missing_key: object
default_timeout: float | None
_max_entries: int
_cull_frequency: int
key_prefix: str
version: int
key_func: Callable
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]: ...
django-stubs-5.2.9/django-stubs/core/cache/backends/db.pyi 0000664 0000000 0000000 00000001172 15134010516 0023401 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]
django-stubs-5.2.9/django-stubs/core/cache/backends/dummy.pyi 0000664 0000000 0000000 00000000266 15134010516 0024152 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: ...
django-stubs-5.2.9/django-stubs/core/cache/backends/filebased.pyi 0000664 0000000 0000000 00000000403 15134010516 0024726 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: ...
django-stubs-5.2.9/django-stubs/core/cache/backends/locmem.pyi 0000664 0000000 0000000 00000000342 15134010516 0024266 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: ...
django-stubs-5.2.9/django-stubs/core/cache/backends/memcached.pyi 0000664 0000000 0000000 00000001410 15134010516 0024715 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
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
def client_servers(self) -> list[str]: ...
class PyMemcacheCache(BaseMemcachedCache):
def __init__(self, server: str | Sequence[str], params: dict[str, Any]) -> None: ...
django-stubs-5.2.9/django-stubs/core/cache/backends/redis.pyi 0000664 0000000 0000000 00000004333 15134010516 0024124 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 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: ...
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: ...
django-stubs-5.2.9/django-stubs/core/cache/utils.pyi 0000664 0000000 0000000 00000000307 15134010516 0022401 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: ...
django-stubs-5.2.9/django-stubs/core/checks/ 0000775 0000000 0000000 00000000000 15134010516 0020713 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/core/checks/__init__.pyi 0000664 0000000 0000000 00000001571 15134010516 0023201 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",
]
django-stubs-5.2.9/django-stubs/core/checks/async_checks.pyi 0000664 0000000 0000000 00000000405 15134010516 0024072 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 Error
E001: Error
def check_async_unsafe(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[Error]: ...
django-stubs-5.2.9/django-stubs/core/checks/caches.pyi 0000664 0000000 0000000 00000001005 15134010516 0022660 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 Error, Warning
E001: Error
def check_default_cache_is_configured(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[Error]: ...
def check_cache_location_not_exposed(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[Warning]: ...
def check_file_based_cache_is_absolute(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[Warning]: ...
django-stubs-5.2.9/django-stubs/core/checks/compatibility/ 0000775 0000000 0000000 00000000000 15134010516 0023564 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/core/checks/compatibility/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0026034 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/core/checks/compatibility/django_4_0.pyi 0000664 0000000 0000000 00000000400 15134010516 0026205 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 Error
def check_csrf_trusted_origins(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[Error]: ...
django-stubs-5.2.9/django-stubs/core/checks/database.pyi 0000664 0000000 0000000 00000000330 15134010516 0023176 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable
from typing import Any
from django.core.checks import CheckMessage
def check_database_backends(databases: Iterable[str] | None = None, **kwargs: Any) -> list[CheckMessage]: ...
django-stubs-5.2.9/django-stubs/core/checks/files.pyi 0000664 0000000 0000000 00000000410 15134010516 0022533 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 Error
def check_setting_file_upload_temp_dir(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[Error]: ...
django-stubs-5.2.9/django-stubs/core/checks/messages.pyi 0000664 0000000 0000000 00000002123 15134010516 0023243 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: ...
django-stubs-5.2.9/django-stubs/core/checks/model_checks.pyi 0000664 0000000 0000000 00000000577 15134010516 0024067 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_all_models(app_configs: Sequence[AppConfig] | None = None, **kwargs: Any) -> list[CheckMessage]: ...
def check_lazy_references(app_configs: Sequence[AppConfig] | None = None, **kwargs: Any) -> list[CheckMessage]: ...
django-stubs-5.2.9/django-stubs/core/checks/registry.pyi 0000664 0000000 0000000 00000003654 15134010516 0023316 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterable, Sequence
from typing import Any, Protocol, TypeVar, overload, type_check_only
from django.apps.config import AppConfig
from django.core.checks.messages import CheckMessage
class Tags:
admin: str
async_support: str
caches: str
compatibility: str
database: str
files: 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]
deployment_checks: set[_ProcessedCheckCallable]
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]: ...
registry: CheckRegistry = ...
register = registry.register
run_checks = registry.run_checks
tag_exists = registry.tag_exists
django-stubs-5.2.9/django-stubs/core/checks/security/ 0000775 0000000 0000000 00000000000 15134010516 0022562 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/core/checks/security/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0025032 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/core/checks/security/base.pyi 0000664 0000000 0000000 00000003757 15134010516 0024233 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 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
def check_security_middleware(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[Warning]: ...
def check_xframe_options_middleware(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[Warning]: ...
def check_sts(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[Warning]: ...
def check_sts_include_subdomains(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[Warning]: ...
def check_sts_preload(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[Warning]: ...
def check_content_type_nosniff(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[Warning]: ...
def check_ssl_redirect(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[Warning]: ...
def check_secret_key(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[Warning]: ...
def check_secret_key_fallbacks(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[Warning]: ...
def check_debug(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[Warning]: ...
def check_xframe_deny(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[Warning]: ...
def check_allowed_hosts(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[Warning]: ...
def check_referrer_policy(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[Warning | Error]: ...
def check_cross_origin_opener_policy(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[Error]: ...
django-stubs-5.2.9/django-stubs/core/checks/security/csrf.pyi 0000664 0000000 0000000 00000000766 15134010516 0024253 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 Error, Warning
W003: Warning
W016: Warning
def check_csrf_middleware(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[Warning]: ...
def check_csrf_cookie_secure(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[Warning]: ...
def check_csrf_failure_view(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[Error]: ...
django-stubs-5.2.9/django-stubs/core/checks/security/sessions.pyi 0000664 0000000 0000000 00000001071 15134010516 0025152 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 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: Any) -> list[Warning]: ...
def check_session_cookie_httponly(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[Warning]: ...
django-stubs-5.2.9/django-stubs/core/checks/templates.pyi 0000664 0000000 0000000 00000000403 15134010516 0023431 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_templates(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[CheckMessage]: ...
django-stubs-5.2.9/django-stubs/core/checks/translation.pyi 0000664 0000000 0000000 00000001141 15134010516 0023771 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from typing import Any
from django.apps.config import AppConfig
from . import Error
E001: Error
E002: Error
E003: Error
E004: Error
def check_setting_language_code(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[Error]: ...
def check_setting_languages(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[Error]: ...
def check_setting_languages_bidi(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[Error]: ...
def check_language_settings_consistent(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[Error]: ...
django-stubs-5.2.9/django-stubs/core/checks/urls.pyi 0000664 0000000 0000000 00000001432 15134010516 0022423 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, Warning
from django.urls import _AnyURL
def check_url_config(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[CheckMessage]: ...
def check_resolver(resolver: _AnyURL) -> list[CheckMessage]: ...
def check_url_namespaces_unique(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[Warning]: ...
def get_warning_for_invalid_pattern(pattern: Any) -> list[Error]: ...
def check_url_settings(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[Error]: ...
def E006(name: str) -> Error: ...
def check_custom_error_handlers(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[Error]: ...
django-stubs-5.2.9/django-stubs/core/exceptions.pyi 0000664 0000000 0000000 00000003662 15134010516 0022366 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 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): ...
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): ...
django-stubs-5.2.9/django-stubs/core/files/ 0000775 0000000 0000000 00000000000 15134010516 0020555 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/core/files/__init__.pyi 0000664 0000000 0000000 00000000104 15134010516 0023032 0 ustar 00root root 0000000 0000000 from django.core.files.base import File as File
__all__ = ["File"]
django-stubs-5.2.9/django-stubs/core/files/base.pyi 0000664 0000000 0000000 00000003556 15134010516 0022223 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterator
from types import TracebackType
from typing import IO, AnyStr, type_check_only
from django.core.files.utils import FileProxyMixin
from django.utils.functional import cached_property
from typing_extensions import Self
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: ...
def __iter__(self) -> Iterator[AnyStr]: ...
def __enter__(self) -> Self: ...
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: ...
def close(self) -> None: ...
@type_check_only
def __next__(self) -> AnyStr: ...
class ContentFile(File[AnyStr]):
file: IO[AnyStr]
def __init__(self, content: AnyStr, name: str | None = None) -> None: ...
def __bool__(self) -> bool: ...
def open(self, mode: str | None = None) -> Self: ... # type: ignore[override]
def close(self) -> None: ...
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: ...
django-stubs-5.2.9/django-stubs/core/files/images.pyi 0000664 0000000 0000000 00000000551 15134010516 0022546 0 ustar 00root root 0000000 0000000 from typing import IO
from django.core.files import File
from django.utils._os import _PathCompatible
class ImageFile(File[bytes]):
@property
def width(self) -> int: ...
@property
def height(self) -> int: ...
def get_image_dimensions(
file_or_path: _PathCompatible | IO[bytes], close: bool = False
) -> tuple[int | None, int | None]: ...
django-stubs-5.2.9/django-stubs/core/files/locks.pyi 0000664 0000000 0000000 00000000642 15134010516 0022415 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")
django-stubs-5.2.9/django-stubs/core/files/move.pyi 0000664 0000000 0000000 00000000244 15134010516 0022246 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"]
django-stubs-5.2.9/django-stubs/core/files/storage/ 0000775 0000000 0000000 00000000000 15134010516 0022221 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/core/files/storage/__init__.pyi 0000664 0000000 0000000 00000001110 15134010516 0024474 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): ...
storages: StorageHandler
# default_storage is actually an instance of DefaultStorage, but it proxies through to a Storage
default_storage: Storage
django-stubs-5.2.9/django-stubs/core/files/storage/base.pyi 0000664 0000000 0000000 00000002213 15134010516 0023654 0 ustar 00root root 0000000 0000000 from datetime import datetime
from typing import IO, Any
from django.core.files.base import File
from django.utils._os import _PathCompatible
class Storage:
def open(self, name: str, mode: str = "rb") -> File: ...
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: _PathCompatible) -> 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: ...
django-stubs-5.2.9/django-stubs/core/files/storage/filesystem.pyi 0000664 0000000 0000000 00000001730 15134010516 0025131 0 ustar 00root root 0000000 0000000 from django.utils._os import _PathCompatible
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):
# RemovedInDjango60Warning
OS_OPEN_FLAGS: int
def __init__(
self,
location: _PathCompatible | 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) -> _PathCompatible: ...
@cached_property
def location(self) -> _PathCompatible: ...
@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: ...
django-stubs-5.2.9/django-stubs/core/files/storage/handler.pyi 0000664 0000000 0000000 00000000776 15134010516 0024373 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: ...
django-stubs-5.2.9/django-stubs/core/files/storage/memory.pyi 0000664 0000000 0000000 00000001630 15134010516 0024254 0 ustar 00root root 0000000 0000000 from django.utils._os import _PathCompatible
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: _PathCompatible | 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) -> _PathCompatible: ...
@cached_property
def location(self) -> _PathCompatible: ...
@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",)
django-stubs-5.2.9/django-stubs/core/files/storage/mixins.pyi 0000664 0000000 0000000 00000000522 15134010516 0024252 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: ...
django-stubs-5.2.9/django-stubs/core/files/temp.pyi 0000664 0000000 0000000 00000000224 15134010516 0022243 0 ustar 00root root 0000000 0000000 import tempfile
NamedTemporaryFile = tempfile.NamedTemporaryFile
gettempdir = tempfile.gettempdir
__all__ = ("NamedTemporaryFile", "gettempdir")
django-stubs-5.2.9/django-stubs/core/files/uploadedfile.pyi 0000664 0000000 0000000 00000003217 15134010516 0023740 0 ustar 00root root 0000000 0000000 from typing import IO
from django.core.files.base import File
from typing_extensions import Self
class UploadedFile(File):
content_type: str | None
charset: str | None
content_type_extra: dict[str, bytes] | None
size: int | None # type: ignore[assignment]
name: str | None
def __init__(
self,
file: IO | 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):
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):
field_name: str | None
def __init__(
self,
file: IO,
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: ...
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",
)
django-stubs-5.2.9/django-stubs/core/files/uploadhandler.pyi 0000664 0000000 0000000 00000006162 15134010516 0024127 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
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]] | 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 | None: ...
def upload_complete(self) -> None: ...
def upload_interrupted(self) -> None: ...
class TemporaryFileUploadHandler(FileUploadHandler):
file: TemporaryUploadedFile
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: ...
def receive_data_chunk(self, raw_data: bytes, start: int) -> bytes | None: ...
def file_complete(self, file_size: int) -> UploadedFile | None: ...
def upload_interrupted(self) -> None: ...
class MemoryFileUploadHandler(FileUploadHandler):
activated: bool
file: IO[bytes]
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]] | None: ...
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: ...
def receive_data_chunk(self, raw_data: bytes, start: int) -> bytes | None: ...
def file_complete(self, file_size: int) -> UploadedFile | None: ...
def load_handler(path: str, *args: Any, **kwargs: Any) -> FileUploadHandler: ...
__all__ = [
"FileUploadHandler",
"MemoryFileUploadHandler",
"SkipFile",
"StopFutureHandlers",
"StopUpload",
"TemporaryFileUploadHandler",
"UploadFileException",
"load_handler",
]
django-stubs-5.2.9/django-stubs/core/files/utils.pyi 0000664 0000000 0000000 00000001342 15134010516 0022440 0 ustar 00root root 0000000 0000000 from collections.abc import Iterator
from typing import IO, Any, AnyStr, Generic
from django.utils._os import _PathCompatible
def validate_file_name(name: _PathCompatible, allow_relative_path: bool = False) -> _PathCompatible: ...
class FileProxyMixin(Generic[AnyStr]):
file: IO[AnyStr] | None
encoding: Any
fileno: Any
flush: Any
isatty: Any
newlines: Any
read: Any
readinto: Any
readline: Any
readlines: Any
seek: Any
tell: Any
truncate: Any
write: Any
writelines: Any
@property
def closed(self) -> bool: ...
def readable(self) -> bool: ...
def writable(self) -> bool: ...
def seekable(self) -> bool: ...
def __iter__(self) -> Iterator[AnyStr]: ...
django-stubs-5.2.9/django-stubs/core/handlers/ 0000775 0000000 0000000 00000000000 15134010516 0021253 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/core/handlers/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0023523 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/core/handlers/asgi.pyi 0000664 0000000 0000000 00000005020 15134010516 0022716 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, TypeVar
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
_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
def GET(self) -> _ImmutableQueryDict: ... # type: ignore[override]
POST: _ImmutableQueryDict
@property
def FILES(self) -> MultiValueDict[str, uploadedfile.UploadedFile]: ... # type: ignore[override]
@cached_property
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: Any
) -> HttpResponseBase: ...
async def send_response(self, response: HttpResponseBase, send: _SendCallback) -> None: ...
@classmethod
def chunk_bytes(cls, data: Sequence[_T]) -> Iterator[tuple[Sequence[_T], bool]]: ...
django-stubs-5.2.9/django-stubs/core/handlers/base.pyi 0000664 0000000 0000000 00000002511 15134010516 0022707 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: ...
django-stubs-5.2.9/django-stubs/core/handlers/exception.pyi 0000664 0000000 0000000 00000001403 15134010516 0023772 0 ustar 00root root 0000000 0000000 from collections.abc import Awaitable, Callable
from typing import Any
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: Any) -> HttpResponse: ...
django-stubs-5.2.9/django-stubs/core/handlers/wsgi.pyi 0000664 0000000 0000000 00000003347 15134010516 0022756 0 ustar 00root root 0000000 0000000 import sys
from io import BytesIO, IOBase
from typing import Any
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
if sys.version_info >= (3, 11):
from wsgiref.types import StartResponse, WSGIEnvironment
else:
from _typeshed.wsgi import StartResponse, WSGIEnvironment
class LimitedStream(IOBase):
limit: int
def __init__(self, stream: BytesIO, limit: int) -> None: ...
def read(self, size: int | None = ...) -> bytes: ...
def readline(self, size: int | None = ...) -> bytes: ...
class WSGIRequest(HttpRequest):
environ: WSGIEnvironment
def __init__(self, environ: WSGIEnvironment) -> None: ...
@cached_property
def GET(self) -> _ImmutableQueryDict: ... # type: ignore[override]
@cached_property
def COOKIES(self) -> dict[str, str]: ... # type: ignore[override]
@property
def FILES(self) -> MultiValueDict[str, uploadedfile.UploadedFile]: ... # 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: ...
django-stubs-5.2.9/django-stubs/core/mail/ 0000775 0000000 0000000 00000000000 15134010516 0020375 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/core/mail/__init__.pyi 0000664 0000000 0000000 00000004425 15134010516 0022664 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable, Sequence
from typing import Any
from django.utils.functional import _StrOrPromise
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
def get_connection(backend: str | None = None, fail_silently: bool = False, **kwds: Any) -> Any: ...
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: Any | None = None,
html_message: 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: Any | None = None,
) -> int: ...
def mail_admins(
subject: _StrOrPromise,
message: _StrOrPromise,
fail_silently: bool = False,
connection: Any | None = None,
html_message: str | None = None,
) -> None: ...
def mail_managers(
subject: _StrOrPromise,
message: _StrOrPromise,
fail_silently: bool = False,
connection: Any | None = None,
html_message: str | None = None,
) -> None: ...
outbox: list[EmailMessage | EmailMultiAlternatives]
__all__ = [
"DEFAULT_ATTACHMENT_MIME_TYPE",
"DNS_NAME",
"BadHeaderError",
"CachedDnsName",
"EmailAlternative",
"EmailAttachment",
"EmailMessage",
"EmailMultiAlternatives",
"SafeMIMEMultipart",
"SafeMIMEText",
"forbid_multi_line_headers",
"get_connection",
"mail_admins",
"mail_managers",
"make_msgid",
"send_mail",
"send_mass_mail",
]
django-stubs-5.2.9/django-stubs/core/mail/backends/ 0000775 0000000 0000000 00000000000 15134010516 0022147 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/core/mail/backends/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0024417 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/core/mail/backends/base.pyi 0000664 0000000 0000000 00000001240 15134010516 0023601 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from types import TracebackType
from typing import Any
from django.core.mail.message import EmailMessage
from typing_extensions import Self
class BaseEmailBackend:
fail_silently: bool
def __init__(self, fail_silently: bool = False, **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: ...
django-stubs-5.2.9/django-stubs/core/mail/backends/console.pyi 0000664 0000000 0000000 00000000457 15134010516 0024342 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: ...
django-stubs-5.2.9/django-stubs/core/mail/backends/dummy.pyi 0000664 0000000 0000000 00000000147 15134010516 0024027 0 ustar 00root root 0000000 0000000 from django.core.mail.backends.base import BaseEmailBackend
class EmailBackend(BaseEmailBackend): ...
django-stubs-5.2.9/django-stubs/core/mail/backends/filebased.pyi 0000664 0000000 0000000 00000000200 15134010516 0024600 0 ustar 00root root 0000000 0000000 from django.core.mail.backends.console import EmailBackend as ConsoleEmailBackend
class EmailBackend(ConsoleEmailBackend): ...
django-stubs-5.2.9/django-stubs/core/mail/backends/locmem.pyi 0000664 0000000 0000000 00000000147 15134010516 0024150 0 ustar 00root root 0000000 0000000 from django.core.mail.backends.base import BaseEmailBackend
class EmailBackend(BaseEmailBackend): ...
django-stubs-5.2.9/django-stubs/core/mail/backends/smtp.pyi 0000664 0000000 0000000 00000000706 15134010516 0023660 0 ustar 00root root 0000000 0000000 import smtplib
import threading
from _typeshed import StrOrBytesPath
from django.core.mail.backends.base import BaseEmailBackend
class EmailBackend(BaseEmailBackend):
host: str
port: int
username: str
password: str
use_tls: bool
use_ssl: bool
timeout: int | None
ssl_keyfile: StrOrBytesPath | None
ssl_certfile: StrOrBytesPath | None
connection: smtplib.SMTP_SSL | smtplib.SMTP | None
_lock: threading.RLock
django-stubs-5.2.9/django-stubs/core/mail/message.pyi 0000664 0000000 0000000 00000010644 15134010516 0022551 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
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.utils import make_msgid as make_msgid
from typing import Any, NamedTuple, TypeAlias, overload
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
mixed_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: Any
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,
cc: Sequence[str] | None = None,
reply_to: Sequence[str] | None = None,
) -> None: ...
def get_connection(self, fail_silently: bool = False) -> Any: ...
# TODO: when typeshed gets more types for email.Message, move it to MIMEMessage, now it has too many false-positives
def message(self) -> Any: ...
def recipients(self) -> list[str]: ...
def send(self, fail_silently: bool = False) -> 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):
alternative_subtype: str
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: ...
django-stubs-5.2.9/django-stubs/core/mail/utils.pyi 0000664 0000000 0000000 00000000137 15134010516 0022261 0 ustar 00root root 0000000 0000000 from typing import Any
class CachedDnsName:
def get_fqdn(self) -> str: ...
DNS_NAME: Any
django-stubs-5.2.9/django-stubs/core/management/ 0000775 0000000 0000000 00000000000 15134010516 0021567 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/core/management/__init__.pyi 0000664 0000000 0000000 00000001665 15134010516 0024061 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: ...
django-stubs-5.2.9/django-stubs/core/management/base.pyi 0000664 0000000 0000000 00000007537 15134010516 0023240 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
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: ...
def error(self, message: str) -> Any: ...
def handle_default_options(options: Namespace) -> None: ...
def no_translations(handle_func: Callable) -> Callable: ...
class DjangoHelpFormatter(HelpFormatter):
show_last: set[str]
def add_usage(self, usage: str | None, actions: Iterable[Any], *args: Any, **kwargs: Any) -> Any: ...
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: ...
def flush(self) -> None: ...
def isatty(self) -> bool: ...
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
def add_arguments(self, parser: CommandParser) -> None: ...
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
def add_arguments(self, parser: CommandParser) -> None: ...
def handle(self, *labels: str, **options: Any) -> str | None: ...
def handle_label(self, label: str, **options: Any) -> str | None: ...
django-stubs-5.2.9/django-stubs/core/management/color.pyi 0000664 0000000 0000000 00000002233 15134010516 0023430 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: ...
django-stubs-5.2.9/django-stubs/core/management/commands/ 0000775 0000000 0000000 00000000000 15134010516 0023370 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/core/management/commands/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0025640 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/core/management/commands/check.pyi 0000664 0000000 0000000 00000000263 15134010516 0025171 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.management.base import BaseCommand
class Command(BaseCommand):
def handle(self, *app_labels: list[str], **options: Any) -> None: ...
django-stubs-5.2.9/django-stubs/core/management/commands/compilemessages.pyi 0000664 0000000 0000000 00000000773 15134010516 0027302 0 ustar 00root root 0000000 0000000 from pathlib import Path
from typing import Any
from django.core.management.base import BaseCommand
from django.utils._os import _PathCompatible
def has_bom(fn: Path) -> bool: ...
def is_dir_writable(path: _PathCompatible) -> bool: ...
class Command(BaseCommand):
program: str
program_options: list[str]
verbosity: int
has_errors: bool
def handle(self, **options: Any) -> None: ...
def compile_messages(self, locations: list[tuple[_PathCompatible, _PathCompatible]]) -> None: ...
django-stubs-5.2.9/django-stubs/core/management/commands/createcachetable.pyi 0000664 0000000 0000000 00000000434 15134010516 0027353 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.management.base import BaseCommand
class Command(BaseCommand):
verbosity: int
def handle(self, *tablenames: list[str], **options: Any) -> None: ...
def create_table(self, database: str, tablename: str, dry_run: bool) -> None: ...
django-stubs-5.2.9/django-stubs/core/management/commands/dbshell.pyi 0000664 0000000 0000000 00000000233 15134010516 0025526 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.management.base import BaseCommand
class Command(BaseCommand):
def handle(self, **options: Any) -> None: ...
django-stubs-5.2.9/django-stubs/core/management/commands/diffsettings.pyi 0000664 0000000 0000000 00000001070 15134010516 0026602 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any
from django.core.management.base import BaseCommand
def module_to_dict(module: Any, omittable: Callable[[str], bool] = ...) -> dict[str, str]: ...
class Command(BaseCommand):
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]: ...
django-stubs-5.2.9/django-stubs/core/management/commands/dumpdata.pyi 0000664 0000000 0000000 00000000231 15134010516 0025706 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): ...
django-stubs-5.2.9/django-stubs/core/management/commands/flush.pyi 0000664 0000000 0000000 00000000334 15134010516 0025234 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.management.base import BaseCommand
from django.core.management.color import Style
class Command(BaseCommand):
style: Style
def handle(self, **options: Any) -> None: ...
django-stubs-5.2.9/django-stubs/core/management/commands/inspectdb.pyi 0000664 0000000 0000000 00000001660 15134010516 0026071 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
class Command(BaseCommand):
db_module: str
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]: ...
django-stubs-5.2.9/django-stubs/core/management/commands/loaddata.pyi 0000664 0000000 0000000 00000004376 15134010516 0025676 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
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: ...
def read(self) -> bytes: ... # type: ignore[override]
def humanize(dirname: str) -> str: ...
django-stubs-5.2.9/django-stubs/core/management/commands/makemessages.pyi 0000664 0000000 0000000 00000004420 15134010516 0026560 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
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_name: str
locale_dir: str
def __init__(self, dirpath: str, file_name: str, locale_dir: str | None) -> None: ...
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: ...
django-stubs-5.2.9/django-stubs/core/management/commands/makemigrations.pyi 0000664 0000000 0000000 00000001726 15134010516 0027133 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: ...
django-stubs-5.2.9/django-stubs/core/management/commands/migrate.pyi 0000664 0000000 0000000 00000001414 15134010516 0025543 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]: ...
django-stubs-5.2.9/django-stubs/core/management/commands/optimizemigration.pyi 0000664 0000000 0000000 00000000125 15134010516 0027663 0 ustar 00root root 0000000 0000000 from django.core.management.base import BaseCommand
class Command(BaseCommand): ...
django-stubs-5.2.9/django-stubs/core/management/commands/runserver.pyi 0000664 0000000 0000000 00000001151 15134010516 0026144 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: ...
django-stubs-5.2.9/django-stubs/core/management/commands/sendtestemail.pyi 0000664 0000000 0000000 00000000157 15134010516 0026757 0 ustar 00root root 0000000 0000000 from django.core.management.base import BaseCommand
class Command(BaseCommand):
missing_args_message: str
django-stubs-5.2.9/django-stubs/core/management/commands/shell.pyi 0000664 0000000 0000000 00000000672 15134010516 0025227 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.management import BaseCommand
class Command(BaseCommand):
shells: list[str]
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]: ...
django-stubs-5.2.9/django-stubs/core/management/commands/showmigrations.pyi 0000664 0000000 0000000 00000000565 15134010516 0027176 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: ...
django-stubs-5.2.9/django-stubs/core/management/commands/sqlflush.pyi 0000664 0000000 0000000 00000000270 15134010516 0025753 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.management.base import BaseCommand
class Command(BaseCommand):
output_transaction: bool
def handle(self, **options: Any) -> str: ...
django-stubs-5.2.9/django-stubs/core/management/commands/sqlmigrate.pyi 0000664 0000000 0000000 00000000313 15134010516 0026260 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.management.base import BaseCommand
class Command(BaseCommand):
output_transaction: bool
def execute(self, *args: Any, **options: Any) -> str | None: ...
django-stubs-5.2.9/django-stubs/core/management/commands/sqlsequencereset.pyi 0000664 0000000 0000000 00000000123 15134010516 0027502 0 ustar 00root root 0000000 0000000 from django.core.management.base import AppCommand
class Command(AppCommand): ...
django-stubs-5.2.9/django-stubs/core/management/commands/squashmigrations.pyi 0000664 0000000 0000000 00000000625 15134010516 0027517 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
class Command(BaseCommand):
verbosity: int
interactive: bool
def handle(self, **options: Any) -> None: ...
def find_migration(self, loader: MigrationLoader, app_label: str, name: str) -> Migration: ...
django-stubs-5.2.9/django-stubs/core/management/commands/startapp.pyi 0000664 0000000 0000000 00000000341 15134010516 0025747 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.management.templates import TemplateCommand
class Command(TemplateCommand):
missing_args_message: str
def handle(self, **options: Any) -> None: ... # type: ignore[override]
django-stubs-5.2.9/django-stubs/core/management/commands/startproject.pyi 0000664 0000000 0000000 00000000341 15134010516 0026635 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.management.templates import TemplateCommand
class Command(TemplateCommand):
missing_args_message: str
def handle(self, **options: Any) -> None: ... # type: ignore[override]
django-stubs-5.2.9/django-stubs/core/management/commands/test.pyi 0000664 0000000 0000000 00000000350 15134010516 0025070 0 ustar 00root root 0000000 0000000 from typing import Any
from django.core.management.base import BaseCommand
class Command(BaseCommand):
test_runner: Any
def run_from_argv(self, argv: Any) -> None: ...
def add_arguments(self, parser: Any) -> None: ...
django-stubs-5.2.9/django-stubs/core/management/commands/testserver.pyi 0000664 0000000 0000000 00000000125 15134010516 0026317 0 ustar 00root root 0000000 0000000 from django.core.management.base import BaseCommand
class Command(BaseCommand): ...
django-stubs-5.2.9/django-stubs/core/management/sql.pyi 0000664 0000000 0000000 00000000753 15134010516 0023116 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: ...
django-stubs-5.2.9/django-stubs/core/management/templates.pyi 0000664 0000000 0000000 00000002011 15134010516 0024302 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
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
def add_arguments(self, parser: ArgumentParser) -> None: ...
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: ...
django-stubs-5.2.9/django-stubs/core/management/utils.pyi 0000664 0000000 0000000 00000002075 15134010516 0023456 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: ...
django-stubs-5.2.9/django-stubs/core/paginator.pyi 0000664 0000000 0000000 00000004726 15134010516 0022173 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable, Iterator, Sequence, Sized
from typing import ClassVar, Generic, Protocol, TypeVar, overload, type_check_only
from django.db.models.fields import _ErrorMessagesDict
from django.utils.functional import _StrPromise, cached_property
class UnorderedObjectListWarning(RuntimeWarning): ...
class InvalidPage(Exception): ...
class PageNotAnInteger(InvalidPage): ...
class EmptyPage(InvalidPage): ...
_T = TypeVar("_T")
@type_check_only
class _SupportsPagination(Protocol[_T], Sized, Iterable):
@overload
def __getitem__(self, index: int, /) -> _T: ...
@overload
def __getitem__(self, index: slice, /) -> _SupportsPagination[_T]: ...
class Paginator(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: ...
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 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
def __getitem__(self, index: int) -> _T: ...
@overload
def __getitem__(self, index: slice) -> Sequence[_T]: ... # Avoid override error
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: ...
django-stubs-5.2.9/django-stubs/core/serializers/ 0000775 0000000 0000000 00000000000 15134010516 0022007 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/core/serializers/__init__.pyi 0000664 0000000 0000000 00000002254 15134010516 0024274 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 | 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]]: ...
django-stubs-5.2.9/django-stubs/core/serializers/base.pyi 0000664 0000000 0000000 00000006205 15134010516 0023447 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]
def __init__(
self,
obj: Model,
m2m_data: dict[str, Sequence[Any]] | None = None,
deferred_fields: dict[Field, 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, field_value: Iterable[Any], using: str | None, handle_forward_references: bool
) -> Sequence[Any] | object: ...
def deserialize_fk_value(
field: ForeignKey, field_value: Any, using: str | None, handle_forward_references: bool
) -> Any | object: ...
django-stubs-5.2.9/django-stubs/core/serializers/json.pyi 0000664 0000000 0000000 00000001232 15134010516 0023501 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
django-stubs-5.2.9/django-stubs/core/serializers/jsonl.pyi 0000664 0000000 0000000 00000000664 15134010516 0023665 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: ...
django-stubs-5.2.9/django-stubs/core/serializers/python.pyi 0000664 0000000 0000000 00000000772 15134010516 0024061 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: ...
django-stubs-5.2.9/django-stubs/core/serializers/pyyaml.pyi 0000664 0000000 0000000 00000001472 15134010516 0024051 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 yaml import CSafeDumper as SafeDumper
from yaml import MappingNode, ScalarNode
class DjangoSafeDumper(SafeDumper):
def represent_decimal(self, data: Any) -> ScalarNode: ...
def represent_ordered_dict(self, data: Any) -> MappingNode: ...
class Serializer(PythonSerializer):
internal_use_only: bool
def handle_field(self, obj: Any, field: Field) -> None: ...
def end_serialization(self) -> None: ...
def getvalue(self) -> Any: ...
class Deserializer(PythonDeserializer):
def __init__(self, stream_or_string: bytes | str | IO[bytes] | IO[str], **options: Any) -> None: ...
django-stubs-5.2.9/django-stubs/core/serializers/xml_serializer.pyi 0000664 0000000 0000000 00000004640 15134010516 0025567 0 ustar 00root root 0000000 0000000 from contextlib import AbstractContextManager
from typing import IO, Any
from xml.sax.expatreader import ExpatParser
from django.core.serializers import base
def fast_cache_clearing() -> AbstractContextManager[None]: ...
class Serializer(base.Serializer):
def indent(self, level: int) -> None: ...
xml: 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: ...
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: ...
def __next__(self) -> base.DeserializedObject: ...
def getInnerText(node: Any) -> str: ...
def getInnerTextList(node: Any) -> list[str]: ...
class DefusedExpatParser(ExpatParser):
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
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: ...
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: ...
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: ...
django-stubs-5.2.9/django-stubs/core/servers/ 0000775 0000000 0000000 00000000000 15134010516 0021144 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/core/servers/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0023414 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/core/servers/basehttp.pyi 0000664 0000000 0000000 00000002776 15134010516 0023515 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
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: ...
def handle_error(self, request: Any, client_address: Any) -> None: ...
class ThreadedWSGIServer(socketserver.ThreadingMixIn, WSGIServer): ...
class ServerHandler(simple_server.ServerHandler):
def handle_error(self) -> None: ...
class WSGIRequestHandler(simple_server.WSGIRequestHandler):
close_connection: bool
connection: WSGIRequest
request: WSGIRequest
rfile: BytesIO
wfile: BytesIO
protocol_version: str
def address_string(self) -> str: ...
def log_message(self, format: str, *args: Any) -> None: ...
def get_environ(self) -> dict[str, str]: ...
raw_requestline: bytes
requestline: str
request_version: str
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")
django-stubs-5.2.9/django-stubs/core/signals.pyi 0000664 0000000 0000000 00000000213 15134010516 0021632 0 ustar 00root root 0000000 0000000 from django.dispatch import Signal
request_started: Signal
request_finished: Signal
got_request_exception: Signal
setting_changed: Signal
django-stubs-5.2.9/django-stubs/core/signing.pyi 0000664 0000000 0000000 00000004365 15134010516 0021644 0 ustar 00root root 0000000 0000000 from datetime import timedelta
from typing import Any, Protocol, type_check_only
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 = "sha1") -> 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: ...
def sign(self, value: str) -> str: ...
def unsign(self, value: str, max_age: int | timedelta | None = None) -> str: ...
django-stubs-5.2.9/django-stubs/core/validators.pyi 0000664 0000000 0000000 00000011760 15134010516 0022353 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
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: ...
def __call__(self, value: Any) -> None: ...
validate_domain_name: DomainNameValidator
class URLValidator(RegexValidator):
ul: str
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: ...
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: ...
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: ...
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):
def clean(self, x: Sized) -> int: ...
class MaxLengthValidator(BaseValidator):
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: ...
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) -> None: ...
def get_available_image_extensions() -> Sequence[str]: ...
def validate_image_file_extension(value: File) -> 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: ...
django-stubs-5.2.9/django-stubs/core/wsgi.pyi 0000664 0000000 0000000 00000000142 15134010516 0021144 0 ustar 00root root 0000000 0000000 from django.core.handlers.wsgi import WSGIHandler
def get_wsgi_application() -> WSGIHandler: ...
django-stubs-5.2.9/django-stubs/db/ 0000775 0000000 0000000 00000000000 15134010516 0017110 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/db/__init__.pyi 0000664 0000000 0000000 00000002572 15134010516 0021400 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",
]
django-stubs-5.2.9/django-stubs/db/backends/ 0000775 0000000 0000000 00000000000 15134010516 0020662 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/db/backends/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0023132 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/db/backends/base/ 0000775 0000000 0000000 00000000000 15134010516 0021574 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/db/backends/base/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0024044 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/db/backends/base/base.pyi 0000664 0000000 0000000 00000012522 15134010516 0023233 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, MutableMapping
from contextlib import AbstractContextManager
from datetime import tzinfo
from logging import Logger
from typing import Any, 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.utils.functional import cached_property
from typing_extensions import Self
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: Any
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
operators: MutableMapping[str, str]
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: Any | 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: Any | 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: ...
@property
def wrap_database_errors(self) -> Any: ...
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: ...
django-stubs-5.2.9/django-stubs/db/backends/base/client.pyi 0000664 0000000 0000000 00000001053 15134010516 0023574 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: ...
@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: ...
django-stubs-5.2.9/django-stubs/db/backends/base/creation.pyi 0000664 0000000 0000000 00000002452 15134010516 0024126 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.base.base import BaseDatabaseWrapper
TEST_DATABASE_PREFIX: str
class BaseDatabaseCreation:
connection: BaseDatabaseWrapper
def __init__(self, connection: BaseDatabaseWrapper) -> None: ...
def log(self, msg: str) -> None: ...
def create_test_db(
self, verbosity: int = 1, autoclobber: bool = False, serialize: bool = True, 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: ...
django-stubs-5.2.9/django-stubs/db/backends/base/features.pyi 0000664 0000000 0000000 00000013733 15134010516 0024144 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
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_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_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
create_test_table_with_composite_primary_key: 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_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_logical_xor: bool
prohibits_null_characters_in_text_exception: tuple[ValueError | DataError] | None
supports_unlimited_charfield: 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]]
connection: BaseDatabaseWrapper
def __init__(self, connection: BaseDatabaseWrapper) -> 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: ...
django-stubs-5.2.9/django-stubs/db/backends/base/introspection.pyi 0000664 0000000 0000000 00000003542 15134010516 0025223 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable
from typing import Any, NamedTuple
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.backends.utils import CursorWrapper
from django.db.models.base import Model
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
class BaseDatabaseIntrospection:
data_types_reverse: Any
connection: BaseDatabaseWrapper
def __init__(self, connection: BaseDatabaseWrapper) -> 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 | None) -> Any: ...
def get_table_description(self, cursor: CursorWrapper | None, table_name: str) -> 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 | None, table_name: str, table_fields: Any = ()) -> Any: ...
def get_relations(self, cursor: CursorWrapper | None, table_name: str) -> dict[str, tuple[str, str]]: ...
def get_primary_key_column(self, cursor: CursorWrapper | None, table_name: str) -> str | None: ...
def get_primary_key_columns(self, cursor: CursorWrapper | None, table_name: str) -> list[str] | None: ...
def get_constraints(self, cursor: CursorWrapper | None, table_name: str) -> Any: ...
django-stubs-5.2.9/django-stubs/db/backends/base/operations.pyi 0000664 0000000 0000000 00000016660 15134010516 0024513 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
from typing_extensions import deprecated
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 autoinc_sql(self, table: str, column: str) -> str | None: ...
def bulk_batch_size(self, fields: Any, objs: Any) -> int: ...
def cache_key_culling_sql(self) -> str: ...
def unification_cast_sql(self, output_field: Field) -> 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 fetch_returned_insert_columns(self, cursor: Any, returning_params: Any) -> Any: ...
@deprecated("field_cast_sql() is deprecated and will be removed in Django 6.0. Use lookup_cast() instead.")
def field_cast_sql(self, db_type: str | None, internal_type: str) -> 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 bulk_insert_sql(self, fields: Iterable[Field], 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 return_insert_columns(self, fields: Any) -> 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: Any, 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 | None, 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_datefield_value(self, value: date | None) -> str | None: ...
def adapt_datetimefield_value(self, value: real_datetime | None) -> str | 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 adapt_integerfield_value(self, value: Any, internal_type: Any) -> Any: ...
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 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) -> 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 format_for_duration_arithmetic(self, sql: str) -> str: ...
def prepare_join_on_clause(
self, lhs_table: str, lhs_field: Field, rhs_table: str, rhs_field: Field
) -> tuple[Col, Col]: ...
django-stubs-5.2.9/django-stubs/db/backends/base/schema.pyi 0000664 0000000 0000000 00000010661 15134010516 0023563 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
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 Self
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_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
def __enter__(self) -> Self: ...
def __exit__(
self,
exc_type: type[BaseException] | None,
exc_value: BaseException | None,
exc_tb: 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, include_default: bool = False
) -> tuple[None, None] | tuple[str, list[Any]]: ...
def skip_default(self, field: Field) -> bool: ...
def skip_default_on_alter(self, field: Field) -> bool: ...
def prepare_default(self, value: Any) -> Any: ...
def db_default_sql(self, field: Field) -> _AsSqlType: ...
def effective_default(self, field: Field) -> 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) -> None: ...
def remove_field(self, model: type[Model], field: Field) -> None: ...
def alter_field(self, model: type[Model], old_field: Field, new_field: Field, strict: bool = False) -> None: ...
def remove_procedure(self, procedure_name: Any, param_types: Any = ()) -> None: ...
django-stubs-5.2.9/django-stubs/db/backends/base/validation.pyi 0000664 0000000 0000000 00000000714 15134010516 0024453 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 check(self, **kwargs: Any) -> list[CheckMessage]: ...
def check_field(self, field: Field, **kwargs: Any) -> list[CheckMessage]: ...
django-stubs-5.2.9/django-stubs/db/backends/ddl_references.pyi 0000664 0000000 0000000 00000006470 15134010516 0024360 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from typing import Any, Protocol, type_check_only
@type_check_only
class _QuoteCallable(Protocol):
"""Get rid of `cannot assign to method`"""
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: ...
def references_index(self, table: Any, index: Any) -> bool: ...
def references_table(self, table: str) -> bool: ...
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: ...
def references_column(self, table: str, column: str) -> bool: ...
def rename_column_references(self, table: str, old_column: str, new_column: str) -> None: ...
class Columns(TableColumns):
columns: list[str]
table: str
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):
"""Get rid of `cannot assign to method`"""
def __call__(self, table: str, columns: list[str], suffix: str, /) -> str: ...
class IndexName(TableColumns):
columns: list[str]
table: str
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):
columns: list[str]
table: str
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: ...
def references_table(self, table: str) -> bool: ...
def references_column(self, table: str, column: str) -> bool: ...
def rename_table_references(self, old_table: str, new_table: str) -> None: ...
def rename_column_references(self, table: str, old_column: str, new_column: str) -> None: ...
class Statement(Reference):
template: str
parts: dict[str, Table]
def __init__(self, template: str, **parts: Any) -> None: ...
def references_table(self, table: str) -> bool: ...
def references_column(self, table: str, column: str) -> bool: ...
def references_index(self, table: Any, index: Any) -> bool: ...
def rename_table_references(self, old_table: str, new_table: str) -> None: ...
def rename_column_references(self, table: str, old_column: str, new_column: str) -> None: ...
django-stubs-5.2.9/django-stubs/db/backends/dummy/ 0000775 0000000 0000000 00000000000 15134010516 0022015 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/db/backends/dummy/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0024265 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/db/backends/dummy/base.pyi 0000664 0000000 0000000 00000001634 15134010516 0023456 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
django-stubs-5.2.9/django-stubs/db/backends/dummy/features.pyi 0000664 0000000 0000000 00000000260 15134010516 0024354 0 ustar 00root root 0000000 0000000 from django.db.backends.base.features import BaseDatabaseFeatures
class DummyDatabaseFeatures(BaseDatabaseFeatures):
supports_transactions: bool
uses_savepoints: bool
django-stubs-5.2.9/django-stubs/db/backends/mysql/ 0000775 0000000 0000000 00000000000 15134010516 0022027 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/db/backends/mysql/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0024277 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/db/backends/mysql/base.pyi 0000664 0000000 0000000 00000004673 15134010516 0023476 0 ustar 00root root 0000000 0000000 from collections.abc import Container, Iterator
from typing import Any, Literal
from django.db.backends.base.base import BaseDatabaseWrapper
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: Any
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
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: Any | None = ...) -> CursorWrapper: ...
def disable_constraint_checking(self) -> Literal[True]: ...
needs_rollback: Any
def enable_constraint_checking(self) -> None: ...
def check_constraints(self, table_names: Any | None = ...) -> None: ...
def is_usable(self) -> bool: ...
@property
def display_name(self) -> str: ... # type: ignore[override]
@property
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]: ...
django-stubs-5.2.9/django-stubs/db/backends/mysql/client.pyi 0000664 0000000 0000000 00000000731 15134010516 0024031 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
class DatabaseClient(BaseDatabaseClient):
connection: DatabaseWrapper
executable_name: str
@classmethod
def settings_to_cmd_args_env(
cls,
settings_dict: dict[str, Any],
parameters: Iterable[str],
) -> tuple[list[str], dict[str, str] | None]: ...
django-stubs-5.2.9/django-stubs/db/backends/mysql/compiler.pyi 0000664 0000000 0000000 00000001333 15134010516 0024364 0 ustar 00root root 0000000 0000000 from django.db.models.sql import compiler
from django.db.models.sql.compiler import _AsSqlType
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
def as_sql(self) -> _AsSqlType: ... # type: ignore[override]
class SQLUpdateCompiler(compiler.SQLUpdateCompiler, SQLCompiler): ...
class SQLAggregateCompiler(compiler.SQLAggregateCompiler, SQLCompiler): ...
__all__ = ["SQLAggregateCompiler", "SQLCompiler", "SQLDeleteCompiler", "SQLInsertCompiler", "SQLUpdateCompiler"]
django-stubs-5.2.9/django-stubs/db/backends/mysql/creation.pyi 0000664 0000000 0000000 00000000377 15134010516 0024365 0 ustar 00root root 0000000 0000000 from django.db.backends.base.creation import BaseDatabaseCreation
from django.db.backends.mysql.base import DatabaseWrapper
class DatabaseCreation(BaseDatabaseCreation):
connection: DatabaseWrapper
def sql_table_creation_suffix(self) -> str: ...
django-stubs-5.2.9/django-stubs/db/backends/mysql/features.pyi 0000664 0000000 0000000 00000007344 15134010516 0024400 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
class DatabaseFeatures(BaseDatabaseFeatures):
connection: DatabaseWrapper
empty_fetchmany_value: Any
allows_group_by_pk: bool
related_fields_match_type: bool
allow_sliced_subqueries_with_in: bool
has_select_for_update: bool
supports_forward_references: bool
supports_regex_backreferencing: bool
supports_date_lookup_using_string: bool
can_introspect_autofield: bool
can_introspect_binary_field: bool
can_introspect_duration_field: bool
can_introspect_small_integer_field: bool
can_introspect_positive_integer_field: bool
introspected_boolean_field_type: str
supports_timezones: bool
requires_explicit_null_ordering_when_grouping: bool
can_release_savepoints: bool
atomic_transactions: bool
can_clone_databases: bool
supports_temporal_subtraction: bool
supports_select_intersection: bool
supports_select_difference: bool
supports_slicing_ordering_in_compound: bool
supports_index_on_text_field: bool
has_case_insensitive_like: bool
create_test_procedure_without_params_sql: str
create_test_procedure_with_int_param_sql: str
db_functions_convert_bytes_to_str: bool
supports_partial_indexes: bool
supports_order_by_nulls_modifier: bool
order_by_nulls_first: bool
# fake properties (until `property` is generic)
supports_frame_range_fixed_distance: bool
supports_table_check_constraints: bool
can_return_rows_from_bulk_insert: bool
@cached_property
def allows_auto_pk_0(self) -> bool: ... # type: ignore[override]
@cached_property
def update_can_self_select(self) -> bool: ... # type: ignore[override]
@cached_property
def can_introspect_foreign_keys(self) -> bool: ... # type: ignore[override]
@cached_property
def introspected_field_types(self) -> dict[str, str]: ... # type: ignore[override]
@cached_property
def can_return_columns_from_insert(self) -> bool: ... # type: ignore[override]
@cached_property
def has_zoneinfo_database(self) -> bool: ... # type: ignore[override]
@cached_property
def is_sql_auto_is_null_enabled(self) -> bool: ...
@cached_property
def supports_over_clause(self) -> bool: ... # type: ignore[override]
@cached_property
def supports_column_check_constraints(self) -> bool: ... # type: ignore[override]
@cached_property
def can_introspect_check_constraints(self) -> bool: ... # type: ignore[override]
@cached_property
def has_select_for_update_skip_locked(self) -> bool: ... # type: ignore[override]
@cached_property
def has_select_for_update_nowait(self) -> bool: ... # type: ignore[override]
@cached_property
def has_select_for_update_of(self) -> bool: ... # type: ignore[override]
@cached_property
def supports_explain_analyze(self) -> bool: ...
@cached_property
def supported_explain_formats(self) -> set[str]: ... # type: ignore[override]
@cached_property
def supports_transactions(self) -> bool: ...
@cached_property
def ignores_table_name_case(self) -> bool: ... # type: ignore[override]
@cached_property
def supports_default_in_lead_lag(self) -> bool: ... # type: ignore[override]
@property
def supports_json_field(self) -> bool: ... # type: ignore[override]
@cached_property
def can_introspect_json_field(self) -> bool: ... # type: ignore[override]
@cached_property
def supports_index_column_ordering(self) -> bool: ... # type: ignore[override]
@cached_property
def supports_expression_indexes(self) -> bool: ... # type: ignore[override]
django-stubs-5.2.9/django-stubs/db/backends/mysql/introspection.pyi 0000664 0000000 0000000 00000000776 15134010516 0025464 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
FieldInfo: Any
class InfoLine(NamedTuple):
col_name: str
data_type: str
max_len: int
num_prec: int
num_scale: int
extra: str
column_default: str
collation: str | None
is_unsigned: bool
class DatabaseIntrospection(BaseDatabaseIntrospection):
connection: DatabaseWrapper
data_types_reverse: Any
django-stubs-5.2.9/django-stubs/db/backends/mysql/operations.pyi 0000664 0000000 0000000 00000005357 15134010516 0024747 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.base.operations import BaseDatabaseOperations
from django.db.backends.mysql.base import DatabaseWrapper
from django.db.models.constants import OnConflict
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
def date_extract_sql(self, lookup_type: str, sql: str, params: Any) -> tuple[str, Any]: ...
def date_trunc_sql(self, lookup_type: str, sql: str, params: Any, tzname: str | None = None) -> Any: ...
def datetime_cast_date_sql(self, sql: str, params: Any, tzname: str | None) -> Any: ...
def datetime_cast_time_sql(self, sql: str, params: Any, tzname: str | None) -> Any: ...
def datetime_extract_sql(self, lookup_type: str, sql: str, params: Any, tzname: str | None) -> Any: ...
def datetime_trunc_sql(self, lookup_type: str, sql: str, params: Any, tzname: str | None) -> Any: ...
def time_trunc_sql(self, lookup_type: str, sql: str, params: Any, tzname: str | None = None) -> Any: ...
def fetch_returned_insert_rows(self, cursor: Any) -> Any: ...
def format_for_duration_arithmetic(self, sql: Any) -> Any: ...
def force_no_ordering(self) -> Any: ...
def last_executed_query(self, cursor: Any, sql: Any, params: Any) -> Any: ...
def no_limit_value(self) -> Any: ...
def quote_name(self, name: str) -> Any: ...
def return_insert_columns(self, fields: Any) -> Any: ...
def sequence_reset_by_name_sql(self, style: Any, sequences: Any) -> Any: ...
def validate_autopk_value(self, value: Any) -> Any: ...
def adapt_datetimefield_value(self, value: Any) -> Any: ...
def adapt_timefield_value(self, value: Any) -> Any: ...
def max_name_length(self) -> Any: ...
def combine_expression(self, connector: Any, sub_expressions: Any) -> Any: ...
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: ...
def binary_placeholder_sql(self, value: Any) -> Any: ...
def subtract_temporals(self, internal_type: Any, lhs: Any, rhs: Any) -> Any: ...
def explain_query_prefix(self, format: Any | None = None, **options: Any) -> Any: ...
def regex_lookup(self, lookup_type: str) -> Any: ...
def insert_statement(self, on_conflict: OnConflict | None = None) -> str: ...
def lookup_cast(self, lookup_type: str, internal_type: Any | None = None) -> Any: ...
django-stubs-5.2.9/django-stubs/db/backends/mysql/schema.pyi 0000664 0000000 0000000 00000001744 15134010516 0024020 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
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
@property
def sql_delete_check(self) -> str: ... # type: ignore[override]
@property
def sql_rename_column(self) -> str: ... # type: ignore[override]
def quote_value(self, value: Any) -> str: ...
def skip_default(self, field: Field) -> bool: ...
def add_field(self, model: type[Model], field: Field) -> None: ...
django-stubs-5.2.9/django-stubs/db/backends/mysql/validation.pyi 0000664 0000000 0000000 00000000741 15134010516 0024706 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
class DatabaseValidation(BaseDatabaseValidation):
connection: DatabaseWrapper
def check(self, **kwargs: Any) -> list[CheckMessage]: ...
def check_field_type(self, field: Field, field_type: str) -> list[CheckMessage]: ...
django-stubs-5.2.9/django-stubs/db/backends/oracle/ 0000775 0000000 0000000 00000000000 15134010516 0022127 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/db/backends/oracle/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0024377 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/db/backends/oracle/base.pyi 0000664 0000000 0000000 00000005223 15134010516 0023566 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 .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
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
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: ...
def get_connection_params(self) -> Any: ...
def get_new_connection(self, conn_params: Any) -> Any: ...
pattern_ops: Any
def init_connection_state(self) -> None: ...
def create_cursor(self, name: Any | None = None) -> Any: ...
def check_constraints(self, table_names: Any | None = None) -> None: ...
def is_usable(self) -> Any: ...
@property
def oracle_version(self) -> Any: ...
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: ...
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]: ...
django-stubs-5.2.9/django-stubs/db/backends/oracle/client.pyi 0000664 0000000 0000000 00000001042 15134010516 0024125 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
class DatabaseClient(BaseDatabaseClient):
connection: DatabaseWrapper
executable_name: str
wrapper_name: str
@staticmethod
def connect_string(settings_dict: dict[str, Any]) -> str: ...
@classmethod
def settings_to_cmd_args_env(
cls, settings_dict: dict[str, Any], parameters: Iterable[str]
) -> tuple[list[str], None]: ...
django-stubs-5.2.9/django-stubs/db/backends/oracle/creation.pyi 0000664 0000000 0000000 00000000565 15134010516 0024464 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.base.creation import BaseDatabaseCreation
from django.db.backends.oracle.base import DatabaseWrapper
TEST_DATABASE_PREFIX: str
class DatabaseCreation(BaseDatabaseCreation):
connection: DatabaseWrapper
def set_as_test_mirror(self, primary_settings_dict: Any) -> None: ...
def test_db_signature(self) -> Any: ...
django-stubs-5.2.9/django-stubs/db/backends/oracle/features.pyi 0000664 0000000 0000000 00000003522 15134010516 0024472 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
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
can_introspect_autofield: 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
can_introspect_time_field: bool
atomic_transactions: bool
supports_combined_alters: bool
nulls_order_largest: bool
requires_literal_defaults: bool
closed_cursor_error_class: Any
bare_select_suffix: str
supports_select_for_update_with_limit: bool
supports_temporal_subtraction: bool
ignores_table_name_case: bool
supports_index_on_text_field: bool
has_case_insensitive_like: 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: Any
supports_partial_indexes: bool
supports_slicing_ordering_in_compound: bool
allows_multiple_constraints_on_same_fields: bool
supports_primitives_in_json_field: bool
supports_json_field_contains: bool
django-stubs-5.2.9/django-stubs/db/backends/oracle/functions.pyi 0000664 0000000 0000000 00000000620 15134010516 0024660 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: ...
django-stubs-5.2.9/django-stubs/db/backends/oracle/introspection.pyi 0000664 0000000 0000000 00000000537 15134010516 0025557 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.base.introspection import BaseDatabaseIntrospection
from django.db.backends.oracle.base import DatabaseWrapper
FieldInfo: Any
class DatabaseIntrospection(BaseDatabaseIntrospection):
connection: DatabaseWrapper
cache_bust_counter: int
@property
def data_types_reverse(self) -> Any: ...
django-stubs-5.2.9/django-stubs/db/backends/oracle/operations.pyi 0000664 0000000 0000000 00000007510 15134010516 0025040 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.base.operations import BaseDatabaseOperations
from django.db.backends.oracle.base import DatabaseWrapper
class DatabaseOperations(BaseDatabaseOperations):
connection: DatabaseWrapper
integer_field_ranges: Any
set_operators: Any
cast_char_field_without_max_length: str
cast_data_types: Any
def cache_key_culling_sql(self) -> str: ...
def date_extract_sql(self, lookup_type: str, sql: str, params: Any) -> tuple[str, Any]: ...
def date_trunc_sql(self, lookup_type: str, sql: str, params: Any, tzname: str | 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 = ...) -> str: ...
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: ...
def deferrable_sql(self) -> str: ...
def fetch_returned_insert_columns(self, cursor: Any, returning_params: Any) -> Any: ...
def field_cast_sql(self, db_type: Any, internal_type: Any) -> str: ...
def no_limit_value(self) -> str | None: ...
def limit_offset_sql(self, low_mark: Any, high_mark: Any) -> str: ...
def last_executed_query(self, cursor: Any, sql: Any, params: Any) -> str: ...
def last_insert_id(self, cursor: Any, table_name: Any, pk_name: Any) -> Any: ...
def lookup_cast(self, lookup_type: str, internal_type: Any | None = ...) -> str: ...
def max_in_list_size(self) -> int: ...
def max_name_length(self) -> int: ...
def pk_default_value(self) -> str: ...
def prep_for_iexact_query(self, x: Any) -> str: ...
def process_clob(self, value: Any) -> Any: ...
def quote_name(self, name: str) -> str: ...
def regex_lookup(self, lookup_type: str) -> str: ...
def return_insert_columns(self, fields: Any) -> Any: ...
def sequence_reset_by_name_sql(self, style: Any, sequences: Any) -> list[str]: ...
def sequence_reset_sql(self, style: Any, model_list: Any) -> list[str]: ...
def start_transaction_sql(self) -> str: ...
def tablespace_sql(self, tablespace: Any, inline: bool = ...) -> str: ...
def adapt_datefield_value(self, value: Any) -> Any: ...
def adapt_datetimefield_value(self, value: Any) -> Any: ...
def adapt_timefield_value(self, value: Any) -> Any: ...
def combine_expression(self, connector: Any, sub_expressions: Any) -> Any: ...
def subtract_temporals(self, internal_type: Any, lhs: Any, rhs: Any) -> Any: ...
def bulk_batch_size(self, fields: Any, objs: Any) -> int: ...
def conditional_expression_supported_in_where_clause(self, expression: Any) -> bool: ...
django-stubs-5.2.9/django-stubs/db/backends/oracle/schema.pyi 0000664 0000000 0000000 00000002016 15134010516 0024111 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
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
def quote_value(self, value: Any) -> str: ...
def remove_field(self, model: type[Model], field: Field) -> None: ...
def delete_model(self, model: type[Model]) -> None: ...
def alter_field(self, model: type[Model], old_field: Field, new_field: Field, strict: bool = False) -> None: ...
def normalize_name(self, name: Any) -> str: ...
def prepare_default(self, value: Any) -> Any: ...
django-stubs-5.2.9/django-stubs/db/backends/oracle/utils.pyi 0000664 0000000 0000000 00000000777 15134010516 0024025 0 ustar 00root root 0000000 0000000 import datetime
from typing import Any
class InsertVar:
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
CLOB: str
DATE: str
INTERVAL: str
NUMBER: str
TIMESTAMP: str
types: Any
django-stubs-5.2.9/django-stubs/db/backends/oracle/validation.pyi 0000664 0000000 0000000 00000000614 15134010516 0025005 0 ustar 00root root 0000000 0000000 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, field_type: str) -> list[CheckMessage]: ...
django-stubs-5.2.9/django-stubs/db/backends/postgresql/ 0000775 0000000 0000000 00000000000 15134010516 0023065 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/db/backends/postgresql/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0025335 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/db/backends/postgresql/base.pyi 0000664 0000000 0000000 00000002602 15134010516 0024522 0 ustar 00root root 0000000 0000000 from io import IOBase
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
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]
operators: dict[str, str]
pattern_esc: str
pattern_ops: dict[str, str]
# PostgreSQL backend-specific attributes.
_named_cursor_idx: int
@cached_property
def pg_version(self) -> int: ...
class CursorDebugWrapper(BaseCursorDebugWrapper):
def copy_expert(self, sql: _ExecuteQuery, file: IOBase, *args: Any) -> Any: ...
def copy_to(self, file: IOBase, table: str, *args: Any, **kwargs: Any) -> Any: ...
django-stubs-5.2.9/django-stubs/db/backends/postgresql/client.pyi 0000664 0000000 0000000 00000001014 15134010516 0025062 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
class DatabaseClient(BaseDatabaseClient):
connection: DatabaseWrapper
executable_name: str
@classmethod
def settings_to_cmd_args_env(
cls, settings_dict: dict[str, Any], parameters: Iterable[str]
) -> tuple[list[str], dict[str, str] | None]: ...
def runshell(self, parameters: Iterable[str]) -> None: ...
django-stubs-5.2.9/django-stubs/db/backends/postgresql/creation.pyi 0000664 0000000 0000000 00000000320 15134010516 0025407 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
django-stubs-5.2.9/django-stubs/db/backends/postgresql/features.pyi 0000664 0000000 0000000 00000004226 15134010516 0025432 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
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_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: Any
validates_explain_options: bool
supports_deferrable_unique_constraints: bool
has_json_operators: bool
json_key_contains_list_matching_requires_list: bool
@property
def is_postgresql_15(self) -> bool: ...
@cached_property
def is_postgresql_16(self) -> bool: ...
@property
def is_postgresql_17(self) -> bool: ...
has_brin_autosummarize: bool
has_websearch_to_tsquery: bool
supports_table_partitions: bool
supports_covering_indexes: bool
supports_covering_gist_indexes: bool
supports_non_deterministic_collations: bool
supports_alternate_collation_providers: bool
django-stubs-5.2.9/django-stubs/db/backends/postgresql/introspection.pyi 0000664 0000000 0000000 00000000460 15134010516 0026510 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.base.introspection import BaseDatabaseIntrospection
from django.db.backends.postgresql.base import DatabaseWrapper
class DatabaseIntrospection(BaseDatabaseIntrospection):
connection: DatabaseWrapper
data_types_reverse: Any
ignored_tables: Any
django-stubs-5.2.9/django-stubs/db/backends/postgresql/operations.pyi 0000664 0000000 0000000 00000000624 15134010516 0025775 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.base.operations import BaseDatabaseOperations
from django.db.backends.postgresql.base import DatabaseWrapper
class DatabaseOperations(BaseDatabaseOperations):
connection: DatabaseWrapper
explain_options: frozenset[str]
def compose_sql(self, sql: Any, params: Any) -> Any: ...
def fetch_returned_insert_rows(self, cursor: Any) -> Any: ...
django-stubs-5.2.9/django-stubs/db/backends/postgresql/schema.pyi 0000664 0000000 0000000 00000001624 15134010516 0025053 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
class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
connection: DatabaseWrapper
sql_create_sequence: str
sql_delete_sequence: str
sql_set_sequence_max: str
sql_set_sequence_owner: 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
def quote_value(self, value: Any) -> str: ...
def add_index(self, model: type[Model], index: Index, concurrently: bool = False) -> None: ...
def remove_index(self, model: type[Model], index: Index, concurrently: bool = False) -> None: ...
django-stubs-5.2.9/django-stubs/db/backends/signals.pyi 0000664 0000000 0000000 00000000077 15134010516 0023051 0 ustar 00root root 0000000 0000000 from django.dispatch import Signal
connection_created: Signal
django-stubs-5.2.9/django-stubs/db/backends/sqlite3/ 0000775 0000000 0000000 00000000000 15134010516 0022246 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/db/backends/sqlite3/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0024516 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/db/backends/sqlite3/base.pyi 0000664 0000000 0000000 00000001763 15134010516 0023712 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from sqlite3 import dbapi2 as Database
from typing import Any, TypeVar
from django.db.backends.base.base import BaseDatabaseWrapper
from .client import DatabaseClient
from .creation import DatabaseCreation
from .features import DatabaseFeatures
from .introspection import DatabaseIntrospection
from .operations import DatabaseOperations
_R = TypeVar("_R")
def decoder(conv_func: Callable[[str], _R]) -> Callable[[bytes], _R]: ...
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]
def is_in_memory_db(self) -> bool: ...
FORMAT_QMARK_REGEX: Any
class SQLiteCursorWrapper(Database.Cursor): ...
django-stubs-5.2.9/django-stubs/db/backends/sqlite3/client.pyi 0000664 0000000 0000000 00000000671 15134010516 0024253 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
class DatabaseClient(BaseDatabaseClient):
connection: DatabaseWrapper
executable_name: str
@classmethod
def settings_to_cmd_args_env(
cls, settings_dict: dict[str, Any], parameters: Iterable[str]
) -> tuple[list[str], None]: ...
django-stubs-5.2.9/django-stubs/db/backends/sqlite3/creation.pyi 0000664 0000000 0000000 00000000502 15134010516 0024572 0 ustar 00root root 0000000 0000000 from os import PathLike
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: str | PathLike[str]) -> bool: ...
django-stubs-5.2.9/django-stubs/db/backends/sqlite3/features.pyi 0000664 0000000 0000000 00000000315 15134010516 0024606 0 ustar 00root root 0000000 0000000 from django.db.backends.base.features import BaseDatabaseFeatures
from django.db.backends.sqlite3.base import DatabaseWrapper
class DatabaseFeatures(BaseDatabaseFeatures):
connection: DatabaseWrapper
django-stubs-5.2.9/django-stubs/db/backends/sqlite3/introspection.pyi 0000664 0000000 0000000 00000000660 15134010516 0025673 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.backends.base.introspection import BaseDatabaseIntrospection
from django.db.backends.sqlite3.base import DatabaseWrapper
field_size_re: Any
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
django-stubs-5.2.9/django-stubs/db/backends/sqlite3/operations.pyi 0000664 0000000 0000000 00000001624 15134010516 0025157 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any
from uuid import UUID
from django.db.backends.base.operations import BaseDatabaseOperations
class DatabaseOperations(BaseDatabaseOperations):
jsonfield_datatype_values: frozenset[str]
def convert_booleanfield_value(self, value: Any, expression: Any, connection: Any) -> Any: ...
def convert_datefield_value(self, value: Any, expression: Any, connection: Any) -> Any: ...
def convert_datetimefield_value(self, value: Any, expression: Any, connection: Any) -> Any | None: ...
def convert_timefield_value(self, value: Any, expression: Any, connection: Any) -> Any: ...
def convert_uuidfield_value(self, value: Any, expression: Any, connection: Any) -> UUID | None: ...
def fetch_returned_insert_rows(self, cursor: Any) -> Any: ...
def get_decimalfield_converter(
self,
expression: Any,
) -> Callable: ...
django-stubs-5.2.9/django-stubs/db/backends/sqlite3/schema.pyi 0000664 0000000 0000000 00000000327 15134010516 0024233 0 ustar 00root root 0000000 0000000 from django.db.backends.base.schema import BaseDatabaseSchemaEditor
from django.db.backends.sqlite3.base import DatabaseWrapper
class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
connection: DatabaseWrapper
django-stubs-5.2.9/django-stubs/db/backends/utils.pyi 0000664 0000000 0000000 00000005620 15134010516 0022550 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, TypeAlias, overload, type_check_only
from uuid import UUID
from typing_extensions import Self
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 = (
None
| bool
| int
| float
| Decimal
| str
| bytes
| datetime.date
| datetime.datetime
| UUID
| tuple[Any, ...]
| list[Any]
)
_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,
exc_type: type[BaseException] | None,
exc_value: BaseException | None,
exc_tb: 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):
cursor: Any
db: Any
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]: ...
@overload
def typecast_date(s: None | Literal[""]) -> None: ... # type: ignore[overload-overlap]
@overload
def typecast_date(s: str) -> datetime.date: ...
@overload
def typecast_time(s: None | Literal[""]) -> None: ... # type: ignore[overload-overlap]
@overload
def typecast_time(s: str) -> datetime.time: ...
@overload
def typecast_timestamp(s: None | Literal[""]) -> 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 format_number(value: Decimal | None, max_digits: int | None, decimal_places: int | None) -> str | None: ...
def strip_quotes(table_name: str) -> str: ...
django-stubs-5.2.9/django-stubs/db/migrations/ 0000775 0000000 0000000 00000000000 15134010516 0021264 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/db/migrations/__init__.pyi 0000664 0000000 0000000 00000000214 15134010516 0023543 0 ustar 00root root 0000000 0000000 from .migration import Migration as Migration
from .migration import swappable_dependency as swappable_dependency
from .operations import *
django-stubs-5.2.9/django-stubs/db/migrations/autodetector.pyi 0000664 0000000 0000000 00000006145 15134010516 0024517 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterable
from typing import Any
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
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]
) -> list[tuple[str, list[Any], dict[str, Callable | 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_renamed_indexes(self) -> None: ...
def create_altered_constraints(self) -> None: ...
def generate_added_constraints(self) -> None: ...
def generate_removed_constraints(self) -> None: ...
def generate_added_indexes(self) -> None: ...
def generate_removed_indexes(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: ...
django-stubs-5.2.9/django-stubs/db/migrations/exceptions.pyi 0000664 0000000 0000000 00000001231 15134010516 0024165 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): ...
django-stubs-5.2.9/django-stubs/db/migrations/executor.pyi 0000664 0000000 0000000 00000003371 15134010516 0023651 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, migration: Migration) -> 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]: ...
django-stubs-5.2.9/django-stubs/db/migrations/graph.pyi 0000664 0000000 0000000 00000004525 15134010516 0023116 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
class Node:
key: tuple[str, str]
children: set[Any]
parents: set[Any]
def __init__(self, key: tuple[str, str]) -> None: ...
def __eq__(self, other: object) -> bool: ...
def __lt__(self, other: tuple[str, str] | Node) -> bool: ...
def __getitem__(self, item: int) -> str: ...
def __hash__(self) -> int: ...
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]
cached: bool
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: None | tuple[str, str] | Sequence[tuple[str, str]] = None,
at_end: bool = True,
real_apps: list[str] | None = None,
) -> ProjectState: ...
def __contains__(self, node: tuple[str, str]) -> bool: ...
django-stubs-5.2.9/django-stubs/db/migrations/loader.pyi 0000664 0000000 0000000 00000003656 15134010516 0023267 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: Any
def build_graph(self) -> None: ...
def check_consistent_history(self, connection: BaseDatabaseWrapper) -> None: ...
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: ...
django-stubs-5.2.9/django-stubs/db/migrations/migration.pyi 0000664 0000000 0000000 00000002346 15134010516 0024005 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from typing import ClassVar
from django.db.backends.base.schema import BaseDatabaseSchemaEditor
from django.db.migrations.operations.base import Operation
from django.db.migrations.state import ProjectState
from typing_extensions import Self
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: ...
class SwappableTuple(tuple[str, str]):
setting: str
def __new__(cls, value: tuple[str, str], setting: str) -> Self: ...
def swappable_dependency(value: str) -> SwappableTuple: ...
django-stubs-5.2.9/django-stubs/db/migrations/operations/ 0000775 0000000 0000000 00000000000 15134010516 0023447 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/db/migrations/operations/__init__.pyi 0000664 0000000 0000000 00000003303 15134010516 0025730 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",
]
django-stubs-5.2.9/django-stubs/db/migrations/operations/base.pyi 0000664 0000000 0000000 00000003367 15134010516 0025115 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from enum import Enum
from typing import Any, ClassVar
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
from typing_extensions import Self
class OperationCategory(str, Enum):
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]: ...
django-stubs-5.2.9/django-stubs/db/migrations/operations/fields.pyi 0000664 0000000 0000000 00000002346 15134010516 0025445 0 ustar 00root root 0000000 0000000 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 | 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
preserve_default: bool
def __init__(self, model_name: str, name: str, field: Field, preserve_default: bool = True) -> None: ...
class RemoveField(FieldOperation): ...
class AlterField(FieldOperation):
field: Field
preserve_default: bool
def __init__(self, model_name: str, name: str, field: Field, 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: ...
django-stubs-5.2.9/django-stubs/db/migrations/operations/models.pyi 0000664 0000000 0000000 00000012333 15134010516 0025457 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
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]]
options: dict[str, Any]
bases: Sequence[type[Model] | str] | None
managers: Sequence[tuple[str, Manager]] | None
def __init__(
self,
name: str,
fields: list[tuple[str, Field]],
options: dict[str, Any] | None = None,
bases: Sequence[type[Any] | str] | None = None,
managers: Sequence[tuple[str, Manager]] | 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: ...
def state_forwards(self, app_label: str, state: Any) -> None: ...
def database_forwards(
self, app_label: str, schema_editor: BaseDatabaseSchemaEditor, from_state: Any, to_state: Any
) -> None: ...
def database_backwards(
self, app_label: str, schema_editor: BaseDatabaseSchemaEditor, from_state: Any, to_state: Any
) -> None: ...
def describe(self) -> str: ...
@property
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: ...
def state_forwards(self, app_label: str, state: Any) -> None: ...
def database_forwards(
self, app_label: str, schema_editor: BaseDatabaseSchemaEditor, from_state: Any, to_state: Any
) -> None: ...
def database_backwards(
self, app_label: str, schema_editor: BaseDatabaseSchemaEditor, from_state: Any, to_state: Any
) -> None: ...
def references_field(self, model_name: str, name: str, app_label: str) -> bool: ...
def describe(self) -> str: ...
@property
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]]
def __init__(self, name: str, managers: Sequence[tuple[str, Manager]]) -> 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):
def __init__(self, model_name: str, constraint: BaseConstraint) -> None: ...
class RemoveConstraint(IndexOperation):
def __init__(self, model_name: str, name: str) -> None: ...
class AlterConstraint(IndexOperation):
def __init__(self, model_name: str, name: str, constraint: BaseConstraint) -> None: ...
django-stubs-5.2.9/django-stubs/db/migrations/operations/special.pyi 0000664 0000000 0000000 00000003655 15134010516 0025623 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 .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
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
def reversible(self) -> bool: ... # type: ignore[override]
django-stubs-5.2.9/django-stubs/db/migrations/operations/utils.pyi 0000664 0000000 0000000 00000001672 15134010516 0025340 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
def resolve_relation(
model: str | type[Model], app_label: str | None = ..., model_name: str | None = ...
) -> tuple[str, str]: ...
class FieldReference(NamedTuple):
to: Any
through: Any
def field_references(
model_tuple: tuple[str, str],
field: Field,
reference_model_tuple: tuple[str, str],
reference_field_name: str | None = ...,
reference_field: Field | None = ...,
) -> Literal[False] | FieldReference: ...
def get_references(
state: ProjectState,
model_tuple: tuple[str, str],
field_tuple: tuple[()] | tuple[str, Field] = ...,
) -> Iterator[tuple[ModelState, str, Field, FieldReference]]: ...
def field_is_referenced(state: ProjectState, model_tuple: tuple[str, str], field_tuple: tuple[str, Field]) -> bool: ...
django-stubs-5.2.9/django-stubs/db/migrations/optimizer.pyi 0000664 0000000 0000000 00000000442 15134010516 0024031 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]: ...
django-stubs-5.2.9/django-stubs/db/migrations/questioner.pyi 0000664 0000000 0000000 00000002130 15134010516 0024201 0 ustar 00root root 0000000 0000000 from typing import Any
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) -> 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: ...
class InteractiveMigrationQuestioner(MigrationQuestioner): ...
class NonInteractiveMigrationQuestioner(MigrationQuestioner): ...
django-stubs-5.2.9/django-stubs/db/migrations/recorder.pyi 0000664 0000000 0000000 00000001567 15134010516 0023625 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar
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
from typing_extensions import Self
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: ...
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: ...
django-stubs-5.2.9/django-stubs/db/migrations/serializer.pyi 0000664 0000000 0000000 00000003642 15134010516 0024165 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 DeconstructableSerializer(BaseSerializer):
@staticmethod
def serialize_deconstructed(
path: str, args: list[Any], kwargs: dict[str, Callable | 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 IterableSerializer(BaseSerializer): ...
class ModelFieldSerializer(DeconstructableSerializer): ...
class ModelManagerSerializer(DeconstructableSerializer): ...
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): ...
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: ...
django-stubs-5.2.9/django-stubs/db/migrations/state.pyi 0000664 0000000 0000000 00000011551 15134010516 0023132 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
class AppConfigStub(AppConfig):
def __init__(self, label: str) -> None: ...
class ModelState:
name: str
app_label: str
fields: dict[str, Field]
options: dict[str, Any]
bases: Sequence[type[Model] | str]
managers: list[tuple[str, Manager]]
def __init__(
self,
app_label: str,
name: str,
fields: list[tuple[str, Field]] | dict[str, Field],
options: dict[str, Any] | None = None,
bases: Sequence[type[Model] | str] | None = None,
managers: list[tuple[str, Manager]] | None = None,
) -> None: ...
def clone(self) -> ModelState: ...
def construct_managers(self) -> Iterator[tuple[str, Manager]]: ...
@classmethod
def from_model(cls, model: type[Model], exclude_rels: bool = False) -> ModelState: ...
def get_field(self, field_name: str) -> Field: ...
@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: ...
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]]) -> 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 add_field(self, app_label: str, model_name: str, name: str, field: Field, 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, 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, concretes: Any
) -> None: ...
def resolve_model_field_relations(
self, model_key: tuple[str, str], field_name: str, field: Field, 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: ...
def register_model(self, app_label: str, model: type[Model]) -> None: ...
def unregister_model(self, app_label: str, model_name: str) -> None: ...
django-stubs-5.2.9/django-stubs/db/migrations/utils.pyi 0000664 0000000 0000000 00000000303 15134010516 0023143 0 ustar 00root root 0000000 0000000 from typing import Any
COMPILED_REGEX_TYPE: Any
class RegexObject:
pattern: str
flags: int
def __init__(self, obj: Any) -> None: ...
def get_migration_name_timestamp() -> str: ...
django-stubs-5.2.9/django-stubs/db/migrations/writer.pyi 0000664 0000000 0000000 00000002322 15134010516 0023322 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
django-stubs-5.2.9/django-stubs/db/models/ 0000775 0000000 0000000 00000000000 15134010516 0020373 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/db/models/__init__.pyi 0000664 0000000 0000000 00000015372 15134010516 0022665 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 Avg as Avg
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 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 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 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 .fields import BLANK_CHOICE_DASH as BLANK_CHOICE_DASH
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",
"CASCADE",
"DEFERRED",
"DO_NOTHING",
"NOT_PROVIDED",
"PROTECT",
"RESTRICT",
"SET",
"SET_DEFAULT",
"SET_NULL",
"Aggregate",
"AutoField",
"Avg",
"BaseConstraint",
"BigAutoField",
"BigIntegerField",
"BinaryField",
"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",
"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",
"Subquery",
"Sum",
"TextChoices",
"TextField",
"TimeField",
"Transform",
"URLField",
"UUIDField",
"UniqueConstraint",
"Value",
"ValueRange",
"Variance",
"When",
"Window",
"WindowFrame",
"WindowFrameExclusion",
"aprefetch_related_objects",
"prefetch_related_objects",
"signals",
]
django-stubs-5.2.9/django-stubs/db/models/aggregates.pyi 0000664 0000000 0000000 00000001614 15134010516 0023231 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar
from django.db.models.expressions import Func
from django.db.models.fields import IntegerField
from django.db.models.functions.mixins import FixDurationInputMixin, NumericOutputFieldMixin
class Aggregate(Func):
filter_template: str
filter: Any
allow_distinct: bool
empty_result_set_value: int | None
def __init__(self, *expressions: Any, distinct: bool = False, filter: Any | None = None, **extra: Any) -> None: ...
class Avg(FixDurationInputMixin, NumericOutputFieldMixin, Aggregate): ...
class Count(Aggregate):
output_field: ClassVar[IntegerField]
class Max(Aggregate): ...
class Min(Aggregate): ...
class StdDev(NumericOutputFieldMixin, Aggregate): ...
class Sum(FixDurationInputMixin, Aggregate): ...
class Variance(NumericOutputFieldMixin, Aggregate): ...
__all__ = ["Aggregate", "Avg", "Count", "Max", "Min", "StdDev", "Sum", "Variance"]
django-stubs-5.2.9/django-stubs/db/models/base.pyi 0000664 0000000 0000000 00000011666 15134010516 0022042 0 ustar 00root root 0000000 0000000 from collections.abc import Collection, Iterable, Sequence
from typing import Any, ClassVar, Final, TypeVar, overload
from django.core.checks.messages import CheckMessage
from django.core.exceptions import MultipleObjectsReturned as BaseMultipleObjectsReturned
from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.db.models import BaseConstraint, Field, QuerySet
from django.db.models.manager import Manager
from django.db.models.options import Options
from typing_extensions import Self
_Self = TypeVar("_Self", bound=Model)
class Deferred: ...
DEFERRED: Deferred
class ModelStateFieldsCacheDescriptor:
@overload
def __get__(self, inst: None, owner: object) -> Self: ...
@overload
def __get__(self, inst: object, owner: object) -> dict[Any, Any]: ...
class ModelState:
db: str | None
adding: bool
fields_cache: ModelStateFieldsCacheDescriptor
class ModelBase(type):
@property
def _default_manager(cls: type[_Self]) -> Manager[_Self]: ... # type: ignore[misc]
@property
def _base_manager(cls: type[_Self]) -> Manager[_Self]: ... # type: ignore[misc]
class Model(metaclass=ModelBase):
# Note: these two metaclass generated attributes don't really exist on the 'Model'
# class, runtime they are only added on concrete subclasses of 'Model'. The
# metaclass also sets up correct inheritance from concrete parent models exceptions.
# Our mypy plugin aligns with this behaviour and will remove the 2 attributes below
# and re-add them to correct concrete subclasses of 'Model'
DoesNotExist: Final[type[ObjectDoesNotExist]]
MultipleObjectsReturned: Final[type[BaseMultipleObjectsReturned]]
# This 'objects' attribute will be deleted, via the plugin, in favor of managing it
# to only exist on subclasses it exists on during runtime.
objects: ClassVar[Manager[Self]]
_meta: ClassVar[Options[Self]]
pk: Any
_state: ModelState
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
@classmethod
def add_to_class(cls, name: str, value: Any) -> Any: ...
@classmethod
def from_db(cls, db: str | None, field_names: Collection[str], values: Collection[Any]) -> Self: ...
def _do_update(
self,
base_qs: QuerySet[Self],
using: str | None,
pk_val: Any,
values: Collection[tuple[Field, type[Model] | None, Any]],
update_fields: Iterable[str] | None,
forced_update: bool,
) -> bool: ...
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 full_clean(
self, exclude: Iterable[str] | None = None, validate_unique: bool = True, validate_constraints: bool = True
) -> None: ...
def clean(self) -> None: ...
def clean_fields(self, exclude: Collection[str] | None = None) -> 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[Self], unique_check: Sequence[str]) -> ValidationError: ...
def validate_constraints(self, exclude: Collection[str] | None = None) -> None: ...
def get_constraints(self) -> list[tuple[type[Model], Sequence[BaseConstraint]]]: ...
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 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 prepare_database_save(self, field: Field) -> Any: ...
def get_deferred_fields(self) -> set[str]: ...
@classmethod
def check(cls, **kwargs: Any) -> list[CheckMessage]: ...
def __getstate__(self) -> dict: ...
def _get_pk_val(self, meta: Options[Self] | None = None) -> str: ...
def model_unpickle(model_id: tuple[str, str] | type[Model]) -> Model: ...
django-stubs-5.2.9/django-stubs/db/models/constants.pyi 0000664 0000000 0000000 00000000220 15134010516 0023124 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, ...)
django-stubs-5.2.9/django-stubs/db/models/constraints.pyi 0000664 0000000 0000000 00000007253 15134010516 0023474 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from enum import Enum
from typing import Any, cast, overload
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 Self, deprecated
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
@overload
def __init__(
self,
*,
name: str,
violation_error_code: str | None = None,
violation_error_message: _StrOrPromise | None = None,
) -> None: ...
@overload
@deprecated("Passing positional arguments to BaseConstraint is deprecated and will be removed in Django 6.0")
def __init__(
self,
*args: Any,
name: str | None = None,
violation_error_code: str | None = None,
violation_error_message: _StrOrPromise | None = None,
) -> None: ...
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 get_violation_error_message(self) -> str: ...
def deconstruct(self) -> tuple[str, Sequence[Any], dict[str, Any]]: ...
def clone(self) -> Self: ...
class CheckConstraint(BaseConstraint):
check: Q | BaseExpression
condition: Q | BaseExpression
@overload
@deprecated("check keyword argument is deprecated in favor of condition and will be removed in Django 6.0")
def __init__(
self,
*,
name: str,
condition: None = None,
check: Q | BaseExpression,
violation_error_code: str | None = None,
violation_error_message: _StrOrPromise | None = None,
) -> None: ...
@overload
def __init__(
self,
*,
name: str,
condition: Q | BaseExpression,
check: None = None,
violation_error_code: str | None = None,
violation_error_message: _StrOrPromise | None = None,
) -> 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 | None = None,
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 | None = None,
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: ...
__all__ = ["BaseConstraint", "CheckConstraint", "Deferrable", "UniqueConstraint"]
django-stubs-5.2.9/django-stubs/db/models/deletion.pyi 0000664 0000000 0000000 00000007247 15134010516 0022733 0 ustar 00root root 0000000 0000000 from collections import defaultdict
from collections.abc import Callable, Iterable, Iterator, Sequence
from typing import Any
from django.db import IntegrityError
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]: ...
def get_candidate_relations_to_delete(opts: Options) -> Iterable[Field]: ...
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], list[Model]]
restricted_objects: defaultdict[Model, defaultdict[Field, set[Model]]]
fast_deletes: list[QuerySet[Model]]
dependencies: defaultdict[Model, set[Model]]
def __init__(self, using: str, origin: Model | QuerySet[Model] | None = None) -> 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, value: Any, objs: _IndexableCollection[Model]) -> None: ...
def add_restricted_objects(self, field: Field, 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 | None = None) -> bool: ...
def get_del_batches(
self, objs: _IndexableCollection[Model], fields: Iterable[Field]
) -> 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], 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]]: ...
django-stubs-5.2.9/django-stubs/db/models/enums.pyi 0000664 0000000 0000000 00000005614 15134010516 0022253 0 ustar 00root root 0000000 0000000 import enum
import sys
from typing import Any, Literal, TypeVar, overload, type_check_only
from _typeshed import ConvertibleToInt
from django.utils.functional import _StrOrPromise
from typing_extensions import deprecated
if sys.version_info >= (3, 11):
from enum import EnumType, IntEnum, StrEnum
from enum import property as enum_property
else:
from enum import EnumMeta as EnumType
from types import DynamicClassAttribute as enum_property
class ReprEnum(enum.Enum): ... # type: ignore[misc]
class IntEnum(int, ReprEnum): ... # type: ignore[misc]
class StrEnum(str, ReprEnum): ... # type: ignore[misc]
_Self = TypeVar("_Self", bound=ChoicesType)
class ChoicesType(EnumType):
__empty__: _StrOrPromise
def __new__(
metacls: type[_Self], classname: str, bases: tuple[type, ...], classdict: enum._EnumDict, **kwds: Any
) -> _Self: ...
@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):
def __contains__(self, member: Any) -> bool: ...
@deprecated("ChoicesMeta is deprecated in favor of ChoicesType and will be removed in Django 6.0.")
class ChoicesMeta(ChoicesType): ...
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
def value(self) -> Any: ...
# fake, to keep simulate class properties
@type_check_only
class _IntegerChoicesType(ChoicesType):
@property
def choices(self) -> list[tuple[int, _StrOrPromise]]: ...
@property
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]
@overload
def __init__(self, x: ConvertibleToInt) -> None: ...
@overload
def __init__(self, x: ConvertibleToInt, label: _StrOrPromise) -> None: ...
@enum_property
def value(self) -> int: ...
# fake, to keep simulate class properties
@type_check_only
class _TextChoicesType(ChoicesType):
@property
def choices(self) -> list[tuple[str, _StrOrPromise]]: ...
@property
def values(self) -> list[str]: ...
class TextChoices(Choices, StrEnum, metaclass=_TextChoicesType): # type: ignore[misc]
@overload
def __init__(self, object: str) -> None: ...
@overload
def __init__(self, object: str, label: _StrOrPromise) -> None: ...
@enum_property
def value(self) -> str: ...
__all__ = ["Choices", "IntegerChoices", "TextChoices"]
django-stubs-5.2.9/django-stubs/db/models/expressions.pyi 0000664 0000000 0000000 00000027143 15134010516 0023507 0 ustar 00root root 0000000 0000000 import datetime
from collections.abc import Callable, Iterable, Iterator, Mapping, Sequence
from decimal import Decimal
from enum import Enum
from typing import Any, ClassVar, Generic, Literal, NoReturn, TypeAlias, TypeVar
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 Self
class SQLiteNumericMixin:
def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
_Numeric: TypeAlias = float | Decimal
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: datetime.timedelta | Combinable | _Numeric | str | None) -> CombinedExpression: ...
def __sub__(self, other: datetime.timedelta | Combinable | _Numeric) -> 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: datetime.datetime | _Numeric | Combinable | None) -> CombinedExpression: ...
def __rsub__(self, other: _Numeric | Combinable) -> 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:
is_summary: bool
filterable: bool
window_compatible: bool
allowed_default: bool
constraint_validation_compatible: bool
def __init__(self, output_field: Field | None = None) -> None: ...
def get_db_converters(self, connection: BaseDatabaseWrapper) -> list[Callable]: ...
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: ...
@cached_property
def output_field(self) -> Field: ...
@cached_property
def convert_value(self) -> Callable: ...
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 get_refs(self) -> set[str]: ...
def copy(self) -> Self: ...
def get_group_by_cols(self) -> list[BaseExpression]: ...
def get_source_fields(self) -> list[Field | None]: ...
def asc(
self,
*,
descending: bool = ...,
nulls_first: bool | None = ...,
nulls_last: bool | None = ...,
) -> OrderBy: ...
def desc(
self,
*,
nulls_first: bool | None = ...,
nulls_last: bool | None = ...,
) -> 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, ...]: ...
class CombinedExpression(SQLiteNumericMixin, Expression):
connector: str
lhs: Combinable
rhs: Combinable
def __init__(self, lhs: Combinable, connector: str, rhs: Combinable, output_field: Field | None = None) -> None: ...
class DurationExpression(CombinedExpression):
def compile(self, side: Combinable, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
class TemporalSubtraction(CombinedExpression):
output_field: ClassVar[fields.DurationField]
def __init__(self, lhs: Combinable, rhs: Combinable) -> None: ...
class F(_Deconstructible, Combinable):
name: str
allowed_default: ClassVar[bool]
def __init__(self, name: str) -> None: ...
def __getitem__(self, subscript: int | slice) -> Sliced: ...
def __contains__(self, other: Any) -> NoReturn: ...
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,
*,
descending: bool = ...,
nulls_first: bool | None = ...,
nulls_last: bool | None = ...,
) -> OrderBy: ...
def desc(
self,
*,
nulls_first: bool | None = ...,
nulls_last: bool | None = ...,
) -> OrderBy: ...
def copy(self) -> Self: ...
class Sliced(F):
def __init__(self, obj: F, subscript: int | slice) -> None: ...
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]
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):
function: str | None = None
name: str
template: str
arg_joiner: str
arity: int | None
source_expressions: list[Expression]
extra: dict[Any, Any]
def __init__(self, *expressions: Any, output_field: Field | None = None, **extra: Any) -> None: ...
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
def __init__(self, value: Any, output_field: Field | None = None) -> None: ...
class RawSQL(Expression):
params: list[Any]
sql: str
def __init__(self, sql: str, params: Sequence[Any], output_field: Field | None = None) -> None: ...
class Star(Expression): ...
class DatabaseDefault(Expression):
def __init__(self, expression: Expression, output_field: Field | None = None) -> None: ...
class Col(Expression):
target: Field
alias: str
contains_column_references: Literal[True]
possibly_multivalued: Literal[False]
def __init__(self, alias: str, target: Field, output_field: Field | None = None) -> None: ...
class Ref(Expression):
def __init__(self, refs: str, source: Expression) -> None: ...
class ExpressionList(Func):
def __init__(
self, *expressions: BaseExpression | Combinable, output_field: Field | None = None, **extra: Any
) -> None: ...
class OrderByList(Func): ...
_E = TypeVar("_E", bound=Q | Combinable)
class ExpressionWrapper(Expression, Generic[_E]):
def __init__(self, expression: _E, output_field: Field) -> None: ...
expression: _E
class NegatedExpression(ExpressionWrapper[_E]):
def __init__(self, expression: _E) -> None: ...
def __invert__(self) -> _E: ... # type: ignore[override]
class When(Expression):
template: str
condition: Any
result: Any
def __init__(self, condition: Any | None = None, then: Any | None = None, **lookups: Any) -> None: ...
class Case(Expression):
template: str
case_joiner: str
cases: Any
default: Any
extra: Any
def __init__(
self, *cases: Any, default: Any | None = None, output_field: Field | None = None, **extra: Any
) -> None: ...
class Subquery(BaseExpression, Combinable):
template: str
subquery: bool
query: Query
extra: dict[Any, Any]
def __init__(self, queryset: Query | QuerySet, output_field: Field | None = None, **extra: Any) -> None: ...
class Exists(Subquery):
output_field: ClassVar[fields.BooleanField]
def __init__(self, queryset: Query | QuerySet, **kwargs: Any) -> None: ...
class OrderBy(Expression):
template: str
nulls_first: bool
nulls_last: bool
descending: bool
expression: Expression | F | Subquery
def __init__(
self,
expression: Expression | F | Subquery,
descending: bool = False,
nulls_first: bool | None = None,
nulls_last: bool | None = None,
) -> None: ...
def asc(self) -> None: ... # type: ignore[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: ExpressionList | None
def __init__(
self,
expression: BaseExpression,
partition_by: str | Iterable[BaseExpression | F] | F | BaseExpression | None = None,
order_by: Sequence[BaseExpression | F | str] | BaseExpression | F | str | None = None,
frame: WindowFrame | None = None,
output_field: Field | None = None,
) -> None: ...
class WindowFrameExclusion(Enum):
CURRENT_ROW = "CURRENT ROW"
GROUP = "GROUP"
TIES = "TIES"
NO_OTHERS = "NO OTHERS"
class WindowFrame(Expression):
template: str
frame_type: str
def __init__(
self,
start: int | None = None,
end: int | None = None,
exclusion: WindowFrameExclusion | None = None,
) -> None: ...
def window_frame_start_end(
self, connection: BaseDatabaseWrapper, start: int | None, end: int | None
) -> tuple[int, int]: ...
def get_exclusion(self) -> str: ...
class RowRange(WindowFrame): ...
class ValueRange(WindowFrame): ...
django-stubs-5.2.9/django-stubs/db/models/fields/ 0000775 0000000 0000000 00000000000 15134010516 0021641 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/db/models/fields/__init__.pyi 0000664 0000000 0000000 00000056466 15134010516 0024144 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, Literal, Protocol, TypeAlias, TypeVar, overload, type_check_only
from django import forms
from django.core import validators # due to weird mypy.stubtest error
from django.core.checks import CheckMessage
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_utils import Q, RegisterLookupMixin
from django.db.models.sql.compiler import SQLCompiler, _AsSqlType, _ParamsT
from django.forms 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 Self
class Empty: ...
class NOT_PROVIDED: ...
BLANK_CHOICE_DASH: list[tuple[str, str]]
_ChoicesList: TypeAlias = Sequence[_Choice] | Sequence[_ChoiceNamedGroup]
_LimitChoicesTo: TypeAlias = Q | dict[str, Any]
_LimitChoicesToCallable: TypeAlias = Callable[[], _LimitChoicesTo]
_F = TypeVar("_F", bound=Field, 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, Union
class Model(object):
...
_SetType = Union[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 "builtins.int"
example.count = 1.5 # ok
example.count = 'a'
# Incompatible types in assignment
# (expression has type "str", variable has type "Union[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
widget: Widget
help_text: _StrOrPromise
attname: str
auto_created: bool
primary_key: bool
remote_field: ForeignObjectRel | None
is_relation: bool
related_model: type[Model] | Literal["self"] | 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
unique: 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
concrete: bool
default: Any
error_messages: _ErrorMessagesDict
empty_values: Sequence[Any]
creation_counter: int
auto_creation_counter: int
default_validators: Sequence[validators._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[validators._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 select_format(self, compiler: SQLCompiler, sql: str, params: _ParamsT) -> _AsSqlType: ...
def deconstruct(self) -> tuple[str, str, Sequence[Any], dict[str, Any]]: ...
def set_attributes_from_name(self, name: str) -> None: ...
def db_type_parameters(self, connection: BaseDatabaseWrapper) -> DictWrapper: ...
def db_check(self, connection: BaseDatabaseWrapper) -> str | None: ...
def db_type(self, connection: BaseDatabaseWrapper) -> str | None: ...
def db_parameters(self, connection: BaseDatabaseWrapper) -> dict[str, str | None]: ...
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 get_internal_type(self) -> str: ...
# TODO: plugin support
def formfield(
self,
form_class: type[forms.Field] | None = None,
choices_form_class: type[forms.ChoiceField] | None = None,
**kwargs: Any,
) -> forms.Field | None: ...
def save_form_data(self, instance: Model, data: Any) -> None: ...
def contribute_to_class(self, cls: type[Model], name: str, private_only: bool = False) -> None: ...
def to_python(self, value: Any) -> Any: ...
@cached_property
def validators(self) -> list[validators._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 get_choices(
self,
include_blank: bool = True,
blank_choice: _ChoicesList = ...,
limit_choices_to: _LimitChoicesTo | None = None,
ordering: Sequence[str] = (),
) -> BlankChoiceIterator | _ChoicesList: ...
@property
def flatchoices(self) -> list[_Choice]: ...
def has_default(self) -> bool: ...
def get_default(self) -> Any: ...
def check(self, **kwargs: Any) -> list[CheckMessage]: ...
def get_col(self, alias: str, output_field: Field | None = None) -> Col: ...
@cached_property
def cached_col(self) -> Col: ...
def value_from_object(self, obj: Model) -> _GT: ...
def get_attname(self) -> str: ...
def get_attname_column(self) -> tuple[str, str]: ...
def value_to_string(self, obj: Model) -> str: ...
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]): ...
class PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, SmallIntegerField[_ST, _GT]): ...
class PositiveBigIntegerField(PositiveIntegerRelDbTypeMixin, BigIntegerField[_ST, _GT]): ...
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[validators._ValidatorCallable] = ...,
error_messages: _ErrorMessagesMapping | None = ...,
) -> None: ...
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
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[validators._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[validators._ValidatorCallable] = ...,
error_messages: _ErrorMessagesMapping | None = ...,
*,
max_length: int | None = 50,
db_index: bool = True,
allow_unicode: bool = False,
) -> 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[validators._ValidatorCallable] = ...,
error_messages: _ErrorMessagesMapping | 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
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[validators._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[validators._ValidatorCallable] = ...,
error_messages: _ErrorMessagesMapping | None = ...,
) -> None: ...
class DateTimeCheckMixin: ...
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[validators._ValidatorCallable] = ...,
error_messages: _ErrorMessagesMapping | None = ...,
) -> None: ...
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[validators._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[validators._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[validators._ValidatorCallable] = ...,
error_messages: _ErrorMessagesMapping | None = ...,
) -> None: ...
class BinaryField(Field[_ST, _GT]):
_pyi_private_get_type: bytes | memoryview
class DurationField(Field[_ST, _GT]):
_pyi_private_get_type: timedelta
class AutoFieldMixin:
db_returning: bool
def deconstruct(self) -> tuple[str, str, Sequence[Any], dict[str, Any]]: ...
def contribute_to_class(self, cls: type[Model], name: str, **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",
"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",
]
django-stubs-5.2.9/django-stubs/db/models/fields/composite.pyi 0000664 0000000 0000000 00000005104 15134010516 0024366 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable, Iterator, Mapping
from typing import Any, Literal
from django.contrib.contenttypes.fields import GenericForeignKey
from django.core import validators # due to weird mypy.stubtest error
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.utils.choices import _ChoicesInput
from django.utils.functional import _StrOrPromise, cached_property
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):
field_names: tuple[str]
descriptor_class: type[CompositeAttribute]
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[validators._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[Field | ForeignObjectRel | GenericForeignKey, ...]: ...
@cached_property
def columns(self) -> tuple[str, ...]: ...
def __iter__(self) -> Iterator[Field | ForeignObjectRel | GenericForeignKey]: ...
def __len__(self) -> int: ...
def get_pk_value_on_save(self, instance: Model) -> tuple: ... # actual type is tuple of field.value_from_object
def unnest(fields: Iterable[Field[Any, Any]]) -> list[Field[Any, Any]]: ...
django-stubs-5.2.9/django-stubs/db/models/fields/files.pyi 0000664 0000000 0000000 00000011057 15134010516 0023472 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterable
from typing import Any, Protocol, TypeVar, overload, type_check_only
from django.core import validators # due to weird mypy.stubtest error
from django.core.files.base import File
from django.core.files.images import ImageFile
from django.core.files.storage import Storage
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._os import _PathCompatible
from django.utils.choices import _Choices
from django.utils.functional import _StrOrPromise
from typing_extensions import Self
class FieldFile(File, AltersData):
instance: Model
field: FileField
storage: Storage
name: str | None
def __init__(self, instance: Model, field: FileField, name: str | None) -> None: ...
file: Any
@property
def path(self) -> str: ...
@property
def url(self) -> str: ...
@property
def size(self) -> int: ...
def open(self, mode: str = "rb") -> Self: ... # type: ignore[override]
def save(self, name: str, content: File, save: bool = True) -> None: ...
def delete(self, save: bool = True) -> None: ...
@property
def closed(self) -> bool: ...
def __getstate__(self) -> dict[str, Any]: ...
def __setstate__(self, state: dict[str, Any]) -> None: ...
def __eq__(self, other: object) -> bool: ...
def __hash__(self) -> int: ...
class FileDescriptor(DeferredAttribute):
field: FileField
def __set__(self, instance: Model, value: Any | None) -> None: ...
def __get__(self, instance: Model | None, cls: type[Model] | None = None) -> FieldFile | FileDescriptor: ...
_M = TypeVar("_M", bound=Model, contravariant=True)
@type_check_only
class _UploadToCallable(Protocol[_M]):
def __call__(self, instance: _M, filename: str, /) -> _PathCompatible: ...
class FileField(Field):
storage: Storage
upload_to: _PathCompatible | _UploadToCallable
def __init__(
self,
verbose_name: _StrOrPromise | None = None,
name: str | None = None,
upload_to: _PathCompatible | _UploadToCallable = "",
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[validators._ValidatorCallable] = ...,
error_messages: _ErrorMessagesMapping | None = ...,
) -> None: ...
# class access
@overload
def __get__(self, instance: None, owner: Any) -> FileDescriptor: ...
# Model instance access
@overload
def __get__(self, instance: Model, owner: Any) -> Any: ...
# non-Model instances
@overload
def __get__(self, instance: Any, owner: Any) -> Self: ...
def contribute_to_class(self, cls: type[Model], name: str, **kwargs: Any) -> None: ... # type: ignore[override]
def generate_filename(self, instance: Model | None, filename: _PathCompatible) -> str: ...
class ImageFileDescriptor(FileDescriptor):
field: ImageField
def __set__(self, instance: Model, value: str | None) -> None: ...
class ImageFieldFile(ImageFile, FieldFile):
field: ImageField
def delete(self, save: bool = True) -> None: ...
class ImageField(FileField):
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
def __get__(self, instance: None, owner: Any) -> ImageFileDescriptor: ...
# Model instance access
@overload
def __get__(self, instance: Model, owner: Any) -> Any: ...
# non-Model instances
@overload
def __get__(self, instance: Any, owner: Any) -> Self: ...
def update_dimension_fields(self, instance: Model, force: bool = False, *args: Any, **kwargs: Any) -> None: ...
django-stubs-5.2.9/django-stubs/db/models/fields/generated.pyi 0000664 0000000 0000000 00000003446 15134010516 0024331 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 _Choices
from django.utils.datastructures import DictWrapper
from django.utils.functional import _StrOrPromise
class GeneratedField(models.Field):
generated: ClassVar[Literal[True]]
db_returning: Literal[True]
_query: Query | None
output_field: models.Field | None
def __init__(
self,
*,
expression: Expression,
output_field: models.Field,
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: _Choices | 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]: ...
def db_type_parameters(self, connection: BaseDatabaseWrapper) -> DictWrapper: ...
__all__ = ["GeneratedField"]
django-stubs-5.2.9/django-stubs/db/models/fields/json.pyi 0000664 0000000 0000000 00000007566 15134010516 0023353 0 ustar 00root root 0000000 0000000 import json
from collections.abc import Callable
from typing import Any, ClassVar, TypeVar
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models import lookups
from django.db.models.expressions import Expression
from django.db.models.fields import TextField
from django.db.models.lookups import PostgresOperatorLookup, Transform
from django.db.models.sql.compiler import SQLCompiler
from django.utils.functional import _StrOrPromise
from typing_extensions import Self
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: ...
class DataContains(PostgresOperatorLookup): ...
class ContainedBy(PostgresOperatorLookup): ...
class HasKeyLookup(PostgresOperatorLookup):
logical_operator: str | None
def compile_json_path_final_key(self, key_transform: Any) -> str: ...
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): ...
class JSONExact(lookups.Exact): ...
class CaseInsensitiveMixin: ...
class JSONIContains(CaseInsensitiveMixin, lookups.IContains): ...
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: ...
class KeyTextTransform(KeyTransform):
postgres_operator: str
postgres_nested_operator: str
output_field: ClassVar[TextField]
@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): ...
class KeyTransformIn(lookups.In): ...
class KeyTransformExact(JSONExact): ...
class KeyTransformIExact(CaseInsensitiveMixin, KeyTransformTextLookupMixin, lookups.IExact): ...
class KeyTransformIContains(CaseInsensitiveMixin, KeyTransformTextLookupMixin, lookups.IContains): ...
class KeyTransformStartsWith(KeyTransformTextLookupMixin, lookups.StartsWith): ...
class KeyTransformIStartsWith(CaseInsensitiveMixin, KeyTransformTextLookupMixin, lookups.IStartsWith): ...
class KeyTransformEndsWith(KeyTransformTextLookupMixin, lookups.EndsWith): ...
class KeyTransformIEndsWith(CaseInsensitiveMixin, KeyTransformTextLookupMixin, lookups.IEndsWith): ...
class KeyTransformRegex(KeyTransformTextLookupMixin, lookups.Regex): ...
class KeyTransformIRegex(CaseInsensitiveMixin, KeyTransformTextLookupMixin, lookups.IRegex): ...
class KeyTransformNumericLookupMixin: ...
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"]
django-stubs-5.2.9/django-stubs/db/models/fields/mixins.pyi 0000664 0000000 0000000 00000001513 15134010516 0023673 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
from typing_extensions import deprecated
NOT_PROVIDED: Any
class FieldCacheMixin:
@deprecated("get_cache_name() is deprecated and will be removed in Django 6.0. Use cache_name instead.")
def get_cache_name(self) -> str: ...
@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]: ...
django-stubs-5.2.9/django-stubs/db/models/fields/proxy.pyi 0000664 0000000 0000000 00000000241 15134010516 0023542 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.models import fields
class OrderWrt(fields.IntegerField):
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
django-stubs-5.2.9/django-stubs/db/models/fields/related.pyi 0000664 0000000 0000000 00000030554 15134010516 0024013 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterable, Sequence
from typing import Any, Generic, Literal, TypeVar, overload
from uuid import UUID
from django.core import validators # due to weird mypy.stubtest error
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 ForwardManyToOneDescriptor as ForwardManyToOneDescriptor
from django.db.models.fields.related_descriptors import ForwardOneToOneDescriptor as ForwardOneToOneDescriptor
from django.db.models.fields.related_descriptors import ManyRelatedManager
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.utils.choices import _Choices
from django.utils.functional import _StrOrPromise, cached_property
from typing_extensions import Self
RECURSIVE_RELATIONSHIP_CONSTANT: Literal["self"]
def resolve_relation(scope_model: type[Model], relation: str | type[Model]) -> str | type[Model]: ...
# __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]
swappable: bool
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[validators._ValidatorCallable] = ...,
error_messages: _ErrorMessagesMapping | None = ...,
db_comment: str | None = ...,
) -> None: ...
@cached_property
def related_model(self) -> type[Model] | Literal["self"]: ... # type: ignore[override]
def contribute_to_class(self, cls: type[Model], name: str, private_only: bool = ..., **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: ...
class ForeignObject(RelatedField[_ST, _GT]):
remote_field: ForeignObjectRel
rel_class: type[ForeignObjectRel]
from_fields: Sequence[str]
to_fields: Sequence[str | None] # None occurs in ForeignKey, where to_field defaults to None
swappable: bool
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[validators._ValidatorCallable] = ...,
error_messages: _ErrorMessagesMapping | None = ...,
db_comment: str | None = ...,
) -> None: ...
# class access
@overload
def __get__(self, instance: None, owner: Any) -> ForwardManyToOneDescriptor[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 resolve_related_fields(self) -> list[tuple[Field, Field]]: ...
@cached_property
def related_fields(self) -> list[tuple[Field, Field]]: ...
@cached_property
def reverse_related_fields(self) -> list[tuple[Field, Field]]: ...
@cached_property
def local_related_fields(self) -> tuple[Field, ...]: ...
@cached_property
def foreign_related_fields(self) -> tuple[Field, ...]: ...
def get_joining_fields(self, reverse_join: bool = False) -> tuple[tuple[Field, Field], ...]: ...
def get_reverse_joining_fields(self) -> tuple[tuple[Field, Field], ...]: ...
class ForeignKey(ForeignObject[_ST, _GT]):
_pyi_private_set_type: Any | Combinable
_pyi_private_get_type: Any
remote_field: ManyToOneRel
rel_class: type[ManyToOneRel]
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,
*,
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[validators._ValidatorCallable] = ...,
error_messages: _ErrorMessagesMapping | None = ...,
db_comment: str | None = ...,
) -> None: ...
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: Any,
to_field: str | None = None,
*,
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[validators._ValidatorCallable] = ...,
error_messages: _ErrorMessagesMapping | None = ...,
db_comment: str | None = ...,
) -> None: ...
# class access
@overload
def __get__(self, instance: None, owner: Any) -> ForwardOneToOneDescriptor[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: ...
_Through = TypeVar("_Through", bound=Model)
_To = TypeVar("_To", bound=Model)
class ManyToManyField(RelatedField[Any, Any], Generic[_To, _Through]):
description: _StrOrPromise
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]
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
def __get__(self, instance: None, owner: Any) -> ManyToManyDescriptor[_To, _Through]: ...
# Model instance access
@overload
def __get__(self, instance: Model, owner: Any) -> ManyRelatedManager[_To, _Through]: ...
# non-Model instances
@overload
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]: ...
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) -> 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: ...
def create_many_to_many_intermediary_model(field: ManyToManyField, klass: type[Model]) -> type[Model]: ...
django-stubs-5.2.9/django-stubs/db/models/fields/related_descriptors.pyi 0000664 0000000 0000000 00000021663 15134010516 0026435 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterable, Mapping
from typing import Any, Generic, NoReturn, TypeVar, 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 Self, deprecated
_M = TypeVar("_M", bound=Model)
_F = TypeVar("_F", bound=Field)
_From = TypeVar("_From", bound=Model)
_Through = TypeVar("_Through", bound=Model, default=Model)
_To = TypeVar("_To", bound=Model)
class ForeignKeyDeferredAttribute(DeferredAttribute):
field: RelatedField
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, **hints: Any) -> QuerySet[Any]: ...
@deprecated(
"get_prefetch_queryset() is deprecated and will be removed in Django 6.0. Use get_prefetch_querysets() instead."
)
def get_prefetch_queryset(
self, instances: list[Model], queryset: QuerySet[Any] | None = None
) -> tuple[QuerySet[Any], Callable[..., Any], Callable[..., Any], bool, str, bool]: ...
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 | None: ...
def __set__(self, instance: Model, value: Model | None) -> None: ...
def __reduce__(self) -> tuple[Callable[..., Any], tuple[type[Model], str]]: ...
class ForwardOneToOneDescriptor(ForwardManyToOneDescriptor[_F]):
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, **hints: Any) -> QuerySet[_To]: ...
@deprecated(
"get_prefetch_queryset() is deprecated and will be removed in Django 6.0. Use get_prefetch_querysets() instead."
)
def get_prefetch_queryset(
self, instances: list[_From], queryset: QuerySet[_To] | None = None
) -> tuple[QuerySet[_To], Callable[..., Any], Callable[..., Any], bool, str, bool]: ...
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: ...
def __set__(self, instance: _From, value: _To | None) -> None: ...
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) -> NoReturn: ...
# Fake class, Django defines 'RelatedManager' inside a function body
@type_check_only
class RelatedManager(Manager[_To], Generic[_To]):
related_val: tuple[int, ...]
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, *, clear: bool = ...) -> None: ...
async def aclear(self, *, clear: 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 __call__(self, *, manager: str) -> RelatedManager[_To]: ...
def create_reverse_many_to_one_manager(
superclass: type[BaseManager[_M]], rel: ManyToOneRel
) -> type[RelatedManager[_M]]: ...
class ManyToManyDescriptor(ReverseManyToOneDescriptor, 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
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
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, ...]
through: type[_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: ...
def create(
self,
*,
through_defaults: Mapping[str, Any] | None = ...,
**kwargs: Any,
) -> _To: ...
async def acreate(
self,
*,
through_defaults: Mapping[str, Any] | None = ...,
**kwargs: Any,
) -> _To: ...
def get_or_create(
self,
defaults: Mapping[str, Any] | None = ...,
through_defaults: Mapping[str, Any] | None = ...,
**kwargs: Any,
) -> tuple[_To, bool]: ...
async def aget_or_create(
self,
defaults: Mapping[str, Any] | None = ...,
through_defaults: Mapping[str, Any] | None = ...,
**kwargs: Any,
) -> tuple[_To, bool]: ...
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]: ...
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 __call__(self, *, manager: str) -> ManyRelatedManager[_To, _Through]: ...
def create_forward_many_to_many_manager(
superclass: type[BaseManager[_To]], rel: ManyToManyRel, reverse: bool
) -> type[ManyRelatedManager[_To, _Through]]: ...
django-stubs-5.2.9/django-stubs/db/models/fields/related_lookups.pyi 0000664 0000000 0000000 00000001507 15134010516 0025563 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable
from typing import Any
from django.db.models.lookups import Exact, GreaterThan, GreaterThanOrEqual, In, IsNull, LessThan, LessThanOrEqual
def get_normalized_value(value: Any, lhs: Any) -> tuple[Any, ...]: ...
class RelatedIn(In):
bilateral_transforms: list[Any]
lhs: Any
rhs: Any
def get_prep_lookup(self) -> Iterable[Any]: ...
class RelatedLookupMixin:
rhs: Any
def get_prep_lookup(self) -> Any: ...
class RelatedExact(RelatedLookupMixin, Exact): ...
class RelatedLessThan(RelatedLookupMixin, LessThan): ...
class RelatedGreaterThan(RelatedLookupMixin, GreaterThan): ...
class RelatedGreaterThanOrEqual(RelatedLookupMixin, GreaterThanOrEqual): ...
class RelatedLessThanOrEqual(RelatedLookupMixin, LessThanOrEqual): ...
class RelatedIsNull(RelatedLookupMixin, IsNull): ...
django-stubs-5.2.9/django-stubs/db/models/fields/reverse_related.pyi 0000664 0000000 0000000 00000012223 15134010516 0025537 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 AutoField, 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_utils import FilteredRelation, PathInfo
from django.db.models.sql.where import WhereNode
from django.utils.functional import cached_property
from typing_extensions import deprecated
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
is_relation: bool
null: bool
field: ForeignObject
model: type[Model]
related_name: str | None
related_query_name: str | None
limit_choices_to: _AllLimitChoicesTo | None
parent_link: bool
on_delete: Callable
symmetrical: bool
multiple: bool
field_name: str | None
def __init__(
self,
field: ForeignObject,
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 | None = None,
) -> None: ...
@cached_property
def hidden(self) -> bool: ...
@cached_property
def name(self) -> str: ...
@property
def remote_field(self) -> ForeignObject: ...
@property
def target_field(self) -> AutoField: ...
@cached_property
def related_model(self) -> type[Model] | Literal["self"]: ...
@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 = ...,
limit_choices_to: _LimitChoicesTo | None = None,
ordering: Sequence[str] = (),
) -> _ChoicesList: ...
@deprecated(
"get_joining_columns() is deprecated and will be removed in Django 6.0. Use get_joining_fields() instead."
)
def get_joining_columns(self) -> tuple: ...
def get_joining_fields(self) -> tuple[tuple[Field, Field], ...]: ...
def get_extra_restriction(
self, where_class: type[WhereNode], alias: str, related_alias: str
) -> StartsWith | WhereNode | None: ...
def set_field_name(self) -> None: ...
@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]: ...
class ManyToOneRel(ForeignObjectRel):
field: ForeignKey
def __init__(
self,
field: ForeignKey,
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 | None = None,
) -> None: ...
def get_related_field(self) -> Field: ...
def get_accessor_name(self, model: type[Model] | None = None) -> str: ...
class OneToOneRel(ManyToOneRel):
field: OneToOneField
def __init__(
self,
field: OneToOneField,
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 | 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: ...
django-stubs-5.2.9/django-stubs/db/models/functions/ 0000775 0000000 0000000 00000000000 15134010516 0022403 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/db/models/functions/__init__.pyi 0000664 0000000 0000000 00000011500 15134010516 0024662 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 .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__ = [
# text
"MD5",
"SHA1",
"SHA224",
"SHA256",
"SHA384",
"SHA512",
"ACos",
"ASin",
"ATan",
"ATan2",
# math
"Abs",
# comparison and conversion
"Cast",
"Ceil",
"Chr",
"Coalesce",
"Collate",
"Concat",
"ConcatPair",
"Cos",
"Cot",
# window
"CumeDist",
"Degrees",
"DenseRank",
"Exp",
# datetime
"Extract",
"ExtractDay",
"ExtractHour",
"ExtractIsoWeekDay",
"ExtractIsoYear",
"ExtractMinute",
"ExtractMonth",
"ExtractQuarter",
"ExtractSecond",
"ExtractWeek",
"ExtractWeekDay",
"ExtractYear",
"FirstValue",
"Floor",
"Greatest",
# json
"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",
]
django-stubs-5.2.9/django-stubs/db/models/functions/comparison.pyi 0000664 0000000 0000000 00000000675 15134010516 0025310 0 ustar 00root root 0000000 0000000 from django.db.models import Func
from django.db.models.expressions import Combinable
from django.db.models.fields import Field
class Cast(Func):
def __init__(self, expression: Combinable | str, output_field: str | Field) -> None: ...
class Coalesce(Func): ...
class Collate(Func):
def __init__(self, expression: Combinable | str, collation: str) -> None: ...
class Greatest(Func): ...
class Least(Func): ...
class NullIf(Func): ...
django-stubs-5.2.9/django-stubs/db/models/functions/datetime.pyi 0000664 0000000 0000000 00000004376 15134010516 0024734 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
class TimezoneMixin:
tzinfo: Any
def get_tzname(self) -> str | None: ...
class Extract(TimezoneMixin, Transform):
lookup_name: str
output_field: ClassVar[models.IntegerField]
def __init__(
self, expression: Combinable | str, lookup_name: str | None = None, tzinfo: Any | None = None, **extra: Any
) -> None: ...
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]
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class TruncBase(TimezoneMixin, Transform):
kind: str
tzinfo: Any
def __init__(
self,
expression: Combinable | str,
output_field: Field | None = None,
tzinfo: tzinfo | None = None,
**extra: Any,
) -> None: ...
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 | 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]
class TruncTime(TruncBase):
output_field: ClassVar[models.TimeField]
class TruncHour(TruncBase): ...
class TruncMinute(TruncBase): ...
class TruncSecond(TruncBase): ...
django-stubs-5.2.9/django-stubs/db/models/functions/json.pyi 0000664 0000000 0000000 00000003151 15134010516 0024077 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
class JSONArray(Func):
output_field: ClassVar[JSONField]
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]
def __init__(self, **fields: Any) -> None: ...
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: ...
django-stubs-5.2.9/django-stubs/db/models/functions/math.pyi 0000664 0000000 0000000 00000002575 15134010516 0024070 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.models.expressions import Combinable, Func
from django.db.models.functions.mixins import FixDecimalInputMixin, NumericOutputFieldMixin
from django.db.models.lookups import Transform
class Abs(Transform): ...
class ACos(NumericOutputFieldMixin, Transform): ...
class ASin(NumericOutputFieldMixin, Transform): ...
class ATan(NumericOutputFieldMixin, Transform): ...
class ATan2(NumericOutputFieldMixin, Func): ...
class Ceil(Transform): ...
class Cos(NumericOutputFieldMixin, Transform): ...
class Cot(NumericOutputFieldMixin, Transform): ...
class Degrees(NumericOutputFieldMixin, Transform): ...
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): ...
class Power(NumericOutputFieldMixin, Func): ...
class Radians(NumericOutputFieldMixin, Transform): ...
class Random(NumericOutputFieldMixin, Func): ...
class Round(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): ...
django-stubs-5.2.9/django-stubs/db/models/functions/mixins.pyi 0000664 0000000 0000000 00000000144 15134010516 0024434 0 ustar 00root root 0000000 0000000 class FixDecimalInputMixin: ...
class FixDurationInputMixin: ...
class NumericOutputFieldMixin: ...
django-stubs-5.2.9/django-stubs/db/models/functions/text.pyi 0000664 0000000 0000000 00000011301 15134010516 0024106 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
from django.db.models.sql.compiler import SQLCompiler, _AsSqlType
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: ...
def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class ConcatPair(Func):
def coalesce(self) -> ConcatPair: ...
def pipes_concat_sql(
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any
) -> _AsSqlType: ...
as_sqlite = pipes_concat_sql
def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class Concat(Func):
def __init__(self, *expressions: Any, **extra: Any) -> None: ...
class Left(Func):
output_field: ClassVar[models.CharField]
def __init__(self, expression: Combinable | str, length: Expression | int, **extra: Any) -> None: ...
def get_substr(self) -> Substr: ...
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class Length(Transform):
output_field: ClassVar[models.IntegerField]
def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class Lower(Transform): ...
class LPad(Func):
output_field: ClassVar[models.CharField]
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]
def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class Repeat(Func):
output_field: ClassVar[models.CharField]
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):
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]
def as_postgresql(
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any
) -> _AsSqlType: ...
class Substr(Func):
output_field: ClassVar[models.CharField]
def __init__(
self, expression: Combinable | str, pos: Expression | int, length: Expression | int | None = None, **extra: Any
) -> None: ...
def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
class Trim(Transform): ...
class Upper(Transform): ...
django-stubs-5.2.9/django-stubs/db/models/functions/window.pyi 0000664 0000000 0000000 00000002216 15134010516 0024436 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar
from django.db import models
from django.db.models.expressions import Func
class CumeDist(Func):
output_field: ClassVar[models.FloatField]
class DenseRank(Func):
output_field: ClassVar[models.IntegerField]
class FirstValue(Func): ...
class LagLeadFunction(Func):
def __init__(self, expression: str | None, offset: int = 1, default: int | None = None, **extra: Any) -> None: ...
class Lag(LagLeadFunction): ...
class LastValue(Func): ...
class Lead(LagLeadFunction): ...
class NthValue(Func):
def __init__(self, expression: str | None, nth: int = 1, **extra: Any) -> None: ...
class Ntile(Func):
def __init__(self, num_buckets: int = 1, **extra: Any) -> None: ...
output_field: ClassVar[models.IntegerField]
class PercentRank(Func):
output_field: ClassVar[models.FloatField]
class Rank(Func):
output_field: ClassVar[models.IntegerField]
class RowNumber(Func):
output_field: ClassVar[models.IntegerField]
__all__ = [
"CumeDist",
"DenseRank",
"FirstValue",
"Lag",
"LastValue",
"Lead",
"NthValue",
"Ntile",
"PercentRank",
"Rank",
"RowNumber",
]
django-stubs-5.2.9/django-stubs/db/models/indexes.pyi 0000664 0000000 0000000 00000004370 15134010516 0022561 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.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
class Index:
model: type[Model]
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 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: Sequence[Expression]
def set_wrapper_classes(self, connection: Any | None = None) -> None: ...
@classmethod
def register_wrappers(cls, *wrapper_classes: Expression) -> None: ...
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: ...
def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ...
__all__ = ["Index"]
django-stubs-5.2.9/django-stubs/db/models/lookups.pyi 0000664 0000000 0000000 00000014304 15134010516 0022614 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable, Sequence
from typing import Any, Generic, Literal, TypeVar
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
_T = TypeVar("_T")
class Lookup(Expression, Generic[_T]):
lookup_name: str
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 | None = None
) -> tuple[list[str], list[str]]: ...
def get_source_expressions(self) -> list[Expression]: ...
def set_source_expressions(self, new_exprs: Sequence[Combinable | Expression]) -> None: ...
def get_prep_lookup(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_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
@cached_property
def output_field(self) -> BooleanField: ...
@cached_property
def contains_aggregate(self) -> bool: ...
@cached_property
def contains_over_clause(self) -> bool: ...
@property
def identity(self) -> tuple[type[Lookup], Any, Any]: ...
class Transform(RegisterLookupMixin, Func):
bilateral: bool
@property
def lhs(self) -> Expression: ...
def get_bilateral_transforms(self) -> list[type[Transform]]: ...
class BuiltinLookup(Lookup[_T]):
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 resolve_expression_parameter(
self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, sql: str, param: Any
) -> _AsSqlType: ...
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]): ...
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[_T]):
def split_parameter_list_as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> Any: ...
class PatternLookup(BuiltinLookup[str]):
param_pattern: str
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]):
def get_bound_params(self, start: Any, finish: Any) -> tuple[Any, Any]: ...
class YearGt(YearLookup, GreaterThan[_T]):
def get_bound_params(self, start: Any, finish: Any) -> tuple[Any]: ...
class YearGte(YearLookup, GreaterThanOrEqual[_T]):
def get_bound_params(self, start: Any, finish: Any) -> tuple[Any]: ...
class YearLt(YearLookup, LessThan[_T]):
def get_bound_params(self, start: Any, finish: Any) -> tuple[Any]: ...
class YearLte(YearLookup, LessThanOrEqual[_T]):
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): ...
django-stubs-5.2.9/django-stubs/db/models/manager.pyi 0000664 0000000 0000000 00000020465 15134010516 0022537 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, TypeVar, 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.query import Prefetch, QuerySet, RawQuerySet, _LookupT, _PrefetchedQuerySetT, _ToAttrT
from typing_extensions import Self
_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]: ...
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
def __init__(self, manager: BaseManager) -> None: ...
@overload
def __get__(self, instance: None, cls: type[Model] | None = None) -> BaseManager: ...
@overload
def __get__(self, instance: Model, cls: type[Model] | None = None) -> NoReturn: ...
class EmptyManager(Manager[_T]):
def __init__(self, model: type[_T]) -> None: ...
django-stubs-5.2.9/django-stubs/db/models/options.pyi 0000664 0000000 0000000 00000014042 15134010516 0022612 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable, Sequence
from typing import Any, Generic, TypeAlias, TypeVar, overload
from django.apps.config import AppConfig
from django.apps.registry import Apps
from django.contrib.contenttypes.fields import GenericForeignKey
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_utils import PathInfo
from django.utils.datastructures import ImmutableList, _ListOrTuple
from django.utils.functional import _StrOrPromise, cached_property
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
@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]
local_many_to_many: list[ManyToManyField]
private_fields: list[Any]
local_managers: list[Manager]
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[str] | None
indexes: _ListOrTuple[Any]
unique_together: Sequence[tuple[str, ...]] # Are always normalized
index_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
auto_field: AutoField | 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], GenericForeignKey | Field]
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) -> None: ...
def add_field(self, field: GenericForeignKey | 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: GenericForeignKey | 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 fields_map(self) -> dict[str, Field[Any, Any] | ForeignObjectRel]: ...
@cached_property
def managers(self) -> ImmutableList[Manager]: ...
@cached_property
def managers_map(self) -> dict[str, Manager]: ...
@cached_property
def base_manager(self) -> Manager: ...
@cached_property
def default_manager(self) -> Manager | None: ...
@cached_property
def fields(self) -> ImmutableList[Field[Any, Any]]: ...
@cached_property
def 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 local_concrete_fields(self) -> ImmutableList[Field[Any, Any]]: ...
def get_field(self, field_name: str) -> Field | ForeignObjectRel | GenericForeignKey: ...
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 | 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[Field[Any, Any] | ForeignObjectRel | GenericForeignKey]: ...
def _get_fields(
self,
forward: bool = True,
reverse: bool = True,
include_parents: bool | object = True,
include_hidden: bool = False,
topmost_call: bool = True,
) -> list[Field[Any, Any] | ForeignObjectRel | GenericForeignKey]: ...
@cached_property
def total_unique_constraints(self) -> list[UniqueConstraint]: ...
@cached_property
def db_returning_fields(self) -> list[Field[Any, Any]]: ...
@cached_property
def pk_fields(self) -> list[Field[Any, Any]]: ...
@property
def is_composite_pk(self) -> bool: ...
django-stubs-5.2.9/django-stubs/db/models/query.pyi 0000664 0000000 0000000 00000031622 15134010516 0022267 0 ustar 00root root 0000000 0000000 import datetime
from collections.abc import AsyncIterator, Collection, Iterable, Iterator, Mapping, Sequence, Sized
from typing import Any, Generic, Literal, NamedTuple, TypeAlias, overload
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.sql.query import Query, RawQuery
from django.utils.functional import cached_property
from typing_extensions import Self, TypeVar, deprecated
_T = TypeVar("_T", covariant=True)
_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
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]):
def __iter__(self) -> Iterator[NamedTuple]: ...
class FlatValuesListIterable(BaseIterable[_T]):
def __iter__(self) -> Iterator[_T]: ...
class QuerySet(Iterable[_Row], Sized, Generic[_Model, _Row]):
model: type[_Model]
query: Query
_iterable_class: type[BaseIterable]
_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 __len__(self) -> int: ...
def __bool__(self) -> bool: ...
def __class_getitem__(cls, item: type[_Model]) -> Self: ...
def __getstate__(self) -> dict[str, Any]: ...
# 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: ...
# 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 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 explain(self, *, format: str | None = None, **options: Any) -> str: ...
async def aexplain(self, *, format: str | None = None, **options: Any) -> str: ...
def contains(self, obj: Model) -> bool: ...
async def acontains(self, obj: Model) -> bool: ...
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 count(self) -> int: ...
async def acount(self) -> int: ...
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 using(self, alias: str | None) -> Self: ...
@property
def ordered(self) -> bool: ...
@property
def db(self) -> str: ...
def _fetch_all(self) -> None: ...
def resolve_expression(self, *args: Any, **kwargs: Any) -> Any: ...
def __iter__(self) -> Iterator[_Row]: ...
def __aiter__(self) -> AsyncIterator[_Row]: ...
@overload
def __getitem__(self, i: int) -> _Row: ...
@overload
def __getitem__(self, s: slice) -> Self: ...
class RawQuerySet(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,
) -> None: ...
def __len__(self) -> int: ...
def __iter__(self) -> Iterator[_Model]: ...
def __bool__(self) -> bool: ...
@overload
def __getitem__(self, k: int) -> _Model: ...
@overload
def __getitem__(self, k: str) -> Any: ...
@overload
def __getitem__(self, k: slice) -> Self: ...
@cached_property
def columns(self) -> list[str]: ...
@property
def db(self) -> str: ...
def iterator(self) -> Iterator[_Model]: ...
@cached_property
def model_fields(self) -> dict[str, str]: ...
@overload
def prefetch_related(self, clear: None, /) -> Self: ...
@overload
def prefetch_related(self, *lookups: str | Prefetch[_LookupT, _PrefetchedQuerySetT, _ToAttrT]) -> Self: ...
def resolve_model_init_order(self) -> tuple[list[str], list[int], list[tuple[str, int]]]: ...
def using(self, alias: str | None) -> Self: ...
# 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: ...
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]: ...
@deprecated(
"get_current_queryset() is deprecated and will be removed in Django 6.0. Use get_current_querysets() instead."
)
def get_current_queryset(self, level: int) -> _PrefetchedQuerySetT | None: ...
def get_current_querysets(self, level: int) -> list[_PrefetchedQuerySetT] | None: ...
def prefetch_related_objects(model_instances: Sequence[_Model], *related_lookups: str | Prefetch) -> None: ...
async def aprefetch_related_objects(model_instances: Sequence[_Model], *related_lookups: str | Prefetch) -> None: ...
def get_prefetcher(instance: Model, through_attr: str, to_attr: str) -> tuple[Any, Any, bool, bool]: ...
class InstanceCheckMeta(type): ...
class EmptyQuerySet(metaclass=InstanceCheckMeta): ...
django-stubs-5.2.9/django-stubs/db/models/query_utils.pyi 0000664 0000000 0000000 00000007755 15134010516 0023521 0 ustar 00root root 0000000 0000000 from collections.abc import Collection, Iterable, Iterator, Mapping, Sequence
from typing import Any, ClassVar, Literal, NamedTuple, TypeVar
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
class PathInfo(NamedTuple):
from_opts: Options
to_opts: Options
target_fields: tuple[Field, ...]
join_field: Field
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 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 referenced_base_fields(self) -> set[str]: ...
def replace_expressions(self, replacements: dict[tree.Node, tree.Node]) -> tree.Node: ...
class DeferredAttribute:
field: Field
def __init__(self, field: Field) -> None: ...
def __get__(self, instance: Model | None, cls: type[Model] | None = None) -> Any: ...
_R = TypeVar("_R", bound=type)
class RegisterLookupMixin:
class_lookups: ClassVar[dict[str, Any]]
lookup_name: str
@classmethod
def get_lookups(cls) -> 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_lookup(cls, lookup: _R, lookup_name: str | None = None) -> _R: ...
@classmethod
def _unregister_lookup(cls, lookup: type[Lookup], lookup_name: str | None = None) -> None: ...
def select_related_descend(
field: Field,
restricted: bool,
requested: Mapping[str, Any] | None,
load_fields: Collection[str] | None,
reverse: bool = False,
) -> 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: ...
django-stubs-5.2.9/django-stubs/db/models/signals.pyi 0000664 0000000 0000000 00000001732 15134010516 0022561 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from django.apps.registry import Apps
from django.db.models.base import Model
from django.dispatch import Signal
from django.dispatch.dispatcher import _AnyHashable
class_prepared: Signal
class ModelSignal(Signal):
def connect( # type: ignore[override]
self,
receiver: Callable,
sender: type[Model] | str | None = None,
weak: bool = True,
dispatch_uid: _AnyHashable | None = None,
apps: Apps | None = None,
) -> None: ...
def disconnect( # type: ignore[override]
self,
receiver: Callable | 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
django-stubs-5.2.9/django-stubs/db/models/sql/ 0000775 0000000 0000000 00000000000 15134010516 0021172 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/db/models/sql/__init__.pyi 0000664 0000000 0000000 00000000635 15134010516 0023460 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"]
django-stubs-5.2.9/django-stubs/db/models/sql/compiler.pyi 0000664 0000000 0000000 00000015776 15134010516 0023547 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterable, Iterator, Sequence
from datetime import date, datetime
from decimal import Decimal
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.datastructures import _ListOrTuple
from django.utils.functional import cached_property
_ParamT: TypeAlias = str | int
_ParamsT: TypeAlias = _ListOrTuple[_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: Any
def __init__(self, query: Query, connection: BaseDatabaseWrapper, using: str | None) -> 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
) -> list[Expression]: ...
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_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 as_sql(self, with_limits: bool = True, with_col_aliases: bool = False) -> _AsSqlType: ...
def get_default_columns(
self, 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]],
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], Expression]]: ...
def apply_converters(
self, rows: Iterable[Iterable[Any]], converters: dict[int, tuple[list[Callable], Expression]]
) -> Iterator[list[None | date | datetime | float | Decimal | UUID | bytes | str]]: ...
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]: ...
def composite_fields_to_tuples(
self, rows: Iterable[Any], expressions: Iterable[Expression]
) -> Iterator[list[tuple[Any, ...]]]: ...
def has_composite_fields(self, expressions: Iterable[Expression]) -> bool: ...
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: Callable[[Any, SQLInsertCompiler, BaseDatabaseWrapper], str],
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]]]: ...
def as_sql(self) -> list[_AsSqlType]: ... # type: ignore[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: ...
def as_sql(self) -> _AsSqlType: ... # type: ignore[override]
class SQLUpdateCompiler(SQLCompiler):
query: UpdateQuery
def as_sql(self) -> _AsSqlType: ... # type: ignore[override]
def execute_sql(self, result_type: Literal["cursor", "no results"]) -> int: ... # type: ignore[override]
def pre_sql_setup(self) -> None: ... # type: ignore[override]
class SQLAggregateCompiler(SQLCompiler):
query: AggregateQuery
col_count: int
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]]]: ...
django-stubs-5.2.9/django-stubs/db/models/sql/constants.pyi 0000664 0000000 0000000 00000000476 15134010516 0023740 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"]
django-stubs-5.2.9/django-stubs/db/models/sql/datastructures.pyi 0000664 0000000 0000000 00000003132 15134010516 0024771 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
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: ...
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: ...
django-stubs-5.2.9/django-stubs/db/models/sql/query.pyi 0000664 0000000 0000000 00000024617 15134010516 0023074 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
class JoinInfo(NamedTuple):
final_field: Field
targets: tuple[Any, ...]
opts: Any
joins: list[str]
path: list[Any]
transform_function: Callable[[Field, 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 | tuple] | None: ...
class Query(BaseExpression):
related_ids: list[int] | None
related_updates: dict[type[Model], list[tuple[Field, None, int | str]]]
values: list[Any]
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: None | Sequence[Combinable] | Sequence[str] | Literal[True]
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
select_for_no_key_update: bool
select_related: dict[str, Any] | bool
max_depth: int
join_class: type[Join]
values_select: tuple
selected: dict[str, int | str | Expression] | None
annotation_select_mask: list[str] | None
combinator: str | None
combinator_all: bool
combined_queries: tuple
extra_select_mask: set[str] | None
extra_tables: tuple
extra_order_by: Sequence[_OrderByFieldName]
deferred_loading: tuple[set[str] | frozenset[str], bool]
explain_query: bool
explain_format: str | None
explain_options: dict[str, int]
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
def output_field(self) -> Field: ...
@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]: ...
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: list[str], opts: Any, allow_many: bool = True, fail_on_missing: bool = False
) -> tuple[list[Any], Any, tuple[Any, ...], list[str]]: ...
def get_meta(self) -> Options: ...
def clone(self) -> Query: ...
def chain(self, klass: type[Query] | None = None) -> Query: ...
def get_count(self, using: str) -> int: ...
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: ...
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, ...], joins: list[str], path: list[PathInfo]
) -> tuple[tuple[Field, ...], 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: ...
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) -> 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
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"]
django-stubs-5.2.9/django-stubs/db/models/sql/subqueries.pyi 0000664 0000000 0000000 00000003240 15134010516 0024103 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):
select: tuple
where_class: type[WhereNode]
where: WhereNode
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):
select: tuple
where_class: type[WhereNode]
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
where: WhereNode
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, type[Model] | None, Case]]) -> None: ...
def add_related_update(self, model: type[Model], field: Field, value: int | str) -> None: ...
def get_related_updates(self) -> list[UpdateQuery]: ...
class InsertQuery(Query):
select: tuple
where: WhereNode
where_class: type[WhereNode]
fields: Iterable[Field]
objs: list[Model]
raw: bool
def __init__(self, *args: Any, ignore_conflicts: bool = ..., **kwargs: Any) -> None: ...
def insert_values(self, fields: Iterable[Field], objs: list[Model], raw: bool = False) -> None: ...
class AggregateQuery(Query):
select: tuple
sub_params: tuple
where: WhereNode
where_class: type[WhereNode]
__all__ = ["AggregateQuery", "DeleteQuery", "InsertQuery", "UpdateQuery"]
django-stubs-5.2.9/django-stubs/db/models/sql/where.pyi 0000664 0000000 0000000 00000004021 15134010516 0023024 0 ustar 00root root 0000000 0000000 from collections.abc import 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.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):
connector: str
negated: bool
default: str
resolved: bool
conditional: bool
def split_having(self, negated: bool = ...) -> tuple[WhereNode | None, WhereNode | None]: ...
def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
def get_group_by_cols(self, alias: str | None = ...) -> list[Expression]: ...
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 resolve_expression(self, *args: Any, **kwargs: Any) -> WhereNode: ...
@cached_property
def output_field(self) -> BooleanField: ...
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 select_format(self, compiler: SQLCompiler, sql: str, params: _ParamsT) -> _AsSqlType: ...
class NothingNode:
contains_aggregate: bool
def as_sql(
self, compiler: SQLCompiler | None = None, connection: BaseDatabaseWrapper | None = None
) -> _AsSqlType: ...
class ExtraWhere:
contains_aggregate: 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: ...
django-stubs-5.2.9/django-stubs/db/models/utils.pyi 0000664 0000000 0000000 00000001031 15134010516 0022251 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
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:
def __init_subclass__(cls, **kwargs: Any) -> None: ...
django-stubs-5.2.9/django-stubs/db/transaction.pyi 0000664 0000000 0000000 00000004222 15134010516 0022160 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from contextlib import AbstractContextManager
from types import TracebackType
from typing import Any, TypeVar, overload
from django.db import ProgrammingError
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: ...
def savepoint(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 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]: ...
django-stubs-5.2.9/django-stubs/db/utils.pyi 0000664 0000000 0000000 00000004061 15134010516 0020774 0 ustar 00root root 0000000 0000000 from collections.abc import 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
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): ...
class DatabaseErrorWrapper:
def __init__(self, wrapper: Any) -> None: ...
def __enter__(self) -> None: ...
def __exit__(
self,
exc_type: type[BaseException] | None,
exc_value: BaseException | None,
exc_tb: TracebackType | None,
) -> None: ...
def load_backend(backend_name: str) -> Any: ...
class ConnectionHandler(BaseConnectionHandler[BaseDatabaseWrapper]):
def configure_settings(self, databases: dict[str, Any] | None) -> dict[str, Any]: ...
@property
def databases(self) -> dict[str, dict[str, Any]]: ...
def create_connection(self, alias: str) -> BaseDatabaseWrapper: ...
def close_all(self) -> None: ...
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]]: ...
django-stubs-5.2.9/django-stubs/dispatch/ 0000775 0000000 0000000 00000000000 15134010516 0020322 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/dispatch/__init__.pyi 0000664 0000000 0000000 00000000164 15134010516 0022605 0 ustar 00root root 0000000 0000000 from django.dispatch.dispatcher import Signal as Signal
from django.dispatch.dispatcher import receiver as receiver
django-stubs-5.2.9/django-stubs/dispatch/dispatcher.pyi 0000664 0000000 0000000 00000003114 15134010516 0023172 0 ustar 00root root 0000000 0000000 import threading
from collections.abc import Callable, MutableMapping
from logging import Logger
from typing import Any, TypeAlias, 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,
sender: object | None = None,
weak: bool = True,
dispatch_uid: _AnyHashable | None = None,
) -> None: ...
def disconnect(
self, receiver: Callable | 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, str | None]]: ...
async def asend(self, sender: Any, **named: Any) -> list[tuple[Callable, str | None]]: ...
def send_robust(self, sender: Any, **named: Any) -> list[tuple[Callable, Exception | Any]]: ...
async def asend_robust(self, sender: Any, **named: Any) -> list[tuple[Callable, 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]: ...
django-stubs-5.2.9/django-stubs/forms/ 0000775 0000000 0000000 00000000000 15134010516 0017651 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/forms/__init__.pyi 0000664 0000000 0000000 00000004523 15134010516 0022137 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 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 *
django-stubs-5.2.9/django-stubs/forms/boundfield.pyi 0000664 0000000 0000000 00000006111 15134010516 0022506 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
_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: ...
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: ...
def __html__(self) -> SafeString: ...
def as_textarea(self, attrs: _AttrsT | None = None, **kwargs: Any) -> SafeString: ...
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: ...
@property
def initial(self) -> Any: ...
def build_widget_attrs(self, attrs: _AttrsT, widget: Widget | None = None) -> _AttrsT: ...
@property
def widget_type(self) -> str: ...
@property
def use_fieldset(self) -> bool: ...
@property
def aria_describedby(self) -> str | None: ...
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: ...
__all__ = ("BoundField",)
django-stubs-5.2.9/django-stubs/forms/fields.pyi 0000664 0000000 0000000 00000051432 15134010516 0021647 0 ustar 00root root 0000000 0000000 import datetime
from collections.abc import Collection, Iterator, Sequence
from decimal import Decimal
from re import Pattern
from typing import Any, ClassVar, Protocol, 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
# 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 `Union[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: Sequence[_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: ...
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: Sequence[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
def to_python(self, value: Any | None) -> str | None: ...
def widget_attrs(self, widget: Widget) -> dict[str, Any]: ...
class IntegerField(Field):
max_value: int | None
min_value: int | None
step_size: int | None
re_decimal: Any
def __init__(
self,
*,
max_value: int | None = None,
min_value: int | None = None,
step_size: 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: Sequence[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
def to_python(self, value: Any | None) -> int | None: ...
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: Sequence[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
def to_python(self, value: Any | None) -> float | None: ... # type: ignore[override]
def validate(self, value: float) -> None: ...
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: Sequence[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
def to_python(self, value: Any | None) -> Decimal | None: ... # type: ignore[override]
def validate(self, value: Decimal) -> None: ...
def widget_attrs(self, widget: Widget) -> dict[str, Any]: ...
class BaseTemporalField(Field):
input_formats: Any
def __init__(
self,
*,
input_formats: Any | 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: Sequence[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
def to_python(self, value: str | None) -> Any | None: ...
def strptime(self, value: str, format: str) -> Any: ...
class DateField(BaseTemporalField):
def to_python(self, value: None | str | datetime.datetime | datetime.date) -> datetime.date | None: ...
def strptime(self, value: str, format: str) -> datetime.date: ...
class TimeField(BaseTemporalField):
def to_python(self, value: None | str | datetime.time) -> datetime.time | None: ...
def strptime(self, value: str, format: str) -> datetime.time: ...
class DateTimeFormatsIterator:
def __iter__(self) -> Iterator[str]: ...
class DateTimeField(BaseTemporalField):
def to_python(self, value: None | str | datetime.datetime | datetime.date) -> datetime.datetime | None: ...
def strptime(self, value: str, format: str) -> datetime.datetime: ...
class DurationField(Field):
def prepare_value(self, value: datetime.timedelta | str | None) -> str | None: ...
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: Sequence[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
class EmailField(CharField):
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: Sequence[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
class FileField(Field):
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: Sequence[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
def clean(self, data: Any, initial: Any | None = None) -> Any: ...
def to_python(self, data: File | None) -> File | None: ...
def bound_data(self, data: Any | None, initial: Any) -> Any: ...
def has_changed(self, initial: Any | None, data: Any | None) -> bool: ...
class ImageField(FileField):
def to_python(self, data: File | None) -> File | None: ...
def widget_attrs(self, widget: Widget) -> dict[str, Any]: ...
class URLField(CharField):
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: Sequence[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
assume_scheme: str | None = None,
) -> None: ...
def to_python(self, value: Any | None) -> str | None: ...
class BooleanField(Field):
def to_python(self, value: Any | None) -> bool: ...
def validate(self, value: Any) -> None: ...
def has_changed(self, initial: Any | None, data: Any | None) -> bool: ...
class NullBooleanField(BooleanField):
def to_python(self, value: Any | None) -> bool | None: ... # type: ignore[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: Sequence[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
# Real return type of `to_python` is `str`, but it results in errors when
# subclassing `ModelChoiceField`: `# type: ignore[override]` is not inherited
def to_python(self, value: Any | None) -> Any: ...
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: Sequence[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
def clean(self, value: Any) -> Any: ...
class MultipleChoiceField(ChoiceField):
def to_python(self, value: Any | None) -> list[str]: ...
def validate(self, value: Any) -> None: ...
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: Sequence[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
def clean(self, value: Any) -> Any: ...
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: Sequence[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
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: Sequence[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
def compress(self, data_list: Any) -> Any: ...
def has_changed(self, initial: Any | None, data: Any | None) -> bool: ...
def clean(self, value: Any) -> Any: ...
def validate(self, value: Any) -> None: ...
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: Sequence[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
class SplitDateTimeField(MultiValueField):
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: Sequence[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
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: Sequence[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
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: Sequence[_ValidatorCallable] = ...,
localize: bool = ...,
disabled: bool = ...,
label_suffix: str | None = ...,
) -> None: ...
class UUIDField(CharField):
def prepare_value(self, value: Any | None) -> Any | None: ...
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: Any
decoder: Any
def __init__(self, encoder: Any | None = None, decoder: Any | None = None, **kwargs: Any) -> None: ...
def to_python(self, value: Any) -> Any: ...
def bound_data(self, data: Any, initial: Any) -> Any: ...
def prepare_value(self, value: Any) -> str: ...
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",
)
django-stubs-5.2.9/django-stubs/forms/forms.pyi 0000664 0000000 0000000 00000006443 15134010516 0021531 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.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
class DeclarativeFieldsMetaclass(MediaDefiningClass): ...
class BaseForm(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,
) -> 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: ...
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")
django-stubs-5.2.9/django-stubs/forms/formsets.pyi 0000664 0000000 0000000 00000010102 15134010516 0022230 0 ustar 00root root 0000000 0000000 from collections.abc import Iterator, Mapping, Sequence, Sized
from typing import Any, ClassVar, Generic, TypeVar
from django.db.models.fields import _ErrorMessagesDict
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
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]
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
def clean(self) -> dict[str, int | None]: ...
class BaseFormSet(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,
form_renderer: BaseRenderer = ...,
renderer: BaseRenderer = ...,
) -> None: ...
def __iter__(self) -> Iterator[_F]: ...
def __getitem__(self, index: int) -> _F: ...
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: ...
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,
) -> type[BaseFormSet[_F]]: ...
def all_valid(formsets: Sequence[BaseFormSet[_F]]) -> bool: ...
__all__ = ("BaseFormSet", "all_valid", "formset_factory")
django-stubs-5.2.9/django-stubs/forms/models.pyi 0000664 0000000 0000000 00000030635 15134010516 0021666 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Collection, Container, Iterator, Mapping, MutableMapping, Sequence
from typing import Any, ClassVar, Generic, Literal, TypeAlias, TypeVar, 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.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
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], Field]
_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, 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 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)
class BaseModelFormSet(BaseFormSet[_ModelFormT], Generic[_M, _ModelFormT]):
model: type[_M]
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: ...
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]: ...
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]: ...
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] = ...,
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 # 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: ...
def initial_form_count(self) -> int: ...
@classmethod
def get_default_prefix(cls) -> str: ...
def save_new(self, form: _ModelFormT, commit: bool = True) -> _M: ...
def add_fields(self, form: _ModelFormT, index: int | None) -> None: ...
def get_unique_error_message(self, unique_check: Sequence[str]) -> str: ...
def inlineformset_factory(
parent_model: type[_ParentM],
model: type[_M],
form: type[_ModelFormT] = ...,
formset: type[BaseInlineFormSet] = ...,
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):
disabled: bool
help_text: _StrOrPromise
required: bool
show_hidden_initial: bool
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: ...
def clean(self, value: Any) -> Model: ...
def has_changed(self, initial: Any, data: Any) -> bool: ...
class ModelChoiceIteratorValue:
def __init__(self, value: Any, instance: Model) -> None: ...
class ModelChoiceIterator(BaseChoiceIterator):
field: ModelChoiceField
queryset: QuerySet
def __init__(self, field: ModelChoiceField) -> None: ...
def __iter__(self) -> Iterator[tuple[ModelChoiceIteratorValue | str, str]]: ...
def __len__(self) -> int: ...
def __bool__(self) -> bool: ...
def choice(self, obj: Model) -> tuple[ModelChoiceIteratorValue, str]: ...
class ModelChoiceField(ChoiceField, Generic[_M]):
disabled: bool
help_text: _StrOrPromise
required: bool
show_hidden_initial: bool
validators: list[Any]
iterator: type[ModelChoiceIterator]
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: ...
def label_from_instance(self, obj: _M) -> str: ...
choices: _PropertyDescriptor[
_ChoicesInput | _ChoicesCallable | CallableChoiceIterator,
_ChoicesInput | CallableChoiceIterator | ModelChoiceIterator,
]
def prepare_value(self, value: Any) -> Any: ...
def to_python(self, value: Any | None) -> _M | None: ...
def validate(self, value: _M | None) -> None: ...
def has_changed(self, initial: Model | int | str | UUID | None, data: int | str | None) -> bool: ...
class ModelMultipleChoiceField(ModelChoiceField[_M]):
disabled: bool
empty_label: _StrOrPromise | None
help_text: _StrOrPromise
required: bool
show_hidden_initial: bool
widget: _ClassLevelWidgetT
hidden_widget: type[Widget]
def __init__(self, queryset: Manager[_M] | QuerySet[_M] | None, **kwargs: Any) -> None: ...
def to_python(self, value: Any) -> list[_M]: ... # type: ignore[override]
def clean(self, value: Any) -> QuerySet[_M]: ...
def prepare_value(self, value: Any) -> Any: ...
def has_changed(self, initial: Collection[Any] | None, data: Collection[Any] | None) -> bool: ... # type: ignore[override]
def modelform_defines_fields(form_class: type[ModelForm]) -> bool: ...
@overload
def _get_foreign_key(
parent_model: type[Model], model: type[Model], fk_name: str | None = None, can_fail: Literal[True] = True
) -> ForeignKey | None: ...
@overload
def _get_foreign_key(
parent_model: type[Model], model: type[Model], fk_name: str | None = None, can_fail: Literal[False] = False
) -> ForeignKey: ...
__all__ = (
"ALL_FIELDS",
"BaseInlineFormSet",
"BaseModelForm",
"BaseModelFormSet",
"ModelChoiceField",
"ModelForm",
"ModelMultipleChoiceField",
"fields_for_model",
"inlineformset_factory",
"model_to_dict",
"modelform_factory",
"modelformset_factory",
)
django-stubs-5.2.9/django-stubs/forms/renderers.pyi 0000664 0000000 0000000 00000002727 15134010516 0022375 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 deprecated
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]: ...
@deprecated(
"Jinja2DivFormRenderer transitional form renderer is deprecated and will be removed in Django 6.0. Use Jinja2 instead."
)
class Jinja2DivFormRenderer(Jinja2):
form_template_name: str
formset_template_name: str
class TemplatesSetting(BaseRenderer):
def get_template(self, template_name: str) -> Template | None: ...
django-stubs-5.2.9/django-stubs/forms/utils.pyi 0000664 0000000 0000000 00000005461 15134010516 0021542 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
_DataT: TypeAlias = Mapping[str, Any] # noqa: PYI047
_FilesT: TypeAlias = MultiValueDict[str, UploadedFile] # 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`:
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]: ...
class ErrorList(UserList[ValidationError | _StrOrPromise], RenderableErrorMixin):
template_name: str
template_name_text: str
template_name_ul: str
error_class: str
renderer: BaseRenderer
field_name: str | None
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]: ...
def get_json_data(self, escape_html: bool = False) -> list[dict[str, str]]: ...
def from_current_timezone(value: datetime) -> datetime: ...
def to_current_timezone(value: datetime) -> datetime: ...
django-stubs-5.2.9/django-stubs/forms/widgets.pyi 0000664 0000000 0000000 00000027434 15134010516 0022054 0 ustar 00root root 0000000 0000000 import datetime
from collections.abc import Iterable, Iterator, Mapping, Sequence
from typing import Any, Literal, Protocol, TypeAlias, type_check_only
import _typeshed
from django.core.files.base import File
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 Self
_OptAttrs: TypeAlias = dict[str, Any]
class MediaOrderConflictWarning(RuntimeWarning): ...
class MediaAsset:
element_template: str
def __init__(self, path: str, **attributes: Any) -> None: ...
def __eq__(self, other: object) -> bool: ...
def __hash__(self) -> int: ...
def __html__(self) -> SafeString: ...
@property
def path(self) -> str: ...
class Script(MediaAsset):
element_template: str
def __init__(self, src: 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) -> SafeString: ...
def render_js(self) -> list[SafeString]: ...
def render_css(self) -> 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: ...
class MediaDefiningClass(type):
def __new__(
mcs: type[_typeshed.Self], # noqa: TID251
name: str,
bases: tuple[type, ...],
attrs: dict[str, Any],
) -> _typeshed.Self: ... # noqa: TID251
class Widget(metaclass=MediaDefiningClass):
needs_multipart_form: bool
is_localized: bool
is_required: bool
supports_microseconds: bool
attrs: _OptAttrs
template_name: str
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]]: ...
def format_value(self, value: Any) -> str | None: ...
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
template_name: str
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: ...
def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ...
class HiddenInput(Input):
choices: _Choices
input_type: str
template_name: str
class MultipleHiddenInput(HiddenInput):
template_name: str
class FileInput(Input):
allow_multiple_selected: bool
input_type: str
template_name: str
needs_multipart_form: bool
def format_value(self, value: Any) -> None: ...
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 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 | str | None) -> bool: ...
def get_context(self, name: str, value: Any, attrs: _OptAttrs | 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: ...
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: ...
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: ...
class ChoiceWidget(Widget):
allow_multiple_selected: bool
input_type: str | None
template_name: str
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: ...
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 get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ...
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]: ...
def id_for_label(self, id_: str, index: str = "0") -> str: ...
def value_from_datadict(self, data: _DataT, files: _FilesT, name: str) -> Any: ...
def format_value(self, value: Any) -> list[str]: ... # type: ignore[override]
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
def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ...
def use_required_attribute(self, initial: Any) -> bool: ...
class NullBooleanSelect(Select):
def __init__(self, attrs: _OptAttrs | None = None) -> None: ...
def format_value(self, value: Any) -> str: ... # type: ignore[override]
def value_from_datadict(self, data: _DataT, files: _FilesT, name: str) -> bool | None: ...
class SelectMultiple(Select):
allow_multiple_selected: bool
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: ...
class RadioSelect(ChoiceWidget):
can_add_related: bool
input_type: str
template_name: str
option_template_name: str
class CheckboxSelectMultiple(ChoiceWidget):
can_add_related: bool
input_type: str
template_name: str
option_template_name: str
def use_required_attribute(self, initial: Any) -> bool: ...
def value_omitted_from_data(self, data: _DataT, files: _FilesT, name: str) -> bool: ...
def id_for_label(self, id_: str, index: str | None = None) -> str: ...
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
def is_hidden(self) -> bool: ...
def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ...
def id_for_label(self, id_: str) -> str: ...
def value_from_datadict(self, data: _DataT, files: _FilesT, name: str) -> list[Any]: ...
def value_omitted_from_data(self, data: _DataT, files: _FilesT, name: str) -> bool: ...
def decompress(self, value: Any) -> Any | None: ...
@property
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: ...
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: Any
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: ...
def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ...
def format_value(self, value: Any) -> dict[str, str | int | None]: ... # type: ignore[override]
def id_for_label(self, id_: str) -> str: ...
def value_from_datadict(self, data: _DataT, files: _FilesT, name: str) -> str | None | Any: ...
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",
"TelInput",
"TextInput",
"Textarea",
"TimeInput",
"URLInput",
"Widget",
)
django-stubs-5.2.9/django-stubs/http/ 0000775 0000000 0000000 00000000000 15134010516 0017502 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/http/__init__.pyi 0000664 0000000 0000000 00000003653 15134010516 0021773 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",
]
django-stubs-5.2.9/django-stubs/http/cookie.pyi 0000664 0000000 0000000 00000000154 15134010516 0021476 0 ustar 00root root 0000000 0000000 from http.cookies import SimpleCookie as SimpleCookie
def parse_cookie(cookie: str) -> dict[str, str]: ...
django-stubs-5.2.9/django-stubs/http/multipartparser.pyi 0000664 0000000 0000000 00000004242 15134010516 0023465 0 ustar 00root root 0000000 0000000 import re
from collections.abc import Iterator, Mapping
from typing import IO, Any, ClassVar, Literal
from django.http.request import QueryDict
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: IO[bytes],
upload_handlers: list[Any] | ImmutableList[Any],
encoding: str | None = ...,
) -> None: ...
def parse(self) -> tuple[QueryDict, MultiValueDict]: ...
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: IO[bytes]
chunk_size: int
def __init__(self, flo: IO[bytes], 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")
django-stubs-5.2.9/django-stubs/http/request.pyi 0000664 0000000 0000000 00000023400 15134010516 0021714 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, TypeAlias, TypeVar, 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.urls import ResolverMatch
from django.utils.datastructures import CaseInsensitiveMapping, ImmutableList, MultiValueDict
from django.utils.functional import cached_property
from typing_extensions import Self
RAISE_ERROR: object
host_validation_re: Pattern[str]
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]
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 added by optional parts of Django
# django.contrib.admin views:
current_app: str
# django.contrib.auth.middleware.AuthenticationMiddleware:
user: _AnyUser
# django.contrib.auth.middleware.AuthenticationMiddleware:
auser: Callable[[], Awaitable[_AnyUser]]
# django.middleware.locale.LocaleMiddleware:
LANGUAGE_CODE: str
# django.contrib.sites.middleware.CurrentSiteMiddleware
site: Site
# django.contrib.sessions.middleware.SessionMiddleware
session: SessionBase
# The magic. If we instantiate HttpRequest directly somewhere, it has
# mutable GET and POST. However, both ASGIRequest and WSGIRequest have immutable,
# so when we use HttpRequest to refer to any of them we want exactly this.
# Case when some function creates *exactly* HttpRequest (not subclass)
# remain uncovered, however it's probably the best solution we can afford.
def __new__(cls) -> _MutableHttpRequest: ...
# When both __init__ and __new__ are present, mypy will prefer __init__
# (see comments in mypy.checkmember.type_object_type)
# def __init__(self) -> None: ...
def get_host(self) -> str: ...
def get_port(self) -> str: ...
def get_full_path(self, force_append_slash: bool = ...) -> str: ...
def get_full_path_info(self, force_append_slash: bool = ...) -> 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: ...
@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: BinaryIO
) -> tuple[QueryDict, MultiValueDict[str, uploadedfile.UploadedFile]]: ...
@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]: ...
@type_check_only
class _MutableHttpRequest(HttpRequest):
GET: QueryDict # type: ignore[assignment]
POST: QueryDict # type: ignore[assignment]
_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
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
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: ...
def __setitem__(self, key: str | bytes, value: str | bytes) -> None: ...
def __delitem__(self, key: str | bytes) -> None: ...
def setlist(self, key: str | bytes, list_: Iterable[str | bytes]) -> None: ...
def setlistdefault(self, key: str | bytes, default_list: list[str] | None = ...) -> list[str]: ...
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
def pop(self, key: str | bytes, default: str | _Z = ..., /) -> list[str] | _Z: ...
def popitem(self) -> tuple[str, list[str]]: ... # type:ignore[override]
def clear(self) -> None: ...
def setdefault(self, key: str | bytes, default: str | bytes | None = ...) -> str: ...
def copy(self) -> QueryDict: ...
def urlencode(self, safe: str | None = ...) -> str: ...
@type_check_only
class _ImmutableQueryDict(QueryDict):
_mutable: Literal[False]
def __setitem__(self, key: str | bytes, value: str | bytes) -> NoReturn: ...
def __delitem__(self, key: str | bytes) -> NoReturn: ...
def setlist(self, key: str | bytes, list_: Iterable[str | bytes]) -> NoReturn: ...
def setlistdefault(self, key: str | bytes, default_list: list[str] | None = ...) -> NoReturn: ...
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
def pop(self, key: str | bytes, /) -> NoReturn: ...
@overload
def pop(self, key: str | bytes, default: str | _Z = ..., /) -> NoReturn: ...
def popitem(self) -> NoReturn: ...
def clear(self) -> NoReturn: ...
def setdefault(self, key: str | bytes, default: str | bytes | None = ...) -> NoReturn: ...
def copy(self) -> QueryDict: ... # type: ignore[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.
def __getitem__(self, key: str) -> str: ...
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: ...
django-stubs-5.2.9/django-stubs/http/response.pyi 0000664 0000000 0000000 00000014060 15134010516 0022064 0 ustar 00root root 0000000 0000000 import datetime
from collections.abc import AsyncIterable, AsyncIterator, Iterable, Iterator
from http.cookies import SimpleCookie
from io import BytesIO
from json import JSONEncoder
from typing import Any, Literal, NoReturn, TypeVar, overload, type_check_only
from django.utils.datastructures import CaseInsensitiveMapping, _PropertyDescriptor
from django.utils.functional import _StrOrPromise, cached_property
class BadHeaderError(ValueError): ...
_Z = TypeVar("_Z")
class ResponseHeaders(CaseInsensitiveMapping[str]):
def __init__(self, data: dict[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: dict[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
def __iter__(self) -> Iterator[bytes]: ...
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: ...
def __iter__(self) -> Iterator[bytes]: ...
def __aiter__(self) -> AsyncIterator[bytes]: ...
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, **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: ...
django-stubs-5.2.9/django-stubs/middleware/ 0000775 0000000 0000000 00000000000 15134010516 0020640 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/middleware/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0023110 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/middleware/cache.pyi 0000664 0000000 0000000 00000002176 15134010516 0022434 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, _AsyncGetResponseCallable, _GetResponseCallable
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: _GetResponseCallable | _AsyncGetResponseCallable,
cache_timeout: float | None = ...,
page_timeout: float | None = ...,
**kwargs: Any,
) -> None: ...
django-stubs-5.2.9/django-stubs/middleware/clickjacking.pyi 0000664 0000000 0000000 00000000603 15134010516 0023776 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: ...
django-stubs-5.2.9/django-stubs/middleware/common.pyi 0000664 0000000 0000000 00000002014 15134010516 0022650 0 ustar 00root root 0000000 0000000 from typing import 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):
def process_response(self, request: HttpRequest, response: HttpResponseBase) -> HttpResponseBase: ...
def is_internal_request(self, domain: str, referer: str) -> bool: ...
def is_ignorable_request(self, request: HttpRequest, uri: str, domain: str, referer: str) -> bool: ...
django-stubs-5.2.9/django-stubs/middleware/csrf.pyi 0000664 0000000 0000000 00000003475 15134010516 0022331 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: ...
def _get_new_csrf_token() -> str: ...
django-stubs-5.2.9/django-stubs/middleware/gzip.pyi 0000664 0000000 0000000 00000000601 15134010516 0022331 0 ustar 00root root 0000000 0000000 from typing import Any, ClassVar
from django.http.request import HttpRequest
from django.http.response import HttpResponseBase
from django.utils.deprecation import MiddlewareMixin
re_accepts_gzip: Any
class GZipMiddleware(MiddlewareMixin):
max_random_bytes: ClassVar[int]
def process_response(self, request: HttpRequest, response: HttpResponseBase) -> HttpResponseBase: ...
django-stubs-5.2.9/django-stubs/middleware/http.pyi 0000664 0000000 0000000 00000000561 15134010516 0022344 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: ...
django-stubs-5.2.9/django-stubs/middleware/locale.pyi 0000664 0000000 0000000 00000000745 15134010516 0022630 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: ...
django-stubs-5.2.9/django-stubs/middleware/security.pyi 0000664 0000000 0000000 00000001205 15134010516 0023230 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
xss_filter: 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: ...
django-stubs-5.2.9/django-stubs/py.typed 0000664 0000000 0000000 00000000000 15134010516 0020210 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/shortcuts.pyi 0000664 0000000 0000000 00000003657 15134010516 0021317 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Mapping, Sequence
from typing import Any, Literal, Protocol, TypeVar, 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
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,
**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 | Model | _StrOrPromise, *args: Any, **kwargs: Any) -> str: ...
django-stubs-5.2.9/django-stubs/template/ 0000775 0000000 0000000 00000000000 15134010516 0020336 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/template/__init__.pyi 0000664 0000000 0000000 00000001476 15134010516 0022630 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")
django-stubs-5.2.9/django-stubs/template/autoreload.pyi 0000664 0000000 0000000 00000000456 15134010516 0023225 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: ...
django-stubs-5.2.9/django-stubs/template/backends/ 0000775 0000000 0000000 00000000000 15134010516 0022110 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/template/backends/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0024360 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/template/backends/base.pyi 0000664 0000000 0000000 00000001721 15134010516 0023546 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: ...
django-stubs-5.2.9/django-stubs/template/backends/django.pyi 0000664 0000000 0000000 00000002253 15134010516 0024077 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 .base import BaseEngine, _EngineTemplate
class DjangoTemplates(BaseEngine):
engine: Engine
def from_string(self, template_code: str) -> Template: ...
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: ...
django-stubs-5.2.9/django-stubs/template/backends/dummy.pyi 0000664 0000000 0000000 00000001021 15134010516 0023760 0 ustar 00root root 0000000 0000000 import string
from typing import Any
from django.http.request import HttpRequest
from .base import BaseEngine
class TemplateStrings(BaseEngine):
def __init__(self, params: dict[str, dict[Any, Any] | list[Any] | bool | str]) -> None: ...
def from_string(self, template_code: str) -> Template: ...
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: ...
django-stubs-5.2.9/django-stubs/template/backends/jinja2.pyi 0000664 0000000 0000000 00000002114 15134010516 0024006 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any
from _typeshed import Incomplete
from django.http.request import HttpRequest
from django.template.exceptions import TemplateSyntaxError
from django.utils.functional import cached_property
from .base import BaseEngine
class Jinja2(BaseEngine):
env: Any
context_processors: list[str]
def __init__(self, params: dict[str, Any]) -> None: ...
def from_string(self, template_code: str) -> Template: ...
def get_template(self, template_name: str) -> Template: ...
@cached_property
def template_context_processors(self) -> list[Callable]: ...
class Origin:
name: str
template_name: str | None
def __init__(self, name: str, template_name: str | None) -> None: ...
class Template:
template: Incomplete
backend: Jinja2
origin: Origin
def __init__(self, template: Incomplete, backend: Jinja2) -> None: ...
def render(self, context: dict[str, Any] | None = ..., request: HttpRequest | None = ...) -> str: ...
def get_exception_info(exception: TemplateSyntaxError) -> dict[str, Any]: ...
django-stubs-5.2.9/django-stubs/template/backends/utils.pyi 0000664 0000000 0000000 00000000327 15134010516 0023775 0 ustar 00root root 0000000 0000000 from typing import Any
from django.http.request import HttpRequest
from django.utils.safestring import SafeString
def csrf_input(request: HttpRequest) -> SafeString: ...
csrf_input_lazy: Any
csrf_token_lazy: Any
django-stubs-5.2.9/django-stubs/template/base.pyi 0000664 0000000 0000000 00000012633 15134010516 0022000 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
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[dict[str, str] | str]
def __init__(self, msg: str, params: tuple[dict[str, str] | str] = ...) -> 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
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]: ...
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
def tokenize(self) -> list[Token]: ...
class Parser:
tokens: list[Token] | str
tags: dict[str, Callable]
filters: dict[str, Callable]
command_stack: list[tuple[str, Token]]
libraries: dict[str, Library]
origin: Origin | None
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: ...
constant_string: str
filter_raw_string: str
filter_re: Pattern[str]
class FilterExpression:
token: str
filters: list[Any]
var: Any
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, 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]: ...
django-stubs-5.2.9/django-stubs/template/context.pyi 0000664 0000000 0000000 00000006557 15134010516 0022562 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, 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 Self
_ContextKeys: TypeAlias = int | str | Node
_ContextValues: TypeAlias = dict[str, Any] | Context
class ContextPopException(Exception): ...
class ContextDict(dict):
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: ...
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] | None = None,
use_l10n: bool | None = None,
use_tz: bool | None = None,
autoescape: bool = True,
) -> None: ...
template: Template | None
def bind_template(self, template: Template) -> AbstractContextManager[None]: ...
def new(self, values: _ContextValues | None = None) -> RequestContext: ...
def make_context(context: dict[str, Any] | None, request: HttpRequest | None = None, **kwargs: Any) -> Context: ...
django-stubs-5.2.9/django-stubs/template/context_processors.pyi 0000664 0000000 0000000 00000001167 15134010516 0025034 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import TypeVar
from django.http.request import HttpRequest
from django.utils.functional import SimpleLazyObject
_R = TypeVar("_R", bound=HttpRequest)
def csrf(request: HttpRequest) -> dict[str, SimpleLazyObject]: ...
def debug(request: HttpRequest) -> dict[str, Callable | 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]: ...
django-stubs-5.2.9/django-stubs/template/defaultfilters.pyi 0000664 0000000 0000000 00000006625 15134010516 0024107 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) -> Callable: ...
def addslashes(value: str) -> str: ...
def capfirst(value: str) -> str: ...
def escapejs_filter(value: str) -> SafeString: ...
def json_script(value: dict[str, str], element_id: SafeString) -> 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_: complex | int | str) -> str: ...
def pluralize(value: Any, arg: str = "s") -> str: ...
def phone2numeric_filter(value: str) -> str: ...
def pprint(value: Any) -> str: ...
django-stubs-5.2.9/django-stubs/template/defaulttags.pyi 0000664 0000000 0000000 00000014355 15134010516 0023374 0 ustar 00root root 0000000 0000000 from collections.abc import Iterator, Sequence
from datetime import date as real_date
from typing import Any, NamedTuple
from django.http.request import QueryDict
from django.template.base import FilterExpression, Parser, Token
from django.template.context import Context
from django.utils.safestring import SafeString
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 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: ...
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 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: ...
django-stubs-5.2.9/django-stubs/template/engine.pyi 0000664 0000000 0000000 00000004255 15134010516 0022334 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Sequence
from typing import Any, TypeAlias
from django.template.base import Origin
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: Any
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]: ...
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, context: dict[str, Any] | None = None) -> SafeString: ...
def select_template(self, template_name_list: list[str]) -> Template: ...
django-stubs-5.2.9/django-stubs/template/exceptions.pyi 0000664 0000000 0000000 00000001002 15134010516 0023233 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): ...
django-stubs-5.2.9/django-stubs/template/library.pyi 0000664 0000000 0000000 00000010105 15134010516 0022522 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Collection, Iterable, Mapping, Sequence, Sized
from typing import Any, TypeVar, overload
from django.template.base import FilterExpression, Origin, Parser, Token
from django.template.context import Context
from django.utils.safestring import SafeString
from .base import Node, NodeList, Template
class InvalidTemplateLibrary(Exception): ...
_C = TypeVar("_C", bound=Callable[..., Any])
class Library:
filters: dict[str, Callable]
tags: dict[str, Callable]
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, **flags: Any) -> _C: ...
@overload
def filter(self, name: str | None, filter_func: _C, **flags: Any) -> _C: ...
@overload
def filter(self, name: str | None = None, filter_func: None = None, **flags: Any) -> 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]: ...
def inclusion_tag(
self,
filename: Template | str,
func: Callable | 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]: ...
class TagHelperNode(Node):
func: Any
takes_context: Any
args: Any
kwargs: Any
def __init__(
self,
func: Callable,
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
kwargs: dict[str, FilterExpression]
origin: Origin
takes_context: bool | None
token: Token
target_var: str | None
def __init__(
self,
func: Callable,
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,
func: Callable,
takes_context: bool | None,
args: list[FilterExpression],
kwargs: dict[str, FilterExpression],
target_var: str | None,
) -> None: ...
class InclusionNode(TagHelperNode):
args: list[FilterExpression]
func: Callable
kwargs: dict[str, FilterExpression]
origin: Origin
takes_context: bool | None
token: Token
filename: Template | str
def __init__(
self,
func: Callable,
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,
takes_context: bool | None,
name: str,
) -> tuple[list[FilterExpression], dict[str, FilterExpression]]: ...
def import_library(name: str) -> Library: ...
django-stubs-5.2.9/django-stubs/template/loader.pyi 0000664 0000000 0000000 00000001243 15134010516 0022327 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: ...
django-stubs-5.2.9/django-stubs/template/loader_tags.pyi 0000664 0000000 0000000 00000004444 15134010516 0023353 0 ustar 00root root 0000000 0000000 import collections
from typing import Any
from django.template.base import FilterExpression, NodeList, Origin, Parser, Token
from django.template.context import Context
from django.utils.safestring import SafeString
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
origin: Origin
parent: Node | None
token: Token
def __init__(self, name: str, nodelist: NodeList, parent: Node | None = None) -> None: ...
def render(self, context: Context) -> SafeString: ...
def super(self) -> SafeString: ...
class ExtendsNode(Node):
origin: Origin
token: Token
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: ...
def render(self, context: Context) -> Any: ...
class IncludeNode(Node):
origin: Origin
token: Token
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: ...
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: ...
django-stubs-5.2.9/django-stubs/template/loaders/ 0000775 0000000 0000000 00000000000 15134010516 0021767 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/template/loaders/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0024237 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/template/loaders/app_directories.pyi 0000664 0000000 0000000 00000000130 15134010516 0025660 0 ustar 00root root 0000000 0000000 from .filesystem import Loader as FilesystemLoader
class Loader(FilesystemLoader): ...
django-stubs-5.2.9/django-stubs/template/loaders/base.pyi 0000664 0000000 0000000 00000000751 15134010516 0023427 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable
from typing import Any
from django.template.base import Origin, Template
from django.template.engine import Engine
class Loader:
engine: Engine
get_template_cache: dict[str, Any]
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: ...
django-stubs-5.2.9/django-stubs/template/loaders/cached.pyi 0000664 0000000 0000000 00000001053 15134010516 0023720 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
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):
template_cache: dict[str, Any]
loaders: list[BaseLoader]
def __init__(self, engine: Engine, loaders: Sequence[Any]) -> None: ...
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: ...
django-stubs-5.2.9/django-stubs/template/loaders/filesystem.pyi 0000664 0000000 0000000 00000001007 15134010516 0024674 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 .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: ...
def get_template_sources(self, template_name: str) -> Iterator[Origin]: ...
django-stubs-5.2.9/django-stubs/template/loaders/locmem.pyi 0000664 0000000 0000000 00000000503 15134010516 0023764 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: ...
django-stubs-5.2.9/django-stubs/template/response.pyi 0000664 0000000 0000000 00000004535 15134010516 0022726 0 ustar 00root root 0000000 0000000 import functools
from collections.abc import Callable, Iterator, Sequence
from http.cookies import SimpleCookie
from typing import Any, TypeAlias
from django.core.handlers.wsgi import WSGIRequest
from django.http import HttpResponse
from django.http.request import HttpRequest
from django.template.base import Template
from django.template.context import RequestContext
from django.test.client import Client
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) -> None: ...
def render(self) -> SimpleTemplateResponse: ...
@property
def is_rendered(self) -> bool: ...
def __iter__(self) -> Iterator[Any]: ...
class TemplateResponse(SimpleTemplateResponse):
client: Client
closed: bool
context: RequestContext
context_data: dict[str, Any] | None
cookies: SimpleCookie
csrf_cookie_set: bool
json: functools.partial
_request: HttpRequest
status_code: int
template_name: _TemplateForResponseT
templates: list[Template]
using: str | None
wsgi_request: WSGIRequest
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: ...
django-stubs-5.2.9/django-stubs/template/smartif.pyi 0000664 0000000 0000000 00000002277 15134010516 0022536 0 ustar 00root root 0000000 0000000 from typing import Any, TypeAlias
from django.template.defaulttags import TemplateLiteral
_Token: TypeAlias = list[int] | int | str
class TokenBase:
id: Any
value: Any
first: Any
second: Any
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
lbp: int
value: _Token | None
def __init__(self, value: _Token | None) -> None: ...
def display(self) -> str: ...
def eval(self, context: dict[Any, Any]) -> _Token | None: ...
class EndToken(TokenBase):
lbp: int
def nud(self, parser: Any) -> None: ...
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: ...
django-stubs-5.2.9/django-stubs/template/utils.pyi 0000664 0000000 0000000 00000001264 15134010516 0022224 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, ...]: ...
django-stubs-5.2.9/django-stubs/templatetags/ 0000775 0000000 0000000 00000000000 15134010516 0021215 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/templatetags/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0023465 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/templatetags/cache.pyi 0000664 0000000 0000000 00000001165 15134010516 0023006 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: ...
django-stubs-5.2.9/django-stubs/templatetags/i18n.pyi 0000664 0000000 0000000 00000006703 15134010516 0022525 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
register: Any
class GetAvailableLanguagesNode(Node):
variable: str
def __init__(self, variable: str) -> None: ...
def render(self, context: Context) -> str: ...
class GetLanguageInfoNode(Node):
lang_code: FilterExpression
variable: str
def __init__(self, lang_code: FilterExpression, variable: str) -> None: ...
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: ...
def render(self, context: Context) -> str: ...
class GetCurrentLanguageNode(Node):
variable: str
def __init__(self, variable: str) -> None: ...
def render(self, context: Context) -> str: ...
class GetCurrentLanguageBidiNode(Node):
variable: str
def __init__(self, variable: str) -> None: ...
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: ...
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]]: ...
def render(self, context: Context, nested: bool = False) -> str: ...
class LanguageNode(Node):
nodelist: NodeList
language: FilterExpression
def __init__(self, nodelist: NodeList, language: FilterExpression) -> None: ...
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: ...
django-stubs-5.2.9/django-stubs/templatetags/l10n.pyi 0000664 0000000 0000000 00000000632 15134010516 0022513 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: ...
django-stubs-5.2.9/django-stubs/templatetags/static.pyi 0000664 0000000 0000000 00000002165 15134010516 0023233 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: ...
django-stubs-5.2.9/django-stubs/templatetags/tz.pyi 0000664 0000000 0000000 00000002017 15134010516 0022375 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: ...
django-stubs-5.2.9/django-stubs/test/ 0000775 0000000 0000000 00000000000 15134010516 0017502 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/test/__init__.pyi 0000664 0000000 0000000 00000002366 15134010516 0021773 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",
]
django-stubs-5.2.9/django-stubs/test/client.pyi 0000664 0000000 0000000 00000040102 15134010516 0021500 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 types import TracebackType
from typing import Any, Generic, Literal, NoReturn, TypeAlias, TypedDict, TypeVar, type_check_only
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
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: ...
def read(self, size: int = ..., /) -> bytes: ...
def readline(self, size: int | None = ..., /) -> bytes: ...
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, Any] | 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, Any] | 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, Any] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _T: ...
def head(
self,
path: _StrOrPromise,
data: Any = ...,
secure: bool = ...,
*,
headers: Mapping[str, Any] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _T: ...
def trace(
self,
path: _StrOrPromise,
secure: bool = ...,
*,
headers: Mapping[str, Any] | 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, Any] | 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, Any] | 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, Any] | 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, Any] | 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, Any] | 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: Any) -> 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: tuple[type[BaseException], BaseException, TracebackType] | None
extra: dict[str, Any] | None
headers: dict[str, Any]
def __init__(
self,
enforce_csrf_checks: bool = ...,
raise_request_exception: bool = ...,
*,
headers: Mapping[str, Any] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**defaults: Any,
) -> None: ...
def request(self, **request: Any) -> _MonkeyPatchedWSGIResponse: ...
def get( # type: ignore[override]
self,
path: _StrOrPromise,
data: _GetDataType = ...,
follow: bool = ...,
secure: bool = ...,
*,
headers: Mapping[str, Any] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _MonkeyPatchedWSGIResponse: ...
def post( # type: ignore[override]
self,
path: _StrOrPromise,
data: Any = ...,
content_type: str = ...,
follow: bool = ...,
secure: bool = ...,
*,
headers: Mapping[str, Any] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _MonkeyPatchedWSGIResponse: ...
def head( # type: ignore[override]
self,
path: _StrOrPromise,
data: Any = ...,
follow: bool = ...,
secure: bool = ...,
*,
headers: Mapping[str, Any] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _MonkeyPatchedWSGIResponse: ...
def options( # type: ignore[override]
self,
path: _StrOrPromise,
data: dict[str, str] | str = ...,
content_type: str = ...,
follow: bool = ...,
secure: bool = ...,
*,
headers: Mapping[str, Any] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _MonkeyPatchedWSGIResponse: ...
def put( # type: ignore[override]
self,
path: _StrOrPromise,
data: Any = ...,
content_type: str = ...,
follow: bool = ...,
secure: bool = ...,
*,
headers: Mapping[str, Any] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _MonkeyPatchedWSGIResponse: ...
def patch( # type: ignore[override]
self,
path: _StrOrPromise,
data: Any = ...,
content_type: str = ...,
follow: bool = ...,
secure: bool = ...,
*,
headers: Mapping[str, Any] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _MonkeyPatchedWSGIResponse: ...
def delete( # type: ignore[override]
self,
path: _StrOrPromise,
data: Any = ...,
content_type: str = ...,
follow: bool = ...,
secure: bool = ...,
*,
headers: Mapping[str, Any] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _MonkeyPatchedWSGIResponse: ...
def trace( # type: ignore[override]
self,
path: _StrOrPromise,
data: Any = ...,
follow: bool = ...,
secure: bool = ...,
*,
headers: Mapping[str, Any] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _MonkeyPatchedWSGIResponse: ...
class AsyncClient(ClientMixin, _AsyncRequestFactory[Awaitable[_MonkeyPatchedASGIResponse]]):
handler: AsyncClientHandler
raise_request_exception: bool
exc_info: Any
extra: dict[str, Any] | None
headers: dict[str, Any]
def __init__(
self,
enforce_csrf_checks: bool = ...,
raise_request_exception: bool = ...,
*,
headers: Mapping[str, Any] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**defaults: Any,
) -> None: ...
async def request(self, **request: Any) -> _MonkeyPatchedASGIResponse: ...
async def get( # type: ignore[override]
self,
path: _StrOrPromise,
data: _GetDataType = ...,
follow: bool = ...,
secure: bool = ...,
*,
headers: Mapping[str, Any] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _MonkeyPatchedASGIResponse: ...
async def post( # type: ignore[override]
self,
path: _StrOrPromise,
data: Any = ...,
content_type: str = ...,
follow: bool = ...,
secure: bool = ...,
*,
headers: Mapping[str, Any] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _MonkeyPatchedASGIResponse: ...
async def head( # type: ignore[override]
self,
path: _StrOrPromise,
data: Any = ...,
follow: bool = ...,
secure: bool = ...,
*,
headers: Mapping[str, Any] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _MonkeyPatchedASGIResponse: ...
async def options( # type: ignore[override]
self,
path: _StrOrPromise,
data: dict[str, str] | str = ...,
content_type: str = ...,
follow: bool = ...,
secure: bool = ...,
*,
headers: Mapping[str, Any] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _MonkeyPatchedASGIResponse: ...
async def put( # type: ignore[override]
self,
path: _StrOrPromise,
data: Any = ...,
content_type: str = ...,
follow: bool = ...,
secure: bool = ...,
*,
headers: Mapping[str, Any] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _MonkeyPatchedASGIResponse: ...
async def patch( # type: ignore[override]
self,
path: _StrOrPromise,
data: Any = ...,
content_type: str = ...,
follow: bool = ...,
secure: bool = ...,
*,
headers: Mapping[str, Any] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _MonkeyPatchedASGIResponse: ...
async def delete( # type: ignore[override]
self,
path: _StrOrPromise,
data: Any = ...,
content_type: str = ...,
follow: bool = ...,
secure: bool = ...,
*,
headers: Mapping[str, Any] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _MonkeyPatchedASGIResponse: ...
async def trace( # type: ignore[override]
self,
path: _StrOrPromise,
data: Any = ...,
follow: bool = ...,
secure: bool = ...,
*,
headers: Mapping[str, Any] | None = ...,
query_params: Mapping[Any, Any] | None = ...,
**extra: Any,
) -> _MonkeyPatchedASGIResponse: ...
__all__ = (
"AsyncClient",
"AsyncRequestFactory",
"Client",
"RedirectCycleError",
"RequestFactory",
"encode_file",
"encode_multipart",
)
django-stubs-5.2.9/django-stubs/test/html.pyi 0000664 0000000 0000000 00000002443 15134010516 0021174 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: ...
django-stubs-5.2.9/django-stubs/test/runner.pyi 0000664 0000000 0000000 00000015150 15134010516 0021540 0 ustar 00root root 0000000 0000000 import logging
from argparse import ArgumentParser
from collections.abc import Sequence
from contextlib import AbstractContextManager
from io import StringIO
from typing import Any, Literal
from unittest import TestCase, TestLoader, TestSuite, TextTestResult, TextTestRunner
from django.db.backends.base.base import BaseDatabaseWrapper
from django.test.testcases import SimpleTestCase
from django.test.utils import TimeKeeperProtocol
from django.utils.datastructures import OrderedSet
class DebugSQLTextTestResult(TextTestResult):
buffer: bool
descriptions: bool
dots: bool
expectedFailures: list[Any]
failfast: bool
shouldStop: bool
showAll: bool
skipped: list[Any]
tb_locals: bool
testsRun: int
unexpectedSuccesses: list[Any]
logger: logging.Logger
# typeshed thinks it's TextIO, but unittest wraps it with _WritelnDecorator
# adding `writeln` method
# See https://github.com/python/cpython/blob/main/Lib/unittest/runner.py
stream: Any
def __init__(self, stream: Any, descriptions: bool, verbosity: int) -> None: ...
debug_sql_stream: StringIO
handler: logging.StreamHandler
def startTest(self, test: TestCase) -> None: ...
def stopTest(self, test: TestCase) -> None: ...
def addError(self, test: Any, err: Any) -> None: ...
def addFailure(self, test: Any, err: Any) -> None: ...
class PDBDebugResult(TextTestResult): ...
class RemoteTestResult:
events: list[Any]
failfast: bool
shouldStop: bool
testsRun: int
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
@property
def test_index(self) -> int: ...
def check_picklable(self, test: Any, err: Any) -> None: ...
def _confirm_picklable(self, obj: Any) -> None: ...
def check_subtest_picklable(self, test: Any, subtest: Any) -> None: ...
def stop(self) -> None: ...
def startTestRun(self) -> None: ...
def stopTestRun(self) -> None: ...
def startTest(self, test: Any) -> None: ...
def stopTest(self, test: Any) -> None: ...
def addDuration(self, test: Any, elapsed: Any) -> None: ...
def addError(self, test: Any, err: Any) -> None: ...
def addFailure(self, test: Any, err: Any) -> None: ...
def addSubTest(self, test: Any, subtest: Any, err: Any) -> None: ...
def addSuccess(self, test: Any) -> None: ...
def addSkip(self, test: Any, reason: Any) -> None: ...
def addExpectedFailure(self, test: Any, err: Any) -> None: ...
def addUnexpectedSuccess(self, test: Any) -> None: ...
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 default_test_processes() -> int: ...
class ParallelTestSuite(TestSuite):
init_worker: Any
run_subsuite: Any
runner_class: Any
subsuites: list[TestSuite]
processes: int
failfast: bool
buffer: bool
initial_settings: Any
serialized_contents: Any
used_aliases: set[str] | None
def __init__(
self, subsuites: list[TestSuite], processes: int, failfast: bool = ..., buffer: bool = ...
) -> None: ...
def run(self, result: Any) -> Any: ... # type: ignore[override]
def handle_event(self, result: Any, tests: list[TestSuite], event: Sequence[Any]) -> None: ...
class DiscoverRunner:
test_suite: type[TestSuite]
parallel_test_suite: type[ParallelTestSuite]
test_runner: type[TextTestRunner]
test_loader: TestLoader
reorder_by: tuple[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
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 is_discoverable(label: str) -> bool: ...
def reorder_suite(
suite: TestSuite, classes: tuple[type[TestCase], type[SimpleTestCase]], reverse: bool = ...
) -> TestSuite: ...
def partition_suite_by_type(
suite: TestSuite, classes: tuple[type[TestCase], type[SimpleTestCase]], bins: list[OrderedSet], reverse: bool = ...
) -> None: ...
def partition_suite_by_case(suite: Any) -> list[Any]: ...
def filter_tests_by_tags(suite: TestSuite, tags: set[str], exclude_tags: set[str]) -> TestSuite: ...
django-stubs-5.2.9/django-stubs/test/selenium.pyi 0000664 0000000 0000000 00000003145 15134010516 0022051 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Sequence
from contextlib import AbstractContextManager
from types import TracebackType
from typing import Any, TypeVar
from django.test import LiveServerTestCase
from typing_extensions import Self
_F = TypeVar("_F", bound=Callable[..., Any])
class SeleniumTestCaseBase:
browsers: Any
browser: Any
@classmethod
def import_webdriver(cls, browser: Any) -> type[Any]: ... # Type[WebDriver]
def create_webdriver(self) -> Any: ... # 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):
implicit_wait: int
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 disable_implicit_wait(self) -> AbstractContextManager[None]: ...
def screenshot_cases(method_names: str | Sequence[str]) -> Callable[[_F], _F]: ...
django-stubs-5.2.9/django-stubs/test/signals.pyi 0000664 0000000 0000000 00000002434 15134010516 0021670 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: ...
django-stubs-5.2.9/django-stubs/test/testcases.pyi 0000664 0000000 0000000 00000021724 15134010516 0022231 0 ustar 00root root 0000000 0000000 import threading
import unittest
from collections.abc import Callable, Collection, Iterable, Iterator, Mapping, Sequence
from contextlib import AbstractContextManager
from types import TracebackType
from typing import Any, overload
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 Self
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) -> None: ...
def on_template_render(self, sender: Any, signal: Any, template: Any, context: Any, **kwargs: Any) -> None: ...
def test(self) -> None: ...
def __enter__(self) -> Self: ...
def __exit__(
self,
exc_type: type[BaseException] | None,
exc_value: BaseException | None,
exc_tb: TracebackType | None,
) -> None: ...
class _AssertTemplateNotUsedContext(_AssertTemplateUsedContext): ...
class _DatabaseFailure:
wrapped: Any
message: str
def __init__(self, wrapped: Any, message: str) -> None: ...
def __call__(self) -> None: ...
class SimpleTestCase(unittest.TestCase):
client_class: type[Client]
client: Client
async_client_class: type[AsyncClient]
async_client: AsyncClient
# TODO: str -> Literal['__all__']
databases: set[str] | str
@classmethod
def ensure_connection_patch_method(cls) -> None: ...
def __call__(self, result: unittest.TestResult | 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 = ...,
target_status_code: int = ...,
msg_prefix: str = ...,
fetch_redirect_response: bool = ...,
) -> None: ...
def assertURLEqual(
self,
url1: _StrOrPromise,
url2: _StrOrPromise,
msg_prefix: str = ...,
) -> None: ...
def assertContains(
self,
response: HttpResponseBase,
text: bytes | int | _StrOrPromise,
count: int | None = ...,
status_code: int = ...,
msg_prefix: str = ...,
html: bool = ...,
) -> None: ...
def assertNotContains(
self,
response: HttpResponseBase,
text: bytes | int | _StrOrPromise,
status_code: int = ...,
msg_prefix: str = ...,
html: bool = ...,
) -> None: ...
def assertFormError(
self,
form: BaseForm,
field: str | None,
errors: list[str] | str,
msg_prefix: str = ...,
) -> None: ...
def assertFormSetError(
self,
formset: BaseFormSet,
form_index: int | None,
field: str | None,
errors: list[str] | str,
msg_prefix: str = ...,
) -> None: ...
def assertTemplateUsed(
self,
response: HttpResponseBase | str | None = ...,
template_name: str | None = ...,
msg_prefix: str = ...,
count: int | None = ...,
) -> _AssertTemplateUsedContext | None: ...
def assertTemplateNotUsed(
self, response: HttpResponseBase | str | None = ..., template_name: str | None = ..., msg_prefix: str = ...
) -> _AssertTemplateNotUsedContext | 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 = ...,
field_kwargs: Mapping[str, Any] | None = ...,
empty_value: str = ...,
) -> Any: ...
def assertHTMLEqual(self, html1: str, html2: str, msg: str | None = ...) -> None: ...
def assertHTMLNotEqual(self, html1: str, html2: str, msg: str | None = ...) -> None: ...
def assertInHTML(self, needle: str, haystack: str, count: int | 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: ...
def assertJSONNotEqual(
self,
raw: str | bytes | bytearray,
expected_data: dict[str, Any] | list[Any] | str | int | float | bool | None,
msg: str | None = ...,
) -> None: ...
def assertXMLEqual(self, xml1: str, xml2: str, msg: str | None = ...) -> None: ...
def assertXMLNotEqual(self, xml1: str, xml2: str, msg: str | None = ...) -> None: ...
class TransactionTestCase(SimpleTestCase):
reset_sequences: bool
available_apps: Any
fixtures: Any
multi_db: bool
serialized_rollback: bool
def assertQuerySetEqual(
self,
qs: Iterator[Any] | list[Model] | QuerySet | RawQuerySet,
values: Collection[Any],
transform: Callable[[Model], Any] | type[str] | None = ...,
ordered: bool = ...,
msg: str | 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 = ..., execute: bool = ...
) -> AbstractContextManager[list[Callable[[], Any]]]: ...
class CheckCondition:
conditions: Sequence[tuple[Callable, str]]
def __init__(self, *conditions: tuple[Callable, str]) -> None: ...
def add_condition(self, condition: Callable, reason: str) -> CheckCondition: ...
def __get__(self, instance: None, cls: type[TransactionTestCase] | None = ...) -> bool: ...
def skipIfDBFeature(*features: Any) -> Callable: ...
def skipUnlessDBFeature(*features: Any) -> Callable: ...
def skipUnlessAnyDBFeature(*features: Any) -> Callable: ...
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]
def __init__(
self,
host: str,
static_handler: type[WSGIHandler],
connections_override: dict[str, BaseDatabaseWrapper] = ...,
port: int = ...,
) -> 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: ...
def connections_support_transactions(aliases: Iterable[str] | None = ...) -> bool: ...
__all__ = ("SimpleTestCase", "TestCase", "TransactionTestCase", "skipIfDBFeature", "skipUnlessDBFeature")
django-stubs-5.2.9/django-stubs/test/utils.pyi 0000664 0000000 0000000 00000015255 15134010516 0021375 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, SupportsIndex, TypeAlias, TypeVar, 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 Self
_TestClass: TypeAlias = type[SimpleTestCase]
_DecoratedTest: TypeAlias = Callable | _TestClass
_DT = TypeVar("_DT", bound=_DecoratedTest)
_C = TypeVar("_C", bound=Callable) # 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]]):
def __getitem__(self, key: str | SupportsIndex | slice) -> Any: ...
def get(self, key: str, default: Any | None = ...) -> Any: ...
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: ...
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: ...
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]
deployment_checks: list[Callable] | None
def __init__(self, new_checks: list[Callable], deployment_checks: list[Callable] | None = ...) -> None: ...
old_checks: set[Callable]
old_deployment_checks: set[Callable]
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
def __init__(self, **kwargs: Any) -> None: ...
catch_warnings: AbstractContextManager[list | None]
requires_tz_support: Any
def isolate_lru_cache(lru_cache_object: Callable) -> 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",
)
django-stubs-5.2.9/django-stubs/urls/ 0000775 0000000 0000000 00000000000 15134010516 0017510 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/urls/__init__.pyi 0000664 0000000 0000000 00000004052 15134010516 0021773 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",
]
django-stubs-5.2.9/django-stubs/urls/base.pyi 0000664 0000000 0000000 00000003406 15134010516 0021150 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 = ...) -> 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 = ...) -> str | None: ...
def is_valid_path(path: str, urlconf: str | None = ...) -> Literal[False] | ResolverMatch: ...
def translate_url(url: str, lang_code: str) -> str: ...
django-stubs-5.2.9/django-stubs/urls/conf.pyi 0000664 0000000 0000000 00000003447 15134010516 0021170 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 = ...) -> _IncludedURLConf: ...
# path()
@overload
def path(
route: _StrOrPromise, view: Callable[..., HttpResponseBase], kwargs: dict[str, Any] = ..., name: str = ...
) -> URLPattern: ...
@overload
def path(
route: _StrOrPromise,
view: Callable[..., Coroutine[Any, Any, HttpResponseBase]],
kwargs: dict[str, Any] = ...,
name: str = ...,
) -> URLPattern: ...
@overload
def path(
route: _StrOrPromise, view: _IncludedURLConf, kwargs: dict[str, Any] = ..., name: str = ...
) -> URLResolver: ...
@overload
def path(
route: _StrOrPromise, view: Sequence[URLResolver | str], kwargs: dict[str, Any] = ..., name: str = ...
) -> URLResolver: ...
# re_path()
@overload
def re_path(
route: _StrOrPromise, view: Callable[..., HttpResponseBase], kwargs: dict[str, Any] = ..., name: str = ...
) -> URLPattern: ...
@overload
def re_path(
route: _StrOrPromise,
view: Callable[..., Coroutine[Any, Any, HttpResponseBase]],
kwargs: dict[str, Any] = ...,
name: str = ...,
) -> URLPattern: ...
@overload
def re_path(
route: _StrOrPromise, view: _IncludedURLConf, kwargs: dict[str, Any] = ..., name: str = ...
) -> URLResolver: ...
@overload
def re_path(
route: _StrOrPromise, view: Sequence[URLResolver | str], kwargs: dict[str, Any] = ..., name: str = ...
) -> URLResolver: ...
django-stubs-5.2.9/django-stubs/urls/converters.pyi 0000664 0000000 0000000 00000001653 15134010516 0022432 0 ustar 00root root 0000000 0000000 from typing import Any, Protocol
from uuid import UUID
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]: ...
django-stubs-5.2.9/django-stubs/urls/exceptions.pyi 0000664 0000000 0000000 00000000146 15134010516 0022415 0 ustar 00root root 0000000 0000000 from django.http import Http404
class Resolver404(Http404): ...
class NoReverseMatch(Exception): ...
django-stubs-5.2.9/django-stubs/urls/resolvers.pyi 0000664 0000000 0000000 00000011360 15134010516 0022260 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
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,
args: tuple[Any, ...],
kwargs: dict[str, Any],
url_name: str | None = ...,
app_names: list[str | None] | None = ...,
namespaces: list[str | None] | None = ...,
route: str | None = ...,
tried: Any | None = ...,
captured_kwargs: dict[str, Any] | None = ...,
extra_kwargs: dict[str, Any] | 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 = ...) -> URLResolver: ...
def get_ns_resolver(ns_pattern: str, resolver: URLResolver, converters: tuple) -> URLResolver: ...
_Pattern: TypeAlias = RegexPattern | RoutePattern | LocalePrefixPattern
class LocaleRegexDescriptor:
@overload
def __get__(self, instance: None, cls: type[_Pattern] = ...) -> LocaleRegexDescriptor: ...
@overload
def __get__(self, instance: _Pattern, cls: type[_Pattern] = ...) -> 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 = ..., is_endpoint: bool = ...) -> None: ...
def match(self, path: str) -> tuple[str, tuple, 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 = ..., is_endpoint: bool = ...) -> None: ...
def match(self, path: str) -> tuple[str, tuple, 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 = ...) -> None: ...
@property
def regex(self) -> Pattern[str]: ...
@property
def language_prefix(self) -> str: ...
def match(self, path: str) -> tuple[str, tuple, dict[str, Any]] | None: ...
def check(self) -> list[CheckMessage]: ...
def describe(self) -> str: ...
class URLPattern:
pattern: _Pattern
callback: Callable
default_args: dict[str, Any]
name: str | None
def __init__(
self,
pattern: _Pattern,
callback: Callable,
default_args: dict[str, Any] | None = ...,
name: str | 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
def __init__(
self,
pattern: _Pattern,
urlconf_name: str | Sequence[_AnyURL] | ModuleType,
default_kwargs: dict[str, Any] | None = ...,
app_name: str | None = ...,
namespace: str | None = ...,
) -> None: ...
@property
def reverse_dict(self) -> MultiValueDict: ...
@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 | None | Sequence[_AnyURL]: ...
@cached_property
def url_patterns(self) -> list[_AnyURL]: ...
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: ...
def _is_callback(self, name: str) -> bool: ...
def _populate(self) -> None: ...
def check(self) -> list[CheckMessage]: ...
django-stubs-5.2.9/django-stubs/urls/utils.pyi 0000664 0000000 0000000 00000000235 15134010516 0021373 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
def get_callable(lookup_view: Callable | str) -> Callable: ...
def get_mod_func(callback: str) -> tuple[str, str]: ...
django-stubs-5.2.9/django-stubs/utils/ 0000775 0000000 0000000 00000000000 15134010516 0017663 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/utils/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0022133 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/utils/_os.pyi 0000664 0000000 0000000 00000000422 15134010516 0021164 0 ustar 00root root 0000000 0000000 import os
from pathlib import Path
from typing import TypeAlias
_PathCompatible: TypeAlias = str | os.PathLike[str]
def safe_join(base: _PathCompatible, *paths: _PathCompatible) -> str: ...
def symlinks_supported() -> bool: ...
def to_path(value: Path | str) -> Path: ...
django-stubs-5.2.9/django-stubs/utils/archive.pyi 0000664 0000000 0000000 00000002717 15134010516 0022036 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable, Sequence
from types import TracebackType
from typing import Any
from typing_extensions import Self
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: ...
def list(self, *args: Any, **kwargs: Any) -> None: ...
def close(self) -> None: ...
def extract(self, to_path: str) -> None: ...
class ZipArchive(BaseArchive):
def __init__(self, file: str) -> None: ...
def list(self, *args: Any, **kwargs: Any) -> None: ...
def extract(self, to_path: str) -> None: ...
def close(self) -> None: ...
extension_map: dict[str, type[BaseArchive]]
django-stubs-5.2.9/django-stubs/utils/asyncio.pyi 0000664 0000000 0000000 00000000346 15134010516 0022056 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import TypeVar, overload
_C = TypeVar("_C", bound=Callable)
@overload
def async_unsafe(message: str) -> Callable[[_C], _C]: ...
@overload
def async_unsafe(message: _C) -> _C: ...
django-stubs-5.2.9/django-stubs/utils/autoreload.pyi 0000664 0000000 0000000 00000005472 15134010516 0022555 0 ustar 00root root 0000000 0000000 import threading
import types
from collections.abc import Callable, Iterable, Iterator
from logging import Logger
from pathlib import Path
from typing import Any
from django.apps.registry import Apps
from django.dispatch import Signal
from django.utils._os import _PathCompatible
from typing_extensions import ParamSpec
_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: _PathCompatible) -> 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[_PathCompatible]
) -> 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: _PathCompatible, 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: _PathCompatible) -> 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
def check_availability(cls) -> bool: ...
class WatchmanUnavailable(RuntimeError): ...
class WatchmanReloader(BaseReloader):
processed_request: threading.Event
client_timeout: int
def __init__(self) -> None: ...
@property
def client(self) -> Any: ...
def watched_roots(self, watched_files: Iterable[Path]) -> frozenset[Path]: ...
def update_watches(self) -> None: ...
def request_processed(self, **kwargs: Any) -> None: ...
def check_server_status(self, inner_ex: BaseException | None = None) -> bool: ...
@classmethod
def check_availability(cls) -> None: ...
def stop(self) -> None: ...
def get_reloader() -> BaseReloader: ...
def start_django(reloader: BaseReloader, main_func: Callable, *args: Any, **kwargs: Any) -> None: ...
def run_with_reloader(main_func: Callable, *args: Any, **kwargs: Any) -> None: ...
django-stubs-5.2.9/django-stubs/utils/cache.pyi 0000664 0000000 0000000 00000002473 15134010516 0021457 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
cc_delim_re: Any
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 = ...,
last_modified: int | None = ...,
response: HttpResponse | None = ...,
) -> HttpResponse | None: ...
def patch_response_headers(response: HttpResponseBase, cache_timeout: int | 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 = ..., method: str = ..., cache: BaseCache | None = ...
) -> str | None: ...
def learn_cache_key(
request: HttpRequest,
response: HttpResponseBase,
cache_timeout: float | None = ...,
key_prefix: str | None = ...,
cache: BaseCache | None = ...,
) -> str: ...
django-stubs-5.2.9/django-stubs/utils/choices.pyi 0000664 0000000 0000000 00000002650 15134010516 0022026 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterable, Iterator, Mapping
from typing import Any, Protocol, TypeAlias, TypeVar, type_check_only
from django.db.models import Choices
_Choice: TypeAlias = tuple[Any, Any]
_ChoiceNamedGroup: TypeAlias = tuple[str, Iterable[_Choice]]
_Choices: TypeAlias = Iterable[_Choice | _ChoiceNamedGroup]
_ChoicesMapping: TypeAlias = Mapping[Any, Any]
_ChoicesInput: TypeAlias = _Choices | _ChoicesMapping | type[Choices] | Callable[[], _Choices | _ChoicesMapping] # 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",
]
django-stubs-5.2.9/django-stubs/utils/connection.pyi 0000664 0000000 0000000 00000002443 15134010516 0022550 0 ustar 00root root 0000000 0000000 from collections.abc import Iterator, Sequence
from typing import Any, Generic, TypeVar
from django.utils.functional import cached_property
_T = TypeVar("_T")
class ConnectionProxy(Generic[_T]):
def __init__(self, connections: BaseConnectionHandler[_T], alias: str) -> None: ...
def __getattr__(self, item: str) -> Any: ...
def __setattr__(self, name: str, value: Any) -> None: ...
def __delattr__(self, name: str) -> None: ...
def __contains__(self, key: str) -> bool: ...
def __eq__(self, other: object) -> bool: ...
class ConnectionDoesNotExist(Exception): ...
class BaseConnectionHandler(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: ...
django-stubs-5.2.9/django-stubs/utils/crypto.pyi 0000664 0000000 0000000 00000001075 15134010516 0021731 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from hmac import HMAC
RANDOM_STRING_CHARS: str
class InvalidAlgorithm(ValueError): ...
def salted_hmac(
key_salt: bytes | str, value: bytes | str, secret: bytes | str | None = None, *, algorithm: str = "sha1"
) -> 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 | None = None,
) -> bytes: ...
django-stubs-5.2.9/django-stubs/utils/datastructures.pyi 0000664 0000000 0000000 00000011415 15134010516 0023465 0 ustar 00root root 0000000 0000000 from collections.abc import Collection, Iterable, Iterator, Mapping, MutableMapping, MutableSet
from typing import Any, Generic, NoReturn, Protocol, TypeAlias, TypeVar, overload, type_check_only
from _typeshed import Incomplete
from typing_extensions import Self
_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: ...
def __contains__(self, item: object) -> bool: ...
def __iter__(self) -> Iterator[_K]: ...
def __reversed__(self) -> Iterator[_K]: ...
def __bool__(self) -> bool: ...
def __len__(self) -> int: ...
def add(self, item: _K) -> None: ...
def remove(self, item: _K) -> None: ...
def discard(self, item: _K) -> None: ...
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: ...
@overload
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
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: ...
def items(self) -> Iterator[tuple[_K, _V | list[object]]]: ... # type: ignore[override]
def lists(self) -> Iterable[tuple[_K, list[_V]]]: ...
def dict(self) -> dict[_K, _V | list[object]]: ...
def copy(self) -> Self: ...
def __getitem__(self, key: _K) -> _V | list[object]: ... # type: ignore[override]
def __setitem__(self, key: _K, value: _V) -> None: ...
# These overrides are needed to convince mypy that this isn't an abstract class
def __delitem__(self, item: _K) -> None: ...
def __len__(self) -> int: ...
def __iter__(self) -> Iterator[_K]: ...
# Fake to make `values` work properly
def values(self) -> Iterator[_V | list[object]]: ... # type: ignore[override]
def __copy__(self) -> Self: ...
def __deepcopy__(self, memo: MutableMapping[int, Incomplete]) -> Self: ...
class ImmutableList(tuple[_V, ...]):
warning: str
def __new__(cls, *args: Any, warning: str = "ImmutableList object is immutable.", **kwargs: Any) -> Self: ...
def complain(self, *args: Any, **kwargs: Any) -> 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: ...
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: ...
def __getitem__(self, key: str) -> _V: ...
def __len__(self) -> int: ...
def __iter__(self) -> Iterator[str]: ...
def copy(self) -> Self: ...
django-stubs-5.2.9/django-stubs/utils/dateformat.pyi 0000664 0000000 0000000 00000003725 15134010516 0022543 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 Any, 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
year_days: Any
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: ...
django-stubs-5.2.9/django-stubs/utils/dateparse.pyi 0000664 0000000 0000000 00000000771 15134010516 0022363 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: ...
django-stubs-5.2.9/django-stubs/utils/dates.pyi 0000664 0000000 0000000 00000000234 15134010516 0021505 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]
django-stubs-5.2.9/django-stubs/utils/deconstruct.pyi 0000664 0000000 0000000 00000001201 15134010516 0022735 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Sequence
from typing import Any, TypeVar, overload, type_check_only
from typing_extensions import Self
# 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]: ...
django-stubs-5.2.9/django-stubs/utils/decorators.pyi 0000664 0000000 0000000 00000002145 15134010516 0022555 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterable
from typing import Any, TypeAlias, TypeVar
from django.http.response import HttpResponseBase
from django.utils.deprecation import MiddlewareMixin
from django.views.generic.base import View
_ViewType = TypeVar("_ViewType", bound=View | Callable[..., Any]) # Any callable
_CallableType = TypeVar("_CallableType", bound=Callable[..., Any])
_DECORATOR: TypeAlias = Callable[..., Callable[..., HttpResponseBase] | Callable[..., Callable[..., HttpResponseBase]]]
classonlymethod = classmethod
def method_decorator(
decorator: _DECORATOR | Iterable[_DECORATOR], name: str = ""
) -> Callable[[_ViewType], _ViewType]: ...
def decorator_from_middleware_with_args(middleware_class: type) -> _DECORATOR: ...
def decorator_from_middleware(middleware_class: type) -> _DECORATOR: ...
def make_middleware_decorator(middleware_class: type[MiddlewareMixin]) -> _DECORATOR: ...
def sync_and_async_middleware(func: _CallableType) -> _CallableType: ...
def sync_only_middleware(func: _CallableType) -> _CallableType: ...
def async_only_middleware(func: _CallableType) -> _CallableType: ...
django-stubs-5.2.9/django-stubs/utils/deprecation.pyi 0000664 0000000 0000000 00000003207 15134010516 0022705 0 ustar 00root root 0000000 0000000 from collections.abc import Awaitable, Callable
from typing import Any, ClassVar, Protocol, TypeAlias, type_check_only
from django.http.request import HttpRequest
from django.http.response import HttpResponseBase
class RemovedInDjango60Warning(DeprecationWarning): ...
class RemovedInDjango61Warning(PendingDeprecationWarning): ...
RemovedInNextVersionWarning: TypeAlias = RemovedInDjango60Warning
RemovedAfterNextVersionWarning: TypeAlias = RemovedInDjango61Warning
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: Callable) -> Callable: ...
class RenameMethodsBase(type):
renamed_methods: Any
def __new__(cls, name: Any, bases: Any, attrs: Any) -> type: ...
@type_check_only
class _GetResponseCallable(Protocol):
def __call__(self, request: HttpRequest, /) -> HttpResponseBase: ...
@type_check_only
class _AsyncGetResponseCallable(Protocol):
def __call__(self, request: HttpRequest, /) -> Awaitable[HttpResponseBase]: ...
class MiddlewareMixin:
sync_capable: ClassVar[bool]
async_capable: ClassVar[bool]
get_response: _GetResponseCallable | _AsyncGetResponseCallable
def __init__(self, get_response: _GetResponseCallable | _AsyncGetResponseCallable) -> None: ...
def __call__(self, request: HttpRequest) -> HttpResponseBase | Awaitable[HttpResponseBase]: ...
async def __acall__(self, request: HttpRequest) -> HttpResponseBase: ...
django-stubs-5.2.9/django-stubs/utils/duration.pyi 0000664 0000000 0000000 00000000306 15134010516 0022232 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: ...
django-stubs-5.2.9/django-stubs/utils/encoding.pyi 0000664 0000000 0000000 00000006404 15134010516 0022200 0 ustar 00root root 0000000 0000000 import datetime
from decimal import Decimal
from typing import Any, Literal, TypeGuard, TypeVar, overload
from django.utils.functional import Promise
class DjangoUnicodeDecodeError(UnicodeDecodeError):
obj: bytes
def __init__(self, obj: bytes, *args: Any) -> None: ...
_P = TypeVar("_P", bound=Promise)
_S = TypeVar("_S", bound=str)
_B = TypeVar("_B", bound=bytes)
_PT = TypeVar("_PT", None, int, float, Decimal, datetime.datetime, datetime.date, datetime.time)
@overload
def smart_str(s: _P, encoding: str = "utf-8", strings_only: bool = False, errors: str = "strict") -> _P: ...
@overload
def smart_str(s: _S, encoding: str = "utf-8", *, errors: str = "strict") -> _S: ...
@overload
def smart_str(s: Any, encoding: str = "utf-8", *, errors: str = "strict") -> str: ...
@overload
def smart_str(s: _PT, encoding: str = "utf-8", strings_only: Literal[True] = True, errors: str = "strict") -> _PT: ...
@overload
def smart_str(s: _S, encoding: str = "utf-8", strings_only: bool = False, errors: str = "strict") -> _S: ...
@overload
def smart_str(s: Any, 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: _S, encoding: str = "utf-8", *, errors: str = "strict") -> _S: ...
@overload
def force_str(s: Any, encoding: str = "utf-8", *, errors: str = "strict") -> str: ...
@overload
def force_str(s: _PT, encoding: str = "utf-8", strings_only: Literal[True] = True, errors: str = "strict") -> _PT: ...
@overload
def force_str(s: _S, encoding: str = "utf-8", strings_only: bool = False, errors: str = "strict") -> _S: ...
@overload
def force_str(s: Any, encoding: str = "utf-8", strings_only: bool = False, errors: str = "strict") -> str: ...
@overload
def smart_bytes(s: _P, encoding: str = "utf-8", strings_only: bool = False, errors: str = "strict") -> _P: ...
@overload
def smart_bytes(s: _B, encoding: Literal["utf-8"] = "utf-8", *, errors: str = "strict") -> _B: ...
@overload
def smart_bytes(s: Any, encoding: str = "utf-8", *, errors: str = "strict") -> bytes: ...
@overload
def smart_bytes(s: _PT, encoding: str = "utf-8", strings_only: Literal[True] = True, errors: str = "strict") -> _PT: ...
@overload
def smart_bytes(s: Any, encoding: str = "utf-8", strings_only: bool = False, errors: str = "strict") -> bytes: ...
@overload
def force_bytes(s: _B, encoding: Literal["utf-8"] = "utf-8", *, errors: str = "strict") -> _B: ...
@overload
def force_bytes(s: Any, encoding: str = "utf-8", *, errors: str = "strict") -> bytes: ...
@overload
def force_bytes(s: _PT, encoding: str = "utf-8", strings_only: Literal[True] = True, errors: str = "strict") -> _PT: ...
@overload
def force_bytes(s: Any, 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: Any) -> 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
django-stubs-5.2.9/django-stubs/utils/feedgenerator.pyi 0000664 0000000 0000000 00000006077 15134010516 0023232 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 = ...,
) -> None: ...
@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 = ...,
author_email: str | None = ...,
author_name: str | None = ...,
author_link: str | None = ...,
subtitle: str | None = ...,
categories: tuple[str, str] | None = ...,
feed_url: str | None = ...,
feed_copyright: str | None = ...,
feed_guid: str | None = ...,
ttl: int | None = ...,
stylesheets: list[Stylesheet] | None = ...,
**kwargs: Any,
) -> None: ...
def add_item(
self,
title: str,
link: str,
description: str,
author_email: str | None = ...,
author_name: str | None = ...,
author_link: str | None = ...,
pubdate: datetime.datetime | None = ...,
comments: str | None = ...,
unique_id: str | None = ...,
unique_id_is_permalink: bool | None = ...,
categories: Sequence[str | None] | None = ...,
item_copyright: str | None = ...,
ttl: int | None = ...,
updateddate: datetime.datetime | None = ...,
enclosures: list[Enclosure] | None = ...,
**kwargs: Any,
) -> None: ...
def num_items(self) -> int: ...
def root_attributes(self) -> dict[Any, Any]: ...
def add_root_elements(self, handler: SimplerXMLGenerator) -> None: ...
def add_stylesheets(self, handler: SimplerXMLGenerator) -> None: ...
def item_attributes(self, item: dict[str, Any]) -> dict[Any, Any]: ...
def add_item_elements(
self,
handler: SimplerXMLGenerator,
item: dict[str, Any],
) -> None: ...
def write(self, outfile: Any, encoding: Any) -> None: ...
def writeString(self, encoding: str) -> str: ...
def latest_post_date(self) -> datetime.datetime: ...
class Enclosure:
length: Any
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
django-stubs-5.2.9/django-stubs/utils/formats.pyi 0000664 0000000 0000000 00000003414 15134010516 0022063 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, TypeVar, overload
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
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 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_separators(value: _T) -> _T: ...
def sanitize_strftime_format(fmt: str) -> str: ...
django-stubs-5.2.9/django-stubs/utils/functional.pyi 0000664 0000000 0000000 00000010235 15134010516 0022551 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterable
# 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, SupportsIndex, TypeAlias, TypeVar, overload, type_check_only
from django.db.models.base import Model
from typing_extensions import Self
_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: ...
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: ...
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: ...
def __mod__(self, x: Any, /) -> str: ...
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: ...
_StrOrPromise: TypeAlias = str | _StrPromise # noqa: PYI047
_C = TypeVar("_C", bound=Callable)
def lazy(func: _C, *resultclasses: Any) -> _C: ...
def lazystr(text: Any) -> _StrPromise: ...
def keep_lazy(*resultclasses: Any) -> Callable: ...
def keep_lazy_text(func: Callable) -> Callable: ...
empty: object
def new_method_proxy(func: Callable[..., _T]) -> Callable[..., _T]: ...
class LazyObject:
def __init__(self) -> None: ...
__getattr__: Callable
def __setattr__(self, name: str, value: Any) -> None: ...
def __delattr__(self, name: str) -> None: ...
def __reduce__(self) -> tuple[Callable, tuple[Model]]: ...
def __copy__(self) -> LazyObject: ...
# TODO: Deepcopy can return a LazyObject or a wrapped object, but we'll need to make LazyObject generic first
def __deepcopy__(self, memo: dict[int, Any]) -> Any: ...
__bytes__: Callable
__bool__: Callable
__dir__: Callable
__ne__: Callable
__hash__: Callable
__getitem__: Callable
__setitem__: Callable
__delitem__: Callable
__iter__: Callable
__len__: Callable
__contains__: Callable
__gt__: Callable
__lt__: Callable
__add__: Callable
__str__: Callable[..., str]
def unpickle_lazyobject(wrapped: Model) -> Model: ...
class SimpleLazyObject(LazyObject):
def __init__(self, func: Callable[[], Any]) -> None: ...
def __copy__(self) -> SimpleLazyObject: ...
__radd__: Callable
_PartitionMember = TypeVar("_PartitionMember")
def partition(
predicate: Callable[[_PartitionMember], int | bool], values: Iterable[_PartitionMember]
) -> tuple[list[_PartitionMember], list[_PartitionMember]]: ...
_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]: ...
@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 `Union[_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: ...
django-stubs-5.2.9/django-stubs/utils/hashable.pyi 0000664 0000000 0000000 00000000102 15134010516 0022146 0 ustar 00root root 0000000 0000000 from typing import Any
def make_hashable(value: Any) -> Any: ...
django-stubs-5.2.9/django-stubs/utils/html.pyi 0000664 0000000 0000000 00000006372 15134010516 0021362 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable
from functools import cached_property
from html.parser import HTMLParser
from json import JSONEncoder
from re import Pattern
from typing import Any, overload
from _typeshed import Incomplete
from django.utils.functional import SimpleLazyObject, _StrOrPromise
from django.utils.safestring import SafeData, SafeString
from typing_extensions import deprecated
VOID_ELEMENTS: frozenset[str]
MAX_URL_LENGTH: int
MAX_STRIP_TAGS_DEPTH: int
long_open_tag_without_closing_re: SimpleLazyObject
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: Any
def __init__(self) -> None: ...
def handle_data(self, d: str) -> None: ...
def handle_entityref(self, name: str) -> None: ...
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: ...
def urlize(text: str, 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: ...
class CountsDict(dict[str, Any]):
def __init__(self, *args: Any, word: str, **kwargs: Any) -> None: ...
def __missing__(self, key: str) -> Any: ...
class Urlizer:
trailing_punctuation_chars: str
wrapping_punctuation: Incomplete
word_split_re: Pattern[str] | SimpleLazyObject
simple_url_re: Pattern[str] | SimpleLazyObject
simple_url_2_re: Pattern[str] | SimpleLazyObject
mailto_template: str
url_template: str
def __call__(
self,
text: Incomplete,
trim_url_limit: Incomplete | None = None,
nofollow: bool = False,
autoescape: bool = False,
) -> Incomplete: ...
def handle_word(
self,
word: Incomplete,
*,
safe_input: Incomplete,
trim_url_limit: Incomplete | None = None,
nofollow: bool = False,
autoescape: bool = False,
) -> Incomplete: ...
def trim_url(self, x: str, *, limit: int | None) -> Incomplete: ...
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
django-stubs-5.2.9/django-stubs/utils/http.pyi 0000664 0000000 0000000 00000002521 15134010516 0021365 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable, Mapping
from re import Pattern
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
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 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 content_disposition_header(as_attachment: bool, filename: str) -> str | None: ...
def parse_header_parameters(line: str) -> tuple[str, dict[str, str]]: ...
django-stubs-5.2.9/django-stubs/utils/inspect.pyi 0000664 0000000 0000000 00000001226 15134010516 0022054 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from contextlib import AbstractContextManager
from inspect import _ParameterKind
from typing import Any
ARG_KINDS: frozenset[_ParameterKind]
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 lazy_annotations() -> AbstractContextManager[None]: ...
django-stubs-5.2.9/django-stubs/utils/ipv6.pyi 0000664 0000000 0000000 00000000434 15134010516 0021273 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: ...
django-stubs-5.2.9/django-stubs/utils/itercompat.pyi 0000664 0000000 0000000 00000000412 15134010516 0022552 0 ustar 00root root 0000000 0000000 from typing import Any
from typing_extensions import deprecated
@deprecated(
"django.utils.itercompat.is_iterable() is deprecated and will be removed in Django 6.0. Use isinstance(..., collections.abc.Iterable) instead."
)
def is_iterable(x: Any) -> bool: ...
django-stubs-5.2.9/django-stubs/utils/log.pyi 0000664 0000000 0000000 00000003326 15134010516 0021173 0 ustar 00root root 0000000 0000000 import logging.config
from collections.abc import Callable
from logging import Logger, LogRecord
from typing import Any
from django.core.management.color import Style
from django.http import HttpRequest, HttpResponse
from django.utils.functional import _StrOrPromise
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
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 connection(self) -> Any: ...
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: ...
def filter(self, record: str | LogRecord) -> bool: ...
class RequireDebugFalse(logging.Filter):
def filter(self, record: str | LogRecord) -> bool: ...
class RequireDebugTrue(logging.Filter):
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_response(
message: str,
*args: Any,
response: HttpResponse | None = None,
request: HttpRequest | None = None,
logger: Logger = ...,
level: str | None = None,
exception: BaseException | None = None,
) -> None: ...
django-stubs-5.2.9/django-stubs/utils/lorem_ipsum.pyi 0000664 0000000 0000000 00000000364 15134010516 0022744 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: ...
django-stubs-5.2.9/django-stubs/utils/module_loading.pyi 0000664 0000000 0000000 00000000470 15134010516 0023371 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: ...
django-stubs-5.2.9/django-stubs/utils/numberformat.pyi 0000664 0000000 0000000 00000000500 15134010516 0023102 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: ...
django-stubs-5.2.9/django-stubs/utils/regex_helper.pyi 0000664 0000000 0000000 00000001623 15134010516 0023061 0 ustar 00root root 0000000 0000000 from collections.abc import Iterator, Mapping
from re import Pattern
from typing import TypeVar
ESCAPE_MAPPINGS: Mapping[str, str | None]
class Choice(list): ...
class Group(list): ...
class NonCapture(list): ...
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]: ...
django-stubs-5.2.9/django-stubs/utils/safestring.pyi 0000664 0000000 0000000 00000001115 15134010516 0022551 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any, TypeAlias, TypeVar, overload
from typing_extensions import Self
_SD = TypeVar("_SD", bound=SafeData)
class SafeData:
def __html__(self) -> Self: ...
class SafeString(str, SafeData):
@overload
def __add__(self, rhs: SafeString) -> SafeString: ...
@overload
def __add__(self, rhs: str) -> str: ...
SafeText: TypeAlias = SafeString
_C = TypeVar("_C", bound=Callable)
@overload
def mark_safe(s: _SD) -> _SD: ...
@overload
def mark_safe(s: _C) -> _C: ...
@overload
def mark_safe(s: Any) -> SafeString: ...
django-stubs-5.2.9/django-stubs/utils/termcolors.pyi 0000664 0000000 0000000 00000001160 15134010516 0022575 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: ...
django-stubs-5.2.9/django-stubs/utils/text.pyi 0000664 0000000 0000000 00000005117 15134010516 0021376 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Iterable, Iterator
from html.parser import HTMLParser
from io import BytesIO
from re import Pattern
from typing import ClassVar, TypeVar, overload
from django.db.models.base import Model
from django.utils.functional import SimpleLazyObject, _StrOrPromise, cached_property
_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]]
def __init__(self, *, length: int, replacement: str | None, convert_charrefs: bool = True) -> None: ...
@cached_property
def void_elements(self) -> frozenset[str]: ...
class TruncateCharsHTMLParser(TruncateHTMLParser):
def process(self, data: str) -> tuple[str, str]: ...
class TruncateWordsHTMLParser(TruncateHTMLParser):
def process(self, data: str) -> tuple[str, str]: ...
class Truncator(SimpleLazyObject):
MAX_LENGTH_HTML: ClassVar[int]
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):
vals: list[bytes]
def read(self) -> bytes: ... # type: ignore[override]
def compress_sequence(sequence: Iterable[bytes], *, max_random_bytes: int | None = None) -> Iterator[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: ...
format_lazy: Callable[..., _StrOrPromise]
django-stubs-5.2.9/django-stubs/utils/timesince.pyi 0000664 0000000 0000000 00000000651 15134010516 0022370 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: ...
django-stubs-5.2.9/django-stubs/utils/timezone.pyi 0000664 0000000 0000000 00000003460 15134010516 0022243 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,
exc_tb: 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",
]
django-stubs-5.2.9/django-stubs/utils/translation/ 0000775 0000000 0000000 00000000000 15134010516 0022221 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/utils/translation/__init__.pyi 0000664 0000000 0000000 00000004657 15134010516 0024517 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: int) -> 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,
exc_tb: TracebackType | None,
) -> None: ...
def get_language() -> str: ...
def get_language_from_path(path: str) -> str | None: ...
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 templatize(src: str, **kwargs: Any) -> str: ...
def deactivate_all() -> None: ...
def get_supported_language_variant(lang_code: str, *, strict: bool = False) -> str: ...
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",
]
django-stubs-5.2.9/django-stubs/utils/translation/reloader.pyi 0000664 0000000 0000000 00000000436 15134010516 0024544 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: ...
django-stubs-5.2.9/django-stubs/utils/translation/template.pyi 0000664 0000000 0000000 00000000520 15134010516 0024554 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: ...
django-stubs-5.2.9/django-stubs/utils/translation/trans_null.pyi 0000664 0000000 0000000 00000001445 15134010516 0025131 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: ...
django-stubs-5.2.9/django-stubs/utils/translation/trans_real.pyi 0000664 0000000 0000000 00000005643 15134010516 0025106 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, TypeVar, type_check_only
from django.http.request import HttpRequest
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: ...
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 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], ...]: ...
django-stubs-5.2.9/django-stubs/utils/tree.pyi 0000664 0000000 0000000 00000001723 15134010516 0021350 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from typing import Any, TypeAlias
from django.db.models.sql.where import NothingNode
_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
) -> Node: ...
def copy(self) -> Node: ...
def __copy__(self) -> Node: ...
def __deepcopy__(self, memodict: dict[Any, Any]) -> Node: ...
def __len__(self) -> int: ...
def __bool__(self) -> bool: ...
def __contains__(self, other: tuple[str, int]) -> bool: ...
def __hash__(self) -> int: ...
def add(self, data: Any, conn_type: str) -> Any: ...
def negate(self) -> None: ...
django-stubs-5.2.9/django-stubs/utils/version.pyi 0000664 0000000 0000000 00000001015 15134010516 0022070 0 ustar 00root root 0000000 0000000 from typing import TypeAlias
PYPY: bool
PY38: bool
PY39: bool
PY310: bool
PY311: bool
PY312: bool
PY313: bool
PY314: 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]: ...
django-stubs-5.2.9/django-stubs/utils/xmlutils.pyi 0000664 0000000 0000000 00000000650 15134010516 0022270 0 ustar 00root root 0000000 0000000 from xml.sax.saxutils import XMLGenerator
from xml.sax.xmlreader import AttributesImpl
class UnserializableContentError(ValueError): ...
class SimplerXMLGenerator(XMLGenerator):
def addQuickElement(self, name: str, contents: str | None = ..., attrs: dict[str, str] | None = ...) -> None: ...
def characters(self, content: str) -> None: ...
def startElement(self, name: str, attrs: AttributesImpl) -> None: ...
django-stubs-5.2.9/django-stubs/views/ 0000775 0000000 0000000 00000000000 15134010516 0017660 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/views/__init__.pyi 0000664 0000000 0000000 00000000073 15134010516 0022142 0 ustar 00root root 0000000 0000000 from .generic.base import View as View
__all__ = ["View"]
django-stubs-5.2.9/django-stubs/views/csrf.pyi 0000664 0000000 0000000 00000000503 15134010516 0021336 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: ...
django-stubs-5.2.9/django-stubs/views/debug.pyi 0000664 0000000 0000000 00000006065 15134010516 0021500 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 | 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: ...
django-stubs-5.2.9/django-stubs/views/decorators/ 0000775 0000000 0000000 00000000000 15134010516 0022025 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/views/decorators/__init__.pyi 0000664 0000000 0000000 00000000000 15134010516 0024275 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/views/decorators/cache.pyi 0000664 0000000 0000000 00000000533 15134010516 0023614 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any, 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: ...
django-stubs-5.2.9/django-stubs/views/decorators/clickjacking.pyi 0000664 0000000 0000000 00000000422 15134010516 0025162 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any, 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: ...
django-stubs-5.2.9/django-stubs/views/decorators/common.pyi 0000664 0000000 0000000 00000000242 15134010516 0024036 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any, TypeVar
_C = TypeVar("_C", bound=Callable[..., Any])
def no_append_slash(view_func: _C) -> _C: ...
django-stubs-5.2.9/django-stubs/views/decorators/csrf.pyi 0000664 0000000 0000000 00000000653 15134010516 0023511 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any, TypeVar
from django.middleware.csrf import CsrfViewMiddleware
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: ...
django-stubs-5.2.9/django-stubs/views/decorators/debug.pyi 0000664 0000000 0000000 00000000551 15134010516 0023637 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any, Literal, 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]: ...
django-stubs-5.2.9/django-stubs/views/decorators/gzip.pyi 0000664 0000000 0000000 00000000222 15134010516 0023515 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any, TypeVar
_C = TypeVar("_C", bound=Callable[..., Any])
gzip_page: Callable[[_C], _C]
django-stubs-5.2.9/django-stubs/views/decorators/http.pyi 0000664 0000000 0000000 00000001316 15134010516 0023530 0 ustar 00root root 0000000 0000000 from collections.abc import Callable, Container
from datetime import datetime
from typing import Any, 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]: ...
django-stubs-5.2.9/django-stubs/views/decorators/vary.pyi 0000664 0000000 0000000 00000000332 15134010516 0023527 0 ustar 00root root 0000000 0000000 from collections.abc import Callable
from typing import Any, TypeVar
_F = TypeVar("_F", bound=Callable[..., Any])
def vary_on_headers(*headers: str) -> Callable[[_F], _F]: ...
def vary_on_cookie(func: _F) -> _F: ...
django-stubs-5.2.9/django-stubs/views/defaults.pyi 0000664 0000000 0000000 00000001447 15134010516 0022220 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: ...
django-stubs-5.2.9/django-stubs/views/generic/ 0000775 0000000 0000000 00000000000 15134010516 0021274 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/django-stubs/views/generic/__init__.pyi 0000664 0000000 0000000 00000002202 15134010516 0023552 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",
]
django-stubs-5.2.9/django-stubs/views/generic/base.pyi 0000664 0000000 0000000 00000004574 15134010516 0022743 0 ustar 00root root 0000000 0000000 import logging
from collections.abc import Callable, Mapping, Sequence
from typing import Any
from django.http.request import HttpRequest
from django.http.response import HttpResponse, HttpResponseBase
from django.utils.functional import _Getter
logger: logging.Logger
class ContextMixin:
extra_context: Mapping[str, Any] | None
def get_context_data(self, **kwargs: Any) -> dict[str, Any]: ...
class View:
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[..., HttpResponseBase]: ...
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: ...
class TemplateResponseMixin:
template_name: str | None
template_engine: str | None
response_class: type[HttpResponse]
content_type: str | None
request: HttpRequest
def render_to_response(self, context: dict[str, Any], **response_kwargs: Any) -> HttpResponse: ...
def get_template_names(self) -> list[str]: ...
class TemplateView(TemplateResponseMixin, ContextMixin, View):
def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ...
class RedirectView(View):
permanent: bool
url: str | None
pattern_name: str | None
query_string: 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: ...
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: ...
django-stubs-5.2.9/django-stubs/views/generic/dates.pyi 0000664 0000000 0000000 00000010664 15134010516 0023126 0 ustar 00root root 0000000 0000000 import datetime
from collections.abc import Sequence
from typing import Any, TypeAlias, TypeVar
from django.db import models
from django.db.models.query import QuerySet
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
_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: ...
def get_ordering(self) -> str | Sequence[str]: ...
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, date_type: str | None = ..., ordering: str = ...
) -> models.query.QuerySet: ...
class BaseArchiveIndexView(BaseDateListView[_M]):
context_object_name: str
def get_dated_items(self) -> _DatedItems[_M]: ...
class ArchiveIndexView(MultipleObjectTemplateResponseMixin, BaseArchiveIndexView):
template_name_suffix: str
class BaseYearArchiveView(YearMixin, BaseDateListView[_M]):
date_list_period: str
make_object_list: bool
def get_dated_items(self) -> _DatedItems[_M]: ...
def get_make_object_list(self) -> bool: ...
class YearArchiveView(MultipleObjectTemplateResponseMixin, BaseYearArchiveView):
template_name_suffix: str
class BaseMonthArchiveView(YearMixin, MonthMixin, BaseDateListView[_M]):
date_list_period: str
def get_dated_items(self) -> _DatedItems[_M]: ...
class MonthArchiveView(MultipleObjectTemplateResponseMixin, BaseMonthArchiveView):
template_name_suffix: str
class BaseWeekArchiveView(YearMixin, WeekMixin, BaseDateListView[_M]):
def get_dated_items(self) -> _DatedItems[_M]: ...
class WeekArchiveView(MultipleObjectTemplateResponseMixin, BaseWeekArchiveView):
template_name_suffix: str
class BaseDayArchiveView(YearMixin, MonthMixin, DayMixin, BaseDateListView[_M]):
def get_dated_items(self) -> _DatedItems[_M]: ...
class DayArchiveView(MultipleObjectTemplateResponseMixin, BaseDayArchiveView):
template_name_suffix: str
class BaseTodayArchiveView(BaseDayArchiveView[_M]):
def get_dated_items(self) -> _DatedItems[_M]: ...
class TodayArchiveView(MultipleObjectTemplateResponseMixin, BaseTodayArchiveView):
template_name_suffix: str
class BaseDateDetailView(YearMixin, MonthMixin, DayMixin, DateMixin, BaseDetailView[_M]):
def get_object(self, queryset: QuerySet[_M] | None = ...) -> _M: ...
class DateDetailView(SingleObjectTemplateResponseMixin, BaseDateDetailView):
template_name_suffix: str
def timezone_today() -> datetime.date: ...
django-stubs-5.2.9/django-stubs/views/generic/detail.pyi 0000664 0000000 0000000 00000002267 15134010516 0023270 0 ustar 00root root 0000000 0000000 from typing import Any, Generic, TypeVar, overload
from django.db import models
from django.http import HttpRequest, HttpResponse
from django.views.generic.base import ContextMixin, TemplateResponseMixin, View
_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]): ...
django-stubs-5.2.9/django-stubs/views/generic/edit.pyi 0000664 0000000 0000000 00000006625 15134010516 0022755 0 ustar 00root root 0000000 0000000 from typing import Any, Generic, Literal, TypeVar
from django.db import models
from django.forms.forms import BaseForm
from django.forms.models import BaseModelForm
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
_FormT = TypeVar("_FormT", bound=BaseForm)
_ModelFormT = TypeVar("_ModelFormT", bound=BaseModelForm)
_M = TypeVar("_M", bound=models.Model)
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: ...
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
def get_form_class(self) -> type[_ModelFormT]: ...
def get_form_kwargs(self) -> dict[str, Any]: ...
def get_success_url(self) -> str: ...
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
def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ...
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
def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ...
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[_ModelFormT], BaseDetailView[_M], Generic[_M, _ModelFormT]):
object: _M
class DeleteView(SingleObjectTemplateResponseMixin, BaseDeleteView[_M, _ModelFormT], Generic[_M, _ModelFormT]):
object: _M
template_name_suffix: str
django-stubs-5.2.9/django-stubs/views/generic/list.pyi 0000664 0000000 0000000 00000004136 15134010516 0022776 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from typing import Any, Generic, Protocol, TypeVar, overload, type_check_only
from django.core.paginator import Page, Paginator, _SupportsPagination
from django.db.models import Model, QuerySet
from django.http import HttpRequest, HttpResponse
from django.views.generic.base import ContextMixin, TemplateResponseMixin, View
_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]
page_kwarg: str
ordering: str | Sequence[str] | None
def get_queryset(self) -> QuerySet[_M]: ...
def get_ordering(self) -> str | Sequence[str] | None: ...
def paginate_queryset(
self, queryset: _SupportsPagination[_M], page_size: int
) -> tuple[Paginator, Page, _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: ...
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: ...
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]): ...
django-stubs-5.2.9/django-stubs/views/i18n.pyi 0000664 0000000 0000000 00000002103 15134010516 0021156 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
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): ...
django-stubs-5.2.9/django-stubs/views/static.pyi 0000664 0000000 0000000 00000000766 15134010516 0021703 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 = ..., show_indexes: bool = ...
) -> FileResponse: ...
template_translatable: Any
def directory_index(path: Any, fullpath: Any) -> HttpResponse: ...
def was_modified_since(header: str | None = ..., mtime: float = ...) -> bool: ...
django-stubs-5.2.9/ext/ 0000775 0000000 0000000 00000000000 15134010516 0014723 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/ext/LICENSE.md 0000664 0000000 0000000 00000002063 15134010516 0016330 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.
django-stubs-5.2.9/ext/README.md 0000664 0000000 0000000 00000004573 15134010516 0016213 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!
django-stubs-5.2.9/ext/django_stubs_ext/ 0000775 0000000 0000000 00000000000 15134010516 0020265 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/ext/django_stubs_ext/__init__.py 0000664 0000000 0000000 00000001027 15134010516 0022376 0 ustar 00root root 0000000 0000000 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
__all__ = [
"Annotations",
"AnyAttrAllowed",
"QuerySetAny",
"StrOrPromise",
"StrPromise",
"ValuesQuerySet",
"WithAnnotations",
"monkeypatch",
]
django-stubs-5.2.9/ext/django_stubs_ext/aliases.py 0000664 0000000 0000000 00000001312 15134010516 0022255 0 ustar 00root root 0000000 0000000 import typing
if typing.TYPE_CHECKING:
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
# Deprecated type aliases. Use the QuerySet class directly instead.
QuerySetAny = QuerySet
ValuesQuerySet = QuerySet
__all__ = ["QuerySetAny", "StrOrPromise", "StrPromise", "ValuesQuerySet"]
django-stubs-5.2.9/ext/django_stubs_ext/annotations.py 0000664 0000000 0000000 00000001174 15134010516 0023177 0 ustar 00root root 0000000 0000000 from collections.abc import Mapping
from typing import Annotated, Any, Generic, TypeVar
from django.db.models.base import Model
# 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]`.
"""
django-stubs-5.2.9/ext/django_stubs_ext/db/ 0000775 0000000 0000000 00000000000 15134010516 0020652 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/ext/django_stubs_ext/db/__init__.py 0000664 0000000 0000000 00000000000 15134010516 0022751 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/ext/django_stubs_ext/db/models/ 0000775 0000000 0000000 00000000000 15134010516 0022135 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/ext/django_stubs_ext/db/models/__init__.py 0000664 0000000 0000000 00000003564 15134010516 0024256 0 ustar 00root root 0000000 0000000 from typing import TYPE_CHECKING
if TYPE_CHECKING:
from collections.abc import Sequence
from typing import ClassVar
from django.db.models import BaseConstraint, Index, OrderBy
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 | OrderBy]]
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
django-stubs-5.2.9/ext/django_stubs_ext/db/models/manager.py 0000664 0000000 0000000 00000001456 15134010516 0024127 0 ustar 00root root 0000000 0000000 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, 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
django-stubs-5.2.9/ext/django_stubs_ext/db/router.py 0000664 0000000 0000000 00000001603 15134010516 0022544 0 ustar 00root root 0000000 0000000 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: type[Model], obj2: type[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
django-stubs-5.2.9/ext/django_stubs_ext/patch.py 0000664 0000000 0000000 00000011200 15134010516 0021730 0 ustar 00root root 0000000 0000000 import builtins
import logging
from collections.abc import Iterable
from typing import Any, Generic, TypeVar
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
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, ModelFormOptions
from django.utils.connection import BaseConnectionHandler, ConnectionProxy
from django.utils.functional import classproperty
from django.views.generic.detail import SingleObjectMixin
from django.views.generic.edit import DeletionMixin, FormMixin
from django.views.generic.list import MultipleObjectMixin
__all__ = ["monkeypatch"]
logger = logging.getLogger(__name__)
_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
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(Feed),
MPGeneric(Sitemap),
MPGeneric(SuccessMessageMixin),
MPGeneric(FileProxyMixin),
MPGeneric(Lookup),
MPGeneric(BaseConnectionHandler),
MPGeneric(ExpressionWrapper),
MPGeneric(ReverseManyToOneDescriptor),
MPGeneric(ModelIterable),
# 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(ConnectionProxy),
MPGeneric(ModelFormOptions),
MPGeneric(Options),
MPGeneric(BaseIterable),
MPGeneric(ForwardManyToOneDescriptor),
MPGeneric(ReverseOneToOneDescriptor),
MPGeneric(Prefetch),
MPGeneric(SessionStore),
]
def monkeypatch(extra_classes: Iterable[type] | None = None, include_builtins: bool = True) -> 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__ = classmethod(lambda cls, *args, **kwargs: cls)
if extra_classes:
for cls in extra_classes:
cls.__class_getitem__ = classmethod(lambda cls, *args, **kwargs: cls) # type: ignore[attr-defined]
# Add `reveal_type` and `reveal_locals` helpers if needed:
if include_builtins:
builtins.reveal_type = lambda obj, /: obj
builtins.reveal_locals = lambda: None
django-stubs-5.2.9/ext/django_stubs_ext/py.typed 0000664 0000000 0000000 00000000000 15134010516 0021752 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/ext/django_stubs_ext/settings.py 0000664 0000000 0000000 00000000654 15134010516 0022504 0 ustar 00root root 0000000 0000000 from pathlib import Path
from typing import Any, TypedDict, type_check_only
from typing_extensions import NotRequired
@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"]
django-stubs-5.2.9/ext/django_stubs_ext/types.py 0000664 0000000 0000000 00000000334 15134010516 0022003 0 ustar 00root root 0000000 0000000 from typing import Any, Protocol
# Used internally by mypy_django_plugin.
class AnyAttrAllowed(Protocol):
def __getattr__(self, item: str) -> Any: ...
def __setattr__(self, item: str, value: Any) -> None: ...
django-stubs-5.2.9/ext/pyproject.toml 0000664 0000000 0000000 00000002725 15134010516 0017645 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 = "5.2.9"
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.10"
classifiers = [
"Operating System :: OS Independent",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Typing :: Typed",
"Framework :: Django",
"Framework :: Django :: 5.0",
"Framework :: Django :: 5.1",
"Framework :: Django :: 5.2",
]
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.9.9,<0.10.0"]
build-backend = "uv_build"
[tool.uv.build-backend]
module-name = ["django_stubs_ext"]
module-root = ""
django-stubs-5.2.9/ext/tests/ 0000775 0000000 0000000 00000000000 15134010516 0016065 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/ext/tests/test_aliases.py 0000664 0000000 0000000 00000000251 15134010516 0021115 0 ustar 00root root 0000000 0000000 from typing import Any
from django_stubs_ext import ValuesQuerySet
def test_extends_values_queryset() -> None:
class MyQS(ValuesQuerySet[Any, Any]):
pass
django-stubs-5.2.9/ext/tests/test_monkeypatching.py 0000664 0000000 0000000 00000007527 15134010516 0022531 0 ustar 00root root 0000000 0000000 import builtins
from collections.abc import Iterable
from contextlib import suppress
from typing import Protocol
import pytest
from _pytest.fixtures import FixtureRequest
from _pytest.monkeypatch import MonkeyPatch
from django.db.models import Model
from django.forms.models import ModelForm
import django_stubs_ext
from django_stubs_ext import patch
from django_stubs_ext.patch import _need_generic, _VersionSpec
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,
include_builtins: bool = True,
) -> None: ...
@pytest.fixture(scope="function")
def make_generic_classes(
request: FixtureRequest,
monkeypatch: 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()
with suppress(AttributeError):
del builtins.reveal_type
with suppress(AttributeError):
del builtins.reveal_locals
def factory(
django_version: _VersionSpec | None = None,
extra_classes: Iterable[type] | None = None,
include_builtins: bool = True,
) -> 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, include_builtins=include_builtins)
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
@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
def test_mypy_builtins_not_patched_globally(
make_generic_classes: _MakeGenericClasses,
) -> None:
"""Ensures that builtins are not patched with `mypy` specific helpers.
This should only happen during `django.setup()`
(https://github.com/typeddjango/django-stubs/issues/609).
"""
make_generic_classes(include_builtins=False)
assert not hasattr(builtins, "reveal_type")
assert not hasattr(builtins, "reveal_locals")
def test_mypy_builtins_patched(
make_generic_classes: _MakeGenericClasses,
) -> None:
"""Ensures that builtins are patched by default."""
make_generic_classes()
assert hasattr(builtins, "reveal_type")
assert hasattr(builtins, "reveal_locals")
django-stubs-5.2.9/ext/tests/typecheck/ 0000775 0000000 0000000 00000000000 15134010516 0020044 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/ext/tests/typecheck/test_aliases.yml 0000664 0000000 0000000 00000000712 15134010516 0023247 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()
django-stubs-5.2.9/ext/tests/typecheck/test_patching.yml 0000664 0000000 0000000 00000001123 15134010516 0023420 0 ustar 00root root 0000000 0000000 - case: patch_reveal_type_during_django_setup
main: |
# `main` is empty on purpose, because we test the `django.setup()` step.
# It executes the `myapp/models.py` file and should not produce anything,
# because `reveal_type` and `reveal_locals` are patched.
monkeypatch: true
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
# Will be executed during `django.setup()`:
a = 1
reveal_type(a)
reveal_locals()
django-stubs-5.2.9/logo.svg 0000664 0000000 0000000 00000031242 15134010516 0015606 0 ustar 00root root 0000000 0000000
django-stubs-5.2.9/mypy.ini 0000664 0000000 0000000 00000001475 15134010516 0015631 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
# Strictness:
# TODO: add type args to all generics
disallow_any_generics = false
# TODO: fix `Any` subclassing in `typeshed/builtins.pyi`
disallow_subclassing_any = false
strict = true
local_partial_types = true
warn_unreachable = true
disable_error_code = empty-body
enable_error_code =
deprecated,
exhaustive-match,
ignore-without-code,
possibly-undefined,
redundant-expr,
redundant-self,
truthy-bool,
truthy-iterable,
unimported-reveal,
unused-awaitable,
show_traceback = true
plugins =
mypy_django_plugin.main,
mypy.plugins.proper_plugin
# Our settings:
[mypy.plugins.django-stubs]
django_settings_module = scripts.django_tests_settings
django-stubs-5.2.9/mypy_django_plugin/ 0000775 0000000 0000000 00000000000 15134010516 0020021 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/mypy_django_plugin/__init__.py 0000664 0000000 0000000 00000000000 15134010516 0022120 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/mypy_django_plugin/config.py 0000664 0000000 0000000 00000012774 15134010516 0021653 0 ustar 00root root 0000000 0000000 import configparser
import os
import sys
import textwrap
from functools import partial
from pathlib import Path
from typing import TYPE_CHECKING, Any, NoReturn
if TYPE_CHECKING:
from collections.abc import Callable
if sys.version_info[:2] >= (3, 11):
import tomllib
else:
import tomli as tomllib
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:
toml_exit(MISSING_SECTION.format(section="tool.django-stubs"))
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):
exit_with_error(MISSING_SECTION.format(section=section))
if 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())),
}
django-stubs-5.2.9/mypy_django_plugin/django/ 0000775 0000000 0000000 00000000000 15134010516 0021263 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/mypy_django_plugin/django/__init__.py 0000664 0000000 0000000 00000000000 15134010516 0023362 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/mypy_django_plugin/django/context.py 0000664 0000000 0000000 00000055243 15134010516 0023332 0 ustar 00root root 0000000 0000000 import os
import sys
from collections import defaultdict
from collections.abc import Iterable, Iterator, Mapping, Sequence
from contextlib import contextmanager
from functools import cached_property
from typing import TYPE_CHECKING, Any, Literal, Union
from django.core.exceptions import FieldDoesNotExist, FieldError
from django.db import models
from django.db.models.base import Model
from django.db.models.expressions import Expression
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
from django.db.models.sql.query import Query
from mypy.checker import TypeChecker
from mypy.nodes import TypeInfo
from mypy.plugin import MethodContext
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 django.apps.registry import Apps
from django.conf import LazySettings
from django.contrib.contenttypes.fields import GenericForeignKey
@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
if len(field_type.args) != 2:
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: Union["Field[Any, Any]", ForeignObjectRel]
) -> 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 isinstance(field, Field):
field_name = field.attname
# Can not determine target_field for recursive relationship when model is abstract
if field.related_model == "self" and model_cls._meta.abstract:
continue
# 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
elif 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
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(self) -> Mapping[str, str]:
return {
klass._meta.label: helpers.get_class_fullname(klass)
for klass in self.all_registered_model_classes
if klass is not models.Model
}
def get_field_nullability(self, field: Union["Field[Any, Any]", ForeignObjectRel], 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: Union["Field[Any, Any]", ForeignObjectRel], *, 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: Union["Field[Any, Any]", ForeignObjectRel],
*,
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, field.attname)
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: Union["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:
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[Union["Field[Any, Any]", ForeignObjectRel], type[Model]]:
currently_observed_model = model_cls
field: Field[Any, Any] | ForeignObjectRel | GenericForeignKey | 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:
# 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("__")
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("__".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[Union["Field[Any, Any]", ForeignObjectRel, 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_expected_type(
self, ctx: MethodContext, model_cls: type[Model], lookup: str, model_instance: Instance
) -> MypyType:
try:
solved_lookup = self.solve_lookup_type(model_cls, lookup)
except FieldError as exc:
if helpers.is_annotated_model(model_instance.type) and model_instance.extra_attrs:
# If the field comes from .annotate(), we assume Any for it
# and allow chaining any lookups.
lookup_base_field, *_ = lookup.split("__")
if lookup_base_field in model_instance.extra_attrs.attrs:
return model_instance.extra_attrs.attrs[lookup_base_field]
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)
if lookup_cls is None or isinstance(lookup_cls, Exact):
return self.get_field_lookup_exact_type(helpers.get_typechecker_api(ctx), field)
assert lookup_cls is not None
lookup_info = helpers.lookup_class_typeinfo(helpers.get_typechecker_api(ctx), lookup_cls)
if lookup_info is None:
return AnyType(TypeOfAny.explicit)
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:
field_info = helpers.lookup_class_typeinfo(helpers.get_typechecker_api(ctx), field.__class__)
if field_info is None:
return AnyType(TypeOfAny.explicit)
lookup_type = get_proper_type(
helpers.get_private_descriptor_type(field_info, "_pyi_private_get_type", is_nullable=field.null)
)
return lookup_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
django-stubs-5.2.9/mypy_django_plugin/errorcodes.py 0000664 0000000 0000000 00000000215 15134010516 0022540 0 ustar 00root root 0000000 0000000 from mypy.errorcodes import ErrorCode
MANAGER_MISSING = ErrorCode("django-manager-missing", "Couldn't resolve manager for model", "Django")
django-stubs-5.2.9/mypy_django_plugin/exceptions.py 0000664 0000000 0000000 00000000131 15134010516 0022547 0 ustar 00root root 0000000 0000000 class UnregisteredModelError(Exception):
"""The requested model is not registered"""
django-stubs-5.2.9/mypy_django_plugin/lib/ 0000775 0000000 0000000 00000000000 15134010516 0020567 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/mypy_django_plugin/lib/__init__.py 0000664 0000000 0000000 00000000000 15134010516 0022666 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/mypy_django_plugin/lib/fullnames.py 0000664 0000000 0000000 00000006401 15134010516 0023130 0 ustar 00root root 0000000 0000000 ABSTRACT_BASE_USER_MODEL_FULLNAME = "django.contrib.auth.base_user.AbstractBaseUser"
ABSTRACT_USER_MODEL_FULLNAME = "django.contrib.auth.models.AbstractUser"
PERMISSION_MIXIN_CLASS_FULLNAME = "django.contrib.auth.models.PermissionsMixin"
MODEL_METACLASS_FULLNAME = "django.db.models.base.ModelBase"
MODEL_CLASS_FULLNAME = "django.db.models.base.Model"
FIELD_FULLNAME = "django.db.models.fields.Field"
ARRAY_FIELD_FULLNAME = "django.contrib.postgres.fields.array.ArrayField"
FOREIGN_OBJECT_FULLNAME = "django.db.models.fields.related.ForeignObject"
FOREIGN_KEY_FULLNAME = "django.db.models.fields.related.ForeignKey"
ONETOONE_FIELD_FULLNAME = "django.db.models.fields.related.OneToOneField"
MANYTOMANY_FIELD_FULLNAME = "django.db.models.fields.related.ManyToManyField"
DUMMY_SETTINGS_BASE_CLASS = "django.conf._DjangoConfLazyObject"
AUTH_USER_MODEL_FULLNAME = "django.conf.settings.AUTH_USER_MODEL"
QUERYSET_CLASS_FULLNAME = "django.db.models.query.QuerySet"
BASE_MANAGER_CLASS_FULLNAME = "django.db.models.manager.BaseManager"
MANAGER_CLASS_FULLNAME = "django.db.models.manager.Manager"
RELATED_MANAGER_CLASS = "django.db.models.fields.related_descriptors.RelatedManager"
PREFETCH_CLASS_FULLNAME = "django.db.models.query.Prefetch"
GENERIC_PREFETCH_CLASS_FULLNAME = "django.contrib.contenttypes.prefetch.GenericPrefetch"
CHOICES_CLASS_FULLNAME = "django.db.models.enums.Choices"
CHOICES_TYPE_METACLASS_FULLNAME = "django.db.models.enums.ChoicesType"
WITH_ANNOTATIONS_FULLNAME = "django_stubs_ext.annotations.WithAnnotations"
ANNOTATIONS_FULLNAME = "django_stubs_ext.annotations.Annotations"
ANNOTATED_TYPES_FULLNAMES = {
"typing.Annotated",
"typing_extensions.Annotated",
WITH_ANNOTATIONS_FULLNAME,
}
BASEFORM_CLASS_FULLNAME = "django.forms.forms.BaseForm"
FORM_CLASS_FULLNAME = "django.forms.forms.Form"
MODELFORM_CLASS_FULLNAME = "django.forms.models.ModelForm"
FORM_MIXIN_CLASS_FULLNAME = "django.views.generic.edit.FormMixin"
REVERSE_ONE_TO_ONE_DESCRIPTOR = "django.db.models.fields.related_descriptors.ReverseOneToOneDescriptor"
REVERSE_MANY_TO_ONE_DESCRIPTOR = "django.db.models.fields.related_descriptors.ReverseManyToOneDescriptor"
MANY_TO_MANY_DESCRIPTOR = "django.db.models.fields.related_descriptors.ManyToManyDescriptor"
MANY_RELATED_MANAGER = "django.db.models.fields.related_descriptors.ManyRelatedManager"
RELATED_FIELDS_CLASSES = frozenset(
(
FOREIGN_OBJECT_FULLNAME,
FOREIGN_KEY_FULLNAME,
ONETOONE_FIELD_FULLNAME,
)
)
OPTIONS_CLASS_FULLNAME = "django.db.models.options.Options"
QUERYDICT_CLASS_FULLNAME = "django.http.request.QueryDict"
COMBINABLE_EXPRESSION_FULLNAME = "django.db.models.expressions.Combinable"
F_EXPRESSION_FULLNAME = "django.db.models.expressions.F"
ANY_ATTR_ALLOWED_CLASS_FULLNAME = "django_stubs_ext.AnyAttrAllowed"
TYPED_MODEL_META_FULLNAME = "django_stubs_ext.db.models.TypedModelMeta"
STR_PROMISE_FULLNAME = "django.utils.functional._StrPromise"
OBJECT_DOES_NOT_EXIST = "django.core.exceptions.ObjectDoesNotExist"
MULTIPLE_OBJECTS_RETURNED = "django.core.exceptions.MultipleObjectsReturned"
DJANGO_ABSTRACT_MODELS = frozenset(
(
ABSTRACT_BASE_USER_MODEL_FULLNAME,
ABSTRACT_USER_MODEL_FULLNAME,
PERMISSION_MIXIN_CLASS_FULLNAME,
"django.contrib.sessions.base_session.AbstractBaseSession",
)
)
django-stubs-5.2.9/mypy_django_plugin/lib/helpers.py 0000664 0000000 0000000 00000061333 15134010516 0022611 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable, Iterator
from typing import TYPE_CHECKING, Any, Literal, NamedTuple, TypedDict, cast
from django.db.models.base import Model
from django.db.models.fields.related import RelatedField
from django.db.models.fields.reverse_related import ForeignObjectRel
from mypy import checker
from mypy.checker import TypeChecker
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,
SymbolNode,
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,
TupleType,
Type,
TypedDictType,
TypeOfAny,
UnionType,
get_proper_type,
)
from mypy.types import Type as MypyType
from typing_extensions import Self
from mypy_django_plugin.lib import fullnames
if TYPE_CHECKING:
from django.db.models.fields import Field
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]
baseform_bases: dict[str, int]
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_django_metadata_bases(model_info: TypeInfo, key: Literal["baseform_bases"]) -> dict[str, int]:
return get_django_metadata(model_info).setdefault(key, cast("dict[str, int]", {}))
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)
class IncompleteDefnException(Exception):
pass
def lookup_fully_qualified_sym(fullname: str, all_modules: dict[str, MypyFile]) -> SymbolTableNode | None:
if "." not in fullname:
return None
if "[" in fullname and "]" in fullname:
# We sometimes generate fake fullnames like a.b.C[x.y.Z] to provide a better representation to users
# Make sure that we handle lookups of those types of names correctly if the part inside [] contains "."
bracket_start = fullname.index("[")
fullname_without_bracket = fullname[:bracket_start]
module, cls_name = fullname_without_bracket.rsplit(".", 1)
cls_name += fullname[bracket_start:]
else:
module, cls_name = fullname.rsplit(".", 1)
parent_classes: list[str] = []
while True:
module_file = all_modules.get(module)
if module_file:
break
if "." not in module:
return None
module, parent_cls = module.rsplit(".", 1)
parent_classes.insert(0, parent_cls)
scope: MypyFile | TypeInfo = module_file
for parent_cls in parent_classes:
sym = scope.names.get(parent_cls)
if sym is None:
return None
if isinstance(sym.node, TypeInfo):
scope = sym.node
else:
return None
sym = scope.names.get(cls_name)
if sym is None:
return None
return sym
def lookup_fully_qualified_generic(name: str, all_modules: dict[str, MypyFile]) -> SymbolNode | None:
sym = lookup_fully_qualified_sym(name, all_modules)
if sym is None:
return None
return sym.node
def lookup_fully_qualified_typeinfo(api: TypeChecker | SemanticAnalyzer, fullname: str) -> TypeInfo | None:
node = lookup_fully_qualified_generic(fullname, api.modules)
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, api: TypeChecker) -> 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`
"""
api = get_typechecker_api(ctx)
if not (isinstance(ctx.type, Instance) and (model_type := extract_model_type_from_queryset(ctx.type, api))):
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)
def get_field_lookup_exact_type(api: TypeChecker, field: "Field[Any, Any]") -> MypyType:
if isinstance(field, RelatedField | ForeignObjectRel):
# Not using field.related_model because that may have str value "self"
lookup_type_class = field.remote_field.model
rel_model_info = lookup_class_typeinfo(api, lookup_type_class)
if rel_model_info is None:
return AnyType(TypeOfAny.from_error)
return make_optional_type(Instance(rel_model_info, []))
field_info = lookup_class_typeinfo(api, field.__class__)
if field_info is None:
return AnyType(TypeOfAny.explicit)
return get_private_descriptor_type(field_info, "_pyi_lookup_exact_type", is_nullable=field.null)
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 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 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 make_typeddict(
api: SemanticAnalyzer | CheckerPluginInterface,
fields: dict[str, MypyType],
required_keys: set[str],
readonly_keys: set[str],
) -> TypedDictType:
if isinstance(api, CheckerPluginInterface):
fallback_type = api.named_generic_type("typing._TypedDict", [])
else:
fallback_type = api.named_type("typing._TypedDict", [])
return TypedDictType(
fields,
required_keys=required_keys,
readonly_keys=readonly_keys,
fallback=fallback_type,
)
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_fullnames_by_label.get(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,
)
django-stubs-5.2.9/mypy_django_plugin/main.py 0000664 0000000 0000000 00000033473 15134010516 0021331 0 ustar 00root root 0000000 0000000 import itertools
import sys
from collections.abc import Callable
from functools import cached_property, partial
from typing import Any
from mypy.build import PRI_MED, PRI_MYPY
from mypy.modulefinder import mypy_path
from mypy.nodes import MypyFile, TypeInfo
from mypy.options import Options
from mypy.plugin import (
AnalyzeTypeContext,
AttributeContext,
ClassDefContext,
DynamicClassDefContext,
FunctionContext,
MethodContext,
Plugin,
ReportConfigContext,
)
from mypy.types import Type as MypyType
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 (
choices,
fields,
forms,
init_create,
manytomany,
manytoone,
meta,
orm_lookups,
querysets,
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_manager_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
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_current_form_bases(self) -> dict[str, int]:
model_info = self._get_typeinfo_or_none(fullnames.BASEFORM_CLASS_FULLNAME)
if model_info:
bases = helpers.get_django_metadata_bases(model_info, "baseform_bases")
bases[fullnames.BASEFORM_CLASS_FULLNAME] = 1
bases[fullnames.FORM_CLASS_FULLNAME] = 1
bases[fullnames.MODELFORM_CLASS_FULLNAME] = 1
return bases
return {}
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 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")]
# 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 []
deps = set()
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"),
]
def get_function_hook(self, fullname: str) -> Callable[[FunctionContext], MypyType] | None:
info = self._get_typeinfo_or_none(fullname)
if info:
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)
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,
"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"
),
}
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 class_fullname.endswith("QueryDict"):
info = self._get_typeinfo_or_none(class_fullname)
if info and info.has_base(fullnames.QUERYDICT_CLASS_FULLNAME):
return check_querydict_is_mutable
elif 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)
if method_name in self.manager_and_queryset_method_hooks:
info = self._get_typeinfo_or_none(class_fullname)
if info and helpers.has_any_of_bases(
info, [fullnames.QUERYSET_CLASS_FULLNAME, fullnames.MANAGER_CLASS_FULLNAME]
):
return self.manager_and_queryset_method_hooks[method_name]
elif method_name == "get_field":
info = self._get_typeinfo_or_none(class_fullname)
if info and info.has_base(fullnames.OPTIONS_CLASS_FULLNAME):
return partial(meta.return_proper_field_type_from_get_field, django_context=self.django_context)
return None
def get_customize_class_mro_hook(self, fullname: str) -> Callable[[ClassDefContext], None] | None:
info = self._get_typeinfo_or_none(fullname)
if info and info.has_base(fullnames.BASE_MANAGER_CLASS_FULLNAME):
return reparametrize_any_manager_hook
return None
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
def get_base_class_hook(self, fullname: str) -> Callable[[ClassDefContext], None] | None:
# Base class is a Model class definition
info = self._get_typeinfo_or_none(fullname)
if info and helpers.is_model_type(info):
return partial(process_model_class, django_context=self.django_context)
# Base class is a Form class definition
if fullname in self._get_current_form_bases():
return forms.transform_form_class
# Base class is a QuerySet class definition
if info and info.has_base(fullnames.QUERYSET_CLASS_FULLNAME):
return add_as_manager_to_queryset_class
return None
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)
# Lookup of the '.is_superuser' attribute
if info and 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 and 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
and info.has_base(fullnames.BASE_MANAGER_CLASS_FULLNAME)
and "from_queryset_manager" in helpers.get_django_metadata(info)
):
return resolve_manager_method
if info and info.has_base(fullnames.STR_PROMISE_FULLNAME):
return resolve_str_promise_attribute
if info and (
(
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
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
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
def report_config_data(self, ctx: ReportConfigContext) -> dict[str, Any]:
# Cache would be cleared if any settings do change.
extra_data = {
"AUTH_USER_MODEL": self.django_context.settings.AUTH_USER_MODEL,
}
return self.plugin_config.to_json(extra_data)
def plugin(version: str) -> type[NewSemanalDjangoPlugin]:
return NewSemanalDjangoPlugin
django-stubs-5.2.9/mypy_django_plugin/py.typed 0000664 0000000 0000000 00000000000 15134010516 0021506 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/mypy_django_plugin/transformers/ 0000775 0000000 0000000 00000000000 15134010516 0022546 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/mypy_django_plugin/transformers/__init__.py 0000664 0000000 0000000 00000000000 15134010516 0024645 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/mypy_django_plugin/transformers/auth.py 0000664 0000000 0000000 00000003254 15134010516 0024065 0 ustar 00root root 0000000 0000000 from mypy.nodes import TypeInfo
from mypy.plugin import AnalyzeTypeContext
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.django.context import DjangoContext
from mypy_django_plugin.lib import fullnames, helpers
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_fullnames_by_label.get(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)
django-stubs-5.2.9/mypy_django_plugin/transformers/choices.py 0000664 0000000 0000000 00000025154 15134010516 0024544 0 ustar 00root root 0000000 0000000 from enum import Enum, auto
from mypy.nodes import MemberExpr, NameExpr, SuperExpr, TypeAlias, TypeInfo, Var
from mypy.plugin import AttributeContext
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
# 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("__")
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
django-stubs-5.2.9/mypy_django_plugin/transformers/fields.py 0000664 0000000 0000000 00000026012 15134010516 0024367 0 ustar 00root root 0000000 0000000 from typing import TYPE_CHECKING, Any, NamedTuple, Union, cast
from django.core.exceptions import FieldDoesNotExist
from django.db.models.fields import AutoField, Field
from django.db.models.fields.related import RelatedField
from django.db.models.fields.reverse_related import ForeignObjectRel
from mypy.maptype import map_instance_to_supertype
from mypy.nodes import AssignmentStmt, NameExpr, TypeInfo
from mypy.plugin import FunctionContext
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.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 manytomany
if TYPE_CHECKING:
from django.contrib.contenttypes.fields import GenericForeignKey
def _get_current_field_from_assignment(
ctx: FunctionContext, django_context: DjangoContext
) -> Union["Field[Any, Any]", ForeignObjectRel, "GenericForeignKey"] | 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
base_field_type = next(base for base in default_return_type.type.mro if base.fullname == fullnames.FIELD_FULLNAME)
mapped_instance = map_instance_to_supertype(default_return_type, base_field_type)
mapped_set_type, mapped_get_type = tuple(get_proper_type(arg) for arg in mapped_instance.args)
# bail if either mapped_set_type or mapped_get_type have type Never
if not (isinstance(mapped_set_type, UninhabitedType) or isinstance(mapped_get_type, UninhabitedType)):
# always replace set_type and get_type with (non-Any) mapped types
set_type = helpers.convert_any_to_type(mapped_set_type, set_type)
get_type = get_proper_type(helpers.convert_any_to_type(mapped_get_type, 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 ctx.default_return_type
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)
django-stubs-5.2.9/mypy_django_plugin/transformers/forms.py 0000664 0000000 0000000 00000001427 15134010516 0024252 0 ustar 00root root 0000000 0000000 from mypy.nodes import TypeInfo
from mypy.plugin import ClassDefContext
from mypy_django_plugin.lib import fullnames, helpers
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
def transform_form_class(ctx: ClassDefContext) -> None:
sym = ctx.api.lookup_fully_qualified_or_none(fullnames.BASEFORM_CLASS_FULLNAME)
if sym is not None and isinstance(sym.node, TypeInfo):
bases = helpers.get_django_metadata_bases(sym.node, "baseform_bases")
bases[ctx.cls.fullname] = 1
make_meta_nested_class_inherit_from_any(ctx)
django-stubs-5.2.9/mypy_django_plugin/transformers/functional.py 0000664 0000000 0000000 00000003176 15134010516 0025271 0 ustar 00root root 0000000 0000000 from typing import Any
from mypy.checkmember import analyze_member_access
from mypy.errorcodes import ATTR_DEFINED
from mypy.nodes import CallExpr, MemberExpr
from mypy.plugin import AttributeContext
from mypy.types import AnyType, Instance, TypeOfAny
from mypy.types import Type as MypyType
from mypy.version import __version__ as mypy_version
from mypy_django_plugin.lib import helpers
mypy_version_info = tuple(map(int, mypy_version.partition("+")[0].split(".")))
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, [])
# 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"] = ctx.api.msg
return 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),
**extra,
)
django-stubs-5.2.9/mypy_django_plugin/transformers/init_create.py 0000664 0000000 0000000 00000007760 15134010516 0025420 0 ustar 00root root 0000000 0000000 from django.db.models.base import Model
from mypy.errorcodes import CALL_ARG
from mypy.plugin import FunctionContext, MethodContext
from mypy.types import Instance, get_proper_type
from mypy.types import Type as MypyType
from mypy_django_plugin.django.context import DjangoContext
from mypy_django_plugin.lib import helpers
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
django-stubs-5.2.9/mypy_django_plugin/transformers/managers.py 0000664 0000000 0000000 00000060425 15134010516 0024724 0 ustar 00root root 0000000 0000000 from typing import Final
from mypy.checker import TypeChecker
from mypy.copytype import copy_type
from mypy.nodes import (
GDEF,
CallExpr,
Decorator,
FuncBase,
FuncDef,
MemberExpr,
Node,
OverloadedFuncDef,
PlaceholderNode,
RefExpr,
StrExpr,
SymbolTableNode,
TypeInfo,
)
from mypy.plugin import AttributeContext, ClassDefContext, DynamicClassDefContext
from mypy.plugins.common import add_method_to_class
from mypy.semanal import SemanticAnalyzer
from mypy.semanal_shared import has_placeholder
from mypy.subtypes import find_member
from mypy.types import (
AnyType,
CallableType,
FunctionLike,
Instance,
Overloaded,
ProperType,
TupleType,
TypeOfAny,
TypeType,
TypeVarType,
UnionType,
get_proper_type,
)
from mypy.types import Type as MypyType
from mypy.typevars import fill_typevars
from mypy_django_plugin.lib import fullnames, helpers
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
is_fallback_queryset = queryset_info.metadata.get("django", {}).get("any_fallback_queryset", False)
base_that_has_method = queryset_info.get_containing_type_info(method_name)
if base_that_has_method is None:
return None
method_type = _get_funcdef_type(base_that_has_method.names[method_name].node)
if not isinstance(method_type, FunctionLike):
return method_type
items = []
for item in method_type.items:
items.append(
_process_dynamic_method(
method_name,
item,
base_that_has_method=base_that_has_method,
queryset_info=queryset_info,
manager_instance=manager_instance,
is_fallback_queryset=is_fallback_queryset,
)
)
return Overloaded(items) if len(items) > 1 else items[0]
def _process_dynamic_method(
method_name: str,
method_type: CallableType,
*,
queryset_info: TypeInfo,
base_that_has_method: TypeInfo,
manager_instance: Instance,
is_fallback_queryset: bool,
) -> CallableType:
variables = method_type.variables
ret_type = method_type.ret_type
manager_model = get_proper_type(find_member("model", manager_instance, manager_instance))
assert isinstance(manager_model, TypeType), manager_model
manager_model_type = manager_model.item
queryset_instance = Instance(queryset_info, (manager_model_type,) * len(queryset_info.type_vars))
# 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:
ret_type = queryset_instance
variables = ()
args_types = method_type.arg_types[1:]
if _has_compatible_type_vars(base_that_has_method):
typed_var = manager_instance.args or queryset_info.bases[0].args
if (
typed_var
and isinstance((model_arg := get_proper_type(typed_var[0])), Instance)
and model_arg.type.has_base(fullnames.MODEL_CLASS_FULLNAME)
and helpers.is_model_type(model_arg.type)
):
ret_type = _replace_type_var(ret_type, base_that_has_method.defn.type_vars[0].fullname, model_arg)
args_types = [
_replace_type_var(arg_type, base_that_has_method.defn.type_vars[0].fullname, model_arg)
for arg_type in args_types
]
if base_that_has_method.self_type:
# Manages -> Self returns
ret_type = _replace_type_var(ret_type, base_that_has_method.self_type.fullname, queryset_instance)
# Drop any 'self' argument as our manager is already initialized
return method_type.copy_modified(
arg_types=args_types,
arg_kinds=method_type.arg_kinds[1:],
arg_names=method_type.arg_names[1:],
variables=variables,
ret_type=ret_type,
)
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 _has_compatible_type_vars(type_info: TypeInfo) -> bool:
"""
Determines whether the provided 'type_info',
is a generically parameterized subclass of models.QuerySet[T], with exactly
one type variable.
Criteria for compatibility:
1. 'type_info' must be a generic class with exactly one type variable.
2. All superclasses of 'type_info', up to and including models.QuerySet,
must also be generic classes with exactly one type variable.
Examples:
Compatible:
class _MyModelQuerySet(models.QuerySet[T]): ...
class MyModelQuerySet(_MyModelQuerySet[T_2]):
def example(self) -> T_2: ...
Incompatible:
class MyModelQuerySet(models.QuerySet[T], Generic[T, T2]):
def example(self, a: T2) -> T_2: ...
Returns:
True if the 'base' meets the criteria, otherwise False.
"""
args = type_info.defn.type_vars
if not args or len(args) > 1 or not isinstance(args[0], TypeVarType):
# No type var to manage, or too many
return False
type_var: MypyType | None = None
# check that for all the bases it has only one type vars
for sub_base in type_info.bases:
unic_args = list(set(sub_base.args))
if not unic_args or len(unic_args) > 1:
# No type var for the sub_base, skipping
continue
if type_var and unic_args and type_var != unic_args[0]:
# There is two different type vars in the bases, we are not compatible
return False
type_var = unic_args[0]
if not type_var:
# No type var found in the bases.
return False
if type_info.has_base(fullnames.QUERYSET_CLASS_FULLNAME):
# If it is a subclass of QuerySet, it is compatible.
return True
# check that at least one base is a subclass of queryset with Generic type vars
return any(_has_compatible_type_vars(sub_base.type) for sub_base in type_info.bases)
def _replace_type_var(ret_type: MypyType, to_replace: str, replace_by: MypyType) -> MypyType:
"""
Substitutes a specified type variable within a Mypy type expression with an actual type.
This function is recursive, and it operates on various kinds of Mypy types like Instance,
ProperType, etc., to deeply replace the specified type variable.
Parameters:
- ret_type: A Mypy type expression where the substitution should occur.
- to_replace: The type variable to be replaced, specified as its full name.
- replace_by: The actual Mypy type to substitute in place of 'to_replace'.
Example:
Given:
ret_type = "typing.Collection[T]"
to_replace = "T"
replace_by = "myapp.models.MyModel"
Result:
"typing.Collection[myapp.models.MyModel]"
"""
if isinstance(ret_type, TypeVarType) and ret_type.fullname == to_replace:
return replace_by
ret_type = copy_type(get_proper_type(ret_type))
if isinstance(ret_type, Instance):
# Since it is an instance, recursively find the type var for all its args.
return ret_type.copy_modified(
args=tuple(_replace_type_var(item, to_replace, replace_by) for item in ret_type.args)
)
if isinstance(ret_type, TypeType):
return TypeType.make_normalized(
_replace_type_var(ret_type.item, to_replace, replace_by),
line=ret_type.line,
column=ret_type.column,
)
if isinstance(ret_type, TupleType):
return ret_type.copy_modified(
items=[_replace_type_var(item, to_replace, replace_by) for item in ret_type.items]
)
if isinstance(ret_type, UnionType):
return UnionType.make_union(
items=[_replace_type_var(item, to_replace, replace_by) for item in ret_type.items],
line=ret_type.line,
column=ret_type.column,
)
return ret_type
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.
"""
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:
# 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:
base_manager_instance = fill_typevars(base_manager_info)
assert isinstance(base_manager_instance, Instance)
# 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
if with_unique_name:
manager_info = helpers.add_new_class_for_module(
module=api.modules[api.cur_mod_id],
name=name,
bases=[base_manager_instance],
)
else:
manager_info = helpers.create_type_info(name, api.cur_mod_id, bases=[base_manager_instance])
manager_info.line = line
manager_info.type_vars = base_manager_info.type_vars
manager_info.defn.type_vars = base_manager_info.defn.type_vars
manager_info.defn.line = line
return manager_info
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 add_as_manager_to_queryset_class(ctx: ClassDefContext) -> None:
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()
# either a manual `as_manager` definition or this is a deferral pass
if "as_manager" in queryset_info.names:
return
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
base_ret_type = manager_base
if base_as_manager.fullname != f"{fullnames.QUERYSET_CLASS_FULLNAME}.as_manager":
base_as_manager_type = get_proper_type(base_as_manager.type)
if not isinstance(base_as_manager_type, CallableType):
return
base_as_manager_ret_type = get_proper_type(base_as_manager_type.ret_type)
if not isinstance(base_as_manager_ret_type, Instance):
return
base_ret_type = base_as_manager_ret_type.type
manager_class_name = f"{manager_base.name}From{queryset_info.name}"
current_module = semanal_api.modules[semanal_api.cur_mod_id]
existing_sym = current_module.names.get(manager_class_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:
# Create a new `TypeInfo` instance for the manager type
try:
new_manager_info = create_manager_class(
api=semanal_api,
base_manager_info=base_ret_type,
name=manager_class_name,
line=queryset_info.line,
with_unique_name=True,
)
except helpers.IncompleteDefnException:
return _defer()
populate_manager_from_queryset(new_manager_info, queryset_info)
register_dynamically_created_manager(
fullname=new_manager_info.fullname,
manager_name=manager_class_name,
manager_base=manager_base,
)
# Add the new manager to the current module
# We'll use `new_manager_info.name` instead of `manager_class_name` here
# to handle possible name collisions, as it's unique.
current_module.names[new_manager_info.name] = (
# Note that the generated manager type is always inserted at module level
SymbolTableNode(GDEF, new_manager_info, plugin_generated=True)
)
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 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.
"""
manager = ctx.api.lookup_fully_qualified_or_none(ctx.cls.fullname)
if manager is None or manager.node is None:
return
assert isinstance(manager.node, TypeInfo)
if manager.node.type_vars:
# We've already been here
return
parent_manager = next(
(base for base in manager.node.bases if base.type.has_base(fullnames.BASE_MANAGER_CLASS_FULLNAME)),
None,
)
if parent_manager is None or len(parent_manager.args) != 1:
return
model_param = get_proper_type(parent_manager.args[0])
if not isinstance(model_param, AnyType) or model_param.type_of_any is not TypeOfAny.from_omitted_generics:
return
type_vars = tuple(parent_manager.type.defn.type_vars)
# 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_manager.args = type_vars
manager.node.defn.type_vars = list(type_vars)
manager.node.add_type_vars()
django-stubs-5.2.9/mypy_django_plugin/transformers/manytomany.py 0000664 0000000 0000000 00000015371 15134010516 0025323 0 ustar 00root root 0000000 0000000 from typing import NamedTuple
from mypy.nodes import AssignmentStmt, NameExpr, Node, TypeInfo
from mypy.plugin import FunctionContext, MethodContext
from mypy.types import Instance, ProperType, UninhabitedType, get_proper_type
from mypy.types import Type as MypyType
from mypy_django_plugin.django.context import DjangoContext
from mypy_django_plugin.lib import fullnames, helpers
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 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]
default_through_arg = get_proper_type(default_return_type.args[1])
if isinstance(default_through_arg, UninhabitedType):
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 = default_through_arg
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])
django-stubs-5.2.9/mypy_django_plugin/transformers/manytoone.py 0000664 0000000 0000000 00000003727 15134010516 0025142 0 ustar 00root root 0000000 0000000 from mypy.plugin import MethodContext
from mypy.types import Instance, get_proper_type
from mypy.types import Type as MypyType
from mypy_django_plugin.lib import fullnames, helpers
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, [])
django-stubs-5.2.9/mypy_django_plugin/transformers/meta.py 0000664 0000000 0000000 00000003044 15134010516 0024047 0 ustar 00root root 0000000 0000000 from django.core.exceptions import FieldDoesNotExist
from mypy.plugin import MethodContext
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
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
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
django-stubs-5.2.9/mypy_django_plugin/transformers/models.py 0000664 0000000 0000000 00000152277 15134010516 0024421 0 ustar 00root root 0000000 0000000 from collections import deque
from collections.abc import Iterable
from functools import cached_property
from typing import Any, cast
from django.db.models import Manager, Model
from django.db.models.fields import DateField, DateTimeField, Field
from django.db.models.fields.reverse_related import ForeignObjectRel, ManyToManyRel, OneToOneRel
from mypy.checker import TypeChecker
from mypy.nodes import (
ARG_STAR2,
MDEF,
Argument,
AssignmentStmt,
CallExpr,
Context,
FakeInfo,
NameExpr,
RefExpr,
Statement,
SymbolTableNode,
TypeInfo,
Var,
)
from mypy.plugin import AnalyzeTypeContext, AttributeContext, ClassDefContext
from mypy.plugins import common
from mypy.semanal import SemanticAnalyzer
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 mypy.typevars import fill_typevars, fill_typevars_with_any
from mypy_django_plugin.config import DjangoPluginConfig
from mypy_django_plugin.django.context import DjangoContext
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
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_node_to_model_class(
self, name: str, typ: MypyType, *, no_serialize: bool = False, is_classvar: bool = False
) -> None:
# TODO: Rename to signal that it is a `Var` that is added..
helpers.add_new_sym_for_info(
self.model_classdef.info, name=name, sym_type=typ, no_serialize=no_serialize, is_classvar=is_classvar
)
def add_new_class_for_current_module(self, name: str, bases: list[Instance]) -> TypeInfo:
current_module = self.api.modules[self.model_classdef.info.module_name]
return helpers.add_new_class_for_module(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
base_manager = fill_typevars(base_manager_info)
assert isinstance(base_manager, Instance)
manager_info = self.add_new_class_for_current_module(name, [base_manager])
manager_info.fallback_to_any = True
manager_info.type_vars = base_manager_info.type_vars
manager_info.defn.type_vars = base_manager_info.defn.type_vars
manager_info.metaclass_type = manager_info.calculate_metaclass_type()
# 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
base_queryset = fill_typevars(base_queryset_info)
assert isinstance(base_queryset, Instance)
queryset_info = self.add_new_class_for_current_module(name, [base_queryset])
queryset_info.metadata["django"] = {
"any_fallback_queryset": True,
}
queryset_info.fallback_to_any = True
queryset_info.type_vars = base_queryset_info.type_vars.copy()
queryset_info.defn.type_vars = base_queryset_info.defn.type_vars.copy()
queryset_info.metaclass_type = queryset_info.calculate_metaclass_type()
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]):
...
"""
def run(self) -> None:
annotations = self.lookup_typeinfo_or_incomplete_defn_error("django_stubs_ext.Annotations")
object_does_not_exist = self.lookup_typeinfo_or_incomplete_defn_error(fullnames.OBJECT_DOES_NOT_EXIST)
multiple_objects_returned = self.lookup_typeinfo_or_incomplete_defn_error(fullnames.MULTIPLE_OBJECTS_RETURNED)
annotated_model_name = self.model_classdef.info.name + "@AnnotatedWith"
annotated_model = self.lookup_typeinfo(self.model_classdef.info.module_name + "." + annotated_model_name)
if annotated_model is None:
model_type = fill_typevars_with_any(self.model_classdef.info)
assert isinstance(model_type, Instance)
annotations_type = fill_typevars(annotations)
assert isinstance(annotations_type, Instance)
annotated_model = self.add_new_class_for_current_module(
annotated_model_name, bases=[model_type, annotations_type]
)
annotated_model.defn.type_vars = annotations.defn.type_vars
annotated_model.add_type_vars()
helpers.mark_as_annotated_model(annotated_model)
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
helpers.add_new_sym_for_info(
annotated_model, "DoesNotExist", TypeType(Instance(object_does_not_exist, []))
)
helpers.add_new_sym_for_info(
annotated_model, "MultipleObjectsReturned", TypeType(Instance(multiple_objects_returned, []))
)
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.
"""
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):
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_node_to_model_class(dest_name, Instance(auto_field_info, [set_type, get_type]))
class AddPrimaryKeyAlias(AddDefaultPrimaryKey):
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:
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):
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_node_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_node_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_node_to_model_class(manager_name, manager_type, is_classvar=True)
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.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_node_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_node_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 if manager_expr else 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 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)()
"""
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):
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_node_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_node_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
through_fullname = helpers.get_class_fullname(relation.through)
through_model_info = self.lookup_typeinfo_or_incomplete_defn_error(through_fullname)
self.add_new_node_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_node_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,
)
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):
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)
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,
)
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())
# Add a manager named 'objects'
helpers.add_new_sym_for_info(
through_model,
name="objects",
sym_type=Instance(self.manager_info, [Instance(through_model, [])]),
is_classvar=True,
)
# Also add manager as '_default_manager' attribute
helpers.add_new_sym_for_info(
through_model,
name="_default_manager",
sym_type=Instance(self.manager_info, [Instance(through_model, [])]),
is_classvar=True,
)
return through_model
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)
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.
"""
if not plugin_config.strict_model_abstract_attrs:
return
if ctx.cls.fullname != fullnames.MODEL_CLASS_FULLNAME:
return
for attr_name in ["DoesNotExist", "MultipleObjectsReturned", "objects"]:
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' 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.
"""
if "DoesNotExist" not in self.model_classdef.info.names:
object_does_not_exist = self.lookup_typeinfo_or_incomplete_defn_error(fullnames.OBJECT_DOES_NOT_EXIST)
does_not_exist: Var | TypeInfo
if self.is_model_abstract:
does_not_exist = self.create_new_var("DoesNotExist", TypeType(Instance(object_does_not_exist, [])))
does_not_exist.is_abstract_var = True
else:
does_not_exist = helpers.create_type_info(
"DoesNotExist",
self.model_classdef.info.fullname,
self.get_exception_bases("DoesNotExist") or [Instance(object_does_not_exist, [])],
)
self.model_classdef.info.names[does_not_exist.name] = SymbolTableNode(
MDEF, does_not_exist, plugin_generated=True
)
if "MultipleObjectsReturned" not in self.model_classdef.info.names:
django_multiple_objects_returned = self.lookup_typeinfo_or_incomplete_defn_error(
fullnames.MULTIPLE_OBJECTS_RETURNED
)
multiple_objects_returned: Var | TypeInfo
if self.is_model_abstract:
multiple_objects_returned = self.create_new_var(
"MultipleObjectsReturned", TypeType(Instance(django_multiple_objects_returned, []))
)
multiple_objects_returned.is_abstract_var = True
else:
multiple_objects_returned = helpers.create_type_info(
"MultipleObjectsReturned",
self.model_classdef.info.fullname,
(
self.get_exception_bases("MultipleObjectsReturned")
or [Instance(django_multiple_objects_returned, [])]
),
)
self.model_classdef.info.names[multiple_objects_returned.name] = SymbolTableNode(
MDEF, multiple_objects_returned, plugin_generated=True
)
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):
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.make_typeddict(
api,
fields={**annotations.items, **fields_dict.items},
required_keys={*annotations.required_keys, *fields_dict.required_keys},
readonly_keys={*annotations.readonly_keys, *fields_dict.readonly_keys},
)
else:
annotated_model = helpers.lookup_fully_qualified_typeinfo(api, model_type.type.fullname + "@AnnotatedWith")
if annotated_model is None:
return model_type
return Instance(annotated_model, [fields_dict], extra_attrs=extra_attrs)
django-stubs-5.2.9/mypy_django_plugin/transformers/orm_lookups.py 0000664 0000000 0000000 00000004752 15134010516 0025501 0 ustar 00root root 0000000 0000000 from mypy.plugin import MethodContext
from mypy.types import AnyType, Instance, ProperType, TypeOfAny, get_proper_type
from mypy.types import Type as MypyType
from mypy_django_plugin.django.context import DjangoContext
from mypy_django_plugin.exceptions import UnregisteredModelError
from mypy_django_plugin.lib import fullnames, helpers
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
# Expected formal arguments for filter methods are `*args` and `**kwargs`. We'll only typecheck
# `**kwargs`, which means that `arg_names[1]` is what we're interested in.
lookup_kwargs = ctx.arg_names[1] if len(ctx.arg_names) >= 2 else []
provided_lookup_types = ctx.arg_types[1] if len(ctx.arg_types) >= 2 else []
for lookup_kwarg, provided_type in zip(lookup_kwargs, provided_lookup_types, strict=False):
if lookup_kwarg is None:
continue
provided_type = get_proper_type(provided_type)
if isinstance(provided_type, Instance) and provided_type.type.has_base(
fullnames.COMBINABLE_EXPRESSION_FULLNAME
):
provided_type = resolve_combinable_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}:",
)
return ctx.default_return_type
def resolve_combinable_type(combinable_type: Instance, django_context: DjangoContext) -> ProperType:
if combinable_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(combinable_type)
django-stubs-5.2.9/mypy_django_plugin/transformers/querysets.py 0000664 0000000 0000000 00000104662 15134010516 0025175 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from typing import Literal
from django.core.exceptions import FieldDoesNotExist, FieldError
from django.db.models.base import Model
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 mypy.checker import TypeChecker
from mypy.errorcodes import NO_REDEF
from mypy.nodes import ARG_NAMED, ARG_NAMED_OPT, ARG_STAR, CallExpr, Expression, ListExpr, SetExpr, TupleExpr
from mypy.plugin import FunctionContext, MethodContext
from mypy.types import AnyType, Instance, LiteralType, ProperType, TupleType, TypedDictType, TypeOfAny, 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.helpers import DjangoModel
from mypy_django_plugin.transformers.models import get_annotated_type
def determine_proper_manager_type(ctx: FunctionContext) -> 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)
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],
*,
is_annotated: bool,
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
if is_annotated:
# Return a NamedTuple with a fallback so that it's possible to access any field
return helpers.make_oneoff_named_tuple(
typechecker_api,
"Row",
column_types,
extra_bases=[typechecker_api.named_generic_type(fullnames.ANY_ATTR_ALLOWED_CLASS_FULLNAME, [])],
)
return helpers.make_oneoff_named_tuple(typechecker_api, "Row", column_types)
# flat=False, named=False, all fields
if is_annotated:
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:
lookup_field_type = get_field_type_from_lookup(
ctx, django_context, model_cls, lookup=field_lookup, method="values_list", silent_on_error=is_annotated
)
if lookup_field_type is None:
if is_annotated:
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)])
row_type = get_values_list_row_type(
ctx, django_context, django_model.cls, is_annotated=django_model.is_annotated, 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 gather_kwargs(ctx: MethodContext) -> dict[str, MypyType] | None:
num_args = len(ctx.arg_kinds)
kwargs = {}
named = (ARG_NAMED, ARG_NAMED_OPT)
for i in range(num_args):
if not ctx.arg_kinds[i]:
continue
if any(kind not in named for kind in ctx.arg_kinds[i]):
# Only named arguments supported
continue
for j in range(len(ctx.arg_names[i])):
name = ctx.arg_names[i][j]
assert name is not None
kwargs[name] = ctx.arg_types[i][j]
return kwargs
def gather_expression_types(ctx: MethodContext) -> dict[str, MypyType]:
kwargs = gather_kwargs(ctx)
if not kwargs:
return {}
# For now, we don't try to resolve the output_field of the field would be, but use 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.
return {name: AnyType(TypeOfAny.special_form) for name, _ in kwargs.items()}
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:
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)
}
annotated_type: ProperType = django_model.typ
if expression_types:
fields_dict = helpers.make_typeddict(
api,
fields=expression_types,
required_keys=set(expression_types.keys()),
readonly_keys=set(),
)
annotated_type = get_annotated_type(api, django_model.typ, fields_dict=fields_dict)
row_type: MypyType
if len(default_return_type.args) > 1:
original_row_type = get_proper_type(default_return_type.args[1])
row_type = original_row_type
if isinstance(original_row_type, TypedDictType):
row_type = api.named_generic_type(
"builtins.dict", [api.named_generic_type("builtins.str", []), AnyType(TypeOfAny.from_omitted_generics)]
)
elif isinstance(original_row_type, TupleType):
if original_row_type.partial_fallback.type.has_base("typing.NamedTuple"):
# TODO: Use a NamedTuple which contains the known fields, but also
# falls back to allowing any attribute access.
row_type = AnyType(TypeOfAny.implementation_artifact)
else:
row_type = api.named_generic_type("builtins.tuple", [AnyType(TypeOfAny.from_omitted_generics)])
elif isinstance(original_row_type, Instance) and helpers.is_model_type(original_row_type.type):
row_type = annotated_type
else:
row_type = annotated_type
return default_return_type.copy_modified(args=[annotated_type, row_type])
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 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/5.2/ref/models/querysets/#values
"""
django_model = helpers.get_model_info_from_qs_ctx(ctx, django_context)
if django_model is None or django_model.is_annotated:
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)
# 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)
column_types: dict[str, MypyType] = {}
# Collect `*fields` types -- `.values("id", "name")`
for field_lookup in field_lookups:
field_lookup_type = get_field_type_from_lookup(
ctx, django_context, django_model.cls, lookup=field_lookup, method="values"
)
if field_lookup_type is None:
return default_return_type.copy_modified(args=[django_model.typ, AnyType(TypeOfAny.from_error)])
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, set(column_types.keys()), set())
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, api)
# 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 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
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)
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 (model.typ.extra_attrs and attr_name in model.typ.extra_attrs.attrs)
# 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("__"):
rel_obj_descriptor = getattr(current_model_cls, through_attr, None)
if rel_obj_descriptor is None:
ctx.api.fail(
(
f'Cannot find "{through_attr}" on "{current_model_cls.__name__}" object, '
f'"{lookup}" is an invalid parameter to "prefetch_related()"'
),
ctx.context,
)
return False
if contenttypes_installed and is_generic_prefetch:
from django.contrib.contenttypes.fields import GenericForeignKey
if not isinstance(rel_obj_descriptor, GenericForeignKey):
ctx.api.fail(
f'"{through_attr}" on "{current_model_cls.__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 # type:ignore[assignment] # Can't be 'self' for non abstract models
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 # type:ignore[assignment] # Can't be 'self' for non abstract models
)
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 # type:ignore[assignment] # Can't be 'self' for non abstract models
else:
if contenttypes_installed:
from django.contrib.contenttypes.fields import GenericForeignKey
if isinstance(rel_obj_descriptor, GenericForeignKey):
# 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/5.2/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, api)
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())
):
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,
fields=new_attrs,
required_keys=set(new_attrs.keys()),
readonly_keys=set(),
)
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 _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("__")
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 not (
isinstance(ctx.type, Instance)
and (django_model := helpers.get_model_info_from_qs_ctx(ctx, django_context)) is not None
and ctx.arg_types
and ctx.arg_types[0]
):
return ctx.default_return_type
for lookup_type in ctx.arg_types[0]:
lookup_value = helpers.get_literal_str_type(get_proper_type(lookup_type))
if lookup_value is not None:
_validate_select_related_lookup(ctx, django_context, django_model.cls, lookup_value)
return ctx.default_return_type
def _validate_bulk_update_field(
ctx: MethodContext, model_cls: type[Model], field_name: str, method: Literal["bulk_update", "abulk_update"]
) -> bool:
opts = model_cls._meta
try:
field = opts.get_field(field_name)
except FieldDoesNotExist as e:
ctx.api.fail(str(e), ctx.context)
return False
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
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:
ctx.api.fail(f'"{method}()" cannot be used with primary key fields. Got "{field_name}"', ctx.context)
return False
return True
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 not (
isinstance(ctx.type, Instance)
and (django_model := helpers.get_model_info_from_qs_ctx(ctx, django_context)) is not None
and len(ctx.args) >= 2
and ctx.args[1]
and isinstance((fields_args := ctx.args[1][0]), (ListExpr, TupleExpr, SetExpr))
):
return ctx.default_return_type
if len(fields_args.items) == 0:
ctx.api.fail(f'Field names must be given to "{method}()"', ctx.context)
return ctx.default_return_type
for field_arg in fields_args.items:
field_name = helpers.resolve_string_attribute_value(field_arg, django_context)
if field_name is not None:
_validate_bulk_update_field(ctx, django_model.cls, field_name, method)
return ctx.default_return_type
django-stubs-5.2.9/mypy_django_plugin/transformers/request.py 0000664 0000000 0000000 00000000623 15134010516 0024611 0 ustar 00root root 0000000 0000000 from mypy.plugin import MethodContext
from mypy.types import Type as MypyType
from mypy.types import UninhabitedType, get_proper_type
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
django-stubs-5.2.9/mypy_django_plugin/transformers/settings.py 0000664 0000000 0000000 00000003570 15134010516 0024765 0 ustar 00root root 0000000 0000000 from mypy.nodes import MemberExpr
from mypy.plugin import AttributeContext
from mypy.types import AnyType, TypeOfAny
from mypy.types import Type as MypyType
from mypy_django_plugin.config import DjangoPluginConfig
from mypy_django_plugin.django.context import DjangoContext
from mypy_django_plugin.lib import helpers
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
django-stubs-5.2.9/pyproject.toml 0000664 0000000 0000000 00000010537 15134010516 0017045 0 ustar 00root root 0000000 0000000 [project]
name = "django-stubs"
version = "5.2.9"
description = "Mypy stubs for Django"
readme = "README.md"
license = "MIT"
license-files = ["LICENSE.md"]
requires-python = ">=3.10"
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.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Typing :: Typed",
"Framework :: Django",
"Framework :: Django :: 5.0",
"Framework :: Django :: 5.1",
"Framework :: Django :: 5.2",
]
dependencies = [
"django",
"django-stubs-ext>=5.2.9",
"tomli; python_version < '3.11'",
# Types:
"types-pyyaml",
"typing-extensions>=4.11.0",
]
[project.optional-dependencies]
compatible-mypy = ["mypy>=1.13,<1.20"]
oracle = ["oracledb"]
redis = ["redis", "types-redis"]
[dependency-groups]
tests = [
# Dev tools:
"pytest==9.0.2",
"pytest-mypy-plugins==3.2.0",
"pytest-shard==0.1.2",
"pytest-xdist==3.8.0",
# Django deps:
"django==5.2.10",
"mysqlclient==2.2.7",
"psycopg2-binary==2.9.11",
"jinja2==3.1.6",
"pyyaml==6.0.3",
# typing:
"django-stubs[compatible-mypy,oracle,redis]",
]
pyright = [
"pyright==1.1.408",
]
pyrefly = [
"pyrefly==0.48.0",
]
dev = [
{include-group = "tests"},
{include-group = "pyright"},
{include-group = "pyrefly"},
]
[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.9.9,<0.10.0"]
build-backend = "uv_build"
[tool.uv.build-backend]
module-name = ["django-stubs", "mypy_django_plugin"]
module-root = ""
[tool.codespell]
ignore-words-list = "aadd,acount,nam,asend"
[tool.ruff]
# Adds to default excludes: https://ruff.rs/docs/settings/#exclude
line-length = 120
target-version = "py310"
[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"]
[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.assert_type".msg = "Only available in Python 3.11 and above. Use `typing_extensions.assert_type` instead."
"typing.Self".msg = "Only available in Python 3.11 and above. Use `typing_extensions.Self` instead."
[tool.ruff.lint.isort]
known-first-party = ["django_stubs_ext", "mypy_django_plugin"]
split-on-trailing-comma = false
django-stubs-5.2.9/pyrefly.toml 0000664 0000000 0000000 00000000133 15134010516 0016507 0 ustar 00root root 0000000 0000000 # Respect only `# pyrefly: ignore` (ignore `# type: ignore`)
enabled-ignores = ["pyrefly"]
django-stubs-5.2.9/pyrightconfig.json 0000664 0000000 0000000 00000001216 15134010516 0017672 0 ustar 00root root 0000000 0000000 {
"$schema": "https://raw.githubusercontent.com/microsoft/pyright/main/packages/vscode-pyright/schemas/pyrightconfig.schema.json",
"include": [
"django-stubs",
"ext/django_stubs_ext",
"mypy_django_plugin",
"scripts",
],
"exclude": [
".github",
".mypy_cache",
"build",
// test cases use a custom config file
"tests/",
],
"typeCheckingMode": "strict",
"reportMissingTypeArgument": "warning",
// Stubs are allowed to use private variables
"reportPrivateUsage": "none",
"stubPath": ".",
"pythonVersion": "3.8",
"pythonPlatform": "All",
}
django-stubs-5.2.9/pyrightconfig.testcases.json 0000664 0000000 0000000 00000002075 15134010516 0021673 0 ustar 00root root 0000000 0000000 {
"$schema": "https://raw.githubusercontent.com/microsoft/pyright/main/packages/vscode-pyright/schemas/pyrightconfig.schema.json",
"include": [
"tests/assert_type/"
],
"typeCheckingMode": "strict",
// Extra strict settings
"reportShadowedImports": "error", // Don't accidentally name a file something that shadows stdlib
"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",
}
django-stubs-5.2.9/pytest.ini 0000664 0000000 0000000 00000000361 15134010516 0016154 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
django-stubs-5.2.9/scripts/ 0000775 0000000 0000000 00000000000 15134010516 0015612 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/scripts/__init__.py 0000664 0000000 0000000 00000000000 15134010516 0017711 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/scripts/django_tests_settings.py 0000664 0000000 0000000 00000000556 15134010516 0022576 0 ustar 00root root 0000000 0000000 # It is used in `mypy.ini` only.
# The following installed apps are required for stubtest to run correctly.
INSTALLED_APPS = [
"django.contrib.auth",
"django.contrib.admin",
"django.contrib.contenttypes",
"django.contrib.flatpages",
"django.contrib.redirects",
"django.contrib.sessions",
"django.contrib.sites",
]
STATIC_URL = "static/"
django-stubs-5.2.9/scripts/stubtest.sh 0000775 0000000 0000000 00000000537 15134010516 0020033 0 ustar 00root root 0000000 0000000 #!/bin/sh
# Run this script with `./scripts/stubtest.sh`
set -e
export MYPYPATH='.'
# 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 \
--allowlist scripts/stubtest/allowlist_todo_django52.txt
django-stubs-5.2.9/scripts/stubtest/ 0000775 0000000 0000000 00000000000 15134010516 0017467 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/scripts/stubtest/allowlist.txt 0000664 0000000 0000000 00000032056 15134010516 0022250 0 ustar 00root root 0000000 0000000 # This is a true allow list with things that we really don't care about.
# `allowlist_todo.txt` and `allowlist_todo_django50`
# are 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.*
# default_storage is actually an instance of DefaultStorage, but it proxies through to a Storage
django.core.files.storage.default_storage
# '_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
# 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
# ImmutableList always raise when calling these,
# later they can be added with `-> NoReturn` overrides.
django.utils.datastructures.ImmutableList.__delitem__
django.utils.datastructures.ImmutableList.__delslice__
django.utils.datastructures.ImmutableList.__iadd__
django.utils.datastructures.ImmutableList.__imul__
django.utils.datastructures.ImmutableList.__setitem__
django.utils.datastructures.ImmutableList.__setslice__
django.utils.datastructures.ImmutableList.append
django.utils.datastructures.ImmutableList.extend
django.utils.datastructures.ImmutableList.insert
django.utils.datastructures.ImmutableList.pop
django.utils.datastructures.ImmutableList.remove
django.utils.datastructures.ImmutableList.sort
django.utils.datastructures.ImmutableList.reverse
# 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__
# `classonlymethod` is an alias for `@classmethod` which is disjoint:
django.utils.decorators.classonlymethod
# Lazy regex
django.contrib.admin.utils.UNQUOTE_RE
django.contrib.gis.geometry.hex_regex
django.contrib.gis.geometry.json_regex
django.contrib.gis.geometry.wkt_regex
django.contrib.gis.geos.hex_regex
django.contrib.gis.geos.wkt_regex
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.http.request.host_validation_re
django.middleware.csrf.invalid_token_chars_re
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.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.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
# Attributes defaulting to None messing with mypy
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
# We re-export `functools.cached_property` which has different semantics
django.utils.functional.cached_property.__class_getitem__
django.utils.functional.cached_property.__set__
django.utils.functional.cached_property.name
# Ignore missing inner `Meta` class, see PR #2000 for the related discussion
django.contrib.auth.base_user.AbstractBaseUser.Meta
django.contrib.auth.forms.BaseUserCreationForm.Meta
django.contrib.auth.forms.UserChangeForm.Meta
django.contrib.auth.models.AbstractBaseUser.Meta
django.contrib.auth.models.AbstractUser.Meta
django.contrib.auth.models.PermissionsMixin.Meta
django.contrib.flatpages.forms.FlatpageForm.Meta
django.contrib.sessions.base_session.AbstractBaseSession.Meta
# 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.ManyToManyField.m2m_db_table
django.db.models.fields.related.ManyToManyField.m2m_db_table
django.contrib.gis.db.models.ManyToManyField.m2m_db_table
# Dynamically added in ManyToManyField.contribute_to_related_class()
django.db.models.ManyToManyField.m2m_column_name
django.db.models.ManyToManyField.m2m_field_name
django.db.models.ManyToManyField.m2m_reverse_field_name
django.db.models.ManyToManyField.m2m_reverse_name
django.db.models.ManyToManyField.m2m_reverse_target_field_name
django.db.models.ManyToManyField.m2m_target_field_name
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
django.contrib.gis.db.models.ManyToManyField.m2m_column_name
django.contrib.gis.db.models.ManyToManyField.m2m_field_name
django.contrib.gis.db.models.ManyToManyField.m2m_reverse_field_name
django.contrib.gis.db.models.ManyToManyField.m2m_reverse_name
django.contrib.gis.db.models.ManyToManyField.m2m_reverse_target_field_name
django.contrib.gis.db.models.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
# Using the definitions from `dict` (from typeshed)
django.contrib.sessions.backends.base.SessionBase.get
django.contrib.sessions.backends.base.SessionBase.setdefault
# Limited stubtest support for enums (https://github.com/python/mypy/issues/16806)
django.db.migrations.operations.base.OperationCategory.__new__
# Ignore: ...Model.[a]save is inconsistent, stub does not have *args argument "args"
# Positional arguments were deprecated in Django 5.1, we have adopted keyword-only arguments early.
django.contrib.auth.base_user.AbstractBaseUser.save
django.contrib.auth.models.AbstractBaseUser.save
django.contrib.gis.db.models.Model.asave
django.contrib.gis.db.models.Model.save
django.db.models.Model.asave
django.db.models.Model.save
django.db.models.base.Model.asave
django.db.models.base.Model.save
# Ignore: GeneratedField.__init__ is inconsistent, runtime argument "db_persist" has a default value but stub argument does not
# The default value None never worked and has been dropped for Django 6.0:
# https://code.djangoproject.com/ticket/36262
django.contrib.gis.db.models.GeneratedField.__init__
django.db.models.GeneratedField.__init__
django.db.models.fields.generated.GeneratedField.__init__
# These are dynamically added when using `save(commit=False)`
# See https://docs.djangoproject.com/en/5.2/topics/forms/modelforms/#the-save-method
django.forms.BaseModelForm.save_m2m
django.forms.BaseModelFormSet.save_m2m
django.forms.models.BaseModelForm.save_m2m
django.forms.models.BaseModelFormSet.save_m2m
django.contrib.gis.forms.BaseModelForm.save_m2m
django.contrib.gis.forms.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.QueryDict.pop
django.http.request.QueryDict.pop
# Django incorrectly uses a signature of `(cls, **kwargs)` when it should be `(cls, *args, **kwargs)`.
django.test.selenium.SeleniumTestCase.__init_subclass__
# Django incorrectly uses a signature of `(self, *args, **kwargs)` when it should be `(self)`.
django.forms.renderers.Jinja2DivFormRenderer.__init__
# mypy does not understand __getitem__ unpacking python/mypy#2220
django.urls.ResolverMatch.__iter__
django.urls.resolvers.ResolverMatch.__iter__
django-stubs-5.2.9/scripts/stubtest/allowlist_todo.txt 0000664 0000000 0000000 00000143164 15134010516 0023300 0 ustar 00root root 0000000 0000000 # Autogenerated by `stubtest`
# Unsorted: there are real problems and things we can really ignore.
django.__main__
django.conf.global_settings.gettext_noop
django.contrib.admin.FieldListFilter.title
django.contrib.admin.filters.FieldListFilter.title
django.contrib.admin.helpers.AdminForm.fields
django.contrib.admin.helpers.AdminForm.is_bound
django.contrib.admin.helpers.AdminReadonlyField.get_admin_url
django.contrib.admin.helpers.InlineAdminFormSet.is_bound
django.contrib.admin.helpers.InlineAdminFormSet.total_form_count
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.admin.options.BaseModelAdmin.media
django.contrib.admin.options.InlineModelAdmin.model
django.contrib.admin.options.InlineModelAdmin.template
django.contrib.admin.site
django.contrib.admin.sites.site
django.contrib.admin.tests.AdminSeleniumTestCase
django.contrib.admin.tests.AdminSeleniumTestCase.assertCountSeleniumElements
django.contrib.admin.tests.CSPMiddleware.process_response
django.contrib.admin.utils.QUOTE_MAP
django.contrib.admin.utils.UNQUOTE_MAP
django.contrib.admin.utils.prepare_lookup_value
django.contrib.admin.views.autocomplete.AutocompleteJsonView.admin_site
django.contrib.admin.views.autocomplete.AutocompleteJsonView.process_request
django.contrib.admin.views.autocomplete.AutocompleteJsonView.serialize_result
django.contrib.admin.widgets.AutocompleteMixin.media
django.contrib.admin.widgets.FilteredSelectMultiple.Media
django.contrib.admin.widgets.BaseAdminTimeWidget.Media
django.contrib.admin.widgets.BaseAdminDateWidget.Media
django.contrib.admindocs.utils.non_capturing_group_matcher
django.contrib.admindocs.utils.remove_non_capturing_groups
django.contrib.admindocs.utils.replace_metacharacters
django.contrib.auth.admin.GroupAdmin.formfield_for_manytomany
django.contrib.auth.admin.UserAdmin.fieldsets
django.contrib.auth.admin.UserAdmin.get_form
django.contrib.auth.base_user.AbstractBaseUser.last_login
django.contrib.auth.base_user.AbstractBaseUser.password
django.contrib.auth.decorators.login_required
django.contrib.auth.hashers.Argon2PasswordHasher.params
django.contrib.auth.hashers.ScryptPasswordHasher
django.contrib.auth.hashers.must_update_salt
django.contrib.auth.hashers.reset_hashers
django.contrib.auth.models.AbstractBaseUser.last_login
django.contrib.auth.models.AbstractBaseUser.password
django.contrib.auth.models.AbstractUser.date_joined
django.contrib.auth.models.AbstractUser.email
django.contrib.auth.models.AbstractUser.email_user
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.AnonymousUser.__int__
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.auth.password_validation.CommonPasswordValidator.DEFAULT_PASSWORD_LIST_PATH
django.contrib.auth.password_validation.CommonPasswordValidator.__init__
django.contrib.auth.password_validation.exceeds_maximum_length_ratio
django.contrib.auth.tokens.PasswordResetTokenGenerator._make_token_with_timestamp
django.contrib.auth.tokens.PasswordResetTokenGenerator.algorithm
django.contrib.auth.views.LoginView.form_class
django.contrib.auth.views.PasswordChangeView.form_class
django.contrib.auth.views.PasswordResetConfirmView.form_class
django.contrib.auth.views.PasswordResetView.form_class
django.contrib.contenttypes.admin.GenericInlineModelAdmin.ct_field
django.contrib.contenttypes.admin.GenericInlineModelAdmin.ct_fk_field
django.contrib.contenttypes.admin.GenericInlineModelAdmin.template
django.contrib.contenttypes.fields.GenericRelation.get_extra_restriction
django.contrib.contenttypes.forms.generic_inlineformset_factory
django.contrib.contenttypes.management.inject_rename_contenttypes_operations
django.contrib.contenttypes.models.ContentType.app_label
django.contrib.contenttypes.models.ContentType.app_labeled_name
django.contrib.contenttypes.models.ContentType.id
django.contrib.contenttypes.models.ContentType.model
django.contrib.contenttypes.models.ContentTypeManager.__init__
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.gis.admin.GISModelAdmin.gis_widget
django.contrib.gis.admin.options.GISModelAdmin.gis_widget
django.contrib.gis.admin.options.GeoModelAdminMixin
django.contrib.gis.admin.site
django.contrib.gis.db.backends.oracle.features.DatabaseFeatures.django_test_skips
django.contrib.gis.db.backends.postgis.operations.PostGISOperations.convert_extent
django.contrib.gis.db.backends.postgis.operations.PostGISOperations.convert_extent3d
django.contrib.gis.db.backends.postgis.schema.PostGISSchemaEditor.rast_index_template
django.contrib.gis.db.backends.spatialite.base.DatabaseWrapper.ops
django.contrib.gis.db.backends.spatialite.features.DatabaseFeatures.django_test_skips
django.contrib.gis.db.backends.spatialite.operations.SpatiaLiteOperations.convert_extent
django.contrib.gis.db.backends.spatialite.operations.SpatiaLiteOperations.from_text
django.contrib.gis.db.backends.spatialite.operations.SpatiaLiteOperations.geom_lib_version
django.contrib.gis.db.backends.spatialite.operations.SpatiaLiteOperations.rttopo_version
django.contrib.gis.db.models.Aggregate.__init__
django.contrib.gis.db.models.Aggregate.as_sql
django.contrib.gis.db.models.Aggregate.default_alias
django.contrib.gis.db.models.Aggregate.name
django.contrib.gis.db.models.AutoField.rel_db_type
django.contrib.gis.db.models.BaseConstraint.contains_expressions
django.contrib.gis.db.models.BaseConstraint.validate
django.contrib.gis.db.models.BigAutoField.rel_db_type
django.contrib.gis.db.models.BigIntegerField.formfield
django.contrib.gis.db.models.BinaryField.get_placeholder
django.contrib.gis.db.models.BooleanField.formfield
django.contrib.gis.db.models.Case.as_sql
django.contrib.gis.db.models.Case.allowed_default
django.contrib.gis.db.models.CharField.cast_db_type
django.contrib.gis.db.models.CharField.description
django.contrib.gis.db.models.CharField.formfield
django.contrib.gis.db.models.CheckConstraint.validate
django.contrib.gis.db.models.Count.__init__
django.contrib.gis.db.models.DateField.formfield
django.contrib.gis.db.models.DateTimeField.formfield
django.contrib.gis.db.models.DecimalField.context
django.contrib.gis.db.models.DecimalField.formfield
django.contrib.gis.db.models.DurationField.formfield
django.contrib.gis.db.models.DurationField.get_db_converters
django.contrib.gis.db.models.EmailField.formfield
django.contrib.gis.db.models.Exists.empty_result_set_value
django.contrib.gis.db.models.ExpressionWrapper.allowed_default
django.contrib.gis.db.models.Extent.is_extent
django.contrib.gis.db.models.Extent3D.is_extent
django.contrib.gis.db.models.Field.__copy__
django.contrib.gis.db.models.Field.__deepcopy__
django.contrib.gis.db.models.Field.__ge__
django.contrib.gis.db.models.Field.__get__
django.contrib.gis.db.models.Field.__gt__
django.contrib.gis.db.models.Field.__le__
django.contrib.gis.db.models.Field.__lt__
django.contrib.gis.db.models.Field.__set__
django.contrib.gis.db.models.Field.cast_db_type
django.contrib.gis.db.models.Field.clone
django.contrib.gis.db.models.Field.db_returning
django.contrib.gis.db.models.Field.db_tablespace
django.contrib.gis.db.models.Field.db_type_suffix
django.contrib.gis.db.models.Field.description
django.contrib.gis.db.models.Field.descriptor_class
django.contrib.gis.db.models.Field.error_messages
django.contrib.gis.db.models.Field.get_db_converters
django.contrib.gis.db.models.Field.get_filter_kwargs_for_object
django.contrib.gis.db.models.Field.get_pk_value_on_save
django.contrib.gis.db.models.Field.rel_db_type
django.contrib.gis.db.models.Field.unique
django.contrib.gis.db.models.FileField.__get__
django.contrib.gis.db.models.FileField.attr_class
django.contrib.gis.db.models.FileField.descriptor_class
django.contrib.gis.db.models.FileField.formfield
django.contrib.gis.db.models.FilePathField.formfield
django.contrib.gis.db.models.FloatField.formfield
django.contrib.gis.db.models.ForeignKey.__class_getitem__
django.contrib.gis.db.models.ForeignKey.contribute_to_related_class
django.contrib.gis.db.models.ForeignKey.convert_empty_strings
django.contrib.gis.db.models.ForeignKey.descriptor_class
django.contrib.gis.db.models.ForeignKey.formfield
django.contrib.gis.db.models.ForeignKey.get_db_converters
django.contrib.gis.db.models.ForeignObject.__copy__
django.contrib.gis.db.models.ForeignObject.__get__
django.contrib.gis.db.models.ForeignObject.contribute_to_related_class
django.contrib.gis.db.models.ForeignObject.forward_related_accessor_class
django.contrib.gis.db.models.ForeignObject.get_class_lookups
django.contrib.gis.db.models.ForeignObject.get_extra_descriptor_filter
django.contrib.gis.db.models.ForeignObject.get_extra_restriction
django.contrib.gis.db.models.ForeignObject.get_foreign_related_value
django.contrib.gis.db.models.ForeignObject.get_instance_value_for_fields
django.contrib.gis.db.models.ForeignObject.get_joining_columns
django.contrib.gis.db.models.ForeignObject.get_local_related_value
django.contrib.gis.db.models.ForeignObject.get_path_info
django.contrib.gis.db.models.ForeignObject.get_reverse_joining_columns
django.contrib.gis.db.models.ForeignObject.get_reverse_path_info
django.contrib.gis.db.models.ForeignObject.path_infos
django.contrib.gis.db.models.ForeignObject.related_accessor_class
django.contrib.gis.db.models.ForeignObject.requires_unique_target
django.contrib.gis.db.models.ForeignObject.reverse_path_infos
django.contrib.gis.db.models.ForeignObjectRel.empty_strings_allowed
django.contrib.gis.db.models.ForeignObjectRel.get_extra_restriction
django.contrib.gis.db.models.ForeignObjectRel.identity
django.contrib.gis.db.models.ForeignObjectRel.path_infos
django.contrib.gis.db.models.Func.allowed_default
django.contrib.gis.db.models.GenericIPAddressField.formfield
django.contrib.gis.db.models.ImageField.__get__
django.contrib.gis.db.models.ImageField.attr_class
django.contrib.gis.db.models.ImageField.descriptor_class
django.contrib.gis.db.models.ImageField.formfield
django.contrib.gis.db.models.IntegerField.formfield
django.contrib.gis.db.models.JSONField.formfield
django.contrib.gis.db.models.JSONField.get_transform
django.contrib.gis.db.models.Lookup.get_prep_lhs
django.contrib.gis.db.models.Lookup.allowed_default
django.contrib.gis.db.models.Lookup.lookup_name
django.contrib.gis.db.models.ManyToManyField.__get__
django.contrib.gis.db.models.ManyToManyField.formfield
django.contrib.gis.db.models.ManyToManyField.path_infos
django.contrib.gis.db.models.ManyToManyField.reverse_path_infos
django.contrib.gis.db.models.ManyToManyRel.identity
django.contrib.gis.db.models.ManyToOneRel.identity
django.contrib.gis.db.models.Model.add_to_class
django.contrib.gis.db.models.OneToOneField.__get__
django.contrib.gis.db.models.OneToOneField.formfield
django.contrib.gis.db.models.OneToOneField.forward_related_accessor_class
django.contrib.gis.db.models.OneToOneField.related_accessor_class
django.contrib.gis.db.models.OrderBy.as_oracle
django.contrib.gis.db.models.OrderBy.as_sql
django.contrib.gis.db.models.PositiveBigIntegerField.formfield
django.contrib.gis.db.models.PositiveBigIntegerField.integer_field_class
django.contrib.gis.db.models.PositiveIntegerField.formfield
django.contrib.gis.db.models.PositiveIntegerField.integer_field_class
django.contrib.gis.db.models.PositiveSmallIntegerField.formfield
django.contrib.gis.db.models.PositiveSmallIntegerField.integer_field_class
django.contrib.gis.db.models.QuerySet.__deepcopy__
django.contrib.gis.db.models.QuerySet.__xor__
django.contrib.gis.db.models.SlugField.formfield
django.contrib.gis.db.models.SmallAutoField.rel_db_type
django.contrib.gis.db.models.StdDev.__init__
django.contrib.gis.db.models.Subquery.as_sql
django.contrib.gis.db.models.Subquery.empty_result_set_value
django.contrib.gis.db.models.Subquery.external_aliases
django.contrib.gis.db.models.Subquery.get_external_cols
django.contrib.gis.db.models.TextField.formfield
django.contrib.gis.db.models.TimeField.formfield
django.contrib.gis.db.models.URLField.formfield
django.contrib.gis.db.models.UUIDField.formfield
django.contrib.gis.db.models.UniqueConstraint.contains_expressions
django.contrib.gis.db.models.UniqueConstraint.validate
django.contrib.gis.db.models.Value.empty_result_set_value
django.contrib.gis.db.models.Value.for_save
django.contrib.gis.db.models.Variance.__init__
django.contrib.gis.db.models.When.as_sql
django.contrib.gis.db.models.When.allowed_default
django.contrib.gis.db.models.Window.as_sql
django.contrib.gis.db.models.Window.as_sqlite
django.contrib.gis.db.models.aggregates.Extent.is_extent
django.contrib.gis.db.models.aggregates.Extent3D.is_extent
django.contrib.gis.db.models.aggregates.GeoAggregate.as_sql
django.contrib.gis.db.models.functions.Area.as_sql
django.contrib.gis.db.models.functions.GeoFuncMixin.__init__
django.contrib.gis.db.models.functions.GeoFuncMixin.as_sql
django.contrib.gis.db.models.functions.GeoFuncMixin.name
django.contrib.gis.db.models.functions.GeoFuncMixin.resolve_expression
django.contrib.gis.db.models.functions.Length.as_sql
django.contrib.gis.db.models.lookups.RasterBandTransform.as_sql
django.contrib.gis.forms.ALL_FIELDS
django.contrib.gis.forms.BaseForm.__init__
django.contrib.gis.forms.BaseFormSet.__init__
django.contrib.gis.forms.BaseModelFormSet.model
django.contrib.gis.forms.ChoiceField.__deepcopy__
django.contrib.gis.forms.Field.__deepcopy__
django.contrib.gis.forms.FileField.bound_data
django.contrib.gis.forms.Media.__html__
django.contrib.gis.forms.ModelChoiceField.__deepcopy__
django.contrib.gis.forms.MultiValueField.__deepcopy__
django.contrib.gis.forms.MultiWidget.use_fieldset
django.contrib.gis.forms.RadioSelect.id_for_label
django.contrib.gis.forms.RadioSelect.use_fieldset
django.contrib.gis.forms.SelectDateWidget.use_fieldset
django.contrib.gis.forms.Widget.use_fieldset
django.contrib.gis.forms.formset_factory
django.contrib.gis.forms.inlineformset_factory
django.contrib.gis.forms.modelformset_factory
django.contrib.gis.gdal.OGRGeometry.geojson
django.contrib.gis.gdal.SpatialReference.pretty_wkt
django.contrib.gis.gdal.SpatialReference.xml
django.contrib.gis.gdal.envelope.OGREnvelope.MaxX
django.contrib.gis.gdal.envelope.OGREnvelope.MaxY
django.contrib.gis.gdal.envelope.OGREnvelope.MinX
django.contrib.gis.gdal.envelope.OGREnvelope.MinY
django.contrib.gis.gdal.geometries.LineString.coords
django.contrib.gis.gdal.geometries.OGRGeometry.geojson
django.contrib.gis.gdal.geometries.Polygon.exterior_ring
django.contrib.gis.gdal.srs.SpatialReference.pretty_wkt
django.contrib.gis.gdal.srs.SpatialReference.xml
django.contrib.gis.geos.Point.tuple
django.contrib.gis.geos.geometry.GEOSGeometryBase.geojson
django.contrib.gis.geos.geometry.GEOSGeometryBase.make_valid
django.contrib.gis.geos.geometry.GEOSGeometryBase.normalize
django.contrib.gis.geos.libgeos.error_h
django.contrib.gis.geos.libgeos.notice_h
django.contrib.gis.geos.mutable_list.ListMixin.__ge__
django.contrib.gis.geos.mutable_list.ListMixin.__gt__
django.contrib.gis.geos.mutable_list.ListMixin.__le__
django.contrib.gis.geos.point.Point.tuple
django.contrib.gis.geos.prototypes.geom.geos_makevalid
django.contrib.gis.measure.MeasureBase.__ge__
django.contrib.gis.measure.MeasureBase.__gt__
django.contrib.gis.measure.MeasureBase.__le__
django.contrib.humanize.templatetags.humanize.intword_converters
django.contrib.messages.storage.cookie.CookieStorage.key_salt
django.contrib.messages.storage.cookie.MessageDecoder.decode
django.contrib.messages.storage.cookie.MessageEncoder.default
django.contrib.postgres.fields.ArrayField.formfield
django.contrib.postgres.fields.HStoreField.formfield
django.contrib.postgres.fields.RangeField.formfield
django.contrib.postgres.fields.array.ArrayField.formfield
django.contrib.postgres.fields.hstore.HStoreField.formfield
django.contrib.postgres.fields.ranges.RangeField.formfield
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.backends.signed_cookies.SessionStore.exists
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.sitemaps.views.SitemapIndexItem
django.contrib.sites.models.Site.domain
django.contrib.sites.models.Site.flatpage_set
django.contrib.sites.models.Site.id
django.contrib.sites.models.Site.name
django.contrib.staticfiles.finders.BaseStorageFinder.storage
django.contrib.staticfiles.finders.DefaultStorageFinder.storage
django.contrib.staticfiles.storage.staticfiles_storage
django.core.cache.cache
django.core.files.uploadedfile.UploadedFile.size
django.core.files.utils.FileProxyMixin.encoding
django.core.files.utils.FileProxyMixin.fileno
django.core.files.utils.FileProxyMixin.flush
django.core.files.utils.FileProxyMixin.isatty
django.core.files.utils.FileProxyMixin.newlines
django.core.files.utils.FileProxyMixin.read
django.core.files.utils.FileProxyMixin.readinto
django.core.files.utils.FileProxyMixin.readline
django.core.files.utils.FileProxyMixin.readlines
django.core.files.utils.FileProxyMixin.seek
django.core.files.utils.FileProxyMixin.tell
django.core.files.utils.FileProxyMixin.truncate
django.core.files.utils.FileProxyMixin.write
django.core.files.utils.FileProxyMixin.writelines
django.core.mail.backends.filebased.EmailBackend.__init__
django.core.mail.backends.locmem.EmailBackend.send_messages
django.core.mail.backends.smtp.EmailBackend.__init__
django.core.mail.backends.smtp.EmailBackend.connection_class
django.core.mail.backends.smtp.EmailBackend.ssl_context
django.core.management.commands.makemessages.TranslatableFile.__ge__
django.core.management.commands.makemessages.TranslatableFile.__gt__
django.core.management.commands.makemessages.TranslatableFile.__le__
django.core.management.commands.makemessages.TranslatableFile.__lt__
django.core.management.commands.makemessages.TranslatableFile.path
django.core.servers.basehttp.ServerHandler.__init__
django.core.servers.basehttp.ThreadedWSGIServer.__init__
django.db.backends.ddl_references.Expressions
django.db.backends.mysql.base.DatabaseWrapper.ops
django.db.backends.mysql.features.DatabaseFeatures.can_rename_index
django.db.backends.mysql.features.DatabaseFeatures.can_return_rows_from_bulk_insert
django.db.backends.mysql.features.DatabaseFeatures.django_test_skips
django.db.backends.mysql.features.DatabaseFeatures.minimum_database_version
django.db.backends.mysql.features.DatabaseFeatures.supports_select_difference
django.db.backends.mysql.features.DatabaseFeatures.supports_select_intersection
django.db.backends.mysql.features.DatabaseFeatures.supports_table_check_constraints
django.db.backends.mysql.features.DatabaseFeatures.test_collations
django.db.backends.mysql.introspection.DatabaseIntrospection.get_storage_engine
django.db.backends.mysql.introspection.InfoLine.__match_args__
django.db.backends.mysql.introspection.InfoLine.__new__
django.db.backends.mysql.introspection.InfoLine._fields
django.db.backends.mysql.introspection.InfoLine.comment
django.db.backends.mysql.introspection.TableInfo
django.db.backends.mysql.schema.DatabaseSchemaEditor.sql_alter_column_comment
django.db.backends.oracle.features.DatabaseFeatures.django_test_skips
django.db.backends.oracle.features.DatabaseFeatures.introspected_field_types
django.db.backends.oracle.features.DatabaseFeatures.supports_collation_on_charfield
django.db.backends.oracle.features.DatabaseFeatures.supports_frame_exclusion
django.db.backends.postgresql.base.DatabaseWrapper.Database
django.db.backends.postgresql.base.DatabaseWrapper.ops
django.db.backends.postgresql.base.DatabaseWrapper.tzinfo_factory
django.db.backends.postgresql.base.INETARRAY
django.db.backends.postgresql.base.INETARRAY_OID
django.db.backends.postgresql.features.DatabaseFeatures.django_test_expected_failures
django.db.backends.postgresql.features.DatabaseFeatures.introspected_field_types
django.db.backends.postgresql.features.DatabaseFeatures.prohibits_null_characters_in_text_exception
django.db.backends.postgresql.features.DatabaseFeatures.uses_server_side_binding
django.db.backends.postgresql.introspection.DatabaseIntrospection.index_default_access_method
django.db.backends.postgresql.introspection.FieldInfo
django.db.backends.postgresql.introspection.TableInfo
django.db.backends.postgresql.operations.get_json_dumps
django.db.backends.postgresql.schema.DatabaseSchemaEditor.sql_add_identity
django.db.backends.postgresql.schema.DatabaseSchemaEditor.sql_alter_sequence_type
django.db.backends.postgresql.schema.DatabaseSchemaEditor.sql_drop_indentity
django.db.backends.sqlite3.base.DatabaseWrapper.Database
django.db.backends.sqlite3.base.DatabaseWrapper.ops
django.db.backends.sqlite3.base.DatabaseWrapper.pattern_esc
django.db.backends.sqlite3.base.DatabaseWrapper.pattern_ops
django.db.backends.sqlite3.base.SQLiteCursorWrapper.convert_query
django.db.backends.sqlite3.base.SQLiteCursorWrapper.execute
django.db.backends.sqlite3.base.SQLiteCursorWrapper.executemany
django.db.backends.sqlite3.base.adapt_date
django.db.backends.sqlite3.base.adapt_datetime
django.db.backends.sqlite3.features.DatabaseFeatures.can_alter_table_drop_column
django.db.backends.sqlite3.features.DatabaseFeatures.can_introspect_json_field
django.db.backends.sqlite3.features.DatabaseFeatures.can_return_columns_from_insert
django.db.backends.sqlite3.features.DatabaseFeatures.can_return_rows_from_bulk_insert
django.db.backends.sqlite3.features.DatabaseFeatures.django_test_skips
django.db.backends.sqlite3.features.DatabaseFeatures.has_json_object_function
django.db.backends.sqlite3.features.DatabaseFeatures.introspected_field_types
django.db.backends.sqlite3.features.DatabaseFeatures.supports_json_field
django.db.backends.sqlite3.introspection.FieldInfo
django.db.backends.sqlite3.schema.DatabaseSchemaEditor.delete_model
django.db.backends.sqlite3.schema.DatabaseSchemaEditor.sql_create_fk
django.db.backends.utils.debug_transaction
django.db.backends.utils.names_digest
django.db.backends.utils.split_tzname_delta
django.db.connection
django.db.migrations.Migration.suggest_name
django.db.migrations.graph.Node.__ge__
django.db.migrations.graph.Node.__gt__
django.db.migrations.graph.Node.__le__
django.db.migrations.loader.MigrationLoader.collect_sql
django.db.migrations.migration.Migration.suggest_name
django.db.migrations.operations.utils
django.db.migrations.questioner.InteractiveMigrationQuestioner.__init__
django.db.migrations.questioner.InteractiveMigrationQuestioner.ask_unique_callable_default_addition
django.db.migrations.questioner.MigrationQuestioner.ask_unique_callable_default_addition
django.db.migrations.questioner.NonInteractiveMigrationQuestioner.__init__
django.db.migrations.questioner.NonInteractiveMigrationQuestioner.log_lack_of_migration
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.migrations.serializer.ChoicesSerializer
django.db.migrations.utils.FieldReference
django.db.migrations.utils.field_is_referenced
django.db.migrations.utils.field_references
django.db.migrations.utils.get_references
django.db.migrations.utils.resolve_relation
django.db.models.Aggregate.__init__
django.db.models.Aggregate.as_sql
django.db.models.Aggregate.default_alias
django.db.models.Aggregate.name
django.db.models.AutoField.rel_db_type
django.db.models.BaseConstraint.contains_expressions
django.db.models.BaseConstraint.validate
django.db.models.BigAutoField.rel_db_type
django.db.models.BigIntegerField.formfield
django.db.models.BinaryField.get_placeholder
django.db.models.BooleanField.formfield
django.db.models.Case.as_sql
django.db.models.Case.allowed_default
django.db.models.CharField.cast_db_type
django.db.models.CharField.description
django.db.models.CharField.formfield
django.db.models.CheckConstraint.validate
django.db.models.Count.__init__
django.db.models.DateField.formfield
django.db.models.DateTimeField.formfield
django.db.models.DecimalField.context
django.db.models.DecimalField.formfield
django.db.models.DurationField.formfield
django.db.models.DurationField.get_db_converters
django.db.models.EmailField.formfield
django.db.models.Exists.empty_result_set_value
django.db.models.ExpressionWrapper.allowed_default
django.db.models.Field.__copy__
django.db.models.Field.__deepcopy__
django.db.models.Field.__ge__
django.db.models.Field.__get__
django.db.models.Field.__gt__
django.db.models.Field.__le__
django.db.models.Field.__lt__
django.db.models.Field.__set__
django.db.models.Field.cast_db_type
django.db.models.Field.clone
django.db.models.Field.db_returning
django.db.models.Field.db_tablespace
django.db.models.Field.db_type_suffix
django.db.models.Field.description
django.db.models.Field.descriptor_class
django.db.models.Field.error_messages
django.db.models.Field.get_db_converters
django.db.models.Field.get_filter_kwargs_for_object
django.db.models.Field.get_pk_value_on_save
django.db.models.Field.rel_db_type
django.db.models.Field.unique
django.db.models.FileField.__get__
django.db.models.FileField.attr_class
django.db.models.FileField.descriptor_class
django.db.models.FileField.formfield
django.db.models.FilePathField.formfield
django.db.models.FloatField.formfield
django.db.models.ForeignKey.__class_getitem__
django.db.models.ForeignKey.contribute_to_related_class
django.db.models.ForeignKey.convert_empty_strings
django.db.models.ForeignKey.descriptor_class
django.db.models.ForeignKey.formfield
django.db.models.ForeignKey.get_db_converters
django.db.models.ForeignObject.__copy__
django.db.models.ForeignObject.__get__
django.db.models.ForeignObject.contribute_to_related_class
django.db.models.ForeignObject.forward_related_accessor_class
django.db.models.ForeignObject.get_class_lookups
django.db.models.ForeignObject.get_extra_descriptor_filter
django.db.models.ForeignObject.get_extra_restriction
django.db.models.ForeignObject.get_foreign_related_value
django.db.models.ForeignObject.get_instance_value_for_fields
django.db.models.ForeignObject.get_joining_columns
django.db.models.ForeignObject.get_local_related_value
django.db.models.ForeignObject.get_path_info
django.db.models.ForeignObject.get_reverse_joining_columns
django.db.models.ForeignObject.get_reverse_path_info
django.db.models.ForeignObject.path_infos
django.db.models.ForeignObject.related_accessor_class
django.db.models.ForeignObject.requires_unique_target
django.db.models.ForeignObject.reverse_path_infos
django.db.models.ForeignObjectRel.empty_strings_allowed
django.db.models.ForeignObjectRel.get_extra_restriction
django.db.models.ForeignObjectRel.identity
django.db.models.ForeignObjectRel.path_infos
django.db.models.Func.allowed_default
django.db.models.GenericIPAddressField.formfield
django.db.models.ImageField.__get__
django.db.models.ImageField.attr_class
django.db.models.ImageField.descriptor_class
django.db.models.ImageField.formfield
django.db.models.IntegerField.formfield
django.db.models.JSONField.formfield
django.db.models.JSONField.get_transform
django.db.models.Lookup.get_prep_lhs
django.db.models.Lookup.lookup_name
django.db.models.Lookup.allowed_default
django.db.models.ManyToManyField.__get__
django.db.models.ManyToManyField.formfield
django.db.models.ManyToManyField.path_infos
django.db.models.ManyToManyField.reverse_path_infos
django.db.models.ManyToManyRel.identity
django.db.models.ManyToOneRel.identity
django.db.models.Model.add_to_class
django.db.models.OneToOneField.__get__
django.db.models.OneToOneField.formfield
django.db.models.OneToOneField.forward_related_accessor_class
django.db.models.OneToOneField.related_accessor_class
django.db.models.OrderBy.as_oracle
django.db.models.OrderBy.as_sql
django.db.models.PositiveBigIntegerField.formfield
django.db.models.PositiveBigIntegerField.integer_field_class
django.db.models.PositiveIntegerField.formfield
django.db.models.PositiveIntegerField.integer_field_class
django.db.models.PositiveSmallIntegerField.formfield
django.db.models.PositiveSmallIntegerField.integer_field_class
django.db.models.QuerySet.__deepcopy__
django.db.models.QuerySet.__xor__
django.db.models.SlugField.formfield
django.db.models.SmallAutoField.rel_db_type
django.db.models.StdDev.__init__
django.db.models.Subquery.as_sql
django.db.models.Subquery.empty_result_set_value
django.db.models.Subquery.external_aliases
django.db.models.Subquery.get_external_cols
django.db.models.TextField.formfield
django.db.models.TimeField.formfield
django.db.models.URLField.formfield
django.db.models.UUIDField.formfield
django.db.models.UniqueConstraint.contains_expressions
django.db.models.UniqueConstraint.validate
django.db.models.Value.empty_result_set_value
django.db.models.Value.for_save
django.db.models.Variance.__init__
django.db.models.When.as_sql
django.db.models.When.allowed_default
django.db.models.Window.as_sql
django.db.models.Window.as_sqlite
django.db.models.aggregates.Aggregate.__init__
django.db.models.aggregates.Aggregate.as_sql
django.db.models.aggregates.Aggregate.default_alias
django.db.models.aggregates.Aggregate.name
django.db.models.aggregates.Count.__init__
django.db.models.aggregates.StdDev.__init__
django.db.models.aggregates.Variance.__init__
django.db.models.base.Model.add_to_class
django.db.models.base.ModelBase.__new__
django.db.models.base.ModelBase.add_to_class
django.db.models.base.ModelStateFieldsCacheDescriptor.__get__
django.db.models.base.make_foreign_order_accessors
django.db.models.base.method_get_order
django.db.models.base.method_set_order
django.db.models.base.subclass_exception
django.db.models.constraints.BaseConstraint.contains_expressions
django.db.models.constraints.BaseConstraint.validate
django.db.models.constraints.CheckConstraint.validate
django.db.models.constraints.UniqueConstraint.contains_expressions
django.db.models.constraints.UniqueConstraint.validate
django.db.models.expressions.BaseExpression.empty_result_set_value
django.db.models.expressions.BaseExpression.prefix_references
django.db.models.expressions.BaseExpression.replace_expressions
django.db.models.expressions.Case.as_sql
django.db.models.expressions.Case.allowed_default
django.db.models.expressions.CombinedExpression.allowed_default
django.db.models.expressions.ExpressionWrapper.allowed_default
django.db.models.expressions.Func.allowed_default
django.db.models.expressions.When.allowed_default
django.db.models.expressions.Col.relabeled_clone
django.db.models.expressions.Exists.empty_result_set_value
django.db.models.expressions.OrderBy.as_oracle
django.db.models.expressions.OrderBy.as_sql
django.db.models.expressions.Ref.relabeled_clone
django.db.models.expressions.ResolvedOuterRef.as_sql
django.db.models.expressions.ResolvedOuterRef.get_group_by_cols
django.db.models.expressions.ResolvedOuterRef.relabeled_clone
django.db.models.expressions.Subquery.as_sql
django.db.models.expressions.Subquery.empty_result_set_value
django.db.models.expressions.Subquery.external_aliases
django.db.models.expressions.Subquery.get_external_cols
django.db.models.expressions.Value.empty_result_set_value
django.db.models.expressions.Value.for_save
django.db.models.expressions.When.as_sql
django.db.models.expressions.Window.as_sql
django.db.models.expressions.Window.as_sqlite
django.db.models.expressions.connector
django.db.models.expressions.d
django.db.models.expressions.field_types
django.db.models.expressions.register_combinable_fields
django.db.models.fields.AutoField.rel_db_type
django.db.models.fields.AutoFieldMixin.__init__
django.db.models.fields.AutoFieldMixin.check
django.db.models.fields.AutoFieldMixin.formfield
django.db.models.fields.AutoFieldMixin.get_db_prep_value
django.db.models.fields.AutoFieldMixin.validate
django.db.models.fields.BigAutoField.rel_db_type
django.db.models.fields.BigIntegerField.formfield
django.db.models.fields.BinaryField.get_placeholder
django.db.models.fields.BooleanField.formfield
django.db.models.fields.CharField.cast_db_type
django.db.models.fields.CharField.description
django.db.models.fields.CharField.formfield
django.db.models.fields.DateField.formfield
django.db.models.fields.DateTimeCheckMixin.check
django.db.models.fields.DateTimeField.formfield
django.db.models.fields.DecimalField.context
django.db.models.fields.DecimalField.formfield
django.db.models.fields.DurationField.formfield
django.db.models.fields.DurationField.get_db_converters
django.db.models.fields.EmailField.formfield
django.db.models.fields.Field.__copy__
django.db.models.fields.Field.__deepcopy__
django.db.models.fields.Field.__ge__
django.db.models.fields.Field.__get__
django.db.models.fields.Field.__gt__
django.db.models.fields.Field.__le__
django.db.models.fields.Field.__lt__
django.db.models.fields.Field.__set__
django.db.models.fields.Field.cast_db_type
django.db.models.fields.Field.clone
django.db.models.fields.Field.db_returning
django.db.models.fields.Field.db_tablespace
django.db.models.fields.Field.db_type_suffix
django.db.models.fields.Field.description
django.db.models.fields.Field.descriptor_class
django.db.models.fields.Field.error_messages
django.db.models.fields.Field.get_db_converters
django.db.models.fields.Field.get_filter_kwargs_for_object
django.db.models.fields.Field.get_pk_value_on_save
django.db.models.fields.Field.rel_db_type
django.db.models.fields.Field.unique
django.db.models.fields.FilePathField.formfield
django.db.models.fields.FloatField.formfield
django.db.models.fields.GenericIPAddressField.formfield
django.db.models.fields.IntegerField.formfield
django.db.models.fields.PositiveBigIntegerField.formfield
django.db.models.fields.PositiveBigIntegerField.integer_field_class
django.db.models.fields.PositiveIntegerField.formfield
django.db.models.fields.PositiveIntegerField.integer_field_class
django.db.models.fields.PositiveSmallIntegerField.formfield
django.db.models.fields.PositiveSmallIntegerField.integer_field_class
django.db.models.fields.SlugField.formfield
django.db.models.fields.SmallAutoField.rel_db_type
django.db.models.fields.TextField.formfield
django.db.models.fields.TimeField.formfield
django.db.models.fields.URLField.formfield
django.db.models.fields.UUIDField.formfield
django.db.models.fields.files.FileField.__get__
django.db.models.fields.files.FileField.attr_class
django.db.models.fields.files.FileField.descriptor_class
django.db.models.fields.files.FileField.formfield
django.db.models.fields.files.ImageField.__get__
django.db.models.fields.files.ImageField.attr_class
django.db.models.fields.files.ImageField.descriptor_class
django.db.models.fields.files.ImageField.formfield
django.db.models.fields.json.CaseInsensitiveMixin.process_lhs
django.db.models.fields.json.CaseInsensitiveMixin.process_rhs
django.db.models.fields.json.HasKeyLookup.as_mysql
django.db.models.fields.json.HasKeyLookup.as_sql
django.db.models.fields.json.HasKeyLookup.as_sqlite
django.db.models.fields.json.JSONField.formfield
django.db.models.fields.json.JSONField.get_transform
django.db.models.fields.json.KeyTextTransform.as_mysql
django.db.models.fields.json.KeyTransform.as_mysql
django.db.models.fields.json.KeyTransform.as_oracle
django.db.models.fields.json.KeyTransform.as_postgresql
django.db.models.fields.json.KeyTransform.as_sqlite
django.db.models.fields.json.KeyTransformIsNull.as_sqlite
django.db.models.fields.json.KeyTransformNumericLookupMixin.process_rhs
django.db.models.fields.related.ForeignKey.__class_getitem__
django.db.models.fields.related.ForeignKey.contribute_to_related_class
django.db.models.fields.related.ForeignKey.convert_empty_strings
django.db.models.fields.related.ForeignKey.descriptor_class
django.db.models.fields.related.ForeignKey.formfield
django.db.models.fields.related.ForeignKey.get_db_converters
django.db.models.fields.related.ForeignObject.__copy__
django.db.models.fields.related.ForeignObject.__get__
django.db.models.fields.related.ForeignObject.contribute_to_related_class
django.db.models.fields.related.ForeignObject.forward_related_accessor_class
django.db.models.fields.related.ForeignObject.get_class_lookups
django.db.models.fields.related.ForeignObject.get_extra_descriptor_filter
django.db.models.fields.related.ForeignObject.get_extra_restriction
django.db.models.fields.related.ForeignObject.get_foreign_related_value
django.db.models.fields.related.ForeignObject.get_instance_value_for_fields
django.db.models.fields.related.ForeignObject.get_joining_columns
django.db.models.fields.related.ForeignObject.get_local_related_value
django.db.models.fields.related.ForeignObject.get_path_info
django.db.models.fields.related.ForeignObject.get_reverse_joining_columns
django.db.models.fields.related.ForeignObject.get_reverse_path_info
django.db.models.fields.related.ForeignObject.path_infos
django.db.models.fields.related.ForeignObject.related_accessor_class
django.db.models.fields.related.ForeignObject.requires_unique_target
django.db.models.fields.related.ForeignObject.reverse_path_infos
django.db.models.fields.related.ForeignObjectRel.empty_strings_allowed
django.db.models.fields.related.ForeignObjectRel.get_extra_restriction
django.db.models.fields.related.ForeignObjectRel.identity
django.db.models.fields.related.ForeignObjectRel.path_infos
django.db.models.fields.related.ManyToManyField.__get__
django.db.models.fields.related.ManyToManyField.formfield
django.db.models.fields.related.ManyToManyField.path_infos
django.db.models.fields.related.ManyToManyField.reverse_path_infos
django.db.models.fields.related.ManyToManyRel.identity
django.db.models.fields.related.ManyToOneRel.identity
django.db.models.fields.related.OneToOneField.__get__
django.db.models.fields.related.OneToOneField.formfield
django.db.models.fields.related.OneToOneField.forward_related_accessor_class
django.db.models.fields.related.OneToOneField.related_accessor_class
django.db.models.fields.related.RelatedField.formfield
django.db.models.fields.related.lazy_related_operation
django.db.models.fields.related_descriptors.ForeignKeyDeferredAttribute.__set__
django.db.models.fields.related_lookups.RelatedLookupMixin.as_sql
django.db.models.fields.reverse_related.ForeignObjectRel.empty_strings_allowed
django.db.models.fields.reverse_related.ForeignObjectRel.get_extra_restriction
django.db.models.fields.reverse_related.ForeignObjectRel.identity
django.db.models.fields.reverse_related.ForeignObjectRel.path_infos
django.db.models.fields.reverse_related.ManyToManyRel.identity
django.db.models.fields.reverse_related.ManyToOneRel.identity
django.db.models.functions.Cast.as_mysql
django.db.models.functions.Cast.as_oracle
django.db.models.functions.Cast.as_postgresql
django.db.models.functions.Cast.as_sql
django.db.models.functions.Ceil.as_oracle
django.db.models.functions.Coalesce.as_oracle
django.db.models.functions.Coalesce.empty_result_set_value
django.db.models.functions.Collate.as_sql
django.db.models.functions.Collate.collation_re
django.db.models.functions.ConcatPair.as_postgresql
django.db.models.functions.Cot.as_oracle
django.db.models.functions.Degrees.as_oracle
django.db.models.functions.Extract.as_sql
django.db.models.functions.Extract.lookup_name
django.db.models.functions.Now.as_mysql
django.db.models.functions.Now.as_postgresql
django.db.models.functions.NullIf.as_oracle
django.db.models.functions.Pi.as_oracle
django.db.models.functions.Radians.as_oracle
django.db.models.functions.Random.as_mysql
django.db.models.functions.Random.as_oracle
django.db.models.functions.comparison.Cast.as_mysql
django.db.models.functions.comparison.Cast.as_oracle
django.db.models.functions.comparison.Cast.as_postgresql
django.db.models.functions.comparison.Cast.as_sql
django.db.models.functions.comparison.Coalesce.as_oracle
django.db.models.functions.comparison.Coalesce.empty_result_set_value
django.db.models.functions.comparison.Collate.as_sql
django.db.models.functions.comparison.Collate.collation_re
django.db.models.functions.comparison.NullIf.as_oracle
django.db.models.functions.datetime.Extract.as_sql
django.db.models.functions.datetime.Extract.lookup_name
django.db.models.functions.datetime.Now.as_mysql
django.db.models.functions.datetime.Now.as_postgresql
django.db.models.functions.datetime.TruncBase.kind
django.db.models.functions.math.Ceil.as_oracle
django.db.models.functions.math.Cot.as_oracle
django.db.models.functions.math.Degrees.as_oracle
django.db.models.functions.math.Pi.as_oracle
django.db.models.functions.math.Radians.as_oracle
django.db.models.functions.math.Random.as_mysql
django.db.models.functions.math.Random.as_oracle
django.db.models.functions.mixins.FixDecimalInputMixin.as_postgresql
django.db.models.functions.mixins.FixDurationInputMixin.as_mysql
django.db.models.functions.mixins.FixDurationInputMixin.as_oracle
django.db.models.functions.text.ConcatPair.as_postgresql
django.db.models.indexes.IndexExpression.wrapper_classes
django.db.models.lookups.FieldGetDbPrepValueIterableMixin.batch_process_rhs
django.db.models.lookups.FieldGetDbPrepValueIterableMixin.process_rhs
django.db.models.lookups.IExact.process_rhs
django.db.models.lookups.Lookup.get_prep_lhs
django.db.models.lookups.Lookup.allowed_default
django.db.models.lookups.Lookup.lookup_name
django.db.models.lookups.PatternLookup.process_rhs
django.db.models.query.EmptyQuerySet.__init__
django.db.models.query.QuerySet.__deepcopy__
django.db.models.query.QuerySet.__xor__
django.db.models.query.RawQuerySet.__aiter__
django.db.models.query.RelatedPopulator
django.db.models.query.get_related_populators
django.db.models.query.normalize_prefetch_lookups
django.db.models.query.prefetch_one_level
django.db.models.query_utils.Q.identity
django.db.models.query_utils.RegisterLookupMixin._unregister_lookup
django.db.models.query_utils.RegisterLookupMixin.get_class_lookups
django.db.models.query_utils.RegisterLookupMixin.get_instance_lookups
django.db.models.query_utils.RegisterLookupMixin.get_lookups
django.db.models.query_utils.RegisterLookupMixin.register_class_lookup
django.db.models.query_utils.RegisterLookupMixin.register_instance_lookup
django.db.models.query_utils.RegisterLookupMixin.register_lookup
django.db.models.query_utils.class_or_instance_method
django.db.models.query_utils.logger
django.db.models.query_utils.select_related_descend
django.db.models.sql.AggregateQuery.__init__
django.db.models.sql.InsertQuery.__init__
django.db.models.sql.compiler.SQLCompiler.__init__
django.db.models.sql.compiler.SQLCompiler.get_default_columns
django.db.models.sql.compiler.SQLCompiler.get_qualify_sql
django.db.models.sql.compiler.SQLCompiler.get_related_selections
django.db.models.sql.datastructures.BaseTable.identity
django.db.models.sql.datastructures.Join.identity
django.db.models.sql.subqueries.AggregateQuery.__init__
django.db.models.sql.subqueries.InsertQuery.__init__
django.db.models.sql.where.ExtraWhere.contains_over_clause
django.db.models.sql.where.NothingNode.contains_over_clause
django.db.models.sql.where.WhereNode.get_db_converters
django.db.models.sql.where.WhereNode.get_group_by_cols
django.db.models.sql.where.WhereNode.get_lookup
django.db.models.sql.where.WhereNode.get_source_expressions
django.db.models.sql.where.WhereNode.leaves
django.db.models.sql.where.WhereNode.replace_expressions
django.db.models.sql.where.WhereNode.set_source_expressions
django.db.models.sql.where.WhereNode.split_having
django.db.models.sql.where.WhereNode.split_having_qualify
django.db.utils.DatabaseErrorWrapper.__call__
django.forms.ALL_FIELDS
django.forms.BaseForm.__init__
django.forms.BaseFormSet.__init__
django.forms.BaseModelFormSet.model
django.forms.ChoiceField.__deepcopy__
django.forms.Field.__deepcopy__
django.forms.FileField.bound_data
django.forms.Media.__html__
django.forms.ModelChoiceField.__deepcopy__
django.forms.MultiValueField.__deepcopy__
django.forms.MultiWidget.use_fieldset
django.forms.RadioSelect.id_for_label
django.forms.RadioSelect.use_fieldset
django.forms.SelectDateWidget.use_fieldset
django.forms.Widget.use_fieldset
django.forms.boundfield.BoundWidget.__html__
django.forms.fields.ChoiceField.__deepcopy__
django.forms.fields.Field.__deepcopy__
django.forms.fields.FileField.bound_data
django.forms.fields.MultiValueField.__deepcopy__
django.forms.forms.BaseForm.__init__
django.forms.formset_factory
django.forms.formsets.BaseFormSet.__init__
django.forms.formsets.ManagementForm.__init__
django.forms.formsets.formset_factory
django.forms.inlineformset_factory
django.forms.modelformset_factory
django.forms.models.BaseModelFormSet.model
django.forms.models.ModelChoiceField.__deepcopy__
django.forms.models.inlineformset_factory
django.forms.models.modelformset_factory
django.forms.renderers.DjangoDivFormRenderer
django.forms.widgets.ChoiceWidget.template_name
django.forms.widgets.Input.input_type
django.forms.widgets.Media.__html__
django.forms.widgets.MultiWidget.use_fieldset
django.forms.widgets.RadioSelect.id_for_label
django.forms.widgets.RadioSelect.use_fieldset
django.forms.widgets.SelectDateWidget.use_fieldset
django.forms.widgets.Widget.use_fieldset
django.template.VariableDoesNotExist.__init__
django.template.base.FilterExpression.is_var
django.template.base.VariableDoesNotExist.__init__
django.template.defaultfilters.json_script
django.template.library.InclusionNode.token
django.template.library.SimpleNode.token
django.template.loader_tags.BlockNode.token
django.template.loader_tags.ExtendsNode.token
django.template.loader_tags.IncludeNode.token
django.template.loaders.cached.Loader.get_dirs
django.template.smartif.EndToken
django.template.smartif.key
django.template.smartif.op
django.test.runner.DiscoverRunner.log
django.test.runner.DiscoverRunner.reorder_by
django.test.runner.DummyList
django.test.runner.PDBDebugResult.debug
django.test.runner.ParallelTestSuite.__init__
django.test.runner.ParallelTestSuite.initialize_suite
django.test.runner.ParallelTestSuite.process_setup
django.test.runner.ParallelTestSuite.process_setup_args
django.test.runner.Shuffler
django.test.runner.default_test_processes
django.test.runner.filter_tests_by_tags
django.test.runner.find_top_level
django.test.runner.get_max_test_processes
django.test.runner.is_discoverable
django.test.runner.parallel_type
django.test.runner.partition_suite_by_type
django.test.runner.reorder_suite
django.test.runner.reorder_test_bin
django.test.runner.reorder_tests
django.test.runner.shuffle_tests
django.test.runner.test_match_tags
django.test.runner.try_importing
django.test.selenium.SeleniumTestCase
django.test.selenium.SeleniumTestCase.external_host
django.test.selenium.SeleniumTestCase.tags
django.test.selenium.SeleniumTestCaseBase.__new__
django.test.selenium.SeleniumTestCaseBase.create_options
django.test.selenium.SeleniumTestCaseBase.external_host
django.test.selenium.SeleniumTestCaseBase.get_capability
django.test.selenium.SeleniumTestCaseBase.headless
django.test.selenium.SeleniumTestCaseBase.import_options
django.test.selenium.SeleniumTestCaseBase.selenium_hub
django.test.testcases.LiveServerThread.__init__
django.test.testcases.LiveServerThread.server_class
django.test.testcases._AssertTemplateUsedContext.__init__
django.urls.conf.path
django.urls.conf.re_path
django.urls.path
django.urls.re_path
django.urls.resolvers.LocaleRegexDescriptor.__get__
# mypy 1.9.0 new issues:
django.db.models.expressions.rhs
django.db.models.expressions.result
django.db.models.expressions.lhs
django.db.backends.postgresql.base.Cursor
django-stubs-5.2.9/scripts/stubtest/allowlist_todo_django52.txt 0000664 0000000 0000000 00000012460 15134010516 0024763 0 ustar 00root root 0000000 0000000 # Autogenerated by `stubtest`
# Created for 5.2 update:
django.contrib.contenttypes.fields.GenericRelation.get_foreign_related_value
django.contrib.contenttypes.fields.GenericRelation.get_local_related_value
django.contrib.gis.db.backends.mysql.schema.MySQLGISSchemaEditor.__init__
django.contrib.gis.db.backends.oracle.operations.OracleOperations.convert_extent
django.contrib.gis.db.backends.oracle.operations.OracleOperations.from_text
django.contrib.gis.db.models.BaseConstraint.non_db_attrs
django.contrib.gis.db.models.Count.allows_composite_expressions
django.contrib.gis.db.models.Field.has_db_default
django.contrib.gis.db.models.ForeignKey.cast_db_type
django.contrib.gis.db.models.OrderBy.allows_composite_expressions
django.contrib.gis.db.models.Q.identity
django.contrib.gis.gdal.OGRGeometry.geos_support
django.contrib.gis.gdal.OGRGeometry.get_curve_geometry
django.contrib.gis.gdal.OGRGeometry.get_linear_geometry
django.contrib.gis.gdal.OGRGeometry.has_curve
django.contrib.gis.gdal.geometries.CircularString
django.contrib.gis.gdal.geometries.CompoundCurve
django.contrib.gis.gdal.geometries.CurvePolygon
django.contrib.gis.gdal.geometries.MultiCurve
django.contrib.gis.gdal.geometries.MultiSurface
django.contrib.gis.gdal.geometries.OGRGeometry.geos_support
django.contrib.gis.gdal.geometries.OGRGeometry.get_curve_geometry
django.contrib.gis.gdal.geometries.OGRGeometry.get_linear_geometry
django.contrib.gis.gdal.geometries.OGRGeometry.has_curve
django.contrib.gis.gdal.prototypes.geom.get_curve_geom
django.contrib.gis.gdal.prototypes.geom.get_linear_geom
django.contrib.gis.gdal.prototypes.geom.has_curve_geom
django.contrib.gis.geos.prototypes.io.DEFAULT_TRIM_VALUE
django.contrib.gis.management
django.contrib.gis.management.commands
django.contrib.gis.management.commands.inspectdb
django.contrib.gis.management.commands.ogrinspect
django.contrib.sessions.backends.base.SessionBase.pop
django.core.checks.Tags.commands
django.core.checks.commands
django.core.checks.registry.Tags.commands
django.core.handlers.wsgi.LimitedStream.read
django.core.handlers.wsgi.LimitedStream.readline
django.db.backends.base.features.BaseDatabaseFeatures.rounds_to_even
django.db.backends.base.features.BaseDatabaseFeatures.supports_tuple_lookups
django.db.backends.base.schema.BaseDatabaseSchemaEditor.sql_pk_constraint
django.db.backends.mysql.compiler.SQLCompiler.__init__
django.db.backends.mysql.compiler.SQLCompiler.get_default_columns
django.db.backends.mysql.compiler.SQLCompiler.get_qualify_sql
django.db.backends.mysql.compiler.SQLCompiler.get_related_selections
django.db.backends.mysql.features.DatabaseFeatures.allows_group_by_selected_pks
django.db.backends.mysql.features.DatabaseFeatures.has_native_uuid_field
django.db.backends.mysql.features.DatabaseFeatures.supports_expression_defaults
django.db.backends.oracle.base.DatabaseWrapper.close_pool
django.db.backends.oracle.base.DatabaseWrapper.is_pool
django.db.backends.oracle.base.DatabaseWrapper.ops
django.db.backends.oracle.base.DatabaseWrapper.oracledb_version
django.db.backends.oracle.base.DatabaseWrapper.pool
django.db.backends.oracle.features.DatabaseFeatures.bare_select_suffix
django.db.backends.oracle.features.DatabaseFeatures.supports_aggregation_over_interval_types
django.db.backends.oracle.features.DatabaseFeatures.supports_comparing_boolean_expr
django.db.backends.oracle.features.DatabaseFeatures.supports_primitives_in_json_field
django.db.backends.oracle.features.DatabaseFeatures.supports_tuple_lookups
django.db.backends.oracle.features.DatabaseFeatures.test_collations
django.db.backends.oracle.introspection.TableInfo
django.db.backends.oracle.oracledb_any
django.db.backends.oracle.utils.BulkInsertMapper.NCLOB
django.db.backends.oracle.utils.dsn
django.db.backends.postgresql.base.DatabaseWrapper.close_pool
django.db.backends.postgresql.base.DatabaseWrapper.pool
django.db.backends.postgresql.compiler
django.db.backends.postgresql.features.DatabaseFeatures.django_test_skips
django.db.backends.postgresql.features.DatabaseFeatures.supports_nulls_distinct_unique_constraints
django.db.backends.postgresql.psycopg_any
django.db.backends.sqlite3.base.DatabaseWrapper.transaction_modes
django.db.backends.sqlite3.features.DatabaseFeatures.supports_tuple_lookups
django.db.backends.sqlite3.schema.DatabaseSchemaEditor.sql_alter_column_comment
django.db.backends.sqlite3.schema.DatabaseSchemaEditor.sql_alter_table_comment
django.db.migrations.autodetector.MigrationAutodetector.generate_altered_constraints
django.db.migrations.autodetector.OperationDependency
django.db.migrations.state.ProjectState.alter_constraint
django.db.models.BaseConstraint.non_db_attrs
django.db.models.Count.allows_composite_expressions
django.db.models.Field.has_db_default
django.db.models.ForeignKey.cast_db_type
django.db.models.OrderBy.allows_composite_expressions
django.db.models.Q.identity
django.db.models.aggregates.Count.allows_composite_expressions
django.db.models.constraints.BaseConstraint.non_db_attrs
django.db.models.expressions.BaseExpression.allows_composite_expressions
django.db.models.expressions.BaseExpression.set_returning
django.db.models.expressions.ColPairs
django.db.models.expressions.OrderBy.allows_composite_expressions
django.db.models.expressions.OutputFieldIsNoneError
django.db.models.fields.Field.has_db_default
django.db.models.fields.related.ForeignKey.cast_db_type
django.db.models.fields.tuple_lookups
django-stubs-5.2.9/scripts/tests_extension_hook.py 0000664 0000000 0000000 00000003475 15134010516 0022453 0 ustar 00root root 0000000 0000000 from pytest_mypy_plugins.collect import File
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)
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
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"]
django-stubs-5.2.9/tests/ 0000775 0000000 0000000 00000000000 15134010516 0015265 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/__init__.py 0000664 0000000 0000000 00000000000 15134010516 0017364 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/assert_type/ 0000775 0000000 0000000 00000000000 15134010516 0017627 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/assert_type/__init__.py 0000664 0000000 0000000 00000000000 15134010516 0021726 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/assert_type/apps/ 0000775 0000000 0000000 00000000000 15134010516 0020572 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/assert_type/apps/__init__.py 0000664 0000000 0000000 00000000000 15134010516 0022671 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/assert_type/apps/test_config.py 0000664 0000000 0000000 00000002415 15134010516 0023452 0 ustar 00root root 0000000 0000000 from django.apps.config import AppConfig
from django.utils.functional import cached_property
from typing_extensions import assert_type
class FooConfig(AppConfig):
name = "foo"
default_auto_field = "django.db.models.BigAutoField"
class BarConfig(AppConfig):
name = "foo"
@property
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
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)
django-stubs-5.2.9/tests/assert_type/conf/ 0000775 0000000 0000000 00000000000 15134010516 0020554 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/assert_type/conf/settings.py 0000664 0000000 0000000 00000010044 15134010516 0022765 0 ustar 00root root 0000000 0000000 from pathlib import Path
from django_stubs_ext.settings import TemplatesSetting
BASE_DIR = Path(__file__).resolve().parent
# Example taken from various doc pages
# https://docs.djangoproject.com/en/5.2/ref/settings/#templates
TEMPLATES: list[TemplatesSetting] = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"APP_DIRS": True,
},
]
# https://docs.djangoproject.com/en/5.2/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/5.2/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/5.2/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/5.2/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/5.2/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/5.2/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",
],
},
},
]
django-stubs-5.2.9/tests/assert_type/contrib/ 0000775 0000000 0000000 00000000000 15134010516 0021267 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/assert_type/contrib/admin/ 0000775 0000000 0000000 00000000000 15134010516 0022357 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/assert_type/contrib/admin/__init__.py 0000664 0000000 0000000 00000000000 15134010516 0024456 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/assert_type/contrib/admin/test_utils.py 0000664 0000000 0000000 00000006213 15134010516 0025132 0 ustar 00root root 0000000 0000000 from __future__ import annotations
from django import http
from django.contrib import admin
from django.contrib.admin.options import _DisplayT
from django.contrib.admin.utils import flatten, flatten_fieldsets
from django.db import models
from typing_extensions import assert_type
@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`.
assert person_list_admin.fields is not None
assert person_tuple_admin.fields is not None
assert person_fieldset_list_admin.fieldsets is not None
assert person_fieldset_tuple_admin.fieldsets is not None
assert_type(flatten(person_list_admin.fields), list[str])
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]])
assert_type(flatten(person_list_admin.get_list_display(request)), list[_DisplayT[Person]])
assert_type(flatten(person_tuple_admin.list_display), list[_DisplayT[Person]])
assert_type(flatten(person_tuple_admin.get_list_display(request)), list[_DisplayT[Person]])
assert_type(flatten_fieldsets(person_fieldset_list_admin.fieldsets), list[str])
assert_type(flatten_fieldsets(person_fieldset_list_admin.get_fieldsets(request)), list[str])
assert_type(flatten_fieldsets(person_fieldset_tuple_admin.fieldsets), list[str])
assert_type(flatten_fieldsets(person_fieldset_tuple_admin.get_fieldsets(request)), list[str])
django-stubs-5.2.9/tests/assert_type/contrib/auth/ 0000775 0000000 0000000 00000000000 15134010516 0022230 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/assert_type/contrib/auth/test_decorators.py 0000664 0000000 0000000 00000000742 15134010516 0026011 0 ustar 00root root 0000000 0000000 from django.contrib.auth.decorators import user_passes_test
from django.http import HttpRequest, HttpResponse
from django.urls import reverse, reverse_lazy
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: ...
@user_passes_test(lambda user: user.is_active, login_url=lazy_url)
def my_view2(request: HttpRequest) -> HttpResponse: ...
django-stubs-5.2.9/tests/assert_type/contrib/auth/test_models.py 0000664 0000000 0000000 00000000402 15134010516 0025120 0 ustar 00root root 0000000 0000000 from django.contrib.auth.models import AbstractBaseUser, UserManager
from typing_extensions import assert_type
class MyUser(AbstractBaseUser):
pass
class Manager(UserManager[MyUser]):
pass
assert_type(Manager().create_user("username"), MyUser)
django-stubs-5.2.9/tests/assert_type/db/ 0000775 0000000 0000000 00000000000 15134010516 0020214 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/assert_type/db/__init__.py 0000664 0000000 0000000 00000000000 15134010516 0022313 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/assert_type/db/models/ 0000775 0000000 0000000 00000000000 15134010516 0021477 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/assert_type/db/models/__init__.py 0000664 0000000 0000000 00000000000 15134010516 0023576 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/assert_type/db/models/_enums.py 0000664 0000000 0000000 00000001605 15134010516 0023341 0 ustar 00root root 0000000 0000000 from typing import Literal
from django.db.models import TextChoices
from typing_extensions import assert_type
class Direction(TextChoices):
NORTH = "N", "North"
EAST = "E", "East"
SOUTH = "S", "South"
WEST = "W", "West"
# Note: Suppress errors from pyright 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]
assert_type(Direction.values, list[str])
assert_type(Direction.choices, list[tuple[str, str]]) # pyright: ignore[reportAssertTypeFailure]
assert_type(Direction.NORTH, Literal[Direction.NORTH])
assert_type(Direction.NORTH.name, Literal["NORTH"])
assert_type(Direction.NORTH.label, str) # pyright: ignore[reportAssertTypeFailure]
assert_type(Direction.NORTH.value, str)
assert_type(Direction.NORTH.do_not_call_in_templates, Literal[True])
django-stubs-5.2.9/tests/assert_type/db/models/fields/ 0000775 0000000 0000000 00000000000 15134010516 0022745 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/assert_type/db/models/fields/__init__.py 0000664 0000000 0000000 00000000000 15134010516 0025044 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/assert_type/db/models/fields/test_related_descriptors.py 0000664 0000000 0000000 00000000777 15134010516 0030432 0 ustar 00root root 0000000 0000000 from typing import ClassVar
from django.db import models
from django.db.models.fields.related_descriptors import RelatedManager, ReverseManyToOneDescriptor
from typing_extensions import assert_type
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])
django-stubs-5.2.9/tests/assert_type/db/models/test_constraints.py 0000664 0000000 0000000 00000001407 15134010516 0025461 0 ustar 00root root 0000000 0000000 from typing import Any
from django.db.models import CheckConstraint, F, UniqueConstraint
from django.db.models.functions import Lower
from django.db.models.lookups import LessThan
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] # pyrefly: ignore[no-matching-overload]
Lower("name"),
fields=["name"], # pyright: ignore[reportArgumentType]
name="unique_mess",
)
CheckConstraint( # type: ignore[deprecated] # pyright: ignore[reportDeprecated] # pyrefly: ignore[deprecated]
name="less_than_constraint",
check=LessThan[Any](F("months"), 1),
)
django-stubs-5.2.9/tests/assert_type/db/models/test_enums.py 0000664 0000000 0000000 00000035031 15134010516 0024241 0 ustar 00root root 0000000 0000000 import enum
from typing import Any, Literal, TypeVar
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 assert_type
# 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]
def get_labels_using_property(choices: type[T_Choices]) -> list[str]:
return choices.labels # pyright: ignore[reportReturnType]
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]
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
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]
assert_type(Suit.values, list[int])
assert_type(Suit.choices, list[tuple[int, _StrPromise]]) # pyright: ignore[reportAssertTypeFailure]
assert_type(Suit.CLUB, Literal[Suit.CLUB])
assert_type(Suit.CLUB.name, Literal["CLUB"])
assert_type(Suit.CLUB.label, _StrPromise) # pyright: ignore[reportAssertTypeFailure]
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]
assert_type(YearInSchool.values, list[str])
assert_type(YearInSchool.choices, list[tuple[str, _StrPromise]]) # pyright: ignore[reportAssertTypeFailure]
assert_type(YearInSchool.SENIOR, Literal[YearInSchool.SENIOR])
assert_type(YearInSchool.SENIOR.name, Literal["SENIOR"])
assert_type(YearInSchool.SENIOR.label, _StrPromise) # pyright: ignore[reportAssertTypeFailure]
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]
assert_type(Vehicle.choices, list[tuple[int | None, _StrOrPromise]]) # pyright: ignore[reportAssertTypeFailure]
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]
assert_type(Gender.values, list[str | None]) # pyright: ignore[reportAssertTypeFailure]
assert_type(Gender.choices, list[tuple[str | None, str]]) # pyright: ignore[reportAssertTypeFailure]
assert_type(Gender.MALE, Literal[Gender.MALE])
assert_type(Gender.MALE.name, Literal["MALE"])
assert_type(Gender.MALE.label, str) # pyright: ignore[reportAssertTypeFailure]
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]
assert_type(Medal.values, list[str])
assert_type(Medal.choices, list[tuple[str, str]]) # pyright: ignore[reportAssertTypeFailure]
assert_type(Medal.GOLD, Literal[Medal.GOLD])
assert_type(Medal.GOLD.name, Literal["GOLD"])
assert_type(Medal.GOLD.label, str) # pyright: ignore[reportAssertTypeFailure]
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]
assert_type(Separator.values, list[bytes]) # pyright: ignore[reportAssertTypeFailure]
assert_type(Separator.choices, list[tuple[bytes, str]]) # pyright: ignore[reportAssertTypeFailure]
assert_type(Separator.FS, Literal[Separator.FS])
assert_type(Separator.FS.name, Literal["FS"])
assert_type(Separator.FS.label, str) # pyright: ignore[reportAssertTypeFailure]
assert_type(Separator.FS.value, bytes) # pyright: ignore[reportAssertTypeFailure]
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]
assert_type(Constants.values, list[float | None]) # pyright: ignore[reportAssertTypeFailure]
assert_type(Constants.choices, list[tuple[float | None, str]]) # pyright: ignore[reportAssertTypeFailure]
assert_type(Constants.PI, Literal[Constants.PI])
assert_type(Constants.PI.name, Literal["PI"])
assert_type(Constants.PI.label, str) # pyright: ignore[reportAssertTypeFailure]
assert_type(Constants.PI.value, float) # pyright: ignore[reportAssertTypeFailure]
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]
assert_type(VoidChoices.values, list[int | None]) # type: ignore[assert-type] # pyright: ignore[reportAssertTypeFailure]
assert_type( # pyrefly: ignore[assert-type]
VoidChoices.values, # pyright: ignore[reportAssertTypeFailure]
list[Any | None],
)
assert_type(VoidChoices.choices, list[tuple[int | None, str]]) # type: ignore[assert-type] # pyright: ignore[reportAssertTypeFailure]
assert_type( # pyrefly: ignore[assert-type]
VoidChoices.choices, # pyright: ignore[reportAssertTypeFailure]
list[tuple[Any | None, str]],
)
assert_type(VoidChoices.ABYSS, Literal[VoidChoices.ABYSS])
assert_type(VoidChoices.ABYSS.name, Literal["ABYSS"])
assert_type(VoidChoices.ABYSS.label, str) # pyright: ignore[reportAssertTypeFailure]
assert_type(VoidChoices.ABYSS.value, int) # type: ignore[assert-type] # pyright: ignore[reportAssertTypeFailure]
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]
assert_type(imported.Direction.values, list[str])
assert_type(imported.Direction.choices, list[tuple[str, str]]) # pyright: ignore[reportAssertTypeFailure]
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]
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]
assert_type(CompassPoint.values, list[str])
assert_type(CompassPoint.choices, list[tuple[str, str]]) # pyright: ignore[reportAssertTypeFailure]
assert_type(CompassPoint.NORTH, Literal[imported.Direction.NORTH])
assert_type(CompassPoint.NORTH.name, Literal["NORTH"])
assert_type(CompassPoint.NORTH.label, str) # pyright: ignore[reportAssertTypeFailure]
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]
assert_type(Award.values, list[str])
assert_type(Award.choices, list[tuple[str, str]]) # pyright: ignore[reportAssertTypeFailure]
# 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]
assert_type([member.label for choices in x1 for member in choices], list[_StrOrPromise]) # pyrefly: ignore[assert-type]
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]
assert_type([member.label for choices in x3 for member in choices], list[_StrOrPromise]) # pyrefly: ignore[assert-type]
assert_type([member.value for choices in x3 for member in choices], list[bytes | float]) # type: ignore[assert-type] # pyright: ignore[reportAssertTypeFailure]
assert_type([member.value for choices in x3 for member in choices], list[Any]) # pyrefly: ignore[assert-type]
# Assertions for choices objects defined and aliased in a model.
assert_type(DeckModel.Suit.choices, list[tuple[int, _StrPromise]]) # pyright: ignore[reportAssertTypeFailure]
assert_type(DeckModel.House.choices, list[tuple[int, _StrPromise]]) # pyright: ignore[reportAssertTypeFailure]
assert_type(DeckModel.Joker.choices, list[tuple[str, str]]) # pyright: ignore[reportAssertTypeFailure]
django-stubs-5.2.9/tests/assert_type/db/models/test_ordering.py 0000664 0000000 0000000 00000004435 15134010516 0024727 0 ustar 00root root 0000000 0000000 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]
qs.order_by(["username"]) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type]
qs.order_by({"username": "asc"}) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type]
qs.extra(order_by=[123]) # type: ignore[list-item] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type]
qs.extra(order_by=["username", 456]) # type: ignore[list-item] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type]
query.add_ordering(123) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type]
query.add_ordering(["username"]) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-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]
)
django-stubs-5.2.9/tests/assert_type/db/models/test_query.py 0000664 0000000 0000000 00000002653 15134010516 0024263 0 ustar 00root root 0000000 0000000 from collections.abc import Sequence
from django.db.models import Model
from django.db.models.query import (
aprefetch_related_objects, # pyright: ignore[reportUnknownVariableType]
prefetch_related_objects, # pyright: ignore[reportUnknownVariableType]
)
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]
models_frozenset: frozenset[Model] = frozenset()
prefetch_related_objects(models_frozenset, "pk") # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-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]
await aprefetch_related_objects(models_frozenset, "pk") # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type]
django-stubs-5.2.9/tests/assert_type/forms/ 0000775 0000000 0000000 00000000000 15134010516 0020755 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/assert_type/forms/test_add_error.py 0000664 0000000 0000000 00000005110 15134010516 0024324 0 ustar 00root root 0000000 0000000 from django.core.exceptions import ValidationError
from django.forms import BaseForm
from django.utils.functional import lazystr
from typing_extensions import assert_type
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]
form.add_error("field", {"field": lazystr("error")}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload]
form.add_error("field", {"field": ValidationError("error")}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload]
form.add_error("field", {"field": ["error"]}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload]
form.add_error("field", {"field": [lazystr("error")]}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload]
form.add_error("field", {"field": [ValidationError("error")]}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload]
django-stubs-5.2.9/tests/assert_type/http/ 0000775 0000000 0000000 00000000000 15134010516 0020606 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/assert_type/http/test_redirect.py 0000664 0000000 0000000 00000000542 15134010516 0024021 0 ustar 00root root 0000000 0000000 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)
django-stubs-5.2.9/tests/assert_type/http/test_request.py 0000664 0000000 0000000 00000002355 15134010516 0023714 0 ustar 00root root 0000000 0000000 from collections.abc import Iterable, Iterator
from django.http import QueryDict
from django.http.request import _ImmutableQueryDict
from typing_extensions import assert_type
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])
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]
assert_type(mut_q.pop("a"), list[str])
assert_type(mut_q.pop("a", 12), list[str] | int)
assert_type(mut_q.popitem(), tuple[str, list[str]])
django-stubs-5.2.9/tests/assert_type/middleware/ 0000775 0000000 0000000 00000000000 15134010516 0021744 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/assert_type/middleware/__init__.py 0000664 0000000 0000000 00000000000 15134010516 0024043 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/assert_type/middleware/test_middleware.py 0000664 0000000 0000000 00000003203 15134010516 0025470 0 ustar 00root root 0000000 0000000 from django.contrib.redirects.middleware import RedirectFallbackMiddleware
from django.http.response import (
FileResponse,
HttpResponse,
HttpResponseGone,
HttpResponsePermanentRedirect,
HttpResponseRedirect,
HttpResponseRedirectBase,
)
from django.middleware.common import CommonMiddleware
from django.middleware.locale import LocaleMiddleware
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]
django-stubs-5.2.9/tests/assert_type/test/ 0000775 0000000 0000000 00000000000 15134010516 0020606 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/assert_type/test/client.py 0000664 0000000 0000000 00000001212 15134010516 0022432 0 ustar 00root root 0000000 0000000 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)
django-stubs-5.2.9/tests/assert_type/urls/ 0000775 0000000 0000000 00000000000 15134010516 0020614 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/assert_type/urls/__init__.py 0000664 0000000 0000000 00000000000 15134010516 0022713 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/assert_type/urls/test_conf.py 0000664 0000000 0000000 00000004353 15134010516 0023157 0 ustar 00root root 0000000 0000000 from django.conf.urls.i18n import urlpatterns as i18n_urlpatterns
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.http import HttpResponse
from django.urls import URLPattern, URLResolver, _AnyURL, include, path, re_path
from django.utils.translation import gettext_lazy as _
from typing_extensions import assert_type
# 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: ...
async def v2() -> HttpResponse: ...
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)
django-stubs-5.2.9/tests/assert_type/urls/test_resolvers.py 0000664 0000000 0000000 00000000466 15134010516 0024257 0 ustar 00root root 0000000 0000000 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)
django-stubs-5.2.9/tests/assert_type/views/ 0000775 0000000 0000000 00000000000 15134010516 0020764 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/assert_type/views/__init__.py 0000664 0000000 0000000 00000000000 15134010516 0023063 0 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/assert_type/views/test_generic.py 0000664 0000000 0000000 00000001672 15134010516 0024017 0 ustar 00root root 0000000 0000000 from django.db import models
from django.views.generic.detail import SingleObjectMixin
from django.views.generic.list import ListView
from typing_extensions import assert_type
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)
django-stubs-5.2.9/tests/test_error_handling.py 0000664 0000000 0000000 00000020605 15134010516 0021676 0 ustar 00root root 0000000 0000000 import os
import tempfile
import uuid
from collections.abc import Generator
from contextlib import contextmanager
from typing import Any
from unittest import mock
import pytest
from mypy_django_plugin.config import DjangoPluginConfig
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")
django-stubs-5.2.9/tests/test_generic_consistency.py 0000664 0000000 0000000 00000010567 15134010516 0022744 0 ustar 00root root 0000000 0000000 import ast
import glob
import importlib
import os
from typing import Any, final
from unittest import mock
import django
from django_stubs_ext.patch import MPGeneric
# 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 to find classes inheriting from `typing.Generic` in stubs."""
def __init__(self) -> None:
self.generic_classes: set[str] = set()
def visit_ClassDef(self, node: ast.ClassDef) -> None:
for base in node.bases:
if (
isinstance(base, ast.Subscript)
and isinstance(base.value, ast.Name)
and base.value.id == "Generic"
and not any(dec.id == "type_check_only" for dec in node.decorator_list if isinstance(dec, ast.Name))
):
self.generic_classes.add(node.name)
break
self.generic_visit(node)
def test_find_classes_inheriting_from_generic() -> None:
"""
This test ensures that the `ext/django_stubs_ext/patch.py` stays up-to-date with the stubs.
It works as follows:
1. Parse the ast of each .pyi file, and collects classes inheriting from Generic.
2. For each Generic in the stubs, import the associated module and capture every class in the MRO
3. Ensure that at least one class in the mro is patched in `ext/django_stubs_ext/patch.py`.
"""
with mock.patch.dict(os.environ, {"DJANGO_SETTINGS_MODULE": "scripts.django_tests_settings"}):
# We need this to be able to do django import
django.setup()
# A dict of class_name -> [subclasses names] for each Generic in the stubs.
all_generic_classes: dict[str, list[str]] = {}
print(f"Searching for classes inheriting from Generic in: {STUBS_ROOT}")
pyi_files = glob.glob("**/*.pyi", root_dir=STUBS_ROOT, recursive=True)
for file_path in pyi_files:
with open(os.path.join(STUBS_ROOT, file_path)) as f:
source = f.read()
tree = ast.parse(source)
generic_visitor = GenericInheritanceVisitor()
generic_visitor.visit(tree)
# For each Generic in the stubs, import the associated module and capture every class in the MRO
if generic_visitor.generic_classes:
module_name = _get_module_from_pyi(file_path)
django_module = importlib.import_module(module_name)
all_generic_classes.update(
{
cls: [subcls.__name__ for subcls in getattr(django_module, cls).mro()[1:-1]]
for cls in generic_visitor.generic_classes
}
)
print(f"Processed {len(pyi_files)} .pyi files.")
print(f"Found {len(all_generic_classes)} unique classes inheriting from Generic in stubs")
patched_classes = {mp_generic.cls.__name__ for mp_generic in _get_need_generic()}
# Pretty-print missing patch in `ext/django_stubs_ext/patch.py`
errors = []
for cls_name, subcls_names in all_generic_classes.items():
if not any(name in patched_classes for name in [*subcls_names, cls_name]):
bases = f"({', '.join(subcls_names)})" if subcls_names else ""
errors.append(f"{cls_name}{bases} is not patched in `ext/django_stubs_ext/patch.py`")
assert not errors, "\n".join(errors)
def _get_module_from_pyi(pyi_path: str) -> str:
py_module = "django." + pyi_path.replace(".pyi", "").replace("/", ".")
return py_module.removesuffix(".__init__")
def _get_need_generic() -> list[MPGeneric[Any]]:
"""
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
return [MPGeneric(SetPasswordMixin), MPGeneric(SetUnusablePasswordMixin), *django_stubs_ext.patch._need_generic]
from django.contrib.auth.forms import AdminPasswordChangeForm, SetPasswordForm
return [MPGeneric(SetPasswordForm), MPGeneric(AdminPasswordChangeForm), *django_stubs_ext.patch._need_generic]
django-stubs-5.2.9/tests/typecheck/ 0000775 0000000 0000000 00000000000 15134010516 0017244 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/typecheck/conf/ 0000775 0000000 0000000 00000000000 15134010516 0020171 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/typecheck/conf/test_settings.yml 0000664 0000000 0000000 00000004720 15134010516 0023616 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 "builtins.int"
reveal_type(settings.CIRCULAR_WITH_HINT) # N: Revealed type is "builtins.int"
reveal_type(settings.CIRCULAR_WITHOUT_HINT_FUNCTION) # N: Revealed type is "builtins.int"
reveal_type(settings.CIRCULAR_WITHOUT_HINT_CONST) # N: Revealed type is "builtins.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 "builtins.str | django.utils.functional._StrPromise"
reveal_type(settings.LOGIN_REDIRECT_URL) # N: Revealed type is "builtins.str | django.utils.functional._StrPromise"
reveal_type(settings.LOGOUT_REDIRECT_URL) # N: Revealed type is "builtins.str | django.utils.functional._StrPromise | None"
django-stubs-5.2.9/tests/typecheck/contrib/ 0000775 0000000 0000000 00000000000 15134010516 0020704 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/typecheck/contrib/admin/ 0000775 0000000 0000000 00000000000 15134010516 0021774 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/typecheck/contrib/admin/test_decorators.yml 0000664 0000000 0000000 00000011162 15134010516 0025724 0 ustar 00root root 0000000 0000000 - case: test_admin_decorators_display
main: |
from typing_extensions import reveal_type
from django.db import models
from django.contrib import admin
class MyModel(models.Model):
@admin.display
def display_bare(self) -> str: ...
@admin.display(boolean=True, ordering="field", description="Something", empty_value="...")
def display_fancy(self) -> bool: ...
# Can also be a property
@property
@admin.display
def display_property(self) -> str: ...
@admin.display # E: Decorators on top of @property are not supported [prop-decorator]
@property
def incorrect_property(self) -> str: ...
def method(self) -> None:
reveal_type(self.display_bare) # N: Revealed type is "def () -> builtins.str"
reveal_type(self.display_fancy) # N: Revealed type is "def () -> builtins.bool"
reveal_type(self.display_fancy()) # N: Revealed type is "builtins.bool"
reveal_type(self.display_property) # N: Revealed type is "builtins.str"
@admin.display
def freestanding_display_bare(obj: MyModel) -> str: ...
@admin.display(boolean=True)
def freestanding_display_fancy(obj: MyModel) -> bool: ...
@admin.register(MyModel, MyModel, site=None)
class MyModelAdmin(admin.ModelAdmin[MyModel]):
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: MyModel) -> str: ...
@admin.display(boolean=True, ordering="field", description="Something", empty_value="Nuf")
def admin_display_fancy(self, obj: MyModel) -> bool: ...
- case: test_admin_decorators_action
main: |
from typing_extensions import reveal_type
from django.db import models
from django.contrib import admin
from django.db.models import QuerySet
from django.http import FileResponse, HttpRequest, HttpResponse
class MyModel(models.Model): ...
@admin.action
def freestanding_action_bare(modeladmin: "MyModelAdmin", request: HttpRequest, queryset: QuerySet[MyModel]) -> None: ...
@admin.action(description="Some text here", permissions=["test"])
def freestanding_action_fancy(modeladmin: "MyModelAdmin", request: HttpRequest, queryset: QuerySet[MyModel]) -> None: ...
@admin.action
def freestanding_action_http_response(modeladmin: "MyModelAdmin", request: HttpRequest, queryset: QuerySet[MyModel]) -> HttpResponse: ...
@admin.action
def freestanding_action_file_response(modeladmin: "MyModelAdmin", request: HttpRequest, queryset: QuerySet[MyModel]) -> FileResponse: ...
@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin[MyModel]):
actions = [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[MyModel]) -> None: ...
@admin.action(description="Some text here", permissions=["test"])
def method_action_fancy(self, request: HttpRequest, queryset: QuerySet[MyModel]) -> None: ...
@admin.action(description="Some text here", permissions=["test"])
def method_action_http_response(self, request: HttpRequest, queryset: QuerySet[MyModel]) -> HttpResponse: ...
@admin.action(description="Some text here", permissions=["test"])
def method_action_file_response(self, request: HttpRequest, queryset: QuerySet[MyModel]) -> FileResponse: ...
def method(self) -> None:
reveal_type(self.method_action_bare) # N: Revealed type is "def (request: django.http.request.HttpRequest, queryset: django.db.models.query.QuerySet[main.MyModel, main.MyModel])"
reveal_type(self.method_action_fancy) # N: Revealed type is "def (request: django.http.request.HttpRequest, queryset: django.db.models.query.QuerySet[main.MyModel, main.MyModel])"
reveal_type(self.method_action_http_response) # N: Revealed type is "def (request: django.http.request.HttpRequest, queryset: django.db.models.query.QuerySet[main.MyModel, main.MyModel]) -> django.http.response.HttpResponse"
reveal_type(self.method_action_file_response) # N: Revealed type is "def (request: django.http.request.HttpRequest, queryset: django.db.models.query.QuerySet[main.MyModel, main.MyModel]) -> django.http.response.FileResponse"
django-stubs-5.2.9/tests/typecheck/contrib/admin/test_options.yml 0000664 0000000 0000000 00000014472 15134010516 0025261 0 ustar 00root root 0000000 0000000 # "Happy path" test for model admin, trying to cover as many valid
# configurations as possible.
- case: test_full_admin
main: |
from django.contrib import admin, messages
from django.forms import Form, ModelForm, Textarea
from django.db import models
from django.core.paginator import Paginator
from django.contrib.admin.sites import AdminSite
from django.db.models.options import Options
from django.http.request import HttpRequest
from django.db.models.query import QuerySet
from django.utils.translation import gettext_lazy as _
def an_action(modeladmin: "A", request: HttpRequest, queryset: QuerySet) -> None:
pass
class TestModel(models.Model):
pass
class TestModelForm(ModelForm[TestModel]):
pass
class A(admin.ModelAdmin[TestModel]):
# 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 = TestModelForm
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 = (an_action, "a_method_action")
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 = TestModel
def a_method_action(self, request: HttpRequest, queryset: QuerySet) -> None:
pass
def a_method_action_with_message_user(self, request: HttpRequest, queryset: QuerySet) -> None:
self.message_user(request, _("Error message"), messages.ERROR)
# This test 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
- case: test_fieldset_workaround_regression
main: |
from django.contrib import admin
class A(admin.ModelAdmin):
fieldsets = (
(None, {
'fields': ('name',),
}),
)
- case: test_view_on_site_as_callable
main: |
from django.contrib import admin
class A(admin.ModelAdmin):
def view_on_site(self, obj: "A") -> str:
return "http://example.org"
- case: errors_on_omitting_fields_from_fieldset_opts
main: |
from django.contrib import admin
class A(admin.ModelAdmin):
fieldsets = [
(None, {}), # E: Missing key "fields" for TypedDict "_FieldOpts" [typeddict-item]
]
- case: errors_on_invalid_radio_fields
main: |
from django.contrib import admin
class A(admin.ModelAdmin):
radio_fields = {"some_field": 0} # E: Dict entry 0 has incompatible type "str": "Literal[0]"; expected "str": "Literal[1, 2]" [dict-item]
class B(admin.ModelAdmin):
radio_fields = {1: admin.VERTICAL} # E: Dict entry 0 has incompatible type "int": "Literal[2]"; expected "str": "Literal[1, 2]" [dict-item]
- case: errors_for_invalid_formfield_overrides
main: |
from django.contrib import admin
from django.forms import Textarea
class A(admin.ModelAdmin):
formfield_overrides = {
"not a field": { # E: Dict entry 0 has incompatible type "str": "dict[str, Any]"; expected "type[Field[Any, Any]]": "Mapping[str, Any]" [dict-item]
"widget": Textarea
}
}
- case: errors_for_invalid_action_signature
main: |
from django.contrib import admin
from django.http.request import HttpRequest
from django.db import models
class MyModel(models.Model): ...
def an_action(modeladmin: None) -> None:
pass
class A(admin.ModelAdmin[MyModel]):
actions = [an_action] # E: List item 0 has incompatible type "Callable[[None], None]"; expected "Callable[[A, HttpRequest, QuerySet[MyModel, MyModel]], HttpResponseBase | None] | str" [list-item]
- case: errors_for_invalid_model_admin_generic
main: |
from django.contrib.admin import ModelAdmin
from django.db.models import Model
class TestModel(Model):
pass
class A(ModelAdmin[TestModel]):
model = int # E: Incompatible types in assignment (expression has type "type[int]", base class "ModelAdmin" defined the type as "type[TestModel]") [assignment]
django-stubs-5.2.9/tests/typecheck/contrib/auth/ 0000775 0000000 0000000 00000000000 15134010516 0021645 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/typecheck/contrib/auth/test_auth.yml 0000664 0000000 0000000 00000013256 15134010516 0024377 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] | builtins.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: ...
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] | builtins.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: ...
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] | builtins.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: ...
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):
...
django-stubs-5.2.9/tests/typecheck/contrib/auth/test_decorators.yml 0000664 0000000 0000000 00000014261 15134010516 0025600 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: ...
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: ...
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: ...
reveal_type(view_func3) # N: Revealed type is "def (request: django.core.handlers.wsgi.WSGIRequest, arg: builtins.str) -> django.http.response.HttpResponse"
@login_required(redirect_field_name='a', login_url='b')
async def view_func4(request: ASGIRequest, arg: str) -> HttpResponse: ...
reveal_type(view_func4) # N: Revealed type is "def (request: django.core.handlers.asgi.ASGIRequest, arg: builtins.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: ...
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: ...
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: ...
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: ...
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: ...
- 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: ...
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: ...
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: ...
@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: ...
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: ...
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: ...
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: ...
@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: ...
custom_settings: |
INSTALLED_APPS = ("django.contrib.contenttypes", "django.contrib.auth")
django-stubs-5.2.9/tests/typecheck/contrib/auth/test_misc.yml 0000664 0000000 0000000 00000002642 15134010516 0024366 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
django-stubs-5.2.9/tests/typecheck/contrib/contenttypes/ 0000775 0000000 0000000 00000000000 15134010516 0023443 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/typecheck/contrib/contenttypes/test_models.yml 0000664 0000000 0000000 00000001210 15134010516 0026502 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 "builtins.int"
reveal_type(c.app_label) # N: Revealed type is "builtins.str"
reveal_type(c.model) # N: Revealed type is "builtins.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",)
django-stubs-5.2.9/tests/typecheck/contrib/gis/ 0000775 0000000 0000000 00000000000 15134010516 0021466 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/typecheck/contrib/gis/test_fields.yml 0000664 0000000 0000000 00000004174 15134010516 0024524 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()
django-stubs-5.2.9/tests/typecheck/contrib/postgres/ 0000775 0000000 0000000 00000000000 15134010516 0022552 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/typecheck/contrib/postgres/test_fields.yml 0000664 0000000 0000000 00000002507 15134010516 0025606 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)
django-stubs-5.2.9/tests/typecheck/contrib/postgres/test_indexes.yml 0000664 0000000 0000000 00000002023 15134010516 0025770 0 ustar 00root root 0000000 0000000 - case: can_instantiate_index
main: |
from django.db import models
from django.db.models.functions import Lower
from django.contrib.postgres.indexes import {{ index }}
{{ index }}(fields=["foo"])
{{ index }}(models.F("bar"), name="test")
{{ index }}("foo", models.F("bar"), Lower("baz"), name="test")
{{ index }}("foo", name="test", opclasses=["bar"])
{{ index }}("foo", name="test", condition=models.Q(foo=1))
{{ index }}("foo", name="test", include=["bar"])
parametrized:
- index: BrinIndex
- index: BTreeIndex
- index: GinIndex
- index: GistIndex
- index: HashIndex
- index: SpGistIndex
- case: can_instantiate_opclass
main: |
from django.db.models import Index
from django.db.models.functions import Lower
from django.contrib.postgres.indexes import OpClass
Index(
OpClass(Lower('username'), name='varchar_pattern_ops'),
name='lower_username_idx',
)
django-stubs-5.2.9/tests/typecheck/contrib/sitemaps/ 0000775 0000000 0000000 00000000000 15134010516 0022531 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/typecheck/contrib/sitemaps/test_generic_sitemap.yml 0000664 0000000 0000000 00000006415 15134010516 0027457 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 myapp.models import Offer
class OfferSitemap(Sitemap[Offer]):
priority = 1
changefreq = "always"
def items(self) -> QuerySet[Offer]:
return Offer.objects.all()
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]):
def items(self) -> str:
return "Yes"
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:24: error: Return type "str" of "items" incompatible with return type "Iterable[Offer]" in supertype "django.contrib.sitemaps.Sitemap" [override]
main:26: error: Return type "int" of "location" incompatible with return type "str" in supertype "django.contrib.sitemaps.Sitemap" [override]
main:26: error: Argument 1 of "location" is incompatible with supertype "django.contrib.sitemaps.Sitemap"; supertype defines the argument type as "Offer" [override]
main:26: note: This violates the Liskov substitution principle
main:26: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#incompatible-overrides
main:40: 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
class StaticViewSitemap(Sitemap[str]):
priority = 1
changefreq = "always"
def items(self) -> list[str]:
return ["home", "about", "contact", "recommendations", "privacy-policy", "blog"]
def location(self, item: str) -> str:
return reverse(item)
django-stubs-5.2.9/tests/typecheck/contrib/staticfiles/ 0000775 0000000 0000000 00000000000 15134010516 0023216 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/typecheck/contrib/staticfiles/test_finders.yml 0000664 0000000 0000000 00000004240 15134010516 0026432 0 ustar 00root root 0000000 0000000 - case: test_find_one
main: |
from typing_extensions import reveal_type
from django.contrib.staticfiles import finders
reveal_type(finders.find("filepath")) # N: Revealed type is "builtins.str | None"
for finder in finders.get_finders():
reveal_type(finder.find("filepath")) # N: Revealed type is "builtins.str | None"
reveal_type(finders.FileSystemFinder().find("filepath")) # N: Revealed type is "builtins.str | None"
reveal_type(finders.AppDirectoriesFinder().find("filepath")) # N: Revealed type is "builtins.str | None"
reveal_type(finders.DefaultStorageFinder().find("filepath")) # N: Revealed type is "builtins.str | None"
- case: test_find_all
main: |
from typing_extensions import reveal_type
from django.contrib.staticfiles import finders
reveal_type(finders.find("filepath", find_all=True)) # N: Revealed type is "builtins.list[builtins.str]"
for finder in finders.get_finders():
reveal_type(finder.find("filepath", find_all=True)) # N: Revealed type is "builtins.list[builtins.str]"
reveal_type(finders.FileSystemFinder().find("filepath", find_all=True)) # N: Revealed type is "builtins.list[builtins.str]"
reveal_type(finders.AppDirectoriesFinder().find("filepath", find_all=True)) # N: Revealed type is "builtins.list[builtins.str]"
reveal_type(finders.DefaultStorageFinder().find("filepath", find_all=True)) # N: Revealed type is "builtins.list[builtins.str]"
- case: test_file_system_finder # test methods *only* on FileSystemFinder
main: |
from typing_extensions import reveal_type
from django.contrib.staticfiles.finders import FileSystemFinder
finder = FileSystemFinder()
reveal_type(finder.find_location(".", "filepath")) # N: Revealed type is "builtins.str | None"
- case: test_app_directories_finder # test methods *only* on AppDirectoriesFinder
main: |
from typing_extensions import reveal_type
from django.contrib.staticfiles.finders import AppDirectoriesFinder
finder = AppDirectoriesFinder()
reveal_type(finder.find_in_app("app", "filepath")) # N: Revealed type is "builtins.str | None"
django-stubs-5.2.9/tests/typecheck/core/ 0000775 0000000 0000000 00000000000 15134010516 0020174 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/typecheck/core/handlers/ 0000775 0000000 0000000 00000000000 15134010516 0021774 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/typecheck/core/handlers/test_wsgi.yml 0000664 0000000 0000000 00000000334 15134010516 0024527 0 ustar 00root root 0000000 0000000 - case: test_make_server
main: |
from wsgiref.simple_server import make_server
from django.core.handlers.wsgi import WSGIHandler
make_server(
"0.0.0.0",
8080,
WSGIHandler(),
)
django-stubs-5.2.9/tests/typecheck/core/test_checks.yml 0000664 0000000 0000000 00000003310 15134010516 0023213 0 ustar 00root root 0000000 0000000 - case: test_checks_register
main: |
from collections.abc import Sequence
from typing import Any
from typing_extensions import reveal_type
from django.apps.config import AppConfig
from django.core.checks import register, Warning, CheckMessage
@register("foo", deploy=True)
def check_foo(app_configs: Sequence[AppConfig] | None, databases: Sequence[str] | None, **kwargs: Any) -> list[Warning]:
if databases and 'databass' in databases:
return [Warning("Naughty list")]
return []
reveal_type(check_foo) # N: Revealed type is "django.core.checks.registry._ProcessedCheckCallable[def (app_configs: typing.Sequence[django.apps.config.AppConfig] | None, databases: typing.Sequence[builtins.str] | None, **kwargs: Any) -> builtins.list[django.core.checks.messages.Warning]]"
reveal_type(check_foo.tags) # N: Revealed type is "typing.Sequence[builtins.str]"
@register
def check_bar(*, app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[CheckMessage]: ...
reveal_type(check_bar) # N: Revealed type is "django.core.checks.registry._ProcessedCheckCallable[def (*, app_configs: typing.Sequence[django.apps.config.AppConfig] | None, **kwargs: Any) -> builtins.list[django.core.checks.messages.CheckMessage]]"
@register
def check_baz(**kwargs: Any) -> list[CheckMessage]: ...
reveal_type(check_baz) # N: Revealed type is "django.core.checks.registry._ProcessedCheckCallable[def (**kwargs: Any) -> builtins.list[django.core.checks.messages.CheckMessage]]"
@register() # E: Value of type variable "_C" of function cannot be "Callable[[int], list[CheckMessage]]" [type-var]
def wrong_args(bla: int) -> list[CheckMessage]: ...
django-stubs-5.2.9/tests/typecheck/core/test_exceptions.yml 0000664 0000000 0000000 00000001322 15134010516 0024135 0 ustar 00root root 0000000 0000000 - case: ValidationError_nested_message
main: |
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'],
])
django-stubs-5.2.9/tests/typecheck/db/ 0000775 0000000 0000000 00000000000 15134010516 0017631 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/typecheck/db/migrations/ 0000775 0000000 0000000 00000000000 15134010516 0022005 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/typecheck/db/migrations/test_classvar.yml 0000664 0000000 0000000 00000001361 15134010516 0025406 0 ustar 00root root 0000000 0000000 - case: explicit
main: |
from typing import ClassVar
from django.db import migrations
from django.db.migrations.operations.base import Operation
class Migration(migrations.Migration):
operations: ClassVar[list[Operation]] = []
initial: ClassVar[bool] = True
- case: explicit_incorrect
expect_fail: true
main: |
from typing import ClassVar
from django.db import migrations
from django.db.migrations.operations.base import Operation
class Migration(migrations.Migration):
operations: list[Operation] = []
initial: bool = True
- case: implicit
main: |
from django.db import migrations
class Migration(migrations.Migration):
operations = []
initial = True
django-stubs-5.2.9/tests/typecheck/db/migrations/test_operations.yml 0000664 0000000 0000000 00000005204 15134010516 0025753 0 ustar 00root root 0000000 0000000 - case: runsql_sqls_variants
main: |
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"])])
RunSQL(sql=("SOME SQL", {})) # E: Argument "sql" to "RunSQL" has incompatible type "tuple[str, dict[Never, Never]]"; expected "str | list[str | tuple[str, dict[str, Any] | list[Any] | tuple[Any, ...] | tuple[()] | None]] | tuple[str | tuple[str, dict[str, Any] | list[Any] | tuple[Any, ...] | tuple[()] | None], ...] | tuple[()]" [arg-type]
RunSQL(sql=("SOME SQL", 1)) # E: Argument "sql" to "RunSQL" has incompatible type "tuple[str, int]"; expected "str | list[str | tuple[str, dict[str, Any] | list[Any] | tuple[Any, ...] | tuple[()] | None]] | tuple[str | tuple[str, dict[str, Any] | list[Any] | tuple[Any, ...] | tuple[()] | None], ...] | tuple[()]" [arg-type]
RunSQL(sql=("SOME SQL", None)) # E: Argument "sql" to "RunSQL" has incompatible type "tuple[str, None]"; expected "str | list[str | tuple[str, dict[str, Any] | list[Any] | tuple[Any, ...] | tuple[()] | None]] | tuple[str | tuple[str, dict[str, Any] | list[Any] | tuple[Any, ...] | tuple[()] | None], ...] | tuple[()]" [arg-type]
RunSQL(sql=("SOME SQLS %(VAL)s", {1: "FOO"})) # E: Argument "sql" to "RunSQL" has incompatible type "tuple[str, dict[int, str]]"; expected "str | list[str | tuple[str, dict[str, Any] | list[Any] | tuple[Any, ...] | tuple[()] | None]] | tuple[str | tuple[str, dict[str, Any] | list[Any] | tuple[Any, ...] | tuple[()] | None], ...] | tuple[()]" [arg-type]
django-stubs-5.2.9/tests/typecheck/db/models/ 0000775 0000000 0000000 00000000000 15134010516 0021114 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/typecheck/db/models/test_fields_choices.yml 0000664 0000000 0000000 00000010371 15134010516 0025643 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]] | 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]] | 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 typing import TypeVar
from django.db import models
from typing_extensions import 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 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)
django-stubs-5.2.9/tests/typecheck/db/models/test_init.yml 0000664 0000000 0000000 00000002320 15134010516 0023636 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]
django-stubs-5.2.9/tests/typecheck/db/models/test_query.yml 0000664 0000000 0000000 00000005520 15134010516 0024045 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]"
b: QuerySet[User, int]
reveal_type(b) # N: Revealed type is "django.db.models.query.QuerySet[django.contrib.auth.models.User, builtins.int]"
c: ValuesQuerySet[User, int]
reveal_type(c) # N: Revealed type is "django.db.models.query.QuerySet[django.contrib.auth.models.User, builtins.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]
django-stubs-5.2.9/tests/typecheck/db/test_connection.yml 0000664 0000000 0000000 00000002027 15134010516 0023553 0 ustar 00root root 0000000 0000000 - case: raw_default_connection
main: |
from typing_extensions import reveal_type
from django.db import connection
with connection.cursor() as cursor:
reveal_type(cursor) # N: Revealed type is "django.db.backends.utils.CursorWrapper"
cursor.execute("SELECT %s", [123])
- case: raw_connection_psycopg2_composable
main: |
from django.db import connection
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])
- case: raw_connections
main: |
from typing_extensions import reveal_type
from django.db import connections
reveal_type(connections["test"]) # N: Revealed type is "django.db.backends.base.base.BaseDatabaseWrapper"
for connection in connections.all():
with connection.cursor() as cursor:
reveal_type(cursor) # N: Revealed type is "django.db.backends.utils.CursorWrapper"
django-stubs-5.2.9/tests/typecheck/db/test_transaction.yml 0000664 0000000 0000000 00000003025 15134010516 0023740 0 ustar 00root root 0000000 0000000 - case: atomic_bare
main: |
from typing_extensions import reveal_type
from django.db.transaction import atomic
@atomic
def func(x: int) -> list: ...
reveal_type(func) # N: Revealed type is "def (x: builtins.int) -> builtins.list[Any]"
- case: atomic_args
main: |
from typing_extensions import reveal_type
from django.db.transaction import atomic
@atomic(using='bla', savepoint=False)
def func(x: int) -> list: ...
reveal_type(func) # N: Revealed type is "def (x: builtins.int) -> builtins.list[Any]"
- case: non_atomic_requests_bare
main: |
from typing import Any
from typing_extensions import reveal_type
from django.db.transaction import non_atomic_requests
from django.http import HttpRequest, HttpResponse
@non_atomic_requests
def view_func(request: HttpRequest) -> HttpResponse: ...
reveal_type(view_func) # N: Revealed type is "def (request: django.http.request.HttpRequest) -> django.http.response.HttpResponse"
- case: non_atomic_requests_args
main: |
from typing_extensions import reveal_type
from django.http.request import HttpRequest
from django.http.response import HttpResponse
from django.db.transaction import non_atomic_requests
@non_atomic_requests
def view_func(request: HttpRequest, arg: str) -> HttpResponse: ...
reveal_type(view_func) # N: Revealed type is "def (request: django.http.request.HttpRequest, arg: builtins.str) -> django.http.response.HttpResponse"
django-stubs-5.2.9/tests/typecheck/fields/ 0000775 0000000 0000000 00000000000 15134010516 0020512 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/typecheck/fields/test_base.yml 0000664 0000000 0000000 00000021765 15134010516 0023221 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 "builtins.int"
reveal_type(user.small_int) # N: Revealed type is "builtins.int"
reveal_type(user.name) # N: Revealed type is "builtins.str"
reveal_type(user.slug) # N: Revealed type is "builtins.str"
reveal_type(user.text) # N: Revealed type is "builtins.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 "builtins.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 "builtins.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 "builtins.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 "builtins.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 "builtins.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[builtins.str | builtins.int | django.db.models.expressions.Combinable, builtins.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[builtins.int, builtins.int]]"
reveal_type(MyClass.myfield.field) # N: Revealed type is "django.db.models.fields.IntegerField[builtins.int, builtins.int]"
reveal_type(MyClass().myfield) # N: Revealed type is "django.db.models.fields.IntegerField[builtins.int, builtins.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 "builtins.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 "builtins.bytes | builtins.memoryview[builtins.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 "builtins.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 "builtins.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'),))
django-stubs-5.2.9/tests/typecheck/fields/test_custom_fields.yml 0000664 0000000 0000000 00000012623 15134010516 0025140 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 "builtins.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 "builtins.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 "builtins.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 "builtins.bool"
reveal_type(user.my_custom_field11) # N: Revealed type is "builtins.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 "builtins.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"
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, 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)
django-stubs-5.2.9/tests/typecheck/fields/test_generic_foreign_key.yml 0000664 0000000 0000000 00000003733 15134010516 0026277 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,), {})
django-stubs-5.2.9/tests/typecheck/fields/test_nullable.yml 0000664 0000000 0000000 00000010047 15134010516 0024074 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 "builtins.str"
reveal_type(MyModel().text_nullable) # N: Revealed type is "builtins.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 "builtins.list[builtins.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 "builtins.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)
django-stubs-5.2.9/tests/typecheck/fields/test_postgres_fields.yml 0000664 0000000 0000000 00000002643 15134010516 0025475 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 "builtins.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 "builtins.list[builtins.int]"
reveal_type(user.members_as_text) # N: Revealed type is "builtins.list[builtins.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))
django-stubs-5.2.9/tests/typecheck/fields/test_related.yml 0000664 0000000 0000000 00000232364 15134010516 0023726 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 "builtins.int"
reveal_type(book.owner_id) # N: Revealed type is "builtins.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 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 "builtins.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 "builtins.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 "builtins.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 "builtins.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: 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 "builtins.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 "builtins.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 | builtins.int, bulk: builtins.bool =)"
reveal_type(user.article_set.add) # N: Revealed type is "def (*objs: myapp.models.Article | builtins.int, bulk: builtins.bool =)"
reveal_type(user.book_set.filter) # N: Revealed type is "def (*args: Any, **kwargs: Any) -> myapp.models.LibraryEntityQuerySet"
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"
reveal_type(user.article_set.get()) # N: Revealed type is "myapp.models.Article"
reveal_type(user.book_set.queryset_method()) # N: Revealed type is "builtins.int"
reveal_type(user.article_set.queryset_method()) # N: Revealed type is "builtins.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:
pass
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 "builtins.int"
reveal_type(User().parent2) # N: Revealed type is "myapp.models.AbstractUser | None"
reveal_type(User().parent2_id) # N: Revealed type is "builtins.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, 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 "builtins.int"
reveal_type(Product.objects.queryset_method()) # N: Revealed type is "builtins.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 "builtins.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:
pass
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:
pass
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"
reveal_type(Store().purchases.filter()) # N: Revealed type is "myapp.models.querysets.PurchaseQuerySet"
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"
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"
reveal_type(User().purchases.filter()) # N: Revealed type is "myapp.models.querysets.PurchaseQuerySet"
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"
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 "builtins.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 import TypeVar
from typing_extensions import TypeAlias
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 "builtins.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: ...
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())
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
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 "builtins.int"
main:10: note: Revealed type is "myapp.models.MyModel"
main:13: note: Revealed type is "builtins.int"
main:14: note: Revealed type is "builtins.int"
main:15: note: Revealed type is "myapp.models.MyModel"
main:16: note: Revealed type is "builtins.int"
main:17: note: Revealed type is "myapp.models.Other"
main:18: note: Revealed type is "builtins.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 "builtins.str"
main:30: note: Revealed type is "builtins.str"
main:31: note: Revealed type is "def (*objs: myapp.models.MyModel | builtins.int, through_defaults: typing.Mapping[builtins.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.AutoField[django.db.models.expressions.Combinable | builtins.int | builtins.str | None, builtins.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.AutoField[django.db.models.expressions.Combinable | builtins.int | builtins.str | None, builtins.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.AutoField[django.db.models.expressions.Combinable | builtins.int | builtins.str, builtins.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_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[builtins.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': builtins.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[builtins.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': builtins.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[builtins.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': builtins.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[builtins.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': builtins.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: ...
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]"
django-stubs-5.2.9/tests/typecheck/forms/ 0000775 0000000 0000000 00000000000 15134010516 0020372 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/typecheck/forms/test_fields_choices.yml 0000664 0000000 0000000 00000005710 15134010516 0025122 0 ustar 00root root 0000000 0000000 - case: forms_choicefield_invalid_choices
main: |
from django import forms
class MyForm(forms.Form):
my_choice = forms.ChoiceField(choices='test')
out: |
main:4: error: Argument "choices" to "ChoiceField" 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]] | _ChoicesCallable" [arg-type]
main:4: note: "str" is missing following "_ChoicesCallable" protocol member:
main:4: note: __call__
- case: forms_choicefield_valid_choices
main: |
from collections.abc import Callable, Mapping, Sequence
from typing import TypeVar
from django import forms
from django.db import models
from typing_extensions import 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 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)
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)
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)())
django-stubs-5.2.9/tests/typecheck/http/ 0000775 0000000 0000000 00000000000 15134010516 0020223 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/typecheck/http/test_response.yml 0000664 0000000 0000000 00000000350 15134010516 0023641 0 ustar 00root root 0000000 0000000 - case: response_object_has_text_of_type_str
main: |
from typing_extensions import reveal_type
from django.http.response import HttpResponse
reveal_type(HttpResponse().text) # N: Revealed type is "builtins.str"
django-stubs-5.2.9/tests/typecheck/managers/ 0000775 0000000 0000000 00000000000 15134010516 0021041 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/typecheck/managers/querysets/ 0000775 0000000 0000000 00000000000 15134010516 0023105 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/typecheck/managers/querysets/test_annotate.yml 0000664 0000000 0000000 00000057305 15134010516 0026512 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: ...
# 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 "builtins.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_no_field_name
main: |
from typing_extensions import reveal_type
from myapp.models import User
from django.db.models import Count
qs = User.objects.annotate(Count('id'))
reveal_type(qs) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.User, 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):
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:
pass
# Make sure that the type is still checked when no annotation was produced
animals_only(annotated_user) # E: Argument 1 to "animals_only" has incompatible type "User"; 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 "builtins.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 "builtins.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, builtins.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 "builtins.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 "builtins.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_no_params = Blog.objects.annotate(foo=F('id')).values().get()
reveal_type(values_no_params) # N: Revealed type is "builtins.dict[builtins.str, Any]"
values_list_no_params = Blog.objects.annotate(foo=F('id')).values_list().get()
reveal_type(values_list_no_params) # N: Revealed type is "builtins.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 "builtins.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 "builtins.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): Should assume that we don't know what is in the row anymore (due to the annotation)
# Since we can't trust that only 'text' is in the row type anymore.
# It's possible to provide more precise types than than this, but without inspecting the
# arguments to .annotate, these are the best types we can infer.
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})], builtins.dict[builtins.str, 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})], builtins.tuple[Any, ...]]"
qs3 = Blog.objects.values_list('text', named=True).annotate(foo=F('id'))
# TODO: Would be nice to infer a NamedTuple which contains the field 'text' (str) + any number of other fields.
# The reason it would have to appear to have any other fields is that annotate could potentially be called with
# arbitrary parameters such that we wouldn't know how many extra fields there might be.
# But it's not trivial to make such a NamedTuple, partly because since it is also an ordinary tuple, it would
# have to have an arbitrary length, but still have certain fields at certain indices with specific types.
# For now, Any :)
reveal_type(qs3) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog@AnnotatedWith[TypedDict({'foo': Any})], 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})], builtins.str]"
before_values_no_params = Blog.objects.values().annotate(foo=F('id')).get()
reveal_type(before_values_no_params) # N: Revealed type is "builtins.dict[builtins.str, 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 "builtins.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 "builtins.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"
# TODO: Would be nice to infer builtins.str:
reveal_type(before_values_list_named_no_params.text) # 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):
num_posts = models.IntegerField()
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)
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:10: error: Cannot resolve keyword 'alias_wrong' into field. Choices are: entry, id, xyz, alias_entries [misc]
main:10: error: Cannot resolve keyword 'annotate_wrong' into field. Choices are: entry, id, xyz, alias_entries [misc]
main:12: error: Cannot resolve keyword 'xyz' into field. Choices are: entry, id [misc]
main:14: 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]
django-stubs-5.2.9/tests/typecheck/managers/querysets/test_as_manager.yml 0000664 0000000 0000000 00000055406 15134010516 0026776 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 "builtins.list[myapp.models.MyQuerySet[myapp.models.MyModel]]"
reveal_type(MyModel.objects.example_simple().just_int()) # N: Revealed type is "builtins.int"
reveal_type(MyModel.objects.example_dict()) # N: Revealed type is "builtins.dict[builtins.str, myapp.models.MyQuerySet[myapp.models.MyModel]]"
reveal_type(MyModelWithoutSelf.objects.method()) # N: Revealed type is "myapp.models.QuerySetWithoutSelf"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
from typing import ClassVar, TypeVar
from typing_extensions import Self
M = TypeVar("M", bound=models.Model, covariant=True)
class BaseQuerySet(models.QuerySet[M]):
def example_dict(self) -> dict[str, Self]: ...
class MyQuerySet(BaseQuerySet[M]):
def example_simple(self) -> Self: ...
def example_list(self) -> list[Self]: ...
def just_int(self) -> int: ...
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: 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 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 "builtins.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 "builtins.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"
reveal_type(MyModel.objects.all().custom_queryset_method()) # N: Revealed type is "myapp.models.ModelQuerySet"
reveal_type(MyModel.objects.returns_int_sequence()) # N: Revealed type is "typing.Sequence[builtins.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.ModelQuerySet2"
reveal_type(kls.objects.all().custom_queryset_method()) # N: Revealed type is "myapp.models.ModelQuerySet1 | myapp.models.ModelQuerySet2"
reveal_type(kls.objects.returns_thing()) # N: Revealed type is "builtins.int | builtins.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"
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"
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 | builtins.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 | builtins.list[myapp.models.MyOtherModel]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing import Generic, TypeVar
from django.db import models
from typing_extensions import Self
T = TypeVar("T", bound=models.Model)
T_2 = TypeVar("T_2", bound=models.Model)
class SomeMixin:
def example_mixin(self, a: T) -> T: ...
class OtherMixin(models.QuerySet[T]):
def example_other_mixin(self) -> T: ...
def example_union(self) -> T | list[T]: ...
class _MyModelQuerySet(OtherMixin[T], models.QuerySet[T], Generic[T]):
def example(self) -> T: ...
def override(self) -> T: ...
def override2(self) -> T: ...
def dummy_override(self) -> int: ...
def test_sub_self(self) -> Self: ...
class _MyModelQuerySet2(SomeMixin, _MyModelQuerySet[T_2]):
def example_2(self) -> T_2: ...
def override(self) -> T_2: ...
def override2(self) -> T_2: ...
def dummy_override(self) -> T_2: ... # type: ignore[override]
def test_self(self) -> Self: ...
class MyModelQuerySet(_MyModelQuerySet2["MyModel"]):
def override(self) -> "MyModel": ...
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 "builtins.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 "builtins.tuple[myapp.models.MyModel, ...]"
reveal_type(MyModel.objects.example_tuple_double()) # N: Revealed type is "tuple[builtins.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 "builtins.set[myapp.models.MyModel]"
reveal_type(MyModel.objects.example_dict()) # N: Revealed type is "builtins.dict[builtins.str, myapp.models.MyModel]"
reveal_type(MyModel.objects.example_list_dict()) # N: Revealed type is "builtins.list[builtins.dict[builtins.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 "builtins.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, 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: ...
def example_list(self) -> list[_CTE]: ...
def example_type(self) -> type[_CTE]: ...
def example_tuple_simple(self) -> tuple[_CTE]: ...
def example_tuple_list(self) -> tuple[_CTE, ...]: ...
def example_tuple_double(self) -> tuple[int, _CTE]: ...
def example_class(self) -> Example[_CTE]: ...
def example_type_class(self) -> type[Example[_CTE]]: ...
def example_collection(self) -> Collection[_CTE]: ...
def example_set(self) -> set[_CTE]: ...
def example_dict(self) -> dict[str, _CTE]: ...
def example_list_dict(self) -> list[dict[str, _CTE]]: ...
def example_t(self, a: T) -> T: ...
def example_arg(self, a: _CTE, b: str) -> _CTE: ...
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"
reveal_type(MyModel.objects_2.all()) # N: Revealed type is "myapp.models.ModelQuerySet"
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 "builtins.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`1]"
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
django-stubs-5.2.9/tests/typecheck/managers/querysets/test_basic_methods.yml 0000664 0000000 0000000 00000056647 15134010516 0027515 0 ustar 00root root 0000000 0000000 - case: queryset_basic_methods_return_type
main: |
from typing_extensions import reveal_type
from django.utils import timezone
from myapp.models import Blog
qs = Blog.objects.all()
reveal_type(qs) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog, myapp.models.Blog]"
reveal_type(qs.get(id=1)) # N: Revealed type is "myapp.models.Blog"
reveal_type(iter(qs)) # N: Revealed type is "typing.Iterator[myapp.models.Blog]"
reveal_type(qs.iterator()) # N: Revealed type is "typing.Iterator[myapp.models.Blog]"
reveal_type(qs.first()) # N: Revealed type is "myapp.models.Blog | None"
reveal_type(qs.earliest()) # N: Revealed type is "myapp.models.Blog"
reveal_type(qs[0]) # N: Revealed type is "myapp.models.Blog"
reveal_type(qs[:9]) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog, myapp.models.Blog]"
reveal_type(qs.create()) # N: Revealed type is "myapp.models.Blog"
reveal_type(qs.get_or_create()) # N: Revealed type is "tuple[myapp.models.Blog, builtins.bool]"
reveal_type(qs.exists()) # N: Revealed type is "builtins.bool"
reveal_type(qs.none()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog, myapp.models.Blog]"
reveal_type(qs.update_or_create()) # N: Revealed type is "tuple[myapp.models.Blog, builtins.bool]"
reveal_type(qs.explain()) # N: Revealed type is "builtins.str"
reveal_type(qs.raw(qs.explain())) # N: Revealed type is "django.db.models.query.RawQuerySet[myapp.models.Blog]"
reveal_type(qs.distinct()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog, myapp.models.Blog]"
reveal_type(qs.distinct("created_at")) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog, myapp.models.Blog]"
# .dates / .datetimes
reveal_type(Blog.objects.dates("created_at", "day")) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog, datetime.date]"
reveal_type(Blog.objects.datetimes("created_at", "day")) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog, datetime.datetime]"
# defer / only
reveal_type(qs.defer("created_at")) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog, myapp.models.Blog]"
reveal_type(qs.defer(None)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog, myapp.models.Blog]"
reveal_type(qs.only("created_at")) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog, myapp.models.Blog]"
qs.only(None) # E: Argument 1 to "only" of "QuerySet" has incompatible type "None"; expected "str" [arg-type]
# AND-ing QuerySets
reveal_type(Blog.objects.all() & Blog.objects.all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog, myapp.models.Blog]"
# bulk methods
reveal_type(qs.count()) # N: Revealed type is "builtins.int"
reveal_type(qs.update(created_at=timezone.now())) # N: Revealed type is "builtins.int"
reveal_type(qs.in_bulk()) # N: Revealed type is "builtins.dict[Any, myapp.models.Blog]"
reveal_type(qs.bulk_update(list(qs), fields=["created_at"])) # N: Revealed type is "builtins.int"
reveal_type(qs.bulk_create([])) # N: Revealed type is "builtins.list[myapp.models.Blog]"
reveal_type(qs.delete()) # N: Revealed type is "tuple[builtins.int, builtins.dict[builtins.str, builtins.int]]"
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()
- 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[builtins.str]]"
reveal_type(foos_list.intersection(bars_list)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, tuple[builtins.str]]"
reveal_type(foos_list.difference(bars_list)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, tuple[builtins.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': builtins.str})]"
reveal_type(foos_dict.intersection(bars_dict)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': builtins.str})]"
reveal_type(foos_dict.difference(bars_dict)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': builtins.str})]"
# `values()` QuerySet -- One field, different name, the first one takes precedence.
# cf https://docs.djangoproject.com/en/5.2/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': builtins.str})]"
reveal_type(foos_dict2.intersection(bars_dict2)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': builtins.str})]"
reveal_type(foos_dict2.difference(bars_dict2)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': builtins.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': builtins.str, 'id': builtins.int})]"
reveal_type(foos_dict3.intersection(bars_dict3)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': builtins.str, 'id': builtins.int})]"
reveal_type(foos_dict3.difference(bars_dict3)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': builtins.str, 'id': builtins.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': builtins.str, 'id': builtins.int})]"
reveal_type(foos_dict4.intersection(bars_list4)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': builtins.str, 'id': builtins.int})]"
reveal_type(foos_dict4.difference(bars_list4)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': builtins.str, 'id': builtins.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': builtins.str, 'id': builtins.int})]"
reveal_type(foos_dict5.intersection(bars_dict5)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': builtins.str, 'id': builtins.int})]"
reveal_type(foos_dict5.difference(bars_dict5)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': builtins.str, 'id': builtins.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)
django-stubs-5.2.9/tests/typecheck/managers/querysets/test_bulk_update.yml 0000664 0000000 0000000 00000026037 15134010516 0027176 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()" cannot be used with 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()" cannot be used with 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()" cannot be used with 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()" cannot be used with primary key fields. Got "id" [misc]
# Test with different models
authors = Author.objects.all()
Author.objects.bulk_update(authors, ["id"]) # E: "bulk_update()" cannot be used with 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()" cannot be used with 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()" cannot be used with primary key fields. Got "id" [misc]
# Mixed valid and invalid fields
await Article.objects.abulk_update(articles, ["id", "title"]) # E: "abulk_update()" cannot be used with 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()" cannot be used with 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()" cannot be used with 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)
django-stubs-5.2.9/tests/typecheck/managers/querysets/test_filter.yml 0000664 0000000 0000000 00000034073 15134010516 0026163 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
User.objects.filter(username__contains='hello')
User.objects.filter(age__gt=1)
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
blog = Blog()
publisher = Publisher()
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]
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: 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')
# 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()
django-stubs-5.2.9/tests/typecheck/managers/querysets/test_from_queryset.yml 0000664 0000000 0000000 00000135437 15134010516 0027610 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 "builtins.list[myapp.models.MyQuerySet[myapp.models.MyModel]]"
reveal_type(MyModel.objects.example_simple().just_int()) # N: Revealed type is "builtins.int"
reveal_type(MyModel.objects.example_dict()) # N: Revealed type is "builtins.dict[builtins.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"
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 import TypeVar
from typing_extensions import Self
M = TypeVar("M", covariant=True, bound=models.Model)
class CustomManager(Manager[M]):
def test_custom_manager(self) -> Self: ...
class BaseQuerySet(models.QuerySet[M]):
def example_dict(self) -> dict[str, Self]: ...
class MyQuerySet(BaseQuerySet[M]):
def example_simple(self) -> Self: ...
def example_list(self) -> list[Self]: ...
def just_int(self) -> int: ...
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 "builtins.str"
reveal_type(MyModel.objects.filter(id=1).queryset_method()) # N: Revealed type is "builtins.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 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"
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 "builtins.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"
reveal_type(MyModel.objects.filter(id=1)) # N: Revealed type is "myapp.querysets.ModelQuerySet"
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 TypeVar, TYPE_CHECKING
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: ...
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 TypeVar, TYPE_CHECKING
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: ...
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"
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 "builtins.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"
reveal_type(MyModel.objects.filter(id=1)) # N: Revealed type is "myapp.querysets.ModelQuerySet"
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`1]"
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 "builtins.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.ModelQuerySet2"
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 "builtins.int | builtins.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 "builtins.int"
reveal_type(MyModel.objects.manager_and_queryset_method()) # N: Revealed type is "builtins.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 "builtins.int"
reveal_type(MyModel.objects.manager_and_queryset_method()) # N: Revealed type is "builtins.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 "builtins.int"
reveal_type(OtherModel.objects.manager_and_queryset_method()) # N: Revealed type is "builtins.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 "builtins.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: builtins.str | None =) -> builtins.str | None"
reveal_type(MyModel().objects.queryset_method('str')) # N: Revealed type is "builtins.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: builtins.int | builtins.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 "builtins.str"
reveal_type(MyModel.objects.queryset_method_2()) # N: Revealed type is "builtins.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_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 "builtins.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 "builtins.int"
reveal_type(MyModel.objects.overloaded_method('a')) # N: Revealed type is "builtins.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: ...
@overload
def overloaded_method(self, arg: str) -> str: ...
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"
reveal_type(MyModel.objects.custom) # N: Revealed type is "def () -> myapp.models.MyQuerySet"
reveal_type(MyModel.objects.all().filter) # N: Revealed type is "def (*args: Any, **kwargs: Any) -> myapp.models.MyQuerySet"
reveal_type(MyModel.objects.custom().filter) # N: Revealed type is "def (*args: Any, **kwargs: Any) -> myapp.models.MyQuerySet"
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":
pass
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"
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":
pass
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"
reveal_type(MyModel.objects.all) # N: Revealed type is "def () -> myapp.models.MyQuerySet"
reveal_type(MyModel.objects.annotate) # N: Revealed type is "def (*args: Any, **kwargs: Any) -> myapp.models.MyQuerySet"
reveal_type(MyModel.objects.complex_filter) # N: Revealed type is "def (filter_obj: Any) -> myapp.models.MyQuerySet"
reveal_type(MyModel.objects.defer) # N: Revealed type is "Overload(def (None) -> myapp.models.MyQuerySet, def (*fields: builtins.str) -> myapp.models.MyQuerySet)"
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"
reveal_type(MyModel.objects.distinct) # N: Revealed type is "def (*field_names: builtins.str) -> myapp.models.MyQuerySet"
reveal_type(MyModel.objects.exclude) # N: Revealed type is "def (*args: Any, **kwargs: Any) -> myapp.models.MyQuerySet"
reveal_type(MyModel.objects.extra) # N: Revealed type is "def (select: builtins.dict[builtins.str, Any] | None =, where: typing.Sequence[builtins.str] | None =, params: typing.Sequence[Any] | None =, tables: typing.Sequence[builtins.str] | None =, order_by: typing.Sequence[builtins.str | django.db.models.expressions.Combinable] | None =, select_params: typing.Sequence[Any] | None =) -> myapp.models.MyQuerySet"
reveal_type(MyModel.objects.filter) # N: Revealed type is "def (*args: Any, **kwargs: Any) -> myapp.models.MyQuerySet"
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"
reveal_type(MyModel.objects.none) # N: Revealed type is "def () -> myapp.models.MyQuerySet"
reveal_type(MyModel.objects.only) # N: Revealed type is "def (*fields: builtins.str) -> myapp.models.MyQuerySet"
reveal_type(MyModel.objects.order_by) # N: Revealed type is "def (*field_names: builtins.str | django.db.models.expressions.Combinable) -> myapp.models.MyQuerySet"
reveal_type(MyModel.objects.prefetch_related) # N: Revealed type is "Overload(def (None) -> myapp.models.MyQuerySet, def (*lookups: builtins.str | django.db.models.query.Prefetch[_LookupT`-1, _PrefetchedQuerySetT`-2 = django.db.models.query.QuerySet[django.db.models.base.Model, django.db.models.base.Model], _ToAttrT`-3 = builtins.str]) -> myapp.models.MyQuerySet)"
reveal_type(MyModel.objects.reverse) # N: Revealed type is "def () -> myapp.models.MyQuerySet"
reveal_type(MyModel.objects.select_for_update) # N: Revealed type is "def (nowait: builtins.bool =, skip_locked: builtins.bool =, of: typing.Sequence[builtins.str] =, no_key: builtins.bool =) -> myapp.models.MyQuerySet"
reveal_type(MyModel.objects.select_related) # N: Revealed type is "Overload(def (None) -> myapp.models.MyQuerySet, def (*fields: builtins.str) -> myapp.models.MyQuerySet)"
reveal_type(MyModel.objects.union) # N: Revealed type is "def (*other_qs: django.db.models.query.QuerySet[django.db.models.base.Model, Any], all: builtins.bool =) -> myapp.models.MyQuerySet"
reveal_type(MyModel.objects.using) # N: Revealed type is "def (alias: builtins.str | None) -> myapp.models.MyQuerySet"
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`1]"
reveal_type(SecondManager) # N: Revealed type is "def [_T <: django.db.models.base.Model] () -> myapp.models.ManagerFromModelQuerySet[_T`1]"
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 "builtins.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`1]"
reveal_type(NoneAsKwarg) # N: Revealed type is "def [_T <: django.db.models.base.Model] () -> myapp.models.ManagerFromModelQuerySet[_T`1]"
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`1]"
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 "builtins.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 "builtins.int"
reveal_type(Concrete.objects.manager_meth()) # N: Revealed type is "builtins.str"
mypy_config: |
[mypy.plugins.django-stubs]
django_settings_module = myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing import TypeVar, ClassVar
from typing_extensions import Self
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, TypeVar
from typing_extensions import TypeAlias, 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, QS2]"; 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"
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 "builtins.str"
mypy_config: |
[mypy.plugins.django-stubs]
django_settings_module = myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing 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
django-stubs-5.2.9/tests/typecheck/managers/querysets/test_iteration.yml 0000664 0000000 0000000 00000001775 15134010516 0026677 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
django-stubs-5.2.9/tests/typecheck/managers/querysets/test_prefetch_related.yml 0000664 0000000 0000000 00000077440 15134010516 0030203 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], builtins.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], builtins.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': builtins.list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': builtins.list[myapp.models.Tag]})]]"
reveal_type(article_qs.get().every_tags) # N: Revealed type is "builtins.list[myapp.models.Tag]"
reveal_type(
Tag.objects.all().prefetch_related( # N: Revealed type is "builtins.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 "builtins.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 "builtins.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': builtins.list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': builtins.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': builtins.list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': builtins.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': builtins.list[myapp.models.Tag], 'ts2': builtins.list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'ts': builtins.list[myapp.models.Tag], 'ts2': builtins.list[myapp.models.Tag]})]]"
reveal_type(multi_qs.get().ts) # N: Revealed type is "builtins.list[myapp.models.Tag]"
reveal_type(multi_qs.get().ts2) # N: Revealed type is "builtins.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': builtins.list[myapp.models.Article]})], myapp.models.Article@AnnotatedWith[TypedDict({'arts3': builtins.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': builtins.list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': builtins.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': builtins.list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': builtins.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': builtins.list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': builtins.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': builtins.list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': builtins.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': builtins.list[myapp.models.Tag], 'arts2': builtins.list[myapp.models.Article]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': builtins.list[myapp.models.Tag], 'arts2': builtins.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 "builtins.list[myapp.models.Tag]"
# Prefetch with annotated `queryset`
reveal_type(Article.objects.prefetch_related( # N: Revealed type is "builtins.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': builtins.list[myapp.models.Tag@AnnotatedWith[TypedDict('main.MyDict', {'foo': builtins.str})]]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': builtins.list[myapp.models.Tag@AnnotatedWith[TypedDict('main.MyDict', {'foo': builtins.str})]]})]]"
reveal_type(Article.objects.prefetch_related(get_prefetch_with_annotations()).get().every_tags[0].foo) # N: Revealed type is "builtins.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': builtins.list[myapp.models.Tag], 'every_tags2': builtins.list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': builtins.list[myapp.models.Tag], 'every_tags2': builtins.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': builtins.list[myapp.models.Tag], 'every_tags': builtins.list[myapp.models.Tag], 'every_tags2': builtins.list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags3': builtins.list[myapp.models.Tag], 'every_tags': builtins.list[myapp.models.Tag], 'every_tags2': builtins.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': builtins.list[myapp.models.Tag], 'every_tags2': builtins.list[myapp.models.Tag], 'every_tags3': builtins.list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': builtins.list[myapp.models.Tag], 'every_tags2': builtins.list[myapp.models.Tag], 'every_tags3': builtins.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': builtins.list[myapp.models.Tag], 'every_tags': builtins.list[myapp.models.Tag], 'every_tags2': builtins.list[myapp.models.Tag], 'every_tags3': builtins.list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags4': builtins.list[myapp.models.Tag], 'every_tags': builtins.list[myapp.models.Tag], 'every_tags2': builtins.list[myapp.models.Tag], 'every_tags3': builtins.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': builtins.list[myapp.models.Tag], 'every_tags2': builtins.list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': builtins.list[myapp.models.Tag], 'every_tags2': builtins.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 "builtins.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': builtins.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_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: ...
def my_method(self) -> int: ...
@staticmethod
def my_staticmethod() -> int: ...
@classmethod
def my_classmethod(cls) -> int: ...
- 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': builtins.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
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'], builtins.list[django.db.models.query.QuerySet[django.db.models.base.Model, django.db.models.base.Model]], builtins.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': builtins.list[Any]})], myapp.models.TaggedItem@AnnotatedWith[TypedDict({'prefetched_object': builtins.list[Any]})]]"
reveal_type(qs_with_attr.get().prefetched_object) # N: Revealed type is "builtins.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 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'], builtins.list[django.db.models.query.QuerySet[django.db.models.base.Model, django.db.models.base.Model]], builtins.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)
django-stubs-5.2.9/tests/typecheck/managers/querysets/test_querysetany.yml 0000664 0000000 0000000 00000002774 15134010516 0027272 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
django-stubs-5.2.9/tests/typecheck/managers/querysets/test_select_related.yml 0000664 0000000 0000000 00000014704 15134010516 0027654 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)
django-stubs-5.2.9/tests/typecheck/managers/querysets/test_union_type.yml 0000664 0000000 0000000 00000002474 15134010516 0027067 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"
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:
pass
UserManager = models.Manager.from_queryset(MyQuerySet)
class User(models.Model):
objects = UserManager()
OrderManager = models.Manager.from_queryset(MyQuerySet)
class Order(models.Model):
objects = OrderManager()
django-stubs-5.2.9/tests/typecheck/managers/querysets/test_values.yml 0000664 0000000 0000000 00000022775 15134010516 0026203 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': builtins.int, 'text': builtins.str})"
reveal_type(values["num_posts"]) # N: Revealed type is "builtins.int"
reveal_type(values["text"]) # N: Revealed type is "builtins.str"
values_pk = Blog.objects.values('pk').get()
reveal_type(values_pk) # N: Revealed type is "TypedDict({'pk': builtins.int})"
reveal_type(values_pk["pk"]) # N: Revealed type is "builtins.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': builtins.int, 'num_posts': builtins.int, 'text': builtins.str})"
reveal_type(all_values_dict["id"]) # N: Revealed type is "builtins.int"
reveal_type(all_values_dict["num_posts"]) # N: Revealed type is "builtins.int"
reveal_type(all_values_dict["text"]) # N: Revealed type is "builtins.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': builtins.int})"
reveal_type(values1['publisher']) # N: Revealed type is "builtins.int"
values2 = Blog.objects.values('publisher_id').get()
reveal_type(values2) # N: Revealed type is "TypedDict({'publisher_id': builtins.int})"
reveal_type(values2["publisher_id"]) # N: Revealed type is "builtins.int"
# all values return _id version
all_values = Blog.objects.values().get()
reveal_type(all_values) # N: Revealed type is "TypedDict({'id': builtins.int, 'publisher_id': builtins.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': builtins.int, 'blog__publisher__name': builtins.str})"
pk_values = Entry.objects.values('blog__pk', 'blog__publisher__pk').get()
reveal_type(pk_values) # N: Revealed type is "TypedDict({'blog__pk': builtins.int, 'blog__publisher__pk': builtins.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': builtins.int, 'blog__name': builtins.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': builtins.int})]"
reveal_type(Author.objects.values('books')) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Author, TypedDict({'books': builtins.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': builtins.str})"
reveal_type(values["text"]) # N: Revealed type is "builtins.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': builtins.int})]"
main:7: note: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog, TypedDict({'id': builtins.int, 'num_posts': builtins.int, 'text': builtins.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': builtins.int, 'foo': Any})]"
main:10: note: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog, TypedDict({'id': builtins.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)
django-stubs-5.2.9/tests/typecheck/managers/querysets/test_values_list.yml 0000664 0000000 0000000 00000040761 15134010516 0027231 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[builtins.str]"
reveal_type(MyUser.objects.values_list('id', 'name').get()) # N: Revealed type is "tuple[builtins.int, builtins.str]"
values_tuple = MyUser.objects.values_list('name', 'age').get()
reveal_type(values_tuple[0]) # N: Revealed type is "builtins.str"
reveal_type(values_tuple[1]) # N: Revealed type is "builtins.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[builtins.int, builtins.str, builtins.int]"
# pk as field
pk_values = MyUser.objects.values_list('pk').get()
reveal_type(pk_values) # N: # N: Revealed type is "tuple[builtins.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[builtins.str, builtins.int, builtins.str]"
reveal_type(values_tuple[0]) # N: Revealed type is "builtins.str"
reveal_type(values_tuple[1]) # N: Revealed type is "builtins.int"
reveal_type(values_tuple[2]) # N: Revealed type is "builtins.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 "builtins.list[tuple[builtins.int, builtins.dict[builtins.str, builtins.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[builtins.str]"
reveal_type(query.distinct("name").get()) # N: Revealed type is "tuple[builtins.str]"
reveal_type(query.distinct().get()) # N: Revealed type is "tuple[builtins.str]"
reveal_type(query.all().get()) # N: Revealed type is "tuple[builtins.str]"
reveal_type(query.filter(age__gt=16).get()) # N: Revealed type is "tuple[builtins.str]"
reveal_type(query.exclude(age__lte=16).get()) # N: Revealed type is "tuple[builtins.str]"
reveal_type(query.annotate(name_length=Length("name")).get()) # N: Revealed type is "builtins.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 "builtins.int"
reveal_type(values_tuple[1]) # N: Revealed type is "builtins.int"
reveal_type(values_tuple[2]) # N: Revealed type is "builtins.int"
reveal_type(values_tuple[3]) # N: Revealed type is "builtins.str"
reverse_fields_list = Blog.objects.values_list('post__text').get()
reveal_type(reverse_fields_list) # N: Revealed type is "tuple[builtins.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 "builtins.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 "builtins.int"
reveal_type(MyUser2.objects.values_list(flat=True)[0]) # N: Revealed type is "builtins.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[builtins.str, builtins.int, fallback=main.Row]"
reveal_type(values_named_tuple.name) # N: Revealed type is "builtins.str"
reveal_type(values_named_tuple.age) # N: Revealed type is "builtins.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 "builtins.int"
reveal_type(all_values_named_tuple.name) # N: Revealed type is "builtins.str"
reveal_type(all_values_named_tuple.age) # N: Revealed type is "builtins.int"
reveal_type(all_values_named_tuple.is_admin) # N: Revealed type is "builtins.bool"
# pk as field
pk_values = MyUser.objects.values_list('pk', named=True).get()
reveal_type(pk_values) # N: Revealed type is "tuple[builtins.int, fallback=main.Row2]"
reveal_type(pk_values.pk) # N: # N: Revealed type is "builtins.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[builtins.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 "builtins.int"
reveal_type(values.blog__publisher__name) # N: Revealed type is "builtins.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 "builtins.int"
reveal_type(pk_values.blog__publisher__pk) # N: Revealed type is "builtins.int"
# reverse relation
reverse_values = Blog.objects.values_list('entry__text', named=True).get()
reveal_type(reverse_values.entry__text) # N: Revealed type is "builtins.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, builtins.int]"
reveal_type(Blog.objects.values_list('publisher', flat=True)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog, builtins.int]"
reveal_type(Blog.objects.values_list('publisher_id', flat=True)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog, builtins.int]"
# is Iterable[int]
reveal_type(list(Blog.objects.values_list('id', flat=True))) # N: Revealed type is "builtins.list[builtins.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"
reveal_type(TransactionQuerySet().values()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Transaction, TypedDict({'id': builtins.int, 'total': builtins.int})]"
reveal_type(TransactionQuerySet().values_list()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Transaction, tuple[builtins.int, builtins.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[builtins.int]]"
reveal_type(Author.objects.values_list('books')) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Author, tuple[builtins.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[builtins.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[builtins.int, builtins.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()
django-stubs-5.2.9/tests/typecheck/managers/test_managers.yml 0000664 0000000 0000000 00000115601 15134010516 0024424 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: test_model_objects_attribute_present_in_case_of_model_cls_passed_as_generic_parameter
main: |
from typing_extensions import reveal_type
from myapp.models import Base, MyModel
base_instance = Base(MyModel)
reveal_type(base_instance.model_cls._default_manager) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.MyModel]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing import Generic, TypeVar
from typing_extensions import reveal_type
from django.db import models
_T = TypeVar('_T', bound=models.Model)
class Base(Generic[_T]):
def __init__(self, model_cls: type[_T]) -> None:
self.model_cls = model_cls
reveal_type(self.model_cls._default_manager) # N: Revealed type is "django.db.models.manager.Manager[_T`1]"
class MyModel(models.Model):
pass
class Child(Base[MyModel]):
def method(self) -> None:
reveal_type(self.model_cls._default_manager) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.MyModel]"
- case: test_base_manager_called_on_model_cls_as_generic_parameter
main: |
from typing_extensions import reveal_type
from myapp.models import Base, MyModel
base_instance = Base(MyModel)
reveal_type(base_instance.model_cls._base_manager) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.MyModel]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing import Generic, TypeVar
from typing_extensions import reveal_type
from django.db import models
_T = TypeVar('_T', bound=models.Model)
class Base(Generic[_T]):
def __init__(self, model_cls: type[_T]) -> None:
self.model_cls = model_cls
reveal_type(self.model_cls._base_manager) # N: Revealed type is "django.db.models.manager.Manager[_T`1]"
class MyModel(models.Model):
pass
class Child(Base[MyModel]):
def method(self) -> None:
reveal_type(self.model_cls._base_manager) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.MyModel]"
- 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 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 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':
pass
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, 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 "builtins.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 "builtins.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:
pass
def get_instance_untyped(self, name: str): # type: ignore[no-untyped-def]
pass
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) -> builtins.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: override_manager_create1
main: |
from myapp.models import MyModel
installed_apps:
- myapp
out: |
myapp/models:5: error: Return type "MyModel" of "create" incompatible with return type "_T" in supertype "django.db.models.manager.Manager" [override]
myapp/models:6: error: Incompatible return value type (got "_T", expected "MyModel") [return-value]
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing import Any
from django.db import models
class MyModelManager(models.Manager):
def create(self, **kwargs: Any) -> 'MyModel':
return super().create(**kwargs)
class MyModel(models.Model):
objects = MyModelManager()
- case: override_manager_create2
main: |
from myapp.models import MyModel
MyModel.objects.create()
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing import Any
from django.db import models
class MyModelManager(models.Manager['MyModel']):
def create(self, **kwargs: Any) -> 'MyModel':
return super().create(**kwargs)
class MyModel(models.Model):
objects = MyModelManager()
- 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 "builtins.list[myapp.models.Booking]"
myapp/models:61: note: Revealed type is "builtins.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, TypeVar
from typing_extensions import Self
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:9: error: Missing type parameters for generic type "MyManager" [type-arg]
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing import ClassVar, 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:
pass
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"
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"
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
django-stubs-5.2.9/tests/typecheck/models/ 0000775 0000000 0000000 00000000000 15134010516 0020527 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/typecheck/models/test_abstract.yml 0000664 0000000 0000000 00000017432 15134010516 0024123 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" and "MultipleObjectsReturned" [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, TypeVar, overload
Abstract() # E: Cannot instantiate abstract class "Abstract" with abstract attributes "DoesNotExist" and "MultipleObjectsReturned" [abstract]
LiteralAbstract() # E: Cannot instantiate abstract class "LiteralAbstract" with abstract attributes "DoesNotExist" and "MultipleObjectsReturned" [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" and "MultipleObjectsReturned" [abstract]
ExplicitConcrete()
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing import Protocol, TypeVar
from typing_extensions import 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`-1]"
return klass._default_manager.create(name=name)
django-stubs-5.2.9/tests/typecheck/models/test_contrib_models.yml 0000664 0000000 0000000 00000021765 15134010516 0025327 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 "builtins.str"
reveal_type(User().password) # N: Revealed type is "builtins.str"
reveal_type(User().first_name) # N: Revealed type is "builtins.str"
reveal_type(User().last_name) # N: Revealed type is "builtins.str"
reveal_type(User().email) # N: Revealed type is "builtins.str"
reveal_type(User().is_staff) # N: Revealed type is "builtins.bool"
reveal_type(User().is_active) # N: Revealed type is "builtins.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 "builtins.str"
reveal_type(Permission().codename) # N: Revealed type is "builtins.str"
from django.contrib.auth.models import PermissionsMixin
p: type[PermissionsMixin]
reveal_type(p().is_superuser) # N: Revealed type is "builtins.bool"
from django.contrib.auth.models import Group
reveal_type(Group().name) # N: Revealed type is "builtins.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'
django-stubs-5.2.9/tests/typecheck/models/test_create.yml 0000664 0000000 0000000 00000017504 15134010516 0023563 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 "builtins.int"
reveal_type(c.name) # N: Revealed type is "builtins.str"
reveal_type(c.lastname) # N: Revealed type is "builtins.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
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 "Combinable | int | str") [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 "builtins.int"
first = MyModel.objects.create(id=None)
reveal_type(first.id) # N: Revealed type is "builtins.int"
first = MyModel()
first.id = None
reveal_type(first.id) # N: Revealed type is "builtins.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 "builtins.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 "builtins.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
django-stubs-5.2.9/tests/typecheck/models/test_extra_methods.yml 0000664 0000000 0000000 00000005310 15134010516 0025156 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 "builtins.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)
django-stubs-5.2.9/tests/typecheck/models/test_indexes.yml 0000664 0000000 0000000 00000000726 15134010516 0023755 0 ustar 00root root 0000000 0000000 - case: model_index
main: |
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"])
django-stubs-5.2.9/tests/typecheck/models/test_inheritance.yml 0000664 0000000 0000000 00000012455 15134010516 0024611 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:
pass
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
pass
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 "builtins.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
pass
- 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 "builtins.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 "builtins.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, TypeVar
from typing_extensions import Self
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
django-stubs-5.2.9/tests/typecheck/models/test_init.yml 0000664 0000000 0000000 00000032513 15134010516 0023260 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:
pass
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
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 "Combinable | int | str") [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 "builtins.int"
main:5: note: Revealed type is "builtins.int"
main:6: note: Revealed type is "builtins.list[builtins.int]"
main:7: note: Revealed type is "builtins.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
django-stubs-5.2.9/tests/typecheck/models/test_meta_options.yml 0000664 0000000 0000000 00000024170 15134010516 0025016 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[builtins.str | builtins.int | django.db.models.expressions.Combinable, builtins.str]"
reveal_type(MyUser.base_name.field) # N: Revealed type is "django.db.models.fields.CharField[builtins.str | builtins.int | django.db.models.expressions.Combinable, builtins.str]"
reveal_type(MyUser._meta.get_field('name')) # N: Revealed type is "django.db.models.fields.CharField[builtins.str | builtins.int | django.db.models.expressions.Combinable, builtins.str]"
reveal_type(MyUser.name.field) # N: Revealed type is "django.db.models.fields.CharField[builtins.str | builtins.int | django.db.models.expressions.Combinable, builtins.str]"
reveal_type(MyUser._meta.get_field('age')) # N: Revealed type is "django.db.models.fields.IntegerField[builtins.float | builtins.int | builtins.str | django.db.models.expressions.Combinable, builtins.int]"
reveal_type(MyUser.age.field) # N: Revealed type is "django.db.models.fields.IntegerField[builtins.float | builtins.int | builtins.str | django.db.models.expressions.Combinable, builtins.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[builtins.float | builtins.int | builtins.str] | django.db.models.expressions.Combinable, builtins.list[builtins.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 | django.contrib.contenttypes.fields.GenericForeignKey"
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_fk_with_related_query_name
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]"
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")
- 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" and "MultipleObjectsReturned" [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()
django-stubs-5.2.9/tests/typecheck/models/test_metaclass.yml 0000664 0000000 0000000 00000024007 15134010516 0024270 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.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: builtins.object) -> myapp.models.Concrete1.DoesNotExist"
reveal_type(Concrete2.DoesNotExist) # N: Revealed type is "def (*args: builtins.object) -> myapp.models.Concrete2.DoesNotExist"
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: builtins.object) -> myapp.models.Concrete1.MultipleObjectsReturned"
reveal_type(Concrete2.MultipleObjectsReturned) # N: Revealed type is "def (*args: builtins.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"
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.MultipleObjectsReturned]
d = Concrete1.MultipleObjectsReturned
d = Concrete2.MultipleObjectsReturned
d = Concrete3.MultipleObjectsReturned
e: type[Concrete2.MultipleObjectsReturned]
e = Concrete1.MultipleObjectsReturned # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete1.MultipleObjectsReturned]", variable has type "type[myapp.models.Concrete2.MultipleObjectsReturned]") [assignment]
e = Concrete2.MultipleObjectsReturned
e = Concrete3.MultipleObjectsReturned
f: type[Concrete3.MultipleObjectsReturned]
f = Concrete1.MultipleObjectsReturned # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete1.MultipleObjectsReturned]", variable has type "type[myapp.models.Concrete3.MultipleObjectsReturned]") [assignment]
f = Concrete2.MultipleObjectsReturned # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete2.MultipleObjectsReturned]", variable has type "type[myapp.models.Concrete3.MultipleObjectsReturned]") [assignment]
f = 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.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: builtins.object) -> myapp.models.Concrete1.DoesNotExist"
reveal_type(Concrete2.DoesNotExist) # N: Revealed type is "def (*args: builtins.object) -> myapp.models.Concrete2.DoesNotExist"
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: builtins.object) -> myapp.models.Concrete1.MultipleObjectsReturned"
reveal_type(Concrete2.MultipleObjectsReturned) # N: Revealed type is "def (*args: builtins.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"
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.MultipleObjectsReturned]
d = Concrete1.MultipleObjectsReturned
d = Concrete2.MultipleObjectsReturned
d = Concrete3.MultipleObjectsReturned
e: type[Concrete2.MultipleObjectsReturned]
e = Concrete1.MultipleObjectsReturned # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete1.MultipleObjectsReturned]", variable has type "type[myapp.models.Concrete2.MultipleObjectsReturned]") [assignment]
e = Concrete2.MultipleObjectsReturned
e = Concrete3.MultipleObjectsReturned
f: type[Concrete3.MultipleObjectsReturned]
f = Concrete1.MultipleObjectsReturned # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete1.MultipleObjectsReturned]", variable has type "type[myapp.models.Concrete3.MultipleObjectsReturned]") [assignment]
f = Concrete2.MultipleObjectsReturned # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete2.MultipleObjectsReturned]", variable has type "type[myapp.models.Concrete3.MultipleObjectsReturned]") [assignment]
f = 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)
django-stubs-5.2.9/tests/typecheck/models/test_primary_key.yml 0000664 0000000 0000000 00000005430 15134010516 0024646 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 "builtins.int"
reveal_type(x.pk) # N: Revealed type is "builtins.int"
MyModel.objects.get(pk=1)
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 MyModel(models.Model):
def __str__(self) -> str:
reveal_type(self.id) # N: Revealed type is "builtins.int"
reveal_type(self.pk) # N: Revealed type is "builtins.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 "builtins.str"
reveal_type(x.pk) # N: Revealed type is "builtins.str"
MyModel.objects.get(pk='a')
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 MyModel(models.Model):
id = models.CharField(max_length=10, primary_key=True)
def __str__(self) -> str:
reveal_type(self.id) # N: Revealed type is "builtins.str"
reveal_type(self.pk) # N: Revealed type is "builtins.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 "builtins.str"
reveal_type(x.pk) # N: Revealed type is "builtins.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 reveal_type
from django.db import models
class MyModel(models.Model):
primary = models.CharField(max_length=10, primary_key=True)
def __str__(self) -> str:
reveal_type(self.primary) # N: Revealed type is "builtins.str"
reveal_type(self.pk) # N: Revealed type is "builtins.str"
self.id # E: "MyModel" has no attribute "id" [attr-defined]
return self.primary
django-stubs-5.2.9/tests/typecheck/models/test_proxy_models.yml 0000664 0000000 0000000 00000001762 15134010516 0025043 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)
django-stubs-5.2.9/tests/typecheck/models/test_related_fields.yml 0000664 0000000 0000000 00000016101 15134010516 0025256 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
expect_fail: True
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)
django-stubs-5.2.9/tests/typecheck/models/test_state.yml 0000664 0000000 0000000 00000001017 15134010516 0023430 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
django-stubs-5.2.9/tests/typecheck/template/ 0000775 0000000 0000000 00000000000 15134010516 0021057 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/typecheck/template/test_library.yml 0000664 0000000 0000000 00000011551 15134010516 0024310 0 ustar 00root root 0000000 0000000 - case: register_filter_unnamed
main: |
from typing_extensions import reveal_type
from django import template
register = template.Library()
@register.filter
def lower(value: str) -> str:
return value.lower()
reveal_type(lower) # N: Revealed type is "def (value: builtins.str) -> builtins.str"
- case: register_filter_named
main: |
from typing_extensions import reveal_type
from django import template
register = template.Library()
@register.filter(name="tolower")
def lower(value: str) -> str:
return value.lower()
reveal_type(lower) # N: Revealed type is "def (value: builtins.str) -> builtins.str"
- case: register_simple_tag_no_args
main: |
from typing_extensions import reveal_type
import datetime
from django import template
register = template.Library()
@register.simple_tag
def current_time(format_string: str) -> str:
return datetime.datetime.now().strftime(format_string)
reveal_type(current_time) # N: Revealed type is "def (format_string: builtins.str) -> builtins.str"
- case: register_simple_tag_context
main: |
from typing_extensions import reveal_type
from django import template
from typing import Any
register = template.Library()
@register.simple_tag(takes_context=True)
def current_time(context: dict[str, Any], format_string: str) -> str:
timezone = context['timezone']
return "test"
reveal_type(current_time) # N: Revealed type is "def (context: builtins.dict[builtins.str, Any], format_string: builtins.str) -> builtins.str"
- case: register_simple_tag_named
main: |
from typing_extensions import reveal_type
from django import template
register = template.Library()
@register.simple_tag(name='minustwo')
def some_function(value: int) -> int:
return value - 2
reveal_type(some_function) # N: Revealed type is "def (value: builtins.int) -> builtins.int"
- case: register_simple_tag_via_call
main: |
from typing_extensions import reveal_type
from django import template
register = template.Library()
def f(s: str) -> str:
return s * 2
reveal_type(register.simple_tag(f, name='double')) # N: Revealed type is "def (s: builtins.str) -> builtins.str"
- case: register_simple_block_tag
main: |
from typing_extensions import reveal_type
import datetime
from django import template
register = template.Library()
def f(s: str) -> str:
return s * 2
reveal_type(register.simple_block_tag(f, name='double')) # N: Revealed type is "def (s: builtins.str) -> builtins.str"
@register.simple_block_tag
def current_time(format_string: str) -> str:
return datetime.datetime.now().strftime(format_string)
reveal_type(current_time) # N: Revealed type is "def (format_string: builtins.str) -> builtins.str"
@register.simple_block_tag(name='minustwo')
def some_function(value: int) -> int:
return value - 2
reveal_type(some_function) # N: Revealed type is "def (value: builtins.int) -> builtins.int"
- case: register_tag_no_args
main: |
from typing_extensions import reveal_type
from django import template
from django.template.base import Parser, Token
from django.template.defaulttags import CycleNode
register = template.Library()
@register.tag
def cycle(parser: Parser, token: Token) -> CycleNode:
return CycleNode([])
reveal_type(cycle) # N: Revealed type is "def (parser: django.template.base.Parser, token: django.template.base.Token) -> django.template.defaulttags.CycleNode"
- case: register_tag_named
main: |
from typing_extensions import reveal_type
from django import template
from django.template.base import Parser, Token
from django.template.defaulttags import CycleNode
register = template.Library()
@register.tag(name="cycle")
def cycle_impl(parser: Parser, token: Token) -> CycleNode:
return CycleNode([])
reveal_type(cycle_impl) # N: Revealed type is "def (parser: django.template.base.Parser, token: django.template.base.Token) -> django.template.defaulttags.CycleNode"
- case: register_inclusion_tag
main: |
from typing_extensions import reveal_type
from django import template
register = template.Library()
@register.inclusion_tag('results.html')
def format_results(results: list[str]) -> str:
return ', '.join(results)
reveal_type(format_results) # N: Revealed type is "def (results: builtins.list[builtins.str]) -> builtins.str"
django-stubs-5.2.9/tests/typecheck/test/ 0000775 0000000 0000000 00000000000 15134010516 0020223 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/typecheck/test/test_client.yml 0000664 0000000 0000000 00000005215 15134010516 0023266 0 ustar 00root root 0000000 0000000 - case: client_methods
main: |
from typing_extensions import reveal_type
from django.test.client import Client
client = Client()
response = client.get('foo')
reveal_type(response.wsgi_request) # N: Revealed type is "django.core.handlers.wsgi.WSGIRequest"
reveal_type(response.request) # N: Revealed type is "builtins.dict[builtins.str, Any]"
reveal_type(response.templates) # N: Revealed type is "builtins.list[django.template.base.Template]"
reveal_type(response.client) # N: Revealed type is "django.test.client.Client"
reveal_type(response.context) # N: Revealed type is "django.test.utils.ContextList | builtins.dict[builtins.str, Any]"
reveal_type(response.context_data) # N: Revealed type is "builtins.dict[builtins.str, Any] | None"
reveal_type(response.content) # N: Revealed type is "builtins.bytes"
reveal_type(response.redirect_chain) # N: Revealed type is "builtins.list[tuple[builtins.str, builtins.int]]"
reveal_type(response.text) # N: Revealed type is "builtins.str"
response.json()
- case: async_client_methods
main: |
from typing_extensions import reveal_type
from django.test.client import AsyncClient
async def main() -> None:
client = AsyncClient()
response = await client.get('foo')
reveal_type(response.asgi_request) # N: Revealed type is "django.core.handlers.asgi.ASGIRequest"
reveal_type(response.request) # N: Revealed type is "builtins.dict[builtins.str, Any]"
reveal_type(response.templates) # N: Revealed type is "builtins.list[django.template.base.Template]"
reveal_type(response.client) # N: Revealed type is "django.test.client.AsyncClient"
reveal_type(response.context) # N: Revealed type is "django.test.utils.ContextList | builtins.dict[builtins.str, Any]"
reveal_type(response.context_data) # N: Revealed type is "builtins.dict[builtins.str, Any] | None"
reveal_type(response.content) # N: Revealed type is "builtins.bytes"
reveal_type(response.redirect_chain) # N: Revealed type is "builtins.list[tuple[builtins.str, builtins.int]]"
response.json()
- case: request_factories
main: |
from typing_extensions import reveal_type
from django.test.client import RequestFactory, AsyncRequestFactory
factory = RequestFactory()
request = factory.get('foo')
reveal_type(request) # N: Revealed type is "django.core.handlers.wsgi.WSGIRequest"
async_factory = AsyncRequestFactory()
async_request = async_factory.get('foo')
reveal_type(async_request) # N: Revealed type is "django.core.handlers.asgi.ASGIRequest"
django-stubs-5.2.9/tests/typecheck/test/test_testcase.yml 0000664 0000000 0000000 00000001277 15134010516 0023627 0 ustar 00root root 0000000 0000000 - case: testcase_client_attr
main: |
from typing_extensions import reveal_type
from django.test.testcases import TestCase
class ExampleTestCase(TestCase):
def test_method(self) -> None:
reveal_type(self.client) # N: Revealed type is "django.test.client.Client"
resp = self.client.post('/url', {'doit': 'srs'}, 'application/json', False, True, extra='value')
reveal_type(resp.status_code) # N: Revealed type is "builtins.int"
# Attributes monkey-patched by test Client class:
resp.json()
reveal_type(resp.wsgi_request) # N: Revealed type is "django.core.handlers.wsgi.WSGIRequest"
django-stubs-5.2.9/tests/typecheck/test/test_utils.yml 0000664 0000000 0000000 00000000501 15134010516 0023141 0 ustar 00root root 0000000 0000000 - case: override_settings
main: |
from typing_extensions import reveal_type
from django.test import override_settings
from django.conf import settings
@override_settings(FOO='bar')
def test() -> None:
pass
reveal_type(test) # N: Revealed type is "def ()"
django-stubs-5.2.9/tests/typecheck/test_annotated.yml 0000664 0000000 0000000 00000002070 15134010516 0023002 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)
django-stubs-5.2.9/tests/typecheck/test_config.yml 0000664 0000000 0000000 00000005137 15134010516 0022301 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 "builtins.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_extensions import reveal_type
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 "builtins.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
django-stubs-5.2.9/tests/typecheck/test_forms.yml 0000664 0000000 0000000 00000014303 15134010516 0022155 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: 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
class MyForm(forms.ModelForm):
pass
class MyForm2(forms.ModelForm):
pass
# FormView generic param provided
class MyView(FormView[MyForm]):
form_class = MyForm
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
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
class RegistrationForm(models.ModelForm): ...
class RegistrationViewNoGeneric(FormView):
form_class = RegistrationForm
template_name = 'web_app/registration.html'
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'
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
class MyForm(forms.ModelForm):
pass
class MyView(UpdateView):
form_class = MyForm
def form_valid(self, form: forms.BaseModelForm) -> HttpResponse:
reveal_type(form.save) # N: Revealed type is "def (commit: builtins.bool =) -> Any"
return HttpResponse()
- case: successmessagemixin_compatible_with_formmixin
main: |
from django.views.generic.edit import FormMixin
from django.contrib.messages.views import SuccessMessageMixin
class FormFirstView(FormMixin, SuccessMessageMixin):
pass
class SuccessMessageFirstView(FormMixin, SuccessMessageMixin):
pass
- case: generic_modelchoicefield_label_from_instance
main: |
from django import forms
from myapp.models import Article, Category
class ArticleChoiceField(forms.ModelChoiceField[Article]):
def label_from_instance(self, obj: Article) -> str:
return obj.name
class BrokenArticleChoiceField(forms.ModelChoiceField[Article]):
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]):
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)
django-stubs-5.2.9/tests/typecheck/test_formsets.yml 0000664 0000000 0000000 00000001717 15134010516 0022676 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
django-stubs-5.2.9/tests/typecheck/test_helpers.yml 0000664 0000000 0000000 00000005603 15134010516 0022474 0 ustar 00root root 0000000 0000000 - case: transaction_atomic_contextmanager
main: |
from django.db import transaction
with transaction.atomic():
pass
with transaction.atomic(using="mydb"):
pass
with transaction.atomic(using="mydb", savepoint=False):
pass
with transaction.atomic(using="mydb", savepoint=False, durable=True):
pass
- case: transaction_atomic_decorator
main: |
from typing_extensions import reveal_type
from django.db import transaction
@transaction.atomic()
def decorated_func(param1: str, param2: int) -> bool:
pass
# Ensure that the function's type is preserved
reveal_type(decorated_func) # N: Revealed type is "def (param1: builtins.str, param2: builtins.int) -> builtins.bool"
@transaction.atomic(using="mydb")
def decorated_func_using(param1: str, param2: int) -> bool:
pass
# Ensure that the function's type is preserved
reveal_type(decorated_func_using) # N: Revealed type is "def (param1: builtins.str, param2: builtins.int) -> builtins.bool"
class ClassWithAtomicMethod:
# Bare decorator
@transaction.atomic
def atomic_method1(self, abc: int) -> str:
pass
@transaction.atomic(savepoint=True)
def atomic_method2(self) -> None:
pass
@transaction.atomic(using="db", savepoint=True)
def atomic_method3(self, myparam: str) -> int:
pass
ClassWithAtomicMethod().atomic_method1("abc") # E: Argument 1 to "atomic_method1" of "ClassWithAtomicMethod" has incompatible type "str"; expected "int" [arg-type]
# Ensure that the method's type is preserved
reveal_type(ClassWithAtomicMethod().atomic_method1) # N: Revealed type is "def (abc: builtins.int) -> builtins.str"
# Ensure that the method's type is preserved
reveal_type(ClassWithAtomicMethod().atomic_method3) # N: Revealed type is "def (myparam: builtins.str) -> builtins.int"
- case: mark_safe_decorator_and_function
main: |
from typing_extensions import reveal_type
from django.utils.safestring import mark_safe
s = 'hello'
reveal_type(mark_safe(s)) # N: Revealed type is "django.utils.safestring.SafeString"
reveal_type(mark_safe(s) + mark_safe(s)) # N: Revealed type is "django.utils.safestring.SafeString"
reveal_type(s + mark_safe(s)) # N: Revealed type is "builtins.str"
s += mark_safe(s)
reveal_type(s) # N: Revealed type is "builtins.str"
ms = mark_safe(s)
ms += mark_safe(s)
reveal_type(ms) # N: Revealed type is "django.utils.safestring.SafeString"
@mark_safe
def func(s: str) -> str:
pass
reveal_type(func) # N: Revealed type is "def (s: builtins.str) -> builtins.str"
django-stubs-5.2.9/tests/typecheck/test_import_all.yml 0000664 0000000 0000000 00000075641 15134010516 0023205 0 ustar 00root root 0000000 0000000 - case: import_all_modules
main: |
import django
import django.apps
import django.apps.config
import django.apps.registry
import django.conf
import django.conf.global_settings
import django.conf.locale
import django.conf.urls
import django.conf.urls.i18n
import django.conf.urls.static
import django.contrib
import django.contrib.admin
import django.contrib.admin.actions
import django.contrib.admin.apps
import django.contrib.admin.checks
import django.contrib.admin.decorators
import django.contrib.admin.exceptions
import django.contrib.admin.filters
import django.contrib.admin.forms
import django.contrib.admin.helpers
import django.contrib.admin.migrations
import django.contrib.admin.models
import django.contrib.admin.options
import django.contrib.admin.sites
import django.contrib.admin.templatetags
import django.contrib.admin.templatetags.admin_list
import django.contrib.admin.templatetags.admin_modify
import django.contrib.admin.templatetags.admin_urls
import django.contrib.admin.templatetags.base
import django.contrib.admin.templatetags.log
import django.contrib.admin.tests
import django.contrib.admin.utils
import django.contrib.admin.views
import django.contrib.admin.views.autocomplete
import django.contrib.admin.views.decorators
import django.contrib.admin.views.main
import django.contrib.admin.widgets
import django.contrib.admindocs
import django.contrib.admindocs.apps
import django.contrib.admindocs.middleware
import django.contrib.admindocs.urls
import django.contrib.admindocs.utils
import django.contrib.admindocs.views
import django.contrib.auth
import django.contrib.auth.admin
import django.contrib.auth.apps
import django.contrib.auth.backends
import django.contrib.auth.base_user
import django.contrib.auth.checks
import django.contrib.auth.context_processors
import django.contrib.auth.decorators
import django.contrib.auth.forms
import django.contrib.auth.handlers
import django.contrib.auth.handlers.modwsgi
import django.contrib.auth.hashers
import django.contrib.auth.management
import django.contrib.auth.management.commands
import django.contrib.auth.management.commands.changepassword
import django.contrib.auth.management.commands.createsuperuser
import django.contrib.auth.middleware
import django.contrib.auth.migrations
import django.contrib.auth.mixins
import django.contrib.auth.models
import django.contrib.auth.password_validation
import django.contrib.auth.signals
import django.contrib.auth.tokens
import django.contrib.auth.urls
import django.contrib.auth.validators
import django.contrib.auth.views
import django.contrib.contenttypes
import django.contrib.contenttypes.admin
import django.contrib.contenttypes.apps
import django.contrib.contenttypes.checks
import django.contrib.contenttypes.fields
import django.contrib.contenttypes.forms
import django.contrib.contenttypes.management
import django.contrib.contenttypes.management.commands
import django.contrib.contenttypes.management.commands.remove_stale_contenttypes
import django.contrib.contenttypes.migrations
import django.contrib.contenttypes.models
import django.contrib.contenttypes.views
import django.contrib.contenttypes.prefetch
import django.contrib.flatpages
import django.contrib.flatpages.admin
import django.contrib.flatpages.apps
import django.contrib.flatpages.forms
import django.contrib.flatpages.middleware
import django.contrib.flatpages.migrations
import django.contrib.flatpages.models
import django.contrib.flatpages.sitemaps
import django.contrib.flatpages.templatetags
import django.contrib.flatpages.templatetags.flatpages
import django.contrib.flatpages.urls
import django.contrib.flatpages.views
import django.contrib.gis
import django.contrib.gis.admin
import django.contrib.gis.admin.options
import django.contrib.gis.apps
import django.contrib.gis.db
import django.contrib.gis.db.backends
import django.contrib.gis.db.backends.base
import django.contrib.gis.db.backends.base.adapter
import django.contrib.gis.db.backends.base.features
import django.contrib.gis.db.backends.base.models
import django.contrib.gis.db.backends.base.operations
import django.contrib.gis.db.backends.mysql
import django.contrib.gis.db.backends.mysql.base
import django.contrib.gis.db.backends.mysql.features
import django.contrib.gis.db.backends.mysql.introspection
import django.contrib.gis.db.backends.mysql.operations
import django.contrib.gis.db.backends.mysql.schema
import django.contrib.gis.db.backends.oracle
import django.contrib.gis.db.backends.oracle.adapter
import django.contrib.gis.db.backends.oracle.base
import django.contrib.gis.db.backends.oracle.features
import django.contrib.gis.db.backends.oracle.introspection
import django.contrib.gis.db.backends.oracle.models
import django.contrib.gis.db.backends.oracle.operations
import django.contrib.gis.db.backends.oracle.schema
import django.contrib.gis.db.backends.postgis
import django.contrib.gis.db.backends.postgis.adapter
import django.contrib.gis.db.backends.postgis.base
import django.contrib.gis.db.backends.postgis.const
import django.contrib.gis.db.backends.postgis.features
import django.contrib.gis.db.backends.postgis.introspection
import django.contrib.gis.db.backends.postgis.models
import django.contrib.gis.db.backends.postgis.operations
import django.contrib.gis.db.backends.postgis.pgraster
import django.contrib.gis.db.backends.postgis.schema
import django.contrib.gis.db.backends.spatialite
import django.contrib.gis.db.backends.spatialite.adapter
import django.contrib.gis.db.backends.spatialite.base
import django.contrib.gis.db.backends.spatialite.client
import django.contrib.gis.db.backends.spatialite.features
import django.contrib.gis.db.backends.spatialite.introspection
import django.contrib.gis.db.backends.spatialite.models
import django.contrib.gis.db.backends.spatialite.operations
import django.contrib.gis.db.backends.spatialite.schema
import django.contrib.gis.db.backends.utils
import django.contrib.gis.db.models
import django.contrib.gis.db.models.aggregates
import django.contrib.gis.db.models.fields
import django.contrib.gis.db.models.functions
import django.contrib.gis.db.models.lookups
import django.contrib.gis.db.models.proxy
import django.contrib.gis.db.models.sql
import django.contrib.gis.db.models.sql.conversion
import django.contrib.gis.feeds
import django.contrib.gis.forms
import django.contrib.gis.forms.fields
import django.contrib.gis.forms.widgets
import django.contrib.gis.gdal
import django.contrib.gis.gdal.base
import django.contrib.gis.gdal.datasource
import django.contrib.gis.gdal.driver
import django.contrib.gis.gdal.envelope
import django.contrib.gis.gdal.error
import django.contrib.gis.gdal.feature
import django.contrib.gis.gdal.field
import django.contrib.gis.gdal.geometries
import django.contrib.gis.gdal.geomtype
import django.contrib.gis.gdal.layer
import django.contrib.gis.gdal.libgdal
import django.contrib.gis.gdal.prototypes
import django.contrib.gis.gdal.prototypes.ds
import django.contrib.gis.gdal.prototypes.errcheck
import django.contrib.gis.gdal.prototypes.generation
import django.contrib.gis.gdal.prototypes.geom
import django.contrib.gis.gdal.prototypes.raster
import django.contrib.gis.gdal.prototypes.srs
import django.contrib.gis.gdal.raster
import django.contrib.gis.gdal.raster.band
import django.contrib.gis.gdal.raster.base
import django.contrib.gis.gdal.raster.const
import django.contrib.gis.gdal.raster.source
import django.contrib.gis.gdal.srs
import django.contrib.gis.geoip2
import django.contrib.gis.geometry
import django.contrib.gis.geos
import django.contrib.gis.geos.base
import django.contrib.gis.geos.collections
import django.contrib.gis.geos.coordseq
import django.contrib.gis.geos.error
import django.contrib.gis.geos.factory
import django.contrib.gis.geos.geometry
import django.contrib.gis.geos.io
import django.contrib.gis.geos.libgeos
import django.contrib.gis.geos.linestring
import django.contrib.gis.geos.mutable_list
import django.contrib.gis.geos.point
import django.contrib.gis.geos.polygon
import django.contrib.gis.geos.prepared
import django.contrib.gis.geos.prototypes
import django.contrib.gis.geos.prototypes.coordseq
import django.contrib.gis.geos.prototypes.errcheck
import django.contrib.gis.geos.prototypes.geom
import django.contrib.gis.geos.prototypes.io
import django.contrib.gis.geos.prototypes.misc
import django.contrib.gis.geos.prototypes.predicates
import django.contrib.gis.geos.prototypes.prepared
import django.contrib.gis.geos.prototypes.threadsafe
import django.contrib.gis.geos.prototypes.topology
import django.contrib.gis.measure
import django.contrib.gis.ptr
import django.contrib.gis.serializers
import django.contrib.gis.serializers.geojson
import django.contrib.gis.shortcuts
import django.contrib.gis.sitemaps
import django.contrib.gis.sitemaps.kml
import django.contrib.gis.sitemaps.views
import django.contrib.gis.utils
import django.contrib.gis.utils.layermapping
import django.contrib.gis.utils.ogrinfo
import django.contrib.gis.utils.ogrinspect
import django.contrib.gis.utils.srs
import django.contrib.gis.views
import django.contrib.humanize
import django.contrib.humanize.apps
import django.contrib.humanize.templatetags
import django.contrib.humanize.templatetags.humanize
import django.contrib.messages
import django.contrib.messages.api
import django.contrib.messages.apps
import django.contrib.messages.constants
import django.contrib.messages.context_processors
import django.contrib.messages.middleware
import django.contrib.messages.storage
import django.contrib.messages.storage.base
import django.contrib.messages.storage.cookie
import django.contrib.messages.storage.fallback
import django.contrib.messages.storage.session
import django.contrib.messages.utils
import django.contrib.messages.views
import django.contrib.messages.test
import django.contrib.postgres
import django.contrib.postgres.aggregates
import django.contrib.postgres.aggregates.general
import django.contrib.postgres.aggregates.mixins
import django.contrib.postgres.aggregates.statistics
import django.contrib.postgres.apps
import django.contrib.postgres.constraints
import django.contrib.postgres.expressions
import django.contrib.postgres.fields
import django.contrib.postgres.fields.array
import django.contrib.postgres.fields.citext
import django.contrib.postgres.fields.hstore
import django.contrib.postgres.fields.jsonb
import django.contrib.postgres.fields.ranges
import django.contrib.postgres.fields.utils
import django.contrib.postgres.forms
import django.contrib.postgres.forms.array
import django.contrib.postgres.forms.hstore
import django.contrib.postgres.forms.ranges
import django.contrib.postgres.functions
import django.contrib.postgres.indexes
import django.contrib.postgres.lookups
import django.contrib.postgres.operations
import django.contrib.postgres.search
import django.contrib.postgres.serializers
import django.contrib.postgres.signals
import django.contrib.postgres.utils
import django.contrib.postgres.validators
import django.contrib.redirects
import django.contrib.redirects.admin
import django.contrib.redirects.apps
import django.contrib.redirects.middleware
import django.contrib.redirects.migrations
import django.contrib.redirects.models
import django.contrib.sessions
import django.contrib.sessions.apps
import django.contrib.sessions.backends
import django.contrib.sessions.backends.base
import django.contrib.sessions.backends.cache
import django.contrib.sessions.backends.cached_db
import django.contrib.sessions.backends.db
import django.contrib.sessions.backends.file
import django.contrib.sessions.backends.signed_cookies
import django.contrib.sessions.base_session
import django.contrib.sessions.exceptions
import django.contrib.sessions.management
import django.contrib.sessions.management.commands
import django.contrib.sessions.management.commands.clearsessions
import django.contrib.sessions.middleware
import django.contrib.sessions.migrations
import django.contrib.sessions.models
import django.contrib.sessions.serializers
import django.contrib.sitemaps
import django.contrib.sitemaps.apps
import django.contrib.sitemaps.views
import django.contrib.sites
import django.contrib.sites.admin
import django.contrib.sites.apps
import django.contrib.sites.checks
import django.contrib.sites.management
import django.contrib.sites.managers
import django.contrib.sites.middleware
import django.contrib.sites.migrations
import django.contrib.sites.models
import django.contrib.sites.requests
import django.contrib.sites.shortcuts
import django.contrib.staticfiles
import django.contrib.staticfiles.apps
import django.contrib.staticfiles.checks
import django.contrib.staticfiles.finders
import django.contrib.staticfiles.handlers
import django.contrib.staticfiles.management
import django.contrib.staticfiles.management.commands
import django.contrib.staticfiles.management.commands.collectstatic
import django.contrib.staticfiles.management.commands.findstatic
import django.contrib.staticfiles.management.commands.runserver
import django.contrib.staticfiles.storage
import django.contrib.staticfiles.testing
import django.contrib.staticfiles.urls
import django.contrib.staticfiles.utils
import django.contrib.staticfiles.views
import django.contrib.syndication
import django.contrib.syndication.apps
import django.contrib.syndication.views
import django.core
import django.core.asgi
import django.core.cache
import django.core.cache.backends
import django.core.cache.backends.base
import django.core.cache.backends.db
import django.core.cache.backends.dummy
import django.core.cache.backends.filebased
import django.core.cache.backends.locmem
import django.core.cache.backends.memcached
import django.core.cache.backends.redis
import django.core.cache.utils
import django.core.checks
import django.core.checks.async_checks
import django.core.checks.caches
import django.core.checks.compatibility
import django.core.checks.compatibility.django_4_0
import django.core.checks.database
import django.core.checks.files
import django.core.checks.messages
import django.core.checks.model_checks
import django.core.checks.registry
import django.core.checks.security
import django.core.checks.security.base
import django.core.checks.security.csrf
import django.core.checks.security.sessions
import django.core.checks.templates
import django.core.checks.translation
import django.core.checks.urls
import django.core.exceptions
import django.core.files
import django.core.files.base
import django.core.files.images
import django.core.files.locks
import django.core.files.move
import django.core.files.storage
import django.core.files.storage.base
import django.core.files.storage.filesystem
import django.core.files.storage.handler
import django.core.files.storage.memory
import django.core.files.storage.mixins
import django.core.files.temp
import django.core.files.uploadedfile
import django.core.files.uploadhandler
import django.core.files.utils
import django.core.handlers
import django.core.handlers.asgi
import django.core.handlers.base
import django.core.handlers.exception
import django.core.handlers.wsgi
import django.core.mail
import django.core.mail.backends
import django.core.mail.backends.base
import django.core.mail.backends.console
import django.core.mail.backends.dummy
import django.core.mail.backends.filebased
import django.core.mail.backends.locmem
import django.core.mail.backends.smtp
import django.core.mail.message
import django.core.mail.utils
import django.core.management
import django.core.management.base
import django.core.management.color
import django.core.management.commands
import django.core.management.commands.check
import django.core.management.commands.compilemessages
import django.core.management.commands.createcachetable
import django.core.management.commands.dbshell
import django.core.management.commands.diffsettings
import django.core.management.commands.dumpdata
import django.core.management.commands.flush
import django.core.management.commands.inspectdb
import django.core.management.commands.loaddata
import django.core.management.commands.makemessages
import django.core.management.commands.makemigrations
import django.core.management.commands.migrate
import django.core.management.commands.runserver
import django.core.management.commands.sendtestemail
import django.core.management.commands.shell
import django.core.management.commands.showmigrations
import django.core.management.commands.sqlflush
import django.core.management.commands.sqlmigrate
import django.core.management.commands.sqlsequencereset
import django.core.management.commands.squashmigrations
import django.core.management.commands.startapp
import django.core.management.commands.startproject
import django.core.management.commands.test
import django.core.management.commands.testserver
import django.core.management.sql
import django.core.management.templates
import django.core.management.utils
import django.core.paginator
import django.core.serializers
import django.core.serializers.base
import django.core.serializers.json
import django.core.serializers.jsonl
import django.core.serializers.python
import django.core.serializers.pyyaml
import django.core.serializers.xml_serializer
import django.core.servers
import django.core.servers.basehttp
import django.core.signals
import django.core.signing
import django.core.validators
import django.core.wsgi
import django.db
import django.db.backends
import django.db.backends.base
import django.db.backends.base.base
import django.db.backends.base.client
import django.db.backends.base.creation
import django.db.backends.base.features
import django.db.backends.base.introspection
import django.db.backends.base.operations
import django.db.backends.base.schema
import django.db.backends.base.validation
import django.db.backends.ddl_references
import django.db.backends.dummy
import django.db.backends.dummy.base
import django.db.backends.dummy.features
import django.db.backends.mysql
import django.db.backends.mysql.base
import django.db.backends.mysql.client
import django.db.backends.mysql.compiler
import django.db.backends.mysql.creation
import django.db.backends.mysql.features
import django.db.backends.mysql.introspection
import django.db.backends.mysql.operations
import django.db.backends.mysql.schema
import django.db.backends.mysql.validation
import django.db.backends.oracle
import django.db.backends.oracle.base
import django.db.backends.oracle.client
import django.db.backends.oracle.creation
import django.db.backends.oracle.features
import django.db.backends.oracle.functions
import django.db.backends.oracle.introspection
import django.db.backends.oracle.operations
import django.db.backends.oracle.schema
import django.db.backends.oracle.utils
import django.db.backends.oracle.validation
import django.db.backends.postgresql
import django.db.backends.postgresql.base
import django.db.backends.postgresql.client
import django.db.backends.postgresql.creation
import django.db.backends.postgresql.features
import django.db.backends.postgresql.introspection
import django.db.backends.postgresql.operations
import django.db.backends.postgresql.schema
import django.db.backends.signals
import django.db.backends.sqlite3
import django.db.backends.sqlite3.base
import django.db.backends.sqlite3.client
import django.db.backends.sqlite3.creation
import django.db.backends.sqlite3.features
import django.db.backends.sqlite3.introspection
import django.db.backends.sqlite3.operations
import django.db.backends.sqlite3.schema
import django.db.backends.utils
import django.db.migrations
import django.db.migrations.autodetector
import django.db.migrations.exceptions
import django.db.migrations.executor
import django.db.migrations.graph
import django.db.migrations.loader
import django.db.migrations.migration
import django.db.migrations.operations
import django.db.migrations.operations.base
import django.db.migrations.operations.fields
import django.db.migrations.operations.models
import django.db.migrations.operations.special
import django.db.migrations.operations.utils
import django.db.migrations.optimizer
import django.db.migrations.questioner
import django.db.migrations.recorder
import django.db.migrations.serializer
import django.db.migrations.state
import django.db.migrations.utils
import django.db.migrations.writer
import django.db.models
import django.db.models.aggregates
import django.db.models.base
import django.db.models.constants
import django.db.models.constraints
import django.db.models.deletion
import django.db.models.enums
import django.db.models.expressions
import django.db.models.fields
import django.db.models.fields.files
import django.db.models.fields.generated
import django.db.models.fields.json
import django.db.models.fields.mixins
import django.db.models.fields.proxy
import django.db.models.fields.related
import django.db.models.fields.related_descriptors
import django.db.models.fields.related_lookups
import django.db.models.fields.reverse_related
import django.db.models.functions
import django.db.models.functions.comparison
import django.db.models.functions.datetime
import django.db.models.functions.math
import django.db.models.functions.mixins
import django.db.models.functions.text
import django.db.models.functions.window
import django.db.models.indexes
import django.db.models.lookups
import django.db.models.manager
import django.db.models.options
import django.db.models.query
import django.db.models.query_utils
import django.db.models.signals
import django.db.models.sql
import django.db.models.sql.compiler
import django.db.models.sql.constants
import django.db.models.sql.datastructures
import django.db.models.sql.query
import django.db.models.sql.subqueries
import django.db.models.sql.where
import django.db.models.utils
import django.db.transaction
import django.db.utils
import django.dispatch
import django.dispatch.dispatcher
import django.forms
import django.forms.boundfield
import django.forms.fields
import django.forms.forms
import django.forms.formsets
import django.forms.models
import django.forms.renderers
import django.forms.utils
import django.forms.widgets
import django.http
import django.http.cookie
import django.http.multipartparser
import django.http.request
import django.http.response
import django.middleware
import django.middleware.cache
import django.middleware.clickjacking
import django.middleware.common
import django.middleware.csrf
import django.middleware.gzip
import django.middleware.http
import django.middleware.locale
import django.middleware.security
import django.shortcuts
import django.template
import django.template.backends
import django.template.backends.base
import django.template.backends.django
import django.template.backends.dummy
import django.template.backends.jinja2
import django.template.backends.utils
import django.template.base
import django.template.context
import django.template.context_processors
import django.template.defaultfilters
import django.template.defaulttags
import django.template.engine
import django.template.exceptions
import django.template.library
import django.template.loader
import django.template.loader_tags
import django.template.loaders
import django.template.loaders.app_directories
import django.template.loaders.base
import django.template.loaders.cached
import django.template.loaders.filesystem
import django.template.loaders.locmem
import django.template.response
import django.template.smartif
import django.template.utils
import django.templatetags
import django.templatetags.cache
import django.templatetags.i18n
import django.templatetags.l10n
import django.templatetags.static
import django.templatetags.tz
import django.test
import django.test.client
import django.test.html
import django.test.runner
import django.test.selenium
import django.test.signals
import django.test.testcases
import django.test.utils
import django.urls
import django.urls.base
import django.urls.conf
import django.urls.converters
import django.urls.exceptions
import django.urls.resolvers
import django.urls.utils
import django.utils
import django.utils._os
import django.utils.archive
import django.utils.asyncio
import django.utils.autoreload
import django.utils.cache
import django.utils.choices
import django.utils.connection
import django.utils.crypto
import django.utils.datastructures
import django.utils.dateformat
import django.utils.dateparse
import django.utils.dates
import django.utils.deconstruct
import django.utils.decorators
import django.utils.deprecation
import django.utils.duration
import django.utils.encoding
import django.utils.feedgenerator
import django.utils.formats
import django.utils.functional
import django.utils.hashable
import django.utils.html
import django.utils.http
import django.utils.inspect
import django.utils.ipv6
import django.utils.itercompat
import django.utils.log
import django.utils.lorem_ipsum
import django.utils.module_loading
import django.utils.numberformat
import django.utils.regex_helper
import django.utils.safestring
import django.utils.termcolors
import django.utils.text
import django.utils.timesince
import django.utils.timezone
import django.utils.translation
import django.utils.translation.reloader
import django.utils.translation.template
import django.utils.translation.trans_null
import django.utils.translation.trans_real
import django.utils.tree
import django.utils.version
import django.utils.xmlutils
import django.views
import django.views.csrf
import django.views.debug
import django.views.decorators
import django.views.decorators.cache
import django.views.decorators.clickjacking
import django.views.decorators.common
import django.views.decorators.csrf
import django.views.decorators.debug
import django.views.decorators.gzip
import django.views.decorators.http
import django.views.decorators.vary
import django.views.defaults
import django.views.generic
import django.views.generic.base
import django.views.generic.dates
import django.views.generic.detail
import django.views.generic.edit
import django.views.generic.list
import django.views.i18n
import django.views.static
mypy_config: |
[mypy-redis.*]
ignore_errors = true
[mypy-yaml.*]
disallow_untyped_defs = false
disallow_incomplete_defs = false
django-stubs-5.2.9/tests/typecheck/test_mail.yml 0000664 0000000 0000000 00000001526 15134010516 0021754 0 ustar 00root root 0000000 0000000 - case: check_email_message_attach
main: |
from typing_extensions import reveal_type
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from django.core.mail.message import EmailMessage
message = EmailMessage()
reveal_type(message) # N: Revealed type is "django.core.mail.message.EmailMessage"
message.attach("myfilename", "mycontent", "text/plain")
mime_text = MIMEText("mytext")
reveal_type(mime_text) # N: Revealed type is "email.mime.text.MIMEText"
message.attach(mime_text)
mime_image = MIMEImage("mydata", "image/png")
reveal_type(mime_image) # N: Revealed type is "email.mime.image.MIMEImage"
message.attach(mime_image)
reveal_type(message.attachments) # N: Revealed type is "builtins.list[Any]"
django-stubs-5.2.9/tests/typecheck/test_request.yml 0000664 0000000 0000000 00000012416 15134010516 0022522 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 "builtins.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.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._MutableHttpRequest"
reveal_type(request.GET) # N: Revealed type is "django.http.request.QueryDict"
request.GET['foo'] = 'bar'
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]
- case: request_get_post_unreachable
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._MutableHttpRequest"
reveal_type(request.GET) # N: Revealed type is "django.http.request.QueryDict"
request.GET['foo'] = 'bar'
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['foo'] = 'bar' # E: This QueryDict is immutable. [misc]
x = 1 # E: Statement is unreachable [unreachable]
django-stubs-5.2.9/tests/typecheck/test_settings.yml 0000664 0000000 0000000 00000010235 15134010516 0022667 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 "builtins.str"
reveal_type(settings.ROOT_DIR) # N: Revealed type is "builtins.str"
reveal_type(settings.APPS_DIR) # N: Revealed type is "pathlib.Path"
reveal_type(settings.NUMBERS) # N: Revealed type is "builtins.list[builtins.str]"
reveal_type(settings.DICT) # N: Revealed type is "builtins.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 "builtins.str"
reveal_type(settings.AUTHENTICATION_BACKENDS) # N: Revealed type is "typing.Sequence[builtins.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 "builtins.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 "builtins.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 "builtins.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
django-stubs-5.2.9/tests/typecheck/test_shortcuts.yml 0000664 0000000 0000000 00000006101 15134010516 0023062 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 "builtins.list[myapp.models.MyModel]"
reveal_type(get_list_or_404(MyModel.objects)) # N: Revealed type is "builtins.list[myapp.models.MyModel]"
reveal_type(get_list_or_404(MyModel.objects.get_queryset())) # N: Revealed type is "builtins.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
- case: check_render_function_arguments_annotations
main: |
from typing import Any
from typing_extensions import TypedDict, reveal_type
from django.shortcuts import render
from django.http.request import HttpRequest
TestContext = TypedDict("TestContext", {"user": Any})
test_context: TestContext = {"user": "test"}
reveal_type(test_context) # N: Revealed type is "TypedDict('main.TestContext', {'user': Any})"
reveal_type(render(HttpRequest(), '', test_context)) # N: Revealed type is "django.http.response.HttpResponse"
- case: check_redirect_return_annotation
main: |
from typing_extensions import reveal_type
from django.shortcuts import redirect
reveal_type(redirect(to = '', permanent = True)) # N: Revealed type is "django.http.response.HttpResponsePermanentRedirect"
reveal_type(redirect(to = '', permanent = False)) # N: Revealed type is "django.http.response.HttpResponseRedirect"
reveal_type(redirect(to = '')) # N: Revealed type is "django.http.response.HttpResponseRedirect"
var = True
reveal_type(redirect(to = '', permanent = var)) # N: Revealed type is "django.http.response.HttpResponseRedirect | django.http.response.HttpResponsePermanentRedirect"
django-stubs-5.2.9/tests/typecheck/urls/ 0000775 0000000 0000000 00000000000 15134010516 0020231 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/typecheck/urls/test_converters.yml 0000664 0000000 0000000 00000002112 15134010516 0024201 0 ustar 00root root 0000000 0000000 - case: test_register_converter_builtin
main: |
from django.urls import register_converter
from django.urls.converters import IntConverter
register_converter(IntConverter, "bigint")
- case: test_register_converter_custom
main: |
from django.urls import register_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")
- case: test_register_converter_incorrect_types
main: |
from django.urls import register_converter
class BigIntConverter:
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(BigIntConverter, "bigint") # E: Argument 1 to "register_converter" has incompatible type "type[BigIntConverter]"; expected "type[_Converter]" [arg-type]
django-stubs-5.2.9/tests/typecheck/utils/ 0000775 0000000 0000000 00000000000 15134010516 0020404 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/typecheck/utils/test_datastructures.yml 0000664 0000000 0000000 00000005613 15134010516 0025250 0 ustar 00root root 0000000 0000000 - case: multivaluedict
main: |
from django.utils.datastructures import MultiValueDict
from typing_extensions import reveal_type
# check constructors
var1 = MultiValueDict() # E: Need type annotation for "var1" [var-annotated]
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(d3)
reveal_type(var1) # N: Revealed type is "django.utils.datastructures.MultiValueDict[Any, Any]"
reveal_type(var2) # N: Revealed type is "django.utils.datastructures.MultiValueDict[builtins.str, builtins.str | builtins.int]"
reveal_type(var3) # N: Revealed type is "django.utils.datastructures.MultiValueDict[builtins.str, builtins.str | builtins.int]"
# __getitem__, get, getlist (with proofs)
d = MultiValueDict({'foo': ['Foo']})
d.setlist('bar', [])
# actually 'Foo'
reveal_type(d['foo']) # N: Revealed type is "builtins.str | builtins.list[builtins.object]"
# actually []
reveal_type(d['bar']) # N: Revealed type is "builtins.str | builtins.list[builtins.object]"
# actually None
reveal_type(d.get('bar')) # N: Revealed type is "builtins.str | None"
# actually 1
reveal_type(d.get('bar', 1)) # N: Revealed type is "builtins.str | builtins.int"
# actually []
reveal_type(d.getlist('bar')) # N: Revealed type is "builtins.list[builtins.str]"
# actually []
reveal_type(d.getlist('bar', [1])) # N: Revealed type is "builtins.list[builtins.str] | builtins.list[builtins.int]"
# actually True (note that default can be not a list)
reveal_type(d.getlist('baz', True)) # N: Revealed type is "builtins.list[builtins.str] | builtins.bool"
# setters
reveal_type(d.setlistdefault('baz')) # N: Revealed type is "builtins.list[builtins.str]"
d.setlistdefault('baz', [1]) # E: List item 0 has incompatible type "int"; expected "str" [list-item]
reveal_type(d.setlistdefault('baz', [])) # N: Revealed type is "builtins.list[builtins.str]"
d.appendlist('baz', 'Baz')
d.appendlist('baz', 1) # E: Argument 2 to "appendlist" of "MultiValueDict" has incompatible type "int"; expected "str" [arg-type]
# iterators
# actually [('foo', 'Foo'), ('bar', [])]
reveal_type(list(d.items())) # N: Revealed type is "builtins.list[tuple[builtins.str, builtins.str | builtins.list[builtins.object]]]"
reveal_type(list(d.keys())) # N: Revealed type is "builtins.list[builtins.str]"
# actually ['Foo', []]
reveal_type(list(d.values())) # N: Revealed type is "builtins.list[builtins.str | builtins.list[builtins.object]]"
# actually {'foo': 'Foo', 'bar': []}
reveal_type(d.dict()) # N: Revealed type is "builtins.dict[builtins.str, builtins.str | builtins.list[builtins.object]]"
django-stubs-5.2.9/tests/typecheck/utils/test_decorators.yml 0000664 0000000 0000000 00000003106 15134010516 0024333 0 ustar 00root root 0000000 0000000 - case: classonlymethod
main: |
from typing_extensions import reveal_type
from django.utils.decorators import classonlymethod
class Bananaman:
@classonlymethod
def count_bananas(cls) -> int:
return 12
reveal_type(Bananaman.count_bananas) # N: Revealed type is "def () -> builtins.int"
- case: method_decorator_class
main: |
from typing_extensions import reveal_type
from django.views.generic.base import View
from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import login_required
@method_decorator(login_required, name='dispatch')
class TestView(View): ...
reveal_type(TestView()) # N: Revealed type is "main.TestView"
- case: method_decorator_function
main: |
from typing import Any
from typing_extensions import reveal_type
from django.views.generic.base import View
from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import login_required
from django.http.response import HttpResponseBase
from django.http.request import HttpRequest
class TestView(View):
@method_decorator(login_required)
def dispatch(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase:
return super().dispatch(request, *args, **kwargs)
reveal_type(dispatch) # N: Revealed type is "def (self: main.TestView, request: django.http.request.HttpRequest, *args: Any, **kwargs: Any) -> django.http.response.HttpResponseBase"
django-stubs-5.2.9/tests/typecheck/utils/test_deprecation.yml 0000664 0000000 0000000 00000000661 15134010516 0024466 0 ustar 00root root 0000000 0000000 - case: basic_middleware_mixin_test
main: |
from django.utils.deprecation import MiddlewareMixin
from django.http import HttpRequest, HttpResponseBase
from collections.abc import Awaitable
class MyMiddleware(MiddlewareMixin):
def __call__(
self, request: HttpRequest
) -> HttpResponseBase | Awaitable[HttpResponseBase]:
return self.get_response(request)
django-stubs-5.2.9/tests/typecheck/utils/test_encoding.yml 0000664 0000000 0000000 00000001412 15134010516 0023752 0 ustar 00root root 0000000 0000000 - case: force_bytes_or_str
main: |
from typing_extensions import reveal_type
from django.utils.encoding import force_bytes, force_str
class S(str):
pass
reveal_type(force_bytes(123)) # N: Revealed type is "builtins.bytes"
reveal_type(force_bytes(123, strings_only=True)) # N: Revealed type is "builtins.int"
reveal_type(force_str(123)) # N: Revealed type is "builtins.str"
reveal_type(force_str(123, strings_only=True)) # N: Revealed type is "builtins.int"
reveal_type(force_str('foo')) # N: Revealed type is "builtins.str"
reveal_type(force_str('foo', strings_only=True)) # N: Revealed type is "builtins.str"
reveal_type(force_str(S('foo'), strings_only=True)) # N: Revealed type is "main.S"
django-stubs-5.2.9/tests/typecheck/utils/test_functional.yml 0000664 0000000 0000000 00000006533 15134010516 0024337 0 ustar 00root root 0000000 0000000 - case: cached_property_class_vs_instance_attributes
main: |
from django.utils.functional import cached_property
from typing import ClassVar
from typing_extensions import reveal_type
class Foo:
@cached_property
def attr(self) -> list[str]: ...
@cached_property # E: Too many arguments for property [misc]
def attr2(self, arg2: str) -> list[str]: ...
reveal_type(attr) # N: Revealed type is "def (self: main.Foo) -> builtins.list[builtins.str]"
reveal_type(Foo.attr) # N: Revealed type is "def (self: main.Foo) -> builtins.list[builtins.str]"
f = Foo()
reveal_type(f.attr) # N: Revealed type is "builtins.list[builtins.str]"
f.attr.func # E: "list[str]" has no attribute "func" [attr-defined]
# May be overridden by @property
class Bar(Foo):
@property
def attr(self) -> list[str]: ...
# May be overridden by ClassVar
class Quux(Foo):
attr: ClassVar[list[str]] = []
# ClassVar may not be overridden by cached_property
class Baz(Quux):
@cached_property
def attr(self) -> list[str]: ... # E: Cannot override writeable attribute with read-only property [override]
- case: str_promise_proxy
main: |
from typing_extensions import reveal_type
from django.utils.functional import Promise, lazystr, _StrPromise
s = lazystr("asd")
reveal_type(s) # N: Revealed type is "django.utils.functional._StrPromise"
reveal_type(s.format("asd")) # N: Revealed type is "builtins.str"
reveal_type(s.capitalize()) # N: Revealed type is "builtins.str"
reveal_type(s.swapcase) # N: Revealed type is "def () -> builtins.str"
reveal_type(s.__getnewargs__) # N: Revealed type is "def () -> tuple[builtins.str]"
s.nonsense # E: "_StrPromise" has no attribute "nonsense" [attr-defined]
f: _StrPromise | str
reveal_type(f.format("asd")) # N: Revealed type is "builtins.str"
reveal_type(f + "asd") # N: Revealed type is "builtins.str"
reveal_type("asd" + f) # N: Revealed type is "Any | builtins.str"
reveal_type(s + "bar") # N: Revealed type is "builtins.str"
reveal_type("foo" + s) # N: Revealed type is "Any"
reveal_type(s % "asd") # N: Revealed type is "builtins.str"
def foo(content: str) -> None:
...
def bar(content: Promise) -> None:
...
foo(s) # E: Argument 1 to "foo" has incompatible type "_StrPromise"; expected "str" [arg-type]
bar(s)
- case: classproperty_usage
main: |
from typing import Any
from django.utils.functional import classproperty
from typing_extensions import reveal_type
class Foo:
@classproperty
def attr(cls: Any) -> str: ...
reveal_type(attr) # N: Revealed type is "django.utils.functional.classproperty[builtins.str]"
reveal_type(attr.getter) # N: Revealed type is "def (method: def (Any) -> builtins.str) -> django.utils.functional.classproperty[builtins.str]"
reveal_type(Foo.attr) # N: Revealed type is "builtins.str"
class Bar(Foo):
def method(self) -> None:
reveal_type(self.attr) # N: Revealed type is "builtins.str"
django-stubs-5.2.9/tests/typecheck/utils/test_timezone.yml 0000664 0000000 0000000 00000002746 15134010516 0024031 0 ustar 00root root 0000000 0000000 - case: is_naive_correct
main: |
from typing_extensions import reveal_type
from django.utils.timezone import is_naive
from datetime import date, time, datetime
reveal_type(is_naive(date(2020, 1, 1)))
reveal_type(is_naive(datetime(2020, 1, 1)))
reveal_type(is_naive(time()))
out: |
main:4: error: No overload variant of "is_naive" matches argument type "date" [call-overload]
main:4: note: Possible overload variants:
main:4: note: def is_naive(value: time) -> Literal[True]
main:4: note: def is_naive(value: datetime) -> bool
main:4: note: Revealed type is "Any"
main:5: note: Revealed type is "builtins.bool"
main:6: note: Revealed type is "Literal[True]"
- case: is_aware_correct
main: |
from typing_extensions import reveal_type
from django.utils.timezone import is_aware
from datetime import date, time, datetime
reveal_type(is_aware(date(2020, 1, 1)))
reveal_type(is_aware(datetime(2020, 1, 1)))
reveal_type(is_aware(time()))
out: |
main:4: error: No overload variant of "is_aware" matches argument type "date" [call-overload]
main:4: note: Possible overload variants:
main:4: note: def is_aware(value: time) -> Literal[False]
main:4: note: def is_aware(value: datetime) -> bool
main:4: note: Revealed type is "Any"
main:5: note: Revealed type is "builtins.bool"
main:6: note: Revealed type is "Literal[False]"
django-stubs-5.2.9/tests/typecheck/views/ 0000775 0000000 0000000 00000000000 15134010516 0020401 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/typecheck/views/generic/ 0000775 0000000 0000000 00000000000 15134010516 0022015 5 ustar 00root root 0000000 0000000 django-stubs-5.2.9/tests/typecheck/views/generic/test_detail.yml 0000664 0000000 0000000 00000004343 15134010516 0025045 0 ustar 00root root 0000000 0000000 - case: generic_detail_view
main: |
from django.views.generic import DetailView
from django.db.models import QuerySet
from myapp.models import MyModel
class MyDetailView(DetailView[MyModel]):
model = MyModel
queryset = MyModel.objects.all()
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 myapp.models import MyModel, Other
class MyDetailView(DetailView[Other]):
model = MyModel
queryset = MyModel.objects.all()
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:7: error: Incompatible types in assignment (expression has type "type[MyModel]", base class "SingleObjectMixin" defined the type as "type[Other]") [assignment]
main:8: error: Incompatible types in assignment (expression has type "QuerySet[MyModel, MyModel]", base class "SingleObjectMixin" defined the type as "QuerySet[Other, Other] | None") [assignment]
main:10: 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:12: error: Incompatible return value type (got "QuerySet[Other, Other]", expected "QuerySet[MyModel, MyModel]") [return-value]
django-stubs-5.2.9/tests/typecheck/views/generic/test_edit.yml 0000664 0000000 0000000 00000007324 15134010516 0024532 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
class MyLoginView(LoginView):
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
class MyView(View):
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
class MyView(View):
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
django-stubs-5.2.9/tests/typecheck/views/generic/test_list.yml 0000664 0000000 0000000 00000003706 15134010516 0024560 0 ustar 00root root 0000000 0000000 - case: generic_list_view
main: |
from django.views.generic import ListView
from django.db.models import QuerySet
from myapp.models import MyModel
class MyListView(ListView[MyModel]):
model = MyModel
queryset = MyModel.objects.all()
def get_queryset(self) -> QuerySet[MyModel]:
...
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 myapp.models import MyModel, Other
class MyListView(ListView[Other]):
model = MyModel
queryset = MyModel.objects.all()
def get_queryset(self) -> QuerySet[MyModel]:
...
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:7: error: Incompatible types in assignment (expression has type "type[MyModel]", base class "MultipleObjectMixin" defined the type as "type[Other] | None") [assignment]
main:8: error: Incompatible types in assignment (expression has type "QuerySet[MyModel, MyModel]", base class "MultipleObjectMixin" defined the type as "QuerySet[Other, Other] | None") [assignment]
main:10: error: Return type "QuerySet[MyModel, MyModel]" of "get_queryset" incompatible with return type "QuerySet[Other, Other]" in supertype "django.views.generic.list.MultipleObjectMixin" [override]
django-stubs-5.2.9/tests/typecheck/views/generic/test_template.yml 0000664 0000000 0000000 00000001040 15134010516 0025405 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({})
django-stubs-5.2.9/tests/typecheck/views/test_function_based_views.yml 0000664 0000000 0000000 00000017504 15134010516 0026372 0 ustar 00root root 0000000 0000000 - case: http_response
main: |
from django.http.request import HttpRequest
from django.http.response import HttpResponse
from django.utils.translation import gettext_lazy as _
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!'))
- case: http_response_content
main: |
from typing_extensions import reveal_type
from django.http.request import HttpRequest
from django.http.response import HttpResponse
from django.utils.translation import gettext_lazy as _
def empty_response(request: HttpRequest) -> HttpResponse:
response = HttpResponse()
reveal_type(response.content) # N: Revealed type is "builtins.bytes"
return response
def str_response(request: HttpRequest) -> HttpResponse:
response = HttpResponse()
response.content = 'It works!'
reveal_type(response.content) # N: Revealed type is "builtins.bytes"
return response
def bytes_response(request: HttpRequest) -> HttpResponse:
response = HttpResponse()
response.content = b'It works!'
reveal_type(response.content) # N: Revealed type is "builtins.bytes"
return response
def object_response(request: HttpRequest) -> HttpResponse:
response = HttpResponse()
response.content = _('It works!')
reveal_type(response.content) # N: Revealed type is "builtins.bytes"
return response
- case: streaming_http_response
main: |
from django.http.request import HttpRequest
from django.http.response import StreamingHttpResponse
from django.utils.translation import gettext_lazy as _
def empty_response(request: HttpRequest) -> StreamingHttpResponse:
return StreamingHttpResponse()
def str_response(request: HttpRequest) -> StreamingHttpResponse:
return StreamingHttpResponse(['It works!'])
def bytes_response(request: HttpRequest) -> StreamingHttpResponse:
return StreamingHttpResponse([b'It works!'])
def object_response(request: HttpRequest) -> StreamingHttpResponse:
return StreamingHttpResponse([_('It works!')])
def mixed_response(request: HttpRequest) -> StreamingHttpResponse:
return StreamingHttpResponse([_('Yes'), '/', _('No')])
- case: streaming_http_response_streaming_content
main: |
from typing_extensions import reveal_type
from django.http.request import HttpRequest
from django.http.response import StreamingHttpResponse
from django.utils.translation import gettext_lazy as _
def empty_response(request: HttpRequest) -> StreamingHttpResponse:
response = StreamingHttpResponse()
reveal_type(response.streaming_content) # N: Revealed type is "typing.Iterator[builtins.bytes] | typing.AsyncIterator[builtins.bytes]"
return response
def str_response(request: HttpRequest) -> StreamingHttpResponse:
response = StreamingHttpResponse()
response.streaming_content = ['It works!']
reveal_type(response.streaming_content) # N: Revealed type is "typing.Iterator[builtins.bytes] | typing.AsyncIterator[builtins.bytes]"
return response
def bytes_response(request: HttpRequest) -> StreamingHttpResponse:
response = StreamingHttpResponse()
response.streaming_content = [b'It works!']
reveal_type(response.streaming_content) # N: Revealed type is "typing.Iterator[builtins.bytes] | typing.AsyncIterator[builtins.bytes]"
return response
def object_response(request: HttpRequest) -> StreamingHttpResponse:
response = StreamingHttpResponse()
response.streaming_content = [_('It works!')]
reveal_type(response.streaming_content) # N: Revealed type is "typing.Iterator[builtins.bytes] | typing.AsyncIterator[builtins.bytes]"
return response
def mixed_response(request: HttpRequest) -> StreamingHttpResponse:
response = StreamingHttpResponse()
response.streaming_content = [_('Yes'), '/', _('No')]
reveal_type(response.streaming_content) # N: Revealed type is "typing.Iterator[builtins.bytes] | typing.AsyncIterator[builtins.bytes]"
return response
- case: streaming_http_response_async
main: |
import typing
from django.http.request import HttpRequest
from django.http.response import StreamingHttpResponse
from django.utils.translation import gettext_lazy as _
def str_response(request: HttpRequest) -> StreamingHttpResponse:
async def str_iterator() -> typing.AsyncIterator[str]:
yield 'It works!'
return StreamingHttpResponse(str_iterator())
def bytes_response(request: HttpRequest) -> StreamingHttpResponse:
async def bytes_iterator() -> typing.AsyncIterator[bytes]:
yield b'It works!'
return StreamingHttpResponse(bytes_iterator())
def object_response(request: HttpRequest) -> StreamingHttpResponse:
async def object_iterator() -> typing.AsyncIterator[object]:
yield _('It works!')
return StreamingHttpResponse(object_iterator())
def mixed_response(request: HttpRequest) -> StreamingHttpResponse:
async def mixed_iterator() -> typing.AsyncIterator[object]:
yield _('Yes')
yield '/'
yield _('No')
return StreamingHttpResponse(mixed_iterator())
- case: streaming_http_response_async_streaming_content
main: |
import typing
from typing_extensions import reveal_type
from django.http.request import HttpRequest
from django.http.response import StreamingHttpResponse
from django.utils.translation import gettext_lazy as _
def str_response(request: HttpRequest) -> StreamingHttpResponse:
response = StreamingHttpResponse()
async def str_iterator() -> typing.AsyncIterator[str]:
yield 'It works!'
response.streaming_content = str_iterator()
reveal_type(response.streaming_content) # N: Revealed type is "typing.Iterator[builtins.bytes] | typing.AsyncIterator[builtins.bytes]"
return response
def bytes_response(request: HttpRequest) -> StreamingHttpResponse:
response = StreamingHttpResponse()
async def bytes_iterator() -> typing.AsyncIterator[bytes]:
yield b'It works!'
response.streaming_content = bytes_iterator()
reveal_type(response.streaming_content) # N: Revealed type is "typing.AsyncIterator[builtins.bytes]"
return response
def object_response(request: HttpRequest) -> StreamingHttpResponse:
response = StreamingHttpResponse()
async def object_iterator() -> typing.AsyncIterator[object]:
yield _('It works!')
response.streaming_content = object_iterator()
reveal_type(response.streaming_content) # N: Revealed type is "typing.Iterator[builtins.bytes] | typing.AsyncIterator[builtins.bytes]"
return response
def mixed_response(request: HttpRequest) -> StreamingHttpResponse:
response = StreamingHttpResponse()
async def mixed_iterator() -> typing.AsyncIterator[object]:
yield _('Yes')
yield '/'
yield _('No')
response.streaming_content = mixed_iterator()
reveal_type(response.streaming_content) # N: Revealed type is "typing.Iterator[builtins.bytes] | typing.AsyncIterator[builtins.bytes]"
return response
django-stubs-5.2.9/uv.lock 0000664 0000000 0000000 00001000445 15134010516 0015433 0 ustar 00root root 0000000 0000000 version = 1
revision = 3
requires-python = ">=3.10"
resolution-markers = [
"python_full_version >= '3.12'",
"python_full_version < '3.12'",
]
[manifest]
members = [
"django-stubs",
"django-stubs-ext",
]
[[package]]
name = "asgiref"
version = "3.11.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "typing-extensions", marker = "python_full_version < '3.11'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/76/b9/4db2509eabd14b4a8c71d1b24c8d5734c52b8560a7b1e1a8b56c8d25568b/asgiref-3.11.0.tar.gz", hash = "sha256:13acff32519542a1736223fb79a715acdebe24286d98e8b164a73085f40da2c4", size = 37969, upload-time = "2025-11-19T15:32:20.106Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/91/be/317c2c55b8bbec407257d45f5c8d1b6867abc76d12043f2d3d58c538a4ea/asgiref-3.11.0-py3-none-any.whl", hash = "sha256:1db9021efadb0d9512ce8ffaf72fcef601c7b73a8807a1bb2ef143dc6b14846d", size = 24096, upload-time = "2025-11-19T15:32:19.004Z" },
]
[[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 = "25.4.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11", size = 934251, upload-time = "2025-10-06T13:54:44.725Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" },
]
[[package]]
name = "cffi"
version = "2.0.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pycparser", marker = "implementation_name != 'PyPy'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/93/d7/516d984057745a6cd96575eea814fe1edd6646ee6efd552fb7b0921dec83/cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44", size = 184283, upload-time = "2025-09-08T23:22:08.01Z" },
{ url = "https://files.pythonhosted.org/packages/9e/84/ad6a0b408daa859246f57c03efd28e5dd1b33c21737c2db84cae8c237aa5/cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49", size = 180504, upload-time = "2025-09-08T23:22:10.637Z" },
{ url = "https://files.pythonhosted.org/packages/50/bd/b1a6362b80628111e6653c961f987faa55262b4002fcec42308cad1db680/cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c", size = 208811, upload-time = "2025-09-08T23:22:12.267Z" },
{ url = "https://files.pythonhosted.org/packages/4f/27/6933a8b2562d7bd1fb595074cf99cc81fc3789f6a6c05cdabb46284a3188/cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb", size = 216402, upload-time = "2025-09-08T23:22:13.455Z" },
{ url = "https://files.pythonhosted.org/packages/05/eb/b86f2a2645b62adcfff53b0dd97e8dfafb5c8aa864bd0d9a2c2049a0d551/cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0", size = 203217, upload-time = "2025-09-08T23:22:14.596Z" },
{ url = "https://files.pythonhosted.org/packages/9f/e0/6cbe77a53acf5acc7c08cc186c9928864bd7c005f9efd0d126884858a5fe/cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4", size = 203079, upload-time = "2025-09-08T23:22:15.769Z" },
{ url = "https://files.pythonhosted.org/packages/98/29/9b366e70e243eb3d14a5cb488dfd3a0b6b2f1fb001a203f653b93ccfac88/cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453", size = 216475, upload-time = "2025-09-08T23:22:17.427Z" },
{ url = "https://files.pythonhosted.org/packages/21/7a/13b24e70d2f90a322f2900c5d8e1f14fa7e2a6b3332b7309ba7b2ba51a5a/cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495", size = 218829, upload-time = "2025-09-08T23:22:19.069Z" },
{ url = "https://files.pythonhosted.org/packages/60/99/c9dc110974c59cc981b1f5b66e1d8af8af764e00f0293266824d9c4254bc/cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5", size = 211211, upload-time = "2025-09-08T23:22:20.588Z" },
{ url = "https://files.pythonhosted.org/packages/49/72/ff2d12dbf21aca1b32a40ed792ee6b40f6dc3a9cf1644bd7ef6e95e0ac5e/cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb", size = 218036, upload-time = "2025-09-08T23:22:22.143Z" },
{ url = "https://files.pythonhosted.org/packages/e2/cc/027d7fb82e58c48ea717149b03bcadcbdc293553edb283af792bd4bcbb3f/cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a", size = 172184, upload-time = "2025-09-08T23:22:23.328Z" },
{ url = "https://files.pythonhosted.org/packages/33/fa/072dd15ae27fbb4e06b437eb6e944e75b068deb09e2a2826039e49ee2045/cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739", size = 182790, upload-time = "2025-09-08T23:22:24.752Z" },
{ url = "https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe", size = 184344, upload-time = "2025-09-08T23:22:26.456Z" },
{ url = "https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", size = 180560, upload-time = "2025-09-08T23:22:28.197Z" },
{ url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613, upload-time = "2025-09-08T23:22:29.475Z" },
{ url = "https://files.pythonhosted.org/packages/b8/56/6033f5e86e8cc9bb629f0077ba71679508bdf54a9a5e112a3c0b91870332/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", size = 216476, upload-time = "2025-09-08T23:22:31.063Z" },
{ url = "https://files.pythonhosted.org/packages/dc/7f/55fecd70f7ece178db2f26128ec41430d8720f2d12ca97bf8f0a628207d5/cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5", size = 203374, upload-time = "2025-09-08T23:22:32.507Z" },
{ url = "https://files.pythonhosted.org/packages/84/ef/a7b77c8bdc0f77adc3b46888f1ad54be8f3b7821697a7b89126e829e676a/cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664", size = 202597, upload-time = "2025-09-08T23:22:34.132Z" },
{ url = "https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", size = 215574, upload-time = "2025-09-08T23:22:35.443Z" },
{ url = "https://files.pythonhosted.org/packages/44/64/58f6255b62b101093d5df22dcb752596066c7e89dd725e0afaed242a61be/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", size = 218971, upload-time = "2025-09-08T23:22:36.805Z" },
{ url = "https://files.pythonhosted.org/packages/ab/49/fa72cebe2fd8a55fbe14956f9970fe8eb1ac59e5df042f603ef7c8ba0adc/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414", size = 211972, upload-time = "2025-09-08T23:22:38.436Z" },
{ url = "https://files.pythonhosted.org/packages/0b/28/dd0967a76aab36731b6ebfe64dec4e981aff7e0608f60c2d46b46982607d/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", size = 217078, upload-time = "2025-09-08T23:22:39.776Z" },
{ url = "https://files.pythonhosted.org/packages/2b/c0/015b25184413d7ab0a410775fdb4a50fca20f5589b5dab1dbbfa3baad8ce/cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5", size = 172076, upload-time = "2025-09-08T23:22:40.95Z" },
{ url = "https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5", size = 182820, upload-time = "2025-09-08T23:22:42.463Z" },
{ url = "https://files.pythonhosted.org/packages/95/5c/1b493356429f9aecfd56bc171285a4c4ac8697f76e9bbbbb105e537853a1/cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d", size = 177635, upload-time = "2025-09-08T23:22:43.623Z" },
{ url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" },
{ url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" },
{ url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" },
{ url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" },
{ url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" },
{ url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" },
{ url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" },
{ url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" },
{ url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" },
{ url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" },
{ url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" },
{ url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" },
{ url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" },
{ url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" },
{ url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" },
{ url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" },
{ url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" },
{ url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" },
{ url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" },
{ url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" },
{ url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" },
{ url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" },
{ url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" },
{ url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" },
{ url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" },
{ url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" },
{ url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" },
{ url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" },
{ url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" },
{ url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" },
{ url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" },
{ url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" },
{ url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" },
{ url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" },
{ url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" },
{ url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" },
{ url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" },
{ url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" },
{ url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" },
{ url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" },
{ url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" },
{ url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" },
{ url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" },
{ url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" },
{ url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" },
{ url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" },
]
[[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 = "46.0.3"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "cffi", marker = "platform_python_implementation != 'PyPy'" },
{ name = "typing-extensions", marker = "python_full_version < '3.11'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/9f/33/c00162f49c0e2fe8064a62cb92b93e50c74a72bc370ab92f86112b33ff62/cryptography-46.0.3.tar.gz", hash = "sha256:a8b17438104fed022ce745b362294d9ce35b4c2e45c1d958ad4a4b019285f4a1", size = 749258, upload-time = "2025-10-15T23:18:31.74Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/1d/42/9c391dd801d6cf0d561b5890549d4b27bafcc53b39c31a817e69d87c625b/cryptography-46.0.3-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:109d4ddfadf17e8e7779c39f9b18111a09efb969a301a31e987416a0191ed93a", size = 7225004, upload-time = "2025-10-15T23:16:52.239Z" },
{ url = "https://files.pythonhosted.org/packages/1c/67/38769ca6b65f07461eb200e85fc1639b438bdc667be02cf7f2cd6a64601c/cryptography-46.0.3-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:09859af8466b69bc3c27bdf4f5d84a665e0f7ab5088412e9e2ec49758eca5cbc", size = 4296667, upload-time = "2025-10-15T23:16:54.369Z" },
{ url = "https://files.pythonhosted.org/packages/5c/49/498c86566a1d80e978b42f0d702795f69887005548c041636df6ae1ca64c/cryptography-46.0.3-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:01ca9ff2885f3acc98c29f1860552e37f6d7c7d013d7334ff2a9de43a449315d", size = 4450807, upload-time = "2025-10-15T23:16:56.414Z" },
{ url = "https://files.pythonhosted.org/packages/4b/0a/863a3604112174c8624a2ac3c038662d9e59970c7f926acdcfaed8d61142/cryptography-46.0.3-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6eae65d4c3d33da080cff9c4ab1f711b15c1d9760809dad6ea763f3812d254cb", size = 4299615, upload-time = "2025-10-15T23:16:58.442Z" },
{ url = "https://files.pythonhosted.org/packages/64/02/b73a533f6b64a69f3cd3872acb6ebc12aef924d8d103133bb3ea750dc703/cryptography-46.0.3-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5bf0ed4490068a2e72ac03d786693adeb909981cc596425d09032d372bcc849", size = 4016800, upload-time = "2025-10-15T23:17:00.378Z" },
{ url = "https://files.pythonhosted.org/packages/25/d5/16e41afbfa450cde85a3b7ec599bebefaef16b5c6ba4ec49a3532336ed72/cryptography-46.0.3-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5ecfccd2329e37e9b7112a888e76d9feca2347f12f37918facbb893d7bb88ee8", size = 4984707, upload-time = "2025-10-15T23:17:01.98Z" },
{ url = "https://files.pythonhosted.org/packages/c9/56/e7e69b427c3878352c2fb9b450bd0e19ed552753491d39d7d0a2f5226d41/cryptography-46.0.3-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a2c0cd47381a3229c403062f764160d57d4d175e022c1df84e168c6251a22eec", size = 4482541, upload-time = "2025-10-15T23:17:04.078Z" },
{ url = "https://files.pythonhosted.org/packages/78/f6/50736d40d97e8483172f1bb6e698895b92a223dba513b0ca6f06b2365339/cryptography-46.0.3-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:549e234ff32571b1f4076ac269fcce7a808d3bf98b76c8dd560e42dbc66d7d91", size = 4299464, upload-time = "2025-10-15T23:17:05.483Z" },
{ url = "https://files.pythonhosted.org/packages/00/de/d8e26b1a855f19d9994a19c702fa2e93b0456beccbcfe437eda00e0701f2/cryptography-46.0.3-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:c0a7bb1a68a5d3471880e264621346c48665b3bf1c3759d682fc0864c540bd9e", size = 4950838, upload-time = "2025-10-15T23:17:07.425Z" },
{ url = "https://files.pythonhosted.org/packages/8f/29/798fc4ec461a1c9e9f735f2fc58741b0daae30688f41b2497dcbc9ed1355/cryptography-46.0.3-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:10b01676fc208c3e6feeb25a8b83d81767e8059e1fe86e1dc62d10a3018fa926", size = 4481596, upload-time = "2025-10-15T23:17:09.343Z" },
{ url = "https://files.pythonhosted.org/packages/15/8d/03cd48b20a573adfff7652b76271078e3045b9f49387920e7f1f631d125e/cryptography-46.0.3-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0abf1ffd6e57c67e92af68330d05760b7b7efb243aab8377e583284dbab72c71", size = 4426782, upload-time = "2025-10-15T23:17:11.22Z" },
{ url = "https://files.pythonhosted.org/packages/fa/b1/ebacbfe53317d55cf33165bda24c86523497a6881f339f9aae5c2e13e57b/cryptography-46.0.3-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a04bee9ab6a4da801eb9b51f1b708a1b5b5c9eb48c03f74198464c66f0d344ac", size = 4698381, upload-time = "2025-10-15T23:17:12.829Z" },
{ url = "https://files.pythonhosted.org/packages/96/92/8a6a9525893325fc057a01f654d7efc2c64b9de90413adcf605a85744ff4/cryptography-46.0.3-cp311-abi3-win32.whl", hash = "sha256:f260d0d41e9b4da1ed1e0f1ce571f97fe370b152ab18778e9e8f67d6af432018", size = 3055988, upload-time = "2025-10-15T23:17:14.65Z" },
{ url = "https://files.pythonhosted.org/packages/7e/bf/80fbf45253ea585a1e492a6a17efcb93467701fa79e71550a430c5e60df0/cryptography-46.0.3-cp311-abi3-win_amd64.whl", hash = "sha256:a9a3008438615669153eb86b26b61e09993921ebdd75385ddd748702c5adfddb", size = 3514451, upload-time = "2025-10-15T23:17:16.142Z" },
{ url = "https://files.pythonhosted.org/packages/2e/af/9b302da4c87b0beb9db4e756386a7c6c5b8003cd0e742277888d352ae91d/cryptography-46.0.3-cp311-abi3-win_arm64.whl", hash = "sha256:5d7f93296ee28f68447397bf5198428c9aeeab45705a55d53a6343455dcb2c3c", size = 2928007, upload-time = "2025-10-15T23:17:18.04Z" },
{ url = "https://files.pythonhosted.org/packages/f5/e2/a510aa736755bffa9d2f75029c229111a1d02f8ecd5de03078f4c18d91a3/cryptography-46.0.3-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:00a5e7e87938e5ff9ff5447ab086a5706a957137e6e433841e9d24f38a065217", size = 7158012, upload-time = "2025-10-15T23:17:19.982Z" },
{ url = "https://files.pythonhosted.org/packages/73/dc/9aa866fbdbb95b02e7f9d086f1fccfeebf8953509b87e3f28fff927ff8a0/cryptography-46.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c8daeb2d2174beb4575b77482320303f3d39b8e81153da4f0fb08eb5fe86a6c5", size = 4288728, upload-time = "2025-10-15T23:17:21.527Z" },
{ url = "https://files.pythonhosted.org/packages/c5/fd/bc1daf8230eaa075184cbbf5f8cd00ba9db4fd32d63fb83da4671b72ed8a/cryptography-46.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:39b6755623145ad5eff1dab323f4eae2a32a77a7abef2c5089a04a3d04366715", size = 4435078, upload-time = "2025-10-15T23:17:23.042Z" },
{ url = "https://files.pythonhosted.org/packages/82/98/d3bd5407ce4c60017f8ff9e63ffee4200ab3e23fe05b765cab805a7db008/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:db391fa7c66df6762ee3f00c95a89e6d428f4d60e7abc8328f4fe155b5ac6e54", size = 4293460, upload-time = "2025-10-15T23:17:24.885Z" },
{ url = "https://files.pythonhosted.org/packages/26/e9/e23e7900983c2b8af7a08098db406cf989d7f09caea7897e347598d4cd5b/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:78a97cf6a8839a48c49271cdcbd5cf37ca2c1d6b7fdd86cc864f302b5e9bf459", size = 3995237, upload-time = "2025-10-15T23:17:26.449Z" },
{ url = "https://files.pythonhosted.org/packages/91/15/af68c509d4a138cfe299d0d7ddb14afba15233223ebd933b4bbdbc7155d3/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:dfb781ff7eaa91a6f7fd41776ec37c5853c795d3b358d4896fdbb5df168af422", size = 4967344, upload-time = "2025-10-15T23:17:28.06Z" },
{ url = "https://files.pythonhosted.org/packages/ca/e3/8643d077c53868b681af077edf6b3cb58288b5423610f21c62aadcbe99f4/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:6f61efb26e76c45c4a227835ddeae96d83624fb0d29eb5df5b96e14ed1a0afb7", size = 4466564, upload-time = "2025-10-15T23:17:29.665Z" },
{ url = "https://files.pythonhosted.org/packages/0e/43/c1e8726fa59c236ff477ff2b5dc071e54b21e5a1e51aa2cee1676f1c986f/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:23b1a8f26e43f47ceb6d6a43115f33a5a37d57df4ea0ca295b780ae8546e8044", size = 4292415, upload-time = "2025-10-15T23:17:31.686Z" },
{ url = "https://files.pythonhosted.org/packages/42/f9/2f8fefdb1aee8a8e3256a0568cffc4e6d517b256a2fe97a029b3f1b9fe7e/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:b419ae593c86b87014b9be7396b385491ad7f320bde96826d0dd174459e54665", size = 4931457, upload-time = "2025-10-15T23:17:33.478Z" },
{ url = "https://files.pythonhosted.org/packages/79/30/9b54127a9a778ccd6d27c3da7563e9f2d341826075ceab89ae3b41bf5be2/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:50fc3343ac490c6b08c0cf0d704e881d0d660be923fd3076db3e932007e726e3", size = 4466074, upload-time = "2025-10-15T23:17:35.158Z" },
{ url = "https://files.pythonhosted.org/packages/ac/68/b4f4a10928e26c941b1b6a179143af9f4d27d88fe84a6a3c53592d2e76bf/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:22d7e97932f511d6b0b04f2bfd818d73dcd5928db509460aaf48384778eb6d20", size = 4420569, upload-time = "2025-10-15T23:17:37.188Z" },
{ url = "https://files.pythonhosted.org/packages/a3/49/3746dab4c0d1979888f125226357d3262a6dd40e114ac29e3d2abdf1ec55/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d55f3dffadd674514ad19451161118fd010988540cee43d8bc20675e775925de", size = 4681941, upload-time = "2025-10-15T23:17:39.236Z" },
{ url = "https://files.pythonhosted.org/packages/fd/30/27654c1dbaf7e4a3531fa1fc77986d04aefa4d6d78259a62c9dc13d7ad36/cryptography-46.0.3-cp314-cp314t-win32.whl", hash = "sha256:8a6e050cb6164d3f830453754094c086ff2d0b2f3a897a1d9820f6139a1f0914", size = 3022339, upload-time = "2025-10-15T23:17:40.888Z" },
{ url = "https://files.pythonhosted.org/packages/f6/30/640f34ccd4d2a1bc88367b54b926b781b5a018d65f404d409aba76a84b1c/cryptography-46.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:760f83faa07f8b64e9c33fc963d790a2edb24efb479e3520c14a45741cd9b2db", size = 3494315, upload-time = "2025-10-15T23:17:42.769Z" },
{ url = "https://files.pythonhosted.org/packages/ba/8b/88cc7e3bd0a8e7b861f26981f7b820e1f46aa9d26cc482d0feba0ecb4919/cryptography-46.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:516ea134e703e9fe26bcd1277a4b59ad30586ea90c365a87781d7887a646fe21", size = 2919331, upload-time = "2025-10-15T23:17:44.468Z" },
{ url = "https://files.pythonhosted.org/packages/fd/23/45fe7f376a7df8daf6da3556603b36f53475a99ce4faacb6ba2cf3d82021/cryptography-46.0.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:cb3d760a6117f621261d662bccc8ef5bc32ca673e037c83fbe565324f5c46936", size = 7218248, upload-time = "2025-10-15T23:17:46.294Z" },
{ url = "https://files.pythonhosted.org/packages/27/32/b68d27471372737054cbd34c84981f9edbc24fe67ca225d389799614e27f/cryptography-46.0.3-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4b7387121ac7d15e550f5cb4a43aef2559ed759c35df7336c402bb8275ac9683", size = 4294089, upload-time = "2025-10-15T23:17:48.269Z" },
{ url = "https://files.pythonhosted.org/packages/26/42/fa8389d4478368743e24e61eea78846a0006caffaf72ea24a15159215a14/cryptography-46.0.3-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:15ab9b093e8f09daab0f2159bb7e47532596075139dd74365da52ecc9cb46c5d", size = 4440029, upload-time = "2025-10-15T23:17:49.837Z" },
{ url = "https://files.pythonhosted.org/packages/5f/eb/f483db0ec5ac040824f269e93dd2bd8a21ecd1027e77ad7bdf6914f2fd80/cryptography-46.0.3-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:46acf53b40ea38f9c6c229599a4a13f0d46a6c3fa9ef19fc1a124d62e338dfa0", size = 4297222, upload-time = "2025-10-15T23:17:51.357Z" },
{ url = "https://files.pythonhosted.org/packages/fd/cf/da9502c4e1912cb1da3807ea3618a6829bee8207456fbbeebc361ec38ba3/cryptography-46.0.3-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:10ca84c4668d066a9878890047f03546f3ae0a6b8b39b697457b7757aaf18dbc", size = 4012280, upload-time = "2025-10-15T23:17:52.964Z" },
{ url = "https://files.pythonhosted.org/packages/6b/8f/9adb86b93330e0df8b3dcf03eae67c33ba89958fc2e03862ef1ac2b42465/cryptography-46.0.3-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:36e627112085bb3b81b19fed209c05ce2a52ee8b15d161b7c643a7d5a88491f3", size = 4978958, upload-time = "2025-10-15T23:17:54.965Z" },
{ url = "https://files.pythonhosted.org/packages/d1/a0/5fa77988289c34bdb9f913f5606ecc9ada1adb5ae870bd0d1054a7021cc4/cryptography-46.0.3-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1000713389b75c449a6e979ffc7dcc8ac90b437048766cef052d4d30b8220971", size = 4473714, upload-time = "2025-10-15T23:17:56.754Z" },
{ url = "https://files.pythonhosted.org/packages/14/e5/fc82d72a58d41c393697aa18c9abe5ae1214ff6f2a5c18ac470f92777895/cryptography-46.0.3-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:b02cf04496f6576afffef5ddd04a0cb7d49cf6be16a9059d793a30b035f6b6ac", size = 4296970, upload-time = "2025-10-15T23:17:58.588Z" },
{ url = "https://files.pythonhosted.org/packages/78/06/5663ed35438d0b09056973994f1aec467492b33bd31da36e468b01ec1097/cryptography-46.0.3-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:71e842ec9bc7abf543b47cf86b9a743baa95f4677d22baa4c7d5c69e49e9bc04", size = 4940236, upload-time = "2025-10-15T23:18:00.897Z" },
{ url = "https://files.pythonhosted.org/packages/fc/59/873633f3f2dcd8a053b8dd1d38f783043b5fce589c0f6988bf55ef57e43e/cryptography-46.0.3-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:402b58fc32614f00980b66d6e56a5b4118e6cb362ae8f3fda141ba4689bd4506", size = 4472642, upload-time = "2025-10-15T23:18:02.749Z" },
{ url = "https://files.pythonhosted.org/packages/3d/39/8e71f3930e40f6877737d6f69248cf74d4e34b886a3967d32f919cc50d3b/cryptography-46.0.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ef639cb3372f69ec44915fafcd6698b6cc78fbe0c2ea41be867f6ed612811963", size = 4423126, upload-time = "2025-10-15T23:18:04.85Z" },
{ url = "https://files.pythonhosted.org/packages/cd/c7/f65027c2810e14c3e7268353b1681932b87e5a48e65505d8cc17c99e36ae/cryptography-46.0.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b51b8ca4f1c6453d8829e1eb7299499ca7f313900dd4d89a24b8b87c0a780d4", size = 4686573, upload-time = "2025-10-15T23:18:06.908Z" },
{ url = "https://files.pythonhosted.org/packages/0a/6e/1c8331ddf91ca4730ab3086a0f1be19c65510a33b5a441cb334e7a2d2560/cryptography-46.0.3-cp38-abi3-win32.whl", hash = "sha256:6276eb85ef938dc035d59b87c8a7dc559a232f954962520137529d77b18ff1df", size = 3036695, upload-time = "2025-10-15T23:18:08.672Z" },
{ url = "https://files.pythonhosted.org/packages/90/45/b0d691df20633eff80955a0fc7695ff9051ffce8b69741444bd9ed7bd0db/cryptography-46.0.3-cp38-abi3-win_amd64.whl", hash = "sha256:416260257577718c05135c55958b674000baef9a1c7d9e8f306ec60d71db850f", size = 3501720, upload-time = "2025-10-15T23:18:10.632Z" },
{ url = "https://files.pythonhosted.org/packages/e8/cb/2da4cc83f5edb9c3257d09e1e7ab7b23f049c7962cae8d842bbef0a9cec9/cryptography-46.0.3-cp38-abi3-win_arm64.whl", hash = "sha256:d89c3468de4cdc4f08a57e214384d0471911a3830fcdaf7a8cc587e42a866372", size = 2918740, upload-time = "2025-10-15T23:18:12.277Z" },
{ url = "https://files.pythonhosted.org/packages/d9/cd/1a8633802d766a0fa46f382a77e096d7e209e0817892929655fe0586ae32/cryptography-46.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a23582810fedb8c0bc47524558fb6c56aac3fc252cb306072fd2815da2a47c32", size = 3689163, upload-time = "2025-10-15T23:18:13.821Z" },
{ url = "https://files.pythonhosted.org/packages/4c/59/6b26512964ace6480c3e54681a9859c974172fb141c38df11eadd8416947/cryptography-46.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e7aec276d68421f9574040c26e2a7c3771060bc0cff408bae1dcb19d3ab1e63c", size = 3429474, upload-time = "2025-10-15T23:18:15.477Z" },
{ url = "https://files.pythonhosted.org/packages/06/8a/e60e46adab4362a682cf142c7dcb5bf79b782ab2199b0dcb81f55970807f/cryptography-46.0.3-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7ce938a99998ed3c8aa7e7272dca1a610401ede816d36d0693907d863b10d9ea", size = 3698132, upload-time = "2025-10-15T23:18:17.056Z" },
{ url = "https://files.pythonhosted.org/packages/da/38/f59940ec4ee91e93d3311f7532671a5cef5570eb04a144bf203b58552d11/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:191bb60a7be5e6f54e30ba16fdfae78ad3a342a0599eb4193ba88e3f3d6e185b", size = 4243992, upload-time = "2025-10-15T23:18:18.695Z" },
{ url = "https://files.pythonhosted.org/packages/b0/0c/35b3d92ddebfdfda76bb485738306545817253d0a3ded0bfe80ef8e67aa5/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c70cc23f12726be8f8bc72e41d5065d77e4515efae3690326764ea1b07845cfb", size = 4409944, upload-time = "2025-10-15T23:18:20.597Z" },
{ url = "https://files.pythonhosted.org/packages/99/55/181022996c4063fc0e7666a47049a1ca705abb9c8a13830f074edb347495/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:9394673a9f4de09e28b5356e7fff97d778f8abad85c9d5ac4a4b7e25a0de7717", size = 4242957, upload-time = "2025-10-15T23:18:22.18Z" },
{ url = "https://files.pythonhosted.org/packages/ba/af/72cd6ef29f9c5f731251acadaeb821559fe25f10852f44a63374c9ca08c1/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:94cd0549accc38d1494e1f8de71eca837d0509d0d44bf11d158524b0e12cebf9", size = 4409447, upload-time = "2025-10-15T23:18:24.209Z" },
{ url = "https://files.pythonhosted.org/packages/0d/c3/e90f4a4feae6410f914f8ebac129b9ae7a8c92eb60a638012dde42030a9d/cryptography-46.0.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6b5063083824e5509fdba180721d55909ffacccc8adbec85268b48439423d78c", size = 3438528, upload-time = "2025-10-15T23:18:26.227Z" },
]
[[package]]
name = "decorator"
version = "5.2.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711, upload-time = "2025-02-24T04:41:34.073Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" },
]
[[package]]
name = "django"
version = "5.2.10"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "asgiref" },
{ name = "sqlparse" },
{ name = "tzdata", marker = "sys_platform == 'win32'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/e6/e5/2671df24bf0ded831768ef79532e5a7922485411a5696f6d979568591a37/django-5.2.10.tar.gz", hash = "sha256:74df100784c288c50a2b5cad59631d71214f40f72051d5af3fdf220c20bdbbbe", size = 10880754, upload-time = "2026-01-06T18:55:26.817Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/fa/de/f1a7cd896daec85832136ab509d9b2a6daed4939dbe26313af3e95fc5f5e/django-5.2.10-py3-none-any.whl", hash = "sha256:cf85067a64250c95d5f9067b056c5eaa80591929f7e16fbcd997746e40d6c45c", size = 8290820, upload-time = "2026-01-06T18:55:20.009Z" },
]
[[package]]
name = "django-stubs"
version = "5.2.9"
source = { editable = "." }
dependencies = [
{ name = "django" },
{ name = "django-stubs-ext" },
{ name = "tomli", marker = "python_full_version < '3.11'" },
{ 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" },
{ name = "django-stubs", extra = ["compatible-mypy", "oracle", "redis"] },
{ name = "jinja2" },
{ name = "mysqlclient" },
{ name = "psycopg2-binary" },
{ name = "pyrefly" },
{ name = "pyright" },
{ name = "pytest" },
{ name = "pytest-mypy-plugins" },
{ name = "pytest-shard" },
{ name = "pytest-xdist" },
{ name = "pyyaml" },
]
pyrefly = [
{ name = "pyrefly" },
]
pyright = [
{ name = "pyright" },
]
tests = [
{ name = "django" },
{ name = "django-stubs", extra = ["compatible-mypy", "oracle", "redis"] },
{ name = "jinja2" },
{ name = "mysqlclient" },
{ name = "psycopg2-binary" },
{ name = "pytest" },
{ name = "pytest-mypy-plugins" },
{ name = "pytest-shard" },
{ name = "pytest-xdist" },
{ name = "pyyaml" },
]
[package.metadata]
requires-dist = [
{ name = "django" },
{ name = "django-stubs-ext", editable = "ext" },
{ name = "mypy", marker = "extra == 'compatible-mypy'", specifier = ">=1.13,<1.20" },
{ name = "oracledb", marker = "extra == 'oracle'" },
{ name = "redis", marker = "extra == 'redis'" },
{ name = "tomli", marker = "python_full_version < '3.11'" },
{ 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", specifier = "==5.2.10" },
{ name = "django-stubs", extras = ["compatible-mypy", "oracle", "redis"], editable = "." },
{ name = "jinja2", specifier = "==3.1.6" },
{ name = "mysqlclient", specifier = "==2.2.7" },
{ name = "psycopg2-binary", specifier = "==2.9.11" },
{ name = "pyrefly", specifier = "==0.48.0" },
{ name = "pyright", specifier = "==1.1.408" },
{ name = "pytest", specifier = "==9.0.2" },
{ name = "pytest-mypy-plugins", specifier = "==3.2.0" },
{ name = "pytest-shard", specifier = "==0.1.2" },
{ name = "pytest-xdist", specifier = "==3.8.0" },
{ name = "pyyaml", specifier = "==6.0.3" },
]
pyrefly = [{ name = "pyrefly", specifier = "==0.48.0" }]
pyright = [{ name = "pyright", specifier = "==1.1.408" }]
tests = [
{ name = "django", specifier = "==5.2.10" },
{ name = "django-stubs", extras = ["compatible-mypy", "oracle", "redis"], editable = "." },
{ name = "jinja2", specifier = "==3.1.6" },
{ name = "mysqlclient", specifier = "==2.2.7" },
{ name = "psycopg2-binary", specifier = "==2.9.11" },
{ name = "pytest", specifier = "==9.0.2" },
{ name = "pytest-mypy-plugins", specifier = "==3.2.0" },
{ name = "pytest-shard", specifier = "==0.1.2" },
{ name = "pytest-xdist", specifier = "==3.8.0" },
{ name = "pyyaml", specifier = "==6.0.3" },
]
[[package]]
name = "django-stubs-ext"
version = "5.2.9"
source = { editable = "ext" }
dependencies = [
{ name = "django" },
{ name = "typing-extensions" },
]
[package.metadata]
requires-dist = [
{ name = "django" },
{ name = "typing-extensions" },
]
[[package]]
name = "exceptiongroup"
version = "1.3.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "typing-extensions", marker = "python_full_version < '3.12'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" },
]
[[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.25.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "attrs" },
{ name = "jsonschema-specifications" },
{ name = "referencing" },
{ name = "rpds-py" },
]
sdist = { url = "https://files.pythonhosted.org/packages/74/69/f7185de793a29082a9f3c7728268ffb31cb5095131a9c139a74078e27336/jsonschema-4.25.1.tar.gz", hash = "sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85", size = 357342, upload-time = "2025-08-18T17:03:50.038Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/bf/9c/8c95d856233c1f82500c2450b8c68576b4cf1c871db3afac5c34ff84e6fd/jsonschema-4.25.1-py3-none-any.whl", hash = "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63", size = 90040, upload-time = "2025-08-18T17:03:48.373Z" },
]
[[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.7.7"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/b7/29/47f29026ca17f35cf299290292d5f8331f5077364974b7675a353179afa2/librt-0.7.7.tar.gz", hash = "sha256:81d957b069fed1890953c3b9c3895c7689960f233eea9a1d9607f71ce7f00b2c", size = 145910, upload-time = "2026-01-01T23:52:22.87Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/c6/84/2cfb1f3b9b60bab52e16a220c931223fc8e963d0d7bb9132bef012aafc3f/librt-0.7.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4836c5645f40fbdc275e5670819bde5ab5f2e882290d304e3c6ddab1576a6d0", size = 54709, upload-time = "2026-01-01T23:50:48.326Z" },
{ url = "https://files.pythonhosted.org/packages/19/a1/3127b277e9d3784a8040a54e8396d9ae5c64d6684dc6db4b4089b0eedcfb/librt-0.7.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ae8aec43117a645a31e5f60e9e3a0797492e747823b9bda6972d521b436b4e8", size = 56658, upload-time = "2026-01-01T23:50:49.74Z" },
{ url = "https://files.pythonhosted.org/packages/3a/e9/b91b093a5c42eb218120445f3fef82e0b977fa2225f4d6fc133d25cdf86a/librt-0.7.7-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:aea05f701ccd2a76b34f0daf47ca5068176ff553510b614770c90d76ac88df06", size = 161026, upload-time = "2026-01-01T23:50:50.853Z" },
{ url = "https://files.pythonhosted.org/packages/c7/cb/1ded77d5976a79d7057af4a010d577ce4f473ff280984e68f4974a3281e5/librt-0.7.7-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7b16ccaeff0ed4355dfb76fe1ea7a5d6d03b5ad27f295f77ee0557bc20a72495", size = 169529, upload-time = "2026-01-01T23:50:52.24Z" },
{ url = "https://files.pythonhosted.org/packages/da/6e/6ca5bdaa701e15f05000ac1a4c5d1475c422d3484bd3d1ca9e8c2f5be167/librt-0.7.7-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c48c7e150c095d5e3cea7452347ba26094be905d6099d24f9319a8b475fcd3e0", size = 183271, upload-time = "2026-01-01T23:50:55.287Z" },
{ url = "https://files.pythonhosted.org/packages/e7/2d/55c0e38073997b4bbb5ddff25b6d1bbba8c2f76f50afe5bb9c844b702f34/librt-0.7.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4dcee2f921a8632636d1c37f1bbdb8841d15666d119aa61e5399c5268e7ce02e", size = 179039, upload-time = "2026-01-01T23:50:56.807Z" },
{ url = "https://files.pythonhosted.org/packages/33/4e/3662a41ae8bb81b226f3968426293517b271d34d4e9fd4b59fc511f1ae40/librt-0.7.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:14ef0f4ac3728ffd85bfc58e2f2f48fb4ef4fa871876f13a73a7381d10a9f77c", size = 173505, upload-time = "2026-01-01T23:50:58.291Z" },
{ url = "https://files.pythonhosted.org/packages/f8/5d/cf768deb8bdcbac5f8c21fcb32dd483d038d88c529fd351bbe50590b945d/librt-0.7.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e4ab69fa37f8090f2d971a5d2bc606c7401170dbdae083c393d6cbf439cb45b8", size = 193570, upload-time = "2026-01-01T23:50:59.546Z" },
{ url = "https://files.pythonhosted.org/packages/a1/ea/ee70effd13f1d651976d83a2812391f6203971740705e3c0900db75d4bce/librt-0.7.7-cp310-cp310-win32.whl", hash = "sha256:4bf3cc46d553693382d2abf5f5bd493d71bb0f50a7c0beab18aa13a5545c8900", size = 42600, upload-time = "2026-01-01T23:51:00.694Z" },
{ url = "https://files.pythonhosted.org/packages/f0/eb/dc098730f281cba76c279b71783f5de2edcba3b880c1ab84a093ef826062/librt-0.7.7-cp310-cp310-win_amd64.whl", hash = "sha256:f0c8fe5aeadd8a0e5b0598f8a6ee3533135ca50fd3f20f130f9d72baf5c6ac58", size = 48977, upload-time = "2026-01-01T23:51:01.726Z" },
{ url = "https://files.pythonhosted.org/packages/f0/56/30b5c342518005546df78841cb0820ae85a17e7d07d521c10ef367306d0d/librt-0.7.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a487b71fbf8a9edb72a8c7a456dda0184642d99cd007bc819c0b7ab93676a8ee", size = 54709, upload-time = "2026-01-01T23:51:02.774Z" },
{ url = "https://files.pythonhosted.org/packages/72/78/9f120e3920b22504d4f3835e28b55acc2cc47c9586d2e1b6ba04c3c1bf01/librt-0.7.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f4d4efb218264ecf0f8516196c9e2d1a0679d9fb3bb15df1155a35220062eba8", size = 56663, upload-time = "2026-01-01T23:51:03.838Z" },
{ url = "https://files.pythonhosted.org/packages/1c/ea/7d7a1ee7dfc1151836028eba25629afcf45b56bbc721293e41aa2e9b8934/librt-0.7.7-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b8bb331aad734b059c4b450cd0a225652f16889e286b2345af5e2c3c625c3d85", size = 161705, upload-time = "2026-01-01T23:51:04.917Z" },
{ url = "https://files.pythonhosted.org/packages/45/a5/952bc840ac8917fbcefd6bc5f51ad02b89721729814f3e2bfcc1337a76d6/librt-0.7.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:467dbd7443bda08338fc8ad701ed38cef48194017554f4c798b0a237904b3f99", size = 171029, upload-time = "2026-01-01T23:51:06.09Z" },
{ url = "https://files.pythonhosted.org/packages/fa/bf/c017ff7da82dc9192cf40d5e802a48a25d00e7639b6465cfdcee5893a22c/librt-0.7.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50d1d1ee813d2d1a3baf2873634ba506b263032418d16287c92ec1cc9c1a00cb", size = 184704, upload-time = "2026-01-01T23:51:07.549Z" },
{ url = "https://files.pythonhosted.org/packages/77/ec/72f3dd39d2cdfd6402ab10836dc9cbf854d145226062a185b419c4f1624a/librt-0.7.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c7e5070cf3ec92d98f57574da0224f8c73faf1ddd6d8afa0b8c9f6e86997bc74", size = 180719, upload-time = "2026-01-01T23:51:09.062Z" },
{ url = "https://files.pythonhosted.org/packages/78/86/06e7a1a81b246f3313bf515dd9613a1c81583e6fd7843a9f4d625c4e926d/librt-0.7.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bdb9f3d865b2dafe7f9ad7f30ef563c80d0ddd2fdc8cc9b8e4f242f475e34d75", size = 174537, upload-time = "2026-01-01T23:51:10.611Z" },
{ url = "https://files.pythonhosted.org/packages/83/08/f9fb2edc9c7a76e95b2924ce81d545673f5b034e8c5dd92159d1c7dae0c6/librt-0.7.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8185c8497d45164e256376f9da5aed2bb26ff636c798c9dabe313b90e9f25b28", size = 195238, upload-time = "2026-01-01T23:51:11.762Z" },
{ url = "https://files.pythonhosted.org/packages/ba/56/ea2d2489d3ea1f47b301120e03a099e22de7b32c93df9a211e6ff4f9bf38/librt-0.7.7-cp311-cp311-win32.whl", hash = "sha256:44d63ce643f34a903f09ff7ca355aae019a3730c7afd6a3c037d569beeb5d151", size = 42939, upload-time = "2026-01-01T23:51:13.192Z" },
{ url = "https://files.pythonhosted.org/packages/58/7b/c288f417e42ba2a037f1c0753219e277b33090ed4f72f292fb6fe175db4c/librt-0.7.7-cp311-cp311-win_amd64.whl", hash = "sha256:7d13cc340b3b82134f8038a2bfe7137093693dcad8ba5773da18f95ad6b77a8a", size = 49240, upload-time = "2026-01-01T23:51:14.264Z" },
{ url = "https://files.pythonhosted.org/packages/7c/24/738eb33a6c1516fdb2dfd2a35db6e5300f7616679b573585be0409bc6890/librt-0.7.7-cp311-cp311-win_arm64.whl", hash = "sha256:983de36b5a83fe9222f4f7dcd071f9b1ac6f3f17c0af0238dadfb8229588f890", size = 42613, upload-time = "2026-01-01T23:51:15.268Z" },
{ url = "https://files.pythonhosted.org/packages/56/72/1cd9d752070011641e8aee046c851912d5f196ecd726fffa7aed2070f3e0/librt-0.7.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2a85a1fc4ed11ea0eb0a632459ce004a2d14afc085a50ae3463cd3dfe1ce43fc", size = 55687, upload-time = "2026-01-01T23:51:16.291Z" },
{ url = "https://files.pythonhosted.org/packages/50/aa/d5a1d4221c4fe7e76ae1459d24d6037783cb83c7645164c07d7daf1576ec/librt-0.7.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c87654e29a35938baead1c4559858f346f4a2a7588574a14d784f300ffba0efd", size = 57136, upload-time = "2026-01-01T23:51:17.363Z" },
{ url = "https://files.pythonhosted.org/packages/23/6f/0c86b5cb5e7ef63208c8cc22534df10ecc5278efc0d47fb8815577f3ca2f/librt-0.7.7-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c9faaebb1c6212c20afd8043cd6ed9de0a47d77f91a6b5b48f4e46ed470703fe", size = 165320, upload-time = "2026-01-01T23:51:18.455Z" },
{ url = "https://files.pythonhosted.org/packages/16/37/df4652690c29f645ffe405b58285a4109e9fe855c5bb56e817e3e75840b3/librt-0.7.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1908c3e5a5ef86b23391448b47759298f87f997c3bd153a770828f58c2bb4630", size = 174216, upload-time = "2026-01-01T23:51:19.599Z" },
{ url = "https://files.pythonhosted.org/packages/9a/d6/d3afe071910a43133ec9c0f3e4ce99ee6df0d4e44e4bddf4b9e1c6ed41cc/librt-0.7.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dbc4900e95a98fc0729523be9d93a8fedebb026f32ed9ffc08acd82e3e181503", size = 189005, upload-time = "2026-01-01T23:51:21.052Z" },
{ url = "https://files.pythonhosted.org/packages/d5/18/74060a870fe2d9fd9f47824eba6717ce7ce03124a0d1e85498e0e7efc1b2/librt-0.7.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a7ea4e1fbd253e5c68ea0fe63d08577f9d288a73f17d82f652ebc61fa48d878d", size = 183961, upload-time = "2026-01-01T23:51:22.493Z" },
{ url = "https://files.pythonhosted.org/packages/7c/5e/918a86c66304af66a3c1d46d54df1b2d0b8894babc42a14fb6f25511497f/librt-0.7.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ef7699b7a5a244b1119f85c5bbc13f152cd38240cbb2baa19b769433bae98e50", size = 177610, upload-time = "2026-01-01T23:51:23.874Z" },
{ url = "https://files.pythonhosted.org/packages/b2/d7/b5e58dc2d570f162e99201b8c0151acf40a03a39c32ab824dd4febf12736/librt-0.7.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:955c62571de0b181d9e9e0a0303c8bc90d47670a5eff54cf71bf5da61d1899cf", size = 199272, upload-time = "2026-01-01T23:51:25.341Z" },
{ url = "https://files.pythonhosted.org/packages/18/87/8202c9bd0968bdddc188ec3811985f47f58ed161b3749299f2c0dd0f63fb/librt-0.7.7-cp312-cp312-win32.whl", hash = "sha256:1bcd79be209313b270b0e1a51c67ae1af28adad0e0c7e84c3ad4b5cb57aaa75b", size = 43189, upload-time = "2026-01-01T23:51:26.799Z" },
{ url = "https://files.pythonhosted.org/packages/61/8d/80244b267b585e7aa79ffdac19f66c4861effc3a24598e77909ecdd0850e/librt-0.7.7-cp312-cp312-win_amd64.whl", hash = "sha256:4353ee891a1834567e0302d4bd5e60f531912179578c36f3d0430f8c5e16b456", size = 49462, upload-time = "2026-01-01T23:51:27.813Z" },
{ url = "https://files.pythonhosted.org/packages/2d/1f/75db802d6a4992d95e8a889682601af9b49d5a13bbfa246d414eede1b56c/librt-0.7.7-cp312-cp312-win_arm64.whl", hash = "sha256:a76f1d679beccccdf8c1958e732a1dfcd6e749f8821ee59d7bec009ac308c029", size = 42828, upload-time = "2026-01-01T23:51:28.804Z" },
{ url = "https://files.pythonhosted.org/packages/8d/5e/d979ccb0a81407ec47c14ea68fb217ff4315521730033e1dd9faa4f3e2c1/librt-0.7.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f4a0b0a3c86ba9193a8e23bb18f100d647bf192390ae195d84dfa0a10fb6244", size = 55746, upload-time = "2026-01-01T23:51:29.828Z" },
{ url = "https://files.pythonhosted.org/packages/f5/2c/3b65861fb32f802c3783d6ac66fc5589564d07452a47a8cf9980d531cad3/librt-0.7.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5335890fea9f9e6c4fdf8683061b9ccdcbe47c6dc03ab8e9b68c10acf78be78d", size = 57174, upload-time = "2026-01-01T23:51:31.226Z" },
{ url = "https://files.pythonhosted.org/packages/50/df/030b50614b29e443607220097ebaf438531ea218c7a9a3e21ea862a919cd/librt-0.7.7-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:9b4346b1225be26def3ccc6c965751c74868f0578cbcba293c8ae9168483d811", size = 165834, upload-time = "2026-01-01T23:51:32.278Z" },
{ url = "https://files.pythonhosted.org/packages/5d/e1/bd8d1eacacb24be26a47f157719553bbd1b3fe812c30dddf121c0436fd0b/librt-0.7.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a10b8eebdaca6e9fdbaf88b5aefc0e324b763a5f40b1266532590d5afb268a4c", size = 174819, upload-time = "2026-01-01T23:51:33.461Z" },
{ url = "https://files.pythonhosted.org/packages/46/7d/91d6c3372acf54a019c1ad8da4c9ecf4fc27d039708880bf95f48dbe426a/librt-0.7.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:067be973d90d9e319e6eb4ee2a9b9307f0ecd648b8a9002fa237289a4a07a9e7", size = 189607, upload-time = "2026-01-01T23:51:34.604Z" },
{ url = "https://files.pythonhosted.org/packages/fa/ac/44604d6d3886f791fbd1c6ae12d5a782a8f4aca927484731979f5e92c200/librt-0.7.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:23d2299ed007812cccc1ecef018db7d922733382561230de1f3954db28433977", size = 184586, upload-time = "2026-01-01T23:51:35.845Z" },
{ url = "https://files.pythonhosted.org/packages/5c/26/d8a6e4c17117b7f9b83301319d9a9de862ae56b133efb4bad8b3aa0808c9/librt-0.7.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6b6f8ea465524aa4c7420c7cc4ca7d46fe00981de8debc67b1cc2e9957bb5b9d", size = 178251, upload-time = "2026-01-01T23:51:37.018Z" },
{ url = "https://files.pythonhosted.org/packages/99/ab/98d857e254376f8e2f668e807daccc1f445e4b4fc2f6f9c1cc08866b0227/librt-0.7.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f8df32a99cc46eb0ee90afd9ada113ae2cafe7e8d673686cf03ec53e49635439", size = 199853, upload-time = "2026-01-01T23:51:38.195Z" },
{ url = "https://files.pythonhosted.org/packages/7c/55/4523210d6ae5134a5da959900be43ad8bab2e4206687b6620befddb5b5fd/librt-0.7.7-cp313-cp313-win32.whl", hash = "sha256:86f86b3b785487c7760247bcdac0b11aa8bf13245a13ed05206286135877564b", size = 43247, upload-time = "2026-01-01T23:51:39.629Z" },
{ url = "https://files.pythonhosted.org/packages/25/40/3ec0fed5e8e9297b1cf1a3836fb589d3de55f9930e3aba988d379e8ef67c/librt-0.7.7-cp313-cp313-win_amd64.whl", hash = "sha256:4862cb2c702b1f905c0503b72d9d4daf65a7fdf5a9e84560e563471e57a56949", size = 49419, upload-time = "2026-01-01T23:51:40.674Z" },
{ url = "https://files.pythonhosted.org/packages/1c/7a/aab5f0fb122822e2acbc776addf8b9abfb4944a9056c00c393e46e543177/librt-0.7.7-cp313-cp313-win_arm64.whl", hash = "sha256:0996c83b1cb43c00e8c87835a284f9057bc647abd42b5871e5f941d30010c832", size = 42828, upload-time = "2026-01-01T23:51:41.731Z" },
{ url = "https://files.pythonhosted.org/packages/69/9c/228a5c1224bd23809a635490a162e9cbdc68d99f0eeb4a696f07886b8206/librt-0.7.7-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:23daa1ab0512bafdd677eb1bfc9611d8ffbe2e328895671e64cb34166bc1b8c8", size = 55188, upload-time = "2026-01-01T23:51:43.14Z" },
{ url = "https://files.pythonhosted.org/packages/ba/c2/0e7c6067e2b32a156308205e5728f4ed6478c501947e9142f525afbc6bd2/librt-0.7.7-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:558a9e5a6f3cc1e20b3168fb1dc802d0d8fa40731f6e9932dcc52bbcfbd37111", size = 56895, upload-time = "2026-01-01T23:51:44.534Z" },
{ url = "https://files.pythonhosted.org/packages/0e/77/de50ff70c80855eb79d1d74035ef06f664dd073fb7fb9d9fb4429651b8eb/librt-0.7.7-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2567cb48dc03e5b246927ab35cbb343376e24501260a9b5e30b8e255dca0d1d2", size = 163724, upload-time = "2026-01-01T23:51:45.571Z" },
{ url = "https://files.pythonhosted.org/packages/6e/19/f8e4bf537899bdef9e0bb9f0e4b18912c2d0f858ad02091b6019864c9a6d/librt-0.7.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6066c638cdf85ff92fc6f932d2d73c93a0e03492cdfa8778e6d58c489a3d7259", size = 172470, upload-time = "2026-01-01T23:51:46.823Z" },
{ url = "https://files.pythonhosted.org/packages/42/4c/dcc575b69d99076768e8dd6141d9aecd4234cba7f0e09217937f52edb6ed/librt-0.7.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a609849aca463074c17de9cda173c276eb8fee9e441053529e7b9e249dc8b8ee", size = 186806, upload-time = "2026-01-01T23:51:48.009Z" },
{ url = "https://files.pythonhosted.org/packages/fe/f8/4094a2b7816c88de81239a83ede6e87f1138477d7ee956c30f136009eb29/librt-0.7.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:add4e0a000858fe9bb39ed55f31085506a5c38363e6eb4a1e5943a10c2bfc3d1", size = 181809, upload-time = "2026-01-01T23:51:49.35Z" },
{ url = "https://files.pythonhosted.org/packages/1b/ac/821b7c0ab1b5a6cd9aee7ace8309c91545a2607185101827f79122219a7e/librt-0.7.7-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a3bfe73a32bd0bdb9a87d586b05a23c0a1729205d79df66dee65bb2e40d671ba", size = 175597, upload-time = "2026-01-01T23:51:50.636Z" },
{ url = "https://files.pythonhosted.org/packages/71/f9/27f6bfbcc764805864c04211c6ed636fe1d58f57a7b68d1f4ae5ed74e0e0/librt-0.7.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:0ecce0544d3db91a40f8b57ae26928c02130a997b540f908cefd4d279d6c5848", size = 196506, upload-time = "2026-01-01T23:51:52.535Z" },
{ url = "https://files.pythonhosted.org/packages/46/ba/c9b9c6fc931dd7ea856c573174ccaf48714905b1a7499904db2552e3bbaf/librt-0.7.7-cp314-cp314-win32.whl", hash = "sha256:8f7a74cf3a80f0c3b0ec75b0c650b2f0a894a2cec57ef75f6f72c1e82cdac61d", size = 39747, upload-time = "2026-01-01T23:51:53.683Z" },
{ url = "https://files.pythonhosted.org/packages/c5/69/cd1269337c4cde3ee70176ee611ab0058aa42fc8ce5c9dce55f48facfcd8/librt-0.7.7-cp314-cp314-win_amd64.whl", hash = "sha256:3d1fe2e8df3268dd6734dba33ededae72ad5c3a859b9577bc00b715759c5aaab", size = 45971, upload-time = "2026-01-01T23:51:54.697Z" },
{ url = "https://files.pythonhosted.org/packages/79/fd/e0844794423f5583108c5991313c15e2b400995f44f6ec6871f8aaf8243c/librt-0.7.7-cp314-cp314-win_arm64.whl", hash = "sha256:2987cf827011907d3dfd109f1be0d61e173d68b1270107bb0e89f2fca7f2ed6b", size = 39075, upload-time = "2026-01-01T23:51:55.726Z" },
{ url = "https://files.pythonhosted.org/packages/42/02/211fd8f7c381e7b2a11d0fdfcd410f409e89967be2e705983f7c6342209a/librt-0.7.7-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8e92c8de62b40bfce91d5e12c6e8b15434da268979b1af1a6589463549d491e6", size = 57368, upload-time = "2026-01-01T23:51:56.706Z" },
{ url = "https://files.pythonhosted.org/packages/4c/b6/aca257affae73ece26041ae76032153266d110453173f67d7603058e708c/librt-0.7.7-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f683dcd49e2494a7535e30f779aa1ad6e3732a019d80abe1309ea91ccd3230e3", size = 59238, upload-time = "2026-01-01T23:51:58.066Z" },
{ url = "https://files.pythonhosted.org/packages/96/47/7383a507d8e0c11c78ca34c9d36eab9000db5989d446a2f05dc40e76c64f/librt-0.7.7-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:9b15e5d17812d4d629ff576699954f74e2cc24a02a4fc401882dd94f81daba45", size = 183870, upload-time = "2026-01-01T23:51:59.204Z" },
{ url = "https://files.pythonhosted.org/packages/a4/b8/50f3d8eec8efdaf79443963624175c92cec0ba84827a66b7fcfa78598e51/librt-0.7.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c084841b879c4d9b9fa34e5d5263994f21aea7fd9c6add29194dbb41a6210536", size = 194608, upload-time = "2026-01-01T23:52:00.419Z" },
{ url = "https://files.pythonhosted.org/packages/23/d9/1b6520793aadb59d891e3b98ee057a75de7f737e4a8b4b37fdbecb10d60f/librt-0.7.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10c8fb9966f84737115513fecbaf257f9553d067a7dd45a69c2c7e5339e6a8dc", size = 206776, upload-time = "2026-01-01T23:52:01.705Z" },
{ url = "https://files.pythonhosted.org/packages/ff/db/331edc3bba929d2756fa335bfcf736f36eff4efcb4f2600b545a35c2ae58/librt-0.7.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9b5fb1ecb2c35362eab2dbd354fd1efa5a8440d3e73a68be11921042a0edc0ff", size = 203206, upload-time = "2026-01-01T23:52:03.315Z" },
{ url = "https://files.pythonhosted.org/packages/b2/e1/6af79ec77204e85f6f2294fc171a30a91bb0e35d78493532ed680f5d98be/librt-0.7.7-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:d1454899909d63cc9199a89fcc4f81bdd9004aef577d4ffc022e600c412d57f3", size = 196697, upload-time = "2026-01-01T23:52:04.857Z" },
{ url = "https://files.pythonhosted.org/packages/f3/46/de55ecce4b2796d6d243295c221082ca3a944dc2fb3a52dcc8660ce7727d/librt-0.7.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:7ef28f2e7a016b29792fe0a2dd04dec75725b32a1264e390c366103f834a9c3a", size = 217193, upload-time = "2026-01-01T23:52:06.159Z" },
{ url = "https://files.pythonhosted.org/packages/41/61/33063e271949787a2f8dd33c5260357e3d512a114fc82ca7890b65a76e2d/librt-0.7.7-cp314-cp314t-win32.whl", hash = "sha256:5e419e0db70991b6ba037b70c1d5bbe92b20ddf82f31ad01d77a347ed9781398", size = 40277, upload-time = "2026-01-01T23:52:07.625Z" },
{ url = "https://files.pythonhosted.org/packages/06/21/1abd972349f83a696ea73159ac964e63e2d14086fdd9bc7ca878c25fced4/librt-0.7.7-cp314-cp314t-win_amd64.whl", hash = "sha256:d6b7d93657332c817b8d674ef6bf1ab7796b4f7ce05e420fd45bd258a72ac804", size = 46765, upload-time = "2026-01-01T23:52:08.647Z" },
{ url = "https://files.pythonhosted.org/packages/51/0e/b756c7708143a63fca65a51ca07990fa647db2cc8fcd65177b9e96680255/librt-0.7.7-cp314-cp314t-win_arm64.whl", hash = "sha256:142c2cd91794b79fd0ce113bd658993b7ede0fe93057668c2f98a45ca00b7e91", size = 39724, upload-time = "2026-01-01T23:52:09.745Z" },
]
[[package]]
name = "markupsafe"
version = "3.0.3"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", size = 11631, upload-time = "2025-09-27T18:36:05.558Z" },
{ url = "https://files.pythonhosted.org/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", size = 12057, upload-time = "2025-09-27T18:36:07.165Z" },
{ url = "https://files.pythonhosted.org/packages/40/01/e560d658dc0bb8ab762670ece35281dec7b6c1b33f5fbc09ebb57a185519/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", size = 22050, upload-time = "2025-09-27T18:36:08.005Z" },
{ url = "https://files.pythonhosted.org/packages/af/cd/ce6e848bbf2c32314c9b237839119c5a564a59725b53157c856e90937b7a/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", size = 20681, upload-time = "2025-09-27T18:36:08.881Z" },
{ url = "https://files.pythonhosted.org/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", size = 20705, upload-time = "2025-09-27T18:36:10.131Z" },
{ url = "https://files.pythonhosted.org/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", size = 21524, upload-time = "2025-09-27T18:36:11.324Z" },
{ url = "https://files.pythonhosted.org/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", size = 20282, upload-time = "2025-09-27T18:36:12.573Z" },
{ url = "https://files.pythonhosted.org/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", size = 20745, upload-time = "2025-09-27T18:36:13.504Z" },
{ url = "https://files.pythonhosted.org/packages/87/99/faba9369a7ad6e4d10b6a5fbf71fa2a188fe4a593b15f0963b73859a1bbd/markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", size = 14571, upload-time = "2025-09-27T18:36:14.779Z" },
{ url = "https://files.pythonhosted.org/packages/d6/25/55dc3ab959917602c96985cb1253efaa4ff42f71194bddeb61eb7278b8be/markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", size = 15056, upload-time = "2025-09-27T18:36:16.125Z" },
{ url = "https://files.pythonhosted.org/packages/d0/9e/0a02226640c255d1da0b8d12e24ac2aa6734da68bff14c05dd53b94a0fc3/markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", size = 13932, upload-time = "2025-09-27T18:36:17.311Z" },
{ url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" },
{ url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" },
{ url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" },
{ url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" },
{ url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" },
{ url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" },
{ url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" },
{ url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" },
{ url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" },
{ url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" },
{ url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" },
{ url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" },
{ url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" },
{ url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" },
{ url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" },
{ url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" },
{ url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" },
{ url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" },
{ url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" },
{ url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" },
{ url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" },
{ url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" },
{ url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" },
{ url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" },
{ url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" },
{ url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" },
{ url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" },
{ url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" },
{ url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" },
{ url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" },
{ url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" },
{ url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" },
{ url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" },
{ url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" },
{ url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" },
{ url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" },
{ url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" },
{ url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" },
{ url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" },
{ url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" },
{ url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" },
{ url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" },
{ url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" },
{ url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" },
{ url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" },
{ url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" },
{ url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" },
{ url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" },
{ url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" },
{ url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" },
{ url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" },
{ url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" },
{ url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" },
{ url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" },
{ url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" },
{ url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" },
{ url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" },
{ url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" },
{ url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" },
{ url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" },
{ url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" },
{ url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" },
{ url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" },
{ url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" },
{ url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" },
{ url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" },
]
[[package]]
name = "mypy"
version = "1.19.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "librt", marker = "platform_python_implementation != 'PyPy'" },
{ name = "mypy-extensions" },
{ name = "pathspec" },
{ name = "tomli", marker = "python_full_version < '3.11'" },
{ name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/f5/db/4efed9504bc01309ab9c2da7e352cc223569f05478012b5d9ece38fd44d2/mypy-1.19.1.tar.gz", hash = "sha256:19d88bb05303fe63f71dd2c6270daca27cb9401c4ca8255fe50d1d920e0eb9ba", size = 3582404, upload-time = "2025-12-15T05:03:48.42Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/2f/63/e499890d8e39b1ff2df4c0c6ce5d371b6844ee22b8250687a99fd2f657a8/mypy-1.19.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5f05aa3d375b385734388e844bc01733bd33c644ab48e9684faa54e5389775ec", size = 13101333, upload-time = "2025-12-15T05:03:03.28Z" },
{ url = "https://files.pythonhosted.org/packages/72/4b/095626fc136fba96effc4fd4a82b41d688ab92124f8c4f7564bffe5cf1b0/mypy-1.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:022ea7279374af1a5d78dfcab853fe6a536eebfda4b59deab53cd21f6cd9f00b", size = 12164102, upload-time = "2025-12-15T05:02:33.611Z" },
{ url = "https://files.pythonhosted.org/packages/0c/5b/952928dd081bf88a83a5ccd49aaecfcd18fd0d2710c7ff07b8fb6f7032b9/mypy-1.19.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee4c11e460685c3e0c64a4c5de82ae143622410950d6be863303a1c4ba0e36d6", size = 12765799, upload-time = "2025-12-15T05:03:28.44Z" },
{ url = "https://files.pythonhosted.org/packages/2a/0d/93c2e4a287f74ef11a66fb6d49c7a9f05e47b0a4399040e6719b57f500d2/mypy-1.19.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de759aafbae8763283b2ee5869c7255391fbc4de3ff171f8f030b5ec48381b74", size = 13522149, upload-time = "2025-12-15T05:02:36.011Z" },
{ url = "https://files.pythonhosted.org/packages/7b/0e/33a294b56aaad2b338d203e3a1d8b453637ac36cb278b45005e0901cf148/mypy-1.19.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ab43590f9cd5108f41aacf9fca31841142c786827a74ab7cc8a2eacb634e09a1", size = 13810105, upload-time = "2025-12-15T05:02:40.327Z" },
{ url = "https://files.pythonhosted.org/packages/0e/fd/3e82603a0cb66b67c5e7abababce6bf1a929ddf67bf445e652684af5c5a0/mypy-1.19.1-cp310-cp310-win_amd64.whl", hash = "sha256:2899753e2f61e571b3971747e302d5f420c3fd09650e1951e99f823bc3089dac", size = 10057200, upload-time = "2025-12-15T05:02:51.012Z" },
{ url = "https://files.pythonhosted.org/packages/ef/47/6b3ebabd5474d9cdc170d1342fbf9dddc1b0ec13ec90bf9004ee6f391c31/mypy-1.19.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d8dfc6ab58ca7dda47d9237349157500468e404b17213d44fc1cb77bce532288", size = 13028539, upload-time = "2025-12-15T05:03:44.129Z" },
{ url = "https://files.pythonhosted.org/packages/5c/a6/ac7c7a88a3c9c54334f53a941b765e6ec6c4ebd65d3fe8cdcfbe0d0fd7db/mypy-1.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e3f276d8493c3c97930e354b2595a44a21348b320d859fb4a2b9f66da9ed27ab", size = 12083163, upload-time = "2025-12-15T05:03:37.679Z" },
{ url = "https://files.pythonhosted.org/packages/67/af/3afa9cf880aa4a2c803798ac24f1d11ef72a0c8079689fac5cfd815e2830/mypy-1.19.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2abb24cf3f17864770d18d673c85235ba52456b36a06b6afc1e07c1fdcd3d0e6", size = 12687629, upload-time = "2025-12-15T05:02:31.526Z" },
{ url = "https://files.pythonhosted.org/packages/2d/46/20f8a7114a56484ab268b0ab372461cb3a8f7deed31ea96b83a4e4cfcfca/mypy-1.19.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a009ffa5a621762d0c926a078c2d639104becab69e79538a494bcccb62cc0331", size = 13436933, upload-time = "2025-12-15T05:03:15.606Z" },
{ url = "https://files.pythonhosted.org/packages/5b/f8/33b291ea85050a21f15da910002460f1f445f8007adb29230f0adea279cb/mypy-1.19.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f7cee03c9a2e2ee26ec07479f38ea9c884e301d42c6d43a19d20fb014e3ba925", size = 13661754, upload-time = "2025-12-15T05:02:26.731Z" },
{ url = "https://files.pythonhosted.org/packages/fd/a3/47cbd4e85bec4335a9cd80cf67dbc02be21b5d4c9c23ad6b95d6c5196bac/mypy-1.19.1-cp311-cp311-win_amd64.whl", hash = "sha256:4b84a7a18f41e167f7995200a1d07a4a6810e89d29859df936f1c3923d263042", size = 10055772, upload-time = "2025-12-15T05:03:26.179Z" },
{ url = "https://files.pythonhosted.org/packages/06/8a/19bfae96f6615aa8a0604915512e0289b1fad33d5909bf7244f02935d33a/mypy-1.19.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a8174a03289288c1f6c46d55cef02379b478bfbc8e358e02047487cad44c6ca1", size = 13206053, upload-time = "2025-12-15T05:03:46.622Z" },
{ url = "https://files.pythonhosted.org/packages/a5/34/3e63879ab041602154ba2a9f99817bb0c85c4df19a23a1443c8986e4d565/mypy-1.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffcebe56eb09ff0c0885e750036a095e23793ba6c2e894e7e63f6d89ad51f22e", size = 12219134, upload-time = "2025-12-15T05:03:24.367Z" },
{ url = "https://files.pythonhosted.org/packages/89/cc/2db6f0e95366b630364e09845672dbee0cbf0bbe753a204b29a944967cd9/mypy-1.19.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b64d987153888790bcdb03a6473d321820597ab8dd9243b27a92153c4fa50fd2", size = 12731616, upload-time = "2025-12-15T05:02:44.725Z" },
{ url = "https://files.pythonhosted.org/packages/00/be/dd56c1fd4807bc1eba1cf18b2a850d0de7bacb55e158755eb79f77c41f8e/mypy-1.19.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c35d298c2c4bba75feb2195655dfea8124d855dfd7343bf8b8c055421eaf0cf8", size = 13620847, upload-time = "2025-12-15T05:03:39.633Z" },
{ url = "https://files.pythonhosted.org/packages/6d/42/332951aae42b79329f743bf1da088cd75d8d4d9acc18fbcbd84f26c1af4e/mypy-1.19.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:34c81968774648ab5ac09c29a375fdede03ba253f8f8287847bd480782f73a6a", size = 13834976, upload-time = "2025-12-15T05:03:08.786Z" },
{ url = "https://files.pythonhosted.org/packages/6f/63/e7493e5f90e1e085c562bb06e2eb32cae27c5057b9653348d38b47daaecc/mypy-1.19.1-cp312-cp312-win_amd64.whl", hash = "sha256:b10e7c2cd7870ba4ad9b2d8a6102eb5ffc1f16ca35e3de6bfa390c1113029d13", size = 10118104, upload-time = "2025-12-15T05:03:10.834Z" },
{ url = "https://files.pythonhosted.org/packages/de/9f/a6abae693f7a0c697dbb435aac52e958dc8da44e92e08ba88d2e42326176/mypy-1.19.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e3157c7594ff2ef1634ee058aafc56a82db665c9438fd41b390f3bde1ab12250", size = 13201927, upload-time = "2025-12-15T05:02:29.138Z" },
{ url = "https://files.pythonhosted.org/packages/9a/a4/45c35ccf6e1c65afc23a069f50e2c66f46bd3798cbe0d680c12d12935caa/mypy-1.19.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdb12f69bcc02700c2b47e070238f42cb87f18c0bc1fc4cdb4fb2bc5fd7a3b8b", size = 12206730, upload-time = "2025-12-15T05:03:01.325Z" },
{ url = "https://files.pythonhosted.org/packages/05/bb/cdcf89678e26b187650512620eec8368fded4cfd99cfcb431e4cdfd19dec/mypy-1.19.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f859fb09d9583a985be9a493d5cfc5515b56b08f7447759a0c5deaf68d80506e", size = 12724581, upload-time = "2025-12-15T05:03:20.087Z" },
{ url = "https://files.pythonhosted.org/packages/d1/32/dd260d52babf67bad8e6770f8e1102021877ce0edea106e72df5626bb0ec/mypy-1.19.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c9a6538e0415310aad77cb94004ca6482330fece18036b5f360b62c45814c4ef", size = 13616252, upload-time = "2025-12-15T05:02:49.036Z" },
{ url = "https://files.pythonhosted.org/packages/71/d0/5e60a9d2e3bd48432ae2b454b7ef2b62a960ab51292b1eda2a95edd78198/mypy-1.19.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:da4869fc5e7f62a88f3fe0b5c919d1d9f7ea3cef92d3689de2823fd27e40aa75", size = 13840848, upload-time = "2025-12-15T05:02:55.95Z" },
{ url = "https://files.pythonhosted.org/packages/98/76/d32051fa65ecf6cc8c6610956473abdc9b4c43301107476ac03559507843/mypy-1.19.1-cp313-cp313-win_amd64.whl", hash = "sha256:016f2246209095e8eda7538944daa1d60e1e8134d98983b9fc1e92c1fc0cb8dd", size = 10135510, upload-time = "2025-12-15T05:02:58.438Z" },
{ url = "https://files.pythonhosted.org/packages/de/eb/b83e75f4c820c4247a58580ef86fcd35165028f191e7e1ba57128c52782d/mypy-1.19.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:06e6170bd5836770e8104c8fdd58e5e725cfeb309f0a6c681a811f557e97eac1", size = 13199744, upload-time = "2025-12-15T05:03:30.823Z" },
{ url = "https://files.pythonhosted.org/packages/94/28/52785ab7bfa165f87fcbb61547a93f98bb20e7f82f90f165a1f69bce7b3d/mypy-1.19.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:804bd67b8054a85447c8954215a906d6eff9cabeabe493fb6334b24f4bfff718", size = 12215815, upload-time = "2025-12-15T05:02:42.323Z" },
{ url = "https://files.pythonhosted.org/packages/0a/c6/bdd60774a0dbfb05122e3e925f2e9e846c009e479dcec4821dad881f5b52/mypy-1.19.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:21761006a7f497cb0d4de3d8ef4ca70532256688b0523eee02baf9eec895e27b", size = 12740047, upload-time = "2025-12-15T05:03:33.168Z" },
{ url = "https://files.pythonhosted.org/packages/32/2a/66ba933fe6c76bd40d1fe916a83f04fed253152f451a877520b3c4a5e41e/mypy-1.19.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:28902ee51f12e0f19e1e16fbe2f8f06b6637f482c459dd393efddd0ec7f82045", size = 13601998, upload-time = "2025-12-15T05:03:13.056Z" },
{ url = "https://files.pythonhosted.org/packages/e3/da/5055c63e377c5c2418760411fd6a63ee2b96cf95397259038756c042574f/mypy-1.19.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:481daf36a4c443332e2ae9c137dfee878fcea781a2e3f895d54bd3002a900957", size = 13807476, upload-time = "2025-12-15T05:03:17.977Z" },
{ url = "https://files.pythonhosted.org/packages/cd/09/4ebd873390a063176f06b0dbf1f7783dd87bd120eae7727fa4ae4179b685/mypy-1.19.1-cp314-cp314-win_amd64.whl", hash = "sha256:8bb5c6f6d043655e055be9b542aa5f3bdd30e4f3589163e85f93f3640060509f", size = 10281872, upload-time = "2025-12-15T05:03:05.549Z" },
{ url = "https://files.pythonhosted.org/packages/8d/f4/4ce9a05ce5ded1de3ec1c1d96cf9f9504a04e54ce0ed55cfa38619a32b8d/mypy-1.19.1-py3-none-any.whl", hash = "sha256:f1235f5ea01b7db5468d53ece6aaddf1ad0b88d9e7462b86ef96fe04995d7247", size = 2471239, upload-time = "2025-12-15T05:03:07.248Z" },
]
[[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.2.7"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/61/68/810093cb579daae426794bbd9d88aa830fae296e85172d18cb0f0e5dd4bc/mysqlclient-2.2.7.tar.gz", hash = "sha256:24ae22b59416d5fcce7e99c9d37548350b4565baac82f95e149cac6ce4163845", size = 91383, upload-time = "2025-01-10T12:06:00.763Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/0c/24/cdaaef42aac7d53c0a01bb638da64961c293b1b6d204efd47400a68029d4/mysqlclient-2.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:2e3c11f7625029d7276ca506f8960a7fd3c5a0a0122c9e7404e6a8fe961b3d22", size = 207748, upload-time = "2025-01-10T11:56:24.357Z" },
{ url = "https://files.pythonhosted.org/packages/ef/e3/3e2de3f93cd60dd63bd229ec3e3b679f682982614bf513d046c2722aa4ce/mysqlclient-2.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:a22d99d26baf4af68ebef430e3131bb5a9b722b79a9fcfac6d9bbf8a88800687", size = 207745, upload-time = "2025-01-10T11:56:28.67Z" },
{ url = "https://files.pythonhosted.org/packages/bb/b5/2a8a4bcba3440550f358b839638fe8ec9146fa3c9194890b4998a530c926/mysqlclient-2.2.7-cp312-cp312-win_amd64.whl", hash = "sha256:4b4c0200890837fc64014cc938ef2273252ab544c1b12a6c1d674c23943f3f2e", size = 208032, upload-time = "2025-01-10T11:56:29.879Z" },
{ url = "https://files.pythonhosted.org/packages/29/01/e80141f1cd0459e4c9a5dd309dee135bbae41d6c6c121252fdd853001a8a/mysqlclient-2.2.7-cp313-cp313-win_amd64.whl", hash = "sha256:201a6faa301011dd07bca6b651fe5aaa546d7c9a5426835a06c3172e1056a3c5", size = 208000, upload-time = "2025-01-10T11:56:32.293Z" },
{ url = "https://files.pythonhosted.org/packages/16/cc/5b1570be9f8597ee41e2a0bd7b62ba861ec2c81898d9449f3d6bfbe15d29/mysqlclient-2.2.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:92af368ed9c9144737af569c86d3b6c74a012a6f6b792eb868384787b52bb585", size = 207800, upload-time = "2025-01-10T11:56:36.023Z" },
]
[[package]]
name = "nodeenv"
version = "1.10.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/24/bf/d1bda4f6168e0b2e9e5958945e01910052158313224ada5ce1fb2e1113b8/nodeenv-1.10.0.tar.gz", hash = "sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb", size = 55611, upload-time = "2025-12-20T14:08:54.006Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl", hash = "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827", size = 23438, upload-time = "2025-12-20T14:08:52.782Z" },
]
[[package]]
name = "oracledb"
version = "3.4.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "cryptography" },
{ name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/5e/9d/4e86cd410294ebbb1f90a609aaae61c5fa064a5c10e501de3f4c67664e6c/oracledb-3.4.1.tar.gz", hash = "sha256:f5920df5ac9446579e8409607bba31dc2d23a2286a5b0ea17cb0d78d419392a6", size = 852693, upload-time = "2025-11-12T03:21:36.157Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/4b/70/05645e72a67b45396a248a7949d89c91dc7a1ab5f7cedad110d9804e29d5/oracledb-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:dfe18061f064d0455fad10d9301f6f92df9e32d18d75fb32802caf1ced4b304c", size = 4243226, upload-time = "2025-11-12T03:21:41.734Z" },
{ url = "https://files.pythonhosted.org/packages/7e/cc/f3a78ae31f87e41378c7bc60928fa5432d4eba80806cb0086edc11803a22/oracledb-3.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:84055d6fd093a4d7b8ed653f433531e4c4cc161f7261d78efd7f6a65a1f19444", size = 2426914, upload-time = "2025-11-12T03:21:43.641Z" },
{ url = "https://files.pythonhosted.org/packages/a6/a6/3d3dabbec2651851f13fdb7c318a3c50780090235d340d851f7cb8deeeec/oracledb-3.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c9e20b6cd3245e84c30188874c524bb3c67c79b7a04fcb864e6ac39f55eae826", size = 2605903, upload-time = "2025-11-12T03:21:45.378Z" },
{ url = "https://files.pythonhosted.org/packages/ae/59/aa174fc8f5629b890424702edf582a8a635acaa0db1315b16160d703a887/oracledb-3.4.1-cp310-cp310-win32.whl", hash = "sha256:abedb0bf464bcf14d83e245eae000e03cad8ac68c945eb09cc46002d800fbf00", size = 1490352, upload-time = "2025-11-12T03:21:46.732Z" },
{ url = "https://files.pythonhosted.org/packages/8a/1c/9dded6efc747d8980667584c8464295d80d205f8a131e31cacfb274b6ed5/oracledb-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:4ee604bb0f3acb5680782818f973445b8cd168e72a73b5ca2cd9807140afadee", size = 1837541, upload-time = "2025-11-12T03:21:48.571Z" },
{ url = "https://files.pythonhosted.org/packages/ed/9e/5901349b8797fabc7c6f78230376bfbd5541a847f1eb34be23bfb971add7/oracledb-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:20b268be64994d0f636df9ff7613dcce420133f373d0d7fc84a31dd2f07322c0", size = 4226376, upload-time = "2025-11-12T03:21:49.959Z" },
{ url = "https://files.pythonhosted.org/packages/fc/c0/951d2ab8c04df9da309a82e211d19223a64dbbcfdd79f5f1aba6d8736408/oracledb-3.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d493946318d99a0f0e3f01d7c64c08ddae66f0aac735fa23c1eb94949d9db0f5", size = 2422323, upload-time = "2025-11-12T03:21:51.583Z" },
{ url = "https://files.pythonhosted.org/packages/a8/7c/82843dd7e55dec6331c0c7737e32523eb2f6156c6469055e2cb752e848f4/oracledb-3.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d64fda2fa5d3e82c58b2c5126ab5511bccb84f8b47eedfe9f17e9c100fe7683", size = 2601267, upload-time = "2025-11-12T03:21:52.978Z" },
{ url = "https://files.pythonhosted.org/packages/27/3f/67b50042f955574fca574a2234ba4af421e9268601bceb49efd9c43c6bc8/oracledb-3.4.1-cp311-cp311-win32.whl", hash = "sha256:cd80aa4c4dec7347c6d2909fbaf7e35a5253341ff2cb6f3782ab7ca712bf0405", size = 1488075, upload-time = "2025-11-12T03:21:54.704Z" },
{ url = "https://files.pythonhosted.org/packages/8d/14/bab071234d61e84c65712902dd0edec825d82b3198ffddc977c9ea9a91f3/oracledb-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5e01e8696009cec4ebcb9fe678b23b8223595dc186c065899660cac4c1fc189b", size = 1843449, upload-time = "2025-11-12T03:21:56.342Z" },
{ url = "https://files.pythonhosted.org/packages/f7/d9/98367ba2c358de366de70b505531f9717cdfa7e29eff0c9ad113eecfce96/oracledb-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1c3f92c023ef1983e0e7f9a1b4a31df8568974c28c06ab0a574b1126e45083a8", size = 4222133, upload-time = "2025-11-12T03:21:58.212Z" },
{ url = "https://files.pythonhosted.org/packages/36/52/48ad2f7dae6288a2ddf0ac536d46ce4883d2d10ec7e16afbbd48f1ec0ff3/oracledb-3.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:251211d64b90cc42d00ec2d2893873bc02ff4bc22125e9fc5a7f148a6208fd88", size = 2230374, upload-time = "2025-11-12T03:21:59.656Z" },
{ url = "https://files.pythonhosted.org/packages/8d/08/60d4301b4f72f099ed2252f8d0eb143e6fe9e5c8f4c2705c3163cea36808/oracledb-3.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ea529a5e6036fae3e2bc195fa76b6f48cd9c431e68c74ef78ee6a5e39c855c39", size = 2421755, upload-time = "2025-11-12T03:22:01.543Z" },
{ url = "https://files.pythonhosted.org/packages/48/35/412a90019a030f5dff0c031319733c6b8dd477832bafa88b733b4b3ec57b/oracledb-3.4.1-cp312-cp312-win32.whl", hash = "sha256:94e8e6d63b45fedd4e243147cb25dea1a0f6599d83852f3979fe725a8533e85a", size = 1449688, upload-time = "2025-11-12T03:22:03.422Z" },
{ url = "https://files.pythonhosted.org/packages/7b/01/ae9eca3055dc625923564ca653ca99ddd8eda95e44953ce55c18aba55066/oracledb-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:84f15c483f9ec80dcded925df6ff473c69a293cd694d09b69abb911500659df4", size = 1794622, upload-time = "2025-11-12T03:22:04.941Z" },
{ url = "https://files.pythonhosted.org/packages/f0/4d/e32db901340dc6fc824d0d3b5e4660fe0199fba8adb0e81ac08b639c8ab9/oracledb-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ad817807b293e371c951af8ee67a56a5af88a5680a54fe79dfc7b9393ca128aa", size = 4206469, upload-time = "2025-11-12T03:22:06.881Z" },
{ url = "https://files.pythonhosted.org/packages/cf/68/1a038f29523eea19e42f4dd765bf523752408816b5ff21e8b998d8b25457/oracledb-3.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:34b9bc25eae217defa3f4b8289b4915cd1101aaeeec33c7bace74f927996d452", size = 2233055, upload-time = "2025-11-12T03:22:08.259Z" },
{ url = "https://files.pythonhosted.org/packages/b9/66/a51243553ac6b0e1bc2cfd4db8a2f3299b1b60c9231d7c9133ee1442d15b/oracledb-3.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:be6575759ba56ab3758f82bfbb74f75288ce69190e19c087793050cb012c0aa1", size = 2443312, upload-time = "2025-11-12T03:22:09.615Z" },
{ url = "https://files.pythonhosted.org/packages/f7/57/a6056d4432c07a959fd1032dd45bfaff69b91ac7e1204dbccf7bf7b4a91d/oracledb-3.4.1-cp313-cp313-win32.whl", hash = "sha256:635587e5f28be83ec0bf72e4bfb2f3a4544c0f8e303f2327f376d57116894541", size = 1453553, upload-time = "2025-11-12T03:22:11.045Z" },
{ url = "https://files.pythonhosted.org/packages/6a/57/dca415d8dd18a2a030a9402d49039493cdce6acfd37c8a038a4ede2328e6/oracledb-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:354177708352e124c0f97ceccbe34be05e7f3ce7040a7dd3c2ebd857145ffe74", size = 1794005, upload-time = "2025-11-12T03:22:12.694Z" },
{ url = "https://files.pythonhosted.org/packages/59/07/dff7b9e6242b627d56f3fa6ad6639802003e1e5fbcc883d0ce27d82455ad/oracledb-3.4.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:3ec1f9dd7310da7cbf219c2a05bb52df08da950c95ad2ace8a289854947bdc6b", size = 4247946, upload-time = "2025-11-12T03:22:14.473Z" },
{ url = "https://files.pythonhosted.org/packages/1f/95/739868c6f312683cc3afe9534644b4ce2d054fe137d8f7a1e7786df9f5aa/oracledb-3.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:337a67d6c91015dfe7a2a1915f65c74adad26fcd428daaead296d91c92f09ad1", size = 2271628, upload-time = "2025-11-12T03:22:15.956Z" },
{ url = "https://files.pythonhosted.org/packages/fb/7c/307da513f5fb68e6454beb5bc1c715ec09a70d2af70a28b9fa6001c1b09b/oracledb-3.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d5ffe4dd26e8012de433ec69f93be5737d81b04324072ec36dad37eb778fd9d", size = 2455603, upload-time = "2025-11-12T03:22:18.112Z" },
{ url = "https://files.pythonhosted.org/packages/c5/1a/af5bd7239cebfc33541432cfcba75893a3f2f44fa66648e6d8ce1fe96b0c/oracledb-3.4.1-cp314-cp314-win32.whl", hash = "sha256:693ef5f8c420545511096b3bc9a3861617222717321bc78c776afbbb6c16c5b9", size = 1474932, upload-time = "2025-11-12T03:22:19.574Z" },
{ url = "https://files.pythonhosted.org/packages/f1/ee/79d2ed18fd234bcbd407c1b36372dc898cf68de825ec650df7b1627acb51/oracledb-3.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:6adb483d7120cdd056173b71c901f71dbe2265c5bd402f768b0b1ab27af519b1", size = 1837566, upload-time = "2025-11-12T03:22:20.959Z" },
]
[[package]]
name = "packaging"
version = "25.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" },
]
[[package]]
name = "pathspec"
version = "0.12.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" },
]
[[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 = "psycopg2-binary"
version = "2.9.11"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/ac/6c/8767aaa597ba424643dc87348c6f1754dd9f48e80fdc1b9f7ca5c3a7c213/psycopg2-binary-2.9.11.tar.gz", hash = "sha256:b6aed9e096bf63f9e75edf2581aa9a7e7186d97ab5c177aa6c87797cd591236c", size = 379620, upload-time = "2025-10-10T11:14:48.041Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/6a/f2/8e377d29c2ecf99f6062d35ea606b036e8800720eccfec5fe3dd672c2b24/psycopg2_binary-2.9.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d6fe6b47d0b42ce1c9f1fa3e35bb365011ca22e39db37074458f27921dca40f2", size = 3756506, upload-time = "2025-10-10T11:10:30.144Z" },
{ url = "https://files.pythonhosted.org/packages/24/cc/dc143ea88e4ec9d386106cac05023b69668bd0be20794c613446eaefafe5/psycopg2_binary-2.9.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a6c0e4262e089516603a09474ee13eabf09cb65c332277e39af68f6233911087", size = 3863943, upload-time = "2025-10-10T11:10:34.586Z" },
{ url = "https://files.pythonhosted.org/packages/8c/df/16848771155e7c419c60afeb24950b8aaa3ab09c0a091ec3ccca26a574d0/psycopg2_binary-2.9.11-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c47676e5b485393f069b4d7a811267d3168ce46f988fa602658b8bb901e9e64d", size = 4410873, upload-time = "2025-10-10T11:10:38.951Z" },
{ url = "https://files.pythonhosted.org/packages/43/79/5ef5f32621abd5a541b89b04231fe959a9b327c874a1d41156041c75494b/psycopg2_binary-2.9.11-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:a28d8c01a7b27a1e3265b11250ba7557e5f72b5ee9e5f3a2fa8d2949c29bf5d2", size = 4468016, upload-time = "2025-10-10T11:10:43.319Z" },
{ url = "https://files.pythonhosted.org/packages/f0/9b/d7542d0f7ad78f57385971f426704776d7b310f5219ed58da5d605b1892e/psycopg2_binary-2.9.11-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5f3f2732cf504a1aa9e9609d02f79bea1067d99edf844ab92c247bbca143303b", size = 4164996, upload-time = "2025-10-10T11:10:46.705Z" },
{ url = "https://files.pythonhosted.org/packages/14/ed/e409388b537fa7414330687936917c522f6a77a13474e4238219fcfd9a84/psycopg2_binary-2.9.11-cp310-cp310-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:865f9945ed1b3950d968ec4690ce68c55019d79e4497366d36e090327ce7db14", size = 3981881, upload-time = "2025-10-30T02:54:57.182Z" },
{ url = "https://files.pythonhosted.org/packages/bf/30/50e330e63bb05efc6fa7c1447df3e08954894025ca3dcb396ecc6739bc26/psycopg2_binary-2.9.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:91537a8df2bde69b1c1db01d6d944c831ca793952e4f57892600e96cee95f2cd", size = 3650857, upload-time = "2025-10-10T11:10:50.112Z" },
{ url = "https://files.pythonhosted.org/packages/f0/e0/4026e4c12bb49dd028756c5b0bc4c572319f2d8f1c9008e0dad8cc9addd7/psycopg2_binary-2.9.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4dca1f356a67ecb68c81a7bc7809f1569ad9e152ce7fd02c2f2036862ca9f66b", size = 3296063, upload-time = "2025-10-10T11:10:54.089Z" },
{ url = "https://files.pythonhosted.org/packages/2c/34/eb172be293c886fef5299fe5c3fcf180a05478be89856067881007934a7c/psycopg2_binary-2.9.11-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:0da4de5c1ac69d94ed4364b6cbe7190c1a70d325f112ba783d83f8440285f152", size = 3043464, upload-time = "2025-10-30T02:55:02.483Z" },
{ url = "https://files.pythonhosted.org/packages/18/1c/532c5d2cb11986372f14b798a95f2eaafe5779334f6a80589a68b5fcf769/psycopg2_binary-2.9.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37d8412565a7267f7d79e29ab66876e55cb5e8e7b3bbf94f8206f6795f8f7e7e", size = 3345378, upload-time = "2025-10-10T11:11:01.039Z" },
{ url = "https://files.pythonhosted.org/packages/70/e7/de420e1cf16f838e1fa17b1120e83afff374c7c0130d088dba6286fcf8ea/psycopg2_binary-2.9.11-cp310-cp310-win_amd64.whl", hash = "sha256:c665f01ec8ab273a61c62beeb8cce3014c214429ced8a308ca1fc410ecac3a39", size = 2713904, upload-time = "2025-10-10T11:11:04.81Z" },
{ url = "https://files.pythonhosted.org/packages/c7/ae/8d8266f6dd183ab4d48b95b9674034e1b482a3f8619b33a0d86438694577/psycopg2_binary-2.9.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0e8480afd62362d0a6a27dd09e4ca2def6fa50ed3a4e7c09165266106b2ffa10", size = 3756452, upload-time = "2025-10-10T11:11:11.583Z" },
{ url = "https://files.pythonhosted.org/packages/4b/34/aa03d327739c1be70e09d01182619aca8ebab5970cd0cfa50dd8b9cec2ac/psycopg2_binary-2.9.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:763c93ef1df3da6d1a90f86ea7f3f806dc06b21c198fa87c3c25504abec9404a", size = 3863957, upload-time = "2025-10-10T11:11:16.932Z" },
{ url = "https://files.pythonhosted.org/packages/48/89/3fdb5902bdab8868bbedc1c6e6023a4e08112ceac5db97fc2012060e0c9a/psycopg2_binary-2.9.11-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2e164359396576a3cc701ba8af4751ae68a07235d7a380c631184a611220d9a4", size = 4410955, upload-time = "2025-10-10T11:11:21.21Z" },
{ url = "https://files.pythonhosted.org/packages/ce/24/e18339c407a13c72b336e0d9013fbbbde77b6fd13e853979019a1269519c/psycopg2_binary-2.9.11-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:d57c9c387660b8893093459738b6abddbb30a7eab058b77b0d0d1c7d521ddfd7", size = 4468007, upload-time = "2025-10-10T11:11:24.831Z" },
{ url = "https://files.pythonhosted.org/packages/91/7e/b8441e831a0f16c159b5381698f9f7f7ed54b77d57bc9c5f99144cc78232/psycopg2_binary-2.9.11-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2c226ef95eb2250974bf6fa7a842082b31f68385c4f3268370e3f3870e7859ee", size = 4165012, upload-time = "2025-10-10T11:11:29.51Z" },
{ url = "https://files.pythonhosted.org/packages/0d/61/4aa89eeb6d751f05178a13da95516c036e27468c5d4d2509bb1e15341c81/psycopg2_binary-2.9.11-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a311f1edc9967723d3511ea7d2708e2c3592e3405677bf53d5c7246753591fbb", size = 3981881, upload-time = "2025-10-30T02:55:07.332Z" },
{ url = "https://files.pythonhosted.org/packages/76/a1/2f5841cae4c635a9459fe7aca8ed771336e9383b6429e05c01267b0774cf/psycopg2_binary-2.9.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ebb415404821b6d1c47353ebe9c8645967a5235e6d88f914147e7fd411419e6f", size = 3650985, upload-time = "2025-10-10T11:11:34.975Z" },
{ url = "https://files.pythonhosted.org/packages/84/74/4defcac9d002bca5709951b975173c8c2fa968e1a95dc713f61b3a8d3b6a/psycopg2_binary-2.9.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f07c9c4a5093258a03b28fab9b4f151aa376989e7f35f855088234e656ee6a94", size = 3296039, upload-time = "2025-10-10T11:11:40.432Z" },
{ url = "https://files.pythonhosted.org/packages/6d/c2/782a3c64403d8ce35b5c50e1b684412cf94f171dc18111be8c976abd2de1/psycopg2_binary-2.9.11-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:00ce1830d971f43b667abe4a56e42c1e2d594b32da4802e44a73bacacb25535f", size = 3043477, upload-time = "2025-10-30T02:55:11.182Z" },
{ url = "https://files.pythonhosted.org/packages/c8/31/36a1d8e702aa35c38fc117c2b8be3f182613faa25d794b8aeaab948d4c03/psycopg2_binary-2.9.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:cffe9d7697ae7456649617e8bb8d7a45afb71cd13f7ab22af3e5c61f04840908", size = 3345842, upload-time = "2025-10-10T11:11:45.366Z" },
{ url = "https://files.pythonhosted.org/packages/6e/b4/a5375cda5b54cb95ee9b836930fea30ae5a8f14aa97da7821722323d979b/psycopg2_binary-2.9.11-cp311-cp311-win_amd64.whl", hash = "sha256:304fd7b7f97eef30e91b8f7e720b3db75fee010b520e434ea35ed1ff22501d03", size = 2713894, upload-time = "2025-10-10T11:11:48.775Z" },
{ url = "https://files.pythonhosted.org/packages/d8/91/f870a02f51be4a65987b45a7de4c2e1897dd0d01051e2b559a38fa634e3e/psycopg2_binary-2.9.11-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:be9b840ac0525a283a96b556616f5b4820e0526addb8dcf6525a0fa162730be4", size = 3756603, upload-time = "2025-10-10T11:11:52.213Z" },
{ url = "https://files.pythonhosted.org/packages/27/fa/cae40e06849b6c9a95eb5c04d419942f00d9eaac8d81626107461e268821/psycopg2_binary-2.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f090b7ddd13ca842ebfe301cd587a76a4cf0913b1e429eb92c1be5dbeb1a19bc", size = 3864509, upload-time = "2025-10-10T11:11:56.452Z" },
{ url = "https://files.pythonhosted.org/packages/2d/75/364847b879eb630b3ac8293798e380e441a957c53657995053c5ec39a316/psycopg2_binary-2.9.11-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ab8905b5dcb05bf3fb22e0cf90e10f469563486ffb6a96569e51f897c750a76a", size = 4411159, upload-time = "2025-10-10T11:12:00.49Z" },
{ url = "https://files.pythonhosted.org/packages/6f/a0/567f7ea38b6e1c62aafd58375665a547c00c608a471620c0edc364733e13/psycopg2_binary-2.9.11-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:bf940cd7e7fec19181fdbc29d76911741153d51cab52e5c21165f3262125685e", size = 4468234, upload-time = "2025-10-10T11:12:04.892Z" },
{ url = "https://files.pythonhosted.org/packages/30/da/4e42788fb811bbbfd7b7f045570c062f49e350e1d1f3df056c3fb5763353/psycopg2_binary-2.9.11-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fa0f693d3c68ae925966f0b14b8edda71696608039f4ed61b1fe9ffa468d16db", size = 4166236, upload-time = "2025-10-10T11:12:11.674Z" },
{ url = "https://files.pythonhosted.org/packages/3c/94/c1777c355bc560992af848d98216148be5f1be001af06e06fc49cbded578/psycopg2_binary-2.9.11-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a1cf393f1cdaf6a9b57c0a719a1068ba1069f022a59b8b1fe44b006745b59757", size = 3983083, upload-time = "2025-10-30T02:55:15.73Z" },
{ url = "https://files.pythonhosted.org/packages/bd/42/c9a21edf0e3daa7825ed04a4a8588686c6c14904344344a039556d78aa58/psycopg2_binary-2.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ef7a6beb4beaa62f88592ccc65df20328029d721db309cb3250b0aae0fa146c3", size = 3652281, upload-time = "2025-10-10T11:12:17.713Z" },
{ url = "https://files.pythonhosted.org/packages/12/22/dedfbcfa97917982301496b6b5e5e6c5531d1f35dd2b488b08d1ebc52482/psycopg2_binary-2.9.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:31b32c457a6025e74d233957cc9736742ac5a6cb196c6b68499f6bb51390bd6a", size = 3298010, upload-time = "2025-10-10T11:12:22.671Z" },
{ url = "https://files.pythonhosted.org/packages/66/ea/d3390e6696276078bd01b2ece417deac954dfdd552d2edc3d03204416c0c/psycopg2_binary-2.9.11-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:edcb3aeb11cb4bf13a2af3c53a15b3d612edeb6409047ea0b5d6a21a9d744b34", size = 3044641, upload-time = "2025-10-30T02:55:19.929Z" },
{ url = "https://files.pythonhosted.org/packages/12/9a/0402ded6cbd321da0c0ba7d34dc12b29b14f5764c2fc10750daa38e825fc/psycopg2_binary-2.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:62b6d93d7c0b61a1dd6197d208ab613eb7dcfdcca0a49c42ceb082257991de9d", size = 3347940, upload-time = "2025-10-10T11:12:26.529Z" },
{ url = "https://files.pythonhosted.org/packages/b1/d2/99b55e85832ccde77b211738ff3925a5d73ad183c0b37bcbbe5a8ff04978/psycopg2_binary-2.9.11-cp312-cp312-win_amd64.whl", hash = "sha256:b33fabeb1fde21180479b2d4667e994de7bbf0eec22832ba5d9b5e4cf65b6c6d", size = 2714147, upload-time = "2025-10-10T11:12:29.535Z" },
{ url = "https://files.pythonhosted.org/packages/ff/a8/a2709681b3ac11b0b1786def10006b8995125ba268c9a54bea6f5ae8bd3e/psycopg2_binary-2.9.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b8fb3db325435d34235b044b199e56cdf9ff41223a4b9752e8576465170bb38c", size = 3756572, upload-time = "2025-10-10T11:12:32.873Z" },
{ url = "https://files.pythonhosted.org/packages/62/e1/c2b38d256d0dafd32713e9f31982a5b028f4a3651f446be70785f484f472/psycopg2_binary-2.9.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:366df99e710a2acd90efed3764bb1e28df6c675d33a7fb40df9b7281694432ee", size = 3864529, upload-time = "2025-10-10T11:12:36.791Z" },
{ url = "https://files.pythonhosted.org/packages/11/32/b2ffe8f3853c181e88f0a157c5fb4e383102238d73c52ac6d93a5c8bffe6/psycopg2_binary-2.9.11-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8c55b385daa2f92cb64b12ec4536c66954ac53654c7f15a203578da4e78105c0", size = 4411242, upload-time = "2025-10-10T11:12:42.388Z" },
{ url = "https://files.pythonhosted.org/packages/10/04/6ca7477e6160ae258dc96f67c371157776564679aefd247b66f4661501a2/psycopg2_binary-2.9.11-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c0377174bf1dd416993d16edc15357f6eb17ac998244cca19bc67cdc0e2e5766", size = 4468258, upload-time = "2025-10-10T11:12:48.654Z" },
{ url = "https://files.pythonhosted.org/packages/3c/7e/6a1a38f86412df101435809f225d57c1a021307dd0689f7a5e7fe83588b1/psycopg2_binary-2.9.11-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5c6ff3335ce08c75afaed19e08699e8aacf95d4a260b495a4a8545244fe2ceb3", size = 4166295, upload-time = "2025-10-10T11:12:52.525Z" },
{ url = "https://files.pythonhosted.org/packages/f2/7d/c07374c501b45f3579a9eb761cbf2604ddef3d96ad48679112c2c5aa9c25/psycopg2_binary-2.9.11-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:84011ba3109e06ac412f95399b704d3d6950e386b7994475b231cf61eec2fc1f", size = 3983133, upload-time = "2025-10-30T02:55:24.329Z" },
{ url = "https://files.pythonhosted.org/packages/82/56/993b7104cb8345ad7d4516538ccf8f0d0ac640b1ebd8c754a7b024e76878/psycopg2_binary-2.9.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ba34475ceb08cccbdd98f6b46916917ae6eeb92b5ae111df10b544c3a4621dc4", size = 3652383, upload-time = "2025-10-10T11:12:56.387Z" },
{ url = "https://files.pythonhosted.org/packages/2d/ac/eaeb6029362fd8d454a27374d84c6866c82c33bfc24587b4face5a8e43ef/psycopg2_binary-2.9.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b31e90fdd0f968c2de3b26ab014314fe814225b6c324f770952f7d38abf17e3c", size = 3298168, upload-time = "2025-10-10T11:13:00.403Z" },
{ url = "https://files.pythonhosted.org/packages/2b/39/50c3facc66bded9ada5cbc0de867499a703dc6bca6be03070b4e3b65da6c/psycopg2_binary-2.9.11-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:d526864e0f67f74937a8fce859bd56c979f5e2ec57ca7c627f5f1071ef7fee60", size = 3044712, upload-time = "2025-10-30T02:55:27.975Z" },
{ url = "https://files.pythonhosted.org/packages/9c/8e/b7de019a1f562f72ada81081a12823d3c1590bedc48d7d2559410a2763fe/psycopg2_binary-2.9.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:04195548662fa544626c8ea0f06561eb6203f1984ba5b4562764fbeb4c3d14b1", size = 3347549, upload-time = "2025-10-10T11:13:03.971Z" },
{ url = "https://files.pythonhosted.org/packages/80/2d/1bb683f64737bbb1f86c82b7359db1eb2be4e2c0c13b947f80efefa7d3e5/psycopg2_binary-2.9.11-cp313-cp313-win_amd64.whl", hash = "sha256:efff12b432179443f54e230fdf60de1f6cc726b6c832db8701227d089310e8aa", size = 2714215, upload-time = "2025-10-10T11:13:07.14Z" },
{ url = "https://files.pythonhosted.org/packages/64/12/93ef0098590cf51d9732b4f139533732565704f45bdc1ffa741b7c95fb54/psycopg2_binary-2.9.11-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:92e3b669236327083a2e33ccfa0d320dd01b9803b3e14dd986a4fc54aa00f4e1", size = 3756567, upload-time = "2025-10-10T11:13:11.885Z" },
{ url = "https://files.pythonhosted.org/packages/7c/a9/9d55c614a891288f15ca4b5209b09f0f01e3124056924e17b81b9fa054cc/psycopg2_binary-2.9.11-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e0deeb03da539fa3577fcb0b3f2554a97f7e5477c246098dbb18091a4a01c16f", size = 3864755, upload-time = "2025-10-10T11:13:17.727Z" },
{ url = "https://files.pythonhosted.org/packages/13/1e/98874ce72fd29cbde93209977b196a2edae03f8490d1bd8158e7f1daf3a0/psycopg2_binary-2.9.11-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9b52a3f9bb540a3e4ec0f6ba6d31339727b2950c9772850d6545b7eae0b9d7c5", size = 4411646, upload-time = "2025-10-10T11:13:24.432Z" },
{ url = "https://files.pythonhosted.org/packages/5a/bd/a335ce6645334fb8d758cc358810defca14a1d19ffbc8a10bd38a2328565/psycopg2_binary-2.9.11-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:db4fd476874ccfdbb630a54426964959e58da4c61c9feba73e6094d51303d7d8", size = 4468701, upload-time = "2025-10-10T11:13:29.266Z" },
{ url = "https://files.pythonhosted.org/packages/44/d6/c8b4f53f34e295e45709b7568bf9b9407a612ea30387d35eb9fa84f269b4/psycopg2_binary-2.9.11-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:47f212c1d3be608a12937cc131bd85502954398aaa1320cb4c14421a0ffccf4c", size = 4166293, upload-time = "2025-10-10T11:13:33.336Z" },
{ url = "https://files.pythonhosted.org/packages/4b/e0/f8cc36eadd1b716ab36bb290618a3292e009867e5c97ce4aba908cb99644/psycopg2_binary-2.9.11-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e35b7abae2b0adab776add56111df1735ccc71406e56203515e228a8dc07089f", size = 3983184, upload-time = "2025-10-30T02:55:32.483Z" },
{ url = "https://files.pythonhosted.org/packages/53/3e/2a8fe18a4e61cfb3417da67b6318e12691772c0696d79434184a511906dc/psycopg2_binary-2.9.11-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fcf21be3ce5f5659daefd2b3b3b6e4727b028221ddc94e6c1523425579664747", size = 3652650, upload-time = "2025-10-10T11:13:38.181Z" },
{ url = "https://files.pythonhosted.org/packages/76/36/03801461b31b29fe58d228c24388f999fe814dfc302856e0d17f97d7c54d/psycopg2_binary-2.9.11-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:9bd81e64e8de111237737b29d68039b9c813bdf520156af36d26819c9a979e5f", size = 3298663, upload-time = "2025-10-10T11:13:44.878Z" },
{ url = "https://files.pythonhosted.org/packages/97/77/21b0ea2e1a73aa5fa9222b2a6b8ba325c43c3a8d54272839c991f2345656/psycopg2_binary-2.9.11-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:32770a4d666fbdafab017086655bcddab791d7cb260a16679cc5a7338b64343b", size = 3044737, upload-time = "2025-10-30T02:55:35.69Z" },
{ url = "https://files.pythonhosted.org/packages/67/69/f36abe5f118c1dca6d3726ceae164b9356985805480731ac6712a63f24f0/psycopg2_binary-2.9.11-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c3cb3a676873d7506825221045bd70e0427c905b9c8ee8d6acd70cfcbd6e576d", size = 3347643, upload-time = "2025-10-10T11:13:53.499Z" },
{ url = "https://files.pythonhosted.org/packages/e1/36/9c0c326fe3a4227953dfb29f5d0c8ae3b8eb8c1cd2967aa569f50cb3c61f/psycopg2_binary-2.9.11-cp314-cp314-win_amd64.whl", hash = "sha256:4012c9c954dfaccd28f94e84ab9f94e12df76b4afb22331b1f0d3154893a6316", size = 2803913, upload-time = "2025-10-10T11:13:57.058Z" },
]
[[package]]
name = "pycparser"
version = "2.23"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/fe/cf/d2d3b9f5699fb1e4615c8e32ff220203e43b248e1dfcc6736ad9057731ca/pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2", size = 173734, upload-time = "2025-09-09T13:23:47.91Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934", size = 118140, upload-time = "2025-09-09T13:23:46.651Z" },
]
[[package]]
name = "pygments"
version = "2.19.2"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" },
]
[[package]]
name = "pyrefly"
version = "0.48.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/89/21/05951029b432115f6b272f58615954d8c51b8bdd98e43c5ca9b6abf51556/pyrefly-0.48.0.tar.gz", hash = "sha256:029440758d02f1954105523356bd583caa450cb537f70e746ebeeab5bf7e9ef9", size = 4782394, upload-time = "2026-01-12T18:37:04.576Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/6c/8b/c1b6e9b3beb5cabd89ead7eaa4f2ff34d9c6b3d65b2c1f8952fdbe25a78b/pyrefly-0.48.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:8c4cdf71439c9d21c337155d2a578a08ee322b898f716668a88f99392b2a1938", size = 11627167, upload-time = "2026-01-12T18:36:39.721Z" },
{ url = "https://files.pythonhosted.org/packages/b2/9d/4213e1a1287856de4f0a581039d8b722ccffe230245296f8199f748eaacc/pyrefly-0.48.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:98c1bed117e7a2c20dc6e160640460f903e9d75d8c674c7fccf69984ae1b9ba5", size = 11224100, upload-time = "2026-01-12T18:36:42.495Z" },
{ url = "https://files.pythonhosted.org/packages/0e/32/4ec264bcb5250e04b9954433dd455668507bcb7e54beaac66b7647ca16b2/pyrefly-0.48.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b38640edf5a7ff5250d0509d58c3002316b3700c0f60966f9635598f7079c8f0", size = 31679529, upload-time = "2026-01-12T18:36:45.641Z" },
{ url = "https://files.pythonhosted.org/packages/0d/37/2ecfb4a3e79e41ed343ae15808790315a0f7a07c929da7cf792e9f90c488/pyrefly-0.48.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10b82b48f0175d195ebb418ec23d6567b10c6f62f421ff5523a9e6e38955c396", size = 33883366, upload-time = "2026-01-12T18:36:49.097Z" },
{ url = "https://files.pythonhosted.org/packages/67/ef/24e5059fc1610755e6fc7f7c8dd3c8e5ce97cc46e47a18958482ae2af101/pyrefly-0.48.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3dc4eec1d606e69fe3e2be0533e8f86a30a4e97bd089df52fe279e4d5947d08f", size = 34964707, upload-time = "2026-01-12T18:36:52.257Z" },
{ url = "https://files.pythonhosted.org/packages/2b/50/e1c9894d4047847fbb8c6d360a6b88ce637e9ed5e7b1dde2c9f6c7409fe4/pyrefly-0.48.0-py3-none-win32.whl", hash = "sha256:e09806e14ea36873911e15f96c2351b4c6bd3e7ee29c609c4ba2ccdb4bf2d4f4", size = 10685409, upload-time = "2026-01-12T18:36:55.942Z" },
{ url = "https://files.pythonhosted.org/packages/50/b9/d8f32cf0a067bfe7908ded6dcf5abe9f0513be93710691928fe6d863ccea/pyrefly-0.48.0-py3-none-win_amd64.whl", hash = "sha256:326b9d01dfbca7e81f19630c59e79065e69c39505dab7dc3899dbce9832aa747", size = 11395073, upload-time = "2026-01-12T18:36:58.683Z" },
{ url = "https://files.pythonhosted.org/packages/bc/46/17d26c387d6c0d8c1062db74d81a64f534f08b5d0cd444e9f92c1a9e211e/pyrefly-0.48.0-py3-none-win_arm64.whl", hash = "sha256:754379335d90d42d66571ffd01d9afa6b7869ae16fdf8a62c67ad1ca3c2c594f", size = 10938427, upload-time = "2026-01-12T18:37:01.366Z" },
]
[[package]]
name = "pyright"
version = "1.1.408"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "nodeenv" },
{ name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/74/b2/5db700e52554b8f025faa9c3c624c59f1f6c8841ba81ab97641b54322f16/pyright-1.1.408.tar.gz", hash = "sha256:f28f2321f96852fa50b5829ea492f6adb0e6954568d1caa3f3af3a5f555eb684", size = 4400578, upload-time = "2026-01-08T08:07:38.795Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/0c/82/a2c93e32800940d9573fb28c346772a14778b84ba7524e691b324620ab89/pyright-1.1.408-py3-none-any.whl", hash = "sha256:090b32865f4fdb1e0e6cd82bf5618480d48eecd2eb2e70f960982a3d9a4c17c1", size = 6399144, upload-time = "2026-01-08T08:07:37.082Z" },
]
[[package]]
name = "pytest"
version = "9.0.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "colorama", marker = "sys_platform == 'win32'" },
{ name = "exceptiongroup", marker = "python_full_version < '3.11'" },
{ name = "iniconfig" },
{ name = "packaging" },
{ name = "pluggy" },
{ name = "pygments" },
{ name = "tomli", marker = "python_full_version < '3.11'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" },
]
[[package]]
name = "pytest-mypy-plugins"
version = "3.2.0"
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/8e/a0/3ec3d82da6c109efb48c70ffc666badb226e987a1f6c1076f1fddb7ca1a3/pytest_mypy_plugins-3.2.0.tar.gz", hash = "sha256:68bd95400c8f128327acd9a16c737dbec18b20fced3184ad97f391b07d4662f4", size = 27292, upload-time = "2024-12-21T20:11:36.467Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/de/84/6c9af99c416e52286fbf6df91a2ae19ef4da5d6f2dab626f8ff1a61280b5/pytest_mypy_plugins-3.2.0-py3-none-any.whl", hash = "sha256:46e24e8d9eaeabcddd0a5dc5fb089c021903d5952e0c9d8af79383db99b9ffae", size = 20627, upload-time = "2024-12-21T20:11:33.723Z" },
]
[[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/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" },
{ url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" },
{ url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" },
{ url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" },
{ url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" },
{ url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" },
{ url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" },
{ url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" },
{ url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" },
{ 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 = "7.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/43/c8/983d5c6579a411d8a99bc5823cc5712768859b5ce2c8afe1a65b37832c81/redis-7.1.0.tar.gz", hash = "sha256:b1cc3cfa5a2cb9c2ab3ba700864fb0ad75617b41f01352ce5779dabf6d5f9c3c", size = 4796669, upload-time = "2025-11-19T15:54:39.961Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/89/f0/8956f8a86b20d7bb9d6ac0187cf4cd54d8065bc9a1a09eb8011d4d326596/redis-7.1.0-py3-none-any.whl", hash = "sha256:23c52b208f92b56103e17c5d06bdc1a6c2c0b3106583985a76a18f83b265de2b", size = 354159, upload-time = "2025-11-19T15:54:38.064Z" },
]
[[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 = "2025.11.3"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/cc/a9/546676f25e573a4cf00fe8e119b78a37b6a8fe2dc95cda877b30889c9c45/regex-2025.11.3.tar.gz", hash = "sha256:1fedc720f9bb2494ce31a58a1631f9c82df6a09b49c19517ea5cc280b4541e01", size = 414669, upload-time = "2025-11-03T21:34:22.089Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/8a/d6/d788d52da01280a30a3f6268aef2aa71043bff359c618fea4c5b536654d5/regex-2025.11.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2b441a4ae2c8049106e8b39973bfbddfb25a179dda2bdb99b0eeb60c40a6a3af", size = 488087, upload-time = "2025-11-03T21:30:47.317Z" },
{ url = "https://files.pythonhosted.org/packages/69/39/abec3bd688ec9bbea3562de0fd764ff802976185f5ff22807bf0a2697992/regex-2025.11.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2fa2eed3f76677777345d2f81ee89f5de2f5745910e805f7af7386a920fa7313", size = 290544, upload-time = "2025-11-03T21:30:49.912Z" },
{ url = "https://files.pythonhosted.org/packages/39/b3/9a231475d5653e60002508f41205c61684bb2ffbf2401351ae2186897fc4/regex-2025.11.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d8b4a27eebd684319bdf473d39f1d79eed36bf2cd34bd4465cdb4618d82b3d56", size = 288408, upload-time = "2025-11-03T21:30:51.344Z" },
{ url = "https://files.pythonhosted.org/packages/c3/c5/1929a0491bd5ac2d1539a866768b88965fa8c405f3e16a8cef84313098d6/regex-2025.11.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cf77eac15bd264986c4a2c63353212c095b40f3affb2bc6b4ef80c4776c1a28", size = 781584, upload-time = "2025-11-03T21:30:52.596Z" },
{ url = "https://files.pythonhosted.org/packages/ce/fd/16aa16cf5d497ef727ec966f74164fbe75d6516d3d58ac9aa989bc9cdaad/regex-2025.11.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b7f9ee819f94c6abfa56ec7b1dbab586f41ebbdc0a57e6524bd5e7f487a878c7", size = 850733, upload-time = "2025-11-03T21:30:53.825Z" },
{ url = "https://files.pythonhosted.org/packages/e6/49/3294b988855a221cb6565189edf5dc43239957427df2d81d4a6b15244f64/regex-2025.11.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:838441333bc90b829406d4a03cb4b8bf7656231b84358628b0406d803931ef32", size = 898691, upload-time = "2025-11-03T21:30:55.575Z" },
{ url = "https://files.pythonhosted.org/packages/14/62/b56d29e70b03666193369bdbdedfdc23946dbe9f81dd78ce262c74d988ab/regex-2025.11.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cfe6d3f0c9e3b7e8c0c694b24d25e677776f5ca26dce46fd6b0489f9c8339391", size = 791662, upload-time = "2025-11-03T21:30:57.262Z" },
{ url = "https://files.pythonhosted.org/packages/15/fc/e4c31d061eced63fbf1ce9d853975f912c61a7d406ea14eda2dd355f48e7/regex-2025.11.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2ab815eb8a96379a27c3b6157fcb127c8f59c36f043c1678110cea492868f1d5", size = 782587, upload-time = "2025-11-03T21:30:58.788Z" },
{ url = "https://files.pythonhosted.org/packages/b2/bb/5e30c7394bcf63f0537121c23e796be67b55a8847c3956ae6068f4c70702/regex-2025.11.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:728a9d2d173a65b62bdc380b7932dd8e74ed4295279a8fe1021204ce210803e7", size = 774709, upload-time = "2025-11-03T21:31:00.081Z" },
{ url = "https://files.pythonhosted.org/packages/c5/c4/fce773710af81b0cb37cb4ff0947e75d5d17dee304b93d940b87a67fc2f4/regex-2025.11.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:509dc827f89c15c66a0c216331260d777dd6c81e9a4e4f830e662b0bb296c313", size = 845773, upload-time = "2025-11-03T21:31:01.583Z" },
{ url = "https://files.pythonhosted.org/packages/7b/5e/9466a7ec4b8ec282077095c6eb50a12a389d2e036581134d4919e8ca518c/regex-2025.11.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:849202cd789e5f3cf5dcc7822c34b502181b4824a65ff20ce82da5524e45e8e9", size = 836164, upload-time = "2025-11-03T21:31:03.244Z" },
{ url = "https://files.pythonhosted.org/packages/95/18/82980a60e8ed1594eb3c89eb814fb276ef51b9af7caeab1340bfd8564af6/regex-2025.11.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b6f78f98741dcc89607c16b1e9426ee46ce4bf31ac5e6b0d40e81c89f3481ea5", size = 779832, upload-time = "2025-11-03T21:31:04.876Z" },
{ url = "https://files.pythonhosted.org/packages/03/cc/90ab0fdbe6dce064a42015433f9152710139fb04a8b81b4fb57a1cb63ffa/regex-2025.11.3-cp310-cp310-win32.whl", hash = "sha256:149eb0bba95231fb4f6d37c8f760ec9fa6fabf65bab555e128dde5f2475193ec", size = 265802, upload-time = "2025-11-03T21:31:06.581Z" },
{ url = "https://files.pythonhosted.org/packages/34/9d/e9e8493a85f3b1ddc4a5014465f5c2b78c3ea1cbf238dcfde78956378041/regex-2025.11.3-cp310-cp310-win_amd64.whl", hash = "sha256:ee3a83ce492074c35a74cc76cf8235d49e77b757193a5365ff86e3f2f93db9fd", size = 277722, upload-time = "2025-11-03T21:31:08.144Z" },
{ url = "https://files.pythonhosted.org/packages/15/c4/b54b24f553966564506dbf873a3e080aef47b356a3b39b5d5aba992b50db/regex-2025.11.3-cp310-cp310-win_arm64.whl", hash = "sha256:38af559ad934a7b35147716655d4a2f79fcef2d695ddfe06a06ba40ae631fa7e", size = 270289, upload-time = "2025-11-03T21:31:10.267Z" },
{ url = "https://files.pythonhosted.org/packages/f7/90/4fb5056e5f03a7048abd2b11f598d464f0c167de4f2a51aa868c376b8c70/regex-2025.11.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eadade04221641516fa25139273505a1c19f9bf97589a05bc4cfcd8b4a618031", size = 488081, upload-time = "2025-11-03T21:31:11.946Z" },
{ url = "https://files.pythonhosted.org/packages/85/23/63e481293fac8b069d84fba0299b6666df720d875110efd0338406b5d360/regex-2025.11.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:feff9e54ec0dd3833d659257f5c3f5322a12eee58ffa360984b716f8b92983f4", size = 290554, upload-time = "2025-11-03T21:31:13.387Z" },
{ url = "https://files.pythonhosted.org/packages/2b/9d/b101d0262ea293a0066b4522dfb722eb6a8785a8c3e084396a5f2c431a46/regex-2025.11.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3b30bc921d50365775c09a7ed446359e5c0179e9e2512beec4a60cbcef6ddd50", size = 288407, upload-time = "2025-11-03T21:31:14.809Z" },
{ url = "https://files.pythonhosted.org/packages/0c/64/79241c8209d5b7e00577ec9dca35cd493cc6be35b7d147eda367d6179f6d/regex-2025.11.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f99be08cfead2020c7ca6e396c13543baea32343b7a9a5780c462e323bd8872f", size = 793418, upload-time = "2025-11-03T21:31:16.556Z" },
{ url = "https://files.pythonhosted.org/packages/3d/e2/23cd5d3573901ce8f9757c92ca4db4d09600b865919b6d3e7f69f03b1afd/regex-2025.11.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6dd329a1b61c0ee95ba95385fb0c07ea0d3fe1a21e1349fa2bec272636217118", size = 860448, upload-time = "2025-11-03T21:31:18.12Z" },
{ url = "https://files.pythonhosted.org/packages/2a/4c/aecf31beeaa416d0ae4ecb852148d38db35391aac19c687b5d56aedf3a8b/regex-2025.11.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4c5238d32f3c5269d9e87be0cf096437b7622b6920f5eac4fd202468aaeb34d2", size = 907139, upload-time = "2025-11-03T21:31:20.753Z" },
{ url = "https://files.pythonhosted.org/packages/61/22/b8cb00df7d2b5e0875f60628594d44dba283e951b1ae17c12f99e332cc0a/regex-2025.11.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10483eefbfb0adb18ee9474498c9a32fcf4e594fbca0543bb94c48bac6183e2e", size = 800439, upload-time = "2025-11-03T21:31:22.069Z" },
{ url = "https://files.pythonhosted.org/packages/02/a8/c4b20330a5cdc7a8eb265f9ce593f389a6a88a0c5f280cf4d978f33966bc/regex-2025.11.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:78c2d02bb6e1da0720eedc0bad578049cad3f71050ef8cd065ecc87691bed2b0", size = 782965, upload-time = "2025-11-03T21:31:23.598Z" },
{ url = "https://files.pythonhosted.org/packages/b4/4c/ae3e52988ae74af4b04d2af32fee4e8077f26e51b62ec2d12d246876bea2/regex-2025.11.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e6b49cd2aad93a1790ce9cffb18964f6d3a4b0b3dbdbd5de094b65296fce6e58", size = 854398, upload-time = "2025-11-03T21:31:25.008Z" },
{ url = "https://files.pythonhosted.org/packages/06/d1/a8b9cf45874eda14b2e275157ce3b304c87e10fb38d9fc26a6e14eb18227/regex-2025.11.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:885b26aa3ee56433b630502dc3d36ba78d186a00cc535d3806e6bfd9ed3c70ab", size = 845897, upload-time = "2025-11-03T21:31:26.427Z" },
{ url = "https://files.pythonhosted.org/packages/ea/fe/1830eb0236be93d9b145e0bd8ab499f31602fe0999b1f19e99955aa8fe20/regex-2025.11.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ddd76a9f58e6a00f8772e72cff8ebcff78e022be95edf018766707c730593e1e", size = 788906, upload-time = "2025-11-03T21:31:28.078Z" },
{ url = "https://files.pythonhosted.org/packages/66/47/dc2577c1f95f188c1e13e2e69d8825a5ac582ac709942f8a03af42ed6e93/regex-2025.11.3-cp311-cp311-win32.whl", hash = "sha256:3e816cc9aac1cd3cc9a4ec4d860f06d40f994b5c7b4d03b93345f44e08cc68bf", size = 265812, upload-time = "2025-11-03T21:31:29.72Z" },
{ url = "https://files.pythonhosted.org/packages/50/1e/15f08b2f82a9bbb510621ec9042547b54d11e83cb620643ebb54e4eb7d71/regex-2025.11.3-cp311-cp311-win_amd64.whl", hash = "sha256:087511f5c8b7dfbe3a03f5d5ad0c2a33861b1fc387f21f6f60825a44865a385a", size = 277737, upload-time = "2025-11-03T21:31:31.422Z" },
{ url = "https://files.pythonhosted.org/packages/f4/fc/6500eb39f5f76c5e47a398df82e6b535a5e345f839581012a418b16f9cc3/regex-2025.11.3-cp311-cp311-win_arm64.whl", hash = "sha256:1ff0d190c7f68ae7769cd0313fe45820ba07ffebfddfaa89cc1eb70827ba0ddc", size = 270290, upload-time = "2025-11-03T21:31:33.041Z" },
{ url = "https://files.pythonhosted.org/packages/e8/74/18f04cb53e58e3fb107439699bd8375cf5a835eec81084e0bddbd122e4c2/regex-2025.11.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bc8ab71e2e31b16e40868a40a69007bc305e1109bd4658eb6cad007e0bf67c41", size = 489312, upload-time = "2025-11-03T21:31:34.343Z" },
{ url = "https://files.pythonhosted.org/packages/78/3f/37fcdd0d2b1e78909108a876580485ea37c91e1acf66d3bb8e736348f441/regex-2025.11.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:22b29dda7e1f7062a52359fca6e58e548e28c6686f205e780b02ad8ef710de36", size = 291256, upload-time = "2025-11-03T21:31:35.675Z" },
{ url = "https://files.pythonhosted.org/packages/bf/26/0a575f58eb23b7ebd67a45fccbc02ac030b737b896b7e7a909ffe43ffd6a/regex-2025.11.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3a91e4a29938bc1a082cc28fdea44be420bf2bebe2665343029723892eb073e1", size = 288921, upload-time = "2025-11-03T21:31:37.07Z" },
{ url = "https://files.pythonhosted.org/packages/ea/98/6a8dff667d1af907150432cf5abc05a17ccd32c72a3615410d5365ac167a/regex-2025.11.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08b884f4226602ad40c5d55f52bf91a9df30f513864e0054bad40c0e9cf1afb7", size = 798568, upload-time = "2025-11-03T21:31:38.784Z" },
{ url = "https://files.pythonhosted.org/packages/64/15/92c1db4fa4e12733dd5a526c2dd2b6edcbfe13257e135fc0f6c57f34c173/regex-2025.11.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3e0b11b2b2433d1c39c7c7a30e3f3d0aeeea44c2a8d0bae28f6b95f639927a69", size = 864165, upload-time = "2025-11-03T21:31:40.559Z" },
{ url = "https://files.pythonhosted.org/packages/f9/e7/3ad7da8cdee1ce66c7cd37ab5ab05c463a86ffeb52b1a25fe7bd9293b36c/regex-2025.11.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:87eb52a81ef58c7ba4d45c3ca74e12aa4b4e77816f72ca25258a85b3ea96cb48", size = 912182, upload-time = "2025-11-03T21:31:42.002Z" },
{ url = "https://files.pythonhosted.org/packages/84/bd/9ce9f629fcb714ffc2c3faf62b6766ecb7a585e1e885eb699bcf130a5209/regex-2025.11.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a12ab1f5c29b4e93db518f5e3872116b7e9b1646c9f9f426f777b50d44a09e8c", size = 803501, upload-time = "2025-11-03T21:31:43.815Z" },
{ url = "https://files.pythonhosted.org/packages/7c/0f/8dc2e4349d8e877283e6edd6c12bdcebc20f03744e86f197ab6e4492bf08/regex-2025.11.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7521684c8c7c4f6e88e35ec89680ee1aa8358d3f09d27dfbdf62c446f5d4c695", size = 787842, upload-time = "2025-11-03T21:31:45.353Z" },
{ url = "https://files.pythonhosted.org/packages/f9/73/cff02702960bc185164d5619c0c62a2f598a6abff6695d391b096237d4ab/regex-2025.11.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7fe6e5440584e94cc4b3f5f4d98a25e29ca12dccf8873679a635638349831b98", size = 858519, upload-time = "2025-11-03T21:31:46.814Z" },
{ url = "https://files.pythonhosted.org/packages/61/83/0e8d1ae71e15bc1dc36231c90b46ee35f9d52fab2e226b0e039e7ea9c10a/regex-2025.11.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:8e026094aa12b43f4fd74576714e987803a315c76edb6b098b9809db5de58f74", size = 850611, upload-time = "2025-11-03T21:31:48.289Z" },
{ url = "https://files.pythonhosted.org/packages/c8/f5/70a5cdd781dcfaa12556f2955bf170cd603cb1c96a1827479f8faea2df97/regex-2025.11.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:435bbad13e57eb5606a68443af62bed3556de2f46deb9f7d4237bc2f1c9fb3a0", size = 789759, upload-time = "2025-11-03T21:31:49.759Z" },
{ url = "https://files.pythonhosted.org/packages/59/9b/7c29be7903c318488983e7d97abcf8ebd3830e4c956c4c540005fcfb0462/regex-2025.11.3-cp312-cp312-win32.whl", hash = "sha256:3839967cf4dc4b985e1570fd8d91078f0c519f30491c60f9ac42a8db039be204", size = 266194, upload-time = "2025-11-03T21:31:51.53Z" },
{ url = "https://files.pythonhosted.org/packages/1a/67/3b92df89f179d7c367be654ab5626ae311cb28f7d5c237b6bb976cd5fbbb/regex-2025.11.3-cp312-cp312-win_amd64.whl", hash = "sha256:e721d1b46e25c481dc5ded6f4b3f66c897c58d2e8cfdf77bbced84339108b0b9", size = 277069, upload-time = "2025-11-03T21:31:53.151Z" },
{ url = "https://files.pythonhosted.org/packages/d7/55/85ba4c066fe5094d35b249c3ce8df0ba623cfd35afb22d6764f23a52a1c5/regex-2025.11.3-cp312-cp312-win_arm64.whl", hash = "sha256:64350685ff08b1d3a6fff33f45a9ca183dc1d58bbfe4981604e70ec9801bbc26", size = 270330, upload-time = "2025-11-03T21:31:54.514Z" },
{ url = "https://files.pythonhosted.org/packages/e1/a7/dda24ebd49da46a197436ad96378f17df30ceb40e52e859fc42cac45b850/regex-2025.11.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c1e448051717a334891f2b9a620fe36776ebf3dd8ec46a0b877c8ae69575feb4", size = 489081, upload-time = "2025-11-03T21:31:55.9Z" },
{ url = "https://files.pythonhosted.org/packages/19/22/af2dc751aacf88089836aa088a1a11c4f21a04707eb1b0478e8e8fb32847/regex-2025.11.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9b5aca4d5dfd7fbfbfbdaf44850fcc7709a01146a797536a8f84952e940cca76", size = 291123, upload-time = "2025-11-03T21:31:57.758Z" },
{ url = "https://files.pythonhosted.org/packages/a3/88/1a3ea5672f4b0a84802ee9891b86743438e7c04eb0b8f8c4e16a42375327/regex-2025.11.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:04d2765516395cf7dda331a244a3282c0f5ae96075f728629287dfa6f76ba70a", size = 288814, upload-time = "2025-11-03T21:32:01.12Z" },
{ url = "https://files.pythonhosted.org/packages/fb/8c/f5987895bf42b8ddeea1b315c9fedcfe07cadee28b9c98cf50d00adcb14d/regex-2025.11.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d9903ca42bfeec4cebedba8022a7c97ad2aab22e09573ce9976ba01b65e4361", size = 798592, upload-time = "2025-11-03T21:32:03.006Z" },
{ url = "https://files.pythonhosted.org/packages/99/2a/6591ebeede78203fa77ee46a1c36649e02df9eaa77a033d1ccdf2fcd5d4e/regex-2025.11.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:639431bdc89d6429f6721625e8129413980ccd62e9d3f496be618a41d205f160", size = 864122, upload-time = "2025-11-03T21:32:04.553Z" },
{ url = "https://files.pythonhosted.org/packages/94/d6/be32a87cf28cf8ed064ff281cfbd49aefd90242a83e4b08b5a86b38e8eb4/regex-2025.11.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f117efad42068f9715677c8523ed2be1518116d1c49b1dd17987716695181efe", size = 912272, upload-time = "2025-11-03T21:32:06.148Z" },
{ url = "https://files.pythonhosted.org/packages/62/11/9bcef2d1445665b180ac7f230406ad80671f0fc2a6ffb93493b5dd8cd64c/regex-2025.11.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4aecb6f461316adf9f1f0f6a4a1a3d79e045f9b71ec76055a791affa3b285850", size = 803497, upload-time = "2025-11-03T21:32:08.162Z" },
{ url = "https://files.pythonhosted.org/packages/e5/a7/da0dc273d57f560399aa16d8a68ae7f9b57679476fc7ace46501d455fe84/regex-2025.11.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3b3a5f320136873cc5561098dfab677eea139521cb9a9e8db98b7e64aef44cbc", size = 787892, upload-time = "2025-11-03T21:32:09.769Z" },
{ url = "https://files.pythonhosted.org/packages/da/4b/732a0c5a9736a0b8d6d720d4945a2f1e6f38f87f48f3173559f53e8d5d82/regex-2025.11.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:75fa6f0056e7efb1f42a1c34e58be24072cb9e61a601340cc1196ae92326a4f9", size = 858462, upload-time = "2025-11-03T21:32:11.769Z" },
{ url = "https://files.pythonhosted.org/packages/0c/f5/a2a03df27dc4c2d0c769220f5110ba8c4084b0bfa9ab0f9b4fcfa3d2b0fc/regex-2025.11.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:dbe6095001465294f13f1adcd3311e50dd84e5a71525f20a10bd16689c61ce0b", size = 850528, upload-time = "2025-11-03T21:32:13.906Z" },
{ url = "https://files.pythonhosted.org/packages/d6/09/e1cd5bee3841c7f6eb37d95ca91cdee7100b8f88b81e41c2ef426910891a/regex-2025.11.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:454d9b4ae7881afbc25015b8627c16d88a597479b9dea82b8c6e7e2e07240dc7", size = 789866, upload-time = "2025-11-03T21:32:15.748Z" },
{ url = "https://files.pythonhosted.org/packages/eb/51/702f5ea74e2a9c13d855a6a85b7f80c30f9e72a95493260193c07f3f8d74/regex-2025.11.3-cp313-cp313-win32.whl", hash = "sha256:28ba4d69171fc6e9896337d4fc63a43660002b7da53fc15ac992abcf3410917c", size = 266189, upload-time = "2025-11-03T21:32:17.493Z" },
{ url = "https://files.pythonhosted.org/packages/8b/00/6e29bb314e271a743170e53649db0fdb8e8ff0b64b4f425f5602f4eb9014/regex-2025.11.3-cp313-cp313-win_amd64.whl", hash = "sha256:bac4200befe50c670c405dc33af26dad5a3b6b255dd6c000d92fe4629f9ed6a5", size = 277054, upload-time = "2025-11-03T21:32:19.042Z" },
{ url = "https://files.pythonhosted.org/packages/25/f1/b156ff9f2ec9ac441710764dda95e4edaf5f36aca48246d1eea3f1fd96ec/regex-2025.11.3-cp313-cp313-win_arm64.whl", hash = "sha256:2292cd5a90dab247f9abe892ac584cb24f0f54680c73fcb4a7493c66c2bf2467", size = 270325, upload-time = "2025-11-03T21:32:21.338Z" },
{ url = "https://files.pythonhosted.org/packages/20/28/fd0c63357caefe5680b8ea052131acbd7f456893b69cc2a90cc3e0dc90d4/regex-2025.11.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:1eb1ebf6822b756c723e09f5186473d93236c06c579d2cc0671a722d2ab14281", size = 491984, upload-time = "2025-11-03T21:32:23.466Z" },
{ url = "https://files.pythonhosted.org/packages/df/ec/7014c15626ab46b902b3bcc4b28a7bae46d8f281fc7ea9c95e22fcaaa917/regex-2025.11.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1e00ec2970aab10dc5db34af535f21fcf32b4a31d99e34963419636e2f85ae39", size = 292673, upload-time = "2025-11-03T21:32:25.034Z" },
{ url = "https://files.pythonhosted.org/packages/23/ab/3b952ff7239f20d05f1f99e9e20188513905f218c81d52fb5e78d2bf7634/regex-2025.11.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a4cb042b615245d5ff9b3794f56be4138b5adc35a4166014d31d1814744148c7", size = 291029, upload-time = "2025-11-03T21:32:26.528Z" },
{ url = "https://files.pythonhosted.org/packages/21/7e/3dc2749fc684f455f162dcafb8a187b559e2614f3826877d3844a131f37b/regex-2025.11.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44f264d4bf02f3176467d90b294d59bf1db9fe53c141ff772f27a8b456b2a9ed", size = 807437, upload-time = "2025-11-03T21:32:28.363Z" },
{ url = "https://files.pythonhosted.org/packages/1b/0b/d529a85ab349c6a25d1ca783235b6e3eedf187247eab536797021f7126c6/regex-2025.11.3-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7be0277469bf3bd7a34a9c57c1b6a724532a0d235cd0dc4e7f4316f982c28b19", size = 873368, upload-time = "2025-11-03T21:32:30.4Z" },
{ url = "https://files.pythonhosted.org/packages/7d/18/2d868155f8c9e3e9d8f9e10c64e9a9f496bb8f7e037a88a8bed26b435af6/regex-2025.11.3-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0d31e08426ff4b5b650f68839f5af51a92a5b51abd8554a60c2fbc7c71f25d0b", size = 914921, upload-time = "2025-11-03T21:32:32.123Z" },
{ url = "https://files.pythonhosted.org/packages/2d/71/9d72ff0f354fa783fe2ba913c8734c3b433b86406117a8db4ea2bf1c7a2f/regex-2025.11.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e43586ce5bd28f9f285a6e729466841368c4a0353f6fd08d4ce4630843d3648a", size = 812708, upload-time = "2025-11-03T21:32:34.305Z" },
{ url = "https://files.pythonhosted.org/packages/e7/19/ce4bf7f5575c97f82b6e804ffb5c4e940c62609ab2a0d9538d47a7fdf7d4/regex-2025.11.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:0f9397d561a4c16829d4e6ff75202c1c08b68a3bdbfe29dbfcdb31c9830907c6", size = 795472, upload-time = "2025-11-03T21:32:36.364Z" },
{ url = "https://files.pythonhosted.org/packages/03/86/fd1063a176ffb7b2315f9a1b08d17b18118b28d9df163132615b835a26ee/regex-2025.11.3-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:dd16e78eb18ffdb25ee33a0682d17912e8cc8a770e885aeee95020046128f1ce", size = 868341, upload-time = "2025-11-03T21:32:38.042Z" },
{ url = "https://files.pythonhosted.org/packages/12/43/103fb2e9811205e7386366501bc866a164a0430c79dd59eac886a2822950/regex-2025.11.3-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:ffcca5b9efe948ba0661e9df0fa50d2bc4b097c70b9810212d6b62f05d83b2dd", size = 854666, upload-time = "2025-11-03T21:32:40.079Z" },
{ url = "https://files.pythonhosted.org/packages/7d/22/e392e53f3869b75804762c7c848bd2dd2abf2b70fb0e526f58724638bd35/regex-2025.11.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c56b4d162ca2b43318ac671c65bd4d563e841a694ac70e1a976ac38fcf4ca1d2", size = 799473, upload-time = "2025-11-03T21:32:42.148Z" },
{ url = "https://files.pythonhosted.org/packages/4f/f9/8bd6b656592f925b6845fcbb4d57603a3ac2fb2373344ffa1ed70aa6820a/regex-2025.11.3-cp313-cp313t-win32.whl", hash = "sha256:9ddc42e68114e161e51e272f667d640f97e84a2b9ef14b7477c53aac20c2d59a", size = 268792, upload-time = "2025-11-03T21:32:44.13Z" },
{ url = "https://files.pythonhosted.org/packages/e5/87/0e7d603467775ff65cd2aeabf1b5b50cc1c3708556a8b849a2fa4dd1542b/regex-2025.11.3-cp313-cp313t-win_amd64.whl", hash = "sha256:7a7c7fdf755032ffdd72c77e3d8096bdcb0eb92e89e17571a196f03d88b11b3c", size = 280214, upload-time = "2025-11-03T21:32:45.853Z" },
{ url = "https://files.pythonhosted.org/packages/8d/d0/2afc6f8e94e2b64bfb738a7c2b6387ac1699f09f032d363ed9447fd2bb57/regex-2025.11.3-cp313-cp313t-win_arm64.whl", hash = "sha256:df9eb838c44f570283712e7cff14c16329a9f0fb19ca492d21d4b7528ee6821e", size = 271469, upload-time = "2025-11-03T21:32:48.026Z" },
{ url = "https://files.pythonhosted.org/packages/31/e9/f6e13de7e0983837f7b6d238ad9458800a874bf37c264f7923e63409944c/regex-2025.11.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:9697a52e57576c83139d7c6f213d64485d3df5bf84807c35fa409e6c970801c6", size = 489089, upload-time = "2025-11-03T21:32:50.027Z" },
{ url = "https://files.pythonhosted.org/packages/a3/5c/261f4a262f1fa65141c1b74b255988bd2fa020cc599e53b080667d591cfc/regex-2025.11.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e18bc3f73bd41243c9b38a6d9f2366cd0e0137a9aebe2d8ff76c5b67d4c0a3f4", size = 291059, upload-time = "2025-11-03T21:32:51.682Z" },
{ url = "https://files.pythonhosted.org/packages/8e/57/f14eeb7f072b0e9a5a090d1712741fd8f214ec193dba773cf5410108bb7d/regex-2025.11.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:61a08bcb0ec14ff4e0ed2044aad948d0659604f824cbd50b55e30b0ec6f09c73", size = 288900, upload-time = "2025-11-03T21:32:53.569Z" },
{ url = "https://files.pythonhosted.org/packages/3c/6b/1d650c45e99a9b327586739d926a1cd4e94666b1bd4af90428b36af66dc7/regex-2025.11.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9c30003b9347c24bcc210958c5d167b9e4f9be786cb380a7d32f14f9b84674f", size = 799010, upload-time = "2025-11-03T21:32:55.222Z" },
{ url = "https://files.pythonhosted.org/packages/99/ee/d66dcbc6b628ce4e3f7f0cbbb84603aa2fc0ffc878babc857726b8aab2e9/regex-2025.11.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4e1e592789704459900728d88d41a46fe3969b82ab62945560a31732ffc19a6d", size = 864893, upload-time = "2025-11-03T21:32:57.239Z" },
{ url = "https://files.pythonhosted.org/packages/bf/2d/f238229f1caba7ac87a6c4153d79947fb0261415827ae0f77c304260c7d3/regex-2025.11.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6538241f45eb5a25aa575dbba1069ad786f68a4f2773a29a2bd3dd1f9de787be", size = 911522, upload-time = "2025-11-03T21:32:59.274Z" },
{ url = "https://files.pythonhosted.org/packages/bd/3d/22a4eaba214a917c80e04f6025d26143690f0419511e0116508e24b11c9b/regex-2025.11.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce22519c989bb72a7e6b36a199384c53db7722fe669ba891da75907fe3587db", size = 803272, upload-time = "2025-11-03T21:33:01.393Z" },
{ url = "https://files.pythonhosted.org/packages/84/b1/03188f634a409353a84b5ef49754b97dbcc0c0f6fd6c8ede505a8960a0a4/regex-2025.11.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:66d559b21d3640203ab9075797a55165d79017520685fb407b9234d72ab63c62", size = 787958, upload-time = "2025-11-03T21:33:03.379Z" },
{ url = "https://files.pythonhosted.org/packages/99/6a/27d072f7fbf6fadd59c64d210305e1ff865cc3b78b526fd147db768c553b/regex-2025.11.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:669dcfb2e38f9e8c69507bace46f4889e3abbfd9b0c29719202883c0a603598f", size = 859289, upload-time = "2025-11-03T21:33:05.374Z" },
{ url = "https://files.pythonhosted.org/packages/9a/70/1b3878f648e0b6abe023172dacb02157e685564853cc363d9961bcccde4e/regex-2025.11.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:32f74f35ff0f25a5021373ac61442edcb150731fbaa28286bbc8bb1582c89d02", size = 850026, upload-time = "2025-11-03T21:33:07.131Z" },
{ url = "https://files.pythonhosted.org/packages/dd/d5/68e25559b526b8baab8e66839304ede68ff6727237a47727d240006bd0ff/regex-2025.11.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e6c7a21dffba883234baefe91bc3388e629779582038f75d2a5be918e250f0ed", size = 789499, upload-time = "2025-11-03T21:33:09.141Z" },
{ url = "https://files.pythonhosted.org/packages/fc/df/43971264857140a350910d4e33df725e8c94dd9dee8d2e4729fa0d63d49e/regex-2025.11.3-cp314-cp314-win32.whl", hash = "sha256:795ea137b1d809eb6836b43748b12634291c0ed55ad50a7d72d21edf1cd565c4", size = 271604, upload-time = "2025-11-03T21:33:10.9Z" },
{ url = "https://files.pythonhosted.org/packages/01/6f/9711b57dc6894a55faf80a4c1b5aa4f8649805cb9c7aef46f7d27e2b9206/regex-2025.11.3-cp314-cp314-win_amd64.whl", hash = "sha256:9f95fbaa0ee1610ec0fc6b26668e9917a582ba80c52cc6d9ada15e30aa9ab9ad", size = 280320, upload-time = "2025-11-03T21:33:12.572Z" },
{ url = "https://files.pythonhosted.org/packages/f1/7e/f6eaa207d4377481f5e1775cdeb5a443b5a59b392d0065f3417d31d80f87/regex-2025.11.3-cp314-cp314-win_arm64.whl", hash = "sha256:dfec44d532be4c07088c3de2876130ff0fbeeacaa89a137decbbb5f665855a0f", size = 273372, upload-time = "2025-11-03T21:33:14.219Z" },
{ url = "https://files.pythonhosted.org/packages/c3/06/49b198550ee0f5e4184271cee87ba4dfd9692c91ec55289e6282f0f86ccf/regex-2025.11.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:ba0d8a5d7f04f73ee7d01d974d47c5834f8a1b0224390e4fe7c12a3a92a78ecc", size = 491985, upload-time = "2025-11-03T21:33:16.555Z" },
{ url = "https://files.pythonhosted.org/packages/ce/bf/abdafade008f0b1c9da10d934034cb670432d6cf6cbe38bbb53a1cfd6cf8/regex-2025.11.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:442d86cf1cfe4faabf97db7d901ef58347efd004934da045c745e7b5bd57ac49", size = 292669, upload-time = "2025-11-03T21:33:18.32Z" },
{ url = "https://files.pythonhosted.org/packages/f9/ef/0c357bb8edbd2ad8e273fcb9e1761bc37b8acbc6e1be050bebd6475f19c1/regex-2025.11.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:fd0a5e563c756de210bb964789b5abe4f114dacae9104a47e1a649b910361536", size = 291030, upload-time = "2025-11-03T21:33:20.048Z" },
{ url = "https://files.pythonhosted.org/packages/79/06/edbb67257596649b8fb088d6aeacbcb248ac195714b18a65e018bf4c0b50/regex-2025.11.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf3490bcbb985a1ae97b2ce9ad1c0f06a852d5b19dde9b07bdf25bf224248c95", size = 807674, upload-time = "2025-11-03T21:33:21.797Z" },
{ url = "https://files.pythonhosted.org/packages/f4/d9/ad4deccfce0ea336296bd087f1a191543bb99ee1c53093dcd4c64d951d00/regex-2025.11.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3809988f0a8b8c9dcc0f92478d6501fac7200b9ec56aecf0ec21f4a2ec4b6009", size = 873451, upload-time = "2025-11-03T21:33:23.741Z" },
{ url = "https://files.pythonhosted.org/packages/13/75/a55a4724c56ef13e3e04acaab29df26582f6978c000ac9cd6810ad1f341f/regex-2025.11.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f4ff94e58e84aedb9c9fce66d4ef9f27a190285b451420f297c9a09f2b9abee9", size = 914980, upload-time = "2025-11-03T21:33:25.999Z" },
{ url = "https://files.pythonhosted.org/packages/67/1e/a1657ee15bd9116f70d4a530c736983eed997b361e20ecd8f5ca3759d5c5/regex-2025.11.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eb542fd347ce61e1321b0a6b945d5701528dca0cd9759c2e3bb8bd57e47964d", size = 812852, upload-time = "2025-11-03T21:33:27.852Z" },
{ url = "https://files.pythonhosted.org/packages/b8/6f/f7516dde5506a588a561d296b2d0044839de06035bb486b326065b4c101e/regex-2025.11.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d6c2d5919075a1f2e413c00b056ea0c2f065b3f5fe83c3d07d325ab92dce51d6", size = 795566, upload-time = "2025-11-03T21:33:32.364Z" },
{ url = "https://files.pythonhosted.org/packages/d9/dd/3d10b9e170cc16fb34cb2cef91513cf3df65f440b3366030631b2984a264/regex-2025.11.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:3f8bf11a4827cc7ce5a53d4ef6cddd5ad25595d3c1435ef08f76825851343154", size = 868463, upload-time = "2025-11-03T21:33:34.459Z" },
{ url = "https://files.pythonhosted.org/packages/f5/8e/935e6beff1695aa9085ff83195daccd72acc82c81793df480f34569330de/regex-2025.11.3-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:22c12d837298651e5550ac1d964e4ff57c3f56965fc1812c90c9fb2028eaf267", size = 854694, upload-time = "2025-11-03T21:33:36.793Z" },
{ url = "https://files.pythonhosted.org/packages/92/12/10650181a040978b2f5720a6a74d44f841371a3d984c2083fc1752e4acf6/regex-2025.11.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:62ba394a3dda9ad41c7c780f60f6e4a70988741415ae96f6d1bf6c239cf01379", size = 799691, upload-time = "2025-11-03T21:33:39.079Z" },
{ url = "https://files.pythonhosted.org/packages/67/90/8f37138181c9a7690e7e4cb388debbd389342db3c7381d636d2875940752/regex-2025.11.3-cp314-cp314t-win32.whl", hash = "sha256:4bf146dca15cdd53224a1bf46d628bd7590e4a07fbb69e720d561aea43a32b38", size = 274583, upload-time = "2025-11-03T21:33:41.302Z" },
{ url = "https://files.pythonhosted.org/packages/8f/cd/867f5ec442d56beb56f5f854f40abcfc75e11d10b11fdb1869dd39c63aaf/regex-2025.11.3-cp314-cp314t-win_amd64.whl", hash = "sha256:adad1a1bcf1c9e76346e091d22d23ac54ef28e1365117d99521631078dfec9de", size = 284286, upload-time = "2025-11-03T21:33:43.324Z" },
{ url = "https://files.pythonhosted.org/packages/20/31/32c0c4610cbc070362bf1d2e4ea86d1ea29014d400a6d6c2486fcfd57766/regex-2025.11.3-cp314-cp314t-win_arm64.whl", hash = "sha256:c54f768482cef41e219720013cd05933b6f971d9562544d691c68699bf2b6801", size = 274741, upload-time = "2025-11-03T21:33:45.557Z" },
]
[[package]]
name = "rpds-py"
version = "0.30.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/20/af/3f2f423103f1113b36230496629986e0ef7e199d2aa8392452b484b38ced/rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84", size = 69469, upload-time = "2025-11-30T20:24:38.837Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/06/0c/0c411a0ec64ccb6d104dcabe0e713e05e153a9a2c3c2bd2b32ce412166fe/rpds_py-0.30.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:679ae98e00c0e8d68a7fda324e16b90fd5260945b45d3b824c892cec9eea3288", size = 370490, upload-time = "2025-11-30T20:21:33.256Z" },
{ url = "https://files.pythonhosted.org/packages/19/6a/4ba3d0fb7297ebae71171822554abe48d7cab29c28b8f9f2c04b79988c05/rpds_py-0.30.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4cc2206b76b4f576934f0ed374b10d7ca5f457858b157ca52064bdfc26b9fc00", size = 359751, upload-time = "2025-11-30T20:21:34.591Z" },
{ url = "https://files.pythonhosted.org/packages/cd/7c/e4933565ef7f7a0818985d87c15d9d273f1a649afa6a52ea35ad011195ea/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389a2d49eded1896c3d48b0136ead37c48e221b391c052fba3f4055c367f60a6", size = 389696, upload-time = "2025-11-30T20:21:36.122Z" },
{ url = "https://files.pythonhosted.org/packages/5e/01/6271a2511ad0815f00f7ed4390cf2567bec1d4b1da39e2c27a41e6e3b4de/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:32c8528634e1bf7121f3de08fa85b138f4e0dc47657866630611b03967f041d7", size = 403136, upload-time = "2025-11-30T20:21:37.728Z" },
{ url = "https://files.pythonhosted.org/packages/55/64/c857eb7cd7541e9b4eee9d49c196e833128a55b89a9850a9c9ac33ccf897/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f207f69853edd6f6700b86efb84999651baf3789e78a466431df1331608e5324", size = 524699, upload-time = "2025-11-30T20:21:38.92Z" },
{ url = "https://files.pythonhosted.org/packages/9c/ed/94816543404078af9ab26159c44f9e98e20fe47e2126d5d32c9d9948d10a/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67b02ec25ba7a9e8fa74c63b6ca44cf5707f2fbfadae3ee8e7494297d56aa9df", size = 412022, upload-time = "2025-11-30T20:21:40.407Z" },
{ url = "https://files.pythonhosted.org/packages/61/b5/707f6cf0066a6412aacc11d17920ea2e19e5b2f04081c64526eb35b5c6e7/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0e95f6819a19965ff420f65578bacb0b00f251fefe2c8b23347c37174271f3", size = 390522, upload-time = "2025-11-30T20:21:42.17Z" },
{ url = "https://files.pythonhosted.org/packages/13/4e/57a85fda37a229ff4226f8cbcf09f2a455d1ed20e802ce5b2b4a7f5ed053/rpds_py-0.30.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:a452763cc5198f2f98898eb98f7569649fe5da666c2dc6b5ddb10fde5a574221", size = 404579, upload-time = "2025-11-30T20:21:43.769Z" },
{ url = "https://files.pythonhosted.org/packages/f9/da/c9339293513ec680a721e0e16bf2bac3db6e5d7e922488de471308349bba/rpds_py-0.30.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0b65193a413ccc930671c55153a03ee57cecb49e6227204b04fae512eb657a7", size = 421305, upload-time = "2025-11-30T20:21:44.994Z" },
{ url = "https://files.pythonhosted.org/packages/f9/be/522cb84751114f4ad9d822ff5a1aa3c98006341895d5f084779b99596e5c/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:858738e9c32147f78b3ac24dc0edb6610000e56dc0f700fd5f651d0a0f0eb9ff", size = 572503, upload-time = "2025-11-30T20:21:46.91Z" },
{ url = "https://files.pythonhosted.org/packages/a2/9b/de879f7e7ceddc973ea6e4629e9b380213a6938a249e94b0cdbcc325bb66/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:da279aa314f00acbb803da1e76fa18666778e8a8f83484fba94526da5de2cba7", size = 598322, upload-time = "2025-11-30T20:21:48.709Z" },
{ url = "https://files.pythonhosted.org/packages/48/ac/f01fc22efec3f37d8a914fc1b2fb9bcafd56a299edbe96406f3053edea5a/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7c64d38fb49b6cdeda16ab49e35fe0da2e1e9b34bc38bd78386530f218b37139", size = 560792, upload-time = "2025-11-30T20:21:50.024Z" },
{ url = "https://files.pythonhosted.org/packages/e2/da/4e2b19d0f131f35b6146425f846563d0ce036763e38913d917187307a671/rpds_py-0.30.0-cp310-cp310-win32.whl", hash = "sha256:6de2a32a1665b93233cde140ff8b3467bdb9e2af2b91079f0333a0974d12d464", size = 221901, upload-time = "2025-11-30T20:21:51.32Z" },
{ url = "https://files.pythonhosted.org/packages/96/cb/156d7a5cf4f78a7cc571465d8aec7a3c447c94f6749c5123f08438bcf7bc/rpds_py-0.30.0-cp310-cp310-win_amd64.whl", hash = "sha256:1726859cd0de969f88dc8673bdd954185b9104e05806be64bcd87badbe313169", size = 235823, upload-time = "2025-11-30T20:21:52.505Z" },
{ url = "https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a2bffea6a4ca9f01b3f8e548302470306689684e61602aa3d141e34da06cf425", size = 370157, upload-time = "2025-11-30T20:21:53.789Z" },
{ url = "https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d", size = 359676, upload-time = "2025-11-30T20:21:55.475Z" },
{ url = "https://files.pythonhosted.org/packages/84/86/04dbba1b087227747d64d80c3b74df946b986c57af0a9f0c98726d4d7a3b/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:422c3cb9856d80b09d30d2eb255d0754b23e090034e1deb4083f8004bd0761e4", size = 389938, upload-time = "2025-11-30T20:21:57.079Z" },
{ url = "https://files.pythonhosted.org/packages/42/bb/1463f0b1722b7f45431bdd468301991d1328b16cffe0b1c2918eba2c4eee/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07ae8a593e1c3c6b82ca3292efbe73c30b61332fd612e05abee07c79359f292f", size = 402932, upload-time = "2025-11-30T20:21:58.47Z" },
{ url = "https://files.pythonhosted.org/packages/99/ee/2520700a5c1f2d76631f948b0736cdf9b0acb25abd0ca8e889b5c62ac2e3/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12f90dd7557b6bd57f40abe7747e81e0c0b119bef015ea7726e69fe550e394a4", size = 525830, upload-time = "2025-11-30T20:21:59.699Z" },
{ url = "https://files.pythonhosted.org/packages/e0/ad/bd0331f740f5705cc555a5e17fdf334671262160270962e69a2bdef3bf76/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99b47d6ad9a6da00bec6aabe5a6279ecd3c06a329d4aa4771034a21e335c3a97", size = 412033, upload-time = "2025-11-30T20:22:00.991Z" },
{ url = "https://files.pythonhosted.org/packages/f8/1e/372195d326549bb51f0ba0f2ecb9874579906b97e08880e7a65c3bef1a99/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33f559f3104504506a44bb666b93a33f5d33133765b0c216a5bf2f1e1503af89", size = 390828, upload-time = "2025-11-30T20:22:02.723Z" },
{ url = "https://files.pythonhosted.org/packages/ab/2b/d88bb33294e3e0c76bc8f351a3721212713629ffca1700fa94979cb3eae8/rpds_py-0.30.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:946fe926af6e44f3697abbc305ea168c2c31d3e3ef1058cf68f379bf0335a78d", size = 404683, upload-time = "2025-11-30T20:22:04.367Z" },
{ url = "https://files.pythonhosted.org/packages/50/32/c759a8d42bcb5289c1fac697cd92f6fe01a018dd937e62ae77e0e7f15702/rpds_py-0.30.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:495aeca4b93d465efde585977365187149e75383ad2684f81519f504f5c13038", size = 421583, upload-time = "2025-11-30T20:22:05.814Z" },
{ url = "https://files.pythonhosted.org/packages/2b/81/e729761dbd55ddf5d84ec4ff1f47857f4374b0f19bdabfcf929164da3e24/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9a0ca5da0386dee0655b4ccdf46119df60e0f10da268d04fe7cc87886872ba7", size = 572496, upload-time = "2025-11-30T20:22:07.713Z" },
{ url = "https://files.pythonhosted.org/packages/14/f6/69066a924c3557c9c30baa6ec3a0aa07526305684c6f86c696b08860726c/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8d6d1cc13664ec13c1b84241204ff3b12f9bb82464b8ad6e7a5d3486975c2eed", size = 598669, upload-time = "2025-11-30T20:22:09.312Z" },
{ url = "https://files.pythonhosted.org/packages/5f/48/905896b1eb8a05630d20333d1d8ffd162394127b74ce0b0784ae04498d32/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3896fa1be39912cf0757753826bc8bdc8ca331a28a7c4ae46b7a21280b06bb85", size = 561011, upload-time = "2025-11-30T20:22:11.309Z" },
{ url = "https://files.pythonhosted.org/packages/22/16/cd3027c7e279d22e5eb431dd3c0fbc677bed58797fe7581e148f3f68818b/rpds_py-0.30.0-cp311-cp311-win32.whl", hash = "sha256:55f66022632205940f1827effeff17c4fa7ae1953d2b74a8581baaefb7d16f8c", size = 221406, upload-time = "2025-11-30T20:22:13.101Z" },
{ url = "https://files.pythonhosted.org/packages/fa/5b/e7b7aa136f28462b344e652ee010d4de26ee9fd16f1bfd5811f5153ccf89/rpds_py-0.30.0-cp311-cp311-win_amd64.whl", hash = "sha256:a51033ff701fca756439d641c0ad09a41d9242fa69121c7d8769604a0a629825", size = 236024, upload-time = "2025-11-30T20:22:14.853Z" },
{ url = "https://files.pythonhosted.org/packages/14/a6/364bba985e4c13658edb156640608f2c9e1d3ea3c81b27aa9d889fff0e31/rpds_py-0.30.0-cp311-cp311-win_arm64.whl", hash = "sha256:47b0ef6231c58f506ef0b74d44e330405caa8428e770fec25329ed2cb971a229", size = 229069, upload-time = "2025-11-30T20:22:16.577Z" },
{ url = "https://files.pythonhosted.org/packages/03/e7/98a2f4ac921d82f33e03f3835f5bf3a4a40aa1bfdc57975e74a97b2b4bdd/rpds_py-0.30.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a161f20d9a43006833cd7068375a94d035714d73a172b681d8881820600abfad", size = 375086, upload-time = "2025-11-30T20:22:17.93Z" },
{ url = "https://files.pythonhosted.org/packages/4d/a1/bca7fd3d452b272e13335db8d6b0b3ecde0f90ad6f16f3328c6fb150c889/rpds_py-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6abc8880d9d036ecaafe709079969f56e876fcf107f7a8e9920ba6d5a3878d05", size = 359053, upload-time = "2025-11-30T20:22:19.297Z" },
{ url = "https://files.pythonhosted.org/packages/65/1c/ae157e83a6357eceff62ba7e52113e3ec4834a84cfe07fa4b0757a7d105f/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca28829ae5f5d569bb62a79512c842a03a12576375d5ece7d2cadf8abe96ec28", size = 390763, upload-time = "2025-11-30T20:22:21.661Z" },
{ url = "https://files.pythonhosted.org/packages/d4/36/eb2eb8515e2ad24c0bd43c3ee9cd74c33f7ca6430755ccdb240fd3144c44/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1010ed9524c73b94d15919ca4d41d8780980e1765babf85f9a2f90d247153dd", size = 408951, upload-time = "2025-11-30T20:22:23.408Z" },
{ url = "https://files.pythonhosted.org/packages/d6/65/ad8dc1784a331fabbd740ef6f71ce2198c7ed0890dab595adb9ea2d775a1/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8d1736cfb49381ba528cd5baa46f82fdc65c06e843dab24dd70b63d09121b3f", size = 514622, upload-time = "2025-11-30T20:22:25.16Z" },
{ url = "https://files.pythonhosted.org/packages/63/8e/0cfa7ae158e15e143fe03993b5bcd743a59f541f5952e1546b1ac1b5fd45/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d948b135c4693daff7bc2dcfc4ec57237a29bd37e60c2fabf5aff2bbacf3e2f1", size = 414492, upload-time = "2025-11-30T20:22:26.505Z" },
{ url = "https://files.pythonhosted.org/packages/60/1b/6f8f29f3f995c7ffdde46a626ddccd7c63aefc0efae881dc13b6e5d5bb16/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47f236970bccb2233267d89173d3ad2703cd36a0e2a6e92d0560d333871a3d23", size = 394080, upload-time = "2025-11-30T20:22:27.934Z" },
{ url = "https://files.pythonhosted.org/packages/6d/d5/a266341051a7a3ca2f4b750a3aa4abc986378431fc2da508c5034d081b70/rpds_py-0.30.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:2e6ecb5a5bcacf59c3f912155044479af1d0b6681280048b338b28e364aca1f6", size = 408680, upload-time = "2025-11-30T20:22:29.341Z" },
{ url = "https://files.pythonhosted.org/packages/10/3b/71b725851df9ab7a7a4e33cf36d241933da66040d195a84781f49c50490c/rpds_py-0.30.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a8fa71a2e078c527c3e9dc9fc5a98c9db40bcc8a92b4e8858e36d329f8684b51", size = 423589, upload-time = "2025-11-30T20:22:31.469Z" },
{ url = "https://files.pythonhosted.org/packages/00/2b/e59e58c544dc9bd8bd8384ecdb8ea91f6727f0e37a7131baeff8d6f51661/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73c67f2db7bc334e518d097c6d1e6fed021bbc9b7d678d6cc433478365d1d5f5", size = 573289, upload-time = "2025-11-30T20:22:32.997Z" },
{ url = "https://files.pythonhosted.org/packages/da/3e/a18e6f5b460893172a7d6a680e86d3b6bc87a54c1f0b03446a3c8c7b588f/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5ba103fb455be00f3b1c2076c9d4264bfcb037c976167a6047ed82f23153f02e", size = 599737, upload-time = "2025-11-30T20:22:34.419Z" },
{ url = "https://files.pythonhosted.org/packages/5c/e2/714694e4b87b85a18e2c243614974413c60aa107fd815b8cbc42b873d1d7/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee9c752c0364588353e627da8a7e808a66873672bcb5f52890c33fd965b394", size = 563120, upload-time = "2025-11-30T20:22:35.903Z" },
{ url = "https://files.pythonhosted.org/packages/6f/ab/d5d5e3bcedb0a77f4f613706b750e50a5a3ba1c15ccd3665ecc636c968fd/rpds_py-0.30.0-cp312-cp312-win32.whl", hash = "sha256:1ab5b83dbcf55acc8b08fc62b796ef672c457b17dbd7820a11d6c52c06839bdf", size = 223782, upload-time = "2025-11-30T20:22:37.271Z" },
{ url = "https://files.pythonhosted.org/packages/39/3b/f786af9957306fdc38a74cef405b7b93180f481fb48453a114bb6465744a/rpds_py-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:a090322ca841abd453d43456ac34db46e8b05fd9b3b4ac0c78bcde8b089f959b", size = 240463, upload-time = "2025-11-30T20:22:39.021Z" },
{ url = "https://files.pythonhosted.org/packages/f3/d2/b91dc748126c1559042cfe41990deb92c4ee3e2b415f6b5234969ffaf0cc/rpds_py-0.30.0-cp312-cp312-win_arm64.whl", hash = "sha256:669b1805bd639dd2989b281be2cfd951c6121b65e729d9b843e9639ef1fd555e", size = 230868, upload-time = "2025-11-30T20:22:40.493Z" },
{ url = "https://files.pythonhosted.org/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2", size = 374887, upload-time = "2025-11-30T20:22:41.812Z" },
{ url = "https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8", size = 358904, upload-time = "2025-11-30T20:22:43.479Z" },
{ url = "https://files.pythonhosted.org/packages/58/70/faed8186300e3b9bdd138d0273109784eea2396c68458ed580f885dfe7ad/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4", size = 389945, upload-time = "2025-11-30T20:22:44.819Z" },
{ url = "https://files.pythonhosted.org/packages/bd/a8/073cac3ed2c6387df38f71296d002ab43496a96b92c823e76f46b8af0543/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0a59119fc6e3f460315fe9d08149f8102aa322299deaa5cab5b40092345c2136", size = 407783, upload-time = "2025-11-30T20:22:46.103Z" },
{ url = "https://files.pythonhosted.org/packages/77/57/5999eb8c58671f1c11eba084115e77a8899d6e694d2a18f69f0ba471ec8b/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76fec018282b4ead0364022e3c54b60bf368b9d926877957a8624b58419169b7", size = 515021, upload-time = "2025-11-30T20:22:47.458Z" },
{ url = "https://files.pythonhosted.org/packages/e0/af/5ab4833eadc36c0a8ed2bc5c0de0493c04f6c06de223170bd0798ff98ced/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:692bef75a5525db97318e8cd061542b5a79812d711ea03dbc1f6f8dbb0c5f0d2", size = 414589, upload-time = "2025-11-30T20:22:48.872Z" },
{ url = "https://files.pythonhosted.org/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6", size = 394025, upload-time = "2025-11-30T20:22:50.196Z" },
{ url = "https://files.pythonhosted.org/packages/91/c4/fc70cd0249496493500e7cc2de87504f5aa6509de1e88623431fec76d4b6/rpds_py-0.30.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:9cf69cdda1f5968a30a359aba2f7f9aa648a9ce4b580d6826437f2b291cfc86e", size = 408895, upload-time = "2025-11-30T20:22:51.87Z" },
{ url = "https://files.pythonhosted.org/packages/58/95/d9275b05ab96556fefff73a385813eb66032e4c99f411d0795372d9abcea/rpds_py-0.30.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4796a717bf12b9da9d3ad002519a86063dcac8988b030e405704ef7d74d2d9d", size = 422799, upload-time = "2025-11-30T20:22:53.341Z" },
{ url = "https://files.pythonhosted.org/packages/06/c1/3088fc04b6624eb12a57eb814f0d4997a44b0d208d6cace713033ff1a6ba/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d4c2aa7c50ad4728a094ebd5eb46c452e9cb7edbfdb18f9e1221f597a73e1e7", size = 572731, upload-time = "2025-11-30T20:22:54.778Z" },
{ url = "https://files.pythonhosted.org/packages/d8/42/c612a833183b39774e8ac8fecae81263a68b9583ee343db33ab571a7ce55/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba81a9203d07805435eb06f536d95a266c21e5b2dfbf6517748ca40c98d19e31", size = 599027, upload-time = "2025-11-30T20:22:56.212Z" },
{ url = "https://files.pythonhosted.org/packages/5f/60/525a50f45b01d70005403ae0e25f43c0384369ad24ffe46e8d9068b50086/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:945dccface01af02675628334f7cf49c2af4c1c904748efc5cf7bbdf0b579f95", size = 563020, upload-time = "2025-11-30T20:22:58.2Z" },
{ url = "https://files.pythonhosted.org/packages/0b/5d/47c4655e9bcd5ca907148535c10e7d489044243cc9941c16ed7cd53be91d/rpds_py-0.30.0-cp313-cp313-win32.whl", hash = "sha256:b40fb160a2db369a194cb27943582b38f79fc4887291417685f3ad693c5a1d5d", size = 223139, upload-time = "2025-11-30T20:23:00.209Z" },
{ url = "https://files.pythonhosted.org/packages/f2/e1/485132437d20aa4d3e1d8b3fb5a5e65aa8139f1e097080c2a8443201742c/rpds_py-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:806f36b1b605e2d6a72716f321f20036b9489d29c51c91f4dd29a3e3afb73b15", size = 240224, upload-time = "2025-11-30T20:23:02.008Z" },
{ url = "https://files.pythonhosted.org/packages/24/95/ffd128ed1146a153d928617b0ef673960130be0009c77d8fbf0abe306713/rpds_py-0.30.0-cp313-cp313-win_arm64.whl", hash = "sha256:d96c2086587c7c30d44f31f42eae4eac89b60dabbac18c7669be3700f13c3ce1", size = 230645, upload-time = "2025-11-30T20:23:03.43Z" },
{ url = "https://files.pythonhosted.org/packages/ff/1b/b10de890a0def2a319a2626334a7f0ae388215eb60914dbac8a3bae54435/rpds_py-0.30.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:eb0b93f2e5c2189ee831ee43f156ed34e2a89a78a66b98cadad955972548be5a", size = 364443, upload-time = "2025-11-30T20:23:04.878Z" },
{ url = "https://files.pythonhosted.org/packages/0d/bf/27e39f5971dc4f305a4fb9c672ca06f290f7c4e261c568f3dea16a410d47/rpds_py-0.30.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:922e10f31f303c7c920da8981051ff6d8c1a56207dbdf330d9047f6d30b70e5e", size = 353375, upload-time = "2025-11-30T20:23:06.342Z" },
{ url = "https://files.pythonhosted.org/packages/40/58/442ada3bba6e8e6615fc00483135c14a7538d2ffac30e2d933ccf6852232/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdc62c8286ba9bf7f47befdcea13ea0e26bf294bda99758fd90535cbaf408000", size = 383850, upload-time = "2025-11-30T20:23:07.825Z" },
{ url = "https://files.pythonhosted.org/packages/14/14/f59b0127409a33c6ef6f5c1ebd5ad8e32d7861c9c7adfa9a624fc3889f6c/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47f9a91efc418b54fb8190a6b4aa7813a23fb79c51f4bb84e418f5476c38b8db", size = 392812, upload-time = "2025-11-30T20:23:09.228Z" },
{ url = "https://files.pythonhosted.org/packages/b3/66/e0be3e162ac299b3a22527e8913767d869e6cc75c46bd844aa43fb81ab62/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3587eb9b17f3789ad50824084fa6f81921bbf9a795826570bda82cb3ed91f2", size = 517841, upload-time = "2025-11-30T20:23:11.186Z" },
{ url = "https://files.pythonhosted.org/packages/3d/55/fa3b9cf31d0c963ecf1ba777f7cf4b2a2c976795ac430d24a1f43d25a6ba/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39c02563fc592411c2c61d26b6c5fe1e51eaa44a75aa2c8735ca88b0d9599daa", size = 408149, upload-time = "2025-11-30T20:23:12.864Z" },
{ url = "https://files.pythonhosted.org/packages/60/ca/780cf3b1a32b18c0f05c441958d3758f02544f1d613abf9488cd78876378/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a1234d8febafdfd33a42d97da7a43f5dcb120c1060e352a3fbc0c6d36e2083", size = 383843, upload-time = "2025-11-30T20:23:14.638Z" },
{ url = "https://files.pythonhosted.org/packages/82/86/d5f2e04f2aa6247c613da0c1dd87fcd08fa17107e858193566048a1e2f0a/rpds_py-0.30.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:eb2c4071ab598733724c08221091e8d80e89064cd472819285a9ab0f24bcedb9", size = 396507, upload-time = "2025-11-30T20:23:16.105Z" },
{ url = "https://files.pythonhosted.org/packages/4b/9a/453255d2f769fe44e07ea9785c8347edaf867f7026872e76c1ad9f7bed92/rpds_py-0.30.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bdfdb946967d816e6adf9a3d8201bfad269c67efe6cefd7093ef959683c8de0", size = 414949, upload-time = "2025-11-30T20:23:17.539Z" },
{ url = "https://files.pythonhosted.org/packages/a3/31/622a86cdc0c45d6df0e9ccb6becdba5074735e7033c20e401a6d9d0e2ca0/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c77afbd5f5250bf27bf516c7c4a016813eb2d3e116139aed0096940c5982da94", size = 565790, upload-time = "2025-11-30T20:23:19.029Z" },
{ url = "https://files.pythonhosted.org/packages/1c/5d/15bbf0fb4a3f58a3b1c67855ec1efcc4ceaef4e86644665fff03e1b66d8d/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:61046904275472a76c8c90c9ccee9013d70a6d0f73eecefd38c1ae7c39045a08", size = 590217, upload-time = "2025-11-30T20:23:20.885Z" },
{ url = "https://files.pythonhosted.org/packages/6d/61/21b8c41f68e60c8cc3b2e25644f0e3681926020f11d06ab0b78e3c6bbff1/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c5f36a861bc4b7da6516dbdf302c55313afa09b81931e8280361a4f6c9a2d27", size = 555806, upload-time = "2025-11-30T20:23:22.488Z" },
{ url = "https://files.pythonhosted.org/packages/f9/39/7e067bb06c31de48de3eb200f9fc7c58982a4d3db44b07e73963e10d3be9/rpds_py-0.30.0-cp313-cp313t-win32.whl", hash = "sha256:3d4a69de7a3e50ffc214ae16d79d8fbb0922972da0356dcf4d0fdca2878559c6", size = 211341, upload-time = "2025-11-30T20:23:24.449Z" },
{ url = "https://files.pythonhosted.org/packages/0a/4d/222ef0b46443cf4cf46764d9c630f3fe4abaa7245be9417e56e9f52b8f65/rpds_py-0.30.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f14fc5df50a716f7ece6a80b6c78bb35ea2ca47c499e422aa4463455dd96d56d", size = 225768, upload-time = "2025-11-30T20:23:25.908Z" },
{ url = "https://files.pythonhosted.org/packages/86/81/dad16382ebbd3d0e0328776d8fd7ca94220e4fa0798d1dc5e7da48cb3201/rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0", size = 362099, upload-time = "2025-11-30T20:23:27.316Z" },
{ url = "https://files.pythonhosted.org/packages/2b/60/19f7884db5d5603edf3c6bce35408f45ad3e97e10007df0e17dd57af18f8/rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be", size = 353192, upload-time = "2025-11-30T20:23:29.151Z" },
{ url = "https://files.pythonhosted.org/packages/bf/c4/76eb0e1e72d1a9c4703c69607cec123c29028bff28ce41588792417098ac/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f251c812357a3fed308d684a5079ddfb9d933860fc6de89f2b7ab00da481e65f", size = 384080, upload-time = "2025-11-30T20:23:30.785Z" },
{ url = "https://files.pythonhosted.org/packages/72/87/87ea665e92f3298d1b26d78814721dc39ed8d2c74b86e83348d6b48a6f31/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac98b175585ecf4c0348fd7b29c3864bda53b805c773cbf7bfdaffc8070c976f", size = 394841, upload-time = "2025-11-30T20:23:32.209Z" },
{ url = "https://files.pythonhosted.org/packages/77/ad/7783a89ca0587c15dcbf139b4a8364a872a25f861bdb88ed99f9b0dec985/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e62880792319dbeb7eb866547f2e35973289e7d5696c6e295476448f5b63c87", size = 516670, upload-time = "2025-11-30T20:23:33.742Z" },
{ url = "https://files.pythonhosted.org/packages/5b/3c/2882bdac942bd2172f3da574eab16f309ae10a3925644e969536553cb4ee/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e7fc54e0900ab35d041b0601431b0a0eb495f0851a0639b6ef90f7741b39a18", size = 408005, upload-time = "2025-11-30T20:23:35.253Z" },
{ url = "https://files.pythonhosted.org/packages/ce/81/9a91c0111ce1758c92516a3e44776920b579d9a7c09b2b06b642d4de3f0f/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad", size = 382112, upload-time = "2025-11-30T20:23:36.842Z" },
{ url = "https://files.pythonhosted.org/packages/cf/8e/1da49d4a107027e5fbc64daeab96a0706361a2918da10cb41769244b805d/rpds_py-0.30.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b4dc1a6ff022ff85ecafef7979a2c6eb423430e05f1165d6688234e62ba99a07", size = 399049, upload-time = "2025-11-30T20:23:38.343Z" },
{ url = "https://files.pythonhosted.org/packages/df/5a/7ee239b1aa48a127570ec03becbb29c9d5a9eb092febbd1699d567cae859/rpds_py-0.30.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4559c972db3a360808309e06a74628b95eaccbf961c335c8fe0d590cf587456f", size = 415661, upload-time = "2025-11-30T20:23:40.263Z" },
{ url = "https://files.pythonhosted.org/packages/70/ea/caa143cf6b772f823bc7929a45da1fa83569ee49b11d18d0ada7f5ee6fd6/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0ed177ed9bded28f8deb6ab40c183cd1192aa0de40c12f38be4d59cd33cb5c65", size = 565606, upload-time = "2025-11-30T20:23:42.186Z" },
{ url = "https://files.pythonhosted.org/packages/64/91/ac20ba2d69303f961ad8cf55bf7dbdb4763f627291ba3d0d7d67333cced9/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ad1fa8db769b76ea911cb4e10f049d80bf518c104f15b3edb2371cc65375c46f", size = 591126, upload-time = "2025-11-30T20:23:44.086Z" },
{ url = "https://files.pythonhosted.org/packages/21/20/7ff5f3c8b00c8a95f75985128c26ba44503fb35b8e0259d812766ea966c7/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:46e83c697b1f1c72b50e5ee5adb4353eef7406fb3f2043d64c33f20ad1c2fc53", size = 553371, upload-time = "2025-11-30T20:23:46.004Z" },
{ url = "https://files.pythonhosted.org/packages/72/c7/81dadd7b27c8ee391c132a6b192111ca58d866577ce2d9b0ca157552cce0/rpds_py-0.30.0-cp314-cp314-win32.whl", hash = "sha256:ee454b2a007d57363c2dfd5b6ca4a5d7e2c518938f8ed3b706e37e5d470801ed", size = 215298, upload-time = "2025-11-30T20:23:47.696Z" },
{ url = "https://files.pythonhosted.org/packages/3e/d2/1aaac33287e8cfb07aab2e6b8ac1deca62f6f65411344f1433c55e6f3eb8/rpds_py-0.30.0-cp314-cp314-win_amd64.whl", hash = "sha256:95f0802447ac2d10bcc69f6dc28fe95fdf17940367b21d34e34c737870758950", size = 228604, upload-time = "2025-11-30T20:23:49.501Z" },
{ url = "https://files.pythonhosted.org/packages/e8/95/ab005315818cc519ad074cb7784dae60d939163108bd2b394e60dc7b5461/rpds_py-0.30.0-cp314-cp314-win_arm64.whl", hash = "sha256:613aa4771c99f03346e54c3f038e4cc574ac09a3ddfb0e8878487335e96dead6", size = 222391, upload-time = "2025-11-30T20:23:50.96Z" },
{ url = "https://files.pythonhosted.org/packages/9e/68/154fe0194d83b973cdedcdcc88947a2752411165930182ae41d983dcefa6/rpds_py-0.30.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:7e6ecfcb62edfd632e56983964e6884851786443739dbfe3582947e87274f7cb", size = 364868, upload-time = "2025-11-30T20:23:52.494Z" },
{ url = "https://files.pythonhosted.org/packages/83/69/8bbc8b07ec854d92a8b75668c24d2abcb1719ebf890f5604c61c9369a16f/rpds_py-0.30.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a1d0bc22a7cdc173fedebb73ef81e07faef93692b8c1ad3733b67e31e1b6e1b8", size = 353747, upload-time = "2025-11-30T20:23:54.036Z" },
{ url = "https://files.pythonhosted.org/packages/ab/00/ba2e50183dbd9abcce9497fa5149c62b4ff3e22d338a30d690f9af970561/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d08f00679177226c4cb8c5265012eea897c8ca3b93f429e546600c971bcbae7", size = 383795, upload-time = "2025-11-30T20:23:55.556Z" },
{ url = "https://files.pythonhosted.org/packages/05/6f/86f0272b84926bcb0e4c972262f54223e8ecc556b3224d281e6598fc9268/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5965af57d5848192c13534f90f9dd16464f3c37aaf166cc1da1cae1fd5a34898", size = 393330, upload-time = "2025-11-30T20:23:57.033Z" },
{ url = "https://files.pythonhosted.org/packages/cb/e9/0e02bb2e6dc63d212641da45df2b0bf29699d01715913e0d0f017ee29438/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a4e86e34e9ab6b667c27f3211ca48f73dba7cd3d90f8d5b11be56e5dbc3fb4e", size = 518194, upload-time = "2025-11-30T20:23:58.637Z" },
{ url = "https://files.pythonhosted.org/packages/ee/ca/be7bca14cf21513bdf9c0606aba17d1f389ea2b6987035eb4f62bd923f25/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d3e6b26f2c785d65cc25ef1e5267ccbe1b069c5c21b8cc724efee290554419", size = 408340, upload-time = "2025-11-30T20:24:00.2Z" },
{ url = "https://files.pythonhosted.org/packages/c2/c7/736e00ebf39ed81d75544c0da6ef7b0998f8201b369acf842f9a90dc8fce/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:626a7433c34566535b6e56a1b39a7b17ba961e97ce3b80ec62e6f1312c025551", size = 383765, upload-time = "2025-11-30T20:24:01.759Z" },
{ url = "https://files.pythonhosted.org/packages/4a/3f/da50dfde9956aaf365c4adc9533b100008ed31aea635f2b8d7b627e25b49/rpds_py-0.30.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:acd7eb3f4471577b9b5a41baf02a978e8bdeb08b4b355273994f8b87032000a8", size = 396834, upload-time = "2025-11-30T20:24:03.687Z" },
{ url = "https://files.pythonhosted.org/packages/4e/00/34bcc2565b6020eab2623349efbdec810676ad571995911f1abdae62a3a0/rpds_py-0.30.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe5fa731a1fa8a0a56b0977413f8cacac1768dad38d16b3a296712709476fbd5", size = 415470, upload-time = "2025-11-30T20:24:05.232Z" },
{ url = "https://files.pythonhosted.org/packages/8c/28/882e72b5b3e6f718d5453bd4d0d9cf8df36fddeb4ddbbab17869d5868616/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:74a3243a411126362712ee1524dfc90c650a503502f135d54d1b352bd01f2404", size = 565630, upload-time = "2025-11-30T20:24:06.878Z" },
{ url = "https://files.pythonhosted.org/packages/3b/97/04a65539c17692de5b85c6e293520fd01317fd878ea1995f0367d4532fb1/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3e8eeb0544f2eb0d2581774be4c3410356eba189529a6b3e36bbbf9696175856", size = 591148, upload-time = "2025-11-30T20:24:08.445Z" },
{ url = "https://files.pythonhosted.org/packages/85/70/92482ccffb96f5441aab93e26c4d66489eb599efdcf96fad90c14bbfb976/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dbd936cde57abfee19ab3213cf9c26be06d60750e60a8e4dd85d1ab12c8b1f40", size = 556030, upload-time = "2025-11-30T20:24:10.956Z" },
{ url = "https://files.pythonhosted.org/packages/20/53/7c7e784abfa500a2b6b583b147ee4bb5a2b3747a9166bab52fec4b5b5e7d/rpds_py-0.30.0-cp314-cp314t-win32.whl", hash = "sha256:dc824125c72246d924f7f796b4f63c1e9dc810c7d9e2355864b3c3a73d59ade0", size = 211570, upload-time = "2025-11-30T20:24:12.735Z" },
{ url = "https://files.pythonhosted.org/packages/d0/02/fa464cdfbe6b26e0600b62c528b72d8608f5cc49f96b8d6e38c95d60c676/rpds_py-0.30.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27f4b0e92de5bfbc6f86e43959e6edd1425c33b5e69aab0984a72047f2bcf1e3", size = 226532, upload-time = "2025-11-30T20:24:14.634Z" },
{ url = "https://files.pythonhosted.org/packages/69/71/3f34339ee70521864411f8b6992e7ab13ac30d8e4e3309e07c7361767d91/rpds_py-0.30.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c2262bdba0ad4fc6fb5545660673925c2d2a5d9e2e0fb603aad545427be0fc58", size = 372292, upload-time = "2025-11-30T20:24:16.537Z" },
{ url = "https://files.pythonhosted.org/packages/57/09/f183df9b8f2d66720d2ef71075c59f7e1b336bec7ee4c48f0a2b06857653/rpds_py-0.30.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ee6af14263f25eedc3bb918a3c04245106a42dfd4f5c2285ea6f997b1fc3f89a", size = 362128, upload-time = "2025-11-30T20:24:18.086Z" },
{ url = "https://files.pythonhosted.org/packages/7a/68/5c2594e937253457342e078f0cc1ded3dd7b2ad59afdbf2d354869110a02/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3adbb8179ce342d235c31ab8ec511e66c73faa27a47e076ccc92421add53e2bb", size = 391542, upload-time = "2025-11-30T20:24:20.092Z" },
{ url = "https://files.pythonhosted.org/packages/49/5c/31ef1afd70b4b4fbdb2800249f34c57c64beb687495b10aec0365f53dfc4/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:250fa00e9543ac9b97ac258bd37367ff5256666122c2d0f2bc97577c60a1818c", size = 404004, upload-time = "2025-11-30T20:24:22.231Z" },
{ url = "https://files.pythonhosted.org/packages/e3/63/0cfbea38d05756f3440ce6534d51a491d26176ac045e2707adc99bb6e60a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9854cf4f488b3d57b9aaeb105f06d78e5529d3145b1e4a41750167e8c213c6d3", size = 527063, upload-time = "2025-11-30T20:24:24.302Z" },
{ url = "https://files.pythonhosted.org/packages/42/e6/01e1f72a2456678b0f618fc9a1a13f882061690893c192fcad9f2926553a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:993914b8e560023bc0a8bf742c5f303551992dcb85e247b1e5c7f4a7d145bda5", size = 413099, upload-time = "2025-11-30T20:24:25.916Z" },
{ url = "https://files.pythonhosted.org/packages/b8/25/8df56677f209003dcbb180765520c544525e3ef21ea72279c98b9aa7c7fb/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58edca431fb9b29950807e301826586e5bbf24163677732429770a697ffe6738", size = 392177, upload-time = "2025-11-30T20:24:27.834Z" },
{ url = "https://files.pythonhosted.org/packages/4a/b4/0a771378c5f16f8115f796d1f437950158679bcd2a7c68cf251cfb00ed5b/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:dea5b552272a944763b34394d04577cf0f9bd013207bc32323b5a89a53cf9c2f", size = 406015, upload-time = "2025-11-30T20:24:29.457Z" },
{ url = "https://files.pythonhosted.org/packages/36/d8/456dbba0af75049dc6f63ff295a2f92766b9d521fa00de67a2bd6427d57a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ba3af48635eb83d03f6c9735dfb21785303e73d22ad03d489e88adae6eab8877", size = 423736, upload-time = "2025-11-30T20:24:31.22Z" },
{ url = "https://files.pythonhosted.org/packages/13/64/b4d76f227d5c45a7e0b796c674fd81b0a6c4fbd48dc29271857d8219571c/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:dff13836529b921e22f15cb099751209a60009731a68519630a24d61f0b1b30a", size = 573981, upload-time = "2025-11-30T20:24:32.934Z" },
{ url = "https://files.pythonhosted.org/packages/20/91/092bacadeda3edf92bf743cc96a7be133e13a39cdbfd7b5082e7ab638406/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:1b151685b23929ab7beec71080a8889d4d6d9fa9a983d213f07121205d48e2c4", size = 599782, upload-time = "2025-11-30T20:24:35.169Z" },
{ url = "https://files.pythonhosted.org/packages/d1/b7/b95708304cd49b7b6f82fdd039f1748b66ec2b21d6a45180910802f1abf1/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ac37f9f516c51e5753f27dfdef11a88330f04de2d564be3991384b2f3535d02e", size = 562191, upload-time = "2025-11-30T20:24:36.853Z" },
]
[[package]]
name = "sqlparse"
version = "0.5.5"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/90/76/437d71068094df0726366574cf3432a4ed754217b436eb7429415cf2d480/sqlparse-0.5.5.tar.gz", hash = "sha256:e20d4a9b0b8585fdf63b10d30066c7c94c5d7a7ec47c889a2d83a3caa93ff28e", size = 120815, upload-time = "2025-12-19T07:17:45.073Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/49/4b/359f28a903c13438ef59ebeee215fb25da53066db67b305c125f1c6d2a25/sqlparse-0.5.5-py3-none-any.whl", hash = "sha256:12a08b3bf3eec877c519589833aed092e2444e68240a3577e8e26148acc7b1ba", size = 46138, upload-time = "2025-12-19T07:17:46.573Z" },
]
[[package]]
name = "tomli"
version = "2.3.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/52/ed/3f73f72945444548f33eba9a87fc7a6e969915e7b1acc8260b30e1f76a2f/tomli-2.3.0.tar.gz", hash = "sha256:64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549", size = 17392, upload-time = "2025-10-08T22:01:47.119Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/b3/2e/299f62b401438d5fe1624119c723f5d877acc86a4c2492da405626665f12/tomli-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88bd15eb972f3664f5ed4b57c1634a97153b4bac4479dcb6a495f41921eb7f45", size = 153236, upload-time = "2025-10-08T22:01:00.137Z" },
{ url = "https://files.pythonhosted.org/packages/86/7f/d8fffe6a7aefdb61bced88fcb5e280cfd71e08939da5894161bd71bea022/tomli-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:883b1c0d6398a6a9d29b508c331fa56adbcdff647f6ace4dfca0f50e90dfd0ba", size = 148084, upload-time = "2025-10-08T22:01:01.63Z" },
{ url = "https://files.pythonhosted.org/packages/47/5c/24935fb6a2ee63e86d80e4d3b58b222dafaf438c416752c8b58537c8b89a/tomli-2.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1381caf13ab9f300e30dd8feadb3de072aeb86f1d34a8569453ff32a7dea4bf", size = 234832, upload-time = "2025-10-08T22:01:02.543Z" },
{ url = "https://files.pythonhosted.org/packages/89/da/75dfd804fc11e6612846758a23f13271b76d577e299592b4371a4ca4cd09/tomli-2.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0e285d2649b78c0d9027570d4da3425bdb49830a6156121360b3f8511ea3441", size = 242052, upload-time = "2025-10-08T22:01:03.836Z" },
{ url = "https://files.pythonhosted.org/packages/70/8c/f48ac899f7b3ca7eb13af73bacbc93aec37f9c954df3c08ad96991c8c373/tomli-2.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a154a9ae14bfcf5d8917a59b51ffd5a3ac1fd149b71b47a3a104ca4edcfa845", size = 239555, upload-time = "2025-10-08T22:01:04.834Z" },
{ url = "https://files.pythonhosted.org/packages/ba/28/72f8afd73f1d0e7829bfc093f4cb98ce0a40ffc0cc997009ee1ed94ba705/tomli-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:74bf8464ff93e413514fefd2be591c3b0b23231a77f901db1eb30d6f712fc42c", size = 245128, upload-time = "2025-10-08T22:01:05.84Z" },
{ url = "https://files.pythonhosted.org/packages/b6/eb/a7679c8ac85208706d27436e8d421dfa39d4c914dcf5fa8083a9305f58d9/tomli-2.3.0-cp311-cp311-win32.whl", hash = "sha256:00b5f5d95bbfc7d12f91ad8c593a1659b6387b43f054104cda404be6bda62456", size = 96445, upload-time = "2025-10-08T22:01:06.896Z" },
{ url = "https://files.pythonhosted.org/packages/0a/fe/3d3420c4cb1ad9cb462fb52967080575f15898da97e21cb6f1361d505383/tomli-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:4dc4ce8483a5d429ab602f111a93a6ab1ed425eae3122032db7e9acf449451be", size = 107165, upload-time = "2025-10-08T22:01:08.107Z" },
{ url = "https://files.pythonhosted.org/packages/ff/b7/40f36368fcabc518bb11c8f06379a0fd631985046c038aca08c6d6a43c6e/tomli-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d7d86942e56ded512a594786a5ba0a5e521d02529b3826e7761a05138341a2ac", size = 154891, upload-time = "2025-10-08T22:01:09.082Z" },
{ url = "https://files.pythonhosted.org/packages/f9/3f/d9dd692199e3b3aab2e4e4dd948abd0f790d9ded8cd10cbaae276a898434/tomli-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:73ee0b47d4dad1c5e996e3cd33b8a76a50167ae5f96a2607cbe8cc773506ab22", size = 148796, upload-time = "2025-10-08T22:01:10.266Z" },
{ url = "https://files.pythonhosted.org/packages/60/83/59bff4996c2cf9f9387a0f5a3394629c7efa5ef16142076a23a90f1955fa/tomli-2.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:792262b94d5d0a466afb5bc63c7daa9d75520110971ee269152083270998316f", size = 242121, upload-time = "2025-10-08T22:01:11.332Z" },
{ url = "https://files.pythonhosted.org/packages/45/e5/7c5119ff39de8693d6baab6c0b6dcb556d192c165596e9fc231ea1052041/tomli-2.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f195fe57ecceac95a66a75ac24d9d5fbc98ef0962e09b2eddec5d39375aae52", size = 250070, upload-time = "2025-10-08T22:01:12.498Z" },
{ url = "https://files.pythonhosted.org/packages/45/12/ad5126d3a278f27e6701abde51d342aa78d06e27ce2bb596a01f7709a5a2/tomli-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e31d432427dcbf4d86958c184b9bfd1e96b5b71f8eb17e6d02531f434fd335b8", size = 245859, upload-time = "2025-10-08T22:01:13.551Z" },
{ url = "https://files.pythonhosted.org/packages/fb/a1/4d6865da6a71c603cfe6ad0e6556c73c76548557a8d658f9e3b142df245f/tomli-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b0882799624980785240ab732537fcfc372601015c00f7fc367c55308c186f6", size = 250296, upload-time = "2025-10-08T22:01:14.614Z" },
{ url = "https://files.pythonhosted.org/packages/a0/b7/a7a7042715d55c9ba6e8b196d65d2cb662578b4d8cd17d882d45322b0d78/tomli-2.3.0-cp312-cp312-win32.whl", hash = "sha256:ff72b71b5d10d22ecb084d345fc26f42b5143c5533db5e2eaba7d2d335358876", size = 97124, upload-time = "2025-10-08T22:01:15.629Z" },
{ url = "https://files.pythonhosted.org/packages/06/1e/f22f100db15a68b520664eb3328fb0ae4e90530887928558112c8d1f4515/tomli-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:1cb4ed918939151a03f33d4242ccd0aa5f11b3547d0cf30f7c74a408a5b99878", size = 107698, upload-time = "2025-10-08T22:01:16.51Z" },
{ url = "https://files.pythonhosted.org/packages/89/48/06ee6eabe4fdd9ecd48bf488f4ac783844fd777f547b8d1b61c11939974e/tomli-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5192f562738228945d7b13d4930baffda67b69425a7f0da96d360b0a3888136b", size = 154819, upload-time = "2025-10-08T22:01:17.964Z" },
{ url = "https://files.pythonhosted.org/packages/f1/01/88793757d54d8937015c75dcdfb673c65471945f6be98e6a0410fba167ed/tomli-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:be71c93a63d738597996be9528f4abe628d1adf5e6eb11607bc8fe1a510b5dae", size = 148766, upload-time = "2025-10-08T22:01:18.959Z" },
{ url = "https://files.pythonhosted.org/packages/42/17/5e2c956f0144b812e7e107f94f1cc54af734eb17b5191c0bbfb72de5e93e/tomli-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4665508bcbac83a31ff8ab08f424b665200c0e1e645d2bd9ab3d3e557b6185b", size = 240771, upload-time = "2025-10-08T22:01:20.106Z" },
{ url = "https://files.pythonhosted.org/packages/d5/f4/0fbd014909748706c01d16824eadb0307115f9562a15cbb012cd9b3512c5/tomli-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4021923f97266babc6ccab9f5068642a0095faa0a51a246a6a02fccbb3514eaf", size = 248586, upload-time = "2025-10-08T22:01:21.164Z" },
{ url = "https://files.pythonhosted.org/packages/30/77/fed85e114bde5e81ecf9bc5da0cc69f2914b38f4708c80ae67d0c10180c5/tomli-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4ea38c40145a357d513bffad0ed869f13c1773716cf71ccaa83b0fa0cc4e42f", size = 244792, upload-time = "2025-10-08T22:01:22.417Z" },
{ url = "https://files.pythonhosted.org/packages/55/92/afed3d497f7c186dc71e6ee6d4fcb0acfa5f7d0a1a2878f8beae379ae0cc/tomli-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad805ea85eda330dbad64c7ea7a4556259665bdf9d2672f5dccc740eb9d3ca05", size = 248909, upload-time = "2025-10-08T22:01:23.859Z" },
{ url = "https://files.pythonhosted.org/packages/f8/84/ef50c51b5a9472e7265ce1ffc7f24cd4023d289e109f669bdb1553f6a7c2/tomli-2.3.0-cp313-cp313-win32.whl", hash = "sha256:97d5eec30149fd3294270e889b4234023f2c69747e555a27bd708828353ab606", size = 96946, upload-time = "2025-10-08T22:01:24.893Z" },
{ url = "https://files.pythonhosted.org/packages/b2/b7/718cd1da0884f281f95ccfa3a6cc572d30053cba64603f79d431d3c9b61b/tomli-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0c95ca56fbe89e065c6ead5b593ee64b84a26fca063b5d71a1122bf26e533999", size = 107705, upload-time = "2025-10-08T22:01:26.153Z" },
{ url = "https://files.pythonhosted.org/packages/19/94/aeafa14a52e16163008060506fcb6aa1949d13548d13752171a755c65611/tomli-2.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cebc6fe843e0733ee827a282aca4999b596241195f43b4cc371d64fc6639da9e", size = 154244, upload-time = "2025-10-08T22:01:27.06Z" },
{ url = "https://files.pythonhosted.org/packages/db/e4/1e58409aa78eefa47ccd19779fc6f36787edbe7d4cd330eeeedb33a4515b/tomli-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4c2ef0244c75aba9355561272009d934953817c49f47d768070c3c94355c2aa3", size = 148637, upload-time = "2025-10-08T22:01:28.059Z" },
{ url = "https://files.pythonhosted.org/packages/26/b6/d1eccb62f665e44359226811064596dd6a366ea1f985839c566cd61525ae/tomli-2.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c22a8bf253bacc0cf11f35ad9808b6cb75ada2631c2d97c971122583b129afbc", size = 241925, upload-time = "2025-10-08T22:01:29.066Z" },
{ url = "https://files.pythonhosted.org/packages/70/91/7cdab9a03e6d3d2bb11beae108da5bdc1c34bdeb06e21163482544ddcc90/tomli-2.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0eea8cc5c5e9f89c9b90c4896a8deefc74f518db5927d0e0e8d4a80953d774d0", size = 249045, upload-time = "2025-10-08T22:01:31.98Z" },
{ url = "https://files.pythonhosted.org/packages/15/1b/8c26874ed1f6e4f1fcfeb868db8a794cbe9f227299402db58cfcc858766c/tomli-2.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b74a0e59ec5d15127acdabd75ea17726ac4c5178ae51b85bfe39c4f8a278e879", size = 245835, upload-time = "2025-10-08T22:01:32.989Z" },
{ url = "https://files.pythonhosted.org/packages/fd/42/8e3c6a9a4b1a1360c1a2a39f0b972cef2cc9ebd56025168c4137192a9321/tomli-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5870b50c9db823c595983571d1296a6ff3e1b88f734a4c8f6fc6188397de005", size = 253109, upload-time = "2025-10-08T22:01:34.052Z" },
{ url = "https://files.pythonhosted.org/packages/22/0c/b4da635000a71b5f80130937eeac12e686eefb376b8dee113b4a582bba42/tomli-2.3.0-cp314-cp314-win32.whl", hash = "sha256:feb0dacc61170ed7ab602d3d972a58f14ee3ee60494292d384649a3dc38ef463", size = 97930, upload-time = "2025-10-08T22:01:35.082Z" },
{ url = "https://files.pythonhosted.org/packages/b9/74/cb1abc870a418ae99cd5c9547d6bce30701a954e0e721821df483ef7223c/tomli-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:b273fcbd7fc64dc3600c098e39136522650c49bca95df2d11cf3b626422392c8", size = 107964, upload-time = "2025-10-08T22:01:36.057Z" },
{ url = "https://files.pythonhosted.org/packages/54/78/5c46fff6432a712af9f792944f4fcd7067d8823157949f4e40c56b8b3c83/tomli-2.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:940d56ee0410fa17ee1f12b817b37a4d4e4dc4d27340863cc67236c74f582e77", size = 163065, upload-time = "2025-10-08T22:01:37.27Z" },
{ url = "https://files.pythonhosted.org/packages/39/67/f85d9bd23182f45eca8939cd2bc7050e1f90c41f4a2ecbbd5963a1d1c486/tomli-2.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f85209946d1fe94416debbb88d00eb92ce9cd5266775424ff81bc959e001acaf", size = 159088, upload-time = "2025-10-08T22:01:38.235Z" },
{ url = "https://files.pythonhosted.org/packages/26/5a/4b546a0405b9cc0659b399f12b6adb750757baf04250b148d3c5059fc4eb/tomli-2.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a56212bdcce682e56b0aaf79e869ba5d15a6163f88d5451cbde388d48b13f530", size = 268193, upload-time = "2025-10-08T22:01:39.712Z" },
{ url = "https://files.pythonhosted.org/packages/42/4f/2c12a72ae22cf7b59a7fe75b3465b7aba40ea9145d026ba41cb382075b0e/tomli-2.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5f3ffd1e098dfc032d4d3af5c0ac64f6d286d98bc148698356847b80fa4de1b", size = 275488, upload-time = "2025-10-08T22:01:40.773Z" },
{ url = "https://files.pythonhosted.org/packages/92/04/a038d65dbe160c3aa5a624e93ad98111090f6804027d474ba9c37c8ae186/tomli-2.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e01decd096b1530d97d5d85cb4dff4af2d8347bd35686654a004f8dea20fc67", size = 272669, upload-time = "2025-10-08T22:01:41.824Z" },
{ url = "https://files.pythonhosted.org/packages/be/2f/8b7c60a9d1612a7cbc39ffcca4f21a73bf368a80fc25bccf8253e2563267/tomli-2.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8a35dd0e643bb2610f156cca8db95d213a90015c11fee76c946aa62b7ae7e02f", size = 279709, upload-time = "2025-10-08T22:01:43.177Z" },
{ url = "https://files.pythonhosted.org/packages/7e/46/cc36c679f09f27ded940281c38607716c86cf8ba4a518d524e349c8b4874/tomli-2.3.0-cp314-cp314t-win32.whl", hash = "sha256:a1f7f282fe248311650081faafa5f4732bdbfef5d45fe3f2e702fbc6f2d496e0", size = 107563, upload-time = "2025-10-08T22:01:44.233Z" },
{ url = "https://files.pythonhosted.org/packages/84/ff/426ca8683cf7b753614480484f6437f568fd2fda2edbdf57a2d3d8b27a0b/tomli-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:70a251f8d4ba2d9ac2542eecf008b3c8a9fc5c3f9f02c56a9d7952612be2fdba", size = 119756, upload-time = "2025-10-08T22:01:45.234Z" },
{ url = "https://files.pythonhosted.org/packages/77/b8/0135fadc89e73be292b473cb820b4f5a08197779206b33191e801feeae40/tomli-2.3.0-py3-none-any.whl", hash = "sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b", size = 14408, upload-time = "2025-10-08T22:01:46.04Z" },
]
[[package]]
name = "tomlkit"
version = "0.13.3"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/cc/18/0bbf3884e9eaa38819ebe46a7bd25dcd56b67434402b66a58c4b8e552575/tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1", size = 185207, upload-time = "2025-06-05T07:13:44.947Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0", size = 38901, upload-time = "2025-06-05T07:13:43.546Z" },
]
[[package]]
name = "types-cffi"
version = "1.17.0.20250915"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "types-setuptools" },
]
sdist = { url = "https://files.pythonhosted.org/packages/2a/98/ea454cea03e5f351323af6a482c65924f3c26c515efd9090dede58f2b4b6/types_cffi-1.17.0.20250915.tar.gz", hash = "sha256:4362e20368f78dabd5c56bca8004752cc890e07a71605d9e0d9e069dbaac8c06", size = 17229, upload-time = "2025-09-15T03:01:25.31Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/aa/ec/092f2b74b49ec4855cdb53050deb9699f7105b8fda6fe034c0781b8687f3/types_cffi-1.17.0.20250915-py3-none-any.whl", hash = "sha256:cef4af1116c83359c11bb4269283c50f0688e9fc1d7f0eeb390f3661546da52c", size = 20112, upload-time = "2025-09-15T03:01:24.187Z" },
]
[[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.20250915"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/7e/69/3c51b36d04da19b92f9e815be12753125bd8bc247ba0470a982e6979e71c/types_pyyaml-6.0.12.20250915.tar.gz", hash = "sha256:0f8b54a528c303f0e6f7165687dd33fafa81c807fcac23f632b63aa624ced1d3", size = 17522, upload-time = "2025-09-15T03:01:00.728Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/bd/e0/1eed384f02555dde685fff1a1ac805c1c7dcb6dd019c916fe659b1c1f9ec/types_pyyaml-6.0.12.20250915-py3-none-any.whl", hash = "sha256:e7d4d9e064e89a3b3cae120b4990cd370874d2bf12fa5f46c97018dd5d3c9ab6", size = 20338, upload-time = "2025-09-15T03:00:59.218Z" },
]
[[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 = "80.9.0.20251223"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/00/07/d1b605230730990de20477150191d6dccf6aecc037da94c9960a5d563bc8/types_setuptools-80.9.0.20251223.tar.gz", hash = "sha256:d3411059ae2f5f03985217d86ac6084efea2c9e9cacd5f0869ef950f308169b2", size = 42420, upload-time = "2025-12-23T03:18:26.752Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/78/5c/b8877da94012dbc6643e4eeca22bca9b99b295be05d161f8a403ae9387c0/types_setuptools-80.9.0.20251223-py3-none-any.whl", hash = "sha256:1b36db79d724c2287d83dc052cf887b47c0da6a2fff044378be0b019545f56e6", size = 64318, upload-time = "2025-12-23T03:18:25.868Z" },
]
[[package]]
name = "typing-extensions"
version = "4.15.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" },
]
[[package]]
name = "tzdata"
version = "2025.3"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/5e/a7/c202b344c5ca7daf398f3b8a477eeb205cf3b6f32e7ec3a6bac0629ca975/tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7", size = 196772, upload-time = "2025-12-13T17:45:35.667Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521, upload-time = "2025-12-13T17:45:33.889Z" },
]